]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Various bug fixes for the new LSM1 virtual table design.
authordrh <drh@noemail.net>
Wed, 9 Aug 2017 19:27:24 +0000 (19:27 +0000)
committerdrh <drh@noemail.net>
Wed, 9 Aug 2017 19:27:24 +0000 (19:27 +0000)
FossilOrigin-Name: 94434a252f0f2b57f325fd8fb82534f20cc1340ff13076cd88deeb47740ef6a2

ext/lsm1/lsm_vtab.c
ext/lsm1/test/lsm1_simple.test
manifest
manifest.uuid

index 0e43d1432cc7670e54be2bb6a1b65f6cdb2d2804..5d7ca05fa551942a041870c2f4ca36d0c9f293dd 100644 (file)
@@ -45,8 +45,9 @@
 ** values, the content is the blob data or the UTF-8 text data.  For
 ** non-negative integers X, the content is a variable-length integer X*2.
 ** For negative integers Y, the content is varaible-length integer (1-Y)*2+1.
-** For FLOAT values, the content is the variable length encoding of the
-** integer with the same bit pattern as the IEEE754 floating point value.
+** For FLOAT values, the content is the IEEE754 floating point value in
+** native byte-order.  This means that FLOAT values will be corrupted when
+** database file is moved between big-endian and little-endian machines.
 */
 #include "sqlite3ext.h"
 SQLITE_EXTENSION_INIT1
@@ -529,7 +530,7 @@ static int lsm1PutSignedVarint64(u8 *z, sqlite3_int64 v){
     u = (sqlite3_uint64)v;
     return lsm1PutVarint64(z, u*2);
   }else{
-    u = (sqlite3_uint64)(1-v);
+    u = (sqlite3_uint64)(-1-v);
     return lsm1PutVarint64(z, u*2+1);
   }
 }
