From: drh <> Date: Sat, 16 Apr 2022 19:13:16 +0000 (+0000) Subject: Since the query planner is unable to cope with a LEFT JOIN on the left-hand side X-Git-Tag: version-3.39.0~206^2~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=fdc621aece3f79093fdc442c771dc86001ab5223;p=thirdparty%2Fsqlite.git Since the query planner is unable to cope with a LEFT JOIN on the left-hand side 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 --- diff --git a/manifest b/manifest index 5386ee8c8e..912fbe3f41 100644 --- 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. diff --git a/manifest.uuid b/manifest.uuid index 0ca2ab7f44..c0376615bf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a7babf75418adffa27dec7a9d382a60e1b9364fb51d72b0a10e2769b308b3c54 \ No newline at end of file +6d5d6e0403241c99ab4a47d7b6eedcd8ebc615a8ca8d66d7e81171f901b170d7 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 30908500a9..89228024d5 100644 --- a/src/build.c +++ b/src/build.c @@ -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 ); } } } diff --git a/src/parse.y b/src/parse.y index 4deae14b4c..65977bbbad 100644 --- a/src/parse.y +++ b/src/parse.y @@ -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); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 51f5d06d28..bc618df7df 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -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*);