]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add 3-byte and 6-byte integer serial types. This makes databases smaller
authordrh <drh@noemail.net>
Sun, 30 May 2004 21:14:58 +0000 (21:14 +0000)
committerdrh <drh@noemail.net>
Sun, 30 May 2004 21:14:58 +0000 (21:14 +0000)
and faster.  Should we go ahead and add 5- and 7-byte integer types too? (CVS 1499)

FossilOrigin-Name: e6685af815c4c0c7f09bb097a59a121862b865cf

manifest
manifest.uuid
src/vdbe.c
src/vdbeaux.c
test/btree.test

index 43f7f2b8a2c76b0ef2d8efb3ea9dde1ae4a57fc9..45d54fa70d77555ec2adc3e2fb0ac7b89ef36768 100644 (file)
--- a/manifest
+++ b/manifest
@@ -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
index 14b67bbab1d3232066319080d073c76fef25b8f7..d0a9a6aae776332c9cedb410eb62c2271fb352cb 100644 (file)
@@ -1 +1 @@
-a0db15bba64af0c529d5be366659bca1165ff21b
\ No newline at end of file
+e6685af815c4c0c7f09bb097a59a121862b865cf
\ No newline at end of file
index 5b773fb51d48bdf5ef647cd0ace00bbd093f7a92..5c20d830b6cc652de367eb3da0d02b5686805f6f 100644 (file)
@@ -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;
     }
index 0f2b317edebfb690e07cc580534335c2f6c8d818..55ced4b21a8756dbe88373ef1b82cbe547a3a7ff 100644 (file)
@@ -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;
 }
index b7b2ec8ea7ce235f61cd2de20e87421247b5ef8f..297f6c9a0ab1c8637a00e65e800d37fb1f5d22b8 100644 (file)
@@ -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