/ Hex Artifact Content
Login

Artifact a1084470b331c1dc434e180ca888d15907bdc1cf:


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 31 35 39 20 32 30 30 35 2f 30 31 2f 31 39 20  .159 2005/01/19 
0290: 32 33 3a 32 34 3a 35 30 20 64 72 68 20 45 78 70  23:24:50 drh Exp
02a0: 20 24 0a 2a 2f 0a 25 74 6f 6b 65 6e 5f 70 72 65   $.*/.%token_pre
02b0: 66 69 78 20 54 4b 5f 0a 25 74 6f 6b 65 6e 5f 74  fix TK_.%token_t
02c0: 79 70 65 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66  ype {Token}.%def
02d0: 61 75 6c 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e  ault_type {Token
02e0: 7d 0a 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  }.%extra_argumen
02f0: 74 20 7b 50 61 72 73 65 20 2a 70 50 61 72 73 65  t {Parse *pParse
0300: 7d 0a 25 73 79 6e 74 61 78 5f 65 72 72 6f 72 20  }.%syntax_error 
0310: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
0320: 7a 45 72 72 4d 73 67 3d 3d 30 20 29 7b 0a 20 20  zErrMsg==0 ){.  
0330: 20 20 69 66 28 20 54 4f 4b 45 4e 2e 7a 5b 30 5d    if( TOKEN.z[0]
0340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
0350: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
0360: 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20  , "near \"%T\": 
0370: 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 26  syntax error", &
0380: 54 4f 4b 45 4e 29 3b 0a 20 20 20 20 7d 65 6c 73  TOKEN);.    }els
0390: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
03a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
03b0: 20 22 69 6e 63 6f 6d 70 6c 65 74 65 20 53 51 4c   "incomplete SQL
03c0: 20 73 74 61 74 65 6d 65 6e 74 22 29 3b 0a 20 20   statement");.  
03d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 25 6e 61 6d 65 20    }.  }.}.%name 
03e0: 73 71 6c 69 74 65 33 50 61 72 73 65 72 0a 25 69  sqlite3Parser.%i
03f0: 6e 63 6c 75 64 65 20 7b 0a 23 69 6e 63 6c 75 64  nclude {.#includ
0400: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0410: 23 69 6e 63 6c 75 64 65 20 22 70 61 72 73 65 2e  #include "parse.
0420: 68 22 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  h"../*.** An ins
0430: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0440: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e  ructure holds in
0450: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
0460: 74 68 65 0a 2a 2a 20 4c 49 4d 49 54 20 63 6c 61  the.** LIMIT cla
0470: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
0480: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
0490: 72 75 63 74 20 4c 69 6d 69 74 56 61 6c 20 7b 0a  ruct LimitVal {.
04a0: 20 20 69 6e 74 20 6c 69 6d 69 74 3b 20 20 20 20    int limit;    
04b0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 76 61 6c  /* The LIMIT val
04c0: 75 65 2e 20 20 2d 31 20 69 66 20 74 68 65 72 65  ue.  -1 if there
04d0: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 2a 2f 0a   is no limit */.
04e0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
04f0: 2f 2a 20 54 68 65 20 4f 46 46 53 45 54 2e 20 20  /* The OFFSET.  
0500: 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  0 if there is no
0510: 6e 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ne */.};../*.** 
0520: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0530: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
0540: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
0550: 68 65 20 4c 49 4b 45 2c 0a 2a 2a 20 47 4c 4f 42  he LIKE,.** GLOB
0560: 2c 20 4e 4f 54 20 4c 49 4b 45 2c 20 61 6e 64 20  , NOT LIKE, and 
0570: 4e 4f 54 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f  NOT GLOB operato
0580: 72 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 69  rs..*/.struct Li
0590: 6b 65 4f 70 20 7b 0a 20 20 69 6e 74 20 6f 70 63  keOp {.  int opc
05a0: 6f 64 65 3b 20 20 20 2f 2a 20 45 69 74 68 65 72  ode;   /* Either
05b0: 20 54 4b 5f 47 4c 4f 42 20 6f 72 20 54 4b 5f 4c   TK_GLOB or TK_L
05c0: 49 4b 45 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 74  IKE */.  int not
05d0: 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  ;      /* True i
05e0: 66 20 74 68 65 20 4e 4f 54 20 6b 65 79 77 6f 72  f the NOT keywor
05f0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
0600: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
0610: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0620: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0630: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
0640: 76 65 6e 74 20 6f 66 20 61 0a 2a 2a 20 54 52 49  vent of a.** TRI
0650: 47 47 45 52 2e 20 20 22 61 22 20 69 73 20 74 68  GGER.  "a" is th
0660: 65 20 65 76 65 6e 74 20 74 79 70 65 2c 20 6f 6e  e event type, on
0670: 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20  e of TK_UPDATE, 
0680: 54 4b 5f 49 4e 53 45 52 54 2c 0a 2a 2a 20 54 4b  TK_INSERT,.** TK
0690: 5f 44 45 4c 45 54 45 2c 20 6f 72 20 54 4b 5f 49  _DELETE, or TK_I
06a0: 4e 53 54 45 41 44 2e 20 20 49 66 20 74 68 65 20  NSTEAD.  If the 
06b0: 65 76 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  event is of the 
06c0: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
06d0: 55 50 44 41 54 45 20 4f 4e 20 28 61 2c 62 2c 63  UPDATE ON (a,b,c
06e0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ).**.** Then the
06f0: 20 22 62 22 20 49 64 4c 69 73 74 20 72 65 63 6f   "b" IdList reco
0700: 72 64 73 20 74 68 65 20 6c 69 73 74 20 22 61 2c  rds the list "a,
0710: 62 2c 63 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  b,c"..*/.struct 
0720: 54 72 69 67 45 76 65 6e 74 20 7b 20 69 6e 74 20  TrigEvent { int 
0730: 61 3b 20 49 64 4c 69 73 74 20 2a 20 62 3b 20 7d  a; IdList * b; }
0740: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
0750: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0760: 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65  ucture holds the
0770: 20 41 54 54 41 43 48 20 6b 65 79 20 61 6e 64 20   ATTACH key and 
0780: 74 68 65 20 6b 65 79 20 74 79 70 65 2e 0a 2a 2f  the key type..*/
0790: 0a 73 74 72 75 63 74 20 41 74 74 61 63 68 4b 65  .struct AttachKe
07a0: 79 20 7b 20 69 6e 74 20 74 79 70 65 3b 20 20 54  y { int type;  T
07b0: 6f 6b 65 6e 20 6b 65 79 3b 20 7d 3b 0a 0a 7d 20  oken key; };..} 
07c0: 2f 2f 20 65 6e 64 20 25 69 6e 63 6c 75 64 65 0a  // end %include.
07d0: 0a 2f 2f 20 54 68 65 73 65 20 61 72 65 20 65 78  .// These are ex
07e0: 74 72 61 20 74 6f 6b 65 6e 73 20 75 73 65 64 20  tra tokens used 
07f0: 62 79 20 74 68 65 20 6c 65 78 65 72 20 62 75 74  by the lexer but
0800: 20 6e 65 76 65 72 20 73 65 65 6e 20 62 79 20 74   never seen by t
0810: 68 65 0a 2f 2f 20 70 61 72 73 65 72 2e 20 20 57  he.// parser.  W
0820: 65 20 70 75 74 20 74 68 65 6d 20 69 6e 20 61 20  e put them in a 
0830: 72 75 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  rule so that the
0840: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0850: 72 20 77 69 6c 6c 0a 2f 2f 20 61 64 64 20 74 68  r will.// add th
0860: 65 6d 20 74 6f 20 74 68 65 20 70 61 72 73 65 2e  em to the parse.
0870: 68 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 0a 2f  h output file../
0880: 2f 0a 25 6e 6f 6e 61 73 73 6f 63 20 45 4e 44 5f  /.%nonassoc END_
0890: 4f 46 5f 46 49 4c 45 20 49 4c 4c 45 47 41 4c 20  OF_FILE ILLEGAL 
08a0: 53 50 41 43 45 20 55 4e 43 4c 4f 53 45 44 5f 53  SPACE UNCLOSED_S
08b0: 54 52 49 4e 47 20 43 4f 4d 4d 45 4e 54 20 46 55  TRING COMMENT FU
08c0: 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  NCTION.         
08d0: 20 43 4f 4c 55 4d 4e 20 41 47 47 5f 46 55 4e 43   COLUMN AGG_FUNC
08e0: 54 49 4f 4e 2e 0a 0a 2f 2f 20 49 6e 70 75 74 20  TION...// Input 
08f0: 69 73 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20  is a single SQL 
0900: 63 6f 6d 6d 61 6e 64 0a 69 6e 70 75 74 20 3a 3a  command.input ::
0910: 3d 20 63 6d 64 6c 69 73 74 2e 0a 63 6d 64 6c 69  = cmdlist..cmdli
0920: 73 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74 20 65  st ::= cmdlist e
0930: 63 6d 64 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d  cmd..cmdlist ::=
0940: 20 65 63 6d 64 2e 0a 63 6d 64 78 20 3a 3a 3d 20   ecmd..cmdx ::= 
0950: 63 6d 64 2e 20 20 20 20 20 20 20 20 20 20 20 7b  cmd.           {
0960: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0970: 64 69 6e 67 28 70 50 61 72 73 65 29 3b 20 7d 0a  ding(pParse); }.
0980: 65 63 6d 64 20 3a 3a 3d 20 53 45 4d 49 2e 0a 65  ecmd ::= SEMI..e
0990: 63 6d 64 20 3a 3a 3d 20 65 78 70 6c 61 69 6e 20  cmd ::= explain 
09a0: 63 6d 64 78 20 53 45 4d 49 2e 0a 65 78 70 6c 61  cmdx SEMI..expla
09b0: 69 6e 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  in ::= .        
09c0: 20 20 20 7b 20 73 71 6c 69 74 65 33 42 65 67 69     { sqlite3Begi
09d0: 6e 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 30  nParse(pParse, 0
09e0: 29 3b 20 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c  ); }.%ifndef SQL
09f0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
0a00: 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50  .explain ::= EXP
0a10: 4c 41 49 4e 2e 20 20 20 20 7b 20 73 71 6c 69 74  LAIN.    { sqlit
0a20: 65 33 42 65 67 69 6e 50 61 72 73 65 28 70 50 61  e3BeginParse(pPa
0a30: 72 73 65 2c 20 31 29 3b 20 7d 0a 25 65 6e 64 69  rse, 1); }.%endi
0a40: 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  f../////////////
0a50: 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69 6e 20 61  //////// Begin a
0a60: 6e 64 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69  nd end transacti
0a70: 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ons. ///////////
0a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0a90: 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 42 45  /.//..cmd ::= BE
0aa0: 47 49 4e 20 74 72 61 6e 73 74 79 70 65 28 59 29  GIN transtype(Y)
0ab0: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 7b 73 71   trans_opt.  {sq
0ac0: 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
0ad0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 59 29  ction(pParse, Y)
0ae0: 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d  ;}.trans_opt ::=
0af0: 20 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d   ..trans_opt ::=
0b00: 20 54 52 41 4e 53 41 43 54 49 4f 4e 2e 0a 74 72   TRANSACTION..tr
0b10: 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 4e  ans_opt ::= TRAN
0b20: 53 41 43 54 49 4f 4e 20 6e 6d 2e 0a 25 74 79 70  SACTION nm..%typ
0b30: 65 20 74 72 61 6e 73 74 79 70 65 20 7b 69 6e 74  e transtype {int
0b40: 7d 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a  }.transtype(A) :
0b50: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
0b60: 20 7b 41 20 3d 20 54 4b 5f 44 45 46 45 52 52 45   {A = TK_DEFERRE
0b70: 44 3b 7d 0a 74 72 61 6e 73 74 79 70 65 28 41 29  D;}.transtype(A)
0b80: 20 3a 3a 3d 20 44 45 46 45 52 52 45 44 28 58 29   ::= DEFERRED(X)
0b90: 2e 20 20 7b 41 20 3d 20 40 58 3b 7d 0a 74 72 61  .  {A = @X;}.tra
0ba0: 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 49 4d  nstype(A) ::= IM
0bb0: 4d 45 44 49 41 54 45 28 58 29 2e 20 7b 41 20 3d  MEDIATE(X). {A =
0bc0: 20 40 58 3b 7d 0a 74 72 61 6e 73 74 79 70 65 28   @X;}.transtype(
0bd0: 41 29 20 3a 3a 3d 20 45 58 43 4c 55 53 49 56 45  A) ::= EXCLUSIVE
0be0: 28 58 29 2e 20 7b 41 20 3d 20 40 58 3b 7d 0a 63  (X). {A = @X;}.c
0bf0: 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54 20 74 72  md ::= COMMIT tr
0c00: 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 7b 73  ans_opt.      {s
0c10: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
0c20: 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  saction(pParse);
0c30: 7d 0a 63 6d 64 20 3a 3a 3d 20 45 4e 44 20 74 72  }.cmd ::= END tr
0c40: 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 20 20  ans_opt.        
0c50: 20 7b 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54   {sqlite3CommitT
0c60: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73  ransaction(pPars
0c70: 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c  e);}.cmd ::= ROL
0c80: 4c 42 41 43 4b 20 74 72 61 6e 73 5f 6f 70 74 2e  LBACK trans_opt.
0c90: 20 20 20 20 7b 73 71 6c 69 74 65 33 52 6f 6c 6c      {sqlite3Roll
0ca0: 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
0cb0: 70 50 61 72 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f 2f  pParse);}../////
0cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0cd0: 20 54 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   The CREATE TABL
0ce0: 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  E statement ////
0cf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d00: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
0d10: 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61 62 6c 65  ::= create_table
0d20: 20 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72   create_table_ar
0d30: 67 73 2e 0a 63 72 65 61 74 65 5f 74 61 62 6c 65  gs..create_table
0d40: 20 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 20 74   ::= CREATE(X) t
0d50: 65 6d 70 28 54 29 20 54 41 42 4c 45 20 6e 6d 28  emp(T) TABLE nm(
0d60: 59 29 20 64 62 6e 6d 28 5a 29 2e 20 7b 0a 20 20  Y) dbnm(Z). {.  
0d70: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
0d80: 6c 65 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c  le(pParse,&X,&Y,
0d90: 26 5a 2c 54 2c 30 29 3b 0a 7d 0a 25 74 79 70 65  &Z,T,0);.}.%type
0da0: 20 74 65 6d 70 20 7b 69 6e 74 7d 0a 74 65 6d 70   temp {int}.temp
0db0: 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20 20 7b  (A) ::= TEMP.  {
0dc0: 41 20 3d 20 31 3b 7d 0a 74 65 6d 70 28 41 29 20  A = 1;}.temp(A) 
0dd0: 3a 3a 3d 20 2e 20 20 20 20 20 20 7b 41 20 3d 20  ::= .      {A = 
0de0: 30 3b 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65  0;}.create_table
0df0: 5f 61 72 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c  _args ::= LP col
0e00: 75 6d 6e 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74  umnlist conslist
0e10: 5f 6f 70 74 20 52 50 28 58 29 2e 20 7b 0a 20 20  _opt RP(X). {.  
0e20: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
0e30: 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 0a 7d 0a  pParse,&X,0);.}.
0e40: 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67  create_table_arg
0e50: 73 20 3a 3a 3d 20 41 53 20 73 65 6c 65 63 74 28  s ::= AS select(
0e60: 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45  S). {.  sqlite3E
0e70: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  ndTable(pParse,0
0e80: 2c 53 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ,S);.  sqlite3Se
0e90: 6c 65 63 74 44 65 6c 65 74 65 28 53 29 3b 0a 7d  lectDelete(S);.}
0ea0: 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20  .columnlist ::= 
0eb0: 63 6f 6c 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41  columnlist COMMA
0ec0: 20 63 6f 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e 6c   column..columnl
0ed0: 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e 0a  ist ::= column..
0ee0: 0a 2f 2f 20 41 62 6f 75 74 20 74 68 65 20 6f 6e  .// About the on
0ef0: 6c 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  ly information u
0f00: 73 65 64 20 66 6f 72 20 61 20 63 6f 6c 75 6d 6e  sed for a column
0f10: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
0f20: 74 68 65 0a 2f 2f 20 63 6f 6c 75 6d 6e 2e 20 20  the.// column.  
0f30: 54 68 65 20 74 79 70 65 20 69 73 20 61 6c 77 61  The type is alwa
0f40: 79 73 20 6a 75 73 74 20 22 74 65 78 74 22 2e 20  ys just "text". 
0f50: 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 77 69   But the code wi
0f60: 6c 6c 20 61 63 63 65 70 74 0a 2f 2f 20 61 6e 20  ll accept.// an 
0f70: 65 6c 61 62 6f 72 61 74 65 20 74 79 70 65 6e 61  elaborate typena
0f80: 6d 65 2e 20 20 50 65 72 68 61 70 73 20 73 6f 6d  me.  Perhaps som
0f90: 65 64 61 79 20 77 65 27 6c 6c 20 64 6f 20 73 6f  eday we'll do so
0fa0: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 69 74 2e  mething with it.
0fb0: 0a 2f 2f 0a 63 6f 6c 75 6d 6e 20 3a 3a 3d 20 63  .//.column ::= c
0fc0: 6f 6c 75 6d 6e 69 64 20 74 79 70 65 20 63 61 72  olumnid type car
0fd0: 67 6c 69 73 74 2e 20 0a 63 6f 6c 75 6d 6e 69 64  glist. .columnid
0fe0: 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20 20 20 20   ::= nm(X).     
0ff0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
1000: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61  te3AddColumn(pPa
1010: 72 73 65 2c 26 58 29 3b 7d 0a 0a 2f 2f 20 41 6e  rse,&X);}..// An
1020: 20 49 44 45 4e 54 49 46 49 45 52 20 63 61 6e 20   IDENTIFIER can 
1030: 62 65 20 61 20 67 65 6e 65 72 69 63 20 69 64 65  be a generic ide
1040: 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20  ntifier, or one 
1050: 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65  of several.// ke
1060: 79 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e  ywords.  Any non
1070: 2d 73 74 61 6e 64 61 72 64 20 6b 65 79 77 6f 72  -standard keywor
1080: 64 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e  d can also be an
1090: 20 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 0a   identifier..//.
10a0: 25 74 79 70 65 20 69 64 20 7b 54 6f 6b 65 6e 7d  %type id {Token}
10b0: 0a 69 64 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  .id(A) ::= ID(X)
10c0: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
10d0: 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f  ;}..// The follo
10e0: 77 69 6e 67 20 64 69 72 65 63 74 69 76 65 20 63  wing directive c
10f0: 61 75 73 65 73 20 74 6f 6b 65 6e 73 20 41 42 4f  auses tokens ABO
1100: 52 54 2c 20 41 46 54 45 52 2c 20 41 53 43 2c 20  RT, AFTER, ASC, 
1110: 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61 6c 6c 62  etc. to.// fallb
1120: 61 63 6b 20 74 6f 20 49 44 20 69 66 20 74 68 65  ack to ID if the
1130: 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61 72 73 65  y will not parse
1140: 20 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e   as their origin
1150: 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20 54 68 69  al value..// Thi
1160: 73 20 6f 62 76 69 61 74 65 73 20 74 68 65 20 6e  s obviates the n
1170: 65 65 64 20 66 6f 72 20 74 68 65 20 22 69 64 22  eed for the "id"
1180: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2f 2f   nonterminal..//
1190: 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44 0a 20 20  .%fallback ID.  
11a0: 41 42 4f 52 54 20 41 46 54 45 52 20 41 53 43 20  ABORT AFTER ASC 
11b0: 41 54 54 41 43 48 20 42 45 46 4f 52 45 20 42 45  ATTACH BEFORE BE
11c0: 47 49 4e 20 43 41 53 43 41 44 45 20 43 4f 4e 46  GIN CASCADE CONF
11d0: 4c 49 43 54 0a 20 20 44 41 54 41 42 41 53 45 20  LICT.  DATABASE 
11e0: 44 45 46 45 52 52 45 44 20 44 45 53 43 20 44 45  DEFERRED DESC DE
11f0: 54 41 43 48 20 45 41 43 48 20 45 4e 44 20 45 58  TACH EACH END EX
1200: 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49 4e 20  CLUSIVE EXPLAIN 
1210: 46 41 49 4c 20 46 4f 52 0a 20 20 47 4c 4f 42 20  FAIL FOR.  GLOB 
1220: 49 47 4e 4f 52 45 20 49 4d 4d 45 44 49 41 54 45  IGNORE IMMEDIATE
1230: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4e 53 54 45   INITIALLY INSTE
1240: 41 44 20 4c 49 4b 45 20 4d 41 54 43 48 20 4b 45  AD LIKE MATCH KE
1250: 59 0a 20 20 4f 46 20 4f 46 46 53 45 54 20 50 52  Y.  OF OFFSET PR
1260: 41 47 4d 41 20 52 41 49 53 45 20 52 45 50 4c 41  AGMA RAISE REPLA
1270: 43 45 20 52 45 53 54 52 49 43 54 20 52 4f 57 20  CE RESTRICT ROW 
1280: 53 54 41 54 45 4d 45 4e 54 0a 20 20 54 45 4d 50  STATEMENT.  TEMP
1290: 20 54 52 49 47 47 45 52 20 56 41 43 55 55 4d 20   TRIGGER VACUUM 
12a0: 56 49 45 57 0a 25 69 66 64 65 66 20 53 51 4c 49  VIEW.%ifdef SQLI
12b0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
12c0: 5f 53 45 4c 45 43 54 0a 20 20 45 58 43 45 50 54  _SELECT.  EXCEPT
12d0: 20 49 4e 54 45 52 53 45 43 54 20 55 4e 49 4f 4e   INTERSECT UNION
12e0: 0a 25 65 6e 64 69 66 0a 20 20 52 45 49 4e 44 45  .%endif.  REINDE
12f0: 58 20 52 45 4e 41 4d 45 20 43 44 41 54 45 20 43  X RENAME CDATE C
1300: 54 49 4d 45 20 43 54 49 4d 45 53 54 41 4d 50 20  TIME CTIMESTAMP 
1310: 41 4c 54 45 52 0a 20 20 2e 0a 0a 2f 2f 20 44 65  ALTER.  ...// De
1320: 66 69 6e 65 20 6f 70 65 72 61 74 6f 72 20 70 72  fine operator pr
1330: 65 63 65 64 65 6e 63 65 20 65 61 72 6c 79 20 73  ecedence early s
1340: 6f 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74  o that this is t
1350: 68 65 20 66 69 72 73 74 20 6f 63 63 75 72 61 6e  he first occuran
1360: 63 65 0a 2f 2f 20 6f 66 20 74 68 65 20 6f 70 65  ce.// of the ope
1370: 72 61 74 6f 72 20 74 6f 6b 65 6e 73 20 69 6e 20  rator tokens in 
1380: 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 4b 65  the grammer.  Ke
1390: 65 70 69 6e 67 20 74 68 65 20 6f 70 65 72 61 74  eping the operat
13a0: 6f 72 73 20 74 6f 67 65 74 68 65 72 0a 2f 2f 20  ors together.// 
13b0: 63 61 75 73 65 73 20 74 68 65 6d 20 74 6f 20 62  causes them to b
13c0: 65 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65 67  e assigned integ
13d0: 65 72 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  er values that a
13e0: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
13f0: 72 2c 0a 2f 2f 20 77 68 69 63 68 20 6b 65 65 70  r,.// which keep
1400: 73 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20  s parser tables 
1410: 73 6d 61 6c 6c 65 72 2e 0a 2f 2f 0a 2f 2f 20 54  smaller..//.// T
1420: 68 65 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  he token values 
1430: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 73  assigned to thes
1440: 65 20 73 79 6d 62 6f 6c 73 20 69 73 20 64 65 74  e symbols is det
1450: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
1460: 72 64 65 72 0a 2f 2f 20 69 6e 20 77 68 69 63 68  rder.// in which
1470: 20 6c 65 6d 6f 6e 20 66 69 72 73 74 20 73 65 65   lemon first see
1480: 73 20 74 68 65 6d 2e 20 20 49 74 20 6d 75 73 74  s them.  It must
1490: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
14a0: 74 20 49 53 4e 55 4c 4c 2f 4e 4f 54 4e 55 4c 4c  t ISNULL/NOTNULL
14b0: 2c 0a 2f 2f 20 4e 45 2f 45 51 2c 20 47 54 2f 4c  ,.// NE/EQ, GT/L
14c0: 45 2c 20 61 6e 64 20 47 45 2f 4c 54 20 61 72 65  E, and GE/LT are
14d0: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 6f 6e   separated by on
14e0: 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75  ly a single valu
14f0: 65 2e 20 20 53 65 65 0a 2f 2f 20 74 68 65 20 73  e.  See.// the s
1500: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1510: 65 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  e() routine for 
1520: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1530: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 69 73 0a 2f  mation on this./
1540: 2f 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2f 2f  / constraint..//
1550: 0a 25 6c 65 66 74 20 4f 52 2e 0a 25 6c 65 66 74  .%left OR..%left
1560: 20 41 4e 44 2e 0a 25 72 69 67 68 74 20 4e 4f 54   AND..%right NOT
1570: 2e 0a 25 6c 65 66 74 20 49 53 20 4c 49 4b 45 20  ..%left IS LIKE 
1580: 47 4c 4f 42 20 42 45 54 57 45 45 4e 20 49 4e 20  GLOB BETWEEN IN 
1590: 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 4e  ISNULL NOTNULL N
15a0: 45 20 45 51 2e 0a 25 6c 65 66 74 20 47 54 20 4c  E EQ..%left GT L
15b0: 45 20 4c 54 20 47 45 2e 0a 25 72 69 67 68 74 20  E LT GE..%right 
15c0: 45 53 43 41 50 45 2e 0a 25 6c 65 66 74 20 42 49  ESCAPE..%left BI
15d0: 54 41 4e 44 20 42 49 54 4f 52 20 4c 53 48 49 46  TAND BITOR LSHIF
15e0: 54 20 52 53 48 49 46 54 2e 0a 25 6c 65 66 74 20  T RSHIFT..%left 
15f0: 50 4c 55 53 20 4d 49 4e 55 53 2e 0a 25 6c 65 66  PLUS MINUS..%lef
1600: 74 20 53 54 41 52 20 53 4c 41 53 48 20 52 45 4d  t STAR SLASH REM
1610: 2e 0a 25 6c 65 66 74 20 43 4f 4e 43 41 54 2e 0a  ..%left CONCAT..
1620: 25 72 69 67 68 74 20 55 4d 49 4e 55 53 20 55 50  %right UMINUS UP
1630: 4c 55 53 20 42 49 54 4e 4f 54 2e 0a 0a 2f 2f 20  LUS BITNOT...// 
1640: 41 6e 64 20 22 69 64 73 22 20 69 73 20 61 6e 20  And "ids" is an 
1650: 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d 73 74 72  identifer-or-str
1660: 69 6e 67 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64  ing..//.%type id
1670: 73 20 7b 54 6f 6b 65 6e 7d 0a 69 64 73 28 41 29  s {Token}.ids(A)
1680: 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20 20 20 20   ::= ID(X).     
1690: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 73 28     {A = X;}.ids(
16a0: 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29  A) ::= STRING(X)
16b0: 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f  .    {A = X;}../
16c0: 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  / The name of a 
16d0: 63 6f 6c 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20  column or table 
16e0: 63 61 6e 20 62 65 20 61 6e 79 20 6f 66 20 74 68  can be any of th
16f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a  e following:.//.
1700: 25 74 79 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d  %type nm {Token}
1710: 0a 6e 6d 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  .nm(A) ::= ID(X)
1720: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
1730: 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52  ;}.nm(A) ::= STR
1740: 49 4e 47 28 58 29 2e 20 20 20 20 20 7b 41 20 3d  ING(X).     {A =
1750: 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a   X;}.nm(A) ::= J
1760: 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20 7b 41  OIN_KW(X).    {A
1770: 20 3d 20 58 3b 7d 0a 0a 74 79 70 65 20 3a 3a 3d   = X;}..type ::=
1780: 20 2e 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65   ..type ::= type
1790: 6e 61 6d 65 28 58 29 2e 20 20 20 20 20 20 20 20  name(X).        
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
17b0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
17c0: 65 28 70 50 61 72 73 65 2c 26 58 2c 26 58 29 3b  e(pParse,&X,&X);
17d0: 7d 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e  }.type ::= typen
17e0: 61 6d 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64  ame(X) LP signed
17f0: 20 52 50 28 59 29 2e 20 20 20 20 7b 73 71 6c 69   RP(Y).    {sqli
1800: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
1810: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 29 3b 7d  (pParse,&X,&Y);}
1820: 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61  .type ::= typena
1830: 6d 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20  me(X) LP signed 
1840: 43 4f 4d 4d 41 20 73 69 67 6e 65 64 20 52 50 28  COMMA signed RP(
1850: 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y)..            
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
1880: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
1890: 70 65 28 70 50 61 72 73 65 2c 26 58 2c 26 59 29  pe(pParse,&X,&Y)
18a0: 3b 7d 0a 25 74 79 70 65 20 74 79 70 65 6e 61 6d  ;}.%type typenam
18b0: 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61  e {Token}.typena
18c0: 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73 28 58 29  me(A) ::= ids(X)
18d0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
18e0: 20 3d 20 58 3b 7d 0a 74 79 70 65 6e 61 6d 65 28   = X;}.typename(
18f0: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
1900: 58 29 20 69 64 73 28 59 29 2e 20 7b 41 2e 7a 3d  X) ids(Y). {A.z=
1910: 58 2e 7a 3b 20 41 2e 6e 3d 59 2e 6e 2b 28 59 2e  X.z; A.n=Y.n+(Y.
1920: 7a 2d 58 2e 7a 29 3b 7d 0a 25 74 79 70 65 20 73  z-X.z);}.%type s
1930: 69 67 6e 65 64 20 7b 69 6e 74 7d 0a 73 69 67 6e  igned {int}.sign
1940: 65 64 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6e  ed(A) ::= plus_n
1950: 75 6d 28 58 29 2e 20 20 20 20 7b 20 41 20 3d 20  um(X).    { A = 
1960: 61 74 6f 69 28 58 2e 7a 29 3b 20 7d 0a 73 69 67  atoi(X.z); }.sig
1970: 6e 65 64 28 41 29 20 3a 3a 3d 20 6d 69 6e 75 73  ned(A) ::= minus
1980: 5f 6e 75 6d 28 58 29 2e 20 20 20 7b 20 41 20 3d  _num(X).   { A =
1990: 20 2d 61 74 6f 69 28 58 2e 7a 29 3b 20 7d 0a 63   -atoi(X.z); }.c
19a0: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67  arglist ::= carg
19b0: 6c 69 73 74 20 63 61 72 67 2e 0a 63 61 72 67 6c  list carg..cargl
19c0: 69 73 74 20 3a 3a 3d 20 2e 0a 63 61 72 67 20 3a  ist ::= ..carg :
19d0: 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d  := CONSTRAINT nm
19e0: 20 63 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d   ccons..carg ::=
19f0: 20 63 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d   ccons..carg ::=
1a00: 20 44 45 46 41 55 4c 54 20 74 65 72 6d 28 58 29   DEFAULT term(X)
1a10: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71  .            {sq
1a20: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
1a30: 61 6c 75 65 28 70 50 61 72 73 65 2c 58 29 3b 7d  alue(pParse,X);}
1a40: 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c  .carg ::= DEFAUL
1a50: 54 20 50 4c 55 53 20 74 65 72 6d 28 58 29 2e 20  T PLUS term(X). 
1a60: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
1a70: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
1a80: 61 72 73 65 2c 58 29 3b 7d 0a 63 61 72 67 20 3a  arse,X);}.carg :
1a90: 3a 3d 20 44 45 46 41 55 4c 54 20 4d 49 4e 55 53  := DEFAULT MINUS
1aa0: 20 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20 7b   term(X).      {
1ab0: 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c  .  Expr *p = sql
1ac0: 69 74 65 33 45 78 70 72 28 54 4b 5f 55 4d 49 4e  ite3Expr(TK_UMIN
1ad0: 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  US, X, 0, 0);.  
1ae0: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
1af0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 70 29  tValue(pParse,p)
1b00: 3b 0a 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46  ;.}.carg ::= DEF
1b10: 41 55 4c 54 20 69 64 28 58 29 2e 20 20 20 20 20  AULT id(X).     
1b20: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 45 78 70           {.  Exp
1b30: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
1b40: 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c  pr(TK_STRING, 0,
1b50: 20 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74   0, &X);.  sqlit
1b60: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
1b70: 65 28 70 50 61 72 73 65 2c 70 29 3b 0a 7d 0a 0a  e(pParse,p);.}..
1b80: 2f 2f 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  // In addition t
1b90: 6f 20 74 68 65 20 74 79 70 65 20 6e 61 6d 65 2c  o the type name,
1ba0: 20 77 65 20 61 6c 73 6f 20 63 61 72 65 20 61 62   we also care ab
1bb0: 6f 75 74 20 74 68 65 20 70 72 69 6d 61 72 79 20  out the primary 
1bc0: 6b 65 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 55  key and.// UNIQU
1bd0: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2f  E constraints../
1be0: 2f 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 55 4c 4c  /.ccons ::= NULL
1bf0: 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a   onconf..ccons :
1c00: 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f  := NOT NULL onco
1c10: 6e 66 28 52 29 2e 20 20 20 20 20 20 20 20 20 20  nf(R).          
1c20: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64       {sqlite3Add
1c30: 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  NotNull(pParse, 
1c40: 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 50  R);}.ccons ::= P
1c50: 52 49 4d 41 52 59 20 4b 45 59 20 73 6f 72 74 6f  RIMARY KEY sorto
1c60: 72 64 65 72 20 6f 6e 63 6f 6e 66 28 52 29 20 61  rder onconf(R) a
1c70: 75 74 6f 69 6e 63 28 49 29 2e 0a 20 20 20 20 20  utoinc(I)..     
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 7b 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61  {sqlite3AddPrima
1cb0: 72 79 4b 65 79 28 70 50 61 72 73 65 2c 30 2c 52  ryKey(pParse,0,R
1cc0: 2c 49 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,I);}.ccons ::= 
1cd0: 55 4e 49 51 55 45 20 6f 6e 63 6f 6e 66 28 52 29  UNIQUE onconf(R)
1ce0: 2e 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69  .          {sqli
1cf0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
1d00: 50 61 72 73 65 2c 30 2c 30 2c 30 2c 30 2c 52 2c  Parse,0,0,0,0,R,
1d10: 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d  0,0);}.ccons ::=
1d20: 20 43 48 45 43 4b 20 4c 50 20 65 78 70 72 20 52   CHECK LP expr R
1d30: 50 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20  P onconf..ccons 
1d40: 3a 3a 3d 20 52 45 46 45 52 45 4e 43 45 53 20 6e  ::= REFERENCES n
1d50: 6d 28 54 29 20 69 64 78 6c 69 73 74 5f 6f 70 74  m(T) idxlist_opt
1d60: 28 54 41 29 20 72 65 66 61 72 67 73 28 52 29 2e  (TA) refargs(R).
1d70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74 65 46   {sqlite3CreateF
1da0: 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65  oreignKey(pParse
1db0: 2c 30 2c 26 54 2c 54 41 2c 52 29 3b 7d 0a 63 63  ,0,&T,TA,R);}.cc
1dc0: 6f 6e 73 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75  ons ::= defer_su
1dd0: 62 63 6c 61 75 73 65 28 44 29 2e 20 20 20 7b 73  bclause(D).   {s
1de0: 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
1df0: 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 44 29 3b  gnKey(pParse,D);
1e00: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4c 4c  }.ccons ::= COLL
1e10: 41 54 45 20 69 64 28 43 29 2e 20 20 7b 73 71 6c  ATE id(C).  {sql
1e20: 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79  ite3AddCollateTy
1e30: 70 65 28 70 50 61 72 73 65 2c 20 43 2e 7a 2c 20  pe(pParse, C.z, 
1e40: 43 2e 6e 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6f  C.n);}..// The o
1e50: 70 74 69 6f 6e 61 6c 20 41 55 54 4f 49 4e 43 52  ptional AUTOINCR
1e60: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 0a 25 74  EMENT keyword.%t
1e70: 79 70 65 20 61 75 74 6f 69 6e 63 20 7b 69 6e 74  ype autoinc {int
1e80: 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d  }.autoinc(X) ::=
1e90: 20 2e 20 20 20 20 20 20 20 20 20 20 7b 58 20 3d   .          {X =
1ea0: 20 30 3b 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20   0;}.autoinc(X) 
1eb0: 3a 3a 3d 20 41 55 54 4f 49 4e 43 52 2e 20 20 7b  ::= AUTOINCR.  {
1ec0: 58 20 3d 20 31 3b 7d 0a 0a 2f 2f 20 54 68 65 20  X = 1;}..// The 
1ed0: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 75  next group of ru
1ee0: 6c 65 73 20 70 61 72 73 65 73 20 74 68 65 20 61  les parses the a
1ef0: 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 52 45  rguments to a RE
1f00: 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65 0a  FERENCES clause.
1f10: 2f 2f 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  // that determin
1f20: 65 20 69 66 20 74 68 65 20 72 65 66 65 72 65 6e  e if the referen
1f30: 74 69 61 6c 20 69 6e 74 65 67 72 69 74 79 20 63  tial integrity c
1f40: 68 65 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72  hecking is defer
1f50: 72 65 64 20 6f 72 0a 2f 2f 20 6f 72 20 69 6d 6d  red or.// or imm
1f60: 65 64 69 61 74 65 20 61 6e 64 20 77 68 69 63 68  ediate and which
1f70: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20   determine what 
1f80: 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69  action to take i
1f90: 66 20 61 20 72 65 66 2d 69 6e 74 65 67 0a 2f 2f  f a ref-integ.//
1fa0: 20 63 68 65 63 6b 20 66 61 69 6c 73 2e 0a 2f 2f   check fails..//
1fb0: 0a 25 74 79 70 65 20 72 65 66 61 72 67 73 20 7b  .%type refargs {
1fc0: 69 6e 74 7d 0a 72 65 66 61 72 67 73 28 41 29 20  int}.refargs(A) 
1fd0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
1fe0: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
1ff0: 4f 45 5f 52 65 73 74 72 69 63 74 20 2a 20 30 78  OE_Restrict * 0x
2000: 30 31 30 31 30 31 3b 20 7d 0a 72 65 66 61 72 67  010101; }.refarg
2010: 73 28 41 29 20 3a 3a 3d 20 72 65 66 61 72 67 73  s(A) ::= refargs
2020: 28 58 29 20 72 65 66 61 72 67 28 59 29 2e 20 7b  (X) refarg(Y). {
2030: 20 41 20 3d 20 28 58 20 26 20 59 2e 6d 61 73 6b   A = (X & Y.mask
2040: 29 20 7c 20 59 2e 76 61 6c 75 65 3b 20 7d 0a 25  ) | Y.value; }.%
2050: 74 79 70 65 20 72 65 66 61 72 67 20 7b 73 74 72  type refarg {str
2060: 75 63 74 20 7b 69 6e 74 20 76 61 6c 75 65 3b 20  uct {int value; 
2070: 69 6e 74 20 6d 61 73 6b 3b 7d 7d 0a 72 65 66 61  int mask;}}.refa
2080: 72 67 28 41 29 20 3a 3a 3d 20 4d 41 54 43 48 20  rg(A) ::= MATCH 
2090: 6e 6d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  nm.             
20a0: 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b 20   { A.value = 0; 
20b0: 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30      A.mask = 0x0
20c0: 30 30 30 30 30 3b 20 7d 0a 72 65 66 61 72 67 28  00000; }.refarg(
20d0: 41 29 20 3a 3a 3d 20 4f 4e 20 44 45 4c 45 54 45  A) ::= ON DELETE
20e0: 20 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b 20   refact(X).   { 
20f0: 41 2e 76 61 6c 75 65 20 3d 20 58 3b 20 20 20 20  A.value = X;    
2100: 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30   A.mask = 0x0000
2110: 66 66 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20  ff; }.refarg(A) 
2120: 3a 3a 3d 20 4f 4e 20 55 50 44 41 54 45 20 72 65  ::= ON UPDATE re
2130: 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76  fact(X).   { A.v
2140: 61 6c 75 65 20 3d 20 58 3c 3c 38 3b 20 20 41 2e  alue = X<<8;  A.
2150: 6d 61 73 6b 20 3d 20 30 78 30 30 66 66 30 30 3b  mask = 0x00ff00;
2160: 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d   }.refarg(A) ::=
2170: 20 4f 4e 20 49 4e 53 45 52 54 20 72 65 66 61 63   ON INSERT refac
2180: 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75  t(X).   { A.valu
2190: 65 20 3d 20 58 3c 3c 31 36 3b 20 41 2e 6d 61 73  e = X<<16; A.mas
21a0: 6b 20 3d 20 30 78 66 66 30 30 30 30 3b 20 7d 0a  k = 0xff0000; }.
21b0: 25 74 79 70 65 20 72 65 66 61 63 74 20 7b 69 6e  %type refact {in
21c0: 74 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d  t}.refact(A) ::=
21d0: 20 53 45 54 20 4e 55 4c 4c 2e 20 20 20 20 20 20   SET NULL.      
21e0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
21f0: 5f 53 65 74 4e 75 6c 6c 3b 20 7d 0a 72 65 66 61  _SetNull; }.refa
2200: 63 74 28 41 29 20 3a 3a 3d 20 53 45 54 20 44 45  ct(A) ::= SET DE
2210: 46 41 55 4c 54 2e 20 20 20 20 20 20 20 20 20 20  FAULT.          
2220: 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74 44 66 6c   { A = OE_SetDfl
2230: 74 3b 20 7d 0a 72 65 66 61 63 74 28 41 29 20 3a  t; }.refact(A) :
2240: 3a 3d 20 43 41 53 43 41 44 45 2e 20 20 20 20 20  := CASCADE.     
2250: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
2260: 4f 45 5f 43 61 73 63 61 64 65 3b 20 7d 0a 72 65  OE_Cascade; }.re
2270: 66 61 63 74 28 41 29 20 3a 3a 3d 20 52 45 53 54  fact(A) ::= REST
2280: 52 49 43 54 2e 20 20 20 20 20 20 20 20 20 20 20  RICT.           
2290: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65 73 74     { A = OE_Rest
22a0: 72 69 63 74 3b 20 7d 0a 25 74 79 70 65 20 64 65  rict; }.%type de
22b0: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 20 7b 69  fer_subclause {i
22c0: 6e 74 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61  nt}.defer_subcla
22d0: 75 73 65 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 44  use(A) ::= NOT D
22e0: 45 46 45 52 52 41 42 4c 45 20 69 6e 69 74 5f 64  EFERRABLE init_d
22f0: 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74  eferred_pred_opt
2300: 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 64  (X).  {A = X;}.d
2310: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 41  efer_subclause(A
2320: 29 20 3a 3a 3d 20 44 45 46 45 52 52 41 42 4c 45  ) ::= DEFERRABLE
2330: 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70   init_deferred_p
2340: 72 65 64 5f 6f 70 74 28 58 29 2e 20 20 20 20 20  red_opt(X).     
2350: 20 7b 41 20 3d 20 58 3b 7d 0a 25 74 79 70 65 20   {A = X;}.%type 
2360: 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72  init_deferred_pr
2370: 65 64 5f 6f 70 74 20 7b 69 6e 74 7d 0a 69 6e 69  ed_opt {int}.ini
2380: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f  t_deferred_pred_
2390: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 69 74     {A = 0;}.init
23c0: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f  _deferred_pred_o
23d0: 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41  pt(A) ::= INITIA
23e0: 4c 4c 59 20 44 45 46 45 52 52 45 44 2e 20 20 20  LLY DEFERRED.   
23f0: 20 20 7b 41 20 3d 20 31 3b 7d 0a 69 6e 69 74 5f    {A = 1;}.init_
2400: 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70  deferred_pred_op
2410: 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c  t(A) ::= INITIAL
2420: 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 20 20 20  LY IMMEDIATE.   
2430: 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 46 6f   {A = 0;}..// Fo
2440: 72 20 74 68 65 20 74 69 6d 65 20 62 65 69 6e 67  r the time being
2450: 2c 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6e 73 74  , the only const
2460: 72 61 69 6e 74 20 77 65 20 63 61 72 65 20 61 62  raint we care ab
2470: 6f 75 74 20 69 73 20 74 68 65 20 70 72 69 6d 61  out is the prima
2480: 72 79 0a 2f 2f 20 6b 65 79 20 61 6e 64 20 55 4e  ry.// key and UN
2490: 49 51 55 45 2e 20 20 42 6f 74 68 20 63 72 65 61  IQUE.  Both crea
24a0: 74 65 20 69 6e 64 69 63 65 73 2e 0a 2f 2f 0a 63  te indices..//.c
24b0: 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 3a 3a 3d 20  onslist_opt ::= 
24c0: 2e 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 3a  ..conslist_opt :
24d0: 3a 3d 20 43 4f 4d 4d 41 20 63 6f 6e 73 6c 69 73  := COMMA conslis
24e0: 74 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20  t..conslist ::= 
24f0: 63 6f 6e 73 6c 69 73 74 20 43 4f 4d 4d 41 20 74  conslist COMMA t
2500: 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a  cons..conslist :
2510: 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 74 63 6f 6e  := conslist tcon
2520: 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20  s..conslist ::= 
2530: 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73 20 3a 3a 3d  tcons..tcons ::=
2540: 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 2e 0a   CONSTRAINT nm..
2550: 74 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52  tcons ::= PRIMAR
2560: 59 20 4b 45 59 20 4c 50 20 69 64 78 6c 69 73 74  Y KEY LP idxlist
2570: 28 58 29 20 61 75 74 6f 69 6e 63 28 49 29 20 52  (X) autoinc(I) R
2580: 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20  P onconf(R)..   
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
25c0: 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72  dPrimaryKey(pPar
25d0: 73 65 2c 58 2c 52 2c 49 29 3b 7d 0a 74 63 6f 6e  se,X,R,I);}.tcon
25e0: 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 4c 50 20  s ::= UNIQUE LP 
25f0: 69 64 78 6c 69 73 74 28 58 29 20 52 50 20 6f 6e  idxlist(X) RP on
2600: 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20 20 20  conf(R)..       
2610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 7b 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e  {sqlite3CreateIn
2640: 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  dex(pParse,0,0,0
2650: 2c 58 2c 52 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e  ,X,R,0,0);}.tcon
2660: 73 20 3a 3a 3d 20 43 48 45 43 4b 20 65 78 70 72  s ::= CHECK expr
2670: 20 6f 6e 63 6f 6e 66 2e 0a 74 63 6f 6e 73 20 3a   onconf..tcons :
2680: 3a 3d 20 46 4f 52 45 49 47 4e 20 4b 45 59 20 4c  := FOREIGN KEY L
2690: 50 20 69 64 78 6c 69 73 74 28 46 41 29 20 52 50  P idxlist(FA) RP
26a0: 0a 20 20 20 20 20 20 20 20 20 20 52 45 46 45 52  .          REFER
26b0: 45 4e 43 45 53 20 6e 6d 28 54 29 20 69 64 78 6c  ENCES nm(T) idxl
26c0: 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66 61  ist_opt(TA) refa
26d0: 72 67 73 28 52 29 20 64 65 66 65 72 5f 73 75 62  rgs(R) defer_sub
26e0: 63 6c 61 75 73 65 5f 6f 70 74 28 44 29 2e 20 7b  clause_opt(D). {
26f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
2700: 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61  teForeignKey(pPa
2710: 72 73 65 2c 20 46 41 2c 20 26 54 2c 20 54 41 2c  rse, FA, &T, TA,
2720: 20 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   R);.    sqlite3
2730: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
2740: 70 50 61 72 73 65 2c 20 44 29 3b 0a 7d 0a 25 74  pParse, D);.}.%t
2750: 79 70 65 20 64 65 66 65 72 5f 73 75 62 63 6c 61  ype defer_subcla
2760: 75 73 65 5f 6f 70 74 20 7b 69 6e 74 7d 0a 64 65  use_opt {int}.de
2770: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70  fer_subclause_op
2780: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
27a0: 20 3d 20 30 3b 7d 0a 64 65 66 65 72 5f 73 75 62   = 0;}.defer_sub
27b0: 63 6c 61 75 73 65 5f 6f 70 74 28 41 29 20 3a 3a  clause_opt(A) ::
27c0: 3d 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  = defer_subclaus
27d0: 65 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  e(X).  {A = X;}.
27e0: 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .// The followin
27f0: 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74 61 6e 64  g is a non-stand
2800: 61 72 64 20 65 78 74 65 6e 73 69 6f 6e 20 74 68  ard extension th
2810: 61 74 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20  at allows us to 
2820: 64 65 63 6c 61 72 65 20 74 68 65 0a 2f 2f 20 64  declare the.// d
2830: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20  efault behavior 
2840: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  when there is a 
2850: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e 66 6c  constraint confl
2860: 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f 6e  ict..//.%type on
2870: 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 70 65  conf {int}.%type
2880: 20 6f 72 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74   orconf {int}.%t
2890: 79 70 65 20 72 65 73 6f 6c 76 65 74 79 70 65 20  ype resolvetype 
28a0: 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20  {int}.onconf(A) 
28b0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 7b 41 20 3d 20 4f 45 5f 44 65 66 61 75     {A = OE_Defau
28e0: 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20 3a  lt;}.onconf(A) :
28f0: 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 72  := ON CONFLICT r
2900: 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20  esolvetype(X).  
2910: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f 72 63 6f 6e    {A = X;}.orcon
2920: 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  f(A) ::= .      
2930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2940: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f          {A = OE_
2950: 44 65 66 61 75 6c 74 3b 7d 0a 6f 72 63 6f 6e 66  Default;}.orconf
2960: 28 41 29 20 3a 3a 3d 20 4f 52 20 72 65 73 6f 6c  (A) ::= OR resol
2970: 76 65 74 79 70 65 28 58 29 2e 20 20 20 20 20 20  vetype(X).      
2980: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
2990: 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a  resolvetype(A) :
29a0: 3a 3d 20 72 61 69 73 65 74 79 70 65 28 58 29 2e  := raisetype(X).
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
29c0: 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70  = X;}.resolvetyp
29d0: 65 28 41 29 20 3a 3a 3d 20 49 47 4e 4f 52 45 2e  e(A) ::= IGNORE.
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 7b 41 20 3d 20 4f 45 5f 49 67 6e 6f 72     {A = OE_Ignor
2a00: 65 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28  e;}.resolvetype(
2a10: 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20  A) ::= REPLACE. 
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65   {A = OE_Replace
2a40: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
2a50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
2a60: 68 65 20 44 52 4f 50 20 54 41 42 4c 45 20 2f 2f  he DROP TABLE //
2a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2a90: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44  ///.//.cmd ::= D
2aa0: 52 4f 50 20 54 41 42 4c 45 20 66 75 6c 6c 6e 61  ROP TABLE fullna
2ab0: 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74  me(X). {.  sqlit
2ac0: 65 33 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  e3DropTable(pPar
2ad0: 73 65 2c 20 58 2c 20 30 29 3b 0a 7d 0a 0a 2f 2f  se, X, 0);.}..//
2ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2af0: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 56  /// The CREATE V
2b00: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f  IEW statement //
2b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25  ///////////.//.%
2b30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2b40: 49 54 5f 56 49 45 57 0a 63 6d 64 20 3a 3a 3d 20  IT_VIEW.cmd ::= 
2b50: 43 52 45 41 54 45 28 58 29 20 74 65 6d 70 28 54  CREATE(X) temp(T
2b60: 29 20 56 49 45 57 20 6e 6d 28 59 29 20 64 62 6e  ) VIEW nm(Y) dbn
2b70: 6d 28 5a 29 20 41 53 20 73 65 6c 65 63 74 28 53  m(Z) AS select(S
2b80: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 43 72  ). {.  sqlite3Cr
2b90: 65 61 74 65 56 69 65 77 28 70 50 61 72 73 65 2c  eateView(pParse,
2ba0: 20 26 58 2c 20 26 59 2c 20 26 5a 2c 20 53 2c 20   &X, &Y, &Z, S, 
2bb0: 54 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44 52  T);.}.cmd ::= DR
2bc0: 4f 50 20 56 49 45 57 20 66 75 6c 6c 6e 61 6d 65  OP VIEW fullname
2bd0: 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (X). {.  sqlite3
2be0: 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
2bf0: 2c 20 58 2c 20 31 29 3b 0a 7d 0a 25 65 6e 64 69  , X, 1);.}.%endi
2c00: 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f // SQLITE_OMIT
2c10: 5f 56 49 45 57 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  _VIEW../////////
2c20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
2c30: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
2c40: 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ment ///////////
2c50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c60: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
2c70: 3d 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b 0a  = select(X).  {.
2c80: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
2c90: 70 50 61 72 73 65 2c 20 58 2c 20 53 52 54 5f 43  pParse, X, SRT_C
2ca0: 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c 20 30  allback, 0, 0, 0
2cb0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
2cc0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2cd0: 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  e(X);.}..%type s
2ce0: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
2cf0: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
2d00: 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  ct {sqlite3Selec
2d10: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
2d20: 79 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53  ype oneselect {S
2d30: 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63  elect*}.%destruc
2d40: 74 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73  tor oneselect {s
2d50: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2d60: 74 65 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74  te($$);}..select
2d70: 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63  (A) ::= oneselec
2d80: 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  t(X).           
2d90: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2da0: 58 3b 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  X;}.%ifndef SQLI
2db0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
2dc0: 5f 53 45 4c 45 43 54 0a 73 65 6c 65 63 74 28 41  _SELECT.select(A
2dd0: 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 20  ) ::= select(X) 
2de0: 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 59  multiselect_op(Y
2df0: 29 20 6f 6e 65 73 65 6c 65 63 74 28 5a 29 2e 20  ) oneselect(Z). 
2e00: 20 7b 0a 20 20 69 66 28 20 5a 20 29 7b 0a 20 20   {.  if( Z ){.  
2e10: 20 20 5a 2d 3e 6f 70 20 3d 20 59 3b 0a 20 20 20    Z->op = Y;.   
2e20: 20 5a 2d 3e 70 50 72 69 6f 72 20 3d 20 58 3b 0a   Z->pPrior = X;.
2e30: 20 20 7d 0a 20 20 41 20 3d 20 5a 3b 0a 7d 0a 25    }.  A = Z;.}.%
2e40: 74 79 70 65 20 6d 75 6c 74 69 73 65 6c 65 63 74  type multiselect
2e50: 5f 6f 70 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73  _op {int}.multis
2e60: 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20  elect_op(A) ::= 
2e70: 55 4e 49 4f 4e 28 4f 50 29 2e 20 20 20 20 20 20  UNION(OP).      
2e80: 7b 41 20 3d 20 40 4f 50 3b 7d 0a 6d 75 6c 74 69  {A = @OP;}.multi
2e90: 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d  select_op(A) ::=
2ea0: 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 20 20 20   UNION ALL.     
2eb0: 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d   {A = TK_ALL;}.m
2ec0: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29  ultiselect_op(A)
2ed0: 20 3a 3a 3d 20 49 4e 54 45 52 53 45 43 54 28 4f   ::= INTERSECT(O
2ee0: 50 29 2e 20 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a  P).  {A = @OP;}.
2ef0: 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41  multiselect_op(A
2f00: 29 20 3a 3a 3d 20 45 58 43 45 50 54 28 4f 50 29  ) ::= EXCEPT(OP)
2f10: 2e 20 20 20 20 20 7b 41 20 3d 20 40 4f 50 3b 7d  .     {A = @OP;}
2f20: 0a 25 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49 54  .%endif // SQLIT
2f30: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
2f40: 53 45 4c 45 43 54 0a 6f 6e 65 73 65 6c 65 63 74  SELECT.oneselect
2f50: 28 41 29 20 3a 3a 3d 20 53 45 4c 45 43 54 20 64  (A) ::= SELECT d
2f60: 69 73 74 69 6e 63 74 28 44 29 20 73 65 6c 63 6f  istinct(D) selco
2f70: 6c 6c 69 73 74 28 57 29 20 66 72 6f 6d 28 58 29  llist(W) from(X)
2f80: 20 77 68 65 72 65 5f 6f 70 74 28 59 29 0a 20 20   where_opt(Y).  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
2fa0: 72 6f 75 70 62 79 5f 6f 70 74 28 50 29 20 68 61  roupby_opt(P) ha
2fb0: 76 69 6e 67 5f 6f 70 74 28 51 29 20 6f 72 64 65  ving_opt(Q) orde
2fc0: 72 62 79 5f 6f 70 74 28 5a 29 20 6c 69 6d 69 74  rby_opt(Z) limit
2fd0: 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 41 20 3d  _opt(L). {.  A =
2fe0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65   sqlite3SelectNe
2ff0: 77 28 57 2c 58 2c 59 2c 50 2c 51 2c 5a 2c 44 2c  w(W,X,Y,P,Q,Z,D,
3000: 4c 2e 6c 69 6d 69 74 2c 4c 2e 6f 66 66 73 65 74  L.limit,L.offset
3010: 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20 22 64 69  );.}..// The "di
3020: 73 74 69 6e 63 74 22 20 6e 6f 6e 74 65 72 6d 69  stinct" nontermi
3030: 6e 61 6c 20 69 73 20 74 72 75 65 20 28 31 29 20  nal is true (1) 
3040: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
3050: 6b 65 79 77 6f 72 64 20 69 73 0a 2f 2f 20 70 72  keyword is.// pr
3060: 65 73 65 6e 74 20 61 6e 64 20 66 61 6c 73 65 20  esent and false 
3070: 28 30 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  (0) if it is not
3080: 2e 0a 2f 2f 0a 25 74 79 70 65 20 64 69 73 74 69  ..//.%type disti
3090: 6e 63 74 20 7b 69 6e 74 7d 0a 64 69 73 74 69 6e  nct {int}.distin
30a0: 63 74 28 41 29 20 3a 3a 3d 20 44 49 53 54 49 4e  ct(A) ::= DISTIN
30b0: 43 54 2e 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 64  CT.   {A = 1;}.d
30c0: 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 41  istinct(A) ::= A
30d0: 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20  LL.        {A = 
30e0: 30 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20  0;}.distinct(A) 
30f0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
3100: 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73 65 6c  {A = 0;}..// sel
3110: 63 6f 6c 6c 69 73 74 20 69 73 20 61 20 6c 69 73  collist is a lis
3120: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
3130: 20 74 68 61 74 20 61 72 65 20 74 6f 20 62 65 63   that are to bec
3140: 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 0a 2f  ome the return./
3150: 2f 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20  / values of the 
3160: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3170: 2e 20 20 54 68 65 20 22 2a 22 20 69 6e 20 73 74  .  The "*" in st
3180: 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 2f 2f  atements like.//
3190: 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
31a0: 2e 2e 2e 22 20 69 73 20 65 6e 63 6f 64 65 64 20  ..." is encoded 
31b0: 61 73 20 61 20 73 70 65 63 69 61 6c 20 65 78 70  as a special exp
31c0: 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 6e 0a  ression with an.
31d0: 2f 2f 20 6f 70 63 6f 64 65 20 6f 66 20 54 4b 5f  // opcode of TK_
31e0: 41 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 65  ALL..//.%type se
31f0: 6c 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69  lcollist {ExprLi
3200: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
3210: 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c   selcollist {sql
3220: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
3230: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73  te($$);}.%type s
3240: 63 6c 70 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  clp {ExprList*}.
3250: 25 64 65 73 74 72 75 63 74 6f 72 20 73 63 6c 70  %destructor sclp
3260: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   {sqlite3ExprLis
3270: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 73 63  tDelete($$);}.sc
3280: 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c 63 6f 6c  lp(A) ::= selcol
3290: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 2e 20 20  list(X) COMMA.  
32a0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
32b0: 58 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20  X;}.sclp(A) ::= 
32c0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63 6f 6c   {A = 0;}.selcol
32f0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70  list(A) ::= sclp
3300: 28 50 29 20 65 78 70 72 28 58 29 20 61 73 28 59  (P) expr(X) as(Y
3310: 29 2e 20 20 20 20 20 7b 0a 20 20 20 41 20 3d 20  ).     {.   A = 
3320: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
3330: 70 70 65 6e 64 28 50 2c 58 2c 59 2e 6e 3f 26 59  ppend(P,X,Y.n?&Y
3340: 3a 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73  :0);.}.selcollis
3350: 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29  t(A) ::= sclp(P)
3360: 20 53 54 41 52 2e 20 7b 0a 20 20 41 20 3d 20 73   STAR. {.  A = s
3370: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
3380: 70 65 6e 64 28 50 2c 20 73 71 6c 69 74 65 33 45  pend(P, sqlite3E
3390: 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30  xpr(TK_ALL, 0, 0
33a0: 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 73 65 6c 63  , 0), 0);.}.selc
33b0: 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63  ollist(A) ::= sc
33c0: 6c 70 28 50 29 20 6e 6d 28 58 29 20 44 4f 54 20  lp(P) nm(X) DOT 
33d0: 53 54 41 52 2e 20 7b 0a 20 20 45 78 70 72 20 2a  STAR. {.  Expr *
33e0: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
33f0: 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c 20  Expr(TK_ALL, 0, 
3400: 30 2c 20 30 29 3b 0a 20 20 45 78 70 72 20 2a 70  0, 0);.  Expr *p
3410: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
3420: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
3430: 26 58 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74  &X);.  A = sqlit
3440: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
3450: 28 50 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28  (P, sqlite3Expr(
3460: 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70  TK_DOT, pLeft, p
3470: 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 7d  Right, 0), 0);.}
3480: 0a 0a 2f 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22  ..// An option "
3490: 41 53 20 3c 69 64 3e 22 20 70 68 72 61 73 65 20  AS <id>" phrase 
34a0: 74 68 61 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  that can follow 
34b0: 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  one of the expre
34c0: 73 73 69 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64  ssions that.// d
34d0: 65 66 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74  efine the result
34e0: 20 73 65 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20   set, or one of 
34f0: 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
3500: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f  e FROM clause../
3510: 2f 0a 25 74 79 70 65 20 61 73 20 7b 54 6f 6b 65  /.%type as {Toke
3520: 6e 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 41 53 20  n}.as(X) ::= AS 
3530: 6e 6d 28 59 29 2e 20 20 20 20 7b 58 20 3d 20 59  nm(Y).    {X = Y
3540: 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 69 64 73  ;}.as(X) ::= ids
3550: 28 59 29 2e 20 20 20 20 20 20 7b 58 20 3d 20 59  (Y).      {X = Y
3560: 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20  ;}.as(X) ::= .  
3570: 20 20 20 20 20 20 20 20 20 20 7b 58 2e 6e 20 3d            {X.n =
3580: 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 73 65 6c   0;}...%type sel
3590: 74 61 62 6c 69 73 74 20 7b 53 72 63 4c 69 73 74  tablist {SrcList
35a0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
35b0: 65 6c 74 61 62 6c 69 73 74 20 7b 73 71 6c 69 74  eltablist {sqlit
35c0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
35d0: 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 74 6c 5f  $$);}.%type stl_
35e0: 70 72 65 66 69 78 20 7b 53 72 63 4c 69 73 74 2a  prefix {SrcList*
35f0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 74  }.%destructor st
3600: 6c 5f 70 72 65 66 69 78 20 7b 73 71 6c 69 74 65  l_prefix {sqlite
3610: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24  3SrcListDelete($
3620: 24 29 3b 7d 0a 25 74 79 70 65 20 66 72 6f 6d 20  $);}.%type from 
3630: 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74  {SrcList*}.%dest
3640: 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b 73 71 6c  ructor from {sql
3650: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
3660: 65 28 24 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f  e($$);}..// A co
3670: 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63 6c 61 75  mplete FROM clau
3680: 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a  se..//.from(A) :
3690: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
36c0: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 41  Malloc(sizeof(*A
36d0: 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d  ));}.from(A) ::=
36e0: 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73 74   FROM seltablist
36f0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
3700: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20     {A = X;}..// 
3710: 22 73 65 6c 74 61 62 6c 69 73 74 22 20 69 73 20  "seltablist" is 
3720: 61 20 22 53 65 6c 65 63 74 20 54 61 62 6c 65 20  a "Select Table 
3730: 4c 69 73 74 22 20 2d 20 74 68 65 20 63 6f 6e 74  List" - the cont
3740: 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
3750: 63 6c 61 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53  clause.// in a S
3760: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
3770: 20 20 22 73 74 6c 5f 70 72 65 66 69 78 22 20 69    "stl_prefix" i
3780: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
3790: 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f  is list..//.stl_
37a0: 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 73 65  prefix(A) ::= se
37b0: 6c 74 61 62 6c 69 73 74 28 58 29 20 6a 6f 69 6e  ltablist(X) join
37c0: 6f 70 28 59 29 2e 20 20 20 20 7b 0a 20 20 20 41  op(Y).    {.   A
37d0: 20 3d 20 58 3b 0a 20 20 20 69 66 28 20 41 20 26   = X;.   if( A &
37e0: 26 20 41 2d 3e 6e 53 72 63 3e 30 20 29 20 41 2d  & A->nSrc>0 ) A-
37f0: 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e 6a 6f  >a[A->nSrc-1].jo
3800: 69 6e 74 79 70 65 20 3d 20 59 3b 0a 7d 0a 73 74  intype = Y;.}.st
3810: 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20  l_prefix(A) ::= 
3820: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3830: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3840: 20 30 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28   0;}.seltablist(
3850: 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69  A) ::= stl_prefi
3860: 78 28 58 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28  x(X) nm(Y) dbnm(
3870: 44 29 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28  D) as(Z) on_opt(
3880: 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e  N) using_opt(U).
3890: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
38a0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  SrcListAppend(X,
38b0: 26 59 2c 26 44 29 3b 0a 20 20 69 66 28 20 5a 2e  &Y,&D);.  if( Z.
38c0: 6e 20 29 20 73 71 6c 69 74 65 33 53 72 63 4c 69  n ) sqlite3SrcLi
38d0: 73 74 41 64 64 41 6c 69 61 73 28 41 2c 26 5a 29  stAddAlias(A,&Z)
38e0: 3b 0a 20 20 69 66 28 20 4e 20 29 7b 0a 20 20 20  ;.  if( N ){.   
38f0: 20 69 66 28 20 41 20 26 26 20 41 2d 3e 6e 53 72   if( A && A->nSr
3900: 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41 2d 3e 6e  c>1 ){ A->a[A->n
3910: 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d 20 4e 3b 20  Src-2].pOn = N; 
3920: 7d 0a 20 20 20 20 65 6c 73 65 20 7b 20 73 71 6c  }.    else { sql
3930: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 4e  ite3ExprDelete(N
3940: 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 55  ); }.  }.  if( U
3950: 20 29 7b 0a 20 20 20 20 69 66 28 20 41 20 26 26   ){.    if( A &&
3960: 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d   A->nSrc>1 ){ A-
3970: 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 55  >a[A->nSrc-2].pU
3980: 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20 20 20 20  sing = U; }.    
3990: 65 6c 73 65 20 7b 20 73 71 6c 69 74 65 33 49 64  else { sqlite3Id
39a0: 4c 69 73 74 44 65 6c 65 74 65 28 55 29 3b 20 7d  ListDelete(U); }
39b0: 0a 20 20 7d 0a 7d 0a 73 65 6c 74 61 62 6c 69 73  .  }.}.seltablis
39c0: 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65  t(A) ::= stl_pre
39d0: 66 69 78 28 58 29 20 4c 50 20 73 65 6c 74 61 62  fix(X) LP seltab
39e0: 6c 69 73 74 5f 70 61 72 65 6e 28 53 29 20 52 50  list_paren(S) RP
39f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a00: 20 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28     as(Z) on_opt(
3a10: 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e  N) using_opt(U).
3a20: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
3a30: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  SrcListAppend(X,
3a40: 30 2c 30 29 3b 0a 20 20 41 2d 3e 61 5b 41 2d 3e  0,0);.  A->a[A->
3a50: 6e 53 72 63 2d 31 5d 2e 70 53 65 6c 65 63 74 20  nSrc-1].pSelect 
3a60: 3d 20 53 3b 0a 20 20 69 66 28 20 5a 2e 6e 20 29  = S;.  if( Z.n )
3a70: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
3a80: 64 64 41 6c 69 61 73 28 41 2c 26 5a 29 3b 0a 20  ddAlias(A,&Z);. 
3a90: 20 69 66 28 20 4e 20 29 7b 0a 20 20 20 20 69 66   if( N ){.    if
3aa0: 28 20 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31  ( A && A->nSrc>1
3ab0: 20 29 7b 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63   ){ A->a[A->nSrc
3ac0: 2d 32 5d 2e 70 4f 6e 20 3d 20 4e 3b 20 7d 0a 20  -2].pOn = N; }. 
3ad0: 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65     else { sqlite
3ae0: 33 45 78 70 72 44 65 6c 65 74 65 28 4e 29 3b 20  3ExprDelete(N); 
3af0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 55 20 29 7b  }.  }.  if( U ){
3b00: 0a 20 20 20 20 69 66 28 20 41 20 26 26 20 41 2d  .    if( A && A-
3b10: 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b  >nSrc>1 ){ A->a[
3b20: 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 55 73 69 6e  A->nSrc-2].pUsin
3b30: 67 20 3d 20 55 3b 20 7d 0a 20 20 20 20 65 6c 73  g = U; }.    els
3b40: 65 20 7b 20 73 71 6c 69 74 65 33 49 64 4c 69 73  e { sqlite3IdLis
3b50: 74 44 65 6c 65 74 65 28 55 29 3b 20 7d 0a 20 20  tDelete(U); }.  
3b60: 7d 0a 7d 0a 0a 2f 2f 20 41 20 73 65 6c 74 61 62  }.}..// A seltab
3b70: 6c 69 73 74 5f 70 61 72 65 6e 20 6e 6f 6e 74 65  list_paren nonte
3b80: 72 6d 69 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  rminal represent
3b90: 73 20 61 6e 79 74 68 69 6e 67 20 69 6e 20 61 20  s anything in a 
3ba0: 46 52 4f 4d 20 74 68 61 74 0a 2f 2f 20 69 73 20  FROM that.// is 
3bb0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 73 69 64 65  contained inside
3bc0: 20 70 61 72 65 6e 74 68 65 73 65 73 2e 20 20 54   parentheses.  T
3bd0: 68 69 73 20 63 61 6e 20 62 65 20 65 69 74 68 65  his can be eithe
3be0: 72 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 0a  r a subquery or.
3bf0: 2f 2f 20 61 20 67 72 6f 75 70 69 6e 67 20 6f 66  // a grouping of
3c00: 20 74 61 62 6c 65 20 61 6e 64 20 73 75 62 71 75   table and subqu
3c10: 65 72 69 65 73 2e 0a 2f 2f 0a 25 74 79 70 65 20  eries..//.%type 
3c20: 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e  seltablist_paren
3c30: 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74   {Select*}.%dest
3c40: 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c 69 73  ructor seltablis
3c50: 74 5f 70 61 72 65 6e 20 7b 73 71 6c 69 74 65 33  t_paren {sqlite3
3c60: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 24 24 29  SelectDelete($$)
3c70: 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74 5f 70 61  ;}.seltablist_pa
3c80: 72 65 6e 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63  ren(A) ::= selec
3c90: 74 28 53 29 2e 20 20 20 20 20 20 7b 41 20 3d 20  t(S).      {A = 
3ca0: 53 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74 5f 70  S;}.seltablist_p
3cb0: 61 72 65 6e 28 41 29 20 3a 3a 3d 20 73 65 6c 74  aren(A) ::= selt
3cc0: 61 62 6c 69 73 74 28 46 29 2e 20 20 7b 0a 20 20  ablist(F).  {.  
3cd0: 20 41 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65   A = sqlite3Sele
3ce0: 63 74 4e 65 77 28 30 2c 46 2c 30 2c 30 2c 30 2c  ctNew(0,F,0,0,0,
3cf0: 30 2c 30 2c 2d 31 2c 30 29 3b 0a 7d 0a 0a 25 74  0,0,-1,0);.}..%t
3d00: 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65 6e 7d  ype dbnm {Token}
3d10: 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e 20 20  .dbnm(A) ::= .  
3d20: 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20          {A.z=0; 
3d30: 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41 29 20  A.n=0;}.dbnm(A) 
3d40: 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e 20 7b  ::= DOT nm(X). {
3d50: 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 66  A = X;}..%type f
3d60: 75 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69 73 74  ullname {SrcList
3d70: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 66  *}.%destructor f
3d80: 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74 65 33  ullname {sqlite3
3d90: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24 24  SrcListDelete($$
3da0: 29 3b 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20  );}.fullname(A) 
3db0: 3a 3a 3d 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59  ::= nm(X) dbnm(Y
3dc0: 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33  ).  {A = sqlite3
3dd0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  SrcListAppend(0,
3de0: 26 58 2c 26 59 29 3b 7d 0a 0a 25 74 79 70 65 20  &X,&Y);}..%type 
3df0: 6a 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79  joinop {int}.%ty
3e00: 70 65 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d  pe joinop2 {int}
3e10: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43  .joinop(X) ::= C
3e20: 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20  OMMA.           
3e30: 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54          { X = JT
3e40: 5f 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70  _INNER; }.joinop
3e50: 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 2e 20 20 20  (X) ::= JOIN.   
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e70: 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b   { X = JT_INNER;
3e80: 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d   }.joinop(X) ::=
3e90: 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f 49 4e   JOIN_KW(A) JOIN
3ea0: 2e 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20  .         { X = 
3eb0: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
3ec0: 70 50 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20  pParse,&A,0,0); 
3ed0: 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20  }.joinop(X) ::= 
3ee0: 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29  JOIN_KW(A) nm(B)
3ef0: 20 4a 4f 49 4e 2e 20 20 20 7b 20 58 20 3d 20 73   JOIN.   { X = s
3f00: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70  qlite3JoinType(p
3f10: 50 61 72 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20  Parse,&A,&B,0); 
3f20: 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20  }.joinop(X) ::= 
3f30: 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29  JOIN_KW(A) nm(B)
3f40: 20 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20   nm(C) JOIN..   
3f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65      { X = sqlite
3f80: 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65  3JoinType(pParse
3f90: 2c 26 41 2c 26 42 2c 26 43 29 3b 20 7d 0a 0a 25  ,&A,&B,&C); }..%
3fa0: 74 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70  type on_opt {Exp
3fb0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
3fc0: 6f 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  on_opt {sqlite3E
3fd0: 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  xprDelete($$);}.
3fe0: 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 4f 4e  on_opt(N) ::= ON
3ff0: 20 65 78 70 72 28 45 29 2e 20 20 20 7b 4e 20 3d   expr(E).   {N =
4000: 20 45 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a   E;}.on_opt(N) :
4010: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
4020: 20 7b 4e 20 3d 20 30 3b 7d 0a 0a 25 74 79 70 65   {N = 0;}..%type
4030: 20 75 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69   using_opt {IdLi
4040: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
4050: 20 75 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69   using_opt {sqli
4060: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
4070: 24 24 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28  $$);}.using_opt(
4080: 55 29 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20  U) ::= USING LP 
4090: 69 6e 73 63 6f 6c 6c 69 73 74 28 4c 29 20 52 50  inscollist(L) RP
40a0: 2e 20 20 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e  .  {U = L;}.usin
40b0: 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20  g_opt(U) ::= .  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 20 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a        {U = 0;}..
40e0: 0a 25 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f  .%type orderby_o
40f0: 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  pt {ExprList*}.%
4100: 64 65 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72  destructor order
4110: 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  by_opt {sqlite3E
4120: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24  xprListDelete($$
4130: 29 3b 7d 0a 25 74 79 70 65 20 73 6f 72 74 6c 69  );}.%type sortli
4140: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
4150: 64 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74 6c  destructor sortl
4160: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
4170: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
4180: 0a 25 74 79 70 65 20 73 6f 72 74 69 74 65 6d 20  .%type sortitem 
4190: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
41a0: 74 6f 72 20 73 6f 72 74 69 74 65 6d 20 7b 73 71  tor sortitem {sq
41b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
41c0: 24 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f  $$);}..orderby_o
41d0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72       {A = 0;}.or
4200: 64 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d  derby_opt(A) ::=
4210: 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69   ORDER BY sortli
4220: 73 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d  st(X).      {A =
4230: 20 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29   X;}.sortlist(A)
4240: 20 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29   ::= sortlist(X)
4250: 20 43 4f 4d 4d 41 20 73 6f 72 74 69 74 65 6d 28   COMMA sortitem(
4260: 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f  Y) collate(C) so
4270: 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20  rtorder(Z). {.  
4280: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
4290: 69 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 43 2e  istAppend(X,Y,C.
42a0: 6e 3e 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28  n>0?&C:0);.  if(
42b0: 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78   A ) A->a[A->nEx
42c0: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20  pr-1].sortOrder 
42d0: 3d 20 5a 3b 0a 7d 0a 73 6f 72 74 6c 69 73 74 28  = Z;.}.sortlist(
42e0: 41 29 20 3a 3a 3d 20 73 6f 72 74 69 74 65 6d 28  A) ::= sortitem(
42f0: 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f  Y) collate(C) so
4300: 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20  rtorder(Z). {.  
4310: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
4320: 69 73 74 41 70 70 65 6e 64 28 30 2c 59 2c 43 2e  istAppend(0,Y,C.
4330: 6e 3e 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28  n>0?&C:0);.  if(
4340: 20 41 20 26 26 20 41 2d 3e 61 20 29 20 41 2d 3e   A && A->a ) A->
4350: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  a[0].sortOrder =
4360: 20 5a 3b 0a 7d 0a 73 6f 72 74 69 74 65 6d 28 41   Z;.}.sortitem(A
4370: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20  ) ::= expr(X).  
4380: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65   {A = X;}..%type
4390: 20 73 6f 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d   sortorder {int}
43a0: 0a 25 74 79 70 65 20 63 6f 6c 6c 61 74 65 20 7b  .%type collate {
43b0: 54 6f 6b 65 6e 7d 0a 0a 73 6f 72 74 6f 72 64 65  Token}..sortorde
43c0: 72 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20  r(A) ::= ASC.   
43d0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c          {A = SQL
43e0: 49 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72  ITE_SO_ASC;}.sor
43f0: 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 44 45  torder(A) ::= DE
4400: 53 43 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20  SC.          {A 
4410: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  = SQLITE_SO_DESC
4420: 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20  ;}.sortorder(A) 
4430: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
4440: 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53     {A = SQLITE_S
4450: 4f 5f 41 53 43 3b 7d 0a 63 6f 6c 6c 61 74 65 28  O_ASC;}.collate(
4460: 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  C) ::= .        
4470: 20 20 20 20 20 20 20 20 7b 43 2e 7a 20 3d 20 30          {C.z = 0
4480: 3b 20 43 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c 6c  ; C.n = 0;}.coll
4490: 61 74 65 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41  ate(C) ::= COLLA
44a0: 54 45 20 69 64 28 58 29 2e 20 20 20 7b 43 20 3d  TE id(X).   {C =
44b0: 20 58 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75   X;}..%type grou
44c0: 70 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73  pby_opt {ExprLis
44d0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
44e0: 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c  groupby_opt {sql
44f0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4500: 74 65 28 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79  te($$);}.groupby
4510: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4530: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75     {A = 0;}.grou
4540: 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47  pby_opt(A) ::= G
4550: 52 4f 55 50 20 42 59 20 65 78 70 72 6c 69 73 74  ROUP BY exprlist
4560: 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  (X).  {A = X;}..
4570: 25 74 79 70 65 20 68 61 76 69 6e 67 5f 6f 70 74  %type having_opt
4580: 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75   {Expr*}.%destru
4590: 63 74 6f 72 20 68 61 76 69 6e 67 5f 6f 70 74 20  ctor having_opt 
45a0: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
45b0: 74 65 28 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f  te($$);}.having_
45c0: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
45d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
45e0: 20 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28   0;}.having_opt(
45f0: 41 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78  A) ::= HAVING ex
4600: 70 72 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d  pr(X).  {A = X;}
4610: 0a 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70  ..%type limit_op
4620: 74 20 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56  t {struct LimitV
4630: 61 6c 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  al}.limit_opt(A)
4640: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
4650: 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 6c 69             {A.li
4660: 6d 69 74 20 3d 20 2d 31 3b 20 41 2e 6f 66 66 73  mit = -1; A.offs
4670: 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f  et = 0;}.limit_o
4680: 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20  pt(A) ::= LIMIT 
4690: 73 69 67 6e 65 64 28 58 29 2e 20 20 20 20 20 20  signed(X).      
46a0: 7b 41 2e 6c 69 6d 69 74 20 3d 20 58 3b 20 41 2e  {A.limit = X; A.
46b0: 6f 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d  offset = 0;}.lim
46c0: 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49  it_opt(A) ::= LI
46d0: 4d 49 54 20 73 69 67 6e 65 64 28 58 29 20 4f 46  MIT signed(X) OF
46e0: 46 53 45 54 20 73 69 67 6e 65 64 28 59 29 2e 20  FSET signed(Y). 
46f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 20 20 20 20 20 7b 41 2e 6c 69 6d 69 74          {A.limit
4720: 20 3d 20 58 3b 20 41 2e 6f 66 66 73 65 74 20 3d   = X; A.offset =
4730: 20 59 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41   Y;}.limit_opt(A
4740: 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 73 69 67 6e  ) ::= LIMIT sign
4750: 65 64 28 58 29 20 43 4f 4d 4d 41 20 73 69 67 6e  ed(X) COMMA sign
4760: 65 64 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20  ed(Y). .        
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
4790: 41 2e 6c 69 6d 69 74 20 3d 20 59 3b 20 41 2e 6f  A.limit = Y; A.o
47a0: 66 66 73 65 74 20 3d 20 58 3b 7d 0a 0a 2f 2f 2f  ffset = X;}..///
47b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47c0: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 45 4c  //////// The DEL
47d0: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f  ETE statement //
47e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
4800: 6d 64 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52  md ::= DELETE FR
4810: 4f 4d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 77  OM fullname(X) w
4820: 68 65 72 65 5f 6f 70 74 28 59 29 2e 20 7b 73 71  here_opt(Y). {sq
4830: 6c 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28  lite3DeleteFrom(
4840: 70 50 61 72 73 65 2c 58 2c 59 29 3b 7d 0a 0a 25  pParse,X,Y);}..%
4850: 74 79 70 65 20 77 68 65 72 65 5f 6f 70 74 20 7b  type where_opt {
4860: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
4870: 6f 72 20 77 68 65 72 65 5f 6f 70 74 20 7b 73 71  or where_opt {sq
4880: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4890: 24 24 29 3b 7d 0a 0a 77 68 65 72 65 5f 6f 70 74  $$);}..where_opt
48a0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
48c0: 3d 20 30 3b 7d 0a 77 68 65 72 65 5f 6f 70 74 28  = 0;}.where_opt(
48d0: 41 29 20 3a 3a 3d 20 57 48 45 52 45 20 65 78 70  A) ::= WHERE exp
48e0: 72 28 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d  r(X).       {A =
48f0: 20 58 3b 7d 0a 0a 25 74 79 70 65 20 73 65 74 6c   X;}..%type setl
4900: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
4910: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 74 6c  %destructor setl
4920: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
4930: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
4940: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
4950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
4960: 20 55 50 44 41 54 45 20 63 6f 6d 6d 61 6e 64 20   UPDATE command 
4970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4990: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 55 50 44 41  .//.cmd ::= UPDA
49a0: 54 45 20 6f 72 63 6f 6e 66 28 52 29 20 66 75 6c  TE orconf(R) ful
49b0: 6c 6e 61 6d 65 28 58 29 20 53 45 54 20 73 65 74  lname(X) SET set
49c0: 6c 69 73 74 28 59 29 20 77 68 65 72 65 5f 6f 70  list(Y) where_op
49d0: 74 28 5a 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74  t(Z)..    {sqlit
49e0: 65 33 55 70 64 61 74 65 28 70 50 61 72 73 65 2c  e3Update(pParse,
49f0: 58 2c 59 2c 5a 2c 52 29 3b 7d 0a 0a 73 65 74 6c  X,Y,Z,R);}..setl
4a00: 69 73 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c 69  ist(A) ::= setli
4a10: 73 74 28 5a 29 20 43 4f 4d 4d 41 20 6e 6d 28 58  st(Z) COMMA nm(X
4a20: 29 20 45 51 20 65 78 70 72 28 59 29 2e 0a 20 20  ) EQ expr(Y)..  
4a30: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
4a40: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 5a 2c 59  prListAppend(Z,Y
4a50: 2c 26 58 29 3b 7d 0a 73 65 74 6c 69 73 74 28 41  ,&X);}.setlist(A
4a60: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51 20 65  ) ::= nm(X) EQ e
4a70: 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d 20 73  xpr(Y).   {A = s
4a80: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
4a90: 70 65 6e 64 28 30 2c 59 2c 26 58 29 3b 7d 0a 0a  pend(0,Y,&X);}..
4aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 49  ////////// The I
4ac0: 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20 2f 2f  NSERT command //
4ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
4af0: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65 72  //.cmd ::= inser
4b00: 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75  t_cmd(R) INTO fu
4b10: 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63 6f 6c  llname(X) inscol
4b20: 6c 69 73 74 5f 6f 70 74 28 46 29 20 0a 20 20 20  list_opt(F) .   
4b30: 20 20 20 20 20 56 41 4c 55 45 53 20 4c 50 20 69       VALUES LP i
4b40: 74 65 6d 6c 69 73 74 28 59 29 20 52 50 2e 0a 20  temlist(Y) RP.. 
4b50: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
4b60: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
4b70: 2c 20 58 2c 20 59 2c 20 30 2c 20 46 2c 20 52 29  , X, Y, 0, F, R)
4b80: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65 72  ;}.cmd ::= inser
4b90: 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75  t_cmd(R) INTO fu
4ba0: 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63 6f 6c  llname(X) inscol
4bb0: 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65 6c 65  list_opt(F) sele
4bc0: 63 74 28 53 29 2e 0a 20 20 20 20 20 20 20 20 20  ct(S)..         
4bd0: 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73 65 72     {sqlite3Inser
4be0: 74 28 70 50 61 72 73 65 2c 20 58 2c 20 30 2c 20  t(pParse, X, 0, 
4bf0: 53 2c 20 46 2c 20 52 29 3b 7d 0a 0a 25 74 79 70  S, F, R);}..%typ
4c00: 65 20 69 6e 73 65 72 74 5f 63 6d 64 20 7b 69 6e  e insert_cmd {in
4c10: 74 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29  t}.insert_cmd(A)
4c20: 20 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63 6f   ::= INSERT orco
4c30: 6e 66 28 52 29 2e 20 20 20 7b 41 20 3d 20 52 3b  nf(R).   {A = R;
4c40: 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 20  }.insert_cmd(A) 
4c50: 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20  ::= REPLACE.    
4c60: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f          {A = OE_
4c70: 52 65 70 6c 61 63 65 3b 7d 0a 0a 0a 25 74 79 70  Replace;}...%typ
4c80: 65 20 69 74 65 6d 6c 69 73 74 20 7b 45 78 70 72  e itemlist {Expr
4c90: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
4ca0: 6f 72 20 69 74 65 6d 6c 69 73 74 20 7b 73 71 6c  or itemlist {sql
4cb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4cc0: 74 65 28 24 24 29 3b 7d 0a 0a 69 74 65 6d 6c 69  te($$);}..itemli
4cd0: 73 74 28 41 29 20 3a 3a 3d 20 69 74 65 6d 6c 69  st(A) ::= itemli
4ce0: 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72  st(X) COMMA expr
4cf0: 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (Y).  {A = sqlit
4d00: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
4d10: 28 58 2c 59 2c 30 29 3b 7d 0a 69 74 65 6d 6c 69  (X,Y,0);}.itemli
4d20: 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  st(A) ::= expr(X
4d30: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4d40: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
4d50: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
4d60: 28 30 2c 58 2c 30 29 3b 7d 0a 0a 25 74 79 70 65  (0,X,0);}..%type
4d70: 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20   inscollist_opt 
4d80: 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  {IdList*}.%destr
4d90: 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 74  uctor inscollist
4da0: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 49 64 4c  _opt {sqlite3IdL
4db0: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
4dc0: 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74  %type inscollist
4dd0: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74   {IdList*}.%dest
4de0: 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73  ructor inscollis
4df0: 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t {sqlite3IdList
4e00: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69 6e  Delete($$);}..in
4e10: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20  scollist_opt(A) 
4e20: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
4e40: 20 30 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f   0;}.inscollist_
4e50: 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 6e  opt(A) ::= LP in
4e60: 73 63 6f 6c 6c 69 73 74 28 58 29 20 52 50 2e 20  scollist(X) RP. 
4e70: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 73 63     {A = X;}.insc
4e80: 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 6e  ollist(A) ::= in
4e90: 73 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d  scollist(X) COMM
4ea0: 41 20 6e 6d 28 59 29 2e 20 20 7b 41 20 3d 20 73  A nm(Y).  {A = s
4eb0: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
4ec0: 6e 64 28 58 2c 26 59 29 3b 7d 0a 69 6e 73 63 6f  nd(X,&Y);}.insco
4ed0: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28  llist(A) ::= nm(
4ee0: 59 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  Y).             
4ef0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
4f00: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
4f10: 64 28 30 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f 2f  d(0,&Y);}../////
4f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f30: 2f 2f 2f 2f 2f 2f 20 45 78 70 72 65 73 73 69 6f  ////// Expressio
4f40: 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 2f 2f 2f  n Processing ///
4f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25  //////////.//..%
4f70: 74 79 70 65 20 65 78 70 72 20 7b 45 78 70 72 2a  type expr {Expr*
4f80: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78  }.%destructor ex
4f90: 70 72 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44  pr {sqlite3ExprD
4fa0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70  elete($$);}.%typ
4fb0: 65 20 74 65 72 6d 20 7b 45 78 70 72 2a 7d 0a 25  e term {Expr*}.%
4fc0: 64 65 73 74 72 75 63 74 6f 72 20 74 65 72 6d 20  destructor term 
4fd0: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
4fe0: 74 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72 28 41  te($$);}..expr(A
4ff0: 29 20 3a 3a 3d 20 74 65 72 6d 28 58 29 2e 20 20  ) ::= term(X).  
5000: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
5010: 58 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  X;}.expr(A) ::= 
5020: 4c 50 28 42 29 20 65 78 70 72 28 58 29 20 52 50  LP(B) expr(X) RP
5030: 28 45 29 2e 20 7b 41 20 3d 20 58 3b 20 73 71 6c  (E). {A = X; sql
5040: 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26  ite3ExprSpan(A,&
5050: 42 2c 26 45 29 3b 20 7d 0a 74 65 72 6d 28 41 29  B,&E); }.term(A)
5060: 20 3a 3a 3d 20 4e 55 4c 4c 28 58 29 2e 20 20 20   ::= NULL(X).   
5070: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
5080: 71 6c 69 74 65 33 45 78 70 72 28 40 58 2c 20 30  qlite3Expr(@X, 0
5090: 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28  , 0, &X);}.expr(
50a0: 41 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20 20  A) ::= ID(X).   
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
50c0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
50d0: 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a  ID, 0, 0, &X);}.
50e0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e  expr(A) ::= JOIN
50f0: 5f 4b 57 28 58 29 2e 20 20 20 20 20 20 20 20 20  _KW(X).         
5100: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
5110: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  r(TK_ID, 0, 0, &
5120: 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  X);}.expr(A) ::=
5130: 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29   nm(X) DOT nm(Y)
5140: 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70  . {.  Expr *temp
5150: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  1 = sqlite3Expr(
5160: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29  TK_ID, 0, 0, &X)
5170: 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20  ;.  Expr *temp2 
5180: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
5190: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 59 29 3b 0a  _ID, 0, 0, &Y);.
51a0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
51b0: 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c  r(TK_DOT, temp1,
51c0: 20 74 65 6d 70 32 2c 20 30 29 3b 0a 7d 0a 65 78   temp2, 0);.}.ex
51d0: 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20  pr(A) ::= nm(X) 
51e0: 44 4f 54 20 6e 6d 28 59 29 20 44 4f 54 20 6e 6d  DOT nm(Y) DOT nm
51f0: 28 5a 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74  (Z). {.  Expr *t
5200: 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 45 78  emp1 = sqlite3Ex
5210: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
5220: 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d  &X);.  Expr *tem
5230: 70 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  p2 = sqlite3Expr
5240: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 59  (TK_ID, 0, 0, &Y
5250: 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 33  );.  Expr *temp3
5260: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
5270: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 5a 29 3b  K_ID, 0, 0, &Z);
5280: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 34 20 3d  .  Expr *temp4 =
5290: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
52a0: 44 4f 54 2c 20 74 65 6d 70 32 2c 20 74 65 6d 70  DOT, temp2, temp
52b0: 33 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c  3, 0);.  A = sql
52c0: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
52d0: 20 74 65 6d 70 31 2c 20 74 65 6d 70 34 2c 20 30   temp1, temp4, 0
52e0: 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d  );.}.term(A) ::=
52f0: 20 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20 20   INTEGER(X).    
5300: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
5310: 70 72 28 40 58 2c 20 30 2c 20 30 2c 20 26 58 29  pr(@X, 0, 0, &X)
5320: 3b 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 46  ;}.term(A) ::= F
5330: 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20 20  LOAT(X).        
5340: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
5350: 28 40 58 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d  (@X, 0, 0, &X);}
5360: 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 53 54 52  .term(A) ::= STR
5370: 49 4e 47 28 58 29 2e 20 20 20 20 20 20 20 7b 41  ING(X).       {A
5380: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40   = sqlite3Expr(@
5390: 58 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65  X, 0, 0, &X);}.e
53a0: 78 70 72 28 41 29 20 3a 3a 3d 20 42 4c 4f 42 28  xpr(A) ::= BLOB(
53b0: 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d  X).         {A =
53c0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 58 2c   sqlite3Expr(@X,
53d0: 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 25 69 66   0, 0, &X);}.%if
53e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
53f0: 5f 43 55 52 53 4f 52 0a 65 78 70 72 28 41 29 20  _CURSOR.expr(A) 
5400: 3a 3a 3d 20 43 55 52 52 45 4e 54 20 4f 46 20 69  ::= CURRENT OF i
5410: 64 2e 0a 25 65 6e 64 69 66 20 0a 65 78 70 72 28  d..%endif .expr(
5420: 41 29 20 3a 3a 3d 20 52 45 47 49 53 54 45 52 28  A) ::= REGISTER(
5430: 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 73 71 6c  X).     {A = sql
5440: 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70 72  ite3RegisterExpr
5450: 28 70 50 61 72 73 65 2c 20 26 58 29 3b 7d 0a 65  (pParse, &X);}.e
5460: 78 70 72 28 41 29 20 3a 3a 3d 20 56 41 52 49 41  xpr(A) ::= VARIA
5470: 42 4c 45 28 58 29 2e 20 20 20 20 20 7b 0a 20 20  BLE(X).     {.  
5480: 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20  Token *pToken = 
5490: 26 58 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70  &X;.  Expr *pExp
54a0: 72 20 3d 20 41 20 3d 20 73 71 6c 69 74 65 33 45  r = A = sqlite3E
54b0: 78 70 72 28 54 4b 5f 56 41 52 49 41 42 4c 45 2c  xpr(TK_VARIABLE,
54c0: 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a   0, 0, pToken);.
54d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73    sqlite3ExprAss
54e0: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 70 50 61  ignVarNumber(pPa
54f0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 74  rse, pExpr);.}.t
5500: 65 72 6d 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  erm(A) ::= ID(X)
5510: 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29 20   LP exprlist(Y) 
5520: 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  RP(E). {.  A = s
5530: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
5540: 6f 6e 28 59 2c 20 26 58 29 3b 0a 20 20 73 71 6c  on(Y, &X);.  sql
5550: 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26  ite3ExprSpan(A,&
5560: 58 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29  X,&E);.}.expr(A)
5570: 20 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20 53 54   ::= ID(X) LP ST
5580: 41 52 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20  AR RP(E). {.  A 
5590: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e  = sqlite3ExprFun
55a0: 63 74 69 6f 6e 28 30 2c 20 26 58 29 3b 0a 20 20  ction(0, &X);.  
55b0: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
55c0: 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 74 65 72 6d  A,&X,&E);.}.term
55d0: 28 41 29 20 3a 3a 3d 20 43 54 49 4d 45 28 4f 50  (A) ::= CTIME(OP
55e0: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
55f0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
5600: 45 78 70 72 28 40 4f 50 2c 30 2c 30 2c 30 29 3b  Expr(@OP,0,0,0);
5610: 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 43 44  }.term(A) ::= CD
5620: 41 54 45 28 4f 50 29 2e 20 20 20 20 20 20 20 20  ATE(OP).        
5630: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
5640: 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 30  qlite3Expr(@OP,0
5650: 2c 30 2c 30 29 3b 7d 0a 74 65 72 6d 28 41 29 20  ,0,0);}.term(A) 
5660: 3a 3a 3d 20 43 54 49 4d 45 53 54 41 4d 50 28 4f  ::= CTIMESTAMP(O
5670: 50 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  P).             
5680: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
5690: 28 40 4f 50 2c 30 2c 30 2c 30 29 3b 7d 0a 65 78  (@OP,0,0,0);}.ex
56a0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
56b0: 29 20 41 4e 44 28 4f 50 29 20 65 78 70 72 28 59  ) AND(OP) expr(Y
56c0: 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  ).    {A = sqlit
56d0: 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59  e3Expr(@OP, X, Y
56e0: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
56f0: 3a 3d 20 65 78 70 72 28 58 29 20 4f 52 28 4f 50  := expr(X) OR(OP
5700: 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 20 7b  ) expr(Y).     {
5710: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5720: 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  @OP, X, Y, 0);}.
5730: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
5740: 28 58 29 20 4c 54 28 4f 50 29 20 65 78 70 72 28  (X) LT(OP) expr(
5750: 59 29 2e 20 20 20 20 20 7b 41 20 3d 20 73 71 6c  Y).     {A = sql
5760: 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c  ite3Expr(@OP, X,
5770: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
5780: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 47 54 28   ::= expr(X) GT(
5790: 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 20  OP) expr(Y).    
57a0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
57b0: 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b  r(@OP, X, Y, 0);
57c0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
57d0: 70 72 28 58 29 20 4c 45 28 4f 50 29 20 65 78 70  pr(X) LE(OP) exp
57e0: 72 28 59 29 2e 20 20 20 20 20 7b 41 20 3d 20 73  r(Y).     {A = s
57f0: 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20  qlite3Expr(@OP, 
5800: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
5810: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 47  A) ::= expr(X) G
5820: 45 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  E(OP) expr(Y).  
5830: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
5840: 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30  xpr(@OP, X, Y, 0
5850: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
5860: 65 78 70 72 28 58 29 20 4e 45 28 4f 50 29 20 65  expr(X) NE(OP) e
5870: 78 70 72 28 59 29 2e 20 20 20 20 20 7b 41 20 3d  xpr(Y).     {A =
5880: 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50   sqlite3Expr(@OP
5890: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
58a0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
58b0: 20 45 51 28 4f 50 29 20 65 78 70 72 28 59 29 2e   EQ(OP) expr(Y).
58c0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
58d0: 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c  3Expr(@OP, X, Y,
58e0: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
58f0: 3d 20 65 78 70 72 28 58 29 20 42 49 54 41 4e 44  = expr(X) BITAND
5900: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 7b 41  (OP) expr(Y). {A
5910: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40   = sqlite3Expr(@
5920: 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  OP, X, Y, 0);}.e
5930: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
5940: 58 29 20 42 49 54 4f 52 28 4f 50 29 20 65 78 70  X) BITOR(OP) exp
5950: 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69  r(Y).  {A = sqli
5960: 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20  te3Expr(@OP, X, 
5970: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
5980: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c 53 48 49  ::= expr(X) LSHI
5990: 46 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20  FT(OP) expr(Y). 
59a0: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
59b0: 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  (@OP, X, Y, 0);}
59c0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
59d0: 72 28 58 29 20 52 53 48 49 46 54 28 4f 50 29 20  r(X) RSHIFT(OP) 
59e0: 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71  expr(Y). {A = sq
59f0: 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58  lite3Expr(@OP, X
5a00: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
5a10: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 50 4c  ) ::= expr(X) PL
5a20: 55 53 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20  US(OP) expr(Y). 
5a30: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
5a40: 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29  pr(@OP, X, Y, 0)
5a50: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
5a60: 78 70 72 28 58 29 20 4d 49 4e 55 53 28 4f 50 29  xpr(X) MINUS(OP)
5a70: 20 65 78 70 72 28 59 29 2e 20 20 7b 41 20 3d 20   expr(Y).  {A = 
5a80: 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c  sqlite3Expr(@OP,
5a90: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
5aa0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
5ab0: 53 54 41 52 28 4f 50 29 20 65 78 70 72 28 59 29  STAR(OP) expr(Y)
5ac0: 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33  .   {A = sqlite3
5ad0: 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20  Expr(@OP, X, Y, 
5ae0: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
5af0: 20 65 78 70 72 28 58 29 20 53 4c 41 53 48 28 4f   expr(X) SLASH(O
5b00: 50 29 20 65 78 70 72 28 59 29 2e 20 20 7b 41 20  P) expr(Y).  {A 
5b10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f  = sqlite3Expr(@O
5b20: 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78  P, X, Y, 0);}.ex
5b30: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
5b40: 29 20 52 45 4d 28 4f 50 29 20 65 78 70 72 28 59  ) REM(OP) expr(Y
5b50: 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  ).    {A = sqlit
5b60: 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59  e3Expr(@OP, X, Y
5b70: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
5b80: 3a 3d 20 65 78 70 72 28 58 29 20 43 4f 4e 43 41  := expr(X) CONCA
5b90: 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 7b  T(OP) expr(Y). {
5ba0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5bb0: 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  @OP, X, Y, 0);}.
5bc0: 25 74 79 70 65 20 6c 69 6b 65 6f 70 20 7b 73 74  %type likeop {st
5bd0: 72 75 63 74 20 4c 69 6b 65 4f 70 7d 0a 6c 69 6b  ruct LikeOp}.lik
5be0: 65 6f 70 28 41 29 20 3a 3a 3d 20 4c 49 4b 45 2e  eop(A) ::= LIKE.
5bf0: 20 20 20 20 20 7b 41 2e 6f 70 63 6f 64 65 20 3d       {A.opcode =
5c00: 20 54 4b 5f 4c 49 4b 45 3b 20 41 2e 6e 6f 74 20   TK_LIKE; A.not 
5c10: 3d 20 30 3b 7d 0a 6c 69 6b 65 6f 70 28 41 29 20  = 0;}.likeop(A) 
5c20: 3a 3a 3d 20 47 4c 4f 42 2e 20 20 20 20 20 7b 41  ::= GLOB.     {A
5c30: 2e 6f 70 63 6f 64 65 20 3d 20 54 4b 5f 47 4c 4f  .opcode = TK_GLO
5c40: 42 3b 20 41 2e 6e 6f 74 20 3d 20 30 3b 7d 0a 6c  B; A.not = 0;}.l
5c50: 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54  ikeop(A) ::= NOT
5c60: 20 4c 49 4b 45 2e 20 7b 41 2e 6f 70 63 6f 64 65   LIKE. {A.opcode
5c70: 20 3d 20 54 4b 5f 4c 49 4b 45 3b 20 41 2e 6e 6f   = TK_LIKE; A.no
5c80: 74 20 3d 20 31 3b 7d 0a 6c 69 6b 65 6f 70 28 41  t = 1;}.likeop(A
5c90: 29 20 3a 3a 3d 20 4e 4f 54 20 47 4c 4f 42 2e 20  ) ::= NOT GLOB. 
5ca0: 7b 41 2e 6f 70 63 6f 64 65 20 3d 20 54 4b 5f 47  {A.opcode = TK_G
5cb0: 4c 4f 42 3b 20 41 2e 6e 6f 74 20 3d 20 31 3b 7d  LOB; A.not = 1;}
5cc0: 0a 25 74 79 70 65 20 65 73 63 61 70 65 20 7b 45  .%type escape {E
5cd0: 78 70 72 2a 7d 0a 65 73 63 61 70 65 28 58 29 20  xpr*}.escape(X) 
5ce0: 3a 3a 3d 20 45 53 43 41 50 45 20 65 78 70 72 28  ::= ESCAPE expr(
5cf0: 41 29 2e 20 5b 45 53 43 41 50 45 5d 20 7b 58 20  A). [ESCAPE] {X 
5d00: 3d 20 41 3b 7d 0a 65 73 63 61 70 65 28 58 29 20  = A;}.escape(X) 
5d10: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
5d20: 20 20 20 20 5b 45 53 43 41 50 45 5d 20 7b 58 20      [ESCAPE] {X 
5d30: 3d 20 30 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  = 0;}.expr(A) ::
5d40: 3d 20 65 78 70 72 28 58 29 20 6c 69 6b 65 6f 70  = expr(X) likeop
5d50: 28 4f 50 29 20 65 78 70 72 28 59 29 20 65 73 63  (OP) expr(Y) esc
5d60: 61 70 65 28 45 29 2e 20 20 5b 4c 49 4b 45 5d 20  ape(E).  [LIKE] 
5d70: 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70   {.  ExprList *p
5d80: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
5d90: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
5da0: 59 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74 20 3d  Y, 0);.  pList =
5db0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5dc0: 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 58 2c  Append(pList, X,
5dd0: 20 30 29 3b 0a 20 20 69 66 28 20 45 20 29 7b 0a   0);.  if( E ){.
5de0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
5df0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
5e00: 64 28 70 4c 69 73 74 2c 20 45 2c 20 30 29 3b 0a  d(pList, E, 0);.
5e10: 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c 69 74 65    }.  A = sqlite
5e20: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 4c  3ExprFunction(pL
5e30: 69 73 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  ist, 0);.  if( A
5e40: 20 29 20 41 2d 3e 6f 70 20 3d 20 4f 50 2e 6f 70   ) A->op = OP.op
5e50: 63 6f 64 65 3b 0a 20 20 69 66 28 20 4f 50 2e 6e  code;.  if( OP.n
5e60: 6f 74 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33  ot ) A = sqlite3
5e70: 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20  Expr(TK_NOT, A, 
5e80: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
5e90: 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58 2d 3e  ExprSpan(A, &X->
5ea0: 73 70 61 6e 2c 20 26 59 2d 3e 73 70 61 6e 29 3b  span, &Y->span);
5eb0: 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  .}..expr(A) ::= 
5ec0: 65 78 70 72 28 58 29 20 49 53 4e 55 4c 4c 28 45  expr(X) ISNULL(E
5ed0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
5ee0: 65 33 45 78 70 72 28 54 4b 5f 49 53 4e 55 4c 4c  e3Expr(TK_ISNULL
5ef0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
5f00: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
5f10: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a  &X->span,&E);.}.
5f20: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
5f30: 28 58 29 20 49 53 20 4e 55 4c 4c 28 45 29 2e 20  (X) IS NULL(E). 
5f40: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
5f50: 78 70 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58  xpr(TK_ISNULL, X
5f60: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
5f70: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  e3ExprSpan(A,&X-
5f80: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70  >span,&E);.}.exp
5f90: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
5fa0: 20 4e 4f 54 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20   NOTNULL(E). {. 
5fb0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
5fc0: 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20  (TK_NOTNULL, X, 
5fd0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
5fe0: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73  ExprSpan(A,&X->s
5ff0: 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28  pan,&E);.}.expr(
6000: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e  A) ::= expr(X) N
6010: 4f 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20  OT NULL(E). {.  
6020: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
6030: 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30  TK_NOTNULL, X, 0
6040: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  , 0);.  sqlite3E
6050: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
6060: 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41  an,&E);.}.expr(A
6070: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 53  ) ::= expr(X) IS
6080: 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a   NOT NULL(E). {.
6090: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
60a0: 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c  r(TK_NOTNULL, X,
60b0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
60c0: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  3ExprSpan(A,&X->
60d0: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72  span,&E);.}.expr
60e0: 28 41 29 20 3a 3a 3d 20 4e 4f 54 28 42 29 20 65  (A) ::= NOT(B) e
60f0: 78 70 72 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20  xpr(X). {.  A = 
6100: 73 71 6c 69 74 65 33 45 78 70 72 28 40 42 2c 20  sqlite3Expr(@B, 
6110: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
6120: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42  te3ExprSpan(A,&B
6130: 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78  ,&X->span);.}.ex
6140: 70 72 28 41 29 20 3a 3a 3d 20 42 49 54 4e 4f 54  pr(A) ::= BITNOT
6150: 28 42 29 20 65 78 70 72 28 58 29 2e 20 7b 0a 20  (B) expr(X). {. 
6160: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6170: 28 40 42 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20  (@B, X, 0, 0);. 
6180: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
6190: 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b  (A,&B,&X->span);
61a0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d  .}.expr(A) ::= M
61b0: 49 4e 55 53 28 42 29 20 65 78 70 72 28 58 29 2e  INUS(B) expr(X).
61c0: 20 5b 55 4d 49 4e 55 53 5d 20 7b 0a 20 20 41 20   [UMINUS] {.  A 
61d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
61e0: 5f 55 4d 49 4e 55 53 2c 20 58 2c 20 30 2c 20 30  _UMINUS, X, 0, 0
61f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
6200: 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70  Span(A,&B,&X->sp
6210: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  an);.}.expr(A) :
6220: 3a 3d 20 50 4c 55 53 28 42 29 20 65 78 70 72 28  := PLUS(B) expr(
6230: 58 29 2e 20 5b 55 50 4c 55 53 5d 20 7b 0a 20 20  X). [UPLUS] {.  
6240: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
6250: 54 4b 5f 55 50 4c 55 53 2c 20 58 2c 20 30 2c 20  TK_UPLUS, X, 0, 
6260: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  0);.  sqlite3Exp
6270: 72 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73  rSpan(A,&B,&X->s
6280: 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  pan);.}.expr(A) 
6290: 3a 3a 3d 20 4c 50 28 42 29 20 73 65 6c 65 63 74  ::= LP(B) select
62a0: 28 58 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 41  (X) RP(E). {.  A
62b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
62c0: 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  K_SELECT, 0, 0, 
62d0: 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d  0);.  if( A ) A-
62e0: 3e 70 53 65 6c 65 63 74 20 3d 20 58 3b 0a 20 20  >pSelect = X;.  
62f0: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
6300: 41 2c 26 42 2c 26 45 29 3b 0a 7d 0a 25 74 79 70  A,&B,&E);.}.%typ
6310: 65 20 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69 6e  e between_op {in
6320: 74 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41 29  t}.between_op(A)
6330: 20 3a 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20 20   ::= BETWEEN.   
6340: 20 20 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77 65    {A = 0;}.betwe
6350: 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54  en_op(A) ::= NOT
6360: 20 42 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20 31   BETWEEN. {A = 1
6370: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
6380: 78 70 72 28 57 29 20 62 65 74 77 65 65 6e 5f 6f  xpr(W) between_o
6390: 70 28 4e 29 20 65 78 70 72 28 58 29 20 41 4e 44  p(N) expr(X) AND
63a0: 20 65 78 70 72 28 59 29 2e 20 5b 42 45 54 57 45   expr(Y). [BETWE
63b0: 45 4e 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73 74  EN] {.  ExprList
63c0: 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
63d0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
63e0: 30 2c 20 58 2c 20 30 29 3b 0a 20 20 70 4c 69 73  0, X, 0);.  pLis
63f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
6400: 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c  istAppend(pList,
6410: 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71   Y, 0);.  A = sq
6420: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 42 45 54  lite3Expr(TK_BET
6430: 57 45 45 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a  WEEN, W, 0, 0);.
6440: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69    if( A ) A->pLi
6450: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66  st = pList;.  if
6460: 28 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65  ( N ) A = sqlite
6470: 33 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c  3Expr(TK_NOT, A,
6480: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
6490: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 57 2d 3e  3ExprSpan(A,&W->
64a0: 73 70 61 6e 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a  span,&Y->span);.
64b0: 7d 0a 25 74 79 70 65 20 69 6e 5f 6f 70 20 7b 69  }.%type in_op {i
64c0: 6e 74 7d 0a 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d  nt}.in_op(A) ::=
64d0: 20 49 4e 2e 20 20 20 20 20 20 7b 41 20 3d 20 30   IN.      {A = 0
64e0: 3b 7d 0a 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20  ;}.in_op(A) ::= 
64f0: 4e 4f 54 20 49 4e 2e 20 20 7b 41 20 3d 20 31 3b  NOT IN.  {A = 1;
6500: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
6510: 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29 20 4c  pr(X) in_op(N) L
6520: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50  P exprlist(Y) RP
6530: 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20 41 20  (E). [IN] {.  A 
6540: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
6550: 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20  _IN, X, 0, 0);. 
6560: 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73   if( A ) A->pLis
6570: 74 20 3d 20 59 3b 0a 20 20 69 66 28 20 4e 20 29  t = Y;.  if( N )
6580: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6590: 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30  (TK_NOT, A, 0, 0
65a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
65b0: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
65c0: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
65d0: 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70  := expr(X) in_op
65e0: 28 4e 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29  (N) LP select(Y)
65f0: 20 52 50 28 45 29 2e 20 20 5b 49 4e 5d 20 7b 0a   RP(E).  [IN] {.
6600: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
6610: 72 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30  r(TK_IN, X, 0, 0
6620: 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e  );.  if( A ) A->
6630: 70 53 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 69  pSelect = Y;.  i
6640: 66 28 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74  f( N ) A = sqlit
6650: 65 33 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41  e3Expr(TK_NOT, A
6660: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
6670: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  e3ExprSpan(A,&X-
6680: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70  >span,&E);.}.exp
6690: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
66a0: 20 69 6e 5f 6f 70 28 4e 29 20 6e 6d 28 59 29 20   in_op(N) nm(Y) 
66b0: 64 62 6e 6d 28 5a 29 2e 20 5b 49 4e 5d 20 7b 0a  dbnm(Z). [IN] {.
66c0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
66d0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
66e0: 41 70 70 65 6e 64 28 30 2c 26 59 2c 26 5a 29 3b  Append(0,&Y,&Z);
66f0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
6700: 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20  pr(TK_IN, X, 0, 
6710: 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d  0);.  if( A ) A-
6720: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
6730: 65 33 53 65 6c 65 63 74 4e 65 77 28 30 2c 70 53  e3SelectNew(0,pS
6740: 72 63 2c 30 2c 30 2c 30 2c 30 2c 30 2c 2d 31 2c  rc,0,0,0,0,0,-1,
6750: 30 29 3b 0a 20 20 69 66 28 20 4e 20 29 20 41 20  0);.  if( N ) A 
6760: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
6770: 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a  _NOT, A, 0, 0);.
6780: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
6790: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 5a 2e 7a  n(A,&X->span,Z.z
67a0: 3f 26 5a 3a 26 59 29 3b 0a 7d 0a 0a 0a 2f 2a 20  ?&Z:&Y);.}.../* 
67b0: 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 73  CASE expressions
67c0: 20 2a 2f 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20   */.expr(A) ::= 
67d0: 43 41 53 45 28 43 29 20 63 61 73 65 5f 6f 70 65  CASE(C) case_ope
67e0: 72 61 6e 64 28 58 29 20 63 61 73 65 5f 65 78 70  rand(X) case_exp
67f0: 72 6c 69 73 74 28 59 29 20 63 61 73 65 5f 65 6c  rlist(Y) case_el
6800: 73 65 28 5a 29 20 45 4e 44 28 45 29 2e 20 7b 0a  se(Z) END(E). {.
6810: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
6820: 72 28 54 4b 5f 43 41 53 45 2c 20 58 2c 20 5a 2c  r(TK_CASE, X, Z,
6830: 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41   0);.  if( A ) A
6840: 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 73  ->pList = Y;.  s
6850: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
6860: 2c 20 26 43 2c 20 26 45 29 3b 0a 7d 0a 25 74 79  , &C, &E);.}.%ty
6870: 70 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74  pe case_exprlist
6880: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
6890: 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78  structor case_ex
68a0: 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45  prlist {sqlite3E
68b0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24  xprListDelete($$
68c0: 29 3b 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73  );}.case_exprlis
68d0: 74 28 41 29 20 3a 3a 3d 20 63 61 73 65 5f 65 78  t(A) ::= case_ex
68e0: 70 72 6c 69 73 74 28 58 29 20 57 48 45 4e 20 65  prlist(X) WHEN e
68f0: 78 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72  xpr(Y) THEN expr
6900: 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (Z). {.  A = sql
6910: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6920: 6e 64 28 58 2c 20 59 2c 20 30 29 3b 0a 20 20 41  nd(X, Y, 0);.  A
6930: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6940: 73 74 41 70 70 65 6e 64 28 41 2c 20 5a 2c 20 30  stAppend(A, Z, 0
6950: 29 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69  );.}.case_exprli
6960: 73 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65  st(A) ::= WHEN e
6970: 78 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72  xpr(Y) THEN expr
6980: 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (Z). {.  A = sql
6990: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
69a0: 6e 64 28 30 2c 20 59 2c 20 30 29 3b 0a 20 20 41  nd(0, Y, 0);.  A
69b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
69c0: 73 74 41 70 70 65 6e 64 28 41 2c 20 5a 2c 20 30  stAppend(A, Z, 0
69d0: 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73 65 5f  );.}.%type case_
69e0: 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a 63 61 73  else {Expr*}.cas
69f0: 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45  e_else(A) ::=  E
6a00: 4c 53 45 20 65 78 70 72 28 58 29 2e 20 20 20 20  LSE expr(X).    
6a10: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 63 61       {A = X;}.ca
6a20: 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20  se_else(A) ::=  
6a30: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6a40: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a        {A = 0;} .
6a50: 25 74 79 70 65 20 63 61 73 65 5f 6f 70 65 72 61  %type case_opera
6a60: 6e 64 20 7b 45 78 70 72 2a 7d 0a 63 61 73 65 5f  nd {Expr*}.case_
6a70: 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 65  operand(A) ::= e
6a80: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20 20  xpr(X).         
6a90: 20 20 20 7b 41 20 3d 20 58 3b 7d 20 0a 63 61 73     {A = X;} .cas
6aa0: 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d  e_operand(A) ::=
6ab0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6ac0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a       {A = 0;} ..
6ad0: 25 74 79 70 65 20 65 78 70 72 6c 69 73 74 20 7b  %type exprlist {
6ae0: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
6af0: 72 75 63 74 6f 72 20 65 78 70 72 6c 69 73 74 20  ructor exprlist 
6b00: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
6b10: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
6b20: 70 65 20 65 78 70 72 69 74 65 6d 20 7b 45 78 70  pe expritem {Exp
6b30: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
6b40: 65 78 70 72 69 74 65 6d 20 7b 73 71 6c 69 74 65  expritem {sqlite
6b50: 33 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b  3ExprDelete($$);
6b60: 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a  }..exprlist(A) :
6b70: 3a 3d 20 65 78 70 72 6c 69 73 74 28 58 29 20 43  := exprlist(X) C
6b80: 4f 4d 4d 41 20 65 78 70 72 69 74 65 6d 28 59 29  OMMA expritem(Y)
6b90: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  . .             
6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bb0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
6bc0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6bd0: 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b 7d 0a 65  ppend(X,Y,0);}.e
6be0: 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65  xprlist(A) ::= e
6bf0: 78 70 72 69 74 65 6d 28 58 29 2e 20 20 20 20 20  xpritem(X).     
6c00: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
6c10: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6c20: 64 28 30 2c 58 2c 30 29 3b 7d 0a 65 78 70 72 69  d(0,X,0);}.expri
6c30: 74 65 6d 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  tem(A) ::= expr(
6c40: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
6c50: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72     {A = X;}.expr
6c60: 69 74 65 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20  item(A) ::= .   
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c80: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f      {A = 0;}..//
6c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
6cb0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 6f 6d  CREATE INDEX com
6cc0: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
6cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
6ce0: 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45 28 53  cmd ::= CREATE(S
6cf0: 29 20 75 6e 69 71 75 65 66 6c 61 67 28 55 29 20  ) uniqueflag(U) 
6d00: 49 4e 44 45 58 20 6e 6d 28 58 29 20 64 62 6e 6d  INDEX nm(X) dbnm
6d10: 28 44 29 0a 20 20 20 20 20 20 20 20 4f 4e 20 66  (D).        ON f
6d20: 75 6c 6c 6e 61 6d 65 28 59 29 20 4c 50 20 69 64  ullname(Y) LP id
6d30: 78 6c 69 73 74 28 5a 29 20 52 50 28 45 29 20 6f  xlist(Z) RP(E) o
6d40: 6e 63 6f 6e 66 28 52 29 2e 20 7b 0a 20 20 69 66  nconf(R). {.  if
6d50: 28 20 55 21 3d 4f 45 5f 4e 6f 6e 65 20 29 20 55  ( U!=OE_None ) U
6d60: 20 3d 20 52 3b 0a 20 20 69 66 28 20 55 3d 3d 4f   = R;.  if( U==O
6d70: 45 5f 44 65 66 61 75 6c 74 29 20 55 20 3d 20 4f  E_Default) U = O
6d80: 45 5f 41 62 6f 72 74 3b 0a 20 20 73 71 6c 69 74  E_Abort;.  sqlit
6d90: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
6da0: 61 72 73 65 2c 20 26 58 2c 20 26 44 2c 20 59 2c  arse, &X, &D, Y,
6db0: 20 5a 2c 20 55 2c 20 26 53 2c 20 26 45 29 3b 0a   Z, U, &S, &E);.
6dc0: 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71 75 65 66  }..%type uniquef
6dd0: 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75 65  lag {int}.unique
6de0: 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49 51  flag(A) ::= UNIQ
6df0: 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f 41 62 6f  UE.  {A = OE_Abo
6e00: 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28  rt;}.uniqueflag(
6e10: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
6e20: 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 7d 0a 0a  {A = OE_None;}..
6e30: 25 74 79 70 65 20 69 64 78 6c 69 73 74 20 7b 45  %type idxlist {E
6e40: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
6e50: 75 63 74 6f 72 20 69 64 78 6c 69 73 74 20 7b 73  uctor idxlist {s
6e60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
6e70: 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65  lete($$);}.%type
6e80: 20 69 64 78 6c 69 73 74 5f 6f 70 74 20 7b 45 78   idxlist_opt {Ex
6e90: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
6ea0: 63 74 6f 72 20 69 64 78 6c 69 73 74 5f 6f 70 74  ctor idxlist_opt
6eb0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   {sqlite3ExprLis
6ec0: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
6ed0: 79 70 65 20 69 64 78 69 74 65 6d 20 7b 54 6f 6b  ype idxitem {Tok
6ee0: 65 6e 7d 0a 0a 69 64 78 6c 69 73 74 5f 6f 70 74  en}..idxlist_opt
6ef0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f10: 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 64 78 6c 69    {A = 0;}.idxli
6f20: 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50  st_opt(A) ::= LP
6f30: 20 69 64 78 6c 69 73 74 28 58 29 20 52 50 2e 20   idxlist(X) RP. 
6f40: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
6f50: 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20  .idxlist(A) ::= 
6f60: 69 64 78 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  idxlist(X) COMMA
6f70: 20 69 64 78 69 74 65 6d 28 59 29 20 63 6f 6c 6c   idxitem(Y) coll
6f80: 61 74 65 28 43 29 20 73 6f 72 74 6f 72 64 65 72  ate(C) sortorder
6f90: 2e 20 20 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  .  {.  Expr *p =
6fa0: 20 30 3b 0a 20 20 69 66 28 20 43 2e 6e 3e 30 20   0;.  if( C.n>0 
6fb0: 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
6fc0: 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55 4d 4e  e3Expr(TK_COLUMN
6fd0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
6fe0: 69 66 28 20 70 20 29 20 70 2d 3e 70 43 6f 6c 6c  if( p ) p->pColl
6ff0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
7000: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
7010: 43 2e 7a 2c 20 43 2e 6e 29 3b 0a 20 20 7d 0a 20  C.z, C.n);.  }. 
7020: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
7030: 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 20 70 2c  ListAppend(X, p,
7040: 20 26 59 29 3b 0a 7d 0a 69 64 78 6c 69 73 74 28   &Y);.}.idxlist(
7050: 41 29 20 3a 3a 3d 20 69 64 78 69 74 65 6d 28 59  A) ::= idxitem(Y
7060: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
7070: 74 6f 72 64 65 72 2e 20 7b 0a 20 20 45 78 70 72  torder. {.  Expr
7080: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 43   *p = 0;.  if( C
7090: 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 70 20 3d 20  .n>0 ){.    p = 
70a0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 43  sqlite3Expr(TK_C
70b0: 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b  OLUMN, 0, 0, 0);
70c0: 0a 20 20 20 20 69 66 28 20 70 20 29 20 70 2d 3e  .    if( p ) p->
70d0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
70e0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
70f0: 72 73 65 2c 20 43 2e 7a 2c 20 43 2e 6e 29 3b 0a  rse, C.z, C.n);.
7100: 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c 69 74 65    }.  A = sqlite
7110: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
7120: 30 2c 20 70 2c 20 26 59 29 3b 0a 7d 0a 69 64 78  0, p, &Y);.}.idx
7130: 69 74 65 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 58  item(A) ::= nm(X
7140: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
7150: 7b 41 20 3d 20 58 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f  {A = X;}.../////
7160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7170: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f  //////// The DRO
7180: 50 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20  P INDEX command 
7190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
71a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
71b0: 20 3a 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20   ::= DROP INDEX 
71c0: 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 20 20 7b  fullname(X).   {
71d0: 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
71e0: 28 70 50 61 72 73 65 2c 20 58 29 3b 7d 0a 0a 2f  (pParse, X);}../
71f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
7210: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20   VACUUM command 
7220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
7240: 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d 2e  .cmd ::= VACUUM.
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 7b 73 71 6c 69 74 65 33 56 61 63 75 75 6d 28 70  {sqlite3Vacuum(p
7270: 50 61 72 73 65 2c 30 29 3b 7d 0a 63 6d 64 20 3a  Parse,0);}.cmd :
7280: 3a 3d 20 56 41 43 55 55 4d 20 6e 6d 2e 20 20 20  := VACUUM nm.   
7290: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
72a0: 65 33 56 61 63 75 75 6d 28 70 50 61 72 73 65 2c  e3Vacuum(pParse,
72b0: 30 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  0);}..//////////
72c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
72d0: 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d 41 20 63  /// The PRAGMA c
72e0: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
72f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7300: 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20  ////.//.%ifndef 
7310: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47  SQLITE_OMIT_PRAG
7320: 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  MA.cmd ::= PRAGM
7330: 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20  A nm(X) dbnm(Z) 
7340: 45 51 20 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69  EQ nm(Y).  {sqli
7350: 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65  te3Pragma(pParse
7360: 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63  ,&X,&Z,&Y,0);}.c
7370: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
7380: 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 4f  (X) dbnm(Z) EQ O
7390: 4e 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 50  N(Y).  {sqlite3P
73a0: 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c  ragma(pParse,&X,
73b0: 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a  &Z,&Y,0);}.cmd :
73c0: 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20  := PRAGMA nm(X) 
73d0: 64 62 6e 6d 28 5a 29 20 45 51 20 70 6c 75 73 5f  dbnm(Z) EQ plus_
73e0: 6e 75 6d 28 59 29 2e 20 7b 73 71 6c 69 74 65 33  num(Y). {sqlite3
73f0: 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58  Pragma(pParse,&X
7400: 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20  ,&Z,&Y,0);}.cmd 
7410: 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29  ::= PRAGMA nm(X)
7420: 20 64 62 6e 6d 28 5a 29 20 45 51 20 6d 69 6e 75   dbnm(Z) EQ minu
7430: 73 5f 6e 75 6d 28 59 29 2e 20 7b 0a 20 20 73 71  s_num(Y). {.  sq
7440: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
7450: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 0a  se,&X,&Z,&Y,1);.
7460: 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41  }.cmd ::= PRAGMA
7470: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 4c   nm(X) dbnm(Z) L
7480: 50 20 6e 6d 28 59 29 20 52 50 2e 20 7b 73 71 6c  P nm(Y) RP. {sql
7490: 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73  ite3Pragma(pPars
74a0: 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a  e,&X,&Z,&Y,0);}.
74b0: 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e  cmd ::= PRAGMA n
74c0: 6d 28 58 29 20 64 62 6e 6d 28 5a 29 2e 20 20 20  m(X) dbnm(Z).   
74d0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
74e0: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  e3Pragma(pParse,
74f0: 26 58 2c 26 5a 2c 30 2c 30 29 3b 7d 0a 25 65 6e  &X,&Z,0,0);}.%en
7500: 64 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d  dif // SQLITE_OM
7510: 49 54 5f 50 52 41 47 4d 41 0a 70 6c 75 73 5f 6e  IT_PRAGMA.plus_n
7520: 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6f  um(A) ::= plus_o
7530: 70 74 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20  pt number(X).   
7540: 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75 73 5f 6e  {A = X;}.minus_n
7550: 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 20  um(A) ::= MINUS 
7560: 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20 7b  number(X).     {
7570: 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72 28 41  A = X;}.number(A
7580: 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 28 58 29  ) ::= INTEGER(X)
7590: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
75a0: 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72 28 41 29   = X;}.number(A)
75b0: 20 3a 3a 3d 20 46 4c 4f 41 54 28 58 29 2e 20 20   ::= FLOAT(X).  
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
75d0: 3d 20 58 3b 7d 0a 70 6c 75 73 5f 6f 70 74 20 3a  = X;}.plus_opt :
75e0: 3a 3d 20 50 4c 55 53 2e 0a 70 6c 75 73 5f 6f 70  := PLUS..plus_op
75f0: 74 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f  t ::= ...///////
7600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7610: 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45  ///// The CREATE
7620: 20 54 52 49 47 47 45 52 20 63 6f 6d 6d 61 6e 64   TRIGGER command
7630: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
7640: 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64 65 66 20  //////..%ifndef 
7650: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
7660: 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20 43 52 45  GER..cmd ::= CRE
7670: 41 54 45 20 74 72 69 67 67 65 72 5f 64 65 63 6c  ATE trigger_decl
7680: 28 41 29 20 42 45 47 49 4e 20 74 72 69 67 67 65  (A) BEGIN trigge
7690: 72 5f 63 6d 64 5f 6c 69 73 74 28 53 29 20 45 4e  r_cmd_list(S) EN
76a0: 44 28 5a 29 2e 20 7b 0a 20 20 54 6f 6b 65 6e 20  D(Z). {.  Token 
76b0: 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a 20 3d 20 41  all;.  all.z = A
76c0: 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20 3d 20 28 5a  .z;.  all.n = (Z
76d0: 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a 2e 6e 3b  .z - A.z) + Z.n;
76e0: 0a 20 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  .  sqlite3Finish
76f0: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
7700: 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a 0a 74 72 69  S, &all);.}..tri
7710: 67 67 65 72 5f 64 65 63 6c 28 41 29 20 3a 3a 3d  gger_decl(A) ::=
7720: 20 74 65 6d 70 28 54 29 20 54 52 49 47 47 45 52   temp(T) TRIGGER
7730: 20 6e 6d 28 42 29 20 64 62 6e 6d 28 5a 29 20 74   nm(B) dbnm(Z) t
7740: 72 69 67 67 65 72 5f 74 69 6d 65 28 43 29 0a 20  rigger_time(C). 
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 20 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74     trigger_event
7770: 28 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (D).            
7780: 20 20 20 20 20 20 20 20 4f 4e 20 66 75 6c 6c 6e          ON fulln
7790: 61 6d 65 28 45 29 20 66 6f 72 65 61 63 68 5f 63  ame(E) foreach_c
77a0: 6c 61 75 73 65 28 46 29 20 77 68 65 6e 5f 63 6c  lause(F) when_cl
77b0: 61 75 73 65 28 47 29 2e 20 7b 0a 20 20 73 71 6c  ause(G). {.  sql
77c0: 69 74 65 33 42 65 67 69 6e 54 72 69 67 67 65 72  ite3BeginTrigger
77d0: 28 70 50 61 72 73 65 2c 20 26 42 2c 20 26 5a 2c  (pParse, &B, &Z,
77e0: 20 43 2c 20 44 2e 61 2c 20 44 2e 62 2c 20 45 2c   C, D.a, D.b, E,
77f0: 20 46 2c 20 47 2c 20 54 29 3b 0a 20 20 41 20 3d   F, G, T);.  A =
7800: 20 28 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29 3b 0a 7d   (Z.n==0?B:Z);.}
7810: 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f  ..%type trigger_
7820: 74 69 6d 65 20 20 7b 69 6e 74 7d 0a 74 72 69 67  time  {int}.trig
7830: 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20  ger_time(A) ::= 
7840: 42 45 46 4f 52 45 2e 20 20 20 20 20 20 7b 20 41  BEFORE.      { A
7850: 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a   = TK_BEFORE; }.
7860: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20  trigger_time(A) 
7870: 3a 3a 3d 20 41 46 54 45 52 2e 20 20 20 20 20 20  ::= AFTER.      
7880: 20 7b 20 41 20 3d 20 54 4b 5f 41 46 54 45 52 3b   { A = TK_AFTER;
7890: 20 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65    }.trigger_time
78a0: 28 41 29 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20  (A) ::= INSTEAD 
78b0: 4f 46 2e 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e  OF.  { A = TK_IN
78c0: 53 54 45 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f  STEAD;}.trigger_
78d0: 74 69 6d 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20  time(A) ::= .   
78e0: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54           { A = T
78f0: 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79  K_BEFORE; }..%ty
7900: 70 65 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74  pe trigger_event
7910: 20 7b 73 74 72 75 63 74 20 54 72 69 67 45 76 65   {struct TrigEve
7920: 6e 74 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  nt}.%destructor 
7930: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73  trigger_event {s
7940: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
7950: 74 65 28 24 24 2e 62 29 3b 7d 0a 74 72 69 67 67  te($$.b);}.trigg
7960: 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20  er_event(A) ::= 
7970: 44 45 4c 45 54 45 28 4f 50 29 2e 20 20 20 20 20  DELETE(OP).     
7980: 20 20 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20           {A.a = 
7990: 40 4f 50 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74  @OP; A.b = 0;}.t
79a0: 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20  rigger_event(A) 
79b0: 3a 3a 3d 20 49 4e 53 45 52 54 28 4f 50 29 2e 20  ::= INSERT(OP). 
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e               {A.
79d0: 61 20 3d 20 40 4f 50 3b 20 41 2e 62 20 3d 20 30  a = @OP; A.b = 0
79e0: 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e 74  ;}.trigger_event
79f0: 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45 28 4f  (A) ::= UPDATE(O
7a00: 50 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  P).             
7a10: 20 7b 41 2e 61 20 3d 20 40 4f 50 3b 20 41 2e 62   {A.a = @OP; A.b
7a20: 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65   = 0;}.trigger_e
7a30: 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41  vent(A) ::= UPDA
7a40: 54 45 20 4f 46 20 69 6e 73 63 6f 6c 6c 69 73 74  TE OF inscollist
7a50: 28 58 29 2e 20 7b 41 2e 61 20 3d 20 54 4b 5f 55  (X). {A.a = TK_U
7a60: 50 44 41 54 45 3b 20 41 2e 62 20 3d 20 58 3b 7d  PDATE; A.b = X;}
7a70: 0a 0a 25 74 79 70 65 20 66 6f 72 65 61 63 68 5f  ..%type foreach_
7a80: 63 6c 61 75 73 65 20 7b 69 6e 74 7d 0a 66 6f 72  clause {int}.for
7a90: 65 61 63 68 5f 63 6c 61 75 73 65 28 41 29 20 3a  each_clause(A) :
7aa0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
7ab0: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f         { A = TK_
7ac0: 52 4f 57 3b 20 7d 0a 66 6f 72 65 61 63 68 5f 63  ROW; }.foreach_c
7ad0: 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 46 4f 52  lause(A) ::= FOR
7ae0: 20 45 41 43 48 20 52 4f 57 2e 20 20 20 20 20 20   EACH ROW.      
7af0: 20 7b 20 41 20 3d 20 54 4b 5f 52 4f 57 3b 20 7d   { A = TK_ROW; }
7b00: 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28  .foreach_clause(
7b10: 41 29 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20  A) ::= FOR EACH 
7b20: 53 54 41 54 45 4d 45 4e 54 2e 20 7b 20 41 20 3d  STATEMENT. { A =
7b30: 20 54 4b 5f 53 54 41 54 45 4d 45 4e 54 3b 20 7d   TK_STATEMENT; }
7b40: 0a 0a 25 74 79 70 65 20 77 68 65 6e 5f 63 6c 61  ..%type when_cla
7b50: 75 73 65 20 7b 45 78 70 72 2a 7d 0a 77 68 65 6e  use {Expr*}.when
7b60: 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e  _clause(A) ::= .
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
7b80: 20 3d 20 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61   = 0; }.when_cla
7b90: 75 73 65 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20  use(A) ::= WHEN 
7ba0: 65 78 70 72 28 58 29 2e 20 7b 20 41 20 3d 20 58  expr(X). { A = X
7bb0: 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  ; }..%type trigg
7bc0: 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 54 72 69  er_cmd_list {Tri
7bd0: 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65 73 74  ggerStep*}.%dest
7be0: 72 75 63 74 6f 72 20 74 72 69 67 67 65 72 5f 63  ructor trigger_c
7bf0: 6d 64 5f 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  md_list {sqlite3
7c00: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
7c10: 70 28 24 24 29 3b 7d 0a 74 72 69 67 67 65 72 5f  p($$);}.trigger_
7c20: 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20  cmd_list(A) ::= 
7c30: 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29 20 53  trigger_cmd(X) S
7c40: 45 4d 49 20 74 72 69 67 67 65 72 5f 63 6d 64 5f  EMI trigger_cmd_
7c50: 6c 69 73 74 28 59 29 2e 20 7b 0a 20 20 58 2d 3e  list(Y). {.  X->
7c60: 70 4e 65 78 74 20 3d 20 59 3b 0a 20 20 41 20 3d  pNext = Y;.  A =
7c70: 20 58 3b 0a 7d 0a 74 72 69 67 67 65 72 5f 63 6d   X;.}.trigger_cm
7c80: 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e 20  d_list(A) ::= . 
7c90: 7b 20 41 20 3d 20 30 3b 20 7d 0a 0a 25 74 79 70  { A = 0; }..%typ
7ca0: 65 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 54  e trigger_cmd {T
7cb0: 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65  riggerStep*}.%de
7cc0: 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72  structor trigger
7cd0: 5f 63 6d 64 20 7b 73 71 6c 69 74 65 33 44 65 6c  _cmd {sqlite3Del
7ce0: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 24  eteTriggerStep($
7cf0: 24 29 3b 7d 0a 2f 2f 20 55 50 44 41 54 45 20 0a  $);}.// UPDATE .
7d00: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a  trigger_cmd(A) :
7d10: 3a 3d 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66  := UPDATE orconf
7d20: 28 52 29 20 6e 6d 28 58 29 20 53 45 54 20 73 65  (R) nm(X) SET se
7d30: 74 6c 69 73 74 28 59 29 20 77 68 65 72 65 5f 6f  tlist(Y) where_o
7d40: 70 74 28 5a 29 2e 20 20 0a 20 20 20 20 20 20 20  pt(Z).  .       
7d50: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 73 71          { A = sq
7d60: 6c 69 74 65 33 54 72 69 67 67 65 72 55 70 64 61  lite3TriggerUpda
7d70: 74 65 53 74 65 70 28 26 58 2c 20 59 2c 20 5a 2c  teStep(&X, Y, Z,
7d80: 20 52 29 3b 20 7d 0a 0a 2f 2f 20 49 4e 53 45 52   R); }..// INSER
7d90: 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  T.trigger_cmd(A)
7da0: 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28   ::= insert_cmd(
7db0: 52 29 20 49 4e 54 4f 20 6e 6d 28 58 29 20 69 6e  R) INTO nm(X) in
7dc0: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20  scollist_opt(F) 
7dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7de0: 20 20 20 20 56 41 4c 55 45 53 20 4c 50 20 69 74      VALUES LP it
7df0: 65 6d 6c 69 73 74 28 59 29 20 52 50 2e 20 20 0a  emlist(Y) RP.  .
7e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
7e10: 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  A = sqlite3Trigg
7e20: 65 72 49 6e 73 65 72 74 53 74 65 70 28 26 58 2c  erInsertStep(&X,
7e30: 20 46 2c 20 59 2c 20 30 2c 20 52 29 3b 7d 0a 0a   F, Y, 0, R);}..
7e40: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a  trigger_cmd(A) :
7e50: 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29  := insert_cmd(R)
7e60: 20 49 4e 54 4f 20 6e 6d 28 58 29 20 69 6e 73 63   INTO nm(X) insc
7e70: 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65  ollist_opt(F) se
7e80: 6c 65 63 74 28 53 29 2e 0a 20 20 20 20 20 20 20  lect(S)..       
7e90: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
7ea0: 69 74 65 33 54 72 69 67 67 65 72 49 6e 73 65 72  ite3TriggerInser
7eb0: 74 53 74 65 70 28 26 58 2c 20 46 2c 20 30 2c 20  tStep(&X, F, 0, 
7ec0: 53 2c 20 52 29 3b 7d 0a 0a 2f 2f 20 44 45 4c 45  S, R);}..// DELE
7ed0: 54 45 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  TE.trigger_cmd(A
7ee0: 29 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f  ) ::= DELETE FRO
7ef0: 4d 20 6e 6d 28 58 29 20 77 68 65 72 65 5f 6f 70  M nm(X) where_op
7f00: 74 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20  t(Y)..          
7f10: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
7f20: 33 54 72 69 67 67 65 72 44 65 6c 65 74 65 53 74  3TriggerDeleteSt
7f30: 65 70 28 26 58 2c 20 59 29 3b 7d 0a 0a 2f 2f 20  ep(&X, Y);}..// 
7f40: 53 45 4c 45 43 54 0a 74 72 69 67 67 65 72 5f 63  SELECT.trigger_c
7f50: 6d 64 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74  md(A) ::= select
7f60: 28 58 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (X).  {A = sqlit
7f70: 65 33 54 72 69 67 67 65 72 53 65 6c 65 63 74 53  e3TriggerSelectS
7f80: 74 65 70 28 58 29 3b 20 7d 0a 0a 2f 2f 20 54 68  tep(X); }..// Th
7f90: 65 20 73 70 65 63 69 61 6c 20 52 41 49 53 45 20  e special RAISE 
7fa0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
7fb0: 6d 61 79 20 6f 63 63 75 72 20 69 6e 20 74 72 69  may occur in tri
7fc0: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 0a 65 78  gger programs.ex
7fd0: 70 72 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 28  pr(A) ::= RAISE(
7fe0: 58 29 20 4c 50 20 49 47 4e 4f 52 45 20 52 50 28  X) LP IGNORE RP(
7ff0: 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c  Y).  {.  A = sql
8000: 69 74 65 33 45 78 70 72 28 54 4b 5f 52 41 49 53  ite3Expr(TK_RAIS
8010: 45 2c 20 30 2c 20 30 2c 20 30 29 3b 20 0a 20 20  E, 0, 0, 0); .  
8020: 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 4f 45 5f  A->iColumn = OE_
8030: 49 67 6e 6f 72 65 3b 0a 20 20 73 71 6c 69 74 65  Ignore;.  sqlite
8040: 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58 2c  3ExprSpan(A, &X,
8050: 20 26 59 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20   &Y);.}.expr(A) 
8060: 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20  ::= RAISE(X) LP 
8070: 72 61 69 73 65 74 79 70 65 28 54 29 20 43 4f 4d  raisetype(T) COM
8080: 4d 41 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20  MA nm(Z) RP(Y). 
8090: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
80a0: 45 78 70 72 28 54 4b 5f 52 41 49 53 45 2c 20 30  Expr(TK_RAISE, 0
80b0: 2c 20 30 2c 20 26 5a 29 3b 20 0a 20 20 41 2d 3e  , 0, &Z); .  A->
80c0: 69 43 6f 6c 75 6d 6e 20 3d 20 54 3b 0a 20 20 73  iColumn = T;.  s
80d0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
80e0: 2c 20 26 58 2c 20 26 59 29 3b 0a 7d 0a 25 65 6e  , &X, &Y);.}.%en
80f0: 64 69 66 20 2f 2f 20 21 53 51 4c 49 54 45 5f 4f  dif // !SQLITE_O
8100: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 25 74 79  MIT_TRIGGER..%ty
8110: 70 65 20 72 61 69 73 65 74 79 70 65 20 7b 69 6e  pe raisetype {in
8120: 74 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20  t}.raisetype(A) 
8130: 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b  ::= ROLLBACK.  {
8140: 41 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b  A = OE_Rollback;
8150: 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a  }.raisetype(A) :
8160: 3a 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 7b 41  := ABORT.     {A
8170: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61   = OE_Abort;}.ra
8180: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46  isetype(A) ::= F
8190: 41 49 4c 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f  AIL.      {A = O
81a0: 45 5f 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f  E_Fail;}.../////
81b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81c0: 2f 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45  ///  DROP TRIGGE
81d0: 52 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  R statement ////
81e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
8200: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
8210: 52 49 47 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44  RIGGER.cmd ::= D
8220: 52 4f 50 20 54 52 49 47 47 45 52 20 66 75 6c 6c  ROP TRIGGER full
8230: 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c  name(X). {.  sql
8240: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28  ite3DropTrigger(
8250: 70 50 61 72 73 65 2c 58 29 3b 0a 7d 0a 25 65 6e  pParse,X);.}.%en
8260: 64 69 66 20 2f 2f 20 21 53 51 4c 49 54 45 5f 4f  dif // !SQLITE_O
8270: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2f 2f  MIT_TRIGGER..///
8280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8290: 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 20 44 41 54  ///// ATTACH DAT
82a0: 41 42 41 53 45 20 66 69 6c 65 20 41 53 20 6e 61  ABASE file AS na
82b0: 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  me /////////////
82c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64  ////////////.cmd
82d0: 20 3a 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61   ::= ATTACH data
82e0: 62 61 73 65 5f 6b 77 5f 6f 70 74 20 69 64 73 28  base_kw_opt ids(
82f0: 46 29 20 41 53 20 6e 6d 28 44 29 20 6b 65 79 5f  F) AS nm(D) key_
8300: 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71 6c 69  opt(K). {.  sqli
8310: 74 65 33 41 74 74 61 63 68 28 70 50 61 72 73 65  te3Attach(pParse
8320: 2c 20 26 46 2c 20 26 44 2c 20 4b 2e 74 79 70 65  , &F, &D, K.type
8330: 2c 20 26 4b 2e 6b 65 79 29 3b 0a 7d 0a 25 74 79  , &K.key);.}.%ty
8340: 70 65 20 6b 65 79 5f 6f 70 74 20 7b 73 74 72 75  pe key_opt {stru
8350: 63 74 20 41 74 74 61 63 68 4b 65 79 7d 0a 6b 65  ct AttachKey}.ke
8360: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  y_opt(A) ::= .  
8370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8380: 20 20 20 7b 20 41 2e 74 79 70 65 20 3d 20 30 3b     { A.type = 0;
8390: 20 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20 3a 3a   }.key_opt(A) ::
83a0: 3d 20 4b 45 59 20 69 64 73 28 58 29 2e 20 20 20  = KEY ids(X).   
83b0: 20 20 20 20 20 20 20 20 7b 20 41 2e 74 79 70 65          { A.type
83c0: 3d 31 3b 20 41 2e 6b 65 79 20 3d 20 58 3b 20 7d  =1; A.key = X; }
83d0: 0a 6b 65 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  .key_opt(A) ::= 
83e0: 4b 45 59 20 42 4c 4f 42 28 58 29 2e 20 20 20 20  KEY BLOB(X).    
83f0: 20 20 20 20 20 20 7b 20 41 2e 74 79 70 65 3d 32        { A.type=2
8400: 3b 20 41 2e 6b 65 79 20 3d 20 58 3b 20 7d 0a 0a  ; A.key = X; }..
8410: 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20  database_kw_opt 
8420: 3a 3a 3d 20 44 41 54 41 42 41 53 45 2e 0a 64 61  ::= DATABASE..da
8430: 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a  tabase_kw_opt ::
8440: 3d 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  = ...///////////
8450: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 44 45  ///////////// DE
8460: 54 41 43 48 20 44 41 54 41 42 41 53 45 20 6e 61  TACH DATABASE na
8470: 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  me /////////////
8480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8490: 2f 2f 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 45 54  ////.cmd ::= DET
84a0: 41 43 48 20 64 61 74 61 62 61 73 65 5f 6b 77 5f  ACH database_kw_
84b0: 6f 70 74 20 6e 6d 28 44 29 2e 20 7b 0a 20 20 73  opt nm(D). {.  s
84c0: 71 6c 69 74 65 33 44 65 74 61 63 68 28 70 50 61  qlite3Detach(pPa
84d0: 72 73 65 2c 20 26 44 29 3b 0a 7d 0a 0a 2f 2f 2f  rse, &D);.}..///
84e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
84f0: 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44 45 58 20  /////// REINDEX 
8500: 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f  collation //////
8510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66  ////////////.%if
8530: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8540: 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d  _REINDEX.cmd ::=
8550: 20 52 45 49 4e 44 45 58 2e 20 20 20 20 20 20 20   REINDEX.       
8560: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
8570: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
8580: 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d   0, 0);}.cmd ::=
8590: 20 52 45 49 4e 44 45 58 20 6e 6d 28 58 29 20 64   REINDEX nm(X) d
85a0: 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65  bnm(Y).  {sqlite
85b0: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
85c0: 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69   &X, &Y);}.%endi
85d0: 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  f../////////////
85e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4c 54 45  /////////// ALTE
85f0: 52 20 54 41 42 4c 45 20 74 61 62 6c 65 20 2e 2e  R TABLE table ..
8600: 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  . //////////////
8610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8620: 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  //.%ifndef SQLIT
8630: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
8640: 45 0a 63 6d 64 20 3a 3a 3d 20 41 4c 54 45 52 20  E.cmd ::= ALTER 
8650: 54 41 42 4c 45 20 66 75 6c 6c 6e 61 6d 65 28 58  TABLE fullname(X
8660: 29 20 52 45 4e 41 4d 45 20 54 4f 20 6e 6d 28 5a  ) RENAME TO nm(Z
8670: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c  ). {.  sqlite3Al
8680: 74 65 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 70  terRenameTable(p
8690: 50 61 72 73 65 2c 58 2c 26 5a 29 3b 0a 7d 0a 25  Parse,X,&Z);.}.%
86a0: 65 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  endif../////////
86b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
86c0: 2f 2f 2f 2f 2f 20 43 55 52 53 4f 52 53 20 2f 2f  ///// CURSORS //
86d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
86e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
86f0: 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c  ////.%ifndef SQL
8700: 49 54 45 5f 4f 4d 49 54 5f 43 55 52 53 4f 52 0a  ITE_OMIT_CURSOR.
8710: 63 6d 64 20 3a 3a 3d 20 44 45 43 4c 41 52 45 20  cmd ::= DECLARE 
8720: 6e 6d 28 58 29 20 43 55 52 53 4f 52 20 46 4f 52  nm(X) CURSOR FOR
8730: 20 73 65 6c 65 63 74 28 59 29 2e 20 20 7b 73 71   select(Y).  {sq
8740: 6c 69 74 65 33 43 75 72 73 6f 72 43 72 65 61 74  lite3CursorCreat
8750: 65 28 70 50 61 72 73 65 2c 26 58 2c 59 29 3b 7d  e(pParse,&X,Y);}
8760: 0a 63 6d 64 20 3a 3a 3d 20 43 4c 4f 53 45 20 6e  .cmd ::= CLOSE n
8770: 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  m(X).           
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
8790: 71 6c 69 74 65 33 43 75 72 73 6f 72 43 6c 6f 73  qlite3CursorClos
87a0: 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 0a  e(pParse,&X);}..
87b0: 63 6d 64 20 3a 3a 3d 20 46 45 54 43 48 20 64 69  cmd ::= FETCH di
87c0: 72 65 63 74 69 6f 6e 20 46 52 4f 4d 20 6e 6d 28  rection FROM nm(
87d0: 4e 29 20 69 6e 74 6f 5f 6f 70 74 28 44 29 2e 0a  N) into_opt(D)..
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8800: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 46 65        {sqlite3Fe
8810: 74 63 68 28 70 50 61 72 73 65 2c 26 4e 2c 44 29  tch(pParse,&N,D)
8820: 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 74 6f 5f 6f  ;}..%type into_o
8830: 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65  pt {IdList*}.%de
8840: 73 74 72 75 63 74 6f 72 20 69 6e 74 6f 5f 6f 70  structor into_op
8850: 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t {sqlite3IdList
8860: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 69 6e 74  Delete($$);}.int
8870: 6f 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  o_opt(A) ::= .  
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 74 6f     {A = 0;}.into
88a0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e 54 4f  _opt(A) ::= INTO
88b0: 20 69 6e 73 63 6f 6c 6c 69 73 74 28 58 29 2e 20   inscollist(X). 
88c0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 64 69 72 65 63    {A = X;}.direc
88d0: 74 69 6f 6e 20 3a 3a 3d 20 4e 45 58 54 28 58 29  tion ::= NEXT(X)
88e0: 20 63 6f 75 6e 74 5f 6f 70 74 28 59 29 2e 20 20   count_opt(Y).  
88f0: 20 7b 70 50 61 72 73 65 2d 3e 66 65 74 63 68 44   {pParse->fetchD
8900: 69 72 3d 40 58 3b 20 70 50 61 72 73 65 2d 3e 64  ir=@X; pParse->d
8910: 69 72 41 72 67 31 3d 59 3b 7d 0a 64 69 72 65 63  irArg1=Y;}.direc
8920: 74 69 6f 6e 20 3a 3a 3d 20 50 52 49 4f 52 28 58  tion ::= PRIOR(X
8930: 29 20 63 6f 75 6e 74 5f 6f 70 74 28 59 29 2e 20  ) count_opt(Y). 
8940: 20 7b 70 50 61 72 73 65 2d 3e 66 65 74 63 68 44   {pParse->fetchD
8950: 69 72 3d 40 58 3b 20 70 50 61 72 73 65 2d 3e 64  ir=@X; pParse->d
8960: 69 72 41 72 67 31 3d 59 3b 7d 0a 64 69 72 65 63  irArg1=Y;}.direc
8970: 74 69 6f 6e 20 3a 3a 3d 20 46 49 52 53 54 28 58  tion ::= FIRST(X
8980: 29 20 63 6f 75 6e 74 5f 6f 70 74 28 59 29 2e 20  ) count_opt(Y). 
8990: 20 7b 70 50 61 72 73 65 2d 3e 66 65 74 63 68 44   {pParse->fetchD
89a0: 69 72 3d 40 58 3b 20 70 50 61 72 73 65 2d 3e 64  ir=@X; pParse->d
89b0: 69 72 41 72 67 31 3d 59 3b 7d 0a 64 69 72 65 63  irArg1=Y;}.direc
89c0: 74 69 6f 6e 20 3a 3a 3d 20 4c 41 53 54 28 58 29  tion ::= LAST(X)
89d0: 20 63 6f 75 6e 74 5f 6f 70 74 28 59 29 2e 20 20   count_opt(Y).  
89e0: 20 7b 70 50 61 72 73 65 2d 3e 66 65 74 63 68 44   {pParse->fetchD
89f0: 69 72 3d 40 58 3b 20 70 50 61 72 73 65 2d 3e 64  ir=@X; pParse->d
8a00: 69 72 41 72 67 31 3d 59 3b 7d 0a 64 69 72 65 63  irArg1=Y;}.direc
8a10: 74 69 6f 6e 20 3a 3a 3d 20 41 42 53 4f 4c 55 54  tion ::= ABSOLUT
8a20: 45 28 58 29 20 73 69 67 6e 65 64 28 5a 29 20 63  E(X) signed(Z) c
8a30: 6f 6d 6d 61 5f 63 6f 75 6e 74 5f 6f 70 74 28 59  omma_count_opt(Y
8a40: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8a50: 20 20 20 20 20 20 7b 70 50 61 72 73 65 2d 3e 66        {pParse->f
8a60: 65 74 63 68 44 69 72 3d 40 58 3b 20 70 50 61 72  etchDir=@X; pPar
8a70: 73 65 2d 3e 64 69 72 41 72 67 31 3d 59 3b 20 70  se->dirArg1=Y; p
8a80: 50 61 72 73 65 2d 3e 64 69 72 41 72 67 32 3d 5a  Parse->dirArg2=Z
8a90: 3b 7d 0a 64 69 72 65 63 74 69 6f 6e 20 3a 3a 3d  ;}.direction ::=
8aa0: 20 52 45 4c 41 54 49 56 45 28 58 29 20 73 69 67   RELATIVE(X) sig
8ab0: 6e 65 64 28 5a 29 20 63 6f 6d 6d 61 5f 63 6f 75  ned(Z) comma_cou
8ac0: 6e 74 5f 6f 70 74 28 59 29 2e 0a 20 20 20 20 20  nt_opt(Y)..     
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 70                {p
8ae0: 50 61 72 73 65 2d 3e 66 65 74 63 68 44 69 72 3d  Parse->fetchDir=
8af0: 40 58 3b 20 70 50 61 72 73 65 2d 3e 64 69 72 41  @X; pParse->dirA
8b00: 72 67 31 3d 59 3b 20 70 50 61 72 73 65 2d 3e 64  rg1=Y; pParse->d
8b10: 69 72 41 72 67 32 3d 5a 3b 7d 0a 0a 25 74 79 70  irArg2=Z;}..%typ
8b20: 65 20 63 6f 75 6e 74 5f 6f 70 74 20 7b 69 6e 74  e count_opt {int
8b30: 7d 0a 63 6f 75 6e 74 5f 6f 70 74 28 41 29 20 3a  }.count_opt(A) :
8b40: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 7b 41  := .          {A
8b50: 20 3d 20 31 3b 7d 0a 63 6f 75 6e 74 5f 6f 70 74   = 1;}.count_opt
8b60: 28 41 29 20 3a 3a 3d 20 73 69 67 6e 65 64 28 58  (A) ::= signed(X
8b70: 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 25 74 79 70  ). {A = X;}.%typ
8b80: 65 20 63 6f 6d 6d 61 5f 63 6f 75 6e 74 5f 6f 70  e comma_count_op
8b90: 74 20 7b 69 6e 74 7d 0a 63 6f 6d 6d 61 5f 63 6f  t {int}.comma_co
8ba0: 75 6e 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  unt_opt(A) ::= .
8bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bc0: 20 7b 41 20 3d 20 31 3b 7d 0a 63 6f 6d 6d 61 5f   {A = 1;}.comma_
8bd0: 63 6f 75 6e 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  count_opt(A) ::=
8be0: 20 43 4f 4d 4d 41 20 73 69 67 6e 65 64 28 58 29   COMMA signed(X)
8bf0: 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 65 6e 64  .  {A = X;}.%end
8c00: 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d 49  if // SQLITE_OMI
8c10: 54 5f 43 55 52 53 4f 52 0a                       T_CURSOR.