From: drh Date: Wed, 6 Oct 2004 14:39:28 +0000 (+0000) Subject: Size optimization in the parser. (CVS 2004) X-Git-Tag: version-3.0.8~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e3a1f16b674f8911de3959f400168680ebe3ae5;p=thirdparty%2Fsqlite.git Size optimization in the parser. (CVS 2004) FossilOrigin-Name: 8e2ae2449882f70fe4e77c100193c053d7669ae6 --- diff --git a/manifest b/manifest index dd2731d87f..30746d5845 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\s".import"\scommand\sof\sthe\scommand-line\sshell\sso\sthat\sit\signores\n\\n\sand\s\\r\sat\sthe\send\sof\sa\sline.\s\sTicket\s#939.\s(CVS\s2003) -D 2004-10-06T14:39:07 +C Size\soptimization\sin\sthe\sparser.\s(CVS\s2004) +D 2004-10-06T14:39:29 F Makefile.in 78ddc9fca09ab6e3b75a79ecf8d490e34cd0519c F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -54,7 +54,7 @@ F src/os_win.c 9482dfc92f289b68205bb2c9315757c7e3946bfb F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b F src/pager.c dc0ffab9941393b072e0b1f1f3de54830727cec9 F src/pager.h 774d1973acbda341827d21b0da0150575d69f7d9 -F src/parse.y e03d7d7f712ad2b5be61e9a024820c0a8ffdf36d +F src/parse.y 329d1bca30000093f664b8b8e981e75ce2b11d3e F src/pragma.c 4a071a1908aa7fb5930a9d73fd300a6aa2ac07e1 F src/printf.c 40770e1f553612d13dfc86d236086e69baa62fe1 F src/random.c eff68e3f257e05e81eae6c4d50a51eb88beb4ff3 @@ -250,7 +250,7 @@ F www/tclsqlite.tcl 560ecd6a916b320e59f2917317398f3d59b7cc25 F www/vdbe.tcl 59288db1ac5c0616296b26dce071c36cb611dfe9 F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P f623d6e74fb5f6f70a22c06278b2bb1b4b7f9b85 -R 50bde6f04c39893f91c23c1114101ce8 +P dcbf4817a7a3ce18a2d5ed008346933a36acd543 +R bb6840d2828634b7f251d4000a4ec78a U drh -Z 9d4f078082e7ca6946a15a06c5a6ac0b +Z 908fa14825ec85f62b3b4f967c9ab77f diff --git a/manifest.uuid b/manifest.uuid index 47c4e953f3..c0d0a34964 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dcbf4817a7a3ce18a2d5ed008346933a36acd543 \ No newline at end of file +8e2ae2449882f70fe4e77c100193c053d7669ae6 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 7d56fed100..3f8765cf85 100644 --- a/src/parse.y +++ b/src/parse.y @@ -14,7 +14,7 @@ ** the parser. Lemon will also generate a header file containing ** numeric codes for all of the tokens. ** -** @(#) $Id: parse.y,v 1.142 2004/10/05 02:41:43 drh Exp $ +** @(#) $Id: parse.y,v 1.143 2004/10/06 14:39:29 drh Exp $ */ %token_prefix TK_ %token_type {Token} @@ -43,6 +43,15 @@ struct LimitVal { int offset; /* The OFFSET. 0 if there is none */ }; +/* +** An instance of this structure is used to store the LIKE, +** GLOB, NOT LIKE, and NOT GLOB operators. +*/ +struct LikeOp { + int opcode; /* Either TK_GLOB or TK_LIKE */ + int not; /* True if the NOT keyword is present */ +}; + /* ** An instance of the following structure describes the event of a ** TRIGGER. "a" is the event type, one of TK_UPDATE, TK_INSERT, @@ -597,20 +606,15 @@ expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE] { ExprList *pList = sqlite3ExprListAppend(0, Y, 0); pList = sqlite3ExprListAppend(pList, X, 0); A = sqlite3ExprFunction(pList, 0); - if( A ) A->op = OP; + if( A ) A->op = OP.opcode; + if( OP.not ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A, &X->span, &Y->span); } -expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] { - ExprList *pList = sqlite3ExprListAppend(0, Y, 0); - pList = sqlite3ExprListAppend(pList, X, 0); - A = sqlite3ExprFunction(pList, 0); - if( A ) A->op = OP; - A = sqlite3Expr(TK_NOT, A, 0, 0); - sqlite3ExprSpan(A,&X->span,&Y->span); -} -%type likeop {int} -likeop(A) ::= LIKE. {A = TK_LIKE;} -likeop(A) ::= GLOB. {A = TK_GLOB;} +%type likeop {struct LikeOp} +likeop(A) ::= LIKE. {A.opcode = TK_LIKE; A.not = 0;} +likeop(A) ::= GLOB. {A.opcode = TK_GLOB; A.not = 0;} +likeop(A) ::= NOT LIKE. {A.opcode = TK_LIKE; A.not = 1;} +likeop(A) ::= NOT GLOB. {A.opcode = TK_GLOB; A.not = 1;} expr(A) ::= expr(X) PLUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} expr(A) ::= expr(X) MINUS(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} expr(A) ::= expr(X) STAR(OP) expr(Y). {A = sqlite3Expr(@OP, X, Y, 0);} @@ -658,54 +662,37 @@ expr(A) ::= LP(B) select(X) RP(E). { if( A ) A->pSelect = X; sqlite3ExprSpan(A,&B,&E); } -expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). { - ExprList *pList = sqlite3ExprListAppend(0, X, 0); - pList = sqlite3ExprListAppend(pList, Y, 0); - A = sqlite3Expr(TK_BETWEEN, W, 0, 0); - if( A ) A->pList = pList; - sqlite3ExprSpan(A,&W->span,&Y->span); -} -expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). { +%type between_op {int} +between_op(A) ::= BETWEEN. {A = 0;} +between_op(A) ::= NOT BETWEEN. {A = 1;} +expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ExprList *pList = sqlite3ExprListAppend(0, X, 0); pList = sqlite3ExprListAppend(pList, Y, 0); A = sqlite3Expr(TK_BETWEEN, W, 0, 0); if( A ) A->pList = pList; - A = sqlite3Expr(TK_NOT, A, 0, 0); + if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A,&W->span,&Y->span); } -expr(A) ::= expr(X) IN LP exprlist(Y) RP(E). { +%type in_op {int} +in_op(A) ::= IN. {A = 0;} +in_op(A) ::= NOT IN. {A = 1;} +expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { A = sqlite3Expr(TK_IN, X, 0, 0); if( A ) A->pList = Y; + if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A,&X->span,&E); } -expr(A) ::= expr(X) IN LP select(Y) RP(E). { +expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { A = sqlite3Expr(TK_IN, X, 0, 0); if( A ) A->pSelect = Y; + if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A,&X->span,&E); } -expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E). { - A = sqlite3Expr(TK_IN, X, 0, 0); - if( A ) A->pList = Y; - A = sqlite3Expr(TK_NOT, A, 0, 0); - sqlite3ExprSpan(A,&X->span,&E); -} -expr(A) ::= expr(X) NOT IN LP select(Y) RP(E). { - A = sqlite3Expr(TK_IN, X, 0, 0); - if( A ) A->pSelect = Y; - A = sqlite3Expr(TK_NOT, A, 0, 0); - sqlite3ExprSpan(A,&X->span,&E); -} -expr(A) ::= expr(X) IN nm(Y) dbnm(D). { - SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D); - A = sqlite3Expr(TK_IN, X, 0, 0); - if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0); - sqlite3ExprSpan(A,&X->span,D.z?&D:&Y); -} -expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). { +expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(D). [IN] { SrcList *pSrc = sqlite3SrcListAppend(0, &Y, &D); A = sqlite3Expr(TK_IN, X, 0, 0); if( A ) A->pSelect = sqlite3SelectNew(0,pSrc,0,0,0,0,0,-1,0); - A = sqlite3Expr(TK_NOT, A, 0, 0); + if( N ) A = sqlite3Expr(TK_NOT, A, 0, 0); sqlite3ExprSpan(A,&X->span,D.z?&D:&Y); }