From: drh Date: Sat, 11 Feb 2017 15:02:23 +0000 (+0000) Subject: Ensure that indexed expressions with collating sequences are handled X-Git-Tag: version-3.17.0~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cefca47ab5fb581e47be973e8118a3f05f1b571f;p=thirdparty%2Fsqlite.git Ensure that indexed expressions with collating sequences are handled correctly. Fix for ticket [eb703ba7b50c1a5] backported from trunk. FossilOrigin-Name: b2e49ae36bfd00a1d0b70a9de9d23d2e16d1c7ca --- diff --git a/manifest b/manifest index be4e2b914e..9b2c0554ff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.17.0\srelease\scandidate -D 2017-02-10T17:38:00.621 +C Ensure\sthat\sindexed\sexpressions\swith\scollating\ssequences\sare\shandled\ncorrectly.\s\sFix\sfor\sticket\s[eb703ba7b50c1a5]\sbackported\sfrom\strunk. +D 2017-02-11T15:02:23.684 F Makefile.in edb6bcdd37748d2b1c3422ff727c748df7ffe918 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 067a6766f800cc8d72845ab61f8de4ffe8f3fc99 @@ -347,7 +347,7 @@ F src/ctime.c 9f2296a4e5d26ebf0e0d95a0af4628f1ea694e7a F src/date.c dc3f1391d9297f8c748132813aaffcb117090d6e F src/dbstat.c 19ee7a4e89979d4df8e44cfac7a8f905ec89b77d F src/delete.c 0d9d5549d42e79ce4d82ff1db1e6c81e36d2f67c -F src/expr.c d29114e9b709eaeaaa18553a5bbe60a19302aeef +F src/expr.c c218ec8cfc12b2c5b354660ce7285dfaf43305e9 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 2e9aabe1aee76273aff8a84ee92c464e095400ae F src/func.c c67273e1ec08abbdcc14c189892a3ff6eeece86b @@ -475,7 +475,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 40c543f0a2195d1b0dc88ef12142bea690009344 F src/wal.h 06b2a0b599cc0f53ea97f497cf8c6b758c999f71 F src/walker.c 91a6df7435827e41cff6bb7df50ea00934ee78b0 -F src/where.c bc71775e23d23334e8f449aa31012d692dc09cb2 +F src/where.c b0d81c6f24ea6aebb249c92c5d78ec8ab1452523 F src/whereInt.h 2bcc3d176e6091cb8f50a30b65c006e88a73614d F src/wherecode.c 99a8ced164c75edf41b3a865a75381c9adb38b28 F src/whereexpr.c 35ad025389a632a3987a35617c878be3b3d70dc6 @@ -867,7 +867,7 @@ F test/index6.test b4fc812290067a578b98bb2667b676db89e202a7 F test/index7.test 7feababe16f2091b229c22aff2bcc1d4d6b9d2bb F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/indexedby.test 9c4cd331224e57f79fbf411ae245e6272d415985 -F test/indexexpr1.test 7d243fac508b4a99fb900ffe34eb488312cfce84 +F test/indexexpr1.test 038b3befa74e5a75126b6e9dd2ae5df61c1c7cf7 F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 38742b5e9601c8f8d76e9b7555f7270288c2d371 @@ -1555,10 +1555,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 798fb9d70d2e5f95e64237b04d6692360133381a -R d99a1e96a3817ca7543fc882a1f70881 -T *branch * branch-3.17 -T *sym-branch-3.17 * -T -sym-trunk * +P ad867e8701a5ee17a98a5444da8be6fb1ef7247a +Q +9689d04b8250139e32078b2aa9748edcc6231bcd +R a4dc324e271f6eb7a3c903761117b7d3 U drh -Z d576ee7bc9417fd1bc0379648fe5a070 +Z 35c5257a80a9a2d4e844096f79f1e6f1 diff --git a/manifest.uuid b/manifest.uuid index 88c9ff2425..9d4e58e1d2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ad867e8701a5ee17a98a5444da8be6fb1ef7247a \ No newline at end of file +b2e49ae36bfd00a1d0b70a9de9d23d2e16d1c7ca \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index f1e8667b39..ff4f1b5ade 100644 --- a/src/expr.c +++ b/src/expr.c @@ -231,7 +231,7 @@ static char comparisonAffinity(Expr *pExpr){ aff = sqlite3CompareAffinity(pExpr->pRight, aff); }else if( ExprHasProperty(pExpr, EP_xIsSelect) ){ aff = sqlite3CompareAffinity(pExpr->x.pSelect->pEList->a[0].pExpr, aff); - }else if( NEVER(aff==0) ){ + }else if( aff==0 ){ aff = SQLITE_AFF_BLOB; } return aff; diff --git a/src/where.c b/src/where.c index 4951f6a1b4..80dfa20ed1 100644 --- a/src/where.c +++ b/src/where.c @@ -308,6 +308,7 @@ static WhereTerm *whereScanInit( iColumn = pIdx->aiColumn[j]; if( iColumn==XN_EXPR ){ pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; + pScan->zCollName = pIdx->azColl[j]; }else if( iColumn==pIdx->pTable->iPKey ){ iColumn = XN_ROWID; }else if( iColumn>=0 ){ diff --git a/test/indexexpr1.test b/test/indexexpr1.test index cd72430d91..2b375a5855 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -370,4 +370,14 @@ do_execsql_test indexexpr1-1200.4 { 0 0 0 2 0 4 2 0 2 2 4 0 } +# Ticket https://www.sqlite.org/src/tktview/eb703ba7b50c1a +# Incorrect result using an index on an expression with a collating function +# +do_execsql_test indexexpr1-1300.1 { + CREATE TABLE t1300(a INTEGER PRIMARY KEY, b); + INSERT INTO t1300 VALUES(1,'coffee'),(2,'COFFEE'),(3,'stress'),(4,'STRESS'); + CREATE INDEX t1300bexpr ON t1300( substr(b,4) ); + SELECT a FROM t1300 WHERE substr(b,4)='ess' COLLATE nocase ORDER BY +a; +} {3 4} + finish_test