]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Since the query planner is unable to cope with a LEFT JOIN on the left-hand side
authordrh <>
Sat, 16 Apr 2022 19:13:16 +0000 (19:13 +0000)
committerdrh <>
Sat, 16 Apr 2022 19:13:16 +0000 (19:13 +0000)
of a RIGHT JOIN, detect that situation early and raise a parsing error.
This is a temporary measure that needs to be fixed.

FossilOrigin-Name: 6d5d6e0403241c99ab4a47d7b6eedcd8ebc615a8ca8d66d7e81171f901b170d7

manifest
manifest.uuid
src/build.c
src/parse.y
src/sqliteInt.h

index 5386ee8c8ee2b5c58c5eba5a438232bc91e2d241..912fbe3f41c440db6259cd6e23dc022e23ad1fa9 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Additional\sSELECT\strace\slogic:\s\sShow\sthe\stree\safter\sresult-set\swildcard\nexpansion\sbut\sbefore\sname\sresolution.
-D 2022-04-16T18:33:22.370
+C Since\sthe\squery\splanner\sis\sunable\sto\scope\swith\sa\sLEFT\sJOIN\son\sthe\sleft-hand\sside\nof\sa\sRIGHT\sJOIN,\sdetect\sthat\ssituation\searly\sand\sraise\sa\sparsing\serror.\nThis\sis\sa\stemporary\smeasure\sthat\sneeds\sto\sbe\sfixed.
+D 2022-04-16T19:13:16.788
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -495,7 +495,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 F src/btree.c 093c940ddf1d0753542d04e37eb9903cbc126e997815d234dd2b6317e812b192
 F src/btree.h 74d64b8f28cfa4a894d14d4ed64fa432cd697b98b61708d4351482ae15913e22
 F src/btreeInt.h 8ce1332edd89dfd2461d561ac10a0ab5601c8e06200cb5230596c3caaf54482e
-F src/build.c ecbe7ecacf653408c4bf7bb40097ee846614c2336deac62cd30e207b9a42a784
+F src/build.c fad98f43a755f48ccdd0ba31d91f5a829cddd344dd3babaad0646bd23c2fcdc6
 F src/callback.c 4c19af69835787bfe790ac560f3071a824eb629f34e41f97b52ce5235c77de1c
 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
 F src/ctime.c 026dbdcdbd8c3cde98a88483ee88310ff43150ab164ad768f12cc700a11495ad
@@ -541,7 +541,7 @@ F src/os_win.c a8ea80037e81127ca01959daa87387cc135f325c88dc745376c4f760de852a10
 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
 F src/pager.c 42120492784fc9bcd9082b5c9b5e329b7318c357f9f3574a1bbfcf7418910356
 F src/pager.h f82e9844166e1585f5786837ddc7709966138ced17f568c16af7ccf946c2baa3
-F src/parse.y 9130a936927658e7c574e97e5d4f0a747a3f6b9a42bc5c63e455c8e40cc74216
+F src/parse.y e221a1159c5e73730b4d3d87fe4b5ad4b10ea2237ff59804e6402495a04a26c7
 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b
 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586
 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65
@@ -557,7 +557,7 @@ F src/shell.c.in eb7f10d5e2c47bd014d92ec5db1def21fcc1ed56ffaaa4ee715b6c37c370b47
 F src/sqlite.h.in 2a35f62185eb5e7ecc64a2f68442b538ce9be74f80f28a00abc24837edcf1c17
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h f49e28c25bd941e79794db5415fdf7b202deb3bc072ed6f1ed273d578703684e
-F src/sqliteInt.h 51b79f1db169deb87fc8ac2f1c11e2c4fcf9893737072ce56dd45e6e7917d61b
+F src/sqliteInt.h afec51781b0ff21126c4cbd812be873f801810fef7ecee6c11e56ab85c6fe577
 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657
 F src/status.c 4a3da6d77eeb3531cb0dbdf7047772a2a1b99f98c69e90ce009c75fe6328b2c0
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -1948,8 +1948,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 4c3ce6475a67b1e207a5b63d9e2d38ee5bc45c899ad00ee327f292bf59039b9c
-R c8fd0258e87ea644726dd2408171a53e
+P a7babf75418adffa27dec7a9d382a60e1b9364fb51d72b0a10e2769b308b3c54
+R 45449a4d7735a1a3898975e3feb2590b
 U drh
