]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Size optimization in the parser. (CVS 2004)
authordrh <drh@noemail.net>
Wed, 6 Oct 2004 14:39:28 +0000 (14:39 +0000)
committerdrh <drh@noemail.net>
Wed, 6 Oct 2004 14:39:28 +0000 (14:39 +0000)
FossilOrigin-Name: 8e2ae2449882f70fe4e77c100193c053d7669ae6

manifest
manifest.uuid
src/parse.y

index dd2731d87f86fce58d8a4d86e33d0a1341899bf3..30746d5845bd47f25cf0afa1c3d62223b0923aee 100644 (file)
--- 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
index 47c4e953f34924a30baa93a7b5a51ad0ea511707..c0d0a3496489435cde875b4bfc7922b79775b73d 100644 (file)
@@ -1 +1 @@
-dcbf4817a7a3ce18a2d5ed008346933a36acd543
\ No newline at end of file
+8e2ae2449882f70fe4e77c100193c053d7669ae6
\ No newline at end of file
index 7d56fed100d0130d305214d215dea40a403f37f7..3f8765cf85e099db41da8cfcdeba54704c0df2b1 100644 (file)
@@ -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);
 }