]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix an obscure problem with multiple outer joins, ON clauses and query flattening... forum-5c8a069d23-fix
authordan <Dan Kennedy>
Mon, 9 Dec 2024 11:12:12 +0000 (11:12 +0000)
committerdan <Dan Kennedy>
Mon, 9 Dec 2024 11:12:12 +0000 (11:12 +0000)
FossilOrigin-Name: 289daf6cee39625e8f068179cd58efcc1d28242f46064e58ec4175a019cf48ad

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

index 20304efaa2513efec4843222070e63ba34a08234..482a6c0e874f8925b4674e658128b86bb7fe681b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C On\sx64\shardware,\sround-trip\suint64_t&rarr;double&rarr;uint64_t\sconversions\nfail\sfor\svalues\sgreater\sthan\sUINT64_MAX-2047.\s\sThis\scaused\sthe\sSQLite\ntext-to-float\sconverter\sroutine\sto\sgive\sincorrect\sresults\sfor\svalues\nbetween\s'1.8446744073709550592eNNN'\sand\s'1.8446744073709551609eNNN'\sfor\sany\nexponent\sNNN.\s\sThis\sproblem\swas\sintroduced\sby\scheck-in\s[761d8fd18b0ee868]\nand\sfirst\sappeared\sin\sversion\s3.47.0\sand\swas\sreported\sby\n[forum:/forumpost/569a7209179a7f5e|forum\spost\s569a7209179a7f5e].\s\sFixed\nby\sthis\scheck-in.
-D 2024-12-07T14:48:55.778
+C Fix\san\sobscure\sproblem\swith\smultiple\souter\sjoins,\sON\sclauses\sand\squery\sflattening.\sForum\s[forum:5c8a069d23|thread\s5c8a069d23].
+D 2024-12-09T11:12:12.968
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d
@@ -777,7 +777,7 @@ F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
 F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 1334b0606dbdc753c8333f41bff441c97f77ef8ad9e33f3701e8adfe3b587c28
+F src/select.c 1c2b2321e1658e02f96da96d3071abcaa6839a1d75edd960a75a0ab11b6041bb
 F src/shell.c.in 660da73720fc0783a00317568aa098ff1887a0a5cbc0c49138d348d9fc890961
 F src/sqlite.h.in 6afbcaae44140216704a6c82e4c4ea4118c46d5f6573d6c5fa4fc901ed9d369e
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -1607,7 +1607,7 @@ F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56
 F test/select3.test 180223af31e1ca5537dd395ef9708ae18e651a233777fd366fd0d75469fc19c6
 F test/select4.test f0684d3da3bccacbe2a1ebadf6fb49d9df6f53acb4c6ebc228a88d0d6054cc7b
 F test/select5.test 8afc5e5dcdebc2be54472e73ebd9cd1adef1225fd15d37a1c62f969159f390ae
-F test/select6.test 9b2fb4ffedf52e1b5703cfcae1212e7a4a063f014c0458d78d29aca3db766d1f
+F test/select6.test d455cc36cb5658ba7002ccbf23d3d392801403e64ac6516190266a8ce167ad39
 F test/select7.test b825420da8a0b5722fdb77f3369f6396a3d198c46e8787eb26ff9425d4ac9d27
 F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d
 F test/select9.test f7586b207ce2304ab80dc93d3146469a28fd4403621dd3a82d06644563d3c812
@@ -2202,8 +2202,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139
 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
-P 870403425493866232cf9e8fa62288861b7d0a4091b15d75727f8bb31da46f94
-R 2d1ae3d1053fb61b1868786464dea794
-U drh
-Z 8f0bbc8ae68469d8947e1d3fa193444c
+P 81342fa6dd03fffbe7d4d699ff049dcef4d30344578bb6f91cb58a4e5a4f6036
+R 3188b2c87a9e8a8a9fb6e913f7cbbec8
+T *branch * forum-5c8a069d23-fix
+T *sym-forum-5c8a069d23-fix *
+T -sym-trunk *
+U dan
+Z 0a776cf65bcb8516c8a437501b7f2ac9
 # Remove this line to create a well-formed Fossil manifest.
index 78b1357e6ce47e73f7157a1a8bd7850a248c6453..ab418d528465b9d240c0f79e2846fd6f187dfd82 100644 (file)
@@ -1 +1 @@
-81342fa6dd03fffbe7d4d699ff049dcef4d30344578bb6f91cb58a4e5a4f6036
+289daf6cee39625e8f068179cd58efcc1d28242f46064e58ec4175a019cf48ad
index 285e9133e78750483df7aec7d3a2a856e82f1af9..9d35e1832c4f7b90a466fc961c19dd099afa040c 100644 (file)
@@ -4673,6 +4673,7 @@ static int flattenSubquery(
     /* Transfer the FROM clause terms from the subquery into the
     ** outer query.
     */
+    iNewParent = pSubSrc->a[0].iCursor;
     for(i=0; i<nSubSrc; i++){
       SrcItem *pItem = &pSrc->a[i+iFrom];
       assert( pItem->fg.isTabFunc==0 );
@@ -4682,7 +4683,6 @@ static int flattenSubquery(
       if( pItem->fg.isUsing ) sqlite3IdListDelete(db, pItem->u3.pUsing);
       *pItem = pSubSrc->a[i];
       pItem->fg.jointype |= ltorj;
-      iNewParent = pSubSrc->a[i].iCursor;
       memset(&pSubSrc->a[i], 0, sizeof(pSubSrc->a[i]));
     }
     pSrc->a[iFrom].fg.jointype &= JT_LTORJ;
@@ -4722,6 +4722,7 @@ static int flattenSubquery(
     pWhere = pSub->pWhere;
     pSub->pWhere = 0;
     if( isOuterJoin>0 ){
+      assert( pSubSrc->nSrc==1 );
       sqlite3SetJoinExpr(pWhere, iNewParent, EP_OuterON);
     }
     if( pWhere ){
index 612afefa6f358355f8ddb02bcda740792bdc9db2..f748ab47a43a550f62cc6299274c7319ed0f171d 100644 (file)
@@ -628,4 +628,43 @@ do_execsql_test 12.100 {
     SELECT * from t2);
 } {1 3}
 
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 13.100 {
+
+  CREATE  TABLE  t1(y INT);
+  INSERT INTO t1 (y) VALUES (1);
+
+  CREATE  TABLE  t2(x INTEGER);
+  INSERT INTO t2 VALUES(0);
+
+  CREATE  TABLE  empty1(z);
+}
+
+do_execsql_test 13.110 {
+  SELECT t1.y 
+    FROM ( SELECT 'AAA' ) 
+    INNER JOIN (
+      SELECT 1 AS abc FROM (
+        SELECT 1 FROM t2 LEFT JOIN empty1
+      )
+    ) AS sub0 ON sub0.abc
+    , t1
+    RIGHT JOIN (SELECT 'BBB' FROM ( SELECT 'CCC' ))
+} {1}
+
+do_execsql_test 13.120 {
+  SELECT t1.y 
+    FROM ( SELECT 'AAA' ) 
+    INNER JOIN (
+      SELECT 1 AS abc FROM (
+        SELECT 1 FROM t2 LEFT JOIN empty1
+      )
+    ) AS sub0 ON sub0.abc
+    , t1
+    RIGHT JOIN (SELECT 'BBB' FROM ( SELECT 'CCC' ))
+    WHERE t1.y
+} {1}
+
+
 finish_test