From: dan Date: Wed, 12 Feb 2020 11:57:35 +0000 (+0000) Subject: When determining whether an == or IS constraint in a WHERE clause makes an ORDER... X-Git-Tag: version-3.32.0~165 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=41aa442cf4fd66cafbc37f3a1718aeb4c498a96f;p=thirdparty%2Fsqlite.git When determining whether an == or IS constraint in a WHERE clause makes an ORDER BY term redundant, consider the collation sequence used by the == or IS comparison, not the collation sequence of the comparison expression itself. Possible fix for [fb8c538a8f]. FossilOrigin-Name: 16aed5d0c63dcdc2054dbb8a4b6b992476640433bf81e19301e6db5a3fc82633 --- diff --git a/manifest b/manifest index 5202b8d164..c16742ddf2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mark\sthe\ssha1()\sextension\sfunction\sas\sSQLITE_DETERMINISTIC. -D 2020-02-10T19:24:49.300 +C When\sdetermining\swhether\san\s==\sor\sIS\sconstraint\sin\sa\sWHERE\sclause\smakes\san\sORDER\sBY\sterm\sredundant,\sconsider\sthe\scollation\ssequence\sused\sby\sthe\s==\sor\sIS\scomparison,\snot\sthe\scollation\ssequence\sof\sthe\scomparison\sexpression\sitself.\sPossible\sfix\sfor\s[fb8c538a8f]. +D 2020-02-12T11:57:35.462 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -617,7 +617,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 697424314e40d99f93f548c7bfa526c10e87f4bdf64d5a76a96b999dd7133ebc F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c a137468bf36c92e64d2275caa80c83902e3a0fc59273591b96c6416d3253d05d -F src/where.c 2005d0511e05e5f7b6fb3be514b44f264f23d45f3b0cc5e150c63e3006a003e5 +F src/where.c 8fed0ab2c5efb1f1641ee73d1e98440637ac18726902fefcb7cb2e3923f54cdd F src/whereInt.h 9157228db086f436a574589f8cc5749bd971e94017c552305ad9ec472ed2e098 F src/wherecode.c f5df56e395ade2240cabb2d39500c681bd29f8cc0636c3301c4996ad160df94d F src/whereexpr.c 4b34be1434183e7bb8a05d4bf42bd53ea53021b0b060936fbd12062b4ff6b396 @@ -1207,7 +1207,7 @@ F test/orderby1.test 6bf0ce45cbfb1cf4779dd418ac5e8cf66abfa04de2c1d2edf1e0e85f152 F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04 F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99 F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4 -F test/orderby5.test 5f4d6cb93cc2f6d3f4228354310a2ce1fbd95d5bbffcba8c6482eeb62a466407 +F test/orderby5.test 8511a749d9ced17de7aeef6f03347d8f094e9977945517ee8c984e843516aa7b F test/orderby6.test 8b38138ab0972588240b3fca0985d2e400432859 F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd @@ -1858,7 +1858,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 084381649edf374ccc5664f136055109a31d4c3a19c4ae2ee5275f630507a2a3 -R 8339228306581c736abe177124af4c74 -U drh -Z d816eb8a040f61cae9702436e03e9275 +P 7d8dcfb95cea732e7588e7505bf80a171dd2e371b164c9435c6ac286060df6df +R 59c1d18e534e5edddd3bf258cd0125ab +U dan +Z c51e7fa10130f64133da39d0e8b36324 diff --git a/manifest.uuid b/manifest.uuid index 977c419e3c..59f56c0a20 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7d8dcfb95cea732e7588e7505bf80a171dd2e371b164c9435c6ac286060df6df \ No newline at end of file +16aed5d0c63dcdc2054dbb8a4b6b992476640433bf81e19301e6db5a3fc82633 \ No newline at end of file diff --git a/src/where.c b/src/where.c index e7447deec2..de384dd952 100644 --- a/src/where.c +++ b/src/where.c @@ -3752,8 +3752,11 @@ static i8 wherePathSatisfiesOrderBy( if( j>=pLoop->nLTerm ) continue; } if( (pTerm->eOperator&(WO_EQ|WO_IS))!=0 && pOBExpr->iColumn>=0 ){ - if( sqlite3ExprCollSeqMatch(pWInfo->pParse, - pOrderBy->a[i].pExpr, pTerm->pExpr)==0 ){ + Parse *pParse = pWInfo->pParse; + CollSeq *pColl1 = sqlite3ExprNNCollSeq(pParse, pOrderBy->a[i].pExpr); + CollSeq *pColl2 = sqlite3ExprCompareCollSeq(pParse, pTerm->pExpr); + assert( pColl1 && (pParse->nErr || pColl2) ); + if( pColl2==0 || sqlite3StrICmp(pColl1->zName, pColl2->zName) ){ continue; } testcase( pTerm->pExpr->op==TK_IS ); diff --git a/test/orderby5.test b/test/orderby5.test index e83116bae0..1ad79f9875 100644 --- a/test/orderby5.test +++ b/test/orderby5.test @@ -126,5 +126,51 @@ do_execsql_test 3.1 { SELECT a FROM t3 WHERE b=2 AND c=3 ORDER BY d DESC, e DESC, b, c, a DESC; } {~/B-TREE/} +#------------------------------------------------------------------------- +do_execsql_test 4.1.0 { + CREATE TABLE t4(b COLLATE nocase); + INSERT INTO t4 VALUES('abc'); + INSERT INTO t4 VALUES('ABC'); + INSERT INTO t4 VALUES('aBC'); +} +do_execsql_test 4.1.1 { + SELECT * FROM t4 ORDER BY b COLLATE binary +} {ABC aBC abc} +do_execsql_test 4.1.2 { + SELECT * FROM t4 WHERE b='abc' ORDER BY b COLLATE binary +} {ABC aBC abc} + +do_execsql_test 4.2.1 { + CREATE TABLE Records(typeID INTEGER, key TEXT COLLATE nocase, value TEXT); + CREATE INDEX RecordsIndex ON Records(typeID, key, value); +} +do_execsql_test 4.2.2 { + explain query plan + SELECT typeID, key, value FROM Records + WHERE typeID = 2 AND key = 'x' + ORDER BY key, value; +} {~/TEMP B-TREE/} +do_execsql_test 4.2.3 { + explain query plan + SELECT typeID, key, value FROM Records + WHERE typeID = 2 AND (key = 'x' COLLATE binary) + ORDER BY key, value; +} {~/TEMP B-TREE/} +do_execsql_test 4.2.4 { + explain query plan + SELECT typeID, key, value FROM Records + WHERE typeID = 2 + ORDER BY key, value; +} {~/TEMP B-TREE/} + +db collate hello [list string match] +do_execsql_test 4.3.1 { + CREATE TABLE t5(a INTEGER PRIMARY KEY, b COLLATE hello, c, d); +} +db close +sqlite3 db test.db +do_catchsql_test 4.3.2 { + SELECT a FROM t5 WHERE b='def' ORDER BY b; +} {1 {no such collation sequence: hello}} finish_test