-C Enhance\sMakefile\sfor\sMSVC\sto\ssupport\sbuilding\sthe\sshell\stool\swithout\susing\sthe\samalgamation.
-D 2018-07-27T20:45:28.697
+C Minor\sgrammar\schanges\sthat\shelp\sthe\sparser\srun\sfaster\sby\sreducing\sthe\nnumber\sof\sNUL\srule\sreductions.
+D 2018-07-27T22:14:50.240
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
F src/pager.c 76d29b8a960dcb8b67210f095899d91e4a90673a6674ea58cfd1115b705a7fb9
F src/pager.h c571b064df842ec8f2e90855dead9acf4cbe0d1b2c05afe0ef0d0145f7fd0388
-F src/parse.y 3bd43415ea974b9921b0ff2c0bd3e9100f6e501ede0b6d3b90cca2ab6af25485
+F src/parse.y a3020c881f558dea6dc1138c58a2a657c26c792120e019792d3e72801da0bf90
F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P f4229707ac08d66c5b0f53483ce17a63f5ac40a21922f66c3408e1b6fda3a7c2
-R 464c2ff9b3e195b7b1100f9454773c91
-U mistachkin
-Z e7898633f0a206319f76d54e6b9d0ac3
+P 3d815d83a6805938b87e03ffabe6d71ca2ecfd05052e8e02c6cc5d3c9ea4ddf3
+R fafb9bb1288976042bff1f58b5ef3552
+U drh
+Z cc0d4bd09cbef3882dca6f536e3b608a
multiselect_op(A) ::= UNION ALL. {A = TK_ALL;}
multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP; /*A-overwrites-OP*/}
%endif SQLITE_OMIT_COMPOUND_SELECT
+
oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
groupby_opt(P) having_opt(Q)
+ orderby_opt(Z) limit_opt(L). {
+ A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
+}
%ifndef SQLITE_OMIT_WINDOWFUNC
- windowdefn_opt(R)
-%endif
+oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
+ groupby_opt(P) having_opt(Q) window_clause(R)
orderby_opt(Z) limit_opt(L). {
A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L);
-#ifndef SQLITE_OMIT_WINDOWFUNC
if( A ){
A->pWinDefn = R;
}else{
sqlite3WindowListDelete(pParse->db, R);
}
-#endif /* SQLITE_OMIT_WINDOWFUNC */
}
+%endif
+
+
oneselect(A) ::= values(A).
%type values {Select*}
sqlite3ExprAttachSubtrees(pParse->db, A, E, 0);
}
%endif SQLITE_OMIT_CAST
-expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP
+
+
+expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP. {
+ if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
+ sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
+ }
+ A = sqlite3ExprFunction(pParse, Y, &X);
+ if( D==SF_Distinct && A ){
+ A->flags |= EP_Distinct;
+ }
+}
+expr(A) ::= id(X) LP STAR RP. {
+ A = sqlite3ExprFunction(pParse, 0, &X);
+}
+
%ifndef SQLITE_OMIT_WINDOWFUNC
- over_opt(Z)
-%endif
-. {
+expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP over_clause(Z). {
if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
}
}
sqlite3WindowAttach(pParse, A, Z);
}
-expr(A) ::= id(X) LP STAR RP
-%ifndef SQLITE_OMIT_WINDOWFUNC
- over_opt(Z)
-%endif
-. {
+expr(A) ::= id(X) LP STAR RP over_clause(Z). {
A = sqlite3ExprFunction(pParse, 0, &X);
sqlite3WindowAttach(pParse, A, Z);
}
+%endif
+
term(A) ::= CTIME_KW(OP). {
A = sqlite3ExprFunction(pParse, 0, &OP);
}
frame_bound(A) ::= CURRENT ROW. { A.eType = TK_CURRENT ; A.pExpr = 0; }
frame_bound(A) ::= expr(X) FOLLOWING. { A.eType = TK_FOLLOWING; A.pExpr = X; }
-%type windowdefn_opt {Window*}
-%destructor windowdefn_opt {sqlite3WindowListDelete(pParse->db, $$);}
-windowdefn_opt(A) ::= . { A = 0; }
-windowdefn_opt(A) ::= WINDOW windowdefn_list(B). { A = B; }
+%type window_clause {Window*}
+%destructor window_clause {sqlite3WindowListDelete(pParse->db, $$);}
+window_clause(A) ::= WINDOW windowdefn_list(B). { A = B; }
-%type over_opt {Window*}
-%destructor over_opt {sqlite3WindowDelete(pParse->db, $$);}
-over_opt(A) ::= . { A = 0; }
-over_opt(A) ::= filter_opt(W) OVER window(Z). {
+%type over_clause {Window*}
+%destructor over_clause {sqlite3WindowDelete(pParse->db, $$);}
+over_clause(A) ::= filter_opt(W) OVER window(Z). {
A = Z;
assert( A!=0 );
A->pFilter = W;
}
-over_opt(A) ::= filter_opt(W) OVER nm(Z). {
+over_clause(A) ::= filter_opt(W) OVER nm(Z). {
A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
if( A ){
A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n);