⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 edbpparse.y

📁 在VC6环境下开发
💻 Y
📖 第 1 页 / 共 2 页
字号:

////////////////////////// The UPDATE command ////////////////////////////////
//
cmd ::= UPDATE nm(X) dbnm(D) SET setlist(Y) where_opt(Z).
    {eDbUpdate(pParse,eDbSrcListAppend(0,&X,&D),Y,Z,0);}

setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
    {A = eDbExprListAppend(Z,Y,&X);}
setlist(A) ::= nm(X) EQ expr(Y).   {A = eDbExprListAppend(0,Y,&X);}

////////////////////////// The INSERT command /////////////////////////////////
//
cmd ::= INSERT INTO nm(X) dbnm(D) inscollist_opt(F) 
        VALUES LP itemlist(Y) RP.
            {eDbInsert(pParse, eDbSrcListAppend(0,&X,&D), Y, 0, F, 0);}

%type itemlist {ExprList*}
%destructor itemlist {eDbExprListDelete($$);}

itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = eDbExprListAppend(X,Y,0);}
itemlist(A) ::= expr(X).                    {A = eDbExprListAppend(0,X,0);}

%type inscollist_opt {IdList*}
%destructor inscollist_opt {eDbIdListDelete($$);}
%type inscollist {IdList*}
%destructor inscollist {eDbIdListDelete($$);}

inscollist_opt(A) ::= .                       {A = 0;}
inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
inscollist(A) ::= inscollist(X) COMMA nm(Y).  {A = eDbIdListAppend(X,&Y);}
inscollist(A) ::= nm(Y).                      {A = eDbIdListAppend(0,&Y);}

/////////////////////////// Expression Processing /////////////////////////////
//

%type expr {Expr*}
%destructor expr {eDbExprDelete($$);}

expr(A) ::= LP(B) expr(X) RP(E). {A = X; eDbExprSpan(A,&B,&E); }
expr(A) ::= NULL(X).             {A = eDbExpr(TK_NULL, 0, 0, &X);}
expr(A) ::= ID(X).               {A = eDbExpr(TK_ID, 0, 0, &X);}
expr(A) ::= JOIN_KW(X).          {A = eDbExpr(TK_ID, 0, 0, &X);}
expr(A) ::= nm(X) DOT nm(Y). {
  Expr *temp1 = eDbExpr(TK_ID, 0, 0, &X);
  Expr *temp2 = eDbExpr(TK_ID, 0, 0, &Y);
  A = eDbExpr(TK_DOT, temp1, temp2, 0);
}

