]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Do not allow LIMIT and OFFSET to be expressions except for in a LATERAL.
authordrh <>
Mon, 22 Jul 2024 13:55:44 +0000 (13:55 +0000)
committerdrh <>
Mon, 22 Jul 2024 13:55:44 +0000 (13:55 +0000)
FossilOrigin-Name: 10347821376db1d33895fa794ac093ec6c2cc28daebe9adfd2578cbd1b3ce386

manifest
manifest.uuid
src/parse.y
src/resolve.c
src/sqliteInt.h
src/vdbe.c

index 1d97b91b545cef4c687e5fe442c5911b00d17c82..61c9f2949ae8255b312df10126fa81b2602935d5 100644 (file)
--- 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.
index 9ac87b6e3b7a273e53b2a41e6e5672581583cef3..b30fb5273b0bef13cd35b32fe0dc94aff3265fad 100644 (file)
@@ -1 +1 @@
-4f0515138acb5f04b5b2f8b9efa47e1b09f35060fb260dad44617dd88ae1bab8
+10347821376db1d33895fa794ac093ec6c2cc28daebe9adfd2578cbd1b3ce386
index c25728279c7fde492ecc63bf64db571976d35b54..0690dd351f0f438d1ebfc702c7c191e732821a30 100644 (file)
@@ -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). {
index b8f98453228d07ce27069aa40a84afcd299a326f..cca6ef85be729f01d050ede8a7003a8a77b16063 100644 (file)
@@ -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;
index 32607a3b12d087d4bf4334c546eb8ec80b726838..d3804a570abb0849c0586170e1730efae20be3fe 100644 (file)
@@ -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 */
index d097bfd8b9fa9dee29641a7b6b4f74d5ec1cef16..79366a845dbcac960755e6be70d41120608cb213 100644 (file)
@@ -2069,6 +2069,9 @@ case OP_MustBeInt: {            /* jump0, in1 */
       }
     }
   }
+#ifdef SQLITE_DEBUG
+  pIn1->pScopyFrom = 0;
+#endif
   VdbeBranchTaken(0, 2);
   MemSetTypeFlag(pIn1, MEM_Int);
   break;