]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
In the push-down optimization, do not substitute columns that have previously branch-3.31
authordrh <drh@noemail.net>
Sat, 4 Apr 2020 00:29:18 +0000 (00:29 +0000)
committerdrh <drh@noemail.net>
Sat, 4 Apr 2020 00:29:18 +0000 (00:29 +0000)
been identified as being constant by the propagate-constants optimization.
Fix for ticket [51166be0159fd2ce].
Also, avoid factoring out constant expressions on the LHS of an IN(...)
operator, as the IN(...) operation may affect the affinity of these values.
Fix for [fd1bda016d1].

FossilOrigin-Name: 43612157f87f7365cdb6d77ca3f1e06efd64ce023fb6825bbd3895265cc10f51

manifest
manifest.uuid
src/expr.c
src/select.c
test/cse.test
test/select4.test

index 42b52e5c7499caac70ad367226627b9f7cd0a3c2..f0d937167867d77f24f42ce9e490097c12dfeb3f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Restore\san\s#if\sblock\sinadvertently\sremoved\svia\scheck-in\s[9c77bfe41e].
-D 2020-04-03T20:14:00.223
+C In\sthe\spush-down\soptimization,\sdo\snot\ssubstitute\scolumns\sthat\shave\spreviously\nbeen\sidentified\sas\sbeing\sconstant\sby\sthe\spropagate-constants\soptimization.\nFix\sfor\sticket\s[51166be0159fd2ce].\nAlso,\savoid\sfactoring\sout\sconstant\sexpressions\son\sthe\sLHS\sof\san\sIN(...)\noperator,\sas\sthe\sIN(...)\soperation\smay\saffect\sthe\saffinity\sof\sthese\svalues.\nFix\sfor\s[fd1bda016d1].
+D 2020-04-04T00:29:18.875
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -483,7 +483,7 @@ F src/date.c 6c408fdd2e9ddf6e8431aba76315a2d061bea2cec8fbb75e25d7c1ba08274712
 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
 F src/dbstat.c 0f55297469d4244ab7df395849e1af98eb5e95816af7c661e7d2d8402dea23da
 F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4
-F src/expr.c d8845931d5aa576ae1cbfa726d28c217ca894061f1a5a3da58922919685810e9
+F src/expr.c 7eec20f912d0bb72d6fb6765114c5f653482b374ce9f0544e893503ef0bf2cd1
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847
 F src/func.c 108577cebe8a50c86d849a93b99493a54e348dd0b846f00d13b52ca973d5baf4
@@ -531,7 +531,7 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c 534927e6f425ce83db0699a80bc00e1b5e7262968b35e0ae43c5097865ac2c5c
 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
-F src/select.c f57c72267dc857f35964e7db591aa99751b053eb0b8077b75c25dab790630c21
+F src/select.c ac24b7ddd0e984a58352e0f9cd3d32a3b8a89338ac616e86711b6e774d69794b
 F src/shell.c.in c2e20c43a44fb5588a6c27ce60589538fbf4794fd7686f5b2598eca22eaae1fa
 F src/sqlite.h.in 75d0304247a2154122d6d06f12219c1e29291d72304f0eeef4c1ec6b1409b443
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -792,7 +792,7 @@ F test/crash8.test 64366e459c28dd62edfb7ad87253a409c7533b92d16fcc479a6a8131bdcc3
 F test/crashM.test d95f59046fa749b0d0822edf18a717788c8f318d
 F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2
 F test/createtab.test 85cdfdae5c3de331cd888d6c66e1aba575b47c2e3c3cc4a1d6f54140699f5165
-F test/cse.test 277350a26264495e86b1785f34d2d0c8600e021c
+F test/cse.test 00b3aea44b16828833c94fbe92475fd6977583fcb064ae0bc590986812b38d0c
 F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd
 F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3
 F test/cursorhint.test 7bc346788390475e77a345da2b92270d04d35856
