/ Hex Artifact Content
Login

Artifact 52b8cdcceeaef01283138de5541dcadd2eeff486:


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 39 36 20 32 30 30 36 2f 30 32 2f 32 34 20  .196 2006/02/24 
0290: 30 32 3a 35 33 3a 35 30 20 64 72 68 20 45 78 70  02:53:50 drh Exp
02a0: 20 24 0a 2a 2f 0a 0a 2f 2f 20 41 6c 6c 20 74 6f   $.*/..// All to
02b0: 6b 65 6e 20 63 6f 64 65 73 20 61 72 65 20 73 6d  ken codes are sm
02c0: 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 77 69 74  all integers wit
02d0: 68 20 23 64 65 66 69 6e 65 73 20 74 68 61 74 20  h #defines that 
02e0: 62 65 67 69 6e 20 77 69 74 68 20 22 54 4b 5f 22  begin with "TK_"
02f0: 0a 25 74 6f 6b 65 6e 5f 70 72 65 66 69 78 20 54  .%token_prefix T
0300: 4b 5f 0a 0a 2f 2f 20 54 68 65 20 74 79 70 65 20  K_..// The type 
0310: 6f 66 20 74 68 65 20 64 61 74 61 20 61 74 74 61  of the data atta
0320: 63 68 65 64 20 74 6f 20 65 61 63 68 20 74 6f 6b  ched to each tok
0330: 65 6e 20 69 73 20 54 6f 6b 65 6e 2e 20 20 54 68  en is Token.  Th
0340: 69 73 20 69 73 20 61 6c 73 6f 20 74 68 65 0a 2f  is is also the./
0350: 2f 20 64 65 66 61 75 6c 74 20 74 79 70 65 20 66  / default type f
0360: 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  or non-terminals
0370: 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 74 79 70 65  ..//.%token_type
0380: 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66 61 75 6c   {Token}.%defaul
0390: 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e 7d 0a 0a  t_type {Token}..
03a0: 2f 2f 20 54 68 65 20 67 65 6e 65 72 61 74 65 64  // The generated
03b0: 20 70 61 72 73 65 72 20 66 75 6e 63 74 69 6f 6e   parser function
03c0: 20 74 61 6b 65 73 20 61 20 34 74 68 20 61 72 67   takes a 4th arg
03d0: 75 6d 65 6e 74 20 61 73 20 66 6f 6c 6c 6f 77 73  ument as follows
03e0: 3a 0a 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  :.%extra_argumen
03f0: 74 20 7b 50 61 72 73 65 20 2a 70 50 61 72 73 65  t {Parse *pParse
0400: 7d 0a 0a 2f 2f 20 54 68 69 73 20 63 6f 64 65 20  }..// This code 
0410: 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
0420: 65 72 65 20 69 73 20 61 20 73 79 6e 74 61 78 20  ere is a syntax 
0430: 65 72 72 6f 72 0a 2f 2f 0a 25 73 79 6e 74 61 78  error.//.%syntax
0440: 5f 65 72 72 6f 72 20 7b 0a 20 20 69 66 28 20 70  _error {.  if( p
0450: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 3d 3d  Parse->zErrMsg==
0460: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 54 4f 4b  0 ){.    if( TOK
0470: 45 4e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  EN.z[0] ){.     
0480: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
0490: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
04a0: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
04b0: 72 6f 72 22 2c 20 26 54 4f 4b 45 4e 29 3b 0a 20  ror", &TOKEN);. 
04c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
04d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
04e0: 70 50 61 72 73 65 2c 20 22 69 6e 63 6f 6d 70 6c  pParse, "incompl
04f0: 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
0500: 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  t");.    }.  }.}
0510: 0a 0a 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66  ..// The name of
0520: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70   the generated p
0530: 72 6f 63 65 64 75 72 65 20 74 68 61 74 20 69 6d  rocedure that im
0540: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 70 61 72  plements the par
0550: 73 65 72 0a 2f 2f 20 69 73 20 61 73 20 66 6f 6c  ser.// is as fol
0560: 6c 6f 77 73 3a 0a 25 6e 61 6d 65 20 73 71 6c 69  lows:.%name sqli
0570: 74 65 33 50 61 72 73 65 72 0a 0a 2f 2f 20 54 68  te3Parser..// Th
0580: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74  e following text
0590: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 6e 65 61   is included nea
05a0: 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  r the beginning 
05b0: 6f 66 20 74 68 65 20 43 20 73 6f 75 72 63 65 0a  of the C source.
05c0: 2f 2f 20 63 6f 64 65 20 66 69 6c 65 20 74 68 61  // code file tha
05d0: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
05e0: 20 70 61 72 73 65 72 2e 0a 2f 2f 0a 25 69 6e 63   parser..//.%inc
05f0: 6c 75 64 65 20 7b 0a 23 69 6e 63 6c 75 64 65 20  lude {.#include 
0600: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69  "sqliteInt.h".#i
0610: 6e 63 6c 75 64 65 20 22 70 61 72 73 65 2e 68 22  nclude "parse.h"
0620: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0630: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
0640: 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f  cture holds info
0650: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
0660: 65 0a 2a 2a 20 4c 49 4d 49 54 20 63 6c 61 75 73  e.** LIMIT claus
0670: 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74  e of a SELECT st
0680: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75  atement..*/.stru
0690: 63 74 20 4c 69 6d 69 74 56 61 6c 20 7b 0a 20 20  ct LimitVal {.  
06a0: 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20  Expr *pLimit;   
06b0: 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 65 78   /* The LIMIT ex
06c0: 70 72 65 73 73 69 6f 6e 2e 20 20 4e 55 4c 4c 20  pression.  NULL 
06d0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c  if there is no l
06e0: 69 6d 69 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  imit */.  Expr *
06f0: 70 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 54 68  pOffset;   /* Th
0700: 65 20 4f 46 46 53 45 54 20 65 78 70 72 65 73 73  e OFFSET express
0710: 69 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66 20 74 68  ion.  NULL if th
0720: 65 72 65 20 69 73 20 6e 6f 6e 65 20 2a 2f 0a 7d  ere is none */.}
0730: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
0740: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0750: 75 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74  ucture is used t
0760: 6f 20 73 74 6f 72 65 20 74 68 65 20 4c 49 4b 45  o store the LIKE
0770: 2c 0a 2a 2a 20 47 4c 4f 42 2c 20 4e 4f 54 20 4c  ,.** GLOB, NOT L
0780: 49 4b 45 2c 20 61 6e 64 20 4e 4f 54 20 47 4c 4f  IKE, and NOT GLO
0790: 42 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  B operators..*/.
07a0: 73 74 72 75 63 74 20 4c 69 6b 65 4f 70 20 7b 0a  struct LikeOp {.
07b0: 20 20 54 6f 6b 65 6e 20 65 4f 70 65 72 61 74 6f    Token eOperato
07c0: 72 3b 20 20 2f 2a 20 22 6c 69 6b 65 22 20 6f 72  r;  /* "like" or
07d0: 20 22 67 6c 6f 62 22 20 6f 72 20 22 72 65 67 65   "glob" or "rege
07e0: 78 70 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 74  xp" */.  int not
07f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ;         /* Tru
0800: 65 20 69 66 20 74 68 65 20 4e 4f 54 20 6b 65 79  e if the NOT key
0810: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
0820: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
0830: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0840: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0850: 75 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ure describes th
0860: 65 20 65 76 65 6e 74 20 6f 66 20 61 0a 2a 2a 20  e event of a.** 
0870: 54 52 49 47 47 45 52 2e 20 20 22 61 22 20 69 73  TRIGGER.  "a" is
0880: 20 74 68 65 20 65 76 65 6e 74 20 74 79 70 65 2c   the event type,
0890: 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54   one of TK_UPDAT
08a0: 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 0a 2a 2a  E, TK_INSERT,.**
08b0: 20 54 4b 5f 44 45 4c 45 54 45 2c 20 6f 72 20 54   TK_DELETE, or T
08c0: 4b 5f 49 4e 53 54 45 41 44 2e 20 20 49 66 20 74  K_INSTEAD.  If t
08d0: 68 65 20 65 76 65 6e 74 20 69 73 20 6f 66 20 74  he event is of t
08e0: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
08f0: 20 20 20 55 50 44 41 54 45 20 4f 4e 20 28 61 2c     UPDATE ON (a,
0900: 62 2c 63 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  b,c).**.** Then 
0910: 74 68 65 20 22 62 22 20 49 64 4c 69 73 74 20 72  the "b" IdList r
0920: 65 63 6f 72 64 73 20 74 68 65 20 6c 69 73 74 20  ecords the list 
0930: 22 61 2c 62 2c 63 22 2e 0a 2a 2f 0a 73 74 72 75  "a,b,c"..*/.stru
0940: 63 74 20 54 72 69 67 45 76 65 6e 74 20 7b 20 69  ct TrigEvent { i
0950: 6e 74 20 61 3b 20 49 64 4c 69 73 74 20 2a 20 62  nt a; IdList * b
0960: 3b 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ; };../*.** An i
0970: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0980: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
0990: 74 68 65 20 41 54 54 41 43 48 20 6b 65 79 20 61  the ATTACH key a
09a0: 6e 64 20 74 68 65 20 6b 65 79 20 74 79 70 65 2e  nd the key type.
09b0: 0a 2a 2f 0a 73 74 72 75 63 74 20 41 74 74 61 63  .*/.struct Attac
09c0: 68 4b 65 79 20 7b 20 69 6e 74 20 74 79 70 65 3b  hKey { int type;
09d0: 20 20 54 6f 6b 65 6e 20 6b 65 79 3b 20 7d 3b 0a    Token key; };.
09e0: 0a 7d 20 2f 2f 20 65 6e 64 20 25 69 6e 63 6c 75  .} // end %inclu
09f0: 64 65 0a 0a 2f 2f 20 49 6e 70 75 74 20 69 73 20  de..// Input is 
0a00: 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
0a10: 6d 61 6e 64 0a 69 6e 70 75 74 20 3a 3a 3d 20 63  mand.input ::= c
0a20: 6d 64 6c 69 73 74 2e 0a 63 6d 64 6c 69 73 74 20  mdlist..cmdlist 
0a30: 3a 3a 3d 20 63 6d 64 6c 69 73 74 20 65 63 6d 64  ::= cmdlist ecmd
0a40: 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 65 63  ..cmdlist ::= ec
0a50: 6d 64 2e 0a 63 6d 64 78 20 3a 3a 3d 20 63 6d 64  md..cmdx ::= cmd
0a60: 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71  .           { sq
0a70: 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
0a80: 67 28 70 50 61 72 73 65 29 3b 20 7d 0a 65 63 6d  g(pParse); }.ecm
0a90: 64 20 3a 3a 3d 20 53 45 4d 49 2e 0a 65 63 6d 64  d ::= SEMI..ecmd
0aa0: 20 3a 3a 3d 20 65 78 70 6c 61 69 6e 20 63 6d 64   ::= explain cmd
0ab0: 78 20 53 45 4d 49 2e 0a 65 78 70 6c 61 69 6e 20  x SEMI..explain 
0ac0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
0ad0: 7b 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  { sqlite3BeginPa
0ae0: 72 73 65 28 70 50 61 72 73 65 2c 20 30 29 3b 20  rse(pParse, 0); 
0af0: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
0b00: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 65 78  _OMIT_EXPLAIN.ex
0b10: 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c 41 49  plain ::= EXPLAI
0b20: 4e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
0b30: 7b 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  { sqlite3BeginPa
0b40: 72 73 65 28 70 50 61 72 73 65 2c 20 31 29 3b 20  rse(pParse, 1); 
0b50: 7d 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58  }.explain ::= EX
0b60: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0b70: 2e 20 20 20 7b 20 73 71 6c 69 74 65 33 42 65 67  .   { sqlite3Beg
0b80: 69 6e 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  inParse(pParse, 
0b90: 32 29 3b 20 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f  2); }.%endif..//
0ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0bb0: 2f 2f 2f 20 42 65 67 69 6e 20 61 6e 64 20 65 6e  /// Begin and en
0bc0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20  d transactions. 
0bd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0be0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
0bf0: 0a 63 6d 64 20 3a 3a 3d 20 42 45 47 49 4e 20 74  .cmd ::= BEGIN t
0c00: 72 61 6e 73 74 79 70 65 28 59 29 20 74 72 61 6e  ranstype(Y) tran
0c10: 73 5f 6f 70 74 2e 20 20 7b 73 71 6c 69 74 65 33  s_opt.  {sqlite3
0c20: 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
0c30: 28 70 50 61 72 73 65 2c 20 59 29 3b 7d 0a 74 72  (pParse, Y);}.tr
0c40: 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 74 72  ans_opt ::= ..tr
0c50: 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 4e  ans_opt ::= TRAN
0c60: 53 41 43 54 49 4f 4e 2e 0a 74 72 61 6e 73 5f 6f  SACTION..trans_o
0c70: 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49  pt ::= TRANSACTI
0c80: 4f 4e 20 6e 6d 2e 0a 25 74 79 70 65 20 74 72 61  ON nm..%type tra
0c90: 6e 73 74 79 70 65 20 7b 69 6e 74 7d 0a 74 72 61  nstype {int}.tra
0ca0: 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 2e 20  nstype(A) ::= . 
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
0cc0: 20 54 4b 5f 44 45 46 45 52 52 45 44 3b 7d 0a 74   TK_DEFERRED;}.t
0cd0: 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20  ranstype(A) ::= 
0ce0: 44 45 46 45 52 52 45 44 28 58 29 2e 20 20 7b 41  DEFERRED(X).  {A
0cf0: 20 3d 20 40 58 3b 7d 0a 74 72 61 6e 73 74 79 70   = @X;}.transtyp
0d00: 65 28 41 29 20 3a 3a 3d 20 49 4d 4d 45 44 49 41  e(A) ::= IMMEDIA
0d10: 54 45 28 58 29 2e 20 7b 41 20 3d 20 40 58 3b 7d  TE(X). {A = @X;}
0d20: 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a  .transtype(A) ::
0d30: 3d 20 45 58 43 4c 55 53 49 56 45 28 58 29 2e 20  = EXCLUSIVE(X). 
0d40: 7b 41 20 3d 20 40 58 3b 7d 0a 63 6d 64 20 3a 3a  {A = @X;}.cmd ::
0d50: 3d 20 43 4f 4d 4d 49 54 20 74 72 61 6e 73 5f 6f  = COMMIT trans_o
0d60: 70 74 2e 20 20 20 20 20 20 7b 73 71 6c 69 74 65  pt.      {sqlite
0d70: 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
0d80: 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64  on(pParse);}.cmd
0d90: 20 3a 3a 3d 20 45 4e 44 20 74 72 61 6e 73 5f 6f   ::= END trans_o
0da0: 70 74 2e 20 20 20 20 20 20 20 20 20 7b 73 71 6c  pt.         {sql
0db0: 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61  ite3CommitTransa
0dc0: 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a  ction(pParse);}.
0dd0: 63 6d 64 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b  cmd ::= ROLLBACK
0de0: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 7b   trans_opt.    {
0df0: 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54  sqlite3RollbackT
0e00: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73  ransaction(pPars
0e10: 65 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  e);}..//////////
0e20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
0e30: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
0e40: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
0e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e60: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63  ///.//.cmd ::= c
0e70: 72 65 61 74 65 5f 74 61 62 6c 65 20 63 72 65 61  reate_table crea
0e80: 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 2e 0a 63  te_table_args..c
0e90: 72 65 61 74 65 5f 74 61 62 6c 65 20 3a 3a 3d 20  reate_table ::= 
0ea0: 43 52 45 41 54 45 20 74 65 6d 70 28 54 29 20 54  CREATE temp(T) T
0eb0: 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 73 74 73  ABLE ifnotexists
0ec0: 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a  (E) nm(Y) dbnm(Z
0ed0: 29 2e 20 7b 0a 20 20 20 73 71 6c 69 74 65 33 53  ). {.   sqlite3S
0ee0: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
0ef0: 2c 26 59 2c 26 5a 2c 54 2c 30 2c 45 29 3b 0a 7d  ,&Y,&Z,T,0,E);.}
0f00: 0a 25 74 79 70 65 20 69 66 6e 6f 74 65 78 69 73  .%type ifnotexis
0f10: 74 73 20 7b 69 6e 74 7d 0a 69 66 6e 6f 74 65 78  ts {int}.ifnotex
0f20: 69 73 74 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20  ists(A) ::= .   
0f30: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
0f40: 30 3b 7d 0a 69 66 6e 6f 74 65 78 69 73 74 73 28  0;}.ifnotexists(
0f50: 41 29 20 3a 3a 3d 20 49 46 20 4e 4f 54 20 45 58  A) ::= IF NOT EX
0f60: 49 53 54 53 2e 20 7b 41 20 3d 20 31 3b 7d 0a 25  ISTS. {A = 1;}.%
0f70: 74 79 70 65 20 74 65 6d 70 20 7b 69 6e 74 7d 0a  type temp {int}.
0f80: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
0f90: 4d 49 54 5f 54 45 4d 50 44 42 0a 74 65 6d 70 28  MIT_TEMPDB.temp(
0fa0: 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20 20 7b 41  A) ::= TEMP.  {A
0fb0: 20 3d 20 31 3b 7d 0a 25 65 6e 64 69 66 0a 74 65   = 1;}.%endif.te
0fc0: 6d 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  mp(A) ::= .     
0fd0: 20 7b 41 20 3d 20 30 3b 7d 0a 63 72 65 61 74 65   {A = 0;}.create
0fe0: 5f 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20  _table_args ::= 
0ff0: 4c 50 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 63 6f  LP columnlist co
1000: 6e 73 6c 69 73 74 5f 6f 70 74 28 58 29 20 52 50  nslist_opt(X) RP
1010: 28 59 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (Y). {.  sqlite3
1020: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
1030: 26 58 2c 26 59 2c 30 29 3b 0a 7d 0a 63 72 65 61  &X,&Y,0);.}.crea
1040: 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a  te_table_args ::
1050: 3d 20 41 53 20 73 65 6c 65 63 74 28 53 29 2e 20  = AS select(S). 
1060: 7b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61  {.  sqlite3EndTa
1070: 62 6c 65 28 70 50 61 72 73 65 2c 30 2c 30 2c 53  ble(pParse,0,0,S
1080: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1090: 63 74 44 65 6c 65 74 65 28 53 29 3b 0a 7d 0a 63  ctDelete(S);.}.c
10a0: 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f  olumnlist ::= co
10b0: 6c 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63  lumnlist COMMA c
10c0: 6f 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e 6c 69 73  olumn..columnlis
10d0: 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e 0a 0a 2f  t ::= column.../
10e0: 2f 20 41 20 22 63 6f 6c 75 6d 6e 22 20 69 73 20  / A "column" is 
10f0: 61 20 63 6f 6d 70 6c 65 74 65 20 64 65 73 63 72  a complete descr
1100: 69 70 74 69 6f 6e 20 6f 66 20 61 20 73 69 6e 67  iption of a sing
1110: 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 0a 2f  le column in a./
1120: 2f 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  / CREATE TABLE s
1130: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
1140: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 6f 6c  includes the col
1150: 75 6d 6e 20 6e 61 6d 65 2c 20 69 74 73 0a 2f 2f  umn name, its.//
1160: 20 64 61 74 61 74 79 70 65 2c 20 61 6e 64 20 6f   datatype, and o
1170: 74 68 65 72 20 6b 65 79 77 6f 72 64 73 20 73 75  ther keywords su
1180: 63 68 20 61 73 20 50 52 49 4d 41 52 59 20 4b 45  ch as PRIMARY KE
1190: 59 2c 20 55 4e 49 51 55 45 2c 20 52 45 46 45 52  Y, UNIQUE, REFER
11a0: 45 4e 43 45 53 2c 0a 2f 2f 20 4e 4f 54 20 4e 55  ENCES,.// NOT NU
11b0: 4c 4c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  LL and so forth.
11c0: 0a 2f 2f 0a 63 6f 6c 75 6d 6e 28 41 29 20 3a 3a  .//.column(A) ::
11d0: 3d 20 63 6f 6c 75 6d 6e 69 64 28 58 29 20 74 79  = columnid(X) ty
11e0: 70 65 20 63 61 72 67 6c 69 73 74 2e 20 7b 0a 20  pe carglist. {. 
11f0: 20 41 2e 7a 20 3d 20 58 2e 7a 3b 0a 20 20 41 2e   A.z = X.z;.  A.
1200: 6e 20 3d 20 28 70 50 61 72 73 65 2d 3e 73 4c 61  n = (pParse->sLa
1210: 73 74 54 6f 6b 65 6e 2e 7a 2d 58 2e 7a 29 20 2b  stToken.z-X.z) +
1220: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
1230: 6b 65 6e 2e 6e 3b 0a 7d 0a 63 6f 6c 75 6d 6e 69  ken.n;.}.columni
1240: 64 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20  d(A) ::= nm(X). 
1250: 7b 0a 20 20 73 71 6c 69 74 65 33 41 64 64 43 6f  {.  sqlite3AddCo
1260: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 26 58 29 3b  lumn(pParse,&X);
1270: 0a 20 20 41 20 3d 20 58 3b 0a 7d 0a 0a 0a 2f 2f  .  A = X;.}...//
1280: 20 41 6e 20 49 44 45 4e 54 49 46 49 45 52 20 63   An IDENTIFIER c
1290: 61 6e 20 62 65 20 61 20 67 65 6e 65 72 69 63 20  an be a generic 
12a0: 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f  identifier, or o
12b0: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f  ne of several.//
12c0: 20 6b 65 79 77 6f 72 64 73 2e 20 20 41 6e 79 20   keywords.  Any 
12d0: 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 6b 65 79  non-standard key
12e0: 77 6f 72 64 20 63 61 6e 20 61 6c 73 6f 20 62 65  word can also be
12f0: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 2e 0a   an identifier..
1300: 2f 2f 0a 25 74 79 70 65 20 69 64 20 7b 54 6f 6b  //.%type id {Tok
1310: 65 6e 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 49 44  en}.id(A) ::= ID
1320: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
1330: 3d 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f  = X;}..// The fo
1340: 6c 6c 6f 77 69 6e 67 20 64 69 72 65 63 74 69 76  llowing directiv
1350: 65 20 63 61 75 73 65 73 20 74 6f 6b 65 6e 73 20  e causes tokens 
1360: 41 42 4f 52 54 2c 20 41 46 54 45 52 2c 20 41 53  ABORT, AFTER, AS
1370: 43 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61  C, etc. to.// fa
1380: 6c 6c 62 61 63 6b 20 74 6f 20 49 44 20 69 66 20  llback to ID if 
1390: 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61  they will not pa
13a0: 72 73 65 20 61 73 20 74 68 65 69 72 20 6f 72 69  rse as their ori
13b0: 67 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20  ginal value..// 
13c0: 54 68 69 73 20 6f 62 76 69 61 74 65 73 20 74 68  This obviates th
13d0: 65 20 6e 65 65 64 20 66 6f 72 20 74 68 65 20 22  e need for the "
13e0: 69 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  id" nonterminal.
13f0: 0a 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44  .//.%fallback ID
1400: 0a 20 20 41 42 4f 52 54 20 41 46 54 45 52 20 41  .  ABORT AFTER A
1410: 4e 41 4c 59 5a 45 20 41 53 43 20 41 54 54 41 43  NALYZE ASC ATTAC
1420: 48 20 42 45 46 4f 52 45 20 42 45 47 49 4e 20 43  H BEFORE BEGIN C
1430: 41 53 43 41 44 45 20 43 41 53 54 20 43 4f 4e 46  ASCADE CAST CONF
1440: 4c 49 43 54 0a 20 20 44 41 54 41 42 41 53 45 20  LICT.  DATABASE 
1450: 44 45 46 45 52 52 45 44 20 44 45 53 43 20 44 45  DEFERRED DESC DE
1460: 54 41 43 48 20 45 41 43 48 20 45 4e 44 20 45 58  TACH EACH END EX
1470: 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49 4e 20  CLUSIVE EXPLAIN 
1480: 46 41 49 4c 20 46 4f 52 0a 20 20 49 47 4e 4f 52  FAIL FOR.  IGNOR
1490: 45 20 49 4d 4d 45 44 49 41 54 45 20 49 4e 49 54  E IMMEDIATE INIT
14a0: 49 41 4c 4c 59 20 49 4e 53 54 45 41 44 20 4c 49  IALLY INSTEAD LI
14b0: 4b 45 5f 4b 57 20 4d 41 54 43 48 20 50 4c 41 4e  KE_KW MATCH PLAN
14c0: 20 51 55 45 52 59 20 4b 45 59 0a 20 20 4f 46 20   QUERY KEY.  OF 
14d0: 4f 46 46 53 45 54 20 50 52 41 47 4d 41 20 52 41  OFFSET PRAGMA RA
14e0: 49 53 45 20 52 45 50 4c 41 43 45 20 52 45 53 54  ISE REPLACE REST
14f0: 52 49 43 54 20 52 4f 57 20 53 54 41 54 45 4d 45  RICT ROW STATEME
1500: 4e 54 0a 20 20 54 45 4d 50 20 54 52 49 47 47 45  NT.  TEMP TRIGGE
1510: 52 20 56 41 43 55 55 4d 20 56 49 45 57 0a 25 69  R VACUUM VIEW.%i
1520: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
1530: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
1540: 0a 20 20 45 58 43 45 50 54 20 49 4e 54 45 52 53  .  EXCEPT INTERS
1550: 45 43 54 20 55 4e 49 4f 4e 0a 25 65 6e 64 69 66  ECT UNION.%endif
1560: 0a 20 20 52 45 49 4e 44 45 58 20 52 45 4e 41 4d  .  REINDEX RENAM
1570: 45 20 43 54 49 4d 45 5f 4b 57 20 49 46 0a 20 20  E CTIME_KW IF.  
1580: 2e 0a 0a 2f 2f 20 44 65 66 69 6e 65 20 6f 70 65  ...// Define ope
1590: 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e 63 65  rator precedence
15a0: 20 65 61 72 6c 79 20 73 6f 20 74 68 61 74 20 74   early so that t
15b0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
15c0: 20 6f 63 63 75 72 61 6e 63 65 0a 2f 2f 20 6f 66   occurance.// of
15d0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
15e0: 6b 65 6e 73 20 69 6e 20 74 68 65 20 67 72 61 6d  kens in the gram
15f0: 6d 65 72 2e 20 20 4b 65 65 70 69 6e 67 20 74 68  mer.  Keeping th
1600: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 67 65  e operators toge
1610: 74 68 65 72 0a 2f 2f 20 63 61 75 73 65 73 20 74  ther.// causes t
1620: 68 65 6d 20 74 6f 20 62 65 20 61 73 73 69 67 6e  hem to be assign
1630: 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ed integer value
1640: 73 20 74 68 61 74 20 61 72 65 20 63 6c 6f 73 65  s that are close
1650: 20 74 6f 67 65 74 68 65 72 2c 0a 2f 2f 20 77 68   together,.// wh
1660: 69 63 68 20 6b 65 65 70 73 20 70 61 72 73 65 72  ich keeps parser
1670: 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e   tables smaller.
1680: 0a 2f 2f 0a 2f 2f 20 54 68 65 20 74 6f 6b 65 6e  .//.// The token
1690: 20 76 61 6c 75 65 73 20 61 73 73 69 67 6e 65 64   values assigned
16a0: 20 74 6f 20 74 68 65 73 65 20 73 79 6d 62 6f 6c   to these symbol
16b0: 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  s is determined 
16c0: 62 79 20 74 68 65 20 6f 72 64 65 72 0a 2f 2f 20  by the order.// 
16d0: 69 6e 20 77 68 69 63 68 20 6c 65 6d 6f 6e 20 66  in which lemon f
16e0: 69 72 73 74 20 73 65 65 73 20 74 68 65 6d 2e 20  irst sees them. 
16f0: 20 49 74 20 6d 75 73 74 20 62 65 20 74 68 65 20   It must be the 
1700: 63 61 73 65 20 74 68 61 74 20 49 53 4e 55 4c 4c  case that ISNULL
1710: 2f 4e 4f 54 4e 55 4c 4c 2c 0a 2f 2f 20 4e 45 2f  /NOTNULL,.// NE/
1720: 45 51 2c 20 47 54 2f 4c 45 2c 20 61 6e 64 20 47  EQ, GT/LE, and G
1730: 45 2f 4c 54 20 61 72 65 20 73 65 70 61 72 61 74  E/LT are separat
1740: 65 64 20 62 79 20 6f 6e 6c 79 20 61 20 73 69 6e  ed by only a sin
1750: 67 6c 65 20 76 61 6c 75 65 2e 20 20 53 65 65 0a  gle value.  See.
1760: 2f 2f 20 74 68 65 20 73 71 6c 69 74 65 33 45 78  // the sqlite3Ex
1770: 70 72 49 66 46 61 6c 73 65 28 29 20 72 6f 75 74  prIfFalse() rout
1780: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
1790: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
17a0: 6e 20 74 68 69 73 0a 2f 2f 20 63 6f 6e 73 74 72  n this.// constr
17b0: 61 69 6e 74 2e 0a 2f 2f 0a 25 6c 65 66 74 20 4f  aint..//.%left O
17c0: 52 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a 25 72  R..%left AND..%r
17d0: 69 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66 74 20  ight NOT..%left 
17e0: 49 53 20 4c 49 4b 45 5f 4b 57 20 42 45 54 57 45  IS LIKE_KW BETWE
17f0: 45 4e 20 49 4e 20 49 53 4e 55 4c 4c 20 4e 4f 54  EN IN ISNULL NOT
1800: 4e 55 4c 4c 20 4e 45 20 45 51 2e 0a 25 6c 65 66  NULL NE EQ..%lef
1810: 74 20 47 54 20 4c 45 20 4c 54 20 47 45 2e 0a 25  t GT LE LT GE..%
1820: 72 69 67 68 74 20 45 53 43 41 50 45 2e 0a 25 6c  right ESCAPE..%l
1830: 65 66 74 20 42 49 54 41 4e 44 20 42 49 54 4f 52  eft BITAND BITOR
1840: 20 4c 53 48 49 46 54 20 52 53 48 49 46 54 2e 0a   LSHIFT RSHIFT..
1850: 25 6c 65 66 74 20 50 4c 55 53 20 4d 49 4e 55 53  %left PLUS MINUS
1860: 2e 0a 25 6c 65 66 74 20 53 54 41 52 20 53 4c 41  ..%left STAR SLA
1870: 53 48 20 52 45 4d 2e 0a 25 6c 65 66 74 20 43 4f  SH REM..%left CO
1880: 4e 43 41 54 2e 0a 25 72 69 67 68 74 20 55 4d 49  NCAT..%right UMI
1890: 4e 55 53 20 55 50 4c 55 53 20 42 49 54 4e 4f 54  NUS UPLUS BITNOT
18a0: 2e 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73 22 20  ...// And "ids" 
18b0: 69 73 20 61 6e 20 69 64 65 6e 74 69 66 65 72 2d  is an identifer-
18c0: 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a 25 74  or-string..//.%t
18d0: 79 70 65 20 69 64 73 20 7b 54 6f 6b 65 6e 7d 0a  ype ids {Token}.
18e0: 69 64 73 28 41 29 20 3a 3a 3d 20 49 44 7c 53 54  ids(A) ::= ID|ST
18f0: 52 49 4e 47 28 58 29 2e 20 20 20 7b 41 20 3d 20  RING(X).   {A = 
1900: 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e 61 6d 65  X;}..// The name
1910: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 72 20   of a column or 
1920: 74 61 62 6c 65 20 63 61 6e 20 62 65 20 61 6e 79  table can be any
1930: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1940: 67 3a 0a 2f 2f 0a 25 74 79 70 65 20 6e 6d 20 7b  g:.//.%type nm {
1950: 54 6f 6b 65 6e 7d 0a 6e 6d 28 41 29 20 3a 3a 3d  Token}.nm(A) ::=
1960: 20 49 44 28 58 29 2e 20 20 20 20 20 20 20 20 20   ID(X).         
1970: 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a  {A = X;}.nm(A) :
1980: 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20 20  := STRING(X).   
1990: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 28 41 29    {A = X;}.nm(A)
19a0: 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e   ::= JOIN_KW(X).
19b0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f      {A = X;}..//
19c0: 20 41 20 74 79 70 65 74 6f 6b 65 6e 20 69 73 20   A typetoken is 
19d0: 72 65 61 6c 6c 79 20 6f 6e 65 20 6f 72 20 6d 6f  really one or mo
19e0: 72 65 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 66  re tokens that f
19f0: 6f 72 6d 20 61 20 74 79 70 65 20 6e 61 6d 65 20  orm a type name 
1a00: 73 75 63 68 0a 2f 2f 20 61 73 20 63 61 6e 20 62  such.// as can b
1a10: 65 20 66 6f 75 6e 64 20 61 66 74 65 72 20 74 68  e found after th
1a20: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e  e column name in
1a30: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
1a40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 20 4d 75  statement..// Mu
1a50: 6c 74 69 70 6c 65 20 74 6f 6b 65 6e 73 20 61 72  ltiple tokens ar
1a60: 65 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 20 74  e concatenated t
1a70: 6f 20 66 6f 72 6d 20 74 68 65 20 76 61 6c 75 65  o form the value
1a80: 20 6f 66 20 74 68 65 20 74 79 70 65 74 6f 6b 65   of the typetoke
1a90: 6e 2e 0a 2f 2f 0a 25 74 79 70 65 20 74 79 70 65  n..//.%type type
1aa0: 74 6f 6b 65 6e 20 7b 54 6f 6b 65 6e 7d 0a 74 79  token {Token}.ty
1ab0: 70 65 20 3a 3a 3d 20 2e 0a 74 79 70 65 20 3a 3a  pe ::= ..type ::
1ac0: 3d 20 74 79 70 65 74 6f 6b 65 6e 28 58 29 2e 20  = typetoken(X). 
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43 6f 6c    {sqlite3AddCol
1af0: 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26  umnType(pParse,&
1b00: 58 29 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41  X);}.typetoken(A
1b10: 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58  ) ::= typename(X
1b20: 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 74 79  ).   {A = X;}.ty
1b30: 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74  petoken(A) ::= t
1b40: 79 70 65 6e 61 6d 65 28 58 29 20 4c 50 20 73 69  ypename(X) LP si
1b50: 67 6e 65 64 20 52 50 28 59 29 2e 20 7b 0a 20 20  gned RP(Y). {.  
1b60: 41 2e 7a 20 3d 20 58 2e 7a 3b 0a 20 20 41 2e 6e  A.z = X.z;.  A.n
1b70: 20 3d 20 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 58   = &Y.z[Y.n] - X
1b80: 2e 7a 3b 0a 7d 0a 74 79 70 65 74 6f 6b 65 6e 28  .z;.}.typetoken(
1b90: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
1ba0: 58 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d  X) LP signed COM
1bb0: 4d 41 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e  MA signed RP(Y).
1bc0: 20 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e 7a 3b 0a   {.  A.z = X.z;.
1bd0: 20 20 41 2e 6e 20 3d 20 26 59 2e 7a 5b 59 2e 6e    A.n = &Y.z[Y.n
1be0: 5d 20 2d 20 58 2e 7a 3b 0a 7d 0a 25 74 79 70 65  ] - X.z;.}.%type
1bf0: 20 74 79 70 65 6e 61 6d 65 20 7b 54 6f 6b 65 6e   typename {Token
1c00: 7d 0a 74 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a  }.typename(A) ::
1c10: 3d 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20  = ids(X).       
1c20: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 74        {A = X;}.t
1c30: 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 74  ypename(A) ::= t
1c40: 79 70 65 6e 61 6d 65 28 58 29 20 69 64 73 28 59  ypename(X) ids(Y
1c50: 29 2e 20 7b 41 2e 7a 3d 58 2e 7a 3b 20 41 2e 6e  ). {A.z=X.z; A.n
1c60: 3d 59 2e 6e 2b 28 59 2e 7a 2d 58 2e 7a 29 3b 7d  =Y.n+(Y.z-X.z);}
1c70: 0a 25 74 79 70 65 20 73 69 67 6e 65 64 20 7b 69  .%type signed {i
1c80: 6e 74 7d 0a 73 69 67 6e 65 64 28 41 29 20 3a 3a  nt}.signed(A) ::
1c90: 3d 20 70 6c 75 73 5f 6e 75 6d 28 58 29 2e 20 20  = plus_num(X).  
1ca0: 20 20 7b 20 41 20 3d 20 61 74 6f 69 28 28 63 68    { A = atoi((ch
1cb0: 61 72 2a 29 58 2e 7a 29 3b 20 7d 0a 73 69 67 6e  ar*)X.z); }.sign
1cc0: 65 64 28 41 29 20 3a 3a 3d 20 6d 69 6e 75 73 5f  ed(A) ::= minus_
1cd0: 6e 75 6d 28 58 29 2e 20 20 20 7b 20 41 20 3d 20  num(X).   { A = 
1ce0: 2d 61 74 6f 69 28 28 63 68 61 72 2a 29 58 2e 7a  -atoi((char*)X.z
1cf0: 29 3b 20 7d 0a 0a 2f 2f 20 22 63 61 72 67 6c 69  ); }..// "cargli
1d00: 73 74 22 20 69 73 20 61 20 6c 69 73 74 20 6f 66  st" is a list of
1d10: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73   additional cons
1d20: 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d  traints that com
1d30: 65 20 61 66 74 65 72 20 74 68 65 0a 2f 2f 20 63  e after the.// c
1d40: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 63  olumn name and c
1d50: 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 20 61 20  olumn type in a 
1d60: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1d70: 74 65 6d 65 6e 74 2e 0a 2f 2f 0a 63 61 72 67 6c  tement..//.cargl
1d80: 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c 69 73 74  ist ::= carglist
1d90: 20 63 61 72 67 2e 0a 63 61 72 67 6c 69 73 74 20   carg..carglist 
1da0: 3a 3a 3d 20 2e 0a 63 61 72 67 20 3a 3a 3d 20 43  ::= ..carg ::= C
1db0: 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 20 63 63 6f  ONSTRAINT nm cco
1dc0: 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 63 63 6f  ns..carg ::= cco
1dd0: 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46  ns..carg ::= DEF
1de0: 41 55 4c 54 20 74 65 72 6d 28 58 29 2e 20 20 20  AULT term(X).   
1df0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1e00: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
1e10: 28 70 50 61 72 73 65 2c 58 29 3b 7d 0a 63 61 72  (pParse,X);}.car
1e20: 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4c 50  g ::= DEFAULT LP
1e30: 20 65 78 70 72 28 58 29 20 52 50 2e 20 20 20 20   expr(X) RP.    
1e40: 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66    {sqlite3AddDef
1e50: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
1e60: 2c 58 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44  ,X);}.carg ::= D
1e70: 45 46 41 55 4c 54 20 50 4c 55 53 20 74 65 72 6d  EFAULT PLUS term
1e80: 28 58 29 2e 20 20 20 20 20 20 20 7b 73 71 6c 69  (X).       {sqli
1e90: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
1ea0: 75 65 28 70 50 61 72 73 65 2c 58 29 3b 7d 0a 63  ue(pParse,X);}.c
1eb0: 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  arg ::= DEFAULT 
1ec0: 4d 49 4e 55 53 20 74 65 72 6d 28 58 29 2e 20 20  MINUS term(X).  
1ed0: 20 20 20 20 7b 0a 20 20 45 78 70 72 20 2a 70 20      {.  Expr *p 
1ee0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
1ef0: 5f 55 4d 49 4e 55 53 2c 20 58 2c 20 30 2c 20 30  _UMINUS, X, 0, 0
1f00: 29 3b 0a 20 20 73 71 6c 69 74 65 33 41 64 64 44  );.  sqlite3AddD
1f10: 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72  efaultValue(pPar
1f20: 73 65 2c 70 29 3b 0a 7d 0a 63 61 72 67 20 3a 3a  se,p);.}.carg ::
1f30: 3d 20 44 45 46 41 55 4c 54 20 69 64 28 58 29 2e  = DEFAULT id(X).
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a                {.
1f50: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
1f60: 74 65 33 45 78 70 72 28 54 4b 5f 53 54 52 49 4e  te3Expr(TK_STRIN
1f70: 47 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20  G, 0, 0, &X);.  
1f80: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
1f90: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 70 29  tValue(pParse,p)
1fa0: 3b 0a 7d 0a 0a 2f 2f 20 49 6e 20 61 64 64 69 74  ;.}..// In addit
1fb0: 69 6f 6e 20 74 6f 20 74 68 65 20 74 79 70 65 20  ion to the type 
1fc0: 6e 61 6d 65 2c 20 77 65 20 61 6c 73 6f 20 63 61  name, we also ca
1fd0: 72 65 20 61 62 6f 75 74 20 74 68 65 20 70 72 69  re about the pri
1fe0: 6d 61 72 79 20 6b 65 79 20 61 6e 64 0a 2f 2f 20  mary key and.// 
1ff0: 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
2000: 74 73 2e 0a 2f 2f 0a 63 63 6f 6e 73 20 3a 3a 3d  ts..//.ccons ::=
2010: 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 2e 0a 63 63   NULL onconf..cc
2020: 6f 6e 73 20 3a 3a 3d 20 4e 4f 54 20 4e 55 4c 4c  ons ::= NOT NULL
2030: 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20 20   onconf(R).     
2040: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
2050: 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 70 50 61  e3AddNotNull(pPa
2060: 72 73 65 2c 20 52 29 3b 7d 0a 63 63 6f 6e 73 20  rse, R);}.ccons 
2070: 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20  ::= PRIMARY KEY 
2080: 73 6f 72 74 6f 72 64 65 72 28 5a 29 20 6f 6e 63  sortorder(Z) onc
2090: 6f 6e 66 28 52 29 20 61 75 74 6f 69 6e 63 28 49  onf(R) autoinc(I
20a0: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
20d0: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50  AddPrimaryKey(pP
20e0: 61 72 73 65 2c 30 2c 52 2c 49 2c 5a 29 3b 7d 0a  arse,0,R,I,Z);}.
20f0: 63 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45  ccons ::= UNIQUE
2100: 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20 7b   onconf(R).    {
2110: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
2120: 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c  ex(pParse,0,0,0,
2130: 30 2c 52 2c 30 2c 30 2c 30 2c 30 29 3b 7d 0a 63  0,R,0,0,0,0);}.c
2140: 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20 4c  cons ::= CHECK L
2150: 50 20 65 78 70 72 28 58 29 20 52 50 2e 20 20 20  P expr(X) RP.   
2160: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43      {sqlite3AddC
2170: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70  heckConstraint(p
2180: 50 61 72 73 65 2c 58 29 3b 7d 0a 63 63 6f 6e 73  Parse,X);}.ccons
2190: 20 3a 3a 3d 20 52 45 46 45 52 45 4e 43 45 53 20   ::= REFERENCES 
21a0: 6e 6d 28 54 29 20 69 64 78 6c 69 73 74 5f 6f 70  nm(T) idxlist_op
21b0: 74 28 54 41 29 20 72 65 66 61 72 67 73 28 52 29  t(TA) refargs(R)
21c0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74 65    {sqlite3Create
21f0: 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73  ForeignKey(pPars
2200: 65 2c 30 2c 26 54 2c 54 41 2c 52 29 3b 7d 0a 63  e,0,&T,TA,R);}.c
2210: 63 6f 6e 73 20 3a 3a 3d 20 64 65 66 65 72 5f 73  cons ::= defer_s
2220: 75 62 63 6c 61 75 73 65 28 44 29 2e 20 20 20 7b  ubclause(D).   {
2230: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
2240: 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 44 29  ignKey(pParse,D)
2250: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4c  ;}.ccons ::= COL
2260: 4c 41 54 45 20 69 64 28 43 29 2e 20 20 7b 73 71  LATE id(C).  {sq
2270: 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54  lite3AddCollateT
2280: 79 70 65 28 70 50 61 72 73 65 2c 20 28 63 68 61  ype(pParse, (cha
2290: 72 2a 29 43 2e 7a 2c 20 43 2e 6e 29 3b 7d 0a 0a  r*)C.z, C.n);}..
22a0: 2f 2f 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20  // The optional 
22b0: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
22c0: 79 77 6f 72 64 0a 25 74 79 70 65 20 61 75 74 6f  yword.%type auto
22d0: 69 6e 63 20 7b 69 6e 74 7d 0a 61 75 74 6f 69 6e  inc {int}.autoin
22e0: 63 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  c(X) ::= .      
22f0: 20 20 20 20 7b 58 20 3d 20 30 3b 7d 0a 61 75 74      {X = 0;}.aut
2300: 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 41 55 54 4f  oinc(X) ::= AUTO
2310: 49 4e 43 52 2e 20 20 7b 58 20 3d 20 31 3b 7d 0a  INCR.  {X = 1;}.
2320: 0a 2f 2f 20 54 68 65 20 6e 65 78 74 20 67 72 6f  .// The next gro
2330: 75 70 20 6f 66 20 72 75 6c 65 73 20 70 61 72 73  up of rules pars
2340: 65 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  es the arguments
2350: 20 74 6f 20 61 20 52 45 46 45 52 45 4e 43 45 53   to a REFERENCES
2360: 20 63 6c 61 75 73 65 0a 2f 2f 20 74 68 61 74 20   clause.// that 
2370: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
2380: 20 72 65 66 65 72 65 6e 74 69 61 6c 20 69 6e 74   referential int
2390: 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
23a0: 69 73 20 64 65 66 65 72 72 65 64 20 6f 72 0a 2f  is deferred or./
23b0: 2f 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 61  / or immediate a
23c0: 6e 64 20 77 68 69 63 68 20 64 65 74 65 72 6d 69  nd which determi
23d0: 6e 65 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74  ne what action t
23e0: 6f 20 74 61 6b 65 20 69 66 20 61 20 72 65 66 2d  o take if a ref-
23f0: 69 6e 74 65 67 0a 2f 2f 20 63 68 65 63 6b 20 66  integ.// check f
2400: 61 69 6c 73 2e 0a 2f 2f 0a 25 74 79 70 65 20 72  ails..//.%type r
2410: 65 66 61 72 67 73 20 7b 69 6e 74 7d 0a 72 65 66  efargs {int}.ref
2420: 61 72 67 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20  args(A) ::= .   
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65 73 74 72    { A = OE_Restr
2450: 69 63 74 20 2a 20 30 78 30 31 30 31 30 31 3b 20  ict * 0x010101; 
2460: 7d 0a 72 65 66 61 72 67 73 28 41 29 20 3a 3a 3d  }.refargs(A) ::=
2470: 20 72 65 66 61 72 67 73 28 58 29 20 72 65 66 61   refargs(X) refa
2480: 72 67 28 59 29 2e 20 7b 20 41 20 3d 20 28 58 20  rg(Y). { A = (X 
2490: 26 20 59 2e 6d 61 73 6b 29 20 7c 20 59 2e 76 61  & Y.mask) | Y.va
24a0: 6c 75 65 3b 20 7d 0a 25 74 79 70 65 20 72 65 66  lue; }.%type ref
24b0: 61 72 67 20 7b 73 74 72 75 63 74 20 7b 69 6e 74  arg {struct {int
24c0: 20 76 61 6c 75 65 3b 20 69 6e 74 20 6d 61 73 6b   value; int mask
24d0: 3b 7d 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a  ;}}.refarg(A) ::
24e0: 3d 20 4d 41 54 43 48 20 6e 6d 2e 20 20 20 20 20  = MATCH nm.     
24f0: 20 20 20 20 20 20 20 20 20 7b 20 41 2e 76 61 6c           { A.val
2500: 75 65 20 3d 20 30 3b 20 20 20 20 20 41 2e 6d 61  ue = 0;     A.ma
2510: 73 6b 20 3d 20 30 78 30 30 30 30 30 30 3b 20 7d  sk = 0x000000; }
2520: 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f  .refarg(A) ::= O
2530: 4e 20 44 45 4c 45 54 45 20 72 65 66 61 63 74 28  N DELETE refact(
2540: 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20  X).   { A.value 
2550: 3d 20 58 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20  = X;     A.mask 
2560: 3d 20 30 78 30 30 30 30 66 66 3b 20 7d 0a 72 65  = 0x0000ff; }.re
2570: 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 55  farg(A) ::= ON U
2580: 50 44 41 54 45 20 72 65 66 61 63 74 28 58 29 2e  PDATE refact(X).
2590: 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58     { A.value = X
25a0: 3c 3c 38 3b 20 20 41 2e 6d 61 73 6b 20 3d 20 30  <<8;  A.mask = 0
25b0: 78 30 30 66 66 30 30 3b 20 7d 0a 72 65 66 61 72  x00ff00; }.refar
25c0: 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 49 4e 53 45  g(A) ::= ON INSE
25d0: 52 54 20 72 65 66 61 63 74 28 58 29 2e 20 20 20  RT refact(X).   
25e0: 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58 3c 3c 31  { A.value = X<<1
25f0: 36 3b 20 41 2e 6d 61 73 6b 20 3d 20 30 78 66 66  6; A.mask = 0xff
2600: 30 30 30 30 3b 20 7d 0a 25 74 79 70 65 20 72 65  0000; }.%type re
2610: 66 61 63 74 20 7b 69 6e 74 7d 0a 72 65 66 61 63  fact {int}.refac
2620: 74 28 41 29 20 3a 3a 3d 20 53 45 54 20 4e 55 4c  t(A) ::= SET NUL
2630: 4c 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  L.              
2640: 7b 20 41 20 3d 20 4f 45 5f 53 65 74 4e 75 6c 6c  { A = OE_SetNull
2650: 3b 20 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a  ; }.refact(A) ::
2660: 3d 20 53 45 54 20 44 45 46 41 55 4c 54 2e 20 20  = SET DEFAULT.  
2670: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f           { A = O
2680: 45 5f 53 65 74 44 66 6c 74 3b 20 7d 0a 72 65 66  E_SetDflt; }.ref
2690: 61 63 74 28 41 29 20 3a 3a 3d 20 43 41 53 43 41  act(A) ::= CASCA
26a0: 44 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  DE.             
26b0: 20 20 7b 20 41 20 3d 20 4f 45 5f 43 61 73 63 61    { A = OE_Casca
26c0: 64 65 3b 20 7d 0a 72 65 66 61 63 74 28 41 29 20  de; }.refact(A) 
26d0: 3a 3a 3d 20 52 45 53 54 52 49 43 54 2e 20 20 20  ::= RESTRICT.   
26e0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
26f0: 20 4f 45 5f 52 65 73 74 72 69 63 74 3b 20 7d 0a   OE_Restrict; }.
2700: 25 74 79 70 65 20 64 65 66 65 72 5f 73 75 62 63  %type defer_subc
2710: 6c 61 75 73 65 20 7b 69 6e 74 7d 0a 64 65 66 65  lause {int}.defe
2720: 72 5f 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a  r_subclause(A) :
2730: 3a 3d 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c  := NOT DEFERRABL
2740: 45 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f  E init_deferred_
2750: 70 72 65 64 5f 6f 70 74 28 58 29 2e 20 20 7b 41  pred_opt(X).  {A
2760: 20 3d 20 58 3b 7d 0a 64 65 66 65 72 5f 73 75 62   = X;}.defer_sub
2770: 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 44 45  clause(A) ::= DE
2780: 46 45 52 52 41 42 4c 45 20 69 6e 69 74 5f 64 65  FERRABLE init_de
2790: 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28  ferred_pred_opt(
27a0: 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b  X).      {A = X;
27b0: 7d 0a 25 74 79 70 65 20 69 6e 69 74 5f 64 65 66  }.%type init_def
27c0: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 20 7b  erred_pred_opt {
27d0: 69 6e 74 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72  int}.init_deferr
27e0: 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a  ed_pred_opt(A) :
27f0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
2800: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2810: 30 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65  0;}.init_deferre
2820: 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a  d_pred_opt(A) ::
2830: 3d 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45  = INITIALLY DEFE
2840: 52 52 45 44 2e 20 20 20 20 20 7b 41 20 3d 20 31  RRED.     {A = 1
2850: 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64  ;}.init_deferred
2860: 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d  _pred_opt(A) ::=
2870: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
2880: 49 41 54 45 2e 20 20 20 20 7b 41 20 3d 20 30 3b  IATE.    {A = 0;
2890: 7d 0a 0a 2f 2f 20 46 6f 72 20 74 68 65 20 74 69  }..// For the ti
28a0: 6d 65 20 62 65 69 6e 67 2c 20 74 68 65 20 6f 6e  me being, the on
28b0: 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 65  ly constraint we
28c0: 20 63 61 72 65 20 61 62 6f 75 74 20 69 73 20 74   care about is t
28d0: 68 65 20 70 72 69 6d 61 72 79 0a 2f 2f 20 6b 65  he primary.// ke
28e0: 79 20 61 6e 64 20 55 4e 49 51 55 45 2e 20 20 42  y and UNIQUE.  B
28f0: 6f 74 68 20 63 72 65 61 74 65 20 69 6e 64 69 63  oth create indic
2900: 65 73 2e 0a 2f 2f 0a 63 6f 6e 73 6c 69 73 74 5f  es..//.conslist_
2910: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2930: 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20 30  A.n = 0; A.z = 0
2940: 3b 7d 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 28  ;}.conslist_opt(
2950: 41 29 20 3a 3a 3d 20 43 4f 4d 4d 41 28 58 29 20  A) ::= COMMA(X) 
2960: 63 6f 6e 73 6c 69 73 74 2e 20 20 7b 41 20 3d 20  conslist.  {A = 
2970: 58 3b 7d 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d  X;}.conslist ::=
2980: 20 63 6f 6e 73 6c 69 73 74 20 43 4f 4d 4d 41 20   conslist COMMA 
2990: 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20  tcons..conslist 
29a0: 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 74 63 6f  ::= conslist tco
29b0: 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d  ns..conslist ::=
29c0: 20 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73 20 3a 3a   tcons..tcons ::
29d0: 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 2e  = CONSTRAINT nm.
29e0: 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41  .tcons ::= PRIMA
29f0: 52 59 20 4b 45 59 20 4c 50 20 69 64 78 6c 69 73  RY KEY LP idxlis
2a00: 74 28 58 29 20 61 75 74 6f 69 6e 63 28 49 29 20  t(X) autoinc(I) 
2a10: 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20  RP onconf(R)..  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41         {sqlite3A
2a50: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61  ddPrimaryKey(pPa
2a60: 72 73 65 2c 58 2c 52 2c 49 2c 30 29 3b 7d 0a 74  rse,X,R,I,0);}.t
2a70: 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20  cons ::= UNIQUE 
2a80: 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52 50  LP idxlist(X) RP
2a90: 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20   onconf(R)..    
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
2ac0: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
2ad0: 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 58 2c  (pParse,0,0,0,X,
2ae0: 52 2c 30 2c 30 2c 30 2c 30 29 3b 7d 0a 74 63 6f  R,0,0,0,0);}.tco
2af0: 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20  ns ::= CHECK LP 
2b00: 65 78 70 72 28 45 29 20 52 50 20 6f 6e 63 6f 6e  expr(E) RP oncon
2b10: 66 2e 20 7b 73 71 6c 69 74 65 33 41 64 64 43 68  f. {sqlite3AddCh
2b20: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  eckConstraint(pP
2b30: 61 72 73 65 2c 45 29 3b 7d 0a 74 63 6f 6e 73 20  arse,E);}.tcons 
2b40: 3a 3a 3d 20 46 4f 52 45 49 47 4e 20 4b 45 59 20  ::= FOREIGN KEY 
2b50: 4c 50 20 69 64 78 6c 69 73 74 28 46 41 29 20 52  LP idxlist(FA) R
2b60: 50 0a 20 20 20 20 20 20 20 20 20 20 52 45 46 45  P.          REFE
2b70: 52 45 4e 43 45 53 20 6e 6d 28 54 29 20 69 64 78  RENCES nm(T) idx
2b80: 6c 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66  list_opt(TA) ref
2b90: 61 72 67 73 28 52 29 20 64 65 66 65 72 5f 73 75  args(R) defer_su
2ba0: 62 63 6c 61 75 73 65 5f 6f 70 74 28 44 29 2e 20  bclause_opt(D). 
2bb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
2bc0: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 70 50  ateForeignKey(pP
2bd0: 61 72 73 65 2c 20 46 41 2c 20 26 54 2c 20 54 41  arse, FA, &T, TA
2be0: 2c 20 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , R);.    sqlite
2bf0: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
2c00: 28 70 50 61 72 73 65 2c 20 44 29 3b 0a 7d 0a 25  (pParse, D);.}.%
2c10: 74 79 70 65 20 64 65 66 65 72 5f 73 75 62 63 6c  type defer_subcl
2c20: 61 75 73 65 5f 6f 70 74 20 7b 69 6e 74 7d 0a 64  ause_opt {int}.d
2c30: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f  efer_subclause_o
2c40: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2c60: 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72 5f 73 75  A = 0;}.defer_su
2c70: 62 63 6c 61 75 73 65 5f 6f 70 74 28 41 29 20 3a  bclause_opt(A) :
2c80: 3a 3d 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75  := defer_subclau
2c90: 73 65 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d  se(X).  {A = X;}
2ca0: 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ..// The followi
2cb0: 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74 61 6e  ng is a non-stan
2cc0: 64 61 72 64 20 65 78 74 65 6e 73 69 6f 6e 20 74  dard extension t
2cd0: 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f  hat allows us to
2ce0: 20 64 65 63 6c 61 72 65 20 74 68 65 0a 2f 2f 20   declare the.// 
2cf0: 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72  default behavior
2d00: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
2d10: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e 66   constraint conf
2d20: 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f  lict..//.%type o
2d30: 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 70  nconf {int}.%typ
2d40: 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25  e orconf {int}.%
2d50: 74 79 70 65 20 72 65 73 6f 6c 76 65 74 79 70 65  type resolvetype
2d60: 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28 41 29   {int}.onconf(A)
2d70: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44 65 66 61      {A = OE_Defa
2da0: 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20  ult;}.onconf(A) 
2db0: 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ::= ON CONFLICT 
2dc0: 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20  resolvetype(X). 
2dd0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f 72 63 6f     {A = X;}.orco
2de0: 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  nf(A) ::= .     
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
2e10: 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72 63 6f 6e  _Default;}.orcon
2e20: 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72 65 73 6f  f(A) ::= OR reso
2e30: 6c 76 65 74 79 70 65 28 58 29 2e 20 20 20 20 20  lvetype(X).     
2e40: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
2e50: 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20  .resolvetype(A) 
2e60: 3a 3a 3d 20 72 61 69 73 65 74 79 70 65 28 58 29  ::= raisetype(X)
2e70: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
2e80: 20 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76 65 74 79   = X;}.resolvety
2e90: 70 65 28 41 29 20 3a 3a 3d 20 49 47 4e 4f 52 45  pe(A) ::= IGNORE
2ea0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eb0: 20 20 20 20 7b 41 20 3d 20 4f 45 5f 49 67 6e 6f      {A = OE_Igno
2ec0: 72 65 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65  re;}.resolvetype
2ed0: 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e  (A) ::= REPLACE.
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63    {A = OE_Replac
2f00: 65 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  e;}..///////////
2f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
2f20: 54 68 65 20 44 52 4f 50 20 54 41 42 4c 45 20 2f  The DROP TABLE /
2f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f50: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
2f60: 44 52 4f 50 20 54 41 42 4c 45 20 69 66 65 78 69  DROP TABLE ifexi
2f70: 73 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28  sts(E) fullname(
2f80: 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44  X). {.  sqlite3D
2f90: 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
2fa0: 20 58 2c 20 30 2c 20 45 29 3b 0a 7d 0a 25 74 79   X, 0, E);.}.%ty
2fb0: 70 65 20 69 66 65 78 69 73 74 73 20 7b 69 6e 74  pe ifexists {int
2fc0: 7d 0a 69 66 65 78 69 73 74 73 28 41 29 20 3a 3a  }.ifexists(A) ::
2fd0: 3d 20 49 46 20 45 58 49 53 54 53 2e 20 20 20 7b  = IF EXISTS.   {
2fe0: 41 20 3d 20 31 3b 7d 0a 69 66 65 78 69 73 74 73  A = 1;}.ifexists
2ff0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
3000: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f       {A = 0;}../
3010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3020: 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20  //// The CREATE 
3030: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2f  VIEW statement /
3040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
3060: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
3070: 4d 49 54 5f 56 49 45 57 0a 63 6d 64 20 3a 3a 3d  MIT_VIEW.cmd ::=
3080: 20 43 52 45 41 54 45 28 58 29 20 74 65 6d 70 28   CREATE(X) temp(
3090: 54 29 20 56 49 45 57 20 6e 6d 28 59 29 20 64 62  T) VIEW nm(Y) db
30a0: 6e 6d 28 5a 29 20 41 53 20 73 65 6c 65 63 74 28  nm(Z) AS select(
30b0: 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 43  S). {.  sqlite3C
30c0: 72 65 61 74 65 56 69 65 77 28 70 50 61 72 73 65  reateView(pParse
30d0: 2c 20 26 58 2c 20 26 59 2c 20 26 5a 2c 20 53 2c  , &X, &Y, &Z, S,
30e0: 20 54 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44   T);.}.cmd ::= D
30f0: 52 4f 50 20 56 49 45 57 20 69 66 65 78 69 73 74  ROP VIEW ifexist
3100: 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29  s(E) fullname(X)
3110: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72 6f  . {.  sqlite3Dro
3120: 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 58  pTable(pParse, X
3130: 2c 20 31 2c 20 45 29 3b 0a 7d 0a 25 65 6e 64 69  , 1, E);.}.%endi
3140: 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f // SQLITE_OMIT
3150: 5f 56 49 45 57 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  _VIEW../////////
3160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
3170: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
3180: 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ment ///////////
3190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
31a0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
31b0: 3d 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b 0a  = select(X).  {.
31c0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
31d0: 70 50 61 72 73 65 2c 20 58 2c 20 53 52 54 5f 43  pParse, X, SRT_C
31e0: 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c 20 30  allback, 0, 0, 0
31f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
3200: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 58  e3SelectDelete(X
3210: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73 65 6c 65  );.}..%type sele
3220: 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65  ct {Select*}.%de
3230: 73 74 72 75 63 74 6f 72 20 73 65 6c 65 63 74 20  structor select 
3240: 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65  {sqlite3SelectDe
3250: 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65  lete($$);}.%type
3260: 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65 6c 65   oneselect {Sele
3270: 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  ct*}.%destructor
3280: 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71 6c 69   oneselect {sqli
3290: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
32a0: 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74 28 41 29  $$);}..select(A)
32b0: 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28 58   ::= oneselect(X
32c0: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
32d0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
32e0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
32f0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
3300: 4c 45 43 54 0a 73 65 6c 65 63 74 28 41 29 20 3a  LECT.select(A) :
3310: 3a 3d 20 73 65 6c 65 63 74 28 58 29 20 6d 75 6c  := select(X) mul
3320: 74 69 73 65 6c 65 63 74 5f 6f 70 28 59 29 20 6f  tiselect_op(Y) o
3330: 6e 65 73 65 6c 65 63 74 28 5a 29 2e 20 20 7b 0a  neselect(Z).  {.
3340: 20 20 69 66 28 20 5a 20 29 7b 0a 20 20 20 20 5a    if( Z ){.    Z
3350: 2d 3e 6f 70 20 3d 20 59 3b 0a 20 20 20 20 5a 2d  ->op = Y;.    Z-
3360: 3e 70 50 72 69 6f 72 20 3d 20 58 3b 0a 20 20 7d  >pPrior = X;.  }
3370: 0a 20 20 41 20 3d 20 5a 3b 0a 7d 0a 25 74 79 70  .  A = Z;.}.%typ
3380: 65 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70  e multiselect_op
3390: 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65   {int}.multisele
33a0: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49  ct_op(A) ::= UNI
33b0: 4f 4e 28 4f 50 29 2e 20 20 20 20 20 20 20 20 20  ON(OP).         
33c0: 20 20 20 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a 6d      {A = @OP;}.m
33d0: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29  ultiselect_op(A)
33e0: 20 3a 3a 3d 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20   ::= UNION ALL. 
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3400: 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73   TK_ALL;}.multis
3410: 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20  elect_op(A) ::= 
3420: 45 58 43 45 50 54 7c 49 4e 54 45 52 53 45 43 54  EXCEPT|INTERSECT
3430: 28 4f 50 29 2e 20 20 7b 41 20 3d 20 40 4f 50 3b  (OP).  {A = @OP;
3440: 7d 0a 25 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49  }.%endif // SQLI
3450: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
3460: 5f 53 45 4c 45 43 54 0a 6f 6e 65 73 65 6c 65 63  _SELECT.oneselec
3470: 74 28 41 29 20 3a 3a 3d 20 53 45 4c 45 43 54 20  t(A) ::= SELECT 
3480: 64 69 73 74 69 6e 63 74 28 44 29 20 73 65 6c 63  distinct(D) selc
3490: 6f 6c 6c 69 73 74 28 57 29 20 66 72 6f 6d 28 58  ollist(W) from(X
34a0: 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29 0a 20  ) where_opt(Y). 
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 67 72 6f 75 70 62 79 5f 6f 70 74 28 50 29 20 68  groupby_opt(P) h
34d0: 61 76 69 6e 67 5f 6f 70 74 28 51 29 20 6f 72 64  aving_opt(Q) ord
34e0: 65 72 62 79 5f 6f 70 74 28 5a 29 20 6c 69 6d 69  erby_opt(Z) limi
34f0: 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 41 20  t_opt(L). {.  A 
3500: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
3510: 65 77 28 57 2c 58 2c 59 2c 50 2c 51 2c 5a 2c 44  ew(W,X,Y,P,Q,Z,D
3520: 2c 4c 2e 70 4c 69 6d 69 74 2c 4c 2e 70 4f 66 66  ,L.pLimit,L.pOff
3530: 73 65 74 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20  set);.}..// The 
3540: 22 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e 74 65  "distinct" nonte
3550: 72 6d 69 6e 61 6c 20 69 73 20 74 72 75 65 20 28  rminal is true (
3560: 31 29 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  1) if the DISTIN
3570: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 0a 2f 2f  CT keyword is.//
3580: 20 70 72 65 73 65 6e 74 20 61 6e 64 20 66 61 6c   present and fal
3590: 73 65 20 28 30 29 20 69 66 20 69 74 20 69 73 20  se (0) if it is 
35a0: 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 64 69  not..//.%type di
35b0: 73 74 69 6e 63 74 20 7b 69 6e 74 7d 0a 64 69 73  stinct {int}.dis
35c0: 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44 49 53  tinct(A) ::= DIS
35d0: 54 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20 31 3b  TINCT.   {A = 1;
35e0: 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a  }.distinct(A) ::
35f0: 3d 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41  = ALL.        {A
3600: 20 3d 20 30 3b 7d 0a 64 69 73 74 69 6e 63 74 28   = 0;}.distinct(
3610: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
3620: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20     {A = 0;}..// 
3630: 73 65 6c 63 6f 6c 6c 69 73 74 20 69 73 20 61 20  selcollist is a 
3640: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
3650: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 74 6f 20  ons that are to 
3660: 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
3670: 6e 0a 2f 2f 20 76 61 6c 75 65 73 20 6f 66 20 74  n.// values of t
3680: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3690: 65 6e 74 2e 20 20 54 68 65 20 22 2a 22 20 69 6e  ent.  The "*" in
36a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
36b0: 0a 2f 2f 20 22 53 45 4c 45 43 54 20 2a 20 46 52  .// "SELECT * FR
36c0: 4f 4d 20 2e 2e 2e 22 20 69 73 20 65 6e 63 6f 64  OM ..." is encod
36d0: 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  ed as a special 
36e0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
36f0: 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f 66 20  an.// opcode of 
3700: 54 4b 5f 41 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65  TK_ALL..//.%type
3710: 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 45 78 70   selcollist {Exp
3720: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
3730: 74 6f 72 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b  tor selcollist {
3740: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3750: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70  elete($$);}.%typ
3760: 65 20 73 63 6c 70 20 7b 45 78 70 72 4c 69 73 74  e sclp {ExprList
3770: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
3780: 63 6c 70 20 7b 73 71 6c 69 74 65 33 45 78 70 72  clp {sqlite3Expr
3790: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
37a0: 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c  .sclp(A) ::= sel
37b0: 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  collist(X) COMMA
37c0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
37d0: 20 3d 20 58 3b 7d 0a 73 63 6c 70 28 41 29 20 3a   = X;}.sclp(A) :
37e0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c      {A = 0;}.sel
3810: 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  collist(A) ::= s
3820: 63 6c 70 28 50 29 20 65 78 70 72 28 58 29 20 61  clp(P) expr(X) a
3830: 73 28 59 29 2e 20 20 20 20 20 7b 0a 20 20 20 41  s(Y).     {.   A
3840: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
3850: 73 74 41 70 70 65 6e 64 28 50 2c 58 2c 59 2e 6e  stAppend(P,X,Y.n
3860: 3f 26 59 3a 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c  ?&Y:0);.}.selcol
3870: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70  list(A) ::= sclp
3880: 28 50 29 20 53 54 41 52 2e 20 7b 0a 20 20 41 20  (P) STAR. {.  A 
3890: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
38a0: 74 41 70 70 65 6e 64 28 50 2c 20 73 71 6c 69 74  tAppend(P, sqlit
38b0: 65 33 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30  e3Expr(TK_ALL, 0
38c0: 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 73  , 0, 0), 0);.}.s
38d0: 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d  elcollist(A) ::=
38e0: 20 73 63 6c 70 28 50 29 20 6e 6d 28 58 29 20 44   sclp(P) nm(X) D
38f0: 4f 54 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70  OT STAR. {.  Exp
3900: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
3910: 74 65 33 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20  te3Expr(TK_ALL, 
3920: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 45 78 70 72  0, 0, 0);.  Expr
3930: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
3940: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
3950: 30 2c 20 26 58 29 3b 0a 20 20 41 20 3d 20 73 71  0, &X);.  A = sq
3960: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
3970: 65 6e 64 28 50 2c 20 73 71 6c 69 74 65 33 45 78  end(P, sqlite3Ex
3980: 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  pr(TK_DOT, pLeft
3990: 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29  , pRight, 0), 0)
39a0: 3b 0a 7d 0a 0a 2f 2f 20 41 6e 20 6f 70 74 69 6f  ;.}..// An optio
39b0: 6e 20 22 41 53 20 3c 69 64 3e 22 20 70 68 72 61  n "AS <id>" phra
39c0: 73 65 20 74 68 61 74 20 63 61 6e 20 66 6f 6c 6c  se that can foll
39d0: 6f 77 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 78  ow one of the ex
39e0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 0a 2f  pressions that./
39f0: 2f 20 64 65 66 69 6e 65 20 74 68 65 20 72 65 73  / define the res
3a00: 75 6c 74 20 73 65 74 2c 20 6f 72 20 6f 6e 65 20  ult set, or one 
3a10: 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
3a20: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3a30: 2e 0a 2f 2f 0a 25 74 79 70 65 20 61 73 20 7b 54  ..//.%type as {T
3a40: 6f 6b 65 6e 7d 0a 61 73 28 58 29 20 3a 3a 3d 20  oken}.as(X) ::= 
3a50: 41 53 20 6e 6d 28 59 29 2e 20 20 20 20 7b 58 20  AS nm(Y).    {X 
3a60: 3d 20 59 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20  = Y;}.as(X) ::= 
3a70: 69 64 73 28 59 29 2e 20 20 20 20 20 20 7b 58 20  ids(Y).      {X 
3a80: 3d 20 59 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20  = Y;}.as(X) ::= 
3a90: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 2e  .            {X.
3aa0: 6e 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20  n = 0;}...%type 
3ab0: 73 65 6c 74 61 62 6c 69 73 74 20 7b 53 72 63 4c  seltablist {SrcL
3ac0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
3ad0: 72 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 73 71  r seltablist {sq
3ae0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
3af0: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73  te($$);}.%type s
3b00: 74 6c 5f 70 72 65 66 69 78 20 7b 53 72 63 4c 69  tl_prefix {SrcLi
3b10: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
3b20: 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 73 71 6c   stl_prefix {sql
3b30: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
3b40: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 66 72  e($$);}.%type fr
3b50: 6f 6d 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  om {SrcList*}.%d
3b60: 65 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b  estructor from {
3b70: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
3b80: 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f 20 41  lete($$);}..// A
3b90: 20 63 6f 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63   complete FROM c
3ba0: 6c 61 75 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41  lause..//.from(A
3bb0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bd0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
3be0: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
3bf0: 28 2a 41 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20  (*A));}.from(A) 
3c00: 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c  ::= FROM seltabl
3c10: 69 73 74 28 58 29 2e 20 20 20 20 20 20 20 20 20  ist(X).         
3c20: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a        {A = X;}..
3c30: 2f 2f 20 22 73 65 6c 74 61 62 6c 69 73 74 22 20  // "seltablist" 
3c40: 69 73 20 61 20 22 53 65 6c 65 63 74 20 54 61 62  is a "Select Tab
3c50: 6c 65 20 4c 69 73 74 22 20 2d 20 74 68 65 20 63  le List" - the c
3c60: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 46 52  ontent of the FR
3c70: 4f 4d 20 63 6c 61 75 73 65 0a 2f 2f 20 69 6e 20  OM clause.// in 
3c80: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
3c90: 6e 74 2e 20 20 22 73 74 6c 5f 70 72 65 66 69 78  nt.  "stl_prefix
3ca0: 22 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  " is a prefix of
3cb0: 20 74 68 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a 73   this list..//.s
3cc0: 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a 3d  tl_prefix(A) ::=
3cd0: 20 73 65 6c 74 61 62 6c 69 73 74 28 58 29 20 6a   seltablist(X) j
3ce0: 6f 69 6e 6f 70 28 59 29 2e 20 20 20 20 7b 0a 20  oinop(Y).    {. 
3cf0: 20 20 41 20 3d 20 58 3b 0a 20 20 20 69 66 28 20    A = X;.   if( 
3d00: 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 30 20 29  A && A->nSrc>0 )
3d10: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d   A->a[A->nSrc-1]
3d20: 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 59 3b 0a 7d  .jointype = Y;.}
3d30: 0a 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a  .stl_prefix(A) :
3d40: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
3d60: 41 20 3d 20 30 3b 7d 0a 73 65 6c 74 61 62 6c 69  A = 0;}.seltabli
3d70: 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72  st(A) ::= stl_pr
3d80: 65 66 69 78 28 58 29 20 6e 6d 28 59 29 20 64 62  efix(X) nm(Y) db
3d90: 6e 6d 28 44 29 20 61 73 28 5a 29 20 6f 6e 5f 6f  nm(D) as(Z) on_o
3da0: 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28  pt(N) using_opt(
3db0: 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  U). {.  A = sqli
3dc0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
3dd0: 28 58 2c 26 59 2c 26 44 29 3b 0a 20 20 69 66 28  (X,&Y,&D);.  if(
3de0: 20 5a 2e 6e 20 29 20 73 71 6c 69 74 65 33 53 72   Z.n ) sqlite3Sr
3df0: 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 41 2c  cListAddAlias(A,
3e00: 26 5a 29 3b 0a 20 20 69 66 28 20 4e 20 29 7b 0a  &Z);.  if( N ){.
3e10: 20 20 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e      if( A && A->
3e20: 6e 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41  nSrc>1 ){ A->a[A
3e30: 2d 3e 6e 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d 20  ->nSrc-2].pOn = 
3e40: 4e 3b 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b 20  N; }.    else { 
3e50: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3e60: 65 28 4e 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  e(N); }.  }.  if
3e70: 28 20 55 20 29 7b 0a 20 20 20 20 69 66 28 20 41  ( U ){.    if( A
3e80: 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b   && A->nSrc>1 ){
3e90: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d   A->a[A->nSrc-2]
3ea0: 2e 70 55 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20  .pUsing = U; }. 
3eb0: 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65     else { sqlite
3ec0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 55 29  3IdListDelete(U)
3ed0: 3b 20 7d 0a 20 20 7d 0a 7d 0a 25 69 66 6e 64 65  ; }.  }.}.%ifnde
3ee0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
3ef0: 42 51 55 45 52 59 0a 20 20 73 65 6c 74 61 62 6c  BQUERY.  seltabl
3f00: 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70  ist(A) ::= stl_p
3f10: 72 65 66 69 78 28 58 29 20 4c 50 20 73 65 6c 74  refix(X) LP selt
3f20: 61 62 6c 69 73 74 5f 70 61 72 65 6e 28 53 29 20  ablist_paren(S) 
3f30: 52 50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RP.             
3f40: 20 20 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f         as(Z) on_
3f50: 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74  opt(N) using_opt
3f60: 28 55 29 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73  (U). {.    A = s
3f70: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
3f80: 65 6e 64 28 58 2c 30 2c 30 29 3b 0a 20 20 20 20  end(X,0,0);.    
3f90: 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e  A->a[A->nSrc-1].
3fa0: 70 53 65 6c 65 63 74 20 3d 20 53 3b 0a 20 20 20  pSelect = S;.   
3fb0: 20 69 66 28 20 5a 2e 6e 20 29 20 73 71 6c 69 74   if( Z.n ) sqlit
3fc0: 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
3fd0: 73 28 41 2c 26 5a 29 3b 0a 20 20 20 20 69 66 28  s(A,&Z);.    if(
3fe0: 20 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   N ){.      if( 
3ff0: 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29  A && A->nSrc>1 )
4000: 7b 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32  { A->a[A->nSrc-2
4010: 5d 2e 70 4f 6e 20 3d 20 4e 3b 20 7d 0a 20 20 20  ].pOn = N; }.   
4020: 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65     else { sqlite
4030: 33 45 78 70 72 44 65 6c 65 74 65 28 4e 29 3b 20  3ExprDelete(N); 
4040: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4050: 55 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 41  U ){.      if( A
4060: 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b   && A->nSrc>1 ){
4070: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d   A->a[A->nSrc-2]
4080: 2e 70 55 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20  .pUsing = U; }. 
4090: 20 20 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69       else { sqli
40a0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
40b0: 55 29 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a  U); }.    }.  }.
40c0: 20 20 0a 20 20 2f 2f 20 41 20 73 65 6c 74 61 62    .  // A seltab
40d0: 6c 69 73 74 5f 70 61 72 65 6e 20 6e 6f 6e 74 65  list_paren nonte
40e0: 72 6d 69 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  rminal represent
40f0: 73 20 61 6e 79 74 68 69 6e 67 20 69 6e 20 61 20  s anything in a 
4100: 46 52 4f 4d 20 74 68 61 74 0a 20 20 2f 2f 20 69  FROM that.  // i
4110: 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 73 69  s contained insi
4120: 64 65 20 70 61 72 65 6e 74 68 65 73 65 73 2e 20  de parentheses. 
4130: 20 54 68 69 73 20 63 61 6e 20 62 65 20 65 69 74   This can be eit
4140: 68 65 72 20 61 20 73 75 62 71 75 65 72 79 20 6f  her a subquery o
4150: 72 0a 20 20 2f 2f 20 61 20 67 72 6f 75 70 69 6e  r.  // a groupin
4160: 67 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20 73  g of table and s
4170: 75 62 71 75 65 72 69 65 73 2e 0a 20 20 2f 2f 0a  ubqueries..  //.
4180: 20 20 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69    %type seltabli
4190: 73 74 5f 70 61 72 65 6e 20 7b 53 65 6c 65 63 74  st_paren {Select
41a0: 2a 7d 0a 20 20 25 64 65 73 74 72 75 63 74 6f 72  *}.  %destructor
41b0: 20 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65   seltablist_pare
41c0: 6e 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74  n {sqlite3Select
41d0: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 20 20 73  Delete($$);}.  s
41e0: 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e 28  eltablist_paren(
41f0: 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 53 29  A) ::= select(S)
4200: 2e 20 20 20 20 20 20 7b 41 20 3d 20 53 3b 7d 0a  .      {A = S;}.
4210: 20 20 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72    seltablist_par
4220: 65 6e 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61 62  en(A) ::= seltab
4230: 6c 69 73 74 28 46 29 2e 20 20 7b 0a 20 20 20 20  list(F).  {.    
4240: 20 41 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65   A = sqlite3Sele
4250: 63 74 4e 65 77 28 30 2c 46 2c 30 2c 30 2c 30 2c  ctNew(0,F,0,0,0,
4260: 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 25 65  0,0,0,0);.  }.%e
4270: 6e 64 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f  ndif // SQLITE_O
4280: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a 25 74  MIT_SUBQUERY..%t
4290: 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65 6e 7d  ype dbnm {Token}
42a0: 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e 20 20  .dbnm(A) ::= .  
42b0: 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20          {A.z=0; 
42c0: 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41 29 20  A.n=0;}.dbnm(A) 
42d0: 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e 20 7b  ::= DOT nm(X). {
42e0: 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 66  A = X;}..%type f
42f0: 75 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69 73 74  ullname {SrcList
4300: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 66  *}.%destructor f
4310: 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74 65 33  ullname {sqlite3
4320: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24 24  SrcListDelete($$
4330: 29 3b 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20  );}.fullname(A) 
4340: 3a 3a 3d 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59  ::= nm(X) dbnm(Y
4350: 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33  ).  {A = sqlite3
4360: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  SrcListAppend(0,
4370: 26 58 2c 26 59 29 3b 7d 0a 0a 25 74 79 70 65 20  &X,&Y);}..%type 
4380: 6a 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79  joinop {int}.%ty
4390: 70 65 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d  pe joinop2 {int}
43a0: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43  .joinop(X) ::= C
43b0: 4f 4d 4d 41 7c 4a 4f 49 4e 2e 20 20 20 20 20 20  OMMA|JOIN.      
43c0: 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54          { X = JT
43d0: 5f 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70  _INNER; }.joinop
43e0: 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28  (X) ::= JOIN_KW(
43f0: 41 29 20 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20  A) JOIN.        
4400: 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33 4a 6f   { X = sqlite3Jo
4410: 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 41  inType(pParse,&A
4420: 2c 30 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f 70 28  ,0,0); }.joinop(
4430: 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41  X) ::= JOIN_KW(A
4440: 29 20 6e 6d 28 42 29 20 4a 4f 49 4e 2e 20 20 20  ) nm(B) JOIN.   
4450: 7b 20 58 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69  { X = sqlite3Joi
4460: 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 41 2c  nType(pParse,&A,
4470: 26 42 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f 70 28  &B,0); }.joinop(
4480: 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41  X) ::= JOIN_KW(A
4490: 29 20 6e 6d 28 42 29 20 6e 6d 28 43 29 20 4a 4f  ) nm(B) nm(C) JO
44a0: 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN..            
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44c0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d             { X =
44d0: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
44e0: 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c 26 43  (pParse,&A,&B,&C
44f0: 29 3b 20 7d 0a 0a 25 74 79 70 65 20 6f 6e 5f 6f  ); }..%type on_o
4500: 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pt {Expr*}.%dest
4510: 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74 20 7b 73  ructor on_opt {s
4520: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4530: 28 24 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29  ($$);}.on_opt(N)
4540: 20 3a 3a 3d 20 4f 4e 20 65 78 70 72 28 45 29 2e   ::= ON expr(E).
4550: 20 20 20 7b 4e 20 3d 20 45 3b 7d 0a 6f 6e 5f 6f     {N = E;}.on_o
4560: 70 74 28 4e 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(N) ::= .     
4570: 20 20 20 20 20 20 20 20 7b 4e 20 3d 20 30 3b 7d          {N = 0;}
4580: 0a 0a 25 74 79 70 65 20 75 73 69 6e 67 5f 6f 70  ..%type using_op
4590: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73  t {IdList*}.%des
45a0: 74 72 75 63 74 6f 72 20 75 73 69 6e 67 5f 6f 70  tructor using_op
45b0: 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t {sqlite3IdList
45c0: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 75 73 69  Delete($$);}.usi
45d0: 6e 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 55 53  ng_opt(U) ::= US
45e0: 49 4e 47 20 4c 50 20 69 6e 73 63 6f 6c 6c 69 73  ING LP inscollis
45f0: 74 28 4c 29 20 52 50 2e 20 20 7b 55 20 3d 20 4c  t(L) RP.  {U = L
4600: 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29 20  ;}.using_opt(U) 
4610: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
4620: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 55 20               {U 
4630: 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 6f 72  = 0;}...%type or
4640: 64 65 72 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c  derby_opt {ExprL
4650: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
4660: 72 20 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b 73  r orderby_opt {s
4670: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
4680: 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65  lete($$);}.%type
4690: 20 73 6f 72 74 6c 69 73 74 20 7b 45 78 70 72 4c   sortlist {ExprL
46a0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
46b0: 72 20 73 6f 72 74 6c 69 73 74 20 7b 73 71 6c 69  r sortlist {sqli
46c0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
46d0: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 6f  e($$);}.%type so
46e0: 72 74 69 74 65 6d 20 7b 45 78 70 72 2a 7d 0a 25  rtitem {Expr*}.%
46f0: 64 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74 69  destructor sorti
4700: 74 65 6d 20 7b 73 71 6c 69 74 65 33 45 78 70 72  tem {sqlite3Expr
4710: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 6f 72  Delete($$);}..or
4720: 64 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d  derby_opt(A) ::=
4730: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
4740: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
4750: 20 30 3b 7d 0a 6f 72 64 65 72 62 79 5f 6f 70 74   0;}.orderby_opt
4760: 28 41 29 20 3a 3a 3d 20 4f 52 44 45 52 20 42 59  (A) ::= ORDER BY
4770: 20 73 6f 72 74 6c 69 73 74 28 58 29 2e 20 20 20   sortlist(X).   
4780: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 6f 72 74     {A = X;}.sort
4790: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f 72 74  list(A) ::= sort
47a0: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 73 6f  list(X) COMMA so
47b0: 72 74 69 74 65 6d 28 59 29 20 63 6f 6c 6c 61 74  rtitem(Y) collat
47c0: 65 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28 5a  e(C) sortorder(Z
47d0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
47e0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
47f0: 28 58 2c 59 2c 43 2e 6e 3e 30 3f 26 43 3a 30 29  (X,Y,C.n>0?&C:0)
4800: 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61  ;.  if( A ) A->a
4810: 5b 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [A->nExpr-1].sor
4820: 74 4f 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a 73 6f  tOrder = Z;.}.so
4830: 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f  rtlist(A) ::= so
4840: 72 74 69 74 65 6d 28 59 29 20 63 6f 6c 6c 61 74  rtitem(Y) collat
4850: 65 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28 5a  e(C) sortorder(Z
4860: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
4870: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
4880: 28 30 2c 59 2c 43 2e 6e 3e 30 3f 26 43 3a 30 29  (0,Y,C.n>0?&C:0)
4890: 3b 0a 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e  ;.  if( A && A->
48a0: 61 20 29 20 41 2d 3e 61 5b 30 5d 2e 73 6f 72 74  a ) A->a[0].sort
48b0: 4f 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a 73 6f 72  Order = Z;.}.sor
48c0: 74 69 74 65 6d 28 41 29 20 3a 3a 3d 20 65 78 70  titem(A) ::= exp
48d0: 72 28 58 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d  r(X).   {A = X;}
48e0: 0a 0a 25 74 79 70 65 20 73 6f 72 74 6f 72 64 65  ..%type sortorde
48f0: 72 20 7b 69 6e 74 7d 0a 25 74 79 70 65 20 63 6f  r {int}.%type co
4900: 6c 6c 61 74 65 20 7b 54 6f 6b 65 6e 7d 0a 0a 73  llate {Token}..s
4910: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20  ortorder(A) ::= 
4920: 41 53 43 2e 20 20 20 20 20 20 20 20 20 20 20 7b  ASC.           {
4930: 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  A = SQLITE_SO_AS
4940: 43 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29  C;}.sortorder(A)
4950: 20 3a 3a 3d 20 44 45 53 43 2e 20 20 20 20 20 20   ::= DESC.      
4960: 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f      {A = SQLITE_
4970: 53 4f 5f 44 45 53 43 3b 7d 0a 73 6f 72 74 6f 72  SO_DESC;}.sortor
4980: 64 65 72 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  der(A) ::= .    
4990: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53            {A = S
49a0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 63  QLITE_SO_ASC;}.c
49b0: 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d 20 2e 20  ollate(C) ::= . 
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
49d0: 43 2e 7a 20 3d 20 30 3b 20 43 2e 6e 20 3d 20 30  C.z = 0; C.n = 0
49e0: 3b 7d 0a 63 6f 6c 6c 61 74 65 28 43 29 20 3a 3a  ;}.collate(C) ::
49f0: 3d 20 43 4f 4c 4c 41 54 45 20 69 64 28 58 29 2e  = COLLATE id(X).
4a00: 20 20 20 7b 43 20 3d 20 58 3b 7d 0a 0a 25 74 79     {C = X;}..%ty
4a10: 70 65 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b  pe groupby_opt {
4a20: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
4a30: 72 75 63 74 6f 72 20 67 72 6f 75 70 62 79 5f 6f  ructor groupby_o
4a40: 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  pt {sqlite3ExprL
4a50: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
4a60: 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a  groupby_opt(A) :
4a70: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
4a80: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
4a90: 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41  ;}.groupby_opt(A
4aa0: 29 20 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 65  ) ::= GROUP BY e
4ab0: 78 70 72 6c 69 73 74 28 58 29 2e 20 20 7b 41 20  xprlist(X).  {A 
4ac0: 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76  = X;}..%type hav
4ad0: 69 6e 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a  ing_opt {Expr*}.
4ae0: 25 64 65 73 74 72 75 63 74 6f 72 20 68 61 76 69  %destructor havi
4af0: 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  ng_opt {sqlite3E
4b00: 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  xprDelete($$);}.
4b10: 68 61 76 69 6e 67 5f 6f 70 74 28 41 29 20 3a 3a  having_opt(A) ::
4b20: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4b30: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 68 61 76 69     {A = 0;}.havi
4b40: 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 48 41  ng_opt(A) ::= HA
4b50: 56 49 4e 47 20 65 78 70 72 28 58 29 2e 20 20 7b  VING expr(X).  {
4b60: 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 6c  A = X;}..%type l
4b70: 69 6d 69 74 5f 6f 70 74 20 7b 73 74 72 75 63 74  imit_opt {struct
4b80: 20 4c 69 6d 69 74 56 61 6c 7d 0a 25 64 65 73 74   LimitVal}.%dest
4b90: 72 75 63 74 6f 72 20 6c 69 6d 69 74 5f 6f 70 74  ructor limit_opt
4ba0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   {.  sqlite3Expr
4bb0: 44 65 6c 65 74 65 28 24 24 2e 70 4c 69 6d 69 74  Delete($$.pLimit
4bc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
4bd0: 44 65 6c 65 74 65 28 24 24 2e 70 4f 66 66 73 65  Delete($$.pOffse
4be0: 74 29 3b 0a 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28  t);.}.limit_opt(
4bf0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e               {A.
4c10: 70 4c 69 6d 69 74 20 3d 20 30 3b 20 41 2e 70 4f  pLimit = 0; A.pO
4c20: 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69  ffset = 0;}.limi
4c30: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d  t_opt(A) ::= LIM
4c40: 49 54 20 65 78 70 72 28 58 29 2e 20 20 20 20 20  IT expr(X).     
4c50: 20 20 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20 58     {A.pLimit = X
4c60: 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 30 3b  ; A.pOffset = 0;
4c70: 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a  }.limit_opt(A) :
4c80: 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58 29  := LIMIT expr(X)
4c90: 20 4f 46 46 53 45 54 20 65 78 70 72 28 59 29 2e   OFFSET expr(Y).
4ca0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cc0: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d           {A.pLim
4cd0: 69 74 20 3d 20 58 3b 20 41 2e 70 4f 66 66 73 65  it = X; A.pOffse
4ce0: 74 20 3d 20 59 3b 7d 0a 6c 69 6d 69 74 5f 6f 70  t = Y;}.limit_op
4cf0: 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65  t(A) ::= LIMIT e
4d00: 78 70 72 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  xpr(X) COMMA exp
4d10: 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20  r(Y). .         
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
4d40: 2e 70 4f 66 66 73 65 74 20 3d 20 58 3b 20 41 2e  .pOffset = X; A.
4d50: 70 4c 69 6d 69 74 20 3d 20 59 3b 7d 0a 0a 2f 2f  pLimit = Y;}..//
4d60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4d70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 45  ///////// The DE
4d80: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2f  LETE statement /
4d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4da0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
4db0: 63 6d 64 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46  cmd ::= DELETE F
4dc0: 52 4f 4d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20  ROM fullname(X) 
4dd0: 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 20 7b 73  where_opt(Y). {s
4de0: 71 6c 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d  qlite3DeleteFrom
4df0: 28 70 50 61 72 73 65 2c 58 2c 59 29 3b 7d 0a 0a  (pParse,X,Y);}..
4e00: 25 74 79 70 65 20 77 68 65 72 65 5f 6f 70 74 20  %type where_opt 
4e10: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
4e20: 74 6f 72 20 77 68 65 72 65 5f 6f 70 74 20 7b 73  tor where_opt {s
4e30: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4e40: 28 24 24 29 3b 7d 0a 0a 77 68 65 72 65 5f 6f 70  ($$);}..where_op
4e50: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
4e70: 20 3d 20 30 3b 7d 0a 77 68 65 72 65 5f 6f 70 74   = 0;}.where_opt
4e80: 28 41 29 20 3a 3a 3d 20 57 48 45 52 45 20 65 78  (A) ::= WHERE ex
4e90: 70 72 28 58 29 2e 20 20 20 20 20 20 20 7b 41 20  pr(X).       {A 
4ea0: 3d 20 58 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  = X;}../////////
4eb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ec0: 2f 20 54 68 65 20 55 50 44 41 54 45 20 63 6f 6d  / The UPDATE com
4ed0: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
4ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ef0: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
4f00: 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52   UPDATE orconf(R
4f10: 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 53 45  ) fullname(X) SE
4f20: 54 20 73 65 74 6c 69 73 74 28 59 29 20 77 68 65  T setlist(Y) whe
4f30: 72 65 5f 6f 70 74 28 5a 29 2e 0a 20 20 20 20 7b  re_opt(Z)..    {
4f40: 73 71 6c 69 74 65 33 55 70 64 61 74 65 28 70 50  sqlite3Update(pP
4f50: 61 72 73 65 2c 58 2c 59 2c 5a 2c 52 29 3b 7d 0a  arse,X,Y,Z,R);}.
4f60: 0a 25 74 79 70 65 20 73 65 74 6c 69 73 74 20 7b  .%type setlist {
4f70: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
4f80: 72 75 63 74 6f 72 20 73 65 74 6c 69 73 74 20 7b  ructor setlist {
4f90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4fa0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 73 65 74  elete($$);}..set
4fb0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c  list(A) ::= setl
4fc0: 69 73 74 28 5a 29 20 43 4f 4d 4d 41 20 6e 6d 28  ist(Z) COMMA nm(
4fd0: 58 29 20 45 51 20 65 78 70 72 28 59 29 2e 0a 20  X) EQ expr(Y).. 
4fe0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
4ff0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 5a 2c  xprListAppend(Z,
5000: 59 2c 26 58 29 3b 7d 0a 73 65 74 6c 69 73 74 28  Y,&X);}.setlist(
5010: 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51 20  A) ::= nm(X) EQ 
5020: 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d 20  expr(Y).   {A = 
5030: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5040: 70 70 65 6e 64 28 30 2c 59 2c 26 58 29 3b 7d 0a  ppend(0,Y,&X);}.
5050: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
5060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
5070: 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20 2f  INSERT command /
5080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
50a0: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65  .//.cmd ::= inse
50b0: 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66  rt_cmd(R) INTO f
50c0: 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63 6f  ullname(X) insco
50d0: 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 0a 20 20  llist_opt(F) .  
50e0: 20 20 20 20 20 20 56 41 4c 55 45 53 20 4c 50 20        VALUES LP 
50f0: 69 74 65 6d 6c 69 73 74 28 59 29 20 52 50 2e 0a  itemlist(Y) RP..
5100: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
5110: 69 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73  ite3Insert(pPars
5120: 65 2c 20 58 2c 20 59 2c 20 30 2c 20 46 2c 20 52  e, X, Y, 0, F, R
5130: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65  );}.cmd ::= inse
5140: 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66  rt_cmd(R) INTO f
5150: 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63 6f  ullname(X) insco
5160: 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65 6c  llist_opt(F) sel
5170: 65 63 74 28 53 29 2e 0a 20 20 20 20 20 20 20 20  ect(S)..        
5180: 20 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73 65      {sqlite3Inse
5190: 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 30 2c  rt(pParse, X, 0,
51a0: 20 53 2c 20 46 2c 20 52 29 3b 7d 0a 0a 25 74 79   S, F, R);}..%ty
51b0: 70 65 20 69 6e 73 65 72 74 5f 63 6d 64 20 7b 69  pe insert_cmd {i
51c0: 6e 74 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41  nt}.insert_cmd(A
51d0: 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63  ) ::= INSERT orc
51e0: 6f 6e 66 28 52 29 2e 20 20 20 7b 41 20 3d 20 52  onf(R).   {A = R
51f0: 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29  ;}.insert_cmd(A)
5200: 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20   ::= REPLACE.   
5210: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
5220: 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 0a 25 74 79  _Replace;}...%ty
5230: 70 65 20 69 74 65 6d 6c 69 73 74 20 7b 45 78 70  pe itemlist {Exp
5240: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
5250: 74 6f 72 20 69 74 65 6d 6c 69 73 74 20 7b 73 71  tor itemlist {sq
5260: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
5270: 65 74 65 28 24 24 29 3b 7d 0a 0a 69 74 65 6d 6c  ete($$);}..iteml
5280: 69 73 74 28 41 29 20 3a 3a 3d 20 69 74 65 6d 6c  ist(A) ::= iteml
5290: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  ist(X) COMMA exp
52a0: 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69  r(Y).  {A = sqli
52b0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
52c0: 64 28 58 2c 59 2c 30 29 3b 7d 0a 69 74 65 6d 6c  d(X,Y,0);}.iteml
52d0: 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  ist(A) ::= expr(
52e0: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
52f0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
5300: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
5310: 64 28 30 2c 58 2c 30 29 3b 7d 0a 0a 25 74 79 70  d(0,X,0);}..%typ
5320: 65 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  e inscollist_opt
5330: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74   {IdList*}.%dest
5340: 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73  ructor inscollis
5350: 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 49 64  t_opt {sqlite3Id
5360: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
5370: 0a 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73  .%type inscollis
5380: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73  t {IdList*}.%des
5390: 74 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69  tructor inscolli
53a0: 73 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73  st {sqlite3IdLis
53b0: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69  tDelete($$);}..i
53c0: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29  nscollist_opt(A)
53d0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
53f0: 3d 20 30 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74  = 0;}.inscollist
5400: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69  _opt(A) ::= LP i
5410: 6e 73 63 6f 6c 6c 69 73 74 28 58 29 20 52 50 2e  nscollist(X) RP.
5420: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 73      {A = X;}.ins
5430: 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69  collist(A) ::= i
5440: 6e 73 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d  nscollist(X) COM
5450: 4d 41 20 6e 6d 28 59 29 2e 20 20 7b 41 20 3d 20  MA nm(Y).  {A = 
5460: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
5470: 65 6e 64 28 58 2c 26 59 29 3b 7d 0a 69 6e 73 63  end(X,&Y);}.insc
5480: 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d  ollist(A) ::= nm
5490: 28 59 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (Y).            
54a0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
54b0: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
54c0: 6e 64 28 30 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f  nd(0,&Y);}..////
54d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
54e0: 2f 2f 2f 2f 2f 2f 2f 20 45 78 70 72 65 73 73 69  /////// Expressi
54f0: 6f 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 2f 2f  on Processing //
5500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a  ///////////.//..
5520: 25 74 79 70 65 20 65 78 70 72 20 7b 45 78 70 72  %type expr {Expr
5530: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65  *}.%destructor e
5540: 78 70 72 20 7b 73 71 6c 69 74 65 33 45 78 70 72  xpr {sqlite3Expr
5550: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
5560: 70 65 20 74 65 72 6d 20 7b 45 78 70 72 2a 7d 0a  pe term {Expr*}.
5570: 25 64 65 73 74 72 75 63 74 6f 72 20 74 65 72 6d  %destructor term
5580: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
5590: 65 74 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72 28  ete($$);}..expr(
55a0: 41 29 20 3a 3a 3d 20 74 65 72 6d 28 58 29 2e 20  A) ::= term(X). 
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
55c0: 20 58 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d   X;}.expr(A) ::=
55d0: 20 4c 50 28 42 29 20 65 78 70 72 28 58 29 20 52   LP(B) expr(X) R
55e0: 50 28 45 29 2e 20 7b 41 20 3d 20 58 3b 20 73 71  P(E). {A = X; sq
55f0: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
5600: 26 42 2c 26 45 29 3b 20 7d 0a 74 65 72 6d 28 41  &B,&E); }.term(A
5610: 29 20 3a 3a 3d 20 4e 55 4c 4c 28 58 29 2e 20 20  ) ::= NULL(X).  
5620: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
5630: 73 71 6c 69 74 65 33 45 78 70 72 28 40 58 2c 20  sqlite3Expr(@X, 
5640: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72  0, 0, &X);}.expr
5650: 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20  (A) ::= ID(X).  
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
5670: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
5680: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d  _ID, 0, 0, &X);}
5690: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4a 4f 49  .expr(A) ::= JOI
56a0: 4e 5f 4b 57 28 58 29 2e 20 20 20 20 20 20 20 20  N_KW(X).        
56b0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
56c0: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
56d0: 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  &X);}.expr(A) ::
56e0: 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59  = nm(X) DOT nm(Y
56f0: 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d  ). {.  Expr *tem
5700: 70 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  p1 = sqlite3Expr
5710: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58  (TK_ID, 0, 0, &X
5720: 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32  );.  Expr *temp2
5730: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
5740: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 59 29 3b  K_ID, 0, 0, &Y);
5750: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
5760: 70 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31  pr(TK_DOT, temp1
5770: 2c 20 74 65 6d 70 32 2c 20 30 29 3b 0a 7d 0a 65  , temp2, 0);.}.e
5780: 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29  xpr(A) ::= nm(X)
5790: 20 44 4f 54 20 6e 6d 28 59 29 20 44 4f 54 20 6e   DOT nm(Y) DOT n
57a0: 6d 28 5a 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a  m(Z). {.  Expr *
57b0: 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 45  temp1 = sqlite3E
57c0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
57d0: 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74 65   &X);.  Expr *te
57e0: 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mp2 = sqlite3Exp
57f0: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  r(TK_ID, 0, 0, &
5800: 59 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70  Y);.  Expr *temp
5810: 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  3 = sqlite3Expr(
5820: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 5a 29  TK_ID, 0, 0, &Z)
5830: 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 34 20  ;.  Expr *temp4 
5840: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
5850: 5f 44 4f 54 2c 20 74 65 6d 70 32 2c 20 74 65 6d  _DOT, temp2, tem
5860: 70 33 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71  p3, 0);.  A = sq
5870: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54  lite3Expr(TK_DOT
5880: 2c 20 74 65 6d 70 31 2c 20 74 65 6d 70 34 2c 20  , temp1, temp4, 
5890: 30 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a  0);.}.term(A) ::
58a0: 3d 20 49 4e 54 45 47 45 52 7c 46 4c 4f 41 54 7c  = INTEGER|FLOAT|
58b0: 42 4c 4f 42 28 58 29 2e 20 20 20 20 20 20 7b 41  BLOB(X).      {A
58c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40   = sqlite3Expr(@
58d0: 58 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 74  X, 0, 0, &X);}.t
58e0: 65 72 6d 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e  erm(A) ::= STRIN
58f0: 47 28 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d  G(X).       {A =
5900: 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 58 2c   sqlite3Expr(@X,
5910: 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70   0, 0, &X);}.exp
5920: 72 28 41 29 20 3a 3a 3d 20 52 45 47 49 53 54 45  r(A) ::= REGISTE
5930: 52 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 73  R(X).     {A = s
5940: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78  qlite3RegisterEx
5950: 70 72 28 70 50 61 72 73 65 2c 20 26 58 29 3b 7d  pr(pParse, &X);}
5960: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 56 41 52  .expr(A) ::= VAR
5970: 49 41 42 4c 45 28 58 29 2e 20 20 20 20 20 7b 0a  IABLE(X).     {.
5980: 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20    Token *pToken 
5990: 3d 20 26 58 3b 0a 20 20 45 78 70 72 20 2a 70 45  = &X;.  Expr *pE
59a0: 78 70 72 20 3d 20 41 20 3d 20 73 71 6c 69 74 65  xpr = A = sqlite
59b0: 33 45 78 70 72 28 54 4b 5f 56 41 52 49 41 42 4c  3Expr(TK_VARIABL
59c0: 45 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29  E, 0, 0, pToken)
59d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41  ;.  sqlite3ExprA
59e0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 70  ssignVarNumber(p
59f0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 7d  Parse, pExpr);.}
5a00: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
5a10: 4f 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28 41  OMIT_CAST.expr(A
5a20: 29 20 3a 3a 3d 20 43 41 53 54 28 58 29 20 4c 50  ) ::= CAST(X) LP
5a30: 20 65 78 70 72 28 45 29 20 41 53 20 74 79 70 65   expr(E) AS type
5a40: 74 6f 6b 65 6e 28 54 29 20 52 50 28 59 29 2e 20  token(T) RP(Y). 
5a50: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
5a60: 78 70 72 28 54 4b 5f 43 41 53 54 2c 20 45 2c 20  xpr(TK_CAST, E, 
5a70: 30 2c 20 26 54 29 3b 0a 20 20 73 71 6c 69 74 65  0, &T);.  sqlite
5a80: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26  3ExprSpan(A,&X,&
5a90: 59 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 2f 2f 20  Y);.}.%endif // 
5aa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
5ab0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 44 28  .expr(A) ::= ID(
5ac0: 58 29 20 4c 50 20 64 69 73 74 69 6e 63 74 28 44  X) LP distinct(D
5ad0: 29 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50  ) exprlist(Y) RP
5ae0: 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (E). {.  A = sql
5af0: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
5b00: 28 59 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74  (Y, &X);.  sqlit
5b10: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c  e3ExprSpan(A,&X,
5b20: 26 45 29 3b 0a 20 20 69 66 28 20 44 20 29 7b 0a  &E);.  if( D ){.
5b30: 20 20 20 20 41 2d 3e 66 6c 61 67 73 20 7c 3d 20      A->flags |= 
5b40: 45 50 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d  EP_Distinct;.  }
5b50: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49  .}.expr(A) ::= I
5b60: 44 28 58 29 20 4c 50 20 53 54 41 52 20 52 50 28  D(X) LP STAR RP(
5b70: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  E). {.  A = sqli
5b80: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
5b90: 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74 65  0, &X);.  sqlite
5ba0: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26  3ExprSpan(A,&X,&
5bb0: 45 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a  E);.}.term(A) ::
5bc0: 3d 20 43 54 49 4d 45 5f 4b 57 28 4f 50 29 2e 20  = CTIME_KW(OP). 
5bd0: 7b 0a 20 20 2f 2a 20 54 68 65 20 43 55 52 52 45  {.  /* The CURRE
5be0: 4e 54 5f 54 49 4d 45 2c 20 43 55 52 52 45 4e 54  NT_TIME, CURRENT
5bf0: 5f 44 41 54 45 2c 20 61 6e 64 20 43 55 52 52 45  _DATE, and CURRE
5c00: 4e 54 5f 54 49 4d 45 53 54 41 4d 50 20 76 61 6c  NT_TIMESTAMP val
5c10: 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 74 72 65  ues are.  ** tre
5c20: 61 74 65 64 20 61 73 20 66 75 6e 63 74 69 6f 6e  ated as function
5c30: 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 63 6f  s that return co
5c40: 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 41 20 3d  nstants */.  A =
5c50: 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63   sqlite3ExprFunc
5c60: 74 69 6f 6e 28 30 2c 26 4f 50 29 3b 0a 20 20 69  tion(0,&OP);.  i
5c70: 66 28 20 41 20 29 20 41 2d 3e 6f 70 20 3d 20 54  f( A ) A->op = T
5c80: 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3b 20 20 0a  K_CONST_FUNC;  .
5c90: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5ca0: 70 72 28 58 29 20 41 4e 44 28 4f 50 29 20 65 78  pr(X) AND(OP) ex
5cb0: 70 72 28 59 29 2e 20 20 20 20 20 20 20 20 20 20  pr(Y).          
5cc0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
5cd0: 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29  pr(@OP, X, Y, 0)
5ce0: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
5cf0: 78 70 72 28 58 29 20 4f 52 28 4f 50 29 20 65 78  xpr(X) OR(OP) ex
5d00: 70 72 28 59 29 2e 20 20 20 20 20 20 20 20 20 20  pr(Y).          
5d10: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
5d20: 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30  xpr(@OP, X, Y, 0
5d30: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
5d40: 65 78 70 72 28 58 29 20 4c 54 7c 47 54 7c 47 45  expr(X) LT|GT|GE
5d50: 7c 4c 45 28 4f 50 29 20 65 78 70 72 28 59 29 2e  |LE(OP) expr(Y).
5d60: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
5d70: 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20  Expr(@OP, X, Y, 
5d80: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
5d90: 20 65 78 70 72 28 58 29 20 45 51 7c 4e 45 28 4f   expr(X) EQ|NE(O
5da0: 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 20  P) expr(Y).     
5db0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5dc0: 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c  3Expr(@OP, X, Y,
5dd0: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
5de0: 3d 20 65 78 70 72 28 58 29 20 42 49 54 41 4e 44  = expr(X) BITAND
5df0: 7c 42 49 54 4f 52 7c 4c 53 48 49 46 54 7c 52 53  |BITOR|LSHIFT|RS
5e00: 48 49 46 54 28 4f 50 29 20 65 78 70 72 28 59 29  HIFT(OP) expr(Y)
5e10: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
5e50: 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29  pr(@OP, X, Y, 0)
5e60: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
5e70: 78 70 72 28 58 29 20 50 4c 55 53 7c 4d 49 4e 55  xpr(X) PLUS|MINU
5e80: 53 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  S(OP) expr(Y).  
5e90: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
5ea0: 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30  xpr(@OP, X, Y, 0
5eb0: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
5ec0: 65 78 70 72 28 58 29 20 53 54 41 52 7c 53 4c 41  expr(X) STAR|SLA
5ed0: 53 48 7c 52 45 4d 28 4f 50 29 20 65 78 70 72 28  SH|REM(OP) expr(
5ee0: 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 33  Y). {A = sqlite3
5ef0: 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20  Expr(@OP, X, Y, 
5f00: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
5f10: 20 65 78 70 72 28 58 29 20 43 4f 4e 43 41 54 28   expr(X) CONCAT(
5f20: 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 20  OP) expr(Y).    
5f30: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5f40: 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c  3Expr(@OP, X, Y,
5f50: 20 30 29 3b 7d 0a 25 74 79 70 65 20 6c 69 6b 65   0);}.%type like
5f60: 6f 70 20 7b 73 74 72 75 63 74 20 4c 69 6b 65 4f  op {struct LikeO
5f70: 70 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d  p}.likeop(A) ::=
5f80: 20 4c 49 4b 45 5f 4b 57 28 58 29 2e 20 20 20 20   LIKE_KW(X).    
5f90: 20 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20   {A.eOperator = 
5fa0: 58 3b 20 41 2e 6e 6f 74 20 3d 20 30 3b 7d 0a 6c  X; A.not = 0;}.l
5fb0: 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54  ikeop(A) ::= NOT
5fc0: 20 4c 49 4b 45 5f 4b 57 28 58 29 2e 20 7b 41 2e   LIKE_KW(X). {A.
5fd0: 65 4f 70 65 72 61 74 6f 72 20 3d 20 58 3b 20 41  eOperator = X; A
5fe0: 2e 6e 6f 74 20 3d 20 31 3b 7d 0a 25 74 79 70 65  .not = 1;}.%type
5ff0: 20 65 73 63 61 70 65 20 7b 45 78 70 72 2a 7d 0a   escape {Expr*}.
6000: 25 64 65 73 74 72 75 63 74 6f 72 20 65 73 63 61  %destructor esca
6010: 70 65 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44  pe {sqlite3ExprD
6020: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 65 73 63 61  elete($$);}.esca
6030: 70 65 28 58 29 20 3a 3a 3d 20 45 53 43 41 50 45  pe(X) ::= ESCAPE
6040: 20 65 78 70 72 28 41 29 2e 20 5b 45 53 43 41 50   expr(A). [ESCAP
6050: 45 5d 20 7b 58 20 3d 20 41 3b 7d 0a 65 73 63 61  E] {X = A;}.esca
6060: 70 65 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pe(X) ::= .     
6070: 20 20 20 20 20 20 20 20 20 20 5b 45 53 43 41 50            [ESCAP
6080: 45 5d 20 7b 58 20 3d 20 30 3b 7d 0a 65 78 70 72  E] {X = 0;}.expr
6090: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
60a0: 6c 69 6b 65 6f 70 28 4f 50 29 20 65 78 70 72 28  likeop(OP) expr(
60b0: 59 29 20 65 73 63 61 70 65 28 45 29 2e 20 20 5b  Y) escape(E).  [
60c0: 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20 20 45 78  LIKE_KW]  {.  Ex
60d0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
60e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
60f0: 70 70 65 6e 64 28 30 2c 20 59 2c 20 30 29 3b 0a  ppend(0, Y, 0);.
6100: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
6110: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6120: 70 4c 69 73 74 2c 20 58 2c 20 30 29 3b 0a 20 20  pList, X, 0);.  
6130: 69 66 28 20 45 20 29 7b 0a 20 20 20 20 70 4c 69  if( E ){.    pLi
6140: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6150: 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74  ListAppend(pList
6160: 2c 20 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 41  , E, 0);.  }.  A
6170: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75   = sqlite3ExprFu
6180: 6e 63 74 69 6f 6e 28 70 4c 69 73 74 2c 20 26 4f  nction(pList, &O
6190: 50 2e 65 4f 70 65 72 61 74 6f 72 29 3b 0a 20 20  P.eOperator);.  
61a0: 69 66 28 20 4f 50 2e 6e 6f 74 20 29 20 41 20 3d  if( OP.not ) A =
61b0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
61c0: 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20  NOT, A, 0, 0);. 
61d0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
61e0: 28 41 2c 20 26 58 2d 3e 73 70 61 6e 2c 20 26 59  (A, &X->span, &Y
61f0: 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 0a 65 78 70 72  ->span);.}..expr
6200: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
6210: 49 53 4e 55 4c 4c 7c 4e 4f 54 4e 55 4c 4c 28 45  ISNULL|NOTNULL(E
6220: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
6230: 65 33 45 78 70 72 28 40 45 2c 20 58 2c 20 30 2c  e3Expr(@E, X, 0,
6240: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78   0);.  sqlite3Ex
6250: 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61  prSpan(A,&X->spa
6260: 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29  n,&E);.}.expr(A)
6270: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 53 20   ::= expr(X) IS 
6280: 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d  NULL(E). {.  A =
6290: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
62a0: 49 53 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29  ISNULL, X, 0, 0)
62b0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
62c0: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26  pan(A,&X->span,&
62d0: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
62e0: 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20 4e 55  = expr(X) NOT NU
62f0: 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  LL(E). {.  A = s
6300: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f  qlite3Expr(TK_NO
6310: 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b  TNULL, X, 0, 0);
6320: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  .  sqlite3ExprSp
6330: 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45  an(A,&X->span,&E
6340: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
6350: 20 65 78 70 72 28 58 29 20 49 53 20 4e 4f 54 20   expr(X) IS NOT 
6360: 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d  NULL(E). {.  A =
6370: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
6380: 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30  NOTNULL, X, 0, 0
6390: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
63a0: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
63b0: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
63c0: 3a 3d 20 4e 4f 54 7c 42 49 54 4e 4f 54 28 42 29  := NOT|BITNOT(B)
63d0: 20 65 78 70 72 28 58 29 2e 20 7b 0a 20 20 41 20   expr(X). {.  A 
63e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 42  = sqlite3Expr(@B
63f0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
6400: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
6410: 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a  &B,&X->span);.}.
6420: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55  expr(A) ::= MINU
6430: 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b 55  S(B) expr(X). [U
6440: 4d 49 4e 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73  MINUS] {.  A = s
6450: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 55 4d  qlite3Expr(TK_UM
6460: 49 4e 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  INUS, X, 0, 0);.
6470: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
6480: 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29  n(A,&B,&X->span)
6490: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
64a0: 50 4c 55 53 28 42 29 20 65 78 70 72 28 58 29 2e  PLUS(B) expr(X).
64b0: 20 5b 55 50 4c 55 53 5d 20 7b 0a 20 20 41 20 3d   [UPLUS] {.  A =
64c0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
64d0: 55 50 4c 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b  UPLUS, X, 0, 0);
64e0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  .  sqlite3ExprSp
64f0: 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e  an(A,&B,&X->span
6500: 29 3b 0a 7d 0a 25 74 79 70 65 20 62 65 74 77 65  );.}.%type betwe
6510: 65 6e 5f 6f 70 20 7b 69 6e 74 7d 0a 62 65 74 77  en_op {int}.betw
6520: 65 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 42 45  een_op(A) ::= BE
6530: 54 57 45 45 4e 2e 20 20 20 20 20 7b 41 20 3d 20  TWEEN.     {A = 
6540: 30 3b 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41  0;}.between_op(A
6550: 29 20 3a 3a 3d 20 4e 4f 54 20 42 45 54 57 45 45  ) ::= NOT BETWEE
6560: 4e 2e 20 7b 41 20 3d 20 31 3b 7d 0a 65 78 70 72  N. {A = 1;}.expr
6570: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 57 29 20  (A) ::= expr(W) 
6580: 62 65 74 77 65 65 6e 5f 6f 70 28 4e 29 20 65 78  between_op(N) ex
6590: 70 72 28 58 29 20 41 4e 44 20 65 78 70 72 28 59  pr(X) AND expr(Y
65a0: 29 2e 20 5b 42 45 54 57 45 45 4e 5d 20 7b 0a 20  ). [BETWEEN] {. 
65b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
65c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
65d0: 73 74 41 70 70 65 6e 64 28 30 2c 20 58 2c 20 30  stAppend(0, X, 0
65e0: 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
65f0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6600: 6e 64 28 70 4c 69 73 74 2c 20 59 2c 20 30 29 3b  nd(pList, Y, 0);
6610: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
6620: 70 72 28 54 4b 5f 42 45 54 57 45 45 4e 2c 20 57  pr(TK_BETWEEN, W
6630: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  , 0, 0);.  if( A
6640: 20 29 7b 0a 20 20 20 20 41 2d 3e 70 4c 69 73 74   ){.    A->pList
6650: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 65 6c 73   = pList;.  }els
6660: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
6670: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
6680: 73 74 29 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20  st);.  } .  if( 
6690: 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33 45  N ) A = sqlite3E
66a0: 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30  xpr(TK_NOT, A, 0
66b0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  , 0);.  sqlite3E
66c0: 78 70 72 53 70 61 6e 28 41 2c 26 57 2d 3e 73 70  xprSpan(A,&W->sp
66d0: 61 6e 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a  an,&Y->span);.}.
66e0: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
66f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 25  MIT_SUBQUERY.  %
6700: 74 79 70 65 20 69 6e 5f 6f 70 20 7b 69 6e 74 7d  type in_op {int}
6710: 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20  .  in_op(A) ::= 
6720: 49 4e 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b  IN.      {A = 0;
6730: 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d  }.  in_op(A) ::=
6740: 20 4e 4f 54 20 49 4e 2e 20 20 7b 41 20 3d 20 31   NOT IN.  {A = 1
6750: 3b 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d  ;}.  expr(A) ::=
6760: 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e   expr(X) in_op(N
6770: 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29  ) LP exprlist(Y)
6780: 20 52 50 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a 20   RP(E). [IN] {. 
6790: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78     A = sqlite3Ex
67a0: 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20  pr(TK_IN, X, 0, 
67b0: 30 29 3b 0a 20 20 20 20 69 66 28 20 41 20 29 7b  0);.    if( A ){
67c0: 0a 20 20 20 20 20 20 41 2d 3e 70 4c 69 73 74 20  .      A->pList 
67d0: 3d 20 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = Y;.    }else{.
67e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
67f0: 72 4c 69 73 74 44 65 6c 65 74 65 28 59 29 3b 0a  rListDelete(Y);.
6800: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 4e 20      }.    if( N 
6810: 29 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ) A = sqlite3Exp
6820: 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20  r(TK_NOT, A, 0, 
6830: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
6840: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
6850: 61 6e 2c 26 45 29 3b 0a 20 20 7d 0a 20 20 65 78  an,&E);.  }.  ex
6860: 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20  pr(A) ::= LP(B) 
6870: 73 65 6c 65 63 74 28 58 29 20 52 50 28 45 29 2e  select(X) RP(E).
6880: 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74   {.    A = sqlit
6890: 65 33 45 78 70 72 28 54 4b 5f 53 45 4c 45 43 54  e3Expr(TK_SELECT
68a0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
68b0: 69 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20 41  if( A ){.      A
68c0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 58 3b 0a 20  ->pSelect = X;. 
68d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
68e0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
68f0: 65 74 65 28 58 29 3b 0a 20 20 20 20 7d 0a 20 20  ete(X);.    }.  
6900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
6910: 6e 28 41 2c 26 42 2c 26 45 29 3b 0a 20 20 7d 0a  n(A,&B,&E);.  }.
6920: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78    expr(A) ::= ex
6930: 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29 20 4c  pr(X) in_op(N) L
6940: 50 20 73 65 6c 65 63 74 28 59 29 20 52 50 28 45  P select(Y) RP(E
6950: 29 2e 20 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 41  ).  [IN] {.    A
6960: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
6970: 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  K_IN, X, 0, 0);.
6980: 20 20 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20      if( A ){.   
6990: 20 20 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20     A->pSelect = 
69a0: 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  Y;.    }else{.  
69b0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
69c0: 74 44 65 6c 65 74 65 28 59 29 3b 0a 20 20 20 20  tDelete(Y);.    
69d0: 7d 0a 20 20 20 20 69 66 28 20 4e 20 29 20 41 20  }.    if( N ) A 
69e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
69f0: 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a  _NOT, A, 0, 0);.
6a00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
6a10: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26  pan(A,&X->span,&
6a20: 45 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41  E);.  }.  expr(A
6a30: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69 6e  ) ::= expr(X) in
6a40: 5f 6f 70 28 4e 29 20 6e 6d 28 59 29 20 64 62 6e  _op(N) nm(Y) dbn
6a50: 6d 28 5a 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20 20  m(Z). [IN] {.   
6a60: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d   SrcList *pSrc =
6a70: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
6a80: 70 70 65 6e 64 28 30 2c 26 59 2c 26 5a 29 3b 0a  ppend(0,&Y,&Z);.
6a90: 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45      A = sqlite3E
6aa0: 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c  xpr(TK_IN, X, 0,
6ab0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 41 20 29   0);.    if( A )
6ac0: 7b 0a 20 20 20 20 20 20 41 2d 3e 70 53 65 6c 65  {.      A->pSele
6ad0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
6ae0: 63 74 4e 65 77 28 30 2c 70 53 72 63 2c 30 2c 30  ctNew(0,pSrc,0,0
6af0: 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  ,0,0,0,0,0);.   
6b00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
6b10: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
6b20: 74 65 28 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a  te(pSrc);.    }.
6b30: 20 20 20 20 69 66 28 20 4e 20 29 20 41 20 3d 20      if( N ) A = 
6b40: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e  sqlite3Expr(TK_N
6b50: 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20  OT, A, 0, 0);.  
6b60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
6b70: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 5a 2e 7a  n(A,&X->span,Z.z
6b80: 3f 26 5a 3a 26 59 29 3b 0a 20 20 7d 0a 20 20 65  ?&Z:&Y);.  }.  e
6b90: 78 70 72 28 41 29 20 3a 3a 3d 20 45 58 49 53 54  xpr(A) ::= EXIST
6ba0: 53 28 42 29 20 4c 50 20 73 65 6c 65 63 74 28 59  S(B) LP select(Y
6bb0: 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 20 20 45  ) RP(E). {.    E
6bc0: 78 70 72 20 2a 70 20 3d 20 41 20 3d 20 73 71 6c  xpr *p = A = sql
6bd0: 69 74 65 33 45 78 70 72 28 54 4b 5f 45 58 49 53  ite3Expr(TK_EXIS
6be0: 54 53 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  TS, 0, 0, 0);.  
6bf0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
6c00: 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 59 3b   p->pSelect = Y;
6c10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6c20: 70 72 53 70 61 6e 28 70 2c 26 42 2c 26 45 29 3b  prSpan(p,&B,&E);
6c30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6c40: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
6c50: 65 6c 65 74 65 28 59 29 3b 0a 20 20 20 20 7d 0a  elete(Y);.    }.
6c60: 20 20 7d 0a 25 65 6e 64 69 66 20 2f 2f 20 53 51    }.%endif // SQ
6c70: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6c80: 52 59 0a 0a 2f 2a 20 43 41 53 45 20 65 78 70 72  RY../* CASE expr
6c90: 65 73 73 69 6f 6e 73 20 2a 2f 0a 65 78 70 72 28  essions */.expr(
6ca0: 41 29 20 3a 3a 3d 20 43 41 53 45 28 43 29 20 63  A) ::= CASE(C) c
6cb0: 61 73 65 5f 6f 70 65 72 61 6e 64 28 58 29 20 63  ase_operand(X) c
6cc0: 61 73 65 5f 65 78 70 72 6c 69 73 74 28 59 29 20  ase_exprlist(Y) 
6cd0: 63 61 73 65 5f 65 6c 73 65 28 5a 29 20 45 4e 44  case_else(Z) END
6ce0: 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (E). {.  A = sql
6cf0: 69 74 65 33 45 78 70 72 28 54 4b 5f 43 41 53 45  ite3Expr(TK_CASE
6d00: 2c 20 58 2c 20 5a 2c 20 30 29 3b 0a 20 20 69 66  , X, Z, 0);.  if
6d10: 28 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e 70 4c  ( A ){.    A->pL
6d20: 69 73 74 20 3d 20 59 3b 0a 20 20 7d 65 6c 73 65  ist = Y;.  }else
6d30: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
6d40: 72 4c 69 73 74 44 65 6c 65 74 65 28 59 29 3b 0a  rListDelete(Y);.
6d50: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
6d60: 72 53 70 61 6e 28 41 2c 20 26 43 2c 20 26 45 29  rSpan(A, &C, &E)
6d70: 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73 65 5f 65  ;.}.%type case_e
6d80: 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  xprlist {ExprLis
6d90: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
6da0: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 73  case_exprlist {s
6db0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
6dc0: 6c 65 74 65 28 24 24 29 3b 7d 0a 63 61 73 65 5f  lete($$);}.case_
6dd0: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20  exprlist(A) ::= 
6de0: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 58 29  case_exprlist(X)
6df0: 20 57 48 45 4e 20 65 78 70 72 28 59 29 20 54 48   WHEN expr(Y) TH
6e00: 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20 20  EN expr(Z). {.  
6e10: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
6e20: 69 73 74 41 70 70 65 6e 64 28 58 2c 20 59 2c 20  istAppend(X, Y, 
6e30: 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  0);.  A = sqlite
6e40: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6e50: 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a 63 61 73 65  A, Z, 0);.}.case
6e60: 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  _exprlist(A) ::=
6e70: 20 57 48 45 4e 20 65 78 70 72 28 59 29 20 54 48   WHEN expr(Y) TH
6e80: 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20 20  EN expr(Z). {.  
6e90: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
6ea0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 59 2c 20  istAppend(0, Y, 
6eb0: 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  0);.  A = sqlite
6ec0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6ed0: 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a 25 74 79 70  A, Z, 0);.}.%typ
6ee0: 65 20 63 61 73 65 5f 65 6c 73 65 20 7b 45 78 70  e case_else {Exp
6ef0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
6f00: 63 61 73 65 5f 65 6c 73 65 20 7b 73 71 6c 69 74  case_else {sqlit
6f10: 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24 29  e3ExprDelete($$)
6f20: 3b 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29 20  ;}.case_else(A) 
6f30: 3a 3a 3d 20 20 45 4c 53 45 20 65 78 70 72 28 58  ::=  ELSE expr(X
6f40: 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20  ).         {A = 
6f50: 58 3b 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29  X;}.case_else(A)
6f60: 20 3a 3a 3d 20 20 2e 20 20 20 20 20 20 20 20 20   ::=  .         
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
6f80: 20 30 3b 7d 20 0a 25 74 79 70 65 20 63 61 73 65   0;} .%type case
6f90: 5f 6f 70 65 72 61 6e 64 20 7b 45 78 70 72 2a 7d  _operand {Expr*}
6fa0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63 61 73  .%destructor cas
6fb0: 65 5f 6f 70 65 72 61 6e 64 20 7b 73 71 6c 69 74  e_operand {sqlit
6fc0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24 29  e3ExprDelete($$)
6fd0: 3b 7d 0a 63 61 73 65 5f 6f 70 65 72 61 6e 64 28  ;}.case_operand(
6fe0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20  A) ::= expr(X). 
6ff0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
7000: 58 3b 7d 20 0a 63 61 73 65 5f 6f 70 65 72 61 6e  X;} .case_operan
7010: 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  d(A) ::= .      
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
7030: 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65 20 65 78  = 0;} ..%type ex
7040: 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  prlist {ExprList
7050: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65  *}.%destructor e
7060: 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  xprlist {sqlite3
7070: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24  ExprListDelete($
7080: 24 29 3b 7d 0a 25 74 79 70 65 20 65 78 70 72 69  $);}.%type expri
7090: 74 65 6d 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73  tem {Expr*}.%des
70a0: 74 72 75 63 74 6f 72 20 65 78 70 72 69 74 65 6d  tructor expritem
70b0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
70c0: 65 74 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72 6c  ete($$);}..exprl
70d0: 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 6c  ist(A) ::= exprl
70e0: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  ist(X) COMMA exp
70f0: 72 69 74 65 6d 28 59 29 2e 20 0a 20 20 20 20 20  ritem(Y). .     
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
7130: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  xprListAppend(X,
7140: 59 2c 30 29 3b 7d 0a 65 78 70 72 6c 69 73 74 28  Y,0);}.exprlist(
7150: 41 29 20 3a 3a 3d 20 65 78 70 72 69 74 65 6d 28  A) ::= expritem(
7160: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b  X).            {
7170: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
7180: 69 73 74 41 70 70 65 6e 64 28 30 2c 58 2c 30 29  istAppend(0,X,0)
7190: 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41 29 20 3a  ;}.expritem(A) :
71a0: 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 20 20  := expr(X).     
71b0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
71c0: 58 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41 29 20  X;}.expritem(A) 
71d0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
71f0: 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   0;}..//////////
7200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7210: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 49  /// The CREATE I
7220: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  NDEX command ///
7230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7240: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
7250: 43 52 45 41 54 45 28 53 29 20 75 6e 69 71 75 65  CREATE(S) unique
7260: 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20 69 66  flag(U) INDEX if
7270: 6e 6f 74 65 78 69 73 74 73 28 4e 45 29 20 6e 6d  notexists(NE) nm
7280: 28 58 29 20 64 62 6e 6d 28 44 29 0a 20 20 20 20  (X) dbnm(D).    
7290: 20 20 20 20 4f 4e 20 6e 6d 28 59 29 20 4c 50 20      ON nm(Y) LP 
72a0: 69 64 78 6c 69 73 74 28 5a 29 20 52 50 28 45 29  idxlist(Z) RP(E)
72b0: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 43 72 65  . {.  sqlite3Cre
72c0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
72d0: 20 26 58 2c 20 26 44 2c 20 73 71 6c 69 74 65 33   &X, &D, sqlite3
72e0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  SrcListAppend(0,
72f0: 26 59 2c 30 29 2c 20 5a 2c 20 55 2c 0a 20 20 20  &Y,0), Z, U,.   
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7310: 20 20 20 26 53 2c 20 26 45 2c 20 53 51 4c 49 54     &S, &E, SQLIT
7320: 45 5f 53 4f 5f 41 53 43 2c 20 4e 45 29 3b 0a 7d  E_SO_ASC, NE);.}
7330: 0a 0a 25 74 79 70 65 20 75 6e 69 71 75 65 66 6c  ..%type uniquefl
7340: 61 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75 65 66  ag {int}.uniquef
7350: 6c 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49 51 55  lag(A) ::= UNIQU
7360: 45 2e 20 20 7b 41 20 3d 20 4f 45 5f 41 62 6f 72  E.  {A = OE_Abor
7370: 74 3b 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28 41  t;}.uniqueflag(A
7380: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 7b  ) ::= .        {
7390: 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 7d 0a 0a 25  A = OE_None;}..%
73a0: 74 79 70 65 20 69 64 78 6c 69 73 74 20 7b 45 78  type idxlist {Ex
73b0: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
73c0: 63 74 6f 72 20 69 64 78 6c 69 73 74 20 7b 73 71  ctor idxlist {sq
73d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
73e0: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20  ete($$);}.%type 
73f0: 69 64 78 6c 69 73 74 5f 6f 70 74 20 7b 45 78 70  idxlist_opt {Exp
7400: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
7410: 74 6f 72 20 69 64 78 6c 69 73 74 5f 6f 70 74 20  tor idxlist_opt 
7420: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
7430: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
7440: 70 65 20 69 64 78 69 74 65 6d 20 7b 54 6f 6b 65  pe idxitem {Toke
7450: 6e 7d 0a 0a 69 64 78 6c 69 73 74 5f 6f 70 74 28  n}..idxlist_opt(
7460: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 7b 41 20 3d 20 30 3b 7d 0a 69 64 78 6c 69 73   {A = 0;}.idxlis
7490: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20  t_opt(A) ::= LP 
74a0: 69 64 78 6c 69 73 74 28 58 29 20 52 50 2e 20 20  idxlist(X) RP.  
74b0: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
74c0: 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69  idxlist(A) ::= i
74d0: 64 78 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20  dxlist(X) COMMA 
74e0: 69 64 78 69 74 65 6d 28 59 29 20 63 6f 6c 6c 61  idxitem(Y) colla
74f0: 74 65 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28  te(C) sortorder(
7500: 5a 29 2e 20 20 7b 0a 20 20 45 78 70 72 20 2a 70  Z).  {.  Expr *p
7510: 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 2e 6e 3e   = 0;.  if( C.n>
7520: 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c  0 ){.    p = sql
7530: 69 74 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55  ite3Expr(TK_COLU
7540: 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  MN, 0, 0, 0);.  
7550: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 70 43 6f    if( p ) p->pCo
7560: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
7570: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
7580: 2c 20 28 63 68 61 72 2a 29 43 2e 7a 2c 20 43 2e  , (char*)C.z, C.
7590: 6e 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71  n);.  }.  A = sq
75a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
75b0: 65 6e 64 28 58 2c 20 70 2c 20 26 59 29 3b 0a 20  end(X, p, &Y);. 
75c0: 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d   if( A ) A->a[A-
75d0: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
75e0: 64 65 72 20 3d 20 5a 3b 0a 7d 0a 69 64 78 6c 69  der = Z;.}.idxli
75f0: 73 74 28 41 29 20 3a 3a 3d 20 69 64 78 69 74 65  st(A) ::= idxite
7600: 6d 28 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20  m(Y) collate(C) 
7610: 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a  sortorder(Z). {.
7620: 20 20 45 78 70 72 20 2a 70 20 3d 20 30 3b 0a 20    Expr *p = 0;. 
7630: 20 69 66 28 20 43 2e 6e 3e 30 20 29 7b 0a 20 20   if( C.n>0 ){.  
7640: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
7650: 72 28 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  r(TK_COLUMN, 0, 
7660: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
7670: 20 29 20 70 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71   ) p->pColl = sq
7680: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
7690: 65 71 28 70 50 61 72 73 65 2c 20 28 63 68 61 72  eq(pParse, (char
76a0: 2a 29 43 2e 7a 2c 20 43 2e 6e 29 3b 0a 20 20 7d  *)C.z, C.n);.  }
76b0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
76c0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
76d0: 70 2c 20 26 59 29 3b 0a 20 20 69 66 28 20 41 20  p, &Y);.  if( A 
76e0: 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70 72 2d  ) A->a[A->nExpr-
76f0: 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a  1].sortOrder = Z
7700: 3b 0a 7d 0a 69 64 78 69 74 65 6d 28 41 29 20 3a  ;.}.idxitem(A) :
7710: 3a 3d 20 6e 6d 28 58 29 2e 20 20 20 20 20 20 20  := nm(X).       
7720: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
7730: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
7740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
7750: 54 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 63  The DROP INDEX c
7760: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
7770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7780: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50  .//.cmd ::= DROP
7790: 20 49 4e 44 45 58 20 69 66 65 78 69 73 74 73 28   INDEX ifexists(
77a0: 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20  E) fullname(X). 
77b0: 20 20 7b 73 71 6c 69 74 65 33 44 72 6f 70 49 6e    {sqlite3DropIn
77c0: 64 65 78 28 70 50 61 72 73 65 2c 20 58 2c 20 45  dex(pParse, X, E
77d0: 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );}..///////////
77e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
77f0: 2f 2f 20 54 68 65 20 56 41 43 55 55 4d 20 63 6f  // The VACUUM co
7800: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
7810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7820: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 56  ///.//.cmd ::= V
7830: 41 43 55 55 4d 2e 20 20 20 20 20 20 20 20 20 20  ACUUM.          
7840: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 61        {sqlite3Va
7850: 63 75 75 6d 28 70 50 61 72 73 65 29 3b 7d 0a 63  cuum(pParse);}.c
7860: 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d 20 6e 6d  md ::= VACUUM nm
7870: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73  .             {s
7880: 71 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50 61  qlite3Vacuum(pPa
7890: 72 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  rse);}..////////
78a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
78b0: 2f 2f 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d 41  ///// The PRAGMA
78c0: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
78d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
78e0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65  //////.//.%ifnde
78f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
7900: 41 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  AGMA.cmd ::= PRA
7910: 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a  GMA nm(X) dbnm(Z
7920: 29 20 45 51 20 6e 6d 28 59 29 2e 20 20 7b 73 71  ) EQ nm(Y).  {sq
7930: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
7940: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d  se,&X,&Z,&Y,0);}
7950: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
7960: 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51  nm(X) dbnm(Z) EQ
7970: 20 4f 4e 28 59 29 2e 20 20 7b 73 71 6c 69 74 65   ON(Y).  {sqlite
7980: 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26  3Pragma(pParse,&
7990: 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64  X,&Z,&Y,0);}.cmd
79a0: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58   ::= PRAGMA nm(X
79b0: 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 70 6c 75  ) dbnm(Z) EQ plu
79c0: 73 5f 6e 75 6d 28 59 29 2e 20 7b 73 71 6c 69 74  s_num(Y). {sqlit
79d0: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  e3Pragma(pParse,
79e0: 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d  &X,&Z,&Y,0);}.cm
79f0: 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28  d ::= PRAGMA nm(
7a00: 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6d 69  X) dbnm(Z) EQ mi
7a10: 6e 75 73 5f 6e 75 6d 28 59 29 2e 20 7b 0a 20 20  nus_num(Y). {.  
7a20: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50  sqlite3Pragma(pP
7a30: 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29  arse,&X,&Z,&Y,1)
7a40: 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  ;.}.cmd ::= PRAG
7a50: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
7a60: 20 4c 50 20 6e 6d 28 59 29 20 52 50 2e 20 7b 73   LP nm(Y) RP. {s
7a70: 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61  qlite3Pragma(pPa
7a80: 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b  rse,&X,&Z,&Y,0);
7a90: 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41  }.cmd ::= PRAGMA
7aa0: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 2e 20   nm(X) dbnm(Z). 
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
7ac0: 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73  ite3Pragma(pPars
7ad0: 65 2c 26 58 2c 26 5a 2c 30 2c 30 29 3b 7d 0a 25  e,&X,&Z,0,0);}.%
7ae0: 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f  endif // SQLITE_
7af0: 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 70 6c 75 73  OMIT_PRAGMA.plus
7b00: 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73  _num(A) ::= plus
7b10: 5f 6f 70 74 20 6e 75 6d 62 65 72 28 58 29 2e 20  _opt number(X). 
7b20: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75 73    {A = X;}.minus
7b30: 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e 55  _num(A) ::= MINU
7b40: 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20  S number(X).    
7b50: 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72   {A = X;}.number
7b60: 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 7c  (A) ::= INTEGER|
7b70: 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20  FLOAT(X).       
7b80: 7b 41 20 3d 20 58 3b 7d 0a 70 6c 75 73 5f 6f 70  {A = X;}.plus_op
7b90: 74 20 3a 3a 3d 20 50 4c 55 53 2e 0a 70 6c 75 73  t ::= PLUS..plus
7ba0: 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f  _opt ::= ...////
7bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7bc0: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45  //////// The CRE
7bd0: 41 54 45 20 54 52 49 47 47 45 52 20 63 6f 6d 6d  ATE TRIGGER comm
7be0: 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  and ////////////
7bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64  /////////..%ifnd
7c00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
7c10: 52 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20  RIGGER..cmd ::= 
7c20: 43 52 45 41 54 45 20 74 72 69 67 67 65 72 5f 64  CREATE trigger_d
7c30: 65 63 6c 28 41 29 20 42 45 47 49 4e 20 74 72 69  ecl(A) BEGIN tri
7c40: 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53 29  gger_cmd_list(S)
7c50: 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f 6b   END(Z). {.  Tok
7c60: 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a 20  en all;.  all.z 
7c70: 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20 3d  = A.z;.  all.n =
7c80: 20 28 5a 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a   (Z.z - A.z) + Z
7c90: 2e 6e 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6e  .n;.  sqlite3Fin
7ca0: 69 73 68 54 72 69 67 67 65 72 28 70 50 61 72 73  ishTrigger(pPars
7cb0: 65 2c 20 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a 0a  e, S, &all);.}..
7cc0: 74 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20  trigger_decl(A) 
7cd0: 3a 3a 3d 20 74 65 6d 70 28 54 29 20 54 52 49 47  ::= temp(T) TRIG
7ce0: 47 45 52 20 6e 6d 28 42 29 20 64 62 6e 6d 28 5a  GER nm(B) dbnm(Z
7cf0: 29 20 74 72 69 67 67 65 72 5f 74 69 6d 65 28 43  ) trigger_time(C
7d00: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
7d10: 20 20 20 20 20 20 74 72 69 67 67 65 72 5f 65 76        trigger_ev
7d20: 65 6e 74 28 44 29 0a 20 20 20 20 20 20 20 20 20  ent(D).         
7d30: 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20 66 75             ON fu
7d40: 6c 6c 6e 61 6d 65 28 45 29 20 66 6f 72 65 61 63  llname(E) foreac
7d50: 68 5f 63 6c 61 75 73 65 28 46 29 20 77 68 65 6e  h_clause(F) when
7d60: 5f 63 6c 61 75 73 65 28 47 29 2e 20 7b 0a 20 20  _clause(G). {.  
7d70: 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69 67  sqlite3BeginTrig
7d80: 67 65 72 28 70 50 61 72 73 65 2c 20 26 42 2c 20  ger(pParse, &B, 
7d90: 26 5a 2c 20 43 2c 20 44 2e 61 2c 20 44 2e 62 2c  &Z, C, D.a, D.b,
7da0: 20 45 2c 20 46 2c 20 47 2c 20 54 29 3b 0a 20 20   E, F, G, T);.  
7db0: 41 20 3d 20 28 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29  A = (Z.n==0?B:Z)
7dc0: 3b 0a 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  ;.}..%type trigg
7dd0: 65 72 5f 74 69 6d 65 20 20 7b 69 6e 74 7d 0a 74  er_time  {int}.t
7de0: 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a  rigger_time(A) :
7df0: 3a 3d 20 42 45 46 4f 52 45 2e 20 20 20 20 20 20  := BEFORE.      
7e00: 7b 20 41 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b  { A = TK_BEFORE;
7e10: 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28   }.trigger_time(
7e20: 41 29 20 3a 3a 3d 20 41 46 54 45 52 2e 20 20 20  A) ::= AFTER.   
7e30: 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 41 46 54      { A = TK_AFT
7e40: 45 52 3b 20 20 7d 0a 74 72 69 67 67 65 72 5f 74  ER;  }.trigger_t
7e50: 69 6d 65 28 41 29 20 3a 3a 3d 20 49 4e 53 54 45  ime(A) ::= INSTE
7e60: 41 44 20 4f 46 2e 20 20 7b 20 41 20 3d 20 54 4b  AD OF.  { A = TK
7e70: 5f 49 4e 53 54 45 41 44 3b 7d 0a 74 72 69 67 67  _INSTEAD;}.trigg
7e80: 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 2e  er_time(A) ::= .
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
7ea0: 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a 0a  = TK_BEFORE; }..
7eb0: 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 65 76  %type trigger_ev
7ec0: 65 6e 74 20 7b 73 74 72 75 63 74 20 54 72 69 67  ent {struct Trig
7ed0: 45 76 65 6e 74 7d 0a 25 64 65 73 74 72 75 63 74  Event}.%destruct
7ee0: 6f 72 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74  or trigger_event
7ef0: 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   {sqlite3IdListD
7f00: 65 6c 65 74 65 28 24 24 2e 62 29 3b 7d 0a 74 72  elete($$.b);}.tr
7f10: 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a  igger_event(A) :
7f20: 3a 3d 20 44 45 4c 45 54 45 7c 49 4e 53 45 52 54  := DELETE|INSERT
7f30: 28 4f 50 29 2e 20 20 20 20 20 20 20 7b 41 2e 61  (OP).       {A.a
7f40: 20 3d 20 40 4f 50 3b 20 41 2e 62 20 3d 20 30 3b   = @OP; A.b = 0;
7f50: 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28  }.trigger_event(
7f60: 41 29 20 3a 3a 3d 20 55 50 44 41 54 45 28 4f 50  A) ::= UPDATE(OP
7f70: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
7f80: 7b 41 2e 61 20 3d 20 40 4f 50 3b 20 41 2e 62 20  {A.a = @OP; A.b 
7f90: 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76  = 0;}.trigger_ev
7fa0: 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54  ent(A) ::= UPDAT
7fb0: 45 20 4f 46 20 69 6e 73 63 6f 6c 6c 69 73 74 28  E OF inscollist(
7fc0: 58 29 2e 20 7b 41 2e 61 20 3d 20 54 4b 5f 55 50  X). {A.a = TK_UP
7fd0: 44 41 54 45 3b 20 41 2e 62 20 3d 20 58 3b 7d 0a  DATE; A.b = X;}.
7fe0: 0a 25 74 79 70 65 20 66 6f 72 65 61 63 68 5f 63  .%type foreach_c
7ff0: 6c 61 75 73 65 20 7b 69 6e 74 7d 0a 66 6f 72 65  lause {int}.fore
8000: 61 63 68 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a  ach_clause(A) ::
8010: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
8020: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 52        { A = TK_R
8030: 4f 57 3b 20 7d 0a 66 6f 72 65 61 63 68 5f 63 6c  OW; }.foreach_cl
8040: 61 75 73 65 28 41 29 20 3a 3a 3d 20 46 4f 52 20  ause(A) ::= FOR 
8050: 45 41 43 48 20 52 4f 57 2e 20 20 20 20 20 20 20  EACH ROW.       
8060: 7b 20 41 20 3d 20 54 4b 5f 52 4f 57 3b 20 7d 0a  { A = TK_ROW; }.
8070: 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28 41  foreach_clause(A
8080: 29 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 53  ) ::= FOR EACH S
8090: 54 41 54 45 4d 45 4e 54 2e 20 7b 20 41 20 3d 20  TATEMENT. { A = 
80a0: 54 4b 5f 53 54 41 54 45 4d 45 4e 54 3b 20 7d 0a  TK_STATEMENT; }.
80b0: 0a 25 74 79 70 65 20 77 68 65 6e 5f 63 6c 61 75  .%type when_clau
80c0: 73 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  se {Expr*}.%dest
80d0: 72 75 63 74 6f 72 20 77 68 65 6e 5f 63 6c 61 75  ructor when_clau
80e0: 73 65 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44  se {sqlite3ExprD
80f0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 77 68 65 6e  elete($$);}.when
8100: 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e  _clause(A) ::= .
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
8120: 20 3d 20 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61   = 0; }.when_cla
8130: 75 73 65 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20  use(A) ::= WHEN 
8140: 65 78 70 72 28 58 29 2e 20 7b 20 41 20 3d 20 58  expr(X). { A = X
8150: 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  ; }..%type trigg
8160: 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 54 72 69  er_cmd_list {Tri
8170: 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65 73 74  ggerStep*}.%dest
8180: 72 75 63 74 6f 72 20 74 72 69 67 67 65 72 5f 63  ructor trigger_c
8190: 6d 64 5f 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  md_list {sqlite3
81a0: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
81b0: 70 28 24 24 29 3b 7d 0a 74 72 69 67 67 65 72 5f  p($$);}.trigger_
81c0: 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20  cmd_list(A) ::= 
81d0: 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29 20 53  trigger_cmd(X) S
81e0: 45 4d 49 20 74 72 69 67 67 65 72 5f 63 6d 64 5f  EMI trigger_cmd_
81f0: 6c 69 73 74 28 59 29 2e 20 7b 0a 20 20 58 2d 3e  list(Y). {.  X->
8200: 70 4e 65 78 74 20 3d 20 59 3b 0a 20 20 41 20 3d  pNext = Y;.  A =
8210: 20 58 3b 0a 7d 0a 74 72 69 67 67 65 72 5f 63 6d   X;.}.trigger_cm
8220: 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e 20  d_list(A) ::= . 
8230: 7b 20 41 20 3d 20 30 3b 20 7d 0a 0a 25 74 79 70  { A = 0; }..%typ
8240: 65 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 54  e trigger_cmd {T
8250: 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65  riggerStep*}.%de
8260: 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72  structor trigger
8270: 5f 63 6d 64 20 7b 73 71 6c 69 74 65 33 44 65 6c  _cmd {sqlite3Del
8280: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 24  eteTriggerStep($
8290: 24 29 3b 7d 0a 2f 2f 20 55 50 44 41 54 45 20 0a  $);}.// UPDATE .
82a0: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a  trigger_cmd(A) :
82b0: 3a 3d 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66  := UPDATE orconf
82c0: 28 52 29 20 6e 6d 28 58 29 20 53 45 54 20 73 65  (R) nm(X) SET se
82d0: 74 6c 69 73 74 28 59 29 20 77 68 65 72 65 5f 6f  tlist(Y) where_o
82e0: 70 74 28 5a 29 2e 20 20 0a 20 20 20 20 20 20 20  pt(Z).  .       
82f0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 73 71          { A = sq
8300: 6c 69 74 65 33 54 72 69 67 67 65 72 55 70 64 61  lite3TriggerUpda
8310: 74 65 53 74 65 70 28 26 58 2c 20 59 2c 20 5a 2c  teStep(&X, Y, Z,
8320: 20 52 29 3b 20 7d 0a 0a 2f 2f 20 49 4e 53 45 52   R); }..// INSER
8330: 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  T.trigger_cmd(A)
8340: 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28   ::= insert_cmd(
8350: 52 29 20 49 4e 54 4f 20 6e 6d 28 58 29 20 69 6e  R) INTO nm(X) in
8360: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20  scollist_opt(F) 
8370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8380: 20 20 20 20 56 41 4c 55 45 53 20 4c 50 20 69 74      VALUES LP it
8390: 65 6d 6c 69 73 74 28 59 29 20 52 50 2e 20 20 0a  emlist(Y) RP.  .
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
83b0: 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  A = sqlite3Trigg
83c0: 65 72 49 6e 73 65 72 74 53 74 65 70 28 26 58 2c  erInsertStep(&X,
83d0: 20 46 2c 20 59 2c 20 30 2c 20 52 29 3b 7d 0a 0a   F, Y, 0, R);}..
83e0: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a  trigger_cmd(A) :
83f0: 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29  := insert_cmd(R)
8400: 20 49 4e 54 4f 20 6e 6d 28 58 29 20 69 6e 73 63   INTO nm(X) insc
8410: 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65  ollist_opt(F) se
8420: 6c 65 63 74 28 53 29 2e 0a 20 20 20 20 20 20 20  lect(S)..       
8430: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
8440: 69 74 65 33 54 72 69 67 67 65 72 49 6e 73 65 72  ite3TriggerInser
8450: 74 53 74 65 70 28 26 58 2c 20 46 2c 20 30 2c 20  tStep(&X, F, 0, 
8460: 53 2c 20 52 29 3b 7d 0a 0a 2f 2f 20 44 45 4c 45  S, R);}..// DELE
8470: 54 45 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  TE.trigger_cmd(A
8480: 29 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f  ) ::= DELETE FRO
8490: 4d 20 6e 6d 28 58 29 20 77 68 65 72 65 5f 6f 70  M nm(X) where_op
84a0: 74 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20  t(Y)..          
84b0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
84c0: 33 54 72 69 67 67 65 72 44 65 6c 65 74 65 53 74  3TriggerDeleteSt
84d0: 65 70 28 26 58 2c 20 59 29 3b 7d 0a 0a 2f 2f 20  ep(&X, Y);}..// 
84e0: 53 45 4c 45 43 54 0a 74 72 69 67 67 65 72 5f 63  SELECT.trigger_c
84f0: 6d 64 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74  md(A) ::= select
8500: 28 58 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (X).  {A = sqlit
8510: 65 33 54 72 69 67 67 65 72 53 65 6c 65 63 74 53  e3TriggerSelectS
8520: 74 65 70 28 58 29 3b 20 7d 0a 0a 2f 2f 20 54 68  tep(X); }..// Th
8530: 65 20 73 70 65 63 69 61 6c 20 52 41 49 53 45 20  e special RAISE 
8540: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
8550: 6d 61 79 20 6f 63 63 75 72 20 69 6e 20 74 72 69  may occur in tri
8560: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 0a 65 78  gger programs.ex
8570: 70 72 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 28  pr(A) ::= RAISE(
8580: 58 29 20 4c 50 20 49 47 4e 4f 52 45 20 52 50 28  X) LP IGNORE RP(
8590: 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c  Y).  {.  A = sql
85a0: 69 74 65 33 45 78 70 72 28 54 4b 5f 52 41 49 53  ite3Expr(TK_RAIS
85b0: 45 2c 20 30 2c 20 30 2c 20 30 29 3b 20 0a 20 20  E, 0, 0, 0); .  
85c0: 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 4f 45 5f  A->iColumn = OE_
85d0: 49 67 6e 6f 72 65 3b 0a 20 20 73 71 6c 69 74 65  Ignore;.  sqlite
85e0: 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58 2c  3ExprSpan(A, &X,
85f0: 20 26 59 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20   &Y);.}.expr(A) 
8600: 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20  ::= RAISE(X) LP 
8610: 72 61 69 73 65 74 79 70 65 28 54 29 20 43 4f 4d  raisetype(T) COM
8620: 4d 41 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20  MA nm(Z) RP(Y). 
8630: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
8640: 45 78 70 72 28 54 4b 5f 52 41 49 53 45 2c 20 30  Expr(TK_RAISE, 0
8650: 2c 20 30 2c 20 26 5a 29 3b 20 0a 20 20 41 2d 3e  , 0, &Z); .  A->
8660: 69 43 6f 6c 75 6d 6e 20 3d 20 54 3b 0a 20 20 73  iColumn = T;.  s
8670: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
8680: 2c 20 26 58 2c 20 26 59 29 3b 0a 7d 0a 25 65 6e  , &X, &Y);.}.%en
8690: 64 69 66 20 2f 2f 20 21 53 51 4c 49 54 45 5f 4f  dif // !SQLITE_O
86a0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 25 74 79  MIT_TRIGGER..%ty
86b0: 70 65 20 72 61 69 73 65 74 79 70 65 20 7b 69 6e  pe raisetype {in
86c0: 74 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20  t}.raisetype(A) 
86d0: 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b  ::= ROLLBACK.  {
86e0: 41 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b  A = OE_Rollback;
86f0: 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a  }.raisetype(A) :
8700: 3a 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 7b 41  := ABORT.     {A
8710: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61   = OE_Abort;}.ra
8720: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46  isetype(A) ::= F
8730: 41 49 4c 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f  AIL.      {A = O
8740: 45 5f 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f  E_Fail;}.../////
8750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8760: 2f 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45  ///  DROP TRIGGE
8770: 52 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  R statement ////
8780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
87a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
87b0: 52 49 47 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44  RIGGER.cmd ::= D
87c0: 52 4f 50 20 54 52 49 47 47 45 52 20 66 75 6c 6c  ROP TRIGGER full
87d0: 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c  name(X). {.  sql
87e0: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28  ite3DropTrigger(
87f0: 70 50 61 72 73 65 2c 58 29 3b 0a 7d 0a 25 65 6e  pParse,X);.}.%en
8800: 64 69 66 20 2f 2f 20 21 53 51 4c 49 54 45 5f 4f  dif // !SQLITE_O
8810: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2f 2f  MIT_TRIGGER..///
8820: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8830: 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 20 44 41 54  ///// ATTACH DAT
8840: 41 42 41 53 45 20 66 69 6c 65 20 41 53 20 6e 61  ABASE file AS na
8850: 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  me /////////////
8860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64  ////////////.cmd
8870: 20 3a 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61   ::= ATTACH data
8880: 62 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72  base_kw_opt expr
8890: 28 46 29 20 41 53 20 65 78 70 72 28 44 29 20 6b  (F) AS expr(D) k
88a0: 65 79 5f 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73  ey_opt(K). {.  s
88b0: 71 6c 69 74 65 33 41 74 74 61 63 68 28 70 50 61  qlite3Attach(pPa
88c0: 72 73 65 2c 20 46 2c 20 44 2c 20 4b 29 3b 0a 7d  rse, F, D, K);.}
88d0: 0a 25 74 79 70 65 20 6b 65 79 5f 6f 70 74 20 7b  .%type key_opt {
88e0: 45 78 70 72 20 2a 7d 0a 25 64 65 73 74 72 75 63  Expr *}.%destruc
88f0: 74 6f 72 20 6b 65 79 5f 6f 70 74 20 7b 73 71 6c  tor key_opt {sql
8900: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
8910: 24 29 3b 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20  $);}.key_opt(A) 
8920: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
8930: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
8940: 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20  0; }.key_opt(A) 
8950: 3a 3a 3d 20 4b 45 59 20 65 78 70 72 28 58 29 2e  ::= KEY expr(X).
8960: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
8970: 58 3b 20 7d 0a 0a 64 61 74 61 62 61 73 65 5f 6b  X; }..database_k
8980: 77 5f 6f 70 74 20 3a 3a 3d 20 44 41 54 41 42 41  w_opt ::= DATABA
8990: 53 45 2e 0a 64 61 74 61 62 61 73 65 5f 6b 77 5f  SE..database_kw_
89a0: 6f 70 74 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f 2f  opt ::= .../////
89b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
89c0: 2f 2f 2f 20 44 45 54 41 43 48 20 44 41 54 41 42  /// DETACH DATAB
89d0: 41 53 45 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f  ASE name ///////
89e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
89f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64 20 3a  //////////.cmd :
8a00: 3a 3d 20 44 45 54 41 43 48 20 64 61 74 61 62 61  := DETACH databa
8a10: 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 44  se_kw_opt expr(D
8a20: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 65  ). {.  sqlite3De
8a30: 74 61 63 68 28 70 50 61 72 73 65 2c 20 44 29 3b  tach(pParse, D);
8a40: 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .}..////////////
8a50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 52  ////////////// R
8a60: 45 49 4e 44 45 58 20 63 6f 6c 6c 61 74 69 6f 6e  EINDEX collation
8a70: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
8a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8a90: 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  ///.%ifndef SQLI
8aa0: 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
8ab0: 63 6d 64 20 3a 3a 3d 20 52 45 49 4e 44 45 58 2e  cmd ::= REINDEX.
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 7b 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28  {sqlite3Reindex(
8ae0: 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 7d 0a  pParse, 0, 0);}.
8af0: 63 6d 64 20 3a 3a 3d 20 52 45 49 4e 44 45 58 20  cmd ::= REINDEX 
8b00: 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e 20 20  nm(X) dbnm(Y).  
8b10: 7b 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28  {sqlite3Reindex(
8b20: 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59 29 3b  pParse, &X, &Y);
8b30: 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f  }.%endif..//////
8b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8b50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4e  ///////////// AN
8b60: 41 4c 59 5a 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ALYZE //////////
8b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65  /////////.%ifnde
8b90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
8ba0: 41 4c 59 5a 45 0a 63 6d 64 20 3a 3a 3d 20 41 4e  ALYZE.cmd ::= AN
8bb0: 41 4c 59 5a 45 2e 20 20 20 20 20 20 20 20 20 20  ALYZE.          
8bc0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 6e        {sqlite3An
8bd0: 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 30 2c  alyze(pParse, 0,
8be0: 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4e   0);}.cmd ::= AN
8bf0: 41 4c 59 5a 45 20 6e 6d 28 58 29 20 64 62 6e 6d  ALYZE nm(X) dbnm
8c00: 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 41 6e  (Y).  {sqlite3An
8c10: 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 26 58  alyze(pParse, &X
8c20: 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66 0a 0a  , &Y);}.%endif..
8c30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c40: 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20 54  //////// ALTER T
8c50: 41 42 4c 45 20 74 61 62 6c 65 20 2e 2e 2e 20 2f  ABLE table ... /
8c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
8c80: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
8c90: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 63  MIT_ALTERTABLE.c
8ca0: 6d 64 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42  md ::= ALTER TAB
8cb0: 4c 45 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 52  LE fullname(X) R
8cc0: 45 4e 41 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e 20  ENAME TO nm(Z). 
8cd0: 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72  {.  sqlite3Alter
8ce0: 52 65 6e 61 6d 65 54 61 62 6c 65 28 70 50 61 72  RenameTable(pPar
8cf0: 73 65 2c 58 2c 26 5a 29 3b 0a 7d 0a 63 6d 64 20  se,X,&Z);.}.cmd 
8d00: 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20  ::= ALTER TABLE 
8d10: 61 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e  add_column_fulln
8d20: 61 6d 65 20 41 44 44 20 6b 77 63 6f 6c 75 6d 6e  ame ADD kwcolumn
8d30: 5f 6f 70 74 20 63 6f 6c 75 6d 6e 28 59 29 2e 20  _opt column(Y). 
8d40: 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72  {.  sqlite3Alter
8d50: 46 69 6e 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28  FinishAddColumn(
8d60: 70 50 61 72 73 65 2c 20 26 59 29 3b 0a 7d 0a 61  pParse, &Y);.}.a
8d70: 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61  dd_column_fullna
8d80: 6d 65 20 3a 3a 3d 20 66 75 6c 6c 6e 61 6d 65 28  me ::= fullname(
8d90: 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 41  X). {.  sqlite3A
8da0: 6c 74 65 72 42 65 67 69 6e 41 64 64 43 6f 6c 75  lterBeginAddColu
8db0: 6d 6e 28 70 50 61 72 73 65 2c 20 58 29 3b 0a 7d  mn(pParse, X);.}
8dc0: 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 3a 3a  .kwcolumn_opt ::
8dd0: 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74  = ..kwcolumn_opt
8de0: 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57 2e 0a 25   ::= COLUMNKW..%
8df0: 65 6e 64 69 66 0a                                endif.