expr(A) ::= INTEGER(X).      {A = eDbExpr(TK_INTEGER, 0, 0, &X);}
expr(A) ::= FLOAT(X).        {A = eDbExpr(TK_FLOAT, 0, 0, &X);}
expr(A) ::= STRING(X).       {A = eDbExpr(TK_STRING, 0, 0, &X);}
expr(A) ::= VARIABLE(X).     {
  A = eDbExpr(TK_VARIABLE, 0, 0, &X);
  if( A ) A->iTable = ++pParse->nVar;
}
expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
  A = eDbExprFunction(Y, &X);
  eDbExprSpan(A,&X,&E);
}
expr(A) ::= ID(X) LP STAR RP(E). {
  A = eDbExprFunction(0, &X);
  eDbExprSpan(A,&X,&E);
}
expr(A) ::= expr(X) AND expr(Y).   {A = eDbExpr(TK_AND, X, Y, 0);}
expr(A) ::= expr(X) OR expr(Y).    {A = eDbExpr(TK_OR, X, Y, 0);}
expr(A) ::= expr(X) LT expr(Y).    {A = eDbExpr(TK_LT, X, Y, 0);}
expr(A) ::= expr(X) GT expr(Y).    {A = eDbExpr(TK_GT, X, Y, 0);}
expr(A) ::= expr(X) LE expr(Y).    {A = eDbExpr(TK_LE, X, Y, 0);}
expr(A) ::= expr(X) GE expr(Y).    {A = eDbExpr(TK_GE, X, Y, 0);}
expr(A) ::= expr(X) NE expr(Y).    {A = eDbExpr(TK_NE, X, Y, 0);}
expr(A) ::= expr(X) EQ expr(Y).    {A = eDbExpr(TK_EQ, X, Y, 0);}
expr(A) ::= expr(X) BITAND expr(Y). {A = eDbExpr(TK_BITAND, X, Y, 0);}
expr(A) ::= expr(X) BITOR expr(Y).  {A = eDbExpr(TK_BITOR, X, Y, 0);}
expr(A) ::= expr(X) LSHIFT expr(Y). {A = eDbExpr(TK_LSHIFT, X, Y, 0);}
expr(A) ::= expr(X) RSHIFT expr(Y). {A = eDbExpr(TK_RSHIFT, X, Y, 0);}
expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
  ExprList *pList = eDbExprListAppend(0, Y, 0);
  pList = eDbExprListAppend(pList, X, 0);
  A = eDbExprFunction(pList, 0);
  if( A ) A->op = OP;
  eDbExprSpan(A, &X->span, &Y->span);
}
expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
  ExprList *pList = eDbExprListAppend(0, Y, 0);
  pList = eDbExprListAppend(pList, X, 0);
  A = eDbExprFunction(pList, 0);
  if( A ) A->op = OP;
  A = eDbExpr(TK_NOT, A, 0, 0);
  eDbExprSpan(A,&X->span,&Y->span);
}
%type likeop {int}
likeop(A) ::= LIKE. {A = TK_LIKE;}
expr(A) ::= expr(X) PLUS expr(Y).  {A = eDbExpr(TK_PLUS, X, Y, 0);}
expr(A) ::= expr(X) MINUS expr(Y). {A = eDbExpr(TK_MINUS, X, Y, 0);}
expr(A) ::= expr(X) STAR expr(Y).  {A = eDbExpr(TK_STAR, X, Y, 0);}
expr(A) ::= expr(X) SLASH expr(Y). {A = eDbExpr(TK_SLASH, X, Y, 0);}
expr(A) ::= expr(X) ISNULL(E). {
  A = eDbExpr(TK_ISNULL, X, 0, 0);
  eDbExprSpan(A,&X->span,&E);
}
expr(A) ::= expr(X) IS NULL(E). {
  A = eDbExpr(TK_ISNULL, X, 0, 0);
  eDbExprSpan(A,&X->span,&E);
}
expr(A) ::= expr(X) NOTNULL(E). {
  A = eDbExpr(TK_NOTNULL, X, 0, 0);
  eDbExprSpan(A,&X->span,&E);
}
expr(A) ::= expr(X) NOT NULL(E). {
  A = eDbExpr(TK_NOTNULL, X, 0, 0);
  eDbExprSpan(A,&X->span,&E);
}
expr(A) ::= expr(X) IS NOT NULL(E). {
  A = eDbExpr(TK_NOTNULL, X, 0, 0);
  eDbExprSpan(A,&X->span,&E);
}
expr(A) ::= NOT(B) expr(X). {
  A = eDbExpr(TK_NOT, X, 0, 0);
  eDbExprSpan(A,&B,&X->span);
}
expr(A) ::= BITNOT(B) expr(X). {
  A = eDbExpr(TK_BITNOT, X, 0, 0);
  eDbExprSpan(A,&B,&X->span);
}
expr(A) ::= MINUS(B) expr(X). [UMINUS] {
  A = eDbExpr(TK_UMINUS, X, 0, 0);
  eDbExprSpan(A,&B,&X->span);
}
expr(A) ::= PLUS(B) expr(X). [UPLUS] {
  A = eDbExpr(TK_UPLUS, X, 0, 0);
  eDbExprSpan(A,&B,&X->span);
}
expr(A) ::= LP(B) select(X) RP(E). {
  A = eDbExpr(TK_SELECT, 0, 0, 0);
  if( A ) A->pSelect = X;
  eDbExprSpan(A,&B,&E);
}
expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
  ExprList *pList = eDbExprListAppend(0, X, 0);
  pList = eDbExprListAppend(pList, Y, 0);
  A = eDbExpr(TK_BETWEEN, W, 0, 0);
  if( A ) A->pList = pList;
  eDbExprSpan(A,&W->span,&Y->span);
}
expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
  ExprList *pList = eDbExprListAppend(0, X, 0);
  pList = eDbExprListAppend(pList, Y, 0);
  A = eDbExpr(TK_BETWEEN, W, 0, 0);
  if( A ) A->pList = pList;
  A = eDbExpr(TK_NOT, A, 0, 0);
  eDbExprSpan(A,&W->span,&Y->span);
}
expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
  A = eDbExpr(TK_IN, X, 0, 0);
  if( A ) A->pList = Y;
  eDbExprSpan(A,&X->span,&E);
}
expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
  A = eDbExpr(TK_IN, X, 0, 0);
  if( A ) A->pSelect = Y;
  eDbExprSpan(A,&X->span,&E);
}
expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
  A = eDbExpr(TK_IN, X, 0, 0);
  if( A ) A->pList = Y;
  A = eDbExpr(TK_NOT, A, 0, 0);
  eDbExprSpan(A,&X->span,&E);
}
expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
  A = eDbExpr(TK_IN, X, 0, 0);
  if( A ) A->pSelect = Y;
  A = eDbExpr(TK_NOT, A, 0, 0);
  eDbExprSpan(A,&X->span,&E);
}
expr(A) ::= expr(X) IN nm(Y) dbnm(D). {
  SrcList *pSrc = eDbSrcListAppend(0, &Y, &D);
  A = eDbExpr(TK_IN, X, 0, 0);
  if( A ) A->pSelect = eDbSelectNew(0,pSrc,0,0,0,0,0,-1,0);
  eDbExprSpan(A,&X->span,D.z?&D:&Y);
}
expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). {
  SrcList *pSrc = eDbSrcListAppend(0, &Y, &D);
  A = eDbExpr(TK_IN, X, 0, 0);
  if( A ) A->pSelect = eDbSelectNew(0,pSrc,0,0,0,0,0,-1,0);
  A = eDbExpr(TK_NOT, A, 0, 0);
  eDbExprSpan(A,&X->span,D.z?&D:&Y);
}
%type exprlist {ExprList*}
%destructor exprlist {eDbExprListDelete($$);}
%type expritem {Expr*}
%destructor expritem {eDbExprDelete($$);}

