]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Ensure that the typeof() function always returns SQLITE_FLOAT for floating
authordrh <drh@noemail.net>
Thu, 2 May 2019 17:45:52 +0000 (17:45 +0000)
committerdrh <drh@noemail.net>
Thu, 2 May 2019 17:45:52 +0000 (17:45 +0000)
point values even when the value is stored as an integer to save space.

FossilOrigin-Name: 48889530a9de22fee536edfd1627be62396ed18d842d5fd6d91e010b4337be95

manifest
manifest.uuid
src/vdbeInt.h
src/vdbeapi.c
test/index.test

index 3aedc4b0978a4e71086a5d9e742d2e0653a4267e..381e1576603fc4f9725f8c4f5ba9cae60e1678fa 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\soptions\sto\swapptest.tcl\ssimilar\sto\sthose\ssupported\sby\sreleasetest.tcl.\sAlso\sadd\sthe\s-noui\sswitch,\sfor\srunning\swithout\swapp\saltogether.
-D 2019-05-02T17:06:01.169
+C Ensure\sthat\sthe\stypeof()\sfunction\salways\sreturns\sSQLITE_FLOAT\sfor\sfloating\npoint\svalues\seven\swhen\sthe\svalue\sis\sstored\sas\san\sinteger\sto\ssave\sspace.
+D 2019-05-02T17:45:52.902
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -593,8 +593,8 @@ F src/util.c 5061987401c2e8003177fa30d73196aa036727c8f04bf36a2df0c82b1904a236
 F src/vacuum.c 82dcec9e7b1afa980288718ad11bc499651c722d7b9f32933c4d694d91cb6ebf
 F src/vdbe.c 36993059b87e7c2adf671aaa4ef5e0f826b6f4d95be15b019aee14308f0047b5
 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237
-F src/vdbeInt.h 0e2c44958fb42d90a4eacb122d77e2d5b89b82f5e2b4b047b422962dc0346357
-F src/vdbeapi.c 2ddd60f4a351f15ee98d841e346af16111ad59dfa4d25d2dd4012e9875bf7d92
+F src/vdbeInt.h 3ba14553508d66f58753952d6dd287dce4ec735de02c6440858b4891aed51c17
+F src/vdbeapi.c 5ef992332225d8b6151137fcaf33b4ba4d38db7e7c51f871d2e9ecb960f3709a
 F src/vdbeaux.c f873b5c2efcf8a4d6ecfc5b1a5b06fd810419198f3bd882175d371cc03801873
 F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191
 F src/vdbemem.c df36fd36c7585e42869f3a44f5da5dc70e13306bc97ba52eebe069e174ba55db
@@ -1031,7 +1031,7 @@ F test/incrvacuum.test 2aaee202b1f230e55779f70d155f6ba67bbdff8481d650214d256ab0f
 F test/incrvacuum2.test 7d26cfda66c7e55898d196de54ac4ec7d86a4e3d
 F test/incrvacuum3.test 75256fb1377e7c39ef2de62bfc42bbff67be295a
 F test/incrvacuum_ioerr.test 6ae2f783424e47a0033304808fe27789cf93e635
-F test/index.test 05414fc7e1e128c327e089c2216d041ae7fb02232571f708f009a79a482cf1a3
+F test/index.test a2e948ed949e575487b5c1d521767d4584ac42d352f2dcd8e48004638e7bc7dc
 F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407
 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0
 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6
