From: drh Date: Thu, 2 May 2019 17:45:52 +0000 (+0000) Subject: Ensure that the typeof() function always returns SQLITE_FLOAT for floating X-Git-Tag: version-3.29.0~154 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=de7109e61b4ff3b632250cdcd962a1a440609549;p=thirdparty%2Fsqlite.git Ensure that the typeof() function always returns SQLITE_FLOAT for floating point values even when the value is stored as an integer to save space. FossilOrigin-Name: 48889530a9de22fee536edfd1627be62396ed18d842d5fd6d91e010b4337be95 --- diff --git a/manifest b/manifest index 3aedc4b097..381e157660 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 32b722ccd8..6808f0b46a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -005a169406ccea6e3cc42271620870d985e8bada1ad49a63656003db4911cb51 \ No newline at end of file +48889530a9de22fee536edfd1627be62396ed18d842d5fd6d91e010b4337be95 \ No newline at end of file diff --git a/src/vdbeInt.h b/src/vdbeInt.h index c84e4e4390..17e057b188 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -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 diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 00eea75a45..65d4f9ae16 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -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]; } diff --git a/test/index.test b/test/index.test index 4602041cd8..15120a40c9 100644 --- a/test/index.test +++ b/test/index.test @@ -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