]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add the AGGREGATE clause to the pipeline.
authordrh <>
Mon, 26 Aug 2024 14:06:08 +0000 (14:06 +0000)
committerdrh <>
Mon, 26 Aug 2024 14:06:08 +0000 (14:06 +0000)
FossilOrigin-Name: 16d32676e2e98a7710787de16850c328e7519e893f81ed56f6155a8fa9cbc3a4

manifest
manifest.uuid
src/parse.y
tool/mkkeywordhash.c

index 55ff77c674bee3876cd8409b2449e6e1fc7a7b74..816918519bec221a9b768c10fafa3b3aa6a164f0 100644 (file)
--- 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.
index 01cf52ef7d2211c329823f401c5501d94ccd1af2..ef57ba544402e2f8a6f7741ec1ec7b88f3f79871 100644 (file)
@@ -1 +1 @@
-4bdcc18d2cf4d11a7ca81117f6f8932fc8d280780d2c1e612189b2f5359cc778
+16d32676e2e98a7710787de16850c328e7519e893f81ed56f6155a8fa9cbc3a4
index c420833df977344d9cc756b0a003d2cdcaebe4d4..47774cd75692eea452db3270c0359f6c8a7e373b 100644 (file)
@@ -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; 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;
@@ -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 ::= .
index 5386a36c4077b5f164c08899e320133ada8ce7b5..66260215812432568151ecd807501c838816127a 100644 (file)
@@ -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      },