/ Hex Artifact Content
Login

Artifact 22f64d8a8910acd17580450513b58d64187b0962848380c7f0a39376b8a48cee:


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 2f 0a 0a 2f 2f 20 41 6c 6c 20  ens..*/..// All 
0270: 74 6f 6b 65 6e 20 63 6f 64 65 73 20 61 72 65 20  token codes are 
0280: 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 77  small integers w
0290: 69 74 68 20 23 64 65 66 69 6e 65 73 20 74 68 61  ith #defines tha
02a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 54 4b  t begin with "TK
02b0: 5f 22 0a 25 74 6f 6b 65 6e 5f 70 72 65 66 69 78  _".%token_prefix
02c0: 20 54 4b 5f 0a 0a 2f 2f 20 54 68 65 20 74 79 70   TK_..// The typ
02d0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 74  e of the data at
02e0: 74 61 63 68 65 64 20 74 6f 20 65 61 63 68 20 74  tached to each t
02f0: 6f 6b 65 6e 20 69 73 20 54 6f 6b 65 6e 2e 20 20  oken is Token.  
0300: 54 68 69 73 20 69 73 20 61 6c 73 6f 20 74 68 65  This is also the
0310: 0a 2f 2f 20 64 65 66 61 75 6c 74 20 74 79 70 65  .// default type
0320: 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61   for non-termina
0330: 6c 73 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 74 79  ls..//.%token_ty
0340: 70 65 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66 61  pe {Token}.%defa
0350: 75 6c 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e 7d  ult_type {Token}
0360: 0a 0a 2f 2f 20 41 6e 20 65 78 74 72 61 20 61 72  ..// An extra ar
0370: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 63 6f  gument to the co
0380: 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  nstructor for th
0390: 65 20 70 61 72 73 65 72 2c 20 77 68 69 63 68 20  e parser, which 
03a0: 69 73 20 61 76 61 69 6c 61 62 6c 65 0a 2f 2f 20  is available.// 
03b0: 74 6f 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a  to all actions..
03c0: 25 65 78 74 72 61 5f 63 6f 6e 74 65 78 74 20 7b  %extra_context {
03d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 7d 0a 0a  Parse *pParse}..
03e0: 2f 2f 20 54 68 69 73 20 63 6f 64 65 20 72 75 6e  // This code run
03f0: 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 72 65  s whenever there
0400: 20 69 73 20 61 20 73 79 6e 74 61 78 20 65 72 72   is a syntax err
0410: 6f 72 0a 2f 2f 0a 25 73 79 6e 74 61 78 5f 65 72  or.//.%syntax_er
0420: 72 6f 72 20 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ror {.  UNUSED_P
0430: 41 52 41 4d 45 54 45 52 28 79 79 6d 61 6a 6f 72  ARAMETER(yymajor
0440: 29 3b 20 20 2f 2a 20 53 69 6c 65 6e 63 65 20 73  );  /* Silence s
0450: 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  ome compiler war
0460: 6e 69 6e 67 73 20 2a 2f 0a 20 20 69 66 28 20 54  nings */.  if( T
0470: 4f 4b 45 4e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20  OKEN.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 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
04d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
04e0: 73 65 2c 20 22 69 6e 63 6f 6d 70 6c 65 74 65 20  se, "incomplete 
04f0: 69 6e 70 75 74 22 29 3b 0a 20 20 7d 0a 7d 0a 25  input");.  }.}.%
0500: 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 20 7b  stack_overflow {
0510: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
0520: 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 73  sg(pParse, "pars
0530: 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f  er stack overflo
0540: 77 22 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20 6e  w");.}..// The n
0550: 61 6d 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ame of the gener
0560: 61 74 65 64 20 70 72 6f 63 65 64 75 72 65 20 74  ated procedure t
0570: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
0580: 68 65 20 70 61 72 73 65 72 0a 2f 2f 20 69 73 20  he parser.// is 
0590: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 25 6e 61 6d  as follows:.%nam
05a0: 65 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 0a  e sqlite3Parser.
05b0: 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .// The followin
05c0: 67 20 74 65 78 74 20 69 73 20 69 6e 63 6c 75 64  g text is includ
05d0: 65 64 20 6e 65 61 72 20 74 68 65 20 62 65 67 69  ed near the begi
05e0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 43 20 73  nning of the C s
05f0: 6f 75 72 63 65 0a 2f 2f 20 63 6f 64 65 20 66 69  ource.// code fi
0600: 6c 65 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  le that implemen
0610: 74 73 20 74 68 65 20 70 61 72 73 65 72 2e 0a 2f  ts the parser../
0620: 2f 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 23 69 6e  /.%include {.#in
0630: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0640: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62  .h"../*.** Disab
0650: 6c 65 20 61 6c 6c 20 65 72 72 6f 72 20 72 65 63  le all error rec
0660: 6f 76 65 72 79 20 70 72 6f 63 65 73 73 69 6e 67  overy processing
0670: 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 70   in the parser p
0680: 75 73 68 2d 64 6f 77 6e 0a 2a 2a 20 61 75 74 6f  ush-down.** auto
0690: 6d 61 74 6f 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e  maton..*/.#defin
06a0: 65 20 59 59 4e 4f 45 52 52 4f 52 52 45 43 4f 56  e YYNOERRORRECOV
06b0: 45 52 59 20 31 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  ERY 1../*.** Mak
06c0: 65 20 79 79 74 65 73 74 63 61 73 65 28 29 20 74  e yytestcase() t
06d0: 68 65 20 73 61 6d 65 20 61 73 20 74 65 73 74 63  he same as testc
06e0: 61 73 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  ase().*/.#define
06f0: 20 79 79 74 65 73 74 63 61 73 65 28 58 29 20 74   yytestcase(X) t
0700: 65 73 74 63 61 73 65 28 58 29 0a 0a 2f 2a 0a 2a  estcase(X)../*.*
0710: 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
0720: 73 71 6c 69 74 65 33 50 61 72 73 65 72 46 72 65  sqlite3ParserFre
0730: 65 28 29 20 77 69 6c 6c 20 6e 65 76 65 72 20 62  e() will never b
0740: 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  e called with a 
0750: 6e 75 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  null.** pointer.
0760: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 59 59 50 41  .*/.#define YYPA
0770: 52 53 45 46 52 45 45 4e 45 56 45 52 4e 55 4c 4c  RSEFREENEVERNULL
0780: 20 31 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 65   1../*.** In the
0790: 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 2c 20 74   amalgamation, t
07a0: 68 65 20 70 61 72 73 65 2e 63 20 66 69 6c 65 20  he parse.c file 
07b0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 6c 65 6d  generated by lem
07c0: 6f 6e 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 6f  on and the.** to
07d0: 6b 65 6e 69 7a 65 2e 63 20 66 69 6c 65 20 61 72  kenize.c file ar
07e0: 65 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 2e 20  e concatenated. 
07f0: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 73   In that case, s
0800: 71 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28  qlite3RunParser(
0810: 29 0a 2a 2a 20 68 61 73 20 61 63 63 65 73 73 20  ).** has access 
0820: 74 6f 20 74 68 65 20 74 68 65 20 73 69 7a 65 20  to the the size 
0830: 6f 66 20 74 68 65 20 79 79 50 61 72 73 65 72 20  of the yyParser 
0840: 6f 62 6a 65 63 74 20 61 6e 64 20 73 6f 20 74 68  object and so th
0850: 65 20 70 61 72 73 65 72 0a 2a 2a 20 65 6e 67 69  e parser.** engi
0860: 6e 65 20 63 61 6e 20 62 65 20 61 6c 6c 6f 63 61  ne can be alloca
0870: 74 65 64 20 66 72 6f 6d 20 73 74 61 63 6b 2e 20  ted from stack. 
0880: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 6f   In that case, o
0890: 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  nly the.** sqlit
08a0: 65 33 50 61 72 73 65 72 49 6e 69 74 28 29 20 61  e3ParserInit() a
08b0: 6e 64 20 73 71 6c 69 74 65 33 50 61 72 73 65 72  nd sqlite3Parser
08c0: 46 69 6e 61 6c 69 7a 65 28 29 20 72 6f 75 74 69  Finalize() routi
08d0: 6e 65 73 20 61 72 65 20 69 6e 76 6f 6b 65 64 0a  nes are invoked.
08e0: 2a 2a 20 61 6e 64 20 74 68 65 20 73 71 6c 69 74  ** and the sqlit
08f0: 65 33 50 61 72 73 65 72 41 6c 6c 6f 63 28 29 20  e3ParserAlloc() 
0900: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 72 73 65  and sqlite3Parse
0910: 72 46 72 65 65 28 29 20 72 6f 75 74 69 6e 65 73  rFree() routines
0920: 20 63 61 6e 20 62 65 0a 2a 2a 20 6f 6d 69 74 74   can be.** omitt
0930: 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ed..*/.#ifdef SQ
0940: 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41 54 49 4f  LITE_AMALGAMATIO
0950: 4e 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74  N.# define sqlit
0960: 65 33 50 61 72 73 65 72 5f 45 4e 47 49 4e 45 41  e3Parser_ENGINEA
0970: 4c 57 41 59 53 4f 4e 53 54 41 43 4b 20 31 0a 23  LWAYSONSTACK 1.#
0980: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74  endif../*.** Alt
0990: 65 72 6e 61 74 69 76 65 20 64 61 74 61 74 79 70  ernative datatyp
09a0: 65 20 66 6f 72 20 74 68 65 20 61 72 67 75 6d 65  e for the argume
09b0: 6e 74 20 74 6f 20 74 68 65 20 6d 61 6c 6c 6f 63  nt to the malloc
09c0: 28 29 20 72 6f 75 74 69 6e 65 20 70 61 73 73 65  () routine passe
09d0: 64 0a 2a 2a 20 69 6e 74 6f 20 73 71 6c 69 74 65  d.** into sqlite
09e0: 33 50 61 72 73 65 72 41 6c 6c 6f 63 28 29 2e 20  3ParserAlloc(). 
09f0: 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20   The default is 
0a00: 73 69 7a 65 5f 74 2e 0a 2a 2f 0a 23 64 65 66 69  size_t..*/.#defi
0a10: 6e 65 20 59 59 4d 41 4c 4c 4f 43 41 52 47 54 59  ne YYMALLOCARGTY
0a20: 50 45 20 20 75 36 34 0a 0a 2f 2a 0a 2a 2a 20 41  PE  u64../*.** A
0a30: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0a40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
0a50: 63 74 75 72 65 20 64 65 73 63 72 69 62 65 73 20  cture describes 
0a60: 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 0a 2a  the event of a.*
0a70: 2a 20 54 52 49 47 47 45 52 2e 20 20 22 61 22 20  * TRIGGER.  "a" 
0a80: 69 73 20 74 68 65 20 65 76 65 6e 74 20 74 79 70  is the event typ
0a90: 65 2c 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 50 44  e, one of TK_UPD
0aa0: 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 0a  ATE, TK_INSERT,.
0ab0: 2a 2a 20 54 4b 5f 44 45 4c 45 54 45 2c 20 6f 72  ** TK_DELETE, or
0ac0: 20 54 4b 5f 49 4e 53 54 45 41 44 2e 20 20 49 66   TK_INSTEAD.  If
0ad0: 20 74 68 65 20 65 76 65 6e 74 20 69 73 20 6f 66   the event is of
0ae0: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20   the form.**.** 
0af0: 20 20 20 20 20 55 50 44 41 54 45 20 4f 4e 20 28       UPDATE ON (
0b00: 61 2c 62 2c 63 29 0a 2a 2a 0a 2a 2a 20 54 68 65  a,b,c).**.** The
0b10: 6e 20 74 68 65 20 22 62 22 20 49 64 4c 69 73 74  n the "b" IdList
0b20: 20 72 65 63 6f 72 64 73 20 74 68 65 20 6c 69 73   records the lis
0b30: 74 20 22 61 2c 62 2c 63 22 2e 0a 2a 2f 0a 73 74  t "a,b,c"..*/.st
0b40: 72 75 63 74 20 54 72 69 67 45 76 65 6e 74 20 7b  ruct TrigEvent {
0b50: 20 69 6e 74 20 61 3b 20 49 64 4c 69 73 74 20 2a   int a; IdList *
0b60: 20 62 3b 20 7d 3b 0a 0a 73 74 72 75 63 74 20 46   b; };..struct F
0b70: 72 61 6d 65 42 6f 75 6e 64 20 20 20 20 20 7b 20  rameBound     { 
0b80: 69 6e 74 20 65 54 79 70 65 3b 20 45 78 70 72 20  int eType; Expr 
0b90: 2a 70 45 78 70 72 3b 20 7d 3b 0a 0a 2f 2a 0a 2a  *pExpr; };../*.*
0ba0: 2a 20 44 69 73 61 62 6c 65 20 6c 6f 6f 6b 61 73  * Disable lookas
0bb0: 69 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ide memory alloc
0bc0: 61 74 69 6f 6e 20 66 6f 72 20 6f 62 6a 65 63 74  ation for object
0bd0: 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 0a  s that might be.
0be0: 2a 2a 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  ** shared across
0bf0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
0c00: 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tions..*/.static
0c10: 20 76 6f 69 64 20 64 69 73 61 62 6c 65 4c 6f 6f   void disableLoo
0c20: 6b 61 73 69 64 65 28 50 61 72 73 65 20 2a 70 50  kaside(Parse *pP
0c30: 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d  arse){.  pParse-
0c40: 3e 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  >disableLookasid
0c50: 65 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 64  e++;.  pParse->d
0c60: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69  b->lookaside.bDi
0c70: 73 61 62 6c 65 2b 2b 3b 0a 7d 0a 0a 7d 20 2f 2f  sable++;.}..} //
0c80: 20 65 6e 64 20 25 69 6e 63 6c 75 64 65 0a 0a 2f   end %include../
0c90: 2f 20 49 6e 70 75 74 20 69 73 20 61 20 73 69 6e  / Input is a sin
0ca0: 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 0a  gle SQL command.
0cb0: 69 6e 70 75 74 20 3a 3a 3d 20 63 6d 64 6c 69 73  input ::= cmdlis
0cc0: 74 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 63  t..cmdlist ::= c
0cd0: 6d 64 6c 69 73 74 20 65 63 6d 64 2e 0a 63 6d 64  mdlist ecmd..cmd
0ce0: 6c 69 73 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a 65  list ::= ecmd..e
0cf0: 63 6d 64 20 3a 3a 3d 20 53 45 4d 49 2e 0a 65 63  cmd ::= SEMI..ec
0d00: 6d 64 20 3a 3a 3d 20 63 6d 64 78 20 53 45 4d 49  md ::= cmdx SEMI
0d10: 2e 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..%ifndef SQLITE
0d20: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 65 63  _OMIT_EXPLAIN.ec
0d30: 6d 64 20 3a 3a 3d 20 65 78 70 6c 61 69 6e 20 63  md ::= explain c
0d40: 6d 64 78 2e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d  mdx..explain ::=
0d50: 20 45 58 50 4c 41 49 4e 2e 20 20 20 20 20 20 20   EXPLAIN.       
0d60: 20 20 20 20 20 20 20 7b 20 70 50 61 72 73 65 2d         { pParse-
0d70: 3e 65 78 70 6c 61 69 6e 20 3d 20 31 3b 20 7d 0a  >explain = 1; }.
0d80: 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c  explain ::= EXPL
0d90: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 20  AIN QUERY PLAN. 
0da0: 20 20 7b 20 70 50 61 72 73 65 2d 3e 65 78 70 6c    { pParse->expl
0db0: 61 69 6e 20 3d 20 32 3b 20 7d 0a 25 65 6e 64 69  ain = 2; }.%endi
0dc0: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  f  SQLITE_OMIT_E
0dd0: 58 50 4c 41 49 4e 0a 63 6d 64 78 20 3a 3a 3d 20  XPLAIN.cmdx ::= 
0de0: 63 6d 64 2e 20 20 20 20 20 20 20 20 20 20 20 7b  cmd.           {
0df0: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0e00: 64 69 6e 67 28 70 50 61 72 73 65 29 3b 20 7d 0a  ding(pParse); }.
0e10: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
0e20: 2f 2f 2f 2f 2f 2f 20 42 65 67 69 6e 20 61 6e 64  ////// Begin and
0e30: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
0e40: 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  s. /////////////
0e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
0e60: 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 42 45 47 49  //..cmd ::= BEGI
0e70: 4e 20 74 72 61 6e 73 74 79 70 65 28 59 29 20 74  N transtype(Y) t
0e80: 72 61 6e 73 5f 6f 70 74 2e 20 20 7b 73 71 6c 69  rans_opt.  {sqli
0e90: 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
0ea0: 69 6f 6e 28 70 50 61 72 73 65 2c 20 59 29 3b 7d  ion(pParse, Y);}
0eb0: 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 2e  .trans_opt ::= .
0ec0: 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54  .trans_opt ::= T
0ed0: 52 41 4e 53 41 43 54 49 4f 4e 2e 0a 74 72 61 6e  RANSACTION..tran
0ee0: 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41  s_opt ::= TRANSA
0ef0: 43 54 49 4f 4e 20 6e 6d 2e 0a 25 74 79 70 65 20  CTION nm..%type 
0f00: 74 72 61 6e 73 74 79 70 65 20 7b 69 6e 74 7d 0a  transtype {int}.
0f10: 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d  transtype(A) ::=
0f20: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b   .             {
0f30: 41 20 3d 20 54 4b 5f 44 45 46 45 52 52 45 44 3b  A = TK_DEFERRED;
0f40: 7d 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a  }.transtype(A) :
0f50: 3a 3d 20 44 45 46 45 52 52 45 44 28 58 29 2e 20  := DEFERRED(X). 
0f60: 20 7b 41 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76   {A = @X; /*A-ov
0f70: 65 72 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 74 72  erwrites-X*/}.tr
0f80: 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 49  anstype(A) ::= I
0f90: 4d 4d 45 44 49 41 54 45 28 58 29 2e 20 7b 41 20  MMEDIATE(X). {A 
0fa0: 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  = @X; /*A-overwr
0fb0: 69 74 65 73 2d 58 2a 2f 7d 0a 74 72 61 6e 73 74  ites-X*/}.transt
0fc0: 79 70 65 28 41 29 20 3a 3a 3d 20 45 58 43 4c 55  ype(A) ::= EXCLU
0fd0: 53 49 56 45 28 58 29 2e 20 7b 41 20 3d 20 40 58  SIVE(X). {A = @X
0fe0: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
0ff0: 2d 58 2a 2f 7d 0a 63 6d 64 20 3a 3a 3d 20 43 4f  -X*/}.cmd ::= CO
1000: 4d 4d 49 54 7c 45 4e 44 28 58 29 20 74 72 61 6e  MMIT|END(X) tran
1010: 73 5f 6f 70 74 2e 20 20 20 7b 73 71 6c 69 74 65  s_opt.   {sqlite
1020: 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  3EndTransaction(
1030: 70 50 61 72 73 65 2c 40 58 29 3b 7d 0a 63 6d 64  pParse,@X);}.cmd
1040: 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 28 58 29   ::= ROLLBACK(X)
1050: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20   trans_opt.     
1060: 7b 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73  {sqlite3EndTrans
1070: 61 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 40 58  action(pParse,@X
1080: 29 3b 7d 0a 0a 73 61 76 65 70 6f 69 6e 74 5f 6f  );}..savepoint_o
1090: 70 74 20 3a 3a 3d 20 53 41 56 45 50 4f 49 4e 54  pt ::= SAVEPOINT
10a0: 2e 0a 73 61 76 65 70 6f 69 6e 74 5f 6f 70 74 20  ..savepoint_opt 
10b0: 3a 3a 3d 20 2e 0a 63 6d 64 20 3a 3a 3d 20 53 41  ::= ..cmd ::= SA
10c0: 56 45 50 4f 49 4e 54 20 6e 6d 28 58 29 2e 20 7b  VEPOINT nm(X). {
10d0: 0a 20 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f  .  sqlite3Savepo
10e0: 69 6e 74 28 70 50 61 72 73 65 2c 20 53 41 56 45  int(pParse, SAVE
10f0: 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 26 58 29  POINT_BEGIN, &X)
1100: 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45 4c 45  ;.}.cmd ::= RELE
1110: 41 53 45 20 73 61 76 65 70 6f 69 6e 74 5f 6f 70  ASE savepoint_op
1120: 74 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c  t nm(X). {.  sql
1130: 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 70 50  ite3Savepoint(pP
1140: 61 72 73 65 2c 20 53 41 56 45 50 4f 49 4e 54 5f  arse, SAVEPOINT_
1150: 52 45 4c 45 41 53 45 2c 20 26 58 29 3b 0a 7d 0a  RELEASE, &X);.}.
1160: 63 6d 64 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b  cmd ::= ROLLBACK
1170: 20 74 72 61 6e 73 5f 6f 70 74 20 54 4f 20 73 61   trans_opt TO sa
1180: 76 65 70 6f 69 6e 74 5f 6f 70 74 20 6e 6d 28 58  vepoint_opt nm(X
1190: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 61  ). {.  sqlite3Sa
11a0: 76 65 70 6f 69 6e 74 28 70 50 61 72 73 65 2c 20  vepoint(pParse, 
11b0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
11c0: 43 4b 2c 20 26 58 29 3b 0a 7d 0a 0a 2f 2f 2f 2f  CK, &X);.}..////
11d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11e0: 2f 20 54 68 65 20 43 52 45 41 54 45 20 54 41 42  / The CREATE TAB
11f0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  LE statement ///
1200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
1220: 20 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61 62 6c   ::= create_tabl
1230: 65 20 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61  e create_table_a
1240: 72 67 73 2e 0a 63 72 65 61 74 65 5f 74 61 62 6c  rgs..create_tabl
1250: 65 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 20 74  e ::= createkw t
1260: 65 6d 70 28 54 29 20 54 41 42 4c 45 20 69 66 6e  emp(T) TABLE ifn
1270: 6f 74 65 78 69 73 74 73 28 45 29 20 6e 6d 28 59  otexists(E) nm(Y
1280: 29 20 64 62 6e 6d 28 5a 29 2e 20 7b 0a 20 20 20  ) dbnm(Z). {.   
1290: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
12a0: 65 28 70 50 61 72 73 65 2c 26 59 2c 26 5a 2c 54  e(pParse,&Y,&Z,T
12b0: 2c 30 2c 30 2c 45 29 3b 0a 7d 0a 63 72 65 61 74  ,0,0,E);.}.creat
12c0: 65 6b 77 28 41 29 20 3a 3a 3d 20 43 52 45 41 54  ekw(A) ::= CREAT
12d0: 45 28 41 29 2e 20 20 7b 64 69 73 61 62 6c 65 4c  E(A).  {disableL
12e0: 6f 6f 6b 61 73 69 64 65 28 70 50 61 72 73 65 29  ookaside(pParse)
12f0: 3b 7d 0a 0a 25 74 79 70 65 20 69 66 6e 6f 74 65  ;}..%type ifnote
1300: 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66 6e 6f  xists {int}.ifno
1310: 74 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 2e  texists(A) ::= .
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
1330: 20 3d 20 30 3b 7d 0a 69 66 6e 6f 74 65 78 69 73   = 0;}.ifnotexis
1340: 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 4e 4f 54  ts(A) ::= IF NOT
1350: 20 45 58 49 53 54 53 2e 20 7b 41 20 3d 20 31 3b   EXISTS. {A = 1;
1360: 7d 0a 25 74 79 70 65 20 74 65 6d 70 20 7b 69 6e  }.%type temp {in
1370: 74 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  t}.%ifndef SQLIT
1380: 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 74 65  E_OMIT_TEMPDB.te
1390: 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20  mp(A) ::= TEMP. 
13a0: 20 7b 41 20 3d 20 31 3b 7d 0a 25 65 6e 64 69 66   {A = 1;}.%endif
13b0: 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45    SQLITE_OMIT_TE
13c0: 4d 50 44 42 0a 74 65 6d 70 28 41 29 20 3a 3a 3d  MPDB.temp(A) ::=
13d0: 20 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d   .      {A = 0;}
13e0: 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72  .create_table_ar
13f0: 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e  gs ::= LP column
1400: 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74 5f 6f 70  list conslist_op
1410: 74 28 58 29 20 52 50 28 45 29 20 74 61 62 6c 65  t(X) RP(E) table
1420: 5f 6f 70 74 69 6f 6e 73 28 46 29 2e 20 7b 0a 20  _options(F). {. 
1430: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
1440: 28 70 50 61 72 73 65 2c 26 58 2c 26 45 2c 46 2c  (pParse,&X,&E,F,
1450: 30 29 3b 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62  0);.}.create_tab
1460: 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 41 53 20 73  le_args ::= AS s
1470: 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71  elect(S). {.  sq
1480: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
1490: 61 72 73 65 2c 30 2c 30 2c 30 2c 53 29 3b 0a 20  arse,0,0,0,S);. 
14a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
14b0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
14c0: 20 53 29 3b 0a 7d 0a 25 74 79 70 65 20 74 61 62   S);.}.%type tab
14d0: 6c 65 5f 6f 70 74 69 6f 6e 73 20 7b 69 6e 74 7d  le_options {int}
14e0: 0a 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73 28 41  .table_options(A
14f0: 29 20 3a 3a 3d 20 2e 20 20 20 20 7b 41 20 3d 20  ) ::= .    {A = 
1500: 30 3b 7d 0a 74 61 62 6c 65 5f 6f 70 74 69 6f 6e  0;}.table_option
1510: 73 28 41 29 20 3a 3a 3d 20 57 49 54 48 4f 55 54  s(A) ::= WITHOUT
1520: 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 69 66 28 20   nm(X). {.  if( 
1530: 58 2e 6e 3d 3d 35 20 26 26 20 73 71 6c 69 74 65  X.n==5 && sqlite
1540: 33 5f 73 74 72 6e 69 63 6d 70 28 58 2e 7a 2c 22  3_strnicmp(X.z,"
1550: 72 6f 77 69 64 22 2c 35 29 3d 3d 30 20 29 7b 0a  rowid",5)==0 ){.
1560: 20 20 20 20 41 20 3d 20 54 46 5f 57 69 74 68 6f      A = TF_Witho
1570: 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56  utRowid | TF_NoV
1580: 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 7d  isibleRowid;.  }
1590: 65 6c 73 65 7b 0a 20 20 20 20 41 20 3d 20 30 3b  else{.    A = 0;
15a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15b0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
15c0: 6b 6e 6f 77 6e 20 74 61 62 6c 65 20 6f 70 74 69  known table opti
15d0: 6f 6e 3a 20 25 2e 2a 73 22 2c 20 58 2e 6e 2c 20  on: %.*s", X.n, 
15e0: 58 2e 7a 29 3b 0a 20 20 7d 0a 7d 0a 63 6f 6c 75  X.z);.  }.}.colu
15f0: 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d  mnlist ::= colum
1600: 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63 6f 6c 75  nlist COMMA colu
1610: 6d 6e 6e 61 6d 65 20 63 61 72 67 6c 69 73 74 2e  mnname carglist.
1620: 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20  .columnlist ::= 
1630: 63 6f 6c 75 6d 6e 6e 61 6d 65 20 63 61 72 67 6c  columnname cargl
1640: 69 73 74 2e 0a 63 6f 6c 75 6d 6e 6e 61 6d 65 28  ist..columnname(
1650: 41 29 20 3a 3a 3d 20 6e 6d 28 41 29 20 74 79 70  A) ::= nm(A) typ
1660: 65 74 6f 6b 65 6e 28 59 29 2e 20 7b 73 71 6c 69  etoken(Y). {sqli
1670: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61  te3AddColumn(pPa
1680: 72 73 65 2c 26 41 2c 26 59 29 3b 7d 0a 0a 2f 2f  rse,&A,&Y);}..//
1690: 20 44 65 63 6c 61 72 65 20 73 6f 6d 65 20 74 6f   Declare some to
16a0: 6b 65 6e 73 20 65 61 72 6c 79 20 69 6e 20 6f 72  kens early in or
16b0: 64 65 72 20 74 6f 20 69 6e 66 6c 75 65 6e 63 65  der to influence
16c0: 20 74 68 65 69 72 20 76 61 6c 75 65 73 2c 20 74   their values, t
16d0: 6f 20 0a 2f 2f 20 69 6d 70 72 6f 76 65 20 70 65  o .// improve pe
16e0: 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 72 65  rformance and re
16f0: 64 75 63 65 20 74 68 65 20 65 78 65 63 75 74 61  duce the executa
1700: 62 6c 65 20 73 69 7a 65 2e 20 20 54 68 65 20 67  ble size.  The g
1710: 6f 61 6c 20 68 65 72 65 20 69 73 0a 2f 2f 20 74  oal here is.// t
1720: 6f 20 67 65 74 20 74 68 65 20 22 6a 75 6d 70 22  o get the "jump"
1730: 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e 20 49   operations in I
1740: 53 4e 55 4c 4c 20 74 68 72 6f 75 67 68 20 45 53  SNULL through ES
1750: 43 41 50 45 20 74 6f 20 68 61 76 65 20 6e 75 6d  CAPE to have num
1760: 65 72 69 63 0a 2f 2f 20 76 61 6c 75 65 73 20 74  eric.// values t
1770: 68 61 74 20 61 72 65 20 65 61 72 6c 79 20 65 6e  hat are early en
1780: 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 6c 6c  ough so that all
1790: 20 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 73   jump operations
17a0: 20 61 72 65 20 63 6c 75 73 74 65 72 65 64 0a 2f   are clustered./
17b0: 2f 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  / at the beginni
17c0: 6e 67 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 20 41 42  ng..//.%token AB
17d0: 4f 52 54 20 41 43 54 49 4f 4e 20 41 46 54 45 52  ORT ACTION AFTER
17e0: 20 41 4e 41 4c 59 5a 45 20 41 53 43 20 41 54 54   ANALYZE ASC ATT
17f0: 41 43 48 20 42 45 46 4f 52 45 20 42 45 47 49 4e  ACH BEFORE BEGIN
1800: 20 42 59 20 43 41 53 43 41 44 45 20 43 41 53 54   BY CASCADE CAST
1810: 2e 0a 25 74 6f 6b 65 6e 20 43 4f 4e 46 4c 49 43  ..%token CONFLIC
1820: 54 20 44 41 54 41 42 41 53 45 20 44 45 46 45 52  T DATABASE DEFER
1830: 52 45 44 20 44 45 53 43 20 44 45 54 41 43 48 20  RED DESC DETACH 
1840: 45 41 43 48 20 45 4e 44 20 45 58 43 4c 55 53 49  EACH END EXCLUSI
1850: 56 45 20 45 58 50 4c 41 49 4e 20 46 41 49 4c 2e  VE EXPLAIN FAIL.
1860: 0a 25 74 6f 6b 65 6e 20 4f 52 20 41 4e 44 20 4e  .%token OR AND N
1870: 4f 54 20 49 53 20 4d 41 54 43 48 20 4c 49 4b 45  OT IS MATCH LIKE
1880: 5f 4b 57 20 42 45 54 57 45 45 4e 20 49 4e 20 49  _KW BETWEEN IN I
1890: 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 4e 45  SNULL NOTNULL NE
18a0: 20 45 51 2e 0a 25 74 6f 6b 65 6e 20 47 54 20 4c   EQ..%token GT L
18b0: 45 20 4c 54 20 47 45 20 45 53 43 41 50 45 2e 0a  E LT GE ESCAPE..
18c0: 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .// The followin
18d0: 67 20 64 69 72 65 63 74 69 76 65 20 63 61 75 73  g directive caus
18e0: 65 73 20 74 6f 6b 65 6e 73 20 41 42 4f 52 54 2c  es tokens ABORT,
18f0: 20 41 46 54 45 52 2c 20 41 53 43 2c 20 65 74 63   AFTER, ASC, etc
1900: 2e 20 74 6f 0a 2f 2f 20 66 61 6c 6c 62 61 63 6b  . to.// fallback
1910: 20 74 6f 20 49 44 20 69 66 20 74 68 65 79 20 77   to ID if they w
1920: 69 6c 6c 20 6e 6f 74 20 70 61 72 73 65 20 61 73  ill not parse as
1930: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
1940: 76 61 6c 75 65 2e 0a 2f 2f 20 54 68 69 73 20 6f  value..// This o
1950: 62 76 69 61 74 65 73 20 74 68 65 20 6e 65 65 64  bviates the need
1960: 20 66 6f 72 20 74 68 65 20 22 69 64 22 20 6e 6f   for the "id" no
1970: 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2f 2f 0a 25 66  nterminal..//.%f
1980: 61 6c 6c 62 61 63 6b 20 49 44 0a 20 20 41 42 4f  allback ID.  ABO
1990: 52 54 20 41 43 54 49 4f 4e 20 41 46 54 45 52 20  RT ACTION AFTER 
19a0: 41 4e 41 4c 59 5a 45 20 41 53 43 20 41 54 54 41  ANALYZE ASC ATTA
19b0: 43 48 20 42 45 46 4f 52 45 20 42 45 47 49 4e 20  CH BEFORE BEGIN 
19c0: 42 59 20 43 41 53 43 41 44 45 20 43 41 53 54 20  BY CASCADE CAST 
19d0: 43 4f 4c 55 4d 4e 4b 57 0a 20 20 43 4f 4e 46 4c  COLUMNKW.  CONFL
19e0: 49 43 54 20 44 41 54 41 42 41 53 45 20 44 45 46  ICT DATABASE DEF
19f0: 45 52 52 45 44 20 44 45 53 43 20 44 45 54 41 43  ERRED DESC DETAC
1a00: 48 20 44 4f 0a 20 20 45 41 43 48 20 45 4e 44 20  H DO.  EACH END 
1a10: 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49  EXCLUSIVE EXPLAI
1a20: 4e 20 46 41 49 4c 20 46 4f 52 0a 20 20 49 47 4e  N FAIL FOR.  IGN
1a30: 4f 52 45 20 49 4d 4d 45 44 49 41 54 45 20 49 4e  ORE IMMEDIATE IN
1a40: 49 54 49 41 4c 4c 59 20 49 4e 53 54 45 41 44 20  ITIALLY INSTEAD 
1a50: 4c 49 4b 45 5f 4b 57 20 4d 41 54 43 48 20 4e 4f  LIKE_KW MATCH NO
1a60: 20 50 4c 41 4e 0a 20 20 51 55 45 52 59 20 4b 45   PLAN.  QUERY KE
1a70: 59 20 4f 46 20 4f 46 46 53 45 54 20 50 52 41 47  Y OF OFFSET PRAG
1a80: 4d 41 20 52 41 49 53 45 20 52 45 43 55 52 53 49  MA RAISE RECURSI
1a90: 56 45 20 52 45 4c 45 41 53 45 20 52 45 50 4c 41  VE RELEASE REPLA
1aa0: 43 45 20 52 45 53 54 52 49 43 54 20 52 4f 57 20  CE RESTRICT ROW 
1ab0: 52 4f 57 53 0a 20 20 52 4f 4c 4c 42 41 43 4b 20  ROWS.  ROLLBACK 
1ac0: 53 41 56 45 50 4f 49 4e 54 20 54 45 4d 50 20 54  SAVEPOINT TEMP T
1ad0: 52 49 47 47 45 52 20 56 41 43 55 55 4d 20 56 49  RIGGER VACUUM VI
1ae0: 45 57 20 56 49 52 54 55 41 4c 20 57 49 54 48 20  EW VIRTUAL WITH 
1af0: 57 49 54 48 4f 55 54 0a 25 69 66 64 65 66 20 53  WITHOUT.%ifdef S
1b00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
1b10: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 45 58 43  UND_SELECT.  EXC
1b20: 45 50 54 20 49 4e 54 45 52 53 45 43 54 20 55 4e  EPT INTERSECT UN
1b30: 49 4f 4e 0a 25 65 6e 64 69 66 20 53 51 4c 49 54  ION.%endif SQLIT
1b40: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
1b50: 53 45 4c 45 43 54 0a 25 69 66 6e 64 65 66 20 53  SELECT.%ifndef S
1b60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
1b70: 57 46 55 4e 43 0a 20 20 43 55 52 52 45 4e 54 20  WFUNC.  CURRENT 
1b80: 46 4f 4c 4c 4f 57 49 4e 47 20 50 41 52 54 49 54  FOLLOWING PARTIT
1b90: 49 4f 4e 20 50 52 45 43 45 44 49 4e 47 20 52 41  ION PRECEDING RA
1ba0: 4e 47 45 20 55 4e 42 4f 55 4e 44 45 44 0a 20 20  NGE UNBOUNDED.  
1bb0: 45 58 43 4c 55 44 45 20 47 52 4f 55 50 53 20 4f  EXCLUDE GROUPS O
1bc0: 54 48 45 52 53 20 54 49 45 53 0a 25 65 6e 64 69  THERS TIES.%endi
1bd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
1be0: 4e 44 4f 57 46 55 4e 43 0a 20 20 52 45 49 4e 44  NDOWFUNC.  REIND
1bf0: 45 58 20 52 45 4e 41 4d 45 20 43 54 49 4d 45 5f  EX RENAME CTIME_
1c00: 4b 57 20 49 46 0a 20 20 2e 0a 25 77 69 6c 64 63  KW IF.  ..%wildc
1c10: 61 72 64 20 41 4e 59 2e 0a 0a 2f 2f 20 44 65 66  ard ANY...// Def
1c20: 69 6e 65 20 6f 70 65 72 61 74 6f 72 20 70 72 65  ine operator pre
1c30: 63 65 64 65 6e 63 65 20 65 61 72 6c 79 20 73 6f  cedence early so
1c40: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74 68   that this is th
1c50: 65 20 66 69 72 73 74 20 6f 63 63 75 72 72 65 6e  e first occurren
1c60: 63 65 0a 2f 2f 20 6f 66 20 74 68 65 20 6f 70 65  ce.// of the ope
1c70: 72 61 74 6f 72 20 74 6f 6b 65 6e 73 20 69 6e 20  rator tokens in 
1c80: 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 4b 65  the grammer.  Ke
1c90: 65 70 69 6e 67 20 74 68 65 20 6f 70 65 72 61 74  eping the operat
1ca0: 6f 72 73 20 74 6f 67 65 74 68 65 72 0a 2f 2f 20  ors together.// 
1cb0: 63 61 75 73 65 73 20 74 68 65 6d 20 74 6f 20 62  causes them to b
1cc0: 65 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65 67  e assigned integ
1cd0: 65 72 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  er values that a
1ce0: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
1cf0: 72 2c 0a 2f 2f 20 77 68 69 63 68 20 6b 65 65 70  r,.// which keep
1d00: 73 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20  s parser tables 
1d10: 73 6d 61 6c 6c 65 72 2e 0a 2f 2f 0a 2f 2f 20 54  smaller..//.// T
1d20: 68 65 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  he token values 
1d30: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 73  assigned to thes
1d40: 65 20 73 79 6d 62 6f 6c 73 20 69 73 20 64 65 74  e symbols is det
1d50: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
1d60: 72 64 65 72 0a 2f 2f 20 69 6e 20 77 68 69 63 68  rder.// in which
1d70: 20 6c 65 6d 6f 6e 20 66 69 72 73 74 20 73 65 65   lemon first see
1d80: 73 20 74 68 65 6d 2e 20 20 49 74 20 6d 75 73 74  s them.  It must
1d90: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1da0: 74 20 49 53 4e 55 4c 4c 2f 4e 4f 54 4e 55 4c 4c  t ISNULL/NOTNULL
1db0: 2c 0a 2f 2f 20 4e 45 2f 45 51 2c 20 47 54 2f 4c  ,.// NE/EQ, GT/L
1dc0: 45 2c 20 61 6e 64 20 47 45 2f 4c 54 20 61 72 65  E, and GE/LT are
1dd0: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 6f 6e   separated by on
1de0: 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75  ly a single valu
1df0: 65 2e 20 20 53 65 65 0a 2f 2f 20 74 68 65 20 73  e.  See.// the s
1e00: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1e10: 65 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  e() routine for 
1e20: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1e30: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 69 73 0a 2f  mation on this./
1e40: 2f 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2f 2f  / constraint..//
1e50: 0a 25 6c 65 66 74 20 4f 52 2e 0a 25 6c 65 66 74  .%left OR..%left
1e60: 20 41 4e 44 2e 0a 25 72 69 67 68 74 20 4e 4f 54   AND..%right NOT
1e70: 2e 0a 25 6c 65 66 74 20 49 53 20 4d 41 54 43 48  ..%left IS MATCH
1e80: 20 4c 49 4b 45 5f 4b 57 20 42 45 54 57 45 45 4e   LIKE_KW BETWEEN
1e90: 20 49 4e 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55   IN ISNULL NOTNU
1ea0: 4c 4c 20 4e 45 20 45 51 2e 0a 25 6c 65 66 74 20  LL NE EQ..%left 
1eb0: 47 54 20 4c 45 20 4c 54 20 47 45 2e 0a 25 72 69  GT LE LT GE..%ri
1ec0: 67 68 74 20 45 53 43 41 50 45 2e 0a 25 6c 65 66  ght ESCAPE..%lef
1ed0: 74 20 42 49 54 41 4e 44 20 42 49 54 4f 52 20 4c  t BITAND BITOR L
1ee0: 53 48 49 46 54 20 52 53 48 49 46 54 2e 0a 25 6c  SHIFT RSHIFT..%l
1ef0: 65 66 74 20 50 4c 55 53 20 4d 49 4e 55 53 2e 0a  eft PLUS MINUS..
1f00: 25 6c 65 66 74 20 53 54 41 52 20 53 4c 41 53 48  %left STAR SLASH
1f10: 20 52 45 4d 2e 0a 25 6c 65 66 74 20 43 4f 4e 43   REM..%left CONC
1f20: 41 54 2e 0a 25 6c 65 66 74 20 43 4f 4c 4c 41 54  AT..%left COLLAT
1f30: 45 2e 0a 25 72 69 67 68 74 20 42 49 54 4e 4f 54  E..%right BITNOT
1f40: 2e 0a 25 6e 6f 6e 61 73 73 6f 63 20 4f 4e 2e 0a  ..%nonassoc ON..
1f50: 0a 2f 2f 20 41 6e 20 49 44 45 4e 54 49 46 49 45  .// An IDENTIFIE
1f60: 52 20 63 61 6e 20 62 65 20 61 20 67 65 6e 65 72  R can be a gener
1f70: 69 63 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f  ic identifier, o
1f80: 72 20 6f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  r one of several
1f90: 0a 2f 2f 20 6b 65 79 77 6f 72 64 73 2e 20 20 41  .// keywords.  A
1fa0: 6e 79 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20  ny non-standard 
1fb0: 6b 65 79 77 6f 72 64 20 63 61 6e 20 61 6c 73 6f  keyword can also
1fc0: 20 62 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65   be an identifie
1fd0: 72 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 63 6c 61  r..//.%token_cla
1fe0: 73 73 20 69 64 20 20 49 44 7c 49 4e 44 45 58 45  ss id  ID|INDEXE
1ff0: 44 2e 0a 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73  D....// And "ids
2000: 22 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 65  " is an identife
2010: 72 2d 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a  r-or-string..//.
2020: 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 69 64 73  %token_class ids
2030: 20 20 49 44 7c 53 54 52 49 4e 47 2e 0a 0a 2f 2f    ID|STRING...//
2040: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   The name of a c
2050: 6f 6c 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20 63  olumn or table c
2060: 61 6e 20 62 65 20 61 6e 79 20 6f 66 20 74 68 65  an be any of the
2070: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a 25   following:.//.%
2080: 74 79 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a  type nm {Token}.
2090: 6e 6d 28 41 29 20 3a 3a 3d 20 69 64 28 41 29 2e  nm(A) ::= id(A).
20a0: 0a 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e  .nm(A) ::= STRIN
20b0: 47 28 41 29 2e 0a 6e 6d 28 41 29 20 3a 3a 3d 20  G(A)..nm(A) ::= 
20c0: 4a 4f 49 4e 5f 4b 57 28 41 29 2e 0a 0a 2f 2f 20  JOIN_KW(A)...// 
20d0: 41 20 74 79 70 65 74 6f 6b 65 6e 20 69 73 20 72  A typetoken is r
20e0: 65 61 6c 6c 79 20 7a 65 72 6f 20 6f 72 20 6d 6f  eally zero or mo
20f0: 72 65 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 66  re tokens that f
2100: 6f 72 6d 20 61 20 74 79 70 65 20 6e 61 6d 65 20  orm a type name 
2110: 73 75 63 68 0a 2f 2f 20 61 73 20 63 61 6e 20 62  such.// as can b
2120: 65 20 66 6f 75 6e 64 20 61 66 74 65 72 20 74 68  e found after th
2130: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e  e column name in
2140: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
2150: 73 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 20 4d 75  statement..// Mu
2160: 6c 74 69 70 6c 65 20 74 6f 6b 65 6e 73 20 61 72  ltiple tokens ar
2170: 65 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 20 74  e concatenated t
2180: 6f 20 66 6f 72 6d 20 74 68 65 20 76 61 6c 75 65  o form the value
2190: 20 6f 66 20 74 68 65 20 74 79 70 65 74 6f 6b 65   of the typetoke
21a0: 6e 2e 0a 2f 2f 0a 25 74 79 70 65 20 74 79 70 65  n..//.%type type
21b0: 74 6f 6b 65 6e 20 7b 54 6f 6b 65 6e 7d 0a 74 79  token {Token}.ty
21c0: 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 2e  petoken(A) ::= .
21d0: 20 20 20 7b 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a     {A.n = 0; A.z
21e0: 20 3d 20 30 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e   = 0;}.typetoken
21f0: 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65  (A) ::= typename
2200: 28 41 29 2e 0a 74 79 70 65 74 6f 6b 65 6e 28 41  (A)..typetoken(A
2210: 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 41  ) ::= typename(A
2220: 29 20 4c 50 20 73 69 67 6e 65 64 20 52 50 28 59  ) LP signed RP(Y
2230: 29 2e 20 7b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e  ). {.  A.n = (in
2240: 74 29 28 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 41  t)(&Y.z[Y.n] - A
2250: 2e 7a 29 3b 0a 7d 0a 74 79 70 65 74 6f 6b 65 6e  .z);.}.typetoken
2260: 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65  (A) ::= typename
2270: 28 41 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f  (A) LP signed CO
2280: 4d 4d 41 20 73 69 67 6e 65 64 20 52 50 28 59 29  MMA signed RP(Y)
2290: 2e 20 7b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74  . {.  A.n = (int
22a0: 29 28 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 41 2e  )(&Y.z[Y.n] - A.
22b0: 7a 29 3b 0a 7d 0a 25 74 79 70 65 20 74 79 70 65  z);.}.%type type
22c0: 6e 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70  name {Token}.typ
22d0: 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73  ename(A) ::= ids
22e0: 28 41 29 2e 0a 74 79 70 65 6e 61 6d 65 28 41 29  (A)..typename(A)
22f0: 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 41 29   ::= typename(A)
2300: 20 69 64 73 28 59 29 2e 20 7b 41 2e 6e 3d 59 2e   ids(Y). {A.n=Y.
2310: 6e 2b 28 69 6e 74 29 28 59 2e 7a 2d 41 2e 7a 29  n+(int)(Y.z-A.z)
2320: 3b 7d 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 70 6c  ;}.signed ::= pl
2330: 75 73 5f 6e 75 6d 2e 0a 73 69 67 6e 65 64 20 3a  us_num..signed :
2340: 3a 3d 20 6d 69 6e 75 73 5f 6e 75 6d 2e 0a 0a 2f  := minus_num.../
2350: 2f 20 54 68 65 20 73 63 61 6e 70 74 20 6e 6f 6e  / The scanpt non
2360: 2d 74 65 72 6d 69 6e 61 6c 20 74 61 6b 65 73 20  -terminal takes 
2370: 61 20 76 61 6c 75 65 20 77 68 69 63 68 20 69 73  a value which is
2380: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
2390: 65 0a 2f 2f 20 69 6e 70 75 74 20 74 65 78 74 20  e.// input text 
23a0: 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 6c 61  just past the la
23b0: 73 74 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61  st token that ha
23c0: 73 20 62 65 65 6e 20 73 68 69 66 74 65 64 20 69  s been shifted i
23d0: 6e 74 6f 0a 2f 2f 20 74 68 65 20 70 61 72 73 65  nto.// the parse
23e0: 72 2e 20 20 42 79 20 73 75 72 72 6f 75 6e 64 69  r.  By surroundi
23f0: 6e 67 20 73 6f 6d 65 20 70 68 72 61 73 65 20 69  ng some phrase i
2400: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 77 69  n the grammar wi
2410: 74 68 20 74 77 6f 0a 2f 2f 20 73 63 61 6e 70 74  th two.// scanpt
2420: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 2c 20   non-terminals, 
2430: 77 65 20 63 61 6e 20 63 61 70 74 75 72 65 20 74  we can capture t
2440: 68 65 20 69 6e 70 75 74 20 74 65 78 74 20 66 6f  he input text fo
2450: 72 20 74 68 61 74 20 70 68 72 61 73 65 2e 0a 2f  r that phrase../
2460: 2f 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2f  / For example:./
2470: 2f 0a 2f 2f 20 20 20 20 20 20 73 6f 6d 65 74 68  /.//      someth
2480: 69 6e 67 20 3a 3a 3d 20 2e 2e 2e 2e 20 73 63 61  ing ::= .... sca
2490: 6e 70 74 28 41 29 20 70 68 72 61 73 65 20 73 63  npt(A) phrase sc
24a0: 61 6e 70 74 28 5a 29 2e 0a 2f 2f 0a 2f 2f 20 54  anpt(Z)..//.// T
24b0: 68 65 20 74 65 78 74 20 74 68 61 74 20 69 73 20  he text that is 
24c0: 70 61 72 73 65 64 20 61 73 20 22 70 68 72 61 73  parsed as "phras
24d0: 65 22 20 69 73 20 61 20 73 74 72 69 6e 67 20 73  e" is a string s
24e0: 74 61 72 74 69 6e 67 20 61 74 20 41 0a 2f 2f 20  tarting at A.// 
24f0: 61 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 28  and containing (
2500: 69 6e 74 29 28 5a 2d 41 29 20 63 68 61 72 61 63  int)(Z-A) charac
2510: 74 65 72 73 2e 20 20 54 68 65 72 65 20 6d 69 67  ters.  There mig
2520: 68 74 20 62 65 20 73 6f 6d 65 20 65 78 74 72 61  ht be some extra
2530: 0a 2f 2f 20 77 68 69 74 65 73 70 61 63 65 20 6f  .// whitespace o
2540: 6e 20 65 69 74 68 65 72 20 65 6e 64 20 6f 66 20  n either end of 
2550: 74 68 65 20 74 65 78 74 2c 20 62 75 74 20 74 68  the text, but th
2560: 61 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65  at can be remove
2570: 64 20 69 6e 0a 2f 2f 20 70 6f 73 74 2d 70 72 6f  d in.// post-pro
2580: 63 65 73 73 69 6e 67 2c 20 69 66 20 6e 65 65 64  cessing, if need
2590: 65 64 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 63 61  ed..//.%type sca
25a0: 6e 70 74 20 7b 63 6f 6e 73 74 20 63 68 61 72 2a  npt {const char*
25b0: 7d 0a 73 63 61 6e 70 74 28 41 29 20 3a 3a 3d 20  }.scanpt(A) ::= 
25c0: 2e 20 7b 0a 20 20 61 73 73 65 72 74 28 20 79 79  . {.  assert( yy
25d0: 4c 6f 6f 6b 61 68 65 61 64 21 3d 59 59 4e 4f 43  Lookahead!=YYNOC
25e0: 4f 44 45 20 29 3b 0a 20 20 41 20 3d 20 79 79 4c  ODE );.  A = yyL
25f0: 6f 6f 6b 61 68 65 61 64 54 6f 6b 65 6e 2e 7a 3b  ookaheadToken.z;
2600: 0a 7d 0a 0a 2f 2f 20 22 63 61 72 67 6c 69 73 74  .}..// "carglist
2610: 22 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 61  " is a list of a
2620: 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72  dditional constr
2630: 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20  aints that come 
2640: 61 66 74 65 72 20 74 68 65 0a 2f 2f 20 63 6f 6c  after the.// col
2650: 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c  umn name and col
2660: 75 6d 6e 20 74 79 70 65 20 69 6e 20 61 20 43 52  umn type in a CR
2670: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
2680: 6d 65 6e 74 2e 0a 2f 2f 0a 63 61 72 67 6c 69 73  ment..//.carglis
2690: 74 20 3a 3a 3d 20 63 61 72 67 6c 69 73 74 20 63  t ::= carglist c
26a0: 63 6f 6e 73 2e 0a 63 61 72 67 6c 69 73 74 20 3a  cons..carglist :
26b0: 3a 3d 20 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43  := ..ccons ::= C
26c0: 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 28 58 29 2e  ONSTRAINT nm(X).
26d0: 20 20 20 20 20 20 20 20 20 20 20 7b 70 50 61 72             {pPar
26e0: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
26f0: 6d 65 20 3d 20 58 3b 7d 0a 63 63 6f 6e 73 20 3a  me = X;}.ccons :
2700: 3a 3d 20 44 45 46 41 55 4c 54 20 73 63 61 6e 70  := DEFAULT scanp
2710: 74 28 41 29 20 74 65 72 6d 28 58 29 20 73 63 61  t(A) term(X) sca
2720: 6e 70 74 28 5a 29 2e 0a 20 20 20 20 20 20 20 20  npt(Z)..        
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44      {sqlite3AddD
2750: 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72  efaultValue(pPar
2760: 73 65 2c 58 2c 41 2c 5a 29 3b 7d 0a 63 63 6f 6e  se,X,A,Z);}.ccon
2770: 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4c 50  s ::= DEFAULT LP
2780: 28 41 29 20 65 78 70 72 28 58 29 20 52 50 28 5a  (A) expr(X) RP(Z
2790: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
27b0: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
27c0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 58 2c  tValue(pParse,X,
27d0: 41 2e 7a 2b 31 2c 5a 2e 7a 29 3b 7d 0a 63 63 6f  A.z+1,Z.z);}.cco
27e0: 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50  ns ::= DEFAULT P
27f0: 4c 55 53 28 41 29 20 74 65 72 6d 28 58 29 20 73  LUS(A) term(X) s
2800: 63 61 6e 70 74 28 5a 29 2e 0a 20 20 20 20 20 20  canpt(Z)..      
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
2830: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
2840: 61 72 73 65 2c 58 2c 41 2e 7a 2c 5a 29 3b 7d 0a  arse,X,A.z,Z);}.
2850: 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c  ccons ::= DEFAUL
2860: 54 20 4d 49 4e 55 53 28 41 29 20 74 65 72 6d 28  T MINUS(A) term(
2870: 58 29 20 73 63 61 6e 70 74 28 5a 29 2e 20 20 20  X) scanpt(Z).   
2880: 20 20 20 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d     {.  Expr *p =
2890: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
28a0: 61 72 73 65 2c 20 54 4b 5f 55 4d 49 4e 55 53 2c  arse, TK_UMINUS,
28b0: 20 58 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   X, 0);.  sqlite
28c0: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
28d0: 28 70 50 61 72 73 65 2c 70 2c 41 2e 7a 2c 5a 29  (pParse,p,A.z,Z)
28e0: 3b 0a 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45  ;.}.ccons ::= DE
28f0: 46 41 55 4c 54 20 73 63 61 6e 70 74 20 69 64 28  FAULT scanpt id(
2900: 58 29 2e 20 20 20 20 20 20 20 7b 0a 20 20 45 78  X).       {.  Ex
2910: 70 72 20 2a 70 20 3d 20 74 6f 6b 65 6e 45 78 70  pr *p = tokenExp
2920: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 54 52  r(pParse, TK_STR
2930: 49 4e 47 2c 20 58 29 3b 0a 20 20 69 66 28 20 70  ING, X);.  if( p
2940: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2950: 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65  xprIdToTrueFalse
2960: 28 70 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  (p);.    testcas
2970: 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55  e( p->op==TK_TRU
2980: 45 46 41 4c 53 45 20 26 26 20 73 71 6c 69 74 65  EFALSE && sqlite
2990: 33 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28  3ExprTruthValue(
29a0: 70 29 20 29 3b 0a 20 20 7d 0a 20 20 20 20 73 71  p) );.  }.    sq
29b0: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
29c0: 61 6c 75 65 28 70 50 61 72 73 65 2c 70 2c 58 2e  alue(pParse,p,X.
29d0: 7a 2c 58 2e 7a 2b 58 2e 6e 29 3b 0a 7d 0a 0a 2f  z,X.z+X.n);.}../
29e0: 2f 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f  / In addition to
29f0: 20 74 68 65 20 74 79 70 65 20 6e 61 6d 65 2c 20   the type name, 
2a00: 77 65 20 61 6c 73 6f 20 63 61 72 65 20 61 62 6f  we also care abo
2a10: 75 74 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  ut the primary k
2a20: 65 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 55 45  ey and.// UNIQUE
2a30: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2f 2f   constraints..//
2a40: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 55 4c 4c 20  .ccons ::= NULL 
2a50: 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a 3a  onconf..ccons ::
2a60: 3d 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f 6e  = NOT NULL oncon
2a70: 66 28 52 29 2e 20 20 20 20 7b 73 71 6c 69 74 65  f(R).    {sqlite
2a80: 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 70 50 61 72  3AddNotNull(pPar
2a90: 73 65 2c 20 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a  se, R);}.ccons :
2aa0: 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73  := PRIMARY KEY s
2ab0: 6f 72 74 6f 72 64 65 72 28 5a 29 20 6f 6e 63 6f  ortorder(Z) onco
2ac0: 6e 66 28 52 29 20 61 75 74 6f 69 6e 63 28 49 29  nf(R) autoinc(I)
2ad0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 50 72     {sqlite3AddPr
2b00: 69 6d 61 72 79 4b 65 79 28 70 50 61 72 73 65 2c  imaryKey(pParse,
2b10: 30 2c 52 2c 49 2c 5a 29 3b 7d 0a 63 63 6f 6e 73  0,R,I,Z);}.ccons
2b20: 20 3a 3a 3d 20 55 4e 49 51 55 45 20 6f 6e 63 6f   ::= UNIQUE onco
2b30: 6e 66 28 52 29 2e 20 20 20 20 20 20 7b 73 71 6c  nf(R).      {sql
2b40: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
2b50: 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 30 2c 52  pParse,0,0,0,0,R
2b60: 2c 30 2c 30 2c 30 2c 30 2c 0a 20 20 20 20 20 20  ,0,0,0,0,.      
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2b90: 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e 49 51  ITE_IDXTYPE_UNIQ
2ba0: 55 45 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  UE);}.ccons ::= 
2bb0: 43 48 45 43 4b 20 4c 50 20 65 78 70 72 28 58 29  CHECK LP expr(X)
2bc0: 20 52 50 2e 20 20 20 7b 73 71 6c 69 74 65 33 41   RP.   {sqlite3A
2bd0: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
2be0: 74 28 70 50 61 72 73 65 2c 58 29 3b 7d 0a 63 63  t(pParse,X);}.cc
2bf0: 6f 6e 73 20 3a 3a 3d 20 52 45 46 45 52 45 4e 43  ons ::= REFERENC
2c00: 45 53 20 6e 6d 28 54 29 20 65 69 64 6c 69 73 74  ES nm(T) eidlist
2c10: 5f 6f 70 74 28 54 41 29 20 72 65 66 61 72 67 73  _opt(TA) refargs
2c20: 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (R)..           
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72        {sqlite3Cr
2c50: 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 70  eateForeignKey(p
2c60: 50 61 72 73 65 2c 30 2c 26 54 2c 54 41 2c 52 29  Parse,0,&T,TA,R)
2c70: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 64 65 66  ;}.ccons ::= def
2c80: 65 72 5f 73 75 62 63 6c 61 75 73 65 28 44 29 2e  er_subclause(D).
2c90: 20 20 20 20 7b 73 71 6c 69 74 65 33 44 65 66 65      {sqlite3Defe
2ca0: 72 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72  rForeignKey(pPar
2cb0: 73 65 2c 44 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  se,D);}.ccons ::
2cc0: 3d 20 43 4f 4c 4c 41 54 45 20 69 64 73 28 43 29  = COLLATE ids(C)
2cd0: 2e 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65  .        {sqlite
2ce0: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
2cf0: 70 50 61 72 73 65 2c 20 26 43 29 3b 7d 0a 0a 2f  pParse, &C);}../
2d00: 2f 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20 41  / The optional A
2d10: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
2d20: 77 6f 72 64 0a 25 74 79 70 65 20 61 75 74 6f 69  word.%type autoi
2d30: 6e 63 20 7b 69 6e 74 7d 0a 61 75 74 6f 69 6e 63  nc {int}.autoinc
2d40: 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (X) ::= .       
2d50: 20 20 20 7b 58 20 3d 20 30 3b 7d 0a 61 75 74 6f     {X = 0;}.auto
2d60: 69 6e 63 28 58 29 20 3a 3a 3d 20 41 55 54 4f 49  inc(X) ::= AUTOI
2d70: 4e 43 52 2e 20 20 7b 58 20 3d 20 31 3b 7d 0a 0a  NCR.  {X = 1;}..
2d80: 2f 2f 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  // The next grou
2d90: 70 20 6f 66 20 72 75 6c 65 73 20 70 61 72 73 65  p of rules parse
2da0: 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
2db0: 74 6f 20 61 20 52 45 46 45 52 45 4e 43 45 53 20  to a REFERENCES 
2dc0: 63 6c 61 75 73 65 0a 2f 2f 20 74 68 61 74 20 64  clause.// that d
2dd0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
2de0: 72 65 66 65 72 65 6e 74 69 61 6c 20 69 6e 74 65  referential inte
2df0: 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  grity checking i
2e00: 73 20 64 65 66 65 72 72 65 64 20 6f 72 0a 2f 2f  s deferred or.//
2e10: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 61 6e   or immediate an
2e20: 64 20 77 68 69 63 68 20 64 65 74 65 72 6d 69 6e  d which determin
2e30: 65 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74 6f  e what action to
2e40: 20 74 61 6b 65 20 69 66 20 61 20 72 65 66 2d 69   take if a ref-i
2e50: 6e 74 65 67 0a 2f 2f 20 63 68 65 63 6b 20 66 61  nteg.// check fa
2e60: 69 6c 73 2e 0a 2f 2f 0a 25 74 79 70 65 20 72 65  ils..//.%type re
2e70: 66 61 72 67 73 20 7b 69 6e 74 7d 0a 72 65 66 61  fargs {int}.refa
2e80: 72 67 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  rgs(A) ::= .    
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
2ea0: 41 20 3d 20 4f 45 5f 4e 6f 6e 65 2a 30 78 30 31  A = OE_None*0x01
2eb0: 30 31 3b 20 2f 2a 20 45 56 3a 20 52 2d 31 39 38  01; /* EV: R-198
2ec0: 30 33 2d 34 35 38 38 34 20 2a 2f 7d 0a 72 65 66  03-45884 */}.ref
2ed0: 61 72 67 73 28 41 29 20 3a 3a 3d 20 72 65 66 61  args(A) ::= refa
2ee0: 72 67 73 28 41 29 20 72 65 66 61 72 67 28 59 29  rgs(A) refarg(Y)
2ef0: 2e 20 7b 20 41 20 3d 20 28 41 20 26 20 7e 59 2e  . { A = (A & ~Y.
2f00: 6d 61 73 6b 29 20 7c 20 59 2e 76 61 6c 75 65 3b  mask) | Y.value;
2f10: 20 7d 0a 25 74 79 70 65 20 72 65 66 61 72 67 20   }.%type refarg 
2f20: 7b 73 74 72 75 63 74 20 7b 69 6e 74 20 76 61 6c  {struct {int val
2f30: 75 65 3b 20 69 6e 74 20 6d 61 73 6b 3b 7d 7d 0a  ue; int mask;}}.
2f40: 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4d 41  refarg(A) ::= MA
2f50: 54 43 48 20 6e 6d 2e 20 20 20 20 20 20 20 20 20  TCH nm.         
2f60: 20 20 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d       { A.value =
2f70: 20 30 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d   0;     A.mask =
2f80: 20 30 78 30 30 30 30 30 30 3b 20 7d 0a 72 65 66   0x000000; }.ref
2f90: 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 49 4e  arg(A) ::= ON IN
2fa0: 53 45 52 54 20 72 65 66 61 63 74 2e 20 20 20 20  SERT refact.    
2fb0: 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b    { A.value = 0;
2fc0: 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78       A.mask = 0x
2fd0: 30 30 30 30 30 30 3b 20 7d 0a 72 65 66 61 72 67  000000; }.refarg
2fe0: 28 41 29 20 3a 3a 3d 20 4f 4e 20 44 45 4c 45 54  (A) ::= ON DELET
2ff0: 45 20 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b  E refact(X).   {
3000: 20 41 2e 76 61 6c 75 65 20 3d 20 58 3b 20 20 20   A.value = X;   
3010: 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30    A.mask = 0x000
3020: 30 66 66 3b 20 7d 0a 72 65 66 61 72 67 28 41 29  0ff; }.refarg(A)
3030: 20 3a 3a 3d 20 4f 4e 20 55 50 44 41 54 45 20 72   ::= ON UPDATE r
3040: 65 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e  efact(X).   { A.
3050: 76 61 6c 75 65 20 3d 20 58 3c 3c 38 3b 20 20 41  value = X<<8;  A
3060: 2e 6d 61 73 6b 20 3d 20 30 78 30 30 66 66 30 30  .mask = 0x00ff00
3070: 3b 20 7d 0a 25 74 79 70 65 20 72 65 66 61 63 74  ; }.%type refact
3080: 20 7b 69 6e 74 7d 0a 72 65 66 61 63 74 28 41 29   {int}.refact(A)
3090: 20 3a 3a 3d 20 53 45 54 20 4e 55 4c 4c 2e 20 20   ::= SET NULL.  
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
30b0: 3d 20 4f 45 5f 53 65 74 4e 75 6c 6c 3b 20 20 2f  = OE_SetNull;  /
30c0: 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34 35  * EV: R-33326-45
30d0: 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41  252 */}.refact(A
30e0: 29 20 3a 3a 3d 20 53 45 54 20 44 45 46 41 55 4c  ) ::= SET DEFAUL
30f0: 54 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20 41  T.           { A
3100: 20 3d 20 4f 45 5f 53 65 74 44 66 6c 74 3b 20 20   = OE_SetDflt;  
3110: 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34  /* EV: R-33326-4
3120: 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28  5252 */}.refact(
3130: 41 29 20 3a 3a 3d 20 43 41 53 43 41 44 45 2e 20  A) ::= CASCADE. 
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
3150: 41 20 3d 20 4f 45 5f 43 61 73 63 61 64 65 3b 20  A = OE_Cascade; 
3160: 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d   /* EV: R-33326-
3170: 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74  45252 */}.refact
3180: 28 41 29 20 3a 3a 3d 20 52 45 53 54 52 49 43 54  (A) ::= RESTRICT
3190: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
31a0: 20 41 20 3d 20 4f 45 5f 52 65 73 74 72 69 63 74   A = OE_Restrict
31b0: 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36  ; /* EV: R-33326
31c0: 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63  -45252 */}.refac
31d0: 74 28 41 29 20 3a 3a 3d 20 4e 4f 20 41 43 54 49  t(A) ::= NO ACTI
31e0: 4f 4e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
31f0: 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 20 20  { A = OE_None;  
3200: 20 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32     /* EV: R-3332
3210: 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 25 74 79 70  6-45252 */}.%typ
3220: 65 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  e defer_subclaus
3230: 65 20 7b 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75  e {int}.defer_su
3240: 62 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 4e  bclause(A) ::= N
3250: 4f 54 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e  OT DEFERRABLE in
3260: 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64  it_deferred_pred
3270: 5f 6f 70 74 2e 20 20 20 20 20 7b 41 20 3d 20 30  _opt.     {A = 0
3280: 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75  ;}.defer_subclau
3290: 73 65 28 41 29 20 3a 3a 3d 20 44 45 46 45 52 52  se(A) ::= DEFERR
32a0: 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72 72  ABLE init_deferr
32b0: 65 64 5f 70 72 65 64 5f 6f 70 74 28 58 29 2e 20  ed_pred_opt(X). 
32c0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 74       {A = X;}.%t
32d0: 79 70 65 20 69 6e 69 74 5f 64 65 66 65 72 72 65  ype init_deferre
32e0: 64 5f 70 72 65 64 5f 6f 70 74 20 7b 69 6e 74 7d  d_pred_opt {int}
32f0: 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70  .init_deferred_p
3300: 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  red_opt(A) ::= .
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
3330: 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72  init_deferred_pr
3340: 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e  ed_opt(A) ::= IN
3350: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
3360: 2e 20 20 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 69  .     {A = 1;}.i
3370: 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65  nit_deferred_pre
3380: 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49  d_opt(A) ::= INI
3390: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
33a0: 2e 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 63  .    {A = 0;}..c
33b0: 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  onslist_opt(A) :
33c0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e               {A.
33e0: 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20 30 3b 7d  n = 0; A.z = 0;}
33f0: 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41 29  .conslist_opt(A)
3400: 20 3a 3a 3d 20 43 4f 4d 4d 41 28 41 29 20 63 6f   ::= COMMA(A) co
3410: 6e 73 6c 69 73 74 2e 0a 63 6f 6e 73 6c 69 73 74  nslist..conslist
3420: 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 74 63   ::= conslist tc
3430: 6f 6e 73 63 6f 6d 6d 61 20 74 63 6f 6e 73 2e 0a  onscomma tcons..
3440: 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 74 63 6f  conslist ::= tco
3450: 6e 73 2e 0a 74 63 6f 6e 73 63 6f 6d 6d 61 20 3a  ns..tconscomma :
3460: 3a 3d 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20  := COMMA.       
3470: 20 20 20 20 20 7b 70 50 61 72 73 65 2d 3e 63 6f       {pParse->co
3480: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d  nstraintName.n =
3490: 20 30 3b 7d 0a 74 63 6f 6e 73 63 6f 6d 6d 61 20   0;}.tconscomma 
34a0: 3a 3a 3d 20 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20  ::= ..tcons ::= 
34b0: 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 28 58 29  CONSTRAINT nm(X)
34c0: 2e 20 20 20 20 20 20 7b 70 50 61 72 73 65 2d 3e  .      {pParse->
34d0: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 20 3d  constraintName =
34e0: 20 58 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50   X;}.tcons ::= P
34f0: 52 49 4d 41 52 59 20 4b 45 59 20 4c 50 20 73 6f  RIMARY KEY LP so
3500: 72 74 6c 69 73 74 28 58 29 20 61 75 74 6f 69 6e  rtlist(X) autoin
3510: 63 28 49 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52  c(I) RP onconf(R
3520: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 50      {sqlite3AddP
3550: 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72 73 65  rimaryKey(pParse
3560: 2c 58 2c 52 2c 49 2c 30 29 3b 7d 0a 74 63 6f 6e  ,X,R,I,0);}.tcon
3570: 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 4c 50 20  s ::= UNIQUE LP 
3580: 73 6f 72 74 6c 69 73 74 28 58 29 20 52 50 20 6f  sortlist(X) RP o
3590: 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20 20  nconf(R)..      
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
35c0: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
35d0: 50 61 72 73 65 2c 30 2c 30 2c 30 2c 58 2c 52 2c  Parse,0,0,0,X,R,
35e0: 30 2c 30 2c 30 2c 30 2c 0a 20 20 20 20 20 20 20  0,0,0,0,.       
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 55  SQLITE_IDXTYPE_U
3620: 4e 49 51 55 45 29 3b 7d 0a 74 63 6f 6e 73 20 3a  NIQUE);}.tcons :
3630: 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70 72  := CHECK LP expr
3640: 28 45 29 20 52 50 20 6f 6e 63 6f 6e 66 2e 0a 20  (E) RP onconf.. 
3650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3670: 7b 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b  {sqlite3AddCheck
3680: 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
3690: 65 2c 45 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d  e,E);}.tcons ::=
36a0: 20 46 4f 52 45 49 47 4e 20 4b 45 59 20 4c 50 20   FOREIGN KEY LP 
36b0: 65 69 64 6c 69 73 74 28 46 41 29 20 52 50 0a 20  eidlist(FA) RP. 
36c0: 20 20 20 20 20 20 20 20 20 52 45 46 45 52 45 4e           REFEREN
36d0: 43 45 53 20 6e 6d 28 54 29 20 65 69 64 6c 69 73  CES nm(T) eidlis
36e0: 74 5f 6f 70 74 28 54 41 29 20 72 65 66 61 72 67  t_opt(TA) refarg
36f0: 73 28 52 29 20 64 65 66 65 72 5f 73 75 62 63 6c  s(R) defer_subcl
3700: 61 75 73 65 5f 6f 70 74 28 44 29 2e 20 7b 0a 20  ause_opt(D). {. 
3710: 20 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65     sqlite3Create
3720: 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73  ForeignKey(pPars
3730: 65 2c 20 46 41 2c 20 26 54 2c 20 54 41 2c 20 52  e, FA, &T, TA, R
3740: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
3750: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 70 50  ferForeignKey(pP
3760: 61 72 73 65 2c 20 44 29 3b 0a 7d 0a 25 74 79 70  arse, D);.}.%typ
3770: 65 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  e defer_subclaus
3780: 65 5f 6f 70 74 20 7b 69 6e 74 7d 0a 64 65 66 65  e_opt {int}.defe
3790: 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28  r_subclause_opt(
37a0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
37c0: 20 30 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c   0;}.defer_subcl
37d0: 61 75 73 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  ause_opt(A) ::= 
37e0: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28  defer_subclause(
37f0: 41 29 2e 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c  A)...// The foll
3800: 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73  owing is a non-s
3810: 74 61 6e 64 61 72 64 20 65 78 74 65 6e 73 69 6f  tandard extensio
3820: 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73  n that allows us
3830: 20 74 6f 20 64 65 63 6c 61 72 65 20 74 68 65 0a   to declare the.
3840: 2f 2f 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  // default behav
3850: 69 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20 69  ior when there i
3860: 73 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  s a constraint c
3870: 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70  onflict..//.%typ
3880: 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25  e onconf {int}.%
3890: 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74  type orconf {int
38a0: 7d 0a 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74  }.%type resolvet
38b0: 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66  ype {int}.onconf
38c0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44         {A = OE_D
38f0: 65 66 61 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28  efault;}.onconf(
3900: 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49  A) ::= ON CONFLI
3910: 43 54 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58  CT resolvetype(X
3920: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f  ).    {A = X;}.o
3930: 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20  rconf(A) ::= .  
3940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3950: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3960: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72   OE_Default;}.or
3970: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72  conf(A) ::= OR r
3980: 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20  esolvetype(X).  
3990: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
39a0: 58 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28  X;}.resolvetype(
39b0: 41 29 20 3a 3a 3d 20 72 61 69 73 65 74 79 70 65  A) ::= raisetype
39c0: 28 41 29 2e 0a 72 65 73 6f 6c 76 65 74 79 70 65  (A)..resolvetype
39d0: 28 41 29 20 3a 3a 3d 20 49 47 4e 4f 52 45 2e 20  (A) ::= IGNORE. 
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39f0: 20 20 7b 41 20 3d 20 4f 45 5f 49 67 6e 6f 72 65    {A = OE_Ignore
3a00: 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41  ;}.resolvetype(A
3a10: 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20  ) ::= REPLACE.  
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  {A = OE_Replace;
3a40: 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }../////////////
3a50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
3a60: 65 20 44 52 4f 50 20 54 41 42 4c 45 20 2f 2f 2f  e DROP TABLE ///
3a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a90: 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52  //.//.cmd ::= DR
3aa0: 4f 50 20 54 41 42 4c 45 20 69 66 65 78 69 73 74  OP TABLE ifexist
3ab0: 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29  s(E) fullname(X)
3ac0: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72 6f  . {.  sqlite3Dro
3ad0: 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 58  pTable(pParse, X
3ae0: 2c 20 30 2c 20 45 29 3b 0a 7d 0a 25 74 79 70 65  , 0, E);.}.%type
3af0: 20 69 66 65 78 69 73 74 73 20 7b 69 6e 74 7d 0a   ifexists {int}.
3b00: 69 66 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20  ifexists(A) ::= 
3b10: 49 46 20 45 58 49 53 54 53 2e 20 20 20 7b 41 20  IF EXISTS.   {A 
3b20: 3d 20 31 3b 7d 0a 69 66 65 78 69 73 74 73 28 41  = 1;}.ifexists(A
3b30: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
3b40: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f     {A = 0;}..///
3b50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b60: 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 56 49  // The CREATE VI
3b70: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  EW statement ///
3b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69  //////////.//.%i
3ba0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3bb0: 54 5f 56 49 45 57 0a 63 6d 64 20 3a 3a 3d 20 63  T_VIEW.cmd ::= c
3bc0: 72 65 61 74 65 6b 77 28 58 29 20 74 65 6d 70 28  reatekw(X) temp(
3bd0: 54 29 20 56 49 45 57 20 69 66 6e 6f 74 65 78 69  T) VIEW ifnotexi
3be0: 73 74 73 28 45 29 20 6e 6d 28 59 29 20 64 62 6e  sts(E) nm(Y) dbn
3bf0: 6d 28 5a 29 20 65 69 64 6c 69 73 74 5f 6f 70 74  m(Z) eidlist_opt
3c00: 28 43 29 0a 20 20 20 20 20 20 20 20 20 20 41 53  (C).          AS
3c10: 20 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20   select(S). {.  
3c20: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
3c30: 77 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59  w(pParse, &X, &Y
3c40: 2c 20 26 5a 2c 20 43 2c 20 53 2c 20 54 2c 20 45  , &Z, C, S, T, E
3c50: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f  );.}.cmd ::= DRO
3c60: 50 20 56 49 45 57 20 69 66 65 78 69 73 74 73 28  P VIEW ifexists(
3c70: 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20  E) fullname(X). 
3c80: 7b 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54  {.  sqlite3DropT
3c90: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 58 2c 20  able(pParse, X, 
3ca0: 31 2c 20 45 29 3b 0a 7d 0a 25 65 6e 64 69 66 20  1, E);.}.%endif 
3cb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
3cc0: 57 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  W../////////////
3cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
3ce0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3cf0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
3d00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3d10: 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65  //.//.cmd ::= se
3d20: 6c 65 63 74 28 58 29 2e 20 20 7b 0a 20 20 53 65  lect(X).  {.  Se
3d30: 6c 65 63 74 44 65 73 74 20 64 65 73 74 20 3d 20  lectDest dest = 
3d40: 7b 53 52 54 5f 4f 75 74 70 75 74 2c 20 30 2c 20  {SRT_Output, 0, 
3d50: 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 73  0, 0, 0, 0};.  s
3d60: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
3d70: 72 73 65 2c 20 58 2c 20 26 64 65 73 74 29 3b 0a  rse, X, &dest);.
3d80: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3d90: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
3da0: 2c 20 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  , X);.}..%type s
3db0: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
3dc0: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
3dd0: 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  ct {sqlite3Selec
3de0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
3df0: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
3e00: 73 65 6c 65 63 74 6e 6f 77 69 74 68 20 7b 53 65  selectnowith {Se
3e10: 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  lect*}.%destruct
3e20: 6f 72 20 73 65 6c 65 63 74 6e 6f 77 69 74 68 20  or selectnowith 
3e30: 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65  {sqlite3SelectDe
3e40: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
3e50: 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 6f 6e 65   $$);}.%type one
3e60: 73 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d  select {Select*}
3e70: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f 6e 65  .%destructor one
3e80: 73 65 6c 65 63 74 20 7b 73 71 6c 69 74 65 33 53  select {sqlite3S
3e90: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72  electDelete(pPar
3ea0: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25  se->db, $$);}..%
3eb0: 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 0a 20  include {.  /*. 
3ec0: 20 2a 2a 20 46 6f 72 20 61 20 63 6f 6d 70 6f 75   ** For a compou
3ed0: 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
3ee0: 65 6e 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 70  ent, make sure p
3ef0: 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d  ->pPrior->pNext=
3f00: 3d 70 20 66 6f 72 0a 20 20 2a 2a 20 61 6c 6c 20  =p for.  ** all 
3f10: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
3f20: 6c 69 73 74 2e 20 20 41 6e 64 20 6d 61 6b 65 20  list.  And make 
3f30: 73 75 72 65 20 6c 69 73 74 20 6c 65 6e 67 74 68  sure list length
3f40: 20 64 6f 65 73 20 6e 6f 74 20 65 78 63 65 65 64   does not exceed
3f50: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4c 49 4d  .  ** SQLITE_LIM
3f60: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
3f70: 43 54 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  CT..  */.  stati
3f80: 63 20 76 6f 69 64 20 70 61 72 73 65 72 44 6f 75  c void parserDou
3f90: 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74 28 50 61  bleLinkSelect(Pa
3fa0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c  rse *pParse, Sel
3fb0: 65 63 74 20 2a 70 29 7b 0a 20 20 20 20 69 66 28  ect *p){.    if(
3fc0: 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20   p->pPrior ){.  
3fd0: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78      Select *pNex
3fe0: 74 20 3d 20 30 2c 20 2a 70 4c 6f 6f 70 3b 0a 20  t = 0, *pLoop;. 
3ff0: 20 20 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63       int mxSelec
4000: 74 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  t, cnt = 0;.    
4010: 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70    for(pLoop=p; p
4020: 4c 6f 6f 70 3b 20 70 4e 65 78 74 3d 70 4c 6f 6f  Loop; pNext=pLoo
4030: 70 2c 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e  p, pLoop=pLoop->
4040: 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a  pPrior, cnt++){.
4050: 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70          pLoop->p
4060: 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20  Next = pNext;.  
4070: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 73 65 6c        pLoop->sel
4080: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70  Flags |= SF_Comp
4090: 6f 75 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ound;.      }.  
40a0: 20 20 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46      if( (p->selF
40b0: 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56  lags & SF_MultiV
40c0: 61 6c 75 65 29 3d 3d 30 20 26 26 20 0a 20 20 20  alue)==0 && .   
40d0: 20 20 20 20 20 28 6d 78 53 65 6c 65 63 74 20 3d       (mxSelect =
40e0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69   pParse->db->aLi
40f0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
4100: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
4110: 5d 29 3e 30 20 26 26 0a 20 20 20 20 20 20 20 20  ])>0 &&.        
4120: 63 6e 74 3e 6d 78 53 65 6c 65 63 74 0a 20 20 20  cnt>mxSelect.   
4130: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71     ){.        sq
4140: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4150: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
4160: 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e  terms in compoun
4170: 64 20 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20  d SELECT");.    
4180: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
4190: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
41a0: 4f 4d 49 54 5f 43 54 45 0a 73 65 6c 65 63 74 28  OMIT_CTE.select(
41b0: 41 29 20 3a 3a 3d 20 57 49 54 48 20 77 71 6c 69  A) ::= WITH wqli
41c0: 73 74 28 57 29 20 73 65 6c 65 63 74 6e 6f 77 69  st(W) selectnowi
41d0: 74 68 28 58 29 2e 20 7b 0a 20 20 53 65 6c 65 63  th(X). {.  Selec
41e0: 74 20 2a 70 20 3d 20 58 3b 0a 20 20 69 66 28 20  t *p = X;.  if( 
41f0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 69 74  p ){.    p->pWit
4200: 68 20 3d 20 57 3b 0a 20 20 20 20 70 61 72 73 65  h = W;.    parse
4210: 72 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63  rDoubleLinkSelec
4220: 74 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  t(pParse, p);.  
4230: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
4240: 65 33 57 69 74 68 44 65 6c 65 74 65 28 70 50 61  e3WithDelete(pPa
4250: 72 73 65 2d 3e 64 62 2c 20 57 29 3b 0a 20 20 7d  rse->db, W);.  }
4260: 0a 20 20 41 20 3d 20 70 3b 0a 7d 0a 73 65 6c 65  .  A = p;.}.sele
4270: 63 74 28 41 29 20 3a 3a 3d 20 57 49 54 48 20 52  ct(A) ::= WITH R
4280: 45 43 55 52 53 49 56 45 20 77 71 6c 69 73 74 28  ECURSIVE wqlist(
4290: 57 29 20 73 65 6c 65 63 74 6e 6f 77 69 74 68 28  W) selectnowith(
42a0: 58 29 2e 20 7b 0a 20 20 53 65 6c 65 63 74 20 2a  X). {.  Select *
42b0: 70 20 3d 20 58 3b 0a 20 20 69 66 28 20 70 20 29  p = X;.  if( p )
42c0: 7b 0a 20 20 20 20 70 2d 3e 70 57 69 74 68 20 3d  {.    p->pWith =
42d0: 20 57 3b 0a 20 20 20 20 70 61 72 73 65 72 44 6f   W;.    parserDo
42e0: 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74 28 70  ubleLinkSelect(p
42f0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 65 6c  Parse, p);.  }el
4300: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  se{.    sqlite3W
4310: 69 74 68 44 65 6c 65 74 65 28 70 50 61 72 73 65  ithDelete(pParse
4320: 2d 3e 64 62 2c 20 57 29 3b 0a 20 20 7d 0a 20 20  ->db, W);.  }.  
4330: 41 20 3d 20 70 3b 0a 7d 0a 25 65 6e 64 69 66 20  A = p;.}.%endif 
4340: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
4350: 54 45 20 2a 2f 0a 73 65 6c 65 63 74 28 41 29 20  TE */.select(A) 
4360: 3a 3a 3d 20 73 65 6c 65 63 74 6e 6f 77 69 74 68  ::= selectnowith
4370: 28 58 29 2e 20 7b 0a 20 20 53 65 6c 65 63 74 20  (X). {.  Select 
4380: 2a 70 20 3d 20 58 3b 0a 20 20 69 66 28 20 70 20  *p = X;.  if( p 
4390: 29 7b 0a 20 20 20 20 70 61 72 73 65 72 44 6f 75  ){.    parserDou
43a0: 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74 28 70 50  bleLinkSelect(pP
43b0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 20 20  arse, p);.  }.  
43c0: 41 20 3d 20 70 3b 20 2f 2a 41 2d 6f 76 65 72 77  A = p; /*A-overw
43d0: 72 69 74 65 73 2d 58 2a 2f 0a 7d 0a 0a 73 65 6c  rites-X*/.}..sel
43e0: 65 63 74 6e 6f 77 69 74 68 28 41 29 20 3a 3a 3d  ectnowith(A) ::=
43f0: 20 6f 6e 65 73 65 6c 65 63 74 28 41 29 2e 0a 25   oneselect(A)..%
4400: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4410: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
4420: 43 54 0a 73 65 6c 65 63 74 6e 6f 77 69 74 68 28  CT.selectnowith(
4430: 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74 6e 6f 77  A) ::= selectnow
4440: 69 74 68 28 41 29 20 6d 75 6c 74 69 73 65 6c 65  ith(A) multisele
4450: 63 74 5f 6f 70 28 59 29 20 6f 6e 65 73 65 6c 65  ct_op(Y) onesele
4460: 63 74 28 5a 29 2e 20 20 7b 0a 20 20 53 65 6c 65  ct(Z).  {.  Sele
4470: 63 74 20 2a 70 52 68 73 20 3d 20 5a 3b 0a 20 20  ct *pRhs = Z;.  
4480: 53 65 6c 65 63 74 20 2a 70 4c 68 73 20 3d 20 41  Select *pLhs = A
4490: 3b 0a 20 20 69 66 28 20 70 52 68 73 20 26 26 20  ;.  if( pRhs && 
44a0: 70 52 68 73 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  pRhs->pPrior ){.
44b0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 46 72      SrcList *pFr
44c0: 6f 6d 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 78 3b  om;.    Token x;
44d0: 0a 20 20 20 20 78 2e 6e 20 3d 20 30 3b 0a 20 20  .    x.n = 0;.  
44e0: 20 20 70 61 72 73 65 72 44 6f 75 62 6c 65 4c 69    parserDoubleLi
44f0: 6e 6b 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  nkSelect(pParse,
4500: 20 70 52 68 73 29 3b 0a 20 20 20 20 70 46 72 6f   pRhs);.    pFro
4510: 6d 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  m = sqlite3SrcLi
4520: 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
4530: 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 78  (pParse,0,0,0,&x
4540: 2c 70 52 68 73 2c 30 2c 30 29 3b 0a 20 20 20 20  ,pRhs,0,0);.    
4550: 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 53 65  pRhs = sqlite3Se
4560: 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c 30  lectNew(pParse,0
4570: 2c 70 46 72 6f 6d 2c 30 2c 30 2c 30 2c 30 2c 30  ,pFrom,0,0,0,0,0
4580: 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ,0);.  }.  if( p
4590: 52 68 73 20 29 7b 0a 20 20 20 20 70 52 68 73 2d  Rhs ){.    pRhs-
45a0: 3e 6f 70 20 3d 20 28 75 38 29 59 3b 0a 20 20 20  >op = (u8)Y;.   
45b0: 20 70 52 68 73 2d 3e 70 50 72 69 6f 72 20 3d 20   pRhs->pPrior = 
45c0: 70 4c 68 73 3b 0a 20 20 20 20 69 66 28 20 41 4c  pLhs;.    if( AL
45d0: 57 41 59 53 28 70 4c 68 73 29 20 29 20 70 4c 68  WAYS(pLhs) ) pLh
45e0: 73 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e  s->selFlags &= ~
45f0: 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20  SF_MultiValue;. 
4600: 20 20 20 70 52 68 73 2d 3e 73 65 6c 46 6c 61 67     pRhs->selFlag
4610: 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61  s &= ~SF_MultiVa
4620: 6c 75 65 3b 0a 20 20 20 20 69 66 28 20 59 21 3d  lue;.    if( Y!=
4630: 54 4b 5f 41 4c 4c 20 29 20 70 50 61 72 73 65 2d  TK_ALL ) pParse-
4640: 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20 3d 20 31  >hasCompound = 1
4650: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
4660: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
4670: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
4680: 4c 68 73 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20  Lhs);.  }.  A = 
4690: 70 52 68 73 3b 0a 7d 0a 25 74 79 70 65 20 6d 75  pRhs;.}.%type mu
46a0: 6c 74 69 73 65 6c 65 63 74 5f 6f 70 20 7b 69 6e  ltiselect_op {in
46b0: 74 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f  t}.multiselect_o
46c0: 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 28 4f  p(A) ::= UNION(O
46d0: 50 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  P).             
46e0: 7b 41 20 3d 20 40 4f 50 3b 20 2f 2a 41 2d 6f 76  {A = @OP; /*A-ov
46f0: 65 72 77 72 69 74 65 73 2d 4f 50 2a 2f 7d 0a 6d  erwrites-OP*/}.m
4700: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29  ultiselect_op(A)
4710: 20 3a 3a 3d 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20   ::= UNION ALL. 
4720: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
4730: 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73   TK_ALL;}.multis
4740: 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20  elect_op(A) ::= 
4750: 45 58 43 45 50 54 7c 49 4e 54 45 52 53 45 43 54  EXCEPT|INTERSECT
4760: 28 4f 50 29 2e 20 20 7b 41 20 3d 20 40 4f 50 3b  (OP).  {A = @OP;
4770: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
4780: 4f 50 2a 2f 7d 0a 25 65 6e 64 69 66 20 53 51 4c  OP*/}.%endif SQL
4790: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
47a0: 44 5f 53 45 4c 45 43 54 0a 0a 6f 6e 65 73 65 6c  D_SELECT..onesel
47b0: 65 63 74 28 41 29 20 3a 3a 3d 20 53 45 4c 45 43  ect(A) ::= SELEC
47c0: 54 20 64 69 73 74 69 6e 63 74 28 44 29 20 73 65  T distinct(D) se
47d0: 6c 63 6f 6c 6c 69 73 74 28 57 29 20 66 72 6f 6d  lcollist(W) from
47e0: 28 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29  (X) where_opt(Y)
47f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4800: 20 20 67 72 6f 75 70 62 79 5f 6f 70 74 28 50 29    groupby_opt(P)
4810: 20 68 61 76 69 6e 67 5f 6f 70 74 28 51 29 20 0a   having_opt(Q) .
4820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4830: 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 5a 29 20   orderby_opt(Z) 
4840: 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a  limit_opt(L). {.
4850: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 65 6c    A = sqlite3Sel
4860: 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c 57 2c  ectNew(pParse,W,
4870: 58 2c 59 2c 50 2c 51 2c 5a 2c 44 2c 4c 29 3b 0a  X,Y,P,Q,Z,D,L);.
4880: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
4890: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
48a0: 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a  .oneselect(A) ::
48b0: 3d 20 53 45 4c 45 43 54 20 64 69 73 74 69 6e 63  = SELECT distinc
48c0: 74 28 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28  t(D) selcollist(
48d0: 57 29 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65  W) from(X) where
48e0: 5f 6f 70 74 28 59 29 0a 20 20 20 20 20 20 20 20  _opt(Y).        
48f0: 20 20 20 20 20 20 20 20 20 67 72 6f 75 70 62 79           groupby
4900: 5f 6f 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f  _opt(P) having_o
4910: 70 74 28 51 29 20 77 69 6e 64 6f 77 5f 63 6c 61  pt(Q) window_cla
4920: 75 73 65 28 52 29 0a 20 20 20 20 20 20 20 20 20  use(R).         
4930: 20 20 20 20 20 20 20 20 6f 72 64 65 72 62 79 5f          orderby_
4940: 6f 70 74 28 5a 29 20 6c 69 6d 69 74 5f 6f 70 74  opt(Z) limit_opt
4950: 28 4c 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (L). {.  A = sql
4960: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50  ite3SelectNew(pP
4970: 61 72 73 65 2c 57 2c 58 2c 59 2c 50 2c 51 2c 5a  arse,W,X,Y,P,Q,Z
4980: 2c 44 2c 4c 29 3b 0a 20 20 69 66 28 20 41 20 29  ,D,L);.  if( A )
4990: 7b 0a 20 20 20 20 41 2d 3e 70 57 69 6e 44 65 66  {.    A->pWinDef
49a0: 6e 20 3d 20 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = R;.  }else{.
49b0: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f      sqlite3Windo
49c0: 77 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  wListDelete(pPar
49d0: 73 65 2d 3e 64 62 2c 20 52 29 3b 0a 20 20 7d 0a  se->db, R);.  }.
49e0: 7d 0a 25 65 6e 64 69 66 0a 0a 0a 6f 6e 65 73 65  }.%endif...onese
49f0: 6c 65 63 74 28 41 29 20 3a 3a 3d 20 76 61 6c 75  lect(A) ::= valu
4a00: 65 73 28 41 29 2e 0a 0a 25 74 79 70 65 20 76 61  es(A)...%type va
4a10: 6c 75 65 73 20 7b 53 65 6c 65 63 74 2a 7d 0a 25  lues {Select*}.%
4a20: 64 65 73 74 72 75 63 74 6f 72 20 76 61 6c 75 65  destructor value
4a30: 73 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74  s {sqlite3Select
4a40: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
4a50: 62 2c 20 24 24 29 3b 7d 0a 76 61 6c 75 65 73 28  b, $$);}.values(
4a60: 41 29 20 3a 3a 3d 20 56 41 4c 55 45 53 20 4c 50  A) ::= VALUES LP
4a70: 20 6e 65 78 70 72 6c 69 73 74 28 58 29 20 52 50   nexprlist(X) RP
4a80: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
4a90: 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73  3SelectNew(pPars
4aa0: 65 2c 58 2c 30 2c 30 2c 30 2c 30 2c 30 2c 53 46  e,X,0,0,0,0,0,SF
4ab0: 5f 56 61 6c 75 65 73 2c 30 29 3b 0a 7d 0a 76 61  _Values,0);.}.va
4ac0: 6c 75 65 73 28 41 29 20 3a 3a 3d 20 76 61 6c 75  lues(A) ::= valu
4ad0: 65 73 28 41 29 20 43 4f 4d 4d 41 20 4c 50 20 6e  es(A) COMMA LP n
4ae0: 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 2e 20  exprlist(Y) RP. 
4af0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 69 67  {.  Select *pRig
4b00: 68 74 2c 20 2a 70 4c 65 66 74 20 3d 20 41 3b 0a  ht, *pLeft = A;.
4b10: 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74    pRight = sqlit
4b20: 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72  e3SelectNew(pPar
4b30: 73 65 2c 59 2c 30 2c 30 2c 30 2c 30 2c 30 2c 53  se,Y,0,0,0,0,0,S
4b40: 46 5f 56 61 6c 75 65 73 7c 53 46 5f 4d 75 6c 74  F_Values|SF_Mult
4b50: 69 56 61 6c 75 65 2c 30 29 3b 0a 20 20 69 66 28  iValue,0);.  if(
4b60: 20 41 4c 57 41 59 53 28 70 4c 65 66 74 29 20 29   ALWAYS(pLeft) )
4b70: 20 70 4c 65 66 74 2d 3e 73 65 6c 46 6c 61 67 73   pLeft->selFlags
4b80: 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c   &= ~SF_MultiVal
4b90: 75 65 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74  ue;.  if( pRight
4ba0: 20 29 7b 0a 20 20 20 20 70 52 69 67 68 74 2d 3e   ){.    pRight->
4bb0: 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20  op = TK_ALL;.   
4bc0: 20 70 52 69 67 68 74 2d 3e 70 50 72 69 6f 72 20   pRight->pPrior 
4bd0: 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20 41 20 3d  = pLeft;.    A =
4be0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
4bf0: 7b 0a 20 20 20 20 41 20 3d 20 70 4c 65 66 74 3b  {.    A = pLeft;
4c00: 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 54 68 65 20 22  .  }.}..// The "
4c10: 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e 74 65 72  distinct" nonter
4c20: 6d 69 6e 61 6c 20 69 73 20 74 72 75 65 20 28 31  minal is true (1
4c30: 29 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  ) if the DISTINC
4c40: 54 20 6b 65 79 77 6f 72 64 20 69 73 0a 2f 2f 20  T keyword is.// 
4c50: 70 72 65 73 65 6e 74 20 61 6e 64 20 66 61 6c 73  present and fals
4c60: 65 20 28 30 29 20 69 66 20 69 74 20 69 73 20 6e  e (0) if it is n
4c70: 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 64 69 73  ot..//.%type dis
4c80: 74 69 6e 63 74 20 7b 69 6e 74 7d 0a 64 69 73 74  tinct {int}.dist
4c90: 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44 49 53 54  inct(A) ::= DIST
4ca0: 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20 53 46 5f  INCT.   {A = SF_
4cb0: 44 69 73 74 69 6e 63 74 3b 7d 0a 64 69 73 74 69  Distinct;}.disti
4cc0: 6e 63 74 28 41 29 20 3a 3a 3d 20 41 4c 4c 2e 20  nct(A) ::= ALL. 
4cd0: 20 20 20 20 20 20 20 7b 41 20 3d 20 53 46 5f 41         {A = SF_A
4ce0: 6c 6c 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41 29  ll;}.distinct(A)
4cf0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
4d00: 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73 65   {A = 0;}..// se
4d10: 6c 63 6f 6c 6c 69 73 74 20 69 73 20 61 20 6c 69  lcollist is a li
4d20: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
4d30: 73 20 74 68 61 74 20 61 72 65 20 74 6f 20 62 65  s that are to be
4d40: 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 0a  come the return.
4d50: 2f 2f 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  // values of the
4d60: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
4d70: 74 2e 20 20 54 68 65 20 22 2a 22 20 69 6e 20 73  t.  The "*" in s
4d80: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 2f  tatements like./
4d90: 2f 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  / "SELECT * FROM
4da0: 20 2e 2e 2e 22 20 69 73 20 65 6e 63 6f 64 65 64   ..." is encoded
4db0: 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 65 78   as a special ex
4dc0: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 6e  pression with an
4dd0: 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f 66 20 54 4b  .// opcode of TK
4de0: 5f 41 53 54 45 52 49 53 4b 2e 0a 2f 2f 0a 25 74  _ASTERISK..//.%t
4df0: 79 70 65 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b  ype selcollist {
4e00: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
4e10: 72 75 63 74 6f 72 20 73 65 6c 63 6f 6c 6c 69 73  ructor selcollis
4e20: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
4e30: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
4e40: 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65  >db, $$);}.%type
4e50: 20 73 63 6c 70 20 7b 45 78 70 72 4c 69 73 74 2a   sclp {ExprList*
4e60: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 63  }.%destructor sc
4e70: 6c 70 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  lp {sqlite3ExprL
4e80: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
4e90: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 73 63 6c 70  ->db, $$);}.sclp
4ea0: 28 41 29 20 3a 3a 3d 20 73 65 6c 63 6f 6c 6c 69  (A) ::= selcolli
4eb0: 73 74 28 41 29 20 43 4f 4d 4d 41 2e 0a 73 63 6c  st(A) COMMA..scl
4ec0: 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  p(A) ::= .      
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ee0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
4ef0: 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29  ;}.selcollist(A)
4f00: 20 3a 3a 3d 20 73 63 6c 70 28 41 29 20 73 63 61   ::= sclp(A) sca
4f10: 6e 70 74 28 42 29 20 65 78 70 72 28 58 29 20 73  npt(B) expr(X) s
4f20: 63 61 6e 70 74 28 5a 29 20 61 73 28 59 29 2e 20  canpt(Z) as(Y). 
4f30: 20 20 20 20 7b 0a 20 20 20 41 20 3d 20 73 71 6c      {.   A = sql
4f40: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
4f50: 6e 64 28 70 50 61 72 73 65 2c 20 41 2c 20 58 29  nd(pParse, A, X)
4f60: 3b 0a 20 20 20 69 66 28 20 59 2e 6e 3e 30 20 29  ;.   if( Y.n>0 )
4f70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4f80: 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
4f90: 41 2c 20 26 59 2c 20 31 29 3b 0a 20 20 20 73 71  A, &Y, 1);.   sq
4fa0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
4fb0: 53 70 61 6e 28 70 50 61 72 73 65 2c 41 2c 42 2c  Span(pParse,A,B,
4fc0: 5a 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74  Z);.}.selcollist
4fd0: 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 41 29 20  (A) ::= sclp(A) 
4fe0: 73 63 61 6e 70 74 20 53 54 41 52 2e 20 7b 0a 20  scanpt STAR. {. 
4ff0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
5000: 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  e3Expr(pParse->d
5010: 62 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  b, TK_ASTERISK, 
5020: 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  0);.  A = sqlite
5030: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5040: 70 50 61 72 73 65 2c 20 41 2c 20 70 29 3b 0a 7d  pParse, A, p);.}
5050: 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a  .selcollist(A) :
5060: 3a 3d 20 73 63 6c 70 28 41 29 20 73 63 61 6e 70  := sclp(A) scanp
5070: 74 20 6e 6d 28 58 29 20 44 4f 54 20 53 54 41 52  t nm(X) DOT STAR
5080: 2e 20 7b 0a 20 20 45 78 70 72 20 2a 70 52 69 67  . {.  Expr *pRig
5090: 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ht = sqlite3PExp
50a0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 53 54  r(pParse, TK_AST
50b0: 45 52 49 53 4b 2c 20 30 2c 20 30 29 3b 0a 20 20  ERISK, 0, 0);.  
50c0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
50d0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
50e0: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 44  Parse->db, TK_ID
50f0: 2c 20 26 58 2c 20 31 29 3b 0a 20 20 45 78 70 72  , &X, 1);.  Expr
5100: 20 2a 70 44 6f 74 20 3d 20 73 71 6c 69 74 65 33   *pDot = sqlite3
5110: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
5120: 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
5130: 67 68 74 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  ght);.  A = sqli
5140: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
5150: 64 28 70 50 61 72 73 65 2c 41 2c 20 70 44 6f 74  d(pParse,A, pDot
5160: 29 3b 0a 7d 0a 0a 2f 2f 20 41 6e 20 6f 70 74 69  );.}..// An opti
5170: 6f 6e 20 22 41 53 20 3c 69 64 3e 22 20 70 68 72  on "AS <id>" phr
5180: 61 73 65 20 74 68 61 74 20 63 61 6e 20 66 6f 6c  ase that can fol
5190: 6c 6f 77 20 6f 6e 65 20 6f 66 20 74 68 65 20 65  low one of the e
51a0: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 0a  xpressions that.
51b0: 2f 2f 20 64 65 66 69 6e 65 20 74 68 65 20 72 65  // define the re
51c0: 73 75 6c 74 20 73 65 74 2c 20 6f 72 20 6f 6e 65  sult set, or one
51d0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69   of the tables i
51e0: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
51f0: 65 2e 0a 2f 2f 0a 25 74 79 70 65 20 61 73 20 7b  e..//.%type as {
5200: 54 6f 6b 65 6e 7d 0a 61 73 28 58 29 20 3a 3a 3d  Token}.as(X) ::=
5210: 20 41 53 20 6e 6d 28 59 29 2e 20 20 20 20 7b 58   AS nm(Y).    {X
5220: 20 3d 20 59 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d   = Y;}.as(X) ::=
5230: 20 69 64 73 28 58 29 2e 0a 61 73 28 58 29 20 3a   ids(X)..as(X) :
5240: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
5250: 7b 58 2e 6e 20 3d 20 30 3b 20 58 2e 7a 20 3d 20  {X.n = 0; X.z = 
5260: 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 73 65 6c 74  0;}...%type selt
5270: 61 62 6c 69 73 74 20 7b 53 72 63 4c 69 73 74 2a  ablist {SrcList*
5280: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 65  }.%destructor se
5290: 6c 74 61 62 6c 69 73 74 20 7b 73 71 6c 69 74 65  ltablist {sqlite
52a0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
52b0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
52c0: 0a 25 74 79 70 65 20 73 74 6c 5f 70 72 65 66 69  .%type stl_prefi
52d0: 78 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65  x {SrcList*}.%de
52e0: 73 74 72 75 63 74 6f 72 20 73 74 6c 5f 70 72 65  structor stl_pre
52f0: 66 69 78 20 7b 73 71 6c 69 74 65 33 53 72 63 4c  fix {sqlite3SrcL
5300: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
5310: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70  ->db, $$);}.%typ
5320: 65 20 66 72 6f 6d 20 7b 53 72 63 4c 69 73 74 2a  e from {SrcList*
5330: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 66 72  }.%destructor fr
5340: 6f 6d 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69  om {sqlite3SrcLi
5350: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
5360: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 2f 2f 20 41  >db, $$);}..// A
5370: 20 63 6f 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63   complete FROM c
5380: 6c 61 75 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41  lause..//.from(A
5390: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
53a0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
53b0: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
53c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
53d0: 6f 66 28 2a 41 29 29 3b 7d 0a 66 72 6f 6d 28 41  of(*A));}.from(A
53e0: 29 20 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74 61  ) ::= FROM selta
53f0: 62 6c 69 73 74 28 58 29 2e 20 7b 0a 20 20 41 20  blist(X). {.  A 
5400: 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  = X;.  sqlite3Sr
5410: 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
5420: 70 65 28 41 29 3b 0a 7d 0a 0a 2f 2f 20 22 73 65  pe(A);.}..// "se
5430: 6c 74 61 62 6c 69 73 74 22 20 69 73 20 61 20 22  ltablist" is a "
5440: 53 65 6c 65 63 74 20 54 61 62 6c 65 20 4c 69 73  Select Table Lis
5450: 74 22 20 2d 20 74 68 65 20 63 6f 6e 74 65 6e 74  t" - the content
5460: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
5470: 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53 45 4c 45  use.// in a SELE
5480: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 22  CT statement.  "
5490: 73 74 6c 5f 70 72 65 66 69 78 22 20 69 73 20 61  stl_prefix" is a
54a0: 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20   prefix of this 
54b0: 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f 70 72 65  list..//.stl_pre
54c0: 66 69 78 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61  fix(A) ::= selta
54d0: 62 6c 69 73 74 28 41 29 20 6a 6f 69 6e 6f 70 28  blist(A) joinop(
54e0: 59 29 2e 20 20 20 20 7b 0a 20 20 20 69 66 28 20  Y).    {.   if( 
54f0: 41 4c 57 41 59 53 28 41 20 26 26 20 41 2d 3e 6e  ALWAYS(A && A->n
5500: 53 72 63 3e 30 29 20 29 20 41 2d 3e 61 5b 41 2d  Src>0) ) A->a[A-
5510: 3e 6e 53 72 63 2d 31 5d 2e 66 67 2e 6a 6f 69 6e  >nSrc-1].fg.join
5520: 74 79 70 65 20 3d 20 28 75 38 29 59 3b 0a 7d 0a  type = (u8)Y;.}.
5530: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a  stl_prefix(A) ::
5540: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
5560: 20 3d 20 30 3b 7d 0a 73 65 6c 74 61 62 6c 69 73   = 0;}.seltablis
5570: 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65  t(A) ::= stl_pre
5580: 66 69 78 28 41 29 20 6e 6d 28 59 29 20 64 62 6e  fix(A) nm(Y) dbn
5590: 6d 28 44 29 20 61 73 28 5a 29 20 69 6e 64 65 78  m(D) as(Z) index
55a0: 65 64 5f 6f 70 74 28 49 29 0a 20 20 20 20 20 20  ed_opt(I).      
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 5f 6f              on_o
55c0: 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28  pt(N) using_opt(
55d0: 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  U). {.  A = sqli
55e0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
55f0: 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
5600: 41 2c 26 59 2c 26 44 2c 26 5a 2c 30 2c 4e 2c 55  A,&Y,&D,&Z,0,N,U
5610: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
5620: 69 73 74 49 6e 64 65 78 65 64 42 79 28 70 50 61  istIndexedBy(pPa
5630: 72 73 65 2c 20 41 2c 20 26 49 29 3b 0a 7d 0a 73  rse, A, &I);.}.s
5640: 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d  eltablist(A) ::=
5650: 20 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 6e   stl_prefix(A) n
5660: 6d 28 59 29 20 64 62 6e 6d 28 44 29 20 4c 50 20  m(Y) dbnm(D) LP 
5670: 65 78 70 72 6c 69 73 74 28 45 29 20 52 50 20 61  exprlist(E) RP a
5680: 73 28 5a 29 0a 20 20 20 20 20 20 20 20 20 20 20  s(Z).           
5690: 20 20 20 20 20 20 20 6f 6e 5f 6f 70 74 28 4e 29         on_opt(N)
56a0: 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b   using_opt(U). {
56b0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 72  .  A = sqlite3Sr
56c0: 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
56d0: 65 72 6d 28 70 50 61 72 73 65 2c 41 2c 26 59 2c  erm(pParse,A,&Y,
56e0: 26 44 2c 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20  &D,&Z,0,N,U);.  
56f0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75  sqlite3SrcListFu
5700: 6e 63 41 72 67 73 28 70 50 61 72 73 65 2c 20 41  ncArgs(pParse, A
5710: 2c 20 45 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20  , E);.}.%ifndef 
5720: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5730: 55 45 52 59 0a 20 20 73 65 6c 74 61 62 6c 69 73  UERY.  seltablis
5740: 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65  t(A) ::= stl_pre
5750: 66 69 78 28 41 29 20 4c 50 20 73 65 6c 65 63 74  fix(A) LP select
5760: 28 53 29 20 52 50 0a 20 20 20 20 20 20 20 20 20  (S) RP.         
5770: 20 20 20 20 20 20 20 20 20 20 20 61 73 28 5a 29             as(Z)
5780: 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67   on_opt(N) using
5790: 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 20 20 41  _opt(U). {.    A
57a0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
57b0: 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
57c0: 70 50 61 72 73 65 2c 41 2c 30 2c 30 2c 26 5a 2c  pParse,A,0,0,&Z,
57d0: 53 2c 4e 2c 55 29 3b 0a 20 20 7d 0a 20 20 73 65  S,N,U);.  }.  se
57e0: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ltablist(A) ::= 
57f0: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 4c 50  stl_prefix(A) LP
5800: 20 73 65 6c 74 61 62 6c 69 73 74 28 46 29 20 52   seltablist(F) R
5810: 50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P.              
5820: 20 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f 6f        as(Z) on_o
5830: 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28  pt(N) using_opt(
5840: 55 29 2e 20 7b 0a 20 20 20 20 69 66 28 20 41 3d  U). {.    if( A=
5850: 3d 30 20 26 26 20 5a 2e 6e 3d 3d 30 20 26 26 20  =0 && Z.n==0 && 
5860: 4e 3d 3d 30 20 26 26 20 55 3d 3d 30 20 29 7b 0a  N==0 && U==0 ){.
5870: 20 20 20 20 20 20 41 20 3d 20 46 3b 0a 20 20 20        A = F;.   
5880: 20 7d 65 6c 73 65 20 69 66 28 20 46 2d 3e 6e 53   }else if( F->nS
5890: 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 41  rc==1 ){.      A
58a0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
58b0: 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
58c0: 70 50 61 72 73 65 2c 41 2c 30 2c 30 2c 26 5a 2c  pParse,A,0,0,&Z,
58d0: 30 2c 4e 2c 55 29 3b 0a 20 20 20 20 20 20 69 66  0,N,U);.      if
58e0: 28 20 41 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ( A ){.        s
58f0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
5900: 65 6d 20 2a 70 4e 65 77 20 3d 20 26 41 2d 3e 61  em *pNew = &A->a
5910: 5b 41 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [A->nSrc-1];.   
5920: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
5930: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 20 3d  ist_item *pOld =
5940: 20 46 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 70   F->a;.        p
5950: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c  New->zName = pOl
5960: 64 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  d->zName;.      
5970: 20 20 70 4e 65 77 2d 3e 7a 44 61 74 61 62 61 73    pNew->zDatabas
5980: 65 20 3d 20 70 4f 6c 64 2d 3e 7a 44 61 74 61 62  e = pOld->zDatab
5990: 61 73 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ase;.        pNe
59a0: 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 4f 6c  w->pSelect = pOl
59b0: 64 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  d->pSelect;.    
59c0: 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 66 67      if( pOld->fg
59d0: 2e 69 73 54 61 62 46 75 6e 63 20 29 7b 0a 20 20  .isTabFunc ){.  
59e0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 31          pNew->u1
59f0: 2e 70 46 75 6e 63 41 72 67 20 3d 20 70 4f 6c 64  .pFuncArg = pOld
5a00: 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 3b 0a 20  ->u1.pFuncArg;. 
5a10: 20 20 20 20 20 20 20 20 20 70 4f 6c 64 2d 3e 75           pOld->u
5a20: 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 30 3b 0a  1.pFuncArg = 0;.
5a30: 20 20 20 20 20 20 20 20 20 20 70 4f 6c 64 2d 3e            pOld->
5a40: 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20 30  fg.isTabFunc = 0
5a50: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
5a60: 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d  ->fg.isTabFunc =
5a70: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
5a80: 20 20 20 20 20 20 70 4f 6c 64 2d 3e 7a 4e 61 6d        pOld->zNam
5a90: 65 20 3d 20 70 4f 6c 64 2d 3e 7a 44 61 74 61 62  e = pOld->zDatab
5aa0: 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ase = 0;.       
5ab0: 20 70 4f 6c 64 2d 3e 70 53 65 6c 65 63 74 20 3d   pOld->pSelect =
5ac0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
5ad0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
5ae0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
5af0: 62 2c 20 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, F);.    }else
5b00: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
5b10: 70 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 20  pSubquery;.     
5b20: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53   sqlite3SrcListS
5b30: 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 46 29 3b  hiftJoinType(F);
5b40: 0a 20 20 20 20 20 20 70 53 75 62 71 75 65 72 79  .      pSubquery
5b50: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
5b60: 4e 65 77 28 70 50 61 72 73 65 2c 30 2c 46 2c 30  New(pParse,0,F,0
5b70: 2c 30 2c 30 2c 30 2c 53 46 5f 4e 65 73 74 65 64  ,0,0,0,SF_Nested
5b80: 46 72 6f 6d 2c 30 29 3b 0a 20 20 20 20 20 20 41  From,0);.      A
5b90: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
5ba0: 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
5bb0: 70 50 61 72 73 65 2c 41 2c 30 2c 30 2c 26 5a 2c  pParse,A,0,0,&Z,
5bc0: 70 53 75 62 71 75 65 72 79 2c 4e 2c 55 29 3b 0a  pSubquery,N,U);.
5bd0: 20 20 20 20 7d 0a 20 20 7d 0a 25 65 6e 64 69 66      }.  }.%endif
5be0: 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55    SQLITE_OMIT_SU
5bf0: 42 51 55 45 52 59 0a 0a 25 74 79 70 65 20 64 62  BQUERY..%type db
5c00: 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 64 62 6e 6d 28  nm {Token}.dbnm(
5c10: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
5c20: 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 30 3b    {A.z=0; A.n=0;
5c30: 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 44 4f  }.dbnm(A) ::= DO
5c40: 54 20 6e 6d 28 58 29 2e 20 7b 41 20 3d 20 58 3b  T nm(X). {A = X;
5c50: 7d 0a 0a 25 74 79 70 65 20 66 75 6c 6c 6e 61 6d  }..%type fullnam
5c60: 65 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65  e {SrcList*}.%de
5c70: 73 74 72 75 63 74 6f 72 20 66 75 6c 6c 6e 61 6d  structor fullnam
5c80: 65 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73  e {sqlite3SrcLis
5c90: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
5ca0: 64 62 2c 20 24 24 29 3b 7d 0a 66 75 6c 6c 6e 61  db, $$);}.fullna
5cb0: 6d 65 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e  me(A) ::= nm(X).
5cc0: 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65    {.  A = sqlite
5cd0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
5ce0: 50 61 72 73 65 2c 30 2c 26 58 2c 30 29 3b 0a 20  Parse,0,&X,0);. 
5cf0: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
5d00: 42 4a 45 43 54 20 26 26 20 41 20 29 20 73 71 6c  BJECT && A ) sql
5d10: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
5d20: 61 70 28 70 50 61 72 73 65 2c 20 41 2d 3e 61 5b  ap(pParse, A->a[
5d30: 30 5d 2e 7a 4e 61 6d 65 2c 20 26 58 29 3b 0a 7d  0].zName, &X);.}
5d40: 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a 3d  .fullname(A) ::=
5d50: 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29   nm(X) DOT nm(Y)
5d60: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
5d70: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
5d80: 50 61 72 73 65 2c 30 2c 26 58 2c 26 59 29 3b 0a  Parse,0,&X,&Y);.
5d90: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
5da0: 4f 42 4a 45 43 54 20 26 26 20 41 20 29 20 73 71  OBJECT && A ) sq
5db0: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
5dc0: 4d 61 70 28 70 50 61 72 73 65 2c 20 41 2d 3e 61  Map(pParse, A->a
5dd0: 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 26 59 29 3b 0a  [0].zName, &Y);.
5de0: 7d 0a 0a 25 74 79 70 65 20 78 66 75 6c 6c 6e 61  }..%type xfullna
5df0: 6d 65 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  me {SrcList*}.%d
5e00: 65 73 74 72 75 63 74 6f 72 20 78 66 75 6c 6c 6e  estructor xfulln
5e10: 61 6d 65 20 7b 73 71 6c 69 74 65 33 53 72 63 4c  ame {sqlite3SrcL
5e20: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
5e30: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 78 66 75 6c  ->db, $$);}.xful
5e40: 6c 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 6e 6d 28  lname(A) ::= nm(
5e50: 58 29 2e 20 20 0a 20 20 20 7b 41 20 3d 20 73 71  X).  .   {A = sq
5e60: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
5e70: 6e 64 28 70 50 61 72 73 65 2c 30 2c 26 58 2c 30  nd(pParse,0,&X,0
5e80: 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  ); /*A-overwrite
5e90: 73 2d 58 2a 2f 7d 0a 78 66 75 6c 6c 6e 61 6d 65  s-X*/}.xfullname
5ea0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f  (A) ::= nm(X) DO
5eb0: 54 20 6e 6d 28 59 29 2e 20 20 0a 20 20 20 7b 41  T nm(Y).  .   {A
5ec0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
5ed0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30  tAppend(pParse,0
5ee0: 2c 26 58 2c 26 59 29 3b 20 2f 2a 41 2d 6f 76 65  ,&X,&Y); /*A-ove
5ef0: 72 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 78 66 75  rwrites-X*/}.xfu
5f00: 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 6e 6d  llname(A) ::= nm
5f10: 28 58 29 20 44 4f 54 20 6e 6d 28 59 29 20 41 53  (X) DOT nm(Y) AS
5f20: 20 6e 6d 28 5a 29 2e 20 20 7b 0a 20 20 20 41 20   nm(Z).  {.   A 
5f30: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
5f40: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c  Append(pParse,0,
5f50: 26 58 2c 26 59 29 3b 20 2f 2a 41 2d 6f 76 65 72  &X,&Y); /*A-over
5f60: 77 72 69 74 65 73 2d 58 2a 2f 0a 20 20 20 69 66  writes-X*/.   if
5f70: 28 20 41 20 29 20 41 2d 3e 61 5b 30 5d 2e 7a 41  ( A ) A->a[0].zA
5f80: 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61  lias = sqlite3Na
5f90: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
5fa0: 73 65 2d 3e 64 62 2c 20 26 5a 29 3b 0a 7d 0a 78  se->db, &Z);.}.x
5fb0: 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a 3d 20  fullname(A) ::= 
5fc0: 6e 6d 28 58 29 20 41 53 20 6e 6d 28 5a 29 2e 20  nm(X) AS nm(Z). 
5fd0: 7b 20 20 0a 20 20 20 41 20 3d 20 73 71 6c 69 74  {  .   A = sqlit
5fe0: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
5ff0: 70 50 61 72 73 65 2c 30 2c 26 58 2c 30 29 3b 20  pParse,0,&X,0); 
6000: 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58  /*A-overwrites-X
6010: 2a 2f 0a 20 20 20 69 66 28 20 41 20 29 20 41 2d  */.   if( A ) A-
6020: 3e 61 5b 30 5d 2e 7a 41 6c 69 61 73 20 3d 20 73  >a[0].zAlias = s
6030: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
6040: 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
6050: 26 5a 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 6a 6f  &Z);.}..%type jo
6060: 69 6e 6f 70 20 7b 69 6e 74 7d 0a 6a 6f 69 6e 6f  inop {int}.joino
6070: 70 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 7c 4a  p(X) ::= COMMA|J
6080: 4f 49 4e 2e 20 20 20 20 20 20 20 20 20 20 20 20  OIN.            
6090: 20 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52    { X = JT_INNER
60a0: 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a  ; }.joinop(X) ::
60b0: 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f 49  = JOIN_KW(A) JOI
60c0: 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N..             
60d0: 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69 74 65       {X = sqlite
60e0: 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65  3JoinType(pParse
60f0: 2c 26 41 2c 30 2c 30 29 3b 20 20 2f 2a 58 2d 6f  ,&A,0,0);  /*X-o
6100: 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d 0a 6a  verwrites-A*/}.j
6110: 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f 49  oinop(X) ::= JOI
6120: 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 4a 4f  N_KW(A) nm(B) JO
6130: 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN..            
6140: 20 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69 74        {X = sqlit
6150: 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73  e3JoinType(pPars
6160: 65 2c 26 41 2c 26 42 2c 30 29 3b 20 2f 2a 58 2d  e,&A,&B,0); /*X-
6170: 6f 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d 0a  overwrites-A*/}.
6180: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f  joinop(X) ::= JO
6190: 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 6e  IN_KW(A) nm(B) n
61a0: 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20 20  m(C) JOIN..     
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 20               {X 
61c0: 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  = sqlite3JoinTyp
61d0: 65 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c 26  e(pParse,&A,&B,&
61e0: 43 29 3b 2f 2a 58 2d 6f 76 65 72 77 72 69 74 65  C);/*X-overwrite
61f0: 73 2d 41 2a 2f 7d 0a 0a 2f 2f 20 54 68 65 72 65  s-A*/}..// There
6200: 20 69 73 20 61 20 70 61 72 73 69 6e 67 20 61 62   is a parsing ab
6210: 69 67 75 69 74 79 20 69 6e 20 61 6e 20 75 70 73  iguity in an ups
6220: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ert statement th
6230: 61 74 20 75 73 65 73 20 61 0a 2f 2f 20 53 45 4c  at uses a.// SEL
6240: 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ECT on the RHS o
6250: 66 20 61 20 74 68 65 20 49 4e 53 45 52 54 3a 0a  f a the INSERT:.
6260: 2f 2f 0a 2f 2f 20 20 20 20 20 20 49 4e 53 45 52  //.//      INSER
6270: 54 20 49 4e 54 4f 20 74 61 62 20 53 45 4c 45 43  T INTO tab SELEC
6280: 54 20 2a 20 46 52 4f 4d 20 61 61 61 20 4a 4f 49  T * FROM aaa JOI
6290: 4e 20 62 62 62 20 4f 4e 20 43 4f 4e 46 4c 49 43  N bbb ON CONFLIC
62a0: 54 20 2e 2e 2e 0a 2f 2f 20 20 20 20 20 20 20 20  T ....//        
62b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 68 65 72 65 20 2d 2d 2d 2d 5e 5e 0a 2f 2f 0a 2f  here ----^^.//./
62e0: 2f 20 57 68 65 6e 20 74 68 65 20 4f 4e 20 74 6f  / When the ON to
62f0: 6b 65 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ken is encounter
6300: 65 64 2c 20 74 68 65 20 70 61 72 73 65 72 20 64  ed, the parser d
6310: 6f 65 73 20 6e 6f 74 20 6b 6e 6f 77 20 69 66 20  oes not know if 
6320: 69 74 20 69 73 0a 2f 2f 20 74 68 65 20 62 65 67  it is.// the beg
6330: 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 4f 4e 20  inning of an ON 
6340: 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 2c  CONFLICT clause,
6350: 20 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   or the beginnin
6360: 67 20 6f 66 20 61 6e 20 4f 4e 0a 2f 2f 20 63 6c  g of an ON.// cl
6370: 61 75 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  ause associated 
6380: 77 69 74 68 20 74 68 65 20 4a 4f 49 4e 2e 20 20  with the JOIN.  
6390: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 69 73 20  The conflict is 
63a0: 72 65 73 6f 6c 76 65 64 20 69 6e 20 66 61 76 6f  resolved in favo
63b0: 72 0a 2f 2f 20 6f 66 20 74 68 65 20 4a 4f 49 4e  r.// of the JOIN
63c0: 2e 20 20 49 66 20 61 6e 20 4f 4e 20 43 4f 4e 46  .  If an ON CONF
63d0: 4c 49 43 54 20 63 6c 61 75 73 65 20 69 73 20 69  LICT clause is i
63e0: 6e 74 65 6e 64 65 64 2c 20 69 6e 73 65 72 74 20  ntended, insert 
63f0: 61 20 64 75 6d 6d 79 0a 2f 2f 20 57 48 45 52 45  a dummy.// WHERE
6400: 20 63 6c 61 75 73 65 20 69 6e 20 62 65 74 77 65   clause in betwe
6410: 65 6e 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2f  en, like this:./
6420: 2f 0a 2f 2f 20 20 20 20 20 20 49 4e 53 45 52 54  /.//      INSERT
6430: 20 49 4e 54 4f 20 74 61 62 20 53 45 4c 45 43 54   INTO tab SELECT
6440: 20 2a 20 46 52 4f 4d 20 61 61 61 20 4a 4f 49 4e   * FROM aaa JOIN
6450: 20 62 62 62 20 57 48 45 52 45 20 74 72 75 65 20   bbb WHERE true 
6460: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 2e 2e 2e 0a  ON CONFLICT ....
6470: 2f 2f 0a 2f 2f 20 54 68 65 20 5b 41 4e 44 5d 20  //.// The [AND] 
6480: 61 6e 64 20 5b 4f 52 5d 20 70 72 65 63 65 64 65  and [OR] precede
6490: 6e 63 65 20 6d 61 72 6b 73 20 69 6e 20 74 68 65  nce marks in the
64a0: 20 72 75 6c 65 73 20 66 6f 72 20 6f 6e 5f 6f 70   rules for on_op
64b0: 74 20 63 61 75 73 65 20 74 68 65 0a 2f 2f 20 4f  t cause the.// O
64c0: 4e 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78  N in this contex
64d0: 74 20 74 6f 20 61 6c 77 61 79 73 20 62 65 20 69  t to always be i
64e0: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 62 65  nterpreted as be
64f0: 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 4a  longing to the J
6500: 4f 49 4e 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f 6e  OIN..//.%type on
6510: 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65  _opt {Expr*}.%de
6520: 73 74 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74 20  structor on_opt 
6530: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
6540: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
6550: 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a  $);}.on_opt(N) :
6560: 3a 3d 20 4f 4e 20 65 78 70 72 28 45 29 2e 20 20  := ON expr(E).  
6570: 7b 4e 20 3d 20 45 3b 7d 0a 6f 6e 5f 6f 70 74 28  {N = E;}.on_opt(
6580: 4e 29 20 3a 3a 3d 20 2e 20 20 20 20 20 5b 4f 52  N) ::= .     [OR
6590: 5d 20 20 20 7b 4e 20 3d 20 30 3b 7d 0a 0a 2f 2f  ]   {N = 0;}..//
65a0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
65b0: 62 6c 6f 63 6b 20 61 62 75 73 65 73 20 74 68 65  block abuses the
65c0: 20 54 6f 6b 65 6e 20 74 79 70 65 20 6a 75 73 74   Token type just
65d0: 20 61 20 6c 69 74 74 6c 65 2e 20 49 66 20 74 68   a little. If th
65e0: 65 72 65 20 69 73 0a 2f 2f 20 6e 6f 20 22 49 4e  ere is.// no "IN
65f0: 44 45 58 45 44 20 42 59 22 20 63 6c 61 75 73 65  DEXED BY" clause
6600: 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 74  , the returned t
6610: 6f 6b 65 6e 20 69 73 20 65 6d 70 74 79 20 28 7a  oken is empty (z
6620: 3d 3d 30 20 26 26 20 6e 3d 3d 30 29 2e 20 49 66  ==0 && n==0). If
6630: 0a 2f 2f 20 74 68 65 72 65 20 69 73 20 61 6e 20  .// there is an 
6640: 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
6650: 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  e, then the toke
6660: 6e 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 61  n is populated a
6670: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2c 0a 2f 2f  s per normal,.//
6680: 20 77 69 74 68 20 7a 20 70 6f 69 6e 74 69 6e 67   with z pointing
6690: 20 74 6f 20 74 68 65 20 74 6f 6b 65 6e 20 64 61   to the token da
66a0: 74 61 20 61 6e 64 20 6e 20 63 6f 6e 74 61 69 6e  ta and n contain
66b0: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
66c0: 66 20 62 79 74 65 73 0a 2f 2f 20 69 6e 20 74 68  f bytes.// in th
66d0: 65 20 74 6f 6b 65 6e 2e 0a 2f 2f 0a 2f 2f 20 49  e token..//.// I
66e0: 66 20 74 68 65 72 65 20 69 73 20 61 20 22 4e 4f  f there is a "NO
66f0: 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
6700: 65 2c 20 74 68 65 6e 20 28 7a 3d 3d 30 20 26 26  e, then (z==0 &&
6710: 20 6e 3d 3d 31 29 2c 20 77 68 69 63 68 20 69 73   n==1), which is
6720: 20 0a 2f 2f 20 6e 6f 72 6d 61 6c 6c 79 20 69 6c   .// normally il
6730: 6c 65 67 61 6c 2e 20 54 68 65 20 73 71 6c 69 74  legal. The sqlit
6740: 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64  e3SrcListIndexed
6750: 42 79 28 29 20 66 75 6e 63 74 69 6f 6e 20 0a 2f  By() function ./
6760: 2f 20 72 65 63 6f 67 6e 69 7a 65 73 20 61 6e 64  / recognizes and
6770: 20 69 6e 74 65 72 70 72 65 74 73 20 74 68 69 73   interprets this
6780: 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
6790: 73 65 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 6e 64  se..//.%type ind
67a0: 65 78 65 64 5f 6f 70 74 20 7b 54 6f 6b 65 6e 7d  exed_opt {Token}
67b0: 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28 41 29 20  .indexed_opt(A) 
67c0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
67d0: 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e        {A.z=0; A.
67e0: 6e 3d 30 3b 7d 0a 69 6e 64 65 78 65 64 5f 6f 70  n=0;}.indexed_op
67f0: 74 28 41 29 20 3a 3a 3d 20 49 4e 44 45 58 45 44  t(A) ::= INDEXED
6800: 20 42 59 20 6e 6d 28 58 29 2e 20 7b 41 20 3d 20   BY nm(X). {A = 
6810: 58 3b 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28  X;}.indexed_opt(
6820: 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e 44 45 58  A) ::= NOT INDEX
6830: 45 44 2e 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b  ED.      {A.z=0;
6840: 20 41 2e 6e 3d 31 3b 7d 0a 0a 25 74 79 70 65 20   A.n=1;}..%type 
6850: 75 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73  using_opt {IdLis
6860: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
6870: 75 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74  using_opt {sqlit
6880: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
6890: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
68a0: 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29 20 3a 3a  .using_opt(U) ::
68b0: 3d 20 55 53 49 4e 47 20 4c 50 20 69 64 6c 69 73  = USING LP idlis
68c0: 74 28 4c 29 20 52 50 2e 20 20 7b 55 20 3d 20 4c  t(L) RP.  {U = L
68d0: 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29 20  ;}.using_opt(U) 
68e0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
68f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 55 20               {U 
6900: 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 6f 72  = 0;}...%type or
6910: 64 65 72 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c  derby_opt {ExprL
6920: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
6930: 72 20 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b 73  r orderby_opt {s
6940: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
6950: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
6960: 20 24 24 29 3b 7d 0a 0a 2f 2f 20 74 68 65 20 73   $$);}..// the s
6970: 6f 72 74 6c 69 73 74 20 6e 6f 6e 2d 74 65 72 6d  ortlist non-term
6980: 69 6e 61 6c 20 73 74 6f 72 65 73 20 61 20 6c 69  inal stores a li
6990: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
69a0: 20 77 68 65 72 65 20 65 61 63 68 0a 2f 2f 20 65   where each.// e
69b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 70 74  xpression is opt
69c0: 69 6f 6e 61 6c 6c 79 20 66 6f 6c 6c 6f 77 65 64  ionally followed
69d0: 20 62 79 20 41 53 43 20 6f 72 20 44 45 53 43 20   by ASC or DESC 
69e0: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 0a  to indicate the.
69f0: 2f 2f 20 73 6f 72 74 20 6f 72 64 65 72 2e 0a 2f  // sort order../
6a00: 2f 0a 25 74 79 70 65 20 73 6f 72 74 6c 69 73 74  /.%type sortlist
6a10: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
6a20: 73 74 72 75 63 74 6f 72 20 73 6f 72 74 6c 69 73  structor sortlis
6a30: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
6a40: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
6a50: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 6f 72 64 65  >db, $$);}..orde
6a60: 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  rby_opt(A) ::= .
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
6a90: 3b 7d 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28 41  ;}.orderby_opt(A
6aa0: 29 20 3a 3a 3d 20 4f 52 44 45 52 20 42 59 20 73  ) ::= ORDER BY s
6ab0: 6f 72 74 6c 69 73 74 28 58 29 2e 20 20 20 20 20  ortlist(X).     
6ac0: 20 7b 41 20 3d 20 58 3b 7d 0a 73 6f 72 74 6c 69   {A = X;}.sortli
6ad0: 73 74 28 41 29 20 3a 3a 3d 20 73 6f 72 74 6c 69  st(A) ::= sortli
6ae0: 73 74 28 41 29 20 43 4f 4d 4d 41 20 65 78 70 72  st(A) COMMA expr
6af0: 28 59 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29  (Y) sortorder(Z)
6b00: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
6b10: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6b20: 70 50 61 72 73 65 2c 41 2c 59 29 3b 0a 20 20 73  pParse,A,Y);.  s
6b30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
6b40: 74 53 6f 72 74 4f 72 64 65 72 28 41 2c 5a 29 3b  tSortOrder(A,Z);
6b50: 0a 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a  .}.sortlist(A) :
6b60: 3a 3d 20 65 78 70 72 28 59 29 20 73 6f 72 74 6f  := expr(Y) sorto
6b70: 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d  rder(Z). {.  A =
6b80: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6b90: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c  Append(pParse,0,
6ba0: 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  Y); /*A-overwrit
6bb0: 65 73 2d 59 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es-Y*/.  sqlite3
6bc0: 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
6bd0: 72 64 65 72 28 41 2c 5a 29 3b 0a 7d 0a 0a 25 74  rder(A,Z);.}..%t
6be0: 79 70 65 20 73 6f 72 74 6f 72 64 65 72 20 7b 69  ype sortorder {i
6bf0: 6e 74 7d 0a 0a 73 6f 72 74 6f 72 64 65 72 28 41  nt}..sortorder(A
6c00: 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20 20 20  ) ::= ASC.      
6c10: 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45       {A = SQLITE
6c20: 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74 6f 72  _SO_ASC;}.sortor
6c30: 64 65 72 28 41 29 20 3a 3a 3d 20 44 45 53 43 2e  der(A) ::= DESC.
6c40: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53            {A = S
6c50: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 7d 0a  QLITE_SO_DESC;}.
6c60: 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d  sortorder(A) ::=
6c70: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6c80: 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 55  {A = SQLITE_SO_U
6c90: 4e 44 45 46 49 4e 45 44 3b 7d 0a 0a 25 74 79 70  NDEFINED;}..%typ
6ca0: 65 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 45  e groupby_opt {E
6cb0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
6cc0: 75 63 74 6f 72 20 67 72 6f 75 70 62 79 5f 6f 70  uctor groupby_op
6cd0: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
6ce0: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
6cf0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 67 72 6f 75 70  >db, $$);}.group
6d00: 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  by_opt(A) ::= . 
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d20: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 67 72       {A = 0;}.gr
6d30: 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d  oupby_opt(A) ::=
6d40: 20 47 52 4f 55 50 20 42 59 20 6e 65 78 70 72 6c   GROUP BY nexprl
6d50: 69 73 74 28 58 29 2e 20 7b 41 20 3d 20 58 3b 7d  ist(X). {A = X;}
6d60: 0a 0a 25 74 79 70 65 20 68 61 76 69 6e 67 5f 6f  ..%type having_o
6d70: 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pt {Expr*}.%dest
6d80: 72 75 63 74 6f 72 20 68 61 76 69 6e 67 5f 6f 70  ructor having_op
6d90: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  t {sqlite3ExprDe
6da0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
6db0: 20 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70   $$);}.having_op
6dc0: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
6dd0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
6de0: 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41 29  ;}.having_opt(A)
6df0: 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78 70 72   ::= HAVING expr
6e00: 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  (X).  {A = X;}..
6e10: 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74 20  %type limit_opt 
6e20: 7b 45 78 70 72 2a 7d 0a 0a 2f 2f 20 54 68 65 20  {Expr*}..// The 
6e30: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6c  destructor for l
6e40: 69 6d 69 74 5f 6f 70 74 20 77 69 6c 6c 20 6e 65  imit_opt will ne
6e50: 76 65 72 20 66 69 72 65 20 69 6e 20 74 68 65 20  ver fire in the 
6e60: 63 75 72 72 65 6e 74 20 67 72 61 6d 6d 61 72 2e  current grammar.
6e70: 0a 2f 2f 20 54 68 65 20 6c 69 6d 69 74 5f 6f 70  .// The limit_op
6e80: 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 6f  t non-terminal o
6e90: 6e 6c 79 20 6f 63 63 75 72 73 20 61 74 20 74 68  nly occurs at th
6ea0: 65 20 65 6e 64 20 6f 66 20 61 20 73 69 6e 67 6c  e end of a singl
6eb0: 65 20 70 72 6f 64 75 63 74 69 6f 6e 0a 2f 2f 20  e production.// 
6ec0: 72 75 6c 65 20 66 6f 72 20 53 45 4c 45 43 54 20  rule for SELECT 
6ed0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 41 73 20  statements.  As 
6ee0: 73 6f 6f 6e 20 61 73 20 74 68 65 20 72 75 6c 65  soon as the rule
6ef0: 20 74 68 61 74 20 63 72 65 61 74 65 20 74 68 65   that create the
6f00: 20 0a 2f 2f 20 6c 69 6d 69 74 5f 6f 70 74 20 6e   .// limit_opt n
6f10: 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 72 65 64 75  on-terminal redu
6f20: 63 65 73 2c 20 74 68 65 20 53 45 4c 45 43 54 20  ces, the SELECT 
6f30: 73 74 61 74 65 6d 65 6e 74 20 72 75 6c 65 20 77  statement rule w
6f40: 69 6c 6c 20 61 6c 73 6f 0a 2f 2f 20 72 65 64 75  ill also.// redu
6f50: 63 65 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ce.  So there is
6f60: 20 6e 65 76 65 72 20 61 20 6c 69 6d 69 74 5f 6f   never a limit_o
6f70: 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  pt non-terminal 
6f80: 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 0a 2f 2f  on the stack .//
6f90: 20 65 78 63 65 70 74 20 61 73 20 61 20 74 72 61   except as a tra
6fa0: 6e 73 69 65 6e 74 2e 20 20 53 6f 20 74 68 65 72  nsient.  So ther
6fb0: 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68  e is never anyth
6fc0: 69 6e 67 20 74 6f 20 64 65 73 74 72 6f 79 2e 0a  ing to destroy..
6fd0: 2f 2f 0a 2f 2f 25 64 65 73 74 72 75 63 74 6f 72  //.//%destructor
6fe0: 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 73 71 6c 69   limit_opt {sqli
6ff0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
7000: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
7010: 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  limit_opt(A) ::=
7020: 20 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b   .       {A = 0;
7030: 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a  }.limit_opt(A) :
7040: 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58 29  := LIMIT expr(X)
7050: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7060: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
7070: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7080: 72 73 65 2c 54 4b 5f 4c 49 4d 49 54 2c 58 2c 30  rse,TK_LIMIT,X,0
7090: 29 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  );}.limit_opt(A)
70a0: 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28   ::= LIMIT expr(
70b0: 58 29 20 4f 46 46 53 45 54 20 65 78 70 72 28 59  X) OFFSET expr(Y
70c0: 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ). .            
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
70e0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
70f0: 50 61 72 73 65 2c 54 4b 5f 4c 49 4d 49 54 2c 58  Parse,TK_LIMIT,X
7100: 2c 59 29 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28  ,Y);}.limit_opt(
7110: 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70  A) ::= LIMIT exp
7120: 72 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28  r(X) COMMA expr(
7130: 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20  Y). .           
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
7150: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
7160: 70 50 61 72 73 65 2c 54 4b 5f 4c 49 4d 49 54 2c  pParse,TK_LIMIT,
7170: 59 2c 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  Y,X);}..////////
7180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7190: 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54 45 20 73  /// The DELETE s
71a0: 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f  tatement ///////
71b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
71c0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65 66  //////.//.%ifdef
71d0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
71e0: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
71f0: 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 20  IT.cmd ::= with 
7200: 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 66 75 6c  DELETE FROM xful
7210: 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64  lname(X) indexed
7220: 5f 6f 70 74 28 49 29 20 77 68 65 72 65 5f 6f 70  _opt(I) where_op
7230: 74 28 57 29 20 0a 20 20 20 20 20 20 20 20 6f 72  t(W) .        or
7240: 64 65 72 62 79 5f 6f 70 74 28 4f 29 20 6c 69 6d  derby_opt(O) lim
7250: 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 73  it_opt(L). {.  s
7260: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
7270: 65 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 58  exedBy(pParse, X
7280: 2c 20 26 49 29 3b 0a 23 69 66 6e 64 65 66 20 53  , &I);.#ifndef S
7290: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44  QLITE_ENABLE_UPD
72a0: 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54  ATE_DELETE_LIMIT
72b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
72c0: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
72d0: 3e 64 62 2c 20 4f 29 3b 20 4f 20 3d 20 30 3b 0a  >db, O); O = 0;.
72e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
72f0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
7300: 4c 29 3b 20 4c 20 3d 20 30 3b 0a 23 65 6e 64 69  L); L = 0;.#endi
7310: 66 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74  f.  sqlite3Delet
7320: 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 58 2c 57  eFrom(pParse,X,W
7330: 2c 4f 2c 4c 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a  ,O,L);.}.%endif.
7340: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  %ifndef SQLITE_E
7350: 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c  NABLE_UPDATE_DEL
7360: 45 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a  ETE_LIMIT.cmd ::
7370: 3d 20 77 69 74 68 20 44 45 4c 45 54 45 20 46 52  = with DELETE FR
7380: 4f 4d 20 78 66 75 6c 6c 6e 61 6d 65 28 58 29 20  OM xfullname(X) 
7390: 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 20 77  indexed_opt(I) w
73a0: 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b 0a 20  here_opt(W). {. 
73b0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49   sqlite3SrcListI
73c0: 6e 64 65 78 65 64 42 79 28 70 50 61 72 73 65 2c  ndexedBy(pParse,
73d0: 20 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69 74   X, &I);.  sqlit
73e0: 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61  e3DeleteFrom(pPa
73f0: 72 73 65 2c 58 2c 57 2c 30 2c 30 29 3b 0a 7d 0a  rse,X,W,0,0);.}.
7400: 25 65 6e 64 69 66 0a 0a 25 74 79 70 65 20 77 68  %endif..%type wh
7410: 65 72 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a  ere_opt {Expr*}.
7420: 25 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 72  %destructor wher
7430: 65 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  e_opt {sqlite3Ex
7440: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
7450: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 77 68 65 72  >db, $$);}..wher
7460: 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  e_opt(A) ::= .  
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 20 20 7b 41 20 3d 20 30 3b 7d 0a 77 68 65 72 65    {A = 0;}.where
7490: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 57 48 45 52  _opt(A) ::= WHER
74a0: 45 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  E expr(X).      
74b0: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 2f 2f 2f   {A = X;}../////
74c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
74d0: 2f 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45  ///// The UPDATE
74e0: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
74f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66  /////////.//.%if
7510: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7520: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
7530: 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69  LIMIT.cmd ::= wi
7540: 74 68 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66  th UPDATE orconf
7550: 28 52 29 20 78 66 75 6c 6c 6e 61 6d 65 28 58 29  (R) xfullname(X)
7560: 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 20   indexed_opt(I) 
7570: 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 0a 20  SET setlist(Y). 
7580: 20 20 20 20 20 20 20 77 68 65 72 65 5f 6f 70 74         where_opt
7590: 28 57 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 28  (W) orderby_opt(
75a0: 4f 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e  O) limit_opt(L).
75b0: 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 72 63    {.  sqlite3Src
75c0: 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 70 50  ListIndexedBy(pP
75d0: 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20  arse, X, &I);.  
75e0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
75f0: 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73  heckLength(pPars
7600: 65 2c 59 2c 22 73 65 74 20 6c 69 73 74 22 29 3b  e,Y,"set list");
7610: 20 0a 20 20 73 71 6c 69 74 65 33 55 70 64 61 74   .  sqlite3Updat
7620: 65 28 70 50 61 72 73 65 2c 58 2c 59 2c 57 2c 52  e(pParse,X,Y,W,R
7630: 2c 4f 2c 4c 2c 30 29 3b 0a 7d 0a 25 65 6e 64 69  ,O,L,0);.}.%endi
7640: 66 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.%ifndef SQLITE
7650: 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44  _ENABLE_UPDATE_D
7660: 45 4c 45 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20  ELETE_LIMIT.cmd 
7670: 3a 3a 3d 20 77 69 74 68 20 55 50 44 41 54 45 20  ::= with UPDATE 
7680: 6f 72 63 6f 6e 66 28 52 29 20 78 66 75 6c 6c 6e  orconf(R) xfulln
7690: 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f 6f  ame(X) indexed_o
76a0: 70 74 28 49 29 20 53 45 54 20 73 65 74 6c 69 73  pt(I) SET setlis
76b0: 74 28 59 29 0a 20 20 20 20 20 20 20 20 77 68 65  t(Y).        whe
76c0: 72 65 5f 6f 70 74 28 57 29 2e 20 20 7b 0a 20 20  re_opt(W).  {.  
76d0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
76e0: 64 65 78 65 64 42 79 28 70 50 61 72 73 65 2c 20  dexedBy(pParse, 
76f0: 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69 74 65  X, &I);.  sqlite
7700: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
7710: 6e 67 74 68 28 70 50 61 72 73 65 2c 59 2c 22 73  ngth(pParse,Y,"s
7720: 65 74 20 6c 69 73 74 22 29 3b 20 0a 20 20 73 71  et list"); .  sq
7730: 6c 69 74 65 33 55 70 64 61 74 65 28 70 50 61 72  lite3Update(pPar
7740: 73 65 2c 58 2c 59 2c 57 2c 52 2c 30 2c 30 2c 30  se,X,Y,W,R,0,0,0
7750: 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25 74 79  );.}.%endif..%ty
7760: 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 70 72  pe setlist {Expr
7770: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
7780: 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 6c 69  or setlist {sqli
7790: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
77a0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
77b0: 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20  );}..setlist(A) 
77c0: 3a 3a 3d 20 73 65 74 6c 69 73 74 28 41 29 20 43  ::= setlist(A) C
77d0: 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65 78  OMMA nm(X) EQ ex
77e0: 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Y). {.  A = s
77f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7800: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 41 2c 20  pend(pParse, A, 
7810: 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  Y);.  sqlite3Exp
7820: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
7830: 72 73 65 2c 20 41 2c 20 26 58 2c 20 31 29 3b 0a  rse, A, &X, 1);.
7840: 7d 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d  }.setlist(A) ::=
7850: 20 73 65 74 6c 69 73 74 28 41 29 20 43 4f 4d 4d   setlist(A) COMM
7860: 41 20 4c 50 20 69 64 6c 69 73 74 28 58 29 20 52  A LP idlist(X) R
7870: 50 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a  P EQ expr(Y). {.
7880: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
7890: 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f  rListAppendVecto
78a0: 72 28 70 50 61 72 73 65 2c 20 41 2c 20 58 2c 20  r(pParse, A, X, 
78b0: 59 29 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41 29  Y);.}.setlist(A)
78c0: 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51 20 65 78   ::= nm(X) EQ ex
78d0: 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Y). {.  A = s
78e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
78f0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
7900: 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  Y);.  sqlite3Exp
7910: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
7920: 72 73 65 2c 20 41 2c 20 26 58 2c 20 31 29 3b 0a  rse, A, &X, 1);.
7930: 7d 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d  }.setlist(A) ::=
7940: 20 4c 50 20 69 64 6c 69 73 74 28 58 29 20 52 50   LP idlist(X) RP
7950: 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a 20   EQ expr(Y). {. 
7960: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
7970: 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72  ListAppendVector
7980: 28 70 50 61 72 73 65 2c 20 30 2c 20 58 2c 20 59  (pParse, 0, X, Y
7990: 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );.}..//////////
79a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
79b0: 20 54 68 65 20 49 4e 53 45 52 54 20 63 6f 6d 6d   The INSERT comm
79c0: 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  and ////////////
79d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
79e0: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
79f0: 20 77 69 74 68 20 69 6e 73 65 72 74 5f 63 6d 64   with insert_cmd
7a00: 28 52 29 20 49 4e 54 4f 20 78 66 75 6c 6c 6e 61  (R) INTO xfullna
7a10: 6d 65 28 58 29 20 69 64 6c 69 73 74 5f 6f 70 74  me(X) idlist_opt
7a20: 28 46 29 20 73 65 6c 65 63 74 28 53 29 0a 20 20  (F) select(S).  
7a30: 20 20 20 20 20 20 75 70 73 65 72 74 28 55 29 2e        upsert(U).
7a40: 20 7b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65   {.  sqlite3Inse
7a50: 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53 2c  rt(pParse, X, S,
7a60: 20 46 2c 20 52 2c 20 55 29 3b 0a 7d 0a 63 6d 64   F, R, U);.}.cmd
7a70: 20 3a 3a 3d 20 77 69 74 68 20 69 6e 73 65 72 74   ::= with insert
7a80: 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 78 66 75  _cmd(R) INTO xfu
7a90: 6c 6c 6e 61 6d 65 28 58 29 20 69 64 6c 69 73 74  llname(X) idlist
7aa0: 5f 6f 70 74 28 46 29 20 44 45 46 41 55 4c 54 20  _opt(F) DEFAULT 
7ab0: 56 41 4c 55 45 53 2e 0a 7b 0a 20 20 73 71 6c 69  VALUES..{.  sqli
7ac0: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
7ad0: 2c 20 58 2c 20 30 2c 20 46 2c 20 52 2c 20 30 29  , X, 0, F, R, 0)
7ae0: 3b 0a 7d 0a 0a 25 74 79 70 65 20 75 70 73 65 72  ;.}..%type upser
7af0: 74 20 7b 55 70 73 65 72 74 2a 7d 0a 0a 2f 2f 20  t {Upsert*}..// 
7b00: 42 65 63 61 75 73 65 20 75 70 73 65 72 74 20 6f  Because upsert o
7b10: 6e 6c 79 20 6f 63 63 75 72 73 20 61 74 20 74 68  nly occurs at th
7b20: 65 20 74 69 70 20 65 6e 64 20 6f 66 20 74 68 65  e tip end of the
7b30: 20 49 4e 53 45 52 54 20 72 75 6c 65 20 66 6f 72   INSERT rule for
7b40: 20 63 6d 64 2c 0a 2f 2f 20 74 68 65 72 65 20 69   cmd,.// there i
7b50: 73 20 6e 65 76 65 72 20 61 20 63 61 73 65 20 77  s never a case w
7b60: 68 65 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  here the value o
7b70: 66 20 74 68 65 20 75 70 73 65 72 74 20 70 6f 69  f the upsert poi
7b80: 6e 74 65 72 20 77 69 6c 6c 20 6e 6f 74 0a 2f 2f  nter will not.//
7b90: 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 62 79   be destroyed by
7ba0: 20 74 68 65 20 63 6d 64 20 61 63 74 69 6f 6e 2e   the cmd action.
7bb0: 20 20 53 6f 20 63 6f 6d 6d 65 6e 74 2d 6f 75 74    So comment-out
7bc0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
7bd0: 74 6f 0a 2f 2f 20 61 76 6f 69 64 20 75 6e 72 65  to.// avoid unre
7be0: 61 63 68 61 62 6c 65 20 63 6f 64 65 2e 0a 2f 2f  achable code..//
7bf0: 25 64 65 73 74 72 75 63 74 6f 72 20 75 70 73 65  %destructor upse
7c00: 72 74 20 7b 73 71 6c 69 74 65 33 55 70 73 65 72  rt {sqlite3Upser
7c10: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
7c20: 64 62 2c 24 24 29 3b 7d 0a 75 70 73 65 72 74 28  db,$$);}.upsert(
7c30: 41 29 20 3a 3a 3d 20 2e 20 7b 20 41 20 3d 20 30  A) ::= . { A = 0
7c40: 3b 20 7d 0a 75 70 73 65 72 74 28 41 29 20 3a 3a  ; }.upsert(A) ::
7c50: 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 4c 50  = ON CONFLICT LP
7c60: 20 73 6f 72 74 6c 69 73 74 28 54 29 20 52 50 20   sortlist(T) RP 
7c70: 77 68 65 72 65 5f 6f 70 74 28 54 57 29 0a 20 20  where_opt(TW).  
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 44 4f 20 55              DO U
7c90: 50 44 41 54 45 20 53 45 54 20 73 65 74 6c 69 73  PDATE SET setlis
7ca0: 74 28 5a 29 20 77 68 65 72 65 5f 6f 70 74 28 57  t(Z) where_opt(W
7cb0: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
7cc0: 20 7b 20 41 20 3d 20 73 71 6c 69 74 65 33 55 70   { A = sqlite3Up
7cd0: 73 65 72 74 4e 65 77 28 70 50 61 72 73 65 2d 3e  sertNew(pParse->
7ce0: 64 62 2c 54 2c 54 57 2c 5a 2c 57 29 3b 7d 0a 75  db,T,TW,Z,W);}.u
7cf0: 70 73 65 72 74 28 41 29 20 3a 3a 3d 20 4f 4e 20  psert(A) ::= ON 
7d00: 43 4f 4e 46 4c 49 43 54 20 4c 50 20 73 6f 72 74  CONFLICT LP sort
7d10: 6c 69 73 74 28 54 29 20 52 50 20 77 68 65 72 65  list(T) RP where
7d20: 5f 6f 70 74 28 54 57 29 20 44 4f 20 4e 4f 54 48  _opt(TW) DO NOTH
7d30: 49 4e 47 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ING..           
7d40: 20 20 20 7b 20 41 20 3d 20 73 71 6c 69 74 65 33     { A = sqlite3
7d50: 55 70 73 65 72 74 4e 65 77 28 70 50 61 72 73 65  UpsertNew(pParse
7d60: 2d 3e 64 62 2c 54 2c 54 57 2c 30 2c 30 29 3b 20  ->db,T,TW,0,0); 
7d70: 7d 0a 75 70 73 65 72 74 28 41 29 20 3a 3a 3d 20  }.upsert(A) ::= 
7d80: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 44 4f 20 4e  ON CONFLICT DO N
7d90: 4f 54 48 49 4e 47 2e 0a 20 20 20 20 20 20 20 20  OTHING..        
7da0: 20 20 20 20 20 20 7b 20 41 20 3d 20 73 71 6c 69        { A = sqli
7db0: 74 65 33 55 70 73 65 72 74 4e 65 77 28 70 50 61  te3UpsertNew(pPa
7dc0: 72 73 65 2d 3e 64 62 2c 30 2c 30 2c 30 2c 30 29  rse->db,0,0,0,0)
7dd0: 3b 20 7d 0a 0a 25 74 79 70 65 20 69 6e 73 65 72  ; }..%type inser
7de0: 74 5f 63 6d 64 20 7b 69 6e 74 7d 0a 69 6e 73 65  t_cmd {int}.inse
7df0: 72 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e  rt_cmd(A) ::= IN
7e00: 53 45 52 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20  SERT orconf(R). 
7e10: 20 20 7b 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72    {A = R;}.inser
7e20: 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50  t_cmd(A) ::= REP
7e30: 4c 41 43 45 2e 20 20 20 20 20 20 20 20 20 20 20  LACE.           
7e40: 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65   {A = OE_Replace
7e50: 3b 7d 0a 0a 25 74 79 70 65 20 69 64 6c 69 73 74  ;}..%type idlist
7e60: 5f 6f 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25  _opt {IdList*}.%
7e70: 64 65 73 74 72 75 63 74 6f 72 20 69 64 6c 69 73  destructor idlis
7e80: 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 49 64  t_opt {sqlite3Id
7e90: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
7ea0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79  e->db, $$);}.%ty
7eb0: 70 65 20 69 64 6c 69 73 74 20 7b 49 64 4c 69 73  pe idlist {IdLis
7ec0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
7ed0: 69 64 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 49  idlist {sqlite3I
7ee0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  dListDelete(pPar
7ef0: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 69  se->db, $$);}..i
7f00: 64 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  dlist_opt(A) ::=
7f10: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7f20: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
7f30: 7d 0a 69 64 6c 69 73 74 5f 6f 70 74 28 41 29 20  }.idlist_opt(A) 
7f40: 3a 3a 3d 20 4c 50 20 69 64 6c 69 73 74 28 58 29  ::= LP idlist(X)
7f50: 20 52 50 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d   RP.    {A = X;}
7f60: 0a 69 64 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69  .idlist(A) ::= i
7f70: 64 6c 69 73 74 28 41 29 20 43 4f 4d 4d 41 20 6e  dlist(A) COMMA n
7f80: 6d 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  m(Y)..    {A = s
7f90: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
7fa0: 6e 64 28 70 50 61 72 73 65 2c 41 2c 26 59 29 3b  nd(pParse,A,&Y);
7fb0: 7d 0a 69 64 6c 69 73 74 28 41 29 20 3a 3a 3d 20  }.idlist(A) ::= 
7fc0: 6e 6d 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20  nm(Y)..    {A = 
7fd0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
7fe0: 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 26 59 29  end(pParse,0,&Y)
7ff0: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
8000: 2d 59 2a 2f 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  -Y*/}../////////
8010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8020: 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20 50 72  // Expression Pr
8030: 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f  ocessing ///////
8040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8050: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65  //////.//..%type
8060: 20 65 78 70 72 20 7b 45 78 70 72 2a 7d 0a 25 64   expr {Expr*}.%d
8070: 65 73 74 72 75 63 74 6f 72 20 65 78 70 72 20 7b  estructor expr {
8080: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8090: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
80a0: 29 3b 7d 0a 25 74 79 70 65 20 74 65 72 6d 20 7b  );}.%type term {
80b0: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
80c0: 6f 72 20 74 65 72 6d 20 7b 73 71 6c 69 74 65 33  or term {sqlite3
80d0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
80e0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 69  e->db, $$);}..%i
80f0: 6e 63 6c 75 64 65 20 7b 0a 0a 20 20 2f 2a 20 43  nclude {..  /* C
8100: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 45  onstruct a new E
8110: 78 70 72 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  xpr object from 
8120: 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
8130: 69 65 72 2e 20 20 55 73 65 20 74 68 65 0a 20 20  ier.  Use the.  
8140: 2a 2a 20 6e 65 77 20 45 78 70 72 20 74 6f 20 70  ** new Expr to p
8150: 6f 70 75 6c 61 74 65 20 70 4f 75 74 2e 20 20 53  opulate pOut.  S
8160: 65 74 20 74 68 65 20 73 70 61 6e 20 6f 66 20 70  et the span of p
8170: 4f 75 74 20 74 6f 20 62 65 20 74 68 65 20 69 64  Out to be the id
8180: 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 74 68  entifier.  ** th
8190: 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20 65  at created the e
81a0: 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2f 0a  xpression..  */.
81b0: 20 20 73 74 61 74 69 63 20 45 78 70 72 20 2a 74    static Expr *t
81c0: 6f 6b 65 6e 45 78 70 72 28 50 61 72 73 65 20 2a  okenExpr(Parse *
81d0: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
81e0: 54 6f 6b 65 6e 20 74 29 7b 0a 20 20 20 20 45 78  Token t){.    Ex
81f0: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44  pr *p = sqlite3D
8200: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61  bMallocRawNN(pPa
8210: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
8220: 45 78 70 72 29 2b 74 2e 6e 2b 31 29 3b 0a 20 20  Expr)+t.n+1);.  
8230: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
8240: 20 2f 2a 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c   /* memset(p, 0,
8250: 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b 20   sizeof(Expr)); 
8260: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d  */.      p->op =
8270: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20 70   (u8)op;.      p
8280: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 30 3b 0a  ->affinity = 0;.
8290: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
82a0: 20 45 50 5f 4c 65 61 66 3b 0a 20 20 20 20 20 20   EP_Leaf;.      
82b0: 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  p->iAgg = -1;.  
82c0: 20 20 20 20 70 2d 3e 70 4c 65 66 74 20 3d 20 70      p->pLeft = p
82d0: 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  ->pRight = 0;.  
82e0: 20 20 20 20 70 2d 3e 78 2e 70 4c 69 73 74 20 3d      p->x.pList =
82f0: 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 41 67   0;.      p->pAg
8300: 67 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20  gInfo = 0;.     
8310: 20 70 2d 3e 79 2e 70 54 61 62 20 3d 20 30 3b 0a   p->y.pTab = 0;.
8320: 20 20 20 20 20 20 70 2d 3e 6f 70 32 20 3d 20 30        p->op2 = 0
8330: 3b 0a 20 20 20 20 20 20 70 2d 3e 69 54 61 62 6c  ;.      p->iTabl
8340: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  e = 0;.      p->
8350: 69 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 20  iColumn = 0;.   
8360: 20 20 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d     p->u.zToken =
8370: 20 28 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a 20   (char*)&p[1];. 
8380: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 75       memcpy(p->u
8390: 2e 7a 54 6f 6b 65 6e 2c 20 74 2e 7a 2c 20 74 2e  .zToken, t.z, t.
83a0: 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e 7a  n);.      p->u.z
83b0: 54 6f 6b 65 6e 5b 74 2e 6e 5d 20 3d 20 30 3b 0a  Token[t.n] = 0;.
83c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
83d0: 33 49 73 71 75 6f 74 65 28 70 2d 3e 75 2e 7a 54  3Isquote(p->u.zT
83e0: 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20 20  oken[0]) ){.    
83f0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
8400: 74 65 45 78 70 72 28 70 29 3b 0a 20 20 20 20 20  teExpr(p);.     
8410: 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
8420: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
8430: 20 20 20 20 20 70 2d 3e 6e 48 65 69 67 68 74 20       p->nHeight 
8440: 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20  = 1;.#endif  .  
8450: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
8460: 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
8470: 20 20 20 20 72 65 74 75 72 6e 20 28 45 78 70 72      return (Expr
8480: 2a 29 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54  *)sqlite3RenameT
8490: 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20  okenMap(pParse, 
84a0: 28 76 6f 69 64 2a 29 70 2c 20 26 74 29 3b 0a 20  (void*)p, &t);. 
84b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
84c0: 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 0a   return p;.  }..
84d0: 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 74  }..expr(A) ::= t
84e0: 65 72 6d 28 41 29 2e 0a 65 78 70 72 28 41 29 20  erm(A)..expr(A) 
84f0: 3a 3a 3d 20 4c 50 20 65 78 70 72 28 58 29 20 52  ::= LP expr(X) R
8500: 50 2e 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72  P. {A = X;}.expr
8510: 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 2e 20 20  (A) ::= id(X).  
8520: 20 20 20 20 20 20 20 20 7b 41 3d 74 6f 6b 65 6e          {A=token
8530: 45 78 70 72 28 70 50 61 72 73 65 2c 54 4b 5f 49  Expr(pParse,TK_I
8540: 44 2c 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  D,X); /*A-overwr
8550: 69 74 65 73 2d 58 2a 2f 7d 0a 65 78 70 72 28 41  ites-X*/}.expr(A
8560: 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29  ) ::= JOIN_KW(X)
8570: 2e 20 20 20 20 20 7b 41 3d 74 6f 6b 65 6e 45 78  .     {A=tokenEx
8580: 70 72 28 70 50 61 72 73 65 2c 54 4b 5f 49 44 2c  pr(pParse,TK_ID,
8590: 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  X); /*A-overwrit
85a0: 65 73 2d 58 2a 2f 7d 0a 65 78 70 72 28 41 29 20  es-X*/}.expr(A) 
85b0: 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d  ::= nm(X) DOT nm
85c0: 28 59 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74  (Y). {.  Expr *t
85d0: 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 45 78  emp1 = sqlite3Ex
85e0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
85f0: 64 62 2c 20 54 4b 5f 49 44 2c 20 26 58 2c 20 31  db, TK_ID, &X, 1
8600: 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32  );.  Expr *temp2
8610: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
8620: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
8630: 54 4b 5f 49 44 2c 20 26 59 2c 20 31 29 3b 0a 20  TK_ID, &Y, 1);. 
8640: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
8650: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 73 71 6c  BJECT ){.    sql
8660: 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 4d  ite3RenameTokenM
8670: 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64  ap(pParse, (void
8680: 2a 29 74 65 6d 70 32 2c 20 26 59 29 3b 0a 20 20  *)temp2, &Y);.  
8690: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
86a0: 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20  okenMap(pParse, 
86b0: 28 76 6f 69 64 2a 29 74 65 6d 70 31 2c 20 26 58  (void*)temp1, &X
86c0: 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c  );.  }.  A = sql
86d0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
86e0: 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c  , TK_DOT, temp1,
86f0: 20 74 65 6d 70 32 29 3b 0a 7d 0a 65 78 70 72 28   temp2);.}.expr(
8700: 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f 54  A) ::= nm(X) DOT
8710: 20 6e 6d 28 59 29 20 44 4f 54 20 6e 6d 28 5a 29   nm(Y) DOT nm(Z)
8720: 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70  . {.  Expr *temp
8730: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
8740: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
8750: 20 54 4b 5f 49 44 2c 20 26 58 2c 20 31 29 3b 0a   TK_ID, &X, 1);.
8760: 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20    Expr *temp2 = 
8770: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
8780: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
8790: 49 44 2c 20 26 59 2c 20 31 29 3b 0a 20 20 45 78  ID, &Y, 1);.  Ex
87a0: 70 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c 69  pr *temp3 = sqli
87b0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
87c0: 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c 20  rse->db, TK_ID, 
87d0: 26 5a 2c 20 31 29 3b 0a 20 20 45 78 70 72 20 2a  &Z, 1);.  Expr *
87e0: 74 65 6d 70 34 20 3d 20 73 71 6c 69 74 65 33 50  temp4 = sqlite3P
87f0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
8800: 44 4f 54 2c 20 74 65 6d 70 32 2c 20 74 65 6d 70  DOT, temp2, temp
8810: 33 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e  3);.  if( IN_REN
8820: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
8830: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
8840: 6f 6b 65 6e 4d 61 70 28 70 50 61 72 73 65 2c 20  okenMap(pParse, 
8850: 28 76 6f 69 64 2a 29 74 65 6d 70 33 2c 20 26 5a  (void*)temp3, &Z
8860: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
8870: 6e 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61  nameTokenMap(pPa
8880: 72 73 65 2c 20 28 76 6f 69 64 2a 29 74 65 6d 70  rse, (void*)temp
8890: 32 2c 20 26 59 29 3b 0a 20 20 7d 0a 20 20 41 20  2, &Y);.  }.  A 
88a0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
88b0: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 74  Parse, TK_DOT, t
88c0: 65 6d 70 31 2c 20 74 65 6d 70 34 29 3b 0a 7d 0a  emp1, temp4);.}.
88d0: 74 65 72 6d 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c  term(A) ::= NULL
88e0: 7c 46 4c 4f 41 54 7c 42 4c 4f 42 28 58 29 2e 20  |FLOAT|BLOB(X). 
88f0: 7b 41 3d 74 6f 6b 65 6e 45 78 70 72 28 70 50 61  {A=tokenExpr(pPa
8900: 72 73 65 2c 40 58 2c 58 29 3b 20 2f 2a 41 2d 6f  rse,@X,X); /*A-o
8910: 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 74  verwrites-X*/}.t
8920: 65 72 6d 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e  erm(A) ::= STRIN
8930: 47 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b  G(X).          {
8940: 41 3d 74 6f 6b 65 6e 45 78 70 72 28 70 50 61 72  A=tokenExpr(pPar
8950: 73 65 2c 40 58 2c 58 29 3b 20 2f 2a 41 2d 6f 76  se,@X,X); /*A-ov
8960: 65 72 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 74 65  erwrites-X*/}.te
8970: 72 6d 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45  rm(A) ::= INTEGE
8980: 52 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  R(X). {.  A = sq
8990: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
89a0: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e  Parse->db, TK_IN
89b0: 54 45 47 45 52 2c 20 26 58 2c 20 31 29 3b 0a 7d  TEGER, &X, 1);.}
89c0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 56 41 52  .expr(A) ::= VAR
89d0: 49 41 42 4c 45 28 58 29 2e 20 20 20 20 20 7b 0a  IABLE(X).     {.
89e0: 20 20 69 66 28 20 21 28 58 2e 7a 5b 30 5d 3d 3d    if( !(X.z[0]==
89f0: 27 23 27 20 26 26 20 73 71 6c 69 74 65 33 49 73  '#' && sqlite3Is
8a00: 64 69 67 69 74 28 58 2e 7a 5b 31 5d 29 29 20 29  digit(X.z[1])) )
8a10: 7b 0a 20 20 20 20 75 33 32 20 6e 20 3d 20 58 2e  {.    u32 n = X.
8a20: 6e 3b 0a 20 20 20 20 41 20 3d 20 74 6f 6b 65 6e  n;.    A = token
8a30: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
8a40: 56 41 52 49 41 42 4c 45 2c 20 58 29 3b 0a 20 20  VARIABLE, X);.  
8a50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73    sqlite3ExprAss
8a60: 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 70 50 61  ignVarNumber(pPa
8a70: 72 73 65 2c 20 41 2c 20 6e 29 3b 0a 20 20 7d 65  rse, A, n);.  }e
8a80: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e  lse{.    /* When
8a90: 20 64 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20   doing a nested 
8aa0: 70 61 72 73 65 2c 20 6f 6e 65 20 63 61 6e 20 69  parse, one can i
8ab0: 6e 63 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20  nclude terms in 
8ac0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  an expression.  
8ad0: 20 20 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c    ** that look l
8ae0: 69 6b 65 20 74 68 69 73 3a 20 20 20 23 31 20 23  ike this:   #1 #
8af0: 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72  2 ...  These ter
8b00: 6d 73 20 72 65 66 65 72 20 74 6f 20 72 65 67 69  ms refer to regi
8b10: 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 69 6e 20  sters.    ** in 
8b20: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
8b30: 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68 65 20  ine.  #N is the 
8b40: 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e 20 2a  N-th register. *
8b50: 2f 0a 20 20 20 20 54 6f 6b 65 6e 20 74 20 3d 20  /.    Token t = 
8b60: 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  X; /*A-overwrite
8b70: 73 2d 58 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  s-X*/.    assert
8b80: 28 20 74 2e 6e 3e 3d 32 20 29 3b 0a 20 20 20 20  ( t.n>=2 );.    
8b90: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  if( pParse->nest
8ba0: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ed==0 ){.      s
8bb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8bc0: 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22 25  Parse, "near \"%
8bd0: 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  T\": syntax erro
8be0: 72 22 2c 20 26 74 29 3b 0a 20 20 20 20 20 20 41  r", &t);.      A
8bf0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
8c00: 0a 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74  .      A = sqlit
8c10: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
8c20: 54 4b 5f 52 45 47 49 53 54 45 52 2c 20 30 2c 20  TK_REGISTER, 0, 
8c30: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 20  0);.      if( A 
8c40: 29 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ) sqlite3GetInt3
8c50: 32 28 26 74 2e 7a 5b 31 5d 2c 20 26 41 2d 3e 69  2(&t.z[1], &A->i
8c60: 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Table);.    }.  
8c70: 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.}.expr(A) ::= 
8c80: 65 78 70 72 28 41 29 20 43 4f 4c 4c 41 54 45 20  expr(A) COLLATE 
8c90: 69 64 73 28 43 29 2e 20 7b 0a 20 20 41 20 3d 20  ids(C). {.  A = 
8ca0: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
8cb0: 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73  llateToken(pPars
8cc0: 65 2c 20 41 2c 20 26 43 2c 20 31 29 3b 0a 7d 0a  e, A, &C, 1);.}.
8cd0: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
8ce0: 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28 41 29  MIT_CAST.expr(A)
8cf0: 20 3a 3a 3d 20 43 41 53 54 20 4c 50 20 65 78 70   ::= CAST LP exp
8d00: 72 28 45 29 20 41 53 20 74 79 70 65 74 6f 6b 65  r(E) AS typetoke
8d10: 6e 28 54 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d  n(T) RP. {.  A =
8d20: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
8d30: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  c(pParse->db, TK
8d40: 5f 43 41 53 54 2c 20 26 54 2c 20 31 29 3b 0a 20  _CAST, &T, 1);. 
8d50: 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61   sqlite3ExprAtta
8d60: 63 68 53 75 62 74 72 65 65 73 28 70 50 61 72 73  chSubtrees(pPars
8d70: 65 2d 3e 64 62 2c 20 41 2c 20 45 2c 20 30 29 3b  e->db, A, E, 0);
8d80: 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54  .}.%endif  SQLIT
8d90: 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 0a 0a 65 78  E_OMIT_CAST...ex
8da0: 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 20  pr(A) ::= id(X) 
8db0: 4c 50 20 64 69 73 74 69 6e 63 74 28 44 29 20 65  LP distinct(D) e
8dc0: 78 70 72 6c 69 73 74 28 59 29 20 52 50 2e 20 7b  xprlist(Y) RP. {
8dd0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
8de0: 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  prFunction(pPars
8df0: 65 2c 20 59 2c 20 26 58 2c 20 44 29 3b 0a 7d 0a  e, Y, &X, D);.}.
8e00: 65 78 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58  expr(A) ::= id(X
8e10: 29 20 4c 50 20 53 54 41 52 20 52 50 2e 20 7b 0a  ) LP STAR RP. {.
8e20: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
8e30: 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  rFunction(pParse
8e40: 2c 20 30 2c 20 26 58 2c 20 30 29 3b 0a 7d 0a 0a  , 0, &X, 0);.}..
8e50: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
8e60: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 65  MIT_WINDOWFUNC.e
8e70: 78 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29  xpr(A) ::= id(X)
8e80: 20 4c 50 20 64 69 73 74 69 6e 63 74 28 44 29 20   LP distinct(D) 
8e90: 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 20 6f  exprlist(Y) RP o
8ea0: 76 65 72 5f 63 6c 61 75 73 65 28 5a 29 2e 20 7b  ver_clause(Z). {
8eb0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
8ec0: 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  prFunction(pPars
8ed0: 65 2c 20 59 2c 20 26 58 2c 20 44 29 3b 0a 20 20  e, Y, &X, D);.  
8ee0: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74  sqlite3WindowAtt
8ef0: 61 63 68 28 70 50 61 72 73 65 2c 20 41 2c 20 5a  ach(pParse, A, Z
8f00: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
8f10: 20 69 64 28 58 29 20 4c 50 20 53 54 41 52 20 52   id(X) LP STAR R
8f20: 50 20 6f 76 65 72 5f 63 6c 61 75 73 65 28 5a 29  P over_clause(Z)
8f30: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
8f40: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50  3ExprFunction(pP
8f50: 61 72 73 65 2c 20 30 2c 20 26 58 2c 20 30 29 3b  arse, 0, &X, 0);
8f60: 0a 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77  .  sqlite3Window
8f70: 41 74 74 61 63 68 28 70 50 61 72 73 65 2c 20 41  Attach(pParse, A
8f80: 2c 20 5a 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a  , Z);.}.%endif..
8f90: 74 65 72 6d 28 41 29 20 3a 3a 3d 20 43 54 49 4d  term(A) ::= CTIM
8fa0: 45 5f 4b 57 28 4f 50 29 2e 20 7b 0a 20 20 41 20  E_KW(OP). {.  A 
8fb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e  = sqlite3ExprFun
8fc0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ction(pParse, 0,
8fd0: 20 26 4f 50 2c 20 30 29 3b 0a 7d 0a 0a 65 78 70   &OP, 0);.}..exp
8fe0: 72 28 41 29 20 3a 3a 3d 20 4c 50 20 6e 65 78 70  r(A) ::= LP nexp
8ff0: 72 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65  rlist(X) COMMA e
9000: 78 70 72 28 59 29 20 52 50 2e 20 7b 0a 20 20 45  xpr(Y) RP. {.  E
9010: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
9020: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9030: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 58  Append(pParse, X
9040: 2c 20 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  , Y);.  A = sqli
9050: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
9060: 20 54 4b 5f 56 45 43 54 4f 52 2c 20 30 2c 20 30   TK_VECTOR, 0, 0
9070: 29 3b 0a 20 20 69 66 28 20 41 20 29 7b 0a 20 20  );.  if( A ){.  
9080: 20 20 41 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70    A->x.pList = p
9090: 4c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  List;.  }else{. 
90a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
90b0: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
90c0: 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
90d0: 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  .}..expr(A) ::= 
90e0: 65 78 70 72 28 41 29 20 41 4e 44 20 65 78 70 72  expr(A) AND expr
90f0: 28 59 29 2e 20 20 20 20 20 20 20 20 7b 41 3d 73  (Y).        {A=s
9100: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 70 50  qlite3ExprAnd(pP
9110: 61 72 73 65 2c 41 2c 59 29 3b 7d 0a 65 78 70 72  arse,A,Y);}.expr
9120: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
9130: 4f 52 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20  OR(OP) expr(Y). 
9140: 20 20 20 20 7b 41 3d 73 71 6c 69 74 65 33 50 45      {A=sqlite3PE
9150: 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 41  xpr(pParse,@OP,A
9160: 2c 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  ,Y);}.expr(A) ::
9170: 3d 20 65 78 70 72 28 41 29 20 4c 54 7c 47 54 7c  = expr(A) LT|GT|
9180: 47 45 7c 4c 45 28 4f 50 29 20 65 78 70 72 28 59  GE|LE(OP) expr(Y
9190: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91b0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 3d 73 71             {A=sq
91c0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
91d0: 65 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70  e,@OP,A,Y);}.exp
91e0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29  r(A) ::= expr(A)
91f0: 20 45 51 7c 4e 45 28 4f 50 29 20 65 78 70 72 28   EQ|NE(OP) expr(
9200: 59 29 2e 20 20 7b 41 3d 73 71 6c 69 74 65 33 50  Y).  {A=sqlite3P
9210: 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c  Expr(pParse,@OP,
9220: 41 2c 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  A,Y);}.expr(A) :
9230: 3a 3d 20 65 78 70 72 28 41 29 20 42 49 54 41 4e  := expr(A) BITAN
9240: 44 7c 42 49 54 4f 52 7c 4c 53 48 49 46 54 7c 52  D|BITOR|LSHIFT|R
9250: 53 48 49 46 54 28 4f 50 29 20 65 78 70 72 28 59  SHIFT(OP) expr(Y
9260: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 20 20 20 20 20 20 20 20 20 20 7b 41 3d 73 71             {A=sq
9290: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
92a0: 65 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70  e,@OP,A,Y);}.exp
92b0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29  r(A) ::= expr(A)
92c0: 20 50 4c 55 53 7c 4d 49 4e 55 53 28 4f 50 29 20   PLUS|MINUS(OP) 
92d0: 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20  expr(Y)..       
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9300: 20 7b 41 3d 73 71 6c 69 74 65 33 50 45 78 70 72   {A=sqlite3PExpr
9310: 28 70 50 61 72 73 65 2c 40 4f 50 2c 41 2c 59 29  (pParse,@OP,A,Y)
9320: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
9330: 78 70 72 28 41 29 20 53 54 41 52 7c 53 4c 41 53  xpr(A) STAR|SLAS
9340: 48 7c 52 45 4d 28 4f 50 29 20 65 78 70 72 28 59  H|REM(OP) expr(Y
9350: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 20 20 20 20 20 20 20 20 20 20 20 7b 41 3d 73 71             {A=sq
9380: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
9390: 65 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70  e,@OP,A,Y);}.exp
93a0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29  r(A) ::= expr(A)
93b0: 20 43 4f 4e 43 41 54 28 4f 50 29 20 65 78 70 72   CONCAT(OP) expr
93c0: 28 59 29 2e 20 7b 41 3d 73 71 6c 69 74 65 33 50  (Y). {A=sqlite3P
93d0: 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c  Expr(pParse,@OP,
93e0: 41 2c 59 29 3b 7d 0a 25 74 79 70 65 20 6c 69 6b  A,Y);}.%type lik
93f0: 65 6f 70 20 7b 54 6f 6b 65 6e 7d 0a 6c 69 6b 65  eop {Token}.like
9400: 6f 70 28 41 29 20 3a 3a 3d 20 4c 49 4b 45 5f 4b  op(A) ::= LIKE_K
9410: 57 7c 4d 41 54 43 48 28 41 29 2e 0a 6c 69 6b 65  W|MATCH(A)..like
9420: 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4c 49  op(A) ::= NOT LI
9430: 4b 45 5f 4b 57 7c 4d 41 54 43 48 28 58 29 2e 20  KE_KW|MATCH(X). 
9440: 7b 41 3d 58 3b 20 41 2e 6e 7c 3d 30 78 38 30 30  {A=X; A.n|=0x800
9450: 30 30 30 30 30 3b 20 2f 2a 41 2d 6f 76 65 72 77  00000; /*A-overw
9460: 72 69 74 65 2d 58 2a 2f 7d 0a 65 78 70 72 28 41  rite-X*/}.expr(A
9470: 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 6c 69  ) ::= expr(A) li
9480: 6b 65 6f 70 28 4f 50 29 20 65 78 70 72 28 59 29  keop(OP) expr(Y)
9490: 2e 20 20 5b 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a  .  [LIKE_KW]  {.
94a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
94b0: 74 3b 0a 20 20 69 6e 74 20 62 4e 6f 74 20 3d 20  t;.  int bNot = 
94c0: 4f 50 2e 6e 20 26 20 30 78 38 30 30 30 30 30 30  OP.n & 0x8000000
94d0: 30 3b 0a 20 20 4f 50 2e 6e 20 26 3d 20 30 78 37  0;.  OP.n &= 0x7
94e0: 66 66 66 66 66 66 66 3b 0a 20 20 70 4c 69 73 74  fffffff;.  pList
94f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9500: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
9510: 30 2c 20 59 29 3b 0a 20 20 70 4c 69 73 74 20 3d  0, Y);.  pList =
9520: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9530: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c  Append(pParse,pL
9540: 69 73 74 2c 20 41 29 3b 0a 20 20 41 20 3d 20 73  ist, A);.  A = s
9550: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
9560: 6f 6e 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  on(pParse, pList
9570: 2c 20 26 4f 50 2c 20 30 29 3b 0a 20 20 69 66 28  , &OP, 0);.  if(
9580: 20 62 4e 6f 74 20 29 20 41 20 3d 20 73 71 6c 69   bNot ) A = sqli
9590: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
95a0: 20 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a   TK_NOT, A, 0);.
95b0: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 66 6c 61    if( A ) A->fla
95c0: 67 73 20 7c 3d 20 45 50 5f 49 6e 66 69 78 46 75  gs |= EP_InfixFu
95d0: 6e 63 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  nc;.}.expr(A) ::
95e0: 3d 20 65 78 70 72 28 41 29 20 6c 69 6b 65 6f 70  = expr(A) likeop
95f0: 28 4f 50 29 20 65 78 70 72 28 59 29 20 45 53 43  (OP) expr(Y) ESC
9600: 41 50 45 20 65 78 70 72 28 45 29 2e 20 20 5b 4c  APE expr(E).  [L
9610: 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20 20 45 78 70  IKE_KW]  {.  Exp
9620: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  rList *pList;.  
9630: 69 6e 74 20 62 4e 6f 74 20 3d 20 4f 50 2e 6e 20  int bNot = OP.n 
9640: 26 20 30 78 38 30 30 30 30 30 30 30 3b 0a 20 20  & 0x80000000;.  
9650: 4f 50 2e 6e 20 26 3d 20 30 78 37 66 66 66 66 66  OP.n &= 0x7fffff
9660: 66 66 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  ff;.  pList = sq
9670: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
9680: 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 20 59 29  end(pParse,0, Y)
9690: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
96a0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
96b0: 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20  d(pParse,pList, 
96c0: 41 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  A);.  pList = sq
96d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
96e0: 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74  end(pParse,pList
96f0: 2c 20 45 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  , E);.  A = sqli
9700: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
9710: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 26  pParse, pList, &
9720: 4f 50 2c 20 30 29 3b 0a 20 20 69 66 28 20 62 4e  OP, 0);.  if( bN
9730: 6f 74 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33  ot ) A = sqlite3
9740: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
9750: 5f 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20 69  _NOT, A, 0);.  i
9760: 66 28 20 41 20 29 20 41 2d 3e 66 6c 61 67 73 20  f( A ) A->flags 
9770: 7c 3d 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 3b  |= EP_InfixFunc;
9780: 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  .}..expr(A) ::= 
9790: 65 78 70 72 28 41 29 20 49 53 4e 55 4c 4c 7c 4e  expr(A) ISNULL|N
97a0: 4f 54 4e 55 4c 4c 28 45 29 2e 20 20 20 7b 41 20  OTNULL(E).   {A 
97b0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
97c0: 50 61 72 73 65 2c 40 45 2c 41 2c 30 29 3b 7d 0a  Parse,@E,A,0);}.
97d0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
97e0: 28 41 29 20 4e 4f 54 20 4e 55 4c 4c 2e 20 20 20  (A) NOT NULL.   
97f0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78   {A = sqlite3PEx
9800: 70 72 28 70 50 61 72 73 65 2c 54 4b 5f 4e 4f 54  pr(pParse,TK_NOT
9810: 4e 55 4c 4c 2c 41 2c 30 29 3b 7d 0a 0a 25 69 6e  NULL,A,0);}..%in
9820: 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 41 20 72  clude {.  /* A r
9830: 6f 75 74 69 6e 65 20 74 6f 20 63 6f 6e 76 65 72  outine to conver
9840: 74 20 61 20 62 69 6e 61 72 79 20 54 4b 5f 49 53  t a binary TK_IS
9850: 20 6f 72 20 54 4b 5f 49 53 4e 4f 54 20 65 78 70   or TK_ISNOT exp
9860: 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 0a 20  ression into a. 
9870: 20 2a 2a 20 75 6e 61 72 79 20 54 4b 5f 49 53 4e   ** unary TK_ISN
9880: 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e 55 4c  ULL or TK_NOTNUL
9890: 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f  L expression. */
98a0: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 62  .  static void b
98b0: 69 6e 61 72 79 54 6f 55 6e 61 72 79 49 66 4e 75  inaryToUnaryIfNu
98c0: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
98d0: 2c 20 45 78 70 72 20 2a 70 59 2c 20 45 78 70 72  , Expr *pY, Expr
98e0: 20 2a 70 41 2c 20 69 6e 74 20 6f 70 29 7b 0a 20   *pA, int op){. 
98f0: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
9900: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20   pParse->db;.   
9910: 20 69 66 28 20 70 41 20 26 26 20 70 59 20 26 26   if( pA && pY &&
9920: 20 70 59 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c   pY->op==TK_NULL
9930: 20 26 26 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f   && !IN_RENAME_O
9940: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 70  BJECT ){.      p
9950: 41 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a  A->op = (u8)op;.
9960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9970: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 41 2d 3e  rDelete(db, pA->
9980: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70  pRight);.      p
9990: 41 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  A->pRight = 0;. 
99a0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 20     }.  }.}..//  
99b0: 20 20 65 78 70 72 31 20 49 53 20 65 78 70 72 32    expr1 IS expr2
99c0: 0a 2f 2f 20 20 20 20 65 78 70 72 31 20 49 53 20  .//    expr1 IS 
99d0: 4e 4f 54 20 65 78 70 72 32 0a 2f 2f 0a 2f 2f 20  NOT expr2.//.// 
99e0: 49 66 20 65 78 70 72 32 20 69 73 20 4e 55 4c 4c  If expr2 is NULL
99f0: 20 74 68 65 6e 20 63 6f 64 65 20 61 73 20 54 4b   then code as TK
9a00: 5f 49 53 4e 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f  _ISNULL or TK_NO
9a10: 54 4e 55 4c 4c 2e 20 20 49 66 20 65 78 70 72 32  TNULL.  If expr2
9a20: 0a 2f 2f 20 69 73 20 61 6e 79 20 6f 74 68 65 72  .// is any other
9a30: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 63 6f 64   expression, cod
9a40: 65 20 61 73 20 54 4b 5f 49 53 20 6f 72 20 54 4b  e as TK_IS or TK
9a50: 5f 49 53 4e 4f 54 2e 0a 2f 2f 20 0a 65 78 70 72  _ISNOT..// .expr
9a60: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
9a70: 49 53 20 65 78 70 72 28 59 29 2e 20 20 20 20 20  IS expr(Y).     
9a80: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50  {.  A = sqlite3P
9a90: 45 78 70 72 28 70 50 61 72 73 65 2c 54 4b 5f 49  Expr(pParse,TK_I
9aa0: 53 2c 41 2c 59 29 3b 0a 20 20 62 69 6e 61 72 79  S,A,Y);.  binary
9ab0: 54 6f 55 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50  ToUnaryIfNull(pP
9ac0: 61 72 73 65 2c 20 59 2c 20 41 2c 20 54 4b 5f 49  arse, Y, A, TK_I
9ad0: 53 4e 55 4c 4c 29 3b 0a 7d 0a 65 78 70 72 28 41  SNULL);.}.expr(A
9ae0: 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 49 53  ) ::= expr(A) IS
9af0: 20 4e 4f 54 20 65 78 70 72 28 59 29 2e 20 7b 0a   NOT expr(Y). {.
9b00: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78    A = sqlite3PEx
9b10: 70 72 28 70 50 61 72 73 65 2c 54 4b 5f 49 53 4e  pr(pParse,TK_ISN
9b20: 4f 54 2c 41 2c 59 29 3b 0a 20 20 62 69 6e 61 72  OT,A,Y);.  binar
9b30: 79 54 6f 55 6e 61 72 79 49 66 4e 75 6c 6c 28 70  yToUnaryIfNull(p
9b40: 50 61 72 73 65 2c 20 59 2c 20 41 2c 20 54 4b 5f  Parse, Y, A, TK_
9b50: 4e 4f 54 4e 55 4c 4c 29 3b 0a 7d 0a 0a 65 78 70  NOTNULL);.}..exp
9b60: 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 28 42 29 20  r(A) ::= NOT(B) 
9b70: 65 78 70 72 28 58 29 2e 20 20 0a 20 20 20 20 20  expr(X).  .     
9b80: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
9b90: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
9ba0: 65 2c 20 40 42 2c 20 58 2c 20 30 29 3b 2f 2a 41  e, @B, X, 0);/*A
9bb0: 2d 6f 76 65 72 77 72 69 74 65 73 2d 42 2a 2f 7d  -overwrites-B*/}
9bc0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 42 49 54  .expr(A) ::= BIT
9bd0: 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e 0a  NOT(B) expr(X)..
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
9bf0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
9c00: 70 50 61 72 73 65 2c 20 40 42 2c 20 58 2c 20 30  pParse, @B, X, 0
9c10: 29 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  );/*A-overwrites
9c20: 2d 42 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a  -B*/}.expr(A) ::
9c30: 3d 20 50 4c 55 53 7c 4d 49 4e 55 53 28 42 29 20  = PLUS|MINUS(B) 
9c40: 65 78 70 72 28 58 29 2e 20 5b 42 49 54 4e 4f 54  expr(X). [BITNOT
9c50: 5d 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  ] {.  A = sqlite
9c60: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 40  3PExpr(pParse, @
9c70: 42 3d 3d 54 4b 5f 50 4c 55 53 20 3f 20 54 4b 5f  B==TK_PLUS ? TK_
9c80: 55 50 4c 55 53 20 3a 20 54 4b 5f 55 4d 49 4e 55  UPLUS : TK_UMINU
9c90: 53 2c 20 58 2c 20 30 29 3b 0a 20 20 2f 2a 41 2d  S, X, 0);.  /*A-
9ca0: 6f 76 65 72 77 72 69 74 65 73 2d 42 2a 2f 0a 7d  overwrites-B*/.}
9cb0: 0a 0a 25 74 79 70 65 20 62 65 74 77 65 65 6e 5f  ..%type between_
9cc0: 6f 70 20 7b 69 6e 74 7d 0a 62 65 74 77 65 65 6e  op {int}.between
9cd0: 5f 6f 70 28 41 29 20 3a 3a 3d 20 42 45 54 57 45  _op(A) ::= BETWE
9ce0: 45 4e 2e 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d  EN.     {A = 0;}
9cf0: 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20 3a  .between_op(A) :
9d00: 3a 3d 20 4e 4f 54 20 42 45 54 57 45 45 4e 2e 20  := NOT BETWEEN. 
9d10: 7b 41 20 3d 20 31 3b 7d 0a 65 78 70 72 28 41 29  {A = 1;}.expr(A)
9d20: 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 62 65 74   ::= expr(A) bet
9d30: 77 65 65 6e 5f 6f 70 28 4e 29 20 65 78 70 72 28  ween_op(N) expr(
9d40: 58 29 20 41 4e 44 20 65 78 70 72 28 59 29 2e 20  X) AND expr(Y). 
9d50: 5b 42 45 54 57 45 45 4e 5d 20 7b 0a 20 20 45 78  [BETWEEN] {.  Ex
9d60: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
9d70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
9d80: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 20  ppend(pParse,0, 
9d90: 58 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  X);.  pList = sq
9da0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
9db0: 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74  end(pParse,pList
9dc0: 2c 20 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  , Y);.  A = sqli
9dd0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
9de0: 20 54 4b 5f 42 45 54 57 45 45 4e 2c 20 41 2c 20   TK_BETWEEN, A, 
9df0: 30 29 3b 0a 20 20 69 66 28 20 41 20 29 7b 0a 20  0);.  if( A ){. 
9e00: 20 20 20 41 2d 3e 78 2e 70 4c 69 73 74 20 3d 20     A->x.pList = 
9e10: 70 4c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pList;.  }else{.
9e20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
9e30: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
9e40: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
9e50: 7d 20 0a 20 20 69 66 28 20 4e 20 29 20 41 20 3d  } .  if( N ) A =
9e60: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
9e70: 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2c  arse, TK_NOT, A,
9e80: 20 30 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53   0);.}.%ifndef S
9e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
9ea0: 45 52 59 0a 20 20 25 74 79 70 65 20 69 6e 5f 6f  ERY.  %type in_o
9eb0: 70 20 7b 69 6e 74 7d 0a 20 20 69 6e 5f 6f 70 28  p {int}.  in_op(
9ec0: 41 29 20 3a 3a 3d 20 49 4e 2e 20 20 20 20 20 20  A) ::= IN.      
9ed0: 7b 41 20 3d 20 30 3b 7d 0a 20 20 69 6e 5f 6f 70  {A = 0;}.  in_op
9ee0: 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e 2e 20  (A) ::= NOT IN. 
9ef0: 20 7b 41 20 3d 20 31 3b 7d 0a 20 20 65 78 70 72   {A = 1;}.  expr
9f00: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
9f10: 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 65 78 70 72  in_op(N) LP expr
9f20: 6c 69 73 74 28 59 29 20 52 50 2e 20 5b 49 4e 5d  list(Y) RP. [IN]
9f30: 20 7b 0a 20 20 20 20 69 66 28 20 59 3d 3d 30 20   {.    if( Y==0 
9f40: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ){.      /* Expr
9f50: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
9f60: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  orm.      **.   
9f70: 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31     **      expr1
9f80: 20 49 4e 20 28 29 0a 20 20 20 20 20 20 2a 2a 20   IN ().      ** 
9f90: 20 20 20 20 20 65 78 70 72 31 20 4e 4f 54 20 49       expr1 NOT I
9fa0: 4e 20 28 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20  N ().      **.  
9fb0: 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 66 79 20      ** simplify 
9fc0: 74 6f 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 28  to constants 0 (
9fd0: 66 61 6c 73 65 29 20 61 6e 64 20 31 20 28 74 72  false) and 1 (tr
9fe0: 75 65 29 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ue), respectivel
9ff0: 79 2c 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 61  y,.      ** rega
a000: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
a010: 6c 75 65 20 6f 66 20 65 78 70 72 31 2e 0a 20 20  lue of expr1..  
a020: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
a030: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
a040: 54 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  T==0 ){.        
a050: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
a060: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 41 29  e(pParse->db, A)
a070: 3b 0a 20 20 20 20 20 20 20 20 41 20 3d 20 73 71  ;.        A = sq
a080: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
a090: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e  Parse->db, TK_IN
a0a0: 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e  TEGER,&sqlite3In
a0b0: 74 54 6f 6b 65 6e 73 5b 4e 5d 2c 31 29 3b 0a 20  tTokens[N],1);. 
a0c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
a0d0: 20 69 66 28 20 59 2d 3e 6e 45 78 70 72 3d 3d 31   if( Y->nExpr==1
a0e0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70   ){.      /* Exp
a0f0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  ressions of the 
a100: 66 6f 72 6d 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  form:.      **. 
a110: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70       **      exp
a120: 72 31 20 49 4e 20 28 3f 31 29 0a 20 20 20 20 20  r1 IN (?1).     
a130: 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31 20 4e   **      expr1 N
a140: 4f 54 20 49 4e 20 28 3f 32 29 0a 20 20 20 20 20  OT IN (?2).     
a150: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 77 69 74   **.      ** wit
a160: 68 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 76 61  h exactly one va
a170: 6c 75 65 20 6f 6e 20 74 68 65 20 52 48 53 20 63  lue on the RHS c
a180: 61 6e 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64  an be simplified
a190: 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20   to something.  
a1a0: 20 20 20 20 2a 2a 20 6c 69 6b 65 20 74 68 69 73      ** like this
a1b0: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
a1c0: 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31 20 3d   **      expr1 =
a1d0: 3d 20 3f 31 0a 20 20 20 20 20 20 2a 2a 20 20 20  = ?1.      **   
a1e0: 20 20 20 65 78 70 72 31 20 3c 3e 20 3f 32 0a 20     expr1 <> ?2. 
a1f0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
a200: 20 42 75 74 2c 20 74 68 65 20 52 48 53 20 6f 66   But, the RHS of
a210: 20 74 68 65 20 3d 3d 20 6f 72 20 3c 3e 20 69 73   the == or <> is
a220: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 74 68 65   marked with the
a230: 20 45 50 5f 47 65 6e 65 72 69 63 20 66 6c 61 67   EP_Generic flag
a240: 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61  .      ** so tha
a250: 74 20 69 74 20 6d 61 79 20 6e 6f 74 20 63 6f 6e  t it may not con
a260: 74 72 69 62 75 74 65 20 74 6f 20 74 68 65 20 63  tribute to the c
a270: 6f 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 63 6f  omputation of co
a280: 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 20 20 2a  mparison.      *
a290: 2a 20 61 66 66 69 6e 69 74 79 20 6f 72 20 74 68  * affinity or th
a2a0: 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  e collating sequ
a2b0: 65 6e 63 65 20 74 6f 20 75 73 65 20 66 6f 72 20  ence to use for 
a2c0: 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 4f 74 68  comparison.  Oth
a2d0: 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
a2e0: 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20 77   the semantics w
a2f0: 6f 75 6c 64 20 62 65 20 73 75 62 74 6c 79 20 64  ould be subtly d
a300: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 49 4e  ifferent from IN
a310: 20 6f 72 20 4e 4f 54 20 49 4e 2e 0a 20 20 20 20   or NOT IN..    
a320: 20 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20    */.      Expr 
a330: 2a 70 52 48 53 20 3d 20 59 2d 3e 61 5b 30 5d 2e  *pRHS = Y->a[0].
a340: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 59 2d 3e  pExpr;.      Y->
a350: 61 5b 30 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a  a[0].pExpr = 0;.
a360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a370: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
a380: 73 65 2d 3e 64 62 2c 20 59 29 3b 0a 20 20 20 20  se->db, Y);.    
a390: 20 20 2f 2a 20 70 52 48 53 20 63 61 6e 6e 6f 74    /* pRHS cannot
a3a0: 20 62 65 20 4e 55 4c 4c 20 62 65 63 61 75 73 65   be NULL because
a3b0: 20 61 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20   a malloc error 
a3c0: 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
a3d0: 64 65 74 65 63 74 65 64 0a 20 20 20 20 20 20 2a  detected.      *
a3e0: 2a 20 62 65 66 6f 72 65 20 6e 6f 77 20 61 6e 64  * before now and
a3f0: 20 63 6f 6e 74 72 6f 6c 20 77 6f 75 6c 64 20 68   control would h
a400: 61 76 65 20 6e 65 76 65 72 20 72 65 61 63 68 65  ave never reache
a410: 64 20 74 68 69 73 20 70 6f 69 6e 74 20 2a 2f 0a  d this point */.
a420: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
a430: 28 70 52 48 53 29 20 29 7b 0a 20 20 20 20 20 20  (pRHS) ){.      
a440: 20 20 70 52 48 53 2d 3e 66 6c 61 67 73 20 26 3d    pRHS->flags &=
a450: 20 7e 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20   ~EP_Collate;.  
a460: 20 20 20 20 20 20 70 52 48 53 2d 3e 66 6c 61 67        pRHS->flag
a470: 73 20 7c 3d 20 45 50 5f 47 65 6e 65 72 69 63 3b  s |= EP_Generic;
a480: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 41  .      }.      A
a490: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
a4a0: 70 50 61 72 73 65 2c 20 4e 20 3f 20 54 4b 5f 4e  pParse, N ? TK_N
a4b0: 45 20 3a 20 54 4b 5f 45 51 2c 20 41 2c 20 70 52  E : TK_EQ, A, pR
a4c0: 48 53 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  HS);.    }else{.
a4d0: 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65        A = sqlite
a4e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
a4f0: 4b 5f 49 4e 2c 20 41 2c 20 30 29 3b 0a 20 20 20  K_IN, A, 0);.   
a500: 20 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20     if( A ){.    
a510: 20 20 20 20 41 2d 3e 78 2e 70 4c 69 73 74 20 3d      A->x.pList =
a520: 20 59 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   Y;.        sqli
a530: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
a540: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
a550: 20 41 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   A);.      }else
a560: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a570: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a580: 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29 3b 0a  pParse->db, Y);.
a590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a5a0: 28 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65  ( N ) A = sqlite
a5b0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
a5c0: 4b 5f 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20  K_NOT, A, 0);.  
a5d0: 20 20 7d 0a 20 20 7d 0a 20 20 65 78 70 72 28 41    }.  }.  expr(A
a5e0: 29 20 3a 3a 3d 20 4c 50 20 73 65 6c 65 63 74 28  ) ::= LP select(
a5f0: 58 29 20 52 50 2e 20 7b 0a 20 20 20 20 41 20 3d  X) RP. {.    A =
a600: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
a610: 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c  arse, TK_SELECT,
a620: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
a630: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
a640: 74 28 70 50 61 72 73 65 2c 20 41 2c 20 58 29 3b  t(pParse, A, X);
a650: 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a  .  }.  expr(A) :
a660: 3a 3d 20 65 78 70 72 28 41 29 20 69 6e 5f 6f 70  := expr(A) in_op
a670: 28 4e 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29  (N) LP select(Y)
a680: 20 52 50 2e 20 20 5b 49 4e 5d 20 7b 0a 20 20 20   RP.  [IN] {.   
a690: 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70   A = sqlite3PExp
a6a0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
a6b0: 20 41 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   A, 0);.    sqli
a6c0: 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65 63  te3PExprAddSelec
a6d0: 74 28 70 50 61 72 73 65 2c 20 41 2c 20 59 29 3b  t(pParse, A, Y);
a6e0: 0a 20 20 20 20 69 66 28 20 4e 20 29 20 41 20 3d  .    if( N ) A =
a6f0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
a700: 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2c  arse, TK_NOT, A,
a710: 20 30 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28   0);.  }.  expr(
a720: 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 69  A) ::= expr(A) i
a730: 6e 5f 6f 70 28 4e 29 20 6e 6d 28 59 29 20 64 62  n_op(N) nm(Y) db
a740: 6e 6d 28 5a 29 20 70 61 72 65 6e 5f 65 78 70 72  nm(Z) paren_expr
a750: 6c 69 73 74 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a  list(E). [IN] {.
a760: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
a770: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
a780: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
a790: 20 30 2c 26 59 2c 26 5a 29 3b 0a 20 20 20 20 53   0,&Y,&Z);.    S
a7a0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 3d  elect *pSelect =
a7b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65   sqlite3SelectNe
a7c0: 77 28 70 50 61 72 73 65 2c 20 30 2c 70 53 72 63  w(pParse, 0,pSrc
a7d0: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20  ,0,0,0,0,0,0);. 
a7e0: 20 20 20 69 66 28 20 45 20 29 20 20 73 71 6c 69     if( E )  sqli
a7f0: 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
a800: 67 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  gs(pParse, pSele
a810: 63 74 20 3f 20 70 53 72 63 20 3a 20 30 2c 20 45  ct ? pSrc : 0, E
a820: 29 3b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74  );.    A = sqlit
a830: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
a840: 54 4b 5f 49 4e 2c 20 41 2c 20 30 29 3b 0a 20 20  TK_IN, A, 0);.  
a850: 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64    sqlite3PExprAd
a860: 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  dSelect(pParse, 
a870: 41 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  A, pSelect);.   
a880: 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73 71 6c   if( N ) A = sql
a890: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
a8a0: 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 29 3b  , TK_NOT, A, 0);
a8b0: 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a  .  }.  expr(A) :
a8c0: 3a 3d 20 45 58 49 53 54 53 20 4c 50 20 73 65 6c  := EXISTS LP sel
a8d0: 65 63 74 28 59 29 20 52 50 2e 20 7b 0a 20 20 20  ect(Y) RP. {.   
a8e0: 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20 70 20   Expr *p;.    p 
a8f0: 3d 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78  = A = sqlite3PEx
a900: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 45 58  pr(pParse, TK_EX
a910: 49 53 54 53 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ISTS, 0, 0);.   
a920: 20 73 71 6c 69 74 65 33 50 45 78 70 72 41 64 64   sqlite3PExprAdd
a930: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
a940: 2c 20 59 29 3b 0a 20 20 7d 0a 25 65 6e 64 69 66  , Y);.  }.%endif
a950: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
a960: 51 55 45 52 59 0a 0a 2f 2a 20 43 41 53 45 20 65  QUERY../* CASE e
a970: 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 65 78  xpressions */.ex
a980: 70 72 28 41 29 20 3a 3a 3d 20 43 41 53 45 20 63  pr(A) ::= CASE c
a990: 61 73 65 5f 6f 70 65 72 61 6e 64 28 58 29 20 63  ase_operand(X) c
a9a0: 61 73 65 5f 65 78 70 72 6c 69 73 74 28 59 29 20  ase_exprlist(Y) 
a9b0: 63 61 73 65 5f 65 6c 73 65 28 5a 29 20 45 4e 44  case_else(Z) END
a9c0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
a9d0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
a9e0: 4b 5f 43 41 53 45 2c 20 58 2c 20 30 29 3b 0a 20  K_CASE, X, 0);. 
a9f0: 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41 2d   if( A ){.    A-
aa00: 3e 78 2e 70 4c 69 73 74 20 3d 20 5a 20 3f 20 73  >x.pList = Z ? s
aa10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
aa20: 70 65 6e 64 28 70 50 61 72 73 65 2c 59 2c 5a 29  pend(pParse,Y,Z)
aa30: 20 3a 20 59 3b 0a 20 20 20 20 73 71 6c 69 74 65   : Y;.    sqlite
aa40: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
aa50: 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 41  dFlags(pParse, A
aa60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
aa70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
aa80: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
aa90: 2c 20 59 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , Y);.    sqlite
aaa0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
aab0: 73 65 2d 3e 64 62 2c 20 5a 29 3b 0a 20 20 7d 0a  se->db, Z);.  }.
aac0: 7d 0a 25 74 79 70 65 20 63 61 73 65 5f 65 78 70  }.%type case_exp
aad0: 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a  rlist {ExprList*
aae0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63 61  }.%destructor ca
aaf0: 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 73 71 6c  se_exprlist {sql
ab00: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
ab10: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
ab20: 24 29 3b 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69  $);}.case_exprli
ab30: 73 74 28 41 29 20 3a 3a 3d 20 63 61 73 65 5f 65  st(A) ::= case_e
ab40: 78 70 72 6c 69 73 74 28 41 29 20 57 48 45 4e 20  xprlist(A) WHEN 
ab50: 65 78 70 72 28 59 29 20 54 48 45 4e 20 65 78 70  expr(Y) THEN exp
ab60: 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  r(Z). {.  A = sq
ab70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
ab80: 65 6e 64 28 70 50 61 72 73 65 2c 41 2c 20 59 29  end(pParse,A, Y)
ab90: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
aba0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
abb0: 61 72 73 65 2c 41 2c 20 5a 29 3b 0a 7d 0a 63 61  arse,A, Z);.}.ca
abc0: 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a  se_exprlist(A) :
abd0: 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 59 29 20  := WHEN expr(Y) 
abe0: 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a  THEN expr(Z). {.
abf0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
ac00: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
ac10: 73 65 2c 30 2c 20 59 29 3b 0a 20 20 41 20 3d 20  se,0, Y);.  A = 
ac20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
ac30: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 41 2c 20  ppend(pParse,A, 
ac40: 5a 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73 65  Z);.}.%type case
ac50: 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a 25 64  _else {Expr*}.%d
ac60: 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65  estructor case_e
ac70: 6c 73 65 20 7b 73 71 6c 69 74 65 33 45 78 70 72  lse {sqlite3Expr
ac80: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
ac90: 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f 65 6c  b, $$);}.case_el
aca0: 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53 45 20  se(A) ::=  ELSE 
acb0: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20  expr(X).        
acc0: 20 7b 41 20 3d 20 58 3b 7d 0a 63 61 73 65 5f 65   {A = X;}.case_e
acd0: 6c 73 65 28 41 29 20 3a 3a 3d 20 20 2e 20 20 20  lse(A) ::=  .   
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acf0: 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 25 74 79 70    {A = 0;} .%typ
ad00: 65 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b  e case_operand {
ad10: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
ad20: 6f 72 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 20  or case_operand 
ad30: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
ad40: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
ad50: 24 29 3b 7d 0a 63 61 73 65 5f 6f 70 65 72 61 6e  $);}.case_operan
ad60: 64 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  d(A) ::= expr(X)
ad70: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20  .            {A 
ad80: 3d 20 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69  = X; /*A-overwri
ad90: 74 65 73 2d 58 2a 2f 7d 20 0a 63 61 73 65 5f 6f  tes-X*/} .case_o
ada0: 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 2e 20  perand(A) ::= . 
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25 74 79    {A = 0;} ..%ty
add0: 70 65 20 65 78 70 72 6c 69 73 74 20 7b 45 78 70  pe exprlist {Exp
ade0: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
adf0: 74 6f 72 20 65 78 70 72 6c 69 73 74 20 7b 73 71  tor exprlist {sq
ae00: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ae10: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
ae20: 24 24 29 3b 7d 0a 25 74 79 70 65 20 6e 65 78 70  $$);}.%type nexp
ae30: 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a  rlist {ExprList*
ae40: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6e 65  }.%destructor ne
ae50: 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  xprlist {sqlite3
ae60: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
ae70: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
ae80: 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a  ..exprlist(A) ::
ae90: 3d 20 6e 65 78 70 72 6c 69 73 74 28 41 29 2e 0a  = nexprlist(A)..
aea0: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20  exprlist(A) ::= 
aeb0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
aed0: 3d 20 30 3b 7d 0a 6e 65 78 70 72 6c 69 73 74 28  = 0;}.nexprlist(
aee0: 41 29 20 3a 3a 3d 20 6e 65 78 70 72 6c 69 73 74  A) ::= nexprlist
aef0: 28 41 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59  (A) COMMA expr(Y
af00: 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  )..    {A = sqli
af10: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
af20: 64 28 70 50 61 72 73 65 2c 41 2c 59 29 3b 7d 0a  d(pParse,A,Y);}.
af30: 6e 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  nexprlist(A) ::=
af40: 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 7b 41   expr(Y)..    {A
af50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
af60: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
af70: 30 2c 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  0,Y); /*A-overwr
af80: 69 74 65 73 2d 59 2a 2f 7d 0a 0a 25 69 66 6e 64  ites-Y*/}..%ifnd
af90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
afa0: 55 42 51 55 45 52 59 0a 2f 2a 20 41 20 70 61 72  UBQUERY./* A par
afb0: 65 6e 5f 65 78 70 72 6c 69 73 74 20 69 73 20 61  en_exprlist is a
afc0: 6e 20 6f 70 74 69 6f 6e 61 6c 20 65 78 70 72 65  n optional expre
afd0: 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61  ssion list conta
afe0: 69 6e 65 64 20 69 6e 73 69 64 65 0a 2a 2a 20 6f  ined inside.** o
aff0: 66 20 70 61 72 65 6e 74 68 65 73 69 73 20 2a 2f  f parenthesis */
b000: 0a 25 74 79 70 65 20 70 61 72 65 6e 5f 65 78 70  .%type paren_exp
b010: 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a  rlist {ExprList*
b020: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 70 61  }.%destructor pa
b030: 72 65 6e 5f 65 78 70 72 6c 69 73 74 20 7b 73 71  ren_exprlist {sq
b040: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
b050: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
b060: 24 24 29 3b 7d 0a 70 61 72 65 6e 5f 65 78 70 72  $$);}.paren_expr
b070: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  list(A) ::= .   
b080: 7b 41 20 3d 20 30 3b 7d 0a 70 61 72 65 6e 5f 65  {A = 0;}.paren_e
b090: 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 4c  xprlist(A) ::= L
b0a0: 50 20 65 78 70 72 6c 69 73 74 28 58 29 20 52 50  P exprlist(X) RP
b0b0: 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 65 6e 64  .  {A = X;}.%end
b0c0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  if SQLITE_OMIT_S
b0d0: 55 42 51 55 45 52 59 0a 0a 0a 2f 2f 2f 2f 2f 2f  UBQUERY...//////
b0e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b0f0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41  /////// The CREA
b100: 54 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64  TE INDEX command
b110: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
b120: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
b130: 3a 3a 3d 20 63 72 65 61 74 65 6b 77 28 53 29 20  ::= createkw(S) 
b140: 75 6e 69 71 75 65 66 6c 61 67 28 55 29 20 49 4e  uniqueflag(U) IN
b150: 44 45 58 20 69 66 6e 6f 74 65 78 69 73 74 73 28  DEX ifnotexists(
b160: 4e 45 29 20 6e 6d 28 58 29 20 64 62 6e 6d 28 44  NE) nm(X) dbnm(D
b170: 29 0a 20 20 20 20 20 20 20 20 4f 4e 20 6e 6d 28  ).        ON nm(
b180: 59 29 20 4c 50 20 73 6f 72 74 6c 69 73 74 28 5a  Y) LP sortlist(Z
b190: 29 20 52 50 20 77 68 65 72 65 5f 6f 70 74 28 57  ) RP where_opt(W
b1a0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 43 72  ). {.  sqlite3Cr
b1b0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
b1c0: 2c 20 26 58 2c 20 26 44 2c 20 0a 20 20 20 20 20  , &X, &D, .     
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1e0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
b1f0: 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 26 59  pend(pParse,0,&Y
b200: 2c 30 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20 20  ,0), Z, U,.     
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 26 53 2c 20 57 2c 20 53 51 4c 49 54 45 5f 53   &S, W, SQLITE_S
b230: 4f 5f 41 53 43 2c 20 4e 45 2c 20 53 51 4c 49 54  O_ASC, NE, SQLIT
b240: 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
b250: 29 3b 0a 20 20 69 66 28 20 49 4e 5f 52 45 4e 41  );.  if( IN_RENA
b260: 4d 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 50 61  ME_OBJECT && pPa
b270: 72 73 65 2d 3e 70 4e 65 77 49 6e 64 65 78 20 29  rse->pNewIndex )
b280: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e  {.    sqlite3Ren
b290: 61 6d 65 54 6f 6b 65 6e 4d 61 70 28 70 50 61 72  ameTokenMap(pPar
b2a0: 73 65 2c 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  se, pParse->pNew
b2b0: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 26 59  Index->zName, &Y
b2c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 25 74 79 70 65 20  );.  }.}..%type 
b2d0: 75 6e 69 71 75 65 66 6c 61 67 20 7b 69 6e 74 7d  uniqueflag {int}
b2e0: 0a 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a  .uniqueflag(A) :
b2f0: 3a 3d 20 55 4e 49 51 55 45 2e 20 20 7b 41 20 3d  := UNIQUE.  {A =
b300: 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 75 6e 69 71   OE_Abort;}.uniq
b310: 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 2e 20  ueflag(A) ::= . 
b320: 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 4e         {A = OE_N
b330: 6f 6e 65 3b 7d 0a 0a 0a 2f 2f 20 54 68 65 20 65  one;}...// The e
b340: 69 64 6c 69 73 74 20 6e 6f 6e 2d 74 65 72 6d 69  idlist non-termi
b350: 6e 61 6c 20 28 45 78 70 72 65 73 73 69 6f 6e 20  nal (Expression 
b360: 49 64 20 4c 69 73 74 29 20 67 65 6e 65 72 61 74  Id List) generat
b370: 65 73 20 61 6e 20 45 78 70 72 4c 69 73 74 0a 2f  es an ExprList./
b380: 2f 20 66 72 6f 6d 20 61 20 6c 69 73 74 20 6f 66  / from a list of
b390: 20 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 54   identifiers.  T
b3a0: 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61  he identifier na
b3b0: 6d 65 73 20 61 72 65 20 69 6e 20 45 78 70 72 4c  mes are in ExprL
b3c0: 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 2e 0a 2f  ist.a[].zName../
b3d0: 2f 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 73  / This list is s
b3e0: 74 6f 72 65 64 20 69 6e 20 61 6e 20 45 78 70 72  tored in an Expr
b3f0: 4c 69 73 74 20 72 61 74 68 65 72 20 74 68 61 6e  List rather than
b400: 20 61 6e 20 49 64 4c 69 73 74 20 73 6f 20 74 68   an IdList so th
b410: 61 74 20 69 74 0a 2f 2f 20 63 61 6e 20 62 65 20  at it.// can be 
b420: 65 61 73 69 6c 79 20 73 65 6e 74 20 74 6f 20 73  easily sent to s
b430: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 45 78 70  qlite3ColumnsExp
b440: 72 4c 69 73 74 28 29 2e 0a 2f 2f 0a 2f 2f 20 65  rList()..//.// e
b450: 69 64 6c 69 73 74 20 69 73 20 67 72 6f 75 70 65  idlist is groupe
b460: 64 20 77 69 74 68 20 43 52 45 41 54 45 20 49 4e  d with CREATE IN
b470: 44 45 58 20 62 65 63 61 75 73 65 20 69 74 20 75  DEX because it u
b480: 73 65 64 20 74 6f 20 62 65 20 74 68 65 20 6e 6f  sed to be the no
b490: 6e 2d 74 65 72 6d 69 6e 61 6c 0a 2f 2f 20 75 73  n-terminal.// us
b4a0: 65 64 20 66 6f 72 20 74 68 65 20 61 72 67 75 6d  ed for the argum
b4b0: 65 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78  ents to an index
b4c0: 2e 20 20 54 68 61 74 20 69 73 20 6a 75 73 74 20  .  That is just 
b4d0: 61 6e 20 68 69 73 74 6f 72 69 63 61 6c 20 61 63  an historical ac
b4e0: 63 69 64 65 6e 74 2e 0a 2f 2f 0a 2f 2f 20 49 4d  cident..//.// IM
b4f0: 50 4f 52 54 41 4e 54 20 43 4f 4d 50 41 54 49 42  PORTANT COMPATIB
b500: 49 4c 49 54 59 20 4e 4f 54 45 3a 20 20 53 6f 6d  ILITY NOTE:  Som
b510: 65 20 70 72 69 6f 72 20 76 65 72 73 69 6f 6e 73  e prior versions
b520: 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63 65 70   of SQLite accep
b530: 74 65 64 0a 2f 2f 20 43 4f 4c 4c 41 54 45 20 63  ted.// COLLATE c
b540: 6c 61 75 73 65 73 20 61 6e 64 20 41 53 43 20 6f  lauses and ASC o
b550: 72 20 44 45 53 43 20 6b 65 79 77 6f 72 64 73 20  r DESC keywords 
b560: 6f 6e 20 49 44 20 6c 69 73 74 73 20 69 6e 20 69  on ID lists in i
b570: 6e 61 70 70 72 6f 70 72 69 61 74 65 0a 2f 2f 20  nappropriate.// 
b580: 70 6c 61 63 65 73 20 2d 20 70 6c 61 63 65 73 20  places - places 
b590: 74 68 61 74 20 6d 69 67 68 74 20 68 61 76 65 20  that might have 
b5a0: 62 65 65 6e 20 73 74 6f 72 65 64 20 69 6e 20 74  been stored in t
b5b0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b5c0: 20 73 63 68 65 6d 61 2e 0a 2f 2f 20 54 68 6f 73   schema..// Thos
b5d0: 65 20 65 78 74 72 61 20 66 65 61 74 75 72 65 73  e extra features
b5e0: 20 77 65 72 65 20 69 67 6e 6f 72 65 64 2e 20 20   were ignored.  
b5f0: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 79  But because they
b600: 20 6d 69 67 68 74 20 62 65 20 69 6e 20 73 6f 6d   might be in som
b610: 65 0a 2f 2f 20 28 62 75 73 74 65 64 29 20 6f 6c  e.// (busted) ol
b620: 64 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  d databases, we 
b630: 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65  need to continue
b640: 20 70 61 72 73 69 6e 67 20 74 68 65 6d 20 77 68   parsing them wh
b650: 65 6e 20 6c 6f 61 64 69 6e 67 0a 2f 2f 20 68 69  en loading.// hi
b660: 73 74 6f 72 69 63 61 6c 20 73 63 68 65 6d 61 73  storical schemas
b670: 2e 0a 2f 2f 0a 25 74 79 70 65 20 65 69 64 6c 69  ..//.%type eidli
b680: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
b690: 64 65 73 74 72 75 63 74 6f 72 20 65 69 64 6c 69  destructor eidli
b6a0: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
b6b0: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
b6c0: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70  ->db, $$);}.%typ
b6d0: 65 20 65 69 64 6c 69 73 74 5f 6f 70 74 20 7b 45  e eidlist_opt {E
b6e0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
b6f0: 75 63 74 6f 72 20 65 69 64 6c 69 73 74 5f 6f 70  uctor eidlist_op
b700: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
b710: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
b720: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 69 6e 63  >db, $$);}..%inc
b730: 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 41 64 64 20  lude {.  /* Add 
b740: 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 74 65 72  a single new ter
b750: 6d 20 74 6f 20 61 6e 20 45 78 70 72 4c 69 73 74  m to an ExprList
b760: 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
b770: 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 6c 69   store a.  ** li
b780: 73 74 20 6f 66 20 69 64 65 6e 74 69 66 69 65 72  st of identifier
b790: 73 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  s.  Report an er
b7a0: 72 6f 72 20 69 66 20 74 68 65 20 49 44 20 6c 69  ror if the ID li
b7b0: 73 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a  st contains.  **
b7c0: 20 61 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73   a COLLATE claus
b7d0: 65 20 6f 72 20 61 6e 20 41 53 43 20 6f 72 20 44  e or an ASC or D
b7e0: 45 53 43 20 6b 65 79 77 6f 72 64 2c 20 65 78 63  ESC keyword, exc
b7f0: 65 70 74 20 69 67 6e 6f 72 65 20 74 68 65 0a 20  ept ignore the. 
b800: 20 2a 2a 20 65 72 72 6f 72 20 77 68 69 6c 65 20   ** error while 
b810: 70 61 72 73 69 6e 67 20 61 20 6c 65 67 61 63 79  parsing a legacy
b820: 20 73 63 68 65 6d 61 2e 0a 20 20 2a 2f 0a 20 20   schema..  */.  
b830: 73 74 61 74 69 63 20 45 78 70 72 4c 69 73 74 20  static ExprList 
b840: 2a 70 61 72 73 65 72 41 64 64 45 78 70 72 49 64  *parserAddExprId
b850: 4c 69 73 74 54 65 72 6d 28 0a 20 20 20 20 50 61  ListTerm(.    Pa
b860: 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 20  rse *pParse,.   
b870: 20 45 78 70 72 4c 69 73 74 20 2a 70 50 72 69 6f   ExprList *pPrio
b880: 72 2c 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 49  r,.    Token *pI
b890: 64 54 6f 6b 65 6e 2c 0a 20 20 20 20 69 6e 74 20  dToken,.    int 
b8a0: 68 61 73 43 6f 6c 6c 61 74 65 2c 0a 20 20 20 20  hasCollate,.    
b8b0: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 0a 20 20  int sortOrder.  
b8c0: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
b8d0: 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
b8e0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
b8f0: 65 2c 20 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  e, pPrior, 0);. 
b900: 20 20 20 69 66 28 20 28 68 61 73 43 6f 6c 6c 61     if( (hasColla
b910: 74 65 20 7c 7c 20 73 6f 72 74 4f 72 64 65 72 21  te || sortOrder!
b920: 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46  =SQLITE_SO_UNDEF
b930: 49 4e 45 44 29 0a 20 20 20 20 20 20 20 20 26 26  INED).        &&
b940: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69   pParse->db->ini
b950: 74 2e 62 75 73 79 3d 3d 30 0a 20 20 20 20 29 7b  t.busy==0.    ){
b960: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
b970: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b980: 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61 66 74  syntax error aft
b990: 65 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5c  er column name \
b9a0: 22 25 2e 2a 73 5c 22 22 2c 0a 20 20 20 20 20 20  "%.*s\"",.      
b9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9c0: 20 20 20 70 49 64 54 6f 6b 65 6e 2d 3e 6e 2c 20     pIdToken->n, 
b9d0: 70 49 64 54 6f 6b 65 6e 2d 3e 7a 29 3b 0a 20 20  pIdToken->z);.  
b9e0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
b9f0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
ba00: 50 61 72 73 65 2c 20 70 2c 20 70 49 64 54 6f 6b  Parse, p, pIdTok
ba10: 65 6e 2c 20 31 29 3b 0a 20 20 20 20 72 65 74 75  en, 1);.    retu
ba20: 72 6e 20 70 3b 0a 20 20 7d 0a 7d 20 2f 2f 20 65  rn p;.  }.} // e
ba30: 6e 64 20 25 69 6e 63 6c 75 64 65 0a 0a 65 69 64  nd %include..eid
ba40: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
ba50: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ba60: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
ba70: 3b 7d 0a 65 69 64 6c 69 73 74 5f 6f 70 74 28 41  ;}.eidlist_opt(A
ba80: 29 20 3a 3a 3d 20 4c 50 20 65 69 64 6c 69 73 74  ) ::= LP eidlist
ba90: 28 58 29 20 52 50 2e 20 20 20 20 20 20 20 20 20  (X) RP.         
baa0: 7b 41 20 3d 20 58 3b 7d 0a 65 69 64 6c 69 73 74  {A = X;}.eidlist
bab0: 28 41 29 20 3a 3a 3d 20 65 69 64 6c 69 73 74 28  (A) ::= eidlist(
bac0: 41 29 20 43 4f 4d 4d 41 20 6e 6d 28 59 29 20 63  A) COMMA nm(Y) c
bad0: 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74 6f 72  ollate(C) sortor
bae0: 64 65 72 28 5a 29 2e 20 20 7b 0a 20 20 41 20 3d  der(Z).  {.  A =
baf0: 20 70 61 72 73 65 72 41 64 64 45 78 70 72 49 64   parserAddExprId
bb00: 4c 69 73 74 54 65 72 6d 28 70 50 61 72 73 65 2c  ListTerm(pParse,
bb10: 20 41 2c 20 26 59 2c 20 43 2c 20 5a 29 3b 0a 7d   A, &Y, C, Z);.}
bb20: 0a 65 69 64 6c 69 73 74 28 41 29 20 3a 3a 3d 20  .eidlist(A) ::= 
bb30: 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65 28 43 29  nm(Y) collate(C)
bb40: 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b   sortorder(Z). {
bb50: 0a 20 20 41 20 3d 20 70 61 72 73 65 72 41 64 64  .  A = parserAdd
bb60: 45 78 70 72 49 64 4c 69 73 74 54 65 72 6d 28 70  ExprIdListTerm(p
bb70: 50 61 72 73 65 2c 20 30 2c 20 26 59 2c 20 43 2c  Parse, 0, &Y, C,
bb80: 20 5a 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69   Z); /*A-overwri
bb90: 74 65 73 2d 59 2a 2f 0a 7d 0a 0a 25 74 79 70 65  tes-Y*/.}..%type
bba0: 20 63 6f 6c 6c 61 74 65 20 7b 69 6e 74 7d 0a 63   collate {int}.c
bbb0: 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d 20 2e 20  ollate(C) ::= . 
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 43 20               {C 
bbd0: 3d 20 30 3b 7d 0a 63 6f 6c 6c 61 74 65 28 43 29  = 0;}.collate(C)
bbe0: 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20 69 64 73   ::= COLLATE ids
bbf0: 2e 20 20 20 7b 43 20 3d 20 31 3b 7d 0a 0a 0a 2f  .   {C = 1;}.../
bc00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bc10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
bc20: 20 44 52 4f 50 20 49 4e 44 45 58 20 63 6f 6d 6d   DROP INDEX comm
bc30: 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  and ////////////
bc40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
bc50: 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 49 4e  .cmd ::= DROP IN
bc60: 44 45 58 20 69 66 65 78 69 73 74 73 28 45 29 20  DEX ifexists(E) 
bc70: 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 20 20 7b  fullname(X).   {
bc80: 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78  sqlite3DropIndex
bc90: 28 70 50 61 72 73 65 2c 20 58 2c 20 45 29 3b 7d  (pParse, X, E);}
bca0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
bcb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
bcc0: 54 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  The VACUUM comma
bcd0: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
bce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bcf0: 0a 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  .//.%ifndef SQLI
bd00: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 25  TE_OMIT_VACUUM.%
bd10: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bd20: 49 54 5f 41 54 54 41 43 48 0a 25 74 79 70 65 20  IT_ATTACH.%type 
bd30: 76 69 6e 74 6f 20 7b 45 78 70 72 2a 7d 0a 25 64  vinto {Expr*}.%d
bd40: 65 73 74 72 75 63 74 6f 72 20 76 69 6e 74 6f 20  estructor vinto 
bd50: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
bd60: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
bd70: 24 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41 43  $);}.cmd ::= VAC
bd80: 55 55 4d 20 76 69 6e 74 6f 28 59 29 2e 20 20 20  UUM vinto(Y).   
bd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
bda0: 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50 61 72  lite3Vacuum(pPar
bdb0: 73 65 2c 30 2c 59 29 3b 7d 0a 63 6d 64 20 3a 3a  se,0,Y);}.cmd ::
bdc0: 3d 20 56 41 43 55 55 4d 20 6e 6d 28 58 29 20 76  = VACUUM nm(X) v
bdd0: 69 6e 74 6f 28 59 29 2e 20 20 20 20 20 20 20 20  into(Y).        
bde0: 20 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75 6d    {sqlite3Vacuum
bdf0: 28 70 50 61 72 73 65 2c 26 58 2c 59 29 3b 7d 0a  (pParse,&X,Y);}.
be00: 76 69 6e 74 6f 28 41 29 20 3a 3a 3d 20 49 4e 54  vinto(A) ::= INT
be10: 4f 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  O expr(X).      
be20: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
be30: 0a 76 69 6e 74 6f 28 41 29 20 3a 3a 3d 20 2e 20  .vinto(A) ::= . 
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
be60: 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  }.%endif  SQLITE
be70: 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 25 65 6e  _OMIT_ATTACH.%en
be80: 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54  dif  SQLITE_OMIT
be90: 5f 56 41 43 55 55 4d 0a 0a 2f 2f 2f 2f 2f 2f 2f  _VACUUM..///////
bea0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
beb0: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d  ////// The PRAGM
bec0: 41 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  A command //////
bed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bee0: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64  ///////.//.%ifnd
bef0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
bf00: 52 41 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52  RAGMA.cmd ::= PR
bf10: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
bf20: 5a 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  Z).             
bf30: 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d     {sqlite3Pragm
bf40: 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 30  a(pParse,&X,&Z,0
bf50: 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52  ,0);}.cmd ::= PR
bf60: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
bf70: 5a 29 20 45 51 20 6e 6d 6e 75 6d 28 59 29 2e 20  Z) EQ nmnum(Y). 
bf80: 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d     {sqlite3Pragm
bf90: 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26  a(pParse,&X,&Z,&
bfa0: 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50  Y,0);}.cmd ::= P
bfb0: 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d  RAGMA nm(X) dbnm
bfc0: 28 5a 29 20 4c 50 20 6e 6d 6e 75 6d 28 59 29 20  (Z) LP nmnum(Y) 
bfd0: 52 50 2e 20 7b 73 71 6c 69 74 65 33 50 72 61 67  RP. {sqlite3Prag
bfe0: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
bff0: 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  &Y,0);}.cmd ::= 
c000: 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e  PRAGMA nm(X) dbn
c010: 6d 28 5a 29 20 45 51 20 6d 69 6e 75 73 5f 6e 75  m(Z) EQ minus_nu
c020: 6d 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20  m(Y). .         
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c050: 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67      {sqlite3Prag
c060: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
c070: 26 59 2c 31 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  &Y,1);}.cmd ::= 
c080: 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e  PRAGMA nm(X) dbn
c090: 6d 28 5a 29 20 4c 50 20 6d 69 6e 75 73 5f 6e 75  m(Z) LP minus_nu
c0a0: 6d 28 59 29 20 52 50 2e 0a 20 20 20 20 20 20 20  m(Y) RP..       
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72        {sqlite3Pr
c0e0: 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26  agma(pParse,&X,&
c0f0: 5a 2c 26 59 2c 31 29 3b 7d 0a 0a 6e 6d 6e 75 6d  Z,&Y,1);}..nmnum
c100: 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d  (A) ::= plus_num
c110: 28 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a  (A)..nmnum(A) ::
c120: 3d 20 6e 6d 28 41 29 2e 0a 6e 6d 6e 75 6d 28 41  = nm(A)..nmnum(A
c130: 29 20 3a 3a 3d 20 4f 4e 28 41 29 2e 0a 6e 6d 6e  ) ::= ON(A)..nmn
c140: 75 6d 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45  um(A) ::= DELETE
c150: 28 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a  (A)..nmnum(A) ::
c160: 3d 20 44 45 46 41 55 4c 54 28 41 29 2e 0a 25 65  = DEFAULT(A)..%e
c170: 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndif SQLITE_OMIT
c180: 5f 50 52 41 47 4d 41 0a 25 74 6f 6b 65 6e 5f 63  _PRAGMA.%token_c
c190: 6c 61 73 73 20 6e 75 6d 62 65 72 20 49 4e 54 45  lass number INTE
c1a0: 47 45 52 7c 46 4c 4f 41 54 2e 0a 70 6c 75 73 5f  GER|FLOAT..plus_
c1b0: 6e 75 6d 28 41 29 20 3a 3a 3d 20 50 4c 55 53 20  num(A) ::= PLUS 
c1c0: 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20 20  number(X).      
c1d0: 20 7b 41 20 3d 20 58 3b 7d 0a 70 6c 75 73 5f 6e   {A = X;}.plus_n
c1e0: 75 6d 28 41 29 20 3a 3a 3d 20 6e 75 6d 62 65 72  um(A) ::= number
c1f0: 28 41 29 2e 0a 6d 69 6e 75 73 5f 6e 75 6d 28 41  (A)..minus_num(A
c200: 29 20 3a 3a 3d 20 4d 49 4e 55 53 20 6e 75 6d 62  ) ::= MINUS numb
c210: 65 72 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20  er(X).     {A = 
c220: 58 3b 7d 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  X;}.////////////
c230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c240: 20 54 68 65 20 43 52 45 41 54 45 20 54 52 49 47   The CREATE TRIG
c250: 47 45 52 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  GER command ////
c260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c270: 2f 0a 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  /..%ifndef SQLIT
c280: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a  E_OMIT_TRIGGER..
c290: 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77  cmd ::= createkw
c2a0: 20 74 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29   trigger_decl(A)
c2b0: 20 42 45 47 49 4e 20 74 72 69 67 67 65 72 5f 63   BEGIN trigger_c
c2c0: 6d 64 5f 6c 69 73 74 28 53 29 20 45 4e 44 28 5a  md_list(S) END(Z
c2d0: 29 2e 20 7b 0a 20 20 54 6f 6b 65 6e 20 61 6c 6c  ). {.  Token all
c2e0: 3b 0a 20 20 61 6c 6c 2e 7a 20 3d 20 41 2e 7a 3b  ;.  all.z = A.z;
c2f0: 0a 20 20 61 6c 6c 2e 6e 20 3d 20 28 69 6e 74 29  .  all.n = (int)
c300: 28 5a 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a 2e  (Z.z - A.z) + Z.
c310: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6e 69  n;.  sqlite3Fini
c320: 73 68 54 72 69 67 67 65 72 28 70 50 61 72 73 65  shTrigger(pParse
c330: 2c 20 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a 0a 74  , S, &all);.}..t
c340: 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20 3a  rigger_decl(A) :
c350: 3a 3d 20 74 65 6d 70 28 54 29 20 54 52 49 47 47  := temp(T) TRIGG
c360: 45 52 20 69 66 6e 6f 74 65 78 69 73 74 73 28 4e  ER ifnotexists(N
c370: 4f 45 52 52 29 20 6e 6d 28 42 29 20 64 62 6e 6d  OERR) nm(B) dbnm
c380: 28 5a 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  (Z) .           
c390: 20 20 20 20 20 20 20 20 20 74 72 69 67 67 65 72           trigger
c3a0: 5f 74 69 6d 65 28 43 29 20 74 72 69 67 67 65 72  _time(C) trigger
c3b0: 5f 65 76 65 6e 74 28 44 29 0a 20 20 20 20 20 20  _event(D).      
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 4e                ON
c3d0: 20 66 75 6c 6c 6e 61 6d 65 28 45 29 20 66 6f 72   fullname(E) for
c3e0: 65 61 63 68 5f 63 6c 61 75 73 65 20 77 68 65 6e  each_clause when
c3f0: 5f 63 6c 61 75 73 65 28 47 29 2e 20 7b 0a 20 20  _clause(G). {.  
c400: 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69 67  sqlite3BeginTrig
c410: 67 65 72 28 70 50 61 72 73 65 2c 20 26 42 2c 20  ger(pParse, &B, 
c420: 26 5a 2c 20 43 2c 20 44 2e 61 2c 20 44 2e 62 2c  &Z, C, D.a, D.b,
c430: 20 45 2c 20 47 2c 20 54 2c 20 4e 4f 45 52 52 29   E, G, T, NOERR)
c440: 3b 0a 20 20 41 20 3d 20 28 5a 2e 6e 3d 3d 30 3f  ;.  A = (Z.n==0?
c450: 42 3a 5a 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  B:Z); /*A-overwr
c460: 69 74 65 73 2d 54 2a 2f 0a 7d 0a 0a 25 74 79 70  ites-T*/.}..%typ
c470: 65 20 74 72 69 67 67 65 72 5f 74 69 6d 65 20 7b  e trigger_time {
c480: 69 6e 74 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d  int}.trigger_tim
c490: 65 28 41 29 20 3a 3a 3d 20 42 45 46 4f 52 45 7c  e(A) ::= BEFORE|
c4a0: 41 46 54 45 52 28 58 29 2e 20 20 7b 20 41 20 3d  AFTER(X).  { A =
c4b0: 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69   @X; /*A-overwri
c4c0: 74 65 73 2d 58 2a 2f 20 7d 0a 74 72 69 67 67 65  tes-X*/ }.trigge
c4d0: 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 49 4e  r_time(A) ::= IN
c4e0: 53 54 45 41 44 20 4f 46 2e 20 20 7b 20 41 20 3d  STEAD OF.  { A =
c4f0: 20 54 4b 5f 49 4e 53 54 45 41 44 3b 7d 0a 74 72   TK_INSTEAD;}.tr
c500: 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a  igger_time(A) ::
c510: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b  = .            {
c520: 20 41 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20   A = TK_BEFORE; 
c530: 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72  }..%type trigger
c540: 5f 65 76 65 6e 74 20 7b 73 74 72 75 63 74 20 54  _event {struct T
c550: 72 69 67 45 76 65 6e 74 7d 0a 25 64 65 73 74 72  rigEvent}.%destr
c560: 75 63 74 6f 72 20 74 72 69 67 67 65 72 5f 65 76  uctor trigger_ev
c570: 65 6e 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69  ent {sqlite3IdLi
c580: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
c590: 3e 64 62 2c 20 24 24 2e 62 29 3b 7d 0a 74 72 69  >db, $$.b);}.tri
c5a0: 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a  gger_event(A) ::
c5b0: 3d 20 44 45 4c 45 54 45 7c 49 4e 53 45 52 54 28  = DELETE|INSERT(
c5c0: 58 29 2e 20 20 20 7b 41 2e 61 20 3d 20 40 58 3b  X).   {A.a = @X;
c5d0: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
c5e0: 58 2a 2f 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72  X*/ A.b = 0;}.tr
c5f0: 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a  igger_event(A) :
c600: 3a 3d 20 55 50 44 41 54 45 28 58 29 2e 20 20 20  := UPDATE(X).   
c610: 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 40 58         {A.a = @X
c620: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
c630: 2d 58 2a 2f 20 41 2e 62 20 3d 20 30 3b 7d 0a 74  -X*/ A.b = 0;}.t
c640: 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20  rigger_event(A) 
c650: 3a 3a 3d 20 55 50 44 41 54 45 20 4f 46 20 69 64  ::= UPDATE OF id
c660: 6c 69 73 74 28 58 29 2e 7b 41 2e 61 20 3d 20 54  list(X).{A.a = T
c670: 4b 5f 55 50 44 41 54 45 3b 20 41 2e 62 20 3d 20  K_UPDATE; A.b = 
c680: 58 3b 7d 0a 0a 66 6f 72 65 61 63 68 5f 63 6c 61  X;}..foreach_cla
c690: 75 73 65 20 3a 3a 3d 20 2e 0a 66 6f 72 65 61 63  use ::= ..foreac
c6a0: 68 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 46 4f 52  h_clause ::= FOR
c6b0: 20 45 41 43 48 20 52 4f 57 2e 0a 0a 25 74 79 70   EACH ROW...%typ
c6c0: 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 45  e when_clause {E
c6d0: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
c6e0: 72 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 73  r when_clause {s
c6f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
c700: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
c710: 3b 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28 41  ;}.when_clause(A
c720: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
c730: 20 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 77      { A = 0; }.w
c740: 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a  hen_clause(A) ::
c750: 3d 20 57 48 45 4e 20 65 78 70 72 28 58 29 2e 20  = WHEN expr(X). 
c760: 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 25 74 79 70  { A = X; }..%typ
c770: 65 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  e trigger_cmd_li
c780: 73 74 20 7b 54 72 69 67 67 65 72 53 74 65 70 2a  st {TriggerStep*
c790: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72  }.%destructor tr
c7a0: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b  igger_cmd_list {
c7b0: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
c7c0: 67 67 65 72 53 74 65 70 28 70 50 61 72 73 65 2d  ggerStep(pParse-
c7d0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 74 72 69 67 67  >db, $$);}.trigg
c7e0: 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a  er_cmd_list(A) :
c7f0: 3a 3d 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c  := trigger_cmd_l
c800: 69 73 74 28 41 29 20 74 72 69 67 67 65 72 5f 63  ist(A) trigger_c
c810: 6d 64 28 58 29 20 53 45 4d 49 2e 20 7b 0a 20 20  md(X) SEMI. {.  
c820: 61 73 73 65 72 74 28 20 41 21 3d 30 20 29 3b 0a  assert( A!=0 );.
c830: 20 20 41 2d 3e 70 4c 61 73 74 2d 3e 70 4e 65 78    A->pLast->pNex
c840: 74 20 3d 20 58 3b 0a 20 20 41 2d 3e 70 4c 61 73  t = X;.  A->pLas
c850: 74 20 3d 20 58 3b 0a 7d 0a 74 72 69 67 67 65 72  t = X;.}.trigger
c860: 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d  _cmd_list(A) ::=
c870: 20 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20   trigger_cmd(A) 
c880: 53 45 4d 49 2e 20 7b 20 0a 20 20 61 73 73 65 72  SEMI. { .  asser
c890: 74 28 20 41 21 3d 30 20 29 3b 0a 20 20 41 2d 3e  t( A!=0 );.  A->
c8a0: 70 4c 61 73 74 20 3d 20 41 3b 0a 7d 0a 0a 2f 2f  pLast = A;.}..//
c8b0: 20 44 69 73 61 6c 6c 6f 77 20 71 75 61 6c 69 66   Disallow qualif
c8c0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ied table names 
c8d0: 6f 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54  on INSERT, UPDAT
c8e0: 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 73 74  E, and DELETE st
c8f0: 61 74 65 6d 65 6e 74 73 0a 2f 2f 20 77 69 74 68  atements.// with
c900: 69 6e 20 61 20 74 72 69 67 67 65 72 2e 20 20 54  in a trigger.  T
c910: 68 65 20 74 61 62 6c 65 20 74 6f 20 49 4e 53 45  he table to INSE
c920: 52 54 2c 20 55 50 44 41 54 45 2c 20 6f 72 20 44  RT, UPDATE, or D
c930: 45 4c 45 54 45 20 69 73 20 61 6c 77 61 79 73 20  ELETE is always 
c940: 69 6e 20 0a 2f 2f 20 74 68 65 20 73 61 6d 65 20  in .// the same 
c950: 64 61 74 61 62 61 73 65 20 61 73 20 74 68 65 20  database as the 
c960: 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 74  table that the t
c970: 72 69 67 67 65 72 20 66 69 72 65 73 20 6f 6e 2e  rigger fires on.
c980: 0a 2f 2f 0a 25 74 79 70 65 20 74 72 6e 6d 20 7b  .//.%type trnm {
c990: 54 6f 6b 65 6e 7d 0a 74 72 6e 6d 28 41 29 20 3a  Token}.trnm(A) :
c9a0: 3a 3d 20 6e 6d 28 41 29 2e 0a 74 72 6e 6d 28 41  := nm(A)..trnm(A
c9b0: 29 20 3a 3a 3d 20 6e 6d 20 44 4f 54 20 6e 6d 28  ) ::= nm DOT nm(
c9c0: 58 29 2e 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20  X). {.  A = X;. 
c9d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
c9e0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
c9f0: 20 20 22 71 75 61 6c 69 66 69 65 64 20 74 61 62    "qualified tab
ca00: 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74  le names are not
ca10: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 49 4e 53 45   allowed on INSE
ca20: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
ca30: 44 45 4c 45 54 45 20 22 0a 20 20 20 20 20 20 20  DELETE ".       
ca40: 20 22 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74   "statements wit
ca50: 68 69 6e 20 74 72 69 67 67 65 72 73 22 29 3b 0a  hin triggers");.
ca60: 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c 6f 77 20 74  }..// Disallow t
ca70: 68 65 20 49 4e 44 45 58 20 42 59 20 61 6e 64 20  he INDEX BY and 
ca80: 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75  NOT INDEXED clau
ca90: 73 65 73 20 6f 6e 20 55 50 44 41 54 45 20 61 6e  ses on UPDATE an
caa0: 64 20 44 45 4c 45 54 45 0a 2f 2f 20 73 74 61 74  d DELETE.// stat
cab0: 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72  ements within tr
cac0: 69 67 67 65 72 73 2e 20 20 57 65 20 6d 61 6b 65  iggers.  We make
cad0: 20 61 20 73 70 65 63 69 66 69 63 20 65 72 72 6f   a specific erro
cae0: 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68  r message for th
caf0: 69 73 0a 2f 2f 20 73 69 6e 63 65 20 69 74 20 69  is.// since it i
cb00: 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  s an exception t
cb10: 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 67 72  o the default gr
cb20: 61 6d 6d 61 72 20 72 75 6c 65 73 2e 0a 2f 2f 0a  ammar rules..//.
cb30: 74 72 69 64 78 62 79 20 3a 3a 3d 20 2e 0a 74 72  tridxby ::= ..tr
cb40: 69 64 78 62 79 20 3a 3a 3d 20 49 4e 44 45 58 45  idxby ::= INDEXE
cb50: 44 20 42 59 20 6e 6d 2e 20 7b 0a 20 20 73 71 6c  D BY nm. {.  sql
cb60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
cb70: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 74 68  rse,.        "th
cb80: 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  e INDEXED BY cla
cb90: 75 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  use is not allow
cba0: 65 64 20 6f 6e 20 55 50 44 41 54 45 20 6f 72 20  ed on UPDATE or 
cbb0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
cbc0: 73 20 22 0a 20 20 20 20 20 20 20 20 22 77 69 74  s ".        "wit
cbd0: 68 69 6e 20 74 72 69 67 67 65 72 73 22 29 3b 0a  hin triggers");.
cbe0: 7d 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20 4e 4f  }.tridxby ::= NO
cbf0: 54 20 49 4e 44 45 58 45 44 2e 20 7b 0a 20 20 73  T INDEXED. {.  s
cc00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
cc10: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
cc20: 74 68 65 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  the NOT INDEXED 
cc30: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 6c  clause is not al
cc40: 6c 6f 77 65 64 20 6f 6e 20 55 50 44 41 54 45 20  lowed on UPDATE 
cc50: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
cc60: 65 6e 74 73 20 22 0a 20 20 20 20 20 20 20 20 22  ents ".        "
cc70: 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 22  within triggers"
cc80: 29 3b 0a 7d 0a 0a 0a 0a 25 74 79 70 65 20 74 72  );.}....%type tr
cc90: 69 67 67 65 72 5f 63 6d 64 20 7b 54 72 69 67 67  igger_cmd {Trigg
cca0: 65 72 53 74 65 70 2a 7d 0a 25 64 65 73 74 72 75  erStep*}.%destru
ccb0: 63 74 6f 72 20 74 72 69 67 67 65 72 5f 63 6d 64  ctor trigger_cmd
ccc0: 20 7b 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54   {sqlite3DeleteT
ccd0: 72 69 67 67 65 72 53 74 65 70 28 70 50 61 72 73  riggerStep(pPars
cce0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 2f 2f 20  e->db, $$);}.// 
ccf0: 55 50 44 41 54 45 20 0a 74 72 69 67 67 65 72 5f  UPDATE .trigger_
cd00: 63 6d 64 28 41 29 20 3a 3a 3d 0a 20 20 20 55 50  cmd(A) ::=.   UP
cd10: 44 41 54 45 28 42 29 20 6f 72 63 6f 6e 66 28 52  DATE(B) orconf(R
cd20: 29 20 74 72 6e 6d 28 58 29 20 74 72 69 64 78 62  ) trnm(X) tridxb
cd30: 79 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29  y SET setlist(Y)
cd40: 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 20 73 63   where_opt(Z) sc
cd50: 61 6e 70 74 28 45 29 2e 20 20 0a 20 20 20 7b 41  anpt(E).  .   {A
cd60: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
cd70: 72 55 70 64 61 74 65 53 74 65 70 28 70 50 61 72  rUpdateStep(pPar
cd80: 73 65 2c 20 26 58 2c 20 59 2c 20 5a 2c 20 52 2c  se, &X, Y, Z, R,
cd90: 20 42 2e 7a 2c 20 45 29 3b 7d 0a 0a 2f 2f 20 49   B.z, E);}..// I
cda0: 4e 53 45 52 54 0a 74 72 69 67 67 65 72 5f 63 6d  NSERT.trigger_cm
cdb0: 64 28 41 29 20 3a 3a 3d 20 73 63 61 6e 70 74 28  d(A) ::= scanpt(
cdc0: 42 29 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29  B) insert_cmd(R)
cdd0: 20 49 4e 54 4f 0a 20 20 20 20 20 20 20 20 20 20   INTO.          
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 6e 6d              trnm
cdf0: 28 58 29 20 69 64 6c 69 73 74 5f 6f 70 74 28 46  (X) idlist_opt(F
ce00: 29 20 73 65 6c 65 63 74 28 53 29 20 75 70 73 65  ) select(S) upse
ce10: 72 74 28 55 29 20 73 63 61 6e 70 74 28 5a 29 2e  rt(U) scanpt(Z).
ce20: 20 7b 0a 20 20 20 41 20 3d 20 73 71 6c 69 74 65   {.   A = sqlite
ce30: 33 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74  3TriggerInsertSt
ce40: 65 70 28 70 50 61 72 73 65 2c 26 58 2c 46 2c 53  ep(pParse,&X,F,S
ce50: 2c 52 2c 55 2c 42 2c 5a 29 3b 2f 2a 41 2d 6f 76  ,R,U,B,Z);/*A-ov
ce60: 65 72 77 72 69 74 65 73 2d 52 2a 2f 0a 7d 0a 2f  erwrites-R*/.}./
ce70: 2f 20 44 45 4c 45 54 45 0a 74 72 69 67 67 65 72  / DELETE.trigger
ce80: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45 4c 45  _cmd(A) ::= DELE
ce90: 54 45 28 42 29 20 46 52 4f 4d 20 74 72 6e 6d 28  TE(B) FROM trnm(
cea0: 58 29 20 74 72 69 64 78 62 79 20 77 68 65 72 65  X) tridxby where
ceb0: 5f 6f 70 74 28 59 29 20 73 63 61 6e 70 74 28 45  _opt(Y) scanpt(E
cec0: 29 2e 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  )..   {A = sqlit
ced0: 65 33 54 72 69 67 67 65 72 44 65 6c 65 74 65 53  e3TriggerDeleteS
cee0: 74 65 70 28 70 50 61 72 73 65 2c 20 26 58 2c 20  tep(pParse, &X, 
cef0: 59 2c 20 42 2e 7a 2c 20 45 29 3b 7d 0a 0a 2f 2f  Y, B.z, E);}..//
cf00: 20 53 45 4c 45 43 54 0a 74 72 69 67 67 65 72 5f   SELECT.trigger_
cf10: 63 6d 64 28 41 29 20 3a 3a 3d 20 73 63 61 6e 70  cmd(A) ::= scanp
cf20: 74 28 42 29 20 73 65 6c 65 63 74 28 58 29 20 73  t(B) select(X) s
cf30: 63 61 6e 70 74 28 45 29 2e 0a 20 20 20 7b 41 20  canpt(E)..   {A 
cf40: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
cf50: 53 65 6c 65 63 74 53 74 65 70 28 70 50 61 72 73  SelectStep(pPars
cf60: 65 2d 3e 64 62 2c 20 58 2c 20 42 2c 20 45 29 3b  e->db, X, B, E);
cf70: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
cf80: 58 2a 2f 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65  X*/}..// The spe
cf90: 63 69 61 6c 20 52 41 49 53 45 20 65 78 70 72 65  cial RAISE expre
cfa0: 73 73 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f  ssion that may o
cfb0: 63 63 75 72 20 69 6e 20 74 72 69 67 67 65 72 20  ccur in trigger 
cfc0: 70 72 6f 67 72 61 6d 73 0a 65 78 70 72 28 41 29  programs.expr(A)
cfd0: 20 3a 3a 3d 20 52 41 49 53 45 20 4c 50 20 49 47   ::= RAISE LP IG
cfe0: 4e 4f 52 45 20 52 50 2e 20 20 7b 0a 20 20 41 20  NORE RP.  {.  A 
cff0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
d000: 50 61 72 73 65 2c 20 54 4b 5f 52 41 49 53 45 2c  Parse, TK_RAISE,
d010: 20 30 2c 20 30 29 3b 20 0a 20 20 69 66 28 20 41   0, 0); .  if( A
d020: 20 29 7b 0a 20 20 20 20 41 2d 3e 61 66 66 69 6e   ){.    A->affin
d030: 69 74 79 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b  ity = OE_Ignore;
d040: 0a 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a  .  }.}.expr(A) :
d050: 3a 3d 20 52 41 49 53 45 20 4c 50 20 72 61 69 73  := RAISE LP rais
d060: 65 74 79 70 65 28 54 29 20 43 4f 4d 4d 41 20 6e  etype(T) COMMA n
d070: 6d 28 5a 29 20 52 50 2e 20 20 7b 0a 20 20 41 20  m(Z) RP.  {.  A 
d080: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
d090: 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
d0a0: 4b 5f 52 41 49 53 45 2c 20 26 5a 2c 20 31 29 3b  K_RAISE, &Z, 1);
d0b0: 20 0a 20 20 69 66 28 20 41 20 29 20 7b 0a 20 20   .  if( A ) {.  
d0c0: 20 20 41 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20    A->affinity = 
d0d0: 28 63 68 61 72 29 54 3b 0a 20 20 7d 0a 7d 0a 25  (char)T;.  }.}.%
d0e0: 65 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f  endif  !SQLITE_O
d0f0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 25 74 79  MIT_TRIGGER..%ty
d100: 70 65 20 72 61 69 73 65 74 79 70 65 20 7b 69 6e  pe raisetype {in
d110: 74 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20  t}.raisetype(A) 
d120: 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b  ::= ROLLBACK.  {
d130: 41 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b  A = OE_Rollback;
d140: 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a  }.raisetype(A) :
d150: 3a 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 7b 41  := ABORT.     {A
d160: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61   = OE_Abort;}.ra
d170: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46  isetype(A) ::= F
d180: 41 49 4c 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f  AIL.      {A = O
d190: 45 5f 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f  E_Fail;}.../////
d1a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d1b0: 2f 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45  ///  DROP TRIGGE
d1c0: 52 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  R statement ////
d1d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d1e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
d1f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
d200: 52 49 47 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44  RIGGER.cmd ::= D
d210: 52 4f 50 20 54 52 49 47 47 45 52 20 69 66 65 78  ROP TRIGGER ifex
d220: 69 73 74 73 28 4e 4f 45 52 52 29 20 66 75 6c 6c  ists(NOERR) full
d230: 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c  name(X). {.  sql
d240: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28  ite3DropTrigger(
d250: 70 50 61 72 73 65 2c 58 2c 4e 4f 45 52 52 29 3b  pParse,X,NOERR);
d260: 0a 7d 0a 25 65 6e 64 69 66 20 20 21 53 51 4c 49  .}.%endif  !SQLI
d270: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
d280: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
d290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 54 54 41 43 48  ///////// ATTACH
d2a0: 20 44 41 54 41 42 41 53 45 20 66 69 6c 65 20 41   DATABASE file A
d2b0: 53 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  S name /////////
d2c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d2d0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
d2e0: 4f 4d 49 54 5f 41 54 54 41 43 48 0a 63 6d 64 20  OMIT_ATTACH.cmd 
d2f0: 3a 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61 62  ::= ATTACH datab
d300: 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28  ase_kw_opt expr(
d310: 46 29 20 41 53 20 65 78 70 72 28 44 29 20 6b 65  F) AS expr(D) ke
d320: 79 5f 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71  y_opt(K). {.  sq
d330: 6c 69 74 65 33 41 74 74 61 63 68 28 70 50 61 72  lite3Attach(pPar
d340: 73 65 2c 20 46 2c 20 44 2c 20 4b 29 3b 0a 7d 0a  se, F, D, K);.}.
d350: 63 6d 64 20 3a 3a 3d 20 44 45 54 41 43 48 20 64  cmd ::= DETACH d
d360: 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 65  atabase_kw_opt e
d370: 78 70 72 28 44 29 2e 20 7b 0a 20 20 73 71 6c 69  xpr(D). {.  sqli
d380: 74 65 33 44 65 74 61 63 68 28 70 50 61 72 73 65  te3Detach(pParse
d390: 2c 20 44 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 6b  , D);.}..%type k
d3a0: 65 79 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25  ey_opt {Expr*}.%
d3b0: 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 5f 6f  destructor key_o
d3c0: 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44  pt {sqlite3ExprD
d3d0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
d3e0: 2c 20 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70 74 28  , $$);}.key_opt(
d3f0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
d410: 20 3d 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28   = 0; }.key_opt(
d420: 41 29 20 3a 3a 3d 20 4b 45 59 20 65 78 70 72 28  A) ::= KEY expr(
d430: 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 20 41  X).          { A
d440: 20 3d 20 58 3b 20 7d 0a 0a 64 61 74 61 62 61 73   = X; }..databas
d450: 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 44 41 54  e_kw_opt ::= DAT
d460: 41 42 41 53 45 2e 0a 64 61 74 61 62 61 73 65 5f  ABASE..database_
d470: 6b 77 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 25 65 6e  kw_opt ::= ..%en
d480: 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  dif SQLITE_OMIT_
d490: 41 54 54 41 43 48 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ATTACH..////////
d4a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d4b0: 2f 2f 20 52 45 49 4e 44 45 58 20 63 6f 6c 6c 61  // REINDEX colla
d4c0: 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  tion ///////////
d4d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d4e0: 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20  ///////.%ifndef 
d4f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
d500: 44 45 58 0a 63 6d 64 20 3a 3a 3d 20 52 45 49 4e  DEX.cmd ::= REIN
d510: 44 45 58 2e 20 20 20 20 20 20 20 20 20 20 20 20  DEX.            
d520: 20 20 20 20 7b 73 71 6c 69 74 65 33 52 65 69 6e      {sqlite3Rein
d530: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
d540: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45 49 4e  );}.cmd ::= REIN
d550: 44 45 58 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59  DEX nm(X) dbnm(Y
d560: 29 2e 20 20 7b 73 71 6c 69 74 65 33 52 65 69 6e  ).  {sqlite3Rein
d570: 64 65 78 28 70 50 61 72 73 65 2c 20 26 58 2c 20  dex(pParse, &X, 
d580: 26 59 29 3b 7d 0a 25 65 6e 64 69 66 20 20 53 51  &Y);}.%endif  SQ
d590: 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
d5a0: 58 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  X../////////////
d5b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d5c0: 2f 2f 2f 2f 2f 2f 20 41 4e 41 4c 59 5a 45 20 2f  ////// ANALYZE /
d5d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d5e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d5f0: 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  //.%ifndef SQLIT
d600: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 63  E_OMIT_ANALYZE.c
d610: 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 2e 20  md ::= ANALYZE. 
d620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
d630: 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70  sqlite3Analyze(p
d640: 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63  Parse, 0, 0);}.c
d650: 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 20 6e  md ::= ANALYZE n
d660: 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b  m(X) dbnm(Y).  {
d670: 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70  sqlite3Analyze(p
d680: 50 61 72 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d  Parse, &X, &Y);}
d690: 0a 25 65 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f 2f  .%endif..///////
d6a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d6b0: 2f 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 61  / ALTER TABLE ta
d6c0: 62 6c 65 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f  ble ... ////////
d6d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d6e0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66  ////////.%ifndef
d6f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
d700: 45 52 54 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20  ERTABLE.cmd ::= 
d710: 41 4c 54 45 52 20 54 41 42 4c 45 20 66 75 6c 6c  ALTER TABLE full
d720: 6e 61 6d 65 28 58 29 20 52 45 4e 41 4d 45 20 54  name(X) RENAME T
d730: 4f 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 73 71 6c  O nm(Z). {.  sql
d740: 69 74 65 33 41 6c 74 65 72 52 65 6e 61 6d 65 54  ite3AlterRenameT
d750: 61 62 6c 65 28 70 50 61 72 73 65 2c 58 2c 26 5a  able(pParse,X,&Z
d760: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4c 54  );.}.cmd ::= ALT
d770: 45 52 20 54 41 42 4c 45 20 61 64 64 5f 63 6f 6c  ER TABLE add_col
d780: 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 0a 20 20 20  umn_fullname.   
d790: 20 20 20 20 20 41 44 44 20 6b 77 63 6f 6c 75 6d       ADD kwcolum
d7a0: 6e 5f 6f 70 74 20 63 6f 6c 75 6d 6e 6e 61 6d 65  n_opt columnname
d7b0: 28 59 29 20 63 61 72 67 6c 69 73 74 2e 20 7b 0a  (Y) carglist. {.
d7c0: 20 20 59 2e 6e 20 3d 20 28 69 6e 74 29 28 70 50    Y.n = (int)(pP
d7d0: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
d7e0: 2e 7a 2d 59 2e 7a 29 20 2b 20 70 50 61 72 73 65  .z-Y.z) + pParse
d7f0: 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a  ->sLastToken.n;.
d800: 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46 69    sqlite3AlterFi
d810: 6e 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28 70 50  nishAddColumn(pP
d820: 61 72 73 65 2c 20 26 59 29 3b 0a 7d 0a 61 64 64  arse, &Y);.}.add
d830: 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65  _column_fullname
d840: 20 3a 3a 3d 20 66 75 6c 6c 6e 61 6d 65 28 58 29   ::= fullname(X)
d850: 2e 20 7b 0a 20 20 64 69 73 61 62 6c 65 4c 6f 6f  . {.  disableLoo
d860: 6b 61 73 69 64 65 28 70 50 61 72 73 65 29 3b 0a  kaside(pParse);.
d870: 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 42 65    sqlite3AlterBe
d880: 67 69 6e 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61  ginAddColumn(pPa
d890: 72 73 65 2c 20 58 29 3b 0a 7d 0a 63 6d 64 20 3a  rse, X);.}.cmd :
d8a0: 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20 66  := ALTER TABLE f
d8b0: 75 6c 6c 6e 61 6d 65 28 58 29 20 52 45 4e 41 4d  ullname(X) RENAM
d8c0: 45 20 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 6e  E kwcolumn_opt n
d8d0: 6d 28 59 29 20 54 4f 20 6e 6d 28 5a 29 2e 20 7b  m(Y) TO nm(Z). {
d8e0: 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 52  .  sqlite3AlterR
d8f0: 65 6e 61 6d 65 43 6f 6c 75 6d 6e 28 70 50 61 72  enameColumn(pPar
d900: 73 65 2c 20 58 2c 20 26 59 2c 20 26 5a 29 3b 0a  se, X, &Y, &Z);.
d910: 7d 0a 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20  }..kwcolumn_opt 
d920: 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f  ::= ..kwcolumn_o
d930: 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57 2e  pt ::= COLUMNKW.
d940: 0a 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  ..%endif  SQLITE
d950: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
d960: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
d970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54  ////////// CREAT
d980: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
d990: 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ... ////////////
d9a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d9b0: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
d9c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d9d0: 4c 45 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74  LE.cmd ::= creat
d9e0: 65 5f 76 74 61 62 2e 20 20 20 20 20 20 20 20 20  e_vtab.         
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
da00: 71 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68  qlite3VtabFinish
da10: 50 61 72 73 65 28 70 50 61 72 73 65 2c 30 29 3b  Parse(pParse,0);
da20: 7d 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65  }.cmd ::= create
da30: 5f 76 74 61 62 20 4c 50 20 76 74 61 62 61 72 67  _vtab LP vtabarg
da40: 6c 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71  list RP(X).  {sq
da50: 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50  lite3VtabFinishP
da60: 61 72 73 65 28 70 50 61 72 73 65 2c 26 58 29 3b  arse(pParse,&X);
da70: 7d 0a 63 72 65 61 74 65 5f 76 74 61 62 20 3a 3a  }.create_vtab ::
da80: 3d 20 63 72 65 61 74 65 6b 77 20 56 49 52 54 55  = createkw VIRTU
da90: 41 4c 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78  AL TABLE ifnotex
daa0: 69 73 74 73 28 45 29 0a 20 20 20 20 20 20 20 20  ists(E).        
dab0: 20 20 20 20 20 20 20 20 6e 6d 28 58 29 20 64 62          nm(X) db
dac0: 6e 6d 28 59 29 20 55 53 49 4e 47 20 6e 6d 28 5a  nm(Y) USING nm(Z
dad0: 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ). {.    sqlite3
dae0: 56 74 61 62 42 65 67 69 6e 50 61 72 73 65 28 70  VtabBeginParse(p
daf0: 50 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26  Parse, &X, &Y, &
db00: 5a 2c 20 45 29 3b 0a 7d 0a 76 74 61 62 61 72 67  Z, E);.}.vtabarg
db10: 6c 69 73 74 20 3a 3a 3d 20 76 74 61 62 61 72 67  list ::= vtabarg
db20: 2e 0a 76 74 61 62 61 72 67 6c 69 73 74 20 3a 3a  ..vtabarglist ::
db30: 3d 20 76 74 61 62 61 72 67 6c 69 73 74 20 43 4f  = vtabarglist CO
db40: 4d 4d 41 20 76 74 61 62 61 72 67 2e 0a 76 74 61  MMA vtabarg..vta
db50: 62 61 72 67 20 3a 3a 3d 20 2e 20 20 20 20 20 20  barg ::= .      
db60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db70: 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67   {sqlite3VtabArg
db80: 49 6e 69 74 28 70 50 61 72 73 65 29 3b 7d 0a 76  Init(pParse);}.v
db90: 74 61 62 61 72 67 20 3a 3a 3d 20 76 74 61 62 61  tabarg ::= vtaba
dba0: 72 67 20 76 74 61 62 61 72 67 74 6f 6b 65 6e 2e  rg vtabargtoken.
dbb0: 0a 76 74 61 62 61 72 67 74 6f 6b 65 6e 20 3a 3a  .vtabargtoken ::
dbc0: 3d 20 41 4e 59 28 58 29 2e 20 20 20 20 20 20 20  = ANY(X).       
dbd0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61       {sqlite3Vta
dbe0: 62 41 72 67 45 78 74 65 6e 64 28 70 50 61 72 73  bArgExtend(pPars
dbf0: 65 2c 26 58 29 3b 7d 0a 76 74 61 62 61 72 67 74  e,&X);}.vtabargt
dc00: 6f 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c  oken ::= lp anyl
dc10: 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c  ist RP(X).  {sql
dc20: 69 74 65 33 56 74 61 62 41 72 67 45 78 74 65 6e  ite3VtabArgExten
dc30: 64 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 6c  d(pParse,&X);}.l
dc40: 70 20 3a 3a 3d 20 4c 50 28 58 29 2e 20 20 20 20  p ::= LP(X).    
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc60: 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41     {sqlite3VtabA
dc70: 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c  rgExtend(pParse,
dc80: 26 58 29 3b 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a  &X);}.anylist ::
dc90: 3d 20 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20  = ..anylist ::= 
dca0: 61 6e 79 6c 69 73 74 20 4c 50 20 61 6e 79 6c 69  anylist LP anyli
dcb0: 73 74 20 52 50 2e 0a 61 6e 79 6c 69 73 74 20 3a  st RP..anylist :
dcc0: 3a 3d 20 61 6e 79 6c 69 73 74 20 41 4e 59 2e 0a  := anylist ANY..
dcd0: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
dce0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
dcf0: 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .../////////////
dd00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 4f 4d 4d  /////////// COMM
dd10: 4f 4e 20 54 41 42 4c 45 20 45 58 50 52 45 53 53  ON TABLE EXPRESS
dd20: 49 4f 4e 53 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  IONS ///////////
dd30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dd40: 2f 0a 25 74 79 70 65 20 77 71 6c 69 73 74 20 7b  /.%type wqlist {
dd50: 57 69 74 68 2a 7d 0a 25 64 65 73 74 72 75 63 74  With*}.%destruct
dd60: 6f 72 20 77 71 6c 69 73 74 20 7b 73 71 6c 69 74  or wqlist {sqlit
dd70: 65 33 57 69 74 68 44 65 6c 65 74 65 28 70 50 61  e3WithDelete(pPa
dd80: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a  rse->db, $$);}..
dd90: 77 69 74 68 20 3a 3a 3d 20 2e 0a 25 69 66 6e 64  with ::= ..%ifnd
dda0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
ddb0: 54 45 0a 77 69 74 68 20 3a 3a 3d 20 57 49 54 48  TE.with ::= WITH
ddc0: 20 77 71 6c 69 73 74 28 57 29 2e 20 20 20 20 20   wqlist(W).     
ddd0: 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c 69 74           { sqlit
dde0: 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
ddf0: 65 2c 20 57 2c 20 31 29 3b 20 7d 0a 77 69 74 68  e, W, 1); }.with
de00: 20 3a 3a 3d 20 57 49 54 48 20 52 45 43 55 52 53   ::= WITH RECURS
de10: 49 56 45 20 77 71 6c 69 73 74 28 57 29 2e 20 20  IVE wqlist(W).  
de20: 20 20 7b 20 73 71 6c 69 74 65 33 57 69 74 68 50    { sqlite3WithP
de30: 75 73 68 28 70 50 61 72 73 65 2c 20 57 2c 20 31  ush(pParse, W, 1
de40: 29 3b 20 7d 0a 0a 77 71 6c 69 73 74 28 41 29 20  ); }..wqlist(A) 
de50: 3a 3a 3d 20 6e 6d 28 58 29 20 65 69 64 6c 69 73  ::= nm(X) eidlis
de60: 74 5f 6f 70 74 28 59 29 20 41 53 20 4c 50 20 73  t_opt(Y) AS LP s
de70: 65 6c 65 63 74 28 5a 29 20 52 50 2e 20 7b 0a 20  elect(Z) RP. {. 
de80: 20 41 20 3d 20 73 71 6c 69 74 65 33 57 69 74 68   A = sqlite3With
de90: 41 64 64 28 70 50 61 72 73 65 2c 20 30 2c 20 26  Add(pParse, 0, &
dea0: 58 2c 20 59 2c 20 5a 29 3b 20 2f 2a 41 2d 6f 76  X, Y, Z); /*A-ov
deb0: 65 72 77 72 69 74 65 73 2d 58 2a 2f 0a 7d 0a 77  erwrites-X*/.}.w
dec0: 71 6c 69 73 74 28 41 29 20 3a 3a 3d 20 77 71 6c  qlist(A) ::= wql
ded0: 69 73 74 28 41 29 20 43 4f 4d 4d 41 20 6e 6d 28  ist(A) COMMA nm(
dee0: 58 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28 59  X) eidlist_opt(Y
def0: 29 20 41 53 20 4c 50 20 73 65 6c 65 63 74 28 5a  ) AS LP select(Z
df00: 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73 71  ) RP. {.  A = sq
df10: 6c 69 74 65 33 57 69 74 68 41 64 64 28 70 50 61  lite3WithAdd(pPa
df20: 72 73 65 2c 20 41 2c 20 26 58 2c 20 59 2c 20 5a  rse, A, &X, Y, Z
df30: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  );.}.%endif  SQL
df40: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 0a 2f 2f  ITE_OMIT_CTE..//
df50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
df60: 2f 2f 2f 2f 2f 2f 20 57 49 4e 44 4f 57 20 46 55  ////// WINDOW FU
df70: 4e 43 54 49 4f 4e 20 45 58 50 52 45 53 53 49 4f  NCTION EXPRESSIO
df80: 4e 53 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  NS /////////////
df90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 20  ////////////.// 
dfa0: 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 61 74  These must be at
dfb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
dfc0: 20 66 69 6c 65 2e 20 53 70 65 63 69 66 69 63 61   file. Specifica
dfd0: 6c 6c 79 2c 20 74 68 65 20 72 75 6c 65 73 20 74  lly, the rules t
dfe0: 68 61 74 0a 2f 2f 20 69 6e 74 72 6f 64 75 63 65  hat.// introduce
dff0: 20 74 6f 6b 65 6e 73 20 57 49 4e 44 4f 57 2c 20   tokens WINDOW, 
e000: 4f 56 45 52 20 61 6e 64 20 46 49 4c 54 45 52 20  OVER and FILTER 
e010: 6d 75 73 74 20 61 70 70 65 61 72 20 6c 61 73 74  must appear last
e020: 2e 20 54 68 69 73 20 63 61 75 73 65 73 20 0a 2f  . This causes ./
e030: 2f 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61  / the integer va
e040: 6c 75 65 73 20 61 73 73 69 67 6e 65 64 20 74 6f  lues assigned to
e050: 20 74 68 65 73 65 20 74 6f 6b 65 6e 73 20 74 6f   these tokens to
e060: 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
e070: 61 6c 6c 20 6f 74 68 65 72 20 0a 2f 2f 20 74 6f  all other .// to
e080: 6b 65 6e 73 20 74 68 61 74 20 6d 61 79 20 62 65  kens that may be
e090: 20 6f 75 74 70 75 74 20 62 79 20 74 68 65 20 74   output by the t
e0a0: 6f 6b 65 6e 69 7a 65 72 20 65 78 63 65 70 74 20  okenizer except 
e0b0: 54 4b 5f 53 50 41 43 45 20 61 6e 64 20 54 4b 5f  TK_SPACE and TK_
e0c0: 49 4c 4c 45 47 41 4c 2e 0a 2f 2f 0a 25 69 66 6e  ILLEGAL..//.%ifn
e0d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e0e0: 57 49 4e 44 4f 57 46 55 4e 43 0a 25 74 79 70 65  WINDOWFUNC.%type
e0f0: 20 77 69 6e 64 6f 77 64 65 66 6e 5f 6c 69 73 74   windowdefn_list
e100: 20 7b 57 69 6e 64 6f 77 2a 7d 0a 25 64 65 73 74   {Window*}.%dest
e110: 72 75 63 74 6f 72 20 77 69 6e 64 6f 77 64 65 66  ructor windowdef
e120: 6e 5f 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 57  n_list {sqlite3W
e130: 69 6e 64 6f 77 4c 69 73 74 44 65 6c 65 74 65 28  indowListDelete(
e140: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
e150: 7d 0a 77 69 6e 64 6f 77 64 65 66 6e 5f 6c 69 73  }.windowdefn_lis
e160: 74 28 41 29 20 3a 3a 3d 20 77 69 6e 64 6f 77 64  t(A) ::= windowd
e170: 65 66 6e 28 5a 29 2e 20 7b 20 41 20 3d 20 5a 3b  efn(Z). { A = Z;
e180: 20 7d 0a 77 69 6e 64 6f 77 64 65 66 6e 5f 6c 69   }.windowdefn_li
e190: 73 74 28 41 29 20 3a 3a 3d 20 77 69 6e 64 6f 77  st(A) ::= window
e1a0: 64 65 66 6e 5f 6c 69 73 74 28 59 29 20 43 4f 4d  defn_list(Y) COM
e1b0: 4d 41 20 77 69 6e 64 6f 77 64 65 66 6e 28 5a 29  MA windowdefn(Z)
e1c0: 2e 20 7b 0a 20 20 61 73 73 65 72 74 28 20 5a 21  . {.  assert( Z!
e1d0: 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 57  =0 );.  sqlite3W
e1e0: 69 6e 64 6f 77 43 68 61 69 6e 28 70 50 61 72 73  indowChain(pPars
e1f0: 65 2c 20 5a 2c 20 59 29 3b 0a 20 20 5a 2d 3e 70  e, Z, Y);.  Z->p
e200: 4e 65 78 74 57 69 6e 20 3d 20 59 3b 0a 20 20 41  NextWin = Y;.  A
e210: 20 3d 20 5a 3b 0a 7d 0a 0a 25 74 79 70 65 20 77   = Z;.}..%type w
e220: 69 6e 64 6f 77 64 65 66 6e 20 7b 57 69 6e 64 6f  indowdefn {Windo
e230: 77 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  w*}.%destructor 
e240: 77 69 6e 64 6f 77 64 65 66 6e 20 7b 73 71 6c 69  windowdefn {sqli
e250: 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28  te3WindowDelete(
e260: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
e270: 7d 0a 77 69 6e 64 6f 77 64 65 66 6e 28 41 29 20  }.windowdefn(A) 
e280: 3a 3a 3d 20 6e 6d 28 58 29 20 41 53 20 4c 50 20  ::= nm(X) AS LP 
e290: 77 69 6e 64 6f 77 28 59 29 20 52 50 2e 20 7b 0a  window(Y) RP. {.
e2a0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 59 29 20    if( ALWAYS(Y) 
e2b0: 29 7b 0a 20 20 20 20 59 2d 3e 7a 4e 61 6d 65 20  ){.    Y->zName 
e2c0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
e2d0: 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 58  up(pParse->db, X
e2e0: 2e 7a 2c 20 58 2e 6e 29 3b 0a 20 20 7d 0a 20 20  .z, X.n);.  }.  
e2f0: 41 20 3d 20 59 3b 0a 7d 0a 0a 25 74 79 70 65 20  A = Y;.}..%type 
e300: 77 69 6e 64 6f 77 20 7b 57 69 6e 64 6f 77 2a 7d  window {Window*}
e310: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77 69 6e  .%destructor win
e320: 64 6f 77 20 7b 73 71 6c 69 74 65 33 57 69 6e 64  dow {sqlite3Wind
e330: 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  owDelete(pParse-
e340: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 74 79 70  >db, $$);}..%typ
e350: 65 20 66 72 61 6d 65 5f 6f 70 74 20 7b 57 69 6e  e frame_opt {Win
e360: 64 6f 77 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  dow*}.%destructo
e370: 72 20 66 72 61 6d 65 5f 6f 70 74 20 7b 73 71 6c  r frame_opt {sql
e380: 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65 74 65  ite3WindowDelete
e390: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
e3a0: 3b 7d 0a 0a 25 74 79 70 65 20 70 61 72 74 5f 6f  ;}..%type part_o
e3b0: 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  pt {ExprList*}.%
e3c0: 64 65 73 74 72 75 63 74 6f 72 20 70 61 72 74 5f  destructor part_
e3d0: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
e3e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
e3f0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 74  e->db, $$);}..%t
e400: 79 70 65 20 66 69 6c 74 65 72 5f 6f 70 74 20 7b  ype filter_opt {
e410: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
e420: 6f 72 20 66 69 6c 74 65 72 5f 6f 70 74 20 7b 73  or filter_opt {s
e430: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
e440: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
e450: 3b 7d 0a 0a 25 74 79 70 65 20 72 61 6e 67 65 5f  ;}..%type range_
e460: 6f 72 5f 72 6f 77 73 20 7b 69 6e 74 7d 0a 0a 25  or_rows {int}..%
e470: 74 79 70 65 20 66 72 61 6d 65 5f 62 6f 75 6e 64  type frame_bound
e480: 20 7b 73 74 72 75 63 74 20 46 72 61 6d 65 42 6f   {struct FrameBo
e490: 75 6e 64 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  und}.%destructor
e4a0: 20 66 72 61 6d 65 5f 62 6f 75 6e 64 20 7b 73 71   frame_bound {sq
e4b0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
e4c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e 70  pParse->db, $$.p
e4d0: 45 78 70 72 29 3b 7d 0a 25 74 79 70 65 20 66 72  Expr);}.%type fr
e4e0: 61 6d 65 5f 62 6f 75 6e 64 5f 73 20 7b 73 74 72  ame_bound_s {str
e4f0: 75 63 74 20 46 72 61 6d 65 42 6f 75 6e 64 7d 0a  uct FrameBound}.
e500: 25 64 65 73 74 72 75 63 74 6f 72 20 66 72 61 6d  %destructor fram
e510: 65 5f 62 6f 75 6e 64 5f 73 20 7b 73 71 6c 69 74  e_bound_s {sqlit
e520: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
e530: 72 73 65 2d 3e 64 62 2c 20 24 24 2e 70 45 78 70  rse->db, $$.pExp
e540: 72 29 3b 7d 0a 25 74 79 70 65 20 66 72 61 6d 65  r);}.%type frame
e550: 5f 62 6f 75 6e 64 5f 65 20 7b 73 74 72 75 63 74  _bound_e {struct
e560: 20 46 72 61 6d 65 42 6f 75 6e 64 7d 0a 25 64 65   FrameBound}.%de
e570: 73 74 72 75 63 74 6f 72 20 66 72 61 6d 65 5f 62  structor frame_b
e580: 6f 75 6e 64 5f 65 20 7b 73 71 6c 69 74 65 33 45  ound_e {sqlite3E
e590: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
e5a0: 2d 3e 64 62 2c 20 24 24 2e 70 45 78 70 72 29 3b  ->db, $$.pExpr);
e5b0: 7d 0a 0a 77 69 6e 64 6f 77 28 41 29 20 3a 3a 3d  }..window(A) ::=
e5c0: 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 6e 65   PARTITION BY ne
e5d0: 78 70 72 6c 69 73 74 28 58 29 20 6f 72 64 65 72  xprlist(X) order
e5e0: 62 79 5f 6f 70 74 28 59 29 20 66 72 61 6d 65 5f  by_opt(Y) frame_
e5f0: 6f 70 74 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20  opt(Z). {.  A = 
e600: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 73 73  sqlite3WindowAss
e610: 65 6d 62 6c 65 28 70 50 61 72 73 65 2c 20 5a 2c  emble(pParse, Z,
e620: 20 58 2c 20 59 2c 20 30 29 3b 0a 7d 0a 77 69 6e   X, Y, 0);.}.win
e630: 64 6f 77 28 41 29 20 3a 3a 3d 20 6e 6d 28 57 29  dow(A) ::= nm(W)
e640: 20 50 41 52 54 49 54 49 4f 4e 20 42 59 20 6e 65   PARTITION BY ne
e650: 78 70 72 6c 69 73 74 28 58 29 20 6f 72 64 65 72  xprlist(X) order
e660: 62 79 5f 6f 70 74 28 59 29 20 66 72 61 6d 65 5f  by_opt(Y) frame_
e670: 6f 70 74 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20  opt(Z). {.  A = 
e680: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 73 73  sqlite3WindowAss
e690: 65 6d 62 6c 65 28 70 50 61 72 73 65 2c 20 5a 2c  emble(pParse, Z,
e6a0: 20 58 2c 20 59 2c 20 26 57 29 3b 0a 7d 0a 77 69   X, Y, &W);.}.wi
e6b0: 6e 64 6f 77 28 41 29 20 3a 3a 3d 20 4f 52 44 45  ndow(A) ::= ORDE
e6c0: 52 20 42 59 20 73 6f 72 74 6c 69 73 74 28 59 29  R BY sortlist(Y)
e6d0: 20 66 72 61 6d 65 5f 6f 70 74 28 5a 29 2e 20 7b   frame_opt(Z). {
e6e0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 57 69  .  A = sqlite3Wi
e6f0: 6e 64 6f 77 41 73 73 65 6d 62 6c 65 28 70 50 61  ndowAssemble(pPa
e700: 72 73 65 2c 20 5a 2c 20 30 2c 20 59 2c 20 30 29  rse, Z, 0, Y, 0)
e710: 3b 0a 7d 0a 77 69 6e 64 6f 77 28 41 29 20 3a 3a  ;.}.window(A) ::
e720: 3d 20 6e 6d 28 57 29 20 4f 52 44 45 52 20 42 59  = nm(W) ORDER BY
e730: 20 73 6f 72 74 6c 69 73 74 28 59 29 20 66 72 61   sortlist(Y) fra
e740: 6d 65 5f 6f 70 74 28 5a 29 2e 20 7b 0a 20 20 41  me_opt(Z). {.  A
e750: 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77   = sqlite3Window
e760: 41 73 73 65 6d 62 6c 65 28 70 50 61 72 73 65 2c  Assemble(pParse,
e770: 20 5a 2c 20 30 2c 20 59 2c 20 26 57 29 3b 0a 7d   Z, 0, Y, &W);.}
e780: 0a 77 69 6e 64 6f 77 28 41 29 20 3a 3a 3d 20 66  .window(A) ::= f
e790: 72 61 6d 65 5f 6f 70 74 28 5a 29 2e 20 7b 0a 20  rame_opt(Z). {. 
e7a0: 20 41 20 3d 20 5a 3b 0a 7d 0a 77 69 6e 64 6f 77   A = Z;.}.window
e7b0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 57 29 20 66 72  (A) ::= nm(W) fr
e7c0: 61 6d 65 5f 6f 70 74 28 5a 29 2e 20 7b 0a 20 20  ame_opt(Z). {.  
e7d0: 41 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  A = sqlite3Windo
e7e0: 77 41 73 73 65 6d 62 6c 65 28 70 50 61 72 73 65  wAssemble(pParse
e7f0: 2c 20 5a 2c 20 30 2c 20 30 2c 20 26 57 29 3b 0a  , Z, 0, 0, &W);.
e800: 7d 0a 0a 66 72 61 6d 65 5f 6f 70 74 28 41 29 20  }..frame_opt(A) 
e810: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 7b 20 0a 20 20 41 20 3d 20 73 71 6c 69 74    { .  A = sqlit
e840: 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 70 50  e3WindowAlloc(pP
e850: 61 72 73 65 2c 20 30 2c 20 54 4b 5f 55 4e 42 4f  arse, 0, TK_UNBO
e860: 55 4e 44 45 44 2c 20 30 2c 20 54 4b 5f 43 55 52  UNDED, 0, TK_CUR
e870: 52 45 4e 54 2c 20 30 2c 20 30 29 3b 0a 7d 0a 66  RENT, 0, 0);.}.f
e880: 72 61 6d 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  rame_opt(A) ::= 
e890: 72 61 6e 67 65 5f 6f 72 5f 72 6f 77 73 28 58 29  range_or_rows(X)
e8a0: 20 66 72 61 6d 65 5f 62 6f 75 6e 64 5f 73 28 59   frame_bound_s(Y
e8b0: 29 20 66 72 61 6d 65 5f 65 78 63 6c 75 64 65 5f  ) frame_exclude_
e8c0: 6f 70 74 28 5a 29 2e 20 7b 20 0a 20 20 41 20 3d  opt(Z). { .  A =
e8d0: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c   sqlite3WindowAl
e8e0: 6c 6f 63 28 70 50 61 72 73 65 2c 20 58 2c 20 59  loc(pParse, X, Y
e8f0: 2e 65 54 79 70 65 2c 20 59 2e 70 45 78 70 72 2c  .eType, Y.pExpr,
e900: 20 54 4b 5f 43 55 52 52 45 4e 54 2c 20 30 2c 20   TK_CURRENT, 0, 
e910: 5a 29 3b 0a 7d 0a 66 72 61 6d 65 5f 6f 70 74 28  Z);.}.frame_opt(
e920: 41 29 20 3a 3a 3d 20 72 61 6e 67 65 5f 6f 72 5f  A) ::= range_or_
e930: 72 6f 77 73 28 58 29 20 42 45 54 57 45 45 4e 20  rows(X) BETWEEN 
e940: 66 72 61 6d 65 5f 62 6f 75 6e 64 5f 73 28 59 29  frame_bound_s(Y)
e950: 20 41 4e 44 0a 20 20 20 20 20 20 20 20 20 20 20   AND.           
e960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
e970: 72 61 6d 65 5f 62 6f 75 6e 64 5f 65 28 5a 29 20  rame_bound_e(Z) 
e980: 66 72 61 6d 65 5f 65 78 63 6c 75 64 65 5f 6f 70  frame_exclude_op
e990: 74 28 57 29 2e 20 7b 20 0a 20 20 41 20 3d 20 73  t(W). { .  A = s
e9a0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c 6c 6f  qlite3WindowAllo
e9b0: 63 28 70 50 61 72 73 65 2c 20 58 2c 20 59 2e 65  c(pParse, X, Y.e
e9c0: 54 79 70 65 2c 20 59 2e 70 45 78 70 72 2c 20 5a  Type, Y.pExpr, Z
e9d0: 2e 65 54 79 70 65 2c 20 5a 2e 70 45 78 70 72 2c  .eType, Z.pExpr,
e9e0: 20 57 29 3b 0a 7d 0a 0a 72 61 6e 67 65 5f 6f 72   W);.}..range_or
e9f0: 5f 72 6f 77 73 28 41 29 20 3a 3a 3d 20 52 41 4e  _rows(A) ::= RAN
ea00: 47 45 7c 52 4f 57 53 7c 47 52 4f 55 50 53 28 58  GE|ROWS|GROUPS(X
ea10: 29 2e 20 20 20 7b 41 20 3d 20 40 58 3b 20 2f 2a  ).   {A = @X; /*
ea20: 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f  A-overwrites-X*/
ea30: 7d 0a 0a 66 72 61 6d 65 5f 62 6f 75 6e 64 5f 73  }..frame_bound_s
ea40: 28 41 29 20 3a 3a 3d 20 66 72 61 6d 65 5f 62 6f  (A) ::= frame_bo
ea50: 75 6e 64 28 58 29 2e 20 20 20 20 20 20 20 20 20  und(X).         
ea60: 7b 41 20 3d 20 58 3b 7d 0a 66 72 61 6d 65 5f 62  {A = X;}.frame_b
ea70: 6f 75 6e 64 5f 73 28 41 29 20 3a 3a 3d 20 55 4e  ound_s(A) ::= UN
ea80: 42 4f 55 4e 44 45 44 28 58 29 20 50 52 45 43 45  BOUNDED(X) PRECE
ea90: 44 49 4e 47 2e 20 7b 41 2e 65 54 79 70 65 20 3d  DING. {A.eType =
eaa0: 20 40 58 3b 20 41 2e 70 45 78 70 72 20 3d 20 30   @X; A.pExpr = 0
eab0: 3b 7d 0a 66 72 61 6d 65 5f 62 6f 75 6e 64 5f 65  ;}.frame_bound_e
eac0: 28 41 29 20 3a 3a 3d 20 66 72 61 6d 65 5f 62 6f  (A) ::= frame_bo
ead0: 75 6e 64 28 58 29 2e 20 20 20 20 20 20 20 20 20  und(X).         
eae0: 7b 41 20 3d 20 58 3b 7d 0a 66 72 61 6d 65 5f 62  {A = X;}.frame_b
eaf0: 6f 75 6e 64 5f 65 28 41 29 20 3a 3a 3d 20 55 4e  ound_e(A) ::= UN
eb00: 42 4f 55 4e 44 45 44 28 58 29 20 46 4f 4c 4c 4f  BOUNDED(X) FOLLO
eb10: 57 49 4e 47 2e 20 7b 41 2e 65 54 79 70 65 20 3d  WING. {A.eType =
eb20: 20 40 58 3b 20 41 2e 70 45 78 70 72 20 3d 20 30   @X; A.pExpr = 0
eb30: 3b 7d 0a 0a 66 72 61 6d 65 5f 62 6f 75 6e 64 28  ;}..frame_bound(
eb40: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 50  A) ::= expr(X) P
eb50: 52 45 43 45 44 49 4e 47 7c 46 4f 4c 4c 4f 57 49  RECEDING|FOLLOWI
eb60: 4e 47 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20  NG(Y)..         
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 20 20 7b 41 2e 65 54 79 70 65 20 3d 20 40      {A.eType = @
eba0: 59 3b 20 41 2e 70 45 78 70 72 20 3d 20 58 3b 7d  Y; A.pExpr = X;}
ebb0: 0a 66 72 61 6d 65 5f 62 6f 75 6e 64 28 41 29 20  .frame_bound(A) 
ebc0: 3a 3a 3d 20 43 55 52 52 45 4e 54 28 58 29 20 52  ::= CURRENT(X) R
ebd0: 4f 57 2e 20 20 20 20 20 20 20 20 20 20 20 7b 41  OW.           {A
ebe0: 2e 65 54 79 70 65 20 3d 20 40 58 3b 20 41 2e 70  .eType = @X; A.p
ebf0: 45 78 70 72 20 3d 20 30 3b 7d 0a 0a 25 74 79 70  Expr = 0;}..%typ
ec00: 65 20 66 72 61 6d 65 5f 65 78 63 6c 75 64 65 5f  e frame_exclude_
ec10: 6f 70 74 20 7b 75 38 7d 0a 66 72 61 6d 65 5f 65  opt {u8}.frame_e
ec20: 78 63 6c 75 64 65 5f 6f 70 74 28 41 29 20 3a 3a  xclude_opt(A) ::
ec30: 3d 20 2e 20 7b 41 20 3d 20 30 3b 7d 0a 66 72 61  = . {A = 0;}.fra
ec40: 6d 65 5f 65 78 63 6c 75 64 65 5f 6f 70 74 28 41  me_exclude_opt(A
ec50: 29 20 3a 3a 3d 20 45 58 43 4c 55 44 45 20 66 72  ) ::= EXCLUDE fr
ec60: 61 6d 65 5f 65 78 63 6c 75 64 65 28 58 29 2e 20  ame_exclude(X). 
ec70: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
ec80: 66 72 61 6d 65 5f 65 78 63 6c 75 64 65 20 7b 75  frame_exclude {u
ec90: 38 7d 0a 66 72 61 6d 65 5f 65 78 63 6c 75 64 65  8}.frame_exclude
eca0: 28 41 29 20 3a 3a 3d 20 4e 4f 28 58 29 20 4f 54  (A) ::= NO(X) OT
ecb0: 48 45 52 53 2e 20 20 20 7b 41 20 3d 20 40 58 3b  HERS.   {A = @X;
ecc0: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
ecd0: 58 2a 2f 7d 0a 66 72 61 6d 65 5f 65 78 63 6c 75  X*/}.frame_exclu
ece0: 64 65 28 41 29 20 3a 3a 3d 20 43 55 52 52 45 4e  de(A) ::= CURREN
ecf0: 54 28 58 29 20 52 4f 57 2e 20 7b 41 20 3d 20 40  T(X) ROW. {A = @
ed00: 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  X; /*A-overwrite
ed10: 73 2d 58 2a 2f 7d 0a 66 72 61 6d 65 5f 65 78 63  s-X*/}.frame_exc
ed20: 6c 75 64 65 28 41 29 20 3a 3a 3d 20 47 52 4f 55  lude(A) ::= GROU
ed30: 50 7c 54 49 45 53 28 58 29 2e 20 20 7b 41 20 3d  P|TIES(X).  {A =
ed40: 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69   @X; /*A-overwri
ed50: 74 65 73 2d 58 2a 2f 7d 0a 0a 0a 25 74 79 70 65  tes-X*/}...%type
ed60: 20 77 69 6e 64 6f 77 5f 63 6c 61 75 73 65 20 7b   window_clause {
ed70: 57 69 6e 64 6f 77 2a 7d 0a 25 64 65 73 74 72 75  Window*}.%destru
ed80: 63 74 6f 72 20 77 69 6e 64 6f 77 5f 63 6c 61 75  ctor window_clau
ed90: 73 65 20 7b 73 71 6c 69 74 65 33 57 69 6e 64 6f  se {sqlite3Windo
eda0: 77 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  wListDelete(pPar
edb0: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 77 69  se->db, $$);}.wi
edc0: 6e 64 6f 77 5f 63 6c 61 75 73 65 28 41 29 20 3a  ndow_clause(A) :
edd0: 3a 3d 20 57 49 4e 44 4f 57 20 77 69 6e 64 6f 77  := WINDOW window
ede0: 64 65 66 6e 5f 6c 69 73 74 28 42 29 2e 20 7b 20  defn_list(B). { 
edf0: 41 20 3d 20 42 3b 20 7d 0a 0a 25 74 79 70 65 20  A = B; }..%type 
ee00: 6f 76 65 72 5f 63 6c 61 75 73 65 20 7b 57 69 6e  over_clause {Win
ee10: 64 6f 77 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  dow*}.%destructo
ee20: 72 20 6f 76 65 72 5f 63 6c 61 75 73 65 20 7b 73  r over_clause {s
ee30: 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65 6c 65  qlite3WindowDele
ee40: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
ee50: 24 29 3b 7d 0a 6f 76 65 72 5f 63 6c 61 75 73 65  $);}.over_clause
ee60: 28 41 29 20 3a 3a 3d 20 66 69 6c 74 65 72 5f 6f  (A) ::= filter_o
ee70: 70 74 28 57 29 20 4f 56 45 52 20 4c 50 20 77 69  pt(W) OVER LP wi
ee80: 6e 64 6f 77 28 5a 29 20 52 50 2e 20 7b 0a 20 20  ndow(Z) RP. {.  
ee90: 41 20 3d 20 5a 3b 0a 20 20 61 73 73 65 72 74 28  A = Z;.  assert(
eea0: 20 41 21 3d 30 20 29 3b 0a 20 20 41 2d 3e 70 46   A!=0 );.  A->pF
eeb0: 69 6c 74 65 72 20 3d 20 57 3b 0a 7d 0a 6f 76 65  ilter = W;.}.ove
eec0: 72 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20  r_clause(A) ::= 
eed0: 66 69 6c 74 65 72 5f 6f 70 74 28 57 29 20 4f 56  filter_opt(W) OV
eee0: 45 52 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 41 20  ER nm(Z). {.  A 
eef0: 3d 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74  = (Window*)sqlit
ef00: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  e3DbMallocZero(p
ef10: 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f  Parse->db, sizeo
ef20: 66 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66  f(Window));.  if
ef30: 28 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e 7a 4e  ( A ){.    A->zN
ef40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
ef50: 74 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64  trNDup(pParse->d
ef60: 62 2c 20 5a 2e 7a 2c 20 5a 2e 6e 29 3b 0a 20 20  b, Z.z, Z.n);.  
ef70: 20 20 41 2d 3e 70 46 69 6c 74 65 72 20 3d 20 57    A->pFilter = W
ef80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
ef90: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
efa0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 57 29 3b  (pParse->db, W);
efb0: 0a 20 20 7d 0a 7d 0a 0a 66 69 6c 74 65 72 5f 6f  .  }.}..filter_o
efc0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 30 3b 20         { A = 0; 
eff0: 7d 0a 66 69 6c 74 65 72 5f 6f 70 74 28 41 29 20  }.filter_opt(A) 
f000: 3a 3a 3d 20 46 49 4c 54 45 52 20 4c 50 20 57 48  ::= FILTER LP WH
f010: 45 52 45 20 65 78 70 72 28 58 29 20 52 50 2e 20  ERE expr(X) RP. 
f020: 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 25 65 6e 64   { A = X; }.%end
f030: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
f040: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a  T_WINDOWFUNC */.
f050: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
f060: 67 65 6e 65 72 61 74 6f 72 20 6e 65 65 64 73 20  generator needs 
f070: 73 6f 6d 65 20 65 78 74 72 61 20 54 4b 5f 20 74  some extra TK_ t
f080: 6f 6b 65 6e 20 76 61 6c 75 65 73 20 66 6f 72 20  oken values for 
f090: 74 6f 6b 65 6e 73 20 74 68 61 74 0a 2a 2a 20 61  tokens that.** a
f0a0: 72 65 20 73 79 6e 74 68 65 73 69 7a 65 64 20 61  re synthesized a
f0b0: 6e 64 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  nd do not actual
f0c0: 6c 79 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ly appear in the
f0d0: 20 67 72 61 6d 6d 61 72 3a 0a 2a 2f 0a 25 74 6f   grammar:.*/.%to
f0e0: 6b 65 6e 0a 20 20 54 52 55 45 46 41 4c 53 45 20  ken.  TRUEFALSE 
f0f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 6f 72        /* True or
f100: 20 66 61 6c 73 65 20 6b 65 79 77 6f 72 64 20 2a   false keyword *
f110: 2f 0a 20 20 49 53 4e 4f 54 20 20 20 20 20 20 20  /.  ISNOT       
f120: 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 61 74 69      /* Combinati
f130: 6f 6e 20 6f 66 20 49 53 20 61 6e 64 20 4e 4f 54  on of IS and NOT
f140: 20 2a 2f 0a 20 20 46 55 4e 43 54 49 4f 4e 20 20   */.  FUNCTION  
f150: 20 20 20 20 20 20 2f 2a 20 41 20 66 75 6e 63 74        /* A funct
f160: 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a  ion invocation *
f170: 2f 0a 20 20 43 4f 4c 55 4d 4e 20 20 20 20 20 20  /.  COLUMN      
f180: 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63 65      /* Reference
f190: 20 74 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75   to a table colu
f1a0: 6d 6e 20 2a 2f 0a 20 20 41 47 47 5f 46 55 4e 43  mn */.  AGG_FUNC
f1b0: 54 49 4f 4e 20 20 20 20 2f 2a 20 41 6e 20 61 67  TION    /* An ag
f1c0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
f1d0: 20 2a 2f 0a 20 20 41 47 47 5f 43 4f 4c 55 4d 4e   */.  AGG_COLUMN
f1e0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 67 67 72        /* An aggr
f1f0: 65 67 61 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f  egated column */
f200: 0a 20 20 55 4d 49 4e 55 53 20 20 20 20 20 20 20  .  UMINUS       
f210: 20 20 20 2f 2a 20 55 6e 61 72 79 20 6d 69 6e 75     /* Unary minu
f220: 73 20 2a 2f 0a 20 20 55 50 4c 55 53 20 20 20 20  s */.  UPLUS    
f230: 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 72 79 20         /* Unary 
f240: 70 6c 75 73 20 2a 2f 0a 20 20 54 52 55 54 48 20  plus */.  TRUTH 
f250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 53 20            /* IS 
f260: 54 52 55 45 20 6f 72 20 49 53 20 46 41 4c 53 45  TRUE or IS FALSE
f270: 20 6f 72 20 49 53 20 4e 4f 54 20 54 52 55 45 20   or IS NOT TRUE 
f280: 6f 72 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 20  or IS NOT FALSE 
f290: 2a 2f 0a 20 20 52 45 47 49 53 54 45 52 20 20 20  */.  REGISTER   
f2a0: 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63       /* Referenc
f2b0: 65 20 74 6f 20 61 20 56 44 42 45 20 72 65 67 69  e to a VDBE regi
f2c0: 73 74 65 72 20 2a 2f 0a 20 20 56 45 43 54 4f 52  ster */.  VECTOR
f2d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 65 63            /* Vec
f2e0: 74 6f 72 20 2a 2f 0a 20 20 53 45 4c 45 43 54 5f  tor */.  SELECT_
f2f0: 43 4f 4c 55 4d 4e 20 20 20 2f 2a 20 43 68 6f 6f  COLUMN   /* Choo
f300: 73 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  se a single colu
f310: 6d 6e 20 66 72 6f 6d 20 61 20 6d 75 6c 74 69 2d  mn from a multi-
f320: 63 6f 6c 75 6d 6e 20 53 45 4c 45 43 54 20 2a 2f  column SELECT */
f330: 0a 20 20 49 46 5f 4e 55 4c 4c 5f 52 4f 57 20 20  .  IF_NULL_ROW  
f340: 20 20 20 2f 2a 20 74 68 65 20 69 66 2d 6e 75 6c     /* the if-nul
f350: 6c 2d 72 6f 77 20 6f 70 65 72 61 74 6f 72 20 2a  l-row operator *
f360: 2f 0a 20 20 41 53 54 45 52 49 53 4b 20 20 20 20  /.  ASTERISK    
f370: 20 20 20 20 2f 2a 20 54 68 65 20 22 2a 22 20 69      /* The "*" i
f380: 6e 20 63 6f 75 6e 74 28 2a 29 20 61 6e 64 20 73  n count(*) and s
f390: 69 6d 69 6c 61 72 20 2a 2f 0a 20 20 53 50 41 4e  imilar */.  SPAN
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f3b0: 68 65 20 73 70 61 6e 20 6f 70 65 72 61 74 6f 72  he span operator
f3c0: 20 2a 2f 0a 2e 0a 2f 2a 20 54 68 65 72 65 20 6d   */.../* There m
f3d0: 75 73 74 20 62 65 20 6e 6f 20 6d 6f 72 65 20 74  ust be no more t
f3e0: 68 61 6e 20 32 35 35 20 74 6f 6b 65 6e 73 20 64  han 255 tokens d
f3f0: 65 66 69 6e 65 64 20 61 62 6f 76 65 2e 20 20 49  efined above.  I
f400: 66 20 74 68 69 73 20 67 72 61 6d 6d 61 72 0a 2a  f this grammar.*
f410: 2a 20 69 73 20 65 78 74 65 6e 64 65 64 20 77 69  * is extended wi
f420: 74 68 20 6e 65 77 20 72 75 6c 65 73 20 61 6e 64  th new rules and
f430: 20 74 6f 6b 65 6e 73 2c 20 74 68 65 79 20 6d 75   tokens, they mu
f440: 73 74 20 65 69 74 68 65 72 20 62 65 20 73 6f 20  st either be so 
f450: 66 65 77 20 69 6e 0a 2a 2a 20 6e 75 6d 62 65 72  few in.** number
f460: 20 74 68 61 74 20 54 4b 5f 53 50 41 4e 20 69 73   that TK_SPAN is
f470: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 32 35   no more than 25
f480: 35 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 6e  5, or else the n
f490: 65 77 20 74 6f 6b 65 6e 73 20 6d 75 73 74 0a 2a  ew tokens must.*
f4a0: 2a 20 61 70 70 65 61 72 20 61 66 74 65 72 20 74  * appear after t
f4b0: 68 69 73 20 6c 69 6e 65 2e 0a 2a 2f 0a 25 69 6e  his line..*/.%in
f4c0: 63 6c 75 64 65 20 7b 0a 23 69 66 20 54 4b 5f 53  clude {.#if TK_S
f4d0: 50 41 4e 3e 32 35 35 0a 23 20 65 72 72 6f 72 20  PAN>255.# error 
f4e0: 74 6f 6f 20 6d 61 6e 79 20 74 6f 6b 65 6e 73 20  too many tokens 
f4f0: 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 0a 23  in the grammar.#
f500: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
f510: 68 65 20 54 4b 5f 53 50 41 43 45 20 61 6e 64 20  he TK_SPACE and 
f520: 54 4b 5f 49 4c 4c 45 47 41 4c 20 74 6f 6b 65 6e  TK_ILLEGAL token
f530: 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  s must be the la
f540: 73 74 20 74 77 6f 20 74 6f 6b 65 6e 73 2e 20 20  st two tokens.  
f550: 54 68 65 0a 2a 2a 20 70 61 72 73 65 72 20 64 65  The.** parser de
f560: 70 65 6e 64 73 20 6f 6e 20 74 68 69 73 2e 20 20  pends on this.  
f570: 54 68 6f 73 65 20 74 6f 6b 65 6e 73 20 61 72 65  Those tokens are
f580: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 61 6e 79   not used in any
f590: 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 2e 0a 2a   grammar rule..*
f5a0: 2a 20 54 68 65 79 20 61 72 65 20 6f 6e 6c 79 20  * They are only 
f5b0: 75 73 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65  used by the toke
f5c0: 6e 69 7a 65 72 2e 20 20 44 65 63 6c 61 72 65 20  nizer.  Declare 
f5d0: 74 68 65 6d 20 6c 61 73 74 20 73 6f 20 74 68 61  them last so tha
f5e0: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 67 75  t they.** are gu
f5f0: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 74  aranteed to be t
f600: 68 65 20 6c 61 73 74 20 74 77 6f 20 74 6f 6b 65  he last two toke
f610: 6e 73 0a 2a 2f 0a 25 74 6f 6b 65 6e 20 53 50 41  ns.*/.%token SPA
f620: 43 45 20 49 4c 4c 45 47 41 4c 2e 0a              CE ILLEGAL..