-Z 10f070fbe0626760b7aa50e27688efaa
+Z 24f79365e5bd75e3605e6ecd98fb146e
 # Remove this line to create a well-formed Fossil manifest.
index 0ca2ab7f4478c7ee492a4db9d623609788c0c5fb..c0376615bf59dd69e58c91e26bc69e404ba02d03 100644 (file)
@@ -1 +1 @@
-a7babf75418adffa27dec7a9d382a60e1b9364fb51d72b0a10e2769b308b3c54
\ No newline at end of file
+6d5d6e0403241c99ab4a47d7b6eedcd8ebc615a8ca8d66d7e81171f901b170d7
\ No newline at end of file
index 30908500a9cdbc1a2a4879e7e9b691641808a6a4..89228024d549c023d0631c84066b5946b2df8116 100644 (file)
@@ -5076,7 +5076,7 @@ void sqlite3SrcListFuncArgs(Parse *pParse, SrcList *p, ExprList *pList){
 **       code generator can easily tell that the table is part of
 **       the left operand of at least one RIGHT JOIN.
 */
-void sqlite3SrcListShiftJoinType(SrcList *p){
+void sqlite3SrcListShiftJoinType(Parse *pParse, SrcList *p){
   if( p && p->nSrc>1 ){
     int i = p->nSrc-1;
     u8 allFlags = 0;
@@ -5092,8 +5092,12 @@ void sqlite3SrcListShiftJoinType(SrcList *p){
       i--;
       assert( i>=0 );
       do{
-        p->a[i--].fg.jointype |= JT_LTORJ;
-      }while( i>=0 );
+        if( p->a[i].fg.jointype & JT_LEFT ){
+          sqlite3ErrorMsg(pParse, "unable to compute a LEFT or FULL JOIN"
+            " that is a left operand of a RIGHT or FULL JOIN");
+        }
+        p->a[i].fg.jointype |= JT_LTORJ;
+      }while( (--i)>=0 );
     }
   }
 }
index 4deae14b4c286ee68f1538bd1083337b15d18615..65977bbbadb68f87eeb7e77a1149bb318ba5744a 100644 (file)
@@ -685,7 +685,7 @@ as(X) ::= .            {X.n = 0; X.z = 0;}
 from(A) ::= .                {A = 0;}
 from(A) ::= FROM seltablist(X). {
   A = X;
-  sqlite3SrcListShiftJoinType(A);
+  sqlite3SrcListShiftJoinType(pParse,A);
 }
 
 // "seltablist" is a "Select Table List" - the content of the FROM clause
@@ -733,7 +733,7 @@ seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) on_using(N
       sqlite3SrcListDelete(pParse->db, F);
     }else{
       Select *pSubquery;
-      sqlite3SrcListShiftJoinType(F);
+      sqlite3SrcListShiftJoinType(pParse,F);
       pSubquery = sqlite3SelectNew(pParse,0,F,0,0,0,0,SF_NestedFrom,0);
       A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,pSubquery,&N);
     }
index 51f5d06d28f1a5d550462a724ac5dc5df49c2d86..bc618df7df8e26ab40710c0fade509b983656add 100644 (file)
@@ -4643,7 +4643,7 @@ SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*,
 void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *);
 void sqlite3SrcListFuncArgs(Parse*, SrcList*, ExprList*);
 int sqlite3IndexedByLookup(Parse *, SrcItem *);
-void sqlite3SrcListShiftJoinType(SrcList*);
+void sqlite3SrcListShiftJoinType(Parse*,SrcList*);
 void sqlite3SrcListAssignCursors(Parse*, SrcList*);
 void sqlite3IdListDelete(sqlite3*, IdList*);
 void sqlite3ClearOnOrUsing(sqlite3*, OnOrUsing*);