xref: /sqlite-3.40.0/src/parse.y (revision d5feede1)
1348784efSdrh /*
2b19a2bc6Sdrh ** 2001 September 15
3348784efSdrh **
4b19a2bc6Sdrh ** The author disclaims copyright to this source code.  In place of
5b19a2bc6Sdrh ** a legal notice, here is a blessing:
6348784efSdrh **
7b19a2bc6Sdrh **    May you do good and not evil.
8b19a2bc6Sdrh **    May you find forgiveness for yourself and forgive others.
9b19a2bc6Sdrh **    May you share freely, never taking more than you give.
10348784efSdrh **
11348784efSdrh *************************************************************************
12348784efSdrh ** This file contains SQLite's grammar for SQL.  Process this file
13348784efSdrh ** using the lemon parser generator to generate C code that runs
14348784efSdrh ** the parser.  Lemon will also generate a header file containing
15348784efSdrh ** numeric codes for all of the tokens.
16348784efSdrh **
17*d5feede1Sdrh ** @(#) $Id: parse.y,v 1.63 2002/05/08 21:46:15 drh Exp $
18348784efSdrh */
19348784efSdrh %token_prefix TK_
20348784efSdrh %token_type {Token}
21f57b14a6Sdrh %default_type {Token}
22348784efSdrh %extra_argument {Parse *pParse}
23348784efSdrh %syntax_error {
24c837e709Sdrh   sqliteSetString(&pParse->zErrMsg,"syntax error",0);
25348784efSdrh   pParse->sErrToken = TOKEN;
26348784efSdrh }
27348784efSdrh %name sqliteParser
28348784efSdrh %include {
29348784efSdrh #include "sqliteInt.h"
30348784efSdrh #include "parse.h"
319bbca4c1Sdrh 
329bbca4c1Sdrh /*
339bbca4c1Sdrh ** A structure for holding two integers
349bbca4c1Sdrh */
359bbca4c1Sdrh struct twoint { int a,b; };
36348784efSdrh }
37348784efSdrh 
38348784efSdrh // These are extra tokens used by the lexer but never seen by the
39348784efSdrh // parser.  We put them in a rule so that the parser generator will
406206d50aSdrh // add them to the parse.h output file.
41348784efSdrh //
42c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
43c4a3c779Sdrh           COLUMN AGG_FUNCTION.
44c4a3c779Sdrh 
45c4a3c779Sdrh // Input is zero or more commands.
46c4a3c779Sdrh input ::= cmdlist.
47348784efSdrh 
48348784efSdrh // A list of commands is zero or more commands
49348784efSdrh //
50348784efSdrh cmdlist ::= ecmd.
51094b2bbfSdrh cmdlist ::= cmdlist ecmd.
52094b2bbfSdrh ecmd ::= explain cmd SEMI.  {sqliteExec(pParse);}
53094b2bbfSdrh ecmd ::= cmd SEMI.          {sqliteExec(pParse);}
54094b2bbfSdrh ecmd ::= SEMI.
55348784efSdrh explain ::= EXPLAIN.    {pParse->explain = 1;}
56348784efSdrh 
57382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
58c4a3c779Sdrh //
59fa86c412Sdrh 
600d65dc0eSdrh cmd ::= BEGIN trans_opt onconf(R).  {sqliteBeginTransaction(pParse,R);}
61c4a3c779Sdrh trans_opt ::= .
62c4a3c779Sdrh trans_opt ::= TRANSACTION.
63c4a3c779Sdrh trans_opt ::= TRANSACTION ids.
64c4a3c779Sdrh cmd ::= COMMIT trans_opt.      {sqliteCommitTransaction(pParse);}
65c4a3c779Sdrh cmd ::= END trans_opt.         {sqliteCommitTransaction(pParse);}
66c4a3c779Sdrh cmd ::= ROLLBACK trans_opt.    {sqliteRollbackTransaction(pParse);}
67c4a3c779Sdrh 
68382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
69348784efSdrh //
70348784efSdrh cmd ::= create_table create_table_args.
71969fa7c1Sdrh create_table ::= CREATE(X) temp(T) TABLE ids(Y). {
72969fa7c1Sdrh    sqliteStartTable(pParse,&X,&Y,T);
73969fa7c1Sdrh }
74f57b3399Sdrh %type temp {int}
75f57b3399Sdrh temp(A) ::= TEMP.  {A = 1;}
76f57b3399Sdrh temp(A) ::= .      {A = 0;}
77969fa7c1Sdrh create_table_args ::= LP columnlist conslist_opt RP(X). {
78969fa7c1Sdrh   sqliteEndTable(pParse,&X,0);
79969fa7c1Sdrh }
80969fa7c1Sdrh create_table_args ::= AS select(S). {
81969fa7c1Sdrh   sqliteEndTable(pParse,0,S);
82969fa7c1Sdrh   sqliteSelectDelete(S);
83969fa7c1Sdrh }
84348784efSdrh columnlist ::= columnlist COMMA column.
85348784efSdrh columnlist ::= column.
86348784efSdrh 
87348784efSdrh // About the only information used for a column is the name of the
88348784efSdrh // column.  The type is always just "text".  But the code will accept
89348784efSdrh // an elaborate typename.  Perhaps someday we'll do something with it.
90348784efSdrh //
91348784efSdrh column ::= columnid type carglist.
92c4a3c779Sdrh columnid ::= ids(X).                {sqliteAddColumn(pParse,&X);}
93c4a3c779Sdrh 
94c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
95c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
96382c0247Sdrh // We also make DESC and identifier since it comes up so often (as
97382c0247Sdrh // an abbreviation of "description").
98c4a3c779Sdrh //
99982cef7eSdrh %type id {Token}
1009cfcf5d4Sdrh id(A) ::= ABORT(X).      {A = X;}
101f18543caSdrh id(A) ::= ASC(X).        {A = X;}
102f18543caSdrh id(A) ::= BEGIN(X).      {A = X;}
103f18543caSdrh id(A) ::= CLUSTER(X).    {A = X;}
1049cfcf5d4Sdrh id(A) ::= CONFLICT(X).   {A = X;}
105f18543caSdrh id(A) ::= COPY(X).       {A = X;}
106f18543caSdrh id(A) ::= DELIMITERS(X). {A = X;}
107f18543caSdrh id(A) ::= DESC(X).       {A = X;}
108f18543caSdrh id(A) ::= END(X).        {A = X;}
109f18543caSdrh id(A) ::= EXPLAIN(X).    {A = X;}
110f18543caSdrh id(A) ::= FAIL(X).       {A = X;}
111f18543caSdrh id(A) ::= ID(X).         {A = X;}
112f18543caSdrh id(A) ::= IGNORE(X).     {A = X;}
113f18543caSdrh id(A) ::= KEY(X).        {A = X;}
114f18543caSdrh id(A) ::= OFFSET(X).     {A = X;}
115f18543caSdrh id(A) ::= PRAGMA(X).     {A = X;}
116f18543caSdrh id(A) ::= REPLACE(X).    {A = X;}
117f18543caSdrh id(A) ::= TEMP(X).       {A = X;}
118f18543caSdrh id(A) ::= VACUUM(X).     {A = X;}
119f18543caSdrh id(A) ::= VIEW(X).       {A = X;}
120c4a3c779Sdrh 
121c4a3c779Sdrh // And "ids" is an identifer-or-string.
122c4a3c779Sdrh //
123c4a3c779Sdrh %type ids {Token}
124c4a3c779Sdrh ids(A) ::= id(X).        {A = X;}
125c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
126c4a3c779Sdrh 
127382c0247Sdrh type ::= .
128382c0247Sdrh type ::= typename(X).                    {sqliteAddColumnType(pParse,&X,&X);}
129382c0247Sdrh type ::= typename(X) LP signed RP(Y).    {sqliteAddColumnType(pParse,&X,&Y);}
130382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
131382c0247Sdrh                                          {sqliteAddColumnType(pParse,&X,&Y);}
132382c0247Sdrh %type typename {Token}
133382c0247Sdrh typename(A) ::= ids(X).           {A = X;}
134382c0247Sdrh typename(A) ::= typename(X) ids.  {A = X;}
135348784efSdrh signed ::= INTEGER.
136348784efSdrh signed ::= PLUS INTEGER.
137348784efSdrh signed ::= MINUS INTEGER.
138348784efSdrh carglist ::= carglist carg.
139348784efSdrh carglist ::= .
140c4a3c779Sdrh carg ::= CONSTRAINT ids ccons.
141348784efSdrh carg ::= ccons.
1427020f651Sdrh carg ::= DEFAULT STRING(X).          {sqliteAddDefaultValue(pParse,&X,0);}
1437020f651Sdrh carg ::= DEFAULT ID(X).              {sqliteAddDefaultValue(pParse,&X,0);}
1447020f651Sdrh carg ::= DEFAULT INTEGER(X).         {sqliteAddDefaultValue(pParse,&X,0);}
1457020f651Sdrh carg ::= DEFAULT PLUS INTEGER(X).    {sqliteAddDefaultValue(pParse,&X,0);}
1467020f651Sdrh carg ::= DEFAULT MINUS INTEGER(X).   {sqliteAddDefaultValue(pParse,&X,1);}
1477020f651Sdrh carg ::= DEFAULT FLOAT(X).           {sqliteAddDefaultValue(pParse,&X,0);}
1487020f651Sdrh carg ::= DEFAULT PLUS FLOAT(X).      {sqliteAddDefaultValue(pParse,&X,0);}
1497020f651Sdrh carg ::= DEFAULT MINUS FLOAT(X).     {sqliteAddDefaultValue(pParse,&X,1);}
1507020f651Sdrh carg ::= DEFAULT NULL.
151348784efSdrh 
152382c0247Sdrh // In addition to the type name, we also care about the primary key and
153382c0247Sdrh // UNIQUE constraints.
154348784efSdrh //
1559cfcf5d4Sdrh ccons ::= NOT NULL onconf(R).               {sqliteAddNotNull(pParse, R);}
1569cfcf5d4Sdrh ccons ::= PRIMARY KEY sortorder onconf(R).  {sqliteAddPrimaryKey(pParse,0,R);}
1579cfcf5d4Sdrh ccons ::= UNIQUE onconf(R).            {sqliteCreateIndex(pParse,0,0,0,R,0,0);}
1589cfcf5d4Sdrh ccons ::= CHECK LP expr RP onconf.
159348784efSdrh 
160348784efSdrh // For the time being, the only constraint we care about is the primary
161382c0247Sdrh // key and UNIQUE.  Both create indices.
162348784efSdrh //
163348784efSdrh conslist_opt ::= .
164348784efSdrh conslist_opt ::= COMMA conslist.
165348784efSdrh conslist ::= conslist COMMA tcons.
166a2e1bb5aSdrh conslist ::= conslist tcons.
167348784efSdrh conslist ::= tcons.
168c4a3c779Sdrh tcons ::= CONSTRAINT ids.
1699cfcf5d4Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP onconf(R).
1709cfcf5d4Sdrh                                              {sqliteAddPrimaryKey(pParse,X,R);}
1719cfcf5d4Sdrh tcons ::= UNIQUE LP idxlist(X) RP onconf(R).
1729cfcf5d4Sdrh                                        {sqliteCreateIndex(pParse,0,0,X,R,0,0);}
1739cfcf5d4Sdrh tcons ::= CHECK expr onconf.
1749cfcf5d4Sdrh 
1759cfcf5d4Sdrh // The following is a non-standard extension that allows us to declare the
1769cfcf5d4Sdrh // default behavior when there is a constraint conflict.
1779cfcf5d4Sdrh //
1789cfcf5d4Sdrh %type onconf {int}
1791c92853dSdrh %type orconf {int}
1801c92853dSdrh %type resolvetype {int}
1811c92853dSdrh onconf(A) ::= .                              { A = OE_Default; }
1821c92853dSdrh onconf(A) ::= ON CONFLICT resolvetype(X).    { A = X; }
1831c92853dSdrh orconf(A) ::= .                              { A = OE_Default; }
1841c92853dSdrh orconf(A) ::= OR resolvetype(X).             { A = X; }
1851c92853dSdrh resolvetype(A) ::= ROLLBACK.                 { A = OE_Rollback; }
1861c92853dSdrh resolvetype(A) ::= ABORT.                    { A = OE_Abort; }
1871c92853dSdrh resolvetype(A) ::= FAIL.                     { A = OE_Fail; }
1881c92853dSdrh resolvetype(A) ::= IGNORE.                   { A = OE_Ignore; }
1891c92853dSdrh resolvetype(A) ::= REPLACE.                  { A = OE_Replace; }
190348784efSdrh 
191382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
192348784efSdrh //
1934ff6dfa7Sdrh cmd ::= DROP TABLE ids(X).          {sqliteDropTable(pParse,&X,0);}
194348784efSdrh 
195a76b5dfcSdrh ///////////////////// The CREATE VIEW statement /////////////////////////////
196a76b5dfcSdrh //
197a76b5dfcSdrh cmd ::= CREATE(X) VIEW ids(Y) AS select(S). {
198a76b5dfcSdrh   sqliteCreateView(pParse, &X, &Y, S);
199a76b5dfcSdrh }
200a76b5dfcSdrh cmd ::= DROP VIEW ids(X). {
2014ff6dfa7Sdrh   sqliteDropTable(pParse, &X, 1);
202a76b5dfcSdrh }
203a76b5dfcSdrh 
204382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
205348784efSdrh //
2069bb61fe7Sdrh cmd ::= select(X).  {
207832508b7Sdrh   sqliteSelect(pParse, X, SRT_Callback, 0, 0, 0, 0);
2089bb61fe7Sdrh   sqliteSelectDelete(X);
2099bb61fe7Sdrh }
210efb7251dSdrh 
2119bb61fe7Sdrh %type select {Select*}
2129bb61fe7Sdrh %destructor select {sqliteSelectDelete($$);}
21382c3d636Sdrh %type oneselect {Select*}
21482c3d636Sdrh %destructor oneselect {sqliteSelectDelete($$);}
2159bb61fe7Sdrh 
21682c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
2170a36c57eSdrh select(A) ::= select(X) multiselect_op(Y) oneselect(Z).  {
218daffd0e5Sdrh   if( Z ){
21982c3d636Sdrh     Z->op = Y;
22082c3d636Sdrh     Z->pPrior = X;
221daffd0e5Sdrh   }
22282c3d636Sdrh   A = Z;
22382c3d636Sdrh }
2240a36c57eSdrh %type multiselect_op {int}
2250a36c57eSdrh multiselect_op(A) ::= UNION.      {A = TK_UNION;}
2260a36c57eSdrh multiselect_op(A) ::= UNION ALL.  {A = TK_ALL;}
2270a36c57eSdrh multiselect_op(A) ::= INTERSECT.  {A = TK_INTERSECT;}
2280a36c57eSdrh multiselect_op(A) ::= EXCEPT.     {A = TK_EXCEPT;}
22982c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
2309bbca4c1Sdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
2319bbca4c1Sdrh   A = sqliteSelectNew(W,X,Y,P,Q,Z,D,L.a,L.b);
2329bb61fe7Sdrh }
2339bb61fe7Sdrh 
2349bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
2359bb61fe7Sdrh // present and false (0) if it is not.
2369bb61fe7Sdrh //
237efb7251dSdrh %type distinct {int}
238efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
239fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
240efb7251dSdrh distinct(A) ::= .           {A = 0;}
241348784efSdrh 
2429bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
2437c917d19Sdrh // values of the SELECT statement.  The "*" in statements like
2447c917d19Sdrh // "SELECT * FROM ..." is encoded as a special expression with an
2457c917d19Sdrh // opcode of TK_ALL.
2469bb61fe7Sdrh //
247348784efSdrh %type selcollist {ExprList*}
248348784efSdrh %destructor selcollist {sqliteExprListDelete($$);}
249348784efSdrh %type sclp {ExprList*}
250348784efSdrh %destructor sclp {sqliteExprListDelete($$);}
251348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
252348784efSdrh sclp(A) ::= .                                {A = 0;}
253348784efSdrh selcollist(A) ::= sclp(P) expr(X).           {A = sqliteExprListAppend(P,X,0);}
254c4a3c779Sdrh selcollist(A) ::= sclp(P) expr(X) as ids(Y). {A = sqliteExprListAppend(P,X,&Y);}
2557c917d19Sdrh selcollist(A) ::= sclp(P) STAR. {
2567c917d19Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_ALL, 0, 0, 0), 0);
2577c917d19Sdrh }
25854473229Sdrh selcollist(A) ::= sclp(P) ids(X) DOT STAR. {
25954473229Sdrh   Expr *pRight = sqliteExpr(TK_ALL, 0, 0, 0);
26054473229Sdrh   Expr *pLeft = sqliteExpr(TK_ID, 0, 0, &X);
26154473229Sdrh   A = sqliteExprListAppend(P, sqliteExpr(TK_DOT, pLeft, pRight, 0), 0);
26254473229Sdrh }
2639bb61fe7Sdrh as ::= .
2649bb61fe7Sdrh as ::= AS.
2659bb61fe7Sdrh 
266348784efSdrh 
267348784efSdrh %type seltablist {IdList*}
268348784efSdrh %destructor seltablist {sqliteIdListDelete($$);}
269348784efSdrh %type stl_prefix {IdList*}
270348784efSdrh %destructor stl_prefix {sqliteIdListDelete($$);}
271348784efSdrh %type from {IdList*}
272348784efSdrh %destructor from {sqliteIdListDelete($$);}
273348784efSdrh 
274bf3a4fa4Sdrh from(A) ::= .                                 {A = sqliteMalloc(sizeof(*A));}
275348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
276348784efSdrh stl_prefix(A) ::= seltablist(X) COMMA.        {A = X;}
277348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
278c4a3c779Sdrh seltablist(A) ::= stl_prefix(X) ids(Y).       {A = sqliteIdListAppend(X,&Y);}
279c4a3c779Sdrh seltablist(A) ::= stl_prefix(X) ids(Y) as ids(Z). {
280c4a3c779Sdrh   A = sqliteIdListAppend(X,&Y);
281c4a3c779Sdrh   sqliteIdListAddAlias(A,&Z);
282c4a3c779Sdrh }
28322f70c32Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP. {
28422f70c32Sdrh   A = sqliteIdListAppend(X,0);
28522f70c32Sdrh   A->a[A->nId-1].pSelect = S;
286*d5feede1Sdrh   if( S->pOrderBy ){
287*d5feede1Sdrh     sqliteExprListDelete(S->pOrderBy);
288*d5feede1Sdrh     S->pOrderBy = 0;
289*d5feede1Sdrh   }
29022f70c32Sdrh }
29122f70c32Sdrh seltablist(A) ::= stl_prefix(X) LP select(S) RP as ids(Z). {
29222f70c32Sdrh   A = sqliteIdListAppend(X,0);
29322f70c32Sdrh   A->a[A->nId-1].pSelect = S;
294*d5feede1Sdrh   if( S->pOrderBy ){
295*d5feede1Sdrh     sqliteExprListDelete(S->pOrderBy);
296*d5feede1Sdrh     S->pOrderBy = 0;
297*d5feede1Sdrh   }
29822f70c32Sdrh   sqliteIdListAddAlias(A,&Z);
29922f70c32Sdrh }
300348784efSdrh 
301348784efSdrh %type orderby_opt {ExprList*}
302348784efSdrh %destructor orderby_opt {sqliteExprListDelete($$);}
303348784efSdrh %type sortlist {ExprList*}
304348784efSdrh %destructor sortlist {sqliteExprListDelete($$);}
305348784efSdrh %type sortitem {Expr*}
306348784efSdrh %destructor sortitem {sqliteExprDelete($$);}
307348784efSdrh 
308348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
309348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
3109bb61fe7Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). {
311348784efSdrh   A = sqliteExprListAppend(X,Y,0);
312daffd0e5Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = Z;  /* 0=ascending, 1=decending */
313348784efSdrh }
3149bb61fe7Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). {
315348784efSdrh   A = sqliteExprListAppend(0,Y,0);
316daffd0e5Sdrh   if( A ) A->a[0].sortOrder = Z;
317348784efSdrh }
318da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
319348784efSdrh 
320348784efSdrh %type sortorder {int}
321348784efSdrh 
322348784efSdrh sortorder(A) ::= ASC.      {A = 0;}
323348784efSdrh sortorder(A) ::= DESC.     {A = 1;}
324348784efSdrh sortorder(A) ::= .         {A = 0;}
325348784efSdrh 
3262282792aSdrh %type groupby_opt {ExprList*}
3272282792aSdrh %destructor groupby_opt {sqliteExprListDelete($$);}
3282282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
3292282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
3302282792aSdrh 
3312282792aSdrh %type having_opt {Expr*}
3322282792aSdrh %destructor having_opt {sqliteExprDelete($$);}
3332282792aSdrh having_opt(A) ::= .                {A = 0;}
3342282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
3352282792aSdrh 
3369bbca4c1Sdrh %type limit_opt {struct twoint}
3379bbca4c1Sdrh limit_opt(A) ::= .                  {A.a = -1; A.b = 0;}
3389bbca4c1Sdrh limit_opt(A) ::= LIMIT INTEGER(X).  {A.a = atoi(X.z); A.b = 0;}
3399bbca4c1Sdrh limit_opt(A) ::= LIMIT INTEGER(X) limit_sep INTEGER(Y).
3409bbca4c1Sdrh                                     {A.a = atoi(X.z); A.b = atoi(Y.z);}
3419bbca4c1Sdrh limit_sep ::= OFFSET.
3429bbca4c1Sdrh limit_sep ::= COMMA.
3439bbca4c1Sdrh 
344382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
345382c0247Sdrh //
346c4a3c779Sdrh cmd ::= DELETE FROM ids(X) where_opt(Y).
347348784efSdrh     {sqliteDeleteFrom(pParse, &X, Y);}
348348784efSdrh 
349348784efSdrh %type where_opt {Expr*}
350348784efSdrh %destructor where_opt {sqliteExprDelete($$);}
351348784efSdrh 
352348784efSdrh where_opt(A) ::= .                    {A = 0;}
353348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
354348784efSdrh 
355348784efSdrh %type setlist {ExprList*}
356348784efSdrh %destructor setlist {sqliteExprListDelete($$);}
357348784efSdrh 
358382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
359382c0247Sdrh //
3601c92853dSdrh cmd ::= UPDATE orconf(R) ids(X) SET setlist(Y) where_opt(Z).
3619cfcf5d4Sdrh     {sqliteUpdate(pParse,&X,Y,Z,R);}
362348784efSdrh 
363c4a3c779Sdrh setlist(A) ::= setlist(Z) COMMA ids(X) EQ expr(Y).
364348784efSdrh     {A = sqliteExprListAppend(Z,Y,&X);}
365c4a3c779Sdrh setlist(A) ::= ids(X) EQ expr(Y).   {A = sqliteExprListAppend(0,Y,&X);}
366348784efSdrh 
367382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
368382c0247Sdrh //
369fa86c412Sdrh cmd ::= insert_cmd(R) INTO ids(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
3709cfcf5d4Sdrh                {sqliteInsert(pParse, &X, Y, 0, F, R);}
371fa86c412Sdrh cmd ::= insert_cmd(R) INTO ids(X) inscollist_opt(F) select(S).
3729cfcf5d4Sdrh                {sqliteInsert(pParse, &X, 0, S, F, R);}
373348784efSdrh 
374fa86c412Sdrh %type insert_cmd {int}
375fa86c412Sdrh insert_cmd(A) ::= INSERT orconf(R).   {A = R;}
376fa86c412Sdrh insert_cmd(A) ::= REPLACE.            {A = OE_Replace;}
377fa86c412Sdrh 
378348784efSdrh 
379348784efSdrh %type itemlist {ExprList*}
380348784efSdrh %destructor itemlist {sqliteExprListDelete($$);}
381348784efSdrh 
382e64e7b20Sdrh itemlist(A) ::= itemlist(X) COMMA expr(Y).  {A = sqliteExprListAppend(X,Y,0);}
383e64e7b20Sdrh itemlist(A) ::= expr(X).                    {A = sqliteExprListAppend(0,X,0);}
384348784efSdrh 
385967e8b73Sdrh %type inscollist_opt {IdList*}
386967e8b73Sdrh %destructor inscollist_opt {sqliteIdListDelete($$);}
387967e8b73Sdrh %type inscollist {IdList*}
388967e8b73Sdrh %destructor inscollist {sqliteIdListDelete($$);}
389348784efSdrh 
390967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
391967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
392c4a3c779Sdrh inscollist(A) ::= inscollist(X) COMMA ids(Y). {A = sqliteIdListAppend(X,&Y);}
393c4a3c779Sdrh inscollist(A) ::= ids(Y).                     {A = sqliteIdListAppend(0,&Y);}
394348784efSdrh 
395382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
396382c0247Sdrh //
397348784efSdrh %left OR.
398348784efSdrh %left AND.
3998be51133Sdrh %right NOT.
400fef5208cSdrh %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN.
401348784efSdrh %left GT GE LT LE.
40281a20f21Sdrh %left BITAND BITOR LSHIFT RSHIFT.
403348784efSdrh %left PLUS MINUS.
404bf4133cbSdrh %left STAR SLASH REM.
4050040077dSdrh %left CONCAT.
40681a20f21Sdrh %right UMINUS BITNOT.
407348784efSdrh 
408348784efSdrh %type expr {Expr*}
409348784efSdrh %destructor expr {sqliteExprDelete($$);}
410348784efSdrh 
411e1b6a5b8Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqliteExprSpan(A,&B,&E);}
412e1b6a5b8Sdrh expr(A) ::= NULL(X).             {A = sqliteExpr(TK_NULL, 0, 0, &X);}
413c4a3c779Sdrh expr(A) ::= id(X).               {A = sqliteExpr(TK_ID, 0, 0, &X);}
414c4a3c779Sdrh expr(A) ::= ids(X) DOT ids(Y). {
415e1b6a5b8Sdrh   Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X);
416348784efSdrh   Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y);
417e1b6a5b8Sdrh   A = sqliteExpr(TK_DOT, temp1, temp2, 0);
418e1b6a5b8Sdrh }
419348784efSdrh expr(A) ::= INTEGER(X).      {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
420348784efSdrh expr(A) ::= FLOAT(X).        {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
421348784efSdrh expr(A) ::= STRING(X).       {A = sqliteExpr(TK_STRING, 0, 0, &X);}
422e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
423e1b6a5b8Sdrh   A = sqliteExprFunction(Y, &X);
424e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
425e1b6a5b8Sdrh }
426e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
427e1b6a5b8Sdrh   A = sqliteExprFunction(0, &X);
428e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
429e1b6a5b8Sdrh }
430348784efSdrh expr(A) ::= expr(X) AND expr(Y).   {A = sqliteExpr(TK_AND, X, Y, 0);}
431348784efSdrh expr(A) ::= expr(X) OR expr(Y).    {A = sqliteExpr(TK_OR, X, Y, 0);}
432348784efSdrh expr(A) ::= expr(X) LT expr(Y).    {A = sqliteExpr(TK_LT, X, Y, 0);}
433348784efSdrh expr(A) ::= expr(X) GT expr(Y).    {A = sqliteExpr(TK_GT, X, Y, 0);}
434348784efSdrh expr(A) ::= expr(X) LE expr(Y).    {A = sqliteExpr(TK_LE, X, Y, 0);}
435348784efSdrh expr(A) ::= expr(X) GE expr(Y).    {A = sqliteExpr(TK_GE, X, Y, 0);}
436348784efSdrh expr(A) ::= expr(X) NE expr(Y).    {A = sqliteExpr(TK_NE, X, Y, 0);}
437348784efSdrh expr(A) ::= expr(X) EQ expr(Y).    {A = sqliteExpr(TK_EQ, X, Y, 0);}
43881a20f21Sdrh expr(A) ::= expr(X) BITAND expr(Y). {A = sqliteExpr(TK_BITAND, X, Y, 0);}
43981a20f21Sdrh expr(A) ::= expr(X) BITOR expr(Y).  {A = sqliteExpr(TK_BITOR, X, Y, 0);}
44081a20f21Sdrh expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqliteExpr(TK_LSHIFT, X, Y, 0);}
44181a20f21Sdrh expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqliteExpr(TK_RSHIFT, X, Y, 0);}
4420ac65892Sdrh expr(A) ::= expr(X) likeop(OP) expr(Y).  [LIKE]  {
4430ac65892Sdrh   ExprList *pList = sqliteExprListAppend(0, Y, 0);
4440ac65892Sdrh   pList = sqliteExprListAppend(pList, X, 0);
4450ac65892Sdrh   A = sqliteExprFunction(pList, &OP);
4460ac65892Sdrh   sqliteExprSpan(A, &X->span, &Y->span);
4470ac65892Sdrh }
4480ac65892Sdrh expr(A) ::= expr(X) NOT likeop(OP) expr(Y). [LIKE] {
4490ac65892Sdrh   ExprList *pList = sqliteExprListAppend(0, Y, 0);
4500ac65892Sdrh   pList = sqliteExprListAppend(pList, X, 0);
4510ac65892Sdrh   A = sqliteExprFunction(pList, &OP);
4524794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
453e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&Y->span);
4544794b980Sdrh }
4550ac65892Sdrh likeop(A) ::= LIKE(X). {A = X;}
4560ac65892Sdrh likeop(A) ::= GLOB(X). {A = X;}
457348784efSdrh expr(A) ::= expr(X) PLUS expr(Y).  {A = sqliteExpr(TK_PLUS, X, Y, 0);}
458348784efSdrh expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);}
459348784efSdrh expr(A) ::= expr(X) STAR expr(Y).  {A = sqliteExpr(TK_STAR, X, Y, 0);}
460348784efSdrh expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);}
461bf4133cbSdrh expr(A) ::= expr(X) REM expr(Y).   {A = sqliteExpr(TK_REM, X, Y, 0);}
4620040077dSdrh expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);}
463e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
464e1b6a5b8Sdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
465e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
466e1b6a5b8Sdrh }
46733048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
46833048c0bSdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
46933048c0bSdrh   sqliteExprSpan(A,&X->span,&E);
47033048c0bSdrh }
47133048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
47233048c0bSdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
47333048c0bSdrh   sqliteExprSpan(A,&X->span,&E);
47433048c0bSdrh }
475e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
476e1b6a5b8Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
477e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
478e1b6a5b8Sdrh }
47981a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
48081a20f21Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
48181a20f21Sdrh   sqliteExprSpan(A,&X->span,&E);
48281a20f21Sdrh }
483e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
484e1b6a5b8Sdrh   A = sqliteExpr(TK_NOT, X, 0, 0);
485e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
486e1b6a5b8Sdrh }
48781a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
48881a20f21Sdrh   A = sqliteExpr(TK_BITNOT, X, 0, 0);
48981a20f21Sdrh   sqliteExprSpan(A,&B,&X->span);
49081a20f21Sdrh }
491e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
492e1b6a5b8Sdrh   A = sqliteExpr(TK_UMINUS, X, 0, 0);
493e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
494e1b6a5b8Sdrh }
495e1b6a5b8Sdrh expr(A) ::= PLUS(B) expr(X). [UMINUS] {
496e1b6a5b8Sdrh   A = X;
497e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
498e1b6a5b8Sdrh }
499e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
50019a775c2Sdrh   A = sqliteExpr(TK_SELECT, 0, 0, 0);
501daffd0e5Sdrh   if( A ) A->pSelect = X;
502e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&E);
50319a775c2Sdrh }
504fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
505fef5208cSdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
506fef5208cSdrh   pList = sqliteExprListAppend(pList, Y, 0);
507fef5208cSdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
508daffd0e5Sdrh   if( A ) A->pList = pList;
509e1b6a5b8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
510fef5208cSdrh }
5114794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
5124794b980Sdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
5134794b980Sdrh   pList = sqliteExprListAppend(pList, Y, 0);
5144794b980Sdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
515daffd0e5Sdrh   if( A ) A->pList = pList;
5164794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
517e1b6a5b8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
5184794b980Sdrh }
519e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
520fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
521daffd0e5Sdrh   if( A ) A->pList = Y;
522e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
523fef5208cSdrh }
524e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
525fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
526daffd0e5Sdrh   if( A ) A->pSelect = Y;
527e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
528fef5208cSdrh }
529e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
5304794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
531daffd0e5Sdrh   if( A ) A->pList = Y;
5324794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
533e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
5344794b980Sdrh }
535e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
5364794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
537daffd0e5Sdrh   if( A ) A->pSelect = Y;
5384794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
539e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
5404794b980Sdrh }
541fef5208cSdrh 
54217a7f8ddSdrh /* CASE expressions */
54317a7f8ddSdrh expr(A) ::= CASE(C) case_operand(X) case_exprlist(Y) case_else(Z) END(E). {
54417a7f8ddSdrh   A = sqliteExpr(TK_CASE, X, Z, 0);
54517a7f8ddSdrh   if( A ) A->pList = Y;
54617a7f8ddSdrh   sqliteExprSpan(A, &C, &E);
54717a7f8ddSdrh }
54817a7f8ddSdrh %type case_exprlist {ExprList*}
54917a7f8ddSdrh %destructor case_exprlist {sqliteExprListDelete($$);}
55017a7f8ddSdrh case_exprlist(A) ::= case_exprlist(X) WHEN expr(Y) THEN expr(Z). {
55117a7f8ddSdrh   A = sqliteExprListAppend(X, Y, 0);
55217a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
55317a7f8ddSdrh }
55417a7f8ddSdrh case_exprlist(A) ::= WHEN expr(Y) THEN expr(Z). {
55517a7f8ddSdrh   A = sqliteExprListAppend(0, Y, 0);
55617a7f8ddSdrh   A = sqliteExprListAppend(A, Z, 0);
55717a7f8ddSdrh }
55817a7f8ddSdrh %type case_else {Expr*}
55917a7f8ddSdrh case_else(A) ::=  ELSE expr(X).         {A = X;}
56017a7f8ddSdrh case_else(A) ::=  .                     {A = 0;}
56117a7f8ddSdrh %type case_operand {Expr*}
56217a7f8ddSdrh case_operand(A) ::= expr(X).            {A = X;}
56317a7f8ddSdrh case_operand(A) ::= .                   {A = 0;}
564348784efSdrh 
565348784efSdrh %type exprlist {ExprList*}
566348784efSdrh %destructor exprlist {sqliteExprListDelete($$);}
567348784efSdrh %type expritem {Expr*}
568348784efSdrh %destructor expritem {sqliteExprDelete($$);}
569348784efSdrh 
570348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
571348784efSdrh    {A = sqliteExprListAppend(X,Y,0);}
572348784efSdrh exprlist(A) ::= expritem(X).            {A = sqliteExprListAppend(0,X,0);}
573348784efSdrh expritem(A) ::= expr(X).                {A = X;}
574348784efSdrh expritem(A) ::= .                       {A = 0;}
575cce7d176Sdrh 
576382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
577382c0247Sdrh //
5789cfcf5d4Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX ids(X)
5799cfcf5d4Sdrh         ON ids(Y) LP idxlist(Z) RP(E) onconf(R). {
5809cfcf5d4Sdrh   if( U!=OE_None ) U = R;
5819cfcf5d4Sdrh   if( U==OE_Default) U = OE_Abort;
5829cfcf5d4Sdrh   sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E);
5839cfcf5d4Sdrh }
584717e6402Sdrh 
585717e6402Sdrh %type uniqueflag {int}
5869cfcf5d4Sdrh uniqueflag(A) ::= UNIQUE.  { A = OE_Abort; }
5879cfcf5d4Sdrh uniqueflag(A) ::= .        { A = OE_None; }
588348784efSdrh 
589348784efSdrh %type idxlist {IdList*}
590348784efSdrh %destructor idxlist {sqliteIdListDelete($$);}
591348784efSdrh %type idxitem {Token}
592348784efSdrh 
593348784efSdrh idxlist(A) ::= idxlist(X) COMMA idxitem(Y).
594348784efSdrh      {A = sqliteIdListAppend(X,&Y);}
595348784efSdrh idxlist(A) ::= idxitem(Y).
596348784efSdrh      {A = sqliteIdListAppend(0,&Y);}
597c4a3c779Sdrh idxitem(A) ::= ids(X).          {A = X;}
598348784efSdrh 
5998aff1015Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
600382c0247Sdrh //
601382c0247Sdrh 
602c4a3c779Sdrh cmd ::= DROP INDEX ids(X).      {sqliteDropIndex(pParse, &X);}
603982cef7eSdrh 
604382c0247Sdrh 
6058aff1015Sdrh ///////////////////////////// The COPY command ///////////////////////////////
606382c0247Sdrh //
6071c92853dSdrh cmd ::= COPY orconf(R) ids(X) FROM ids(Y) USING DELIMITERS STRING(Z).
608b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,&Z,R);}
6091c92853dSdrh cmd ::= COPY orconf(R) ids(X) FROM ids(Y).
610b419a926Sdrh     {sqliteCopy(pParse,&X,&Y,0,R);}
611dce2cbe6Sdrh 
612382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
613382c0247Sdrh //
614dce2cbe6Sdrh cmd ::= VACUUM.                {sqliteVacuum(pParse,0);}
615c4a3c779Sdrh cmd ::= VACUUM ids(X).         {sqliteVacuum(pParse,&X);}
616f57b14a6Sdrh 
617382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
618382c0247Sdrh //
619f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ids(Y).         {sqlitePragma(pParse,&X,&Y,0);}
620f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ON(Y).          {sqlitePragma(pParse,&X,&Y,0);}
621f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ plus_num(Y).    {sqlitePragma(pParse,&X,&Y,0);}
622f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ minus_num(Y).   {sqlitePragma(pParse,&X,&Y,1);}
623382c0247Sdrh cmd ::= PRAGMA ids(X) LP ids(Y) RP.      {sqlitePragma(pParse,&X,&Y,0);}
624603240cfSdrh cmd ::= PRAGMA ids(X).                   {sqlitePragma(pParse,&X,&X,0);}
625f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
626f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
627f57b14a6Sdrh number(A) ::= INTEGER(X).  {A = X;}
628f57b14a6Sdrh number(A) ::= FLOAT(X).    {A = X;}
629f57b14a6Sdrh plus_opt ::= PLUS.
630f57b14a6Sdrh plus_opt ::= .
631