From: dan Date: Mon, 30 Dec 2019 06:55:31 +0000 (+0000) Subject: In ALTER TABLE, rename columns and tables in expressions that are optimized out by... X-Git-Tag: version-3.31.0~114 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2b6e670f73ed38ac4df9144c9569fd76a302a7a8;p=thirdparty%2Fsqlite.git In ALTER TABLE, rename columns and tables in expressions that are optimized out by the "AND 0" optimization. Doing this also fixes an otherwise harmless assert() failure. FossilOrigin-Name: a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168 --- diff --git a/manifest b/manifest index 0c5039c406..b8ff4d4e02 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sallow\striggers\sthat\srun\sas\spart\sof\sREPLACE\sconflict\sresolution\nduring\san\sUPDATE\sto\smodify\sthe\sthe\stable\sbeing\supdated.\s\sOtherwise,\sthose\ntriggers\smight\sdelete\scontent\sout\sfrom\sunder\sthe\supdate\soperation,\sleading\nto\sall\skinds\sof\sproblems.\s\sTicket\s[314cc133e5ada126] -D 2019-12-29T22:08:20.135 +C In\sALTER\sTABLE,\srename\scolumns\sand\stables\sin\sexpressions\sthat\sare\soptimized\sout\sby\sthe\s"AND\s0"\soptimization.\sDoing\sthis\salso\sfixes\san\sotherwise\sharmless\sassert()\sfailure. +D 2019-12-30T06:55:31.748 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4 -F src/expr.c de4fa05000145cbb6ff29b106e2c7dded5fe3d7882c518b2bc6f63c27891a645 +F src/expr.c 3584e19c222f94cd0bb9070318ad270c3ca0d4fe235a6f70a198f16d8faf976f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847 F src/func.c ed33e38cd642058182a31a3f518f2e34f4bbe53aa483335705c153c4d3e50b12 @@ -637,8 +637,8 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altertab.test 4d8b79b0b88b62b90b710390df14fe99e0a3578345526886eaa550e28e3065dc -F test/altertab2.test 8883693952f6d7fb5f754dbf1d694ed780aa883027bef04cb1fb99a3b88c9272 -F test/altertab3.test d58d41201afd64c6176dcc4e71110c600c03841dad1efcc354de2248f6126e70 +F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b +F test/altertab3.test 155b8dc225ce484454a7fb4c8ba745680b6fa0fc3e08919cbbc19f9309d128ff F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b @@ -1853,7 +1853,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 21ef6e99331210b80fa7c71b4f02e8f768a748d01aef884368af2f6b51a067e0 -R b7ec11b757aee6e4ed77f8bc1e680bf5 -U drh -Z bc0033b99f278b5e6e67f422296a8976 +P db4b7e1dc399c1f16b827ac087aa37c0815f4b2f41f1ffad59963eead2ab5562 +R d015eff90d79dae7805d6393f409ae2c +U dan +Z 4676afd3b05e3706903e7277aaa2fd67 diff --git a/manifest.uuid b/manifest.uuid index e8038b4c09..9f6809bcbc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db4b7e1dc399c1f16b827ac087aa37c0815f4b2f41f1ffad59963eead2ab5562 \ No newline at end of file +a9e0354c992b0287608ddd18fd35fe7e6102a8f293d6e6e1b3488644bcda8168 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 76ffea3f17..e0a03d956f 100644 --- a/src/expr.c +++ b/src/expr.c @@ -933,9 +933,11 @@ Expr *sqlite3ExprAnd(Parse *pParse, Expr *pLeft, Expr *pRight){ return pRight; }else if( pRight==0 ){ return pLeft; - }else if( ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight) ){ - sqlite3ExprUnmapAndDelete(pParse, pLeft); - sqlite3ExprUnmapAndDelete(pParse, pRight); + }else if( (ExprAlwaysFalse(pLeft) || ExprAlwaysFalse(pRight)) + && !IN_RENAME_OBJECT + ){ + sqlite3ExprDelete(db, pLeft); + sqlite3ExprDelete(db, pRight); return sqlite3Expr(db, TK_INTEGER, "0"); }else{ return sqlite3PExpr(pParse, TK_AND, pLeft, pRight); diff --git a/test/altertab2.test b/test/altertab2.test index f14dc13ff1..9c1ad58134 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -343,22 +343,21 @@ do_execsql_test 8.4 { CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2; } -# Do not rename branches of an expression tree that is optimized out by -# the AND optimization. +# Branches of an expression tree that are optimized out by the AND +# optimization are renamed. # do_execsql_test 8.5 { ALTER TABLE t4 RENAME a TO c; SELECT sql FROM sqlite_master WHERE name = 'v4' -} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2}} -# "a" is not renamed to "c" ---^ +} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (c=1 AND 0) OR b=2}} # 2019-06-10 https://www.sqlite.org/src/info/533010b8cacebe82 reset_db -do_execsql_test 8.6 { +do_catchsql_test 8.6 { CREATE TABLE t0(c0); CREATE INDEX i0 ON t0(LIKELIHOOD(1,2) AND 0); ALTER TABLE t0 RENAME TO t1; SELECT sql FROM sqlite_master WHERE name='i0'; -} {{CREATE INDEX i0 ON "t1"(LIKELIHOOD(1,2) AND 0)}} +} {1 {error in index i0: second argument to likelihood() must be a constant between 0.0 and 1.0}} finish_test diff --git a/test/altertab3.test b/test/altertab3.test index 74b9b1a0f0..b39065589c 100644 --- a/test/altertab3.test +++ b/test/altertab3.test @@ -552,5 +552,39 @@ do_catchsql_test 23.3 { ALTER TABLE v0 RENAME TO t3 ; } {1 {error in view v2: view v2 is circularly defined}} +#------------------------------------------------------------------------ +# +reset_db +do_execsql_test 24.1 { + CREATE TABLE v0 (v1); + CREATE TABLE v2 (v3 INTEGER UNIQUE ON CONFLICT ABORT); + CREATE TRIGGER x AFTER INSERT ON v2 WHEN ( + ( SELECT v1 AS PROMO_REVENUE FROM v2 JOIN v0 USING ( VALUE ) ) AND 0 ) + BEGIN + DELETE FROM v2; + END; +} +do_catchsql_test 24.2 { + ALTER TABLE v0 RENAME TO x ; +} {1 {error in trigger x: cannot join using column VALUE - column not present in both tables}} + +do_execsql_test 24.3 { + DROP TRIGGER x; + CREATE TRIGGER x AFTER INSERT ON v2 WHEN ( + 0 AND (SELECT rowid FROM v0) + ) BEGIN + DELETE FROM v2; + END; +} + +do_execsql_test 24.4 { + ALTER TABLE v0 RENAME TO xyz; + SELECT sql FROM sqlite_master WHERE type='trigger' +} {{CREATE TRIGGER x AFTER INSERT ON v2 WHEN ( + 0 AND (SELECT rowid FROM "xyz") + ) BEGIN + DELETE FROM v2; + END}} + finish_test