-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
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
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
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.
GENERATED ALWAYS
%endif
MATERIALIZED
- REINDEX RENAME CTIME_KW IF
+ REINDEX RENAME CTIME_KW IF AGGREGATE
.
%wildcard ANY.
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 */
};
*/
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;
}
}
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). {
}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; i<pGroupby->nExpr; 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;
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;
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 ::= .
#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
/*
{ "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 },