aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordan <dan@noemail.net>2020-02-12 11:57:35 +0000
committerdan <dan@noemail.net>2020-02-12 11:57:35 +0000
commit41aa442cf4fd66cafbc37f3a1718aeb4c498a96f (patch)
treeb1b97c4524faca0645e485793571397e8ffa66b6
parentdf9b5cab9354fa7863037c647131c10ad063f7ee (diff)
downloadsqlite-41aa442cf4fd66cafbc37f3a1718aeb4c498a96f.tar.gz
sqlite-41aa442cf4fd66cafbc37f3a1718aeb4c498a96f.zip
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
-rw-r--r--manifest16
-rw-r--r--manifest.uuid2
-rw-r--r--src/where.c7
-rw-r--r--test/orderby5.test46
4 files changed, 60 insertions, 11 deletions
diff --git a/manifest b/manifest
index 5202b8d16..c16742ddf 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 977c419e3..59f56c0a2 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 e7447deec..de384dd95 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 e83116bae..1ad79f987 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