Annotation of embedaddon/php/ext/sqlite/libsqlite/src/parse.y, revision 1.1.1.1
1.1 misho 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: if( pParse->zErrMsg==0 ){
25: if( TOKEN.z[0] ){
26: sqliteErrorMsg(pParse, "near \"%T\": syntax error", &TOKEN);
27: }else{
28: 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: cmdx ::= cmd. { sqliteExec(pParse); }
73: explain ::= EXPLAIN. { sqliteBeginParse(pParse, 1); }
74: explain ::= . { sqliteBeginParse(pParse, 0); }
75:
76: ///////////////////// Begin and end transactions. ////////////////////////////
77: //
78:
79: cmd ::= BEGIN trans_opt onconf(R). {sqliteBeginTransaction(pParse,R);}
80: trans_opt ::= .
81: trans_opt ::= TRANSACTION.
82: trans_opt ::= TRANSACTION nm.
83: cmd ::= COMMIT trans_opt. {sqliteCommitTransaction(pParse);}
84: cmd ::= END trans_opt. {sqliteCommitTransaction(pParse);}
85: 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: sqliteStartTable(pParse,&X,&Y,T,0);
92: }
93: %type temp {int}
94: temp(A) ::= TEMP. {A = 1;}
95: temp(A) ::= . {A = 0;}
96: create_table_args ::= LP columnlist conslist_opt RP(X). {
97: sqliteEndTable(pParse,&X,0);
98: }
99: create_table_args ::= AS select(S). {
100: sqliteEndTable(pParse,0,S);
101: 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: 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: 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: type ::= typename(X). {sqliteAddColumnType(pParse,&X,&X);}
161: type ::= typename(X) LP signed RP(Y). {sqliteAddColumnType(pParse,&X,&Y);}
162: type ::= typename(X) LP signed COMMA signed RP(Y).
163: {sqliteAddColumnType(pParse,&X,&Y);}
164: %type typename {Token}
165: typename(A) ::= ids(X). {A = X;}
166: typename(A) ::= typename(X) ids. {A = X;}
167: %type signed {int}
168: signed(A) ::= INTEGER(X). { A = atoi(X.z); }
169: signed(A) ::= PLUS INTEGER(X). { A = atoi(X.z); }
170: signed(A) ::= MINUS INTEGER(X). { A = -atoi(X.z); }
171: carglist ::= carglist carg.
172: carglist ::= .
173: carg ::= CONSTRAINT nm ccons.
174: carg ::= ccons.
175: 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: 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: ccons ::= NOT NULL onconf(R). {sqliteAddNotNull(pParse, R);}
190: ccons ::= PRIMARY KEY sortorder onconf(R). {sqliteAddPrimaryKey(pParse,0,R);}
191: 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: {sqliteCreateForeignKey(pParse,0,&T,TA,R);}
195: ccons ::= defer_subclause(D). {sqliteDeferForeignKey(pParse,D);}
196: ccons ::= COLLATE id(C). {
197: 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: refargs(A) ::= . { A = OE_Restrict * 0x010101; }
207: refargs(A) ::= refargs(X) refarg(Y). { A = (X & Y.mask) | Y.value; }
208: %type refarg {struct {int value; int mask;}}
209: refarg(A) ::= MATCH nm. { A.value = 0; A.mask = 0x000000; }
210: refarg(A) ::= ON DELETE refact(X). { A.value = X; A.mask = 0x0000ff; }
211: refarg(A) ::= ON UPDATE refact(X). { A.value = X<<8; A.mask = 0x00ff00; }
212: refarg(A) ::= ON INSERT refact(X). { A.value = X<<16; A.mask = 0xff0000; }
213: %type refact {int}
214: refact(A) ::= SET NULL. { A = OE_SetNull; }
215: refact(A) ::= SET DEFAULT. { A = OE_SetDflt; }
216: refact(A) ::= CASCADE. { A = OE_Cascade; }
217: refact(A) ::= RESTRICT. { A = OE_Restrict; }
218: %type defer_subclause {int}
219: 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: {sqliteAddPrimaryKey(pParse,X,R);}
237: tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
238: {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: sqliteCreateForeignKey(pParse, FA, &T, TA, R);
243: 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: onconf(A) ::= . { A = OE_Default; }
256: onconf(A) ::= ON CONFLICT resolvetype(X). { A = X; }
257: orconf(A) ::= . { A = OE_Default; }
258: orconf(A) ::= OR resolvetype(X). { A = X; }
259: resolvetype(A) ::= ROLLBACK. { A = OE_Rollback; }
260: resolvetype(A) ::= ABORT. { A = OE_Abort; }
261: resolvetype(A) ::= FAIL. { A = OE_Fail; }
262: resolvetype(A) ::= IGNORE. { A = OE_Ignore; }
263: resolvetype(A) ::= REPLACE. { A = OE_Replace; }
264:
265: ////////////////////////// The DROP TABLE /////////////////////////////////////
266: //
267: 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: sqliteCreateView(pParse, &X, &Y, S, T);
273: }
274: cmd ::= DROP VIEW nm(X). {
275: sqliteDropTable(pParse, &X, 1);
276: }
277:
278: //////////////////////// The SELECT statement /////////////////////////////////
279: //
280: cmd ::= select(X). {
281: sqliteSelect(pParse, X, SRT_Callback, 0, 0, 0, 0);
282: sqliteSelectDelete(X);
283: }
284:
285: %type select {Select*}
286: %destructor select {sqliteSelectDelete($$);}
287: %type oneselect {Select*}
288: %destructor oneselect {sqliteSelectDelete($$);}
289:
290: select(A) ::= oneselect(X). {A = X;}
291: select(A) ::= select(X) multiselect_op(Y) oneselect(Z). {
292: if( Z ){
293: Z->op = Y;
294: Z->pPrior = X;
295: }
296: A = Z;
297: }
298: %type multiselect_op {int}
299: multiselect_op(A) ::= UNION. {A = TK_UNION;}
300: multiselect_op(A) ::= UNION ALL. {A = TK_ALL;}
301: multiselect_op(A) ::= INTERSECT. {A = TK_INTERSECT;}
302: 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: 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: %destructor selcollist {sqliteExprListDelete($$);}
323: %type sclp {ExprList*}
324: %destructor sclp {sqliteExprListDelete($$);}
325: sclp(A) ::= selcollist(X) COMMA. {A = X;}
326: sclp(A) ::= . {A = 0;}
327: selcollist(A) ::= sclp(P) expr(X) as(Y). {
328: A = sqliteExprListAppend(P,X,Y.n?&Y:0);
329: }
330: selcollist(A) ::= sclp(P) STAR. {
331: A = sqliteExprListAppend(P, sqliteExpr(TK_ALL, 0, 0, 0), 0);
332: }
333: selcollist(A) ::= sclp(P) nm(X) DOT STAR. {
334: Expr *pRight = sqliteExpr(TK_ALL, 0, 0, 0);
335: Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &X);
336: 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: as(X) ::= AS nm(Y). { X = Y; }
344: as(X) ::= ids(Y). { X = Y; }
345: 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: %destructor from {sqliteSrcListDelete($$);}
354:
355: // A complete FROM clause.
356: //
357: from(A) ::= . {A = sqliteMalloc(sizeof(*A));}
358: 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: A = X;
365: if( A && A->nSrc>0 ) A->a[A->nSrc-1].jointype = Y;
366: }
367: stl_prefix(A) ::= . {A = 0;}
368: seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) on_opt(N) using_opt(U). {
369: A = sqliteSrcListAppend(X,&Y,&D);
370: if( Z.n ) sqliteSrcListAddAlias(A,&Z);
371: if( N ){
372: if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
373: else { sqliteExprDelete(N); }
374: }
375: if( U ){
376: if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
377: 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: A = sqliteSrcListAppend(X,0,0);
383: A->a[A->nSrc-1].pSelect = S;
384: if( Z.n ) sqliteSrcListAddAlias(A,&Z);
385: if( N ){
386: if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pOn = N; }
387: else { sqliteExprDelete(N); }
388: }
389: if( U ){
390: if( A && A->nSrc>1 ){ A->a[A->nSrc-2].pUsing = U; }
391: 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: A = sqliteSelectNew(0,F,0,0,0,0,0,-1,0);
404: }
405:
406: %type dbnm {Token}
407: 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: joinop(X) ::= COMMA. { X = JT_INNER; }
413: joinop(X) ::= JOIN. { X = JT_INNER; }
414: joinop(X) ::= JOIN_KW(A) JOIN. { X = sqliteJoinType(pParse,&A,0,0); }
415: 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: { X = sqliteJoinType(pParse,&A,&B,&C); }
418:
419: %type on_opt {Expr*}
420: %destructor on_opt {sqliteExprDelete($$);}
421: on_opt(N) ::= ON expr(E). {N = E;}
422: on_opt(N) ::= . {N = 0;}
423:
424: %type using_opt {IdList*}
425: %destructor using_opt {sqliteIdListDelete($$);}
426: using_opt(U) ::= USING LP idxlist(L) RP. {U = L;}
427: 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: orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;}
439: sortlist(A) ::= sortlist(X) COMMA sortitem(Y) collate(C) sortorder(Z). {
440: A = sqliteExprListAppend(X,Y,0);
441: if( A ) A->a[A->nExpr-1].sortOrder = C+Z;
442: }
443: sortlist(A) ::= sortitem(Y) collate(C) sortorder(Z). {
444: A = sqliteExprListAppend(0,Y,0);
445: 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: sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;}
453: sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;}
454: sortorder(A) ::= . {A = SQLITE_SO_ASC;}
455: collate(C) ::= . {C = SQLITE_SO_UNK;}
456: 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: limit_opt(A) ::= . {A.limit = -1; A.offset = 0;}
470: limit_opt(A) ::= LIMIT signed(X). {A.limit = X; A.offset = 0;}
471: limit_opt(A) ::= LIMIT signed(X) OFFSET signed(Y).
472: {A.limit = X; A.offset = Y;}
473: limit_opt(A) ::= LIMIT signed(X) COMMA signed(Y).
474: {A.limit = Y; A.offset = X;}
475:
476: /////////////////////////// The DELETE statement /////////////////////////////
477: //
478: cmd ::= DELETE FROM nm(X) dbnm(D) where_opt(Y). {
479: 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: {sqliteUpdate(pParse,sqliteSrcListAppend(0,&X,&D),Y,Z,R);}
495:
496: setlist(A) ::= setlist(Z) COMMA nm(X) EQ expr(Y).
497: {A = sqliteExprListAppend(Z,Y,&X);}
498: 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: {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: {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: insert_cmd(A) ::= REPLACE. {A = OE_Replace;}
511:
512:
513: %type itemlist {ExprList*}
514: %destructor itemlist {sqliteExprListDelete($$);}
515:
516: itemlist(A) ::= itemlist(X) COMMA expr(Y). {A = sqliteExprListAppend(X,Y,0);}
517: 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: inscollist(A) ::= inscollist(X) COMMA nm(Y). {A = sqliteIdListAppend(X,&Y);}
527: inscollist(A) ::= nm(Y). {A = sqliteIdListAppend(0,&Y);}
528:
529: /////////////////////////// Expression Processing /////////////////////////////
530: //
531:
532: %type expr {Expr*}
533: %destructor expr {sqliteExprDelete($$);}
534:
535: expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqliteExprSpan(A,&B,&E); }
536: expr(A) ::= NULL(X). {A = sqliteExpr(TK_NULL, 0, 0, &X);}
537: 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: Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X);
541: Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y);
542: A = sqliteExpr(TK_DOT, temp1, temp2, 0);
543: }
544: expr(A) ::= nm(X) DOT nm(Y) DOT nm(Z). {
545: Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X);
546: Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y);
547: Expr *temp3 = sqliteExpr(TK_ID, 0, 0, &Z);
548: Expr *temp4 = sqliteExpr(TK_DOT, temp2, temp3, 0);
549: A = sqliteExpr(TK_DOT, temp1, temp4, 0);
550: }
551: expr(A) ::= INTEGER(X). {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
552: expr(A) ::= FLOAT(X). {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
553: expr(A) ::= STRING(X). {A = sqliteExpr(TK_STRING, 0, 0, &X);}
554: expr(A) ::= VARIABLE(X). {
555: A = sqliteExpr(TK_VARIABLE, 0, 0, &X);
556: if( A ) A->iTable = ++pParse->nVar;
557: }
558: expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
559: A = sqliteExprFunction(Y, &X);
560: sqliteExprSpan(A,&X,&E);
561: }
562: expr(A) ::= ID(X) LP STAR RP(E). {
563: A = sqliteExprFunction(0, &X);
564: sqliteExprSpan(A,&X,&E);
565: }
566: expr(A) ::= expr(X) AND expr(Y). {A = sqliteExpr(TK_AND, X, Y, 0);}
567: expr(A) ::= expr(X) OR expr(Y). {A = sqliteExpr(TK_OR, X, Y, 0);}
568: expr(A) ::= expr(X) LT expr(Y). {A = sqliteExpr(TK_LT, X, Y, 0);}
569: expr(A) ::= expr(X) GT expr(Y). {A = sqliteExpr(TK_GT, X, Y, 0);}
570: expr(A) ::= expr(X) LE expr(Y). {A = sqliteExpr(TK_LE, X, Y, 0);}
571: expr(A) ::= expr(X) GE expr(Y). {A = sqliteExpr(TK_GE, X, Y, 0);}
572: expr(A) ::= expr(X) NE expr(Y). {A = sqliteExpr(TK_NE, X, Y, 0);}
573: expr(A) ::= expr(X) EQ expr(Y). {A = sqliteExpr(TK_EQ, X, Y, 0);}
574: expr(A) ::= expr(X) BITAND expr(Y). {A = sqliteExpr(TK_BITAND, X, Y, 0);}
575: expr(A) ::= expr(X) BITOR expr(Y). {A = sqliteExpr(TK_BITOR, X, Y, 0);}
576: expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqliteExpr(TK_LSHIFT, X, Y, 0);}
577: 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: ExprList *pList = sqliteExprListAppend(0, Y, 0);
580: pList = sqliteExprListAppend(pList, X, 0);
581: A = sqliteExprFunction(pList, 0);
582: if( A ) A->op = OP;
583: sqliteExprSpan(A, &X->span, &Y->span);
584: }
585: expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
586: ExprList *pList = sqliteExprListAppend(0, Y, 0);
587: pList = sqliteExprListAppend(pList, X, 0);
588: A = sqliteExprFunction(pList, 0);
589: if( A ) A->op = OP;
590: A = sqliteExpr(TK_NOT, A, 0, 0);
591: sqliteExprSpan(A,&X->span,&Y->span);
592: }
593: %type likeop {int}
594: likeop(A) ::= LIKE. {A = TK_LIKE;}
595: likeop(A) ::= GLOB. {A = TK_GLOB;}
596: expr(A) ::= expr(X) PLUS expr(Y). {A = sqliteExpr(TK_PLUS, X, Y, 0);}
597: expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);}
598: expr(A) ::= expr(X) STAR expr(Y). {A = sqliteExpr(TK_STAR, X, Y, 0);}
599: expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);}
600: expr(A) ::= expr(X) REM expr(Y). {A = sqliteExpr(TK_REM, X, Y, 0);}
601: expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);}
602: expr(A) ::= expr(X) ISNULL(E). {
603: A = sqliteExpr(TK_ISNULL, X, 0, 0);
604: sqliteExprSpan(A,&X->span,&E);
605: }
606: expr(A) ::= expr(X) IS NULL(E). {
607: A = sqliteExpr(TK_ISNULL, X, 0, 0);
608: sqliteExprSpan(A,&X->span,&E);
609: }
610: expr(A) ::= expr(X) NOTNULL(E). {
611: A = sqliteExpr(TK_NOTNULL, X, 0, 0);
612: sqliteExprSpan(A,&X->span,&E);
613: }
614: expr(A) ::= expr(X) NOT NULL(E). {
615: A = sqliteExpr(TK_NOTNULL, X, 0, 0);
616: sqliteExprSpan(A,&X->span,&E);
617: }
618: expr(A) ::= expr(X) IS NOT NULL(E). {
619: A = sqliteExpr(TK_NOTNULL, X, 0, 0);
620: sqliteExprSpan(A,&X->span,&E);
621: }
622: expr(A) ::= NOT(B) expr(X). {
623: A = sqliteExpr(TK_NOT, X, 0, 0);
624: sqliteExprSpan(A,&B,&X->span);
625: }
626: expr(A) ::= BITNOT(B) expr(X). {
627: A = sqliteExpr(TK_BITNOT, X, 0, 0);
628: sqliteExprSpan(A,&B,&X->span);
629: }
630: expr(A) ::= MINUS(B) expr(X). [UMINUS] {
631: A = sqliteExpr(TK_UMINUS, X, 0, 0);
632: sqliteExprSpan(A,&B,&X->span);
633: }
634: expr(A) ::= PLUS(B) expr(X). [UPLUS] {
635: A = sqliteExpr(TK_UPLUS, X, 0, 0);
636: sqliteExprSpan(A,&B,&X->span);
637: }
638: expr(A) ::= LP(B) select(X) RP(E). {
639: A = sqliteExpr(TK_SELECT, 0, 0, 0);
640: if( A ) A->pSelect = X;
641: sqliteExprSpan(A,&B,&E);
642: }
643: expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
644: ExprList *pList = sqliteExprListAppend(0, X, 0);
645: pList = sqliteExprListAppend(pList, Y, 0);
646: A = sqliteExpr(TK_BETWEEN, W, 0, 0);
647: if( A ) A->pList = pList;
648: sqliteExprSpan(A,&W->span,&Y->span);
649: }
650: expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
651: ExprList *pList = sqliteExprListAppend(0, X, 0);
652: pList = sqliteExprListAppend(pList, Y, 0);
653: A = sqliteExpr(TK_BETWEEN, W, 0, 0);
654: if( A ) A->pList = pList;
655: A = sqliteExpr(TK_NOT, A, 0, 0);
656: sqliteExprSpan(A,&W->span,&Y->span);
657: }
658: expr(A) ::= expr(X) IN LP exprlist(Y) RP(E). {
659: A = sqliteExpr(TK_IN, X, 0, 0);
660: if( A ) A->pList = Y;
661: sqliteExprSpan(A,&X->span,&E);
662: }
663: expr(A) ::= expr(X) IN LP select(Y) RP(E). {
664: A = sqliteExpr(TK_IN, X, 0, 0);
665: if( A ) A->pSelect = Y;
666: sqliteExprSpan(A,&X->span,&E);
667: }
668: expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E). {
669: A = sqliteExpr(TK_IN, X, 0, 0);
670: if( A ) A->pList = Y;
671: A = sqliteExpr(TK_NOT, A, 0, 0);
672: sqliteExprSpan(A,&X->span,&E);
673: }
674: expr(A) ::= expr(X) NOT IN LP select(Y) RP(E). {
675: A = sqliteExpr(TK_IN, X, 0, 0);
676: if( A ) A->pSelect = Y;
677: A = sqliteExpr(TK_NOT, A, 0, 0);
678: sqliteExprSpan(A,&X->span,&E);
679: }
680: expr(A) ::= expr(X) IN nm(Y) dbnm(D). {
681: SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D);
682: A = sqliteExpr(TK_IN, X, 0, 0);
683: if( A ) A->pSelect = sqliteSelectNew(0,pSrc,0,0,0,0,0,-1,0);
684: sqliteExprSpan(A,&X->span,D.z?&D:&Y);
685: }
686: expr(A) ::= expr(X) NOT IN nm(Y) dbnm(D). {
687: SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D);
688: A = sqliteExpr(TK_IN, X, 0, 0);
689: if( A ) A->pSelect = sqliteSelectNew(0,pSrc,0,0,0,0,0,-1,0);
690: A = sqliteExpr(TK_NOT, A, 0, 0);
691: 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: A = sqliteExpr(TK_CASE, X, Z, 0);
698: if( A ) A->pList = Y;
699: 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: A = sqliteExprListAppend(X, Y, 0);
705: A = sqliteExprListAppend(A, Z, 0);
706: }
707: case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
708: A = sqliteExprListAppend(0, Y, 0);
709: 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: SrcList *pSrc = sqliteSrcListAppend(0, &Y, &D);
734: if( U!=OE_None ) U = R;
735: if( U==OE_Default) U = OE_Abort;
736: sqliteCreateIndex(pParse, &X, pSrc, Z, U, &S, &E);
737: }
738:
739: %type uniqueflag {int}
740: uniqueflag(A) ::= UNIQUE. { A = OE_Abort; }
741: uniqueflag(A) ::= . { A = OE_None; }
742:
743: %type idxlist {IdList*}
744: %destructor idxlist {sqliteIdListDelete($$);}
745: %type idxlist_opt {IdList*}
746: %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: 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: {sqliteCopy(pParse,sqliteSrcListAppend(0,&X,&D),&Y,&Z,R);}
767: cmd ::= COPY orconf(R) nm(X) dbnm(D) FROM nm(Y).
768: {sqliteCopy(pParse,sqliteSrcListAppend(0,&X,&D),&Y,0,R);}
769:
770: ///////////////////////////// The VACUUM command /////////////////////////////
771: //
772: cmd ::= VACUUM. {sqliteVacuum(pParse,0);}
773: cmd ::= VACUUM nm(X). {sqliteVacuum(pParse,&X);}
774:
775: ///////////////////////////// The PRAGMA command /////////////////////////////
776: //
777: cmd ::= PRAGMA ids(X) EQ nm(Y). {sqlitePragma(pParse,&X,&Y,0);}
778: 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: cmd ::= PRAGMA ids(X) EQ minus_num(Y). {sqlitePragma(pParse,&X,&Y,1);}
781: cmd ::= PRAGMA ids(X) LP nm(Y) RP. {sqlitePragma(pParse,&X,&Y,0);}
782: 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: all.z = A.z;
795: all.n = (Z.z - A.z) + Z.n;
796: 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: SrcList *pTab = sqliteSrcListAppend(0, &E, &DB);
802: sqliteBeginTrigger(pParse, &B, C, D.a, D.b, pTab, F, G, T);
803: }
804:
805: %type trigger_time {int}
806: trigger_time(A) ::= BEFORE. { A = TK_BEFORE; }
807: trigger_time(A) ::= AFTER. { A = TK_AFTER; }
808: trigger_time(A) ::= INSTEAD OF. { A = TK_INSTEAD;}
809: trigger_time(A) ::= . { A = TK_BEFORE; }
810:
811: %type trigger_event {struct TrigEvent}
812: %destructor trigger_event {sqliteIdListDelete($$.b);}
813: trigger_event(A) ::= DELETE. { A.a = TK_DELETE; A.b = 0; }
814: trigger_event(A) ::= INSERT. { A.a = TK_INSERT; A.b = 0; }
815: trigger_event(A) ::= UPDATE. { A.a = TK_UPDATE; A.b = 0;}
816: trigger_event(A) ::= UPDATE OF inscollist(X). {A.a = TK_UPDATE; A.b = X; }
817:
818: %type foreach_clause {int}
819: foreach_clause(A) ::= . { A = TK_ROW; }
820: foreach_clause(A) ::= FOR EACH ROW. { A = TK_ROW; }
821: foreach_clause(A) ::= FOR EACH STATEMENT. { A = TK_STATEMENT; }
822:
823: %type when_clause {Expr *}
824: when_clause(A) ::= . { A = 0; }
825: when_clause(A) ::= WHEN expr(X). { A = X; }
826:
827: %type trigger_cmd_list {TriggerStep *}
828: %destructor trigger_cmd_list {sqliteDeleteTriggerStep($$);}
829: trigger_cmd_list(A) ::= trigger_cmd(X) SEMI trigger_cmd_list(Y). {
830: X->pNext = Y;
831: A = X;
832: }
833: 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: { 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: {A = sqliteTriggerInsertStep(&X, F, Y, 0, R);}
845:
846: trigger_cmd(A) ::= insert_cmd(R) INTO nm(X) inscollist_opt(F) select(S).
847: {A = sqliteTriggerInsertStep(&X, F, 0, S, R);}
848:
849: // DELETE
850: trigger_cmd(A) ::= DELETE FROM nm(X) where_opt(Y).
851: {A = sqliteTriggerDeleteStep(&X, Y);}
852:
853: // SELECT
854: 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: A = sqliteExpr(TK_RAISE, 0, 0, 0);
859: A->iColumn = OE_Ignore;
860: sqliteExprSpan(A, &X, &Y);
861: }
862: expr(A) ::= RAISE(X) LP ROLLBACK COMMA nm(Z) RP(Y). {
863: A = sqliteExpr(TK_RAISE, 0, 0, &Z);
864: A->iColumn = OE_Rollback;
865: sqliteExprSpan(A, &X, &Y);
866: }
867: expr(A) ::= RAISE(X) LP ABORT COMMA nm(Z) RP(Y). {
868: A = sqliteExpr(TK_RAISE, 0, 0, &Z);
869: A->iColumn = OE_Abort;
870: sqliteExprSpan(A, &X, &Y);
871: }
872: expr(A) ::= RAISE(X) LP FAIL COMMA nm(Z) RP(Y). {
873: A = sqliteExpr(TK_RAISE, 0, 0, &Z);
874: A->iColumn = OE_Fail;
875: sqliteExprSpan(A, &X, &Y);
876: }
877:
878: //////////////////////// DROP TRIGGER statement //////////////////////////////
879: cmd ::= DROP TRIGGER nm(X) dbnm(D). {
880: 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: sqliteAttach(pParse, &F, &D, &K);
886: }
887: %type key_opt {Token}
888: key_opt(A) ::= USING ids(X). { A = X; }
889: 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: sqliteDetach(pParse, &D);
897: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>