/ Hex Artifact Content
Login

Artifact 3b5e69c8a94fc59496fd90b9598bccfc2cee7f7bdce1e17d107a03d51caf1d4a:


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 2c 20 62 75 74 20 61 6c 73 6f 20 73 6f 20  ng, but also so 
17d0: 74 68 61 74 20 74 68 65 20 63 6f 6d 70 61 72 69  that the compari
17e0: 73 6f 6e 20 74 6f 6b 65 6e 73 20 4e 45 20 74 68  son tokens NE th
17f0: 72 6f 75 67 68 20 47 45 0a 2f 2f 20 61 72 65 20  rough GE.// are 
1800: 61 73 20 6c 61 72 67 65 20 61 73 20 70 6f 73 73  as large as poss
1810: 69 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  ible so that the
1820: 79 20 61 72 65 20 6e 65 61 72 20 74 6f 20 46 55  y are near to FU
1830: 4e 43 54 49 4f 4e 2c 20 77 68 69 63 68 20 69 73  NCTION, which is
1840: 20 61 0a 2f 2f 20 74 6f 6b 65 6e 20 73 79 6e 74   a.// token synt
1850: 68 65 73 69 7a 65 64 20 62 79 20 61 64 64 6f 70  hesized by addop
1860: 63 6f 64 65 73 2e 74 63 6c 2e 0a 2f 2f 0a 25 74  codes.tcl..//.%t
1870: 6f 6b 65 6e 20 41 42 4f 52 54 20 41 43 54 49 4f  oken ABORT ACTIO
1880: 4e 20 41 46 54 45 52 20 41 4e 41 4c 59 5a 45 20  N AFTER ANALYZE 
1890: 41 53 43 20 41 54 54 41 43 48 20 42 45 46 4f 52  ASC ATTACH BEFOR
18a0: 45 20 42 45 47 49 4e 20 42 59 20 43 41 53 43 41  E BEGIN BY CASCA
18b0: 44 45 20 43 41 53 54 2e 0a 25 74 6f 6b 65 6e 20  DE CAST..%token 
18c0: 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42 41 53  CONFLICT DATABAS
18d0: 45 20 44 45 46 45 52 52 45 44 20 44 45 53 43 20  E DEFERRED DESC 
18e0: 44 45 54 41 43 48 20 45 41 43 48 20 45 4e 44 20  DETACH EACH END 
18f0: 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49  EXCLUSIVE EXPLAI
1900: 4e 20 46 41 49 4c 2e 0a 25 74 6f 6b 65 6e 20 4f  N FAIL..%token O
1910: 52 20 41 4e 44 20 4e 4f 54 20 49 53 20 4d 41 54  R AND NOT IS MAT
1920: 43 48 20 4c 49 4b 45 5f 4b 57 20 42 45 54 57 45  CH LIKE_KW BETWE
1930: 45 4e 20 49 4e 20 49 53 4e 55 4c 4c 20 4e 4f 54  EN IN ISNULL NOT
1940: 4e 55 4c 4c 20 4e 45 20 45 51 2e 0a 25 74 6f 6b  NULL NE EQ..%tok
1950: 65 6e 20 47 54 20 4c 45 20 4c 54 20 47 45 20 45  en GT LE LT GE E
1960: 53 43 41 50 45 2e 0a 0a 2f 2f 20 54 68 65 20 66  SCAPE...// The f
1970: 6f 6c 6c 6f 77 69 6e 67 20 64 69 72 65 63 74 69  ollowing directi
1980: 76 65 20 63 61 75 73 65 73 20 74 6f 6b 65 6e 73  ve causes tokens
1990: 20 41 42 4f 52 54 2c 20 41 46 54 45 52 2c 20 41   ABORT, AFTER, A
19a0: 53 43 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20 66  SC, etc. to.// f
19b0: 61 6c 6c 62 61 63 6b 20 74 6f 20 49 44 20 69 66  allback to ID if
19c0: 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 70   they will not p
19d0: 61 72 73 65 20 61 73 20 74 68 65 69 72 20 6f 72  arse as their or
19e0: 69 67 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f  iginal value..//
19f0: 20 54 68 69 73 20 6f 62 76 69 61 74 65 73 20 74   This obviates t
1a00: 68 65 20 6e 65 65 64 20 66 6f 72 20 74 68 65 20  he need for the 
1a10: 22 69 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  "id" nonterminal
1a20: 2e 0a 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20 49  ..//.%fallback I
1a30: 44 0a 20 20 41 42 4f 52 54 20 41 43 54 49 4f 4e  D.  ABORT ACTION
1a40: 20 41 46 54 45 52 20 41 4e 41 4c 59 5a 45 20 41   AFTER ANALYZE A
1a50: 53 43 20 41 54 54 41 43 48 20 42 45 46 4f 52 45  SC ATTACH BEFORE
1a60: 20 42 45 47 49 4e 20 42 59 20 43 41 53 43 41 44   BEGIN BY CASCAD
1a70: 45 20 43 41 53 54 20 43 4f 4c 55 4d 4e 4b 57 0a  E CAST COLUMNKW.
1a80: 20 20 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42    CONFLICT DATAB
1a90: 41 53 45 20 44 45 46 45 52 52 45 44 20 44 45 53  ASE DEFERRED DES
1aa0: 43 20 44 45 54 41 43 48 20 44 4f 0a 20 20 45 41  C DETACH DO.  EA
1ab0: 43 48 20 45 4e 44 20 45 58 43 4c 55 53 49 56 45  CH END EXCLUSIVE
1ac0: 20 45 58 50 4c 41 49 4e 20 46 41 49 4c 20 46 4f   EXPLAIN FAIL FO
1ad0: 52 0a 20 20 49 47 4e 4f 52 45 20 49 4d 4d 45 44  R.  IGNORE IMMED
1ae0: 49 41 54 45 20 49 4e 49 54 49 41 4c 4c 59 20 49  IATE INITIALLY I
1af0: 4e 53 54 45 41 44 20 4c 49 4b 45 5f 4b 57 20 4d  NSTEAD LIKE_KW M
1b00: 41 54 43 48 20 4e 4f 20 50 4c 41 4e 0a 20 20 51  ATCH NO PLAN.  Q
1b10: 55 45 52 59 20 4b 45 59 20 4f 46 20 4f 46 46 53  UERY KEY OF OFFS
1b20: 45 54 20 50 52 41 47 4d 41 20 52 41 49 53 45 20  ET PRAGMA RAISE 
1b30: 52 45 43 55 52 53 49 56 45 20 52 45 4c 45 41 53  RECURSIVE RELEAS
1b40: 45 20 52 45 50 4c 41 43 45 20 52 45 53 54 52 49  E REPLACE RESTRI
1b50: 43 54 20 52 4f 57 20 52 4f 57 53 0a 20 20 52 4f  CT ROW ROWS.  RO
1b60: 4c 4c 42 41 43 4b 20 53 41 56 45 50 4f 49 4e 54  LLBACK SAVEPOINT
1b70: 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 56 41   TEMP TRIGGER VA
1b80: 43 55 55 4d 20 56 49 45 57 20 56 49 52 54 55 41  CUUM VIEW VIRTUA
1b90: 4c 20 57 49 54 48 20 57 49 54 48 4f 55 54 0a 25  L WITH WITHOUT.%
1ba0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
1bb0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1bc0: 54 0a 20 20 45 58 43 45 50 54 20 49 4e 54 45 52  T.  EXCEPT INTER
1bd0: 53 45 43 54 20 55 4e 49 4f 4e 0a 25 65 6e 64 69  SECT UNION.%endi
1be0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1bf0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
1c00: 52 45 49 4e 44 45 58 20 52 45 4e 41 4d 45 20 43  REINDEX RENAME C
1c10: 54 49 4d 45 5f 4b 57 20 49 46 0a 20 20 2e 0a 25  TIME_KW IF.  ..%
1c20: 77 69 6c 64 63 61 72 64 20 41 4e 59 2e 0a 0a 2f  wildcard ANY.../
1c30: 2f 20 44 65 66 69 6e 65 20 6f 70 65 72 61 74 6f  / Define operato
1c40: 72 20 70 72 65 63 65 64 65 6e 63 65 20 65 61 72  r precedence ear
1c50: 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69 73 20  ly so that this 
1c60: 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 63 63  is the first occ
1c70: 75 72 72 65 6e 63 65 0a 2f 2f 20 6f 66 20 74 68  urrence.// of th
1c80: 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 6b 65 6e  e operator token
1c90: 73 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 65 72  s in the grammer
1ca0: 2e 20 20 4b 65 65 70 69 6e 67 20 74 68 65 20 6f  .  Keeping the o
1cb0: 70 65 72 61 74 6f 72 73 20 74 6f 67 65 74 68 65  perators togethe
1cc0: 72 0a 2f 2f 20 63 61 75 73 65 73 20 74 68 65 6d  r.// causes them
1cd0: 20 74 6f 20 62 65 20 61 73 73 69 67 6e 65 64 20   to be assigned 
1ce0: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 74  integer values t
1cf0: 68 61 74 20 61 72 65 20 63 6c 6f 73 65 20 74 6f  hat are close to
1d00: 67 65 74 68 65 72 2c 0a 2f 2f 20 77 68 69 63 68  gether,.// which
1d10: 20 6b 65 65 70 73 20 70 61 72 73 65 72 20 74 61   keeps parser ta
1d20: 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e 0a 2f 2f  bles smaller..//
1d30: 0a 2f 2f 20 54 68 65 20 74 6f 6b 65 6e 20 76 61  .// The token va
1d40: 6c 75 65 73 20 61 73 73 69 67 6e 65 64 20 74 6f  lues assigned to
1d50: 20 74 68 65 73 65 20 73 79 6d 62 6f 6c 73 20 69   these symbols i
1d60: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
1d70: 74 68 65 20 6f 72 64 65 72 0a 2f 2f 20 69 6e 20  the order.// in 
1d80: 77 68 69 63 68 20 6c 65 6d 6f 6e 20 66 69 72 73  which lemon firs
1d90: 74 20 73 65 65 73 20 74 68 65 6d 2e 20 20 49 74  t sees them.  It
1da0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 61 73   must be the cas
1db0: 65 20 74 68 61 74 20 49 53 4e 55 4c 4c 2f 4e 4f  e that ISNULL/NO
1dc0: 54 4e 55 4c 4c 2c 0a 2f 2f 20 4e 45 2f 45 51 2c  TNULL,.// NE/EQ,
1dd0: 20 47 54 2f 4c 45 2c 20 61 6e 64 20 47 45 2f 4c   GT/LE, and GE/L
1de0: 54 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  T are separated 
1df0: 62 79 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  by only a single
1e00: 20 76 61 6c 75 65 2e 20 20 53 65 65 0a 2f 2f 20   value.  See.// 
1e10: 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  the sqlite3ExprI
1e20: 66 46 61 6c 73 65 28 29 20 72 6f 75 74 69 6e 65  fFalse() routine
1e30: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
1e40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74  information on t
1e50: 68 69 73 0a 2f 2f 20 63 6f 6e 73 74 72 61 69 6e  his.// constrain
1e60: 74 2e 0a 2f 2f 0a 25 6c 65 66 74 20 4f 52 2e 0a  t..//.%left OR..
1e70: 25 6c 65 66 74 20 41 4e 44 2e 0a 25 72 69 67 68  %left AND..%righ
1e80: 74 20 4e 4f 54 2e 0a 25 6c 65 66 74 20 49 53 20  t NOT..%left IS 
1e90: 4d 41 54 43 48 20 4c 49 4b 45 5f 4b 57 20 42 45  MATCH LIKE_KW BE
1ea0: 54 57 45 45 4e 20 49 4e 20 49 53 4e 55 4c 4c 20  TWEEN IN ISNULL 
1eb0: 4e 4f 54 4e 55 4c 4c 20 4e 45 20 45 51 2e 0a 25  NOTNULL NE EQ..%
1ec0: 6c 65 66 74 20 47 54 20 4c 45 20 4c 54 20 47 45  left GT LE LT GE
1ed0: 2e 0a 25 72 69 67 68 74 20 45 53 43 41 50 45 2e  ..%right ESCAPE.
1ee0: 0a 25 6c 65 66 74 20 42 49 54 41 4e 44 20 42 49  .%left BITAND BI
1ef0: 54 4f 52 20 4c 53 48 49 46 54 20 52 53 48 49 46  TOR LSHIFT RSHIF
1f00: 54 2e 0a 25 6c 65 66 74 20 50 4c 55 53 20 4d 49  T..%left PLUS MI
1f10: 4e 55 53 2e 0a 25 6c 65 66 74 20 53 54 41 52 20  NUS..%left STAR 
1f20: 53 4c 41 53 48 20 52 45 4d 2e 0a 25 6c 65 66 74  SLASH REM..%left
1f30: 20 43 4f 4e 43 41 54 2e 0a 25 6c 65 66 74 20 43   CONCAT..%left C
1f40: 4f 4c 4c 41 54 45 2e 0a 25 72 69 67 68 74 20 42  OLLATE..%right B
1f50: 49 54 4e 4f 54 2e 0a 25 6e 6f 6e 61 73 73 6f 63  ITNOT..%nonassoc
1f60: 20 4f 4e 2e 0a 0a 2f 2f 20 41 6e 20 49 44 45 4e   ON...// An IDEN
1f70: 54 49 46 49 45 52 20 63 61 6e 20 62 65 20 61 20  TIFIER can be a 
1f80: 67 65 6e 65 72 69 63 20 69 64 65 6e 74 69 66 69  generic identifi
1f90: 65 72 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 73 65  er, or one of se
1fa0: 76 65 72 61 6c 0a 2f 2f 20 6b 65 79 77 6f 72 64  veral.// keyword
1fb0: 73 2e 20 20 41 6e 79 20 6e 6f 6e 2d 73 74 61 6e  s.  Any non-stan
1fc0: 64 61 72 64 20 6b 65 79 77 6f 72 64 20 63 61 6e  dard keyword can
1fd0: 20 61 6c 73 6f 20 62 65 20 61 6e 20 69 64 65 6e   also be an iden
1fe0: 74 69 66 69 65 72 2e 0a 2f 2f 0a 25 74 6f 6b 65  tifier..//.%toke
1ff0: 6e 5f 63 6c 61 73 73 20 69 64 20 20 49 44 7c 49  n_class id  ID|I
2000: 4e 44 45 58 45 44 2e 0a 0a 0a 2f 2f 20 41 6e 64  NDEXED....// And
2010: 20 22 69 64 73 22 20 69 73 20 61 6e 20 69 64 65   "ids" is an ide
2020: 6e 74 69 66 65 72 2d 6f 72 2d 73 74 72 69 6e 67  ntifer-or-string
2030: 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 63 6c 61 73  ..//.%token_clas
2040: 73 20 69 64 73 20 20 49 44 7c 53 54 52 49 4e 47  s ids  ID|STRING
2050: 2e 0a 0a 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f  ...// The name o
2060: 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 72 20 74 61  f a column or ta
2070: 62 6c 65 20 63 61 6e 20 62 65 20 61 6e 79 20 6f  ble can be any o
2080: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
2090: 0a 2f 2f 0a 25 74 79 70 65 20 6e 6d 20 7b 54 6f  .//.%type nm {To
20a0: 6b 65 6e 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 69  ken}.nm(A) ::= i
20b0: 64 28 41 29 2e 0a 6e 6d 28 41 29 20 3a 3a 3d 20  d(A)..nm(A) ::= 
20c0: 53 54 52 49 4e 47 28 41 29 2e 0a 6e 6d 28 41 29  STRING(A)..nm(A)
20d0: 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 2e   ::= JOIN_KW(A).
20e0: 0a 0a 2f 2f 20 41 20 74 79 70 65 74 6f 6b 65 6e  ..// A typetoken
20f0: 20 69 73 20 72 65 61 6c 6c 79 20 7a 65 72 6f 20   is really zero 
2100: 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e 73 20 74  or more tokens t
2110: 68 61 74 20 66 6f 72 6d 20 61 20 74 79 70 65 20  hat form a type 
2120: 6e 61 6d 65 20 73 75 63 68 0a 2f 2f 20 61 73 20  name such.// as 
2130: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 61 66 74  can be found aft
2140: 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  er the column na
2150: 6d 65 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  me in a CREATE T
2160: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
2170: 2f 2f 20 4d 75 6c 74 69 70 6c 65 20 74 6f 6b 65  // Multiple toke
2180: 6e 73 20 61 72 65 20 63 6f 6e 63 61 74 65 6e 61  ns are concatena
2190: 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 20  ted to form the 
21a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 79 70  value of the typ
21b0: 65 74 6f 6b 65 6e 2e 0a 2f 2f 0a 25 74 79 70 65  etoken..//.%type
21c0: 20 74 79 70 65 74 6f 6b 65 6e 20 7b 54 6f 6b 65   typetoken {Toke
21d0: 6e 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20  n}.typetoken(A) 
21e0: 3a 3a 3d 20 2e 20 20 20 7b 41 2e 6e 20 3d 20 30  ::= .   {A.n = 0
21f0: 3b 20 41 2e 7a 20 3d 20 30 3b 7d 0a 74 79 70 65  ; A.z = 0;}.type
2200: 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79 70  token(A) ::= typ
2210: 65 6e 61 6d 65 28 41 29 2e 0a 74 79 70 65 74 6f  ename(A)..typeto
2220: 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e  ken(A) ::= typen
2230: 61 6d 65 28 41 29 20 4c 50 20 73 69 67 6e 65 64  ame(A) LP signed
2240: 20 52 50 28 59 29 2e 20 7b 0a 20 20 41 2e 6e 20   RP(Y). {.  A.n 
2250: 3d 20 28 69 6e 74 29 28 26 59 2e 7a 5b 59 2e 6e  = (int)(&Y.z[Y.n
2260: 5d 20 2d 20 41 2e 7a 29 3b 0a 7d 0a 74 79 70 65  ] - A.z);.}.type
2270: 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79 70  token(A) ::= typ
2280: 65 6e 61 6d 65 28 41 29 20 4c 50 20 73 69 67 6e  ename(A) LP sign
2290: 65 64 20 43 4f 4d 4d 41 20 73 69 67 6e 65 64 20  ed COMMA signed 
22a0: 52 50 28 59 29 2e 20 7b 0a 20 20 41 2e 6e 20 3d  RP(Y). {.  A.n =
22b0: 20 28 69 6e 74 29 28 26 59 2e 7a 5b 59 2e 6e 5d   (int)(&Y.z[Y.n]
22c0: 20 2d 20 41 2e 7a 29 3b 0a 7d 0a 25 74 79 70 65   - A.z);.}.%type
22d0: 20 74 79 70 65 6e 61 6d 65 20 7b 54 6f 6b 65 6e   typename {Token
22e0: 7d 0a 74 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a  }.typename(A) ::
22f0: 3d 20 69 64 73 28 41 29 2e 0a 74 79 70 65 6e 61  = ids(A)..typena
2300: 6d 65 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61  me(A) ::= typena
2310: 6d 65 28 41 29 20 69 64 73 28 59 29 2e 20 7b 41  me(A) ids(Y). {A
2320: 2e 6e 3d 59 2e 6e 2b 28 69 6e 74 29 28 59 2e 7a  .n=Y.n+(int)(Y.z
2330: 2d 41 2e 7a 29 3b 7d 0a 73 69 67 6e 65 64 20 3a  -A.z);}.signed :
2340: 3a 3d 20 70 6c 75 73 5f 6e 75 6d 2e 0a 73 69 67  := plus_num..sig
2350: 6e 65 64 20 3a 3a 3d 20 6d 69 6e 75 73 5f 6e 75  ned ::= minus_nu
2360: 6d 2e 0a 0a 2f 2f 20 54 68 65 20 73 63 61 6e 70  m...// The scanp
2370: 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 74  t non-terminal t
2380: 61 6b 65 73 20 61 20 76 61 6c 75 65 20 77 68 69  akes a value whi
2390: 63 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ch is a pointer 
23a0: 74 6f 20 74 68 65 0a 2f 2f 20 69 6e 70 75 74 20  to the.// input 
23b0: 74 65 78 74 20 6a 75 73 74 20 70 61 73 74 20 74  text just past t
23c0: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 20 74 68  he last token th
23d0: 61 74 20 68 61 73 20 62 65 65 6e 20 73 68 69 66  at has been shif
23e0: 74 65 64 20 69 6e 74 6f 0a 2f 2f 20 74 68 65 20  ted into.// the 
23f0: 70 61 72 73 65 72 2e 20 20 42 79 20 73 75 72 72  parser.  By surr
2400: 6f 75 6e 64 69 6e 67 20 73 6f 6d 65 20 70 68 72  ounding some phr
2410: 61 73 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ase in the gramm
2420: 61 72 20 77 69 74 68 20 74 77 6f 0a 2f 2f 20 73  ar with two.// s
2430: 63 61 6e 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e  canpt non-termin
2440: 61 6c 73 2c 20 77 65 20 63 61 6e 20 63 61 70 74  als, we can capt
2450: 75 72 65 20 74 68 65 20 69 6e 70 75 74 20 74 65  ure the input te
2460: 78 74 20 66 6f 72 20 74 68 61 74 20 70 68 72 61  xt for that phra
2470: 73 65 2e 0a 2f 2f 20 46 6f 72 20 65 78 61 6d 70  se..// For examp
2480: 6c 65 3a 0a 2f 2f 0a 2f 2f 20 20 20 20 20 20 73  le:.//.//      s
2490: 6f 6d 65 74 68 69 6e 67 20 3a 3a 3d 20 2e 2e 2e  omething ::= ...
24a0: 2e 20 73 63 61 6e 70 74 28 41 29 20 70 68 72 61  . scanpt(A) phra
24b0: 73 65 20 73 63 61 6e 70 74 28 5a 29 2e 0a 2f 2f  se scanpt(Z)..//
24c0: 0a 2f 2f 20 54 68 65 20 74 65 78 74 20 74 68 61  .// The text tha
24d0: 74 20 69 73 20 70 61 72 73 65 64 20 61 73 20 22  t is parsed as "
24e0: 70 68 72 61 73 65 22 20 69 73 20 61 20 73 74 72  phrase" is a str
24f0: 69 6e 67 20 73 74 61 72 74 69 6e 67 20 61 74 20  ing starting at 
2500: 41 0a 2f 2f 20 61 6e 64 20 63 6f 6e 74 61 69 6e  A.// and contain
2510: 69 6e 67 20 28 69 6e 74 29 28 5a 2d 41 29 20 63  ing (int)(Z-A) c
2520: 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65 72  haracters.  Ther
2530: 65 20 6d 69 67 68 74 20 62 65 20 73 6f 6d 65 20  e might be some 
2540: 65 78 74 72 61 0a 2f 2f 20 77 68 69 74 65 73 70  extra.// whitesp
2550: 61 63 65 20 6f 6e 20 65 69 74 68 65 72 20 65 6e  ace on either en
2560: 64 20 6f 66 20 74 68 65 20 74 65 78 74 2c 20 62  d of the text, b
2570: 75 74 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  ut that can be r
2580: 65 6d 6f 76 65 64 20 69 6e 0a 2f 2f 20 70 6f 73  emoved in.// pos
2590: 74 2d 70 72 6f 63 65 73 73 69 6e 67 2c 20 69 66  t-processing, if
25a0: 20 6e 65 65 64 65 64 2e 0a 2f 2f 0a 25 74 79 70   needed..//.%typ
25b0: 65 20 73 63 61 6e 70 74 20 7b 63 6f 6e 73 74 20  e scanpt {const 
25c0: 63 68 61 72 2a 7d 0a 73 63 61 6e 70 74 28 41 29  char*}.scanpt(A)
25d0: 20 3a 3a 3d 20 2e 20 7b 0a 20 20 61 73 73 65 72   ::= . {.  asser
25e0: 74 28 20 79 79 4c 6f 6f 6b 61 68 65 61 64 21 3d  t( yyLookahead!=
25f0: 59 59 4e 4f 43 4f 44 45 20 29 3b 0a 20 20 41 20  YYNOCODE );.  A 
2600: 3d 20 79 79 4c 6f 6f 6b 61 68 65 61 64 54 6f 6b  = yyLookaheadTok
2610: 65 6e 2e 7a 3b 0a 7d 0a 0a 2f 2f 20 22 63 61 72  en.z;.}..// "car
2620: 67 6c 69 73 74 22 20 69 73 20 61 20 6c 69 73 74  glist" is a list
2630: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
2640: 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
2650: 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 0a 2f  come after the./
2660: 2f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e  / column name an
2670: 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e  d column type in
2680: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
2690: 73 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 0a 63 61  statement..//.ca
26a0: 72 67 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c  rglist ::= cargl
26b0: 69 73 74 20 63 63 6f 6e 73 2e 0a 63 61 72 67 6c  ist ccons..cargl
26c0: 69 73 74 20 3a 3a 3d 20 2e 0a 63 63 6f 6e 73 20  ist ::= ..ccons 
26d0: 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e  ::= CONSTRAINT n
26e0: 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  m(X).           
26f0: 7b 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61  {pParse->constra
2700: 69 6e 74 4e 61 6d 65 20 3d 20 58 3b 7d 0a 63 63  intName = X;}.cc
2710: 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  ons ::= DEFAULT 
2720: 73 63 61 6e 70 74 28 41 29 20 74 65 72 6d 28 58  scanpt(A) term(X
2730: 29 20 73 63 61 6e 70 74 28 5a 29 2e 0a 20 20 20  ) scanpt(Z)..   
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
2760: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
2770: 28 70 50 61 72 73 65 2c 58 2c 41 2c 5a 29 3b 7d  (pParse,X,A,Z);}
2780: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55  .ccons ::= DEFAU
2790: 4c 54 20 4c 50 28 41 29 20 65 78 70 72 28 58 29  LT LP(A) expr(X)
27a0: 20 52 50 28 5a 29 2e 0a 20 20 20 20 20 20 20 20   RP(Z)..        
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44      {sqlite3AddD
27d0: 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72  efaultValue(pPar
27e0: 73 65 2c 58 2c 41 2e 7a 2b 31 2c 5a 2e 7a 29 3b  se,X,A.z+1,Z.z);
27f0: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41  }.ccons ::= DEFA
2800: 55 4c 54 20 50 4c 55 53 28 41 29 20 74 65 72 6d  ULT PLUS(A) term
2810: 28 58 29 20 73 63 61 6e 70 74 28 5a 29 2e 0a 20  (X) scanpt(Z).. 
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
2840: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
2850: 75 65 28 70 50 61 72 73 65 2c 58 2c 41 2e 7a 2c  ue(pParse,X,A.z,
2860: 5a 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44  Z);}.ccons ::= D
2870: 45 46 41 55 4c 54 20 4d 49 4e 55 53 28 41 29 20  EFAULT MINUS(A) 
2880: 74 65 72 6d 28 58 29 20 73 63 61 6e 70 74 28 5a  term(X) scanpt(Z
2890: 29 2e 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72  ).      {.  Expr
28a0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 45 78   *p = sqlite3PEx
28b0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 4d  pr(pParse, TK_UM
28c0: 49 4e 55 53 2c 20 58 2c 20 30 29 3b 0a 20 20 73  INUS, X, 0);.  s
28d0: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
28e0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 70 2c 41  Value(pParse,p,A
28f0: 2e 7a 2c 5a 29 3b 0a 7d 0a 63 63 6f 6e 73 20 3a  .z,Z);.}.ccons :
2900: 3a 3d 20 44 45 46 41 55 4c 54 20 73 63 61 6e 70  := DEFAULT scanp
2910: 74 20 69 64 28 58 29 2e 20 20 20 20 20 20 20 7b  t id(X).       {
2920: 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 74 6f 6b  .  Expr *p = tok
2930: 65 6e 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  enExpr(pParse, T
2940: 4b 5f 53 54 52 49 4e 47 2c 20 58 29 3b 0a 20 20  K_STRING, X);.  
2950: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 71 6c  if( p ){.    sql
2960: 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75 65  ite3ExprIdToTrue
2970: 46 61 6c 73 65 28 70 29 3b 0a 20 20 20 20 74 65  False(p);.    te
2980: 73 74 63 61 73 65 28 20 70 2d 3e 6f 70 3d 3d 54  stcase( p->op==T
2990: 4b 5f 54 52 55 45 46 41 4c 53 45 20 26 26 20 73  K_TRUEFALSE && s
29a0: 71 6c 69 74 65 33 45 78 70 72 54 72 75 74 68 56  qlite3ExprTruthV
29b0: 61 6c 75 65 28 70 29 20 29 3b 0a 20 20 7d 0a 20  alue(p) );.  }. 
29c0: 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75   sqlite3AddDefau
29d0: 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 70  ltValue(pParse,p
29e0: 2c 58 2e 7a 2c 58 2e 7a 2b 58 2e 6e 29 3b 0a 7d  ,X.z,X.z+X.n);.}
29f0: 0a 0a 2f 2f 20 49 6e 20 61 64 64 69 74 69 6f 6e  ..// In addition
2a00: 20 74 6f 20 74 68 65 20 74 79 70 65 20 6e 61 6d   to the type nam
2a10: 65 2c 20 77 65 20 61 6c 73 6f 20 63 61 72 65 20  e, we also care 
2a20: 61 62 6f 75 74 20 74 68 65 20 70 72 69 6d 61 72  about the primar
2a30: 79 20 6b 65 79 20 61 6e 64 0a 2f 2f 20 55 4e 49  y key and.// UNI
2a40: 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  QUE constraints.
2a50: 0a 2f 2f 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 55  .//.ccons ::= NU
2a60: 4c 4c 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73  LL onconf..ccons
2a70: 20 3a 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e   ::= NOT NULL on
2a80: 63 6f 6e 66 28 52 29 2e 20 20 20 20 7b 73 71 6c  conf(R).    {sql
2a90: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 70  ite3AddNotNull(p
2aa0: 50 61 72 73 65 2c 20 52 29 3b 7d 0a 63 63 6f 6e  Parse, R);}.ccon
2ab0: 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45  s ::= PRIMARY KE
2ac0: 59 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 20 6f  Y sortorder(Z) o
2ad0: 6e 63 6f 6e 66 28 52 29 20 61 75 74 6f 69 6e 63  nconf(R) autoinc
2ae0: 28 49 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (I)..           
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
2b10: 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72  dPrimaryKey(pPar
2b20: 73 65 2c 30 2c 52 2c 49 2c 5a 29 3b 7d 0a 63 63  se,0,R,I,Z);}.cc
2b30: 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 6f  ons ::= UNIQUE o
2b40: 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20 20 20 7b  nconf(R).      {
2b50: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
2b60: 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c  ex(pParse,0,0,0,
2b70: 30 2c 52 2c 30 2c 30 2c 30 2c 30 2c 0a 20 20 20  0,R,0,0,0,0,.   
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 55  SQLITE_IDXTYPE_U
2bb0: 4e 49 51 55 45 29 3b 7d 0a 63 63 6f 6e 73 20 3a  NIQUE);}.ccons :
2bc0: 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70 72  := CHECK LP expr
2bd0: 28 58 29 20 52 50 2e 20 20 20 7b 73 71 6c 69 74  (X) RP.   {sqlit
2be0: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
2bf0: 61 69 6e 74 28 70 50 61 72 73 65 2c 58 29 3b 7d  aint(pParse,X);}
2c00: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 52 45 46 45 52  .ccons ::= REFER
2c10: 45 4e 43 45 53 20 6e 6d 28 54 29 20 65 69 64 6c  ENCES nm(T) eidl
2c20: 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66 61  ist_opt(TA) refa
2c30: 72 67 73 28 52 29 2e 0a 20 20 20 20 20 20 20 20  rgs(R)..        
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
2c60: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
2c70: 79 28 70 50 61 72 73 65 2c 30 2c 26 54 2c 54 41  y(pParse,0,&T,TA
2c80: 2c 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,R);}.ccons ::= 
2c90: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28  defer_subclause(
2ca0: 44 29 2e 20 20 20 20 7b 73 71 6c 69 74 65 33 44  D).    {sqlite3D
2cb0: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 70  eferForeignKey(p
2cc0: 50 61 72 73 65 2c 44 29 3b 7d 0a 63 63 6f 6e 73  Parse,D);}.ccons
2cd0: 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20 69 64 73   ::= COLLATE ids
2ce0: 28 43 29 2e 20 20 20 20 20 20 20 20 7b 73 71 6c  (C).        {sql
2cf0: 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79  ite3AddCollateTy
2d00: 70 65 28 70 50 61 72 73 65 2c 20 26 43 29 3b 7d  pe(pParse, &C);}
2d10: 0a 0a 2f 2f 20 54 68 65 20 6f 70 74 69 6f 6e 61  ..// The optiona
2d20: 6c 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  l AUTOINCREMENT 
2d30: 6b 65 79 77 6f 72 64 0a 25 74 79 70 65 20 61 75  keyword.%type au
2d40: 74 6f 69 6e 63 20 7b 69 6e 74 7d 0a 61 75 74 6f  toinc {int}.auto
2d50: 69 6e 63 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20  inc(X) ::= .    
2d60: 20 20 20 20 20 20 7b 58 20 3d 20 30 3b 7d 0a 61        {X = 0;}.a
2d70: 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 41 55  utoinc(X) ::= AU
2d80: 54 4f 49 4e 43 52 2e 20 20 7b 58 20 3d 20 31 3b  TOINCR.  {X = 1;
2d90: 7d 0a 0a 2f 2f 20 54 68 65 20 6e 65 78 74 20 67  }..// The next g
2da0: 72 6f 75 70 20 6f 66 20 72 75 6c 65 73 20 70 61  roup of rules pa
2db0: 72 73 65 73 20 74 68 65 20 61 72 67 75 6d 65 6e  rses the argumen
2dc0: 74 73 20 74 6f 20 61 20 52 45 46 45 52 45 4e 43  ts to a REFERENC
2dd0: 45 53 20 63 6c 61 75 73 65 0a 2f 2f 20 74 68 61  ES clause.// tha
2de0: 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  t determine if t
2df0: 68 65 20 72 65 66 65 72 65 6e 74 69 61 6c 20 69  he referential i
2e00: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e  ntegrity checkin
2e10: 67 20 69 73 20 64 65 66 65 72 72 65 64 20 6f 72  g is deferred or
2e20: 0a 2f 2f 20 6f 72 20 69 6d 6d 65 64 69 61 74 65  .// or immediate
2e30: 20 61 6e 64 20 77 68 69 63 68 20 64 65 74 65 72   and which deter
2e40: 6d 69 6e 65 20 77 68 61 74 20 61 63 74 69 6f 6e  mine what action
2e50: 20 74 6f 20 74 61 6b 65 20 69 66 20 61 20 72 65   to take if a re
2e60: 66 2d 69 6e 74 65 67 0a 2f 2f 20 63 68 65 63 6b  f-integ.// check
2e70: 20 66 61 69 6c 73 2e 0a 2f 2f 0a 25 74 79 70 65   fails..//.%type
2e80: 20 72 65 66 61 72 67 73 20 7b 69 6e 74 7d 0a 72   refargs {int}.r
2e90: 65 66 61 72 67 73 28 41 29 20 3a 3a 3d 20 2e 20  efargs(A) ::= . 
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65 2a 30   { A = OE_None*0
2ec0: 78 30 31 30 31 3b 20 2f 2a 20 45 56 3a 20 52 2d  x0101; /* EV: R-
2ed0: 31 39 38 30 33 2d 34 35 38 38 34 20 2a 2f 7d 0a  19803-45884 */}.
2ee0: 72 65 66 61 72 67 73 28 41 29 20 3a 3a 3d 20 72  refargs(A) ::= r
2ef0: 65 66 61 72 67 73 28 41 29 20 72 65 66 61 72 67  efargs(A) refarg
2f00: 28 59 29 2e 20 7b 20 41 20 3d 20 28 41 20 26 20  (Y). { A = (A & 
2f10: 7e 59 2e 6d 61 73 6b 29 20 7c 20 59 2e 76 61 6c  ~Y.mask) | Y.val
2f20: 75 65 3b 20 7d 0a 25 74 79 70 65 20 72 65 66 61  ue; }.%type refa
2f30: 72 67 20 7b 73 74 72 75 63 74 20 7b 69 6e 74 20  rg {struct {int 
2f40: 76 61 6c 75 65 3b 20 69 6e 74 20 6d 61 73 6b 3b  value; int mask;
2f50: 7d 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d  }}.refarg(A) ::=
2f60: 20 4d 41 54 43 48 20 6e 6d 2e 20 20 20 20 20 20   MATCH nm.      
2f70: 20 20 20 20 20 20 20 20 7b 20 41 2e 76 61 6c 75          { A.valu
2f80: 65 20 3d 20 30 3b 20 20 20 20 20 41 2e 6d 61 73  e = 0;     A.mas
2f90: 6b 20 3d 20 30 78 30 30 30 30 30 30 3b 20 7d 0a  k = 0x000000; }.
2fa0: 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e  refarg(A) ::= ON
2fb0: 20 49 4e 53 45 52 54 20 72 65 66 61 63 74 2e 20   INSERT refact. 
2fc0: 20 20 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d       { A.value =
2fd0: 20 30 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d   0;     A.mask =
2fe0: 20 30 78 30 30 30 30 30 30 3b 20 7d 0a 72 65 66   0x000000; }.ref
2ff0: 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 44 45  arg(A) ::= ON DE
3000: 4c 45 54 45 20 72 65 66 61 63 74 28 58 29 2e 20  LETE refact(X). 
3010: 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58 3b    { A.value = X;
3020: 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78       A.mask = 0x
3030: 30 30 30 30 66 66 3b 20 7d 0a 72 65 66 61 72 67  0000ff; }.refarg
3040: 28 41 29 20 3a 3a 3d 20 4f 4e 20 55 50 44 41 54  (A) ::= ON UPDAT
3050: 45 20 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b  E refact(X).   {
3060: 20 41 2e 76 61 6c 75 65 20 3d 20 58 3c 3c 38 3b   A.value = X<<8;
3070: 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 66    A.mask = 0x00f
3080: 66 30 30 3b 20 7d 0a 25 74 79 70 65 20 72 65 66  f00; }.%type ref
3090: 61 63 74 20 7b 69 6e 74 7d 0a 72 65 66 61 63 74  act {int}.refact
30a0: 28 41 29 20 3a 3a 3d 20 53 45 54 20 4e 55 4c 4c  (A) ::= SET NULL
30b0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
30c0: 20 41 20 3d 20 4f 45 5f 53 65 74 4e 75 6c 6c 3b   A = OE_SetNull;
30d0: 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36    /* EV: R-33326
30e0: 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63  -45252 */}.refac
30f0: 74 28 41 29 20 3a 3a 3d 20 53 45 54 20 44 45 46  t(A) ::= SET DEF
3100: 41 55 4c 54 2e 20 20 20 20 20 20 20 20 20 20 20  AULT.           
3110: 7b 20 41 20 3d 20 4f 45 5f 53 65 74 44 66 6c 74  { A = OE_SetDflt
3120: 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32  ;  /* EV: R-3332
3130: 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61  6-45252 */}.refa
3140: 63 74 28 41 29 20 3a 3a 3d 20 43 41 53 43 41 44  ct(A) ::= CASCAD
3150: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
3160: 20 7b 20 41 20 3d 20 4f 45 5f 43 61 73 63 61 64   { A = OE_Cascad
3170: 65 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33  e;  /* EV: R-333
3180: 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66  26-45252 */}.ref
3190: 61 63 74 28 41 29 20 3a 3a 3d 20 52 45 53 54 52  act(A) ::= RESTR
31a0: 49 43 54 2e 20 20 20 20 20 20 20 20 20 20 20 20  ICT.            
31b0: 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65 73 74 72    { A = OE_Restr
31c0: 69 63 74 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 33  ict; /* EV: R-33
31d0: 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65  326-45252 */}.re
31e0: 66 61 63 74 28 41 29 20 3a 3a 3d 20 4e 4f 20 41  fact(A) ::= NO A
31f0: 43 54 49 4f 4e 2e 20 20 20 20 20 20 20 20 20 20  CTION.          
3200: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65     { A = OE_None
3210: 3b 20 20 20 20 20 2f 2a 20 45 56 3a 20 52 2d 33  ;     /* EV: R-3
3220: 33 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 25  3326-45252 */}.%
3230: 74 79 70 65 20 64 65 66 65 72 5f 73 75 62 63 6c  type defer_subcl
3240: 61 75 73 65 20 7b 69 6e 74 7d 0a 64 65 66 65 72  ause {int}.defer
3250: 5f 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a  _subclause(A) ::
3260: 3d 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45  = NOT DEFERRABLE
3270: 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70   init_deferred_p
3280: 72 65 64 5f 6f 70 74 2e 20 20 20 20 20 7b 41 20  red_opt.     {A 
3290: 3d 20 30 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63  = 0;}.defer_subc
32a0: 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 44 45 46  lause(A) ::= DEF
32b0: 45 52 52 41 42 4c 45 20 69 6e 69 74 5f 64 65 66  ERRABLE init_def
32c0: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 58  erred_pred_opt(X
32d0: 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  ).      {A = X;}
32e0: 0a 25 74 79 70 65 20 69 6e 69 74 5f 64 65 66 65  .%type init_defe
32f0: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 20 7b 69  rred_pred_opt {i
3300: 6e 74 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65  nt}.init_deferre
3310: 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a  d_pred_opt(A) ::
3320: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
3330: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
3340: 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64  ;}.init_deferred
3350: 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d  _pred_opt(A) ::=
3360: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
3370: 52 45 44 2e 20 20 20 20 20 7b 41 20 3d 20 31 3b  RED.     {A = 1;
3380: 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f  }.init_deferred_
3390: 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  pred_opt(A) ::= 
33a0: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
33b0: 41 54 45 2e 20 20 20 20 7b 41 20 3d 20 30 3b 7d  ATE.    {A = 0;}
33c0: 0a 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41  ..conslist_opt(A
33d0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 7b 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20  {A.n = 0; A.z = 
3400: 30 3b 7d 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74  0;}.conslist_opt
3410: 28 41 29 20 3a 3a 3d 20 43 4f 4d 4d 41 28 41 29  (A) ::= COMMA(A)
3420: 20 63 6f 6e 73 6c 69 73 74 2e 0a 63 6f 6e 73 6c   conslist..consl
3430: 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74  ist ::= conslist
3440: 20 74 63 6f 6e 73 63 6f 6d 6d 61 20 74 63 6f 6e   tconscomma tcon
3450: 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20  s..conslist ::= 
3460: 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73 63 6f 6d 6d  tcons..tconscomm
3470: 61 20 3a 3a 3d 20 43 4f 4d 4d 41 2e 20 20 20 20  a ::= COMMA.    
3480: 20 20 20 20 20 20 20 20 7b 70 50 61 72 73 65 2d          {pParse-
3490: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
34a0: 6e 20 3d 20 30 3b 7d 0a 74 63 6f 6e 73 63 6f 6d  n = 0;}.tconscom
34b0: 6d 61 20 3a 3a 3d 20 2e 0a 74 63 6f 6e 73 20 3a  ma ::= ..tcons :
34c0: 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d  := CONSTRAINT nm
34d0: 28 58 29 2e 20 20 20 20 20 20 7b 70 50 61 72 73  (X).      {pPars
34e0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
34f0: 65 20 3d 20 58 3b 7d 0a 74 63 6f 6e 73 20 3a 3a  e = X;}.tcons ::
3500: 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4c 50  = PRIMARY KEY LP
3510: 20 73 6f 72 74 6c 69 73 74 28 58 29 20 61 75 74   sortlist(X) aut
3520: 6f 69 6e 63 28 49 29 20 52 50 20 6f 6e 63 6f 6e  oinc(I) RP oncon
3530: 66 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20  f(R)..          
3540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3550: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41         {sqlite3A
3560: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61  ddPrimaryKey(pPa
3570: 72 73 65 2c 58 2c 52 2c 49 2c 30 29 3b 7d 0a 74  rse,X,R,I,0);}.t
3580: 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20  cons ::= UNIQUE 
3590: 4c 50 20 73 6f 72 74 6c 69 73 74 28 58 29 20 52  LP sortlist(X) R
35a0: 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20  P onconf(R)..   
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
35d0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
35e0: 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 58  x(pParse,0,0,0,X
35f0: 2c 52 2c 30 2c 30 2c 30 2c 30 2c 0a 20 20 20 20  ,R,0,0,0,0,.    
3600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50     SQLITE_IDXTYP
3630: 45 5f 55 4e 49 51 55 45 29 3b 7d 0a 74 63 6f 6e  E_UNIQUE);}.tcon
3640: 73 20 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65  s ::= CHECK LP e
3650: 78 70 72 28 45 29 20 52 50 20 6f 6e 63 6f 6e 66  xpr(E) RP onconf
3660: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3680: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43 68     {sqlite3AddCh
3690: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  eckConstraint(pP
36a0: 61 72 73 65 2c 45 29 3b 7d 0a 74 63 6f 6e 73 20  arse,E);}.tcons 
36b0: 3a 3a 3d 20 46 4f 52 45 49 47 4e 20 4b 45 59 20  ::= FOREIGN KEY 
36c0: 4c 50 20 65 69 64 6c 69 73 74 28 46 41 29 20 52  LP eidlist(FA) R
36d0: 50 0a 20 20 20 20 20 20 20 20 20 20 52 45 46 45  P.          REFE
36e0: 52 45 4e 43 45 53 20 6e 6d 28 54 29 20 65 69 64  RENCES nm(T) eid
36f0: 6c 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66  list_opt(TA) ref
3700: 61 72 67 73 28 52 29 20 64 65 66 65 72 5f 73 75  args(R) defer_su
3710: 62 63 6c 61 75 73 65 5f 6f 70 74 28 44 29 2e 20  bclause_opt(D). 
3720: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
3730: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 70 50  ateForeignKey(pP
3740: 61 72 73 65 2c 20 46 41 2c 20 26 54 2c 20 54 41  arse, FA, &T, TA
3750: 2c 20 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , R);.    sqlite
3760: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
3770: 28 70 50 61 72 73 65 2c 20 44 29 3b 0a 7d 0a 25  (pParse, D);.}.%
3780: 74 79 70 65 20 64 65 66 65 72 5f 73 75 62 63 6c  type defer_subcl
3790: 61 75 73 65 5f 6f 70 74 20 7b 69 6e 74 7d 0a 64  ause_opt {int}.d
37a0: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f  efer_subclause_o
37b0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
37c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
37d0: 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72 5f 73 75  A = 0;}.defer_su
37e0: 62 63 6c 61 75 73 65 5f 6f 70 74 28 41 29 20 3a  bclause_opt(A) :
37f0: 3a 3d 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75  := defer_subclau
3800: 73 65 28 41 29 2e 0a 0a 2f 2f 20 54 68 65 20 66  se(A)...// The f
3810: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f  ollowing is a no
3820: 6e 2d 73 74 61 6e 64 61 72 64 20 65 78 74 65 6e  n-standard exten
3830: 73 69 6f 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73  sion that allows
3840: 20 75 73 20 74 6f 20 64 65 63 6c 61 72 65 20 74   us to declare t
3850: 68 65 0a 2f 2f 20 64 65 66 61 75 6c 74 20 62 65  he.// default be
3860: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 72  havior when ther
3870: 65 20 69 73 20 61 20 63 6f 6e 73 74 72 61 69 6e  e is a constrain
3880: 74 20 63 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25  t conflict..//.%
3890: 74 79 70 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74  type onconf {int
38a0: 7d 0a 25 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b  }.%type orconf {
38b0: 69 6e 74 7d 0a 25 74 79 70 65 20 72 65 73 6f 6c  int}.%type resol
38c0: 76 65 74 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63  vetype {int}.onc
38d0: 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  onf(A) ::= .    
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38f0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f            {A = O
3900: 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 6e 63 6f  E_Default;}.onco
3910: 6e 66 28 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e  nf(A) ::= ON CON
3920: 46 4c 49 43 54 20 72 65 73 6f 6c 76 65 74 79 70  FLICT resolvetyp
3930: 65 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b  e(X).    {A = X;
3940: 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20  }.orconf(A) ::= 
3950: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
3970: 41 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 7d  A = OE_Default;}
3980: 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f  .orconf(A) ::= O
3990: 52 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29  R resolvetype(X)
39a0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
39b0: 20 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76 65 74 79   = X;}.resolvety
39c0: 70 65 28 41 29 20 3a 3a 3d 20 72 61 69 73 65 74  pe(A) ::= raiset
39d0: 79 70 65 28 41 29 2e 0a 72 65 73 6f 6c 76 65 74  ype(A)..resolvet
39e0: 79 70 65 28 41 29 20 3a 3a 3d 20 49 47 4e 4f 52  ype(A) ::= IGNOR
39f0: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
3a00: 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 49 67 6e       {A = OE_Ign
3a10: 6f 72 65 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70  ore;}.resolvetyp
3a20: 65 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45  e(A) ::= REPLACE
3a30: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3a40: 20 20 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61     {A = OE_Repla
3a50: 63 65 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ce;}..//////////
3a60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a70: 20 54 68 65 20 44 52 4f 50 20 54 41 42 4c 45 20   The DROP TABLE 
3a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3aa0: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
3ab0: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 66 65 78   DROP TABLE ifex
3ac0: 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65  ists(E) fullname
3ad0: 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (X). {.  sqlite3
3ae0: 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
3af0: 2c 20 58 2c 20 30 2c 20 45 29 3b 0a 7d 0a 25 74  , X, 0, E);.}.%t
3b00: 79 70 65 20 69 66 65 78 69 73 74 73 20 7b 69 6e  ype ifexists {in
3b10: 74 7d 0a 69 66 65 78 69 73 74 73 28 41 29 20 3a  t}.ifexists(A) :
3b20: 3a 3d 20 49 46 20 45 58 49 53 54 53 2e 20 20 20  := IF EXISTS.   
3b30: 7b 41 20 3d 20 31 3b 7d 0a 69 66 65 78 69 73 74  {A = 1;}.ifexist
3b40: 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  s(A) ::= .      
3b50: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a        {A = 0;}..
3b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b70: 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45  ///// The CREATE
3b80: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
3b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
3bb0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
3bc0: 4f 4d 49 54 5f 56 49 45 57 0a 63 6d 64 20 3a 3a  OMIT_VIEW.cmd ::
3bd0: 3d 20 63 72 65 61 74 65 6b 77 28 58 29 20 74 65  = createkw(X) te
3be0: 6d 70 28 54 29 20 56 49 45 57 20 69 66 6e 6f 74  mp(T) VIEW ifnot
3bf0: 65 78 69 73 74 73 28 45 29 20 6e 6d 28 59 29 20  exists(E) nm(Y) 
3c00: 64 62 6e 6d 28 5a 29 20 65 69 64 6c 69 73 74 5f  dbnm(Z) eidlist_
3c10: 6f 70 74 28 43 29 0a 20 20 20 20 20 20 20 20 20  opt(C).         
3c20: 20 41 53 20 73 65 6c 65 63 74 28 53 29 2e 20 7b   AS select(S). {
3c30: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
3c40: 56 69 65 77 28 70 50 61 72 73 65 2c 20 26 58 2c  View(pParse, &X,
3c50: 20 26 59 2c 20 26 5a 2c 20 43 2c 20 53 2c 20 54   &Y, &Z, C, S, T
3c60: 2c 20 45 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20  , E);.}.cmd ::= 
3c70: 44 52 4f 50 20 56 49 45 57 20 69 66 65 78 69 73  DROP VIEW ifexis
3c80: 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58  ts(E) fullname(X
3c90: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72  ). {.  sqlite3Dr
3ca0: 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
3cb0: 58 2c 20 31 2c 20 45 29 3b 0a 7d 0a 25 65 6e 64  X, 1, E);.}.%end
3cc0: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
3cd0: 56 49 45 57 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  VIEW..//////////
3ce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
3cf0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3d00: 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ent ////////////
3d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3d20: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
3d30: 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b 0a 20   select(X).  {. 
3d40: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
3d50: 20 3d 20 7b 53 52 54 5f 4f 75 74 70 75 74 2c 20   = {SRT_Output, 
3d60: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0, 0, 0, 0, 0};.
3d70: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
3d80: 70 50 61 72 73 65 2c 20 58 2c 20 26 64 65 73 74  pParse, X, &dest
3d90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
3da0: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
3db0: 3e 64 62 2c 20 58 29 3b 0a 7d 0a 0a 25 74 79 70  >db, X);.}..%typ
3dc0: 65 20 73 65 6c 65 63 74 20 7b 53 65 6c 65 63 74  e select {Select
3dd0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
3de0: 65 6c 65 63 74 20 7b 73 71 6c 69 74 65 33 53 65  elect {sqlite3Se
3df0: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
3e00: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79  e->db, $$);}.%ty
3e10: 70 65 20 73 65 6c 65 63 74 6e 6f 77 69 74 68 20  pe selectnowith 
3e20: 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72  {Select*}.%destr
3e30: 75 63 74 6f 72 20 73 65 6c 65 63 74 6e 6f 77 69  uctor selectnowi
3e40: 74 68 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  th {sqlite3Selec
3e50: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
3e60: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
3e70: 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65 6c 65 63  oneselect {Selec
3e80: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3e90: 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71 6c 69 74  oneselect {sqlit
3ea0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
3eb0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
3ec0: 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f  ..%include {.  /
3ed0: 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 63 6f 6d  *.  ** For a com
3ee0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
3ef0: 74 65 6d 65 6e 74 2c 20 6d 61 6b 65 20 73 75 72  tement, make sur
3f00: 65 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  e p->pPrior->pNe
3f10: 78 74 3d 3d 70 20 66 6f 72 0a 20 20 2a 2a 20 61  xt==p for.  ** a
3f20: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  ll elements in t
3f30: 68 65 20 6c 69 73 74 2e 20 20 41 6e 64 20 6d 61  he list.  And ma
3f40: 6b 65 20 73 75 72 65 20 6c 69 73 74 20 6c 65 6e  ke sure list len
3f50: 67 74 68 20 64 6f 65 73 20 6e 6f 74 20 65 78 63  gth does not exc
3f60: 65 65 64 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  eed.  ** SQLITE_
3f70: 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
3f80: 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 20 20 73 74  ELECT..  */.  st
3f90: 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 72  atic void parser
3fa0: 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74  DoubleLinkSelect
3fb0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3fc0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 20 20  Select *p){.    
3fd0: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
3fe0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
3ff0: 4e 65 78 74 20 3d 20 30 2c 20 2a 70 4c 6f 6f 70  Next = 0, *pLoop
4000: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65  ;.      int mxSe
4010: 6c 65 63 74 2c 20 63 6e 74 20 3d 20 30 3b 0a 20  lect, cnt = 0;. 
4020: 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
4030: 3b 20 70 4c 6f 6f 70 3b 20 70 4e 65 78 74 3d 70  ; pLoop; pNext=p
4040: 4c 6f 6f 70 2c 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop, pLoop=pLoo
4050: 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b  p->pPrior, cnt++
4060: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
4070: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b  ->pNext = pNext;
4080: 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
4090: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
40a0: 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 20 20 7d  ompound;.      }
40b0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73  .      if( (p->s
40c0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
40d0: 74 69 56 61 6c 75 65 29 3d 3d 30 20 26 26 20 0a  tiValue)==0 && .
40e0: 20 20 20 20 20 20 20 20 28 6d 78 53 65 6c 65 63          (mxSelec
40f0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
4100: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
4110: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
4120: 45 43 54 5d 29 3e 30 20 26 26 0a 20 20 20 20 20  ECT])>0 &&.     
4130: 20 20 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 0a     cnt>mxSelect.
4140: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
4150: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4160: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
4170: 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70  ny terms in comp
4180: 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20  ound SELECT");. 
4190: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
41a0: 0a 7d 0a 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  .}..%ifndef SQLI
41b0: 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 73 65 6c 65  TE_OMIT_CTE.sele
41c0: 63 74 28 41 29 20 3a 3a 3d 20 57 49 54 48 20 77  ct(A) ::= WITH w
41d0: 71 6c 69 73 74 28 57 29 20 73 65 6c 65 63 74 6e  qlist(W) selectn
41e0: 6f 77 69 74 68 28 58 29 2e 20 7b 0a 20 20 53 65  owith(X). {.  Se
41f0: 6c 65 63 74 20 2a 70 20 3d 20 58 3b 0a 20 20 69  lect *p = X;.  i
4200: 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70  f( p ){.    p->p
4210: 57 69 74 68 20 3d 20 57 3b 0a 20 20 20 20 70 61  With = W;.    pa
4220: 72 73 65 72 44 6f 75 62 6c 65 4c 69 6e 6b 53 65  rserDoubleLinkSe
4230: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 29 3b  lect(pParse, p);
4240: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
4250: 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
4260: 70 50 61 72 73 65 2d 3e 64 62 2c 20 57 29 3b 0a  pParse->db, W);.
4270: 20 20 7d 0a 20 20 41 20 3d 20 70 3b 0a 7d 0a 73    }.  A = p;.}.s
4280: 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 57 49 54  elect(A) ::= WIT
4290: 48 20 52 45 43 55 52 53 49 56 45 20 77 71 6c 69  H RECURSIVE wqli
42a0: 73 74 28 57 29 20 73 65 6c 65 63 74 6e 6f 77 69  st(W) selectnowi
42b0: 74 68 28 58 29 2e 20 7b 0a 20 20 53 65 6c 65 63  th(X). {.  Selec
42c0: 74 20 2a 70 20 3d 20 58 3b 0a 20 20 69 66 28 20  t *p = X;.  if( 
42d0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 69 74  p ){.    p->pWit
42e0: 68 20 3d 20 57 3b 0a 20 20 20 20 70 61 72 73 65  h = W;.    parse
42f0: 72 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63  rDoubleLinkSelec
4300: 74 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  t(pParse, p);.  
4310: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
4320: 65 33 57 69 74 68 44 65 6c 65 74 65 28 70 50 61  e3WithDelete(pPa
4330: 72 73 65 2d 3e 64 62 2c 20 57 29 3b 0a 20 20 7d  rse->db, W);.  }
4340: 0a 20 20 41 20 3d 20 70 3b 0a 7d 0a 25 65 6e 64  .  A = p;.}.%end
4350: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
4360: 54 5f 43 54 45 20 2a 2f 0a 73 65 6c 65 63 74 28  T_CTE */.select(
4370: 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74 6e 6f 77  A) ::= selectnow
4380: 69 74 68 28 58 29 2e 20 7b 0a 20 20 53 65 6c 65  ith(X). {.  Sele
4390: 63 74 20 2a 70 20 3d 20 58 3b 0a 20 20 69 66 28  ct *p = X;.  if(
43a0: 20 70 20 29 7b 0a 20 20 20 20 70 61 72 73 65 72   p ){.    parser
43b0: 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74  DoubleLinkSelect
43c0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
43d0: 0a 20 20 41 20 3d 20 70 3b 20 2f 2a 41 2d 6f 76  .  A = p; /*A-ov
43e0: 65 72 77 72 69 74 65 73 2d 58 2a 2f 0a 7d 0a 0a  erwrites-X*/.}..
43f0: 73 65 6c 65 63 74 6e 6f 77 69 74 68 28 41 29 20  selectnowith(A) 
4400: 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28 41 29  ::= oneselect(A)
4410: 2e 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..%ifndef SQLITE
4420: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
4430: 45 4c 45 43 54 0a 73 65 6c 65 63 74 6e 6f 77 69  ELECT.selectnowi
4440: 74 68 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74  th(A) ::= select
4450: 6e 6f 77 69 74 68 28 41 29 20 6d 75 6c 74 69 73  nowith(A) multis
4460: 65 6c 65 63 74 5f 6f 70 28 59 29 20 6f 6e 65 73  elect_op(Y) ones
4470: 65 6c 65 63 74 28 5a 29 2e 20 20 7b 0a 20 20 53  elect(Z).  {.  S
4480: 65 6c 65 63 74 20 2a 70 52 68 73 20 3d 20 5a 3b  elect *pRhs = Z;
4490: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4c 68 73 20  .  Select *pLhs 
44a0: 3d 20 41 3b 0a 20 20 69 66 28 20 70 52 68 73 20  = A;.  if( pRhs 
44b0: 26 26 20 70 52 68 73 2d 3e 70 50 72 69 6f 72 20  && pRhs->pPrior 
44c0: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
44d0: 70 46 72 6f 6d 3b 0a 20 20 20 20 54 6f 6b 65 6e  pFrom;.    Token
44e0: 20 78 3b 0a 20 20 20 20 78 2e 6e 20 3d 20 30 3b   x;.    x.n = 0;
44f0: 0a 20 20 20 20 70 61 72 73 65 72 44 6f 75 62 6c  .    parserDoubl
4500: 65 4c 69 6e 6b 53 65 6c 65 63 74 28 70 50 61 72  eLinkSelect(pPar
4510: 73 65 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 70  se, pRhs);.    p
4520: 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 53 72  From = sqlite3Sr
4530: 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
4540: 65 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  erm(pParse,0,0,0
4550: 2c 26 78 2c 70 52 68 73 2c 30 2c 30 29 3b 0a 20  ,&x,pRhs,0,0);. 
4560: 20 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65     pRhs = sqlite
4570: 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73  3SelectNew(pPars
4580: 65 2c 30 2c 70 46 72 6f 6d 2c 30 2c 30 2c 30 2c  e,0,pFrom,0,0,0,
4590: 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66  0,0,0);.  }.  if
45a0: 28 20 70 52 68 73 20 29 7b 0a 20 20 20 20 70 52  ( pRhs ){.    pR
45b0: 68 73 2d 3e 6f 70 20 3d 20 28 75 38 29 59 3b 0a  hs->op = (u8)Y;.
45c0: 20 20 20 20 70 52 68 73 2d 3e 70 50 72 69 6f 72      pRhs->pPrior
45d0: 20 3d 20 70 4c 68 73 3b 0a 20 20 20 20 69 66 28   = pLhs;.    if(
45e0: 20 41 4c 57 41 59 53 28 70 4c 68 73 29 20 29 20   ALWAYS(pLhs) ) 
45f0: 70 4c 68 73 2d 3e 73 65 6c 46 6c 61 67 73 20 26  pLhs->selFlags &
4600: 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65  = ~SF_MultiValue
4610: 3b 0a 20 20 20 20 70 52 68 73 2d 3e 73 65 6c 46  ;.    pRhs->selF
4620: 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74  lags &= ~SF_Mult
4630: 69 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 20  iValue;.    if( 
4640: 59 21 3d 54 4b 5f 41 4c 4c 20 29 20 70 50 61 72  Y!=TK_ALL ) pPar
4650: 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 20  se->hasCompound 
4660: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
4670: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
4680: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
4690: 2c 20 70 4c 68 73 29 3b 0a 20 20 7d 0a 20 20 41  , pLhs);.  }.  A
46a0: 20 3d 20 70 52 68 73 3b 0a 7d 0a 25 74 79 70 65   = pRhs;.}.%type
46b0: 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 20   multiselect_op 
46c0: 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65 63  {int}.multiselec
46d0: 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f  t_op(A) ::= UNIO
46e0: 4e 28 4f 50 29 2e 20 20 20 20 20 20 20 20 20 20  N(OP).          
46f0: 20 20 20 7b 41 20 3d 20 40 4f 50 3b 20 2f 2a 41     {A = @OP; /*A
4700: 2d 6f 76 65 72 77 72 69 74 65 73 2d 4f 50 2a 2f  -overwrites-OP*/
4710: 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70  }.multiselect_op
4720: 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 20 41 4c  (A) ::= UNION AL
4730: 4c 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  L.             {
4740: 41 20 3d 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d 75 6c  A = TK_ALL;}.mul
4750: 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a  tiselect_op(A) :
4760: 3a 3d 20 45 58 43 45 50 54 7c 49 4e 54 45 52 53  := EXCEPT|INTERS
4770: 45 43 54 28 4f 50 29 2e 20 20 7b 41 20 3d 20 40  ECT(OP).  {A = @
4780: 4f 50 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  OP; /*A-overwrit
4790: 65 73 2d 4f 50 2a 2f 7d 0a 25 65 6e 64 69 66 20  es-OP*/}.%endif 
47a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
47b0: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 6f 6e 65 73  OUND_SELECT.ones
47c0: 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 53 45 4c  elect(A) ::= SEL
47d0: 45 43 54 28 53 29 20 64 69 73 74 69 6e 63 74 28  ECT(S) distinct(
47e0: 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57 29  D) selcollist(W)
47f0: 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65 5f 6f   from(X) where_o
4800: 70 74 28 59 29 0a 20 20 20 20 20 20 20 20 20 20  pt(Y).          
4810: 20 20 20 20 20 20 20 67 72 6f 75 70 62 79 5f 6f         groupby_o
4820: 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f 70 74  pt(P) having_opt
4830: 28 51 29 20 77 69 6e 64 6f 77 64 65 66 6e 5f 6f  (Q) windowdefn_o
4840: 70 74 28 52 29 0a 20 20 20 20 20 20 20 20 20 20  pt(R).          
4850: 20 20 20 20 20 20 20 6f 72 64 65 72 62 79 5f 6f         orderby_o
4860: 70 74 28 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28  pt(Z) limit_opt(
4870: 4c 29 2e 20 7b 0a 23 69 66 20 53 45 4c 45 43 54  L). {.#if SELECT
4880: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
4890: 54 6f 6b 65 6e 20 73 20 3d 20 53 3b 20 2f 2a 41  Token s = S; /*A
48a0: 2d 6f 76 65 72 77 72 69 74 65 73 2d 53 2a 2f 0a  -overwrites-S*/.
48b0: 23 65 6e 64 69 66 0a 20 20 41 20 3d 20 73 71 6c  #endif.  A = sql
48c0: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50  ite3SelectNew(pP
48d0: 61 72 73 65 2c 57 2c 58 2c 59 2c 50 2c 51 2c 5a  arse,W,X,Y,P,Q,Z
48e0: 2c 44 2c 4c 29 3b 0a 20 20 69 66 28 20 41 20 29  ,D,L);.  if( A )
48f0: 7b 0a 20 20 20 20 41 2d 3e 70 57 69 6e 44 65 66  {.    A->pWinDef
4900: 6e 20 3d 20 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = R;.  }else{.
4910: 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f      sqlite3Windo
4920: 77 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  wListDelete(pPar
4930: 73 65 2d 3e 64 62 2c 20 52 29 3b 0a 20 20 7d 0a  se->db, R);.  }.
4940: 23 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f  #if SELECTTRACE_
4950: 45 4e 41 42 4c 45 44 0a 20 20 2f 2a 20 50 6f 70  ENABLED.  /* Pop
4960: 75 6c 61 74 65 20 74 68 65 20 53 65 6c 65 63 74  ulate the Select
4970: 2e 7a 53 65 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  .zSelName[] stri
4980: 6e 67 20 74 68 61 74 20 69 73 20 75 73 65 64 20  ng that is used 
4990: 74 6f 20 68 65 6c 70 20 77 69 74 68 0a 20 20 2a  to help with.  *
49a0: 2a 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20  * query planner 
49b0: 64 65 62 75 67 67 69 6e 67 2c 20 74 6f 20 64 69  debugging, to di
49c0: 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77  fferentiate betw
49d0: 65 65 6e 20 6d 75 6c 74 69 70 6c 65 20 53 65 6c  een multiple Sel
49e0: 65 63 74 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ect.  ** objects
49f0: 20 69 6e 20 61 20 63 6f 6d 70 6c 65 78 20 71 75   in a complex qu
4a00: 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ery..  **.  ** I
4a10: 66 20 74 68 65 20 53 45 4c 45 43 54 20 6b 65 79  f the SELECT key
4a20: 77 6f 72 64 20 69 73 20 69 6d 6d 65 64 69 61 74  word is immediat
4a30: 65 6c 79 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ely followed by 
4a40: 61 20 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  a C-style commen
4a50: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 65 78 74 72  t.  ** then extr
4a60: 61 63 74 20 74 68 65 20 66 69 72 73 74 20 66 65  act the first fe
4a70: 77 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63  w alphanumeric c
4a80: 68 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 77  haracters from w
4a90: 69 74 68 69 6e 20 74 68 61 74 0a 20 20 2a 2a 20  ithin that.  ** 
4aa0: 63 6f 6d 6d 65 6e 74 20 74 6f 20 62 65 20 74 68  comment to be th
4ab0: 65 20 7a 53 65 6c 4e 61 6d 65 20 76 61 6c 75 65  e zSelName value
4ac0: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  .  Otherwise, th
4ad0: 65 20 6c 61 62 65 6c 20 69 73 20 23 4e 20 77 68  e label is #N wh
4ae0: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69  ere.  ** is an i
4af0: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 69  nteger that is i
4b00: 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
4b10: 65 61 63 68 20 53 45 4c 45 43 54 20 73 74 61 74  each SELECT stat
4b20: 65 6d 65 6e 74 20 73 65 65 6e 2e 0a 20 20 2a 2f  ement seen..  */
4b30: 0a 20 20 69 66 28 20 41 21 3d 30 20 29 7b 0a 20  .  if( A!=0 ){. 
4b40: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4b50: 20 3d 20 73 2e 7a 2b 36 3b 0a 20 20 20 20 69 6e   = s.z+6;.    in
4b60: 74 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t i;.    sqlite3
4b70: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
4b80: 28 41 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 41  (A->zSelName), A
4b90: 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 22 23 25 64 22  ->zSelName,"#%d"
4ba0: 2c 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65  ,++pParse->nSele
4bb0: 63 74 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ct);.    while( 
4bc0: 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b  z[0]==' ' ) z++;
4bd0: 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
4be0: 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20  /' && z[1]=='*' 
4bf0: 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b  ){.      z += 2;
4c00: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 5b  .      while( z[
4c10: 30 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20  0]==' ' ) z++;. 
4c20: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71       for(i=0; sq
4c30: 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 5b 69  lite3Isalnum(z[i
4c40: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); i++){}.     
4c50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
4c60: 66 28 73 69 7a 65 6f 66 28 41 2d 3e 7a 53 65 6c  f(sizeof(A->zSel
4c70: 4e 61 6d 65 29 2c 20 41 2d 3e 7a 53 65 6c 4e 61  Name), A->zSelNa
4c80: 6d 65 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a  me, "%.*s", i, z
4c90: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
4ca0: 64 69 66 20 2f 2a 20 53 45 4c 45 43 54 52 41 43  dif /* SELECTRAC
4cb0: 45 5f 45 4e 41 42 4c 45 44 20 2a 2f 0a 7d 0a 6f  E_ENABLED */.}.o
4cc0: 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20  neselect(A) ::= 
4cd0: 76 61 6c 75 65 73 28 41 29 2e 0a 0a 25 74 79 70  values(A)...%typ
4ce0: 65 20 76 61 6c 75 65 73 20 7b 53 65 6c 65 63 74  e values {Select
4cf0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 76  *}.%destructor v
4d00: 61 6c 75 65 73 20 7b 73 71 6c 69 74 65 33 53 65  alues {sqlite3Se
4d10: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
4d20: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 76 61 6c  e->db, $$);}.val
4d30: 75 65 73 28 41 29 20 3a 3a 3d 20 56 41 4c 55 45  ues(A) ::= VALUE
4d40: 53 20 4c 50 20 6e 65 78 70 72 6c 69 73 74 28 58  S LP nexprlist(X
4d50: 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73 71  ) RP. {.  A = sq
4d60: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70  lite3SelectNew(p
4d70: 50 61 72 73 65 2c 58 2c 30 2c 30 2c 30 2c 30 2c  Parse,X,0,0,0,0,
4d80: 30 2c 53 46 5f 56 61 6c 75 65 73 2c 30 29 3b 0a  0,SF_Values,0);.
4d90: 7d 0a 76 61 6c 75 65 73 28 41 29 20 3a 3a 3d 20  }.values(A) ::= 
4da0: 76 61 6c 75 65 73 28 41 29 20 43 4f 4d 4d 41 20  values(A) COMMA 
4db0: 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52  LP exprlist(Y) R
4dc0: 50 2e 20 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  P. {.  Select *p
4dd0: 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 20 3d 20  Right, *pLeft = 
4de0: 41 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71  A;.  pRight = sq
4df0: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70  lite3SelectNew(p
4e00: 50 61 72 73 65 2c 59 2c 30 2c 30 2c 30 2c 30 2c  Parse,Y,0,0,0,0,
4e10: 30 2c 53 46 5f 56 61 6c 75 65 73 7c 53 46 5f 4d  0,SF_Values|SF_M
4e20: 75 6c 74 69 56 61 6c 75 65 2c 30 29 3b 0a 20 20  ultiValue,0);.  
4e30: 69 66 28 20 41 4c 57 41 59 53 28 70 4c 65 66 74  if( ALWAYS(pLeft
4e40: 29 20 29 20 70 4c 65 66 74 2d 3e 73 65 6c 46 6c  ) ) pLeft->selFl
4e50: 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69  ags &= ~SF_Multi
4e60: 56 61 6c 75 65 3b 0a 20 20 69 66 28 20 70 52 69  Value;.  if( pRi
4e70: 67 68 74 20 29 7b 0a 20 20 20 20 70 52 69 67 68  ght ){.    pRigh
4e80: 74 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a  t->op = TK_ALL;.
4e90: 20 20 20 20 70 52 69 67 68 74 2d 3e 70 50 72 69      pRight->pPri
4ea0: 6f 72 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 20  or = pLeft;.    
4eb0: 41 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 7d 65  A = pRight;.  }e
4ec0: 6c 73 65 7b 0a 20 20 20 20 41 20 3d 20 70 4c 65  lse{.    A = pLe
4ed0: 66 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 54 68  ft;.  }.}..// Th
4ee0: 65 20 22 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e  e "distinct" non
4ef0: 74 65 72 6d 69 6e 61 6c 20 69 73 20 74 72 75 65  terminal is true
4f00: 20 28 31 29 20 69 66 20 74 68 65 20 44 49 53 54   (1) if the DIST
4f10: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 0a  INCT keyword is.
4f20: 2f 2f 20 70 72 65 73 65 6e 74 20 61 6e 64 20 66  // present and f
4f30: 61 6c 73 65 20 28 30 29 20 69 66 20 69 74 20 69  alse (0) if it i
4f40: 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20  s not..//.%type 
4f50: 64 69 73 74 69 6e 63 74 20 7b 69 6e 74 7d 0a 64  distinct {int}.d
4f60: 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44  istinct(A) ::= D
4f70: 49 53 54 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20  ISTINCT.   {A = 
4f80: 53 46 5f 44 69 73 74 69 6e 63 74 3b 7d 0a 64 69  SF_Distinct;}.di
4f90: 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 41 4c  stinct(A) ::= AL
4fa0: 4c 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53  L.        {A = S
4fb0: 46 5f 41 6c 6c 3b 7d 0a 64 69 73 74 69 6e 63 74  F_All;}.distinct
4fc0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
4fd0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f      {A = 0;}..//
4fe0: 20 73 65 6c 63 6f 6c 6c 69 73 74 20 69 73 20 61   selcollist is a
4ff0: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
5000: 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 74 6f  ions that are to
5010: 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
5020: 72 6e 0a 2f 2f 20 76 61 6c 75 65 73 20 6f 66 20  rn.// values of 
5030: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
5040: 6d 65 6e 74 2e 20 20 54 68 65 20 22 2a 22 20 69  ment.  The "*" i
5050: 6e 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b  n statements lik
5060: 65 0a 2f 2f 20 22 53 45 4c 45 43 54 20 2a 20 46  e.// "SELECT * F
5070: 52 4f 4d 20 2e 2e 2e 22 20 69 73 20 65 6e 63 6f  ROM ..." is enco
5080: 64 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c  ded as a special
5090: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
50a0: 20 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f 66   an.// opcode of
50b0: 20 54 4b 5f 41 53 54 45 52 49 53 4b 2e 0a 2f 2f   TK_ASTERISK..//
50c0: 0a 25 74 79 70 65 20 73 65 6c 63 6f 6c 6c 69 73  .%type selcollis
50d0: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
50e0: 65 73 74 72 75 63 74 6f 72 20 73 65 6c 63 6f 6c  estructor selcol
50f0: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70  list {sqlite3Exp
5100: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
5110: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74  se->db, $$);}.%t
5120: 79 70 65 20 73 63 6c 70 20 7b 45 78 70 72 4c 69  ype sclp {ExprLi
5130: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
5140: 20 73 63 6c 70 20 7b 73 71 6c 69 74 65 33 45 78   sclp {sqlite3Ex
5150: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
5160: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 73  rse->db, $$);}.s
5170: 63 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c 63 6f  clp(A) ::= selco
5180: 6c 6c 69 73 74 28 41 29 20 43 4f 4d 4d 41 2e 0a  llist(A) COMMA..
5190: 73 63 6c 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20  sclp(A) ::= .   
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
51c0: 3d 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74  = 0;}.selcollist
51d0: 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 41 29 20  (A) ::= sclp(A) 
51e0: 73 63 61 6e 70 74 28 42 29 20 65 78 70 72 28 58  scanpt(B) expr(X
51f0: 29 20 73 63 61 6e 70 74 28 5a 29 20 61 73 28 59  ) scanpt(Z) as(Y
5200: 29 2e 20 20 20 20 20 7b 0a 20 20 20 41 20 3d 20  ).     {.   A = 
5210: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5220: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 41 2c  ppend(pParse, A,
5230: 20 58 29 3b 0a 20 20 20 69 66 28 20 59 2e 6e 3e   X);.   if( Y.n>
5240: 30 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c  0 ) sqlite3ExprL
5250: 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
5260: 65 2c 20 41 2c 20 26 59 2c 20 31 29 3b 0a 20 20  e, A, &Y, 1);.  
5270: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5280: 53 65 74 53 70 61 6e 28 70 50 61 72 73 65 2c 41  SetSpan(pParse,A
5290: 2c 42 2c 5a 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c  ,B,Z);.}.selcoll
52a0: 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28  ist(A) ::= sclp(
52b0: 41 29 20 73 63 61 6e 70 74 20 53 54 41 52 2e 20  A) scanpt STAR. 
52c0: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
52d0: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
52e0: 2d 3e 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53  ->db, TK_ASTERIS
52f0: 4b 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c  K, 0);.  A = sql
5300: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
5310: 6e 64 28 70 50 61 72 73 65 2c 20 41 2c 20 70 29  nd(pParse, A, p)
5320: 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41  ;.}.selcollist(A
5330: 29 20 3a 3a 3d 20 73 63 6c 70 28 41 29 20 73 63  ) ::= sclp(A) sc
5340: 61 6e 70 74 20 6e 6d 28 58 29 20 44 4f 54 20 53  anpt nm(X) DOT S
5350: 54 41 52 2e 20 7b 0a 20 20 45 78 70 72 20 2a 70  TAR. {.  Expr *p
5360: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50  Right = sqlite3P
5370: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
5380: 41 53 54 45 52 49 53 4b 2c 20 30 2c 20 30 29 3b  ASTERISK, 0, 0);
5390: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
53a0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
53b0: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  c(pParse->db, TK
53c0: 5f 49 44 2c 20 26 58 2c 20 31 29 3b 0a 20 20 45  _ID, &X, 1);.  E
53d0: 78 70 72 20 2a 70 44 6f 74 20 3d 20 73 71 6c 69  xpr *pDot = sqli
53e0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
53f0: 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
5400: 70 52 69 67 68 74 29 3b 0a 20 20 41 20 3d 20 73  pRight);.  A = s
5410: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
5420: 70 65 6e 64 28 70 50 61 72 73 65 2c 41 2c 20 70  pend(pParse,A, p
5430: 44 6f 74 29 3b 0a 7d 0a 0a 2f 2f 20 41 6e 20 6f  Dot);.}..// An o
5440: 70 74 69 6f 6e 20 22 41 53 20 3c 69 64 3e 22 20  ption "AS <id>" 
5450: 70 68 72 61 73 65 20 74 68 61 74 20 63 61 6e 20  phrase that can 
5460: 66 6f 6c 6c 6f 77 20 6f 6e 65 20 6f 66 20 74 68  follow one of th
5470: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  e expressions th
5480: 61 74 0a 2f 2f 20 64 65 66 69 6e 65 20 74 68 65  at.// define the
5490: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 6f 72 20   result set, or 
54a0: 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
54b0: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
54c0: 61 75 73 65 2e 0a 2f 2f 0a 25 74 79 70 65 20 61  ause..//.%type a
54d0: 73 20 7b 54 6f 6b 65 6e 7d 0a 61 73 28 58 29 20  s {Token}.as(X) 
54e0: 3a 3a 3d 20 41 53 20 6e 6d 28 59 29 2e 20 20 20  ::= AS nm(Y).   
54f0: 20 7b 58 20 3d 20 59 3b 7d 0a 61 73 28 58 29 20   {X = Y;}.as(X) 
5500: 3a 3a 3d 20 69 64 73 28 58 29 2e 0a 61 73 28 58  ::= ids(X)..as(X
5510: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
5520: 20 20 20 7b 58 2e 6e 20 3d 20 30 3b 20 58 2e 7a     {X.n = 0; X.z
5530: 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 73   = 0;}...%type s
5540: 65 6c 74 61 62 6c 69 73 74 20 7b 53 72 63 4c 69  eltablist {SrcLi
5550: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
5560: 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 73 71 6c   seltablist {sql
5570: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
5580: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
5590: 29 3b 7d 0a 25 74 79 70 65 20 73 74 6c 5f 70 72  );}.%type stl_pr
55a0: 65 66 69 78 20 7b 53 72 63 4c 69 73 74 2a 7d 0a  efix {SrcList*}.
55b0: 25 64 65 73 74 72 75 63 74 6f 72 20 73 74 6c 5f  %destructor stl_
55c0: 70 72 65 66 69 78 20 7b 73 71 6c 69 74 65 33 53  prefix {sqlite3S
55d0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  rcListDelete(pPa
55e0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
55f0: 74 79 70 65 20 66 72 6f 6d 20 7b 53 72 63 4c 69  type from {SrcLi
5600: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
5610: 20 66 72 6f 6d 20 7b 73 71 6c 69 74 65 33 53 72   from {sqlite3Sr
5620: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  cListDelete(pPar
5630: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 2f  se->db, $$);}../
5640: 2f 20 41 20 63 6f 6d 70 6c 65 74 65 20 46 52 4f  / A complete FRO
5650: 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 66 72 6f  M clause..//.fro
5660: 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  m(A) ::= .      
5670: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
5680: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
5690: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
56a0: 69 7a 65 6f 66 28 2a 41 29 29 3b 7d 0a 66 72 6f  izeof(*A));}.fro
56b0: 6d 28 41 29 20 3a 3a 3d 20 46 52 4f 4d 20 73 65  m(A) ::= FROM se
56c0: 6c 74 61 62 6c 69 73 74 28 58 29 2e 20 7b 0a 20  ltablist(X). {. 
56d0: 20 41 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65   A = X;.  sqlite
56e0: 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69  3SrcListShiftJoi
56f0: 6e 54 79 70 65 28 41 29 3b 0a 7d 0a 0a 2f 2f 20  nType(A);.}..// 
5700: 22 73 65 6c 74 61 62 6c 69 73 74 22 20 69 73 20  "seltablist" is 
5710: 61 20 22 53 65 6c 65 63 74 20 54 61 62 6c 65 20  a "Select Table 
5720: 4c 69 73 74 22 20 2d 20 74 68 65 20 63 6f 6e 74  List" - the cont
5730: 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
5740: 63 6c 61 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53  clause.// in a S
5750: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
5760: 20 20 22 73 74 6c 5f 70 72 65 66 69 78 22 20 69    "stl_prefix" i
5770: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
5780: 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f  is list..//.stl_
5790: 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 73 65  prefix(A) ::= se
57a0: 6c 74 61 62 6c 69 73 74 28 41 29 20 6a 6f 69 6e  ltablist(A) join
57b0: 6f 70 28 59 29 2e 20 20 20 20 7b 0a 20 20 20 69  op(Y).    {.   i
57c0: 66 28 20 41 4c 57 41 59 53 28 41 20 26 26 20 41  f( ALWAYS(A && A
57d0: 2d 3e 6e 53 72 63 3e 30 29 20 29 20 41 2d 3e 61  ->nSrc>0) ) A->a
57e0: 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e 66 67 2e 6a  [A->nSrc-1].fg.j
57f0: 6f 69 6e 74 79 70 65 20 3d 20 28 75 38 29 59 3b  ointype = (u8)Y;
5800: 0a 7d 0a 73 74 6c 5f 70 72 65 66 69 78 28 41 29  .}.stl_prefix(A)
5810: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 74 61 62   {A = 0;}.seltab
5840: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f  list(A) ::= stl_
5850: 70 72 65 66 69 78 28 41 29 20 6e 6d 28 59 29 20  prefix(A) nm(Y) 
5860: 64 62 6e 6d 28 44 29 20 61 73 28 5a 29 20 69 6e  dbnm(D) as(Z) in
5870: 64 65 78 65 64 5f 6f 70 74 28 49 29 0a 20 20 20  dexed_opt(I).   
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
5890: 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f  n_opt(N) using_o
58a0: 70 74 28 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pt(U). {.  A = s
58b0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
58c0: 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
58d0: 73 65 2c 41 2c 26 59 2c 26 44 2c 26 5a 2c 30 2c  se,A,&Y,&D,&Z,0,
58e0: 4e 2c 55 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  N,U);.  sqlite3S
58f0: 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
5900: 70 50 61 72 73 65 2c 20 41 2c 20 26 49 29 3b 0a  pParse, A, &I);.
5910: 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20  }.seltablist(A) 
5920: 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 41  ::= stl_prefix(A
5930: 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 44 29 20  ) nm(Y) dbnm(D) 
5940: 4c 50 20 65 78 70 72 6c 69 73 74 28 45 29 20 52  LP exprlist(E) R
5950: 50 20 61 73 28 5a 29 0a 20 20 20 20 20 20 20 20  P as(Z).        
5960: 20 20 20 20 20 20 20 20 20 20 6f 6e 5f 6f 70 74            on_opt
5970: 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29  (N) using_opt(U)
5980: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
5990: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
59a0: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c  omTerm(pParse,A,
59b0: 26 59 2c 26 44 2c 26 5a 2c 30 2c 4e 2c 55 29 3b  &Y,&D,&Z,0,N,U);
59c0: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
59d0: 74 46 75 6e 63 41 72 67 73 28 70 50 61 72 73 65  tFuncArgs(pParse
59e0: 2c 20 41 2c 20 45 29 3b 0a 7d 0a 25 69 66 6e 64  , A, E);.}.%ifnd
59f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
5a00: 55 42 51 55 45 52 59 0a 20 20 73 65 6c 74 61 62  UBQUERY.  seltab
5a10: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f  list(A) ::= stl_
5a20: 70 72 65 66 69 78 28 41 29 20 4c 50 20 73 65 6c  prefix(A) LP sel
5a30: 65 63 74 28 53 29 20 52 50 0a 20 20 20 20 20 20  ect(S) RP.      
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
5a50: 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73  (Z) on_opt(N) us
5a60: 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20  ing_opt(U). {.  
5a70: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63    A = sqlite3Src
5a80: 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
5a90: 72 6d 28 70 50 61 72 73 65 2c 41 2c 30 2c 30 2c  rm(pParse,A,0,0,
5aa0: 26 5a 2c 53 2c 4e 2c 55 29 3b 0a 20 20 7d 0a 20  &Z,S,N,U);.  }. 
5ab0: 20 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a   seltablist(A) :
5ac0: 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 41 29  := stl_prefix(A)
5ad0: 20 4c 50 20 73 65 6c 74 61 62 6c 69 73 74 28 46   LP seltablist(F
5ae0: 29 20 52 50 0a 20 20 20 20 20 20 20 20 20 20 20  ) RP.           
5af0: 20 20 20 20 20 20 20 20 20 61 73 28 5a 29 20 6f           as(Z) o
5b00: 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f  n_opt(N) using_o
5b10: 70 74 28 55 29 2e 20 7b 0a 20 20 20 20 69 66 28  pt(U). {.    if(
5b20: 20 41 3d 3d 30 20 26 26 20 5a 2e 6e 3d 3d 30 20   A==0 && Z.n==0 
5b30: 26 26 20 4e 3d 3d 30 20 26 26 20 55 3d 3d 30 20  && N==0 && U==0 
5b40: 29 7b 0a 20 20 20 20 20 20 41 20 3d 20 46 3b 0a  ){.      A = F;.
5b50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 46 2d      }else if( F-
5b60: 3e 6e 53 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20  >nSrc==1 ){.    
5b70: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63    A = sqlite3Src
5b80: 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
5b90: 72 6d 28 70 50 61 72 73 65 2c 41 2c 30 2c 30 2c  rm(pParse,A,0,0,
5ba0: 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20 20 20 20  &Z,0,N,U);.     
5bb0: 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20   if( A ){.      
5bc0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5bd0: 5f 69 74 65 6d 20 2a 70 4e 65 77 20 3d 20 26 41  _item *pNew = &A
5be0: 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[A->nSrc-1];.
5bf0: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
5c00: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
5c10: 64 20 3d 20 46 2d 3e 61 3b 0a 20 20 20 20 20 20  d = F->a;.      
5c20: 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20    pNew->zName = 
5c30: 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pOld->zName;.   
5c40: 20 20 20 20 20 70 4e 65 77 2d 3e 7a 44 61 74 61       pNew->zData
5c50: 62 61 73 65 20 3d 20 70 4f 6c 64 2d 3e 7a 44 61  base = pOld->zDa
5c60: 74 61 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20  tabase;.        
5c70: 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20  pNew->pSelect = 
5c80: 70 4f 6c 64 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  pOld->pSelect;. 
5c90: 20 20 20 20 20 20 20 70 4f 6c 64 2d 3e 7a 4e 61         pOld->zNa
5ca0: 6d 65 20 3d 20 70 4f 6c 64 2d 3e 7a 44 61 74 61  me = pOld->zData
5cb0: 62 61 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  base = 0;.      
5cc0: 20 20 70 4f 6c 64 2d 3e 70 53 65 6c 65 63 74 20    pOld->pSelect 
5cd0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
5ce0: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
5cf0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
5d00: 64 62 2c 20 46 29 3b 0a 20 20 20 20 7d 65 6c 73  db, F);.    }els
5d10: 65 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  e{.      Select 
5d20: 2a 70 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20  *pSubquery;.    
5d30: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
5d40: 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 46 29  ShiftJoinType(F)
5d50: 3b 0a 20 20 20 20 20 20 70 53 75 62 71 75 65 72  ;.      pSubquer
5d60: 79 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  y = sqlite3Selec
5d70: 74 4e 65 77 28 70 50 61 72 73 65 2c 30 2c 46 2c  tNew(pParse,0,F,
5d80: 30 2c 30 2c 30 2c 30 2c 53 46 5f 4e 65 73 74 65  0,0,0,0,SF_Neste
5d90: 64 46 72 6f 6d 2c 30 29 3b 0a 20 20 20 20 20 20  dFrom,0);.      
5da0: 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  A = sqlite3SrcLi
5db0: 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
5dc0: 28 70 50 61 72 73 65 2c 41 2c 30 2c 30 2c 26 5a  (pParse,A,0,0,&Z
5dd0: 2c 70 53 75 62 71 75 65 72 79 2c 4e 2c 55 29 3b  ,pSubquery,N,U);
5de0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 25 65 6e 64 69  .    }.  }.%endi
5df0: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  f  SQLITE_OMIT_S
5e00: 55 42 51 55 45 52 59 0a 0a 25 74 79 70 65 20 64  UBQUERY..%type d
5e10: 62 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 64 62 6e 6d  bnm {Token}.dbnm
5e20: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
5e30: 20 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 30     {A.z=0; A.n=0
5e40: 3b 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 44  ;}.dbnm(A) ::= D
5e50: 4f 54 20 6e 6d 28 58 29 2e 20 7b 41 20 3d 20 58  OT nm(X). {A = X
5e60: 3b 7d 0a 0a 25 74 79 70 65 20 66 75 6c 6c 6e 61  ;}..%type fullna
5e70: 6d 65 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  me {SrcList*}.%d
5e80: 65 73 74 72 75 63 74 6f 72 20 66 75 6c 6c 6e 61  estructor fullna
5e90: 6d 65 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69  me {sqlite3SrcLi
5ea0: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
5eb0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 66 75 6c 6c 6e  >db, $$);}.fulln
5ec0: 61 6d 65 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29  ame(A) ::= nm(X)
5ed0: 2e 20 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69  .  .   {A = sqli
5ee0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
5ef0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 58  (pParse->db,0,&X
5f00: 2c 30 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69  ,0); /*A-overwri
5f10: 74 65 73 2d 58 2a 2f 7d 0a 66 75 6c 6c 6e 61 6d  tes-X*/}.fullnam
5f20: 65 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44  e(A) ::= nm(X) D
5f30: 4f 54 20 6e 6d 28 59 29 2e 20 20 0a 20 20 20 7b  OT nm(Y).  .   {
5f40: 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  A = sqlite3SrcLi
5f50: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d  stAppend(pParse-
5f60: 3e 64 62 2c 30 2c 26 58 2c 26 59 29 3b 20 2f 2a  >db,0,&X,&Y); /*
5f70: 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f  A-overwrites-X*/
5f80: 7d 0a 0a 25 74 79 70 65 20 78 66 75 6c 6c 6e 61  }..%type xfullna
5f90: 6d 65 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  me {SrcList*}.%d
5fa0: 65 73 74 72 75 63 74 6f 72 20 78 66 75 6c 6c 6e  estructor xfulln
5fb0: 61 6d 65 20 7b 73 71 6c 69 74 65 33 53 72 63 4c  ame {sqlite3SrcL
5fc0: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
5fd0: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 78 66 75 6c  ->db, $$);}.xful
5fe0: 6c 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 6e 6d 28  lname(A) ::= nm(
5ff0: 58 29 2e 20 20 0a 20 20 20 7b 41 20 3d 20 73 71  X).  .   {A = sq
6000: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
6010: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c  nd(pParse->db,0,
6020: 26 58 2c 30 29 3b 20 2f 2a 41 2d 6f 76 65 72 77  &X,0); /*A-overw
6030: 72 69 74 65 73 2d 58 2a 2f 7d 0a 78 66 75 6c 6c  rites-X*/}.xfull
6040: 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 6e 6d 28 58  name(A) ::= nm(X
6050: 29 20 44 4f 54 20 6e 6d 28 59 29 2e 20 20 0a 20  ) DOT nm(Y).  . 
6060: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 53 72    {A = sqlite3Sr
6070: 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  cListAppend(pPar
6080: 73 65 2d 3e 64 62 2c 30 2c 26 58 2c 26 59 29 3b  se->db,0,&X,&Y);
6090: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
60a0: 58 2a 2f 7d 0a 78 66 75 6c 6c 6e 61 6d 65 28 41  X*/}.xfullname(A
60b0: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f 54 20  ) ::= nm(X) DOT 
60c0: 6e 6d 28 59 29 20 41 53 20 6e 6d 28 5a 29 2e 20  nm(Y) AS nm(Z). 
60d0: 20 7b 0a 20 20 20 41 20 3d 20 73 71 6c 69 74 65   {.   A = sqlite
60e0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
60f0: 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 58 2c 26  Parse->db,0,&X,&
6100: 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  Y); /*A-overwrit
6110: 65 73 2d 58 2a 2f 0a 20 20 20 69 66 28 20 41 20  es-X*/.   if( A 
6120: 29 20 41 2d 3e 61 5b 30 5d 2e 7a 41 6c 69 61 73  ) A->a[0].zAlias
6130: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
6140: 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
6150: 64 62 2c 20 26 5a 29 3b 0a 7d 0a 78 66 75 6c 6c  db, &Z);.}.xfull
6160: 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 6e 6d 28 58  name(A) ::= nm(X
6170: 29 20 41 53 20 6e 6d 28 5a 29 2e 20 7b 20 20 0a  ) AS nm(Z). {  .
6180: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 72     A = sqlite3Sr
6190: 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  cListAppend(pPar
61a0: 73 65 2d 3e 64 62 2c 30 2c 26 58 2c 30 29 3b 20  se->db,0,&X,0); 
61b0: 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58  /*A-overwrites-X
61c0: 2a 2f 0a 20 20 20 69 66 28 20 41 20 29 20 41 2d  */.   if( A ) A-
61d0: 3e 61 5b 30 5d 2e 7a 41 6c 69 61 73 20 3d 20 73  >a[0].zAlias = s
61e0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
61f0: 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
6200: 26 5a 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 6a 6f  &Z);.}..%type jo
6210: 69 6e 6f 70 20 7b 69 6e 74 7d 0a 6a 6f 69 6e 6f  inop {int}.joino
6220: 70 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 7c 4a  p(X) ::= COMMA|J
6230: 4f 49 4e 2e 20 20 20 20 20 20 20 20 20 20 20 20  OIN.            
6240: 20 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52    { X = JT_INNER
6250: 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a  ; }.joinop(X) ::
6260: 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f 49  = JOIN_KW(A) JOI
6270: 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N..             
6280: 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69 74 65       {X = sqlite
6290: 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65  3JoinType(pParse
62a0: 2c 26 41 2c 30 2c 30 29 3b 20 20 2f 2a 58 2d 6f  ,&A,0,0);  /*X-o
62b0: 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d 0a 6a  verwrites-A*/}.j
62c0: 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f 49  oinop(X) ::= JOI
62d0: 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 4a 4f  N_KW(A) nm(B) JO
62e0: 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN..            
62f0: 20 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69 74        {X = sqlit
6300: 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73  e3JoinType(pPars
6310: 65 2c 26 41 2c 26 42 2c 30 29 3b 20 2f 2a 58 2d  e,&A,&B,0); /*X-
6320: 6f 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d 0a  overwrites-A*/}.
6330: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f  joinop(X) ::= JO
6340: 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 6e  IN_KW(A) nm(B) n
6350: 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20 20  m(C) JOIN..     
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 20               {X 
6370: 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  = sqlite3JoinTyp
6380: 65 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c 26  e(pParse,&A,&B,&
6390: 43 29 3b 2f 2a 58 2d 6f 76 65 72 77 72 69 74 65  C);/*X-overwrite
63a0: 73 2d 41 2a 2f 7d 0a 0a 2f 2f 20 54 68 65 72 65  s-A*/}..// There
63b0: 20 69 73 20 61 20 70 61 72 73 69 6e 67 20 61 62   is a parsing ab
63c0: 69 67 75 69 74 79 20 69 6e 20 61 6e 20 75 70 73  iguity in an ups
63d0: 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ert statement th
63e0: 61 74 20 75 73 65 73 20 61 0a 2f 2f 20 53 45 4c  at uses a.// SEL
63f0: 45 43 54 20 6f 6e 20 74 68 65 20 52 48 53 20 6f  ECT on the RHS o
6400: 66 20 61 20 74 68 65 20 49 4e 53 45 52 54 3a 0a  f a the INSERT:.
6410: 2f 2f 0a 2f 2f 20 20 20 20 20 20 49 4e 53 45 52  //.//      INSER
6420: 54 20 49 4e 54 4f 20 74 61 62 20 53 45 4c 45 43  T INTO tab SELEC
6430: 54 20 2a 20 46 52 4f 4d 20 61 61 61 20 4a 4f 49  T * FROM aaa JOI
6440: 4e 20 62 62 62 20 4f 4e 20 43 4f 4e 46 4c 49 43  N bbb ON CONFLIC
6450: 54 20 2e 2e 2e 0a 2f 2f 20 20 20 20 20 20 20 20  T ....//        
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 68 65 72 65 20 2d 2d 2d 2d 5e 5e 0a 2f 2f 0a 2f  here ----^^.//./
6490: 2f 20 57 68 65 6e 20 74 68 65 20 4f 4e 20 74 6f  / When the ON to
64a0: 6b 65 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ken is encounter
64b0: 65 64 2c 20 74 68 65 20 70 61 72 73 65 72 20 64  ed, the parser d
64c0: 6f 65 73 20 6e 6f 74 20 6b 6e 6f 77 20 69 66 20  oes not know if 
64d0: 69 74 20 69 73 0a 2f 2f 20 74 68 65 20 62 65 67  it is.// the beg
64e0: 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 4f 4e 20  inning of an ON 
64f0: 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 2c  CONFLICT clause,
6500: 20 6f 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   or the beginnin
6510: 67 20 6f 66 20 61 6e 20 4f 4e 0a 2f 2f 20 63 6c  g of an ON.// cl
6520: 61 75 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  ause associated 
6530: 77 69 74 68 20 74 68 65 20 4a 4f 49 4e 2e 20 20  with the JOIN.  
6540: 54 68 65 20 63 6f 6e 66 6c 69 63 74 20 69 73 20  The conflict is 
6550: 72 65 73 6f 6c 76 65 64 20 69 6e 20 66 61 76 6f  resolved in favo
6560: 72 0a 2f 2f 20 6f 66 20 74 68 65 20 4a 4f 49 4e  r.// of the JOIN
6570: 2e 20 20 49 66 20 61 6e 20 4f 4e 20 43 4f 4e 46  .  If an ON CONF
6580: 4c 49 43 54 20 63 6c 61 75 73 65 20 69 73 20 69  LICT clause is i
6590: 6e 74 65 6e 64 65 64 2c 20 69 6e 73 65 72 74 20  ntended, insert 
65a0: 61 20 64 75 6d 6d 79 0a 2f 2f 20 57 48 45 52 45  a dummy.// WHERE
65b0: 20 63 6c 61 75 73 65 20 69 6e 20 62 65 74 77 65   clause in betwe
65c0: 65 6e 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2f  en, like this:./
65d0: 2f 0a 2f 2f 20 20 20 20 20 20 49 4e 53 45 52 54  /.//      INSERT
65e0: 20 49 4e 54 4f 20 74 61 62 20 53 45 4c 45 43 54   INTO tab SELECT
65f0: 20 2a 20 46 52 4f 4d 20 61 61 61 20 4a 4f 49 4e   * FROM aaa JOIN
6600: 20 62 62 62 20 57 48 45 52 45 20 74 72 75 65 20   bbb WHERE true 
6610: 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 2e 2e 2e 0a  ON CONFLICT ....
6620: 2f 2f 0a 2f 2f 20 54 68 65 20 5b 41 4e 44 5d 20  //.// The [AND] 
6630: 61 6e 64 20 5b 4f 52 5d 20 70 72 65 63 65 64 65  and [OR] precede
6640: 6e 63 65 20 6d 61 72 6b 73 20 69 6e 20 74 68 65  nce marks in the
6650: 20 72 75 6c 65 73 20 66 6f 72 20 6f 6e 5f 6f 70   rules for on_op
6660: 74 20 63 61 75 73 65 20 74 68 65 0a 2f 2f 20 4f  t cause the.// O
6670: 4e 20 69 6e 20 74 68 69 73 20 63 6f 6e 74 65 78  N in this contex
6680: 74 20 74 6f 20 61 6c 77 61 79 73 20 62 65 20 69  t to always be i
6690: 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 62 65  nterpreted as be
66a0: 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 4a  longing to the J
66b0: 4f 49 4e 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f 6e  OIN..//.%type on
66c0: 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65  _opt {Expr*}.%de
66d0: 73 74 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74 20  structor on_opt 
66e0: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
66f0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
6700: 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a  $);}.on_opt(N) :
6710: 3a 3d 20 4f 4e 20 65 78 70 72 28 45 29 2e 20 20  := ON expr(E).  
6720: 7b 4e 20 3d 20 45 3b 7d 0a 6f 6e 5f 6f 70 74 28  {N = E;}.on_opt(
6730: 4e 29 20 3a 3a 3d 20 2e 20 20 20 20 20 5b 4f 52  N) ::= .     [OR
6740: 5d 20 20 20 7b 4e 20 3d 20 30 3b 7d 0a 0a 2f 2f  ]   {N = 0;}..//
6750: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20   Note that this 
6760: 62 6c 6f 63 6b 20 61 62 75 73 65 73 20 74 68 65  block abuses the
6770: 20 54 6f 6b 65 6e 20 74 79 70 65 20 6a 75 73 74   Token type just
6780: 20 61 20 6c 69 74 74 6c 65 2e 20 49 66 20 74 68   a little. If th
6790: 65 72 65 20 69 73 0a 2f 2f 20 6e 6f 20 22 49 4e  ere is.// no "IN
67a0: 44 45 58 45 44 20 42 59 22 20 63 6c 61 75 73 65  DEXED BY" clause
67b0: 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 74  , the returned t
67c0: 6f 6b 65 6e 20 69 73 20 65 6d 70 74 79 20 28 7a  oken is empty (z
67d0: 3d 3d 30 20 26 26 20 6e 3d 3d 30 29 2e 20 49 66  ==0 && n==0). If
67e0: 0a 2f 2f 20 74 68 65 72 65 20 69 73 20 61 6e 20  .// there is an 
67f0: 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
6800: 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65  e, then the toke
6810: 6e 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 61  n is populated a
6820: 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2c 0a 2f 2f  s per normal,.//
6830: 20 77 69 74 68 20 7a 20 70 6f 69 6e 74 69 6e 67   with z pointing
6840: 20 74 6f 20 74 68 65 20 74 6f 6b 65 6e 20 64 61   to the token da
6850: 74 61 20 61 6e 64 20 6e 20 63 6f 6e 74 61 69 6e  ta and n contain
6860: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
6870: 66 20 62 79 74 65 73 0a 2f 2f 20 69 6e 20 74 68  f bytes.// in th
6880: 65 20 74 6f 6b 65 6e 2e 0a 2f 2f 0a 2f 2f 20 49  e token..//.// I
6890: 66 20 74 68 65 72 65 20 69 73 20 61 20 22 4e 4f  f there is a "NO
68a0: 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
68b0: 65 2c 20 74 68 65 6e 20 28 7a 3d 3d 30 20 26 26  e, then (z==0 &&
68c0: 20 6e 3d 3d 31 29 2c 20 77 68 69 63 68 20 69 73   n==1), which is
68d0: 20 0a 2f 2f 20 6e 6f 72 6d 61 6c 6c 79 20 69 6c   .// normally il
68e0: 6c 65 67 61 6c 2e 20 54 68 65 20 73 71 6c 69 74  legal. The sqlit
68f0: 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64  e3SrcListIndexed
6900: 42 79 28 29 20 66 75 6e 63 74 69 6f 6e 20 0a 2f  By() function ./
6910: 2f 20 72 65 63 6f 67 6e 69 7a 65 73 20 61 6e 64  / recognizes and
6920: 20 69 6e 74 65 72 70 72 65 74 73 20 74 68 69 73   interprets this
6930: 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
6940: 73 65 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 6e 64  se..//.%type ind
6950: 65 78 65 64 5f 6f 70 74 20 7b 54 6f 6b 65 6e 7d  exed_opt {Token}
6960: 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28 41 29 20  .indexed_opt(A) 
6970: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
6980: 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e        {A.z=0; A.
6990: 6e 3d 30 3b 7d 0a 69 6e 64 65 78 65 64 5f 6f 70  n=0;}.indexed_op
69a0: 74 28 41 29 20 3a 3a 3d 20 49 4e 44 45 58 45 44  t(A) ::= INDEXED
69b0: 20 42 59 20 6e 6d 28 58 29 2e 20 7b 41 20 3d 20   BY nm(X). {A = 
69c0: 58 3b 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28  X;}.indexed_opt(
69d0: 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e 44 45 58  A) ::= NOT INDEX
69e0: 45 44 2e 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b  ED.      {A.z=0;
69f0: 20 41 2e 6e 3d 31 3b 7d 0a 0a 25 74 79 70 65 20   A.n=1;}..%type 
6a00: 75 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73  using_opt {IdLis
6a10: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
6a20: 75 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74  using_opt {sqlit
6a30: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
6a40: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
6a50: 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29 20 3a 3a  .using_opt(U) ::
6a60: 3d 20 55 53 49 4e 47 20 4c 50 20 69 64 6c 69 73  = USING LP idlis
6a70: 74 28 4c 29 20 52 50 2e 20 20 7b 55 20 3d 20 4c  t(L) RP.  {U = L
6a80: 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29 20  ;}.using_opt(U) 
6a90: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 55 20               {U 
6ab0: 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 6f 72  = 0;}...%type or
6ac0: 64 65 72 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c  derby_opt {ExprL
6ad0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
6ae0: 72 20 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b 73  r orderby_opt {s
6af0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
6b00: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
6b10: 20 24 24 29 3b 7d 0a 0a 2f 2f 20 74 68 65 20 73   $$);}..// the s
6b20: 6f 72 74 6c 69 73 74 20 6e 6f 6e 2d 74 65 72 6d  ortlist non-term
6b30: 69 6e 61 6c 20 73 74 6f 72 65 73 20 61 20 6c 69  inal stores a li
6b40: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
6b50: 20 77 68 65 72 65 20 65 61 63 68 0a 2f 2f 20 65   where each.// e
6b60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 70 74  xpression is opt
6b70: 69 6f 6e 61 6c 6c 79 20 66 6f 6c 6c 6f 77 65 64  ionally followed
6b80: 20 62 79 20 41 53 43 20 6f 72 20 44 45 53 43 20   by ASC or DESC 
6b90: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 0a  to indicate the.
6ba0: 2f 2f 20 73 6f 72 74 20 6f 72 64 65 72 2e 0a 2f  // sort order../
6bb0: 2f 0a 25 74 79 70 65 20 73 6f 72 74 6c 69 73 74  /.%type sortlist
6bc0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
6bd0: 73 74 72 75 63 74 6f 72 20 73 6f 72 74 6c 69 73  structor sortlis
6be0: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
6bf0: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
6c00: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 6f 72 64 65  >db, $$);}..orde
6c10: 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  rby_opt(A) ::= .
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c30: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
6c40: 3b 7d 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28 41  ;}.orderby_opt(A
6c50: 29 20 3a 3a 3d 20 4f 52 44 45 52 20 42 59 20 73  ) ::= ORDER BY s
6c60: 6f 72 74 6c 69 73 74 28 58 29 2e 20 20 20 20 20  ortlist(X).     
6c70: 20 7b 41 20 3d 20 58 3b 7d 0a 73 6f 72 74 6c 69   {A = X;}.sortli
6c80: 73 74 28 41 29 20 3a 3a 3d 20 73 6f 72 74 6c 69  st(A) ::= sortli
6c90: 73 74 28 41 29 20 43 4f 4d 4d 41 20 65 78 70 72  st(A) COMMA expr
6ca0: 28 59 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29  (Y) sortorder(Z)
6cb0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
6cc0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6cd0: 70 50 61 72 73 65 2c 41 2c 59 29 3b 0a 20 20 73  pParse,A,Y);.  s
6ce0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
6cf0: 74 53 6f 72 74 4f 72 64 65 72 28 41 2c 5a 29 3b  tSortOrder(A,Z);
6d00: 0a 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a  .}.sortlist(A) :
6d10: 3a 3d 20 65 78 70 72 28 59 29 20 73 6f 72 74 6f  := expr(Y) sorto
6d20: 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d  rder(Z). {.  A =
6d30: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6d40: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c  Append(pParse,0,
6d50: 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  Y); /*A-overwrit
6d60: 65 73 2d 59 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es-Y*/.  sqlite3
6d70: 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f  ExprListSetSortO
6d80: 72 64 65 72 28 41 2c 5a 29 3b 0a 7d 0a 0a 25 74  rder(A,Z);.}..%t
6d90: 79 70 65 20 73 6f 72 74 6f 72 64 65 72 20 7b 69  ype sortorder {i
6da0: 6e 74 7d 0a 0a 73 6f 72 74 6f 72 64 65 72 28 41  nt}..sortorder(A
6db0: 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20 20 20  ) ::= ASC.      
6dc0: 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45       {A = SQLITE
6dd0: 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74 6f 72  _SO_ASC;}.sortor
6de0: 64 65 72 28 41 29 20 3a 3a 3d 20 44 45 53 43 2e  der(A) ::= DESC.
6df0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53            {A = S
6e00: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 7d 0a  QLITE_SO_DESC;}.
6e10: 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d  sortorder(A) ::=
6e20: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6e30: 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 55  {A = SQLITE_SO_U
6e40: 4e 44 45 46 49 4e 45 44 3b 7d 0a 0a 25 74 79 70  NDEFINED;}..%typ
6e50: 65 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 45  e groupby_opt {E
6e60: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
6e70: 75 63 74 6f 72 20 67 72 6f 75 70 62 79 5f 6f 70  uctor groupby_op
6e80: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
6e90: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
6ea0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 67 72 6f 75 70  >db, $$);}.group
6eb0: 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  by_opt(A) ::= . 
6ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ed0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 67 72       {A = 0;}.gr
6ee0: 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d  oupby_opt(A) ::=
6ef0: 20 47 52 4f 55 50 20 42 59 20 6e 65 78 70 72 6c   GROUP BY nexprl
6f00: 69 73 74 28 58 29 2e 20 7b 41 20 3d 20 58 3b 7d  ist(X). {A = X;}
6f10: 0a 0a 25 74 79 70 65 20 68 61 76 69 6e 67 5f 6f  ..%type having_o
6f20: 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pt {Expr*}.%dest
6f30: 72 75 63 74 6f 72 20 68 61 76 69 6e 67 5f 6f 70  ructor having_op
6f40: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  t {sqlite3ExprDe
6f50: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
6f60: 20 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70   $$);}.having_op
6f70: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
6f80: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
6f90: 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41 29  ;}.having_opt(A)
6fa0: 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78 70 72   ::= HAVING expr
6fb0: 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  (X).  {A = X;}..
6fc0: 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74 20  %type limit_opt 
6fd0: 7b 45 78 70 72 2a 7d 0a 0a 2f 2f 20 54 68 65 20  {Expr*}..// The 
6fe0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 6c  destructor for l
6ff0: 69 6d 69 74 5f 6f 70 74 20 77 69 6c 6c 20 6e 65  imit_opt will ne
7000: 76 65 72 20 66 69 72 65 20 69 6e 20 74 68 65 20  ver fire in the 
7010: 63 75 72 72 65 6e 74 20 67 72 61 6d 6d 61 72 2e  current grammar.
7020: 0a 2f 2f 20 54 68 65 20 6c 69 6d 69 74 5f 6f 70  .// The limit_op
7030: 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 6f  t non-terminal o
7040: 6e 6c 79 20 6f 63 63 75 72 73 20 61 74 20 74 68  nly occurs at th
7050: 65 20 65 6e 64 20 6f 66 20 61 20 73 69 6e 67 6c  e end of a singl
7060: 65 20 70 72 6f 64 75 63 74 69 6f 6e 0a 2f 2f 20  e production.// 
7070: 72 75 6c 65 20 66 6f 72 20 53 45 4c 45 43 54 20  rule for SELECT 
7080: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 41 73 20  statements.  As 
7090: 73 6f 6f 6e 20 61 73 20 74 68 65 20 72 75 6c 65  soon as the rule
70a0: 20 74 68 61 74 20 63 72 65 61 74 65 20 74 68 65   that create the
70b0: 20 0a 2f 2f 20 6c 69 6d 69 74 5f 6f 70 74 20 6e   .// limit_opt n
70c0: 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 72 65 64 75  on-terminal redu
70d0: 63 65 73 2c 20 74 68 65 20 53 45 4c 45 43 54 20  ces, the SELECT 
70e0: 73 74 61 74 65 6d 65 6e 74 20 72 75 6c 65 20 77  statement rule w
70f0: 69 6c 6c 20 61 6c 73 6f 0a 2f 2f 20 72 65 64 75  ill also.// redu
7100: 63 65 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73  ce.  So there is
7110: 20 6e 65 76 65 72 20 61 20 6c 69 6d 69 74 5f 6f   never a limit_o
7120: 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  pt non-terminal 
7130: 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 0a 2f 2f  on the stack .//
7140: 20 65 78 63 65 70 74 20 61 73 20 61 20 74 72 61   except as a tra
7150: 6e 73 69 65 6e 74 2e 20 20 53 6f 20 74 68 65 72  nsient.  So ther
7160: 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68  e is never anyth
7170: 69 6e 67 20 74 6f 20 64 65 73 74 72 6f 79 2e 0a  ing to destroy..
7180: 2f 2f 0a 2f 2f 25 64 65 73 74 72 75 63 74 6f 72  //.//%destructor
7190: 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 73 71 6c 69   limit_opt {sqli
71a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
71b0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
71c0: 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  limit_opt(A) ::=
71d0: 20 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b   .       {A = 0;
71e0: 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a  }.limit_opt(A) :
71f0: 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58 29  := LIMIT expr(X)
7200: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
7210: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
7220: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7230: 72 73 65 2c 54 4b 5f 4c 49 4d 49 54 2c 58 2c 30  rse,TK_LIMIT,X,0
7240: 29 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  );}.limit_opt(A)
7250: 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28   ::= LIMIT expr(
7260: 58 29 20 4f 46 46 53 45 54 20 65 78 70 72 28 59  X) OFFSET expr(Y
7270: 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ). .            
7280: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
7290: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
72a0: 50 61 72 73 65 2c 54 4b 5f 4c 49 4d 49 54 2c 58  Parse,TK_LIMIT,X
72b0: 2c 59 29 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28  ,Y);}.limit_opt(
72c0: 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70  A) ::= LIMIT exp
72d0: 72 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28  r(X) COMMA expr(
72e0: 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20  Y). .           
72f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
7300: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
7310: 70 50 61 72 73 65 2c 54 4b 5f 4c 49 4d 49 54 2c  pParse,TK_LIMIT,
7320: 59 2c 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  Y,X);}..////////
7330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7340: 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54 45 20 73  /// The DELETE s
7350: 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f  tatement ///////
7360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7370: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65 66  //////.//.%ifdef
7380: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
7390: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
73a0: 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 20  IT.cmd ::= with 
73b0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 78 66 75 6c  DELETE FROM xful
73c0: 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64  lname(X) indexed
73d0: 5f 6f 70 74 28 49 29 20 77 68 65 72 65 5f 6f 70  _opt(I) where_op
73e0: 74 28 57 29 20 0a 20 20 20 20 20 20 20 20 6f 72  t(W) .        or
73f0: 64 65 72 62 79 5f 6f 70 74 28 4f 29 20 6c 69 6d  derby_opt(O) lim
7400: 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 73  it_opt(L). {.  s
7410: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
7420: 65 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 58  exedBy(pParse, X
7430: 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69 74 65 33  , &I);.  sqlite3
7440: 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73  DeleteFrom(pPars
7450: 65 2c 58 2c 57 2c 4f 2c 4c 29 3b 0a 7d 0a 25 65  e,X,W,O,L);.}.%e
7460: 6e 64 69 66 0a 25 69 66 6e 64 65 66 20 53 51 4c  ndif.%ifndef SQL
7470: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
7480: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a 63  E_DELETE_LIMIT.c
7490: 6d 64 20 3a 3a 3d 20 77 69 74 68 20 44 45 4c 45  md ::= with DELE
74a0: 54 45 20 46 52 4f 4d 20 78 66 75 6c 6c 6e 61 6d  TE FROM xfullnam
74b0: 65 28 58 29 20 69 6e 64 65 78 65 64 5f 6f 70 74  e(X) indexed_opt
74c0: 28 49 29 20 77 68 65 72 65 5f 6f 70 74 28 57 29  (I) where_opt(W)
74d0: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  . {.  sqlite3Src
74e0: 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 70 50  ListIndexedBy(pP
74f0: 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20  arse, X, &I);.  
7500: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46 72 6f  sqlite3DeleteFro
7510: 6d 28 70 50 61 72 73 65 2c 58 2c 57 2c 30 2c 30  m(pParse,X,W,0,0
7520: 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25 74 79  );.}.%endif..%ty
7530: 70 65 20 77 68 65 72 65 5f 6f 70 74 20 7b 45 78  pe where_opt {Ex
7540: 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pr*}.%destructor
7550: 20 77 68 65 72 65 5f 6f 70 74 20 7b 73 71 6c 69   where_opt {sqli
7560: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
7570: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
7580: 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a  .where_opt(A) ::
7590: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
75a0: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
75b0: 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d  where_opt(A) ::=
75c0: 20 57 48 45 52 45 20 65 78 70 72 28 58 29 2e 20   WHERE expr(X). 
75d0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a        {A = X;}..
75e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
75f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 55  ////////// The U
7600: 50 44 41 54 45 20 63 6f 6d 6d 61 6e 64 20 2f 2f  PDATE command //
7610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
7630: 2f 0a 25 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.%ifdef SQLITE_
7640: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
7650: 4c 45 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a  LETE_LIMIT.cmd :
7660: 3a 3d 20 77 69 74 68 20 55 50 44 41 54 45 20 6f  := with UPDATE o
7670: 72 63 6f 6e 66 28 52 29 20 78 66 75 6c 6c 6e 61  rconf(R) xfullna
7680: 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f 6f 70  me(X) indexed_op
7690: 74 28 49 29 20 53 45 54 20 73 65 74 6c 69 73 74  t(I) SET setlist
76a0: 28 59 29 0a 20 20 20 20 20 20 20 20 77 68 65 72  (Y).        wher
76b0: 65 5f 6f 70 74 28 57 29 20 6f 72 64 65 72 62 79  e_opt(W) orderby
76c0: 5f 6f 70 74 28 4f 29 20 6c 69 6d 69 74 5f 6f 70  _opt(O) limit_op
76d0: 74 28 4c 29 2e 20 20 7b 0a 20 20 73 71 6c 69 74  t(L).  {.  sqlit
76e0: 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64  e3SrcListIndexed
76f0: 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20 26 49  By(pParse, X, &I
7700: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7710: 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28  ListCheckLength(
7720: 70 50 61 72 73 65 2c 59 2c 22 73 65 74 20 6c 69  pParse,Y,"set li
7730: 73 74 22 29 3b 20 0a 20 20 73 71 6c 69 74 65 33  st"); .  sqlite3
7740: 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 58 2c  Update(pParse,X,
7750: 59 2c 57 2c 52 2c 4f 2c 4c 2c 30 29 3b 0a 7d 0a  Y,W,R,O,L,0);.}.
7760: 25 65 6e 64 69 66 0a 25 69 66 6e 64 65 66 20 53  %endif.%ifndef S
7770: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44  QLITE_ENABLE_UPD
7780: 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54  ATE_DELETE_LIMIT
7790: 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 20 55 50  .cmd ::= with UP
77a0: 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20 78  DATE orconf(R) x
77b0: 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65  fullname(X) inde
77c0: 78 65 64 5f 6f 70 74 28 49 29 20 53 45 54 20 73  xed_opt(I) SET s
77d0: 65 74 6c 69 73 74 28 59 29 0a 20 20 20 20 20 20  etlist(Y).      
77e0: 20 20 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20    where_opt(W). 
77f0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c   {.  sqlite3SrcL
7800: 69 73 74 49 6e 64 65 78 65 64 42 79 28 70 50 61  istIndexedBy(pPa
7810: 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73  rse, X, &I);.  s
7820: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
7830: 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
7840: 2c 59 2c 22 73 65 74 20 6c 69 73 74 22 29 3b 20  ,Y,"set list"); 
7850: 0a 20 20 73 71 6c 69 74 65 33 55 70 64 61 74 65  .  sqlite3Update
7860: 28 70 50 61 72 73 65 2c 58 2c 59 2c 57 2c 52 2c  (pParse,X,Y,W,R,
7870: 30 2c 30 2c 30 29 3b 0a 7d 0a 25 65 6e 64 69 66  0,0,0);.}.%endif
7880: 0a 0a 25 74 79 70 65 20 73 65 74 6c 69 73 74 20  ..%type setlist 
7890: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
78a0: 74 72 75 63 74 6f 72 20 73 65 74 6c 69 73 74 20  tructor setlist 
78b0: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
78c0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
78d0: 62 2c 20 24 24 29 3b 7d 0a 0a 73 65 74 6c 69 73  b, $$);}..setlis
78e0: 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c 69 73 74  t(A) ::= setlist
78f0: 28 41 29 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20  (A) COMMA nm(X) 
7900: 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20  EQ expr(Y). {.  
7910: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
7920: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
7930: 2c 20 41 2c 20 59 29 3b 0a 20 20 73 71 6c 69 74  , A, Y);.  sqlit
7940: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
7950: 65 28 70 50 61 72 73 65 2c 20 41 2c 20 26 58 2c  e(pParse, A, &X,
7960: 20 31 29 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41   1);.}.setlist(A
7970: 29 20 3a 3a 3d 20 73 65 74 6c 69 73 74 28 41 29  ) ::= setlist(A)
7980: 20 43 4f 4d 4d 41 20 4c 50 20 69 64 6c 69 73 74   COMMA LP idlist
7990: 28 58 29 20 52 50 20 45 51 20 65 78 70 72 28 59  (X) RP EQ expr(Y
79a0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
79b0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
79c0: 56 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 41  Vector(pParse, A
79d0: 2c 20 58 2c 20 59 29 3b 0a 7d 0a 73 65 74 6c 69  , X, Y);.}.setli
79e0: 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20  st(A) ::= nm(X) 
79f0: 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20  EQ expr(Y). {.  
7a00: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
7a10: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
7a20: 2c 20 30 2c 20 59 29 3b 0a 20 20 73 71 6c 69 74  , 0, Y);.  sqlit
7a30: 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d  e3ExprListSetNam
7a40: 65 28 70 50 61 72 73 65 2c 20 41 2c 20 26 58 2c  e(pParse, A, &X,
7a50: 20 31 29 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41   1);.}.setlist(A
7a60: 29 20 3a 3a 3d 20 4c 50 20 69 64 6c 69 73 74 28  ) ::= LP idlist(
7a70: 58 29 20 52 50 20 45 51 20 65 78 70 72 28 59 29  X) RP EQ expr(Y)
7a80: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
7a90: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56  3ExprListAppendV
7aa0: 65 63 74 6f 72 28 70 50 61 72 73 65 2c 20 30 2c  ector(pParse, 0,
7ab0: 20 58 2c 20 59 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f   X, Y);.}../////
7ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ad0: 2f 2f 2f 2f 2f 20 54 68 65 20 49 4e 53 45 52 54  ///// The INSERT
7ae0: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
7af0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
7b10: 64 20 3a 3a 3d 20 77 69 74 68 20 69 6e 73 65 72  d ::= with inser
7b20: 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 78 66  t_cmd(R) INTO xf
7b30: 75 6c 6c 6e 61 6d 65 28 58 29 20 69 64 6c 69 73  ullname(X) idlis
7b40: 74 5f 6f 70 74 28 46 29 20 73 65 6c 65 63 74 28  t_opt(F) select(
7b50: 53 29 0a 20 20 20 20 20 20 20 20 75 70 73 65 72  S).        upser
7b60: 74 28 55 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  t(U). {.  sqlite
7b70: 33 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20  3Insert(pParse, 
7b80: 58 2c 20 53 2c 20 46 2c 20 52 2c 20 55 29 3b 0a  X, S, F, R, U);.
7b90: 7d 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 20 69  }.cmd ::= with i
7ba0: 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54  nsert_cmd(R) INT
7bb0: 4f 20 78 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69  O xfullname(X) i
7bc0: 64 6c 69 73 74 5f 6f 70 74 28 46 29 20 44 45 46  dlist_opt(F) DEF
7bd0: 41 55 4c 54 20 56 41 4c 55 45 53 2e 0a 7b 0a 20  AULT VALUES..{. 
7be0: 20 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70   sqlite3Insert(p
7bf0: 50 61 72 73 65 2c 20 58 2c 20 30 2c 20 46 2c 20  Parse, X, 0, F, 
7c00: 52 2c 20 30 29 3b 0a 7d 0a 0a 25 74 79 70 65 20  R, 0);.}..%type 
7c10: 75 70 73 65 72 74 20 7b 55 70 73 65 72 74 2a 7d  upsert {Upsert*}
7c20: 0a 0a 2f 2f 20 42 65 63 61 75 73 65 20 75 70 73  ..// Because ups
7c30: 65 72 74 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  ert only occurs 
7c40: 61 74 20 74 68 65 20 74 69 70 20 65 6e 64 20 6f  at the tip end o
7c50: 66 20 74 68 65 20 49 4e 53 45 52 54 20 72 75 6c  f the INSERT rul
7c60: 65 20 66 6f 72 20 63 6d 64 2c 0a 2f 2f 20 74 68  e for cmd,.// th
7c70: 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 20 63  ere is never a c
7c80: 61 73 65 20 77 68 65 72 65 20 74 68 65 20 76 61  ase where the va
7c90: 6c 75 65 20 6f 66 20 74 68 65 20 75 70 73 65 72  lue of the upser
7ca0: 74 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 6e  t pointer will n
7cb0: 6f 74 0a 2f 2f 20 62 65 20 64 65 73 74 72 6f 79  ot.// be destroy
7cc0: 65 64 20 62 79 20 74 68 65 20 63 6d 64 20 61 63  ed by the cmd ac
7cd0: 74 69 6f 6e 2e 20 20 53 6f 20 63 6f 6d 6d 65 6e  tion.  So commen
7ce0: 74 2d 6f 75 74 20 74 68 65 20 64 65 73 74 72 75  t-out the destru
7cf0: 63 74 6f 72 20 74 6f 0a 2f 2f 20 61 76 6f 69 64  ctor to.// avoid
7d00: 20 75 6e 72 65 61 63 68 61 62 6c 65 20 63 6f 64   unreachable cod
7d10: 65 2e 0a 2f 2f 25 64 65 73 74 72 75 63 74 6f 72  e..//%destructor
7d20: 20 75 70 73 65 72 74 20 7b 73 71 6c 69 74 65 33   upsert {sqlite3
7d30: 55 70 73 65 72 74 44 65 6c 65 74 65 28 70 50 61  UpsertDelete(pPa
7d40: 72 73 65 2d 3e 64 62 2c 24 24 29 3b 7d 0a 75 70  rse->db,$$);}.up
7d50: 73 65 72 74 28 41 29 20 3a 3a 3d 20 2e 20 7b 20  sert(A) ::= . { 
7d60: 41 20 3d 20 30 3b 20 7d 0a 75 70 73 65 72 74 28  A = 0; }.upsert(
7d70: 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49  A) ::= ON CONFLI
7d80: 43 54 20 4c 50 20 73 6f 72 74 6c 69 73 74 28 54  CT LP sortlist(T
7d90: 29 20 52 50 20 77 68 65 72 65 5f 6f 70 74 28 54  ) RP where_opt(T
7da0: 57 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  W).             
7db0: 20 44 4f 20 55 50 44 41 54 45 20 53 45 54 20 73   DO UPDATE SET s
7dc0: 65 74 6c 69 73 74 28 5a 29 20 77 68 65 72 65 5f  etlist(Z) where_
7dd0: 6f 70 74 28 57 29 2e 0a 20 20 20 20 20 20 20 20  opt(W)..        
7de0: 20 20 20 20 20 20 7b 20 41 20 3d 20 73 71 6c 69        { A = sqli
7df0: 74 65 33 55 70 73 65 72 74 4e 65 77 28 70 50 61  te3UpsertNew(pPa
7e00: 72 73 65 2d 3e 64 62 2c 54 2c 54 57 2c 5a 2c 57  rse->db,T,TW,Z,W
7e10: 29 3b 7d 0a 75 70 73 65 72 74 28 41 29 20 3a 3a  );}.upsert(A) ::
7e20: 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 4c 50  = ON CONFLICT LP
7e30: 20 73 6f 72 74 6c 69 73 74 28 54 29 20 52 50 20   sortlist(T) RP 
7e40: 77 68 65 72 65 5f 6f 70 74 28 54 57 29 20 44 4f  where_opt(TW) DO
7e50: 20 4e 4f 54 48 49 4e 47 2e 0a 20 20 20 20 20 20   NOTHING..      
7e60: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 73 71          { A = sq
7e70: 6c 69 74 65 33 55 70 73 65 72 74 4e 65 77 28 70  lite3UpsertNew(p
7e80: 50 61 72 73 65 2d 3e 64 62 2c 54 2c 54 57 2c 30  Parse->db,T,TW,0
7e90: 2c 30 29 3b 20 7d 0a 75 70 73 65 72 74 28 41 29  ,0); }.upsert(A)
7ea0: 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   ::= ON CONFLICT
7eb0: 20 44 4f 20 4e 4f 54 48 49 4e 47 2e 0a 20 20 20   DO NOTHING..   
7ec0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
7ed0: 20 73 71 6c 69 74 65 33 55 70 73 65 72 74 4e 65   sqlite3UpsertNe
7ee0: 77 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 30  w(pParse->db,0,0
7ef0: 2c 30 2c 30 29 3b 20 7d 0a 0a 25 74 79 70 65 20  ,0,0); }..%type 
7f00: 69 6e 73 65 72 74 5f 63 6d 64 20 7b 69 6e 74 7d  insert_cmd {int}
7f10: 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 20 3a  .insert_cmd(A) :
7f20: 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63 6f 6e 66  := INSERT orconf
7f30: 28 52 29 2e 20 20 20 7b 41 20 3d 20 52 3b 7d 0a  (R).   {A = R;}.
7f40: 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 20 3a 3a  insert_cmd(A) ::
7f50: 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20 20 20  = REPLACE.      
7f60: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 52 65        {A = OE_Re
7f70: 70 6c 61 63 65 3b 7d 0a 0a 25 74 79 70 65 20 69  place;}..%type i
7f80: 64 6c 69 73 74 5f 6f 70 74 20 7b 49 64 4c 69 73  dlist_opt {IdLis
7f90: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
7fa0: 69 64 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69  idlist_opt {sqli
7fb0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
7fc0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
7fd0: 7d 0a 25 74 79 70 65 20 69 64 6c 69 73 74 20 7b  }.%type idlist {
7fe0: 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  IdList*}.%destru
7ff0: 63 74 6f 72 20 69 64 6c 69 73 74 20 7b 73 71 6c  ctor idlist {sql
8000: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
8010: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
8020: 3b 7d 0a 0a 69 64 6c 69 73 74 5f 6f 70 74 28 41  ;}..idlist_opt(A
8030: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
8040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
8050: 20 3d 20 30 3b 7d 0a 69 64 6c 69 73 74 5f 6f 70   = 0;}.idlist_op
8060: 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 64 6c 69  t(A) ::= LP idli
8070: 73 74 28 58 29 20 52 50 2e 20 20 20 20 7b 41 20  st(X) RP.    {A 
8080: 3d 20 58 3b 7d 0a 69 64 6c 69 73 74 28 41 29 20  = X;}.idlist(A) 
8090: 3a 3a 3d 20 69 64 6c 69 73 74 28 41 29 20 43 4f  ::= idlist(A) CO
80a0: 4d 4d 41 20 6e 6d 28 59 29 2e 0a 20 20 20 20 7b  MMA nm(Y)..    {
80b0: 41 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  A = sqlite3IdLis
80c0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e  tAppend(pParse->
80d0: 64 62 2c 41 2c 26 59 29 3b 7d 0a 69 64 6c 69 73  db,A,&Y);}.idlis
80e0: 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59 29 2e 0a  t(A) ::= nm(Y)..
80f0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
8100: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  IdListAppend(pPa
8110: 72 73 65 2d 3e 64 62 2c 30 2c 26 59 29 3b 20 2f  rse->db,0,&Y); /
8120: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 59 2a  *A-overwrites-Y*
8130: 2f 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  /}..////////////
8140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
8150: 45 78 70 72 65 73 73 69 6f 6e 20 50 72 6f 63 65  Expression Proce
8160: 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ssing //////////
8170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8180: 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65 20 65 78  ///.//..%type ex
8190: 70 72 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pr {Expr*}.%dest
81a0: 72 75 63 74 6f 72 20 65 78 70 72 20 7b 73 71 6c  ructor expr {sql
81b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
81c0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
81d0: 0a 25 74 79 70 65 20 74 65 72 6d 20 7b 45 78 70  .%type term {Exp
81e0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
81f0: 74 65 72 6d 20 7b 73 71 6c 69 74 65 33 45 78 70  term {sqlite3Exp
8200: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
8210: 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 69 6e 63 6c  db, $$);}..%incl
8220: 75 64 65 20 7b 0a 0a 20 20 2f 2a 20 43 6f 6e 73  ude {..  /* Cons
8230: 74 72 75 63 74 20 61 20 6e 65 77 20 45 78 70 72  truct a new Expr
8240: 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20 61 20 73   object from a s
8250: 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
8260: 2e 20 20 55 73 65 20 74 68 65 0a 20 20 2a 2a 20  .  Use the.  ** 
8270: 6e 65 77 20 45 78 70 72 20 74 6f 20 70 6f 70 75  new Expr to popu
8280: 6c 61 74 65 20 70 4f 75 74 2e 20 20 53 65 74 20  late pOut.  Set 
8290: 74 68 65 20 73 70 61 6e 20 6f 66 20 70 4f 75 74  the span of pOut
82a0: 20 74 6f 20 62 65 20 74 68 65 20 69 64 65 6e 74   to be the ident
82b0: 69 66 69 65 72 0a 20 20 2a 2a 20 74 68 61 74 20  ifier.  ** that 
82c0: 63 72 65 61 74 65 64 20 74 68 65 20 65 78 70 72  created the expr
82d0: 65 73 73 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73  ession..  */.  s
82e0: 74 61 74 69 63 20 45 78 70 72 20 2a 74 6f 6b 65  tatic Expr *toke
82f0: 6e 45 78 70 72 28 50 61 72 73 65 20 2a 70 50 61  nExpr(Parse *pPa
8300: 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b  rse, int op, Tok
8310: 65 6e 20 74 29 7b 0a 20 20 20 20 45 78 70 72 20  en t){.    Expr 
8320: 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  *p = sqlite3DbMa
8330: 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 73 65  llocRawNN(pParse
8340: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70  ->db, sizeof(Exp
8350: 72 29 2b 74 2e 6e 2b 31 29 3b 0a 20 20 20 20 69  r)+t.n+1);.    i
8360: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 6d 65  f( p ){.      me
8370: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
8380: 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 20 20  f(Expr));.      
8390: 70 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a  p->op = (u8)op;.
83a0: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
83b0: 20 45 50 5f 4c 65 61 66 3b 0a 20 20 20 20 20 20   EP_Leaf;.      
83c0: 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a 20 20  p->iAgg = -1;.  
83d0: 20 20 20 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20      p->u.zToken 
83e0: 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d 3b 0a  = (char*)&p[1];.
83f0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e        memcpy(p->
8400: 75 2e 7a 54 6f 6b 65 6e 2c 20 74 2e 7a 2c 20 74  u.zToken, t.z, t
8410: 2e 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e  .n);.      p->u.
8420: 7a 54 6f 6b 65 6e 5b 74 2e 6e 5d 20 3d 20 30 3b  zToken[t.n] = 0;
8430: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
8440: 65 33 49 73 71 75 6f 74 65 28 70 2d 3e 75 2e 7a  e3Isquote(p->u.z
8450: 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 20 20  Token[0]) ){.   
8460: 20 20 20 20 20 69 66 28 20 70 2d 3e 75 2e 7a 54       if( p->u.zT
8470: 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 20 70  oken[0]=='"' ) p
8480: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62  ->flags |= EP_Db
8490: 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20  lQuoted;.       
84a0: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
84b0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  p->u.zToken);.  
84c0: 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
84d0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
84e0: 30 0a 20 20 20 20 20 20 70 2d 3e 6e 48 65 69 67  0.      p->nHeig
84f0: 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 20 20  ht = 1;.#endif  
8500: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
8510: 6e 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72  n p;.  }.}..expr
8520: 28 41 29 20 3a 3a 3d 20 74 65 72 6d 28 41 29 2e  (A) ::= term(A).
8530: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 20  .expr(A) ::= LP 
8540: 65 78 70 72 28 58 29 20 52 50 2e 20 7b 41 20 3d  expr(X) RP. {A =
8550: 20 58 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d   X;}.expr(A) ::=
8560: 20 69 64 28 58 29 2e 20 20 20 20 20 20 20 20 20   id(X).         
8570: 20 7b 41 3d 74 6f 6b 65 6e 45 78 70 72 28 70 50   {A=tokenExpr(pP
8580: 61 72 73 65 2c 54 4b 5f 49 44 2c 58 29 3b 20 2f  arse,TK_ID,X); /
8590: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a  *A-overwrites-X*
85a0: 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4a  /}.expr(A) ::= J
85b0: 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20 20 7b  OIN_KW(X).     {
85c0: 41 3d 74 6f 6b 65 6e 45 78 70 72 28 70 50 61 72  A=tokenExpr(pPar
85d0: 73 65 2c 54 4b 5f 49 44 2c 58 29 3b 20 2f 2a 41  se,TK_ID,X); /*A
85e0: 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 7d  -overwrites-X*/}
85f0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28  .expr(A) ::= nm(
8600: 58 29 20 44 4f 54 20 6e 6d 28 59 29 2e 20 7b 0a  X) DOT nm(Y). {.
8610: 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20    Expr *temp1 = 
8620: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
8630: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
8640: 49 44 2c 20 26 58 2c 20 31 29 3b 0a 20 20 45 78  ID, &X, 1);.  Ex
8650: 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69  pr *temp2 = sqli
8660: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61  te3ExprAlloc(pPa
8670: 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c 20  rse->db, TK_ID, 
8680: 26 59 2c 20 31 29 3b 0a 20 20 41 20 3d 20 73 71  &Y, 1);.  A = sq
8690: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
86a0: 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31  e, TK_DOT, temp1
86b0: 2c 20 74 65 6d 70 32 29 3b 0a 7d 0a 65 78 70 72  , temp2);.}.expr
86c0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f  (A) ::= nm(X) DO
86d0: 54 20 6e 6d 28 59 29 20 44 4f 54 20 6e 6d 28 5a  T nm(Y) DOT nm(Z
86e0: 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d  ). {.  Expr *tem
86f0: 70 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  p1 = sqlite3Expr
8700: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
8710: 2c 20 54 4b 5f 49 44 2c 20 26 58 2c 20 31 29 3b  , TK_ID, &X, 1);
8720: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20 3d  .  Expr *temp2 =
8730: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
8740: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  c(pParse->db, TK
8750: 5f 49 44 2c 20 26 59 2c 20 31 29 3b 0a 20 20 45  _ID, &Y, 1);.  E
8760: 78 70 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c  xpr *temp3 = sql
8770: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
8780: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c  arse->db, TK_ID,
8790: 20 26 5a 2c 20 31 29 3b 0a 20 20 45 78 70 72 20   &Z, 1);.  Expr 
87a0: 2a 74 65 6d 70 34 20 3d 20 73 71 6c 69 74 65 33  *temp4 = sqlite3
87b0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
87c0: 5f 44 4f 54 2c 20 74 65 6d 70 32 2c 20 74 65 6d  _DOT, temp2, tem
87d0: 70 33 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74  p3);.  A = sqlit
87e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
87f0: 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74  TK_DOT, temp1, t
8800: 65 6d 70 34 29 3b 0a 7d 0a 74 65 72 6d 28 41 29  emp4);.}.term(A)
8810: 20 3a 3a 3d 20 4e 55 4c 4c 7c 46 4c 4f 41 54 7c   ::= NULL|FLOAT|
8820: 42 4c 4f 42 28 58 29 2e 20 7b 41 3d 74 6f 6b 65  BLOB(X). {A=toke
8830: 6e 45 78 70 72 28 70 50 61 72 73 65 2c 40 58 2c  nExpr(pParse,@X,
8840: 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  X); /*A-overwrit
8850: 65 73 2d 58 2a 2f 7d 0a 74 65 72 6d 28 41 29 20  es-X*/}.term(A) 
8860: 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20  ::= STRING(X).  
8870: 20 20 20 20 20 20 20 20 7b 41 3d 74 6f 6b 65 6e          {A=token
8880: 45 78 70 72 28 70 50 61 72 73 65 2c 40 58 2c 58  Expr(pParse,@X,X
8890: 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  ); /*A-overwrite
88a0: 73 2d 58 2a 2f 7d 0a 74 65 72 6d 28 41 29 20 3a  s-X*/}.term(A) :
88b0: 3a 3d 20 49 4e 54 45 47 45 52 28 58 29 2e 20 7b  := INTEGER(X). {
88c0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
88d0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
88e0: 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
88f0: 26 58 2c 20 31 29 3b 0a 7d 0a 65 78 70 72 28 41  &X, 1);.}.expr(A
8900: 29 20 3a 3a 3d 20 56 41 52 49 41 42 4c 45 28 58  ) ::= VARIABLE(X
8910: 29 2e 20 20 20 20 20 7b 0a 20 20 69 66 28 20 21  ).     {.  if( !
8920: 28 58 2e 7a 5b 30 5d 3d 3d 27 23 27 20 26 26 20  (X.z[0]=='#' && 
8930: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 58  sqlite3Isdigit(X
8940: 2e 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 75  .z[1])) ){.    u
8950: 33 32 20 6e 20 3d 20 58 2e 6e 3b 0a 20 20 20 20  32 n = X.n;.    
8960: 41 20 3d 20 74 6f 6b 65 6e 45 78 70 72 28 70 50  A = tokenExpr(pP
8970: 61 72 73 65 2c 20 54 4b 5f 56 41 52 49 41 42 4c  arse, TK_VARIABL
8980: 45 2c 20 58 29 3b 0a 20 20 20 20 73 71 6c 69 74  E, X);.    sqlit
8990: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
89a0: 75 6d 62 65 72 28 70 50 61 72 73 65 2c 20 41 2c  umber(pParse, A,
89b0: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
89c0: 20 20 2f 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20    /* When doing 
89d0: 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c 20  a nested parse, 
89e0: 6f 6e 65 20 63 61 6e 20 69 6e 63 6c 75 64 65 20  one can include 
89f0: 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70 72  terms in an expr
8a00: 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 68  ession.    ** th
8a10: 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69  at look like thi
8a20: 73 3a 20 20 20 23 31 20 23 32 20 2e 2e 2e 20 20  s:   #1 #2 ...  
8a30: 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66 65  These terms refe
8a40: 72 20 74 6f 20 72 65 67 69 73 74 65 72 73 0a 20  r to registers. 
8a50: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 76 69 72     ** in the vir
8a60: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 23  tual machine.  #
8a70: 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20 72 65  N is the N-th re
8a80: 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54  gister. */.    T
8a90: 6f 6b 65 6e 20 74 20 3d 20 58 3b 20 2f 2a 41 2d  oken t = X; /*A-
8aa0: 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 0a 20  overwrites-X*/. 
8ab0: 20 20 20 61 73 73 65 72 74 28 20 74 2e 6e 3e 3d     assert( t.n>=
8ac0: 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  2 );.    if( pPa
8ad0: 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29  rse->nested==0 )
8ae0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8af0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8b00: 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79  "near \"%T\": sy
8b10: 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 26 74 29  ntax error", &t)
8b20: 3b 0a 20 20 20 20 20 20 41 20 3d 20 30 3b 0a 20  ;.      A = 0;. 
8b30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8b40: 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  A = sqlite3PExpr
8b50: 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49  (pParse, TK_REGI
8b60: 53 54 45 52 2c 20 30 2c 20 30 29 3b 0a 20 20 20  STER, 0, 0);.   
8b70: 20 20 20 69 66 28 20 41 20 29 20 73 71 6c 69 74     if( A ) sqlit
8b80: 65 33 47 65 74 49 6e 74 33 32 28 26 74 2e 7a 5b  e3GetInt32(&t.z[
8b90: 31 5d 2c 20 26 41 2d 3e 69 54 61 62 6c 65 29 3b  1], &A->iTable);
8ba0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 65 78 70  .    }.  }.}.exp
8bb0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29  r(A) ::= expr(A)
8bc0: 20 43 4f 4c 4c 41 54 45 20 69 64 73 28 43 29 2e   COLLATE ids(C).
8bd0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
8be0: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
8bf0: 6b 65 6e 28 70 50 61 72 73 65 2c 20 41 2c 20 26  ken(pParse, A, &
8c00: 43 2c 20 31 29 3b 0a 7d 0a 25 69 66 6e 64 65 66  C, 1);.}.%ifndef
8c10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
8c20: 54 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41  T.expr(A) ::= CA
8c30: 53 54 20 4c 50 20 65 78 70 72 28 45 29 20 41 53  ST LP expr(E) AS
8c40: 20 74 79 70 65 74 6f 6b 65 6e 28 54 29 20 52 50   typetoken(T) RP
8c50: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
8c60: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
8c70: 65 2d 3e 64 62 2c 20 54 4b 5f 43 41 53 54 2c 20  e->db, TK_CAST, 
8c80: 26 54 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65  &T, 1);.  sqlite
8c90: 33 45 78 70 72 41 74 74 61 63 68 53 75 62 74 72  3ExprAttachSubtr
8ca0: 65 65 73 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ees(pParse->db, 
8cb0: 41 2c 20 45 2c 20 30 29 3b 0a 7d 0a 25 65 6e 64  A, E, 0);.}.%end
8cc0: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
8cd0: 43 41 53 54 0a 65 78 70 72 28 41 29 20 3a 3a 3d  CAST.expr(A) ::=
8ce0: 20 69 64 28 58 29 20 4c 50 20 64 69 73 74 69 6e   id(X) LP distin
8cf0: 63 74 28 44 29 20 65 78 70 72 6c 69 73 74 28 59  ct(D) exprlist(Y
8d00: 29 20 52 50 20 6f 76 65 72 5f 6f 70 74 28 5a 29  ) RP over_opt(Z)
8d10: 2e 20 7b 0a 20 20 69 66 28 20 59 20 26 26 20 59  . {.  if( Y && Y
8d20: 2d 3e 6e 45 78 70 72 3e 70 50 61 72 73 65 2d 3e  ->nExpr>pParse->
8d30: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8d40: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
8d50: 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c  _ARG] ){.    sql
8d60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8d70: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  rse, "too many a
8d80: 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63  rguments on func
8d90: 74 69 6f 6e 20 25 54 22 2c 20 26 58 29 3b 0a 20  tion %T", &X);. 
8da0: 20 7d 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   }.  A = sqlite3
8db0: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61  ExprFunction(pPa
8dc0: 72 73 65 2c 20 59 2c 20 26 58 29 3b 0a 20 20 73  rse, Y, &X);.  s
8dd0: 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 74 74 61  qlite3WindowAtta
8de0: 63 68 28 70 50 61 72 73 65 2c 20 41 2c 20 5a 29  ch(pParse, A, Z)
8df0: 3b 0a 20 20 69 66 28 20 44 3d 3d 53 46 5f 44 69  ;.  if( D==SF_Di
8e00: 73 74 69 6e 63 74 20 26 26 20 41 20 29 7b 0a 20  stinct && A ){. 
8e10: 20 20 20 41 2d 3e 66 6c 61 67 73 20 7c 3d 20 45     A->flags |= E
8e20: 50 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  P_Distinct;.  }.
8e30: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 69 64  }.expr(A) ::= id
8e40: 28 58 29 20 4c 50 20 53 54 41 52 20 52 50 20 6f  (X) LP STAR RP o
8e50: 76 65 72 5f 6f 70 74 28 5a 29 2e 20 7b 0a 20 20  ver_opt(Z). {.  
8e60: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  A = sqlite3ExprF
8e70: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
8e80: 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74 65  0, &X);.  sqlite
8e90: 33 57 69 6e 64 6f 77 41 74 74 61 63 68 28 70 50  3WindowAttach(pP
8ea0: 61 72 73 65 2c 20 41 2c 20 5a 29 3b 0a 7d 0a 74  arse, A, Z);.}.t
8eb0: 65 72 6d 28 41 29 20 3a 3a 3d 20 43 54 49 4d 45  erm(A) ::= CTIME
8ec0: 5f 4b 57 28 4f 50 29 2e 20 7b 0a 20 20 41 20 3d  _KW(OP). {.  A =
8ed0: 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63   sqlite3ExprFunc
8ee0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
8ef0: 26 4f 50 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 77  &OP);.}..%type w
8f00: 69 6e 64 6f 77 64 65 66 6e 5f 6f 70 74 20 7b 57  indowdefn_opt {W
8f10: 69 6e 64 6f 77 2a 7d 0a 25 64 65 73 74 72 75 63  indow*}.%destruc
8f20: 74 6f 72 20 77 69 6e 64 6f 77 64 65 66 6e 5f 6f  tor windowdefn_o
8f30: 70 74 20 7b 73 71 6c 69 74 65 33 57 69 6e 64 6f  pt {sqlite3Windo
8f40: 77 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  wDelete(pParse->
8f50: 64 62 2c 20 24 24 29 3b 7d 0a 77 69 6e 64 6f 77  db, $$);}.window
8f60: 64 65 66 6e 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  defn_opt(A) ::= 
8f70: 2e 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 77 69 6e  . { A = 0; }.win
8f80: 64 6f 77 64 65 66 6e 5f 6f 70 74 28 41 29 20 3a  dowdefn_opt(A) :
8f90: 3a 3d 20 57 49 4e 44 4f 57 20 77 69 6e 64 6f 77  := WINDOW window
8fa0: 64 65 66 6e 5f 6c 69 73 74 28 42 29 2e 20 7b 20  defn_list(B). { 
8fb0: 41 20 3d 20 42 3b 20 7d 0a 0a 25 74 79 70 65 20  A = B; }..%type 
8fc0: 77 69 6e 64 6f 77 64 65 66 6e 5f 6c 69 73 74 20  windowdefn_list 
8fd0: 7b 57 69 6e 64 6f 77 2a 7d 0a 25 64 65 73 74 72  {Window*}.%destr
8fe0: 75 63 74 6f 72 20 77 69 6e 64 6f 77 64 65 66 6e  uctor windowdefn
8ff0: 5f 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 57 69  _list {sqlite3Wi
9000: 6e 64 6f 77 44 65 6c 65 74 65 28 70 50 61 72 73  ndowDelete(pPars
9010: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 77 69 6e  e->db, $$);}.win
9020: 64 6f 77 64 65 66 6e 5f 6c 69 73 74 28 41 29 20  dowdefn_list(A) 
9030: 3a 3a 3d 20 77 69 6e 64 6f 77 64 65 66 6e 28 5a  ::= windowdefn(Z
9040: 29 2e 20 7b 20 41 20 3d 20 5a 3b 20 7d 0a 77 69  ). { A = Z; }.wi
9050: 6e 64 6f 77 64 65 66 6e 5f 6c 69 73 74 28 41 29  ndowdefn_list(A)
9060: 20 3a 3a 3d 20 77 69 6e 64 6f 77 64 65 66 6e 5f   ::= windowdefn_
9070: 6c 69 73 74 28 59 29 20 43 4f 4d 4d 41 20 77 69  list(Y) COMMA wi
9080: 6e 64 6f 77 64 65 66 6e 28 5a 29 2e 20 7b 0a 20  ndowdefn(Z). {. 
9090: 20 69 66 28 20 5a 20 29 20 5a 2d 3e 70 4e 65 78   if( Z ) Z->pNex
90a0: 74 57 69 6e 20 3d 20 59 3b 0a 20 20 41 20 3d 20  tWin = Y;.  A = 
90b0: 5a 3b 0a 7d 0a 0a 25 74 79 70 65 20 77 69 6e 64  Z;.}..%type wind
90c0: 6f 77 64 65 66 6e 20 7b 57 69 6e 64 6f 77 2a 7d  owdefn {Window*}
90d0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77 69 6e  .%destructor win
90e0: 64 6f 77 64 65 66 6e 20 7b 73 71 6c 69 74 65 33  dowdefn {sqlite3
90f0: 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 70 50 61  WindowDelete(pPa
9100: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 77  rse->db, $$);}.w
9110: 69 6e 64 6f 77 64 65 66 6e 28 41 29 20 3a 3a 3d  indowdefn(A) ::=
9120: 20 6e 6d 28 58 29 20 41 53 20 77 69 6e 64 6f 77   nm(X) AS window
9130: 28 59 29 2e 20 7b 0a 20 20 69 66 28 20 59 20 29  (Y). {.  if( Y )
9140: 7b 0a 20 20 20 20 59 2d 3e 7a 4e 61 6d 65 20 3d  {.    Y->zName =
9150: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
9160: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 58 2e  p(pParse->db, X.
9170: 7a 2c 20 58 2e 6e 29 3b 0a 20 20 7d 0a 20 20 41  z, X.n);.  }.  A
9180: 20 3d 20 59 3b 0a 7d 0a 0a 25 74 79 70 65 20 6f   = Y;.}..%type o
9190: 76 65 72 5f 6f 70 74 20 7b 57 69 6e 64 6f 77 2a  ver_opt {Window*
91a0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f 76  }.%destructor ov
91b0: 65 72 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 57  er_opt {sqlite3W
91c0: 69 6e 64 6f 77 44 65 6c 65 74 65 28 70 50 61 72  indowDelete(pPar
91d0: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25  se->db, $$);}..%
91e0: 74 79 70 65 20 77 69 6e 64 6f 77 20 7b 57 69 6e  type window {Win
91f0: 64 6f 77 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  dow*}.%destructo
9200: 72 20 77 69 6e 64 6f 77 20 7b 73 71 6c 69 74 65  r window {sqlite
9210: 33 57 69 6e 64 6f 77 44 65 6c 65 74 65 28 70 50  3WindowDelete(pP
9220: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
9230: 0a 25 74 79 70 65 20 66 72 61 6d 65 5f 6f 70 74  .%type frame_opt
9240: 20 7b 57 69 6e 64 6f 77 2a 7d 0a 25 64 65 73 74   {Window*}.%dest
9250: 72 75 63 74 6f 72 20 66 72 61 6d 65 5f 6f 70 74  ructor frame_opt
9260: 20 7b 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44   {sqlite3WindowD
9270: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
9280: 2c 20 24 24 29 3b 7d 0a 0a 25 74 79 70 65 20 77  , $$);}..%type w
9290: 69 6e 64 6f 77 5f 6f 72 5f 6e 6d 20 7b 57 69 6e  indow_or_nm {Win
92a0: 64 6f 77 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  dow*}.%destructo
92b0: 72 20 77 69 6e 64 6f 77 5f 6f 72 5f 6e 6d 20 7b  r window_or_nm {
92c0: 0a 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 44 65  .sqlite3WindowDe
92d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
92e0: 20 24 24 29 3b 7d 0a 0a 25 74 79 70 65 20 70 61   $$);}..%type pa
92f0: 72 74 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74  rt_opt {ExprList
9300: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 70  *}.%destructor p
9310: 61 72 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33  art_opt {sqlite3
9320: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
9330: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
9340: 0a 0a 25 74 79 70 65 20 66 69 6c 74 65 72 5f 6f  ..%type filter_o
9350: 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pt {Expr*}.%dest
9360: 72 75 63 74 6f 72 20 66 69 6c 74 65 72 5f 6f 70  ructor filter_op
9370: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  t {sqlite3ExprDe
9380: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9390: 20 24 24 29 3b 7d 0a 0a 25 74 79 70 65 20 72 61   $$);}..%type ra
93a0: 6e 67 65 5f 6f 72 5f 72 6f 77 73 20 7b 69 6e 74  nge_or_rows {int
93b0: 7d 0a 0a 25 74 79 70 65 20 66 72 61 6d 65 5f 62  }..%type frame_b
93c0: 6f 75 6e 64 20 7b 73 74 72 75 63 74 20 46 72 61  ound {struct Fra
93d0: 6d 65 42 6f 75 6e 64 7d 0a 25 64 65 73 74 72 75  meBound}.%destru
93e0: 63 74 6f 72 20 66 72 61 6d 65 5f 62 6f 75 6e 64  ctor frame_bound
93f0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
9400: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
9410: 24 24 2e 70 45 78 70 72 29 3b 7d 0a 0a 6f 76 65  $$.pExpr);}..ove
9420: 72 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 7b  r_opt(A) ::= . {
9430: 20 41 20 3d 20 30 3b 20 7d 0a 6f 76 65 72 5f 6f   A = 0; }.over_o
9440: 70 74 28 41 29 20 3a 3a 3d 20 66 69 6c 74 65 72  pt(A) ::= filter
9450: 5f 6f 70 74 28 57 29 20 4f 56 45 52 20 77 69 6e  _opt(W) OVER win
9460: 64 6f 77 5f 6f 72 5f 6e 6d 28 5a 29 2e 20 7b 0a  dow_or_nm(Z). {.
9470: 20 20 41 20 3d 20 5a 3b 0a 20 20 69 66 28 20 41    A = Z;.  if( A
9480: 20 29 20 41 2d 3e 70 46 69 6c 74 65 72 20 3d 20   ) A->pFilter = 
9490: 57 3b 0a 7d 0a 0a 77 69 6e 64 6f 77 5f 6f 72 5f  W;.}..window_or_
94a0: 6e 6d 28 41 29 20 3a 3a 3d 20 77 69 6e 64 6f 77  nm(A) ::= window
94b0: 28 5a 29 2e 20 7b 41 20 3d 20 5a 3b 7d 0a 77 69  (Z). {A = Z;}.wi
94c0: 6e 64 6f 77 5f 6f 72 5f 6e 6d 28 41 29 20 3a 3a  ndow_or_nm(A) ::
94d0: 3d 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 41 20 3d  = nm(Z). {.  A =
94e0: 20 28 57 69 6e 64 6f 77 2a 29 73 71 6c 69 74 65   (Window*)sqlite
94f0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
9500: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
9510: 28 57 69 6e 64 6f 77 29 29 3b 0a 20 20 69 66 28  (Window));.  if(
9520: 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e 7a 4e 61   A ){.    A->zNa
9530: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
9540: 72 4e 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  rNDup(pParse->db
9550: 2c 20 5a 2e 7a 2c 20 5a 2e 6e 29 3b 0a 20 20 7d  , Z.z, Z.n);.  }
9560: 0a 7d 0a 0a 77 69 6e 64 6f 77 28 41 29 20 3a 3a  .}..window(A) ::
9570: 3d 20 4c 50 20 70 61 72 74 5f 6f 70 74 28 58 29  = LP part_opt(X)
9580: 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 59 29 20   orderby_opt(Y) 
9590: 66 72 61 6d 65 5f 6f 70 74 28 5a 29 20 52 50 2e  frame_opt(Z) RP.
95a0: 20 7b 0a 20 20 41 20 3d 20 5a 3b 0a 20 20 69 66   {.  A = Z;.  if
95b0: 28 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e 70 50  ( A ){.    A->pP
95c0: 61 72 74 69 74 69 6f 6e 20 3d 20 58 3b 0a 20 20  artition = X;.  
95d0: 20 20 41 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    A->pOrderBy = 
95e0: 59 3b 0a 20 20 7d 0a 7d 0a 0a 70 61 72 74 5f 6f  Y;.  }.}..part_o
95f0: 70 74 28 41 29 20 3a 3a 3d 20 50 41 52 54 49 54  pt(A) ::= PARTIT
9600: 49 4f 4e 20 42 59 20 65 78 70 72 6c 69 73 74 28  ION BY exprlist(
9610: 58 29 2e 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 70  X). { A = X; }.p
9620: 61 72 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  art_opt(A) ::= .
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 30           { A = 0
9650: 3b 20 7d 0a 66 69 6c 74 65 72 5f 6f 70 74 28 41  ; }.filter_opt(A
9660: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 66 69     { A = 0; }.fi
9690: 6c 74 65 72 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  lter_opt(A) ::= 
96a0: 46 49 4c 54 45 52 20 4c 50 20 57 48 45 52 45 20  FILTER LP WHERE 
96b0: 65 78 70 72 28 58 29 20 52 50 2e 20 20 7b 20 41  expr(X) RP.  { A
96c0: 20 3d 20 58 3b 20 7d 0a 0a 66 72 61 6d 65 5f 6f   = X; }..frame_o
96d0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 20 20 20 20 20 20 7b 20 0a 20 20 41 20 3d          { .  A =
9700: 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 41 6c   sqlite3WindowAl
9710: 6c 6f 63 28 70 50 61 72 73 65 2c 20 54 4b 5f 52  loc(pParse, TK_R
9720: 41 4e 47 45 2c 20 54 4b 5f 55 4e 42 4f 55 4e 44  ANGE, TK_UNBOUND
9730: 45 44 2c 20 30 2c 20 54 4b 5f 43 55 52 52 45 4e  ED, 0, TK_CURREN
9740: 54 2c 20 30 29 3b 0a 7d 0a 66 72 61 6d 65 5f 6f  T, 0);.}.frame_o
9750: 70 74 28 41 29 20 3a 3a 3d 20 72 61 6e 67 65 5f  pt(A) ::= range_
9760: 6f 72 5f 72 6f 77 73 28 58 29 20 66 72 61 6d 65  or_rows(X) frame
9770: 5f 62 6f 75 6e 64 28 59 29 2e 20 7b 20 0a 20 20  _bound(Y). { .  
9780: 41 20 3d 20 73 71 6c 69 74 65 33 57 69 6e 64 6f  A = sqlite3Windo
9790: 77 41 6c 6c 6f 63 28 70 50 61 72 73 65 2c 20 58  wAlloc(pParse, X
97a0: 2c 20 59 2e 65 54 79 70 65 2c 20 59 2e 70 45 78  , Y.eType, Y.pEx
97b0: 70 72 2c 20 54 4b 5f 43 55 52 52 45 4e 54 2c 20  pr, TK_CURRENT, 
97c0: 30 29 3b 0a 7d 0a 66 72 61 6d 65 5f 6f 70 74 28  0);.}.frame_opt(
97d0: 41 29 20 3a 3a 3d 20 72 61 6e 67 65 5f 6f 72 5f  A) ::= range_or_
97e0: 72 6f 77 73 28 58 29 20 42 45 54 57 45 45 4e 20  rows(X) BETWEEN 
97f0: 66 72 61 6d 65 5f 62 6f 75 6e 64 28 59 29 20 41  frame_bound(Y) A
9800: 4e 44 20 66 72 61 6d 65 5f 62 6f 75 6e 64 28 5a  ND frame_bound(Z
9810: 29 2e 20 7b 20 0a 20 20 41 20 3d 20 73 71 6c 69  ). { .  A = sqli
9820: 74 65 33 57 69 6e 64 6f 77 41 6c 6c 6f 63 28 70  te3WindowAlloc(p
9830: 50 61 72 73 65 2c 20 58 2c 20 59 2e 65 54 79 70  Parse, X, Y.eTyp
9840: 65 2c 20 59 2e 70 45 78 70 72 2c 20 5a 2e 65 54  e, Y.pExpr, Z.eT
9850: 79 70 65 2c 20 5a 2e 70 45 78 70 72 29 3b 0a 7d  ype, Z.pExpr);.}
9860: 0a 0a 72 61 6e 67 65 5f 6f 72 5f 72 6f 77 73 28  ..range_or_rows(
9870: 41 29 20 3a 3a 3d 20 52 41 4e 47 45 2e 20 20 20  A) ::= RANGE.   
9880: 7b 20 41 20 3d 20 54 4b 5f 52 41 4e 47 45 3b 20  { A = TK_RANGE; 
9890: 7d 0a 72 61 6e 67 65 5f 6f 72 5f 72 6f 77 73 28  }.range_or_rows(
98a0: 41 29 20 3a 3a 3d 20 52 4f 57 53 2e 20 20 20 20  A) ::= ROWS.    
98b0: 7b 20 41 20 3d 20 54 4b 5f 52 4f 57 53 3b 20 20  { A = TK_ROWS;  
98c0: 7d 0a 0a 66 72 61 6d 65 5f 62 6f 75 6e 64 28 41  }..frame_bound(A
98d0: 29 20 3a 3a 3d 20 55 4e 42 4f 55 4e 44 45 44 20  ) ::= UNBOUNDED 
98e0: 50 52 45 43 45 44 49 4e 47 2e 20 7b 20 41 2e 65  PRECEDING. { A.e
98f0: 54 79 70 65 20 3d 20 54 4b 5f 55 4e 42 4f 55 4e  Type = TK_UNBOUN
9900: 44 45 44 3b 20 41 2e 70 45 78 70 72 20 3d 20 30  DED; A.pExpr = 0
9910: 3b 20 7d 0a 66 72 61 6d 65 5f 62 6f 75 6e 64 28  ; }.frame_bound(
9920: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 50  A) ::= expr(X) P
9930: 52 45 43 45 44 49 4e 47 2e 20 20 20 7b 20 41 2e  RECEDING.   { A.
9940: 65 54 79 70 65 20 3d 20 54 4b 5f 50 52 45 43 45  eType = TK_PRECE
9950: 44 49 4e 47 3b 20 41 2e 70 45 78 70 72 20 3d 20  DING; A.pExpr = 
9960: 58 3b 20 7d 0a 66 72 61 6d 65 5f 62 6f 75 6e 64  X; }.frame_bound
9970: 28 41 29 20 3a 3a 3d 20 43 55 52 52 45 4e 54 20  (A) ::= CURRENT 
9980: 52 4f 57 2e 20 20 20 20 20 20 20 20 20 7b 20 41  ROW.         { A
9990: 2e 65 54 79 70 65 20 3d 20 54 4b 5f 43 55 52 52  .eType = TK_CURR
99a0: 45 4e 54 20 20 3b 20 41 2e 70 45 78 70 72 20 3d  ENT  ; A.pExpr =
99b0: 20 30 3b 20 7d 0a 66 72 61 6d 65 5f 62 6f 75 6e   0; }.frame_boun
99c0: 64 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  d(A) ::= expr(X)
99d0: 20 46 4f 4c 4c 4f 57 49 4e 47 2e 20 20 20 7b 20   FOLLOWING.   { 
99e0: 41 2e 65 54 79 70 65 20 3d 20 54 4b 5f 46 4f 4c  A.eType = TK_FOL
99f0: 4c 4f 57 49 4e 47 3b 20 41 2e 70 45 78 70 72 20  LOWING; A.pExpr 
9a00: 3d 20 58 3b 20 7d 0a 66 72 61 6d 65 5f 62 6f 75  = X; }.frame_bou
9a10: 6e 64 28 41 29 20 3a 3a 3d 20 55 4e 42 4f 55 4e  nd(A) ::= UNBOUN
9a20: 44 45 44 20 46 4f 4c 4c 4f 57 49 4e 47 2e 20 7b  DED FOLLOWING. {
9a30: 20 41 2e 65 54 79 70 65 20 3d 20 54 4b 5f 55 4e   A.eType = TK_UN
9a40: 42 4f 55 4e 44 45 44 3b 20 41 2e 70 45 78 70 72  BOUNDED; A.pExpr
9a50: 20 3d 20 30 3b 20 7d 0a 0a 0a 65 78 70 72 28 41   = 0; }...expr(A
9a60: 29 20 3a 3a 3d 20 4c 50 20 6e 65 78 70 72 6c 69  ) ::= LP nexprli
9a70: 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72  st(X) COMMA expr
9a80: 28 59 29 20 52 50 2e 20 7b 0a 20 20 45 78 70 72  (Y) RP. {.  Expr
9a90: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 73 71  List *pList = sq
9aa0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
9ab0: 65 6e 64 28 70 50 61 72 73 65 2c 20 58 2c 20 59  end(pParse, X, Y
9ac0: 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33  );.  A = sqlite3
9ad0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
9ae0: 5f 56 45 43 54 4f 52 2c 20 30 2c 20 30 29 3b 0a  _VECTOR, 0, 0);.
9af0: 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41    if( A ){.    A
9b00: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
9b10: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
9b20: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9b30: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
9b40: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
9b50: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
9b60: 72 28 41 29 20 41 4e 44 28 4f 50 29 20 65 78 70  r(A) AND(OP) exp
9b70: 72 28 59 29 2e 20 20 20 20 7b 41 3d 73 71 6c 69  r(Y).    {A=sqli
9b80: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
9b90: 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72 28  @OP,A,Y);}.expr(
9ba0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 4f  A) ::= expr(A) O
9bb0: 52 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  R(OP) expr(Y).  
9bc0: 20 20 20 7b 41 3d 73 71 6c 69 74 65 33 50 45 78     {A=sqlite3PEx
9bd0: 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 41 2c  pr(pParse,@OP,A,
9be0: 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  Y);}.expr(A) ::=
9bf0: 20 65 78 70 72 28 41 29 20 4c 54 7c 47 54 7c 47   expr(A) LT|GT|G
9c00: 45 7c 4c 45 28 4f 50 29 20 65 78 70 72 28 59 29  E|LE(OP) expr(Y)
9c10: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 20 20 20 20 20 20 20 20 20 7b 41 3d 73 71 6c            {A=sql
9c40: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
9c50: 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72  ,@OP,A,Y);}.expr
9c60: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
9c70: 45 51 7c 4e 45 28 4f 50 29 20 65 78 70 72 28 59  EQ|NE(OP) expr(Y
9c80: 29 2e 20 20 7b 41 3d 73 71 6c 69 74 65 33 50 45  ).  {A=sqlite3PE
9c90: 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 41  xpr(pParse,@OP,A
9ca0: 2c 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  ,Y);}.expr(A) ::
9cb0: 3d 20 65 78 70 72 28 41 29 20 42 49 54 41 4e 44  = expr(A) BITAND
9cc0: 7c 42 49 54 4f 52 7c 4c 53 48 49 46 54 7c 52 53  |BITOR|LSHIFT|RS
9cd0: 48 49 46 54 28 4f 50 29 20 65 78 70 72 28 59 29  HIFT(OP) expr(Y)
9ce0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 20 20 20 20 20 20 20 7b 41 3d 73 71 6c            {A=sql
9d10: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
9d20: 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72  ,@OP,A,Y);}.expr
9d30: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
9d40: 50 4c 55 53 7c 4d 49 4e 55 53 28 4f 50 29 20 65  PLUS|MINUS(OP) e
9d50: 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20  xpr(Y)..        
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 7b 41 3d 73 71 6c 69 74 65 33 50 45 78 70 72 28  {A=sqlite3PExpr(
9d90: 70 50 61 72 73 65 2c 40 4f 50 2c 41 2c 59 29 3b  pParse,@OP,A,Y);
9da0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
9db0: 70 72 28 41 29 20 53 54 41 52 7c 53 4c 41 53 48  pr(A) STAR|SLASH
9dc0: 7c 52 45 4d 28 4f 50 29 20 65 78 70 72 28 59 29  |REM(OP) expr(Y)
9dd0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 20 20 20 20 20 20 20 20 7b 41 3d 73 71 6c            {A=sql
9e00: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
9e10: 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72  ,@OP,A,Y);}.expr
9e20: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
9e30: 43 4f 4e 43 41 54 28 4f 50 29 20 65 78 70 72 28  CONCAT(OP) expr(
9e40: 59 29 2e 20 7b 41 3d 73 71 6c 69 74 65 33 50 45  Y). {A=sqlite3PE
9e50: 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 41  xpr(pParse,@OP,A
9e60: 2c 59 29 3b 7d 0a 25 74 79 70 65 20 6c 69 6b 65  ,Y);}.%type like
9e70: 6f 70 20 7b 54 6f 6b 65 6e 7d 0a 6c 69 6b 65 6f  op {Token}.likeo
9e80: 70 28 41 29 20 3a 3a 3d 20 4c 49 4b 45 5f 4b 57  p(A) ::= LIKE_KW
9e90: 7c 4d 41 54 43 48 28 41 29 2e 0a 6c 69 6b 65 6f  |MATCH(A)..likeo
9ea0: 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4c 49 4b  p(A) ::= NOT LIK
9eb0: 45 5f 4b 57 7c 4d 41 54 43 48 28 58 29 2e 20 7b  E_KW|MATCH(X). {
9ec0: 41 3d 58 3b 20 41 2e 6e 7c 3d 30 78 38 30 30 30  A=X; A.n|=0x8000
9ed0: 30 30 30 30 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  0000; /*A-overwr
9ee0: 69 74 65 2d 58 2a 2f 7d 0a 65 78 70 72 28 41 29  ite-X*/}.expr(A)
9ef0: 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 6c 69 6b   ::= expr(A) lik
9f00: 65 6f 70 28 4f 50 29 20 65 78 70 72 28 59 29 2e  eop(OP) expr(Y).
9f10: 20 20 5b 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20    [LIKE_KW]  {. 
9f20: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9f30: 3b 0a 20 20 69 6e 74 20 62 4e 6f 74 20 3d 20 4f  ;.  int bNot = O
9f40: 50 2e 6e 20 26 20 30 78 38 30 30 30 30 30 30 30  P.n & 0x80000000
9f50: 3b 0a 20 20 4f 50 2e 6e 20 26 3d 20 30 78 37 66  ;.  OP.n &= 0x7f
9f60: 66 66 66 66 66 66 3b 0a 20 20 70 4c 69 73 74 20  ffffff;.  pList 
9f70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9f80: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30  tAppend(pParse,0
9f90: 2c 20 59 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  , Y);.  pList = 
9fa0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
9fb0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69  ppend(pParse,pLi
9fc0: 73 74 2c 20 41 29 3b 0a 20 20 41 20 3d 20 73 71  st, A);.  A = sq
9fd0: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
9fe0: 6e 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  n(pParse, pList,
9ff0: 20 26 4f 50 29 3b 0a 20 20 69 66 28 20 62 4e 6f   &OP);.  if( bNo
a000: 74 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33 50  t ) A = sqlite3P
a010: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
a020: 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20 69 66  NOT, A, 0);.  if
a030: 28 20 41 20 29 20 41 2d 3e 66 6c 61 67 73 20 7c  ( A ) A->flags |
a040: 3d 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 3b 0a  = EP_InfixFunc;.
a050: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
a060: 70 72 28 41 29 20 6c 69 6b 65 6f 70 28 4f 50 29  pr(A) likeop(OP)
a070: 20 65 78 70 72 28 59 29 20 45 53 43 41 50 45 20   expr(Y) ESCAPE 
a080: 65 78 70 72 28 45 29 2e 20 20 5b 4c 49 4b 45 5f  expr(E).  [LIKE_
a090: 4b 57 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69 73  KW]  {.  ExprLis
a0a0: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  t *pList;.  int 
a0b0: 62 4e 6f 74 20 3d 20 4f 50 2e 6e 20 26 20 30 78  bNot = OP.n & 0x
a0c0: 38 30 30 30 30 30 30 30 3b 0a 20 20 4f 50 2e 6e  80000000;.  OP.n
a0d0: 20 26 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a   &= 0x7fffffff;.
a0e0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
a0f0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a100: 70 50 61 72 73 65 2c 30 2c 20 59 29 3b 0a 20 20  pParse,0, Y);.  
a110: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
a120: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a130: 61 72 73 65 2c 70 4c 69 73 74 2c 20 41 29 3b 0a  arse,pList, A);.
a140: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
a150: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a160: 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 45 29  pParse,pList, E)
a170: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
a180: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  xprFunction(pPar
a190: 73 65 2c 20 70 4c 69 73 74 2c 20 26 4f 50 29 3b  se, pList, &OP);
a1a0: 0a 20 20 69 66 28 20 62 4e 6f 74 20 29 20 41 20  .  if( bNot ) A 
a1b0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
a1c0: 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41  Parse, TK_NOT, A
a1d0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20  , 0);.  if( A ) 
a1e0: 41 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  A->flags |= EP_I
a1f0: 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a 0a 65 78 70  nfixFunc;.}..exp
a200: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29  r(A) ::= expr(A)
a210: 20 49 53 4e 55 4c 4c 7c 4e 4f 54 4e 55 4c 4c 28   ISNULL|NOTNULL(
a220: 45 29 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  E).   {A = sqlit
a230: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 40  e3PExpr(pParse,@
a240: 45 2c 41 2c 30 29 3b 7d 0a 65 78 70 72 28 41 29  E,A,0);}.expr(A)
a250: 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 4e 4f 54   ::= expr(A) NOT
a260: 20 4e 55 4c 4c 2e 20 20 20 20 7b 41 20 3d 20 73   NULL.    {A = s
a270: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a280: 73 65 2c 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 41 2c  se,TK_NOTNULL,A,
a290: 30 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b  0);}..%include {
a2a0: 0a 20 20 2f 2a 20 41 20 72 6f 75 74 69 6e 65 20  .  /* A routine 
a2b0: 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 62 69 6e  to convert a bin
a2c0: 61 72 79 20 54 4b 5f 49 53 20 6f 72 20 54 4b 5f  ary TK_IS or TK_
a2d0: 49 53 4e 4f 54 20 65 78 70 72 65 73 73 69 6f 6e  ISNOT expression
a2e0: 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 75 6e 61   into a.  ** una
a2f0: 72 79 20 54 4b 5f 49 53 4e 55 4c 4c 20 6f 72 20  ry TK_ISNULL or 
a300: 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 65 78 70 72 65  TK_NOTNULL expre
a310: 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 73 74 61 74  ssion. */.  stat
a320: 69 63 20 76 6f 69 64 20 62 69 6e 61 72 79 54 6f  ic void binaryTo
a330: 55 6e 61 72 79 49 66 4e 75 6c 6c 28 50 61 72 73  UnaryIfNull(Pars
a340: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
a350: 2a 70 59 2c 20 45 78 70 72 20 2a 70 41 2c 20 69  *pY, Expr *pA, i
a360: 6e 74 20 6f 70 29 7b 0a 20 20 20 20 73 71 6c 69  nt op){.    sqli
a370: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a380: 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 41  ->db;.    if( pA
a390: 20 26 26 20 70 59 20 26 26 20 70 59 2d 3e 6f 70   && pY && pY->op
a3a0: 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  ==TK_NULL ){.   
a3b0: 20 20 20 70 41 2d 3e 6f 70 20 3d 20 28 75 38 29     pA->op = (u8)
a3c0: 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
a3d0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
a3e0: 70 41 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pA->pRight);.   
a3f0: 20 20 20 70 41 2d 3e 70 52 69 67 68 74 20 3d 20     pA->pRight = 
a400: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
a410: 2f 2f 20 20 20 20 65 78 70 72 31 20 49 53 20 65  //    expr1 IS e
a420: 78 70 72 32 0a 2f 2f 20 20 20 20 65 78 70 72 31  xpr2.//    expr1
a430: 20 49 53 20 4e 4f 54 20 65 78 70 72 32 0a 2f 2f   IS NOT expr2.//
a440: 0a 2f 2f 20 49 66 20 65 78 70 72 32 20 69 73 20  .// If expr2 is 
a450: 4e 55 4c 4c 20 74 68 65 6e 20 63 6f 64 65 20 61  NULL then code a
a460: 73 20 54 4b 5f 49 53 4e 55 4c 4c 20 6f 72 20 54  s TK_ISNULL or T
a470: 4b 5f 4e 4f 54 4e 55 4c 4c 2e 20 20 49 66 20 65  K_NOTNULL.  If e
a480: 78 70 72 32 0a 2f 2f 20 69 73 20 61 6e 79 20 6f  xpr2.// is any o
a490: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  ther expression,
a4a0: 20 63 6f 64 65 20 61 73 20 54 4b 5f 49 53 20 6f   code as TK_IS o
a4b0: 72 20 54 4b 5f 49 53 4e 4f 54 2e 0a 2f 2f 20 0a  r TK_ISNOT..// .
a4c0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
a4d0: 28 41 29 20 49 53 20 65 78 70 72 28 59 29 2e 20  (A) IS expr(Y). 
a4e0: 20 20 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69      {.  A = sqli
a4f0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
a500: 54 4b 5f 49 53 2c 41 2c 59 29 3b 0a 20 20 62 69  TK_IS,A,Y);.  bi
a510: 6e 61 72 79 54 6f 55 6e 61 72 79 49 66 4e 75 6c  naryToUnaryIfNul
a520: 6c 28 70 50 61 72 73 65 2c 20 59 2c 20 41 2c 20  l(pParse, Y, A, 
a530: 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 7d 0a 65 78  TK_ISNULL);.}.ex
a540: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
a550: 29 20 49 53 20 4e 4f 54 20 65 78 70 72 28 59 29  ) IS NOT expr(Y)
a560: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
a570: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 54 4b  3PExpr(pParse,TK
a580: 5f 49 53 4e 4f 54 2c 41 2c 59 29 3b 0a 20 20 62  _ISNOT,A,Y);.  b
a590: 69 6e 61 72 79 54 6f 55 6e 61 72 79 49 66 4e 75  inaryToUnaryIfNu
a5a0: 6c 6c 28 70 50 61 72 73 65 2c 20 59 2c 20 41 2c  ll(pParse, Y, A,
a5b0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 7d 0a   TK_NOTNULL);.}.
a5c0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4e 4f 54  .expr(A) ::= NOT
a5d0: 28 42 29 20 65 78 70 72 28 58 29 2e 20 20 0a 20  (B) expr(X).  . 
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
a5f0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
a600: 50 61 72 73 65 2c 20 40 42 2c 20 58 2c 20 30 29  Parse, @B, X, 0)
a610: 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d  ;/*A-overwrites-
a620: 42 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  B*/}.expr(A) ::=
a630: 20 42 49 54 4e 4f 54 28 42 29 20 65 78 70 72 28   BITNOT(B) expr(
a640: 58 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  X)..            
a650: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45    {A = sqlite3PE
a660: 78 70 72 28 70 50 61 72 73 65 2c 20 40 42 2c 20  xpr(pParse, @B, 
a670: 58 2c 20 30 29 3b 2f 2a 41 2d 6f 76 65 72 77 72  X, 0);/*A-overwr
a680: 69 74 65 73 2d 42 2a 2f 7d 0a 65 78 70 72 28 41  ites-B*/}.expr(A
a690: 29 20 3a 3a 3d 20 4d 49 4e 55 53 20 65 78 70 72  ) ::= MINUS expr
a6a0: 28 58 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20  (X). [BITNOT].  
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
a6c0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
a6d0: 61 72 73 65 2c 20 54 4b 5f 55 4d 49 4e 55 53 2c  arse, TK_UMINUS,
a6e0: 20 58 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   X, 0);}.expr(A)
a6f0: 20 3a 3a 3d 20 50 4c 55 53 20 65 78 70 72 28 58   ::= PLUS expr(X
a700: 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20 20  ). [BITNOT].    
a710: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
a720: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
a730: 73 65 2c 20 54 4b 5f 55 50 4c 55 53 2c 20 58 2c  se, TK_UPLUS, X,
a740: 20 30 29 3b 7d 0a 0a 25 74 79 70 65 20 62 65 74   0);}..%type bet
a750: 77 65 65 6e 5f 6f 70 20 7b 69 6e 74 7d 0a 62 65  ween_op {int}.be
a760: 74 77 65 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20  tween_op(A) ::= 
a770: 42 45 54 57 45 45 4e 2e 20 20 20 20 20 7b 41 20  BETWEEN.     {A 
a780: 3d 20 30 3b 7d 0a 62 65 74 77 65 65 6e 5f 6f 70  = 0;}.between_op
a790: 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 42 45 54 57  (A) ::= NOT BETW
a7a0: 45 45 4e 2e 20 7b 41 20 3d 20 31 3b 7d 0a 65 78  EEN. {A = 1;}.ex
a7b0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
a7c0: 29 20 62 65 74 77 65 65 6e 5f 6f 70 28 4e 29 20  ) between_op(N) 
a7d0: 65 78 70 72 28 58 29 20 41 4e 44 20 65 78 70 72  expr(X) AND expr
a7e0: 28 59 29 2e 20 5b 42 45 54 57 45 45 4e 5d 20 7b  (Y). [BETWEEN] {
a7f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
a800: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
a810: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
a820: 65 2c 30 2c 20 58 29 3b 0a 20 20 70 4c 69 73 74  e,0, X);.  pList
a830: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
a840: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
a850: 70 4c 69 73 74 2c 20 59 29 3b 0a 20 20 41 20 3d  pList, Y);.  A =
a860: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
a870: 61 72 73 65 2c 20 54 4b 5f 42 45 54 57 45 45 4e  arse, TK_BETWEEN
a880: 2c 20 41 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  , A, 0);.  if( A
a890: 20 29 7b 0a 20 20 20 20 41 2d 3e 78 2e 70 4c 69   ){.    A->x.pLi
a8a0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 65  st = pList;.  }e
a8b0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
a8c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
a8d0: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
a8e0: 29 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 4e 20  );.  } .  if( N 
a8f0: 29 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 4e 4f  pr(pParse, TK_NO
a910: 54 2c 20 41 2c 20 30 29 3b 0a 7d 0a 25 69 66 6e  T, A, 0);.}.%ifn
a920: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a930: 53 55 42 51 55 45 52 59 0a 20 20 25 74 79 70 65  SUBQUERY.  %type
a940: 20 69 6e 5f 6f 70 20 7b 69 6e 74 7d 0a 20 20 69   in_op {int}.  i
a950: 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 49 4e 2e 20  n_op(A) ::= IN. 
a960: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 20 20       {A = 0;}.  
a970: 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54  in_op(A) ::= NOT
a980: 20 49 4e 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a 20   IN.  {A = 1;}. 
a990: 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70   expr(A) ::= exp
a9a0: 72 28 41 29 20 69 6e 5f 6f 70 28 4e 29 20 4c 50  r(A) in_op(N) LP
a9b0: 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 2e   exprlist(Y) RP.
a9c0: 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 69 66 28 20   [IN] {.    if( 
a9d0: 59 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Y==0 ){.      /*
a9e0: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
a9f0: 74 68 65 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  the form.      *
aa00: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
aa10: 65 78 70 72 31 20 49 4e 20 28 29 0a 20 20 20 20  expr1 IN ().    
aa20: 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31 20    **      expr1 
aa30: 4e 4f 54 20 49 4e 20 28 29 0a 20 20 20 20 20 20  NOT IN ().      
aa40: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 73 69 6d 70  **.      ** simp
aa50: 6c 69 66 79 20 74 6f 20 63 6f 6e 73 74 61 6e 74  lify to constant
aa60: 73 20 30 20 28 66 61 6c 73 65 29 20 61 6e 64 20  s 0 (false) and 
aa70: 31 20 28 74 72 75 65 29 2c 20 72 65 73 70 65 63  1 (true), respec
aa80: 74 69 76 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a  tively,.      **
aa90: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
aaa0: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 78 70 72  he value of expr
aab0: 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  1..      */.    
aac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
aad0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
aae0: 41 29 3b 0a 20 20 20 20 20 20 41 20 3d 20 73 71  A);.      A = sq
aaf0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
ab00: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e  Parse->db, TK_IN
ab10: 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e  TEGER,&sqlite3In
ab20: 74 54 6f 6b 65 6e 73 5b 4e 5d 2c 31 29 3b 0a 20  tTokens[N],1);. 
ab30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 59 2d 3e     }else if( Y->
ab40: 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
ab50: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
ab60: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
ab70: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
ab80: 20 20 20 20 20 65 78 70 72 31 20 49 4e 20 28 3f       expr1 IN (?
ab90: 31 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  1).      **     
aba0: 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20 28 3f   expr1 NOT IN (?
abb0: 32 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  2).      **.    
abc0: 20 20 2a 2a 20 77 69 74 68 20 65 78 61 63 74 6c    ** with exactl
abd0: 79 20 6f 6e 65 20 76 61 6c 75 65 20 6f 6e 20 74  y one value on t
abe0: 68 65 20 52 48 53 20 63 61 6e 20 62 65 20 73 69  he RHS can be si
abf0: 6d 70 6c 69 66 69 65 64 20 74 6f 20 73 6f 6d 65  mplified to some
ac00: 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6c  thing.      ** l
ac10: 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 20 20  ike this:.      
ac20: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
ac30: 20 65 78 70 72 31 20 3d 3d 20 3f 31 0a 20 20 20   expr1 == ?1.   
ac40: 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31     **      expr1
ac50: 20 3c 3e 20 3f 32 0a 20 20 20 20 20 20 2a 2a 0a   <> ?2.      **.
ac60: 20 20 20 20 20 20 2a 2a 20 42 75 74 2c 20 74 68        ** But, th
ac70: 65 20 52 48 53 20 6f 66 20 74 68 65 20 3d 3d 20  e RHS of the == 
ac80: 6f 72 20 3c 3e 20 69 73 20 6d 61 72 6b 65 64 20  or <> is marked 
ac90: 77 69 74 68 20 74 68 65 20 45 50 5f 47 65 6e 65  with the EP_Gene
aca0: 72 69 63 20 66 6c 61 67 0a 20 20 20 20 20 20 2a  ric flag.      *
acb0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 79  * so that it may
acc0: 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
acd0: 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  to the computati
ace0: 6f 6e 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  on of comparison
acf0: 0a 20 20 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  .      ** affini
ad00: 74 79 20 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  ty or the collat
ad10: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
ad20: 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  use for comparis
ad30: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  on.  Otherwise,.
ad40: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 6d        ** the sem
ad50: 61 6e 74 69 63 73 20 77 6f 75 6c 64 20 62 65 20  antics would be 
ad60: 73 75 62 74 6c 79 20 64 69 66 66 65 72 65 6e 74  subtly different
ad70: 20 66 72 6f 6d 20 49 4e 20 6f 72 20 4e 4f 54 20   from IN or NOT 
ad80: 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
ad90: 20 20 20 45 78 70 72 20 2a 70 52 48 53 20 3d 20     Expr *pRHS = 
ada0: 59 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  Y->a[0].pExpr;. 
adb0: 20 20 20 20 20 59 2d 3e 61 5b 30 5d 2e 70 45 78       Y->a[0].pEx
adc0: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  pr = 0;.      sq
add0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
ade0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
adf0: 59 29 3b 0a 20 20 20 20 20 20 2f 2a 20 70 52 48  Y);.      /* pRH
ae00: 53 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  S cannot be NULL
ae10: 20 62 65 63 61 75 73 65 20 61 20 6d 61 6c 6c 6f   because a mallo
ae20: 63 20 65 72 72 6f 72 20 77 6f 75 6c 64 20 68 61  c error would ha
ae30: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ve been detected
ae40: 0a 20 20 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  .      ** before
ae50: 20 6e 6f 77 20 61 6e 64 20 63 6f 6e 74 72 6f 6c   now and control
ae60: 20 77 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65   would have neve
ae70: 72 20 72 65 61 63 68 65 64 20 74 68 69 73 20 70  r reached this p
ae80: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  oint */.      if
ae90: 28 20 41 4c 57 41 59 53 28 70 52 48 53 29 20 29  ( ALWAYS(pRHS) )
aea0: 7b 0a 20 20 20 20 20 20 20 20 70 52 48 53 2d 3e  {.        pRHS->
aeb0: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
aec0: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52  late;.        pR
aed0: 48 53 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  HS->flags |= EP_
aee0: 47 65 6e 65 72 69 63 3b 0a 20 20 20 20 20 20 7d  Generic;.      }
aef0: 0a 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74  .      A = sqlit
af00: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
af10: 4e 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  N ? TK_NE : TK_E
af20: 51 2c 20 41 2c 20 70 52 48 53 29 3b 0a 20 20 20  Q, A, pRHS);.   
af30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 20   }else{.      A 
af40: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
af50: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 41 2c  Parse, TK_IN, A,
af60: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41   0);.      if( A
af70: 20 29 7b 0a 20 20 20 20 20 20 20 20 41 2d 3e 78   ){.        A->x
af80: 2e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 20 20  .pList = Y;.    
af90: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
afa0: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
afb0: 28 70 50 61 72 73 65 2c 20 41 29 3b 0a 20 20 20  (pParse, A);.   
afc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
afd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
afe0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
aff0: 64 62 2c 20 59 29 3b 0a 20 20 20 20 20 20 7d 0a  db, Y);.      }.
b000: 20 20 20 20 20 20 69 66 28 20 4e 20 29 20 41 20        if( N ) A 
b010: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b020: 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41  Parse, TK_NOT, A
b030: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
b040: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50    expr(A) ::= LP
b050: 20 73 65 6c 65 63 74 28 58 29 20 52 50 2e 20 7b   select(X) RP. {
b060: 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33  .    A = sqlite3
b070: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b080: 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a  _SELECT, 0, 0);.
b090: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
b0a0: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
b0b0: 2c 20 41 2c 20 58 29 3b 0a 20 20 7d 0a 20 20 65  , A, X);.  }.  e
b0c0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
b0d0: 41 29 20 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 73  A) in_op(N) LP s
b0e0: 65 6c 65 63 74 28 59 29 20 52 50 2e 20 20 5b 49  elect(Y) RP.  [I
b0f0: 4e 5d 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c  N] {.    A = sql
b100: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b110: 2c 20 54 4b 5f 49 4e 2c 20 41 2c 20 30 29 3b 0a  , TK_IN, A, 0);.
b120: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
b130: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
b140: 2c 20 41 2c 20 59 29 3b 0a 20 20 20 20 69 66 28  , A, Y);.    if(
b150: 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33   N ) A = sqlite3
b160: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b170: 5f 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20 7d  _NOT, A, 0);.  }
b180: 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .  expr(A) ::= e
b190: 78 70 72 28 41 29 20 69 6e 5f 6f 70 28 4e 29 20  xpr(A) in_op(N) 
b1a0: 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 20 70 61  nm(Y) dbnm(Z) pa
b1b0: 72 65 6e 5f 65 78 70 72 6c 69 73 74 28 45 29 2e  ren_exprlist(E).
b1c0: 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 53 72 63 4c   [IN] {.    SrcL
b1d0: 69 73 74 20 2a 70 53 72 63 20 3d 20 73 71 6c 69  ist *pSrc = sqli
b1e0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
b1f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 26  (pParse->db, 0,&
b200: 59 2c 26 5a 29 3b 0a 20 20 20 20 53 65 6c 65 63  Y,&Z);.    Selec
b210: 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  t *pSelect = sql
b220: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50  ite3SelectNew(pP
b230: 61 72 73 65 2c 20 30 2c 70 53 72 63 2c 30 2c 30  arse, 0,pSrc,0,0
b240: 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 69  ,0,0,0,0);.    i
b250: 66 28 20 45 20 29 20 20 73 71 6c 69 74 65 33 53  f( E )  sqlite3S
b260: 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28 70  rcListFuncArgs(p
b270: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 20 3f  Parse, pSelect ?
b280: 20 70 53 72 63 20 3a 20 30 2c 20 45 29 3b 0a 20   pSrc : 0, E);. 
b290: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45     A = sqlite3PE
b2a0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
b2b0: 4e 2c 20 41 2c 20 30 29 3b 0a 20 20 20 20 73 71  N, A, 0);.    sq
b2c0: 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
b2d0: 65 63 74 28 70 50 61 72 73 65 2c 20 41 2c 20 70  ect(pParse, A, p
b2e0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
b2f0: 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33   N ) A = sqlite3
b300: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b310: 5f 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20 7d  _NOT, A, 0);.  }
b320: 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 45  .  expr(A) ::= E
b330: 58 49 53 54 53 20 4c 50 20 73 65 6c 65 63 74 28  XISTS LP select(
b340: 59 29 20 52 50 2e 20 7b 0a 20 20 20 20 45 78 70  Y) RP. {.    Exp
b350: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 41 20  r *p;.    p = A 
b360: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b370: 50 61 72 73 65 2c 20 54 4b 5f 45 58 49 53 54 53  Parse, TK_EXISTS
b380: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
b390: 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65  ite3PExprAddSele
b3a0: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 59 29  ct(pParse, p, Y)
b3b0: 3b 0a 20 20 7d 0a 25 65 6e 64 69 66 20 53 51 4c  ;.  }.%endif SQL
b3c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b3d0: 59 0a 0a 2f 2a 20 43 41 53 45 20 65 78 70 72 65  Y../* CASE expre
b3e0: 73 73 69 6f 6e 73 20 2a 2f 0a 65 78 70 72 28 41  ssions */.expr(A
b3f0: 29 20 3a 3a 3d 20 43 41 53 45 20 63 61 73 65 5f  ) ::= CASE case_
b400: 6f 70 65 72 61 6e 64 28 58 29 20 63 61 73 65 5f  operand(X) case_
b410: 65 78 70 72 6c 69 73 74 28 59 29 20 63 61 73 65  exprlist(Y) case
b420: 5f 65 6c 73 65 28 5a 29 20 45 4e 44 2e 20 7b 0a  _else(Z) END. {.
b430: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78    A = sqlite3PEx
b440: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 41  pr(pParse, TK_CA
b450: 53 45 2c 20 58 2c 20 30 29 3b 0a 20 20 69 66 28  SE, X, 0);.  if(
b460: 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e 78 2e 70   A ){.    A->x.p
b470: 4c 69 73 74 20 3d 20 5a 20 3f 20 73 71 6c 69 74  List = Z ? sqlit
b480: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
b490: 28 70 50 61 72 73 65 2c 59 2c 5a 29 20 3a 20 59  (pParse,Y,Z) : Y
b4a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
b4b0: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
b4c0: 67 73 28 70 50 61 72 73 65 2c 20 41 29 3b 0a 20  gs(pParse, A);. 
b4d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
b4e0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
b4f0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29  e(pParse->db, Y)
b500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
b510: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
b520: 64 62 2c 20 5a 29 3b 0a 20 20 7d 0a 7d 0a 25 74  db, Z);.  }.}.%t
b530: 79 70 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73  ype case_exprlis
b540: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
b550: 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65  estructor case_e
b560: 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  xprlist {sqlite3
b570: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
b580: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
b590: 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41  .case_exprlist(A
b5a0: 29 20 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c  ) ::= case_exprl
b5b0: 69 73 74 28 41 29 20 57 48 45 4e 20 65 78 70 72  ist(A) WHEN expr
b5c0: 28 59 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29  (Y) THEN expr(Z)
b5d0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
b5e0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
b5f0: 70 50 61 72 73 65 2c 41 2c 20 59 29 3b 0a 20 20  pParse,A, Y);.  
b600: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
b610: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
b620: 2c 41 2c 20 5a 29 3b 0a 7d 0a 63 61 73 65 5f 65  ,A, Z);.}.case_e
b630: 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 57  xprlist(A) ::= W
b640: 48 45 4e 20 65 78 70 72 28 59 29 20 54 48 45 4e  HEN expr(Y) THEN
b650: 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20 20 41 20   expr(Z). {.  A 
b660: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
b670: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30  tAppend(pParse,0
b680: 2c 20 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  , Y);.  A = sqli
b690: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
b6a0: 64 28 70 50 61 72 73 65 2c 41 2c 20 5a 29 3b 0a  d(pParse,A, Z);.
b6b0: 7d 0a 25 74 79 70 65 20 63 61 73 65 5f 65 6c 73  }.%type case_els
b6c0: 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72  e {Expr*}.%destr
b6d0: 75 63 74 6f 72 20 63 61 73 65 5f 65 6c 73 65 20  uctor case_else 
b6e0: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
b6f0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
b700: 24 29 3b 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41  $);}.case_else(A
b710: 29 20 3a 3a 3d 20 20 45 4c 53 45 20 65 78 70 72  ) ::=  ELSE expr
b720: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
b730: 3d 20 58 3b 7d 0a 63 61 73 65 5f 65 6c 73 65 28  = X;}.case_else(
b740: 41 29 20 3a 3a 3d 20 20 2e 20 20 20 20 20 20 20  A) ::=  .       
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
b760: 20 3d 20 30 3b 7d 20 0a 25 74 79 70 65 20 63 61   = 0;} .%type ca
b770: 73 65 5f 6f 70 65 72 61 6e 64 20 7b 45 78 70 72  se_operand {Expr
b780: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63  *}.%destructor c
b790: 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b 73 71 6c  ase_operand {sql
b7a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
b7b0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
b7c0: 0a 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 41 29  .case_operand(A)
b7d0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20   ::= expr(X).   
b7e0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
b7f0: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
b800: 58 2a 2f 7d 20 0a 63 61 73 65 5f 6f 70 65 72 61  X*/} .case_opera
b810: 6e 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  nd(A) ::= .     
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
b830: 20 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65 20 65   = 0;} ..%type e
b840: 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  xprlist {ExprLis
b850: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
b860: 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65  exprlist {sqlite
b870: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
b880: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
b890: 7d 0a 25 74 79 70 65 20 6e 65 78 70 72 6c 69 73  }.%type nexprlis
b8a0: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
b8b0: 65 73 74 72 75 63 74 6f 72 20 6e 65 78 70 72 6c  estructor nexprl
b8c0: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
b8d0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
b8e0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 65 78  e->db, $$);}..ex
b8f0: 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 65  prlist(A) ::= ne
b900: 78 70 72 6c 69 73 74 28 41 29 2e 0a 65 78 70 72  xprlist(A)..expr
b910: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  list(A) ::= .   
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
b940: 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41 29 20 3a  }.nexprlist(A) :
b950: 3a 3d 20 6e 65 78 70 72 6c 69 73 74 28 41 29 20  := nexprlist(A) 
b960: 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e 0a 20  COMMA expr(Y).. 
b970: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
b980: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
b990: 61 72 73 65 2c 41 2c 59 29 3b 7d 0a 6e 65 78 70  arse,A,Y);}.nexp
b9a0: 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70  rlist(A) ::= exp
b9b0: 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  r(Y)..    {A = s
b9c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b9d0: 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 59 29  pend(pParse,0,Y)
b9e0: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
b9f0: 2d 59 2a 2f 7d 0a 0a 25 69 66 6e 64 65 66 20 53  -Y*/}..%ifndef S
ba00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
ba10: 45 52 59 0a 2f 2a 20 41 20 70 61 72 65 6e 5f 65  ERY./* A paren_e
ba20: 78 70 72 6c 69 73 74 20 69 73 20 61 6e 20 6f 70  xprlist is an op
ba30: 74 69 6f 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  tional expressio
ba40: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 65 64  n list contained
ba50: 20 69 6e 73 69 64 65 0a 2a 2a 20 6f 66 20 70 61   inside.** of pa
ba60: 72 65 6e 74 68 65 73 69 73 20 2a 2f 0a 25 74 79  renthesis */.%ty
ba70: 70 65 20 70 61 72 65 6e 5f 65 78 70 72 6c 69 73  pe paren_exprlis
ba80: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
ba90: 65 73 74 72 75 63 74 6f 72 20 70 61 72 65 6e 5f  estructor paren_
baa0: 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65  exprlist {sqlite
bab0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
bac0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
bad0: 7d 0a 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 74  }.paren_exprlist
bae0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 7b 41 20 3d  (A) ::= .   {A =
baf0: 20 30 3b 7d 0a 70 61 72 65 6e 5f 65 78 70 72 6c   0;}.paren_exprl
bb00: 69 73 74 28 41 29 20 3a 3a 3d 20 4c 50 20 65 78  ist(A) ::= LP ex
bb10: 70 72 6c 69 73 74 28 58 29 20 52 50 2e 20 20 7b  prlist(X) RP.  {
bb20: 41 20 3d 20 58 3b 7d 0a 25 65 6e 64 69 66 20 53  A = X;}.%endif S
bb30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
bb40: 45 52 59 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ERY...//////////
bb50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bb60: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 49  /// The CREATE I
bb70: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  NDEX command ///
bb80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bb90: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
bba0: 63 72 65 61 74 65 6b 77 28 53 29 20 75 6e 69 71  createkw(S) uniq
bbb0: 75 65 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20  ueflag(U) INDEX 
bbc0: 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 45 29 20  ifnotexists(NE) 
bbd0: 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29 0a 20 20  nm(X) dbnm(D).  
bbe0: 20 20 20 20 20 20 4f 4e 20 6e 6d 28 59 29 20 4c        ON nm(Y) L
bbf0: 50 20 73 6f 72 74 6c 69 73 74 28 5a 29 20 52 50  P sortlist(Z) RP
bc00: 20 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b   where_opt(W). {
bc10: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
bc20: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 58  Index(pParse, &X
bc30: 2c 20 26 44 2c 20 0a 20 20 20 20 20 20 20 20 20  , &D, .         
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
bc50: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
bc60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59  (pParse->db,0,&Y
bc70: 2c 30 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20 20  ,0), Z, U,.     
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc90: 20 26 53 2c 20 57 2c 20 53 51 4c 49 54 45 5f 53   &S, W, SQLITE_S
bca0: 4f 5f 41 53 43 2c 20 4e 45 2c 20 53 51 4c 49 54  O_ASC, NE, SQLIT
bcb0: 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
bcc0: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71  );.}..%type uniq
bcd0: 75 65 66 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69  ueflag {int}.uni
bce0: 71 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55  queflag(A) ::= U
bcf0: 4e 49 51 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f  NIQUE.  {A = OE_
bd00: 41 62 6f 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c  Abort;}.uniquefl
bd10: 61 67 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  ag(A) ::= .     
bd20: 20 20 20 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b     {A = OE_None;
bd30: 7d 0a 0a 0a 2f 2f 20 54 68 65 20 65 69 64 6c 69  }...// The eidli
bd40: 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  st non-terminal 
bd50: 28 45 78 70 72 65 73 73 69 6f 6e 20 49 64 20 4c  (Expression Id L
bd60: 69 73 74 29 20 67 65 6e 65 72 61 74 65 73 20 61  ist) generates a
bd70: 6e 20 45 78 70 72 4c 69 73 74 0a 2f 2f 20 66 72  n ExprList.// fr
bd80: 6f 6d 20 61 20 6c 69 73 74 20 6f 66 20 69 64 65  om a list of ide
bd90: 6e 74 69 66 69 65 72 73 2e 20 20 54 68 65 20 69  ntifiers.  The i
bda0: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 73 20  dentifier names 
bdb0: 61 72 65 20 69 6e 20 45 78 70 72 4c 69 73 74 2e  are in ExprList.
bdc0: 61 5b 5d 2e 7a 4e 61 6d 65 2e 0a 2f 2f 20 54 68  a[].zName..// Th
bdd0: 69 73 20 6c 69 73 74 20 69 73 20 73 74 6f 72 65  is list is store
bde0: 64 20 69 6e 20 61 6e 20 45 78 70 72 4c 69 73 74  d in an ExprList
bdf0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 6e 20   rather than an 
be00: 49 64 4c 69 73 74 20 73 6f 20 74 68 61 74 20 69  IdList so that i
be10: 74 0a 2f 2f 20 63 61 6e 20 62 65 20 65 61 73 69  t.// can be easi
be20: 6c 79 20 73 65 6e 74 20 74 6f 20 73 71 6c 69 74  ly sent to sqlit
be30: 65 33 43 6f 6c 75 6d 6e 73 45 78 70 72 4c 69 73  e3ColumnsExprLis
be40: 74 28 29 2e 0a 2f 2f 0a 2f 2f 20 65 69 64 6c 69  t()..//.// eidli
be50: 73 74 20 69 73 20 67 72 6f 75 70 65 64 20 77 69  st is grouped wi
be60: 74 68 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  th CREATE INDEX 
be70: 62 65 63 61 75 73 65 20 69 74 20 75 73 65 64 20  because it used 
be80: 74 6f 20 62 65 20 74 68 65 20 6e 6f 6e 2d 74 65  to be the non-te
be90: 72 6d 69 6e 61 6c 0a 2f 2f 20 75 73 65 64 20 66  rminal.// used f
bea0: 6f 72 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  or the arguments
beb0: 20 74 6f 20 61 6e 20 69 6e 64 65 78 2e 20 20 54   to an index.  T
bec0: 68 61 74 20 69 73 20 6a 75 73 74 20 61 6e 20 68  hat is just an h
bed0: 69 73 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65  istorical accide
bee0: 6e 74 2e 0a 2f 2f 0a 2f 2f 20 49 4d 50 4f 52 54  nt..//.// IMPORT
bef0: 41 4e 54 20 43 4f 4d 50 41 54 49 42 49 4c 49 54  ANT COMPATIBILIT
bf00: 59 20 4e 4f 54 45 3a 20 20 53 6f 6d 65 20 70 72  Y NOTE:  Some pr
bf10: 69 6f 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ior versions of 
bf20: 53 51 4c 69 74 65 20 61 63 63 65 70 74 65 64 0a  SQLite accepted.
bf30: 2f 2f 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  // COLLATE claus
bf40: 65 73 20 61 6e 64 20 41 53 43 20 6f 72 20 44 45  es and ASC or DE
bf50: 53 43 20 6b 65 79 77 6f 72 64 73 20 6f 6e 20 49  SC keywords on I
bf60: 44 20 6c 69 73 74 73 20 69 6e 20 69 6e 61 70 70  D lists in inapp
bf70: 72 6f 70 72 69 61 74 65 0a 2f 2f 20 70 6c 61 63  ropriate.// plac
bf80: 65 73 20 2d 20 70 6c 61 63 65 73 20 74 68 61 74  es - places that
bf90: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
bfa0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
bfb0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 73 63 68  qlite_master sch
bfc0: 65 6d 61 2e 0a 2f 2f 20 54 68 6f 73 65 20 65 78  ema..// Those ex
bfd0: 74 72 61 20 66 65 61 74 75 72 65 73 20 77 65 72  tra features wer
bfe0: 65 20 69 67 6e 6f 72 65 64 2e 20 20 42 75 74 20  e ignored.  But 
bff0: 62 65 63 61 75 73 65 20 74 68 65 79 20 6d 69 67  because they mig
c000: 68 74 20 62 65 20 69 6e 20 73 6f 6d 65 0a 2f 2f  ht be in some.//
c010: 20 28 62 75 73 74 65 64 29 20 6f 6c 64 20 64 61   (busted) old da
c020: 74 61 62 61 73 65 73 2c 20 77 65 20 6e 65 65 64  tabases, we need
c030: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 70 61 72   to continue par
c040: 73 69 6e 67 20 74 68 65 6d 20 77 68 65 6e 20 6c  sing them when l
c050: 6f 61 64 69 6e 67 0a 2f 2f 20 68 69 73 74 6f 72  oading.// histor
c060: 69 63 61 6c 20 73 63 68 65 6d 61 73 2e 0a 2f 2f  ical schemas..//
c070: 0a 25 74 79 70 65 20 65 69 64 6c 69 73 74 20 7b  .%type eidlist {
c080: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
c090: 72 75 63 74 6f 72 20 65 69 64 6c 69 73 74 20 7b  ructor eidlist {
c0a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
c0b0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
c0c0: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 65 69  , $$);}.%type ei
c0d0: 64 6c 69 73 74 5f 6f 70 74 20 7b 45 78 70 72 4c  dlist_opt {ExprL
c0e0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
c0f0: 72 20 65 69 64 6c 69 73 74 5f 6f 70 74 20 7b 73  r eidlist_opt {s
c100: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
c110: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
c120: 20 24 24 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65   $$);}..%include
c130: 20 7b 0a 20 20 2f 2a 20 41 64 64 20 61 20 73 69   {.  /* Add a si
c140: 6e 67 6c 65 20 6e 65 77 20 74 65 72 6d 20 74 6f  ngle new term to
c150: 20 61 6e 20 45 78 70 72 4c 69 73 74 20 74 68 61   an ExprList tha
c160: 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
c170: 72 65 20 61 0a 20 20 2a 2a 20 6c 69 73 74 20 6f  re a.  ** list o
c180: 66 20 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20  f identifiers.  
c190: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
c1a0: 69 66 20 74 68 65 20 49 44 20 6c 69 73 74 20 63  if the ID list c
c1b0: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 61 20 43  ontains.  ** a C
c1c0: 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 20 6f 72  OLLATE clause or
c1d0: 20 61 6e 20 41 53 43 20 6f 72 20 44 45 53 43 20   an ASC or DESC 
c1e0: 6b 65 79 77 6f 72 64 2c 20 65 78 63 65 70 74 20  keyword, except 
c1f0: 69 67 6e 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20  ignore the.  ** 
c200: 65 72 72 6f 72 20 77 68 69 6c 65 20 70 61 72 73  error while pars
c210: 69 6e 67 20 61 20 6c 65 67 61 63 79 20 73 63 68  ing a legacy sch
c220: 65 6d 61 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74  ema..  */.  stat
c230: 69 63 20 45 78 70 72 4c 69 73 74 20 2a 70 61 72  ic ExprList *par
c240: 73 65 72 41 64 64 45 78 70 72 49 64 4c 69 73 74  serAddExprIdList
c250: 54 65 72 6d 28 0a 20 20 20 20 50 61 72 73 65 20  Term(.    Parse 
c260: 2a 70 50 61 72 73 65 2c 0a 20 20 20 20 45 78 70  *pParse,.    Exp
c270: 72 4c 69 73 74 20 2a 70 50 72 69 6f 72 2c 0a 20  rList *pPrior,. 
c280: 20 20 20 54 6f 6b 65 6e 20 2a 70 49 64 54 6f 6b     Token *pIdTok
c290: 65 6e 2c 0a 20 20 20 20 69 6e 74 20 68 61 73 43  en,.    int hasC
c2a0: 6f 6c 6c 61 74 65 2c 0a 20 20 20 20 69 6e 74 20  ollate,.    int 
c2b0: 73 6f 72 74 4f 72 64 65 72 0a 20 20 29 7b 0a 20  sortOrder.  ){. 
c2c0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d     ExprList *p =
c2d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
c2e0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
c2f0: 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 69  Prior, 0);.    i
c300: 66 28 20 28 68 61 73 43 6f 6c 6c 61 74 65 20 7c  f( (hasCollate |
c310: 7c 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c  | sortOrder!=SQL
c320: 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44  ITE_SO_UNDEFINED
c330: 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 50 61  ).        && pPa
c340: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
c350: 73 79 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  sy==0.    ){.   
c360: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c370: 73 67 28 70 50 61 72 73 65 2c 20 22 73 79 6e 74  sg(pParse, "synt
c380: 61 78 20 65 72 72 6f 72 20 61 66 74 65 72 20 63  ax error after c
c390: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5c 22 25 2e 2a  olumn name \"%.*
c3a0: 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c3c0: 49 64 54 6f 6b 65 6e 2d 3e 6e 2c 20 70 49 64 54  IdToken->n, pIdT
c3d0: 6f 6b 65 6e 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a  oken->z);.    }.
c3e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
c3f0: 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
c400: 65 2c 20 70 2c 20 70 49 64 54 6f 6b 65 6e 2c 20  e, p, pIdToken, 
c410: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  1);.    return p
c420: 3b 0a 20 20 7d 0a 7d 20 2f 2f 20 65 6e 64 20 25  ;.  }.} // end %
c430: 69 6e 63 6c 75 64 65 0a 0a 65 69 64 6c 69 73 74  include..eidlist
c440: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 65        {A = 0;}.e
c470: 69 64 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a  idlist_opt(A) ::
c480: 3d 20 4c 50 20 65 69 64 6c 69 73 74 28 58 29 20  = LP eidlist(X) 
c490: 52 50 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d  RP.         {A =
c4a0: 20 58 3b 7d 0a 65 69 64 6c 69 73 74 28 41 29 20   X;}.eidlist(A) 
c4b0: 3a 3a 3d 20 65 69 64 6c 69 73 74 28 41 29 20 43  ::= eidlist(A) C
c4c0: 4f 4d 4d 41 20 6e 6d 28 59 29 20 63 6f 6c 6c 61  OMMA nm(Y) colla
c4d0: 74 65 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28  te(C) sortorder(
c4e0: 5a 29 2e 20 20 7b 0a 20 20 41 20 3d 20 70 61 72  Z).  {.  A = par
c4f0: 73 65 72 41 64 64 45 78 70 72 49 64 4c 69 73 74  serAddExprIdList
c500: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 41 2c 20  Term(pParse, A, 
c510: 26 59 2c 20 43 2c 20 5a 29 3b 0a 7d 0a 65 69 64  &Y, C, Z);.}.eid
c520: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59  list(A) ::= nm(Y
c530: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
c540: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
c550: 20 3d 20 70 61 72 73 65 72 41 64 64 45 78 70 72   = parserAddExpr
c560: 49 64 4c 69 73 74 54 65 72 6d 28 70 50 61 72 73  IdListTerm(pPars
c570: 65 2c 20 30 2c 20 26 59 2c 20 43 2c 20 5a 29 3b  e, 0, &Y, C, Z);
c580: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
c590: 59 2a 2f 0a 7d 0a 0a 25 74 79 70 65 20 63 6f 6c  Y*/.}..%type col
c5a0: 6c 61 74 65 20 7b 69 6e 74 7d 0a 63 6f 6c 6c 61  late {int}.colla
c5b0: 74 65 28 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20  te(C) ::= .     
c5c0: 20 20 20 20 20 20 20 20 20 7b 43 20 3d 20 30 3b           {C = 0;
c5d0: 7d 0a 63 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d  }.collate(C) ::=
c5e0: 20 43 4f 4c 4c 41 54 45 20 69 64 73 2e 20 20 20   COLLATE ids.   
c5f0: 7b 43 20 3d 20 31 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f  {C = 1;}.../////
c600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c610: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f  //////// The DRO
c620: 50 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20  P INDEX command 
c630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
c650: 20 3a 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20   ::= DROP INDEX 
c660: 69 66 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c  ifexists(E) full
c670: 6e 61 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69  name(X).   {sqli
c680: 74 65 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61  te3DropIndex(pPa
c690: 72 73 65 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f  rse, X, E);}..//
c6a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c6b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
c6c0: 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f  VACUUM command /
c6d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c6e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
c6f0: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
c700: 4d 49 54 5f 56 41 43 55 55 4d 0a 25 69 66 6e 64  MIT_VACUUM.%ifnd
c710: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c720: 54 54 41 43 48 0a 63 6d 64 20 3a 3a 3d 20 56 41  TTACH.cmd ::= VA
c730: 43 55 55 4d 2e 20 20 20 20 20 20 20 20 20 20 20  CUUM.           
c740: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63       {sqlite3Vac
c750: 75 75 6d 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a  uum(pParse,0);}.
c760: 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d 20 6e  cmd ::= VACUUM n
c770: 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b  m(X).          {
c780: 73 71 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50  sqlite3Vacuum(pP
c790: 61 72 73 65 2c 26 58 29 3b 7d 0a 25 65 6e 64 69  arse,&X);}.%endi
c7a0: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  f  SQLITE_OMIT_A
c7b0: 54 54 41 43 48 0a 25 65 6e 64 69 66 20 20 53 51  TTACH.%endif  SQ
c7c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
c7d0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
c7e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
c7f0: 54 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  The PRAGMA comma
c800: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
c810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c820: 0a 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  .//.%ifndef SQLI
c830: 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 63  TE_OMIT_PRAGMA.c
c840: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
c850: 28 58 29 20 64 62 6e 6d 28 5a 29 2e 20 20 20 20  (X) dbnm(Z).    
c860: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
c870: 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73  ite3Pragma(pPars
c880: 65 2c 26 58 2c 26 5a 2c 30 2c 30 29 3b 7d 0a 63  e,&X,&Z,0,0);}.c
c890: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
c8a0: 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6e  (X) dbnm(Z) EQ n
c8b0: 6d 6e 75 6d 28 59 29 2e 20 20 20 20 7b 73 71 6c  mnum(Y).    {sql
c8c0: 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73  ite3Pragma(pPars
c8d0: 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a  e,&X,&Z,&Y,0);}.
c8e0: 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e  cmd ::= PRAGMA n
c8f0: 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20  m(X) dbnm(Z) LP 
c900: 6e 6d 6e 75 6d 28 59 29 20 52 50 2e 20 7b 73 71  nmnum(Y) RP. {sq
c910: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
c920: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d  se,&X,&Z,&Y,0);}
c930: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
c940: 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51  nm(X) dbnm(Z) EQ
c950: 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29 2e 20 0a   minus_num(Y). .
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c980: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
c990: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
c9a0: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 7d  se,&X,&Z,&Y,1);}
c9b0: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
c9c0: 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50  nm(X) dbnm(Z) LP
c9d0: 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29 20 52 50   minus_num(Y) RP
c9e0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
ca10: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50  sqlite3Pragma(pP
ca20: 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29  arse,&X,&Z,&Y,1)
ca30: 3b 7d 0a 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d  ;}..nmnum(A) ::=
ca40: 20 70 6c 75 73 5f 6e 75 6d 28 41 29 2e 0a 6e 6d   plus_num(A)..nm
ca50: 6e 75 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 41 29  num(A) ::= nm(A)
ca60: 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 4f  ..nmnum(A) ::= O
ca70: 4e 28 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a  N(A)..nmnum(A) :
ca80: 3a 3d 20 44 45 4c 45 54 45 28 41 29 2e 0a 6e 6d  := DELETE(A)..nm
ca90: 6e 75 6d 28 41 29 20 3a 3a 3d 20 44 45 46 41 55  num(A) ::= DEFAU
caa0: 4c 54 28 41 29 2e 0a 25 65 6e 64 69 66 20 53 51  LT(A)..%endif SQ
cab0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41  LITE_OMIT_PRAGMA
cac0: 0a 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6e 75  .%token_class nu
cad0: 6d 62 65 72 20 49 4e 54 45 47 45 52 7c 46 4c 4f  mber INTEGER|FLO
cae0: 41 54 2e 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20  AT..plus_num(A) 
caf0: 3a 3a 3d 20 50 4c 55 53 20 6e 75 6d 62 65 72 28  ::= PLUS number(
cb00: 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58  X).       {A = X
cb10: 3b 7d 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a  ;}.plus_num(A) :
cb20: 3a 3d 20 6e 75 6d 62 65 72 28 41 29 2e 0a 6d 69  := number(A)..mi
cb30: 6e 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d  nus_num(A) ::= M
cb40: 49 4e 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20  INUS number(X). 
cb50: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 2f 2f 2f      {A = X;}.///
cb60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cb70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52  ///////// The CR
cb80: 45 41 54 45 20 54 52 49 47 47 45 52 20 63 6f 6d  EATE TRIGGER com
cb90: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
cba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e  //////////..%ifn
cbb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cbc0: 54 52 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d  TRIGGER..cmd ::=
cbd0: 20 63 72 65 61 74 65 6b 77 20 74 72 69 67 67 65   createkw trigge
cbe0: 72 5f 64 65 63 6c 28 41 29 20 42 45 47 49 4e 20  r_decl(A) BEGIN 
cbf0: 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74  trigger_cmd_list
cc00: 28 53 29 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20  (S) END(Z). {.  
cc10: 54 6f 6b 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c  Token all;.  all
cc20: 2e 7a 20 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e  .z = A.z;.  all.
cc30: 6e 20 3d 20 28 69 6e 74 29 28 5a 2e 7a 20 2d 20  n = (int)(Z.z - 
cc40: 41 2e 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71  A.z) + Z.n;.  sq
cc50: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
cc60: 65 72 28 70 50 61 72 73 65 2c 20 53 2c 20 26 61  er(pParse, S, &a
cc70: 6c 6c 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72 5f  ll);.}..trigger_
cc80: 64 65 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d 70  decl(A) ::= temp
cc90: 28 54 29 20 54 52 49 47 47 45 52 20 69 66 6e 6f  (T) TRIGGER ifno
cca0: 74 65 78 69 73 74 73 28 4e 4f 45 52 52 29 20 6e  texists(NOERR) n
ccb0: 6d 28 42 29 20 64 62 6e 6d 28 5a 29 20 0a 20 20  m(B) dbnm(Z) .  
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccd0: 20 20 74 72 69 67 67 65 72 5f 74 69 6d 65 28 43    trigger_time(C
cce0: 29 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28  ) trigger_event(
ccf0: 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D).             
cd00: 20 20 20 20 20 20 20 4f 4e 20 66 75 6c 6c 6e 61         ON fullna
cd10: 6d 65 28 45 29 20 66 6f 72 65 61 63 68 5f 63 6c  me(E) foreach_cl
cd20: 61 75 73 65 20 77 68 65 6e 5f 63 6c 61 75 73 65  ause when_clause
cd30: 28 47 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (G). {.  sqlite3
cd40: 42 65 67 69 6e 54 72 69 67 67 65 72 28 70 50 61  BeginTrigger(pPa
cd50: 72 73 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c 20  rse, &B, &Z, C, 
cd60: 44 2e 61 2c 20 44 2e 62 2c 20 45 2c 20 47 2c 20  D.a, D.b, E, G, 
cd70: 54 2c 20 4e 4f 45 52 52 29 3b 0a 20 20 41 20 3d  T, NOERR);.  A =
cd80: 20 28 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29 3b 20 2f   (Z.n==0?B:Z); /
cd90: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 54 2a  *A-overwrites-T*
cda0: 2f 0a 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  /.}..%type trigg
cdb0: 65 72 5f 74 69 6d 65 20 7b 69 6e 74 7d 0a 74 72  er_time {int}.tr
cdc0: 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a  igger_time(A) ::
cdd0: 3d 20 42 45 46 4f 52 45 7c 41 46 54 45 52 28 58  = BEFORE|AFTER(X
cde0: 29 2e 20 20 7b 20 41 20 3d 20 40 58 3b 20 2f 2a  ).  { A = @X; /*
cdf0: 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f  A-overwrites-X*/
ce00: 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28   }.trigger_time(
ce10: 41 29 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20 4f  A) ::= INSTEAD O
ce20: 46 2e 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e 53  F.  { A = TK_INS
ce30: 54 45 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f 74  TEAD;}.trigger_t
ce40: 69 6d 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  ime(A) ::= .    
ce50: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b          { A = TK
ce60: 5f 42 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79 70  _BEFORE; }..%typ
ce70: 65 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20  e trigger_event 
ce80: 7b 73 74 72 75 63 74 20 54 72 69 67 45 76 65 6e  {struct TrigEven
ce90: 74 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74  t}.%destructor t
cea0: 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 71  rigger_event {sq
ceb0: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
cec0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
ced0: 2e 62 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76  .b);}.trigger_ev
cee0: 65 6e 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54  ent(A) ::= DELET
cef0: 45 7c 49 4e 53 45 52 54 28 58 29 2e 20 20 20 7b  E|INSERT(X).   {
cf00: 41 2e 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76  A.a = @X; /*A-ov
cf10: 65 72 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e 62  erwrites-X*/ A.b
cf20: 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65   = 0;}.trigger_e
cf30: 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41  vent(A) ::= UPDA
cf40: 54 45 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  TE(X).          
cf50: 7b 41 2e 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f  {A.a = @X; /*A-o
cf60: 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e  verwrites-X*/ A.
cf70: 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f  b = 0;}.trigger_
cf80: 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44  event(A) ::= UPD
cf90: 41 54 45 20 4f 46 20 69 64 6c 69 73 74 28 58 29  ATE OF idlist(X)
cfa0: 2e 7b 41 2e 61 20 3d 20 54 4b 5f 55 50 44 41 54  .{A.a = TK_UPDAT
cfb0: 45 3b 20 41 2e 62 20 3d 20 58 3b 7d 0a 0a 66 6f  E; A.b = X;}..fo
cfc0: 72 65 61 63 68 5f 63 6c 61 75 73 65 20 3a 3a 3d  reach_clause ::=
cfd0: 20 2e 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73   ..foreach_claus
cfe0: 65 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 52  e ::= FOR EACH R
cff0: 4f 57 2e 0a 0a 25 74 79 70 65 20 77 68 65 6e 5f  OW...%type when_
d000: 63 6c 61 75 73 65 20 7b 45 78 70 72 2a 7d 0a 25  clause {Expr*}.%
d010: 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 6e 5f  destructor when_
d020: 63 6c 61 75 73 65 20 7b 73 71 6c 69 74 65 33 45  clause {sqlite3E
d030: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
d040: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 77 68 65 6e  ->db, $$);}.when
d050: 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e  _clause(A) ::= .
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
d070: 20 3d 20 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61   = 0; }.when_cla
d080: 75 73 65 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20  use(A) ::= WHEN 
d090: 65 78 70 72 28 58 29 2e 20 7b 20 41 20 3d 20 58  expr(X). { A = X
d0a0: 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  ; }..%type trigg
d0b0: 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 54 72 69  er_cmd_list {Tri
d0c0: 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65 73 74  ggerStep*}.%dest
d0d0: 72 75 63 74 6f 72 20 74 72 69 67 67 65 72 5f 63  ructor trigger_c
d0e0: 6d 64 5f 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  md_list {sqlite3
d0f0: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
d100: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  p(pParse->db, $$
d110: 29 3b 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f  );}.trigger_cmd_
d120: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72 69 67  list(A) ::= trig
d130: 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20  ger_cmd_list(A) 
d140: 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29 20 53  trigger_cmd(X) S
d150: 45 4d 49 2e 20 7b 0a 20 20 61 73 73 65 72 74 28  EMI. {.  assert(
d160: 20 41 21 3d 30 20 29 3b 0a 20 20 41 2d 3e 70 4c   A!=0 );.  A->pL
d170: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 58 3b 0a  ast->pNext = X;.
d180: 20 20 41 2d 3e 70 4c 61 73 74 20 3d 20 58 3b 0a    A->pLast = X;.
d190: 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  }.trigger_cmd_li
d1a0: 73 74 28 41 29 20 3a 3a 3d 20 74 72 69 67 67 65  st(A) ::= trigge
d1b0: 72 5f 63 6d 64 28 41 29 20 53 45 4d 49 2e 20 7b  r_cmd(A) SEMI. {
d1c0: 20 0a 20 20 61 73 73 65 72 74 28 20 41 21 3d 30   .  assert( A!=0
d1d0: 20 29 3b 0a 20 20 41 2d 3e 70 4c 61 73 74 20 3d   );.  A->pLast =
d1e0: 20 41 3b 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c   A;.}..// Disall
d1f0: 6f 77 20 71 75 61 6c 69 66 69 65 64 20 74 61 62  ow qualified tab
d200: 6c 65 20 6e 61 6d 65 73 20 6f 6e 20 49 4e 53 45  le names on INSE
d210: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
d220: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
d230: 73 0a 2f 2f 20 77 69 74 68 69 6e 20 61 20 74 72  s.// within a tr
d240: 69 67 67 65 72 2e 20 20 54 68 65 20 74 61 62 6c  igger.  The tabl
d250: 65 20 74 6f 20 49 4e 53 45 52 54 2c 20 55 50 44  e to INSERT, UPD
d260: 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 45 20 69  ATE, or DELETE i
d270: 73 20 61 6c 77 61 79 73 20 69 6e 20 0a 2f 2f 20  s always in .// 
d280: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
d290: 65 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  e as the table t
d2a0: 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20  hat the trigger 
d2b0: 66 69 72 65 73 20 6f 6e 2e 0a 2f 2f 0a 25 74 79  fires on..//.%ty
d2c0: 70 65 20 74 72 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a  pe trnm {Token}.
d2d0: 74 72 6e 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 41  trnm(A) ::= nm(A
d2e0: 29 2e 0a 74 72 6e 6d 28 41 29 20 3a 3a 3d 20 6e  )..trnm(A) ::= n
d2f0: 6d 20 44 4f 54 20 6e 6d 28 58 29 2e 20 7b 0a 20  m DOT nm(X). {. 
d300: 20 41 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65   A = X;.  sqlite
d310: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d320: 2c 20 0a 20 20 20 20 20 20 20 20 22 71 75 61 6c  , .        "qual
d330: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
d340: 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
d350: 64 20 6f 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  d on INSERT, UPD
d360: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
d370: 22 0a 20 20 20 20 20 20 20 20 22 73 74 61 74 65  ".        "state
d380: 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69  ments within tri
d390: 67 67 65 72 73 22 29 3b 0a 7d 0a 0a 2f 2f 20 44  ggers");.}..// D
d3a0: 69 73 61 6c 6c 6f 77 20 74 68 65 20 49 4e 44 45  isallow the INDE
d3b0: 58 20 42 59 20 61 6e 64 20 4e 4f 54 20 49 4e 44  X BY and NOT IND
d3c0: 45 58 45 44 20 63 6c 61 75 73 65 73 20 6f 6e 20  EXED clauses on 
d3d0: 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54  UPDATE and DELET
d3e0: 45 0a 2f 2f 20 73 74 61 74 65 6d 65 6e 74 73 20  E.// statements 
d3f0: 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 2e  within triggers.
d400: 20 20 57 65 20 6d 61 6b 65 20 61 20 73 70 65 63    We make a spec
d410: 69 66 69 63 20 65 72 72 6f 72 20 6d 65 73 73 61  ific error messa
d420: 67 65 20 66 6f 72 20 74 68 69 73 0a 2f 2f 20 73  ge for this.// s
d430: 69 6e 63 65 20 69 74 20 69 73 20 61 6e 20 65 78  ince it is an ex
d440: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  ception to the d
d450: 65 66 61 75 6c 74 20 67 72 61 6d 6d 61 72 20 72  efault grammar r
d460: 75 6c 65 73 2e 0a 2f 2f 0a 74 72 69 64 78 62 79  ules..//.tridxby
d470: 20 3a 3a 3d 20 2e 0a 74 72 69 64 78 62 79 20 3a   ::= ..tridxby :
d480: 3a 3d 20 49 4e 44 45 58 45 44 20 42 59 20 6e 6d  := INDEXED BY nm
d490: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  . {.  sqlite3Err
d4a0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
d4b0: 20 20 20 20 20 20 22 74 68 65 20 49 4e 44 45 58        "the INDEX
d4c0: 45 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ED BY clause is 
d4d0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 55  not allowed on U
d4e0: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
d4f0: 73 74 61 74 65 6d 65 6e 74 73 20 22 0a 20 20 20  statements ".   
d500: 20 20 20 20 20 22 77 69 74 68 69 6e 20 74 72 69       "within tri
d510: 67 67 65 72 73 22 29 3b 0a 7d 0a 74 72 69 64 78  ggers");.}.tridx
d520: 62 79 20 3a 3a 3d 20 4e 4f 54 20 49 4e 44 45 58  by ::= NOT INDEX
d530: 45 44 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45  ED. {.  sqlite3E
d540: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
d550: 20 20 20 20 20 20 20 20 22 74 68 65 20 4e 4f 54          "the NOT
d560: 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
d570: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  is not allowed o
d580: 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
d590: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 22 0a  TE statements ".
d5a0: 20 20 20 20 20 20 20 20 22 77 69 74 68 69 6e 20          "within 
d5b0: 74 72 69 67 67 65 72 73 22 29 3b 0a 7d 0a 0a 0a  triggers");.}...
d5c0: 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 63  .%type trigger_c
d5d0: 6d 64 20 7b 54 72 69 67 67 65 72 53 74 65 70 2a  md {TriggerStep*
d5e0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72  }.%destructor tr
d5f0: 69 67 67 65 72 5f 63 6d 64 20 7b 73 71 6c 69 74  igger_cmd {sqlit
d600: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53  e3DeleteTriggerS
d610: 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  tep(pParse->db, 
d620: 24 24 29 3b 7d 0a 2f 2f 20 55 50 44 41 54 45 20  $$);}.// UPDATE 
d630: 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20  .trigger_cmd(A) 
d640: 3a 3a 3d 0a 20 20 20 55 50 44 41 54 45 28 42 29  ::=.   UPDATE(B)
d650: 20 6f 72 63 6f 6e 66 28 52 29 20 74 72 6e 6d 28   orconf(R) trnm(
d660: 58 29 20 74 72 69 64 78 62 79 20 53 45 54 20 73  X) tridxby SET s
d670: 65 74 6c 69 73 74 28 59 29 20 77 68 65 72 65 5f  etlist(Y) where_
d680: 6f 70 74 28 5a 29 20 73 63 61 6e 70 74 28 45 29  opt(Z) scanpt(E)
d690: 2e 20 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69  .  .   {A = sqli
d6a0: 74 65 33 54 72 69 67 67 65 72 55 70 64 61 74 65  te3TriggerUpdate
d6b0: 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  Step(pParse->db,
d6c0: 20 26 58 2c 20 59 2c 20 5a 2c 20 52 2c 20 42 2e   &X, Y, Z, R, B.
d6d0: 7a 2c 20 45 29 3b 7d 0a 0a 2f 2f 20 49 4e 53 45  z, E);}..// INSE
d6e0: 52 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  RT.trigger_cmd(A
d6f0: 29 20 3a 3a 3d 20 73 63 61 6e 70 74 28 42 29 20  ) ::= scanpt(B) 
d700: 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e  insert_cmd(R) IN
d710: 54 4f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  TO.             
d720: 20 20 20 20 20 20 20 20 20 74 72 6e 6d 28 58 29           trnm(X)
d730: 20 69 64 6c 69 73 74 5f 6f 70 74 28 46 29 20 73   idlist_opt(F) s
d740: 65 6c 65 63 74 28 53 29 20 75 70 73 65 72 74 28  elect(S) upsert(
d750: 55 29 20 73 63 61 6e 70 74 28 5a 29 2e 20 7b 0a  U) scanpt(Z). {.
d760: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 54 72     A = sqlite3Tr
d770: 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 70 28  iggerInsertStep(
d780: 70 50 61 72 73 65 2d 3e 64 62 2c 26 58 2c 46 2c  pParse->db,&X,F,
d790: 53 2c 52 2c 55 2c 42 2c 5a 29 3b 2f 2a 41 2d 6f  S,R,U,B,Z);/*A-o
d7a0: 76 65 72 77 72 69 74 65 73 2d 52 2a 2f 0a 7d 0a  verwrites-R*/.}.
d7b0: 2f 2f 20 44 45 4c 45 54 45 0a 74 72 69 67 67 65  // DELETE.trigge
d7c0: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45 4c  r_cmd(A) ::= DEL
d7d0: 45 54 45 28 42 29 20 46 52 4f 4d 20 74 72 6e 6d  ETE(B) FROM trnm
d7e0: 28 58 29 20 74 72 69 64 78 62 79 20 77 68 65 72  (X) tridxby wher
d7f0: 65 5f 6f 70 74 28 59 29 20 73 63 61 6e 70 74 28  e_opt(Y) scanpt(
d800: 45 29 2e 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69  E)..   {A = sqli
d810: 74 65 33 54 72 69 67 67 65 72 44 65 6c 65 74 65  te3TriggerDelete
d820: 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  Step(pParse->db,
d830: 20 26 58 2c 20 59 2c 20 42 2e 7a 2c 20 45 29 3b   &X, Y, B.z, E);
d840: 7d 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a 74 72 69  }..// SELECT.tri
d850: 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20  gger_cmd(A) ::= 
d860: 73 63 61 6e 70 74 28 42 29 20 73 65 6c 65 63 74  scanpt(B) select
d870: 28 58 29 20 73 63 61 6e 70 74 28 45 29 2e 0a 20  (X) scanpt(E).. 
d880: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72    {A = sqlite3Tr
d890: 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28  iggerSelectStep(
d8a0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 58 2c 20 42  pParse->db, X, B
d8b0: 2c 20 45 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  , E); /*A-overwr
d8c0: 69 74 65 73 2d 58 2a 2f 7d 0a 0a 2f 2f 20 54 68  ites-X*/}..// Th
d8d0: 65 20 73 70 65 63 69 61 6c 20 52 41 49 53 45 20  e special RAISE 
d8e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
d8f0: 6d 61 79 20 6f 63 63 75 72 20 69 6e 20 74 72 69  may occur in tri
d900: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 0a 65 78  gger programs.ex
d910: 70 72 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 20  pr(A) ::= RAISE 
d920: 4c 50 20 49 47 4e 4f 52 45 20 52 50 2e 20 20 7b  LP IGNORE RP.  {
d930: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45  .  A = sqlite3PE
d940: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52  xpr(pParse, TK_R
d950: 41 49 53 45 2c 20 30 2c 20 30 29 3b 20 0a 20 20  AISE, 0, 0); .  
d960: 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e  if( A ){.    A->
d970: 61 66 66 69 6e 69 74 79 20 3d 20 4f 45 5f 49 67  affinity = OE_Ig
d980: 6e 6f 72 65 3b 0a 20 20 7d 0a 7d 0a 65 78 70 72  nore;.  }.}.expr
d990: 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 20 4c 50  (A) ::= RAISE LP
d9a0: 20 72 61 69 73 65 74 79 70 65 28 54 29 20 43 4f   raisetype(T) CO
d9b0: 4d 4d 41 20 6e 6d 28 5a 29 20 52 50 2e 20 20 7b  MMA nm(Z) RP.  {
d9c0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
d9d0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
d9e0: 64 62 2c 20 54 4b 5f 52 41 49 53 45 2c 20 26 5a  db, TK_RAISE, &Z
d9f0: 2c 20 31 29 3b 20 0a 20 20 69 66 28 20 41 20 29  , 1); .  if( A )
da00: 20 7b 0a 20 20 20 20 41 2d 3e 61 66 66 69 6e 69   {.    A->affini
da10: 74 79 20 3d 20 28 63 68 61 72 29 54 3b 0a 20 20  ty = (char)T;.  
da20: 7d 0a 7d 0a 25 65 6e 64 69 66 20 20 21 53 51 4c  }.}.%endif  !SQL
da30: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
da40: 0a 0a 25 74 79 70 65 20 72 61 69 73 65 74 79 70  ..%type raisetyp
da50: 65 20 7b 69 6e 74 7d 0a 72 61 69 73 65 74 79 70  e {int}.raisetyp
da60: 65 28 41 29 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43  e(A) ::= ROLLBAC
da70: 4b 2e 20 20 7b 41 20 3d 20 4f 45 5f 52 6f 6c 6c  K.  {A = OE_Roll
da80: 62 61 63 6b 3b 7d 0a 72 61 69 73 65 74 79 70 65  back;}.raisetype
da90: 28 41 29 20 3a 3a 3d 20 41 42 4f 52 54 2e 20 20  (A) ::= ABORT.  
daa0: 20 20 20 7b 41 20 3d 20 4f 45 5f 41 62 6f 72 74     {A = OE_Abort
dab0: 3b 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20  ;}.raisetype(A) 
dac0: 3a 3a 3d 20 46 41 49 4c 2e 20 20 20 20 20 20 7b  ::= FAIL.      {
dad0: 41 20 3d 20 4f 45 5f 46 61 69 6c 3b 7d 0a 0a 0a  A = OE_Fail;}...
dae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
daf0: 2f 2f 2f 2f 2f 2f 2f 2f 20 20 44 52 4f 50 20 54  ////////  DROP T
db00: 52 49 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74  RIGGER statement
db10: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
db20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
db30: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
db40: 4d 49 54 5f 54 52 49 47 47 45 52 0a 63 6d 64 20  MIT_TRIGGER.cmd 
db50: 3a 3a 3d 20 44 52 4f 50 20 54 52 49 47 47 45 52  ::= DROP TRIGGER
db60: 20 69 66 65 78 69 73 74 73 28 4e 4f 45 52 52 29   ifexists(NOERR)
db70: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a   fullname(X). {.
db80: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
db90: 67 67 65 72 28 70 50 61 72 73 65 2c 58 2c 4e 4f  gger(pParse,X,NO
dba0: 45 52 52 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20  ERR);.}.%endif  
dbb0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  !SQLITE_OMIT_TRI
dbc0: 47 47 45 52 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  GGER..//////////
dbd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41  ////////////// A
dbe0: 54 54 41 43 48 20 44 41 54 41 42 41 53 45 20 66  TTACH DATABASE f
dbf0: 69 6c 65 20 41 53 20 6e 61 6d 65 20 2f 2f 2f 2f  ile AS name ////
dc00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dc10: 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51  /////.%ifndef SQ
dc20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48  LITE_OMIT_ATTACH
dc30: 0a 63 6d 64 20 3a 3a 3d 20 41 54 54 41 43 48 20  .cmd ::= ATTACH 
dc40: 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20  database_kw_opt 
dc50: 65 78 70 72 28 46 29 20 41 53 20 65 78 70 72 28  expr(F) AS expr(
dc60: 44 29 20 6b 65 79 5f 6f 70 74 28 4b 29 2e 20 7b  D) key_opt(K). {
dc70: 0a 20 20 73 71 6c 69 74 65 33 41 74 74 61 63 68  .  sqlite3Attach
dc80: 28 70 50 61 72 73 65 2c 20 46 2c 20 44 2c 20 4b  (pParse, F, D, K
dc90: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44 45 54  );.}.cmd ::= DET
dca0: 41 43 48 20 64 61 74 61 62 61 73 65 5f 6b 77 5f  ACH database_kw_
dcb0: 6f 70 74 20 65 78 70 72 28 44 29 2e 20 7b 0a 20  opt expr(D). {. 
dcc0: 20 73 71 6c 69 74 65 33 44 65 74 61 63 68 28 70   sqlite3Detach(p
dcd0: 50 61 72 73 65 2c 20 44 29 3b 0a 7d 0a 0a 25 74  Parse, D);.}..%t
dce0: 79 70 65 20 6b 65 79 5f 6f 70 74 20 7b 45 78 70  ype key_opt {Exp
dcf0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
dd00: 6b 65 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33  key_opt {sqlite3
dd10: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
dd20: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 6b 65 79  e->db, $$);}.key
dd30: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
dd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd50: 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 6b 65 79    { A = 0; }.key
dd60: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4b 45 59 20  _opt(A) ::= KEY 
dd70: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20  expr(X).        
dd80: 20 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 64 61    { A = X; }..da
dd90: 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a  tabase_kw_opt ::
dda0: 3d 20 44 41 54 41 42 41 53 45 2e 0a 64 61 74 61  = DATABASE..data
ddb0: 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20  base_kw_opt ::= 
ddc0: 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f  ..%endif SQLITE_
ddd0: 4f 4d 49 54 5f 41 54 54 41 43 48 0a 0a 2f 2f 2f  OMIT_ATTACH..///
dde0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ddf0: 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44 45 58 20  /////// REINDEX 
de00: 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f  collation //////
de10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
de20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66  ////////////.%if
de30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
de40: 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d  _REINDEX.cmd ::=
de50: 20 52 45 49 4e 44 45 58 2e 20 20 20 20 20 20 20   REINDEX.       
de60: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
de70: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
de80: 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d   0, 0);}.cmd ::=
de90: 20 52 45 49 4e 44 45 58 20 6e 6d 28 58 29 20 64   REINDEX nm(X) d
dea0: 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65  bnm(Y).  {sqlite
deb0: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
dec0: 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69   &X, &Y);}.%endi
ded0: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  f  SQLITE_OMIT_R
dee0: 45 49 4e 44 45 58 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  EINDEX..////////
def0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
df00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4e 41 4c  /////////// ANAL
df10: 59 5a 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  YZE ////////////
df20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
df30: 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20  ///////.%ifndef 
df40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c  SQLITE_OMIT_ANAL
df50: 59 5a 45 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c  YZE.cmd ::= ANAL
df60: 59 5a 45 2e 20 20 20 20 20 20 20 20 20 20 20 20  YZE.            
df70: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c      {sqlite3Anal
df80: 79 7a 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  yze(pParse, 0, 0
df90: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c  );}.cmd ::= ANAL
dfa0: 59 5a 45 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59  YZE nm(X) dbnm(Y
dfb0: 29 2e 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c  ).  {sqlite3Anal
dfc0: 79 7a 65 28 70 50 61 72 73 65 2c 20 26 58 2c 20  yze(pParse, &X, 
dfd0: 26 59 29 3b 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f  &Y);}.%endif..//
dfe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dff0: 2f 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20 54 41 42  ////// ALTER TAB
e000: 4c 45 20 74 61 62 6c 65 20 2e 2e 2e 20 2f 2f 2f  LE table ... ///
e010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69  /////////////.%i
e030: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e040: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 63 6d 64  T_ALTERTABLE.cmd
e050: 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45   ::= ALTER TABLE
e060: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 52 45 4e   fullname(X) REN
e070: 41 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e 20 7b 0a  AME TO nm(Z). {.
e080: 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 52 65    sqlite3AlterRe
e090: 6e 61 6d 65 54 61 62 6c 65 28 70 50 61 72 73 65  nameTable(pParse
e0a0: 2c 58 2c 26 5a 29 3b 0a 7d 0a 63 6d 64 20 3a 3a  ,X,&Z);.}.cmd ::
e0b0: 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20 61 64  = ALTER TABLE ad
e0c0: 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d  d_column_fullnam
e0d0: 65 0a 20 20 20 20 20 20 20 20 41 44 44 20 6b 77  e.        ADD kw
e0e0: 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63 6f 6c 75 6d  column_opt colum
e0f0: 6e 6e 61 6d 65 28 59 29 20 63 61 72 67 6c 69 73  nname(Y) carglis
e100: 74 2e 20 7b 0a 20 20 59 2e 6e 20 3d 20 28 69 6e  t. {.  Y.n = (in
e110: 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
e120: 54 6f 6b 65 6e 2e 7a 2d 59 2e 7a 29 20 2b 20 70  Token.z-Y.z) + p
e130: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
e140: 6e 2e 6e 3b 0a 20 20 73 71 6c 69 74 65 33 41 6c  n.n;.  sqlite3Al
e150: 74 65 72 46 69 6e 69 73 68 41 64 64 43 6f 6c 75  terFinishAddColu
e160: 6d 6e 28 70 50 61 72 73 65 2c 20 26 59 29 3b 0a  mn(pParse, &Y);.
e170: 7d 0a 61 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c  }.add_column_ful
e180: 6c 6e 61 6d 65 20 3a 3a 3d 20 66 75 6c 6c 6e 61  lname ::= fullna
e190: 6d 65 28 58 29 2e 20 7b 0a 20 20 64 69 73 61 62  me(X). {.  disab
e1a0: 6c 65 4c 6f 6f 6b 61 73 69 64 65 28 70 50 61 72  leLookaside(pPar
e1b0: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 41 6c  se);.  sqlite3Al
e1c0: 74 65 72 42 65 67 69 6e 41 64 64 43 6f 6c 75 6d  terBeginAddColum
e1d0: 6e 28 70 50 61 72 73 65 2c 20 58 29 3b 0a 7d 0a  n(pParse, X);.}.
e1e0: 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 3a 3a 3d  kwcolumn_opt ::=
e1f0: 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20   ..kwcolumn_opt 
e200: 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57 2e 0a 25 65  ::= COLUMNKW..%e
e210: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
e220: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 0a 2f 2f  T_ALTERTABLE..//
e230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e240: 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54 45 20 56 49  ////// CREATE VI
e250: 52 54 55 41 4c 20 54 41 42 4c 45 20 2e 2e 2e 20  RTUAL TABLE ... 
e260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e270: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69  /////////////.%i
e280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e290: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 63  T_VIRTUALTABLE.c
e2a0: 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f 76 74  md ::= create_vt
e2b0: 61 62 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ab.             
e2c0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
e2d0: 65 33 56 74 61 62 46 69 6e 69 73 68 50 61 72 73  e3VtabFinishPars
e2e0: 65 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a 63 6d  e(pParse,0);}.cm
e2f0: 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f 76 74 61  d ::= create_vta
e300: 62 20 4c 50 20 76 74 61 62 61 72 67 6c 69 73 74  b LP vtabarglist
e310: 20 52 50 28 58 29 2e 20 20 7b 73 71 6c 69 74 65   RP(X).  {sqlite
e320: 33 56 74 61 62 46 69 6e 69 73 68 50 61 72 73 65  3VtabFinishParse
e330: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63 72  (pParse,&X);}.cr
e340: 65 61 74 65 5f 76 74 61 62 20 3a 3a 3d 20 63 72  eate_vtab ::= cr
e350: 65 61 74 65 6b 77 20 56 49 52 54 55 41 4c 20 54  eatekw VIRTUAL T
e360: 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 73 74 73  ABLE ifnotexists
e370: 28 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (E).            
e380: 20 20 20 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59      nm(X) dbnm(Y
e390: 29 20 55 53 49 4e 47 20 6e 6d 28 5a 29 2e 20 7b  ) USING nm(Z). {
e3a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
e3b0: 42 65 67 69 6e 50 61 72 73 65 28 70 50 61 72 73  BeginParse(pPars
e3c0: 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a 2c 20 45  e, &X, &Y, &Z, E
e3d0: 29 3b 0a 7d 0a 76 74 61 62 61 72 67 6c 69 73 74  );.}.vtabarglist
e3e0: 20 3a 3a 3d 20 76 74 61 62 61 72 67 2e 0a 76 74   ::= vtabarg..vt
e3f0: 61 62 61 72 67 6c 69 73 74 20 3a 3a 3d 20 76 74  abarglist ::= vt
e400: 61 62 61 72 67 6c 69 73 74 20 43 4f 4d 4d 41 20  abarglist COMMA 
e410: 76 74 61 62 61 72 67 2e 0a 76 74 61 62 61 72 67  vtabarg..vtabarg
e420: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
e440: 6c 69 74 65 33 56 74 61 62 41 72 67 49 6e 69 74  lite3VtabArgInit
e450: 28 70 50 61 72 73 65 29 3b 7d 0a 76 74 61 62 61  (pParse);}.vtaba
e460: 72 67 20 3a 3a 3d 20 76 74 61 62 61 72 67 20 76  rg ::= vtabarg v
e470: 74 61 62 61 72 67 74 6f 6b 65 6e 2e 0a 76 74 61  tabargtoken..vta
e480: 62 61 72 67 74 6f 6b 65 6e 20 3a 3a 3d 20 41 4e  bargtoken ::= AN
e490: 59 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  Y(X).           
e4a0: 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67   {sqlite3VtabArg
e4b0: 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58  Extend(pParse,&X
e4c0: 29 3b 7d 0a 76 74 61 62 61 72 67 74 6f 6b 65 6e  );}.vtabargtoken
e4d0: 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c 69 73 74 20   ::= lp anylist 
e4e0: 52 50 28 58 29 2e 20 20 7b 73 71 6c 69 74 65 33  RP(X).  {sqlite3
e4f0: 56 74 61 62 41 72 67 45 78 74 65 6e 64 28 70 50  VtabArgExtend(pP
e500: 61 72 73 65 2c 26 58 29 3b 7d 0a 6c 70 20 3a 3a  arse,&X);}.lp ::
e510: 3d 20 4c 50 28 58 29 2e 20 20 20 20 20 20 20 20  = LP(X).        
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
e530: 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 45 78  sqlite3VtabArgEx
e540: 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58 29 3b  tend(pParse,&X);
e550: 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 2e 0a  }.anylist ::= ..
e560: 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61 6e 79 6c  anylist ::= anyl
e570: 69 73 74 20 4c 50 20 61 6e 79 6c 69 73 74 20 52  ist LP anylist R
e580: 50 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61  P..anylist ::= a
e590: 6e 79 6c 69 73 74 20 41 4e 59 2e 0a 25 65 6e 64  nylist ANY..%end
e5a0: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
e5b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 0a 2f  VIRTUALTABLE.../
e5c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
e5d0: 2f 2f 2f 2f 2f 2f 2f 20 43 4f 4d 4d 4f 4e 20 54  /////// COMMON T
e5e0: 41 42 4c 45 20 45 58 50 52 45 53 53 49 4f 4e 53  ABLE EXPRESSIONS
e5f0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
e600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 74  /////////////.%t
e610: 79 70 65 20 77 71 6c 69 73 74 20 7b 57 69 74 68  ype wqlist {With
e620: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77  *}.%destructor w
e630: 71 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 57 69  qlist {sqlite3Wi
e640: 74 68 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  thDelete(pParse-
e650: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 77 69 74 68  >db, $$);}..with
e660: 20 3a 3a 3d 20 2e 0a 25 69 66 6e 64 65 66 20 53   ::= ..%ifndef S
e670: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 77  QLITE_OMIT_CTE.w
e680: 69 74 68 20 3a 3a 3d 20 57 49 54 48 20 77 71 6c  ith ::= WITH wql
e690: 69 73 74 28 57 29 2e 20 20 20 20 20 20 20 20 20  ist(W).         
e6a0: 20 20 20 20 20 7b 20 73 71 6c 69 74 65 33 57 69       { sqlite3Wi
e6b0: 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 57  thPush(pParse, W
e6c0: 2c 20 31 29 3b 20 7d 0a 77 69 74 68 20 3a 3a 3d  , 1); }.with ::=
e6d0: 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45 20   WITH RECURSIVE 
e6e0: 77 71 6c 69 73 74 28 57 29 2e 20 20 20 20 7b 20  wqlist(W).    { 
e6f0: 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
e700: 70 50 61 72 73 65 2c 20 57 2c 20 31 29 3b 20 7d  pParse, W, 1); }
e710: 0a 0a 77 71 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ..wqlist(A) ::= 
e720: 6e 6d 28 58 29 20 65 69 64 6c 69 73 74 5f 6f 70  nm(X) eidlist_op
e730: 74 28 59 29 20 41 53 20 4c 50 20 73 65 6c 65 63  t(Y) AS LP selec
e740: 74 28 5a 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d  t(Z) RP. {.  A =
e750: 20 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28   sqlite3WithAdd(
e760: 70 50 61 72 73 65 2c 20 30 2c 20 26 58 2c 20 59  pParse, 0, &X, Y
e770: 2c 20 5a 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  , Z); /*A-overwr
e780: 69 74 65 73 2d 58 2a 2f 0a 7d 0a 77 71 6c 69 73  ites-X*/.}.wqlis
e790: 74 28 41 29 20 3a 3a 3d 20 77 71 6c 69 73 74 28  t(A) ::= wqlist(
e7a0: 41 29 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 65  A) COMMA nm(X) e
e7b0: 69 64 6c 69 73 74 5f 6f 70 74 28 59 29 20 41 53  idlist_opt(Y) AS
e7c0: 20 4c 50 20 73 65 6c 65 63 74 28 5a 29 20 52 50   LP select(Z) RP
e7d0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
e7e0: 33 57 69 74 68 41 64 64 28 70 50 61 72 73 65 2c  3WithAdd(pParse,
e7f0: 20 41 2c 20 26 58 2c 20 59 2c 20 5a 29 3b 0a 7d   A, &X, Y, Z);.}
e800: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
e810: 4f 4d 49 54 5f 43 54 45 0a                       OMIT_CTE.