]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
When determining whether an == or IS constraint in a WHERE clause makes an ORDER...
authordan <dan@noemail.net>
Wed, 12 Feb 2020 11:57:35 +0000 (11:57 +0000)
committerdan <dan@noemail.net>
Wed, 12 Feb 2020 11:57:35 +0000 (11:57 +0000)
FossilOrigin-Name: 16aed5d0c63dcdc2054dbb8a4b6b992476640433bf81e19301e6db5a3fc82633

manifest
manifest.uuid
src/where.c
test/orderby5.test

index 5202b8d1645ad63383830adebfcaef21e50fa20d..c16742ddf2501e30c3843f1ff1cd5736c880cb59 100644 (file)
--- 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
index 977c419e3cd49c8f92c172e497935986a86941d9..59f56c0a20df9b70643b465cf25932697fe03869 100644 (file)
@@ -1 +1 @@
-7d8dcfb95cea732e7588e7505bf80a171dd2e371b164c9435c6ac286060df6df
\ No newline at end of file
+16aed5d0c63dcdc2054dbb8a4b6b992476640433bf81e19301e6db5a3fc82633
\ No newline at end of file
index e7447deec2e88e732f267d859bc17f9d3e62132a..de384dd952c5d09fec6315ff1769ab2703daa1fe 100644 (file)
@@ -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 );
index e83116bae0a1b05cb986aa0faeac55a330502468..1ad79f9875754b0345208f3c34985279a754bc49 100644 (file)
@@ -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