Further performance related tweaks for sqlite3RunParser().
FossilOrigin-Name: 5eb4776598f5bba7ef21a2c58c03105544da73d642d7ffc146f84eff1993d71e
This commit is contained in:
parent
d437ac0c58
commit
34a7d790ba
16
manifest
16
manifest
@ -1,5 +1,5 @@
|
|||||||
C Further\stweaks\sto\ssqlite3RunParser().
|
C Further\sperformance\srelated\stweaks\sfor\ssqlite3RunParser().
|
||||||
D 2018-06-29T20:21:24.547
|
D 2018-06-29T20:43:33.493
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6
|
F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6
|
||||||
@ -484,7 +484,7 @@ F src/os_win.c ac29c25cde4cfb4adacc59cdec4aa45698ca0e29164ea127859585ccd9faa354
|
|||||||
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
||||||
F src/pager.c 1bb6a57fa0465296a4d6109a1a64610a0e7adde1f3acf3ef539a9d972908ce8f
|
F src/pager.c 1bb6a57fa0465296a4d6109a1a64610a0e7adde1f3acf3ef539a9d972908ce8f
|
||||||
F src/pager.h c571b064df842ec8f2e90855dead9acf4cbe0d1b2c05afe0ef0d0145f7fd0388
|
F src/pager.h c571b064df842ec8f2e90855dead9acf4cbe0d1b2c05afe0ef0d0145f7fd0388
|
||||||
F src/parse.y 216e0e953df076ef89668614e5aab8b489e0c2c24f7ff17cf42e7bea802793a9
|
F src/parse.y 5a53ee98a8bc76c526ae9b4a05cc4912f6b7b2e2a601a8fccc38b7b3b7830f97
|
||||||
F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd
|
F src/pcache.c 135ef0bc6fb2e3b7178d49ab5c9176254c8a691832c1bceb1156b2fbdd0869bd
|
||||||
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
|
F src/pcache.h 072f94d29281cffd99e46c1539849f248c4b56ae7684c1f36626797fee375170
|
||||||
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
|
F src/pcache1.c 716975564c15eb6679e97f734cec1bfd6c16ac3d4010f05f1f8e509fc7d19880
|
||||||
@ -493,7 +493,7 @@ F src/pragma.h bb83728944b42f6d409c77f5838a8edbdb0fe83046c5496ffc9602b40340a324
|
|||||||
F src/prepare.c e966ecc97c3671ff0e96227c8c877b83f2d33ea371ee190bbf1698b36b5605c0
|
F src/prepare.c e966ecc97c3671ff0e96227c8c877b83f2d33ea371ee190bbf1698b36b5605c0
|
||||||
F src/printf.c 7f6f3cba8e0c49c19e30a1ff4e9aeda6e06814dcbad4b664a69e1b6cb6e7e365
|
F src/printf.c 7f6f3cba8e0c49c19e30a1ff4e9aeda6e06814dcbad4b664a69e1b6cb6e7e365
|
||||||
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
|
||||||
F src/resolve.c 43b97be1b1bfbe7aa6a0e8608f5a022eac8cd2d727bdf4d0287371ba32218e7b
|
F src/resolve.c d8359c59c683fc33324c3a0abe0d393304861f05dd2e0d47e5974a501bcf4682
|
||||||
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
|
F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
|
||||||
F src/select.c 82aa95aa1cfeadef5ecae1126afff1efca64c49050bbf7116425a8a1d4fc5e6c
|
F src/select.c 82aa95aa1cfeadef5ecae1126afff1efca64c49050bbf7116425a8a1d4fc5e6c
|
||||||
F src/shell.c.in 8578421c5fb2a972461b2a996f7173646e55e0dbd2a2eee30c8f5dc7d3dbadfd
|
F src/shell.c.in 8578421c5fb2a972461b2a996f7173646e55e0dbd2a2eee30c8f5dc7d3dbadfd
|
||||||
@ -558,7 +558,7 @@ F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a9
|
|||||||
F src/test_window.c add59ee68568868129516999f30a68e8ab2afd276e272aba4f633c9fc52c1bb1
|
F src/test_window.c add59ee68568868129516999f30a68e8ab2afd276e272aba4f633c9fc52c1bb1
|
||||||
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||||
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
|
||||||
F src/tokenize.c 1a774b6a5763356075611829db77fcdd71d19e8b62e04ada2465452d035fa29a
|
F src/tokenize.c a9b97ce736f958390e51ed9f03a152403a2b77d54e6d5729f1ee1f365878d507
|
||||||
F src/treeview.c 2c5c4bc0a443401db5fd621542150452ddf5055d38edd4eef868bc2b6bfb0260
|
F src/treeview.c 2c5c4bc0a443401db5fd621542150452ddf5055d38edd4eef868bc2b6bfb0260
|
||||||
F src/trigger.c 4ace6d1d5ba9a89822deb287317f33c810440526eafe185c2d8a48c31df1e995
|
F src/trigger.c 4ace6d1d5ba9a89822deb287317f33c810440526eafe185c2d8a48c31df1e995
|
||||||
F src/update.c 46dc24c6158446aaab45caee09b6d99327cb479268b83ffeb5b701823da3b67b
|
F src/update.c 46dc24c6158446aaab45caee09b6d99327cb479268b83ffeb5b701823da3b67b
|
||||||
@ -1744,7 +1744,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P c1fb41aa7b7207b81ee1d5d32da3380b36d694033b87a2873981e0c6437ba956
|
P eef61ffab7fa36b126f57bf7028dd35c67ed4617c47145be059f91e58023b0a4
|
||||||
R c80a7a4c6f0c2361268be820ff770081
|
R 6ded36ebdbd58ad68c3d8e5fd0ba8d3c
|
||||||
U dan
|
U dan
|
||||||
Z f55b75e859bb2a1b9b8dde585520a141
|
Z d818b642c548723f779df4a6cae08814
|
||||||
|
@ -1 +1 @@
|
|||||||
eef61ffab7fa36b126f57bf7028dd35c67ed4617c47145be059f91e58023b0a4
|
5eb4776598f5bba7ef21a2c58c03105544da73d642d7ffc146f84eff1993d71e
|
197
src/parse.y
197
src/parse.y
@ -1046,102 +1046,6 @@ term(A) ::= CTIME_KW(OP). {
|
|||||||
A = sqlite3ExprFunction(pParse, 0, &OP);
|
A = sqlite3ExprFunction(pParse, 0, &OP);
|
||||||
}
|
}
|
||||||
|
|
||||||
%ifndef SQLITE_OMIT_WINDOWFUNC
|
|
||||||
|
|
||||||
%type windowdefn_opt {Window*}
|
|
||||||
%destructor windowdefn_opt {sqlite3WindowDelete(pParse->db, $$);}
|
|
||||||
windowdefn_opt(A) ::= . { A = 0; }
|
|
||||||
windowdefn_opt(A) ::= WINDOW windowdefn_list(B). { A = B; }
|
|
||||||
|
|
||||||
%type windowdefn_list {Window*}
|
|
||||||
%destructor windowdefn_list {sqlite3WindowDelete(pParse->db, $$);}
|
|
||||||
windowdefn_list(A) ::= windowdefn(Z). { A = Z; }
|
|
||||||
windowdefn_list(A) ::= windowdefn_list(Y) COMMA windowdefn(Z). {
|
|
||||||
if( Z ) Z->pNextWin = Y;
|
|
||||||
A = Z;
|
|
||||||
}
|
|
||||||
|
|
||||||
%type windowdefn {Window*}
|
|
||||||
%destructor windowdefn {sqlite3WindowDelete(pParse->db, $$);}
|
|
||||||
windowdefn(A) ::= nm(X) AS window(Y). {
|
|
||||||
if( Y ){
|
|
||||||
Y->zName = sqlite3DbStrNDup(pParse->db, X.z, X.n);
|
|
||||||
}
|
|
||||||
A = Y;
|
|
||||||
}
|
|
||||||
|
|
||||||
%type over_opt {Window*}
|
|
||||||
%destructor over_opt {sqlite3WindowDelete(pParse->db, $$);}
|
|
||||||
|
|
||||||
%type window {Window*}
|
|
||||||
%destructor window {sqlite3WindowDelete(pParse->db, $$);}
|
|
||||||
|
|
||||||
%type frame_opt {Window*}
|
|
||||||
%destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);}
|
|
||||||
|
|
||||||
%type window_or_nm {Window*}
|
|
||||||
%destructor window_or_nm {
|
|
||||||
sqlite3WindowDelete(pParse->db, $$);}
|
|
||||||
|
|
||||||
%type part_opt {ExprList*}
|
|
||||||
%destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);}
|
|
||||||
|
|
||||||
%type filter_opt {Expr*}
|
|
||||||
%destructor filter_opt {sqlite3ExprDelete(pParse->db, $$);}
|
|
||||||
|
|
||||||
%type range_or_rows {int}
|
|
||||||
|
|
||||||
%type frame_bound {struct FrameBound}
|
|
||||||
%destructor frame_bound {sqlite3ExprDelete(pParse->db, $$.pExpr);}
|
|
||||||
|
|
||||||
over_opt(A) ::= . { A = 0; }
|
|
||||||
over_opt(A) ::= filter_opt(W) OVER window_or_nm(Z). {
|
|
||||||
A = Z;
|
|
||||||
if( A ) A->pFilter = W;
|
|
||||||
}
|
|
||||||
|
|
||||||
window_or_nm(A) ::= window(Z). {A = Z;}
|
|
||||||
window_or_nm(A) ::= nm(Z). {
|
|
||||||
A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
|
|
||||||
if( A ){
|
|
||||||
A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
window(A) ::= LP part_opt(X) orderby_opt(Y) frame_opt(Z) RP. {
|
|
||||||
A = Z;
|
|
||||||
if( A ){
|
|
||||||
A->pPartition = X;
|
|
||||||
A->pOrderBy = Y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
part_opt(A) ::= PARTITION BY exprlist(X). { A = X; }
|
|
||||||
part_opt(A) ::= . { A = 0; }
|
|
||||||
filter_opt(A) ::= . { A = 0; }
|
|
||||||
filter_opt(A) ::= FILTER LP WHERE expr(X) RP. { A = X; }
|
|
||||||
|
|
||||||
frame_opt(A) ::= . {
|
|
||||||
A = sqlite3WindowAlloc(pParse, TK_RANGE, TK_UNBOUNDED, 0, TK_CURRENT, 0);
|
|
||||||
}
|
|
||||||
frame_opt(A) ::= range_or_rows(X) frame_bound(Y). {
|
|
||||||
A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0);
|
|
||||||
}
|
|
||||||
frame_opt(A) ::= range_or_rows(X) BETWEEN frame_bound(Y) AND frame_bound(Z). {
|
|
||||||
A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, Z.eType, Z.pExpr);
|
|
||||||
}
|
|
||||||
|
|
||||||
range_or_rows(A) ::= RANGE. { A = TK_RANGE; }
|
|
||||||
range_or_rows(A) ::= ROWS. { A = TK_ROWS; }
|
|
||||||
|
|
||||||
frame_bound(A) ::= UNBOUNDED PRECEDING. { A.eType = TK_UNBOUNDED; A.pExpr = 0; }
|
|
||||||
frame_bound(A) ::= expr(X) PRECEDING. { A.eType = TK_PRECEDING; A.pExpr = X; }
|
|
||||||
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; }
|
|
||||||
frame_bound(A) ::= UNBOUNDED FOLLOWING. { A.eType = TK_UNBOUNDED; A.pExpr = 0; }
|
|
||||||
|
|
||||||
%endif // SQLITE_OMIT_WINDOWFUNC
|
|
||||||
|
|
||||||
expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
|
expr(A) ::= LP nexprlist(X) COMMA expr(Y) RP. {
|
||||||
ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
|
ExprList *pList = sqlite3ExprListAppend(pParse, X, Y);
|
||||||
A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
|
A = sqlite3PExpr(pParse, TK_VECTOR, 0, 0);
|
||||||
@ -1693,3 +1597,104 @@ wqlist(A) ::= wqlist(A) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. {
|
|||||||
A = sqlite3WithAdd(pParse, A, &X, Y, Z);
|
A = sqlite3WithAdd(pParse, A, &X, Y, Z);
|
||||||
}
|
}
|
||||||
%endif SQLITE_OMIT_CTE
|
%endif SQLITE_OMIT_CTE
|
||||||
|
|
||||||
|
//////////////////////// WINDOW FUNCTION EXPRESSIONS /////////////////////////
|
||||||
|
// These must be at the end of this file. Specifically, the windowdefn_opt
|
||||||
|
// rule must be the very last in the file. This causes the integer value
|
||||||
|
// assigned to the TK_WINDOW token to be larger than all other tokens that
|
||||||
|
// may be output by the tokenizer except TK_SPACE and TK_ILLEGAL.
|
||||||
|
//
|
||||||
|
%ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
|
%type windowdefn_list {Window*}
|
||||||
|
%destructor windowdefn_list {sqlite3WindowDelete(pParse->db, $$);}
|
||||||
|
windowdefn_list(A) ::= windowdefn(Z). { A = Z; }
|
||||||
|
windowdefn_list(A) ::= windowdefn_list(Y) COMMA windowdefn(Z). {
|
||||||
|
if( Z ) Z->pNextWin = Y;
|
||||||
|
A = Z;
|
||||||
|
}
|
||||||
|
|
||||||
|
%type windowdefn {Window*}
|
||||||
|
%destructor windowdefn {sqlite3WindowDelete(pParse->db, $$);}
|
||||||
|
windowdefn(A) ::= nm(X) AS window(Y). {
|
||||||
|
if( Y ){
|
||||||
|
Y->zName = sqlite3DbStrNDup(pParse->db, X.z, X.n);
|
||||||
|
}
|
||||||
|
A = Y;
|
||||||
|
}
|
||||||
|
|
||||||
|
%type over_opt {Window*}
|
||||||
|
%destructor over_opt {sqlite3WindowDelete(pParse->db, $$);}
|
||||||
|
|
||||||
|
%type window {Window*}
|
||||||
|
%destructor window {sqlite3WindowDelete(pParse->db, $$);}
|
||||||
|
|
||||||
|
%type frame_opt {Window*}
|
||||||
|
%destructor frame_opt {sqlite3WindowDelete(pParse->db, $$);}
|
||||||
|
|
||||||
|
%type window_or_nm {Window*}
|
||||||
|
%destructor window_or_nm {
|
||||||
|
sqlite3WindowDelete(pParse->db, $$);}
|
||||||
|
|
||||||
|
%type part_opt {ExprList*}
|
||||||
|
%destructor part_opt {sqlite3ExprListDelete(pParse->db, $$);}
|
||||||
|
|
||||||
|
%type filter_opt {Expr*}
|
||||||
|
%destructor filter_opt {sqlite3ExprDelete(pParse->db, $$);}
|
||||||
|
|
||||||
|
%type range_or_rows {int}
|
||||||
|
|
||||||
|
%type frame_bound {struct FrameBound}
|
||||||
|
%destructor frame_bound {sqlite3ExprDelete(pParse->db, $$.pExpr);}
|
||||||
|
|
||||||
|
over_opt(A) ::= . { A = 0; }
|
||||||
|
over_opt(A) ::= filter_opt(W) OVER window_or_nm(Z). {
|
||||||
|
A = Z;
|
||||||
|
if( A ) A->pFilter = W;
|
||||||
|
}
|
||||||
|
|
||||||
|
window_or_nm(A) ::= window(Z). {A = Z;}
|
||||||
|
window_or_nm(A) ::= nm(Z). {
|
||||||
|
A = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
|
||||||
|
if( A ){
|
||||||
|
A->zName = sqlite3DbStrNDup(pParse->db, Z.z, Z.n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window(A) ::= LP part_opt(X) orderby_opt(Y) frame_opt(Z) RP. {
|
||||||
|
A = Z;
|
||||||
|
if( A ){
|
||||||
|
A->pPartition = X;
|
||||||
|
A->pOrderBy = Y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
part_opt(A) ::= PARTITION BY exprlist(X). { A = X; }
|
||||||
|
part_opt(A) ::= . { A = 0; }
|
||||||
|
filter_opt(A) ::= . { A = 0; }
|
||||||
|
filter_opt(A) ::= FILTER LP WHERE expr(X) RP. { A = X; }
|
||||||
|
|
||||||
|
frame_opt(A) ::= . {
|
||||||
|
A = sqlite3WindowAlloc(pParse, TK_RANGE, TK_UNBOUNDED, 0, TK_CURRENT, 0);
|
||||||
|
}
|
||||||
|
frame_opt(A) ::= range_or_rows(X) frame_bound(Y). {
|
||||||
|
A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, TK_CURRENT, 0);
|
||||||
|
}
|
||||||
|
frame_opt(A) ::= range_or_rows(X) BETWEEN frame_bound(Y) AND frame_bound(Z). {
|
||||||
|
A = sqlite3WindowAlloc(pParse, X, Y.eType, Y.pExpr, Z.eType, Z.pExpr);
|
||||||
|
}
|
||||||
|
|
||||||
|
range_or_rows(A) ::= RANGE. { A = TK_RANGE; }
|
||||||
|
range_or_rows(A) ::= ROWS. { A = TK_ROWS; }
|
||||||
|
|
||||||
|
frame_bound(A) ::= UNBOUNDED PRECEDING. { A.eType = TK_UNBOUNDED; A.pExpr = 0; }
|
||||||
|
frame_bound(A) ::= expr(X) PRECEDING. { A.eType = TK_PRECEDING; A.pExpr = X; }
|
||||||
|
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; }
|
||||||
|
frame_bound(A) ::= UNBOUNDED FOLLOWING. { A.eType = TK_UNBOUNDED; A.pExpr = 0; }
|
||||||
|
|
||||||
|
%type windowdefn_opt {Window*}
|
||||||
|
%destructor windowdefn_opt {sqlite3WindowDelete(pParse->db, $$);}
|
||||||
|
windowdefn_opt(A) ::= . { A = 0; }
|
||||||
|
windowdefn_opt(A) ::= WINDOW windowdefn_list(B). { A = B; }
|
||||||
|
%endif // SQLITE_OMIT_WINDOWFUNC
|
||||||
|
|
||||||
|
@ -798,7 +798,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
|
|||||||
pNC->nErr++;
|
pNC->nErr++;
|
||||||
}
|
}
|
||||||
if( is_agg ){
|
if( is_agg ){
|
||||||
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
pNC->ncFlags &= ~(pExpr->pWin ? NC_AllowWin : NC_AllowAgg);
|
pNC->ncFlags &= ~(pExpr->pWin ? NC_AllowWin : NC_AllowAgg);
|
||||||
|
#else
|
||||||
|
pNC->ncFlags &= ~NC_AllowAgg;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
sqlite3WalkExprList(pWalker, pList);
|
sqlite3WalkExprList(pWalker, pList);
|
||||||
if( is_agg ){
|
if( is_agg ){
|
||||||
|
@ -188,6 +188,7 @@ const char sqlite3IsEbcdicIdChar[] = {
|
|||||||
int sqlite3IsIdChar(u8 c){ return IdChar(c); }
|
int sqlite3IsIdChar(u8 c){ return IdChar(c); }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
/*
|
/*
|
||||||
** Return the id of the next token in string (*pz). Before returning, set
|
** Return the id of the next token in string (*pz). Before returning, set
|
||||||
** (*pz) to point to the byte following the parsed token.
|
** (*pz) to point to the byte following the parsed token.
|
||||||
@ -207,7 +208,9 @@ static int windowGetToken(const unsigned char **pz){
|
|||||||
*pz = z;
|
*pz = z;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif // SQLITE_OMIT_WINDOWFUNC
|
||||||
|
|
||||||
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
/*
|
/*
|
||||||
** The tokenizer has just parsed the keyword WINDOW. In this case the token
|
** The tokenizer has just parsed the keyword WINDOW. In this case the token
|
||||||
** may really be the keyword (TK_WINDOW), or may be an identifier (TK_ID).
|
** may really be the keyword (TK_WINDOW), or may be an identifier (TK_ID).
|
||||||
@ -238,6 +241,7 @@ static int analyzeWindowKeyword(const unsigned char *z){
|
|||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
#endif // SQLITE_OMIT_WINDOWFUNC
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Return the length (in bytes) of the token that begins at z[0].
|
** Return the length (in bytes) of the token that begins at z[0].
|
||||||
@ -565,8 +569,15 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
|
|||||||
pParse->rc = SQLITE_TOOBIG;
|
pParse->rc = SQLITE_TOOBIG;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
|
if( tokenType>=TK_WINDOW ){
|
||||||
|
assert( tokenType==TK_SPACE
|
||||||
|
|| tokenType==TK_ILLEGAL || tokenType==TK_WINDOW
|
||||||
|
);
|
||||||
|
#else
|
||||||
if( tokenType>=TK_SPACE ){
|
if( tokenType>=TK_SPACE ){
|
||||||
assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL );
|
assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL );
|
||||||
|
#endif // SQLITE_OMIT_WINDOWFUNC
|
||||||
if( db->u1.isInterrupted ){
|
if( db->u1.isInterrupted ){
|
||||||
pParse->rc = SQLITE_INTERRUPT;
|
pParse->rc = SQLITE_INTERRUPT;
|
||||||
break;
|
break;
|
||||||
@ -586,14 +597,15 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){
|
|||||||
tokenType = TK_SEMI;
|
tokenType = TK_SEMI;
|
||||||
}
|
}
|
||||||
n = 0;
|
n = 0;
|
||||||
|
#ifndef SQLITE_OMIT_WINDOWFUNC
|
||||||
|
}else if( tokenType==TK_WINDOW ){
|
||||||
|
tokenType = analyzeWindowKeyword((const u8*)&zSql[6]);
|
||||||
|
#endif // SQLITE_OMIT_WINDOWFUNC
|
||||||
}else{
|
}else{
|
||||||
sqlite3ErrorMsg(pParse, "unrecognized token: \"%.*s\"", n, zSql);
|
sqlite3ErrorMsg(pParse, "unrecognized token: \"%.*s\"", n, zSql);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if( tokenType==TK_WINDOW ){
|
|
||||||
tokenType = analyzeWindowKeyword((const u8*)&zSql[6]);
|
|
||||||
}
|
|
||||||
pParse->sLastToken.z = zSql;
|
pParse->sLastToken.z = zSql;
|
||||||
pParse->sLastToken.n = n;
|
pParse->sLastToken.n = n;
|
||||||
sqlite3Parser(pEngine, tokenType, pParse->sLastToken);
|
sqlite3Parser(pEngine, tokenType, pParse->sLastToken);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user