/ Hex Artifact Content
Login

Artifact e6f300a355459fb29a71c30246be4cdb6ed5b6a7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 53 51 4c  ile contains SQL
0190: 69 74 65 27 73 20 67 72 61 6d 6d 61 72 20 66 6f  ite's grammar fo
01a0: 72 20 53 51 4c 2e 20 20 50 72 6f 63 65 73 73 20  r SQL.  Process 
01b0: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 75 73 69  this file.** usi
01c0: 6e 67 20 74 68 65 20 6c 65 6d 6f 6e 20 70 61 72  ng the lemon par
01d0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 74 6f  ser generator to
01e0: 20 67 65 6e 65 72 61 74 65 20 43 20 63 6f 64 65   generate C code
01f0: 20 74 68 61 74 20 72 75 6e 73 0a 2a 2a 20 74 68   that runs.** th
0200: 65 20 70 61 72 73 65 72 2e 20 20 4c 65 6d 6f 6e  e parser.  Lemon
0210: 20 77 69 6c 6c 20 61 6c 73 6f 20 67 65 6e 65 72   will also gener
0220: 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69 6c  ate a header fil
0230: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  e containing.** 
0240: 6e 75 6d 65 72 69 63 20 63 6f 64 65 73 20 66 6f  numeric codes fo
0250: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 6f 6b  r all of the tok
0260: 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20  ens..**.** @(#) 
0270: 24 49 64 3a 20 70 61 72 73 65 2e 79 2c 76 20 31  $Id: parse.y,v 1
0280: 2e 35 38 20 32 30 30 32 2f 30 33 2f 32 34 20 31  .58 2002/03/24 1
0290: 33 3a 31 33 3a 32 39 20 64 72 68 20 45 78 70 20  3:13:29 drh Exp 
02a0: 24 0a 2a 2f 0a 25 74 6f 6b 65 6e 5f 70 72 65 66  $.*/.%token_pref
02b0: 69 78 20 54 4b 5f 0a 25 74 6f 6b 65 6e 5f 74 79  ix TK_.%token_ty
02c0: 70 65 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66 61  pe {Token}.%defa
02d0: 75 6c 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e 7d  ult_type {Token}
02e0: 0a 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  .%extra_argument
02f0: 20 7b 50 61 72 73 65 20 2a 70 50 61 72 73 65 7d   {Parse *pParse}
0300: 0a 25 73 79 6e 74 61 78 5f 65 72 72 6f 72 20 7b  .%syntax_error {
0310: 0a 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69  .  sqliteSetStri
0320: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
0330: 4d 73 67 2c 22 73 79 6e 74 61 78 20 65 72 72 6f  Msg,"syntax erro
0340: 72 22 2c 30 29 3b 0a 20 20 70 50 61 72 73 65 2d  r",0);.  pParse-
0350: 3e 73 45 72 72 54 6f 6b 65 6e 20 3d 20 54 4f 4b  >sErrToken = TOK
0360: 45 4e 3b 0a 7d 0a 25 6e 61 6d 65 20 73 71 6c 69  EN;.}.%name sqli
0370: 74 65 50 61 72 73 65 72 0a 25 69 6e 63 6c 75 64  teParser.%includ
0380: 65 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  e {.#include "sq
0390: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
03a0: 75 64 65 20 22 70 61 72 73 65 2e 68 22 0a 0a 2f  ude "parse.h"../
03b0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
03c0: 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 77 6f   for holding two
03d0: 20 69 6e 74 65 67 65 72 73 0a 2a 2f 0a 73 74 72   integers.*/.str
03e0: 75 63 74 20 74 77 6f 69 6e 74 20 7b 20 69 6e 74  uct twoint { int
03f0: 20 61 2c 62 3b 20 7d 3b 0a 7d 0a 0a 2f 2f 20 54   a,b; };.}..// T
0400: 68 65 73 65 20 61 72 65 20 65 78 74 72 61 20 74  hese are extra t
0410: 6f 6b 65 6e 73 20 75 73 65 64 20 62 79 20 74 68  okens used by th
0420: 65 20 6c 65 78 65 72 20 62 75 74 20 6e 65 76 65  e lexer but neve
0430: 72 20 73 65 65 6e 20 62 79 20 74 68 65 0a 2f 2f  r seen by the.//
0440: 20 70 61 72 73 65 72 2e 20 20 57 65 20 70 75 74   parser.  We put
0450: 20 74 68 65 6d 20 69 6e 20 61 20 72 75 6c 65 20   them in a rule 
0460: 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 73  so that the pars
0470: 65 72 20 67 65 6e 65 72 61 74 6f 72 20 77 69 6c  er generator wil
0480: 6c 0a 2f 2f 20 61 64 64 20 74 68 65 6d 20 74 6f  l.// add them to
0490: 20 74 68 65 20 70 61 72 73 65 2e 68 20 6f 75 74   the parse.h out
04a0: 70 75 74 20 66 69 6c 65 2e 0a 2f 2f 0a 25 6e 6f  put file..//.%no
04b0: 6e 61 73 73 6f 63 20 45 4e 44 5f 4f 46 5f 46 49  nassoc END_OF_FI
04c0: 4c 45 20 49 4c 4c 45 47 41 4c 20 53 50 41 43 45  LE ILLEGAL SPACE
04d0: 20 55 4e 43 4c 4f 53 45 44 5f 53 54 52 49 4e 47   UNCLOSED_STRING
04e0: 20 43 4f 4d 4d 45 4e 54 20 46 55 4e 43 54 49 4f   COMMENT FUNCTIO
04f0: 4e 0a 20 20 20 20 20 20 20 20 20 20 43 4f 4c 55  N.          COLU
0500: 4d 4e 20 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e  MN AGG_FUNCTION.
0510: 0a 0a 2f 2f 20 49 6e 70 75 74 20 69 73 20 7a 65  ..// Input is ze
0520: 72 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 6d 61  ro or more comma
0530: 6e 64 73 2e 0a 69 6e 70 75 74 20 3a 3a 3d 20 63  nds..input ::= c
0540: 6d 64 6c 69 73 74 2e 0a 0a 2f 2f 20 41 20 6c 69  mdlist...// A li
0550: 73 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73 20 69  st of commands i
0560: 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63  s zero or more c
0570: 6f 6d 6d 61 6e 64 73 0a 2f 2f 0a 63 6d 64 6c 69  ommands.//.cmdli
0580: 73 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a 63 6d 64  st ::= ecmd..cmd
0590: 6c 69 73 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74  list ::= cmdlist
05a0: 20 65 63 6d 64 2e 0a 65 63 6d 64 20 3a 3a 3d 20   ecmd..ecmd ::= 
05b0: 65 78 70 6c 61 69 6e 20 63 6d 64 20 53 45 4d 49  explain cmd SEMI
05c0: 2e 20 20 7b 73 71 6c 69 74 65 45 78 65 63 28 70  .  {sqliteExec(p
05d0: 50 61 72 73 65 29 3b 7d 0a 65 63 6d 64 20 3a 3a  Parse);}.ecmd ::
05e0: 3d 20 63 6d 64 20 53 45 4d 49 2e 20 20 20 20 20  = cmd SEMI.     
05f0: 20 20 20 20 20 7b 73 71 6c 69 74 65 45 78 65 63       {sqliteExec
0600: 28 70 50 61 72 73 65 29 3b 7d 0a 65 63 6d 64 20  (pParse);}.ecmd 
0610: 3a 3a 3d 20 53 45 4d 49 2e 0a 65 78 70 6c 61 69  ::= SEMI..explai
0620: 6e 20 3a 3a 3d 20 45 58 50 4c 41 49 4e 2e 20 20  n ::= EXPLAIN.  
0630: 20 20 7b 70 50 61 72 73 65 2d 3e 65 78 70 6c 61    {pParse->expla
0640: 69 6e 20 3d 20 31 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  in = 1;}..//////
0650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
0660: 42 65 67 69 6e 20 61 6e 64 20 65 6e 64 20 74 72  Begin and end tr
0670: 61 6e 73 61 63 74 69 6f 6e 73 2e 20 2f 2f 2f 2f  ansactions. ////
0680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0690: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 63 6d 64  ////////.//..cmd
06a0: 20 3a 3a 3d 20 42 45 47 49 4e 20 74 72 61 6e 73   ::= BEGIN trans
06b0: 5f 6f 70 74 20 6f 6e 63 6f 6e 66 28 52 29 2e 20  _opt onconf(R). 
06c0: 20 7b 73 71 6c 69 74 65 42 65 67 69 6e 54 72 61   {sqliteBeginTra
06d0: 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  nsaction(pParse,
06e0: 52 29 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74 20 3a  R);}.trans_opt :
06f0: 3a 3d 20 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a  := ..trans_opt :
0700: 3a 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e 2e 0a  := TRANSACTION..
0710: 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52  trans_opt ::= TR
0720: 41 4e 53 41 43 54 49 4f 4e 20 69 64 73 2e 0a 63  ANSACTION ids..c
0730: 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54 20 74 72  md ::= COMMIT tr
0740: 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 7b 73  ans_opt.      {s
0750: 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73  qliteCommitTrans
0760: 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d  action(pParse);}
0770: 0a 63 6d 64 20 3a 3a 3d 20 45 4e 44 20 74 72 61  .cmd ::= END tra
0780: 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 20 20 20  ns_opt.         
0790: 7b 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61  {sqliteCommitTra
07a0: 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29  nsaction(pParse)
07b0: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c 4c 42  ;}.cmd ::= ROLLB
07c0: 41 43 4b 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20  ACK trans_opt.  
07d0: 20 20 7b 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63    {sqliteRollbac
07e0: 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  kTransaction(pPa
07f0: 72 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  rse);}..////////
0800: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
0810: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
0820: 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f  tatement ///////
0830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0840: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
0850: 20 63 72 65 61 74 65 5f 74 61 62 6c 65 20 63 72   create_table cr
0860: 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 2e  eate_table_args.
0870: 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 20 3a 3a  .create_table ::
0880: 3d 20 43 52 45 41 54 45 28 58 29 20 74 65 6d 70  = CREATE(X) temp
0890: 28 54 29 20 54 41 42 4c 45 20 69 64 73 28 59 29  (T) TABLE ids(Y)
08a0: 2e 20 7b 0a 20 20 20 73 71 6c 69 74 65 53 74 61  . {.   sqliteSta
08b0: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 26  rtTable(pParse,&
08c0: 58 2c 26 59 2c 54 29 3b 0a 7d 0a 25 74 79 70 65  X,&Y,T);.}.%type
08d0: 20 74 65 6d 70 20 7b 69 6e 74 7d 0a 74 65 6d 70   temp {int}.temp
08e0: 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20 20 7b  (A) ::= TEMP.  {
08f0: 41 20 3d 20 31 3b 7d 0a 74 65 6d 70 28 41 29 20  A = 1;}.temp(A) 
0900: 3a 3a 3d 20 2e 20 20 20 20 20 20 7b 41 20 3d 20  ::= .      {A = 
0910: 30 3b 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65  0;}.create_table
0920: 5f 61 72 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c  _args ::= LP col
0930: 75 6d 6e 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74  umnlist conslist
0940: 5f 6f 70 74 20 52 50 28 58 29 2e 20 7b 0a 20 20  _opt RP(X). {.  
0950: 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28 70  sqliteEndTable(p
0960: 50 61 72 73 65 2c 26 58 2c 30 29 3b 0a 7d 0a 63  Parse,&X,0);.}.c
0970: 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73  reate_table_args
0980: 20 3a 3a 3d 20 41 53 20 73 65 6c 65 63 74 28 53   ::= AS select(S
0990: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 45 6e 64  ). {.  sqliteEnd
09a0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30 2c 53  Table(pParse,0,S
09b0: 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63  );.  sqliteSelec
09c0: 74 44 65 6c 65 74 65 28 53 29 3b 0a 7d 0a 63 6f  tDelete(S);.}.co
09d0: 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c  lumnlist ::= col
09e0: 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63 6f  umnlist COMMA co
09f0: 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e 6c 69 73 74  lumn..columnlist
0a00: 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e 0a 0a 2f 2f   ::= column...//
0a10: 20 41 62 6f 75 74 20 74 68 65 20 6f 6e 6c 79 20   About the only 
0a20: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  information used
0a30: 20 66 6f 72 20 61 20 63 6f 6c 75 6d 6e 20 69 73   for a column is
0a40: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0a50: 0a 2f 2f 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  .// column.  The
0a60: 20 74 79 70 65 20 69 73 20 61 6c 77 61 79 73 20   type is always 
0a70: 6a 75 73 74 20 22 74 65 78 74 22 2e 20 20 42 75  just "text".  Bu
0a80: 74 20 74 68 65 20 63 6f 64 65 20 77 69 6c 6c 20  t the code will 
0a90: 61 63 63 65 70 74 0a 2f 2f 20 61 6e 20 65 6c 61  accept.// an ela
0aa0: 62 6f 72 61 74 65 20 74 79 70 65 6e 61 6d 65 2e  borate typename.
0ab0: 20 20 50 65 72 68 61 70 73 20 73 6f 6d 65 64 61    Perhaps someda
0ac0: 79 20 77 65 27 6c 6c 20 64 6f 20 73 6f 6d 65 74  y we'll do somet
0ad0: 68 69 6e 67 20 77 69 74 68 20 69 74 2e 0a 2f 2f  hing with it..//
0ae0: 0a 63 6f 6c 75 6d 6e 20 3a 3a 3d 20 63 6f 6c 75  .column ::= colu
0af0: 6d 6e 69 64 20 74 79 70 65 20 63 61 72 67 6c 69  mnid type cargli
0b00: 73 74 2e 20 0a 63 6f 6c 75 6d 6e 69 64 20 3a 3a  st. .columnid ::
0b10: 3d 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20  = ids(X).       
0b20: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
0b30: 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  AddColumn(pParse
0b40: 2c 26 58 29 3b 7d 0a 0a 2f 2f 20 41 6e 20 49 44  ,&X);}..// An ID
0b50: 45 4e 54 49 46 49 45 52 20 63 61 6e 20 62 65 20  ENTIFIER can be 
0b60: 61 20 67 65 6e 65 72 69 63 20 69 64 65 6e 74 69  a generic identi
0b70: 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  fier, or one of 
0b80: 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65 79 77 6f  several.// keywo
0b90: 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e 2d 73 74  rds.  Any non-st
0ba0: 61 6e 64 61 72 64 20 6b 65 79 77 6f 72 64 20 63  andard keyword c
0bb0: 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e 20 69 64  an also be an id
0bc0: 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 20 57 65 20  entifier..// We 
0bd0: 61 6c 73 6f 20 6d 61 6b 65 20 44 45 53 43 20 61  also make DESC a
0be0: 6e 64 20 69 64 65 6e 74 69 66 69 65 72 20 73 69  nd identifier si
0bf0: 6e 63 65 20 69 74 20 63 6f 6d 65 73 20 75 70 20  nce it comes up 
0c00: 73 6f 20 6f 66 74 65 6e 20 28 61 73 0a 2f 2f 20  so often (as.// 
0c10: 61 6e 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20  an abbreviation 
0c20: 6f 66 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22  of "description"
0c30: 29 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64 20 7b  )..//.%type id {
0c40: 54 6f 6b 65 6e 7d 0a 69 64 28 41 29 20 3a 3a 3d  Token}.id(A) ::=
0c50: 20 44 45 53 43 28 58 29 2e 20 20 20 20 20 20 20   DESC(X).       
0c60: 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a  {A = X;}.id(A) :
0c70: 3a 3d 20 41 53 43 28 58 29 2e 20 20 20 20 20 20  := ASC(X).      
0c80: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29    {A = X;}.id(A)
0c90: 20 3a 3a 3d 20 44 45 4c 49 4d 49 54 45 52 53 28   ::= DELIMITERS(
0ca0: 58 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28  X). {A = X;}.id(
0cb0: 41 29 20 3a 3a 3d 20 45 58 50 4c 41 49 4e 28 58  A) ::= EXPLAIN(X
0cc0: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69  ).    {A = X;}.i
0cd0: 64 28 41 29 20 3a 3a 3d 20 56 41 43 55 55 4d 28  d(A) ::= VACUUM(
0ce0: 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  X).     {A = X;}
0cf0: 0a 69 64 28 41 29 20 3a 3a 3d 20 42 45 47 49 4e  .id(A) ::= BEGIN
0d00: 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58  (X).      {A = X
0d10: 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 45 4e 44  ;}.id(A) ::= END
0d20: 28 58 29 2e 20 20 20 20 20 20 20 20 7b 41 20 3d  (X).        {A =
0d30: 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 50   X;}.id(A) ::= P
0d40: 52 41 47 4d 41 28 58 29 2e 20 20 20 20 20 7b 41  RAGMA(X).     {A
0d50: 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d   = X;}.id(A) ::=
0d60: 20 43 4c 55 53 54 45 52 28 58 29 2e 20 20 20 20   CLUSTER(X).    
0d70: 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a  {A = X;}.id(A) :
0d80: 3a 3d 20 49 44 28 58 29 2e 20 20 20 20 20 20 20  := ID(X).       
0d90: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29    {A = X;}.id(A)
0da0: 20 3a 3a 3d 20 54 45 4d 50 28 58 29 2e 20 20 20   ::= TEMP(X).   
0db0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28      {A = X;}.id(
0dc0: 41 29 20 3a 3a 3d 20 4f 46 46 53 45 54 28 58 29  A) ::= OFFSET(X)
0dd0: 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69  .     {A = X;}.i
0de0: 64 28 41 29 20 3a 3a 3d 20 4b 45 59 28 58 29 2e  d(A) ::= KEY(X).
0df0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
0e00: 0a 69 64 28 41 29 20 3a 3a 3d 20 41 42 4f 52 54  .id(A) ::= ABORT
0e10: 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58  (X).      {A = X
0e20: 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 49 47 4e  ;}.id(A) ::= IGN
0e30: 4f 52 45 28 58 29 2e 20 20 20 20 20 7b 41 20 3d  ORE(X).     {A =
0e40: 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 52   X;}.id(A) ::= R
0e50: 45 50 4c 41 43 45 28 58 29 2e 20 20 20 20 7b 41  EPLACE(X).    {A
0e60: 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d   = X;}.id(A) ::=
0e70: 20 46 41 49 4c 28 58 29 2e 20 20 20 20 20 20 20   FAIL(X).       
0e80: 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a  {A = X;}.id(A) :
0e90: 3a 3d 20 43 4f 4e 46 4c 49 43 54 28 58 29 2e 20  := CONFLICT(X). 
0ea0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 41    {A = X;}..// A
0eb0: 6e 64 20 22 69 64 73 22 20 69 73 20 61 6e 20 69  nd "ids" is an i
0ec0: 64 65 6e 74 69 66 65 72 2d 6f 72 2d 73 74 72 69  dentifer-or-stri
0ed0: 6e 67 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64 73  ng..//.%type ids
0ee0: 20 7b 54 6f 6b 65 6e 7d 0a 69 64 73 28 41 29 20   {Token}.ids(A) 
0ef0: 3a 3a 3d 20 69 64 28 58 29 2e 20 20 20 20 20 20  ::= id(X).      
0f00: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 73 28 41    {A = X;}.ids(A
0f10: 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e  ) ::= STRING(X).
0f20: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 74 79      {A = X;}..ty
0f30: 70 65 20 3a 3a 3d 20 2e 0a 74 79 70 65 20 3a 3a  pe ::= ..type ::
0f40: 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 2e 20 20  = typename(X).  
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f 6c 75    {sqliteAddColu
0f70: 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 58  mnType(pParse,&X
0f80: 2c 26 58 29 3b 7d 0a 74 79 70 65 20 3a 3a 3d 20  ,&X);}.type ::= 
0f90: 74 79 70 65 6e 61 6d 65 28 58 29 20 4c 50 20 73  typename(X) LP s
0fa0: 69 67 6e 65 64 20 52 50 28 59 29 2e 20 20 20 20  igned RP(Y).    
0fb0: 7b 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d 6e  {sqliteAddColumn
0fc0: 54 79 70 65 28 70 50 61 72 73 65 2c 26 58 2c 26  Type(pParse,&X,&
0fd0: 59 29 3b 7d 0a 74 79 70 65 20 3a 3a 3d 20 74 79  Y);}.type ::= ty
0fe0: 70 65 6e 61 6d 65 28 58 29 20 4c 50 20 73 69 67  pename(X) LP sig
0ff0: 6e 65 64 20 43 4f 4d 4d 41 20 73 69 67 6e 65 64  ned COMMA signed
1000: 20 52 50 28 59 29 2e 0a 20 20 20 20 20 20 20 20   RP(Y)..        
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 7b 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 6d   {sqliteAddColum
1040: 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 58 2c  nType(pParse,&X,
1050: 26 59 29 3b 7d 0a 25 74 79 70 65 20 74 79 70 65  &Y);}.%type type
1060: 6e 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70  name {Token}.typ
1070: 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73  ename(A) ::= ids
1080: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 7b  (X).           {
1090: 41 20 3d 20 58 3b 7d 0a 74 79 70 65 6e 61 6d 65  A = X;}.typename
10a0: 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65  (A) ::= typename
10b0: 28 58 29 20 69 64 73 2e 20 20 7b 41 20 3d 20 58  (X) ids.  {A = X
10c0: 3b 7d 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 49 4e  ;}.signed ::= IN
10d0: 54 45 47 45 52 2e 0a 73 69 67 6e 65 64 20 3a 3a  TEGER..signed ::
10e0: 3d 20 50 4c 55 53 20 49 4e 54 45 47 45 52 2e 0a  = PLUS INTEGER..
10f0: 73 69 67 6e 65 64 20 3a 3a 3d 20 4d 49 4e 55 53  signed ::= MINUS
1100: 20 49 4e 54 45 47 45 52 2e 0a 63 61 72 67 6c 69   INTEGER..cargli
1110: 73 74 20 3a 3a 3d 20 63 61 72 67 6c 69 73 74 20  st ::= carglist 
1120: 63 61 72 67 2e 0a 63 61 72 67 6c 69 73 74 20 3a  carg..carglist :
1130: 3a 3d 20 2e 0a 63 61 72 67 20 3a 3a 3d 20 43 4f  := ..carg ::= CO
1140: 4e 53 54 52 41 49 4e 54 20 69 64 73 20 63 63 6f  NSTRAINT ids cco
1150: 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 63 63 6f  ns..carg ::= cco
1160: 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46  ns..carg ::= DEF
1170: 41 55 4c 54 20 53 54 52 49 4e 47 28 58 29 2e 20  AULT STRING(X). 
1180: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1190: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
11a0: 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63  pParse,&X,0);}.c
11b0: 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  arg ::= DEFAULT 
11c0: 49 44 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  ID(X).          
11d0: 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65      {sqliteAddDe
11e0: 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73  faultValue(pPars
11f0: 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a  e,&X,0);}.carg :
1200: 3a 3d 20 44 45 46 41 55 4c 54 20 49 4e 54 45 47  := DEFAULT INTEG
1210: 45 52 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b  ER(X).         {
1220: 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74  sqliteAddDefault
1230: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c  Value(pParse,&X,
1240: 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45  0);}.carg ::= DE
1250: 46 41 55 4c 54 20 50 4c 55 53 20 49 4e 54 45 47  FAULT PLUS INTEG
1260: 45 52 28 58 29 2e 20 20 20 20 7b 73 71 6c 69 74  ER(X).    {sqlit
1270: 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  eAddDefaultValue
1280: 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a  (pParse,&X,0);}.
1290: 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54  carg ::= DEFAULT
12a0: 20 4d 49 4e 55 53 20 49 4e 54 45 47 45 52 28 58   MINUS INTEGER(X
12b0: 29 2e 20 20 20 7b 73 71 6c 69 74 65 41 64 64 44  ).   {sqliteAddD
12c0: 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72  efaultValue(pPar
12d0: 73 65 2c 26 58 2c 31 29 3b 7d 0a 63 61 72 67 20  se,&X,1);}.carg 
12e0: 3a 3a 3d 20 44 45 46 41 55 4c 54 20 46 4c 4f 41  ::= DEFAULT FLOA
12f0: 54 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  T(X).           
1300: 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c  {sqliteAddDefaul
1310: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58  tValue(pParse,&X
1320: 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44  ,0);}.carg ::= D
1330: 45 46 41 55 4c 54 20 50 4c 55 53 20 46 4c 4f 41  EFAULT PLUS FLOA
1340: 54 28 58 29 2e 20 20 20 20 20 20 7b 73 71 6c 69  T(X).      {sqli
1350: 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  teAddDefaultValu
1360: 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d  e(pParse,&X,0);}
1370: 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c  .carg ::= DEFAUL
1380: 54 20 4d 49 4e 55 53 20 46 4c 4f 41 54 28 58 29  T MINUS FLOAT(X)
1390: 2e 20 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64  .     {sqliteAdd
13a0: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61  DefaultValue(pPa
13b0: 72 73 65 2c 26 58 2c 31 29 3b 7d 0a 63 61 72 67  rse,&X,1);}.carg
13c0: 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4e 55 4c   ::= DEFAULT NUL
13d0: 4c 2e 20 0a 0a 2f 2f 20 49 6e 20 61 64 64 69 74  L. ..// In addit
13e0: 69 6f 6e 20 74 6f 20 74 68 65 20 74 79 70 65 20  ion to the type 
13f0: 6e 61 6d 65 2c 20 77 65 20 61 6c 73 6f 20 63 61  name, we also ca
1400: 72 65 20 61 62 6f 75 74 20 74 68 65 20 70 72 69  re about the pri
1410: 6d 61 72 79 20 6b 65 79 20 61 6e 64 0a 2f 2f 20  mary key and.// 
1420: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
1430: 74 73 2e 0a 2f 2f 0a 63 63 6f 6e 73 20 3a 3a 3d  ts..//.ccons ::=
1440: 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66   NOT NULL onconf
1450: 28 52 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (R).            
1460: 20 20 20 7b 73 71 6c 69 74 65 41 64 64 4e 6f 74     {sqliteAddNot
1470: 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 52 29 3b  Null(pParse, R);
1480: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d  }.ccons ::= PRIM
1490: 41 52 59 20 4b 45 59 20 73 6f 72 74 6f 72 64 65  ARY KEY sortorde
14a0: 72 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 7b 73  r onconf(R).  {s
14b0: 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b  qliteAddPrimaryK
14c0: 65 79 28 70 50 61 72 73 65 2c 30 2c 52 29 3b 7d  ey(pParse,0,R);}
14d0: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55  .ccons ::= UNIQU
14e0: 45 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20  E onconf(R).    
14f0: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 43          {sqliteC
1500: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
1510: 65 2c 30 2c 30 2c 30 2c 52 2c 30 2c 30 29 3b 7d  e,0,0,0,R,0,0);}
1520: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b  .ccons ::= CHECK
1530: 20 4c 50 20 65 78 70 72 20 52 50 20 6f 6e 63 6f   LP expr RP onco
1540: 6e 66 2e 0a 0a 2f 2f 20 46 6f 72 20 74 68 65 20  nf...// For the 
1550: 74 69 6d 65 20 62 65 69 6e 67 2c 20 74 68 65 20  time being, the 
1560: 6f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  only constraint 
1570: 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 69 73  we care about is
1580: 20 74 68 65 20 70 72 69 6d 61 72 79 0a 2f 2f 20   the primary.// 
1590: 6b 65 79 20 61 6e 64 20 55 4e 49 51 55 45 2e 20  key and UNIQUE. 
15a0: 20 42 6f 74 68 20 63 72 65 61 74 65 20 69 6e 64   Both create ind
15b0: 69 63 65 73 2e 0a 2f 2f 0a 63 6f 6e 73 6c 69 73  ices..//.conslis
15c0: 74 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 63 6f 6e 73  t_opt ::= ..cons
15d0: 6c 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4d  list_opt ::= COM
15e0: 4d 41 20 63 6f 6e 73 6c 69 73 74 2e 0a 63 6f 6e  MA conslist..con
15f0: 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69  slist ::= consli
1600: 73 74 20 43 4f 4d 4d 41 20 74 63 6f 6e 73 2e 0a  st COMMA tcons..
1610: 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e  conslist ::= con
1620: 73 6c 69 73 74 20 74 63 6f 6e 73 2e 0a 63 6f 6e  slist tcons..con
1630: 73 6c 69 73 74 20 3a 3a 3d 20 74 63 6f 6e 73 2e  slist ::= tcons.
1640: 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54  .tcons ::= CONST
1650: 52 41 49 4e 54 20 69 64 73 2e 0a 74 63 6f 6e 73  RAINT ids..tcons
1660: 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59   ::= PRIMARY KEY
1670: 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52   LP idxlist(X) R
1680: 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20  P onconf(R)..   
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
16c0: 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 70  eAddPrimaryKey(p
16d0: 50 61 72 73 65 2c 58 2c 52 29 3b 7d 0a 74 63 6f  Parse,X,R);}.tco
16e0: 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 4c 50  ns ::= UNIQUE LP
16f0: 20 69 64 78 6c 69 73 74 28 58 29 20 52 50 20 6f   idxlist(X) RP o
1700: 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20 20  nconf(R)..      
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 7b 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e   {sqliteCreateIn
1740: 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 58  dex(pParse,0,0,X
1750: 2c 52 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20  ,R,0,0);}.tcons 
1760: 3a 3a 3d 20 43 48 45 43 4b 20 65 78 70 72 20 6f  ::= CHECK expr o
1770: 6e 63 6f 6e 66 2e 0a 0a 2f 2f 20 54 68 65 20 66  nconf...// The f
1780: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f  ollowing is a no
1790: 6e 2d 73 74 61 6e 64 61 72 64 20 65 78 74 65 6e  n-standard exten
17a0: 73 69 6f 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73  sion that allows
17b0: 20 75 73 20 74 6f 20 64 65 63 6c 61 72 65 20 74   us to declare t
17c0: 68 65 0a 2f 2f 20 64 65 66 61 75 6c 74 20 62 65  he.// default be
17d0: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 72  havior when ther
17e0: 65 20 69 73 20 61 20 63 6f 6e 73 74 72 61 69 6e  e is a constrain
17f0: 74 20 63 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25  t conflict..//.%
1800: 74 79 70 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74  type onconf {int
1810: 7d 0a 25 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b  }.%type orconf {
1820: 69 6e 74 7d 0a 25 74 79 70 65 20 72 65 73 6f 6c  int}.%type resol
1830: 76 65 74 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63  vetype {int}.onc
1840: 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  onf(A) ::= .    
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
1870: 4f 45 5f 44 65 66 61 75 6c 74 3b 20 7d 0a 6f 6e  OE_Default; }.on
1880: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 4e 20 43  conf(A) ::= ON C
1890: 4f 4e 46 4c 49 43 54 20 72 65 73 6f 6c 76 65 74  ONFLICT resolvet
18a0: 79 70 65 28 58 29 2e 20 20 20 20 7b 20 41 20 3d  ype(X).    { A =
18b0: 20 58 3b 20 7d 0a 6f 72 63 6f 6e 66 28 41 29 20   X; }.orconf(A) 
18c0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 44 65 66 61     { A = OE_Defa
18f0: 75 6c 74 3b 20 7d 0a 6f 72 63 6f 6e 66 28 41 29  ult; }.orconf(A)
1900: 20 3a 3a 3d 20 4f 52 20 72 65 73 6f 6c 76 65 74   ::= OR resolvet
1910: 79 70 65 28 58 29 2e 20 20 20 20 20 20 20 20 20  ype(X).         
1920: 20 20 20 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 72      { A = X; }.r
1930: 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a  esolvetype(A) ::
1940: 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 20 20 20  = ROLLBACK.     
1950: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
1960: 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b 20 7d  = OE_Rollback; }
1970: 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20  .resolvetype(A) 
1980: 3a 3a 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 20  ::= ABORT.      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
19a0: 41 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 20 7d 0a  A = OE_Abort; }.
19b0: 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a  resolvetype(A) :
19c0: 3a 3d 20 46 41 49 4c 2e 20 20 20 20 20 20 20 20  := FAIL.        
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
19e0: 20 3d 20 4f 45 5f 46 61 69 6c 3b 20 7d 0a 72 65   = OE_Fail; }.re
19f0: 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d  solvetype(A) ::=
1a00: 20 49 47 4e 4f 52 45 2e 20 20 20 20 20 20 20 20   IGNORE.        
1a10: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
1a20: 20 4f 45 5f 49 67 6e 6f 72 65 3b 20 7d 0a 72 65   OE_Ignore; }.re
1a30: 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d  solvetype(A) ::=
1a40: 20 52 45 50 4c 41 43 45 2e 20 20 20 20 20 20 20   REPLACE.       
1a50: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
1a60: 20 4f 45 5f 52 65 70 6c 61 63 65 3b 20 7d 0a 0a   OE_Replace; }..
1a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44  ////////// The D
1a90: 52 4f 50 20 54 41 42 4c 45 20 2f 2f 2f 2f 2f 2f  ROP TABLE //////
1aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
1ac0: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20  //.cmd ::= DROP 
1ad0: 54 41 42 4c 45 20 69 64 73 28 58 29 2e 20 20 20  TABLE ids(X).   
1ae0: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 44 72         {sqliteDr
1af0: 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 26  opTable(pParse,&
1b00: 58 2c 30 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  X,0);}..////////
1b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
1b20: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
1b30: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
1b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1b50: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
1b60: 20 43 52 45 41 54 45 28 58 29 20 56 49 45 57 20   CREATE(X) VIEW 
1b70: 69 64 73 28 59 29 20 41 53 20 73 65 6c 65 63 74  ids(Y) AS select
1b80: 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 43  (S). {.  sqliteC
1b90: 72 65 61 74 65 56 69 65 77 28 70 50 61 72 73 65  reateView(pParse
1ba0: 2c 20 26 58 2c 20 26 59 2c 20 53 29 3b 0a 7d 0a  , &X, &Y, S);.}.
1bb0: 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 56 49 45  cmd ::= DROP VIE
1bc0: 57 20 69 64 73 28 58 29 2e 20 7b 0a 20 20 73 71  W ids(X). {.  sq
1bd0: 6c 69 74 65 44 72 6f 70 54 61 62 6c 65 28 70 50  liteDropTable(pP
1be0: 61 72 73 65 2c 20 26 58 2c 20 31 29 3b 0a 7d 0a  arse, &X, 1);.}.
1bf0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
1c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53 45  ///////// The SE
1c10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2f  LECT statement /
1c20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1c40: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c 65  .//.cmd ::= sele
1c50: 63 74 28 58 29 2e 20 20 7b 0a 20 20 73 71 6c 69  ct(X).  {.  sqli
1c60: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
1c70: 20 58 2c 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b   X, SRT_Callback
1c80: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
1c90: 20 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c   sqliteSelectDel
1ca0: 65 74 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65  ete(X);.}..%type
1cb0: 20 73 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a   select {Select*
1cc0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 65  }.%destructor se
1cd0: 6c 65 63 74 20 7b 73 71 6c 69 74 65 53 65 6c 65  lect {sqliteSele
1ce0: 63 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25  ctDelete($$);}.%
1cf0: 74 79 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b  type oneselect {
1d00: 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75  Select*}.%destru
1d10: 63 74 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b  ctor oneselect {
1d20: 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65  sqliteSelectDele
1d30: 74 65 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74  te($$);}..select
1d40: 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63  (A) ::= oneselec
1d50: 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  t(X).           
1d60: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
1d70: 58 3b 7d 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a  X;}.select(A) ::
1d80: 3d 20 73 65 6c 65 63 74 28 58 29 20 6d 75 6c 74  = select(X) mult
1d90: 69 73 65 6c 65 63 74 5f 6f 70 28 59 29 20 6f 6e  iselect_op(Y) on
1da0: 65 73 65 6c 65 63 74 28 5a 29 2e 20 20 7b 0a 20  eselect(Z).  {. 
1db0: 20 69 66 28 20 5a 20 29 7b 0a 20 20 20 20 5a 2d   if( Z ){.    Z-
1dc0: 3e 6f 70 20 3d 20 59 3b 0a 20 20 20 20 5a 2d 3e  >op = Y;.    Z->
1dd0: 70 50 72 69 6f 72 20 3d 20 58 3b 0a 20 20 7d 0a  pPrior = X;.  }.
1de0: 20 20 41 20 3d 20 5a 3b 0a 7d 0a 25 74 79 70 65    A = Z;.}.%type
1df0: 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 20   multiselect_op 
1e00: 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65 63  {int}.multiselec
1e10: 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f  t_op(A) ::= UNIO
1e20: 4e 2e 20 20 20 20 20 20 7b 41 20 3d 20 54 4b 5f  N.      {A = TK_
1e30: 55 4e 49 4f 4e 3b 7d 0a 6d 75 6c 74 69 73 65 6c  UNION;}.multisel
1e40: 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e  ect_op(A) ::= UN
1e50: 49 4f 4e 20 41 4c 4c 2e 20 20 7b 41 20 3d 20 54  ION ALL.  {A = T
1e60: 4b 5f 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73 65 6c  K_ALL;}.multisel
1e70: 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 49 4e  ect_op(A) ::= IN
1e80: 54 45 52 53 45 43 54 2e 20 20 7b 41 20 3d 20 54  TERSECT.  {A = T
1e90: 4b 5f 49 4e 54 45 52 53 45 43 54 3b 7d 0a 6d 75  K_INTERSECT;}.mu
1ea0: 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20  ltiselect_op(A) 
1eb0: 3a 3a 3d 20 45 58 43 45 50 54 2e 20 20 20 20 20  ::= EXCEPT.     
1ec0: 7b 41 20 3d 20 54 4b 5f 45 58 43 45 50 54 3b 7d  {A = TK_EXCEPT;}
1ed0: 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a  .oneselect(A) ::
1ee0: 3d 20 53 45 4c 45 43 54 20 64 69 73 74 69 6e 63  = SELECT distinc
1ef0: 74 28 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28  t(D) selcollist(
1f00: 57 29 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65  W) from(X) where
1f10: 5f 6f 70 74 28 59 29 0a 20 20 20 20 20 20 20 20  _opt(Y).        
1f20: 20 20 20 20 20 20 20 20 20 67 72 6f 75 70 62 79           groupby
1f30: 5f 6f 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f  _opt(P) having_o
1f40: 70 74 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70  pt(Q) orderby_op
1f50: 74 28 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c  t(Z) limit_opt(L
1f60: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
1f70: 65 53 65 6c 65 63 74 4e 65 77 28 57 2c 58 2c 59  eSelectNew(W,X,Y
1f80: 2c 50 2c 51 2c 5a 2c 44 2c 4c 2e 61 2c 4c 2e 62  ,P,Q,Z,D,L.a,L.b
1f90: 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20 22 64 69  );.}..// The "di
1fa0: 73 74 69 6e 63 74 22 20 6e 6f 6e 74 65 72 6d 69  stinct" nontermi
1fb0: 6e 61 6c 20 69 73 20 74 72 75 65 20 28 31 29 20  nal is true (1) 
1fc0: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
1fd0: 6b 65 79 77 6f 72 64 20 69 73 0a 2f 2f 20 70 72  keyword is.// pr
1fe0: 65 73 65 6e 74 20 61 6e 64 20 66 61 6c 73 65 20  esent and false 
1ff0: 28 30 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  (0) if it is not
2000: 2e 0a 2f 2f 0a 25 74 79 70 65 20 64 69 73 74 69  ..//.%type disti
2010: 6e 63 74 20 7b 69 6e 74 7d 0a 64 69 73 74 69 6e  nct {int}.distin
2020: 63 74 28 41 29 20 3a 3a 3d 20 44 49 53 54 49 4e  ct(A) ::= DISTIN
2030: 43 54 2e 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 64  CT.   {A = 1;}.d
2040: 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 41  istinct(A) ::= A
2050: 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20  LL.        {A = 
2060: 30 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20  0;}.distinct(A) 
2070: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
2080: 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73 65 6c  {A = 0;}..// sel
2090: 63 6f 6c 6c 69 73 74 20 69 73 20 61 20 6c 69 73  collist is a lis
20a0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
20b0: 20 74 68 61 74 20 61 72 65 20 74 6f 20 62 65 63   that are to bec
20c0: 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 0a 2f  ome the return./
20d0: 2f 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  / values of the 
20e0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
20f0: 2e 20 20 54 68 65 20 22 2a 22 20 69 6e 20 73 74  .  The "*" in st
2100: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 2f 2f  atements like.//
2110: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2120: 2e 2e 2e 22 20 69 73 20 65 6e 63 6f 64 65 64 20  ..." is encoded 
2130: 61 73 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  as a special exp
2140: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 6e 0a  ression with an.
2150: 2f 2f 20 6f 70 63 6f 64 65 20 6f 66 20 54 4b 5f  // opcode of TK_
2160: 41 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 65  ALL..//.%type se
2170: 6c 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69  lcollist {ExprLi
2180: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
2190: 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c   selcollist {sql
21a0: 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74  iteExprListDelet
21b0: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 63  e($$);}.%type sc
21c0: 6c 70 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  lp {ExprList*}.%
21d0: 64 65 73 74 72 75 63 74 6f 72 20 73 63 6c 70 20  destructor sclp 
21e0: 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44  {sqliteExprListD
21f0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 73 63 6c 70  elete($$);}.sclp
2200: 28 41 29 20 3a 3a 3d 20 73 65 6c 63 6f 6c 6c 69  (A) ::= selcolli
2210: 73 74 28 58 29 20 43 4f 4d 4d 41 2e 20 20 20 20  st(X) COMMA.    
2220: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
2230: 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20 2e 20  }.sclp(A) ::= . 
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2260: 41 20 3d 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69  A = 0;}.selcolli
2270: 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50  st(A) ::= sclp(P
2280: 29 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  ) expr(X).      
2290: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
22a0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 50  ExprListAppend(P
22b0: 2c 58 2c 30 29 3b 7d 0a 73 65 6c 63 6f 6c 6c 69  ,X,0);}.selcolli
22c0: 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50  st(A) ::= sclp(P
22d0: 29 20 65 78 70 72 28 58 29 20 61 73 20 69 64 73  ) expr(X) as ids
22e0: 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65  (Y). {A = sqlite
22f0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 50  ExprListAppend(P
2300: 2c 58 2c 26 59 29 3b 7d 0a 73 65 6c 63 6f 6c 6c  ,X,&Y);}.selcoll
2310: 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28  ist(A) ::= sclp(
2320: 50 29 20 53 54 41 52 2e 20 7b 0a 20 20 41 20 3d  P) STAR. {.  A =
2330: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
2340: 70 70 65 6e 64 28 50 2c 20 73 71 6c 69 74 65 45  ppend(P, sqliteE
2350: 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30  xpr(TK_ALL, 0, 0
2360: 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 61 73 20 3a  , 0), 0);.}.as :
2370: 3a 3d 20 2e 0a 61 73 20 3a 3a 3d 20 41 53 2e 0a  := ..as ::= AS..
2380: 0a 0a 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69  ..%type seltabli
2390: 73 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65  st {IdList*}.%de
23a0: 73 74 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c  structor seltabl
23b0: 69 73 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73  ist {sqliteIdLis
23c0: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
23d0: 79 70 65 20 73 74 6c 5f 70 72 65 66 69 78 20 7b  ype stl_prefix {
23e0: 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  IdList*}.%destru
23f0: 63 74 6f 72 20 73 74 6c 5f 70 72 65 66 69 78 20  ctor stl_prefix 
2400: 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c  {sqliteIdListDel
2410: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20  ete($$);}.%type 
2420: 66 72 6f 6d 20 7b 49 64 4c 69 73 74 2a 7d 0a 25  from {IdList*}.%
2430: 64 65 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20  destructor from 
2440: 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c  {sqliteIdListDel
2450: 65 74 65 28 24 24 29 3b 7d 0a 0a 66 72 6f 6d 28  ete($$);}..from(
2460: 41 29 20 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74  A) ::= FROM selt
2470: 61 62 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20  ablist(X).      
2480: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
2490: 7d 0a 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20  }.stl_prefix(A) 
24a0: 3a 3a 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 58  ::= seltablist(X
24b0: 29 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20  ) COMMA.        
24c0: 7b 41 20 3d 20 58 3b 7d 0a 73 74 6c 5f 70 72 65  {A = X;}.stl_pre
24d0: 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  fix(A) ::= .    
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
2500: 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a  seltablist(A) ::
2510: 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20  = stl_prefix(X) 
2520: 69 64 73 28 59 29 2e 20 20 20 20 20 20 20 7b 41  ids(Y).       {A
2530: 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41   = sqliteIdListA
2540: 70 70 65 6e 64 28 58 2c 26 59 29 3b 7d 0a 73 65  ppend(X,&Y);}.se
2550: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ltablist(A) ::= 
2560: 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20 69 64  stl_prefix(X) id
2570: 73 28 59 29 20 61 73 20 69 64 73 28 5a 29 2e 20  s(Y) as ids(Z). 
2580: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 49 64  {.  A = sqliteId
2590: 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59 29  ListAppend(X,&Y)
25a0: 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  ;.  sqliteIdList
25b0: 41 64 64 41 6c 69 61 73 28 41 2c 26 5a 29 3b 0a  AddAlias(A,&Z);.
25c0: 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20  }.seltablist(A) 
25d0: 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58  ::= stl_prefix(X
25e0: 29 20 4c 50 20 73 65 6c 65 63 74 28 53 29 20 52  ) LP select(S) R
25f0: 50 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  P. {.  A = sqlit
2600: 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  eIdListAppend(X,
2610: 30 29 3b 0a 20 20 41 2d 3e 61 5b 41 2d 3e 6e 49  0);.  A->a[A->nI
2620: 64 2d 31 5d 2e 70 53 65 6c 65 63 74 20 3d 20 53  d-1].pSelect = S
2630: 3b 0a 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28 41  ;.}.seltablist(A
2640: 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78  ) ::= stl_prefix
2650: 28 58 29 20 4c 50 20 73 65 6c 65 63 74 28 53 29  (X) LP select(S)
2660: 20 52 50 20 61 73 20 69 64 73 28 5a 29 2e 20 7b   RP as ids(Z). {
2670: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 49 64 4c  .  A = sqliteIdL
2680: 69 73 74 41 70 70 65 6e 64 28 58 2c 30 29 3b 0a  istAppend(X,0);.
2690: 20 20 41 2d 3e 61 5b 41 2d 3e 6e 49 64 2d 31 5d    A->a[A->nId-1]
26a0: 2e 70 53 65 6c 65 63 74 20 3d 20 53 3b 0a 20 20  .pSelect = S;.  
26b0: 73 71 6c 69 74 65 49 64 4c 69 73 74 41 64 64 41  sqliteIdListAddA
26c0: 6c 69 61 73 28 41 2c 26 5a 29 3b 0a 7d 0a 0a 25  lias(A,&Z);.}..%
26d0: 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f 70 74  type orderby_opt
26e0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
26f0: 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72 62 79  structor orderby
2700: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 45 78 70 72  _opt {sqliteExpr
2710: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
2720: 0a 25 74 79 70 65 20 73 6f 72 74 6c 69 73 74 20  .%type sortlist 
2730: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
2740: 74 72 75 63 74 6f 72 20 73 6f 72 74 6c 69 73 74  tructor sortlist
2750: 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74   {sqliteExprList
2760: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
2770: 70 65 20 73 6f 72 74 69 74 65 6d 20 7b 45 78 70  pe sortitem {Exp
2780: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
2790: 73 6f 72 74 69 74 65 6d 20 7b 73 71 6c 69 74 65  sortitem {sqlite
27a0: 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d  ExprDelete($$);}
27b0: 0a 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28 41 29  ..orderby_opt(A)
27c0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64 65 72 62 79  {A = 0;}.orderby
27f0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4f 52 44 45  _opt(A) ::= ORDE
2800: 52 20 42 59 20 73 6f 72 74 6c 69 73 74 28 58 29  R BY sortlist(X)
2810: 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a  .      {A = X;}.
2820: 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20  sortlist(A) ::= 
2830: 73 6f 72 74 6c 69 73 74 28 58 29 20 43 4f 4d 4d  sortlist(X) COMM
2840: 41 20 73 6f 72 74 69 74 65 6d 28 59 29 20 73 6f  A sortitem(Y) so
2850: 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20  rtorder(Z). {.  
2860: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  A = sqliteExprLi
2870: 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b  stAppend(X,Y,0);
2880: 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b  .  if( A ) A->a[
2890: 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  A->nExpr-1].sort
28a0: 4f 72 64 65 72 20 3d 20 5a 3b 20 20 2f 2a 20 30  Order = Z;  /* 0
28b0: 3d 61 73 63 65 6e 64 69 6e 67 2c 20 31 3d 64 65  =ascending, 1=de
28c0: 63 65 6e 64 69 6e 67 20 2a 2f 0a 7d 0a 73 6f 72  cending */.}.sor
28d0: 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f 72  tlist(A) ::= sor
28e0: 74 69 74 65 6d 28 59 29 20 73 6f 72 74 6f 72 64  titem(Y) sortord
28f0: 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73  er(Z). {.  A = s
2900: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
2910: 65 6e 64 28 30 2c 59 2c 30 29 3b 0a 20 20 69 66  end(0,Y,0);.  if
2920: 28 20 41 20 29 20 41 2d 3e 61 5b 30 5d 2e 73 6f  ( A ) A->a[0].so
2930: 72 74 4f 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a 73  rtOrder = Z;.}.s
2940: 6f 72 74 69 74 65 6d 28 41 29 20 3a 3a 3d 20 65  ortitem(A) ::= e
2950: 78 70 72 28 58 29 2e 20 20 20 7b 41 20 3d 20 58  xpr(X).   {A = X
2960: 3b 7d 0a 0a 25 74 79 70 65 20 73 6f 72 74 6f 72  ;}..%type sortor
2970: 64 65 72 20 7b 69 6e 74 7d 0a 0a 73 6f 72 74 6f  der {int}..sorto
2980: 72 64 65 72 28 41 29 20 3a 3a 3d 20 41 53 43 2e  rder(A) ::= ASC.
2990: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73        {A = 0;}.s
29a0: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20  ortorder(A) ::= 
29b0: 44 45 53 43 2e 20 20 20 20 20 7b 41 20 3d 20 31  DESC.     {A = 1
29c0: 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20  ;}.sortorder(A) 
29d0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 7b 41  ::= .         {A
29e0: 20 3d 20 30 3b 7d 0a 0a 25 74 79 70 65 20 67 72   = 0;}..%type gr
29f0: 6f 75 70 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c  oupby_opt {ExprL
2a00: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
2a10: 72 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73  r groupby_opt {s
2a20: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
2a30: 65 74 65 28 24 24 29 3b 7d 0a 67 72 6f 75 70 62  ete($$);}.groupb
2a40: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  y_opt(A) ::= .  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f      {A = 0;}.gro
2a70: 75 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  upby_opt(A) ::= 
2a80: 47 52 4f 55 50 20 42 59 20 65 78 70 72 6c 69 73  GROUP BY exprlis
2a90: 74 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  t(X).  {A = X;}.
2aa0: 0a 25 74 79 70 65 20 68 61 76 69 6e 67 5f 6f 70  .%type having_op
2ab0: 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72  t {Expr*}.%destr
2ac0: 75 63 74 6f 72 20 68 61 76 69 6e 67 5f 6f 70 74  uctor having_opt
2ad0: 20 7b 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65   {sqliteExprDele
2ae0: 74 65 28 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f  te($$);}.having_
2af0: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
2b10: 20 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28   0;}.having_opt(
2b20: 41 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78  A) ::= HAVING ex
2b30: 70 72 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d  pr(X).  {A = X;}
2b40: 0a 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70  ..%type limit_op
2b50: 74 20 7b 73 74 72 75 63 74 20 74 77 6f 69 6e 74  t {struct twoint
2b60: 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a  }.limit_opt(A) :
2b70: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
2b80: 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 2d 31 3b        {A.a = -1;
2b90: 20 41 2e 62 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74   A.b = 0;}.limit
2ba0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49  _opt(A) ::= LIMI
2bb0: 54 20 49 4e 54 45 47 45 52 28 58 29 2e 20 20 7b  T INTEGER(X).  {
2bc0: 41 2e 61 20 3d 20 61 74 6f 69 28 58 2e 7a 29 3b  A.a = atoi(X.z);
2bd0: 20 41 2e 62 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74   A.b = 0;}.limit
2be0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49  _opt(A) ::= LIMI
2bf0: 54 20 49 4e 54 45 47 45 52 28 58 29 20 6c 69 6d  T INTEGER(X) lim
2c00: 69 74 5f 73 65 70 20 49 4e 54 45 47 45 52 28 59  it_sep INTEGER(Y
2c10: 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ). .            
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 61          {A.a = a
2c40: 74 6f 69 28 58 2e 7a 29 3b 20 41 2e 62 20 3d 20  toi(X.z); A.b = 
2c50: 61 74 6f 69 28 59 2e 7a 29 3b 7d 0a 6c 69 6d 69  atoi(Y.z);}.limi
2c60: 74 5f 73 65 70 20 3a 3a 3d 20 4f 46 46 53 45 54  t_sep ::= OFFSET
2c70: 2e 0a 6c 69 6d 69 74 5f 73 65 70 20 3a 3a 3d 20  ..limit_sep ::= 
2c80: 43 4f 4d 4d 41 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  COMMA...////////
2c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ca0: 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54 45 20 73  /// The DELETE s
2cb0: 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f  tatement ///////
2cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cd0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
2ce0: 3d 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 64  = DELETE FROM id
2cf0: 73 28 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59  s(X) where_opt(Y
2d00: 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 44 65  )..    {sqliteDe
2d10: 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c  leteFrom(pParse,
2d20: 20 26 58 2c 20 59 29 3b 7d 0a 0a 25 74 79 70 65   &X, Y);}..%type
2d30: 20 77 68 65 72 65 5f 6f 70 74 20 7b 45 78 70 72   where_opt {Expr
2d40: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77  *}.%destructor w
2d50: 68 65 72 65 5f 6f 70 74 20 7b 73 71 6c 69 74 65  here_opt {sqlite
2d60: 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d  ExprDelete($$);}
2d70: 0a 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a  ..where_opt(A) :
2d80: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
2d90: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
2da0: 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a  .where_opt(A) ::
2db0: 3d 20 57 48 45 52 45 20 65 78 70 72 28 58 29 2e  = WHERE expr(X).
2dc0: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
2dd0: 0a 25 74 79 70 65 20 73 65 74 6c 69 73 74 20 7b  .%type setlist {
2de0: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
2df0: 72 75 63 74 6f 72 20 73 65 74 6c 69 73 74 20 7b  ructor setlist {
2e00: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
2e10: 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f 2f 2f  lete($$);}..////
2e20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e30: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54  ////// The UPDAT
2e40: 45 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  E command //////
2e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
2e70: 64 20 3a 3a 3d 20 55 50 44 41 54 45 20 6f 72 63  d ::= UPDATE orc
2e80: 6f 6e 66 28 52 29 20 69 64 73 28 58 29 20 53 45  onf(R) ids(X) SE
2e90: 54 20 73 65 74 6c 69 73 74 28 59 29 20 77 68 65  T setlist(Y) whe
2ea0: 72 65 5f 6f 70 74 28 5a 29 2e 0a 20 20 20 20 7b  re_opt(Z)..    {
2eb0: 73 71 6c 69 74 65 55 70 64 61 74 65 28 70 50 61  sqliteUpdate(pPa
2ec0: 72 73 65 2c 26 58 2c 59 2c 5a 2c 52 29 3b 7d 0a  rse,&X,Y,Z,R);}.
2ed0: 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20  .setlist(A) ::= 
2ee0: 73 65 74 6c 69 73 74 28 5a 29 20 43 4f 4d 4d 41  setlist(Z) COMMA
2ef0: 20 69 64 73 28 58 29 20 45 51 20 65 78 70 72 28   ids(X) EQ expr(
2f00: 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c  Y)..    {A = sql
2f10: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
2f20: 64 28 5a 2c 59 2c 26 58 29 3b 7d 0a 73 65 74 6c  d(Z,Y,&X);}.setl
2f30: 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 73 28 58  ist(A) ::= ids(X
2f40: 29 20 45 51 20 65 78 70 72 28 59 29 2e 20 20 20  ) EQ expr(Y).   
2f50: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  {A = sqliteExprL
2f60: 69 73 74 41 70 70 65 6e 64 28 30 2c 59 2c 26 58  istAppend(0,Y,&X
2f70: 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );}..///////////
2f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
2f90: 54 68 65 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61  The INSERT comma
2fa0: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
2fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2fc0: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
2fd0: 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e  insert_cmd(R) IN
2fe0: 54 4f 20 69 64 73 28 58 29 20 69 6e 73 63 6f 6c  TO ids(X) inscol
2ff0: 6c 69 73 74 5f 6f 70 74 28 46 29 20 56 41 4c 55  list_opt(F) VALU
3000: 45 53 20 4c 50 20 69 74 65 6d 6c 69 73 74 28 59  ES LP itemlist(Y
3010: 29 20 52 50 2e 0a 20 20 20 20 20 20 20 20 20 20  ) RP..          
3020: 20 20 20 20 20 7b 73 71 6c 69 74 65 49 6e 73 65       {sqliteInse
3030: 72 74 28 70 50 61 72 73 65 2c 20 26 58 2c 20 59  rt(pParse, &X, Y
3040: 2c 20 30 2c 20 46 2c 20 52 29 3b 7d 0a 63 6d 64  , 0, F, R);}.cmd
3050: 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28   ::= insert_cmd(
3060: 52 29 20 49 4e 54 4f 20 69 64 73 28 58 29 20 69  R) INTO ids(X) i
3070: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29  nscollist_opt(F)
3080: 20 73 65 6c 65 63 74 28 53 29 2e 0a 20 20 20 20   select(S)..    
3090: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
30a0: 74 65 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c  teInsert(pParse,
30b0: 20 26 58 2c 20 30 2c 20 53 2c 20 46 2c 20 52 29   &X, 0, S, F, R)
30c0: 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 65 72 74  ;}..%type insert
30d0: 5f 63 6d 64 20 7b 69 6e 74 7d 0a 69 6e 73 65 72  _cmd {int}.inser
30e0: 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e 53  t_cmd(A) ::= INS
30f0: 45 52 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20 20  ERT orconf(R).  
3100: 20 7b 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72 74   {A = R;}.insert
3110: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50 4c  _cmd(A) ::= REPL
3120: 41 43 45 2e 20 20 20 20 20 20 20 20 20 20 20 20  ACE.            
3130: 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  {A = OE_Replace;
3140: 7d 0a 0a 0a 25 74 79 70 65 20 69 74 65 6d 6c 69  }...%type itemli
3150: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
3160: 64 65 73 74 72 75 63 74 6f 72 20 69 74 65 6d 6c  destructor iteml
3170: 69 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c  ist {sqliteExprL
3180: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
3190: 0a 69 74 65 6d 6c 69 73 74 28 41 29 20 3a 3a 3d  .itemlist(A) ::=
31a0: 20 69 74 65 6d 6c 69 73 74 28 58 29 20 43 4f 4d   itemlist(X) COM
31b0: 4d 41 20 65 78 70 72 28 59 29 2e 20 20 7b 41 20  MA expr(Y).  {A 
31c0: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
31d0: 41 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b 7d 0a  Append(X,Y,0);}.
31e0: 69 74 65 6d 6c 69 73 74 28 41 29 20 3a 3a 3d 20  itemlist(A) ::= 
31f0: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20  expr(X).        
3200: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3210: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
3220: 70 70 65 6e 64 28 30 2c 58 2c 30 29 3b 7d 0a 0a  ppend(0,X,0);}..
3230: 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74  %type inscollist
3240: 5f 6f 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25  _opt {IdList*}.%
3250: 64 65 73 74 72 75 63 74 6f 72 20 69 6e 73 63 6f  destructor insco
3260: 6c 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74  llist_opt {sqlit
3270: 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24  eIdListDelete($$
3280: 29 3b 7d 0a 25 74 79 70 65 20 69 6e 73 63 6f 6c  );}.%type inscol
3290: 6c 69 73 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25  list {IdList*}.%
32a0: 64 65 73 74 72 75 63 74 6f 72 20 69 6e 73 63 6f  destructor insco
32b0: 6c 6c 69 73 74 20 7b 73 71 6c 69 74 65 49 64 4c  llist {sqliteIdL
32c0: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
32d0: 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28  .inscollist_opt(
32e0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
3300: 41 20 3d 20 30 3b 7d 0a 69 6e 73 63 6f 6c 6c 69  A = 0;}.inscolli
3310: 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50  st_opt(A) ::= LP
3320: 20 69 6e 73 63 6f 6c 6c 69 73 74 28 58 29 20 52   inscollist(X) R
3330: 50 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69  P.    {A = X;}.i
3340: 6e 73 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d  nscollist(A) ::=
3350: 20 69 6e 73 63 6f 6c 6c 69 73 74 28 58 29 20 43   inscollist(X) C
3360: 4f 4d 4d 41 20 69 64 73 28 59 29 2e 20 7b 41 20  OMMA ids(Y). {A 
3370: 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70  = sqliteIdListAp
3380: 70 65 6e 64 28 58 2c 26 59 29 3b 7d 0a 69 6e 73  pend(X,&Y);}.ins
3390: 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69  collist(A) ::= i
33a0: 64 73 28 59 29 2e 20 20 20 20 20 20 20 20 20 20  ds(Y).          
33b0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
33c0: 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65  sqliteIdListAppe
33d0: 6e 64 28 30 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f  nd(0,&Y);}..////
33e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
33f0: 2f 2f 2f 2f 2f 2f 2f 20 45 78 70 72 65 73 73 69  /////// Expressi
3400: 6f 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 2f 2f  on Processing //
3410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25  ///////////.//.%
3430: 6c 65 66 74 20 4f 52 2e 0a 25 6c 65 66 74 20 41  left OR..%left A
3440: 4e 44 2e 0a 25 72 69 67 68 74 20 4e 4f 54 2e 0a  ND..%right NOT..
3450: 25 6c 65 66 74 20 45 51 20 4e 45 20 49 53 4e 55  %left EQ NE ISNU
3460: 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 49 53 20 4c 49  LL NOTNULL IS LI
3470: 4b 45 20 47 4c 4f 42 20 42 45 54 57 45 45 4e 20  KE GLOB BETWEEN 
3480: 49 4e 2e 0a 25 6c 65 66 74 20 47 54 20 47 45 20  IN..%left GT GE 
3490: 4c 54 20 4c 45 2e 0a 25 6c 65 66 74 20 42 49 54  LT LE..%left BIT
34a0: 41 4e 44 20 42 49 54 4f 52 20 4c 53 48 49 46 54  AND BITOR LSHIFT
34b0: 20 52 53 48 49 46 54 2e 0a 25 6c 65 66 74 20 50   RSHIFT..%left P
34c0: 4c 55 53 20 4d 49 4e 55 53 2e 0a 25 6c 65 66 74  LUS MINUS..%left
34d0: 20 53 54 41 52 20 53 4c 41 53 48 20 52 45 4d 2e   STAR SLASH REM.
34e0: 0a 25 6c 65 66 74 20 43 4f 4e 43 41 54 2e 0a 25  .%left CONCAT..%
34f0: 72 69 67 68 74 20 55 4d 49 4e 55 53 20 42 49 54  right UMINUS BIT
3500: 4e 4f 54 2e 0a 0a 25 74 79 70 65 20 65 78 70 72  NOT...%type expr
3510: 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75   {Expr*}.%destru
3520: 63 74 6f 72 20 65 78 70 72 20 7b 73 71 6c 69 74  ctor expr {sqlit
3530: 65 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b  eExprDelete($$);
3540: 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c  }..expr(A) ::= L
3550: 50 28 42 29 20 65 78 70 72 28 58 29 20 52 50 28  P(B) expr(X) RP(
3560: 45 29 2e 20 7b 41 20 3d 20 58 3b 20 73 71 6c 69  E). {A = X; sqli
3570: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c  teExprSpan(A,&B,
3580: 26 45 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  &E);}.expr(A) ::
3590: 3d 20 4e 55 4c 4c 28 58 29 2e 20 20 20 20 20 20  = NULL(X).      
35a0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
35b0: 74 65 45 78 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20  teExpr(TK_NULL, 
35c0: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72  0, 0, &X);}.expr
35d0: 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 2e 20 20  (A) ::= id(X).  
35e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
35f0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3600: 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a  ID, 0, 0, &X);}.
3610: 65 78 70 72 28 41 29 20 3a 3a 3d 20 69 64 73 28  expr(A) ::= ids(
3620: 58 29 20 44 4f 54 20 69 64 73 28 59 29 2e 20 7b  X) DOT ids(Y). {
3630: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d  .  Expr *temp1 =
3640: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
3650: 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20  D, 0, 0, &X);.  
3660: 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71  Expr *temp2 = sq
3670: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20  liteExpr(TK_ID, 
3680: 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 41 20 3d  0, 0, &Y);.  A =
3690: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44   sqliteExpr(TK_D
36a0: 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d 70 32  OT, temp1, temp2
36b0: 2c 20 30 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  , 0);.}.expr(A) 
36c0: 3a 3a 3d 20 49 4e 54 45 47 45 52 28 58 29 2e 20  ::= INTEGER(X). 
36d0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
36e0: 45 78 70 72 28 54 4b 5f 49 4e 54 45 47 45 52 2c  Expr(TK_INTEGER,
36f0: 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70   0, 0, &X);}.exp
3700: 72 28 41 29 20 3a 3a 3d 20 46 4c 4f 41 54 28 58  r(A) ::= FLOAT(X
3710: 29 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73  ).        {A = s
3720: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 46 4c 4f  qliteExpr(TK_FLO
3730: 41 54 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a  AT, 0, 0, &X);}.
3740: 65 78 70 72 28 41 29 20 3a 3a 3d 20 53 54 52 49  expr(A) ::= STRI
3750: 4e 47 28 58 29 2e 20 20 20 20 20 20 20 7b 41 20  NG(X).       {A 
3760: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3770: 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20 26 58  STRING, 0, 0, &X
3780: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
3790: 49 44 28 58 29 20 4c 50 20 65 78 70 72 6c 69 73  ID(X) LP exprlis
37a0: 74 28 59 29 20 52 50 28 45 29 2e 20 7b 0a 20 20  t(Y) RP(E). {.  
37b0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 46 75  A = sqliteExprFu
37c0: 6e 63 74 69 6f 6e 28 59 2c 20 26 58 29 3b 0a 20  nction(Y, &X);. 
37d0: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
37e0: 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 65 78 70 72  A,&X,&E);.}.expr
37f0: 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 20 4c 50  (A) ::= ID(X) LP
3800: 20 53 54 41 52 20 52 50 28 45 29 2e 20 7b 0a 20   STAR RP(E). {. 
3810: 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 46   A = sqliteExprF
3820: 75 6e 63 74 69 6f 6e 28 30 2c 20 26 58 29 3b 0a  unction(0, &X);.
3830: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
3840: 28 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 65 78 70  (A,&X,&E);.}.exp
3850: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
3860: 20 41 4e 44 20 65 78 70 72 28 59 29 2e 20 20 20   AND expr(Y).   
3870: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
3880: 54 4b 5f 41 4e 44 2c 20 58 2c 20 59 2c 20 30 29  TK_AND, X, Y, 0)
3890: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
38a0: 78 70 72 28 58 29 20 4f 52 20 65 78 70 72 28 59  xpr(X) OR expr(Y
38b0: 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  ).    {A = sqlit
38c0: 65 45 78 70 72 28 54 4b 5f 4f 52 2c 20 58 2c 20  eExpr(TK_OR, X, 
38d0: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
38e0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c 54 20 65  ::= expr(X) LT e
38f0: 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20  xpr(Y).    {A = 
3900: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4c 54  sqliteExpr(TK_LT
3910: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
3920: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
3930: 20 47 54 20 65 78 70 72 28 59 29 2e 20 20 20 20   GT expr(Y).    
3940: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
3950: 54 4b 5f 47 54 2c 20 58 2c 20 59 2c 20 30 29 3b  TK_GT, X, Y, 0);
3960: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
3970: 70 72 28 58 29 20 4c 45 20 65 78 70 72 28 59 29  pr(X) LE expr(Y)
3980: 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  .    {A = sqlite
3990: 45 78 70 72 28 54 4b 5f 4c 45 2c 20 58 2c 20 59  Expr(TK_LE, X, Y
39a0: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
39b0: 3a 3d 20 65 78 70 72 28 58 29 20 47 45 20 65 78  := expr(X) GE ex
39c0: 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20 73  pr(Y).    {A = s
39d0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 47 45 2c  qliteExpr(TK_GE,
39e0: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
39f0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
3a00: 4e 45 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b  NE expr(Y).    {
3a10: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
3a20: 4b 5f 4e 45 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  K_NE, X, Y, 0);}
3a30: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
3a40: 72 28 58 29 20 45 51 20 65 78 70 72 28 59 29 2e  r(X) EQ expr(Y).
3a50: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45      {A = sqliteE
3a60: 78 70 72 28 54 4b 5f 45 51 2c 20 58 2c 20 59 2c  xpr(TK_EQ, X, Y,
3a70: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
3a80: 3d 20 65 78 70 72 28 58 29 20 42 49 54 41 4e 44  = expr(X) BITAND
3a90: 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73   expr(Y). {A = s
3aa0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 42 49 54  qliteExpr(TK_BIT
3ab0: 41 4e 44 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  AND, X, Y, 0);}.
3ac0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
3ad0: 28 58 29 20 42 49 54 4f 52 20 65 78 70 72 28 59  (X) BITOR expr(Y
3ae0: 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45  ).  {A = sqliteE
3af0: 78 70 72 28 54 4b 5f 42 49 54 4f 52 2c 20 58 2c  xpr(TK_BITOR, X,
3b00: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
3b10: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c 53 48   ::= expr(X) LSH
3b20: 49 46 54 20 65 78 70 72 28 59 29 2e 20 7b 41 20  IFT expr(Y). {A 
3b30: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3b40: 4c 53 48 49 46 54 2c 20 58 2c 20 59 2c 20 30 29  LSHIFT, X, Y, 0)
3b50: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
3b60: 78 70 72 28 58 29 20 52 53 48 49 46 54 20 65 78  xpr(X) RSHIFT ex
3b70: 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69  pr(Y). {A = sqli
3b80: 74 65 45 78 70 72 28 54 4b 5f 52 53 48 49 46 54  teExpr(TK_RSHIFT
3b90: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
3ba0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
3bb0: 20 4c 49 4b 45 20 65 78 70 72 28 59 29 2e 20 20   LIKE expr(Y).  
3bc0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
3bd0: 28 54 4b 5f 4c 49 4b 45 2c 20 58 2c 20 59 2c 20  (TK_LIKE, X, Y, 
3be0: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
3bf0: 20 65 78 70 72 28 58 29 20 4e 4f 54 20 4c 49 4b   expr(X) NOT LIK
3c00: 45 20 65 78 70 72 28 59 29 2e 20 20 7b 0a 20 20  E expr(Y).  {.  
3c10: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
3c20: 4b 5f 4c 49 4b 45 2c 20 58 2c 20 59 2c 20 30 29  K_LIKE, X, Y, 0)
3c30: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  ;.  A = sqliteEx
3c40: 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c  pr(TK_NOT, A, 0,
3c50: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70   0);.  sqliteExp
3c60: 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e  rSpan(A,&X->span
3c70: 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78  ,&Y->span);.}.ex
3c80: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
3c90: 29 20 47 4c 4f 42 20 65 78 70 72 28 59 29 2e 20  ) GLOB expr(Y). 
3ca0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
3cb0: 28 54 4b 5f 47 4c 4f 42 2c 58 2c 59 2c 30 29 3b  (TK_GLOB,X,Y,0);
3cc0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
3cd0: 70 72 28 58 29 20 4e 4f 54 20 47 4c 4f 42 20 65  pr(X) NOT GLOB e
3ce0: 78 70 72 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d  xpr(Y).  {.  A =
3cf0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 47   sqliteExpr(TK_G
3d00: 4c 4f 42 2c 20 58 2c 20 59 2c 20 30 29 3b 0a 20  LOB, X, Y, 0);. 
3d10: 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28   A = sqliteExpr(
3d20: 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29  TK_NOT, A, 0, 0)
3d30: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70  ;.  sqliteExprSp
3d40: 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 59  an(A,&X->span,&Y
3d50: 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28  ->span);.}.expr(
3d60: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 50  A) ::= expr(X) P
3d70: 4c 55 53 20 65 78 70 72 28 59 29 2e 20 20 7b 41  LUS expr(Y).  {A
3d80: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
3d90: 5f 50 4c 55 53 2c 20 58 2c 20 59 2c 20 30 29 3b  _PLUS, X, Y, 0);
3da0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
3db0: 70 72 28 58 29 20 4d 49 4e 55 53 20 65 78 70 72  pr(X) MINUS expr
3dc0: 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65  (Y). {A = sqlite
3dd0: 45 78 70 72 28 54 4b 5f 4d 49 4e 55 53 2c 20 58  Expr(TK_MINUS, X
3de0: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
3df0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 53 54  ) ::= expr(X) ST
3e00: 41 52 20 65 78 70 72 28 59 29 2e 20 20 7b 41 20  AR expr(Y).  {A 
3e10: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3e20: 53 54 41 52 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  STAR, X, Y, 0);}
3e30: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
3e40: 72 28 58 29 20 53 4c 41 53 48 20 65 78 70 72 28  r(X) SLASH expr(
3e50: 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 45  Y). {A = sqliteE
3e60: 78 70 72 28 54 4b 5f 53 4c 41 53 48 2c 20 58 2c  xpr(TK_SLASH, X,
3e70: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
3e80: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 52 45 4d   ::= expr(X) REM
3e90: 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d   expr(Y).   {A =
3ea0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 52   sqliteExpr(TK_R
3eb0: 45 4d 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  EM, X, Y, 0);}.e
3ec0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
3ed0: 58 29 20 43 4f 4e 43 41 54 20 65 78 70 72 28 59  X) CONCAT expr(Y
3ee0: 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78  ). {A = sqliteEx
3ef0: 70 72 28 54 4b 5f 43 4f 4e 43 41 54 2c 20 58 2c  pr(TK_CONCAT, X,
3f00: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
3f10: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 53 4e   ::= expr(X) ISN
3f20: 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20  ULL(E). {.  A = 
3f30: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 53  sqliteExpr(TK_IS
3f40: 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  NULL, X, 0, 0);.
3f50: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
3f60: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b  (A,&X->span,&E);
3f70: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .}.expr(A) ::= e
3f80: 78 70 72 28 58 29 20 49 53 20 4e 55 4c 4c 28 45  xpr(X) IS NULL(E
3f90: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
3fa0: 65 45 78 70 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c  eExpr(TK_ISNULL,
3fb0: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   X, 0, 0);.  sql
3fc0: 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58  iteExprSpan(A,&X
3fd0: 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78  ->span,&E);.}.ex
3fe0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
3ff0: 29 20 4e 4f 54 4e 55 4c 4c 28 45 29 2e 20 7b 0a  ) NOTNULL(E). {.
4000: 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72    A = sqliteExpr
4010: 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20  (TK_NOTNULL, X, 
4020: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45  0, 0);.  sqliteE
4030: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
4040: 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41  an,&E);.}.expr(A
4050: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f  ) ::= expr(X) NO
4060: 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41  T NULL(E). {.  A
4070: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
4080: 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20  _NOTNULL, X, 0, 
4090: 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  0);.  sqliteExpr
40a0: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
40b0: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
40c0: 3a 3d 20 65 78 70 72 28 58 29 20 49 53 20 4e 4f  := expr(X) IS NO
40d0: 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41  T NULL(E). {.  A
40e0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
40f0: 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20  _NOTNULL, X, 0, 
4100: 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  0);.  sqliteExpr
4110: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
4120: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
4130: 3a 3d 20 4e 4f 54 28 42 29 20 65 78 70 72 28 58  := NOT(B) expr(X
4140: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
4150: 65 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 58 2c  eExpr(TK_NOT, X,
4160: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
4170: 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 58  ExprSpan(A,&B,&X
4180: 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28  ->span);.}.expr(
4190: 41 29 20 3a 3a 3d 20 42 49 54 4e 4f 54 28 42 29  A) ::= BITNOT(B)
41a0: 20 65 78 70 72 28 58 29 2e 20 7b 0a 20 20 41 20   expr(X). {.  A 
41b0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
41c0: 42 49 54 4e 4f 54 2c 20 58 2c 20 30 2c 20 30 29  BITNOT, X, 0, 0)
41d0: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70  ;.  sqliteExprSp
41e0: 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e  an(A,&B,&X->span
41f0: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
4200: 20 4d 49 4e 55 53 28 42 29 20 65 78 70 72 28 58   MINUS(B) expr(X
4210: 29 2e 20 5b 55 4d 49 4e 55 53 5d 20 7b 0a 20 20  ). [UMINUS] {.  
4220: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
4230: 4b 5f 55 4d 49 4e 55 53 2c 20 58 2c 20 30 2c 20  K_UMINUS, X, 0, 
4240: 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  0);.  sqliteExpr
4250: 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70  Span(A,&B,&X->sp
4260: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  an);.}.expr(A) :
4270: 3a 3d 20 50 4c 55 53 28 42 29 20 65 78 70 72 28  := PLUS(B) expr(
4280: 58 29 2e 20 5b 55 4d 49 4e 55 53 5d 20 7b 0a 20  X). [UMINUS] {. 
4290: 20 41 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65   A = X;.  sqlite
42a0: 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 58  ExprSpan(A,&B,&X
42b0: 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28  ->span);.}.expr(
42c0: 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 73 65 6c  A) ::= LP(B) sel
42d0: 65 63 74 28 58 29 20 52 50 28 45 29 2e 20 7b 0a  ect(X) RP(E). {.
42e0: 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72    A = sqliteExpr
42f0: 28 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30  (TK_SELECT, 0, 0
4300: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20  , 0);.  if( A ) 
4310: 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20 58 3b 0a  A->pSelect = X;.
4320: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
4330: 28 41 2c 26 42 2c 26 45 29 3b 0a 7d 0a 65 78 70  (A,&B,&E);.}.exp
4340: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 57 29  r(A) ::= expr(W)
4350: 20 42 45 54 57 45 45 4e 20 65 78 70 72 28 58 29   BETWEEN expr(X)
4360: 20 41 4e 44 20 65 78 70 72 28 59 29 2e 20 7b 0a   AND expr(Y). {.
4370: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
4380: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  t = sqliteExprLi
4390: 73 74 41 70 70 65 6e 64 28 30 2c 20 58 2c 20 30  stAppend(0, X, 0
43a0: 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
43b0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
43c0: 64 28 70 4c 69 73 74 2c 20 59 2c 20 30 29 3b 0a  d(pList, Y, 0);.
43d0: 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72    A = sqliteExpr
43e0: 28 54 4b 5f 42 45 54 57 45 45 4e 2c 20 57 2c 20  (TK_BETWEEN, W, 
43f0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  0, 0);.  if( A )
4400: 20 41 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73   A->pList = pLis
4410: 74 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53  t;.  sqliteExprS
4420: 70 61 6e 28 41 2c 26 57 2d 3e 73 70 61 6e 2c 26  pan(A,&W->span,&
4430: 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72  Y->span);.}.expr
4440: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 57 29 20  (A) ::= expr(W) 
4450: 4e 4f 54 20 42 45 54 57 45 45 4e 20 65 78 70 72  NOT BETWEEN expr
4460: 28 58 29 20 41 4e 44 20 65 78 70 72 28 59 29 2e  (X) AND expr(Y).
4470: 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70   {.  ExprList *p
4480: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70  List = sqliteExp
4490: 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 58  rListAppend(0, X
44a0: 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  , 0);.  pList = 
44b0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
44c0: 70 65 6e 64 28 70 4c 69 73 74 2c 20 59 2c 20 30  pend(pList, Y, 0
44d0: 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45  );.  A = sqliteE
44e0: 78 70 72 28 54 4b 5f 42 45 54 57 45 45 4e 2c 20  xpr(TK_BETWEEN, 
44f0: 57 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  W, 0, 0);.  if( 
4500: 41 20 29 20 41 2d 3e 70 4c 69 73 74 20 3d 20 70  A ) A->pList = p
4510: 4c 69 73 74 3b 0a 20 20 41 20 3d 20 73 71 6c 69  List;.  A = sqli
4520: 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41  teExpr(TK_NOT, A
4530: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
4540: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 57 2d 3e  eExprSpan(A,&W->
4550: 73 70 61 6e 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a  span,&Y->span);.
4560: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
4570: 70 72 28 58 29 20 49 4e 20 4c 50 20 65 78 70 72  pr(X) IN LP expr
4580: 6c 69 73 74 28 59 29 20 52 50 28 45 29 2e 20 20  list(Y) RP(E).  
4590: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  {.  A = sqliteEx
45a0: 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20  pr(TK_IN, X, 0, 
45b0: 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d  0);.  if( A ) A-
45c0: 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 73 71  >pList = Y;.  sq
45d0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
45e0: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
45f0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
4600: 58 29 20 49 4e 20 4c 50 20 73 65 6c 65 63 74 28  X) IN LP select(
4610: 59 29 20 52 50 28 45 29 2e 20 20 7b 0a 20 20 41  Y) RP(E).  {.  A
4620: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
4630: 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20  _IN, X, 0, 0);. 
4640: 20 69 66 28 20 41 20 29 20 41 2d 3e 70 53 65 6c   if( A ) A->pSel
4650: 65 63 74 20 3d 20 59 3b 0a 20 20 73 71 6c 69 74  ect = Y;.  sqlit
4660: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  eExprSpan(A,&X->
4670: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72  span,&E);.}.expr
4680: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
4690: 4e 4f 54 20 49 4e 20 4c 50 20 65 78 70 72 6c 69  NOT IN LP exprli
46a0: 73 74 28 59 29 20 52 50 28 45 29 2e 20 20 7b 0a  st(Y) RP(E).  {.
46b0: 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72    A = sqliteExpr
46c0: 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29  (TK_IN, X, 0, 0)
46d0: 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70  ;.  if( A ) A->p
46e0: 4c 69 73 74 20 3d 20 59 3b 0a 20 20 41 20 3d 20  List = Y;.  A = 
46f0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f  sqliteExpr(TK_NO
4700: 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73  T, A, 0, 0);.  s
4710: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c  qliteExprSpan(A,
4720: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a  &X->span,&E);.}.
4730: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
4740: 28 58 29 20 4e 4f 54 20 49 4e 20 4c 50 20 73 65  (X) NOT IN LP se
4750: 6c 65 63 74 28 59 29 20 52 50 28 45 29 2e 20 20  lect(Y) RP(E).  
4760: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  {.  A = sqliteEx
4770: 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20  pr(TK_IN, X, 0, 
4780: 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d  0);.  if( A ) A-
4790: 3e 70 53 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20  >pSelect = Y;.  
47a0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
47b0: 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b  K_NOT, A, 0, 0);
47c0: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  .  sqliteExprSpa
47d0: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29  n(A,&X->span,&E)
47e0: 3b 0a 7d 0a 0a 2f 2a 20 43 41 53 45 20 65 78 70  ;.}../* CASE exp
47f0: 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 65 78 70 72  ressions */.expr
4800: 28 41 29 20 3a 3a 3d 20 43 41 53 45 28 43 29 20  (A) ::= CASE(C) 
4810: 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 58 29 20  case_operand(X) 
4820: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 59 29  case_exprlist(Y)
4830: 20 63 61 73 65 5f 65 6c 73 65 28 5a 29 20 45 4e   case_else(Z) EN
4840: 44 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  D(E). {.  A = sq
4850: 6c 69 74 65 45 78 70 72 28 54 4b 5f 43 41 53 45  liteExpr(TK_CASE
4860: 2c 20 58 2c 20 5a 2c 20 30 29 3b 0a 20 20 69 66  , X, Z, 0);.  if
4870: 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 20 3d  ( A ) A->pList =
4880: 20 59 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72   Y;.  sqliteExpr
4890: 53 70 61 6e 28 41 2c 20 26 43 2c 20 26 45 29 3b  Span(A, &C, &E);
48a0: 0a 7d 0a 25 74 79 70 65 20 63 61 73 65 5f 65 78  .}.%type case_ex
48b0: 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  prlist {ExprList
48c0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63  *}.%destructor c
48d0: 61 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 73 71  ase_exprlist {sq
48e0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
48f0: 74 65 28 24 24 29 3b 7d 0a 63 61 73 65 5f 65 78  te($$);}.case_ex
4900: 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 63 61  prlist(A) ::= ca
4910: 73 65 5f 65 78 70 72 6c 69 73 74 28 58 29 20 57  se_exprlist(X) W
4920: 48 45 4e 20 65 78 70 72 28 59 29 20 54 48 45 4e  HEN expr(Y) THEN
4930: 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20 20 41 20   expr(Z). {.  A 
4940: 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74  = sqliteExprList
4950: 41 70 70 65 6e 64 28 58 2c 20 59 2c 20 30 29 3b  Append(X, Y, 0);
4960: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70  .  A = sqliteExp
4970: 72 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 20 5a  rListAppend(A, Z
4980: 2c 20 30 29 3b 0a 7d 0a 63 61 73 65 5f 65 78 70  , 0);.}.case_exp
4990: 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 57 48 45  rlist(A) ::= WHE
49a0: 4e 20 65 78 70 72 28 59 29 20 54 48 45 4e 20 65  N expr(Y) THEN e
49b0: 78 70 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20  xpr(Z). {.  A = 
49c0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
49d0: 70 65 6e 64 28 30 2c 20 59 2c 20 30 29 3b 0a 20  pend(0, Y, 0);. 
49e0: 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c   A = sqliteExprL
49f0: 69 73 74 41 70 70 65 6e 64 28 41 2c 20 5a 2c 20  istAppend(A, Z, 
4a00: 30 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73 65  0);.}.%type case
4a10: 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a 63 61  _else {Expr*}.ca
4a20: 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20  se_else(A) ::=  
4a30: 45 4c 53 45 20 65 78 70 72 28 58 29 2e 20 20 20  ELSE expr(X).   
4a40: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 63        {A = X;}.c
4a50: 61 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20  ase_else(A) ::= 
4a60: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
4a70: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20         {A = 0;} 
4a80: 0a 25 74 79 70 65 20 63 61 73 65 5f 6f 70 65 72  .%type case_oper
4a90: 61 6e 64 20 7b 45 78 70 72 2a 7d 0a 63 61 73 65  and {Expr*}.case
4aa0: 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20  _operand(A) ::= 
4ab0: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20  expr(X).        
4ac0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 20 0a 63 61      {A = X;} .ca
4ad0: 73 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a  se_operand(A) ::
4ae0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4af0: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a        {A = 0;} .
4b00: 0a 25 74 79 70 65 20 65 78 70 72 6c 69 73 74 20  .%type exprlist 
4b10: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
4b20: 74 72 75 63 74 6f 72 20 65 78 70 72 6c 69 73 74  tructor exprlist
4b30: 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74   {sqliteExprList
4b40: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
4b50: 70 65 20 65 78 70 72 69 74 65 6d 20 7b 45 78 70  pe expritem {Exp
4b60: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
4b70: 65 78 70 72 69 74 65 6d 20 7b 73 71 6c 69 74 65  expritem {sqlite
4b80: 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d  ExprDelete($$);}
4b90: 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a  ..exprlist(A) ::
4ba0: 3d 20 65 78 70 72 6c 69 73 74 28 58 29 20 43 4f  = exprlist(X) CO
4bb0: 4d 4d 41 20 65 78 70 72 69 74 65 6d 28 59 29 2e  MMA expritem(Y).
4bc0: 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65   .   {A = sqlite
4bd0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58  ExprListAppend(X
4be0: 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 6c 69 73 74  ,Y,0);}.exprlist
4bf0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 69 74 65 6d  (A) ::= expritem
4c00: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
4c10: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  {A = sqliteExprL
4c20: 69 73 74 41 70 70 65 6e 64 28 30 2c 58 2c 30 29  istAppend(0,X,0)
4c30: 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41 29 20 3a  ;}.expritem(A) :
4c40: 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 20 20  := expr(X).     
4c50: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
4c60: 58 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41 29 20  X;}.expritem(A) 
4c70: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
4c90: 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   0;}..//////////
4ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4cb0: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 49  /// The CREATE I
4cc0: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  NDEX command ///
4cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ce0: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
4cf0: 43 52 45 41 54 45 28 53 29 20 75 6e 69 71 75 65  CREATE(S) unique
4d00: 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20 69 64  flag(U) INDEX id
4d10: 73 28 58 29 0a 20 20 20 20 20 20 20 20 4f 4e 20  s(X).        ON 
4d20: 69 64 73 28 59 29 20 4c 50 20 69 64 78 6c 69 73  ids(Y) LP idxlis
4d30: 74 28 5a 29 20 52 50 28 45 29 20 6f 6e 63 6f 6e  t(Z) RP(E) oncon
4d40: 66 28 52 29 2e 20 7b 0a 20 20 69 66 28 20 55 21  f(R). {.  if( U!
4d50: 3d 4f 45 5f 4e 6f 6e 65 20 29 20 55 20 3d 20 52  =OE_None ) U = R
4d60: 3b 0a 20 20 69 66 28 20 55 3d 3d 4f 45 5f 44 65  ;.  if( U==OE_De
4d70: 66 61 75 6c 74 29 20 55 20 3d 20 4f 45 5f 41 62  fault) U = OE_Ab
4d80: 6f 72 74 3b 0a 20 20 73 71 6c 69 74 65 43 72 65  ort;.  sqliteCre
4d90: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
4da0: 20 26 58 2c 20 26 59 2c 20 5a 2c 20 55 2c 20 26   &X, &Y, Z, U, &
4db0: 53 2c 20 26 45 29 3b 0a 7d 0a 0a 25 74 79 70 65  S, &E);.}..%type
4dc0: 20 75 6e 69 71 75 65 66 6c 61 67 20 7b 69 6e 74   uniqueflag {int
4dd0: 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20  }.uniqueflag(A) 
4de0: 3a 3a 3d 20 55 4e 49 51 55 45 2e 20 20 7b 20 41  ::= UNIQUE.  { A
4df0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 20 7d 0a 75   = OE_Abort; }.u
4e00: 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d  niqueflag(A) ::=
4e10: 20 2e 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20   .        { A = 
4e20: 4f 45 5f 4e 6f 6e 65 3b 20 7d 0a 0a 25 74 79 70  OE_None; }..%typ
4e30: 65 20 69 64 78 6c 69 73 74 20 7b 49 64 4c 69 73  e idxlist {IdLis
4e40: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
4e50: 69 64 78 6c 69 73 74 20 7b 73 71 6c 69 74 65 49  idxlist {sqliteI
4e60: 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  dListDelete($$);
4e70: 7d 0a 25 74 79 70 65 20 69 64 78 69 74 65 6d 20  }.%type idxitem 
4e80: 7b 54 6f 6b 65 6e 7d 0a 0a 69 64 78 6c 69 73 74  {Token}..idxlist
4e90: 28 41 29 20 3a 3a 3d 20 69 64 78 6c 69 73 74 28  (A) ::= idxlist(
4ea0: 58 29 20 43 4f 4d 4d 41 20 69 64 78 69 74 65 6d  X) COMMA idxitem
4eb0: 28 59 29 2e 20 20 0a 20 20 20 20 20 7b 41 20 3d  (Y).  .     {A =
4ec0: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70   sqliteIdListApp
4ed0: 65 6e 64 28 58 2c 26 59 29 3b 7d 0a 69 64 78 6c  end(X,&Y);}.idxl
4ee0: 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 78 69 74  ist(A) ::= idxit
4ef0: 65 6d 28 59 29 2e 0a 20 20 20 20 20 7b 41 20 3d  em(Y)..     {A =
4f00: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70   sqliteIdListApp
4f10: 65 6e 64 28 30 2c 26 59 29 3b 7d 0a 69 64 78 69  end(0,&Y);}.idxi
4f20: 74 65 6d 28 41 29 20 3a 3a 3d 20 69 64 73 28 58  tem(A) ::= ids(X
4f30: 29 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d  ).          {A =
4f40: 20 58 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   X;}..//////////
4f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f60: 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20 49 4e 44  /// The DROP IND
4f70: 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  EX command /////
4f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f90: 2f 2f 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d  ////.//..cmd ::=
4fa0: 20 44 52 4f 50 20 49 4e 44 45 58 20 69 64 73 28   DROP INDEX ids(
4fb0: 58 29 2e 20 20 20 20 20 20 7b 73 71 6c 69 74 65  X).      {sqlite
4fc0: 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72 73 65  DropIndex(pParse
4fd0: 2c 20 26 58 29 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f  , &X);}...//////
4fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ff0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 4f 50 59  /////// The COPY
5000: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
5010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5020: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
5030: 3a 3a 3d 20 43 4f 50 59 20 6f 72 63 6f 6e 66 28  ::= COPY orconf(
5040: 52 29 20 69 64 73 28 58 29 20 46 52 4f 4d 20 69  R) ids(X) FROM i
5050: 64 73 28 59 29 20 55 53 49 4e 47 20 44 45 4c 49  ds(Y) USING DELI
5060: 4d 49 54 45 52 53 20 53 54 52 49 4e 47 28 5a 29  MITERS STRING(Z)
5070: 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 43 6f 70  ..    {sqliteCop
5080: 79 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 26  y(pParse,&X,&Y,&
5090: 5a 2c 52 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 43  Z,R);}.cmd ::= C
50a0: 4f 50 59 20 6f 72 63 6f 6e 66 28 52 29 20 69 64  OPY orconf(R) id
50b0: 73 28 58 29 20 46 52 4f 4d 20 69 64 73 28 59 29  s(X) FROM ids(Y)
50c0: 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 43 6f 70  ..    {sqliteCop
50d0: 79 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 30  y(pParse,&X,&Y,0
50e0: 2c 52 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  ,R);}../////////
50f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5100: 2f 2f 2f 2f 20 54 68 65 20 56 41 43 55 55 4d 20  //// The VACUUM 
5110: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
5120: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5130: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
5140: 20 56 41 43 55 55 4d 2e 20 20 20 20 20 20 20 20   VACUUM.        
5150: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 56          {sqliteV
5160: 61 63 75 75 6d 28 70 50 61 72 73 65 2c 30 29 3b  acuum(pParse,0);
5170: 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d  }.cmd ::= VACUUM
5180: 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20 20   ids(X).        
5190: 20 7b 73 71 6c 69 74 65 56 61 63 75 75 6d 28 70   {sqliteVacuum(p
51a0: 50 61 72 73 65 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f  Parse,&X);}..///
51b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
51c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 50  ////////// The P
51d0: 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 2f 2f  RAGMA command //
51e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
51f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
5200: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 69 64  md ::= PRAGMA id
5210: 73 28 58 29 20 45 51 20 69 64 73 28 59 29 2e 20  s(X) EQ ids(Y). 
5220: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 50          {sqliteP
5230: 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c  ragma(pParse,&X,
5240: 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  &Y,0);}.cmd ::= 
5250: 50 52 41 47 4d 41 20 69 64 73 28 58 29 20 45 51  PRAGMA ids(X) EQ
5260: 20 4f 4e 28 59 29 2e 20 20 20 20 20 20 20 20 20   ON(Y).         
5270: 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61 28 70   {sqlitePragma(p
5280: 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b 7d  Parse,&X,&Y,0);}
5290: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
52a0: 69 64 73 28 58 29 20 45 51 20 70 6c 75 73 5f 6e  ids(X) EQ plus_n
52b0: 75 6d 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74  um(Y).    {sqlit
52c0: 65 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26  ePragma(pParse,&
52d0: 58 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a  X,&Y,0);}.cmd ::
52e0: 3d 20 50 52 41 47 4d 41 20 69 64 73 28 58 29 20  = PRAGMA ids(X) 
52f0: 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29 2e  EQ minus_num(Y).
5300: 20 20 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61     {sqlitePragma
5310: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 31 29  (pParse,&X,&Y,1)
5320: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  ;}.cmd ::= PRAGM
5330: 41 20 69 64 73 28 58 29 20 4c 50 20 69 64 73 28  A ids(X) LP ids(
5340: 59 29 20 52 50 2e 20 20 20 20 20 20 7b 73 71 6c  Y) RP.      {sql
5350: 69 74 65 50 72 61 67 6d 61 28 70 50 61 72 73 65  itePragma(pParse
5360: 2c 26 58 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20  ,&X,&Y,0);}.cmd 
5370: 3a 3a 3d 20 50 52 41 47 4d 41 20 69 64 73 28 58  ::= PRAGMA ids(X
5380: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
5390: 20 20 20 20 20 7b 73 71 6c 69 74 65 50 72 61 67       {sqlitePrag
53a0: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 58 2c  ma(pParse,&X,&X,
53b0: 30 29 3b 7d 0a 70 6c 75 73 5f 6e 75 6d 28 41 29  0);}.plus_num(A)
53c0: 20 3a 3a 3d 20 70 6c 75 73 5f 6f 70 74 20 6e 75   ::= plus_opt nu
53d0: 6d 62 65 72 28 58 29 2e 20 20 20 7b 41 20 3d 20  mber(X).   {A = 
53e0: 58 3b 7d 0a 6d 69 6e 75 73 5f 6e 75 6d 28 41 29  X;}.minus_num(A)
53f0: 20 3a 3a 3d 20 4d 49 4e 55 53 20 6e 75 6d 62 65   ::= MINUS numbe
5400: 72 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58  r(X).     {A = X
5410: 3b 7d 0a 6e 75 6d 62 65 72 28 41 29 20 3a 3a 3d  ;}.number(A) ::=
5420: 20 49 4e 54 45 47 45 52 28 58 29 2e 20 20 7b 41   INTEGER(X).  {A
5430: 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72 28 41 29   = X;}.number(A)
5440: 20 3a 3a 3d 20 46 4c 4f 41 54 28 58 29 2e 20 20   ::= FLOAT(X).  
5450: 20 20 7b 41 20 3d 20 58 3b 7d 0a 70 6c 75 73 5f    {A = X;}.plus_
5460: 6f 70 74 20 3a 3a 3d 20 50 4c 55 53 2e 0a 70 6c  opt ::= PLUS..pl
5470: 75 73 5f 6f 70 74 20 3a 3a 3d 20 2e 0a           us_opt ::= ..