From 7314495ff82c0ed4ac6f2776121282e3a8fe566a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 30 Aug 2019 23:56:34 +0000 Subject: [PATCH] When the affinity of a table column is INT or REAL, make the affinity of corresponding index columns NUMERIC. This increases the precision of index lookups for large numbers so that it matches the precision of ordinary comparison operators. Ticket [40812aea1fde9594] FossilOrigin-Name: e0d909c740b774d8a46731696e33342be83206cc4a95d07f42fdb3d8cc2d7a8e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/insert.c | 1 + src/wherecode.c | 1 + test/affinity2.test | 11 +++++++++++ 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 25379034a1..3d36562265 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\ssure\sOP_RealAffinity\shas\sbeen\sapplied\sto\sall\scolumns\sof\stype\sREAL\nin\sthe\sexcluded.*\spseudo-table\sof\san\sUPSERT.\nTicket\s[5a3dba8104421320] -D 2019-08-30T23:15:00.679 +C When\sthe\saffinity\sof\sa\stable\scolumn\sis\sINT\sor\sREAL,\smake\sthe\saffinity\sof\ncorresponding\sindex\scolumns\sNUMERIC.\s\sThis\sincreases\sthe\sprecision\sof\nindex\slookups\sfor\slarge\snumbers\sso\sthat\sit\smatches\sthe\sprecision\sof\nordinary\scomparison\soperators.\s\sTicket\s[40812aea1fde9594] +D 2019-08-30T23:56:34.003 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -484,7 +484,7 @@ F src/hash.c 8d7dda241d0ebdafb6ffdeda3149a412d7df75102cecfc1021c98d6219823b19 F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 81eec6acf4fbf0942bbab6804fe50df3e109acba40b8bbfb00fec9a14d0715a6 +F src/insert.c 40557ebd69f4115e7a273f9304a8ab637a47ce44f3c6923396928f023967b5e8 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c a045bb3425a9a633cc0f78e93d9beda6866f4c0f15bfdee735aba7c6b39f5cc4 F src/main.c 51c55eb579eac4180bfcc6242741084710911350d2cd0c3fdd0f9fde55442128 @@ -611,11 +611,11 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c d5a94907dcac990e31976be9dc769d17f6a806782593d6aec9d760ee01ec22cd F src/where.c fb546afbdbedc77a6193a236db92f6f85bc8e17412ec596230dd8aee03a93716 F src/whereInt.h 4a296fd4fa79fdcbc2b5e8c1b898901617655811223e1082b899c23ecb092217 -F src/wherecode.c 535c8e228478fd971b9a5b6cb6773995b0fbf7020d5989508a5094ce5b8cd95b +F src/wherecode.c b27b95cbd901c50ff4b26835eb249f57845193615861742bd1056e6d2e40b40c F src/whereexpr.c 2757afbd5cfdbb420f9d0392e1bd5f5c0e33dee50a8c692befc7e502308e449f F src/window.c 96b0c033d33408f16ac8b177eac6362ee53a23d9b6d7a51a04289ab2f956bb77 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 -F test/affinity2.test b03930d288e38b07f55023a58538ad174605695e98934bdab1facf6bd9ecc436 +F test/affinity2.test da465d3d490ab24ef64f7715b5953343a4967762b9350b29eb1462879ff3fb9e F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 F test/aggnested.test 18b00de006597e960a6b27ccec51474ac66cf1070a87c1933e5694dc02190ef1 @@ -1838,7 +1838,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 54553bf16fabd72d1967acef317beb518e086707ccd45890b7c7256b8da08b75 -R cef0df55cd7685f2b9e620402ed17caf +P 67381dadede98a55d8d9e085d021e6fa6473071978967b6302e03b28cf2245e1 +R 81c5159f885099a08c3a032048c494b3 U drh -Z 1f2b76474aa0bfdfd3021ea753e61c50 +Z df65619bddc85917641870cd10c4e180 diff --git a/manifest.uuid b/manifest.uuid index 164a8fc461..9793ee6e7a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -67381dadede98a55d8d9e085d021e6fa6473071978967b6302e03b28cf2245e1 \ No newline at end of file +e0d909c740b774d8a46731696e33342be83206cc4a95d07f42fdb3d8cc2d7a8e \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index 04d3d580f5..d9078b89db 100644 --- a/src/insert.c +++ b/src/insert.c @@ -99,6 +99,7 @@ const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); } if( affSQLITE_AFF_NUMERIC) aff = SQLITE_AFF_NUMERIC; pIdx->zColAff[n] = aff; } pIdx->zColAff[n] = 0; diff --git a/src/wherecode.c b/src/wherecode.c index 2fbcba17e9..22ed905f4e 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -755,6 +755,7 @@ static int codeAllEqualityTerms( if( sqlite3ExprNeedsNoAffinityChange(pRight, zAff[j]) ){ zAff[j] = SQLITE_AFF_BLOB; } + if( zAff[j]==SQLITE_AFF_REAL ) zAff[j] = SQLITE_AFF_NUMERIC; } } } diff --git a/test/affinity2.test b/test/affinity2.test index 40e442376e..acdf91c062 100644 --- a/test/affinity2.test +++ b/test/affinity2.test @@ -116,5 +116,16 @@ do_execsql_test 507 { SELECT * FROM t0 WHERE +-+'ce' >= t0.c0; } {-1 {}} +# 2019-08-30 ticket https://www.sqlite.org/src/info/40812aea1fde9594 +# +do_execsql_test 600 { + DROP TABLE IF EXISTS t0; + CREATE TABLE t0(c0 REAL UNIQUE); + INSERT INTO t0(c0) VALUES (3175546974276630385); + SELECT 3175546974276630385 < c0 FROM t0; +} {1} +do_execsql_test 601 { + SELECT 1 FROM t0 WHERE 3175546974276630385 < c0; +} {1} finish_test