From: drh Date: Fri, 13 Apr 2018 14:27:01 +0000 (+0000) Subject: Get the conflict-target clause parsing working correctly, with test X-Git-Tag: version-3.24.0~146^2~20 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d5af54207db43d5f5329ad545685a9dc71609c56;p=thirdparty%2Fsqlite.git Get the conflict-target clause parsing working correctly, with test cases. This change involves an enhancement to sqlite3ExprCompare() which needs to be reviewed on trunk prior to merging. FossilOrigin-Name: 5bf704256206f84b3db7a5d8523215604eeb218ef8db86316d1e43ecd7248d6a --- diff --git a/manifest b/manifest index 9b3751834a..17b93e92e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sconflict-target\smatching\slogic. -D 2018-04-13T13:44:48.035 +C Get\sthe\sconflict-target\sclause\sparsing\sworking\scorrectly,\swith\stest\ncases.\s\sThis\schange\sinvolves\san\senhancement\sto\ssqlite3ExprCompare()\swhich\nneeds\sto\sbe\sreviewed\son\strunk\sprior\sto\smerging. +D 2018-04-13T14:27:01.434 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 5ce9343cba9c189046f1afe6d2bcc1f68079439febc05267b98aec6ecc752439 @@ -443,7 +443,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 8db4c97f630e7d83f884ea75caf1ffd0988c160e9d530194d93721c80821e0f6 F src/dbstat.c edabb82611143727511a45ca0859b8cd037851ebe756ae3db289859dd18b6f91 F src/delete.c 20c8788451dc737a967c87ea53ad43544d617f5b57d32ccce8bd52a0daf9e89b -F src/expr.c 6a41ceb27924dcfb6dc910a283ce74e136c9c305aba87a5acbfca32f5c49caa7 +F src/expr.c a4e99a560768708331921cc8a04c3caef1f68710b5c49e7b4602046cb45579c5 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c d617daf66b5515e2b42c1405b2b4984c30ca50fb705ab164271a9bf66c69e331 F src/func.c 94f42cba2cc1c34aeaa441022ba0170ec3fec4bba54db4e0ded085c6dc0fdc51 @@ -557,7 +557,7 @@ F src/tokenize.c 5b0c661a85f783d35b9883830736eeb63be4aefc4f6b7d9cd081d48782c041e F src/treeview.c 14d5d1254702ec96876aa52642cb31548612384134970409fae333b25b39d6bb F src/trigger.c 00ef0b16ab3f0063439e6582086f57f3beb93cd7e7ba46569a8bdc490c16283d F src/update.c f5210fb55d26e20d14d0106c9479a83c63a005b70b1b5291481c48d6dac6fb9f -F src/upsert.c 5012bea924018c69cfc3cb12a9fa6089efe9895bda70732c7fa60d2320de4d1f +F src/upsert.c 1535f4270ff200c2ad750c78d95dc377e1b5486f14e5469894ba8cbd85aabf90 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157 F src/vacuum.c 762ee9bbf8733d87d8cd06f58d950e881982e416f8c767334a40ffd341b6bff5 @@ -1507,7 +1507,7 @@ F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 F test/update2.test 5e67667e1c54017d964e626db765cf8bedcf87483c184f4c575bdb8c1dd2313e -F test/upsert1.test 6eb6c5bb63bdc86001ca547d9af715034fc3cf234a70bfc5d75ccc31d8a308db +F test/upsert1.test 81966c8ef85a17dc3876df83ef79d7b52406ee5b65844b1712fab511fbff0e12 F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568 F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7 F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 @@ -1719,7 +1719,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 2c1b1987d8de1efa8ed7e1f199710e32ff20edf8ceec570514fc63bb1ef264e0 -R 9c391c2b4558210a880a408a3702ba04 +P 98d32ba661f4ba662b639994b74352b695d53a33bc8a498bd09b9e02f794c81e +R f8a0c129a96135656330bef5f8887505 U drh -Z c59a31f6f872acbe917575a2e26812a5 +Z 96fe68f62146018e2ed5b3343db81409 diff --git a/manifest.uuid b/manifest.uuid index b96b534d30..86d0f26f6a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98d32ba661f4ba662b639994b74352b695d53a33bc8a498bd09b9e02f794c81e \ No newline at end of file +5bf704256206f84b3db7a5d8523215604eeb218ef8db86316d1e43ecd7248d6a \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index eac5476f73..ca7c966044 100644 --- a/src/expr.c +++ b/src/expr.c @@ -4899,8 +4899,10 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ if( pA->op!=TK_COLUMN && pA->op!=TK_AGG_COLUMN && pA->u.zToken ){ if( pA->op==TK_FUNCTION ){ if( sqlite3StrICmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; + }else if( pA->op==TK_COLLATE ){ + return sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ? 2 : 0; }else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ - return pA->op==TK_COLLATE ? 1 : 2; + return 2; } } if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; diff --git a/src/upsert.c b/src/upsert.c index 2b0f273e81..d98a82743f 100644 --- a/src/upsert.c +++ b/src/upsert.c @@ -81,13 +81,14 @@ int sqlite3UpsertAnalyzeTarget( SrcList *pTabList, /* Table into which we are inserting */ Upsert *pUpsert /* The ON CONFLICT clauses */ ){ - NameContext sNC; - Table *pTab; - Index *pIdx; - ExprList *pTarget; - Expr *pTerm; - Expr sCol[2]; - int rc; + Table *pTab; /* That table into which we are inserting */ + int rc; /* Result code */ + int iCursor; /* Cursor used by pTab */ + Index *pIdx; /* One of the indexes of pTab */ + ExprList *pTarget; /* The conflict-target clause */ + Expr *pTerm; /* One term of the conflict-target clause */ + NameContext sNC; /* Context for resolving symbolic names */ + Expr sCol[2]; /* Index column converted into an Expr */ assert( pTabList->nSrc==1 ); assert( pTabList->a[0].pTab!=0 ); @@ -109,6 +110,7 @@ int sqlite3UpsertAnalyzeTarget( /* Check to see if the conflict target matches the rowid. */ pTab = pTabList->a[0].pTab; pTarget = pUpsert->pUpsertTarget; + iCursor = pTabList->a[0].iCursor; if( HasRowid(pTab) && pTarget->nExpr==1 && (pTerm = pTarget->a[0].pExpr)->op==TK_COLUMN @@ -139,7 +141,7 @@ int sqlite3UpsertAnalyzeTarget( if( pIdx->pPartIdxWhere ){ if( pUpsert->pUpsertTargetWhere==0 ) continue; if( sqlite3ExprCompare(pParse, pUpsert->pUpsertTargetWhere, - pIdx->pPartIdxWhere, pTabList->a[0].iCursor)!=0 ){ + pIdx->pPartIdxWhere, iCursor)!=0 ){ continue; } } @@ -156,9 +158,7 @@ int sqlite3UpsertAnalyzeTarget( pExpr = &sCol[0]; } for(jj=0; jja[jj].pExpr, pExpr, - pTabList->a[0].iCursor)<2 - ){ + if( sqlite3ExprCompare(pParse, pTarget->a[jj].pExpr, pExpr,iCursor)<2 ){ break; /* Column ii of the index matches column jj of target */ } } diff --git a/test/upsert1.test b/test/upsert1.test index 5d74f4483a..e94b00c9bf 100644 --- a/test/upsert1.test +++ b/test/upsert1.test @@ -44,6 +44,11 @@ do_catchsql_test upsert1-130 { INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(b COLLATE nocase) DO NOTHING; SELECT * FROM t1; } {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}} +do_execsql_test upsert1-140 { + DELETE FROM t1; + INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(b COLLATE binary) DO NOTHING; + SELECT * FROM t1; +} {5 6 0} do_catchsql_test upsert1-200 { DROP INDEX t1x1; @@ -58,5 +63,22 @@ do_catchsql_test upsert1-210 { SELECT * FROM t1; } {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}} +do_catchsql_test upsert1-300 { + DROP INDEX t1x1; + DELETE FROM t1; + CREATE UNIQUE INDEX t1x1 ON t1(b) WHERE b>10; + INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(b) DO NOTHING; + SELECT * FROM t1; +} {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}} +do_catchsql_test upsert1-310 { + DELETE FROM t1; + INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(b) WHERE b!=10 DO NOTHING; + SELECT * FROM t1; +} {1 {ON CONFLICT clause does not match any PRIMARY KEY or UNIQUE constraint}} +do_execsql_test upsert1-320 { + DELETE FROM t1; + INSERT INTO t1(a,b) VALUES(5,6) ON CONFLICT(b) WHERE b>10 DO NOTHING; + SELECT * FROM t1; +} {5 6 0} finish_test