/ Hex Artifact Content
Login

Artifact 2275a832b544e8b57c422880a0d9badd4976d042:


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 33 36 20 32 30 30 31 2f 31 30 2f 31 32 20 31  .36 2001/10/12 1
0290: 37 3a 33 30 3a 30 35 20 64 72 68 20 45 78 70 20  7:30:05 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 7d 0a  ude "parse.h".}.
03b0: 0a 2f 2f 20 54 68 65 73 65 20 61 72 65 20 65 78  .// These are ex
03c0: 74 72 61 20 74 6f 6b 65 6e 73 20 75 73 65 64 20  tra tokens used 
03d0: 62 79 20 74 68 65 20 6c 65 78 65 72 20 62 75 74  by the lexer but
03e0: 20 6e 65 76 65 72 20 73 65 65 6e 20 62 79 20 74   never seen by t
03f0: 68 65 0a 2f 2f 20 70 61 72 73 65 72 2e 20 20 57  he.// parser.  W
0400: 65 20 70 75 74 20 74 68 65 6d 20 69 6e 20 61 20  e put them in a 
0410: 72 75 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  rule so that the
0420: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0430: 72 20 77 69 6c 6c 0a 2f 2f 20 61 64 64 20 74 68  r will.// add th
0440: 65 6d 20 74 6f 20 74 68 65 20 70 61 72 73 65 2e  em to the parse.
0450: 68 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 0a 2f  h output file../
0460: 2f 0a 25 6e 6f 6e 61 73 73 6f 63 20 45 4e 44 5f  /.%nonassoc END_
0470: 4f 46 5f 46 49 4c 45 20 49 4c 4c 45 47 41 4c 20  OF_FILE ILLEGAL 
0480: 53 50 41 43 45 20 55 4e 43 4c 4f 53 45 44 5f 53  SPACE UNCLOSED_S
0490: 54 52 49 4e 47 20 43 4f 4d 4d 45 4e 54 20 46 55  TRING COMMENT FU
04a0: 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  NCTION.         
04b0: 20 43 4f 4c 55 4d 4e 20 41 47 47 5f 46 55 4e 43   COLUMN AGG_FUNC
04c0: 54 49 4f 4e 2e 0a 0a 2f 2f 20 49 6e 70 75 74 20  TION...// Input 
04d0: 69 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  is zero or more 
04e0: 63 6f 6d 6d 61 6e 64 73 2e 0a 69 6e 70 75 74 20  commands..input 
04f0: 3a 3a 3d 20 63 6d 64 6c 69 73 74 2e 0a 0a 2f 2f  ::= cmdlist...//
0500: 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61   A list of comma
0510: 6e 64 73 20 69 73 20 7a 65 72 6f 20 6f 72 20 6d  nds is zero or m
0520: 6f 72 65 20 63 6f 6d 6d 61 6e 64 73 0a 2f 2f 0a  ore commands.//.
0530: 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 65 63 6d 64  cmdlist ::= ecmd
0540: 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 63 6d  ..cmdlist ::= cm
0550: 64 6c 69 73 74 20 53 45 4d 49 20 65 63 6d 64 2e  dlist SEMI ecmd.
0560: 0a 65 63 6d 64 20 3a 3a 3d 20 65 78 70 6c 61 69  .ecmd ::= explai
0570: 6e 20 63 6d 64 2e 20 20 7b 73 71 6c 69 74 65 45  n cmd.  {sqliteE
0580: 78 65 63 28 70 50 61 72 73 65 29 3b 7d 0a 65 63  xec(pParse);}.ec
0590: 6d 64 20 3a 3a 3d 20 63 6d 64 2e 20 20 20 20 20  md ::= cmd.     
05a0: 20 20 20 20 20 7b 73 71 6c 69 74 65 45 78 65 63       {sqliteExec
05b0: 28 70 50 61 72 73 65 29 3b 7d 0a 65 63 6d 64 20  (pParse);}.ecmd 
05c0: 3a 3a 3d 20 2e 0a 65 78 70 6c 61 69 6e 20 3a 3a  ::= ..explain ::
05d0: 3d 20 45 58 50 4c 41 49 4e 2e 20 20 20 20 7b 70  = EXPLAIN.    {p
05e0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d  Parse->explain =
05f0: 20 31 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   1;}..//////////
0600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69  /////////// Begi
0610: 6e 20 61 6e 64 20 65 6e 64 20 74 72 61 6e 73 61  n and end transa
0620: 63 74 69 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f  ctions. ////////
0630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0640: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
0650: 42 45 47 49 4e 20 74 72 61 6e 73 5f 6f 70 74 2e  BEGIN trans_opt.
0660: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 42 65         {sqliteBe
0670: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  ginTransaction(p
0680: 50 61 72 73 65 29 3b 7d 0a 74 72 61 6e 73 5f 6f  Parse);}.trans_o
0690: 70 74 20 3a 3a 3d 20 2e 0a 74 72 61 6e 73 5f 6f  pt ::= ..trans_o
06a0: 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49  pt ::= TRANSACTI
06b0: 4f 4e 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a  ON..trans_opt ::
06c0: 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e 20 69 64  = TRANSACTION id
06d0: 73 2e 0a 63 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49  s..cmd ::= COMMI
06e0: 54 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20  T trans_opt.    
06f0: 20 20 7b 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54    {sqliteCommitT
0700: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73  ransaction(pPars
0710: 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 45 4e 44  e);}.cmd ::= END
0720: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20   trans_opt.     
0730: 20 20 20 20 7b 73 71 6c 69 74 65 43 6f 6d 6d 69      {sqliteCommi
0740: 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  tTransaction(pPa
0750: 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52  rse);}.cmd ::= R
0760: 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73 5f 6f 70  OLLBACK trans_op
0770: 74 2e 20 20 20 20 7b 73 71 6c 69 74 65 52 6f 6c  t.    {sqliteRol
0780: 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
0790: 28 70 50 61 72 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f  (pParse);}..////
07a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
07b0: 2f 20 54 68 65 20 43 52 45 41 54 45 20 54 41 42  / The CREATE TAB
07c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  LE statement ///
07d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
07e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
07f0: 20 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61 62 6c   ::= create_tabl
0800: 65 20 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61  e create_table_a
0810: 72 67 73 2e 0a 63 72 65 61 74 65 5f 74 61 62 6c  rgs..create_tabl
0820: 65 20 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 20  e ::= CREATE(X) 
0830: 74 65 6d 70 28 54 29 20 54 41 42 4c 45 20 69 64  temp(T) TABLE id
0840: 73 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20  s(Y)..          
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 7b 73 71 6c 69 74 65 53 74 61 72 74 54 61 62   {sqliteStartTab
0880: 6c 65 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c  le(pParse,&X,&Y,
0890: 54 29 3b 7d 0a 25 74 79 70 65 20 74 65 6d 70 20  T);}.%type temp 
08a0: 7b 69 6e 74 7d 0a 74 65 6d 70 28 41 29 20 3a 3a  {int}.temp(A) ::
08b0: 3d 20 54 45 4d 50 2e 20 20 7b 41 20 3d 20 31 3b  = TEMP.  {A = 1;
08c0: 7d 0a 74 65 6d 70 28 41 29 20 3a 3a 3d 20 2e 20  }.temp(A) ::= . 
08d0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 63 72       {A = 0;}.cr
08e0: 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 20  eate_table_args 
08f0: 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e 6c 69 73  ::= LP columnlis
0900: 74 20 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 52  t conslist_opt R
0910: 50 28 58 29 2e 0a 20 20 20 20 20 20 20 20 20 20  P(X)..          
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 7b 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65   {sqliteEndTable
0950: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63 6f  (pParse,&X);}.co
0960: 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c  lumnlist ::= col
0970: 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63 6f  umnlist COMMA co
0980: 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e 6c 69 73 74  lumn..columnlist
0990: 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e 0a 0a 2f 2f   ::= column...//
09a0: 20 41 62 6f 75 74 20 74 68 65 20 6f 6e 6c 79 20   About the only 
09b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  information used
09c0: 20 66 6f 72 20 61 20 63 6f 6c 75 6d 6e 20 69 73   for a column is
09d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
09e0: 0a 2f 2f 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  .// column.  The
09f0: 20 74 79 70 65 20 69 73 20 61 6c 77 61 79 73 20   type is always 
0a00: 6a 75 73 74 20 22 74 65 78 74 22 2e 20 20 42 75  just "text".  Bu
0a10: 74 20 74 68 65 20 63 6f 64 65 20 77 69 6c 6c 20  t the code will 
0a20: 61 63 63 65 70 74 0a 2f 2f 20 61 6e 20 65 6c 61  accept.// an ela
0a30: 62 6f 72 61 74 65 20 74 79 70 65 6e 61 6d 65 2e  borate typename.
0a40: 20 20 50 65 72 68 61 70 73 20 73 6f 6d 65 64 61    Perhaps someda
0a50: 79 20 77 65 27 6c 6c 20 64 6f 20 73 6f 6d 65 74  y we'll do somet
0a60: 68 69 6e 67 20 77 69 74 68 20 69 74 2e 0a 2f 2f  hing with it..//
0a70: 0a 63 6f 6c 75 6d 6e 20 3a 3a 3d 20 63 6f 6c 75  .column ::= colu
0a80: 6d 6e 69 64 20 74 79 70 65 20 63 61 72 67 6c 69  mnid type cargli
0a90: 73 74 2e 20 0a 63 6f 6c 75 6d 6e 69 64 20 3a 3a  st. .columnid ::
0aa0: 3d 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20  = ids(X).       
0ab0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
0ac0: 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  AddColumn(pParse
0ad0: 2c 26 58 29 3b 7d 0a 0a 2f 2f 20 41 6e 20 49 44  ,&X);}..// An ID
0ae0: 45 4e 54 49 46 49 45 52 20 63 61 6e 20 62 65 20  ENTIFIER can be 
0af0: 61 20 67 65 6e 65 72 69 63 20 69 64 65 6e 74 69  a generic identi
0b00: 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  fier, or one of 
0b10: 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65 79 77 6f  several.// keywo
0b20: 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e 2d 73 74  rds.  Any non-st
0b30: 61 6e 64 61 72 64 20 6b 65 79 77 6f 72 64 20 63  andard keyword c
0b40: 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e 20 69 64  an also be an id
0b50: 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 20 57 65 20  entifier..// We 
0b60: 61 6c 73 6f 20 6d 61 6b 65 20 44 45 53 43 20 61  also make DESC a
0b70: 6e 64 20 69 64 65 6e 74 69 66 69 65 72 20 73 69  nd identifier si
0b80: 6e 63 65 20 69 74 20 63 6f 6d 65 73 20 75 70 20  nce it comes up 
0b90: 73 6f 20 6f 66 74 65 6e 20 28 61 73 0a 2f 2f 20  so often (as.// 
0ba0: 61 6e 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20  an abbreviation 
0bb0: 6f 66 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22  of "description"
0bc0: 29 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64 20 7b  )..//.%type id {
0bd0: 54 6f 6b 65 6e 7d 0a 69 64 28 41 29 20 3a 3a 3d  Token}.id(A) ::=
0be0: 20 44 45 53 43 28 58 29 2e 20 20 20 20 20 20 20   DESC(X).       
0bf0: 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a  {A = X;}.id(A) :
0c00: 3a 3d 20 41 53 43 28 58 29 2e 20 20 20 20 20 20  := ASC(X).      
0c10: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29    {A = X;}.id(A)
0c20: 20 3a 3a 3d 20 44 45 4c 49 4d 49 54 45 52 53 28   ::= DELIMITERS(
0c30: 58 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28  X). {A = X;}.id(
0c40: 41 29 20 3a 3a 3d 20 45 58 50 4c 41 49 4e 28 58  A) ::= EXPLAIN(X
0c50: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69  ).    {A = X;}.i
0c60: 64 28 41 29 20 3a 3a 3d 20 56 41 43 55 55 4d 28  d(A) ::= VACUUM(
0c70: 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  X).     {A = X;}
0c80: 0a 69 64 28 41 29 20 3a 3a 3d 20 42 45 47 49 4e  .id(A) ::= BEGIN
0c90: 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58  (X).      {A = X
0ca0: 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 45 4e 44  ;}.id(A) ::= END
0cb0: 28 58 29 2e 20 20 20 20 20 20 20 20 7b 41 20 3d  (X).        {A =
0cc0: 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 50   X;}.id(A) ::= P
0cd0: 52 41 47 4d 41 28 58 29 2e 20 20 20 20 20 7b 41  RAGMA(X).     {A
0ce0: 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d   = X;}.id(A) ::=
0cf0: 20 43 4c 55 53 54 45 52 28 58 29 2e 20 20 20 20   CLUSTER(X).    
0d00: 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a  {A = X;}.id(A) :
0d10: 3a 3d 20 49 44 28 58 29 2e 20 20 20 20 20 20 20  := ID(X).       
0d20: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29    {A = X;}.id(A)
0d30: 20 3a 3a 3d 20 54 45 4d 50 28 58 29 2e 20 20 20   ::= TEMP(X).   
0d40: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f      {A = X;}..//
0d50: 20 41 6e 64 20 22 69 64 73 22 20 69 73 20 61 6e   And "ids" is an
0d60: 20 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d 73 74   identifer-or-st
0d70: 72 69 6e 67 2e 0a 2f 2f 0a 25 74 79 70 65 20 69  ring..//.%type i
0d80: 64 73 20 7b 54 6f 6b 65 6e 7d 0a 69 64 73 28 41  ds {Token}.ids(A
0d90: 29 20 3a 3a 3d 20 69 64 28 58 29 2e 20 20 20 20  ) ::= id(X).    
0da0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 73      {A = X;}.ids
0db0: 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58  (A) ::= STRING(X
0dc0: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  ).    {A = X;}..
0dd0: 74 79 70 65 20 3a 3a 3d 20 2e 0a 74 79 70 65 20  type ::= ..type 
0de0: 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 2e  ::= typename(X).
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e00: 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f      {sqliteAddCo
0e10: 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c  lumnType(pParse,
0e20: 26 58 2c 26 58 29 3b 7d 0a 74 79 70 65 20 3a 3a  &X,&X);}.type ::
0e30: 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 20 4c 50  = typename(X) LP
0e40: 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e 20 20   signed RP(Y).  
0e50: 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f 6c 75    {sqliteAddColu
0e60: 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 58  mnType(pParse,&X
0e70: 2c 26 59 29 3b 7d 0a 74 79 70 65 20 3a 3a 3d 20  ,&Y);}.type ::= 
0e80: 74 79 70 65 6e 61 6d 65 28 58 29 20 4c 50 20 73  typename(X) LP s
0e90: 69 67 6e 65 64 20 43 4f 4d 4d 41 20 73 69 67 6e  igned COMMA sign
0ea0: 65 64 20 52 50 28 59 29 2e 0a 20 20 20 20 20 20  ed RP(Y)..      
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ed0: 20 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f 6c     {sqliteAddCol
0ee0: 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26  umnType(pParse,&
0ef0: 58 2c 26 59 29 3b 7d 0a 25 74 79 70 65 20 74 79  X,&Y);}.%type ty
0f00: 70 65 6e 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a 74  pename {Token}.t
0f10: 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 69  ypename(A) ::= i
0f20: 64 73 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  ds(X).          
0f30: 20 7b 41 20 3d 20 58 3b 7d 0a 74 79 70 65 6e 61   {A = X;}.typena
0f40: 6d 65 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61  me(A) ::= typena
0f50: 6d 65 28 58 29 20 69 64 73 2e 20 20 7b 41 20 3d  me(X) ids.  {A =
0f60: 20 58 3b 7d 0a 73 69 67 6e 65 64 20 3a 3a 3d 20   X;}.signed ::= 
0f70: 49 4e 54 45 47 45 52 2e 0a 73 69 67 6e 65 64 20  INTEGER..signed 
0f80: 3a 3a 3d 20 50 4c 55 53 20 49 4e 54 45 47 45 52  ::= PLUS INTEGER
0f90: 2e 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 4d 49 4e  ..signed ::= MIN
0fa0: 55 53 20 49 4e 54 45 47 45 52 2e 0a 63 61 72 67  US INTEGER..carg
0fb0: 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c 69 73  list ::= carglis
0fc0: 74 20 63 61 72 67 2e 0a 63 61 72 67 6c 69 73 74  t carg..carglist
0fd0: 20 3a 3a 3d 20 2e 0a 63 61 72 67 20 3a 3a 3d 20   ::= ..carg ::= 
0fe0: 43 4f 4e 53 54 52 41 49 4e 54 20 69 64 73 20 63  CONSTRAINT ids c
0ff0: 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 63  cons..carg ::= c
1000: 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 44  cons..carg ::= D
1010: 45 46 41 55 4c 54 20 53 54 52 49 4e 47 28 58 29  EFAULT STRING(X)
1020: 2e 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69  .          {sqli
1030: 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  teAddDefaultValu
1040: 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d  e(pParse,&X,0);}
1050: 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c  .carg ::= DEFAUL
1060: 54 20 49 44 28 58 29 2e 20 20 20 20 20 20 20 20  T ID(X).        
1070: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64        {sqliteAdd
1080: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61  DefaultValue(pPa
1090: 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67  rse,&X,0);}.carg
10a0: 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 49 4e 54   ::= DEFAULT INT
10b0: 45 47 45 52 28 58 29 2e 20 20 20 20 20 20 20 20  EGER(X).        
10c0: 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61 75   {sqliteAddDefau
10d0: 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26  ltValue(pParse,&
10e0: 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20  X,0);}.carg ::= 
10f0: 44 45 46 41 55 4c 54 20 50 4c 55 53 20 49 4e 54  DEFAULT PLUS INT
1100: 45 47 45 52 28 58 29 2e 20 20 20 20 7b 73 71 6c  EGER(X).    {sql
1110: 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c  iteAddDefaultVal
1120: 75 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b  ue(pParse,&X,0);
1130: 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55  }.carg ::= DEFAU
1140: 4c 54 20 4d 49 4e 55 53 20 49 4e 54 45 47 45 52  LT MINUS INTEGER
1150: 28 58 29 2e 20 20 20 7b 73 71 6c 69 74 65 41 64  (X).   {sqliteAd
1160: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
1170: 61 72 73 65 2c 26 58 2c 31 29 3b 7d 0a 63 61 72  arse,&X,1);}.car
1180: 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 46 4c  g ::= DEFAULT FL
1190: 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20 20 20  OAT(X).         
11a0: 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61    {sqliteAddDefa
11b0: 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  ultValue(pParse,
11c0: 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d  &X,0);}.carg ::=
11d0: 20 44 45 46 41 55 4c 54 20 50 4c 55 53 20 46 4c   DEFAULT PLUS FL
11e0: 4f 41 54 28 58 29 2e 20 20 20 20 20 20 7b 73 71  OAT(X).      {sq
11f0: 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61  liteAddDefaultVa
1200: 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29  lue(pParse,&X,0)
1210: 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41  ;}.carg ::= DEFA
1220: 55 4c 54 20 4d 49 4e 55 53 20 46 4c 4f 41 54 28  ULT MINUS FLOAT(
1230: 58 29 2e 20 20 20 20 20 7b 73 71 6c 69 74 65 41  X).     {sqliteA
1240: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70  ddDefaultValue(p
1250: 50 61 72 73 65 2c 26 58 2c 31 29 3b 7d 0a 63 61  Parse,&X,1);}.ca
1260: 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4e  rg ::= DEFAULT N
1270: 55 4c 4c 2e 20 0a 0a 2f 2f 20 49 6e 20 61 64 64  ULL. ..// In add
1280: 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 79 70  ition to the typ
1290: 65 20 6e 61 6d 65 2c 20 77 65 20 61 6c 73 6f 20  e name, we also 
12a0: 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 70  care about the p
12b0: 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 0a 2f  rimary key and./
12c0: 2f 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  / UNIQUE constra
12d0: 69 6e 74 73 2e 0a 2f 2f 0a 63 63 6f 6e 73 20 3a  ints..//.ccons :
12e0: 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 2e 20 20 20 20  := NOT NULL.    
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
1300: 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28  qliteAddNotNull(
1310: 70 50 61 72 73 65 29 3b 7d 0a 63 63 6f 6e 73 20  pParse);}.ccons 
1320: 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20  ::= PRIMARY KEY 
1330: 73 6f 72 74 6f 72 64 65 72 2e 20 20 20 20 20 7b  sortorder.     {
1340: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
1350: 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 31  x(pParse,0,0,0,1
1360: 2c 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  ,0,0);}.ccons ::
1370: 3d 20 55 4e 49 51 55 45 2e 20 20 20 20 20 20 20  = UNIQUE.       
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
1390: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28  liteCreateIndex(
13a0: 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 31 2c 30  pParse,0,0,0,1,0
13b0: 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,0);}.ccons ::= 
13c0: 43 48 45 43 4b 20 4c 50 20 65 78 70 72 20 52 50  CHECK LP expr RP
13d0: 2e 0a 0a 2f 2f 20 46 6f 72 20 74 68 65 20 74 69  ...// For the ti
13e0: 6d 65 20 62 65 69 6e 67 2c 20 74 68 65 20 6f 6e  me being, the on
13f0: 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 65  ly constraint we
1400: 20 63 61 72 65 20 61 62 6f 75 74 20 69 73 20 74   care about is t
1410: 68 65 20 70 72 69 6d 61 72 79 0a 2f 2f 20 6b 65  he primary.// ke
1420: 79 20 61 6e 64 20 55 4e 49 51 55 45 2e 20 20 42  y and UNIQUE.  B
1430: 6f 74 68 20 63 72 65 61 74 65 20 69 6e 64 69 63  oth create indic
1440: 65 73 2e 0a 2f 2f 0a 63 6f 6e 73 6c 69 73 74 5f  es..//.conslist_
1450: 6f 70 74 20 3a 3a 3d 20 2e 0a 63 6f 6e 73 6c 69  opt ::= ..consli
1460: 73 74 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4d 4d 41  st_opt ::= COMMA
1470: 20 63 6f 6e 73 6c 69 73 74 2e 0a 63 6f 6e 73 6c   conslist..consl
1480: 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74  ist ::= conslist
1490: 20 43 4f 4d 4d 41 20 74 63 6f 6e 73 2e 0a 63 6f   COMMA tcons..co
14a0: 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c  nslist ::= consl
14b0: 69 73 74 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c  ist tcons..consl
14c0: 69 73 74 20 3a 3a 3d 20 74 63 6f 6e 73 2e 0a 74  ist ::= tcons..t
14d0: 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54 52 41  cons ::= CONSTRA
14e0: 49 4e 54 20 69 64 73 2e 0a 74 63 6f 6e 73 20 3a  INT ids..tcons :
14f0: 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4c  := PRIMARY KEY L
1500: 50 20 69 64 78 6c 69 73 74 28 58 29 20 52 50 2e  P idxlist(X) RP.
1510: 20 7b 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e   {sqliteCreateIn
1520: 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 58  dex(pParse,0,0,X
1530: 2c 31 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20  ,1,0,0);}.tcons 
1540: 3a 3a 3d 20 55 4e 49 51 55 45 20 4c 50 20 69 64  ::= UNIQUE LP id
1550: 78 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20 20  xlist(X) RP.    
1560: 20 20 7b 73 71 6c 69 74 65 43 72 65 61 74 65 49    {sqliteCreateI
1570: 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c  ndex(pParse,0,0,
1580: 58 2c 31 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e 73  X,1,0,0);}.tcons
1590: 20 3a 3a 3d 20 43 48 45 43 4b 20 65 78 70 72 2e   ::= CHECK expr.
15a0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
15b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
15c0: 20 44 52 4f 50 20 54 41 42 4c 45 20 2f 2f 2f 2f   DROP TABLE ////
15d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
15f0: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f  /.//.cmd ::= DRO
1600: 50 20 54 41 42 4c 45 20 69 64 73 28 58 29 2e 20  P TABLE ids(X). 
1610: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1620: 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
1630: 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ,&X);}..////////
1640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1650: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1660: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
1670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1680: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
1690: 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b  := select(X).  {
16a0: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28  .  sqliteSelect(
16b0: 70 50 61 72 73 65 2c 20 58 2c 20 53 52 54 5f 43  pParse, X, SRT_C
16c0: 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 73  allback, 0);.  s
16d0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
16e0: 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  e(X);.}..%type s
16f0: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
1700: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
1710: 63 74 20 7b 73 71 6c 69 74 65 53 65 6c 65 63 74  ct {sqliteSelect
1720: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
1730: 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65  pe oneselect {Se
1740: 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  lect*}.%destruct
1750: 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71  or oneselect {sq
1760: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
1770: 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74 28 41  ($$);}..select(A
1780: 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28  ) ::= oneselect(
1790: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
17a0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
17b0: 7d 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20  }.select(A) ::= 
17c0: 73 65 6c 65 63 74 28 58 29 20 6a 6f 69 6e 6f 70  select(X) joinop
17d0: 28 59 29 20 6f 6e 65 73 65 6c 65 63 74 28 5a 29  (Y) oneselect(Z)
17e0: 2e 20 20 7b 0a 20 20 69 66 28 20 5a 20 29 7b 0a  .  {.  if( Z ){.
17f0: 20 20 20 20 5a 2d 3e 6f 70 20 3d 20 59 3b 0a 20      Z->op = Y;. 
1800: 20 20 20 5a 2d 3e 70 50 72 69 6f 72 20 3d 20 58     Z->pPrior = X
1810: 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 5a 3b 0a 7d  ;.  }.  A = Z;.}
1820: 0a 25 74 79 70 65 20 6a 6f 69 6e 6f 70 20 7b 69  .%type joinop {i
1830: 6e 74 7d 0a 6a 6f 69 6e 6f 70 28 41 29 20 3a 3a  nt}.joinop(A) ::
1840: 3d 20 55 4e 49 4f 4e 2e 20 20 20 20 20 20 7b 41  = UNION.      {A
1850: 20 3d 20 54 4b 5f 55 4e 49 4f 4e 3b 7d 0a 6a 6f   = TK_UNION;}.jo
1860: 69 6e 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f  inop(A) ::= UNIO
1870: 4e 20 41 4c 4c 2e 20 20 7b 41 20 3d 20 54 4b 5f  N ALL.  {A = TK_
1880: 41 4c 4c 3b 7d 0a 6a 6f 69 6e 6f 70 28 41 29 20  ALL;}.joinop(A) 
1890: 3a 3a 3d 20 49 4e 54 45 52 53 45 43 54 2e 20 20  ::= INTERSECT.  
18a0: 7b 41 20 3d 20 54 4b 5f 49 4e 54 45 52 53 45 43  {A = TK_INTERSEC
18b0: 54 3b 7d 0a 6a 6f 69 6e 6f 70 28 41 29 20 3a 3a  T;}.joinop(A) ::
18c0: 3d 20 45 58 43 45 50 54 2e 20 20 20 20 20 7b 41  = EXCEPT.     {A
18d0: 20 3d 20 54 4b 5f 45 58 43 45 50 54 3b 7d 0a 6f   = TK_EXCEPT;}.o
18e0: 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20  neselect(A) ::= 
18f0: 53 45 4c 45 43 54 20 64 69 73 74 69 6e 63 74 28  SELECT distinct(
1900: 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57 29  D) selcollist(W)
1910: 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65 5f 6f   from(X) where_o
1920: 70 74 28 59 29 0a 20 20 20 20 20 20 20 20 20 20  pt(Y).          
1930: 20 20 20 20 20 20 20 67 72 6f 75 70 62 79 5f 6f         groupby_o
1940: 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f 70 74  pt(P) having_opt
1950: 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 28  (Q) orderby_opt(
1960: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
1970: 74 65 53 65 6c 65 63 74 4e 65 77 28 57 2c 58 2c  teSelectNew(W,X,
1980: 59 2c 50 2c 51 2c 5a 2c 44 29 3b 0a 7d 0a 0a 2f  Y,P,Q,Z,D);.}../
1990: 2f 20 54 68 65 20 22 64 69 73 74 69 6e 63 74 22  / The "distinct"
19a0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 69 73 20   nonterminal is 
19b0: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 20  true (1) if the 
19c0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64  DISTINCT keyword
19d0: 20 69 73 0a 2f 2f 20 70 72 65 73 65 6e 74 20 61   is.// present a
19e0: 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69 66 20  nd false (0) if 
19f0: 69 74 20 69 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74  it is not..//.%t
1a00: 79 70 65 20 64 69 73 74 69 6e 63 74 20 7b 69 6e  ype distinct {in
1a10: 74 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a  t}.distinct(A) :
1a20: 3a 3d 20 44 49 53 54 49 4e 43 54 2e 20 20 20 7b  := DISTINCT.   {
1a30: 41 20 3d 20 31 3b 7d 0a 64 69 73 74 69 6e 63 74  A = 1;}.distinct
1a40: 28 41 29 20 3a 3a 3d 20 41 4c 4c 2e 20 20 20 20  (A) ::= ALL.    
1a50: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 69 73      {A = 0;}.dis
1a60: 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 2e 20 20  tinct(A) ::= .  
1a70: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
1a80: 7d 0a 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69 73 74  }..// selcollist
1a90: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78   is a list of ex
1aa0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61  pressions that a
1ab0: 72 65 20 74 6f 20 62 65 63 6f 6d 65 20 74 68 65  re to become the
1ac0: 20 72 65 74 75 72 6e 0a 2f 2f 20 76 61 6c 75 65   return.// value
1ad0: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  s of the SELECT 
1ae0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 74  statement.  In t
1af0: 68 65 20 63 61 73 65 20 6f 66 20 22 53 45 4c 45  he case of "SELE
1b00: 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 0a 2f  CT * FROM ..."./
1b10: 2f 20 74 68 65 20 73 65 6c 63 6f 6c 6c 69 73 74  / the selcollist
1b20: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20   value is NULL. 
1b30: 20 0a 2f 2f 0a 25 74 79 70 65 20 73 65 6c 63 6f   .//.%type selco
1b40: 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a  llist {ExprList*
1b50: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 65  }.%destructor se
1b60: 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69 74 65  lcollist {sqlite
1b70: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24  ExprListDelete($
1b80: 24 29 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70 20  $);}.%type sclp 
1b90: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
1ba0: 74 72 75 63 74 6f 72 20 73 63 6c 70 20 7b 73 71  tructor sclp {sq
1bb0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
1bc0: 74 65 28 24 24 29 3b 7d 0a 73 63 6c 70 28 41 29  te($$);}.sclp(A)
1bd0: 20 3a 3a 3d 20 73 65 6c 63 6f 6c 6c 69 73 74 28   ::= selcollist(
1be0: 58 29 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20  X) COMMA.       
1bf0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73        {A = X;}.s
1c00: 63 6c 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  clp(A) ::= .    
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
1c30: 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28   0;}.selcollist(
1c40: 41 29 20 3a 3a 3d 20 53 54 41 52 2e 20 20 20 20  A) ::= STAR.    
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63 6f    {A = 0;}.selco
1c70: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c  llist(A) ::= scl
1c80: 70 28 50 29 20 65 78 70 72 28 58 29 2e 20 20 20  p(P) expr(X).   
1c90: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
1ca0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
1cb0: 64 28 50 2c 58 2c 30 29 3b 7d 0a 73 65 6c 63 6f  d(P,X,0);}.selco
1cc0: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c  llist(A) ::= scl
1cd0: 70 28 50 29 20 65 78 70 72 28 58 29 20 61 73 20  p(P) expr(X) as 
1ce0: 69 64 73 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c  ids(Y). {A = sql
1cf0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
1d00: 64 28 50 2c 58 2c 26 59 29 3b 7d 0a 61 73 20 3a  d(P,X,&Y);}.as :
1d10: 3a 3d 20 2e 0a 61 73 20 3a 3a 3d 20 41 53 2e 0a  := ..as ::= AS..
1d20: 0a 0a 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69  ..%type seltabli
1d30: 73 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65  st {IdList*}.%de
1d40: 73 74 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c  structor seltabl
1d50: 69 73 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73  ist {sqliteIdLis
1d60: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
1d70: 79 70 65 20 73 74 6c 5f 70 72 65 66 69 78 20 7b  ype stl_prefix {
1d80: 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  IdList*}.%destru
1d90: 63 74 6f 72 20 73 74 6c 5f 70 72 65 66 69 78 20  ctor stl_prefix 
1da0: 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c  {sqliteIdListDel
1db0: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20  ete($$);}.%type 
1dc0: 66 72 6f 6d 20 7b 49 64 4c 69 73 74 2a 7d 0a 25  from {IdList*}.%
1dd0: 64 65 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20  destructor from 
1de0: 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c  {sqliteIdListDel
1df0: 65 74 65 28 24 24 29 3b 7d 0a 0a 66 72 6f 6d 28  ete($$);}..from(
1e00: 41 29 20 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74  A) ::= FROM selt
1e10: 61 62 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20  ablist(X).      
1e20: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
1e30: 7d 0a 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20  }.stl_prefix(A) 
1e40: 3a 3a 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 58  ::= seltablist(X
1e50: 29 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20  ) COMMA.        
1e60: 7b 41 20 3d 20 58 3b 7d 0a 73 74 6c 5f 70 72 65  {A = X;}.stl_pre
1e70: 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  fix(A) ::= .    
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
1ea0: 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a  seltablist(A) ::
1eb0: 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20  = stl_prefix(X) 
1ec0: 69 64 73 28 59 29 2e 20 20 20 20 20 20 20 7b 41  ids(Y).       {A
1ed0: 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41   = sqliteIdListA
1ee0: 70 70 65 6e 64 28 58 2c 26 59 29 3b 7d 0a 73 65  ppend(X,&Y);}.se
1ef0: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ltablist(A) ::= 
1f00: 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20 69 64  stl_prefix(X) id
1f10: 73 28 59 29 20 61 73 20 69 64 73 28 5a 29 2e 20  s(Y) as ids(Z). 
1f20: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 49 64  {.  A = sqliteId
1f30: 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59 29  ListAppend(X,&Y)
1f40: 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74  ;.  sqliteIdList
1f50: 41 64 64 41 6c 69 61 73 28 41 2c 26 5a 29 3b 0a  AddAlias(A,&Z);.
1f60: 7d 0a 0a 25 74 79 70 65 20 6f 72 64 65 72 62 79  }..%type orderby
1f70: 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d  _opt {ExprList*}
1f80: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f 72 64  .%destructor ord
1f90: 65 72 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65  erby_opt {sqlite
1fa0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24  ExprListDelete($
1fb0: 24 29 3b 7d 0a 25 74 79 70 65 20 73 6f 72 74 6c  $);}.%type sortl
1fc0: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
1fd0: 25 64 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74  %destructor sort
1fe0: 6c 69 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72  list {sqliteExpr
1ff0: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
2000: 0a 25 74 79 70 65 20 73 6f 72 74 69 74 65 6d 20  .%type sortitem 
2010: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
2020: 74 6f 72 20 73 6f 72 74 69 74 65 6d 20 7b 73 71  tor sortitem {sq
2030: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 24  liteExprDelete($
2040: 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70  $);}..orderby_op
2050: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64      {A = 0;}.ord
2080: 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  erby_opt(A) ::= 
2090: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73  ORDER BY sortlis
20a0: 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20  t(X).      {A = 
20b0: 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20  X;}.sortlist(A) 
20c0: 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29 20  ::= sortlist(X) 
20d0: 43 4f 4d 4d 41 20 73 6f 72 74 69 74 65 6d 28 59  COMMA sortitem(Y
20e0: 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20  ) sortorder(Z). 
20f0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  {.  A = sqliteEx
2100: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 59  prListAppend(X,Y
2110: 2c 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41  ,0);.  if( A ) A
2120: 2d 3e 61 5b 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[A->nExpr-1].
2130: 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a 3b 20 20  sortOrder = Z;  
2140: 2f 2a 20 30 3d 61 73 63 65 6e 64 69 6e 67 2c 20  /* 0=ascending, 
2150: 31 3d 64 65 63 65 6e 64 69 6e 67 20 2a 2f 0a 7d  1=decending */.}
2160: 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d  .sortlist(A) ::=
2170: 20 73 6f 72 74 69 74 65 6d 28 59 29 20 73 6f 72   sortitem(Y) sor
2180: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
2190: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
21a0: 74 41 70 70 65 6e 64 28 30 2c 59 2c 30 29 3b 0a  tAppend(0,Y,0);.
21b0: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 30    if( A ) A->a[0
21c0: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a 3b  ].sortOrder = Z;
21d0: 0a 7d 0a 73 6f 72 74 69 74 65 6d 28 41 29 20 3a  .}.sortitem(A) :
21e0: 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 7b 41  := expr(X).   {A
21f0: 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 73 6f   = X;}..%type so
2200: 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d 0a 0a 73  rtorder {int}..s
2210: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20  ortorder(A) ::= 
2220: 41 53 43 2e 20 20 20 20 20 20 7b 41 20 3d 20 30  ASC.      {A = 0
2230: 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20  ;}.sortorder(A) 
2240: 3a 3a 3d 20 44 45 53 43 2e 20 20 20 20 20 7b 41  ::= DESC.     {A
2250: 20 3d 20 31 3b 7d 0a 73 6f 72 74 6f 72 64 65 72   = 1;}.sortorder
2260: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
2270: 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 25 74 79 70    {A = 0;}..%typ
2280: 65 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 45  e groupby_opt {E
2290: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
22a0: 75 63 74 6f 72 20 67 72 6f 75 70 62 79 5f 6f 70  uctor groupby_op
22b0: 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73  t {sqliteExprLis
22c0: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 67 72  tDelete($$);}.gr
22d0: 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d  oupby_opt(A) ::=
22e0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
22f0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
2300: 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20  .groupby_opt(A) 
2310: 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 65 78 70  ::= GROUP BY exp
2320: 72 6c 69 73 74 28 58 29 2e 20 20 7b 41 20 3d 20  rlist(X).  {A = 
2330: 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76 69 6e  X;}..%type havin
2340: 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64  g_opt {Expr*}.%d
2350: 65 73 74 72 75 63 74 6f 72 20 68 61 76 69 6e 67  estructor having
2360: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 45 78 70 72  _opt {sqliteExpr
2370: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 68 61 76  Delete($$);}.hav
2380: 69 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  ing_opt(A) ::= .
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 7b 41 20 3d 20 30 3b 7d 0a 68 61 76 69 6e 67 5f  {A = 0;}.having_
23b0: 6f 70 74 28 41 29 20 3a 3a 3d 20 48 41 56 49 4e  opt(A) ::= HAVIN
23c0: 47 20 65 78 70 72 28 58 29 2e 20 20 7b 41 20 3d  G expr(X).  {A =
23d0: 20 58 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   X;}..//////////
23e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
23f0: 2f 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61  / The DELETE sta
2400: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
2410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2420: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
2430: 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 64 73 28  DELETE FROM ids(
2440: 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29 2e  X) where_opt(Y).
2450: 0a 20 20 20 20 7b 73 71 6c 69 74 65 44 65 6c 65  .    {sqliteDele
2460: 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 26  teFrom(pParse, &
2470: 58 2c 20 59 29 3b 7d 0a 0a 25 74 79 70 65 20 77  X, Y);}..%type w
2480: 68 65 72 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d  here_opt {Expr*}
2490: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77 68 65  .%destructor whe
24a0: 72 65 5f 6f 70 74 20 7b 73 71 6c 69 74 65 45 78  re_opt {sqliteEx
24b0: 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a  prDelete($$);}..
24c0: 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d  where_opt(A) ::=
24d0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
24e0: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 77        {A = 0;}.w
24f0: 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  here_opt(A) ::= 
2500: 57 48 45 52 45 20 65 78 70 72 28 58 29 2e 20 20  WHERE expr(X).  
2510: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25       {A = X;}..%
2520: 74 79 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78  type setlist {Ex
2530: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
2540: 63 74 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71  ctor setlist {sq
2550: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
2560: 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  te($$);}..//////
2570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2580: 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20  //// The UPDATE 
2590: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
25a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25b0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
25c0: 3a 3a 3d 20 55 50 44 41 54 45 20 69 64 73 28 58  ::= UPDATE ids(X
25d0: 29 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29  ) SET setlist(Y)
25e0: 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 0a 20   where_opt(Z).. 
25f0: 20 20 20 7b 73 71 6c 69 74 65 55 70 64 61 74 65     {sqliteUpdate
2600: 28 70 50 61 72 73 65 2c 26 58 2c 59 2c 5a 29 3b  (pParse,&X,Y,Z);
2610: 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a  }..setlist(A) ::
2620: 3d 20 73 65 74 6c 69 73 74 28 5a 29 20 43 4f 4d  = setlist(Z) COM
2630: 4d 41 20 69 64 73 28 58 29 20 45 51 20 65 78 70  MA ids(X) EQ exp
2640: 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  r(Y)..    {A = s
2650: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
2660: 65 6e 64 28 5a 2c 59 2c 26 58 29 3b 7d 0a 73 65  end(Z,Y,&X);}.se
2670: 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 73  tlist(A) ::= ids
2680: 28 58 29 20 45 51 20 65 78 70 72 28 59 29 2e 20  (X) EQ expr(Y). 
2690: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70    {A = sqliteExp
26a0: 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 59 2c  rListAppend(0,Y,
26b0: 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  &X);}../////////
26c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26d0: 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63 6f 6d  / The INSERT com
26e0: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
26f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2700: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
2710: 3d 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 69 64  = INSERT INTO id
2720: 73 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f  s(X) inscollist_
2730: 6f 70 74 28 46 29 20 56 41 4c 55 45 53 20 4c 50  opt(F) VALUES LP
2740: 20 69 74 65 6d 6c 69 73 74 28 59 29 20 52 50 2e   itemlist(Y) RP.
2750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2760: 7b 73 71 6c 69 74 65 49 6e 73 65 72 74 28 70 50  {sqliteInsert(pP
2770: 61 72 73 65 2c 20 26 58 2c 20 59 2c 20 30 2c 20  arse, &X, Y, 0, 
2780: 46 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 49 4e 53  F);}.cmd ::= INS
2790: 45 52 54 20 49 4e 54 4f 20 69 64 73 28 58 29 20  ERT INTO ids(X) 
27a0: 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46  inscollist_opt(F
27b0: 29 20 73 65 6c 65 63 74 28 53 29 2e 0a 20 20 20  ) select(S)..   
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
27d0: 69 74 65 49 6e 73 65 72 74 28 70 50 61 72 73 65  iteInsert(pParse
27e0: 2c 20 26 58 2c 20 30 2c 20 53 2c 20 46 29 3b 7d  , &X, 0, S, F);}
27f0: 0a 0a 0a 25 74 79 70 65 20 69 74 65 6d 6c 69 73  ...%type itemlis
2800: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
2810: 65 73 74 72 75 63 74 6f 72 20 69 74 65 6d 6c 69  estructor itemli
2820: 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69  st {sqliteExprLi
2830: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25  stDelete($$);}.%
2840: 74 79 70 65 20 69 74 65 6d 20 7b 45 78 70 72 2a  type item {Expr*
2850: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69 74  }.%destructor it
2860: 65 6d 20 7b 73 71 6c 69 74 65 45 78 70 72 44 65  em {sqliteExprDe
2870: 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69 74 65 6d  lete($$);}..item
2880: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 74 65 6d  list(A) ::= item
2890: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 69 74  list(X) COMMA it
28a0: 65 6d 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c  em(Y).  {A = sql
28b0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
28c0: 64 28 58 2c 59 2c 30 29 3b 7d 0a 69 74 65 6d 6c  d(X,Y,0);}.iteml
28d0: 69 73 74 28 41 29 20 3a 3a 3d 20 69 74 65 6d 28  ist(A) ::= item(
28e0: 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 73 71 6c  X).     {A = sql
28f0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
2900: 64 28 30 2c 58 2c 30 29 3b 7d 0a 69 74 65 6d 28  d(0,X,0);}.item(
2910: 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 28 58  A) ::= INTEGER(X
2920: 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c  ).      {A = sql
2930: 69 74 65 45 78 70 72 28 54 4b 5f 49 4e 54 45 47  iteExpr(TK_INTEG
2940: 45 52 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a  ER, 0, 0, &X);}.
2950: 69 74 65 6d 28 41 29 20 3a 3a 3d 20 50 4c 55 53  item(A) ::= PLUS
2960: 20 49 4e 54 45 47 45 52 28 58 29 2e 20 7b 41 20   INTEGER(X). {A 
2970: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
2980: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26  INTEGER, 0, 0, &
2990: 58 29 3b 7d 0a 69 74 65 6d 28 41 29 20 3a 3a 3d  X);}.item(A) ::=
29a0: 20 4d 49 4e 55 53 20 49 4e 54 45 47 45 52 28 58   MINUS INTEGER(X
29b0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
29c0: 65 45 78 70 72 28 54 4b 5f 55 4d 49 4e 55 53 2c  eExpr(TK_UMINUS,
29d0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
29e0: 20 41 20 29 20 41 2d 3e 70 4c 65 66 74 20 3d 20   A ) A->pLeft = 
29f0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e  sqliteExpr(TK_IN
2a00: 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 58 29  TEGER, 0, 0, &X)
2a10: 3b 0a 7d 0a 69 74 65 6d 28 41 29 20 3a 3a 3d 20  ;.}.item(A) ::= 
2a20: 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20  FLOAT(X).       
2a30: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
2a40: 28 54 4b 5f 46 4c 4f 41 54 2c 20 30 2c 20 30 2c  (TK_FLOAT, 0, 0,
2a50: 20 26 58 29 3b 7d 0a 69 74 65 6d 28 41 29 20 3a   &X);}.item(A) :
2a60: 3a 3d 20 50 4c 55 53 20 46 4c 4f 41 54 28 58 29  := PLUS FLOAT(X)
2a70: 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45  .   {A = sqliteE
2a80: 78 70 72 28 54 4b 5f 46 4c 4f 41 54 2c 20 30 2c  xpr(TK_FLOAT, 0,
2a90: 20 30 2c 20 26 58 29 3b 7d 0a 69 74 65 6d 28 41   0, &X);}.item(A
2aa0: 29 20 3a 3a 3d 20 4d 49 4e 55 53 20 46 4c 4f 41  ) ::= MINUS FLOA
2ab0: 54 28 58 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73  T(X).  {.  A = s
2ac0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 55 4d 49  qliteExpr(TK_UMI
2ad0: 4e 55 53 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  NUS, 0, 0, 0);. 
2ae0: 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 65 66   if( A ) A->pLef
2af0: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  t = sqliteExpr(T
2b00: 4b 5f 46 4c 4f 41 54 2c 20 30 2c 20 30 2c 20 26  K_FLOAT, 0, 0, &
2b10: 58 29 3b 0a 7d 0a 69 74 65 6d 28 41 29 20 3a 3a  X);.}.item(A) ::
2b20: 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20  = STRING(X).    
2b30: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
2b40: 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c  pr(TK_STRING, 0,
2b50: 20 30 2c 20 26 58 29 3b 7d 0a 69 74 65 6d 28 41   0, &X);}.item(A
2b60: 29 20 3a 3a 3d 20 4e 55 4c 4c 2e 20 20 20 20 20  ) ::= NULL.     
2b70: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
2b80: 74 65 45 78 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20  teExpr(TK_NULL, 
2b90: 30 2c 20 30 2c 20 30 29 3b 7d 0a 0a 25 74 79 70  0, 0, 0);}..%typ
2ba0: 65 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  e inscollist_opt
2bb0: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74   {IdList*}.%dest
2bc0: 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73  ructor inscollis
2bd0: 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 49 64 4c  t_opt {sqliteIdL
2be0: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
2bf0: 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74  %type inscollist
2c00: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74   {IdList*}.%dest
2c10: 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73  ructor inscollis
2c20: 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44  t {sqliteIdListD
2c30: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69 6e 73  elete($$);}..ins
2c40: 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  collist_opt(A) :
2c50: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
2c60: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2c70: 30 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f  0;}.inscollist_o
2c80: 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 6e 73  pt(A) ::= LP ins
2c90: 63 6f 6c 6c 69 73 74 28 58 29 20 52 50 2e 20 20  collist(X) RP.  
2ca0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 73 63 6f    {A = X;}.insco
2cb0: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 6e 73  llist(A) ::= ins
2cc0: 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  collist(X) COMMA
2cd0: 20 69 64 73 28 59 29 2e 20 7b 41 20 3d 20 73 71   ids(Y). {A = sq
2ce0: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
2cf0: 28 58 2c 26 59 29 3b 7d 0a 69 6e 73 63 6f 6c 6c  (X,&Y);}.inscoll
2d00: 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 73 28 59  ist(A) ::= ids(Y
2d10: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2d20: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
2d30: 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30  teIdListAppend(0
2d40: 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ,&Y);}..////////
2d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d60: 2f 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20 50  /// Expression P
2d70: 72 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f  rocessing //////
2d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d90: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 6c 65 66 74  ///////.//.%left
2da0: 20 4f 52 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a   OR..%left AND..
2db0: 25 72 69 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66  %right NOT..%lef
2dc0: 74 20 45 51 20 4e 45 20 49 53 4e 55 4c 4c 20 4e  t EQ NE ISNULL N
2dd0: 4f 54 4e 55 4c 4c 20 49 53 20 4c 49 4b 45 20 47  OTNULL IS LIKE G
2de0: 4c 4f 42 20 42 45 54 57 45 45 4e 20 49 4e 2e 0a  LOB BETWEEN IN..
2df0: 25 6c 65 66 74 20 47 54 20 47 45 20 4c 54 20 4c  %left GT GE LT L
2e00: 45 2e 0a 25 6c 65 66 74 20 42 49 54 41 4e 44 20  E..%left BITAND 
2e10: 42 49 54 4f 52 20 4c 53 48 49 46 54 20 52 53 48  BITOR LSHIFT RSH
2e20: 49 46 54 2e 0a 25 6c 65 66 74 20 50 4c 55 53 20  IFT..%left PLUS 
2e30: 4d 49 4e 55 53 2e 0a 25 6c 65 66 74 20 53 54 41  MINUS..%left STA
2e40: 52 20 53 4c 41 53 48 20 4d 4f 44 2e 0a 25 6c 65  R SLASH MOD..%le
2e50: 66 74 20 43 4f 4e 43 41 54 2e 0a 25 72 69 67 68  ft CONCAT..%righ
2e60: 74 20 55 4d 49 4e 55 53 20 42 49 54 4e 4f 54 2e  t UMINUS BITNOT.
2e70: 0a 0a 25 74 79 70 65 20 65 78 70 72 20 7b 45 78  ..%type expr {Ex
2e80: 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pr*}.%destructor
2e90: 20 65 78 70 72 20 7b 73 71 6c 69 74 65 45 78 70   expr {sqliteExp
2ea0: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 65  rDelete($$);}..e
2eb0: 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29  xpr(A) ::= LP(B)
2ec0: 20 65 78 70 72 28 58 29 20 52 50 28 45 29 2e 20   expr(X) RP(E). 
2ed0: 7b 41 20 3d 20 58 3b 20 73 71 6c 69 74 65 45 78  {A = X; sqliteEx
2ee0: 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b  prSpan(A,&B,&E);
2ef0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4e 55  }.expr(A) ::= NU
2f00: 4c 4c 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  LL(X).          
2f10: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
2f20: 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  pr(TK_NULL, 0, 0
2f30: 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20  , &X);}.expr(A) 
2f40: 3a 3a 3d 20 69 64 28 58 29 2e 20 20 20 20 20 20  ::= id(X).      
2f50: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
2f60: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20  liteExpr(TK_ID, 
2f70: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72  0, 0, &X);}.expr
2f80: 28 41 29 20 3a 3a 3d 20 69 64 73 28 58 29 20 44  (A) ::= ids(X) D
2f90: 4f 54 20 69 64 73 28 59 29 2e 20 7b 0a 20 20 45  OT ids(Y). {.  E
2fa0: 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c  xpr *temp1 = sql
2fb0: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
2fc0: 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78 70 72  , 0, &X);.  Expr
2fd0: 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69 74 65   *temp2 = sqlite
2fe0: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
2ff0: 2c 20 26 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c  , &Y);.  A = sql
3000: 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  iteExpr(TK_DOT, 
3010: 74 65 6d 70 31 2c 20 74 65 6d 70 32 2c 20 30 29  temp1, temp2, 0)
3020: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
3030: 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20 20 20  INTEGER(X).     
3040: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
3050: 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20  (TK_INTEGER, 0, 
3060: 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  0, &X);}.expr(A)
3070: 20 3a 3a 3d 20 46 4c 4f 41 54 28 58 29 2e 20 20   ::= FLOAT(X).  
3080: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
3090: 65 45 78 70 72 28 54 4b 5f 46 4c 4f 41 54 2c 20  eExpr(TK_FLOAT, 
30a0: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72  0, 0, &X);}.expr
30b0: 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58  (A) ::= STRING(X
30c0: 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71  ).       {A = sq
30d0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 53 54 52 49  liteExpr(TK_STRI
30e0: 4e 47 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a  NG, 0, 0, &X);}.
30f0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58  expr(A) ::= ID(X
3100: 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29  ) LP exprlist(Y)
3110: 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20   RP(E). {.  A = 
3120: 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69  sqliteExprFuncti
3130: 6f 6e 28 59 2c 20 26 58 29 3b 0a 20 20 73 71 6c  on(Y, &X);.  sql
3140: 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58  iteExprSpan(A,&X
3150: 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  ,&E);.}.expr(A) 
3160: 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20 53 54 41  ::= ID(X) LP STA
3170: 52 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d  R RP(E). {.  A =
3180: 20 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74   sqliteExprFunct
3190: 69 6f 6e 28 30 2c 20 26 58 29 3b 0a 20 20 73 71  ion(0, &X);.  sq
31a0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
31b0: 58 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29  X,&E);.}.expr(A)
31c0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 41 4e 44   ::= expr(X) AND
31d0: 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d   expr(Y).   {A =
31e0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41   sqliteExpr(TK_A
31f0: 4e 44 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  ND, X, Y, 0);}.e
3200: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
3210: 58 29 20 4f 52 20 65 78 70 72 28 59 29 2e 20 20  X) OR expr(Y).  
3220: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70    {A = sqliteExp
3230: 72 28 54 4b 5f 4f 52 2c 20 58 2c 20 59 2c 20 30  r(TK_OR, X, Y, 0
3240: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
3250: 65 78 70 72 28 58 29 20 4c 54 20 65 78 70 72 28  expr(X) LT expr(
3260: 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  Y).    {A = sqli
3270: 74 65 45 78 70 72 28 54 4b 5f 4c 54 2c 20 58 2c  teExpr(TK_LT, X,
3280: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
3290: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 47 54 20   ::= expr(X) GT 
32a0: 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d  expr(Y).    {A =
32b0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 47   sqliteExpr(TK_G
32c0: 54 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78  T, X, Y, 0);}.ex
32d0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
32e0: 29 20 4c 45 20 65 78 70 72 28 59 29 2e 20 20 20  ) LE expr(Y).   
32f0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
3300: 28 54 4b 5f 4c 45 2c 20 58 2c 20 59 2c 20 30 29  (TK_LE, X, Y, 0)
3310: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
3320: 78 70 72 28 58 29 20 47 45 20 65 78 70 72 28 59  xpr(X) GE expr(Y
3330: 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  ).    {A = sqlit
3340: 65 45 78 70 72 28 54 4b 5f 47 45 2c 20 58 2c 20  eExpr(TK_GE, X, 
3350: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
3360: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 45 20 65  ::= expr(X) NE e
3370: 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20  xpr(Y).    {A = 
3380: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 45  sqliteExpr(TK_NE
3390: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
33a0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
33b0: 20 45 51 20 65 78 70 72 28 59 29 2e 20 20 20 20   EQ expr(Y).    
33c0: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
33d0: 54 4b 5f 45 51 2c 20 58 2c 20 59 2c 20 30 29 3b  TK_EQ, X, Y, 0);
33e0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
33f0: 70 72 28 58 29 20 42 49 54 41 4e 44 20 65 78 70  pr(X) BITAND exp
3400: 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74  r(Y). {A = sqlit
3410: 65 45 78 70 72 28 54 4b 5f 42 49 54 41 4e 44 2c  eExpr(TK_BITAND,
3420: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
3430: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
3440: 42 49 54 4f 52 20 65 78 70 72 28 59 29 2e 20 20  BITOR expr(Y).  
3450: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
3460: 54 4b 5f 42 49 54 4f 52 2c 20 58 2c 20 59 2c 20  TK_BITOR, X, Y, 
3470: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
3480: 20 65 78 70 72 28 58 29 20 4c 53 48 49 46 54 20   expr(X) LSHIFT 
3490: 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71  expr(Y). {A = sq
34a0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 4c 53 48 49  liteExpr(TK_LSHI
34b0: 46 54 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  FT, X, Y, 0);}.e
34c0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
34d0: 58 29 20 52 53 48 49 46 54 20 65 78 70 72 28 59  X) RSHIFT expr(Y
34e0: 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78  ). {A = sqliteEx
34f0: 70 72 28 54 4b 5f 52 53 48 49 46 54 2c 20 58 2c  pr(TK_RSHIFT, X,
3500: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
3510: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c 49 4b   ::= expr(X) LIK
3520: 45 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20  E expr(Y).   {A 
3530: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3540: 4c 49 4b 45 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  LIKE, X, Y, 0);}
3550: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
3560: 72 28 58 29 20 4e 4f 54 20 4c 49 4b 45 20 65 78  r(X) NOT LIKE ex
3570: 70 72 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20  pr(Y).  {.  A = 
3580: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4c 49  sqliteExpr(TK_LI
3590: 4b 45 2c 20 58 2c 20 59 2c 20 30 29 3b 0a 20 20  KE, X, Y, 0);.  
35a0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
35b0: 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b  K_NOT, A, 0, 0);
35c0: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  .  sqliteExprSpa
35d0: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 59 2d  n(A,&X->span,&Y-
35e0: 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41  >span);.}.expr(A
35f0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 47 4c  ) ::= expr(X) GL
3600: 4f 42 20 65 78 70 72 28 59 29 2e 20 20 7b 41 20  OB expr(Y).  {A 
3610: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3620: 47 4c 4f 42 2c 58 2c 59 2c 30 29 3b 7d 0a 65 78  GLOB,X,Y,0);}.ex
3630: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
3640: 29 20 4e 4f 54 20 47 4c 4f 42 20 65 78 70 72 28  ) NOT GLOB expr(
3650: 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c  Y).  {.  A = sql
3660: 69 74 65 45 78 70 72 28 54 4b 5f 47 4c 4f 42 2c  iteExpr(TK_GLOB,
3670: 20 58 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d   X, Y, 0);.  A =
3680: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e   sqliteExpr(TK_N
3690: 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20  OT, A, 0, 0);.  
36a0: 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41  sqliteExprSpan(A
36b0: 2c 26 58 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70  ,&X->span,&Y->sp
36c0: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  an);.}.expr(A) :
36d0: 3a 3d 20 65 78 70 72 28 58 29 20 50 4c 55 53 20  := expr(X) PLUS 
36e0: 65 78 70 72 28 59 29 2e 20 20 7b 41 20 3d 20 73  expr(Y).  {A = s
36f0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 50 4c 55  qliteExpr(TK_PLU
3700: 53 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78  S, X, Y, 0);}.ex
3710: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
3720: 29 20 4d 49 4e 55 53 20 65 78 70 72 28 59 29 2e  ) MINUS expr(Y).
3730: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
3740: 28 54 4b 5f 4d 49 4e 55 53 2c 20 58 2c 20 59 2c  (TK_MINUS, X, Y,
3750: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
3760: 3d 20 65 78 70 72 28 58 29 20 53 54 41 52 20 65  = expr(X) STAR e
3770: 78 70 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 71  xpr(Y).  {A = sq
3780: 6c 69 74 65 45 78 70 72 28 54 4b 5f 53 54 41 52  liteExpr(TK_STAR
3790: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
37a0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
37b0: 20 53 4c 41 53 48 20 65 78 70 72 28 59 29 2e 20   SLASH expr(Y). 
37c0: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
37d0: 54 4b 5f 53 4c 41 53 48 2c 20 58 2c 20 59 2c 20  TK_SLASH, X, Y, 
37e0: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
37f0: 20 65 78 70 72 28 58 29 20 4d 4f 44 20 65 78 70   expr(X) MOD exp
3800: 72 28 59 29 2e 20 20 20 7b 41 20 3d 20 73 71 6c  r(Y).   {A = sql
3810: 69 74 65 45 78 70 72 28 54 4b 5f 4d 4f 44 2c 20  iteExpr(TK_MOD, 
3820: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
3830: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 43  A) ::= expr(X) C
3840: 4f 4e 43 41 54 20 65 78 70 72 28 59 29 2e 20 7b  ONCAT expr(Y). {
3850: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
3860: 4b 5f 43 4f 4e 43 41 54 2c 20 58 2c 20 59 2c 20  K_CONCAT, X, Y, 
3870: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
3880: 20 65 78 70 72 28 58 29 20 49 53 4e 55 4c 4c 28   expr(X) ISNULL(
3890: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  E). {.  A = sqli
38a0: 74 65 45 78 70 72 28 54 4b 5f 49 53 4e 55 4c 4c  teExpr(TK_ISNULL
38b0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
38c0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
38d0: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
38e0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
38f0: 58 29 20 49 53 20 4e 55 4c 4c 28 45 29 2e 20 7b  X) IS NULL(E). {
3900: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70  .  A = sqliteExp
3910: 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20  r(TK_ISNULL, X, 
3920: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45  0, 0);.  sqliteE
3930: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
3940: 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41  an,&E);.}.expr(A
3950: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f  ) ::= expr(X) NO
3960: 54 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20  TNULL(E). {.  A 
3970: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3980: 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30  NOTNULL, X, 0, 0
3990: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53  );.  sqliteExprS
39a0: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26  pan(A,&X->span,&
39b0: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
39c0: 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20 4e 55  = expr(X) NOT NU
39d0: 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  LL(E). {.  A = s
39e0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54  qliteExpr(TK_NOT
39f0: 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  NULL, X, 0, 0);.
3a00: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
3a10: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b  (A,&X->span,&E);
3a20: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .}.expr(A) ::= e
3a30: 78 70 72 28 58 29 20 49 53 20 4e 4f 54 20 4e 55  xpr(X) IS NOT NU
3a40: 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  LL(E). {.  A = s
3a50: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54  qliteExpr(TK_NOT
3a60: 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  NULL, X, 0, 0);.
3a70: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
3a80: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b  (A,&X->span,&E);
3a90: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4e  .}.expr(A) ::= N
3aa0: 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e 20 7b  OT(B) expr(X). {
3ab0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70  .  A = sqliteExp
3ac0: 72 28 54 4b 5f 4e 4f 54 2c 20 58 2c 20 30 2c 20  r(TK_NOT, X, 0, 
3ad0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  0);.  sqliteExpr
3ae0: 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70  Span(A,&B,&X->sp
3af0: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  an);.}.expr(A) :
3b00: 3a 3d 20 42 49 54 4e 4f 54 28 42 29 20 65 78 70  := BITNOT(B) exp
3b10: 72 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  r(X). {.  A = sq
3b20: 6c 69 74 65 45 78 70 72 28 54 4b 5f 42 49 54 4e  liteExpr(TK_BITN
3b30: 4f 54 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  OT, X, 0, 0);.  
3b40: 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41  sqliteExprSpan(A
3b50: 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d  ,&B,&X->span);.}
3b60: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e  .expr(A) ::= MIN
3b70: 55 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b  US(B) expr(X). [
3b80: 55 4d 49 4e 55 53 5d 20 7b 0a 20 20 41 20 3d 20  UMINUS] {.  A = 
3b90: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 55 4d  sqliteExpr(TK_UM
3ba0: 49 4e 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  INUS, X, 0, 0);.
3bb0: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
3bc0: 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b  (A,&B,&X->span);
3bd0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 50  .}.expr(A) ::= P
3be0: 4c 55 53 28 42 29 20 65 78 70 72 28 58 29 2e 20  LUS(B) expr(X). 
3bf0: 5b 55 4d 49 4e 55 53 5d 20 7b 0a 20 20 41 20 3d  [UMINUS] {.  A =
3c00: 20 58 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72   X;.  sqliteExpr
3c10: 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70  Span(A,&B,&X->sp
3c20: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  an);.}.expr(A) :
3c30: 3a 3d 20 4c 50 28 42 29 20 73 65 6c 65 63 74 28  := LP(B) select(
3c40: 58 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20  X) RP(E). {.  A 
3c50: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3c60: 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
3c70: 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70  ;.  if( A ) A->p
3c80: 53 65 6c 65 63 74 20 3d 20 58 3b 0a 20 20 73 71  Select = X;.  sq
3c90: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
3ca0: 42 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29  B,&E);.}.expr(A)
3cb0: 20 3a 3a 3d 20 65 78 70 72 28 57 29 20 42 45 54   ::= expr(W) BET
3cc0: 57 45 45 4e 20 65 78 70 72 28 58 29 20 41 4e 44  WEEN expr(X) AND
3cd0: 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 45 78   expr(Y). {.  Ex
3ce0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
3cf0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
3d00: 70 65 6e 64 28 30 2c 20 58 2c 20 30 29 3b 0a 20  pend(0, X, 0);. 
3d10: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45   pList = sqliteE
3d20: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c  xprListAppend(pL
3d30: 69 73 74 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20  ist, Y, 0);.  A 
3d40: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3d50: 42 45 54 57 45 45 4e 2c 20 57 2c 20 30 2c 20 30  BETWEEN, W, 0, 0
3d60: 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e  );.  if( A ) A->
3d70: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
3d80: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
3d90: 41 2c 26 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73  A,&W->span,&Y->s
3da0: 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  pan);.}.expr(A) 
3db0: 3a 3a 3d 20 65 78 70 72 28 57 29 20 4e 4f 54 20  ::= expr(W) NOT 
3dc0: 42 45 54 57 45 45 4e 20 65 78 70 72 28 58 29 20  BETWEEN expr(X) 
3dd0: 41 4e 44 20 65 78 70 72 28 59 29 2e 20 7b 0a 20  AND expr(Y). {. 
3de0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
3df0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
3e00: 74 41 70 70 65 6e 64 28 30 2c 20 58 2c 20 30 29  tAppend(0, X, 0)
3e10: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
3e20: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
3e30: 28 70 4c 69 73 74 2c 20 59 2c 20 30 29 3b 0a 20  (pList, Y, 0);. 
3e40: 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28   A = sqliteExpr(
3e50: 54 4b 5f 42 45 54 57 45 45 4e 2c 20 57 2c 20 30  TK_BETWEEN, W, 0
3e60: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20  , 0);.  if( A ) 
3e70: 41 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  A->pList = pList
3e80: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  ;.  A = sqliteEx
3e90: 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c  pr(TK_NOT, A, 0,
3ea0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70   0);.  sqliteExp
3eb0: 72 53 70 61 6e 28 41 2c 26 57 2d 3e 73 70 61 6e  rSpan(A,&W->span
3ec0: 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78  ,&Y->span);.}.ex
3ed0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
3ee0: 29 20 49 4e 20 4c 50 20 65 78 70 72 6c 69 73 74  ) IN LP exprlist
3ef0: 28 59 29 20 52 50 28 45 29 2e 20 20 7b 0a 20 20  (Y) RP(E).  {.  
3f00: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
3f10: 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  K_IN, X, 0, 0);.
3f20: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69    if( A ) A->pLi
3f30: 73 74 20 3d 20 59 3b 0a 20 20 73 71 6c 69 74 65  st = Y;.  sqlite
3f40: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73  ExprSpan(A,&X->s
3f50: 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28  pan,&E);.}.expr(
3f60: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49  A) ::= expr(X) I
3f70: 4e 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52  N LP select(Y) R
3f80: 50 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73  P(E).  {.  A = s
3f90: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e 2c  qliteExpr(TK_IN,
3fa0: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   X, 0, 0);.  if(
3fb0: 20 41 20 29 20 41 2d 3e 70 53 65 6c 65 63 74 20   A ) A->pSelect 
3fc0: 3d 20 59 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  = Y;.  sqliteExp
3fd0: 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e  rSpan(A,&X->span
3fe0: 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  ,&E);.}.expr(A) 
3ff0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20  ::= expr(X) NOT 
4000: 49 4e 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59  IN LP exprlist(Y
4010: 29 20 52 50 28 45 29 2e 20 20 7b 0a 20 20 41 20  ) RP(E).  {.  A 
4020: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
4030: 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  IN, X, 0, 0);.  
4040: 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74  if( A ) A->pList
4050: 20 3d 20 59 3b 0a 20 20 41 20 3d 20 73 71 6c 69   = Y;.  A = sqli
4060: 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41  teExpr(TK_NOT, A
4070: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
4080: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  eExprSpan(A,&X->
4090: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72  span,&E);.}.expr
40a0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
40b0: 4e 4f 54 20 49 4e 20 4c 50 20 73 65 6c 65 63 74  NOT IN LP select
40c0: 28 59 29 20 52 50 28 45 29 2e 20 20 7b 0a 20 20  (Y) RP(E).  {.  
40d0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
40e0: 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  K_IN, X, 0, 0);.
40f0: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 53 65    if( A ) A->pSe
4100: 6c 65 63 74 20 3d 20 59 3b 0a 20 20 41 20 3d 20  lect = Y;.  A = 
4110: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f  sqliteExpr(TK_NO
4120: 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73  T, A, 0, 0);.  s
4130: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c  qliteExprSpan(A,
4140: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a  &X->span,&E);.}.
4150: 0a 0a 0a 25 74 79 70 65 20 65 78 70 72 6c 69 73  ...%type exprlis
4160: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
4170: 65 73 74 72 75 63 74 6f 72 20 65 78 70 72 6c 69  estructor exprli
4180: 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69  st {sqliteExprLi
4190: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25  stDelete($$);}.%
41a0: 74 79 70 65 20 65 78 70 72 69 74 65 6d 20 7b 45  type expritem {E
41b0: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
41c0: 72 20 65 78 70 72 69 74 65 6d 20 7b 73 71 6c 69  r expritem {sqli
41d0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 24 24 29  teExprDelete($$)
41e0: 3b 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20  ;}..exprlist(A) 
41f0: 3a 3a 3d 20 65 78 70 72 6c 69 73 74 28 58 29 20  ::= exprlist(X) 
4200: 43 4f 4d 4d 41 20 65 78 70 72 69 74 65 6d 28 59  COMMA expritem(Y
4210: 29 2e 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69  ). .   {A = sqli
4220: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
4230: 28 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 6c 69  (X,Y,0);}.exprli
4240: 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 69 74  st(A) ::= exprit
4250: 65 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  em(X).          
4260: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70    {A = sqliteExp
4270: 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 58 2c  rListAppend(0,X,
4280: 30 29 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41 29  0);}.expritem(A)
4290: 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20   ::= expr(X).   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
42b0: 3d 20 58 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41  = X;}.expritem(A
42c0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
42e0: 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f   = 0;}..////////
42f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4300: 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45  ///// The CREATE
4310: 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f   INDEX command /
4320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4330: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
4340: 3d 20 43 52 45 41 54 45 28 53 29 20 75 6e 69 71  = CREATE(S) uniq
4350: 75 65 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20  ueflag(U) INDEX 
4360: 69 64 73 28 58 29 20 4f 4e 20 69 64 73 28 59 29  ids(X) ON ids(Y)
4370: 20 4c 50 20 69 64 78 6c 69 73 74 28 5a 29 20 52   LP idxlist(Z) R
4380: 50 28 45 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74  P(E)..    {sqlit
4390: 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  eCreateIndex(pPa
43a0: 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 5a 2c 20  rse, &X, &Y, Z, 
43b0: 55 2c 20 26 53 2c 20 26 45 29 3b 7d 0a 0a 25 74  U, &S, &E);}..%t
43c0: 79 70 65 20 75 6e 69 71 75 65 66 6c 61 67 20 7b  ype uniqueflag {
43d0: 69 6e 74 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28  int}.uniqueflag(
43e0: 41 29 20 3a 3a 3d 20 55 4e 49 51 55 45 2e 20 20  A) ::= UNIQUE.  
43f0: 20 7b 20 41 20 3d 20 31 3b 20 7d 0a 75 6e 69 71   { A = 1; }.uniq
4400: 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 2e 20  ueflag(A) ::= . 
4410: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 30 3b          { A = 0;
4420: 20 7d 0a 0a 25 74 79 70 65 20 69 64 78 6c 69 73   }..%type idxlis
4430: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73  t {IdList*}.%des
4440: 74 72 75 63 74 6f 72 20 69 64 78 6c 69 73 74 20  tructor idxlist 
4450: 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c  {sqliteIdListDel
4460: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20  ete($$);}.%type 
4470: 69 64 78 69 74 65 6d 20 7b 54 6f 6b 65 6e 7d 0a  idxitem {Token}.
4480: 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20  .idxlist(A) ::= 
4490: 69 64 78 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  idxlist(X) COMMA
44a0: 20 69 64 78 69 74 65 6d 28 59 29 2e 20 20 0a 20   idxitem(Y).  . 
44b0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 49      {A = sqliteI
44c0: 64 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59  dListAppend(X,&Y
44d0: 29 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a  );}.idxlist(A) :
44e0: 3a 3d 20 69 64 78 69 74 65 6d 28 59 29 2e 0a 20  := idxitem(Y).. 
44f0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 49      {A = sqliteI
4500: 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59  dListAppend(0,&Y
4510: 29 3b 7d 0a 69 64 78 69 74 65 6d 28 41 29 20 3a  );}.idxitem(A) :
4520: 3a 3d 20 69 64 73 28 58 29 2e 20 20 20 20 20 20  := ids(X).      
4530: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f      {A = X;}..//
4540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
4560: 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 6f 6d  CREATE INDEX com
4570: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
4580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
4590: 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 49 4e  .cmd ::= DROP IN
45a0: 44 45 58 20 69 64 73 28 58 29 2e 20 20 20 20 20  DEX ids(X).     
45b0: 20 7b 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65   {sqliteDropInde
45c0: 78 28 70 50 61 72 73 65 2c 20 26 58 29 3b 7d 0a  x(pParse, &X);}.
45d0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
45e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
45f0: 54 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 63  The DROP INDEX c
4600: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
4610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4620: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 43 4f 50 59  .//.cmd ::= COPY
4630: 20 69 64 73 28 58 29 20 46 52 4f 4d 20 69 64 73   ids(X) FROM ids
4640: 28 59 29 20 55 53 49 4e 47 20 44 45 4c 49 4d 49  (Y) USING DELIMI
4650: 54 45 52 53 20 53 54 52 49 4e 47 28 5a 29 2e 0a  TERS STRING(Z)..
4660: 20 20 20 20 7b 73 71 6c 69 74 65 43 6f 70 79 28      {sqliteCopy(
4670: 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 26 5a 29  pParse,&X,&Y,&Z)
4680: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 43 4f 50 59 20  ;}.cmd ::= COPY 
4690: 69 64 73 28 58 29 20 46 52 4f 4d 20 69 64 73 28  ids(X) FROM ids(
46a0: 59 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 43  Y)..    {sqliteC
46b0: 6f 70 79 28 70 50 61 72 73 65 2c 26 58 2c 26 59  opy(pParse,&X,&Y
46c0: 2c 30 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  ,0);}../////////
46d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
46e0: 2f 2f 2f 2f 20 54 68 65 20 56 41 43 55 55 4d 20  //// The VACUUM 
46f0: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
4700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4710: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
4720: 20 56 41 43 55 55 4d 2e 20 20 20 20 20 20 20 20   VACUUM.        
4730: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 56          {sqliteV
4740: 61 63 75 75 6d 28 70 50 61 72 73 65 2c 30 29 3b  acuum(pParse,0);
4750: 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d  }.cmd ::= VACUUM
4760: 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20 20   ids(X).        
4770: 20 7b 73 71 6c 69 74 65 56 61 63 75 75 6d 28 70   {sqliteVacuum(p
4780: 50 61 72 73 65 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f  Parse,&X);}..///
4790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 50  ////////// The P
47b0: 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 2f 2f  RAGMA command //
47c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
47e0: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 69 64  md ::= PRAGMA id
47f0: 73 28 58 29 20 45 51 20 69 64 73 28 59 29 2e 20  s(X) EQ ids(Y). 
4800: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 50          {sqliteP
4810: 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c  ragma(pParse,&X,
4820: 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  &Y,0);}.cmd ::= 
4830: 50 52 41 47 4d 41 20 69 64 73 28 58 29 20 45 51  PRAGMA ids(X) EQ
4840: 20 4f 4e 28 59 29 2e 20 20 20 20 20 20 20 20 20   ON(Y).         
4850: 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61 28 70   {sqlitePragma(p
4860: 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b 7d  Parse,&X,&Y,0);}
4870: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
4880: 69 64 73 28 58 29 20 45 51 20 70 6c 75 73 5f 6e  ids(X) EQ plus_n
4890: 75 6d 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74  um(Y).    {sqlit
48a0: 65 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26  ePragma(pParse,&
48b0: 58 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a  X,&Y,0);}.cmd ::
48c0: 3d 20 50 52 41 47 4d 41 20 69 64 73 28 58 29 20  = PRAGMA ids(X) 
48d0: 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29 2e  EQ minus_num(Y).
48e0: 20 20 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61     {sqlitePragma
48f0: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 31 29  (pParse,&X,&Y,1)
4900: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  ;}.cmd ::= PRAGM
4910: 41 20 69 64 73 28 58 29 20 4c 50 20 69 64 73 28  A ids(X) LP ids(
4920: 59 29 20 52 50 2e 20 20 20 20 20 20 7b 73 71 6c  Y) RP.      {sql
4930: 69 74 65 50 72 61 67 6d 61 28 70 50 61 72 73 65  itePragma(pParse
4940: 2c 26 58 2c 26 59 2c 30 29 3b 7d 0a 70 6c 75 73  ,&X,&Y,0);}.plus
4950: 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73  _num(A) ::= plus
4960: 5f 6f 70 74 20 6e 75 6d 62 65 72 28 58 29 2e 20  _opt number(X). 
4970: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75 73    {A = X;}.minus
4980: 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e 55  _num(A) ::= MINU
4990: 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20  S number(X).    
49a0: 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72   {A = X;}.number
49b0: 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 28  (A) ::= INTEGER(
49c0: 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75  X).  {A = X;}.nu
49d0: 6d 62 65 72 28 41 29 20 3a 3a 3d 20 46 4c 4f 41  mber(A) ::= FLOA
49e0: 54 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b  T(X).    {A = X;
49f0: 7d 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d 20 50  }.plus_opt ::= P
4a00: 4c 55 53 2e 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a  LUS..plus_opt ::
4a10: 3d 20 2e 0a                                      = ..