exprlist(A) ::= exprlist(X) COMMA expritem(Y). 
   {A = eDbExprListAppend(X,Y,0);}
exprlist(A) ::= expritem(X).            {A = eDbExprListAppend(0,X,0);}
expritem(A) ::= expr(X).                {A = X;}
expritem(A) ::= .                       {A = 0;}

///////////////////////////// The CREATE INDEX command ///////////////////////
//
cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X)
        ON nm(Y) dbnm(D) LP idxlist(Z) RP(E). {
  SrcList *pSrc = eDbSrcListAppend(0, &Y, &D);
  if( U!=OE_None ) U = R;
  if( U==OE_Default) U = OE_Abort;
  eDbCreateIndex(pParse, &X, pSrc, Z, U, &S, &E);
}

%type uniqueflag {int}
uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
uniqueflag(A) ::= .        { A = OE_None; }

%type idxlist {IdList*}
%destructor idxlist {eDbIdListDelete($$);}
%type idxlist_opt {IdList*}
%destructor idxlist_opt {eDbIdListDelete($$);}
%type idxitem {Token}

idxlist(A) ::= idxlist(X) COMMA idxitem(Y).  {A = eDbIdListAppend(X,&Y);}
idxlist(A) ::= idxitem(Y).                   {A = eDbIdListAppend(0,&Y);}
idxitem(A) ::= nm(X) sortorder.              {A = X;}

///////////////////////////// The DROP INDEX command /////////////////////////
//

cmd ::= DROP INDEX nm(X) dbnm(Y).   {
  eDbDropIndex(pParse, eDbSrcListAppend(0,&X,&Y));
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -