PHP  
 PHP: Test and Code Coverage Analysis
downloads | QA | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | my php.net 
 

LTP GCOV extension - code coverage report
Current view: directory - var/php_gcov/PHP_5_2/lcov_data/ext/sqlite/libsqlite/src - parse.y
Test: PHP Code Coverage
Date: 2009-11-19 Instrumented lines: 310
Code covered: 28.7 % Executed lines: 89
Legend: not executed executed

       1                 : /*
       2                 : ** 2001 September 15
       3                 : **
       4                 : ** The author disclaims copyright to this source code.  In place of
       5                 : ** a legal notice, here is a blessing:
       6                 : **
       7                 : **    May you do good and not evil.
       8                 : **    May you find forgiveness for yourself and forgive others.
       9                 : **    May you share freely, never taking more than you give.
      10                 : **
      11                 : *************************************************************************
      12                 : ** This file contains SQLite's grammar for SQL.  Process this file
      13                 : ** using the lemon parser generator to generate C code that runs
      14                 : ** the parser.  Lemon will also generate a header file containing
      15                 : ** numeric codes for all of the tokens.
      16                 : **
      17                 : ** @(#) $Id: parse.y 195361 2005-09-07 15:11:33Z iliaa $
      18                 : */
      19                 : %token_prefix TK_
      20                 : %token_type {Token}
      21                 : %default_type {Token}
      22                 : %extra_argument {Parse *pParse}
      23                 : %syntax_error {
      24               5 :   if( pParse->zErrMsg==0 ){
      25               3 :     if( TOKEN.z[0] ){
      26               3 :       sqliteErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
      27                 :     }else{
      28               0 :       sqliteErrorMsg(pParse, "incomplete SQL statement");
      29                 :     }
      30                 :   }
      31                 : }
      32                 : %name sqliteParser
      33                 : %include {
      34                 : #include "sqliteInt.h"
      35                 : #include "parse.h"
      36                 : 
      37                 : /*
      38                 : ** An instance of this structure holds information about the
      39                 : ** LIMIT clause of a SELECT statement.
      40                 : */
      41                 : struct LimitVal {
      42                 :   int limit;    /* The LIMIT value.  -1 if there is no limit */
      43                 :   int offset;   /* The OFFSET.  0 if there is none */
      44                 : };
      45                 : 
      46                 : /*
      47                 : ** An instance of the following structure describes the event of a
      48                 : ** TRIGGER.  "a" is the event type, one of TK_UPDATE, TK_INSERT,
      49                 : ** TK_DELETE, or TK_INSTEAD.  If the event is of the form
      50                 : **
      51                 : **      UPDATE ON (a,b,c)
      52                 : **
      53                 : ** Then the "b" IdList records the list "a,b,c".
      54                 : */
      55                 : struct TrigEvent { int a; IdList * b; };
      56                 : 
      57                 : } // end %include
      58                 : 
      59                 : // These are extra tokens used by the lexer but never seen by the
      60                 : // parser.  We put them in a rule so that the parser generator will
      61                 : // add them to the parse.h output file.
      62                 : //
      63                 : %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
      64                 :           COLUMN AGG_FUNCTION.
      65                 : 
      66                 : // Input is a single SQL command
      67                 : input ::= cmdlist.
      68                 : cmdlist ::= cmdlist ecmd.
      69                 : cmdlist ::= ecmd.
      70                 : ecmd ::= explain cmdx SEMI.
      71                 : ecmd ::= SEMI.
      72            1496 : cmdx ::= cmd.           { sqliteExec(pParse); }
      73               0 : explain ::= EXPLAIN.    { sqliteBeginParse(pParse, 1); }
      74            1501 : explain ::= .           { sqliteBeginParse(pParse, 0); }
      75                 : 
      76                 : ///////////////////// Begin and end transactions. ////////////////////////////
      77                 : //
      78                 : 
      79               3 : cmd ::= BEGIN trans_opt onconf(R).  {sqliteBeginTransaction(pParse,R);}
      80                 : trans_opt ::= .
      81                 : trans_opt ::= TRANSACTION.
      82                 : trans_opt ::= TRANSACTION nm.
      83               1 : cmd ::= COMMIT trans_opt.      {sqliteCommitTransaction(pParse);}
      84                 : cmd ::= END trans_opt.         {sqliteCommitTransaction(pParse);}
      85               2 : cmd ::= ROLLBACK trans_opt.    {sqliteRollbackTransaction(pParse);}
      86                 : 
      87                 : ///////////////////// The CREATE TABLE statement ////////////////////////////
      88                 : //
      89                 : cmd ::= create_table create_table_args.
      90                 : create_table ::= CREATE(X) temp(T) TABLE nm(Y). {
      91             398 :    sqliteStartTable(pParse,&X,&Y,T,0);
      92                 : }
      93                 : %type temp {int}
      94             151 : temp(A) ::= TEMP.  {A = 1;}
      95             772 : temp(A) ::= .      {A = 0;}
      96                 : create_table_args ::= LP columnlist conslist_opt RP(X). {
      97             398 :   sqliteEndTable(pParse,&X,0);
      98                 : }
      99                 : create_table_args ::= AS select(S). {
     100               0 :   sqliteEndTable(pParse,0,S);
     101               0 :   sqliteSelectDelete(S);
     102                 : }
     103                 : columnlist ::= columnlist COMMA column.
     104                 : columnlist ::= column.
     105                 : 
     106                 : // About the only information used for a column is the name of the
     107                 : // column.  The type is always just "text".  But the code will accept
     108                 : // an elaborate typename.  Perhaps someday we'll do something with it.
     109                 : //
     110                 : column ::= columnid type carglist. 
     111            1716 : columnid ::= nm(X).                {sqliteAddColumn(pParse,&X);}
     112                 : 
     113                 : // An IDENTIFIER can be a generic identifier, or one of several
     114                 : // keywords.  Any non-standard keyword can also be an identifier.
     115                 : //
     116                 : %type id {Token}
     117            5400 : id(A) ::= ID(X).         {A = X;}
     118                 : 
     119                 : // The following directive causes tokens ABORT, AFTER, ASC, etc. to
     120                 : // fallback to ID if they will not parse as their original value.
     121                 : // This obviates the need for the "id" nonterminal.
     122                 : //
     123                 : %fallback ID
     124                 :   ABORT AFTER ASC ATTACH BEFORE BEGIN CASCADE CLUSTER CONFLICT
     125                 :   COPY DATABASE DEFERRED DELIMITERS DESC DETACH EACH END EXPLAIN FAIL FOR
     126                 :   GLOB IGNORE IMMEDIATE INITIALLY INSTEAD LIKE MATCH KEY
     127                 :   OF OFFSET PRAGMA RAISE REPLACE RESTRICT ROW STATEMENT
     128                 :   TEMP TRIGGER VACUUM VIEW.
     129                 : 
     130                 : // Define operator precedence early so that this is the first occurance
     131                 : // of the operator tokens in the grammer.  Keeping the operators together
     132                 : // causes them to be assigned integer values that are close together,
     133                 : // which keeps parser tables smaller.
     134                 : //
     135                 : %left OR.
     136                 : %left AND.
     137                 : %right NOT.
     138                 : %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN.
     139                 : %left GT GE LT LE.
     140                 : %left BITAND BITOR LSHIFT RSHIFT.
     141                 : %left PLUS MINUS.
     142                 : %left STAR SLASH REM.
     143                 : %left CONCAT.
     144                 : %right UMINUS UPLUS BITNOT.
     145                 : 
     146                 : // And "ids" is an identifer-or-string.
     147                 : //
     148                 : %type ids {Token}
     149                 : ids(A) ::= ID(X).        {A = X;}
     150                 : ids(A) ::= STRING(X).    {A = X;}
     151                 : 
     152                 : // The name of a column or table can be any of the following:
     153                 : //
     154                 : %type nm {Token}
     155                 : nm(A) ::= ID(X).         {A = X;}
     156                 : nm(A) ::= STRING(X).     {A = X;}
     157                 : nm(A) ::= JOIN_KW(X).    {A = X;}
     158                 : 
     159                 : type ::= .
     160            1619 : type ::= typename(X).                    {sqliteAddColumnType(pParse,&X,&X);}
     161              83 : type ::= typename(X) LP signed RP(Y).    {sqliteAddColumnType(pParse,&X,&Y);}
     162                 : type ::= typename(X) LP signed COMMA signed RP(Y).
     163               0 :                                          {sqliteAddColumnType(pParse,&X,&Y);}
     164                 : %type typename {Token}
     165            2004 : typename(A) ::= ids(X).           {A = X;}
     166               2 : typename(A) ::= typename(X) ids.  {A = X;}
     167                 : %type signed {int}
     168              85 : signed(A) ::= INTEGER(X).         { A = atoi(X.z); }
     169                 : signed(A) ::= PLUS INTEGER(X).    { A = atoi(X.z); }
     170               0 : signed(A) ::= MINUS INTEGER(X).   { A = -atoi(X.z); }
     171                 : carglist ::= carglist carg.
     172                 : carglist ::= .
     173                 : carg ::= CONSTRAINT nm ccons.
     174                 : carg ::= ccons.
     175               0 : carg ::= DEFAULT STRING(X).          {sqliteAddDefaultValue(pParse,&X,0);}
     176                 : carg ::= DEFAULT ID(X).              {sqliteAddDefaultValue(pParse,&X,0);}
     177                 : carg ::= DEFAULT INTEGER(X).         {sqliteAddDefaultValue(pParse,&X,0);}
     178                 : carg ::= DEFAULT PLUS INTEGER(X).    {sqliteAddDefaultValue(pParse,&X,0);}
     179               0 : carg ::= DEFAULT MINUS INTEGER(X).   {sqliteAddDefaultValue(pParse,&X,1);}
     180                 : carg ::= DEFAULT FLOAT(X).           {sqliteAddDefaultValue(pParse,&X,0);}
     181                 : carg ::= DEFAULT PLUS FLOAT(X).      {sqliteAddDefaultValue(pParse,&X,0);}
     182                 : carg ::= DEFAULT MINUS FLOAT(X).     {sqliteAddDefaultValue(pParse,&X,1);}
     183                 : carg ::= DEFAULT NULL. 
     184                 : 
     185                 : // In addition to the type name, we also care about the primary key and
     186                 : // UNIQUE constraints.
     187                 : //
     188                 : ccons ::= NULL onconf.
     189              42 : ccons ::= NOT NULL onconf(R).               {sqliteAddNotNull(pParse, R);}
     190              43 : ccons ::= PRIMARY KEY sortorder onconf(R).  {sqliteAddPrimaryKey(pParse,0,R);}
     191               5 : ccons ::= UNIQUE onconf(R).           {sqliteCreateIndex(pParse,0,0,0,R,0,0);}
     192                 : ccons ::= CHECK LP expr RP onconf.
     193                 : ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R).
     194               0 :                                 {sqliteCreateForeignKey(pParse,0,&T,TA,R);}
     195               0 : ccons ::= defer_subclause(D).   {sqliteDeferForeignKey(pParse,D);}
     196                 : ccons ::= COLLATE id(C).  {
     197               0 :    sqliteAddCollateType(pParse, sqliteCollateType(C.z, C.n));
     198                 : }
     199                 : 
     200                 : // The next group of rules parses the arguments to a REFERENCES clause
     201                 : // that determine if the referential integrity checking is deferred or
     202                 : // or immediate and which determine what action to take if a ref-integ
     203                 : // check fails.
     204                 : //
     205                 : %type refargs {int}
     206               0 : refargs(A) ::= .                     { A = OE_Restrict * 0x010101; }
     207               0 : refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; }
     208                 : %type refarg {struct {int value; int mask;}}
     209               0 : refarg(A) ::= MATCH nm.              { A.value = 0;     A.mask = 0x000000; }
     210               0 : refarg(A) ::= ON DELETE refact(X).   { A.value = X;     A.mask = 0x0000ff; }
     211               0 : refarg(A) ::= ON UPDATE refact(X).   { A.value = X<<8;  A.mask = 0x00ff00; }
     212               0 : refarg(A) ::= ON INSERT refact(X).   { A.value = X<<16; A.mask = 0xff0000; }
     213                 : %type refact {int}
     214               0 : refact(A) ::= SET NULL.              { A = OE_SetNull; }
     215               0 : refact(A) ::= SET DEFAULT.           { A = OE_SetDflt; }
     216               0 : refact(A) ::= CASCADE.               { A = OE_Cascade; }
     217               0 : refact(A) ::= RESTRICT.              { A = OE_Restrict; }
     218                 : %type defer_subclause {int}
     219             261 : defer_subclause(A) ::= NOT DEFERRABLE init_deferred_pred_opt(X).  {A = X;}
     220                 : defer_subclause(A) ::= DEFERRABLE init_deferred_pred_opt(X).      {A = X;}
     221                 : %type init_deferred_pred_opt {int}
     222                 : init_deferred_pred_opt(A) ::= .                       {A = 0;}
     223                 : init_deferred_pred_opt(A) ::= INITIALLY DEFERRED.     {A = 1;}
     224                 : init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE.    {A = 0;}
     225                 : 
     226                 : // For the time being, the only constraint we care about is the primary
     227                 : // key and UNIQUE.  Both create indices.
     228                 : //
     229                 : conslist_opt ::= .
     230                 : conslist_opt ::= COMMA conslist.
     231                 : conslist ::= conslist COMMA tcons.
     232                 : conslist ::= conslist tcons.
     233                 : conslist ::= tcons.
     234                 : tcons ::= CONSTRAINT nm.
     235                 : tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R).
     236               2 :                                              {sqliteAddPrimaryKey(pParse,X,R);}
     237                 : tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
     238               0 :                                        {sqliteCreateIndex(pParse,0,0,X,R,0,0);}
     239                 : tcons ::= CHECK expr onconf.
     240                 : tcons ::= FOREIGN KEY LP idxlist(FA) RP
     241                 :           REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). {
     242               0 :     sqliteCreateForeignKey(pParse, FA, &T, TA, R);
     243               0 :     sqliteDeferForeignKey(pParse, D);
     244                 : }
     245                 : %type defer_subclause_opt {int}
     246                 : defer_subclause_opt(A) ::= .                    {A = 0;}
     247                 : defer_subclause_opt(A) ::= defer_subclause(X).  {A = X;}
     248                 : 
     249                 : // The following is a non-standard extension that allows us to declare the
     250                 : // default behavior when there is a constraint conflict.
     251                 : //
     252                 : %type onconf {int}
     253                 : %type orconf {int}
     254                 : %type resolvetype {int}
     255             358 : onconf(A) ::= .                              { A = OE_Default; }
     256               0 : onconf(A) ::= ON CONFLICT resolvetype(X).    { A = X; }
     257                 : orconf(A) ::= .                              { A = OE_Default; }
     258                 : orconf(A) ::= OR resolvetype(X).             { A = X; }
     259               0 : resolvetype(A) ::= ROLLBACK.                 { A = OE_Rollback; }
     260               0 : resolvetype(A) ::= ABORT.                    { A = OE_Abort; }
     261               0 : resolvetype(A) ::= FAIL.                     { A = OE_Fail; }
     262               0 : resolvetype(A) ::= IGNORE.                   { A = OE_Ignore; }
     263               0 : resolvetype(A) ::= REPLACE.                  { A = OE_Replace; }
     264                 : 
     265                 : ////////////////////////// The DROP TABLE /////////////////////////////////////
     266                 : //
     267             297 : cmd ::= DROP TABLE nm(X).          {sqliteDropTable(pParse,&X,0);}
     268                 : 
     269                 : ///////////////////// The CREATE VIEW statement /////////////////////////////
     270                 : //
     271                 : cmd ::= CREATE(X) temp(T) VIEW nm(Y) AS select(S). {
     272               0 :   sqliteCreateView(pParse, &X, &Y, S, T);
     273                 : }
     274                 : cmd ::= DROP VIEW nm(X). {
     275               0 :   sqliteDropTable(pParse, &X, 1);
     276                 : }
     277                 : 
     278                 : //////////////////////// The SELECT statement /////////////////////////////////
     279                 : //
     280                 : cmd ::= select(X).  {
     281             525 :   sqliteSelect(pParse, X, SRT_Callback, 0, 0, 0, 0);
     282             525 :   sqliteSelectDelete(X);
     283                 : }
     284                 : 
     285                 : %type select {Select*}
     286               0 : %destructor select {sqliteSelectDelete($$);}
     287                 : %type oneselect {Select*}
     288                 : %destructor oneselect {sqliteSelectDelete($$);}
     289                 : 
     290             525 : select(A) ::= oneselect(X).                      {A = X;}
     291                 : select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
     292               0 :   if( Z ){
     293               0 :     Z->op = Y;
     294               0 :     Z->pPrior = X;
     295                 :   }
     296               0 :   A = Z;
     297                 : }
     298                 : %type multiselect_op {int}
     299               0 : multiselect_op(A) ::= UNION.      {A = TK_UNION;}
     300               0 : multiselect_op(A) ::= UNION ALL.  {A = TK_ALL;}
     301               0 : multiselect_op(A) ::= INTERSECT.  {A = TK_INTERSECT;}
     302               0 : multiselect_op(A) ::= EXCEPT.     {A = TK_EXCEPT;}
     303                 : oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
     304                 :                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
     305             525 :   A = sqliteSelectNew(W,X,Y,P,Q,Z,D,L.limit,L.offset);
     306                 : }
     307                 : 
     308                 : // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
     309                 : // present and false (0) if it is not.
     310                 : //
     311                 : %type distinct {int}
     312                 : distinct(A) ::= DISTINCT.   {A = 1;}
     313                 : distinct(A) ::= ALL.        {A = 0;}
     314                 : distinct(A) ::= .           {A = 0;}
     315                 : 
     316                 : // selcollist is a list of expressions that are to become the return
     317                 : // values of the SELECT statement.  The "*" in statements like
     318                 : // "SELECT * FROM ..." is encoded as a special expression with an
     319                 : // opcode of TK_ALL.
     320                 : //
     321                 : %type selcollist {ExprList*}
     322               0 : %destructor selcollist {sqliteExprListDelete($$);}
     323                 : %type sclp {ExprList*}
     324                 : %destructor sclp {sqliteExprListDelete($$);}
     325            1290 : sclp(A) ::= selcollist(X) COMMA.             {A = X;}
     326            1566 : sclp(A) ::= .                                {A = 0;}
     327                 : selcollist(A) ::= sclp(P) expr(X) as(Y).     {
     328            1750 :    A = sqliteExprListAppend(P,X,Y.n?&Y:0);
     329                 : }
     330                 : selcollist(A) ::= sclp(P) STAR. {
     331              65 :   A = sqliteExprListAppend(P, sqliteExpr(TK_ALL, 0, 0, 0), 0);
     332                 : }
     333                 : selcollist(A) ::= sclp(P) nm(X) DOT STAR. {
     334               0 :   Expr *pRight = sqliteExpr(TK_ALL, 0, 0, 0);
     335               0 :   Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &X);
     336               0 :   A = sqliteExprListAppend(P, sqliteExpr(TK_DOT, pLeft, pRight, 0), 0);
     337                 : }
     338                 : 
     339                 : // An option "AS <id>" phrase that can follow one of the expressions that
     340                 : // define the result set, or one of the tables in the FROM clause.
     341                 : //
     342                 : %type as {Token}
     343              22 : as(X) ::= AS nm(Y).    { X = Y; }
     344                 : as(X) ::= ids(Y).      { X = Y; }
     345            2255 : as(X) ::= .            { X.n = 0; }
     346                 : 
     347                 : 
     348                 : %type seltablist {SrcList*}
     349                 : %destructor seltablist {sqliteSrcListDelete($$);}
     350                 : %type stl_prefix {SrcList*}
     351                 : %destructor stl_prefix {sqliteSrcListDelete($$);}
     352                 : %type from {SrcList*}
     353               0 : %destructor from {sqliteSrcListDelete($$);}
     354                 : 
     355                 : // A complete FROM clause.
     356                 : //
     357               8 : from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
     358             517 : from(A) ::= FROM seltablist(X).               {A = X;}
     359                 : 
     360                 : // "seltablist" is a "Select Table List" - the content of the FROM clause
     361                 : // in a SELECT statement.  "stl_prefix" is a prefix of this list.
     362                 : //
     363                 : stl_prefix(A) ::= seltablist(X) joinop(Y).    {
     364              10 :    A = X;
     365              10 :    if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
     366                 : }
     367             517 : stl_prefix(A) ::= .                           {A = 0;}
     368                 : seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). {
     369             527 :   A = sqliteSrcListAppend(X,&Y,&D);
     370             527 :   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
     371             527 :   if( N ){
     372               8 :     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
     373               0 :     else { sqliteExprDelete(N); }
     374                 :   }
     375             527 :   if( U ){
     376               0 :     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
     377               0 :     else { sqliteIdListDelete(U); }
     378                 :   }
     379                 : }
     380                 : seltablist(A) ::= stl_prefix(X) LP seltablist_paren(S) RP
     381                 :                   as(Z) on_opt(N) using_opt(U). {
     382               0 :   A = sqliteSrcListAppend(X,0,0);
     383               0 :   A->a[A->nSrc-1].pSelect = S;
     384               0 :   if( Z.n ) sqliteSrcListAddAlias(A,&Z);
     385               0 :   if( N ){
     386               0 :     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
     387               0 :     else { sqliteExprDelete(N); }
     388                 :   }
     389               0 :   if( U ){
     390               0 :     if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
     391               0 :     else { sqliteIdListDelete(U); }
     392                 :   }
     393                 : }
     394                 : 
     395                 : // A seltablist_paren nonterminal represents anything in a FROM that
     396                 : // is contained inside parentheses.  This can be either a subquery or
     397                 : // a grouping of table and subqueries.
     398                 : //
     399                 : %type seltablist_paren {Select*}
     400                 : %destructor seltablist_paren {sqliteSelectDelete($$);}
     401                 : seltablist_paren(A) ::= select(S).      {A = S;}
     402                 : seltablist_paren(A) ::= seltablist(F).  {
     403               0 :    A = sqliteSelectNew(0,F,0,0,0,0,0,-1,0);
     404                 : }
     405                 : 
     406                 : %type dbnm {Token}
     407             491 : dbnm(A) ::= .          {A.z=0; A.n=0;}
     408                 : dbnm(A) ::= DOT nm(X). {A = X;}
     409                 : 
     410                 : %type joinop {int}
     411                 : %type joinop2 {int}
     412               2 : joinop(X) ::= COMMA.                   { X = JT_INNER; }
     413                 : joinop(X) ::= JOIN.                    { X = JT_INNER; }
     414               8 : joinop(X) ::= JOIN_KW(A) JOIN.         { X = sqliteJoinType(pParse,&A,0,0); }
     415               0 : joinop(X) ::= JOIN_KW(A) nm(B) JOIN.   { X = sqliteJoinType(pParse,&A,&B,0); }
     416                 : joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN.
     417               0 :                                        { X = sqliteJoinType(pParse,&A,&B,&C); }
     418                 : 
     419                 : %type on_opt {Expr*}
     420                 : %destructor on_opt {sqliteExprDelete($$);}
     421             104 : on_opt(N) ::= ON expr(E).   {N = E;}
     422            1507 : on_opt(N) ::= .             {N = 0;}
     423                 : 
     424                 : %type using_opt {IdList*}
     425                 : %destructor using_opt {sqliteIdListDelete($$);}
     426              45 : using_opt(U) ::= USING LP idxlist(L) RP.  {U = L;}
     427             743 : using_opt(U) ::= .                        {U = 0;}
     428                 : 
     429                 : 
     430                 : %type orderby_opt {ExprList*}
     431                 : %destructor orderby_opt {sqliteExprListDelete($$);}
     432                 : %type sortlist {ExprList*}
     433                 : %destructor sortlist {sqliteExprListDelete($$);}
     434                 : %type sortitem {Expr*}
     435                 : %destructor sortitem {sqliteExprDelete($$);}
     436                 : 
     437                 : orderby_opt(A) ::= .                          {A = 0;}
     438               9 : orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
     439                 : sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). {
     440               0 :   A = sqliteExprListAppend(X,Y,0);
     441               0 :   if( A ) A->a[A->nExpr-1].sortOrder = C+Z;
     442                 : }
     443                 : sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). {
     444               9 :   A = sqliteExprListAppend(0,Y,0);
     445               9 :   if( A ) A->a[0].sortOrder = C+Z;
     446                 : }
     447                 : sortitem(A) ::= expr(X).   {A = X;}
     448                 : 
     449                 : %type sortorder {int}
     450                 : %type collate {int}
     451                 : 
     452              54 : sortorder(A) ::= ASC.           {A = SQLITE_SO_ASC;}
     453               0 : sortorder(A) ::= DESC.          {A = SQLITE_SO_DESC;}
     454                 : sortorder(A) ::= .              {A = SQLITE_SO_ASC;}
     455               9 : collate(C) ::= .                {C = SQLITE_SO_UNK;}
     456               0 : collate(C) ::= COLLATE id(X).   {C = sqliteCollateType(X.z, X.n);}
     457                 : 
     458                 : %type groupby_opt {ExprList*}
     459                 : %destructor groupby_opt {sqliteExprListDelete($$);}
     460                 : groupby_opt(A) ::= .                      {A = 0;}
     461                 : groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
     462                 : 
     463                 : %type having_opt {Expr*}
     464                 : %destructor having_opt {sqliteExprDelete($$);}
     465                 : having_opt(A) ::= .                {A = 0;}
     466                 : having_opt(A) ::= HAVING expr(X).  {A = X;}
     467                 : 
     468                 : %type limit_opt {struct LimitVal}
     469             523 : limit_opt(A) ::= .                     {A.limit = -1; A.offset = 0;}
     470               2 : limit_opt(A) ::= LIMIT signed(X).      {A.limit = X; A.offset = 0;}
     471                 : limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y). 
     472               0 :                                        {A.limit = X; A.offset = Y;}
     473                 : limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y). 
     474               0 :                                        {A.limit = Y; A.offset = X;}
     475                 : 
     476                 : /////////////////////////// The DELETE statement /////////////////////////////
     477                 : //
     478                 : cmd ::= DELETE FROM nm(X) dbnm(D) where_opt(Y). {
     479               3 :    sqliteDeleteFrom(pParse, sqliteSrcListAppend(0,&X,&D), Y);
     480                 : }
     481                 : 
     482                 : %type where_opt {Expr*}
     483                 : %destructor where_opt {sqliteExprDelete($$);}
     484                 : 
     485                 : where_opt(A) ::= .                    {A = 0;}
     486                 : where_opt(A) ::= WHERE expr(X).       {A = X;}
     487                 : 
     488                 : %type setlist {ExprList*}
     489                 : %destructor setlist {sqliteExprListDelete($$);}
     490                 : 
     491                 : ////////////////////////// The UPDATE command ////////////////////////////////
     492                 : //
     493                 : cmd ::= UPDATE orconf(R) nm(X) dbnm(D) SET setlist(Y) where_opt(Z).
     494               2 :     {sqliteUpdate(pParse,sqliteSrcListAppend(0,&X,&D),Y,Z,R);}
     495                 : 
     496                 : setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
     497               0 :     {A = sqliteExprListAppend(Z,Y,&X);}
     498               2 : setlist(A) ::= nm(X) EQ expr(Y).   {A = sqliteExprListAppend(0,Y,&X);}
     499                 : 
     500                 : ////////////////////////// The INSERT command /////////////////////////////////
     501                 : //
     502                 : cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) 
     503                 :         VALUES LP itemlist(Y) RP.
     504             261 :             {sqliteInsert(pParse, sqliteSrcListAppend(0,&X,&D), Y, 0, F, R);}
     505                 : cmd ::= insert_cmd(R) INTO nm(X) dbnm(D) inscollist_opt(F) select(S).
     506               0 :             {sqliteInsert(pParse, sqliteSrcListAppend(0,&X,&D), 0, S, F, R);}
     507                 : 
     508                 : %type insert_cmd {int}
     509                 : insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
     510               0 : insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
     511                 : 
     512                 : 
     513                 : %type itemlist {ExprList*}
     514                 : %destructor itemlist {sqliteExprListDelete($$);}
     515                 : 
     516             275 : itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqliteExprListAppend(X,Y,0);}
     517             275 : itemlist(A) ::= expr(X).                    {A = sqliteExprListAppend(0,X,0);}
     518                 : 
     519                 : %type inscollist_opt {IdList*}
     520                 : %destructor inscollist_opt {sqliteIdListDelete($$);}
     521                 : %type inscollist {IdList*}
     522                 : %destructor inscollist {sqliteIdListDelete($$);}
     523                 : 
     524                 : inscollist_opt(A) ::= .                       {A = 0;}
     525                 : inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
     526              29 : inscollist(A) ::= inscollist(X) COMMA nm(Y).  {A = sqliteIdListAppend(X,&Y);}
     527              47 : inscollist(A) ::= nm(Y).                      {A = sqliteIdListAppend(0,&Y);}
     528                 : 
     529                 : /////////////////////////// Expression Processing /////////////////////////////
     530                 : //
     531                 : 
     532                 : %type expr {Expr*}
     533               0 : %destructor expr {sqliteExprDelete($$);}
     534                 : 
     535               3 : expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqliteExprSpan(A,&B,&E); }
     536               9 : expr(A) ::= NULL(X).             {A = sqliteExpr(TK_NULL, 0, 0, &X);}
     537            1480 : expr(A) ::= ID(X).               {A = sqliteExpr(TK_ID, 0, 0, &X);}
     538                 : expr(A) ::= JOIN_KW(X).          {A = sqliteExpr(TK_ID, 0, 0, &X);}
     539                 : expr(A) ::= nm(X) DOT nm(Y). {
     540              43 :   Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X);
     541              43 :   Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y);
     542              43 :   A = sqliteExpr(TK_DOT, temp1, temp2, 0);
     543                 : }
     544                 : expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
     545               0 :   Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X);
     546               0 :   Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y);
     547               0 :   Expr *temp3 = sqliteExpr(TK_ID, 0, 0, &Z);
     548               0 :   Expr *temp4 = sqliteExpr(TK_DOT, temp2, temp3, 0);
     549               0 :   A = sqliteExpr(TK_DOT, temp1, temp4, 0);
     550                 : }
     551             470 : expr(A) ::= INTEGER(X).      {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
     552               0 : expr(A) ::= FLOAT(X).        {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
     553             438 : expr(A) ::= STRING(X).       {A = sqliteExpr(TK_STRING, 0, 0, &X);}
     554                 : expr(A) ::= VARIABLE(X).     {
     555               0 :   A = sqliteExpr(TK_VARIABLE, 0, 0, &X);
     556               0 :   if( A ) A->iTable = ++pParse->nVar;
     557                 : }
     558                 : expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
     559              14 :   A = sqliteExprFunction(Y, &X);
     560              14 :   sqliteExprSpan(A,&X,&E);
     561                 : }
     562                 : expr(A) ::= ID(X) LP STAR RP(E). {
     563               9 :   A = sqliteExprFunction(0, &X);
     564               9 :   sqliteExprSpan(A,&X,&E);
     565                 : }
     566               0 : expr(A) ::= expr(X) AND expr(Y).   {A = sqliteExpr(TK_AND, X, Y, 0);}
     567               3 : expr(A) ::= expr(X) OR expr(Y).    {A = sqliteExpr(TK_OR, X, Y, 0);}
     568               4 : expr(A) ::= expr(X) LT expr(Y).    {A = sqliteExpr(TK_LT, X, Y, 0);}
     569               3 : expr(A) ::= expr(X) GT expr(Y).    {A = sqliteExpr(TK_GT, X, Y, 0);}
     570               0 : expr(A) ::= expr(X) LE expr(Y).    {A = sqliteExpr(TK_LE, X, Y, 0);}
     571               0 : expr(A) ::= expr(X) GE expr(Y).    {A = sqliteExpr(TK_GE, X, Y, 0);}
     572               1 : expr(A) ::= expr(X) NE expr(Y).    {A = sqliteExpr(TK_NE, X, Y, 0);}
     573              66 : expr(A) ::= expr(X) EQ expr(Y).    {A = sqliteExpr(TK_EQ, X, Y, 0);}
     574               0 : expr(A) ::= expr(X) BITAND expr(Y). {A = sqliteExpr(TK_BITAND, X, Y, 0);}
     575               0 : expr(A) ::= expr(X) BITOR expr(Y).  {A = sqliteExpr(TK_BITOR, X, Y, 0);}
     576               0 : expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqliteExpr(TK_LSHIFT, X, Y, 0);}
     577               0 : expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqliteExpr(TK_RSHIFT, X, Y, 0);}
     578                 : expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
     579               0 :   ExprList *pList = sqliteExprListAppend(0, Y, 0);
     580               0 :   pList = sqliteExprListAppend(pList, X, 0);
     581               0 :   A = sqliteExprFunction(pList, 0);
     582               0 :   if( A ) A->op = OP;
     583               0 :   sqliteExprSpan(A, &X->span, &Y->span);
     584                 : }
     585                 : expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
     586               0 :   ExprList *pList = sqliteExprListAppend(0, Y, 0);
     587               0 :   pList = sqliteExprListAppend(pList, X, 0);
     588               0 :   A = sqliteExprFunction(pList, 0);
     589               0 :   if( A ) A->op = OP;
     590               0 :   A = sqliteExpr(TK_NOT, A, 0, 0);
     591               0 :   sqliteExprSpan(A,&X->span,&Y->span);
     592                 : }
     593                 : %type likeop {int}
     594               0 : likeop(A) ::= LIKE. {A = TK_LIKE;}
     595               0 : likeop(A) ::= GLOB. {A = TK_GLOB;}
     596               0 : expr(A) ::= expr(X) PLUS expr(Y).  {A = sqliteExpr(TK_PLUS, X, Y, 0);}
     597               0 : expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);}
     598               0 : expr(A) ::= expr(X) STAR expr(Y).  {A = sqliteExpr(TK_STAR, X, Y, 0);}
     599               0 : expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);}
     600               0 : expr(A) ::= expr(X) REM expr(Y).   {A = sqliteExpr(TK_REM, X, Y, 0);}
     601               0 : expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);}
     602                 : expr(A) ::= expr(X) ISNULL(E). {
     603               0 :   A = sqliteExpr(TK_ISNULL, X, 0, 0);
     604               0 :   sqliteExprSpan(A,&X->span,&E);
     605                 : }
     606                 : expr(A) ::= expr(X) IS NULL(E). {
     607               3 :   A = sqliteExpr(TK_ISNULL, X, 0, 0);
     608               3 :   sqliteExprSpan(A,&X->span,&E);
     609                 : }
     610                 : expr(A) ::= expr(X) NOTNULL(E). {
     611               0 :   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
     612               0 :   sqliteExprSpan(A,&X->span,&E);
     613                 : }
     614                 : expr(A) ::= expr(X) NOT NULL(E). {
     615               0 :   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
     616               0 :   sqliteExprSpan(A,&X->span,&E);
     617                 : }
     618                 : expr(A) ::= expr(X) IS NOT NULL(E). {
     619               0 :   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
     620               0 :   sqliteExprSpan(A,&X->span,&E);
     621                 : }
     622                 : expr(A) ::= NOT(B) expr(X). {
     623               0 :   A = sqliteExpr(TK_NOT, X, 0, 0);
     624               0 :   sqliteExprSpan(A,&B,&X->span);
     625                 : }
     626                 : expr(A) ::= BITNOT(B) expr(X). {
     627               0 :   A = sqliteExpr(TK_BITNOT, X, 0, 0);
     628               0 :   sqliteExprSpan(A,&B,&X->span);
     629                 : }
     630                 : expr(A) ::= MINUS(B) expr(X). [UMINUS] {
     631               0 :   A = sqliteExpr(TK_UMINUS, X, 0, 0);
     632               0 :   sqliteExprSpan(A,&B,&X->span);
     633                 : }
     634                 : expr(A) ::= PLUS(B) expr(X). [UPLUS] {
     635               0 :   A = sqliteExpr(TK_UPLUS, X, 0, 0);
     636               0 :   sqliteExprSpan(A,&B,&X->span);
     637                 : }
     638                 : expr(A) ::= LP(B) select(X) RP(E). {
     639               0 :   A = sqliteExpr(TK_SELECT, 0, 0, 0);
     640               0 :   if( A ) A->pSelect = X;
     641               0 :   sqliteExprSpan(A,&B,&E);
     642                 : }
     643                 : expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
     644               0 :   ExprList *pList = sqliteExprListAppend(0, X, 0);
     645               0 :   pList = sqliteExprListAppend(pList, Y, 0);
     646               0 :   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
     647               0 :   if( A ) A->pList = pList;
     648               0 :   sqliteExprSpan(A,&W->span,&Y->span);
     649                 : }
     650                 : expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
     651               0 :   ExprList *pList = sqliteExprListAppend(0, X, 0);
     652               0 :   pList = sqliteExprListAppend(pList, Y, 0);
     653               0 :   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
     654               0 :   if( A ) A->pList = pList;
     655               0 :   A = sqliteExpr(TK_NOT, A, 0, 0);
     656               0 :   sqliteExprSpan(A,&W->span,&Y->span);
     657                 : }
     658                 : expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
     659               0 :   A = sqliteExpr(TK_IN, X, 0, 0);
     660               0 :   if( A ) A->pList = Y;
     661               0 :   sqliteExprSpan(A,&X->span,&E);
     662                 : }
     663                 : expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
     664               0 :   A = sqliteExpr(TK_IN, X, 0, 0);
     665               0 :   if( A ) A->pSelect = Y;
     666               0 :   sqliteExprSpan(A,&X->span,&E);
     667                 : }
     668                 : expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
     669               0 :   A = sqliteExpr(TK_IN, X, 0, 0);
     670               0 :   if( A ) A->pList = Y;
     671               0 :   A = sqliteExpr(TK_NOT, A, 0, 0);
     672               0 :   sqliteExprSpan(A,&X->span,&E);
     673                 : }
     674                 : expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
     675               0 :   A = sqliteExpr(TK_IN, X, 0, 0);
     676               0 :   if( A ) A->pSelect = Y;
     677               0 :   A = sqliteExpr(TK_NOT, A, 0, 0);
     678               0 :   sqliteExprSpan(A,&X->span,&E);
     679                 : }
     680                 : expr(A) ::= expr(X) IN nm(Y) dbnm(D). {
     681               0 :   SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D);
     682               0 :   A = sqliteExpr(TK_IN, X, 0, 0);
     683               0 :   if( A ) A->pSelect = sqliteSelectNew(0,pSrc,0,0,0,0,0,-1,0);
     684               0 :   sqliteExprSpan(A,&X->span,D.z?&D:&Y);
     685                 : }
     686                 : expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). {
     687               0 :   SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D);
     688               0 :   A = sqliteExpr(TK_IN, X, 0, 0);
     689               0 :   if( A ) A->pSelect = sqliteSelectNew(0,pSrc,0,0,0,0,0,-1,0);
     690               0 :   A = sqliteExpr(TK_NOT, A, 0, 0);
     691               0 :   sqliteExprSpan(A,&X->span,D.z?&D:&Y);
     692                 : }
     693                 : 
     694                 : 
     695                 : /* CASE expressions */
     696                 : expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
     697               0 :   A = sqliteExpr(TK_CASE, X, Z, 0);
     698               0 :   if( A ) A->pList = Y;
     699               0 :   sqliteExprSpan(A, &C, &E);
     700                 : }
     701                 : %type case_exprlist {ExprList*}
     702                 : %destructor case_exprlist {sqliteExprListDelete($$);}
     703                 : case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
     704               0 :   A = sqliteExprListAppend(X, Y, 0);
     705               0 :   A = sqliteExprListAppend(A, Z, 0);
     706                 : }
     707                 : case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
     708               0 :   A = sqliteExprListAppend(0, Y, 0);
     709               0 :   A = sqliteExprListAppend(A, Z, 0);
     710                 : }
     711                 : %type case_else {Expr*}
     712                 : case_else(A) ::=  ELSE expr(X).         {A = X;}
     713                 : case_else(A) ::=  .                     {A = 0;} 
     714                 : %type case_operand {Expr*}
     715                 : case_operand(A) ::= expr(X).            {A = X;} 
     716                 : case_operand(A) ::= .                   {A = 0;} 
     717                 : 
     718                 : %type exprlist {ExprList*}
     719                 : %destructor exprlist {sqliteExprListDelete($$);}
     720                 : %type expritem {Expr*}
     721                 : %destructor expritem {sqliteExprDelete($$);}
     722                 : 
     723                 : exprlist(A) ::= exprlist(X) COMMA expritem(Y). 
     724                 :    {A = sqliteExprListAppend(X,Y,0);}
     725                 : exprlist(A) ::= expritem(X).            {A = sqliteExprListAppend(0,X,0);}
     726                 : expritem(A) ::= expr(X).                {A = X;}
     727                 : expritem(A) ::= .                       {A = 0;}
     728                 : 
     729                 : ///////////////////////////// The CREATE INDEX command ///////////////////////
     730                 : //
     731                 : cmd ::= CREATE(S) uniqueflag(U) INDEX nm(X)
     732                 :         ON nm(Y) dbnm(D) LP idxlist(Z) RP(E) onconf(R). {
     733               0 :   SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D);
     734               0 :   if( U!=OE_None ) U = R;
     735               0 :   if( U==OE_Default) U = OE_Abort;
     736               0 :   sqliteCreateIndex(pParse, &X, pSrc, Z, U, &S, &E);
     737                 : }
     738                 : 
     739                 : %type uniqueflag {int}
     740                 : uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
     741               0 : uniqueflag(A) ::= .        { A = OE_None; }
     742                 : 
     743                 : %type idxlist {IdList*}
     744                 : %destructor idxlist {sqliteIdListDelete($$);}
     745                 : %type idxlist_opt {IdList*}
     746               0 : %destructor idxlist_opt {sqliteIdListDelete($$);}
     747                 : %type idxitem {Token}
     748                 : 
     749                 : idxlist_opt(A) ::= .                         {A = 0;}
     750                 : idxlist_opt(A) ::= LP idxlist(X) RP.         {A = X;}
     751                 : idxlist(A) ::= idxlist(X) COMMA idxitem(Y).  {A = sqliteIdListAppend(X,&Y);}
     752                 : idxlist(A) ::= idxitem(Y).                   {A = sqliteIdListAppend(0,&Y);}
     753                 : idxitem(A) ::= nm(X) sortorder.              {A = X;}
     754                 : 
     755                 : ///////////////////////////// The DROP INDEX command /////////////////////////
     756                 : //
     757                 : 
     758                 : cmd ::= DROP INDEX nm(X) dbnm(Y).   {
     759               0 :   sqliteDropIndex(pParse, sqliteSrcListAppend(0,&X,&Y));
     760                 : }
     761                 : 
     762                 : 
     763                 : ///////////////////////////// The COPY command ///////////////////////////////
     764                 : //
     765                 : cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y) USING DELIMITERS STRING(Z).
     766               0 :     {sqliteCopy(pParse,sqliteSrcListAppend(0,&X,&D),&Y,&Z,R);}
     767                 : cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y).
     768               0 :     {sqliteCopy(pParse,sqliteSrcListAppend(0,&X,&D),&Y,0,R);}
     769                 : 
     770                 : ///////////////////////////// The VACUUM command /////////////////////////////
     771                 : //
     772               0 : cmd ::= VACUUM.                {sqliteVacuum(pParse,0);}
     773               0 : cmd ::= VACUUM nm(X).         {sqliteVacuum(pParse,&X);}
     774                 : 
     775                 : ///////////////////////////// The PRAGMA command /////////////////////////////
     776                 : //
     777               2 : cmd ::= PRAGMA ids(X) EQ nm(Y).         {sqlitePragma(pParse,&X,&Y,0);}
     778               2 : cmd ::= PRAGMA ids(X) EQ ON(Y).          {sqlitePragma(pParse,&X,&Y,0);}
     779                 : cmd ::= PRAGMA ids(X) EQ plus_num(Y).    {sqlitePragma(pParse,&X,&Y,0);}
     780               0 : cmd ::= PRAGMA ids(X) EQ minus_num(Y).   {sqlitePragma(pParse,&X,&Y,1);}
     781               0 : cmd ::= PRAGMA ids(X) LP nm(Y) RP.      {sqlitePragma(pParse,&X,&Y,0);}
     782               0 : cmd ::= PRAGMA ids(X).                   {sqlitePragma(pParse,&X,&X,0);}
     783                 : plus_num(A) ::= plus_opt number(X).   {A = X;}
     784                 : minus_num(A) ::= MINUS number(X).     {A = X;}
     785                 : number(A) ::= INTEGER(X).  {A = X;}
     786                 : number(A) ::= FLOAT(X).    {A = X;}
     787                 : plus_opt ::= PLUS.
     788                 : plus_opt ::= .
     789                 : 
     790                 : //////////////////////////// The CREATE TRIGGER command /////////////////////
     791                 : 
     792                 : cmd ::= CREATE(A) trigger_decl BEGIN trigger_cmd_list(S) END(Z). {
     793                 :   Token all;
     794               0 :   all.z = A.z;
     795               0 :   all.n = (Z.z - A.z) + Z.n;
     796               0 :   sqliteFinishTrigger(pParse, S, &all);
     797                 : }
     798                 : 
     799                 : trigger_decl ::= temp(T) TRIGGER nm(B) trigger_time(C) trigger_event(D)
     800                 :                  ON nm(E) dbnm(DB) foreach_clause(F) when_clause(G). {
     801               0 :   SrcList *pTab = sqliteSrcListAppend(0, &E, &DB);
     802               0 :   sqliteBeginTrigger(pParse, &B, C, D.a, D.b, pTab, F, G, T);
     803                 : }
     804                 : 
     805                 : %type trigger_time  {int}
     806               0 : trigger_time(A) ::= BEFORE.      { A = TK_BEFORE; }
     807               0 : trigger_time(A) ::= AFTER.       { A = TK_AFTER;  }
     808               0 : trigger_time(A) ::= INSTEAD OF.  { A = TK_INSTEAD;}
     809                 : trigger_time(A) ::= .            { A = TK_BEFORE; }
     810                 : 
     811                 : %type trigger_event {struct TrigEvent}
     812               0 : %destructor trigger_event {sqliteIdListDelete($$.b);}
     813               0 : trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }
     814               0 : trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }
     815               0 : trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}
     816               0 : trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }
     817                 : 
     818                 : %type foreach_clause {int}
     819               0 : foreach_clause(A) ::= .                   { A = TK_ROW; }
     820                 : foreach_clause(A) ::= FOR EACH ROW.       { A = TK_ROW; }
     821               0 : foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
     822                 : 
     823                 : %type when_clause {Expr *}
     824               0 : when_clause(A) ::= .             { A = 0; }
     825               0 : when_clause(A) ::= WHEN expr(X). { A = X; }
     826                 : 
     827                 : %type trigger_cmd_list {TriggerStep *}
     828               0 : %destructor trigger_cmd_list {sqliteDeleteTriggerStep($$);}
     829                 : trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
     830               0 :   X->pNext = Y;
     831               0 :   A = X;
     832                 : }
     833               0 : trigger_cmd_list(A) ::= . { A = 0; }
     834                 : 
     835                 : %type trigger_cmd {TriggerStep *}
     836                 : %destructor trigger_cmd {sqliteDeleteTriggerStep($$);}
     837                 : // UPDATE 
     838                 : trigger_cmd(A) ::= UPDATE orconf(R) nm(X) SET setlist(Y) where_opt(Z).  
     839               0 :                { A = sqliteTriggerUpdateStep(&X, Y, Z, R); }
     840                 : 
     841                 : // INSERT
     842                 : trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) 
     843                 :   VALUES LP itemlist(Y) RP.  
     844               0 : {A = sqliteTriggerInsertStep(&X, F, Y, 0, R);}
     845                 : 
     846                 : trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
     847               0 :                {A = sqliteTriggerInsertStep(&X, F, 0, S, R);}
     848                 : 
     849                 : // DELETE
     850                 : trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
     851               0 :                {A = sqliteTriggerDeleteStep(&X, Y);}
     852                 : 
     853                 : // SELECT
     854               0 : trigger_cmd(A) ::= select(X).  {A = sqliteTriggerSelectStep(X); }
     855                 : 
     856                 : // The special RAISE expression that may occur in trigger programs
     857                 : expr(A) ::= RAISE(X) LP IGNORE RP(Y).  {
     858               0 :   A = sqliteExpr(TK_RAISE, 0, 0, 0); 
     859               0 :   A->iColumn = OE_Ignore;
     860               0 :   sqliteExprSpan(A, &X, &Y);
     861                 : }
     862                 : expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y).  {
     863               0 :   A = sqliteExpr(TK_RAISE, 0, 0, &Z); 
     864               0 :   A->iColumn = OE_Rollback;
     865               0 :   sqliteExprSpan(A, &X, &Y);
     866                 : }
     867                 : expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y).  {
     868               0 :   A = sqliteExpr(TK_RAISE, 0, 0, &Z); 
     869               0 :   A->iColumn = OE_Abort;
     870               0 :   sqliteExprSpan(A, &X, &Y);
     871                 : }
     872                 : expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y).  {
     873               0 :   A = sqliteExpr(TK_RAISE, 0, 0, &Z); 
     874               0 :   A->iColumn = OE_Fail;
     875               0 :   sqliteExprSpan(A, &X, &Y);
     876                 : }
     877                 : 
     878                 : ////////////////////////  DROP TRIGGER statement //////////////////////////////
     879                 : cmd ::= DROP TRIGGER nm(X) dbnm(D). {
     880               0 :   sqliteDropTrigger(pParse,sqliteSrcListAppend(0,&X,&D));
     881                 : }
     882                 : 
     883                 : //////////////////////// ATTACH DATABASE file AS name /////////////////////////
     884                 : cmd ::= ATTACH database_kw_opt ids(F) AS nm(D) key_opt(K). {
     885               0 :   sqliteAttach(pParse, &F, &D, &K);
     886                 : }
     887                 : %type key_opt {Token}
     888                 : key_opt(A) ::= USING ids(X).  { A = X; }
     889               0 : key_opt(A) ::= .              { A.z = 0; A.n = 0; }
     890                 : 
     891                 : database_kw_opt ::= DATABASE.
     892                 : database_kw_opt ::= .
     893                 : 
     894                 : //////////////////////// DETACH DATABASE name /////////////////////////////////
     895                 : cmd ::= DETACH database_kw_opt nm(D). {
     896               0 :   sqliteDetach(pParse, &D);
     897                 : }

Generated by: LTP GCOV extension version 1.5

Generated at Thu, 19 Nov 2009 08:20:28 +0000 (5 days ago)

Copyright © 2005-2009 The PHP Group
All rights reserved.