@@ -645,18 +646,20 @@ static int lsm1Column(
         break;
       }
       case SQLITE_FLOAT: {
-        sqlite3_uint64 v1 = 0;
         double v;
-        lsm1GetVarint64(zData, nData, &v1);
-        memcpy(&v, &v1, sizeof(v));
-        sqlite3_result_double(ctx, v);
+        if( nData==sizeof(v) ){
+          memcpy(&v, zData, sizeof(v));
+          sqlite3_result_double(ctx, v);
+        }
         break;
       }
       case SQLITE_TEXT: {
         sqlite3_result_text(ctx, (const char*)zData, nData, SQLITE_TRANSIENT);
+        break;
       }
       case SQLITE_BLOB: {
         sqlite3_result_blob(ctx, zData, nData, SQLITE_TRANSIENT);
+        break;
       }
       default: {
          /* A NULL.  Do nothing */
@@ -908,14 +911,15 @@ int lsm1Update(
   }
   memset(&val, 0, sizeof(val));
   for(i=0; i<p->nVal; i++){
-    u8 eType = sqlite3_value_type(argv[3+i]);
+    sqlite3_value *pArg = argv[3+i];
+    u8 eType = sqlite3_value_type(pArg);
     switch( eType ){
       case SQLITE_NULL: {
         lsm1VblobAppendVarint(&val, SQLITE_NULL);
         break;
       }
       case SQLITE_INTEGER: {
-        sqlite3_int64 v = sqlite3_value_int64(argv[3+i]);
+        sqlite3_int64 v = sqlite3_value_int64(pArg);
         if( v>=0 && v<=240/6 ){
           lsm1VblobAppendVarint(&val, v*6);
         }else{
@@ -926,25 +930,21 @@ int lsm1Update(
         break;
       }
       case SQLITE_FLOAT: {
-        double r = sqlite3_value_double(argv[3+i]);
-        sqlite3_uint64 u;
-        int n;
-        memcpy(&u, &r, 8);
-        n = lsm1PutSignedVarint64(pSpace, u);
-        lsm1VblobAppendVarint(&val, SQLITE_FLOAT + n*6);
-        lsm1VblobAppend(&val, pSpace, n);
+        double r = sqlite3_value_double(pArg);
+        lsm1VblobAppendVarint(&val, SQLITE_FLOAT + 8*6);
+        lsm1VblobAppend(&val, (u8*)&r, sizeof(r));
         break;
       }
       case SQLITE_BLOB: {
-        int n = sqlite3_value_bytes(argv[3+i]);
+        int n = sqlite3_value_bytes(pArg);
         lsm1VblobAppendVarint(&val, n*6 + SQLITE_BLOB);
-        lsm1VblobAppend(&val, sqlite3_value_blob(argv[2+i]), n);
+        lsm1VblobAppend(&val, sqlite3_value_blob(pArg), n);
         break;
       }
       case SQLITE_TEXT: {
-        int n = sqlite3_value_bytes(argv[3+i]);
+        int n = sqlite3_value_bytes(pArg);
         lsm1VblobAppendVarint(&val, n*6 + SQLITE_TEXT);
-        lsm1VblobAppend(&val, sqlite3_value_text(argv[2+i]), n);
+        lsm1VblobAppend(&val, sqlite3_value_text(pArg), n);
         break;
       }
     }
index fb2c544986c062f0d470253efb623e30fe098a0f..fd09d64676c5f14a0c847eebdacfd9a250dafe8b 100644 (file)
@@ -30,9 +30,10 @@ do_execsql_test 1.0 {
 }
 
 do_execsql_test 1.1 {
-  INSERT INTO x1(a,b,c,d) VALUES(15, 11, 22, 33);
-  SELECT * FROM x1;
-} {15 11 22 33}
+  INSERT INTO x1(a,b,c,d) VALUES(15, 11, 22, 33),(8,'banjo',x'333231',NULL),
+      (12,NULL,3.25,-559281390);
+  SELECT a, quote(b), quote(c), quote(d) FROM x1;
+} {8 'banjo' X'333231' NULL 12 NULL 3.25 -559281390 15 11 22 33}
 
 do_catchsql_test 1.2 {
   UPDATE x1 SET d = d+1.0 WHERE a=15;
index a80962d784bea3a2131a9fcab5602c42e470c1ca..fb5ecc63fa3eb7147735832c4851daa03fb9ddc9 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Work\stoward\sredesigning\sthe\sinterface\sto\sthe\sLSM1\svirtual\stable.
-D 2017-08-09T18:40:35.775
+C Various\sbug\sfixes\sfor\sthe\snew\sLSM1\svirtual\stable\sdesign.
+D 2017-08-09T19:27:24.812
 F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016
@@ -249,10 +249,10 @@ F ext/lsm1/lsm_str.c 65e361b488c87b10bf3e5c0070b14ffc602cf84f094880bece77bbf6678
 F ext/lsm1/lsm_tree.c 682679d7ef2b8b6f2fe77aeb532c8d29695bca671c220b0abac77069de5fb9fb
 F ext/lsm1/lsm_unix.c 57361bcf5b1a1a028f5d66571ee490e9064d2cfb145a2cc9e5ddade467bb551b
 F ext/lsm1/lsm_varint.c 43f954af668a66c7928b81597c14d6ad4be9fedbc276bbd80f52fa28a02fdb62
-F ext/lsm1/lsm_vtab.c 356e1206c45c09b7cb267b2518557ac6b30524719731760ffc39de3050b3f220
+F ext/lsm1/lsm_vtab.c 976ded75b78be59fc358cf5c06641cda01a4bd0b52374419ab36bf37f646d5df
 F ext/lsm1/lsm_win32.c 0a4acbd7e8d136dd3a5753f0a9e7a9802263a9d96cef3278cf120bcaa724db7c
 F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1dedaf04a8774a6d8d82
-F ext/lsm1/test/lsm1_simple.test e4541832cf542e3c01a718e176e82978f593caf0d735d668d17368c31a11da27
+F ext/lsm1/test/lsm1_simple.test 0ca15907fbfe09b6606f93149416786709e0cd55a69ecf53f605fadefa64228c
 F ext/misc/README.md 8e008c8d2b02e09096b31dfba033253ac27c6c06a18aa5826e299fa7601d90b2
 F ext/misc/amatch.c 6db4607cb17c54b853a2d7c7c36046d004853f65b9b733e6f019d543d5dfae87
 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb
@@ -1644,7 +1644,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 795eede331b832a53e886318466dedc12504f7181c1d7295af7935864a04b72c
-R 37cfc3f8919ba1594a23cb70a509962a
+P 313df946668b943b0a9a9a91fd7bafa7212d05765c7714fa6c0de46aa9062a74
+R 51c1f235e2778744da3264339c3e2f94
 U drh
-Z 7334a536688a5b586851f2e43ccf1724
+Z d3fda50f76603a97e7bd0f2862a316b1
index d69c5e43675bf54e87dbf45ed0dcb361592b63e6..fbd3774187a2bbd69b1981a96f863b617fb86157 100644 (file)
@@ -1 +1 @@
-313df946668b943b0a9a9a91fd7bafa7212d05765c7714fa6c0de46aa9062a74
\ No newline at end of file
+94434a252f0f2b57f325fd8fb82534f20cc1340ff13076cd88deeb47740ef6a2
\ No newline at end of file