]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Renumber the Select.selId values in the copies of SELECT statements that
authordrh <drh@noemail.net>
Wed, 22 May 2019 22:49:23 +0000 (22:49 +0000)
committerdrh <drh@noemail.net>
Wed, 22 May 2019 22:49:23 +0000 (22:49 +0000)
implement VIEWs when the VIEW is expanded, so that when the same VIEW is
used twice in the same join, each expansion as a distinct selId.
This fixes ticket [ce823231949d3abf42453c8].

FossilOrigin-Name: 3cacc4b940fd69776d930deec9512df47a2f22cb04fb955e354a0b25bdec287c

manifest
manifest.uuid
src/select.c
test/with1.test

index d5c712e6dfc48e8730d925142bac601afa678aa1..b2234f6f704284e2990b2d9bc8e0c40217c2e33d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C New\sdbsqlfuzz\sfind\sadded\sto\stest/fuzzdata8.db.
-D 2019-05-22T14:35:10.578
+C Renumber\sthe\sSelect.selId\svalues\sin\sthe\scopies\sof\sSELECT\sstatements\sthat\nimplement\sVIEWs\swhen\sthe\sVIEW\sis\sexpanded,\sso\sthat\swhen\sthe\ssame\sVIEW\sis\nused\stwice\sin\sthe\ssame\sjoin,\seach\sexpansion\sas\sa\sdistinct\sselId.\nThis\sfixes\sticket\s[ce823231949d3abf42453c8].
+D 2019-05-22T22:49:23.036
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -522,7 +522,7 @@ F src/printf.c 67f79227273a9009d86a017619717c3f554f50b371294526da59faa6014ed2cd
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c bae0a7562db77b02d87101b587819d5a5dcd8625e477d2d8a228a20bba4fead6
 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
-F src/select.c c620bcd03b1fbf9fed7d0e49c5e32bea3233c3f7c67d896271c36d6e5a4c621c
+F src/select.c 2db13eac09ac2d45b2cfd5dd106d6b9b02fe413db7240731868d55467e981b85
 F src/shell.c.in 6c992809abf20dbb4aad89299d7c15c98ddf2504b23c83ef71eb435ad392cdc3
 F src/sqlite.h.in d19c873a17c2effd4417f687fad942b6cc0ab0c64535f669cc2f22a5b05db23b
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1709,7 +1709,7 @@ F test/window8.test df187dc19921f7be0ab709d531d681bd80ccaac96a913a89ecee8b272b91
 F test/windowerr.tcl abf4d6d0c6d360213af98ed7d538295d905689e83692106f3ece0e3afb9d7f36
 F test/windowerr.test 675b5e6debfc9370bfacb0b91e2a93a8923512f92600b16f4ea70a1cd9b8e6e4
 F test/windowfault.test 16e906a2c4110c88372ff4bd5de59ac7397ec2f025912eff8e5677eedd126898
-F test/with1.test a07b5aad7f77acdf13e52e8814ea94606fcc72e9ea4c99baf293e9d7c63940be
+F test/with1.test f8b59d186a31bcdfbd6683c7e7db8152b81bbefbb90235bfa37707c8bc7b6474
 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab
 F test/with3.test b5f1372097690c6ef84db2f13fc7e64a88c7263c3f88493605f90597e8a68d45
 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205
@@ -1828,7 +1828,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 1660d7733eb443ab085ddef7666b998a1c75ac81cc54a9620960a8d3b377e28e
-R 1e74e533f91367ec7921e2ea66d0ca79
+P 42af7c819bc52ccb6953a58b1c05d3bd47cc438c5119a9555b1b796764eb9f20
+R 2b09f296fa1dcac8cd30ef4241a7e8b0
 U drh
