diff options
-rw-r--r-- | manifest | 16 | ||||
-rw-r--r-- | manifest.uuid | 2 | ||||
-rw-r--r-- | src/vdbe.c | 4 | ||||
-rw-r--r-- | src/vdbeaux.c | 56 | ||||
-rw-r--r-- | test/btree.test | 56 |
5 files changed, 73 insertions, 61 deletions
@@ -1,5 +1,5 @@ -C Various\sspeed\senhancements.\s(CVS\s1498) -D 2004-05-30T20:46:09 +C Add\s3-byte\sand\s6-byte\sinteger\sserial\stypes.\s\sThis\smakes\sdatabases\ssmaller\nand\sfaster.\s\sShould\swe\sgo\sahead\sand\sadd\s5-\sand\s7-byte\sinteger\stypes\stoo?\s(CVS\s1499) +D 2004-05-30T21:14:59 F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -69,11 +69,11 @@ F src/update.c 259f06e7b22c684b2d3dda54a18185892d6e9573 F src/utf.c f8604999a54483533ac20a63879074f01b0df384 F src/util.c 3b647719c0bece41491300b605cff96a7a26f03a F src/vacuum.c 82ce1fc8ecc2e1aa284c13fe38446709f9936c63 -F src/vdbe.c a2131f7846fd2dbe1573bb37fc6d683c455c0ea4 +F src/vdbe.c 8c99c3c1e4b29b62a3e19e84b207b0fe84c45c46 F src/vdbe.h e73f890e0f2a6c42b183d7d6937947930fe4fdeb F src/vdbeInt.h c2bcd6e5a6e6a3753e4c5a368629c3a625719bfc F src/vdbeapi.c 0c5d64c81871cb4fe5407e639604ee95738b6942 -F src/vdbeaux.c ec0cccd9611fa6146a7b70ec23112959e63510ec +F src/vdbeaux.c c7e66db2b52b3c816adbdec81581b5e7ad257639 F src/vdbemem.c 627d714c347f6af8092cc48ae1c06fd774a1ad9c F src/where.c 444a7c3a8b1eb7bba072e489af628555d21d92a4 F test/all.test 569a92a8ee88f5300c057cc4a8f50fbbc69a3242 @@ -85,7 +85,7 @@ F test/bigfile.test ea904b853ce2d703b16c5ce90e2b54951bc1ae81 F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578 F test/bind.test 4f5a19e84077b61ea797644b4942bb98b17bdd42 F test/blob.test b6474275536614352d6e1c729f23a18ba1082ae9 -F test/btree.test 08e4093c78d2bc1d54e27266f8d17fed14751125 +F test/btree.test 018909b1c7ffe1fdcbd07774250a52ea58de3a11 F test/btree2.test aa4a6d05b1ea90b1acaf83ba89039dd302a88635 F test/btree4.test 3797b4305694c7af6828675b0f4b1424b8ca30e4 F test/btree5.test 8e5ff32c02e685d36516c6499add9375fe1377f2 @@ -204,7 +204,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P c86b7c065a798cd108189b96e87d100115862ff2 -R d1973e68e90aa9267e1c93eed75b57c5 +P a0db15bba64af0c529d5be366659bca1165ff21b +R 915a168eb388cda740e119c94b1b9b85 U drh -Z 7599afd42e52bbb72c5888c64d1ac6d1 +Z 7fdd86c94ca6358f07f558cb154c7ae7 diff --git a/manifest.uuid b/manifest.uuid index 14b67bbab..d0a9a6aae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a0db15bba64af0c529d5be366659bca1165ff21b
\ No newline at end of file +e6685af815c4c0c7f09bb097a59a121862b865cf
\ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 5b773fb51..5c20d830b 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -43,7 +43,7 @@ ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. ** -** $Id: vdbe.c,v 1.349 2004/05/30 20:46:09 drh Exp $ +** $Id: vdbe.c,v 1.350 2004/05/30 21:14:59 drh Exp $ */ #include "sqliteInt.h" #include "os.h" @@ -3714,7 +3714,7 @@ case OP_IdxIsNull: { k = sqlite3GetVarint32(z, &serial_type); for(; k<n && i>0; i--){ k += sqlite3GetVarint32(&z[k], &serial_type); - if( serial_type==6 ){ /* Serial type 6 is a NULL */ + if( serial_type==0 ){ /* Serial type 0 is a NULL */ pc = pOp->p2-1; break; } diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 0f2b317ed..55ced4b21 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -1117,14 +1117,15 @@ int sqlite3VdbeCursorMoveto(Cursor *p){ ** ** serial type bytes of data type ** -------------- --------------- --------------- -** 0 - Not a type. +** 0 0 NULL ** 1 1 signed integer ** 2 2 signed integer -** 3 4 signed integer -** 4 8 signed integer -** 5 8 IEEE float -** 6 0 NULL -** 7..11 reserved for expansion +** 3 3 signed integer +** 4 4 signed integer +** 5 6 signed integer +** 6 8 signed integer +** 7 8 IEEE float +** 8-11 reserved for expansion ** N>=12 and even (N-12)/2 BLOB ** N>=13 and odd (N-13)/2 text ** @@ -1137,18 +1138,20 @@ u32 sqlite3VdbeSerialType(Mem *pMem){ int flags = pMem->flags; if( flags&MEM_Null ){ - return 6; + return 0; } if( flags&MEM_Int ){ /* Figure out whether to use 1, 2, 4 or 8 bytes. */ i64 i = pMem->i; if( i>=-127 && i<=127 ) return 1; if( i>=-32767 && i<=32767 ) return 2; - if( i>=-2147483647 && i<=2147483647 ) return 3; - return 4; + if( i>=-8388607 && i<=8388607 ) return 3; + if( i>=-2147483647 && i<=2147483647 ) return 4; + if( i>=-140737488355328L && i<=140737488355328L ) return 5; + return 6; } if( flags&MEM_Real ){ - return 5; + return 7; } if( flags&MEM_Str ){ int n = pMem->n; @@ -1165,11 +1168,10 @@ u32 sqlite3VdbeSerialType(Mem *pMem){ ** Return the length of the data corresponding to the supplied serial-type. */ int sqlite3VdbeSerialTypeLen(u32 serial_type){ - assert( serial_type!=0 ); - if( serial_type>6 ){ + if( serial_type>=12 ){ return (serial_type-12)/2; }else{ - static u8 aSize[] = { 0, 1, 2, 4, 8, 8, 0, }; + static u8 aSize[] = { 0, 1, 2, 3, 4, 6, 8, 8, 0, 0, 0, 0 }; return aSize[serial_type]; } } @@ -1183,18 +1185,16 @@ int sqlite3VdbeSerialPut(unsigned char *buf, Mem *pMem){ u32 serial_type = sqlite3VdbeSerialType(pMem); int len; - assert( serial_type!=0 ); - /* NULL */ - if( serial_type==6 ){ + if( serial_type==0 ){ return 0; } /* Integer and Real */ - if( serial_type<=5 ){ + if( serial_type<=7 ){ u64 v; int i; - if( serial_type==5 ){ + if( serial_type==7 ){ v = *(u64*)&pMem->r; }else{ v = *(u64*)&pMem->i; @@ -1225,11 +1225,15 @@ int sqlite3VdbeSerialGet( ){ int len; + if( serial_type==0 ){ + /* NULL */ + pMem->flags = MEM_Null; + return 0; + } len = sqlite3VdbeSerialTypeLen(serial_type); - assert( serial_type!=0 ); - if( serial_type<=5 ){ + if( serial_type<=7 ){ /* Integer and Real */ - if( serial_type<=3 ){ + if( serial_type<=4 ){ /* 32-bit integer type. This is handled by a special case for ** performance reasons. */ int v = buf[0]; @@ -1253,7 +1257,7 @@ int sqlite3VdbeSerialGet( for(n=0; n<len; n++){ v = (v<<8) | buf[n]; } - if( serial_type==5 ){ + if( serial_type==7 ){ pMem->flags = MEM_Real; pMem->r = *(double*)&v; }else{ @@ -1261,8 +1265,9 @@ int sqlite3VdbeSerialGet( pMem->i = *(i64*)&v; } } - }else if( serial_type>=12 ){ + }else{ /* String or blob */ + assert( serial_type>=12 ); pMem->z = (char *)buf; pMem->n = len; if( serial_type&0x01 ){ @@ -1270,11 +1275,6 @@ int sqlite3VdbeSerialGet( }else{ pMem->flags = MEM_Blob | MEM_Ephem; } - }else{ - /* NULL */ - assert( serial_type==6 ); - assert( len==0 ); - pMem->flags = MEM_Null; } return len; } diff --git a/test/btree.test b/test/btree.test index b7b2ec8ea..297f6c9a0 100644 --- a/test/btree.test +++ b/test/btree.test @@ -11,7 +11,7 @@ # This file implements regression tests for SQLite library. The # focus of this script is btree database backend # -# $Id: btree.test,v 1.25 2004/05/18 15:57:42 drh Exp $ +# $Id: btree.test,v 1.26 2004/05/30 21:14:59 drh Exp $ set testdir [file dirname $argv0] @@ -520,14 +520,15 @@ do_test btree-6.13 { do_test btree-7.1 { btree_begin_transaction $::b1 } {} +if 0 { catch {unset key} catch {unset data} do_test btree-7.2 { # Each record will be 10 bytes in size. # + 100 bytes of database header - # + 6 bytes of table header + # + 8 bytes of table header # + 91*10=910 bytes of cells - # Totals 1016 bytes. 8 bytes left over + # Totals 1018 bytes. 6 bytes left over # Keys are 1000 through 1090. for {set i 1000} {$i<1091} {incr i} { set key $i @@ -535,28 +536,35 @@ do_test btree-7.2 { btree_insert $::c1 $key $data } lrange [btree_cursor_info $::c1] 4 5 -} {8 1} +} {6 0} +#btree_tree_dump $::b1 1 do_test btree-7.3 { for {set i 1001} {$i<1091} {incr i 2} { btree_move_to $::c1 $i btree_delete $::c1 } - # Freed 45 blocks. Total freespace is 458 + # Freed 45 blocks. Total freespace is 456 # Keys remaining are even numbers between 1000 and 1090, inclusive lrange [btree_cursor_info $::c1] 4 5 -} {458 46} +} {456 45} #btree_tree_dump $::b1 1 do_test btree-7.4 { - # The largest free block is 10 bytes long. So if we insert - # a record bigger than 10 bytes it should force a defrag - # The record is 20 bytes long. - btree_insert $::c1 2000 {123456789_12345} + # The largest free block is 8 bytes long. But there is also a + # huge hole between the cell pointer array and the cellcontent. + # But if we insert a large enough record, it should force a defrag. + set data 123456789_ + append data $data + append data $data + append data $data + append data $data + append data $data + btree_insert $::c1 2000 $data btree_move_to $::c1 2000 btree_key $::c1 } {2000} do_test btree-7.5 { lrange [btree_cursor_info $::c1] 4 5 -} {438 1} +} {343 0} #btree_tree_dump $::b1 1 # Delete an entry to make a hole of a known size, then immediately recreate @@ -574,13 +582,13 @@ do_test btree-7.6 { } {} do_test btree-7.7 { lrange [btree_cursor_info $::c1] 4 5 -} {458 3} ;# Create two new holes of 10 bytes each -#btree_page_dump $::b1 2 +} {363 2} ;# Create two new holes of 10 bytes each +#btree_page_dump $::b1 1 do_test btree-7.8 { btree_insert $::c1 1006 { 1006} lrange [btree_cursor_info $::c1] 4 5 -} {448 2} ;# Filled in the first hole -#btree_page_dump $::b1 2 +} {353 1} ;# Filled in the first hole +btree_page_dump $::b1 1 # Make sure the freeSpace() routine properly coaleses adjacent memory blocks # @@ -588,7 +596,9 @@ do_test btree-7.9 { btree_move_to $::c1 1012 btree_delete $::c1 lrange [btree_cursor_info $::c1] 4 5 -} {458 2} ;# Coalesce with the whole before +} {363 2} ;# Coalesce with the hole before +btree_page_dump $::b1 1 +exit do_test btree-7.10 { btree_move_to $::c1 1008 btree_delete $::c1 @@ -613,6 +623,7 @@ do_test btree-7.14 { do_test btree-7.15 { lindex [btree_pager_stats $::b1] 1 } {1} +} ;# endif # Check to see that data on overflow pages work correctly. # @@ -887,7 +898,7 @@ for {set i 1} {$i<=30} {incr i} { # catch {unset ::data} catch {unset ::key} -for {set i 31} {$i<=999} {incr i} { +for {set i 31} {$i<=2000} {incr i} { do_test btree-11.1.$i.1 { set key [format %03d $i] set ::data "*** $key *** $key *** $key *** $key ***" @@ -918,20 +929,21 @@ do_test btree-11.3 { set ::c1 [btree_cursor $::b1 2 1] lindex [btree_pager_stats $::b1] 1 } {2} -#btree_page_dump $::b1 2 # Delete the dividers on the root page # +#btree_page_dump $::b1 2 do_test btree-11.4 { - btree_move_to $::c1 551 + btree_move_to $::c1 1667 btree_delete $::c1 - btree_move_to $::c1 551 + btree_move_to $::c1 1667 set k [btree_key $::c1] - if {$k==550} { + if {$k==1666} { set k [btree_next $::c1] } btree_key $::c1 -} {552} +} {1668} +#btree_page_dump $::b1 2 # Change the data on an intermediate node such that the node becomes overfull # and has to split. We happen to know that intermediate nodes exist on |