mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-11 01:42:22 +03:00
Optimizations to the SQL language grammar that result in a small size
reduction and speed increase. FossilOrigin-Name: cb5d1f83e0a33d546d4c0cb817ef1f8440d1f738
This commit is contained in:
@@ -30,4 +30,5 @@ END {
|
|||||||
printf "#define TK_%-29s %4d\n", "AGG_COLUMN", ++max
|
printf "#define TK_%-29s %4d\n", "AGG_COLUMN", ++max
|
||||||
printf "#define TK_%-29s %4d\n", "UMINUS", ++max
|
printf "#define TK_%-29s %4d\n", "UMINUS", ++max
|
||||||
printf "#define TK_%-29s %4d\n", "UPLUS", ++max
|
printf "#define TK_%-29s %4d\n", "UPLUS", ++max
|
||||||
|
printf "#define TK_%-29s %4d\n", "REGISTER", ++max
|
||||||
}
|
}
|
||||||
|
|||||||
16
manifest
16
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Add\sthe\s"%token_class"\sdirective\sto\sthe\sLEMON\sparser\sgenerator.\s\sThis\sopens\sup\nthe\spossibility\sof\ssimplifying\sthe\sparser.\s\sAlso\sremove\sall\scalls\sto\s\nsprintf(),\sstrcpy(),\sand\sstrcat()\sfrom\sLEMON\sto\savoid\scompiler\swarnings\non\sOpenBSD.\s\s(Aside:\s\sIt\sis\sthis\schange\sto\savoid\sharmless\scompiler\swarnings\nthat\swas\sthe\scause\sof\sthe\sreason\sspat\sof\sbugs.)
|
C Optimizations\sto\sthe\sSQL\slanguage\sgrammar\sthat\sresult\sin\sa\ssmall\ssize\nreduction\sand\sspeed\sincrease.
|
||||||
D 2014-01-11T03:27:37.624
|
D 2014-01-11T03:54:05.594
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
|
F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -8,7 +8,7 @@ F Makefile.vxworks db21ed42a01d5740e656b16f92cb5d8d5e5dd315
|
|||||||
F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
|
F README cd04a36fbc7ea56932a4052d7d0b7f09f27c33d6
|
||||||
F VERSION 8ed548d87d0a27fd7d7620476f9e25f9fa742d73
|
F VERSION 8ed548d87d0a27fd7d7620476f9e25f9fa742d73
|
||||||
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
|
F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50
|
||||||
F addopcodes.awk 87ca612393d0f439550634bd2c156ea9ff6195ae
|
F addopcodes.awk 9eb448a552d5c0185cf62c463f9c173cedae3811
|
||||||
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
|
F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2
|
||||||
F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
|
F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90
|
||||||
F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2
|
F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2
|
||||||
@@ -209,7 +209,7 @@ F src/os_unix.c 3a4dcb554d3c915075766162f28c3fd4cdb75968
|
|||||||
F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07
|
F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07
|
||||||
F src/pager.c efa923693e958696eee69b205a20bfbc402c8480
|
F src/pager.c efa923693e958696eee69b205a20bfbc402c8480
|
||||||
F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
|
F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
|
||||||
F src/parse.y 60baa3aced02c9f91259719d196315bc28580719
|
F src/parse.y 3c5384533a8bfce5abd256cc9cb2c38bec05ad61
|
||||||
F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
|
F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
|
||||||
F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
|
F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
|
||||||
F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b
|
F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b
|
||||||
@@ -274,7 +274,7 @@ F src/test_thread.c 1e133a40b50e9c035b00174035b846e7eef481cb
|
|||||||
F src/test_vfs.c e72f555ef7a59080f898fcf1a233deb9eb704ea9
|
F src/test_vfs.c e72f555ef7a59080f898fcf1a233deb9eb704ea9
|
||||||
F src/test_vfstrace.c 3a0ab304682fecbceb689e7d9b904211fde11d78
|
F src/test_vfstrace.c 3a0ab304682fecbceb689e7d9b904211fde11d78
|
||||||
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
|
||||||
F src/tokenize.c ec4c1a62b890bf1dbcdb966399e140b904c700a4
|
F src/tokenize.c 5d04a1b7d1fe7e18556a869788f5d3e132a586b6
|
||||||
F src/trigger.c 5c1c0b899ac0ce284763dcb8fdbaa38ecf15ef98
|
F src/trigger.c 5c1c0b899ac0ce284763dcb8fdbaa38ecf15ef98
|
||||||
F src/update.c c2706a6eb232a96345c35b7e1e75a188e26812bb
|
F src/update.c c2706a6eb232a96345c35b7e1e75a188e26812bb
|
||||||
F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
|
F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269
|
||||||
@@ -1148,7 +1148,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
|
|||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
|
F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
|
||||||
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
|
F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
|
||||||
P 7f1e7ae313c7625ef2623d78883dce776eecca30 da7890ca6b1d8e511377a469047120220e8c3b2d
|
P 8eb48c04bd0a14031488b3160fde67307eb8b35d
|
||||||
R 4ba60b3fb47af12fdb784f3275ccdc2b
|
R 754b7dd57633ea486f18a04af0e67e46
|
||||||
U drh
|
U drh
|
||||||
Z 11bef21bd681893c7b5fd9fec7621236
|
Z 0bb5f8caa9532d2db9247df525167cc7
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
8eb48c04bd0a14031488b3160fde67307eb8b35d
|
cb5d1f83e0a33d546d4c0cb817ef1f8440d1f738
|
||||||
22
src/parse.y
22
src/parse.y
@@ -194,9 +194,7 @@ columnid(A) ::= nm(X). {
|
|||||||
// An IDENTIFIER can be a generic identifier, or one of several
|
// An IDENTIFIER can be a generic identifier, or one of several
|
||||||
// keywords. Any non-standard keyword can also be an identifier.
|
// keywords. Any non-standard keyword can also be an identifier.
|
||||||
//
|
//
|
||||||
%type id {Token}
|
%token_class id ID|INDEXED.
|
||||||
id(A) ::= ID(X). {A = X;}
|
|
||||||
id(A) ::= INDEXED(X). {A = X;}
|
|
||||||
|
|
||||||
// The following directive causes tokens ABORT, AFTER, ASC, etc. to
|
// The following directive causes tokens ABORT, AFTER, ASC, etc. to
|
||||||
// fallback to ID if they will not parse as their original value.
|
// fallback to ID if they will not parse as their original value.
|
||||||
@@ -241,8 +239,7 @@ id(A) ::= INDEXED(X). {A = X;}
|
|||||||
|
|
||||||
// And "ids" is an identifer-or-string.
|
// And "ids" is an identifer-or-string.
|
||||||
//
|
//
|
||||||
%type ids {Token}
|
%token_class ids ID|STRING.
|
||||||
ids(A) ::= ID|STRING(X). {A = X;}
|
|
||||||
|
|
||||||
// The name of a column or table can be any of the following:
|
// The name of a column or table can be any of the following:
|
||||||
//
|
//
|
||||||
@@ -776,7 +773,8 @@ expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
|
|||||||
}
|
}
|
||||||
term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);}
|
term(A) ::= INTEGER|FLOAT|BLOB(X). {spanExpr(&A, pParse, @X, &X);}
|
||||||
term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);}
|
term(A) ::= STRING(X). {spanExpr(&A, pParse, @X, &X);}
|
||||||
expr(A) ::= REGISTER(X). {
|
expr(A) ::= VARIABLE(X). {
|
||||||
|
if( X.n>=2 && X.z[0]=='#' && sqlite3Isdigit(X.z[1]) ){
|
||||||
/* When doing a nested parse, one can include terms in an expression
|
/* When doing a nested parse, one can include terms in an expression
|
||||||
** that look like this: #1 #2 ... These terms refer to registers
|
** that look like this: #1 #2 ... These terms refer to registers
|
||||||
** in the virtual machine. #N is the N-th register. */
|
** in the virtual machine. #N is the N-th register. */
|
||||||
@@ -787,11 +785,10 @@ expr(A) ::= REGISTER(X). {
|
|||||||
A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X);
|
A.pExpr = sqlite3PExpr(pParse, TK_REGISTER, 0, 0, &X);
|
||||||
if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable);
|
if( A.pExpr ) sqlite3GetInt32(&X.z[1], &A.pExpr->iTable);
|
||||||
}
|
}
|
||||||
spanSet(&A, &X, &X);
|
}else{
|
||||||
}
|
|
||||||
expr(A) ::= VARIABLE(X). {
|
|
||||||
spanExpr(&A, pParse, TK_VARIABLE, &X);
|
spanExpr(&A, pParse, TK_VARIABLE, &X);
|
||||||
sqlite3ExprAssignVarNumber(pParse, A.pExpr);
|
sqlite3ExprAssignVarNumber(pParse, A.pExpr);
|
||||||
|
}
|
||||||
spanSet(&A, &X, &X);
|
spanSet(&A, &X, &X);
|
||||||
}
|
}
|
||||||
expr(A) ::= expr(E) COLLATE ids(C). {
|
expr(A) ::= expr(E) COLLATE ids(C). {
|
||||||
@@ -805,7 +802,7 @@ expr(A) ::= CAST(X) LP expr(E) AS typetoken(T) RP(Y). {
|
|||||||
spanSet(&A,&X,&Y);
|
spanSet(&A,&X,&Y);
|
||||||
}
|
}
|
||||||
%endif SQLITE_OMIT_CAST
|
%endif SQLITE_OMIT_CAST
|
||||||
expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). {
|
expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). {
|
||||||
if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
|
if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){
|
||||||
sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
|
sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X);
|
||||||
}
|
}
|
||||||
@@ -815,7 +812,7 @@ expr(A) ::= ID(X) LP distinct(D) exprlist(Y) RP(E). {
|
|||||||
A.pExpr->flags |= EP_Distinct;
|
A.pExpr->flags |= EP_Distinct;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
expr(A) ::= ID(X) LP STAR RP(E). {
|
expr(A) ::= id(X) LP STAR RP(E). {
|
||||||
A.pExpr = sqlite3ExprFunction(pParse, 0, &X);
|
A.pExpr = sqlite3ExprFunction(pParse, 0, &X);
|
||||||
spanSet(&A,&X,&E);
|
spanSet(&A,&X,&E);
|
||||||
}
|
}
|
||||||
@@ -1165,11 +1162,10 @@ nmnum(A) ::= ON(X). {A = X;}
|
|||||||
nmnum(A) ::= DELETE(X). {A = X;}
|
nmnum(A) ::= DELETE(X). {A = X;}
|
||||||
nmnum(A) ::= DEFAULT(X). {A = X;}
|
nmnum(A) ::= DEFAULT(X). {A = X;}
|
||||||
%endif SQLITE_OMIT_PRAGMA
|
%endif SQLITE_OMIT_PRAGMA
|
||||||
|
%token_class number INTEGER|FLOAT.
|
||||||
plus_num(A) ::= PLUS number(X). {A = X;}
|
plus_num(A) ::= PLUS number(X). {A = X;}
|
||||||
plus_num(A) ::= number(X). {A = X;}
|
plus_num(A) ::= number(X). {A = X;}
|
||||||
minus_num(A) ::= MINUS number(X). {A = X;}
|
minus_num(A) ::= MINUS number(X). {A = X;}
|
||||||
number(A) ::= INTEGER|FLOAT(X). {A = X;}
|
|
||||||
|
|
||||||
//////////////////////////// The CREATE TRIGGER command /////////////////////
|
//////////////////////////// The CREATE TRIGGER command /////////////////////
|
||||||
|
|
||||||
%ifndef SQLITE_OMIT_TRIGGER
|
%ifndef SQLITE_OMIT_TRIGGER
|
||||||
|
|||||||
@@ -303,24 +303,15 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){
|
|||||||
for(i=1; sqlite3Isdigit(z[i]); i++){}
|
for(i=1; sqlite3Isdigit(z[i]); i++){}
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
case '#': {
|
|
||||||
for(i=1; sqlite3Isdigit(z[i]); i++){}
|
|
||||||
if( i>1 ){
|
|
||||||
/* Parameters of the form #NNN (where NNN is a number) are used
|
|
||||||
** internally by sqlite3NestedParse. */
|
|
||||||
*tokenType = TK_REGISTER;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
/* Fall through into the next case if the '#' is not followed by
|
|
||||||
** a digit. Try to match #AAAA where AAAA is a parameter name. */
|
|
||||||
}
|
|
||||||
#ifndef SQLITE_OMIT_TCL_VARIABLE
|
#ifndef SQLITE_OMIT_TCL_VARIABLE
|
||||||
case '$':
|
case '$':
|
||||||
#endif
|
#endif
|
||||||
case '@': /* For compatibility with MS SQL Server */
|
case '@': /* For compatibility with MS SQL Server */
|
||||||
|
case '#':
|
||||||
case ':': {
|
case ':': {
|
||||||
int n = 0;
|
int n = 0;
|
||||||
testcase( z[0]=='$' ); testcase( z[0]=='@' ); testcase( z[0]==':' );
|
testcase( z[0]=='$' ); testcase( z[0]=='@' );
|
||||||
|
testcase( z[0]==':' ); testcase( z[0]=='#' );
|
||||||
*tokenType = TK_VARIABLE;
|
*tokenType = TK_VARIABLE;
|
||||||
for(i=1; (c=z[i])!=0; i++){
|
for(i=1; (c=z[i])!=0; i++){
|
||||||
if( IdChar(c) ){
|
if( IdChar(c) ){
|
||||||
|
|||||||
Reference in New Issue
Block a user