-Z 4c3aeca66bd75ef066c4373e8b791867
+Z 24fc3a390964329b9ca09380346f2fb1
index 7c1e1e0b0185c803fcefd6a08ebae2559f047204..06b7b6b54264b6a1bbeb7939359d874848f19ef4 100644 (file)
@@ -1 +1 @@
-42af7c819bc52ccb6953a58b1c05d3bd47cc438c5119a9555b1b796764eb9f20
\ No newline at end of file
+3cacc4b940fd69776d930deec9512df47a2f22cb04fb955e354a0b25bdec287c
\ No newline at end of file
index 0b72cd3d22fdf44691944341c836b8f6b5f96781..6e20430c08e9dca23afd2076d1a7ef7226c53edc 100644 (file)
@@ -4843,6 +4843,10 @@ static int selectExpander(Walker *pWalker, Select *p){
   if( (selFlags & SF_Expanded)!=0 ){
     return WRC_Prune;
   }
+  if( pWalker->eCode ){
+    /* Renumber selId because it has been copied from a view */
+    p->selId = ++pParse->nSelect;
+  }
   pTabList = p->pSrc;
   pEList = p->pEList;
   sqlite3WithPush(pParse, p->pWith, 0);
@@ -4892,12 +4896,15 @@ static int selectExpander(Walker *pWalker, Select *p){
 #if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE)
       if( IsVirtual(pTab) || pTab->pSelect ){
         i16 nCol;
+        u8 eCodeOrig = pWalker->eCode;
         if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort;
         assert( pFrom->pSelect==0 );
         pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0);
         nCol = pTab->nCol;
         pTab->nCol = -1;
+        pWalker->eCode = 1;  /* Turn on Select.selId renumbering */
         sqlite3WalkSelect(pWalker, pFrom->pSelect);
+        pWalker->eCode = eCodeOrig;
         pTab->nCol = nCol;
       }
 #endif
@@ -5147,6 +5154,7 @@ static void sqlite3SelectExpand(Parse *pParse, Select *pSelect){
   }
   w.xSelectCallback = selectExpander;
   w.xSelectCallback2 = selectPopWith;
+  w.eCode = 0;
   sqlite3WalkSelect(&w, pSelect);
 }
 
index aecf0d1d167b070fd5412fc63656a0e61881d312..dbba19227e12ee2943f017fd41669c0a4170b072 100644 (file)
@@ -1091,4 +1091,30 @@ do_catchsql_test 22.1 {
   SELECT 4 FROM c,c,c,c,c,c,c,c,c;
 } {1 {too many FROM clause terms, max: 200}}
 
+# 2019-05-22
+# ticket https://www.sqlite.org/src/tktview/ce823231949d3abf42453c8f20
+#
+sqlite3 db :memory:
+do_execsql_test 23.1 {
+  CREATE TABLE t1(id INTEGER NULL PRIMARY KEY, name Text);
+  INSERT INTO t1 VALUES (1, 'john');
+  INSERT INTO t1 VALUES (2, 'james');
+  INSERT INTO t1 VALUES (3, 'jingle');
+  INSERT INTO t1 VALUES (4, 'himer');
+  INSERT INTO t1 VALUES (5, 'smith');
+  CREATE VIEW v2 AS
+    WITH t4(Name) AS (VALUES ('A'), ('B'))
+    SELECT Name Name FROM t4;
+  CREATE VIEW v3 AS
+    WITH t4(Att, Val, Act) AS (VALUES
+      ('C', 'D', 'E'),
+      ('F', 'G', 'H')
+    )
+    SELECT D.Id Id, P.Name Protocol, T.Att Att, T.Val Val, T.Act Act
+    FROM t1 D
+    CROSS JOIN v2 P
+    CROSS JOIN t4 T;
+  SELECT * FROM v3;
+} {1 A C D E 1 A F G H 1 B C D E 1 B F G H 2 A C D E 2 A F G H 2 B C D E 2 B F G H 3 A C D E 3 A F G H 3 B C D E 3 B F G H 4 A C D E 4 A F G H 4 B C D E 4 B F G H 5 A C D E 5 A F G H 5 B C D E 5 B F G H}
+
 finish_test