From: drh <> Date: Mon, 26 Aug 2024 14:06:08 +0000 (+0000) Subject: Add the AGGREGATE clause to the pipeline. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8941cb4817b08048c53fd46fbe64386c370db312;p=thirdparty%2Fsqlite.git Add the AGGREGATE clause to the pipeline. FossilOrigin-Name: 16d32676e2e98a7710787de16850c328e7519e893f81ed56f6155a8fa9cbc3a4 --- diff --git a/manifest b/manifest index 55ff77c674..816918519b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Working\sbetter\snow. -D 2024-08-26T13:20:38.861 +C Add\sthe\sAGGREGATE\sclause\sto\sthe\spipeline. +D 2024-08-26T14:06:08.566 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -753,7 +753,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 5ea418a962b809b1030d8e00c8d4d98b0ffa0d5ef86849837be2dd6439d1a867 +F src/parse.y f4c8ded81b05059c284bc9512aaa07f6ecd29add585e35d53d72a67894b6e4d7 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5 F src/pcache1.c 49516ad7718a3626f28f710fa7448ef1fce3c07fd169acbb4817341950264319 @@ -2131,7 +2131,7 @@ F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a19 F tool/mkautoconfamal.sh cbdcf993fa83dccbef7fb77b39cdeb31ef9f77d9d88c9e343b58d35ca3898a6a F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x F tool/mkctimec.tcl 060e9785e9503bf51f8b1b11b542bdeef90fd0ceb0738154f6762acec0c61e5f x -F tool/mkkeywordhash.c b9faa0ae7e14e4dbbcd951cddd786bf46b8a65bb07b129ba8c0cfade723aaffd +F tool/mkkeywordhash.c 6aa37d60b2c54a3e1215a1e7765fb83d8d5fe493ec88ab9d33ea1e46d5e58326 F tool/mkmsvcmin.tcl d76c45efda1cce2d4005bcea7b8a22bb752e3256009f331120fb4fecb14ebb7a F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef F tool/mkopcodeh.tcl 2b4e6967a670ef21bf53a164964c35c6163277d002a4c6f56fa231d68c88d023 @@ -2210,8 +2210,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3c7a5cc6d0d186e68a5885299f7474ad2e31b839af404a649dbc8f5b8f1d0a62 -R 9e1b7f8455abc13762536331d3b3dda4 +P 4bdcc18d2cf4d11a7ca81117f6f8932fc8d280780d2c1e612189b2f5359cc778 +R 5303cc11ae00c25bd96a8092c3ba2faf U drh -Z b529ace6b4f6b0da3eb7433369468b4f +Z 0f7ab62e6c9d0f24ea7650535f742b30 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 01cf52ef7d..ef57ba5444 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4bdcc18d2cf4d11a7ca81117f6f8932fc8d280780d2c1e612189b2f5359cc778 +16d32676e2e98a7710787de16850c328e7519e893f81ed56f6155a8fa9cbc3a4 diff --git a/src/parse.y b/src/parse.y index c420833df9..47774cd756 100644 --- a/src/parse.y +++ b/src/parse.y @@ -268,7 +268,7 @@ columnname(A) ::= nm(A) typetoken(Y). {sqlite3AddColumn(pParse,A,Y);} GENERATED ALWAYS %endif MATERIALIZED - REINDEX RENAME CTIME_KW IF + REINDEX RENAME CTIME_KW IF AGGREGATE . %wildcard ANY. @@ -692,6 +692,7 @@ oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) Expr *pHaving; /* The HAVING clause */ int selFlags; /* SF_DISTINCT or SF_ALL or 0 */ u8 bSeenAgg; /* True if AGGREGATE has been seen */ + u8 bNeedPush; /* PipePush needed before adding terms to pProj */ Token sAs; /* Value of a pending AS clause */ }; @@ -725,10 +726,9 @@ oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) */ void sqlite3PipePush(Parse *pParse, Pipe *pPipe, int jointype){ Select *pSel = sqlite3SelectFromPipe(pParse, pPipe); - Token *pAs = pPipe->sAs.z!=0 ? &pPipe->sAs : 0; SrcList *pFrom = pPipe->pFrom; if( pFrom ) pFrom->a[pFrom->nSrc-1].fg.jointype = jointype; - pPipe->pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,pAs,pSel,0); + pPipe->pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&pPipe->sAs,pSel,0); pPipe->sAs.z = 0; } @@ -753,24 +753,24 @@ pipeline(A) ::= FROM seltablist(X). { } pipeline(A) ::= pipeline(A) pipe pipejoinop(J) nm(Y) dbnm(D) as(Z) on_using(N). { Pipe *p = A; - sqlite3PipePush(pParse, p, J); + if( p->bNeedPush ) sqlite3PipePush(pParse, p, J); p->pFrom = sqlite3SrcListAppendFromTerm(pParse, p->pFrom, &Y, &D, &Z, 0, &N); } pipeline(A) ::= pipeline(A) pipe pipejoinop(J) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) on_using(N). { Pipe *p = A; - sqlite3PipePush(pParse, p, J); + if( p->bNeedPush ) sqlite3PipePush(pParse, p, J); p->pFrom = sqlite3SrcListAppendFromTerm(pParse, p->pFrom, &Y, &D, &Z, 0, &N); sqlite3SrcListFuncArgs(pParse, p->pFrom, E); } pipeline(A) ::= pipeline(A) pipe pipejoinop(J) LP select(S) RP as(Z) on_using(N). { Pipe *p = A; - sqlite3PipePush(pParse, p, J); + if( p->bNeedPush ) sqlite3PipePush(pParse, p, J); p->pFrom = sqlite3SrcListAppendFromTerm(pParse,p->pFrom,0,0,&Z,S,&N); } pipeline(A) ::= pipeline(A) pipe pipejoinop(J) LP seltablist(F) RP as(Z) on_using(N).{ Pipe *p = A; - sqlite3PipePush(pParse, p, J); + if( p->bNeedPush ) sqlite3PipePush(pParse, p, J); p->pFrom = sqlite3SrcListAppendSubFrom(pParse,p->pFrom,F,&Z,&N); } pipeline(A) ::= pipeline(A) pipe WHERE expr(W). { @@ -780,22 +780,42 @@ pipeline(A) ::= pipeline(A) pipe WHERE expr(W). { }else{ p->pWhere = sqlite3ExprAnd(pParse, A->pWhere, W); } + p->bNeedPush = 1; } pipeline(A) ::= pipeline(A) pipe HAVING expr(W). { Pipe *p = A; p->pHaving = sqlite3ExprAnd(pParse, A->pHaving, W); + p->bNeedPush = 1; +} +pipeline(A) ::= pipeline(A) pipe AGGREGATE selcollist(W) groupby_opt(G). { + Pipe *p = A; + ExprList *pProj = W; + ExprList *pGroupby = G; + if( p->pProj ) sqlite3PipePush(pParse, p, 0); + if( pGroupby ){ + int i; + for(i=0; inExpr; i++){ + pProj = sqlite3ExprListAppend(pParse, pProj, + sqlite3ExprDup(pParse->db, pGroupby->a[i].pExpr, 0)); + } + p->pGroupBy = pGroupby; + } + p->pProj = pProj; + p->bSeenAgg = 1; + p->bNeedPush = 1; } -//pipeline ::= pipeline pipe AGGREGATE selcollist groupby_opt. pipeline(A) ::= pipeline(A) pipe SELECT distinct(D) selcollist(W). { Pipe *p = A; if( p->pProj ) sqlite3PipePush(pParse, p, 0); p->pProj = W; p->selFlags = D; + p->bNeedPush = 1; } pipeline(A) ::= pipeline(A) pipe ORDER BY sortlist(X). { Pipe *p = A; if( p->pOrderBy || p->pLimit ) sqlite3PipePush(pParse, p, 0); p->pOrderBy = X; + p->bNeedPush = 1; } pipeline(A) ::= pipeline(A) pipe LIMIT expr(X). { Pipe *p = A; @@ -804,6 +824,7 @@ pipeline(A) ::= pipeline(A) pipe LIMIT expr(X). { sqlite3ExprDelete(pParse->db, p->pLimit); p->pLimit = pLimit; } + p->bNeedPush = 1; } pipeline(A) ::= pipeline(A) pipe LIMIT expr(X) OFFSET expr(Y). { Pipe *p = A; @@ -812,9 +833,10 @@ pipeline(A) ::= pipeline(A) pipe LIMIT expr(X) OFFSET expr(Y). { sqlite3ExprDelete(pParse->db, p->pLimit); p->pLimit = pLimit; } + p->bNeedPush = 1; } -pipeline(A) ::= pipeline(A) PIPE AS nm(X). {A->sAs = X;} -pipeline(A) ::= pipeline(A) pipe VIEW nm(X). {A->sAs = X;} +pipeline(A) ::= pipeline(A) PIPE AS nm(X). {A->sAs = X; A->bNeedPush = 1;} +pipeline(A) ::= pipeline(A) pipe VIEW nm(X). {A->sAs = X; A->bNeedPush = 1;} //pipeline ::= pipeline pipe DISTINCT ON nexprlist. pipe ::= . diff --git a/tool/mkkeywordhash.c b/tool/mkkeywordhash.c index 5386a36c40..6626021581 100644 --- a/tool/mkkeywordhash.c +++ b/tool/mkkeywordhash.c @@ -164,6 +164,16 @@ struct Keyword { #else # define RETURNING 0x00400000 #endif +#ifdef SQLITE_OMIT_RETURNING +# define RETURNING 0 +#else +# define RETURNING 0x00400000 +#endif +#ifdef SQLITE_OMIT_FROM_FIRST +# define PIPE 0 +#else +# define PIPE 0x00800000 +#endif /* @@ -174,6 +184,7 @@ static Keyword aKeywordTable[] = { { "ACTION", "TK_ACTION", FKEY, 0 }, { "ADD", "TK_ADD", ALTER, 1 }, { "AFTER", "TK_AFTER", TRIGGER, 0 }, + { "AGGREGATE", "TK_AGGREGATE", PIPE, 10 }, { "ALL", "TK_ALL", ALWAYS, 0 }, { "ALTER", "TK_ALTER", ALTER, 0 }, { "ALWAYS", "TK_ALWAYS", GENCOL, 0 },