From: drh <> Date: Mon, 22 Jul 2024 13:55:44 +0000 (+0000) Subject: Do not allow LIMIT and OFFSET to be expressions except for in a LATERAL. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d5576fd50b464f81bc18a9dbb12cc33e0e813701;p=thirdparty%2Fsqlite.git Do not allow LIMIT and OFFSET to be expressions except for in a LATERAL. FossilOrigin-Name: 10347821376db1d33895fa794ac093ec6c2cc28daebe9adfd2578cbd1b3ce386 --- diff --git a/manifest b/manifest index 1d97b91b54..61c9f2949a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sLIMIT\sand\sOFFSET\sto\scontain\svariables\sfrom\sprior\sterms\sof\sthe\nFROM\sclause\sin\sa\sLATERAL\ssubquery.\n[forum:/forumpost/dfe2cd37ca3a9a80|Forum\spost\sdfe2cd37ca3a9a80] -D 2024-07-22T00:46:10.960 +C Do\snot\sallow\sLIMIT\sand\sOFFSET\sto\sbe\sexpressions\sexcept\sfor\sin\sa\sLATERAL. +D 2024-07-22T13:55:44.442 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -744,7 +744,7 @@ F src/os_win.c 6ff43bac175bd9ed79e7c0f96840b139f2f51d01689a638fd05128becf94908a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c b08600ebf0db90b6d1e9b8b6577c6fa3877cbe1a100bd0b2899e4c6e9adad4b3 F src/pager.h 4b1140d691860de0be1347474c51fee07d5420bd7f802d38cbab8ea4ab9f538a -F src/parse.y 8de6d5dc5f0a708a250d9a31ecd44d0852e3d2aa02f0ca2ee43e6ba040474aa0 +F src/parse.y a166e49fbb7ea11f62e7a0a540dcf1faa203a67138132fcadee0760e99eea77d F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5 F src/pcache1.c 49516ad7718a3626f28f710fa7448ef1fce3c07fd169acbb4817341950264319 @@ -753,14 +753,14 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7 F src/prepare.c d99931f45416652895e502328ca49fe782cfc4e1ebdcda13b3736d991ebf42ce F src/printf.c 8b250972305e14b365561be5117ed0fd364e4fd58968776df1ce64c6280b90f9 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c -F src/resolve.c bb2629301456e739d0bb245497af3d370cb740004107ee926a7a12c19443c652 +F src/resolve.c 162059912acd2144abf0e3dfd5021eda2cc3747a613803602a1b60825260c92a F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 1f5f1663fe84ee1963a55aef8871f1e7740a8030db517dcbfa16e27c6187fe74 F src/shell.c.in b7d435c137eb323981adff814f172dbaabb9ba504fef17cb11d4681c1633ee13 F src/sqlite.h.in 6c884a87bbf8828562b49272025a1e66e3801a196a58b0bdec87edcd2c9c8fc1 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 5fe0b5c73f2d2d7008b586e1cd23f0b94204a50196bf81f9b5652ea1c5b952a0 +F src/sqliteInt.h a3f2e5d0cfad29577d005c4add455aaa328bb03c475dcbbead5802eb65409554 F src/sqliteLimit.h 6878ab64bdeb8c24a1d762d45635e34b96da21132179023338c93f820eee6728 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -825,7 +825,7 @@ F src/upsert.c 2e60567a0e9e8520c18671b30712a88dc73534474304af94f32bb5f3ef65ac65 F src/utf.c f23165685a67b4caf8ec08fb274cb3f319103decfb2a980b7cfd55d18dfa855e F src/util.c 5d1a0134cf4240648d1c6bb5cc8efaca0ea2b5d5c840985aec7e947271f04375 F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 -F src/vdbe.c de13de572eccb688b2b7cf50e2f9005c44bf9ae89e35245ef8eadfc60dfd2764 +F src/vdbe.c a9405e82ede63d2e7d8297a7126e2d25682805424c7cf1a692a6f6f5eb127e24 F src/vdbe.h c2549a215898a390de6669cfa32adba56f0d7e17ba5a7f7b14506d6fd5f0c36a F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c F src/vdbeapi.c 80235ac380e9467fec1cb0883354d841f2a771976e766995f7e0c77f845406df @@ -2196,8 +2196,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 9182e999524bf55bf6a336c02ff5fb129a89ee7ed6fd859d4050ba1dbffcf4df -R 1b514e88847c4dd672bf624993e269d1 +P 4f0515138acb5f04b5b2f8b9efa47e1b09f35060fb260dad44617dd88ae1bab8 +R d6545588619662bad3511b4f22e61e5d U drh -Z 2df173ea627adbc98fc3632c926e23f0 +Z 6dd3e2c8789ac77f9ca2c0674f0e25d2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9ac87b6e3b..b30fb5273b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4f0515138acb5f04b5b2f8b9efa47e1b09f35060fb260dad44617dd88ae1bab8 +10347821376db1d33895fa794ac093ec6c2cc28daebe9adfd2578cbd1b3ce386 diff --git a/src/parse.y b/src/parse.y index c25728279c..0690dd351f 100644 --- a/src/parse.y +++ b/src/parse.y @@ -749,11 +749,12 @@ seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) on_using(N ){ sqlite3ErrorMsg(pParse, "join must be INNER or LEFT for a LATERAL reference"); pParse->db->errByteOffset = (int)(Y.z - pParse->zTail); - } + } pSrc = A = sqlite3SrcListAppendFromTerm(pParse,A,0,0,&Z,S,&N); if( pSrc && pSrc->nSrc>1 ){ pSrc->a[pSrc->nSrc-1].fg.isLateral = 1; pSrc->a[pSrc->nSrc-2].fg.jointype |= JT_LATERAL; + if( ALWAYS(S!=0) ) S->selFlags |= SF_Lateral; } } seltablist(A) ::= stl_prefix(A) LP seltablist(F) RP as(Z) on_using(N). { diff --git a/src/resolve.c b/src/resolve.c index b8f9845322..cca6ef85be 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1868,7 +1868,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; sNC.pWinSelect = p; - sNC.pNext = pOuterNC; + if( p->selFlags & SF_Lateral ) sNC.pNext = pOuterNC; if( sqlite3ResolveExprNames(&sNC, p->pLimit) ){ return WRC_Abort; } @@ -1902,6 +1902,7 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ if( pItem->zName ) pParse->zAuthContext = pItem->zName; if( pItem->fg.isLateral ){ assert( i>0 ); /* Because p->pSub->a[0] is never marked LATERAL */ + assert( pItem->pSelect->selFlags & SF_Lateral ); p->pSrc->nSrc = i; sNC.pSrcList = p->pSrc; sNC.pNext = pOuterNC; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 32607a3b12..d3804a570a 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3578,7 +3578,7 @@ struct Select { #define SF_MinMaxAgg 0x0001000 /* Aggregate containing min() or max() */ #define SF_Recursive 0x0002000 /* The recursive part of a recursive CTE */ #define SF_FixedLimit 0x0004000 /* nSelectRow set by a constant LIMIT */ -#define SF_MaybeConvert 0x0008000 /* Need convertCompoundSelectToSubquery() */ +#define SF_Lateral 0x0008000 /* Is of the form: LATERAL(SELECT ...) */ #define SF_Converted 0x0010000 /* By convertCompoundSelectToSubquery() */ #define SF_IncludeHidden 0x0020000 /* Include hidden columns in output */ #define SF_ComplexResult 0x0040000 /* Result contains subquery or function */ diff --git a/src/vdbe.c b/src/vdbe.c index d097bfd8b9..79366a845d 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2069,6 +2069,9 @@ case OP_MustBeInt: { /* jump0, in1 */ } } } +#ifdef SQLITE_DEBUG + pIn1->pScopyFrom = 0; +#endif VdbeBranchTaken(0, 2); MemSetTypeFlag(pIn1, MEM_Int); break;