@@ -1822,7 +1822,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 c509d8a8aebe0da4847e95cf737c21313a665de9a540da2db57b8ed22f98a402
-R ae122c629293e3edebd8b79e5ad2d64a
-U dan
-Z 2ff4926d40df66aaffbb2191925f93c2
+P 005a169406ccea6e3cc42271620870d985e8bada1ad49a63656003db4911cb51
+R 1a712fa3e334798d542297677e583b67
+U drh
+Z 11e98b9b34589d0e8654b135f89f5a58
index 32b722ccd82330e4ad8f117629062623a6641e9d..6808f0b46a1b915465b7ed660d54836c67bfe4a7 100644 (file)
@@ -1 +1 @@
-005a169406ccea6e3cc42271620870d985e8bada1ad49a63656003db4911cb51
\ No newline at end of file
+48889530a9de22fee536edfd1627be62396ed18d842d5fd6d91e010b4337be95
\ No newline at end of file
index c84e4e4390f92b85e43f3c624f43c4636ccd4c96..17e057b1888918639bf38f4e96cd52366a0148a2 100644 (file)
@@ -245,12 +245,12 @@ struct sqlite3_value {
 #define MEM_Int       0x0004   /* Value is an integer */
 #define MEM_Real      0x0008   /* Value is a real number */
 #define MEM_Blob      0x0010   /* Value is a BLOB */
-#define MEM_AffMask   0x001f   /* Mask of affinity bits */
-#define MEM_FromBind  0x0020   /* Value originates from sqlite3_bind() */
-#define MEM_IntReal   0x0040   /* MEM_Int that stringifies like MEM_Real */
+#define MEM_IntReal   0x0020   /* MEM_Int that stringifies like MEM_Real */
+#define MEM_AffMask   0x003f   /* Mask of affinity bits */
+#define MEM_FromBind  0x0040   /* Value originates from sqlite3_bind() */
 #define MEM_Undefined 0x0080   /* Value is undefined */
 #define MEM_Cleared   0x0100   /* NULL set by OP_Null, not from data */
-#define MEM_TypeMask  0xc1df   /* Mask of type bits */
+#define MEM_TypeMask  0xc1bf   /* Mask of type bits */
 
 
 /* Whenever Mem contains a valid string or blob representation, one of
index 00eea75a457bdaaa25259a466c6e17470e26e094..65d4f9ae165cc2c11cdcb64649d62329d40166e1 100644 (file)
@@ -266,7 +266,54 @@ int sqlite3_value_type(sqlite3_value* pVal){
      SQLITE_NULL,     /* 0x1d */
      SQLITE_INTEGER,  /* 0x1e */
      SQLITE_NULL,     /* 0x1f */
+     SQLITE_BLOB,     /* 0x20 */
+     SQLITE_NULL,     /* 0x21 */
+     SQLITE_TEXT,     /* 0x22 */
+     SQLITE_NULL,     /* 0x23 */
+     SQLITE_FLOAT,    /* 0x24 */
+     SQLITE_NULL,     /* 0x25 */
+     SQLITE_FLOAT,    /* 0x26 */
+     SQLITE_NULL,     /* 0x27 */
+     SQLITE_FLOAT,    /* 0x28 */
+     SQLITE_NULL,     /* 0x29 */
+     SQLITE_FLOAT,    /* 0x2a */
+     SQLITE_NULL,     /* 0x2b */
+     SQLITE_FLOAT,    /* 0x2c */
+     SQLITE_NULL,     /* 0x2d */
+     SQLITE_FLOAT,    /* 0x2e */
+     SQLITE_NULL,     /* 0x2f */
+     SQLITE_BLOB,     /* 0x30 */
+     SQLITE_NULL,     /* 0x31 */
+     SQLITE_TEXT,     /* 0x32 */
+     SQLITE_NULL,     /* 0x33 */
+     SQLITE_FLOAT,    /* 0x34 */
+     SQLITE_NULL,     /* 0x35 */
+     SQLITE_FLOAT,    /* 0x36 */
+     SQLITE_NULL,     /* 0x37 */
+     SQLITE_FLOAT,    /* 0x38 */
+     SQLITE_NULL,     /* 0x39 */
+     SQLITE_FLOAT,    /* 0x3a */
+     SQLITE_NULL,     /* 0x3b */
+     SQLITE_FLOAT,    /* 0x3c */
+     SQLITE_NULL,     /* 0x3d */
+     SQLITE_FLOAT,    /* 0x3e */
+     SQLITE_NULL,     /* 0x3f */
   };
+#ifdef SQLITE_DEBUG
+  {
+    int eType = SQLITE_BLOB;
+    if( pVal->flags & MEM_Null ){
+      eType = SQLITE_NULL;
+    }else if( pVal->flags & MEM_Int ){
+      eType = (pVal->flags & MEM_IntReal) ? SQLITE_FLOAT : SQLITE_INTEGER;
+    }else if( pVal->flags & MEM_Real ){
+      eType = SQLITE_FLOAT;
+    }else if( pVal->flags & MEM_Str ){
+      eType = SQLITE_TEXT;
+    }
+    assert( eType == aType[pVal->flags&MEM_AffMask] );
+  }
+#endif
   return aType[pVal->flags&MEM_AffMask];
 }
 
index 4602041cd8e1ed849e383412c8492309c547467e..15120a40c94ca9e7525f5683862dfcb8b89b551d 100644 (file)
@@ -757,5 +757,13 @@ do_execsql_test index-23.0 {
   SELECT * FROM t1;
   REINDEX;
 } {0.0 1.0 1.0 1.0}
+do_execsql_test index-23.1 {
+  DROP TABLE t1;
+  CREATE TABLE t1(a REAL);
+  CREATE UNIQUE INDEX index_0 ON t1(TYPEOF(a));
+  INSERT OR IGNORE INTO t1(a) VALUES (0.1),(FALSE);
+  SELECT * FROM t1;
+  REINDEX;
+} {0.1}
 
 finish_test