OLD | NEW |
1 /* | 1 /* |
2 ** 2001 September 15 | 2 ** 2001 September 15 |
3 ** | 3 ** |
4 ** The author disclaims copyright to this source code. In place of | 4 ** The author disclaims copyright to this source code. In place of |
5 ** a legal notice, here is a blessing: | 5 ** a legal notice, here is a blessing: |
6 ** | 6 ** |
7 ** May you do good and not evil. | 7 ** May you do good and not evil. |
8 ** May you find forgiveness for yourself and forgive others. | 8 ** May you find forgiveness for yourself and forgive others. |
9 ** May you share freely, never taking more than you give. | 9 ** May you share freely, never taking more than you give. |
10 ** | 10 ** |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 ** automaton. | 54 ** automaton. |
55 */ | 55 */ |
56 #define YYNOERRORRECOVERY 1 | 56 #define YYNOERRORRECOVERY 1 |
57 | 57 |
58 /* | 58 /* |
59 ** Make yytestcase() the same as testcase() | 59 ** Make yytestcase() the same as testcase() |
60 */ | 60 */ |
61 #define yytestcase(X) testcase(X) | 61 #define yytestcase(X) testcase(X) |
62 | 62 |
63 /* | 63 /* |
| 64 ** Indicate that sqlite3ParserFree() will never be called with a null |
| 65 ** pointer. |
| 66 */ |
| 67 #define YYPARSEFREENEVERNULL 1 |
| 68 |
| 69 /* |
| 70 ** Alternative datatype for the argument to the malloc() routine passed |
| 71 ** into sqlite3ParserAlloc(). The default is size_t. |
| 72 */ |
| 73 #define YYMALLOCARGTYPE u64 |
| 74 |
| 75 /* |
64 ** An instance of this structure holds information about the | 76 ** An instance of this structure holds information about the |
65 ** LIMIT clause of a SELECT statement. | 77 ** LIMIT clause of a SELECT statement. |
66 */ | 78 */ |
67 struct LimitVal { | 79 struct LimitVal { |
68 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ | 80 Expr *pLimit; /* The LIMIT expression. NULL if there is no limit */ |
69 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ | 81 Expr *pOffset; /* The OFFSET expression. NULL if there is none */ |
70 }; | 82 }; |
71 | 83 |
72 /* | 84 /* |
73 ** An instance of this structure is used to store the LIKE, | 85 ** An instance of this structure is used to store the LIKE, |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
155 temp(A) ::= TEMP. {A = 1;} | 167 temp(A) ::= TEMP. {A = 1;} |
156 %endif SQLITE_OMIT_TEMPDB | 168 %endif SQLITE_OMIT_TEMPDB |
157 temp(A) ::= . {A = 0;} | 169 temp(A) ::= . {A = 0;} |
158 create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). { | 170 create_table_args ::= LP columnlist conslist_opt(X) RP(E) table_options(F). { |
159 sqlite3EndTable(pParse,&X,&E,F,0); | 171 sqlite3EndTable(pParse,&X,&E,F,0); |
160 } | 172 } |
161 create_table_args ::= AS select(S). { | 173 create_table_args ::= AS select(S). { |
162 sqlite3EndTable(pParse,0,0,0,S); | 174 sqlite3EndTable(pParse,0,0,0,S); |
163 sqlite3SelectDelete(pParse->db, S); | 175 sqlite3SelectDelete(pParse->db, S); |
164 } | 176 } |
165 %type table_options {u8} | 177 %type table_options {int} |
166 table_options(A) ::= . {A = 0;} | 178 table_options(A) ::= . {A = 0;} |
167 table_options(A) ::= WITHOUT nm(X). { | 179 table_options(A) ::= WITHOUT nm(X). { |
168 if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){ | 180 if( X.n==5 && sqlite3_strnicmp(X.z,"rowid",5)==0 ){ |
169 A = TF_WithoutRowid; | 181 A = TF_WithoutRowid | TF_NoVisibleRowid; |
170 }else{ | 182 }else{ |
171 A = 0; | 183 A = 0; |
172 sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z); | 184 sqlite3ErrorMsg(pParse, "unknown table option: %.*s", X.n, X.z); |
173 } | 185 } |
174 } | 186 } |
175 columnlist ::= columnlist COMMA column. | 187 columnlist ::= columnlist COMMA column. |
176 columnlist ::= column. | 188 columnlist ::= column. |
177 | 189 |
178 // A "column" is a complete description of a single column in a | 190 // A "column" is a complete description of a single column in a |
179 // CREATE TABLE statement. This includes the column name, its | 191 // CREATE TABLE statement. This includes the column name, its |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 | 306 |
295 // In addition to the type name, we also care about the primary key and | 307 // In addition to the type name, we also care about the primary key and |
296 // UNIQUE constraints. | 308 // UNIQUE constraints. |
297 // | 309 // |
298 ccons ::= NULL onconf. | 310 ccons ::= NULL onconf. |
299 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} | 311 ccons ::= NOT NULL onconf(R). {sqlite3AddNotNull(pParse, R);} |
300 ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). | 312 ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). |
301 {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} | 313 {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} |
302 ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} | 314 ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0);} |
303 ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);} | 315 ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X.pExpr);} |
304 ccons ::= REFERENCES nm(T) idxlist_opt(TA) refargs(R). | 316 ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R). |
305 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} | 317 {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} |
306 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} | 318 ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} |
307 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} | 319 ccons ::= COLLATE ids(C). {sqlite3AddCollateType(pParse, &C);} |
308 | 320 |
309 // The optional AUTOINCREMENT keyword | 321 // The optional AUTOINCREMENT keyword |
310 %type autoinc {int} | 322 %type autoinc {int} |
311 autoinc(X) ::= . {X = 0;} | 323 autoinc(X) ::= . {X = 0;} |
312 autoinc(X) ::= AUTOINCR. {X = 1;} | 324 autoinc(X) ::= AUTOINCR. {X = 1;} |
313 | 325 |
314 // The next group of rules parses the arguments to a REFERENCES clause | 326 // The next group of rules parses the arguments to a REFERENCES clause |
(...skipping 23 matching lines...) Expand all Loading... |
338 init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} | 350 init_deferred_pred_opt(A) ::= INITIALLY DEFERRED. {A = 1;} |
339 init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} | 351 init_deferred_pred_opt(A) ::= INITIALLY IMMEDIATE. {A = 0;} |
340 | 352 |
341 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} | 353 conslist_opt(A) ::= . {A.n = 0; A.z = 0;} |
342 conslist_opt(A) ::= COMMA(X) conslist. {A = X;} | 354 conslist_opt(A) ::= COMMA(X) conslist. {A = X;} |
343 conslist ::= conslist tconscomma tcons. | 355 conslist ::= conslist tconscomma tcons. |
344 conslist ::= tcons. | 356 conslist ::= tcons. |
345 tconscomma ::= COMMA. {pParse->constraintName.n = 0;} | 357 tconscomma ::= COMMA. {pParse->constraintName.n = 0;} |
346 tconscomma ::= . | 358 tconscomma ::= . |
347 tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} | 359 tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} |
348 tcons ::= PRIMARY KEY LP idxlist(X) autoinc(I) RP onconf(R). | 360 tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R). |
349 {sqlite3AddPrimaryKey(pParse,X,R,I,0);} | 361 {sqlite3AddPrimaryKey(pParse,X,R,I,0);} |
350 tcons ::= UNIQUE LP idxlist(X) RP onconf(R). | 362 tcons ::= UNIQUE LP sortlist(X) RP onconf(R). |
351 {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} | 363 {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0);} |
352 tcons ::= CHECK LP expr(E) RP onconf. | 364 tcons ::= CHECK LP expr(E) RP onconf. |
353 {sqlite3AddCheckConstraint(pParse,E.pExpr);} | 365 {sqlite3AddCheckConstraint(pParse,E.pExpr);} |
354 tcons ::= FOREIGN KEY LP idxlist(FA) RP | 366 tcons ::= FOREIGN KEY LP eidlist(FA) RP |
355 REFERENCES nm(T) idxlist_opt(TA) refargs(R) defer_subclause_opt(D). { | 367 REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). { |
356 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); | 368 sqlite3CreateForeignKey(pParse, FA, &T, TA, R); |
357 sqlite3DeferForeignKey(pParse, D); | 369 sqlite3DeferForeignKey(pParse, D); |
358 } | 370 } |
359 %type defer_subclause_opt {int} | 371 %type defer_subclause_opt {int} |
360 defer_subclause_opt(A) ::= . {A = 0;} | 372 defer_subclause_opt(A) ::= . {A = 0;} |
361 defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} | 373 defer_subclause_opt(A) ::= defer_subclause(X). {A = X;} |
362 | 374 |
363 // The following is a non-standard extension that allows us to declare the | 375 // The following is a non-standard extension that allows us to declare the |
364 // default behavior when there is a constraint conflict. | 376 // default behavior when there is a constraint conflict. |
365 // | 377 // |
366 %type onconf {int} | 378 %type onconf {int} |
367 %type orconf {u8} | 379 %type orconf {int} |
368 %type resolvetype {int} | 380 %type resolvetype {int} |
369 onconf(A) ::= . {A = OE_Default;} | 381 onconf(A) ::= . {A = OE_Default;} |
370 onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} | 382 onconf(A) ::= ON CONFLICT resolvetype(X). {A = X;} |
371 orconf(A) ::= . {A = OE_Default;} | 383 orconf(A) ::= . {A = OE_Default;} |
372 orconf(A) ::= OR resolvetype(X). {A = (u8)X;} | 384 orconf(A) ::= OR resolvetype(X). {A = X;} |
373 resolvetype(A) ::= raisetype(X). {A = X;} | 385 resolvetype(A) ::= raisetype(X). {A = X;} |
374 resolvetype(A) ::= IGNORE. {A = OE_Ignore;} | 386 resolvetype(A) ::= IGNORE. {A = OE_Ignore;} |
375 resolvetype(A) ::= REPLACE. {A = OE_Replace;} | 387 resolvetype(A) ::= REPLACE. {A = OE_Replace;} |
376 | 388 |
377 ////////////////////////// The DROP TABLE ///////////////////////////////////// | 389 ////////////////////////// The DROP TABLE ///////////////////////////////////// |
378 // | 390 // |
379 cmd ::= DROP TABLE ifexists(E) fullname(X). { | 391 cmd ::= DROP TABLE ifexists(E) fullname(X). { |
380 sqlite3DropTable(pParse, X, 0, E); | 392 sqlite3DropTable(pParse, X, 0, E); |
381 } | 393 } |
382 %type ifexists {int} | 394 %type ifexists {int} |
383 ifexists(A) ::= IF EXISTS. {A = 1;} | 395 ifexists(A) ::= IF EXISTS. {A = 1;} |
384 ifexists(A) ::= . {A = 0;} | 396 ifexists(A) ::= . {A = 0;} |
385 | 397 |
386 ///////////////////// The CREATE VIEW statement ///////////////////////////// | 398 ///////////////////// The CREATE VIEW statement ///////////////////////////// |
387 // | 399 // |
388 %ifndef SQLITE_OMIT_VIEW | 400 %ifndef SQLITE_OMIT_VIEW |
389 cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) AS select(S). { | 401 cmd ::= createkw(X) temp(T) VIEW ifnotexists(E) nm(Y) dbnm(Z) eidlist_opt(C) |
390 sqlite3CreateView(pParse, &X, &Y, &Z, S, T, E); | 402 AS select(S). { |
| 403 sqlite3CreateView(pParse, &X, &Y, &Z, C, S, T, E); |
391 } | 404 } |
392 cmd ::= DROP VIEW ifexists(E) fullname(X). { | 405 cmd ::= DROP VIEW ifexists(E) fullname(X). { |
393 sqlite3DropTable(pParse, X, 1, E); | 406 sqlite3DropTable(pParse, X, 1, E); |
394 } | 407 } |
395 %endif SQLITE_OMIT_VIEW | 408 %endif SQLITE_OMIT_VIEW |
396 | 409 |
397 //////////////////////// The SELECT statement ///////////////////////////////// | 410 //////////////////////// The SELECT statement ///////////////////////////////// |
398 // | 411 // |
399 cmd ::= select(X). { | 412 cmd ::= select(X). { |
400 SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; | 413 SelectDest dest = {SRT_Output, 0, 0, 0, 0, 0}; |
401 sqlite3Select(pParse, X, &dest); | 414 sqlite3Select(pParse, X, &dest); |
402 sqlite3SelectDelete(pParse->db, X); | 415 sqlite3SelectDelete(pParse->db, X); |
403 } | 416 } |
404 | 417 |
405 %type select {Select*} | 418 %type select {Select*} |
406 %destructor select {sqlite3SelectDelete(pParse->db, $$);} | 419 %destructor select {sqlite3SelectDelete(pParse->db, $$);} |
407 %type selectnowith {Select*} | 420 %type selectnowith {Select*} |
408 %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);} | 421 %destructor selectnowith {sqlite3SelectDelete(pParse->db, $$);} |
409 %type oneselect {Select*} | 422 %type oneselect {Select*} |
410 %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} | 423 %destructor oneselect {sqlite3SelectDelete(pParse->db, $$);} |
411 | 424 |
412 select(A) ::= with(W) selectnowith(X). { | 425 %include { |
413 Select *p = X, *pNext, *pLoop; | 426 /* |
414 if( p ){ | 427 ** For a compound SELECT statement, make sure p->pPrior->pNext==p for |
415 int cnt = 0, mxSelect; | 428 ** all elements in the list. And make sure list length does not exceed |
416 p->pWith = W; | 429 ** SQLITE_LIMIT_COMPOUND_SELECT. |
| 430 */ |
| 431 static void parserDoubleLinkSelect(Parse *pParse, Select *p){ |
417 if( p->pPrior ){ | 432 if( p->pPrior ){ |
418 pNext = 0; | 433 Select *pNext = 0, *pLoop; |
| 434 int mxSelect, cnt = 0; |
419 for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ | 435 for(pLoop=p; pLoop; pNext=pLoop, pLoop=pLoop->pPrior, cnt++){ |
420 pLoop->pNext = pNext; | 436 pLoop->pNext = pNext; |
421 pLoop->selFlags |= SF_Compound; | 437 pLoop->selFlags |= SF_Compound; |
422 } | 438 } |
423 mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT]; | 439 if( (p->selFlags & SF_MultiValue)==0 && |
424 if( mxSelect && cnt>mxSelect ){ | 440 (mxSelect = pParse->db->aLimit[SQLITE_LIMIT_COMPOUND_SELECT])>0 && |
| 441 cnt>mxSelect |
| 442 ){ |
425 sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); | 443 sqlite3ErrorMsg(pParse, "too many terms in compound SELECT"); |
426 } | 444 } |
427 } | 445 } |
| 446 } |
| 447 } |
| 448 |
| 449 select(A) ::= with(W) selectnowith(X). { |
| 450 Select *p = X; |
| 451 if( p ){ |
| 452 p->pWith = W; |
| 453 parserDoubleLinkSelect(pParse, p); |
428 }else{ | 454 }else{ |
429 sqlite3WithDelete(pParse->db, W); | 455 sqlite3WithDelete(pParse->db, W); |
430 } | 456 } |
431 A = p; | 457 A = p; |
432 } | 458 } |
433 | 459 |
434 selectnowith(A) ::= oneselect(X). {A = X;} | 460 selectnowith(A) ::= oneselect(X). {A = X;} |
435 %ifndef SQLITE_OMIT_COMPOUND_SELECT | 461 %ifndef SQLITE_OMIT_COMPOUND_SELECT |
436 selectnowith(A) ::= selectnowith(X) multiselect_op(Y) oneselect(Z). { | 462 selectnowith(A) ::= selectnowith(X) multiselect_op(Y) oneselect(Z). { |
437 Select *pRhs = Z; | 463 Select *pRhs = Z; |
| 464 Select *pLhs = X; |
438 if( pRhs && pRhs->pPrior ){ | 465 if( pRhs && pRhs->pPrior ){ |
439 SrcList *pFrom; | 466 SrcList *pFrom; |
440 Token x; | 467 Token x; |
441 x.n = 0; | 468 x.n = 0; |
| 469 parserDoubleLinkSelect(pParse, pRhs); |
442 pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); | 470 pFrom = sqlite3SrcListAppendFromTerm(pParse,0,0,0,&x,pRhs,0,0); |
443 pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0); | 471 pRhs = sqlite3SelectNew(pParse,0,pFrom,0,0,0,0,0,0,0); |
444 } | 472 } |
445 if( pRhs ){ | 473 if( pRhs ){ |
446 pRhs->op = (u8)Y; | 474 pRhs->op = (u8)Y; |
447 pRhs->pPrior = X; | 475 pRhs->pPrior = pLhs; |
| 476 if( ALWAYS(pLhs) ) pLhs->selFlags &= ~SF_MultiValue; |
| 477 pRhs->selFlags &= ~SF_MultiValue; |
448 if( Y!=TK_ALL ) pParse->hasCompound = 1; | 478 if( Y!=TK_ALL ) pParse->hasCompound = 1; |
449 }else{ | 479 }else{ |
450 sqlite3SelectDelete(pParse->db, X); | 480 sqlite3SelectDelete(pParse->db, pLhs); |
451 } | 481 } |
452 A = pRhs; | 482 A = pRhs; |
453 } | 483 } |
454 %type multiselect_op {int} | 484 %type multiselect_op {int} |
455 multiselect_op(A) ::= UNION(OP). {A = @OP;} | 485 multiselect_op(A) ::= UNION(OP). {A = @OP;} |
456 multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} | 486 multiselect_op(A) ::= UNION ALL. {A = TK_ALL;} |
457 multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} | 487 multiselect_op(A) ::= EXCEPT|INTERSECT(OP). {A = @OP;} |
458 %endif SQLITE_OMIT_COMPOUND_SELECT | 488 %endif SQLITE_OMIT_COMPOUND_SELECT |
459 oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y) | 489 oneselect(A) ::= SELECT(S) distinct(D) selcollist(W) from(X) where_opt(Y) |
460 groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { | 490 groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). { |
(...skipping 24 matching lines...) Expand all Loading... |
485 #endif /* SELECTRACE_ENABLED */ | 515 #endif /* SELECTRACE_ENABLED */ |
486 } | 516 } |
487 oneselect(A) ::= values(X). {A = X;} | 517 oneselect(A) ::= values(X). {A = X;} |
488 | 518 |
489 %type values {Select*} | 519 %type values {Select*} |
490 %destructor values {sqlite3SelectDelete(pParse->db, $$);} | 520 %destructor values {sqlite3SelectDelete(pParse->db, $$);} |
491 values(A) ::= VALUES LP nexprlist(X) RP. { | 521 values(A) ::= VALUES LP nexprlist(X) RP. { |
492 A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0,0); | 522 A = sqlite3SelectNew(pParse,X,0,0,0,0,0,SF_Values,0,0); |
493 } | 523 } |
494 values(A) ::= values(X) COMMA LP exprlist(Y) RP. { | 524 values(A) ::= values(X) COMMA LP exprlist(Y) RP. { |
495 Select *pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values,0,0); | 525 Select *pRight, *pLeft = X; |
| 526 pRight = sqlite3SelectNew(pParse,Y,0,0,0,0,0,SF_Values|SF_MultiValue,0,0); |
| 527 if( ALWAYS(pLeft) ) pLeft->selFlags &= ~SF_MultiValue; |
496 if( pRight ){ | 528 if( pRight ){ |
497 pRight->op = TK_ALL; | 529 pRight->op = TK_ALL; |
498 pRight->pPrior = X; | 530 pLeft = X; |
| 531 pRight->pPrior = pLeft; |
499 A = pRight; | 532 A = pRight; |
500 }else{ | 533 }else{ |
501 A = X; | 534 A = pLeft; |
502 } | 535 } |
503 } | 536 } |
504 | 537 |
505 // The "distinct" nonterminal is true (1) if the DISTINCT keyword is | 538 // The "distinct" nonterminal is true (1) if the DISTINCT keyword is |
506 // present and false (0) if it is not. | 539 // present and false (0) if it is not. |
507 // | 540 // |
508 %type distinct {u16} | 541 %type distinct {int} |
509 distinct(A) ::= DISTINCT. {A = SF_Distinct;} | 542 distinct(A) ::= DISTINCT. {A = SF_Distinct;} |
510 distinct(A) ::= ALL. {A = 0;} | 543 distinct(A) ::= ALL. {A = SF_All;} |
511 distinct(A) ::= . {A = 0;} | 544 distinct(A) ::= . {A = 0;} |
512 | 545 |
513 // selcollist is a list of expressions that are to become the return | 546 // selcollist is a list of expressions that are to become the return |
514 // values of the SELECT statement. The "*" in statements like | 547 // values of the SELECT statement. The "*" in statements like |
515 // "SELECT * FROM ..." is encoded as a special expression with an | 548 // "SELECT * FROM ..." is encoded as a special expression with an |
516 // opcode of TK_ALL. | 549 // opcode of TK_ASTERISK. |
517 // | 550 // |
518 %type selcollist {ExprList*} | 551 %type selcollist {ExprList*} |
519 %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} | 552 %destructor selcollist {sqlite3ExprListDelete(pParse->db, $$);} |
520 %type sclp {ExprList*} | 553 %type sclp {ExprList*} |
521 %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} | 554 %destructor sclp {sqlite3ExprListDelete(pParse->db, $$);} |
522 sclp(A) ::= selcollist(X) COMMA. {A = X;} | 555 sclp(A) ::= selcollist(X) COMMA. {A = X;} |
523 sclp(A) ::= . {A = 0;} | 556 sclp(A) ::= . {A = 0;} |
524 selcollist(A) ::= sclp(P) expr(X) as(Y). { | 557 selcollist(A) ::= sclp(P) expr(X) as(Y). { |
525 A = sqlite3ExprListAppend(pParse, P, X.pExpr); | 558 A = sqlite3ExprListAppend(pParse, P, X.pExpr); |
526 if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); | 559 if( Y.n>0 ) sqlite3ExprListSetName(pParse, A, &Y, 1); |
527 sqlite3ExprListSetSpan(pParse,A,&X); | 560 sqlite3ExprListSetSpan(pParse,A,&X); |
528 } | 561 } |
529 selcollist(A) ::= sclp(P) STAR. { | 562 selcollist(A) ::= sclp(P) STAR. { |
530 Expr *p = sqlite3Expr(pParse->db, TK_ALL, 0); | 563 Expr *p = sqlite3Expr(pParse->db, TK_ASTERISK, 0); |
531 A = sqlite3ExprListAppend(pParse, P, p); | 564 A = sqlite3ExprListAppend(pParse, P, p); |
532 } | 565 } |
533 selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). { | 566 selcollist(A) ::= sclp(P) nm(X) DOT STAR(Y). { |
534 Expr *pRight = sqlite3PExpr(pParse, TK_ALL, 0, 0, &Y); | 567 Expr *pRight = sqlite3PExpr(pParse, TK_ASTERISK, 0, 0, &Y); |
535 Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); | 568 Expr *pLeft = sqlite3PExpr(pParse, TK_ID, 0, 0, &X); |
536 Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); | 569 Expr *pDot = sqlite3PExpr(pParse, TK_DOT, pLeft, pRight, 0); |
537 A = sqlite3ExprListAppend(pParse,P, pDot); | 570 A = sqlite3ExprListAppend(pParse,P, pDot); |
538 } | 571 } |
539 | 572 |
540 // An option "AS <id>" phrase that can follow one of the expressions that | 573 // An option "AS <id>" phrase that can follow one of the expressions that |
541 // define the result set, or one of the tables in the FROM clause. | 574 // define the result set, or one of the tables in the FROM clause. |
542 // | 575 // |
543 %type as {Token} | 576 %type as {Token} |
544 as(X) ::= AS nm(Y). {X = Y;} | 577 as(X) ::= AS nm(Y). {X = Y;} |
(...skipping 14 matching lines...) Expand all Loading... |
559 from(A) ::= FROM seltablist(X). { | 592 from(A) ::= FROM seltablist(X). { |
560 A = X; | 593 A = X; |
561 sqlite3SrcListShiftJoinType(A); | 594 sqlite3SrcListShiftJoinType(A); |
562 } | 595 } |
563 | 596 |
564 // "seltablist" is a "Select Table List" - the content of the FROM clause | 597 // "seltablist" is a "Select Table List" - the content of the FROM clause |
565 // in a SELECT statement. "stl_prefix" is a prefix of this list. | 598 // in a SELECT statement. "stl_prefix" is a prefix of this list. |
566 // | 599 // |
567 stl_prefix(A) ::= seltablist(X) joinop(Y). { | 600 stl_prefix(A) ::= seltablist(X) joinop(Y). { |
568 A = X; | 601 A = X; |
569 if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].jointype = (u8)Y; | 602 if( ALWAYS(A && A->nSrc>0) ) A->a[A->nSrc-1].fg.jointype = (u8)Y; |
570 } | 603 } |
571 stl_prefix(A) ::= . {A = 0;} | 604 stl_prefix(A) ::= . {A = 0;} |
572 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) | 605 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) as(Z) indexed_opt(I) |
573 on_opt(N) using_opt(U). { | 606 on_opt(N) using_opt(U). { |
574 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); | 607 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); |
575 sqlite3SrcListIndexedBy(pParse, A, &I); | 608 sqlite3SrcListIndexedBy(pParse, A, &I); |
576 } | 609 } |
| 610 seltablist(A) ::= stl_prefix(X) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) |
| 611 on_opt(N) using_opt(U). { |
| 612 A = sqlite3SrcListAppendFromTerm(pParse,X,&Y,&D,&Z,0,N,U); |
| 613 sqlite3SrcListFuncArgs(pParse, A, E); |
| 614 } |
577 %ifndef SQLITE_OMIT_SUBQUERY | 615 %ifndef SQLITE_OMIT_SUBQUERY |
578 seltablist(A) ::= stl_prefix(X) LP select(S) RP | 616 seltablist(A) ::= stl_prefix(X) LP select(S) RP |
579 as(Z) on_opt(N) using_opt(U). { | 617 as(Z) on_opt(N) using_opt(U). { |
580 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); | 618 A = sqlite3SrcListAppendFromTerm(pParse,X,0,0,&Z,S,N,U); |
581 } | 619 } |
582 seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP | 620 seltablist(A) ::= stl_prefix(X) LP seltablist(F) RP |
583 as(Z) on_opt(N) using_opt(U). { | 621 as(Z) on_opt(N) using_opt(U). { |
584 if( X==0 && Z.n==0 && N==0 && U==0 ){ | 622 if( X==0 && Z.n==0 && N==0 && U==0 ){ |
585 A = F; | 623 A = F; |
586 }else if( F->nSrc==1 ){ | 624 }else if( F->nSrc==1 ){ |
(...skipping 19 matching lines...) Expand all Loading... |
606 | 644 |
607 %type dbnm {Token} | 645 %type dbnm {Token} |
608 dbnm(A) ::= . {A.z=0; A.n=0;} | 646 dbnm(A) ::= . {A.z=0; A.n=0;} |
609 dbnm(A) ::= DOT nm(X). {A = X;} | 647 dbnm(A) ::= DOT nm(X). {A = X;} |
610 | 648 |
611 %type fullname {SrcList*} | 649 %type fullname {SrcList*} |
612 %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} | 650 %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} |
613 fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} | 651 fullname(A) ::= nm(X) dbnm(Y). {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y);} |
614 | 652 |
615 %type joinop {int} | 653 %type joinop {int} |
616 %type joinop2 {int} | |
617 joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } | 654 joinop(X) ::= COMMA|JOIN. { X = JT_INNER; } |
618 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } | 655 joinop(X) ::= JOIN_KW(A) JOIN. { X = sqlite3JoinType(pParse,&A,0,0); } |
619 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } | 656 joinop(X) ::= JOIN_KW(A) nm(B) JOIN. { X = sqlite3JoinType(pParse,&A,&B,0); } |
620 joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. | 657 joinop(X) ::= JOIN_KW(A) nm(B) nm(C) JOIN. |
621 { X = sqlite3JoinType(pParse,&A,&B,&C); } | 658 { X = sqlite3JoinType(pParse,&A,&B,&C); } |
622 | 659 |
623 %type on_opt {Expr*} | 660 %type on_opt {Expr*} |
624 %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} | 661 %destructor on_opt {sqlite3ExprDelete(pParse->db, $$);} |
625 on_opt(N) ::= ON expr(E). {N = E.pExpr;} | 662 on_opt(N) ::= ON expr(E). {N = E.pExpr;} |
626 on_opt(N) ::= . {N = 0;} | 663 on_opt(N) ::= . {N = 0;} |
(...skipping 14 matching lines...) Expand all Loading... |
641 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} | 678 indexed_opt(A) ::= NOT INDEXED. {A.z=0; A.n=1;} |
642 | 679 |
643 %type using_opt {IdList*} | 680 %type using_opt {IdList*} |
644 %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} | 681 %destructor using_opt {sqlite3IdListDelete(pParse->db, $$);} |
645 using_opt(U) ::= USING LP idlist(L) RP. {U = L;} | 682 using_opt(U) ::= USING LP idlist(L) RP. {U = L;} |
646 using_opt(U) ::= . {U = 0;} | 683 using_opt(U) ::= . {U = 0;} |
647 | 684 |
648 | 685 |
649 %type orderby_opt {ExprList*} | 686 %type orderby_opt {ExprList*} |
650 %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} | 687 %destructor orderby_opt {sqlite3ExprListDelete(pParse->db, $$);} |
| 688 |
| 689 // the sortlist non-terminal stores a list of expression where each |
| 690 // expression is optionally followed by ASC or DESC to indicate the |
| 691 // sort order. |
| 692 // |
651 %type sortlist {ExprList*} | 693 %type sortlist {ExprList*} |
652 %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} | 694 %destructor sortlist {sqlite3ExprListDelete(pParse->db, $$);} |
653 | 695 |
654 orderby_opt(A) ::= . {A = 0;} | 696 orderby_opt(A) ::= . {A = 0;} |
655 orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} | 697 orderby_opt(A) ::= ORDER BY sortlist(X). {A = X;} |
656 sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z). { | 698 sortlist(A) ::= sortlist(X) COMMA expr(Y) sortorder(Z). { |
657 A = sqlite3ExprListAppend(pParse,X,Y.pExpr); | 699 A = sqlite3ExprListAppend(pParse,X,Y.pExpr); |
658 if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; | 700 sqlite3ExprListSetSortOrder(A,Z); |
659 } | 701 } |
660 sortlist(A) ::= expr(Y) sortorder(Z). { | 702 sortlist(A) ::= expr(Y) sortorder(Z). { |
661 A = sqlite3ExprListAppend(pParse,0,Y.pExpr); | 703 A = sqlite3ExprListAppend(pParse,0,Y.pExpr); |
662 if( A && ALWAYS(A->a) ) A->a[0].sortOrder = (u8)Z; | 704 sqlite3ExprListSetSortOrder(A,Z); |
663 } | 705 } |
664 | 706 |
665 %type sortorder {int} | 707 %type sortorder {int} |
666 | 708 |
667 sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} | 709 sortorder(A) ::= ASC. {A = SQLITE_SO_ASC;} |
668 sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} | 710 sortorder(A) ::= DESC. {A = SQLITE_SO_DESC;} |
669 sortorder(A) ::= . {A = SQLITE_SO_ASC;} | 711 sortorder(A) ::= . {A = SQLITE_SO_UNDEFINED;} |
670 | 712 |
671 %type groupby_opt {ExprList*} | 713 %type groupby_opt {ExprList*} |
672 %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} | 714 %destructor groupby_opt {sqlite3ExprListDelete(pParse->db, $$);} |
673 groupby_opt(A) ::= . {A = 0;} | 715 groupby_opt(A) ::= . {A = 0;} |
674 groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} | 716 groupby_opt(A) ::= GROUP BY nexprlist(X). {A = X;} |
675 | 717 |
676 %type having_opt {Expr*} | 718 %type having_opt {Expr*} |
677 %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} | 719 %destructor having_opt {sqlite3ExprDelete(pParse->db, $$);} |
678 having_opt(A) ::= . {A = 0;} | 720 having_opt(A) ::= . {A = 0;} |
679 having_opt(A) ::= HAVING expr(X). {A = X.pExpr;} | 721 having_opt(A) ::= HAVING expr(X). {A = X.pExpr;} |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 A = sqlite3ExprListAppend(pParse, Z, Y.pExpr); | 794 A = sqlite3ExprListAppend(pParse, Z, Y.pExpr); |
753 sqlite3ExprListSetName(pParse, A, &X, 1); | 795 sqlite3ExprListSetName(pParse, A, &X, 1); |
754 } | 796 } |
755 setlist(A) ::= nm(X) EQ expr(Y). { | 797 setlist(A) ::= nm(X) EQ expr(Y). { |
756 A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); | 798 A = sqlite3ExprListAppend(pParse, 0, Y.pExpr); |
757 sqlite3ExprListSetName(pParse, A, &X, 1); | 799 sqlite3ExprListSetName(pParse, A, &X, 1); |
758 } | 800 } |
759 | 801 |
760 ////////////////////////// The INSERT command ///////////////////////////////// | 802 ////////////////////////// The INSERT command ///////////////////////////////// |
761 // | 803 // |
762 cmd ::= with(W) insert_cmd(R) INTO fullname(X) inscollist_opt(F) select(S). { | 804 cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) select(S). { |
763 sqlite3WithPush(pParse, W, 1); | 805 sqlite3WithPush(pParse, W, 1); |
764 sqlite3Insert(pParse, X, S, F, R); | 806 sqlite3Insert(pParse, X, S, F, R); |
765 } | 807 } |
766 cmd ::= with(W) insert_cmd(R) INTO fullname(X) inscollist_opt(F) DEFAULT VALUES. | 808 cmd ::= with(W) insert_cmd(R) INTO fullname(X) idlist_opt(F) DEFAULT VALUES. |
767 { | 809 { |
768 sqlite3WithPush(pParse, W, 1); | 810 sqlite3WithPush(pParse, W, 1); |
769 sqlite3Insert(pParse, X, 0, F, R); | 811 sqlite3Insert(pParse, X, 0, F, R); |
770 } | 812 } |
771 | 813 |
772 %type insert_cmd {u8} | 814 %type insert_cmd {int} |
773 insert_cmd(A) ::= INSERT orconf(R). {A = R;} | 815 insert_cmd(A) ::= INSERT orconf(R). {A = R;} |
774 insert_cmd(A) ::= REPLACE. {A = OE_Replace;} | 816 insert_cmd(A) ::= REPLACE. {A = OE_Replace;} |
775 | 817 |
776 %type inscollist_opt {IdList*} | 818 %type idlist_opt {IdList*} |
777 %destructor inscollist_opt {sqlite3IdListDelete(pParse->db, $$);} | 819 %destructor idlist_opt {sqlite3IdListDelete(pParse->db, $$);} |
778 %type idlist {IdList*} | 820 %type idlist {IdList*} |
779 %destructor idlist {sqlite3IdListDelete(pParse->db, $$);} | 821 %destructor idlist {sqlite3IdListDelete(pParse->db, $$);} |
780 | 822 |
781 inscollist_opt(A) ::= . {A = 0;} | 823 idlist_opt(A) ::= . {A = 0;} |
782 inscollist_opt(A) ::= LP idlist(X) RP. {A = X;} | 824 idlist_opt(A) ::= LP idlist(X) RP. {A = X;} |
783 idlist(A) ::= idlist(X) COMMA nm(Y). | 825 idlist(A) ::= idlist(X) COMMA nm(Y). |
784 {A = sqlite3IdListAppend(pParse->db,X,&Y);} | 826 {A = sqlite3IdListAppend(pParse->db,X,&Y);} |
785 idlist(A) ::= nm(Y). | 827 idlist(A) ::= nm(Y). |
786 {A = sqlite3IdListAppend(pParse->db,0,&Y);} | 828 {A = sqlite3IdListAppend(pParse->db,0,&Y);} |
787 | 829 |
788 /////////////////////////// Expression Processing ///////////////////////////// | 830 /////////////////////////// Expression Processing ///////////////////////////// |
789 // | 831 // |
790 | 832 |
791 %type expr {ExprSpan} | 833 %type expr {ExprSpan} |
792 %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} | 834 %destructor expr {sqlite3ExprDelete(pParse->db, $$.pExpr);} |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
863 A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); | 905 A.pExpr = sqlite3PExpr(pParse, TK_CAST, E.pExpr, 0, &T); |
864 spanSet(&A,&X,&Y); | 906 spanSet(&A,&X,&Y); |
865 } | 907 } |
866 %endif SQLITE_OMIT_CAST | 908 %endif SQLITE_OMIT_CAST |
867 expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). { | 909 expr(A) ::= id(X) LP distinct(D) exprlist(Y) RP(E). { |
868 if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ | 910 if( Y && Y->nExpr>pParse->db->aLimit[SQLITE_LIMIT_FUNCTION_ARG] ){ |
869 sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); | 911 sqlite3ErrorMsg(pParse, "too many arguments on function %T", &X); |
870 } | 912 } |
871 A.pExpr = sqlite3ExprFunction(pParse, Y, &X); | 913 A.pExpr = sqlite3ExprFunction(pParse, Y, &X); |
872 spanSet(&A,&X,&E); | 914 spanSet(&A,&X,&E); |
873 if( D && A.pExpr ){ | 915 if( D==SF_Distinct && A.pExpr ){ |
874 A.pExpr->flags |= EP_Distinct; | 916 A.pExpr->flags |= EP_Distinct; |
875 } | 917 } |
876 } | 918 } |
877 expr(A) ::= id(X) LP STAR RP(E). { | 919 expr(A) ::= id(X) LP STAR RP(E). { |
878 A.pExpr = sqlite3ExprFunction(pParse, 0, &X); | 920 A.pExpr = sqlite3ExprFunction(pParse, 0, &X); |
879 spanSet(&A,&X,&E); | 921 spanSet(&A,&X,&E); |
880 } | 922 } |
881 term(A) ::= CTIME_KW(OP). { | 923 term(A) ::= CTIME_KW(OP). { |
882 A.pExpr = sqlite3ExprFunction(pParse, 0, &OP); | 924 A.pExpr = sqlite3ExprFunction(pParse, 0, &OP); |
883 spanSet(&A, &OP, &OP); | 925 spanSet(&A, &OP, &OP); |
884 } | 926 } |
885 | 927 |
886 %include { | 928 %include { |
887 /* This routine constructs a binary expression node out of two ExprSpan | 929 /* This routine constructs a binary expression node out of two ExprSpan |
888 ** objects and uses the result to populate a new ExprSpan object. | 930 ** objects and uses the result to populate a new ExprSpan object. |
889 */ | 931 */ |
890 static void spanBinaryExpr( | 932 static void spanBinaryExpr( |
891 ExprSpan *pOut, /* Write the result here */ | 933 ExprSpan *pOut, /* Write the result here */ |
892 Parse *pParse, /* The parsing context. Errors accumulate here */ | 934 Parse *pParse, /* The parsing context. Errors accumulate here */ |
893 int op, /* The binary operation */ | 935 int op, /* The binary operation */ |
894 ExprSpan *pLeft, /* The left operand */ | 936 ExprSpan *pLeft, /* The left operand */ |
895 ExprSpan *pRight /* The right operand */ | 937 ExprSpan *pRight /* The right operand */ |
896 ){ | 938 ){ |
897 pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); | 939 pOut->pExpr = sqlite3PExpr(pParse, op, pLeft->pExpr, pRight->pExpr, 0); |
898 pOut->zStart = pLeft->zStart; | 940 pOut->zStart = pLeft->zStart; |
899 pOut->zEnd = pRight->zEnd; | 941 pOut->zEnd = pRight->zEnd; |
900 } | 942 } |
| 943 |
| 944 /* If doNot is true, then add a TK_NOT Expr-node wrapper around the |
| 945 ** outside of *ppExpr. |
| 946 */ |
| 947 static void exprNot(Parse *pParse, int doNot, Expr **ppExpr){ |
| 948 if( doNot ) *ppExpr = sqlite3PExpr(pParse, TK_NOT, *ppExpr, 0, 0); |
| 949 } |
901 } | 950 } |
902 | 951 |
903 expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} | 952 expr(A) ::= expr(X) AND(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} |
904 expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} | 953 expr(A) ::= expr(X) OR(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} |
905 expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). | 954 expr(A) ::= expr(X) LT|GT|GE|LE(OP) expr(Y). |
906 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} | 955 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} |
907 expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} | 956 expr(A) ::= expr(X) EQ|NE(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} |
908 expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). | 957 expr(A) ::= expr(X) BITAND|BITOR|LSHIFT|RSHIFT(OP) expr(Y). |
909 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} | 958 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} |
910 expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). | 959 expr(A) ::= expr(X) PLUS|MINUS(OP) expr(Y). |
911 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} | 960 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} |
912 expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). | 961 expr(A) ::= expr(X) STAR|SLASH|REM(OP) expr(Y). |
913 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} | 962 {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} |
914 expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} | 963 expr(A) ::= expr(X) CONCAT(OP) expr(Y). {spanBinaryExpr(&A,pParse,@OP,&X,&Y);} |
915 %type likeop {struct LikeOp} | 964 %type likeop {struct LikeOp} |
916 likeop(A) ::= LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 0;} | 965 likeop(A) ::= LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 0;} |
917 likeop(A) ::= NOT LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 1;} | 966 likeop(A) ::= NOT LIKE_KW|MATCH(X). {A.eOperator = X; A.bNot = 1;} |
918 expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] { | 967 expr(A) ::= expr(X) likeop(OP) expr(Y). [LIKE_KW] { |
919 ExprList *pList; | 968 ExprList *pList; |
920 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); | 969 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); |
921 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); | 970 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); |
922 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); | 971 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); |
923 if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); | 972 exprNot(pParse, OP.bNot, &A.pExpr); |
924 A.zStart = X.zStart; | 973 A.zStart = X.zStart; |
925 A.zEnd = Y.zEnd; | 974 A.zEnd = Y.zEnd; |
926 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; | 975 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; |
927 } | 976 } |
928 expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { | 977 expr(A) ::= expr(X) likeop(OP) expr(Y) ESCAPE expr(E). [LIKE_KW] { |
929 ExprList *pList; | 978 ExprList *pList; |
930 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); | 979 pList = sqlite3ExprListAppend(pParse,0, Y.pExpr); |
931 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); | 980 pList = sqlite3ExprListAppend(pParse,pList, X.pExpr); |
932 pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); | 981 pList = sqlite3ExprListAppend(pParse,pList, E.pExpr); |
933 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); | 982 A.pExpr = sqlite3ExprFunction(pParse, pList, &OP.eOperator); |
934 if( OP.bNot ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); | 983 exprNot(pParse, OP.bNot, &A.pExpr); |
935 A.zStart = X.zStart; | 984 A.zStart = X.zStart; |
936 A.zEnd = E.zEnd; | 985 A.zEnd = E.zEnd; |
937 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; | 986 if( A.pExpr ) A.pExpr->flags |= EP_InfixFunc; |
938 } | 987 } |
939 | 988 |
940 %include { | 989 %include { |
941 /* Construct an expression node for a unary postfix operator | 990 /* Construct an expression node for a unary postfix operator |
942 */ | 991 */ |
943 static void spanUnaryPostfix( | 992 static void spanUnaryPostfix( |
944 ExprSpan *pOut, /* Write the new expression node here */ | 993 ExprSpan *pOut, /* Write the new expression node here */ |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1014 between_op(A) ::= NOT BETWEEN. {A = 1;} | 1063 between_op(A) ::= NOT BETWEEN. {A = 1;} |
1015 expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { | 1064 expr(A) ::= expr(W) between_op(N) expr(X) AND expr(Y). [BETWEEN] { |
1016 ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); | 1065 ExprList *pList = sqlite3ExprListAppend(pParse,0, X.pExpr); |
1017 pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); | 1066 pList = sqlite3ExprListAppend(pParse,pList, Y.pExpr); |
1018 A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0); | 1067 A.pExpr = sqlite3PExpr(pParse, TK_BETWEEN, W.pExpr, 0, 0); |
1019 if( A.pExpr ){ | 1068 if( A.pExpr ){ |
1020 A.pExpr->x.pList = pList; | 1069 A.pExpr->x.pList = pList; |
1021 }else{ | 1070 }else{ |
1022 sqlite3ExprListDelete(pParse->db, pList); | 1071 sqlite3ExprListDelete(pParse->db, pList); |
1023 } | 1072 } |
1024 if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); | 1073 exprNot(pParse, N, &A.pExpr); |
1025 A.zStart = W.zStart; | 1074 A.zStart = W.zStart; |
1026 A.zEnd = Y.zEnd; | 1075 A.zEnd = Y.zEnd; |
1027 } | 1076 } |
1028 %ifndef SQLITE_OMIT_SUBQUERY | 1077 %ifndef SQLITE_OMIT_SUBQUERY |
1029 %type in_op {int} | 1078 %type in_op {int} |
1030 in_op(A) ::= IN. {A = 0;} | 1079 in_op(A) ::= IN. {A = 0;} |
1031 in_op(A) ::= NOT IN. {A = 1;} | 1080 in_op(A) ::= NOT IN. {A = 1;} |
1032 expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { | 1081 expr(A) ::= expr(X) in_op(N) LP exprlist(Y) RP(E). [IN] { |
1033 if( Y==0 ){ | 1082 if( Y==0 ){ |
1034 /* Expressions of the form | 1083 /* Expressions of the form |
(...skipping 30 matching lines...) Expand all Loading... |
1065 ** before now and control would have never reached this point */ | 1114 ** before now and control would have never reached this point */ |
1066 if( ALWAYS(pRHS) ){ | 1115 if( ALWAYS(pRHS) ){ |
1067 pRHS->flags &= ~EP_Collate; | 1116 pRHS->flags &= ~EP_Collate; |
1068 pRHS->flags |= EP_Generic; | 1117 pRHS->flags |= EP_Generic; |
1069 } | 1118 } |
1070 A.pExpr = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, X.pExpr, pRHS, 0); | 1119 A.pExpr = sqlite3PExpr(pParse, N ? TK_NE : TK_EQ, X.pExpr, pRHS, 0); |
1071 }else{ | 1120 }else{ |
1072 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); | 1121 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); |
1073 if( A.pExpr ){ | 1122 if( A.pExpr ){ |
1074 A.pExpr->x.pList = Y; | 1123 A.pExpr->x.pList = Y; |
1075 sqlite3ExprSetHeight(pParse, A.pExpr); | 1124 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); |
1076 }else{ | 1125 }else{ |
1077 sqlite3ExprListDelete(pParse->db, Y); | 1126 sqlite3ExprListDelete(pParse->db, Y); |
1078 } | 1127 } |
1079 if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); | 1128 exprNot(pParse, N, &A.pExpr); |
1080 } | 1129 } |
1081 A.zStart = X.zStart; | 1130 A.zStart = X.zStart; |
1082 A.zEnd = &E.z[E.n]; | 1131 A.zEnd = &E.z[E.n]; |
1083 } | 1132 } |
1084 expr(A) ::= LP(B) select(X) RP(E). { | 1133 expr(A) ::= LP(B) select(X) RP(E). { |
1085 A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); | 1134 A.pExpr = sqlite3PExpr(pParse, TK_SELECT, 0, 0, 0); |
1086 if( A.pExpr ){ | 1135 if( A.pExpr ){ |
1087 A.pExpr->x.pSelect = X; | 1136 A.pExpr->x.pSelect = X; |
1088 ExprSetProperty(A.pExpr, EP_xIsSelect); | 1137 ExprSetProperty(A.pExpr, EP_xIsSelect|EP_Subquery); |
1089 sqlite3ExprSetHeight(pParse, A.pExpr); | 1138 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); |
1090 }else{ | 1139 }else{ |
1091 sqlite3SelectDelete(pParse->db, X); | 1140 sqlite3SelectDelete(pParse->db, X); |
1092 } | 1141 } |
1093 A.zStart = B.z; | 1142 A.zStart = B.z; |
1094 A.zEnd = &E.z[E.n]; | 1143 A.zEnd = &E.z[E.n]; |
1095 } | 1144 } |
1096 expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { | 1145 expr(A) ::= expr(X) in_op(N) LP select(Y) RP(E). [IN] { |
1097 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); | 1146 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); |
1098 if( A.pExpr ){ | 1147 if( A.pExpr ){ |
1099 A.pExpr->x.pSelect = Y; | 1148 A.pExpr->x.pSelect = Y; |
1100 ExprSetProperty(A.pExpr, EP_xIsSelect); | 1149 ExprSetProperty(A.pExpr, EP_xIsSelect|EP_Subquery); |
1101 sqlite3ExprSetHeight(pParse, A.pExpr); | 1150 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); |
1102 }else{ | 1151 }else{ |
1103 sqlite3SelectDelete(pParse->db, Y); | 1152 sqlite3SelectDelete(pParse->db, Y); |
1104 } | 1153 } |
1105 if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); | 1154 exprNot(pParse, N, &A.pExpr); |
1106 A.zStart = X.zStart; | 1155 A.zStart = X.zStart; |
1107 A.zEnd = &E.z[E.n]; | 1156 A.zEnd = &E.z[E.n]; |
1108 } | 1157 } |
1109 expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { | 1158 expr(A) ::= expr(X) in_op(N) nm(Y) dbnm(Z). [IN] { |
1110 SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); | 1159 SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); |
1111 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); | 1160 A.pExpr = sqlite3PExpr(pParse, TK_IN, X.pExpr, 0, 0); |
1112 if( A.pExpr ){ | 1161 if( A.pExpr ){ |
1113 A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); | 1162 A.pExpr->x.pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0,0); |
1114 ExprSetProperty(A.pExpr, EP_xIsSelect); | 1163 ExprSetProperty(A.pExpr, EP_xIsSelect|EP_Subquery); |
1115 sqlite3ExprSetHeight(pParse, A.pExpr); | 1164 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); |
1116 }else{ | 1165 }else{ |
1117 sqlite3SrcListDelete(pParse->db, pSrc); | 1166 sqlite3SrcListDelete(pParse->db, pSrc); |
1118 } | 1167 } |
1119 if( N ) A.pExpr = sqlite3PExpr(pParse, TK_NOT, A.pExpr, 0, 0); | 1168 exprNot(pParse, N, &A.pExpr); |
1120 A.zStart = X.zStart; | 1169 A.zStart = X.zStart; |
1121 A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; | 1170 A.zEnd = Z.z ? &Z.z[Z.n] : &Y.z[Y.n]; |
1122 } | 1171 } |
1123 expr(A) ::= EXISTS(B) LP select(Y) RP(E). { | 1172 expr(A) ::= EXISTS(B) LP select(Y) RP(E). { |
1124 Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); | 1173 Expr *p = A.pExpr = sqlite3PExpr(pParse, TK_EXISTS, 0, 0, 0); |
1125 if( p ){ | 1174 if( p ){ |
1126 p->x.pSelect = Y; | 1175 p->x.pSelect = Y; |
1127 ExprSetProperty(p, EP_xIsSelect); | 1176 ExprSetProperty(p, EP_xIsSelect|EP_Subquery); |
1128 sqlite3ExprSetHeight(pParse, p); | 1177 sqlite3ExprSetHeightAndFlags(pParse, p); |
1129 }else{ | 1178 }else{ |
1130 sqlite3SelectDelete(pParse->db, Y); | 1179 sqlite3SelectDelete(pParse->db, Y); |
1131 } | 1180 } |
1132 A.zStart = B.z; | 1181 A.zStart = B.z; |
1133 A.zEnd = &E.z[E.n]; | 1182 A.zEnd = &E.z[E.n]; |
1134 } | 1183 } |
1135 %endif SQLITE_OMIT_SUBQUERY | 1184 %endif SQLITE_OMIT_SUBQUERY |
1136 | 1185 |
1137 /* CASE expressions */ | 1186 /* CASE expressions */ |
1138 expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { | 1187 expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). { |
1139 A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0, 0); | 1188 A.pExpr = sqlite3PExpr(pParse, TK_CASE, X, 0, 0); |
1140 if( A.pExpr ){ | 1189 if( A.pExpr ){ |
1141 A.pExpr->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y; | 1190 A.pExpr->x.pList = Z ? sqlite3ExprListAppend(pParse,Y,Z) : Y; |
1142 sqlite3ExprSetHeight(pParse, A.pExpr); | 1191 sqlite3ExprSetHeightAndFlags(pParse, A.pExpr); |
1143 }else{ | 1192 }else{ |
1144 sqlite3ExprListDelete(pParse->db, Y); | 1193 sqlite3ExprListDelete(pParse->db, Y); |
1145 sqlite3ExprDelete(pParse->db, Z); | 1194 sqlite3ExprDelete(pParse->db, Z); |
1146 } | 1195 } |
1147 A.zStart = C.z; | 1196 A.zStart = C.z; |
1148 A.zEnd = &E.z[E.n]; | 1197 A.zEnd = &E.z[E.n]; |
1149 } | 1198 } |
1150 %type case_exprlist {ExprList*} | 1199 %type case_exprlist {ExprList*} |
1151 %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} | 1200 %destructor case_exprlist {sqlite3ExprListDelete(pParse->db, $$);} |
1152 case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { | 1201 case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). { |
(...skipping 22 matching lines...) Expand all Loading... |
1175 exprlist(A) ::= . {A = 0;} | 1224 exprlist(A) ::= . {A = 0;} |
1176 nexprlist(A) ::= nexprlist(X) COMMA expr(Y). | 1225 nexprlist(A) ::= nexprlist(X) COMMA expr(Y). |
1177 {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} | 1226 {A = sqlite3ExprListAppend(pParse,X,Y.pExpr);} |
1178 nexprlist(A) ::= expr(Y). | 1227 nexprlist(A) ::= expr(Y). |
1179 {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);} | 1228 {A = sqlite3ExprListAppend(pParse,0,Y.pExpr);} |
1180 | 1229 |
1181 | 1230 |
1182 ///////////////////////////// The CREATE INDEX command /////////////////////// | 1231 ///////////////////////////// The CREATE INDEX command /////////////////////// |
1183 // | 1232 // |
1184 cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) | 1233 cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) |
1185 ON nm(Y) LP idxlist(Z) RP where_opt(W). { | 1234 ON nm(Y) LP sortlist(Z) RP where_opt(W). { |
1186 sqlite3CreateIndex(pParse, &X, &D, | 1235 sqlite3CreateIndex(pParse, &X, &D, |
1187 sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, | 1236 sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, |
1188 &S, W, SQLITE_SO_ASC, NE); | 1237 &S, W, SQLITE_SO_ASC, NE); |
1189 } | 1238 } |
1190 | 1239 |
1191 %type uniqueflag {int} | 1240 %type uniqueflag {int} |
1192 uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} | 1241 uniqueflag(A) ::= UNIQUE. {A = OE_Abort;} |
1193 uniqueflag(A) ::= . {A = OE_None;} | 1242 uniqueflag(A) ::= . {A = OE_None;} |
1194 | 1243 |
1195 %type idxlist {ExprList*} | |
1196 %destructor idxlist {sqlite3ExprListDelete(pParse->db, $$);} | |
1197 %type idxlist_opt {ExprList*} | |
1198 %destructor idxlist_opt {sqlite3ExprListDelete(pParse->db, $$);} | |
1199 | 1244 |
1200 idxlist_opt(A) ::= . {A = 0;} | 1245 // The eidlist non-terminal (Expression Id List) generates an ExprList |
1201 idxlist_opt(A) ::= LP idxlist(X) RP. {A = X;} | 1246 // from a list of identifiers. The identifier names are in ExprList.a[].zName. |
1202 idxlist(A) ::= idxlist(X) COMMA nm(Y) collate(C) sortorder(Z). { | 1247 // This list is stored in an ExprList rather than an IdList so that it |
1203 Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &C, 1); | 1248 // can be easily sent to sqlite3ColumnsExprList(). |
1204 A = sqlite3ExprListAppend(pParse,X, p); | 1249 // |
1205 sqlite3ExprListSetName(pParse,A,&Y,1); | 1250 // eidlist is grouped with CREATE INDEX because it used to be the non-terminal |
1206 sqlite3ExprListCheckLength(pParse, A, "index"); | 1251 // used for the arguments to an index. That is just an historical accident. |
1207 if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; | 1252 // |
| 1253 // IMPORTANT COMPATIBILITY NOTE: Some prior versions of SQLite accepted |
| 1254 // COLLATE clauses and ASC or DESC keywords on ID lists in inappropriate |
| 1255 // places - places that might have been stored in the sqlite_master schema. |
| 1256 // Those extra features were ignored. But because they might be in some |
| 1257 // (busted) old databases, we need to continue parsing them when loading |
| 1258 // historical schemas. |
| 1259 // |
| 1260 %type eidlist {ExprList*} |
| 1261 %destructor eidlist {sqlite3ExprListDelete(pParse->db, $$);} |
| 1262 %type eidlist_opt {ExprList*} |
| 1263 %destructor eidlist_opt {sqlite3ExprListDelete(pParse->db, $$);} |
| 1264 |
| 1265 %include { |
| 1266 /* Add a single new term to an ExprList that is used to store a |
| 1267 ** list of identifiers. Report an error if the ID list contains |
| 1268 ** a COLLATE clause or an ASC or DESC keyword, except ignore the |
| 1269 ** error while parsing a legacy schema. |
| 1270 */ |
| 1271 static ExprList *parserAddExprIdListTerm( |
| 1272 Parse *pParse, |
| 1273 ExprList *pPrior, |
| 1274 Token *pIdToken, |
| 1275 int hasCollate, |
| 1276 int sortOrder |
| 1277 ){ |
| 1278 ExprList *p = sqlite3ExprListAppend(pParse, pPrior, 0); |
| 1279 if( (hasCollate || sortOrder!=SQLITE_SO_UNDEFINED) |
| 1280 && pParse->db->init.busy==0 |
| 1281 ){ |
| 1282 sqlite3ErrorMsg(pParse, "syntax error after column name \"%.*s\"", |
| 1283 pIdToken->n, pIdToken->z); |
| 1284 } |
| 1285 sqlite3ExprListSetName(pParse, p, pIdToken, 1); |
| 1286 return p; |
| 1287 } |
| 1288 } // end %include |
| 1289 |
| 1290 eidlist_opt(A) ::= . {A = 0;} |
| 1291 eidlist_opt(A) ::= LP eidlist(X) RP. {A = X;} |
| 1292 eidlist(A) ::= eidlist(X) COMMA nm(Y) collate(C) sortorder(Z). { |
| 1293 A = parserAddExprIdListTerm(pParse, X, &Y, C, Z); |
1208 } | 1294 } |
1209 idxlist(A) ::= nm(Y) collate(C) sortorder(Z). { | 1295 eidlist(A) ::= nm(Y) collate(C) sortorder(Z). { |
1210 Expr *p = sqlite3ExprAddCollateToken(pParse, 0, &C, 1); | 1296 A = parserAddExprIdListTerm(pParse, 0, &Y, C, Z); |
1211 A = sqlite3ExprListAppend(pParse,0, p); | |
1212 sqlite3ExprListSetName(pParse, A, &Y, 1); | |
1213 sqlite3ExprListCheckLength(pParse, A, "index"); | |
1214 if( A ) A->a[A->nExpr-1].sortOrder = (u8)Z; | |
1215 } | 1297 } |
1216 | 1298 |
1217 %type collate {Token} | 1299 %type collate {int} |
1218 collate(C) ::= . {C.z = 0; C.n = 0;} | 1300 collate(C) ::= . {C = 0;} |
1219 collate(C) ::= COLLATE ids(X). {C = X;} | 1301 collate(C) ::= COLLATE ids. {C = 1;} |
1220 | 1302 |
1221 | 1303 |
1222 ///////////////////////////// The DROP INDEX command ///////////////////////// | 1304 ///////////////////////////// The DROP INDEX command ///////////////////////// |
1223 // | 1305 // |
1224 cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} | 1306 cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} |
1225 | 1307 |
1226 ///////////////////////////// The VACUUM command ///////////////////////////// | 1308 ///////////////////////////// The VACUUM command ///////////////////////////// |
1227 // | 1309 // |
1228 %ifndef SQLITE_OMIT_VACUUM | 1310 %ifndef SQLITE_OMIT_VACUUM |
1229 %ifndef SQLITE_OMIT_ATTACH | 1311 %ifndef SQLITE_OMIT_ATTACH |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1337 | 1419 |
1338 | 1420 |
1339 %type trigger_cmd {TriggerStep*} | 1421 %type trigger_cmd {TriggerStep*} |
1340 %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} | 1422 %destructor trigger_cmd {sqlite3DeleteTriggerStep(pParse->db, $$);} |
1341 // UPDATE | 1423 // UPDATE |
1342 trigger_cmd(A) ::= | 1424 trigger_cmd(A) ::= |
1343 UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z). | 1425 UPDATE orconf(R) trnm(X) tridxby SET setlist(Y) where_opt(Z). |
1344 { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } | 1426 { A = sqlite3TriggerUpdateStep(pParse->db, &X, Y, Z, R); } |
1345 | 1427 |
1346 // INSERT | 1428 // INSERT |
1347 trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) inscollist_opt(F) select(S). | 1429 trigger_cmd(A) ::= insert_cmd(R) INTO trnm(X) idlist_opt(F) select(S). |
1348 {A = sqlite3TriggerInsertStep(pParse->db, &X, F, S, R);} | 1430 {A = sqlite3TriggerInsertStep(pParse->db, &X, F, S, R);} |
1349 | 1431 |
1350 // DELETE | 1432 // DELETE |
1351 trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y). | 1433 trigger_cmd(A) ::= DELETE FROM trnm(X) tridxby where_opt(Y). |
1352 {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} | 1434 {A = sqlite3TriggerDeleteStep(pParse->db, &X, Y);} |
1353 | 1435 |
1354 // SELECT | 1436 // SELECT |
1355 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } | 1437 trigger_cmd(A) ::= select(X). {A = sqlite3TriggerSelectStep(pParse->db, X); } |
1356 | 1438 |
1357 // The special RAISE expression that may occur in trigger programs | 1439 // The special RAISE expression that may occur in trigger programs |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1457 %type with {With*} | 1539 %type with {With*} |
1458 %type wqlist {With*} | 1540 %type wqlist {With*} |
1459 %destructor with {sqlite3WithDelete(pParse->db, $$);} | 1541 %destructor with {sqlite3WithDelete(pParse->db, $$);} |
1460 %destructor wqlist {sqlite3WithDelete(pParse->db, $$);} | 1542 %destructor wqlist {sqlite3WithDelete(pParse->db, $$);} |
1461 | 1543 |
1462 with(A) ::= . {A = 0;} | 1544 with(A) ::= . {A = 0;} |
1463 %ifndef SQLITE_OMIT_CTE | 1545 %ifndef SQLITE_OMIT_CTE |
1464 with(A) ::= WITH wqlist(W). { A = W; } | 1546 with(A) ::= WITH wqlist(W). { A = W; } |
1465 with(A) ::= WITH RECURSIVE wqlist(W). { A = W; } | 1547 with(A) ::= WITH RECURSIVE wqlist(W). { A = W; } |
1466 | 1548 |
1467 wqlist(A) ::= nm(X) idxlist_opt(Y) AS LP select(Z) RP. { | 1549 wqlist(A) ::= nm(X) eidlist_opt(Y) AS LP select(Z) RP. { |
1468 A = sqlite3WithAdd(pParse, 0, &X, Y, Z); | 1550 A = sqlite3WithAdd(pParse, 0, &X, Y, Z); |
1469 } | 1551 } |
1470 wqlist(A) ::= wqlist(W) COMMA nm(X) idxlist_opt(Y) AS LP select(Z) RP. { | 1552 wqlist(A) ::= wqlist(W) COMMA nm(X) eidlist_opt(Y) AS LP select(Z) RP. { |
1471 A = sqlite3WithAdd(pParse, W, &X, Y, Z); | 1553 A = sqlite3WithAdd(pParse, W, &X, Y, Z); |
1472 } | 1554 } |
1473 %endif SQLITE_OMIT_CTE | 1555 %endif SQLITE_OMIT_CTE |
OLD | NEW |