@@ -1301,7 +1301,7 @@ F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5
 F test/select1.test 009a6d8eacd9684d046302b8d13b50846a87e39d6f08e92178aa13e95ea29a2d
 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56
 F test/select3.test 3905450067c28766bc83ee397f6d87342de868baa60f2bcfd00f286dfbd62cb9
-F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328
+F test/select4.test e8a2502e3623f3058871030599a48abb35789d2244d5b380ecf3696873fdd4a4
 F test/select5.test df9ec0d218cedceb4fe7b63262025b547b50a55e59148c6f40b60ca25f1d4546
 F test/select6.test 319d45e414cdd321bf17cfacedaf19e3935ad64dac357c53f1492338c6e9b801
 F test/select7.test f659f231489349e8c5734e610803d7654207318f
@@ -1857,7 +1857,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P b64674919f6736025b2066672a5cf5cb51a28bbac4c709b85a1a6163cc0d7971
-R 0f4836cc802cf94773ebc6ca2bdc2b12
-U mistachkin
-Z 9b52e77dbe1b1e3cb12b663248b6cfcc
+P bf6bcfc16e621edc5385a2a3fc6ea8d907edfaa32b4019605b51cdf675decb29
+Q +70c44811d12f540d4ec1c29dedbe999cf79b82e326a8712ae2fa0725d6bd8a65
+Q +98d56b4a34fddcbaecd953a045ae0270b4d78c1edf34cc73522fb4e12743af80
+R bbf71157386490a0eb7285ef1f3d9126
+U drh
+Z 2c10dcc8208eef311a37e32183f7ec52
index 6edc6c36576707ecb2b36650923115ed5ae3d191..adc98625c864ef7b33052186ed7b743c85883f72 100644 (file)
@@ -1 +1 @@
-bf6bcfc16e621edc5385a2a3fc6ea8d907edfaa32b4019605b51cdf675decb29
\ No newline at end of file
+43612157f87f7365cdb6d77ca3f1e06efd64ce023fb6825bbd3895265cc10f51
\ No newline at end of file
index e4125a893719b8dc14e970f646fdd153e69fee53..8ffb1645186c42e4e27671cea023ebb70ad4c528 100644 (file)
@@ -3170,6 +3170,7 @@ static void sqlite3ExprCodeIN(
   int destNotNull;      /* Jump here if a comparison is not true in step 6 */
   int addrTop;          /* Top of the step-6 loop */ 
   int iTab = 0;         /* Index to use */
+  u8 okConstFactor = pParse->okConstFactor;
 
   pLeft = pExpr->pLeft;
   if( sqlite3ExprCheckIN(pParse, pExpr) ) return;
@@ -3213,8 +3214,14 @@ static void sqlite3ExprCodeIN(
   ** so that the fields are in the same order as an existing index.   The
   ** aiMap[] array contains a mapping from the original LHS field order to
   ** the field order that matches the RHS index.
-  */
+  **
+  ** Avoid factoring the LHS of the IN(...) expression out of the loop,
+  ** even if it is constant, as OP_Affinity may be used on the register
+  ** by code generated below.  */
+  assert( pParse->okConstFactor==okConstFactor );
+  pParse->okConstFactor = 0;
   rLhsOrig = exprCodeVector(pParse, pLeft, &iDummy);
+  pParse->okConstFactor = okConstFactor;
   for(i=0; i<nVector && aiMap[i]==i; i++){} /* Are LHS fields reordered? */
   if( i==nVector ){
     /* LHS fields are not reordered */
index b5e5a75a4c0c74ce91bf06b7b58737618239acad..a3abc67c2ce5aa8056270ec2c1c1aec0ad3ef56c 100644 (file)
@@ -3476,7 +3476,10 @@ static Expr *substExpr(
   ){
     pExpr->iRightJoinTable = pSubst->iNewTable;
   }
-  if( pExpr->op==TK_COLUMN && pExpr->iTable==pSubst->iTable ){
+  if( pExpr->op==TK_COLUMN
+   && pExpr->iTable==pSubst->iTable
+   && !ExprHasProperty(pExpr, EP_FixedCol)
+  ){
     if( pExpr->iColumn<0 ){
       pExpr->op = TK_NULL;
     }else{
index 57cdef5acc2c27edc7510b1c62e3d97a1fb25ea8..3912bc326cafb8c4a4049c0dadabdf70292715ef 100644 (file)
@@ -18,6 +18,7 @@
 
 set testdir [file dirname $argv0]
 source $testdir/tester.tcl
+set testprefix cse
 
 do_test cse-1.1 {
   execsql {
@@ -157,4 +158,43 @@ for {set i 1} {$i<100} {incr i} {
   } $answer
 }
 
+#-------------------------------------------------------------------------
+# Ticket fd1bda016d1a
+#
+reset_db
+do_execsql_test 3.0 {
+  CREATE TABLE t1(a TEXT, b);
+  INSERT INTO t1 VALUES('hello', 0);
+  INSERT INTO t1 VALUES('world', 0);
+
+  CREATE TABLE t2(x TEXT);
+  INSERT INTO t2 VALUES('hello');
+  INSERT INTO t2 VALUES('world');
+
+  CREATE TABLE t3(y);
+  INSERT INTO t3 VALUES(1000);
+} {}
+
+do_execsql_test 3.1 {
+  SELECT 1000 = y FROM t3
+} {1}
+
+do_execsql_test 3.2 {
+  SELECT 1000 IN (SELECT x FROM t2), 1000 = y FROM t3
+} {0 1}
+
+do_execsql_test 3.3 {
+  SELECT 0 IN (SELECT a), (SELECT a LIMIT 0) FROM t1 
+} {0 {} 0 {}}
+
+do_execsql_test 3.4 {
+  SELECT 0 IN (SELECT a) FROM t1 WHERE a = 'hello' OR (SELECT a LIMIT 0);
+} {0}
+
+do_execsql_test 3.5 {
+  CREATE TABLE v0(v1 VARCHAR0);
+  INSERT INTO v0 VALUES(2), (3);
+  SELECT 0 IN(SELECT v1) FROM v0 WHERE v1 = 2 OR(SELECT v1 LIMIT 0);
+} {0}
+
 finish_test
index 51a1b1c4c512169e7a201b370c7ea70b7b5e71b0..6dbfd4d0a19114640fe5d9eb56653c0e16de06b3 100644 (file)
@@ -1005,6 +1005,25 @@ do_catchsql_test select4-17.3 {
   ORDER BY +x;
 } {1 {LIMIT clause should come after UNION not before}}
 
+# 2020-04-03 ticket 51166be0159fd2ce from Yong Heng.
+# Adverse interaction between the constant propagation and push-down
+# optimizations.
+#
+reset_db
+do_execsql_test select4-18.1 {
+  CREATE VIEW v0(v0) AS WITH v0 AS(SELECT 0 v0) SELECT(SELECT min(v0) OVER()) FROM v0 GROUP BY v0;
+  SELECT *FROM v0 v1 JOIN v0 USING(v0) WHERE datetime(v0) = (v0.v0)AND v0 = 10;
+} {}
+do_execsql_test select4-18.2 {
+  CREATE VIEW t1(aa) AS
+     WITH t2(bb) AS (SELECT 123)
+     SELECT (SELECT min(bb) OVER()) FROM t2 GROUP BY bb;
+  SELECT * FROM t1;
+} {123}
+do_execsql_test select4-18.3 {
+  SELECT * FROM t1 AS z1 JOIN t1 AS z2 USING(aa)
+   WHERE abs(z1.aa)=z2.aa AND z1.aa=123;
+} {123}
 
 
 finish_test