xref: /sqlite-3.40.0/src/parse.y (revision bf4133cb)
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*bf4133cbSdrh ** @(#) $Id: parse.y,v 1.37 2001/10/13 02:59:09 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"
31348784efSdrh }
32348784efSdrh 
33348784efSdrh // These are extra tokens used by the lexer but never seen by the
34348784efSdrh // parser.  We put them in a rule so that the parser generator will
356206d50aSdrh // add them to the parse.h output file.
36348784efSdrh //
37c4a3c779Sdrh %nonassoc END_OF_FILE ILLEGAL SPACE UNCLOSED_STRING COMMENT FUNCTION
38c4a3c779Sdrh           COLUMN AGG_FUNCTION.
39c4a3c779Sdrh 
40c4a3c779Sdrh // Input is zero or more commands.
41c4a3c779Sdrh input ::= cmdlist.
42348784efSdrh 
43348784efSdrh // A list of commands is zero or more commands
44348784efSdrh //
45348784efSdrh cmdlist ::= ecmd.
46348784efSdrh cmdlist ::= cmdlist SEMI ecmd.
47348784efSdrh ecmd ::= explain cmd.  {sqliteExec(pParse);}
48348784efSdrh ecmd ::= cmd.          {sqliteExec(pParse);}
49348784efSdrh ecmd ::= .
50348784efSdrh explain ::= EXPLAIN.    {pParse->explain = 1;}
51348784efSdrh 
52382c0247Sdrh ///////////////////// Begin and end transactions. ////////////////////////////
53c4a3c779Sdrh //
54c4a3c779Sdrh cmd ::= BEGIN trans_opt.       {sqliteBeginTransaction(pParse);}
55c4a3c779Sdrh trans_opt ::= .
56c4a3c779Sdrh trans_opt ::= TRANSACTION.
57c4a3c779Sdrh trans_opt ::= TRANSACTION ids.
58c4a3c779Sdrh cmd ::= COMMIT trans_opt.      {sqliteCommitTransaction(pParse);}
59c4a3c779Sdrh cmd ::= END trans_opt.         {sqliteCommitTransaction(pParse);}
60c4a3c779Sdrh cmd ::= ROLLBACK trans_opt.    {sqliteRollbackTransaction(pParse);}
61c4a3c779Sdrh 
62382c0247Sdrh ///////////////////// The CREATE TABLE statement ////////////////////////////
63348784efSdrh //
64348784efSdrh cmd ::= create_table create_table_args.
65f57b3399Sdrh create_table ::= CREATE(X) temp(T) TABLE ids(Y).
66f57b3399Sdrh                                            {sqliteStartTable(pParse,&X,&Y,T);}
67f57b3399Sdrh %type temp {int}
68f57b3399Sdrh temp(A) ::= TEMP.  {A = 1;}
69f57b3399Sdrh temp(A) ::= .      {A = 0;}
70348784efSdrh create_table_args ::= LP columnlist conslist_opt RP(X).
71348784efSdrh                                            {sqliteEndTable(pParse,&X);}
72348784efSdrh columnlist ::= columnlist COMMA column.
73348784efSdrh columnlist ::= column.
74348784efSdrh 
75348784efSdrh // About the only information used for a column is the name of the
76348784efSdrh // column.  The type is always just "text".  But the code will accept
77348784efSdrh // an elaborate typename.  Perhaps someday we'll do something with it.
78348784efSdrh //
79348784efSdrh column ::= columnid type carglist.
80c4a3c779Sdrh columnid ::= ids(X).                {sqliteAddColumn(pParse,&X);}
81c4a3c779Sdrh 
82c4a3c779Sdrh // An IDENTIFIER can be a generic identifier, or one of several
83c4a3c779Sdrh // keywords.  Any non-standard keyword can also be an identifier.
84382c0247Sdrh // We also make DESC and identifier since it comes up so often (as
85382c0247Sdrh // an abbreviation of "description").
86c4a3c779Sdrh //
87982cef7eSdrh %type id {Token}
88c4a3c779Sdrh id(A) ::= DESC(X).       {A = X;}
89c4a3c779Sdrh id(A) ::= ASC(X).        {A = X;}
90c4a3c779Sdrh id(A) ::= DELIMITERS(X). {A = X;}
91c4a3c779Sdrh id(A) ::= EXPLAIN(X).    {A = X;}
92c4a3c779Sdrh id(A) ::= VACUUM(X).     {A = X;}
93c4a3c779Sdrh id(A) ::= BEGIN(X).      {A = X;}
94c4a3c779Sdrh id(A) ::= END(X).        {A = X;}
95f57b14a6Sdrh id(A) ::= PRAGMA(X).     {A = X;}
96f57b14a6Sdrh id(A) ::= CLUSTER(X).    {A = X;}
97982cef7eSdrh id(A) ::= ID(X).         {A = X;}
98f57b3399Sdrh id(A) ::= TEMP(X).       {A = X;}
99c4a3c779Sdrh 
100c4a3c779Sdrh // And "ids" is an identifer-or-string.
101c4a3c779Sdrh //
102c4a3c779Sdrh %type ids {Token}
103c4a3c779Sdrh ids(A) ::= id(X).        {A = X;}
104c4a3c779Sdrh ids(A) ::= STRING(X).    {A = X;}
105c4a3c779Sdrh 
106382c0247Sdrh type ::= .
107382c0247Sdrh type ::= typename(X).                    {sqliteAddColumnType(pParse,&X,&X);}
108382c0247Sdrh type ::= typename(X) LP signed RP(Y).    {sqliteAddColumnType(pParse,&X,&Y);}
109382c0247Sdrh type ::= typename(X) LP signed COMMA signed RP(Y).
110382c0247Sdrh                                          {sqliteAddColumnType(pParse,&X,&Y);}
111382c0247Sdrh %type typename {Token}
112382c0247Sdrh typename(A) ::= ids(X).           {A = X;}
113382c0247Sdrh typename(A) ::= typename(X) ids.  {A = X;}
114348784efSdrh signed ::= INTEGER.
115348784efSdrh signed ::= PLUS INTEGER.
116348784efSdrh signed ::= MINUS INTEGER.
117348784efSdrh carglist ::= carglist carg.
118348784efSdrh carglist ::= .
119c4a3c779Sdrh carg ::= CONSTRAINT ids ccons.
120348784efSdrh carg ::= ccons.
1217020f651Sdrh carg ::= DEFAULT STRING(X).          {sqliteAddDefaultValue(pParse,&X,0);}
1227020f651Sdrh carg ::= DEFAULT ID(X).              {sqliteAddDefaultValue(pParse,&X,0);}
1237020f651Sdrh carg ::= DEFAULT INTEGER(X).         {sqliteAddDefaultValue(pParse,&X,0);}
1247020f651Sdrh carg ::= DEFAULT PLUS INTEGER(X).    {sqliteAddDefaultValue(pParse,&X,0);}
1257020f651Sdrh carg ::= DEFAULT MINUS INTEGER(X).   {sqliteAddDefaultValue(pParse,&X,1);}
1267020f651Sdrh carg ::= DEFAULT FLOAT(X).           {sqliteAddDefaultValue(pParse,&X,0);}
1277020f651Sdrh carg ::= DEFAULT PLUS FLOAT(X).      {sqliteAddDefaultValue(pParse,&X,0);}
1287020f651Sdrh carg ::= DEFAULT MINUS FLOAT(X).     {sqliteAddDefaultValue(pParse,&X,1);}
1297020f651Sdrh carg ::= DEFAULT NULL.
130348784efSdrh 
131382c0247Sdrh // In addition to the type name, we also care about the primary key and
132382c0247Sdrh // UNIQUE constraints.
133348784efSdrh //
134382c0247Sdrh ccons ::= NOT NULL.                  {sqliteAddNotNull(pParse);}
135717e6402Sdrh ccons ::= PRIMARY KEY sortorder.     {sqliteCreateIndex(pParse,0,0,0,1,0,0);}
136adbca9cfSdrh ccons ::= UNIQUE.                    {sqliteCreateIndex(pParse,0,0,0,1,0,0);}
1374794b980Sdrh ccons ::= CHECK LP expr RP.
138348784efSdrh 
139348784efSdrh // For the time being, the only constraint we care about is the primary
140382c0247Sdrh // key and UNIQUE.  Both create indices.
141348784efSdrh //
142348784efSdrh conslist_opt ::= .
143348784efSdrh conslist_opt ::= COMMA conslist.
144348784efSdrh conslist ::= conslist COMMA tcons.
145a2e1bb5aSdrh conslist ::= conslist tcons.
146348784efSdrh conslist ::= tcons.
147c4a3c779Sdrh tcons ::= CONSTRAINT ids.
148717e6402Sdrh tcons ::= PRIMARY KEY LP idxlist(X) RP. {sqliteCreateIndex(pParse,0,0,X,1,0,0);}
149adbca9cfSdrh tcons ::= UNIQUE LP idxlist(X) RP.      {sqliteCreateIndex(pParse,0,0,X,1,0,0);}
150a2e1bb5aSdrh tcons ::= CHECK expr.
151348784efSdrh 
152382c0247Sdrh ////////////////////////// The DROP TABLE /////////////////////////////////////
153348784efSdrh //
154c4a3c779Sdrh cmd ::= DROP TABLE ids(X).          {sqliteDropTable(pParse,&X);}
155348784efSdrh 
156382c0247Sdrh //////////////////////// The SELECT statement /////////////////////////////////
157348784efSdrh //
1589bb61fe7Sdrh cmd ::= select(X).  {
159fef5208cSdrh   sqliteSelect(pParse, X, SRT_Callback, 0);
1609bb61fe7Sdrh   sqliteSelectDelete(X);
1619bb61fe7Sdrh }
162efb7251dSdrh 
1639bb61fe7Sdrh %type select {Select*}
1649bb61fe7Sdrh %destructor select {sqliteSelectDelete($$);}
16582c3d636Sdrh %type oneselect {Select*}
16682c3d636Sdrh %destructor oneselect {sqliteSelectDelete($$);}
1679bb61fe7Sdrh 
16882c3d636Sdrh select(A) ::= oneselect(X).                      {A = X;}
16982c3d636Sdrh select(A) ::= select(X) joinop(Y) oneselect(Z).  {
170daffd0e5Sdrh   if( Z ){
17182c3d636Sdrh     Z->op = Y;
17282c3d636Sdrh     Z->pPrior = X;
173daffd0e5Sdrh   }
17482c3d636Sdrh   A = Z;
17582c3d636Sdrh }
17682c3d636Sdrh %type joinop {int}
17782c3d636Sdrh joinop(A) ::= UNION.      {A = TK_UNION;}
17882c3d636Sdrh joinop(A) ::= UNION ALL.  {A = TK_ALL;}
17982c3d636Sdrh joinop(A) ::= INTERSECT.  {A = TK_INTERSECT;}
18082c3d636Sdrh joinop(A) ::= EXCEPT.     {A = TK_EXCEPT;}
18182c3d636Sdrh oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
1822282792aSdrh                  groupby_opt(P) having_opt(Q) orderby_opt(Z). {
1832282792aSdrh   A = sqliteSelectNew(W,X,Y,P,Q,Z,D);
1849bb61fe7Sdrh }
1859bb61fe7Sdrh 
1869bb61fe7Sdrh // The "distinct" nonterminal is true (1) if the DISTINCT keyword is
1879bb61fe7Sdrh // present and false (0) if it is not.
1889bb61fe7Sdrh //
189efb7251dSdrh %type distinct {int}
190efb7251dSdrh distinct(A) ::= DISTINCT.   {A = 1;}
191fef5208cSdrh distinct(A) ::= ALL.        {A = 0;}
192efb7251dSdrh distinct(A) ::= .           {A = 0;}
193348784efSdrh 
1949bb61fe7Sdrh // selcollist is a list of expressions that are to become the return
1959bb61fe7Sdrh // values of the SELECT statement.  In the case of "SELECT * FROM ..."
1969bb61fe7Sdrh // the selcollist value is NULL.
1979bb61fe7Sdrh //
198348784efSdrh %type selcollist {ExprList*}
199348784efSdrh %destructor selcollist {sqliteExprListDelete($$);}
200348784efSdrh %type sclp {ExprList*}
201348784efSdrh %destructor sclp {sqliteExprListDelete($$);}
202348784efSdrh sclp(A) ::= selcollist(X) COMMA.             {A = X;}
203348784efSdrh sclp(A) ::= .                                {A = 0;}
2049bb61fe7Sdrh selcollist(A) ::= STAR.                      {A = 0;}
205348784efSdrh selcollist(A) ::= sclp(P) expr(X).           {A = sqliteExprListAppend(P,X,0);}
206c4a3c779Sdrh selcollist(A) ::= sclp(P) expr(X) as ids(Y). {A = sqliteExprListAppend(P,X,&Y);}
2079bb61fe7Sdrh as ::= .
2089bb61fe7Sdrh as ::= AS.
2099bb61fe7Sdrh 
210348784efSdrh 
211348784efSdrh %type seltablist {IdList*}
212348784efSdrh %destructor seltablist {sqliteIdListDelete($$);}
213348784efSdrh %type stl_prefix {IdList*}
214348784efSdrh %destructor stl_prefix {sqliteIdListDelete($$);}
215348784efSdrh %type from {IdList*}
216348784efSdrh %destructor from {sqliteIdListDelete($$);}
217348784efSdrh 
218348784efSdrh from(A) ::= FROM seltablist(X).               {A = X;}
219348784efSdrh stl_prefix(A) ::= seltablist(X) COMMA.        {A = X;}
220348784efSdrh stl_prefix(A) ::= .                           {A = 0;}
221c4a3c779Sdrh seltablist(A) ::= stl_prefix(X) ids(Y).       {A = sqliteIdListAppend(X,&Y);}
222c4a3c779Sdrh seltablist(A) ::= stl_prefix(X) ids(Y) as ids(Z). {
223c4a3c779Sdrh   A = sqliteIdListAppend(X,&Y);
224c4a3c779Sdrh   sqliteIdListAddAlias(A,&Z);
225c4a3c779Sdrh }
226348784efSdrh 
227348784efSdrh %type orderby_opt {ExprList*}
228348784efSdrh %destructor orderby_opt {sqliteExprListDelete($$);}
229348784efSdrh %type sortlist {ExprList*}
230348784efSdrh %destructor sortlist {sqliteExprListDelete($$);}
231348784efSdrh %type sortitem {Expr*}
232348784efSdrh %destructor sortitem {sqliteExprDelete($$);}
233348784efSdrh 
234348784efSdrh orderby_opt(A) ::= .                          {A = 0;}
235348784efSdrh orderby_opt(A) ::= ORDER BY sortlist(X).      {A = X;}
2369bb61fe7Sdrh sortlist(A) ::= sortlist(X) COMMA sortitem(Y) sortorder(Z). {
237348784efSdrh   A = sqliteExprListAppend(X,Y,0);
238daffd0e5Sdrh   if( A ) A->a[A->nExpr-1].sortOrder = Z;  /* 0=ascending, 1=decending */
239348784efSdrh }
2409bb61fe7Sdrh sortlist(A) ::= sortitem(Y) sortorder(Z). {
241348784efSdrh   A = sqliteExprListAppend(0,Y,0);
242daffd0e5Sdrh   if( A ) A->a[0].sortOrder = Z;
243348784efSdrh }
244da9d6c45Sdrh sortitem(A) ::= expr(X).   {A = X;}
245348784efSdrh 
246348784efSdrh %type sortorder {int}
247348784efSdrh 
248348784efSdrh sortorder(A) ::= ASC.      {A = 0;}
249348784efSdrh sortorder(A) ::= DESC.     {A = 1;}
250348784efSdrh sortorder(A) ::= .         {A = 0;}
251348784efSdrh 
2522282792aSdrh %type groupby_opt {ExprList*}
2532282792aSdrh %destructor groupby_opt {sqliteExprListDelete($$);}
2542282792aSdrh groupby_opt(A) ::= .                      {A = 0;}
2552282792aSdrh groupby_opt(A) ::= GROUP BY exprlist(X).  {A = X;}
2562282792aSdrh 
2572282792aSdrh %type having_opt {Expr*}
2582282792aSdrh %destructor having_opt {sqliteExprDelete($$);}
2592282792aSdrh having_opt(A) ::= .                {A = 0;}
2602282792aSdrh having_opt(A) ::= HAVING expr(X).  {A = X;}
2612282792aSdrh 
262382c0247Sdrh /////////////////////////// The DELETE statement /////////////////////////////
263382c0247Sdrh //
264c4a3c779Sdrh cmd ::= DELETE FROM ids(X) where_opt(Y).
265348784efSdrh     {sqliteDeleteFrom(pParse, &X, Y);}
266348784efSdrh 
267348784efSdrh %type where_opt {Expr*}
268348784efSdrh %destructor where_opt {sqliteExprDelete($$);}
269348784efSdrh 
270348784efSdrh where_opt(A) ::= .                    {A = 0;}
271348784efSdrh where_opt(A) ::= WHERE expr(X).       {A = X;}
272348784efSdrh 
273348784efSdrh %type setlist {ExprList*}
274348784efSdrh %destructor setlist {sqliteExprListDelete($$);}
275348784efSdrh 
276382c0247Sdrh ////////////////////////// The UPDATE command ////////////////////////////////
277382c0247Sdrh //
278c4a3c779Sdrh cmd ::= UPDATE ids(X) SET setlist(Y) where_opt(Z).
279348784efSdrh     {sqliteUpdate(pParse,&X,Y,Z);}
280348784efSdrh 
281c4a3c779Sdrh setlist(A) ::= setlist(Z) COMMA ids(X) EQ expr(Y).
282348784efSdrh     {A = sqliteExprListAppend(Z,Y,&X);}
283c4a3c779Sdrh setlist(A) ::= ids(X) EQ expr(Y).   {A = sqliteExprListAppend(0,Y,&X);}
284348784efSdrh 
285382c0247Sdrh ////////////////////////// The INSERT command /////////////////////////////////
286382c0247Sdrh //
287c4a3c779Sdrh cmd ::= INSERT INTO ids(X) inscollist_opt(F) VALUES LP itemlist(Y) RP.
2885974a30fSdrh                {sqliteInsert(pParse, &X, Y, 0, F);}
289c4a3c779Sdrh cmd ::= INSERT INTO ids(X) inscollist_opt(F) select(S).
2905974a30fSdrh                {sqliteInsert(pParse, &X, 0, S, F);}
291348784efSdrh 
292348784efSdrh 
293348784efSdrh %type itemlist {ExprList*}
294348784efSdrh %destructor itemlist {sqliteExprListDelete($$);}
295348784efSdrh %type item {Expr*}
296348784efSdrh %destructor item {sqliteExprDelete($$);}
297348784efSdrh 
298348784efSdrh itemlist(A) ::= itemlist(X) COMMA item(Y).  {A = sqliteExprListAppend(X,Y,0);}
299348784efSdrh itemlist(A) ::= item(X).     {A = sqliteExprListAppend(0,X,0);}
300348784efSdrh item(A) ::= INTEGER(X).      {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
3017020f651Sdrh item(A) ::= PLUS INTEGER(X). {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
3027020f651Sdrh item(A) ::= MINUS INTEGER(X). {
3036e142f54Sdrh   A = sqliteExpr(TK_UMINUS, 0, 0, 0);
304daffd0e5Sdrh   if( A ) A->pLeft = sqliteExpr(TK_INTEGER, 0, 0, &X);
3057020f651Sdrh }
306348784efSdrh item(A) ::= FLOAT(X).        {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
3077020f651Sdrh item(A) ::= PLUS FLOAT(X).   {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
3087020f651Sdrh item(A) ::= MINUS FLOAT(X).  {
3096e142f54Sdrh   A = sqliteExpr(TK_UMINUS, 0, 0, 0);
310daffd0e5Sdrh   if( A ) A->pLeft = sqliteExpr(TK_FLOAT, 0, 0, &X);
3117020f651Sdrh }
312348784efSdrh item(A) ::= STRING(X).       {A = sqliteExpr(TK_STRING, 0, 0, &X);}
3138be51133Sdrh item(A) ::= NULL.            {A = sqliteExpr(TK_NULL, 0, 0, 0);}
314348784efSdrh 
315967e8b73Sdrh %type inscollist_opt {IdList*}
316967e8b73Sdrh %destructor inscollist_opt {sqliteIdListDelete($$);}
317967e8b73Sdrh %type inscollist {IdList*}
318967e8b73Sdrh %destructor inscollist {sqliteIdListDelete($$);}
319348784efSdrh 
320967e8b73Sdrh inscollist_opt(A) ::= .                       {A = 0;}
321967e8b73Sdrh inscollist_opt(A) ::= LP inscollist(X) RP.    {A = X;}
322c4a3c779Sdrh inscollist(A) ::= inscollist(X) COMMA ids(Y). {A = sqliteIdListAppend(X,&Y);}
323c4a3c779Sdrh inscollist(A) ::= ids(Y).                     {A = sqliteIdListAppend(0,&Y);}
324348784efSdrh 
325382c0247Sdrh /////////////////////////// Expression Processing /////////////////////////////
326382c0247Sdrh //
327348784efSdrh %left OR.
328348784efSdrh %left AND.
3298be51133Sdrh %right NOT.
330fef5208cSdrh %left EQ NE ISNULL NOTNULL IS LIKE GLOB BETWEEN IN.
331348784efSdrh %left GT GE LT LE.
33281a20f21Sdrh %left BITAND BITOR LSHIFT RSHIFT.
333348784efSdrh %left PLUS MINUS.
334*bf4133cbSdrh %left STAR SLASH REM.
3350040077dSdrh %left CONCAT.
33681a20f21Sdrh %right UMINUS BITNOT.
337348784efSdrh 
338348784efSdrh %type expr {Expr*}
339348784efSdrh %destructor expr {sqliteExprDelete($$);}
340348784efSdrh 
341e1b6a5b8Sdrh expr(A) ::= LP(B) expr(X) RP(E). {A = X; sqliteExprSpan(A,&B,&E);}
342e1b6a5b8Sdrh expr(A) ::= NULL(X).             {A = sqliteExpr(TK_NULL, 0, 0, &X);}
343c4a3c779Sdrh expr(A) ::= id(X).               {A = sqliteExpr(TK_ID, 0, 0, &X);}
344c4a3c779Sdrh expr(A) ::= ids(X) DOT ids(Y). {
345e1b6a5b8Sdrh   Expr *temp1 = sqliteExpr(TK_ID, 0, 0, &X);
346348784efSdrh   Expr *temp2 = sqliteExpr(TK_ID, 0, 0, &Y);
347e1b6a5b8Sdrh   A = sqliteExpr(TK_DOT, temp1, temp2, 0);
348e1b6a5b8Sdrh }
349348784efSdrh expr(A) ::= INTEGER(X).      {A = sqliteExpr(TK_INTEGER, 0, 0, &X);}
350348784efSdrh expr(A) ::= FLOAT(X).        {A = sqliteExpr(TK_FLOAT, 0, 0, &X);}
351348784efSdrh expr(A) ::= STRING(X).       {A = sqliteExpr(TK_STRING, 0, 0, &X);}
352e1b6a5b8Sdrh expr(A) ::= ID(X) LP exprlist(Y) RP(E). {
353e1b6a5b8Sdrh   A = sqliteExprFunction(Y, &X);
354e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
355e1b6a5b8Sdrh }
356e1b6a5b8Sdrh expr(A) ::= ID(X) LP STAR RP(E). {
357e1b6a5b8Sdrh   A = sqliteExprFunction(0, &X);
358e1b6a5b8Sdrh   sqliteExprSpan(A,&X,&E);
359e1b6a5b8Sdrh }
360348784efSdrh expr(A) ::= expr(X) AND expr(Y).   {A = sqliteExpr(TK_AND, X, Y, 0);}
361348784efSdrh expr(A) ::= expr(X) OR expr(Y).    {A = sqliteExpr(TK_OR, X, Y, 0);}
362348784efSdrh expr(A) ::= expr(X) LT expr(Y).    {A = sqliteExpr(TK_LT, X, Y, 0);}
363348784efSdrh expr(A) ::= expr(X) GT expr(Y).    {A = sqliteExpr(TK_GT, X, Y, 0);}
364348784efSdrh expr(A) ::= expr(X) LE expr(Y).    {A = sqliteExpr(TK_LE, X, Y, 0);}
365348784efSdrh expr(A) ::= expr(X) GE expr(Y).    {A = sqliteExpr(TK_GE, X, Y, 0);}
366348784efSdrh expr(A) ::= expr(X) NE expr(Y).    {A = sqliteExpr(TK_NE, X, Y, 0);}
367348784efSdrh expr(A) ::= expr(X) EQ expr(Y).    {A = sqliteExpr(TK_EQ, X, Y, 0);}
36881a20f21Sdrh expr(A) ::= expr(X) BITAND expr(Y). {A = sqliteExpr(TK_BITAND, X, Y, 0);}
36981a20f21Sdrh expr(A) ::= expr(X) BITOR expr(Y).  {A = sqliteExpr(TK_BITOR, X, Y, 0);}
37081a20f21Sdrh expr(A) ::= expr(X) LSHIFT expr(Y). {A = sqliteExpr(TK_LSHIFT, X, Y, 0);}
37181a20f21Sdrh expr(A) ::= expr(X) RSHIFT expr(Y). {A = sqliteExpr(TK_RSHIFT, X, Y, 0);}
372dce2cbe6Sdrh expr(A) ::= expr(X) LIKE expr(Y).   {A = sqliteExpr(TK_LIKE, X, Y, 0);}
3734794b980Sdrh expr(A) ::= expr(X) NOT LIKE expr(Y).  {
3744794b980Sdrh   A = sqliteExpr(TK_LIKE, X, Y, 0);
3754794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
376e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&Y->span);
3774794b980Sdrh }
378dce2cbe6Sdrh expr(A) ::= expr(X) GLOB expr(Y).  {A = sqliteExpr(TK_GLOB,X,Y,0);}
3794794b980Sdrh expr(A) ::= expr(X) NOT GLOB expr(Y).  {
3804794b980Sdrh   A = sqliteExpr(TK_GLOB, X, Y, 0);
3814794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
382e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&Y->span);
3834794b980Sdrh }
384348784efSdrh expr(A) ::= expr(X) PLUS expr(Y).  {A = sqliteExpr(TK_PLUS, X, Y, 0);}
385348784efSdrh expr(A) ::= expr(X) MINUS expr(Y). {A = sqliteExpr(TK_MINUS, X, Y, 0);}
386348784efSdrh expr(A) ::= expr(X) STAR expr(Y).  {A = sqliteExpr(TK_STAR, X, Y, 0);}
387348784efSdrh expr(A) ::= expr(X) SLASH expr(Y). {A = sqliteExpr(TK_SLASH, X, Y, 0);}
388*bf4133cbSdrh expr(A) ::= expr(X) REM expr(Y).   {A = sqliteExpr(TK_REM, X, Y, 0);}
3890040077dSdrh expr(A) ::= expr(X) CONCAT expr(Y). {A = sqliteExpr(TK_CONCAT, X, Y, 0);}
390e1b6a5b8Sdrh expr(A) ::= expr(X) ISNULL(E). {
391e1b6a5b8Sdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
392e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
393e1b6a5b8Sdrh }
39433048c0bSdrh expr(A) ::= expr(X) IS NULL(E). {
39533048c0bSdrh   A = sqliteExpr(TK_ISNULL, X, 0, 0);
39633048c0bSdrh   sqliteExprSpan(A,&X->span,&E);
39733048c0bSdrh }
39833048c0bSdrh expr(A) ::= expr(X) NOTNULL(E). {
39933048c0bSdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
40033048c0bSdrh   sqliteExprSpan(A,&X->span,&E);
40133048c0bSdrh }
402e1b6a5b8Sdrh expr(A) ::= expr(X) NOT NULL(E). {
403e1b6a5b8Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
404e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
405e1b6a5b8Sdrh }
40681a20f21Sdrh expr(A) ::= expr(X) IS NOT NULL(E). {
40781a20f21Sdrh   A = sqliteExpr(TK_NOTNULL, X, 0, 0);
40881a20f21Sdrh   sqliteExprSpan(A,&X->span,&E);
40981a20f21Sdrh }
410e1b6a5b8Sdrh expr(A) ::= NOT(B) expr(X). {
411e1b6a5b8Sdrh   A = sqliteExpr(TK_NOT, X, 0, 0);
412e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
413e1b6a5b8Sdrh }
41481a20f21Sdrh expr(A) ::= BITNOT(B) expr(X). {
41581a20f21Sdrh   A = sqliteExpr(TK_BITNOT, X, 0, 0);
41681a20f21Sdrh   sqliteExprSpan(A,&B,&X->span);
41781a20f21Sdrh }
418e1b6a5b8Sdrh expr(A) ::= MINUS(B) expr(X). [UMINUS] {
419e1b6a5b8Sdrh   A = sqliteExpr(TK_UMINUS, X, 0, 0);
420e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
421e1b6a5b8Sdrh }
422e1b6a5b8Sdrh expr(A) ::= PLUS(B) expr(X). [UMINUS] {
423e1b6a5b8Sdrh   A = X;
424e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&X->span);
425e1b6a5b8Sdrh }
426e1b6a5b8Sdrh expr(A) ::= LP(B) select(X) RP(E). {
42719a775c2Sdrh   A = sqliteExpr(TK_SELECT, 0, 0, 0);
428daffd0e5Sdrh   if( A ) A->pSelect = X;
429e1b6a5b8Sdrh   sqliteExprSpan(A,&B,&E);
43019a775c2Sdrh }
431fef5208cSdrh expr(A) ::= expr(W) BETWEEN expr(X) AND expr(Y). {
432fef5208cSdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
433fef5208cSdrh   pList = sqliteExprListAppend(pList, Y, 0);
434fef5208cSdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
435daffd0e5Sdrh   if( A ) A->pList = pList;
436e1b6a5b8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
437fef5208cSdrh }
4384794b980Sdrh expr(A) ::= expr(W) NOT BETWEEN expr(X) AND expr(Y). {
4394794b980Sdrh   ExprList *pList = sqliteExprListAppend(0, X, 0);
4404794b980Sdrh   pList = sqliteExprListAppend(pList, Y, 0);
4414794b980Sdrh   A = sqliteExpr(TK_BETWEEN, W, 0, 0);
442daffd0e5Sdrh   if( A ) A->pList = pList;
4434794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
444e1b6a5b8Sdrh   sqliteExprSpan(A,&W->span,&Y->span);
4454794b980Sdrh }
446e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP exprlist(Y) RP(E).  {
447fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
448daffd0e5Sdrh   if( A ) A->pList = Y;
449e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
450fef5208cSdrh }
451e1b6a5b8Sdrh expr(A) ::= expr(X) IN LP select(Y) RP(E).  {
452fef5208cSdrh   A = sqliteExpr(TK_IN, X, 0, 0);
453daffd0e5Sdrh   if( A ) A->pSelect = Y;
454e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
455fef5208cSdrh }
456e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP exprlist(Y) RP(E).  {
4574794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
458daffd0e5Sdrh   if( A ) A->pList = Y;
4594794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
460e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
4614794b980Sdrh }
462e1b6a5b8Sdrh expr(A) ::= expr(X) NOT IN LP select(Y) RP(E).  {
4634794b980Sdrh   A = sqliteExpr(TK_IN, X, 0, 0);
464daffd0e5Sdrh   if( A ) A->pSelect = Y;
4654794b980Sdrh   A = sqliteExpr(TK_NOT, A, 0, 0);
466e1b6a5b8Sdrh   sqliteExprSpan(A,&X->span,&E);
4674794b980Sdrh }
468fef5208cSdrh 
469fef5208cSdrh 
470348784efSdrh 
471348784efSdrh %type exprlist {ExprList*}
472348784efSdrh %destructor exprlist {sqliteExprListDelete($$);}
473348784efSdrh %type expritem {Expr*}
474348784efSdrh %destructor expritem {sqliteExprDelete($$);}
475348784efSdrh 
476348784efSdrh exprlist(A) ::= exprlist(X) COMMA expritem(Y).
477348784efSdrh    {A = sqliteExprListAppend(X,Y,0);}
478348784efSdrh exprlist(A) ::= expritem(X).            {A = sqliteExprListAppend(0,X,0);}
479348784efSdrh expritem(A) ::= expr(X).                {A = X;}
480348784efSdrh expritem(A) ::= .                       {A = 0;}
481cce7d176Sdrh 
482382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
483382c0247Sdrh //
484717e6402Sdrh cmd ::= CREATE(S) uniqueflag(U) INDEX ids(X) ON ids(Y) LP idxlist(Z) RP(E).
485717e6402Sdrh     {sqliteCreateIndex(pParse, &X, &Y, Z, U, &S, &E);}
486717e6402Sdrh 
487717e6402Sdrh %type uniqueflag {int}
488717e6402Sdrh uniqueflag(A) ::= UNIQUE.   { A = 1; }
489717e6402Sdrh uniqueflag(A) ::= .         { A = 0; }
490348784efSdrh 
491348784efSdrh %type idxlist {IdList*}
492348784efSdrh %destructor idxlist {sqliteIdListDelete($$);}
493348784efSdrh %type idxitem {Token}
494348784efSdrh 
495348784efSdrh idxlist(A) ::= idxlist(X) COMMA idxitem(Y).
496348784efSdrh      {A = sqliteIdListAppend(X,&Y);}
497348784efSdrh idxlist(A) ::= idxitem(Y).
498348784efSdrh      {A = sqliteIdListAppend(0,&Y);}
499c4a3c779Sdrh idxitem(A) ::= ids(X).          {A = X;}
500348784efSdrh 
501382c0247Sdrh ///////////////////////////// The CREATE INDEX command ///////////////////////
502382c0247Sdrh //
503382c0247Sdrh 
504c4a3c779Sdrh cmd ::= DROP INDEX ids(X).      {sqliteDropIndex(pParse, &X);}
505982cef7eSdrh 
506382c0247Sdrh 
507382c0247Sdrh ///////////////////////////// The DROP INDEX command /////////////////////////
508382c0247Sdrh //
509c4a3c779Sdrh cmd ::= COPY ids(X) FROM ids(Y) USING DELIMITERS STRING(Z).
510982cef7eSdrh     {sqliteCopy(pParse,&X,&Y,&Z);}
511c4a3c779Sdrh cmd ::= COPY ids(X) FROM ids(Y).
512982cef7eSdrh     {sqliteCopy(pParse,&X,&Y,0);}
513dce2cbe6Sdrh 
514382c0247Sdrh ///////////////////////////// The VACUUM command /////////////////////////////
515382c0247Sdrh //
516dce2cbe6Sdrh cmd ::= VACUUM.                {sqliteVacuum(pParse,0);}
517c4a3c779Sdrh cmd ::= VACUUM ids(X).         {sqliteVacuum(pParse,&X);}
518f57b14a6Sdrh 
519382c0247Sdrh ///////////////////////////// The PRAGMA command /////////////////////////////
520382c0247Sdrh //
521f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ids(Y).         {sqlitePragma(pParse,&X,&Y,0);}
522f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ ON(Y).          {sqlitePragma(pParse,&X,&Y,0);}
523f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ plus_num(Y).    {sqlitePragma(pParse,&X,&Y,0);}
524f57b14a6Sdrh cmd ::= PRAGMA ids(X) EQ minus_num(Y).   {sqlitePragma(pParse,&X,&Y,1);}
525382c0247Sdrh cmd ::= PRAGMA ids(X) LP ids(Y) RP.      {sqlitePragma(pParse,&X,&Y,0);}
526f57b14a6Sdrh plus_num(A) ::= plus_opt number(X).   {A = X;}
527f57b14a6Sdrh minus_num(A) ::= MINUS number(X).     {A = X;}
528f57b14a6Sdrh number(A) ::= INTEGER(X).  {A = X;}
529f57b14a6Sdrh number(A) ::= FLOAT(X).    {A = X;}
530f57b14a6Sdrh plus_opt ::= PLUS.
531f57b14a6Sdrh plus_opt ::= .
532