/ Hex Artifact Content
Login

Artifact e4dbcc6136fc4f3084cedd41036401eafd336c5f7cb33bc516fed913a46cac2a:


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 54 68 65 20 67 65 6e 65 72 61 74  ..// The generat
0370: 65 64 20 70 61 72 73 65 72 20 66 75 6e 63 74 69  ed parser functi
0380: 6f 6e 20 74 61 6b 65 73 20 61 20 34 74 68 20 61  on takes a 4th a
0390: 72 67 75 6d 65 6e 74 20 61 73 20 66 6f 6c 6c 6f  rgument as follo
03a0: 77 73 3a 0a 25 65 78 74 72 61 5f 61 72 67 75 6d  ws:.%extra_argum
03b0: 65 6e 74 20 7b 50 61 72 73 65 20 2a 70 50 61 72  ent {Parse *pPar
03c0: 73 65 7d 0a 0a 2f 2f 20 54 68 69 73 20 63 6f 64  se}..// This cod
03d0: 65 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  e runs whenever 
03e0: 74 68 65 72 65 20 69 73 20 61 20 73 79 6e 74 61  there is a synta
03f0: 78 20 65 72 72 6f 72 0a 2f 2f 0a 25 73 79 6e 74  x error.//.%synt
0400: 61 78 5f 65 72 72 6f 72 20 7b 0a 20 20 55 4e 55  ax_error {.  UNU
0410: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 79 79  SED_PARAMETER(yy
0420: 6d 61 6a 6f 72 29 3b 20 20 2f 2a 20 53 69 6c 65  major);  /* Sile
0430: 6e 63 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  nce some compile
0440: 72 20 77 61 72 6e 69 6e 67 73 20 2a 2f 0a 20 20  r warnings */.  
0450: 61 73 73 65 72 74 28 20 54 4f 4b 45 4e 2e 7a 5b  assert( TOKEN.z[
0460: 30 5d 20 29 3b 20 20 2f 2a 20 54 68 65 20 74 6f  0] );  /* The to
0470: 6b 65 6e 69 7a 65 72 20 61 6c 77 61 79 73 20 67  kenizer always g
0480: 69 76 65 73 20 75 73 20 61 20 74 6f 6b 65 6e 20  ives us a token 
0490: 2a 2f 0a 20 20 70 61 72 73 65 72 53 79 6e 74 61  */.  parserSynta
04a0: 78 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 26  xError(pParse, &
04b0: 54 4f 4b 45 4e 29 3b 0a 7d 0a 25 73 74 61 63 6b  TOKEN);.}.%stack
04c0: 5f 6f 76 65 72 66 6c 6f 77 20 7b 0a 20 20 73 71  _overflow {.  sq
04d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
04e0: 61 72 73 65 2c 20 22 70 61 72 73 65 72 20 73 74  arse, "parser st
04f0: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 22 29 3b 0a  ack overflow");.
0500: 7d 0a 0a 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f  }..// The name o
0510: 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  f the generated 
0520: 70 72 6f 63 65 64 75 72 65 20 74 68 61 74 20 69  procedure that i
0530: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 70 61  mplements the pa
0540: 72 73 65 72 0a 2f 2f 20 69 73 20 61 73 20 66 6f  rser.// is as fo
0550: 6c 6c 6f 77 73 3a 0a 25 6e 61 6d 65 20 73 71 6c  llows:.%name sql
0560: 69 74 65 33 50 61 72 73 65 72 0a 0a 2f 2f 20 54  ite3Parser..// T
0570: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78  he following tex
0580: 74 20 69 73 20 69 6e 63 6c 75 64 65 64 20 6e 65  t is included ne
0590: 61 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ar the beginning
05a0: 20 6f 66 20 74 68 65 20 43 20 73 6f 75 72 63 65   of the C source
05b0: 0a 2f 2f 20 63 6f 64 65 20 66 69 6c 65 20 74 68  .// code file th
05c0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
05d0: 65 20 70 61 72 73 65 72 2e 0a 2f 2f 0a 25 69 6e  e parser..//.%in
05e0: 63 6c 75 64 65 20 7b 0a 23 69 6e 63 6c 75 64 65  clude {.#include
05f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a   "sqliteInt.h"..
0600: 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6c  /*.** Disable al
0610: 6c 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79  l error recovery
0620: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 74   processing in t
0630: 68 65 20 70 61 72 73 65 72 20 70 75 73 68 2d 64  he parser push-d
0640: 6f 77 6e 0a 2a 2a 20 61 75 74 6f 6d 61 74 6f 6e  own.** automaton
0650: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 59 59 4e  ..*/.#define YYN
0660: 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59 20 31  OERRORRECOVERY 1
0670: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 79 79 74  ../*.** Make yyt
0680: 65 73 74 63 61 73 65 28 29 20 74 68 65 20 73 61  estcase() the sa
0690: 6d 65 20 61 73 20 74 65 73 74 63 61 73 65 28 29  me as testcase()
06a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 79 79 74 65  .*/.#define yyte
06b0: 73 74 63 61 73 65 28 58 29 20 74 65 73 74 63 61  stcase(X) testca
06c0: 73 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64  se(X)../*.** Ind
06d0: 69 63 61 74 65 20 74 68 61 74 20 73 71 6c 69 74  icate that sqlit
06e0: 65 33 50 61 72 73 65 72 46 72 65 65 28 29 20 77  e3ParserFree() w
06f0: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 63 61 6c  ill never be cal
0700: 6c 65 64 20 77 69 74 68 20 61 20 6e 75 6c 6c 0a  led with a null.
0710: 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23  ** pointer..*/.#
0720: 64 65 66 69 6e 65 20 59 59 50 41 52 53 45 46 52  define YYPARSEFR
0730: 45 45 4e 45 56 45 52 4e 55 4c 4c 20 31 0a 0a 2f  EENEVERNULL 1../
0740: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 6d 61 6c  *.** In the amal
0750: 67 61 6d 61 74 69 6f 6e 2c 20 74 68 65 20 70 61  gamation, the pa
0760: 72 73 65 2e 63 20 66 69 6c 65 20 67 65 6e 65 72  rse.c file gener
0770: 61 74 65 64 20 62 79 20 6c 65 6d 6f 6e 20 61 6e  ated by lemon an
0780: 64 20 74 68 65 0a 2a 2a 20 74 6f 6b 65 6e 69 7a  d the.** tokeniz
0790: 65 2e 63 20 66 69 6c 65 20 61 72 65 20 63 6f 6e  e.c file are con
07a0: 63 61 74 65 6e 61 74 65 64 2e 20 20 49 6e 20 74  catenated.  In t
07b0: 68 61 74 20 63 61 73 65 2c 20 73 71 6c 69 74 65  hat case, sqlite
07c0: 33 52 75 6e 50 61 72 73 65 72 28 29 0a 2a 2a 20  3RunParser().** 
07d0: 68 61 73 20 61 63 63 65 73 73 20 74 6f 20 74 68  has access to th
07e0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
07f0: 65 20 79 79 50 61 72 73 65 72 20 6f 62 6a 65 63  e yyParser objec
0800: 74 20 61 6e 64 20 73 6f 20 74 68 65 20 70 61 72  t and so the par
0810: 73 65 72 0a 2a 2a 20 65 6e 67 69 6e 65 20 63 61  ser.** engine ca
0820: 6e 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  n be allocated f
0830: 72 6f 6d 20 73 74 61 63 6b 2e 20 20 49 6e 20 74  rom stack.  In t
0840: 68 61 74 20 63 61 73 65 2c 20 6f 6e 6c 79 20 74  hat case, only t
0850: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 72  he.** sqlite3Par
0860: 73 65 72 49 6e 69 74 28 29 20 61 6e 64 20 73 71  serInit() and sq
0870: 6c 69 74 65 33 50 61 72 73 65 72 46 69 6e 61 6c  lite3ParserFinal
0880: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 61  ize() routines a
0890: 72 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 61 6e  re invoked.** an
08a0: 64 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 72  d the sqlite3Par
08b0: 73 65 72 41 6c 6c 6f 63 28 29 20 61 6e 64 20 73  serAlloc() and s
08c0: 71 6c 69 74 65 33 50 61 72 73 65 72 46 72 65 65  qlite3ParserFree
08d0: 28 29 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20  () routines can 
08e0: 62 65 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 2a  be.** omitted..*
08f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
0900: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 64  AMALGAMATION.# d
0910: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 50 61 72  efine sqlite3Par
0920: 73 65 72 5f 45 4e 47 49 4e 45 41 4c 57 41 59 53  ser_ENGINEALWAYS
0930: 4f 4e 53 54 41 43 4b 20 31 0a 23 65 6e 64 69 66  ONSTACK 1.#endif
0940: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74  ../*.** Alternat
0950: 69 76 65 20 64 61 74 61 74 79 70 65 20 66 6f 72  ive datatype for
0960: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
0970: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 72 6f   the malloc() ro
0980: 75 74 69 6e 65 20 70 61 73 73 65 64 0a 2a 2a 20  utine passed.** 
0990: 69 6e 74 6f 20 73 71 6c 69 74 65 33 50 61 72 73  into sqlite3Pars
09a0: 65 72 41 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  erAlloc().  The 
09b0: 64 65 66 61 75 6c 74 20 69 73 20 73 69 7a 65 5f  default is size_
09c0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 59 59  t..*/.#define YY
09d0: 4d 41 4c 4c 4f 43 41 52 47 54 59 50 45 20 20 75  MALLOCARGTYPE  u
09e0: 36 34 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  64../*.** An ins
09f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0a00: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e  ructure holds in
0a10: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
0a20: 74 68 65 0a 2a 2a 20 4c 49 4d 49 54 20 63 6c 61  the.** LIMIT cla
0a30: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
0a40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
0a50: 72 75 63 74 20 4c 69 6d 69 74 56 61 6c 20 7b 0a  ruct LimitVal {.
0a60: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20    Expr *pLimit; 
0a70: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
0a80: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4e 55 4c  expression.  NUL
0a90: 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  L if there is no
0aa0: 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 45 78 70 72   limit */.  Expr
0ab0: 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20   *pOffset;   /* 
0ac0: 54 68 65 20 4f 46 46 53 45 54 20 65 78 70 72 65  The OFFSET expre
0ad0: 73 73 69 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66 20  ssion.  NULL if 
0ae0: 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 20 2a 2f  there is none */
0af0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
0b00: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
0b10: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
0b20: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
0b30: 65 76 65 6e 74 20 6f 66 20 61 0a 2a 2a 20 54 52  event of a.** TR
0b40: 49 47 47 45 52 2e 20 20 22 61 22 20 69 73 20 74  IGGER.  "a" is t
0b50: 68 65 20 65 76 65 6e 74 20 74 79 70 65 2c 20 6f  he event type, o
0b60: 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c  ne of TK_UPDATE,
0b70: 20 54 4b 5f 49 4e 53 45 52 54 2c 0a 2a 2a 20 54   TK_INSERT,.** T
0b80: 4b 5f 44 45 4c 45 54 45 2c 20 6f 72 20 54 4b 5f  K_DELETE, or TK_
0b90: 49 4e 53 54 45 41 44 2e 20 20 49 66 20 74 68 65  INSTEAD.  If the
0ba0: 20 65 76 65 6e 74 20 69 73 20 6f 66 20 74 68 65   event is of the
0bb0: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
0bc0: 20 55 50 44 41 54 45 20 4f 4e 20 28 61 2c 62 2c   UPDATE ON (a,b,
0bd0: 63 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  c).**.** Then th
0be0: 65 20 22 62 22 20 49 64 4c 69 73 74 20 72 65 63  e "b" IdList rec
0bf0: 6f 72 64 73 20 74 68 65 20 6c 69 73 74 20 22 61  ords the list "a
0c00: 2c 62 2c 63 22 2e 0a 2a 2f 0a 73 74 72 75 63 74  ,b,c"..*/.struct
0c10: 20 54 72 69 67 45 76 65 6e 74 20 7b 20 69 6e 74   TrigEvent { int
0c20: 20 61 3b 20 49 64 4c 69 73 74 20 2a 20 62 3b 20   a; IdList * b; 
0c30: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  };../*.** Genera
0c40: 74 65 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  te a syntax erro
0c50: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  r.*/.static void
0c60: 20 70 61 72 73 65 72 53 79 6e 74 61 78 45 72 72   parserSyntaxErr
0c70: 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  or(Parse *pParse
0c80: 2c 20 54 6f 6b 65 6e 20 2a 70 29 7b 0a 20 20 73  , Token *p){.  s
0c90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
0ca0: 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22 25  Parse, "near \"%
0cb0: 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  T\": syntax erro
0cc0: 72 22 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r", p);.}../*.**
0cd0: 20 44 69 73 61 62 6c 65 20 6c 6f 6f 6b 61 73 69   Disable lookasi
0ce0: 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  de memory alloca
0cf0: 74 69 6f 6e 20 66 6f 72 20 6f 62 6a 65 63 74 73  tion for objects
0d00: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 0a 2a   that might be.*
0d10: 2a 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  * shared across 
0d20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0d30: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
0d40: 76 6f 69 64 20 64 69 73 61 62 6c 65 4c 6f 6f 6b  void disableLook
0d50: 61 73 69 64 65 28 50 61 72 73 65 20 2a 70 50 61  aside(Parse *pPa
0d60: 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e  rse){.  pParse->
0d70: 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65  disableLookaside
0d80: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 64 62  ++;.  pParse->db
0d90: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73  ->lookaside.bDis
0da0: 61 62 6c 65 2b 2b 3b 0a 7d 0a 0a 7d 20 2f 2f 20  able++;.}..} // 
0db0: 65 6e 64 20 25 69 6e 63 6c 75 64 65 0a 0a 2f 2f  end %include..//
0dc0: 20 49 6e 70 75 74 20 69 73 20 61 20 73 69 6e 67   Input is a sing
0dd0: 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 0a 69  le SQL command.i
0de0: 6e 70 75 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74  nput ::= cmdlist
0df0: 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 63 6d  ..cmdlist ::= cm
0e00: 64 6c 69 73 74 20 65 63 6d 64 2e 0a 63 6d 64 6c  dlist ecmd..cmdl
0e10: 69 73 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a 65 63  ist ::= ecmd..ec
0e20: 6d 64 20 3a 3a 3d 20 53 45 4d 49 2e 0a 65 63 6d  md ::= SEMI..ecm
0e30: 64 20 3a 3a 3d 20 65 78 70 6c 61 69 6e 20 63 6d  d ::= explain cm
0e40: 64 78 20 53 45 4d 49 2e 0a 65 78 70 6c 61 69 6e  dx SEMI..explain
0e50: 20 3a 3a 3d 20 2e 0a 25 69 66 6e 64 65 66 20 53   ::= ..%ifndef S
0e60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
0e70: 49 4e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45  IN.explain ::= E
0e80: 58 50 4c 41 49 4e 2e 20 20 20 20 20 20 20 20 20  XPLAIN.         
0e90: 20 20 20 20 20 7b 20 70 50 61 72 73 65 2d 3e 65       { pParse->e
0ea0: 78 70 6c 61 69 6e 20 3d 20 31 3b 20 7d 0a 65 78  xplain = 1; }.ex
0eb0: 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c 41 49  plain ::= EXPLAI
0ec0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 20 20 20  N QUERY PLAN.   
0ed0: 7b 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  { pParse->explai
0ee0: 6e 20 3d 20 32 3b 20 7d 0a 25 65 6e 64 69 66 20  n = 2; }.%endif 
0ef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
0f00: 4c 41 49 4e 0a 63 6d 64 78 20 3a 3a 3d 20 63 6d  LAIN.cmdx ::= cm
0f10: 64 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20 73  d.           { s
0f20: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69  qlite3FinishCodi
0f30: 6e 67 28 70 50 61 72 73 65 29 3b 20 7d 0a 0a 2f  ng(pParse); }../
0f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f50: 2f 2f 2f 2f 20 42 65 67 69 6e 20 61 6e 64 20 65  //// Begin and e
0f60: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  nd transactions.
0f70: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
0f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
0f90: 0a 0a 63 6d 64 20 3a 3a 3d 20 42 45 47 49 4e 20  ..cmd ::= BEGIN 
0fa0: 74 72 61 6e 73 74 79 70 65 28 59 29 20 74 72 61  transtype(Y) tra
0fb0: 6e 73 5f 6f 70 74 2e 20 20 7b 73 71 6c 69 74 65  ns_opt.  {sqlite
0fc0: 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
0fd0: 6e 28 70 50 61 72 73 65 2c 20 59 29 3b 7d 0a 74  n(pParse, Y);}.t
0fe0: 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 74  rans_opt ::= ..t
0ff0: 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41  rans_opt ::= TRA
1000: 4e 53 41 43 54 49 4f 4e 2e 0a 74 72 61 6e 73 5f  NSACTION..trans_
1010: 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54  opt ::= TRANSACT
1020: 49 4f 4e 20 6e 6d 2e 0a 25 74 79 70 65 20 74 72  ION nm..%type tr
1030: 61 6e 73 74 79 70 65 20 7b 69 6e 74 7d 0a 74 72  anstype {int}.tr
1040: 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 2e  anstype(A) ::= .
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
1060: 3d 20 54 4b 5f 44 45 46 45 52 52 45 44 3b 7d 0a  = TK_DEFERRED;}.
1070: 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d  transtype(A) ::=
1080: 20 44 45 46 45 52 52 45 44 28 58 29 2e 20 20 7b   DEFERRED(X).  {
1090: 41 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72  A = @X; /*A-over
10a0: 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 74 72 61 6e  writes-X*/}.tran
10b0: 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 49 4d 4d  stype(A) ::= IMM
10c0: 45 44 49 41 54 45 28 58 29 2e 20 7b 41 20 3d 20  EDIATE(X). {A = 
10d0: 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  @X; /*A-overwrit
10e0: 65 73 2d 58 2a 2f 7d 0a 74 72 61 6e 73 74 79 70  es-X*/}.transtyp
10f0: 65 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20  e(A) ::= ID(X). 
1100: 7b 0a 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20  {.   Token *p = 
1110: 26 58 3b 0a 20 20 20 69 66 28 20 70 2d 3e 6e 3d  &X;.   if( p->n=
1120: 3d 39 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  =9 && sqlite3_st
1130: 72 6e 69 63 6d 70 28 70 2d 3e 7a 2c 22 65 78 63  rnicmp(p->z,"exc
1140: 6c 75 73 69 76 65 22 2c 39 29 3d 3d 30 20 29 7b  lusive",9)==0 ){
1150: 0a 20 20 20 20 20 41 20 3d 20 54 4b 5f 45 58 43  .     A = TK_EXC
1160: 4c 55 53 49 56 45 3b 0a 20 20 20 7d 65 6c 73 65  LUSIVE;.   }else
1170: 20 69 66 28 20 70 2d 3e 6e 3d 3d 31 30 20 26 26   if( p->n==10 &&
1180: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
1190: 70 28 70 2d 3e 7a 2c 22 63 6f 6e 63 75 72 72 65  p(p->z,"concurre
11a0: 6e 74 22 2c 31 30 29 3d 3d 30 20 29 7b 0a 20 20  nt",10)==0 ){.  
11b0: 20 20 20 41 20 3d 20 54 4b 5f 43 4f 4e 43 55 52     A = TK_CONCUR
11c0: 52 45 4e 54 3b 20 20 2f 2a 41 2d 6f 76 65 72 77  RENT;  /*A-overw
11d0: 72 69 74 65 73 2d 58 2a 2f 0a 20 20 20 7d 65 6c  rites-X*/.   }el
11e0: 73 65 7b 0a 20 20 20 20 20 70 61 72 73 65 72 53  se{.     parserS
11f0: 79 6e 74 61 78 45 72 72 6f 72 28 70 50 61 72 73  yntaxError(pPars
1200: 65 2c 20 70 29 3b 0a 20 20 20 7d 0a 7d 0a 63 6d  e, p);.   }.}.cm
1210: 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54 7c 45 4e 44  d ::= COMMIT|END
1220: 28 58 29 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20  (X) trans_opt.  
1230: 20 7b 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e   {sqlite3EndTran
1240: 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 40  saction(pParse,@
1250: 58 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c  X);}.cmd ::= ROL
1260: 4c 42 41 43 4b 28 58 29 20 74 72 61 6e 73 5f 6f  LBACK(X) trans_o
1270: 70 74 2e 20 20 20 20 20 7b 73 71 6c 69 74 65 33  pt.     {sqlite3
1280: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
1290: 50 61 72 73 65 2c 40 58 29 3b 7d 0a 0a 73 61 76  Parse,@X);}..sav
12a0: 65 70 6f 69 6e 74 5f 6f 70 74 20 3a 3a 3d 20 53  epoint_opt ::= S
12b0: 41 56 45 50 4f 49 4e 54 2e 0a 73 61 76 65 70 6f  AVEPOINT..savepo
12c0: 69 6e 74 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 63 6d  int_opt ::= ..cm
12d0: 64 20 3a 3a 3d 20 53 41 56 45 50 4f 49 4e 54 20  d ::= SAVEPOINT 
12e0: 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74  nm(X). {.  sqlit
12f0: 65 33 53 61 76 65 70 6f 69 6e 74 28 70 50 61 72  e3Savepoint(pPar
1300: 73 65 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45  se, SAVEPOINT_BE
1310: 47 49 4e 2c 20 26 58 29 3b 0a 7d 0a 63 6d 64 20  GIN, &X);.}.cmd 
1320: 3a 3a 3d 20 52 45 4c 45 41 53 45 20 73 61 76 65  ::= RELEASE save
1330: 70 6f 69 6e 74 5f 6f 70 74 20 6e 6d 28 58 29 2e  point_opt nm(X).
1340: 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 61 76 65   {.  sqlite3Save
1350: 70 6f 69 6e 74 28 70 50 61 72 73 65 2c 20 53 41  point(pParse, SA
1360: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
1370: 20 26 58 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20   &X);.}.cmd ::= 
1380: 52 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73 5f 6f  ROLLBACK trans_o
1390: 70 74 20 54 4f 20 73 61 76 65 70 6f 69 6e 74 5f  pt TO savepoint_
13a0: 6f 70 74 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73  opt nm(X). {.  s
13b0: 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
13c0: 70 50 61 72 73 65 2c 20 53 41 56 45 50 4f 49 4e  pParse, SAVEPOIN
13d0: 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 26 58 29 3b  T_ROLLBACK, &X);
13e0: 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .}..////////////
13f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52  ///////// The CR
1400: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
1410: 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ment ///////////
1420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1430: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63 72 65  /.//.cmd ::= cre
1440: 61 74 65 5f 74 61 62 6c 65 20 63 72 65 61 74 65  ate_table create
1450: 5f 74 61 62 6c 65 5f 61 72 67 73 2e 0a 63 72 65  _table_args..cre
1460: 61 74 65 5f 74 61 62 6c 65 20 3a 3a 3d 20 63 72  ate_table ::= cr
1470: 65 61 74 65 6b 77 20 74 65 6d 70 28 54 29 20 54  eatekw temp(T) T
1480: 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 73 74 73  ABLE ifnotexists
1490: 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a  (E) nm(Y) dbnm(Z
14a0: 29 2e 20 7b 0a 20 20 20 73 71 6c 69 74 65 33 53  ). {.   sqlite3S
14b0: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
14c0: 2c 26 59 2c 26 5a 2c 54 2c 30 2c 30 2c 45 29 3b  ,&Y,&Z,T,0,0,E);
14d0: 0a 7d 0a 63 72 65 61 74 65 6b 77 28 41 29 20 3a  .}.createkw(A) :
14e0: 3a 3d 20 43 52 45 41 54 45 28 41 29 2e 20 20 7b  := CREATE(A).  {
14f0: 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65  disableLookaside
1500: 28 70 50 61 72 73 65 29 3b 7d 0a 0a 25 74 79 70  (pParse);}..%typ
1510: 65 20 69 66 6e 6f 74 65 78 69 73 74 73 20 7b 69  e ifnotexists {i
1520: 6e 74 7d 0a 69 66 6e 6f 74 65 78 69 73 74 73 28  nt}.ifnotexists(
1530: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
1540: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69        {A = 0;}.i
1550: 66 6e 6f 74 65 78 69 73 74 73 28 41 29 20 3a 3a  fnotexists(A) ::
1560: 3d 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 2e  = IF NOT EXISTS.
1570: 20 7b 41 20 3d 20 31 3b 7d 0a 25 74 79 70 65 20   {A = 1;}.%type 
1580: 74 65 6d 70 20 7b 69 6e 74 7d 0a 25 69 66 6e 64  temp {int}.%ifnd
1590: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
15a0: 45 4d 50 44 42 0a 74 65 6d 70 28 41 29 20 3a 3a  EMPDB.temp(A) ::
15b0: 3d 20 54 45 4d 50 2e 20 20 7b 41 20 3d 20 31 3b  = TEMP.  {A = 1;
15c0: 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  }.%endif  SQLITE
15d0: 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 74 65 6d  _OMIT_TEMPDB.tem
15e0: 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  p(A) ::= .      
15f0: 7b 41 20 3d 20 30 3b 7d 0a 63 72 65 61 74 65 5f  {A = 0;}.create_
1600: 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 4c  table_args ::= L
1610: 50 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 63 6f 6e  P columnlist con
1620: 73 6c 69 73 74 5f 6f 70 74 28 58 29 20 52 50 28  slist_opt(X) RP(
1630: 45 29 20 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73  E) table_options
1640: 28 46 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (F). {.  sqlite3
1650: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
1660: 26 58 2c 26 45 2c 46 2c 30 29 3b 0a 7d 0a 63 72  &X,&E,F,0);.}.cr
1670: 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 20  eate_table_args 
1680: 3a 3a 3d 20 41 53 20 73 65 6c 65 63 74 28 53 29  ::= AS select(S)
1690: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64  . {.  sqlite3End
16a0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30 2c 30  Table(pParse,0,0
16b0: 2c 30 2c 53 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,0,S);.  sqlite3
16c0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61  SelectDelete(pPa
16d0: 72 73 65 2d 3e 64 62 2c 20 53 29 3b 0a 7d 0a 25  rse->db, S);.}.%
16e0: 74 79 70 65 20 74 61 62 6c 65 5f 6f 70 74 69 6f  type table_optio
16f0: 6e 73 20 7b 69 6e 74 7d 0a 74 61 62 6c 65 5f 6f  ns {int}.table_o
1700: 70 74 69 6f 6e 73 28 41 29 20 3a 3a 3d 20 2e 20  ptions(A) ::= . 
1710: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 74 61 62 6c     {A = 0;}.tabl
1720: 65 5f 6f 70 74 69 6f 6e 73 28 41 29 20 3a 3a 3d  e_options(A) ::=
1730: 20 57 49 54 48 4f 55 54 20 6e 6d 28 58 29 2e 20   WITHOUT nm(X). 
1740: 7b 0a 20 20 69 66 28 20 58 2e 6e 3d 3d 35 20 26  {.  if( X.n==5 &
1750: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
1760: 6d 70 28 58 2e 7a 2c 22 72 6f 77 69 64 22 2c 35  mp(X.z,"rowid",5
1770: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 41 20 3d 20  )==0 ){.    A = 
1780: 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20  TF_WithoutRowid 
1790: 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f  | TF_NoVisibleRo
17a0: 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
17b0: 20 20 41 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c    A = 0;.    sql
17c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17d0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 74 61  rse, "unknown ta
17e0: 62 6c 65 20 6f 70 74 69 6f 6e 3a 20 25 2e 2a 73  ble option: %.*s
17f0: 22 2c 20 58 2e 6e 2c 20 58 2e 7a 29 3b 0a 20 20  ", X.n, X.z);.  
1800: 7d 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a  }.}.columnlist :
1810: 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 43 4f  := columnlist CO
1820: 4d 4d 41 20 63 6f 6c 75 6d 6e 6e 61 6d 65 20 63  MMA columnname c
1830: 61 72 67 6c 69 73 74 2e 0a 63 6f 6c 75 6d 6e 6c  arglist..columnl
1840: 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6e 61  ist ::= columnna
1850: 6d 65 20 63 61 72 67 6c 69 73 74 2e 0a 63 6f 6c  me carglist..col
1860: 75 6d 6e 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 6e  umnname(A) ::= n
1870: 6d 28 41 29 20 74 79 70 65 74 6f 6b 65 6e 28 59  m(A) typetoken(Y
1880: 29 2e 20 7b 73 71 6c 69 74 65 33 41 64 64 43 6f  ). {sqlite3AddCo
1890: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 26 41 2c 26  lumn(pParse,&A,&
18a0: 59 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c  Y);}..// The fol
18b0: 6c 6f 77 69 6e 67 20 64 69 72 65 63 74 69 76 65  lowing directive
18c0: 20 63 61 75 73 65 73 20 74 6f 6b 65 6e 73 20 41   causes tokens A
18d0: 42 4f 52 54 2c 20 41 46 54 45 52 2c 20 41 53 43  BORT, AFTER, ASC
18e0: 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61 6c  , etc. to.// fal
18f0: 6c 62 61 63 6b 20 74 6f 20 49 44 20 69 66 20 74  lback to ID if t
1900: 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61 72  hey will not par
1910: 73 65 20 61 73 20 74 68 65 69 72 20 6f 72 69 67  se as their orig
1920: 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20 54  inal value..// T
1930: 68 69 73 20 6f 62 76 69 61 74 65 73 20 74 68 65  his obviates the
1940: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 20 22 69   need for the "i
1950: 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  d" nonterminal..
1960: 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44 0a  //.%fallback ID.
1970: 20 20 41 42 4f 52 54 20 41 43 54 49 4f 4e 20 41    ABORT ACTION A
1980: 46 54 45 52 20 41 4e 41 4c 59 5a 45 20 41 53 43  FTER ANALYZE ASC
1990: 20 41 54 54 41 43 48 20 42 45 46 4f 52 45 20 42   ATTACH BEFORE B
19a0: 45 47 49 4e 20 42 59 20 43 41 53 43 41 44 45 20  EGIN BY CASCADE 
19b0: 43 41 53 54 20 43 4f 4c 55 4d 4e 4b 57 0a 20 20  CAST COLUMNKW.  
19c0: 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42 41 53  CONFLICT DATABAS
19d0: 45 20 44 45 46 45 52 52 45 44 20 44 45 53 43 20  E DEFERRED DESC 
19e0: 44 45 54 41 43 48 20 45 41 43 48 20 45 4e 44 20  DETACH EACH END 
19f0: 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49  EXCLUSIVE EXPLAI
1a00: 4e 20 46 41 49 4c 20 46 4f 52 0a 20 20 49 47 4e  N FAIL FOR.  IGN
1a10: 4f 52 45 20 49 4d 4d 45 44 49 41 54 45 20 49 4e  ORE IMMEDIATE IN
1a20: 49 54 49 41 4c 4c 59 20 49 4e 53 54 45 41 44 20  ITIALLY INSTEAD 
1a30: 4c 49 4b 45 5f 4b 57 20 4d 41 54 43 48 20 4e 4f  LIKE_KW MATCH NO
1a40: 20 50 4c 41 4e 0a 20 20 51 55 45 52 59 20 4b 45   PLAN.  QUERY KE
1a50: 59 20 4f 46 20 4f 46 46 53 45 54 20 50 52 41 47  Y OF OFFSET PRAG
1a60: 4d 41 20 52 41 49 53 45 20 52 45 43 55 52 53 49  MA RAISE RECURSI
1a70: 56 45 20 52 45 4c 45 41 53 45 20 52 45 50 4c 41  VE RELEASE REPLA
1a80: 43 45 20 52 45 53 54 52 49 43 54 20 52 4f 57 0a  CE RESTRICT ROW.
1a90: 20 20 52 4f 4c 4c 42 41 43 4b 20 53 41 56 45 50    ROLLBACK SAVEP
1aa0: 4f 49 4e 54 20 54 45 4d 50 20 54 52 49 47 47 45  OINT TEMP TRIGGE
1ab0: 52 20 56 41 43 55 55 4d 20 56 49 45 57 20 56 49  R VACUUM VIEW VI
1ac0: 52 54 55 41 4c 20 57 49 54 48 20 57 49 54 48 4f  RTUAL WITH WITHO
1ad0: 55 54 0a 25 69 66 64 65 66 20 53 51 4c 49 54 45  UT.%ifdef SQLITE
1ae0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
1af0: 45 4c 45 43 54 0a 20 20 45 58 43 45 50 54 20 49  ELECT.  EXCEPT I
1b00: 4e 54 45 52 53 45 43 54 20 55 4e 49 4f 4e 0a 25  NTERSECT UNION.%
1b10: 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  endif SQLITE_OMI
1b20: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1b30: 54 0a 20 20 52 45 49 4e 44 45 58 20 52 45 4e 41  T.  REINDEX RENA
1b40: 4d 45 20 43 54 49 4d 45 5f 4b 57 20 49 46 0a 20  ME CTIME_KW IF. 
1b50: 20 2e 0a 25 77 69 6c 64 63 61 72 64 20 41 4e 59   ..%wildcard ANY
1b60: 2e 0a 0a 2f 2f 20 44 65 66 69 6e 65 20 6f 70 65  ...// Define ope
1b70: 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e 63 65  rator precedence
1b80: 20 65 61 72 6c 79 20 73 6f 20 74 68 61 74 20 74   early so that t
1b90: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1ba0: 20 6f 63 63 75 72 72 65 6e 63 65 0a 2f 2f 20 6f   occurrence.// o
1bb0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74  f the operator t
1bc0: 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 67 72 61  okens in the gra
1bd0: 6d 6d 65 72 2e 20 20 4b 65 65 70 69 6e 67 20 74  mmer.  Keeping t
1be0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 67  he operators tog
1bf0: 65 74 68 65 72 0a 2f 2f 20 63 61 75 73 65 73 20  ether.// causes 
1c00: 74 68 65 6d 20 74 6f 20 62 65 20 61 73 73 69 67  them to be assig
1c10: 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ned integer valu
1c20: 65 73 20 74 68 61 74 20 61 72 65 20 63 6c 6f 73  es that are clos
1c30: 65 20 74 6f 67 65 74 68 65 72 2c 0a 2f 2f 20 77  e together,.// w
1c40: 68 69 63 68 20 6b 65 65 70 73 20 70 61 72 73 65  hich keeps parse
1c50: 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72  r tables smaller
1c60: 2e 0a 2f 2f 0a 2f 2f 20 54 68 65 20 74 6f 6b 65  ..//.// The toke
1c70: 6e 20 76 61 6c 75 65 73 20 61 73 73 69 67 6e 65  n values assigne
1c80: 64 20 74 6f 20 74 68 65 73 65 20 73 79 6d 62 6f  d to these symbo
1c90: 6c 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ls is determined
1ca0: 20 62 79 20 74 68 65 20 6f 72 64 65 72 0a 2f 2f   by the order.//
1cb0: 20 69 6e 20 77 68 69 63 68 20 6c 65 6d 6f 6e 20   in which lemon 
1cc0: 66 69 72 73 74 20 73 65 65 73 20 74 68 65 6d 2e  first sees them.
1cd0: 20 20 49 74 20 6d 75 73 74 20 62 65 20 74 68 65    It must be the
1ce0: 20 63 61 73 65 20 74 68 61 74 20 49 53 4e 55 4c   case that ISNUL
1cf0: 4c 2f 4e 4f 54 4e 55 4c 4c 2c 0a 2f 2f 20 4e 45  L/NOTNULL,.// NE
1d00: 2f 45 51 2c 20 47 54 2f 4c 45 2c 20 61 6e 64 20  /EQ, GT/LE, and 
1d10: 47 45 2f 4c 54 20 61 72 65 20 73 65 70 61 72 61  GE/LT are separa
1d20: 74 65 64 20 62 79 20 6f 6e 6c 79 20 61 20 73 69  ted by only a si
1d30: 6e 67 6c 65 20 76 61 6c 75 65 2e 20 20 53 65 65  ngle value.  See
1d40: 0a 2f 2f 20 74 68 65 20 73 71 6c 69 74 65 33 45  .// the sqlite3E
1d50: 78 70 72 49 66 46 61 6c 73 65 28 29 20 72 6f 75  xprIfFalse() rou
1d60: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
1d70: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
1d80: 6f 6e 20 74 68 69 73 0a 2f 2f 20 63 6f 6e 73 74  on this.// const
1d90: 72 61 69 6e 74 2e 0a 2f 2f 0a 25 6c 65 66 74 20  raint..//.%left 
1da0: 4f 52 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a 25  OR..%left AND..%
1db0: 72 69 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66 74  right NOT..%left
1dc0: 20 49 53 20 4d 41 54 43 48 20 4c 49 4b 45 5f 4b   IS MATCH LIKE_K
1dd0: 57 20 42 45 54 57 45 45 4e 20 49 4e 20 49 53 4e  W BETWEEN IN ISN
1de0: 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 4e 45 20 45  ULL NOTNULL NE E
1df0: 51 2e 0a 25 6c 65 66 74 20 47 54 20 4c 45 20 4c  Q..%left GT LE L
1e00: 54 20 47 45 2e 0a 25 72 69 67 68 74 20 45 53 43  T GE..%right ESC
1e10: 41 50 45 2e 0a 25 6c 65 66 74 20 42 49 54 41 4e  APE..%left BITAN
1e20: 44 20 42 49 54 4f 52 20 4c 53 48 49 46 54 20 52  D BITOR LSHIFT R
1e30: 53 48 49 46 54 2e 0a 25 6c 65 66 74 20 50 4c 55  SHIFT..%left PLU
1e40: 53 20 4d 49 4e 55 53 2e 0a 25 6c 65 66 74 20 53  S MINUS..%left S
1e50: 54 41 52 20 53 4c 41 53 48 20 52 45 4d 2e 0a 25  TAR SLASH REM..%
1e60: 6c 65 66 74 20 43 4f 4e 43 41 54 2e 0a 25 6c 65  left CONCAT..%le
1e70: 66 74 20 43 4f 4c 4c 41 54 45 2e 0a 25 72 69 67  ft COLLATE..%rig
1e80: 68 74 20 42 49 54 4e 4f 54 2e 0a 0a 2f 2f 20 41  ht BITNOT...// A
1e90: 6e 20 49 44 45 4e 54 49 46 49 45 52 20 63 61 6e  n IDENTIFIER can
1ea0: 20 62 65 20 61 20 67 65 6e 65 72 69 63 20 69 64   be a generic id
1eb0: 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e 65  entifier, or one
1ec0: 20 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20 6b   of several.// k
1ed0: 65 79 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e 6f  eywords.  Any no
1ee0: 6e 2d 73 74 61 6e 64 61 72 64 20 6b 65 79 77 6f  n-standard keywo
1ef0: 72 64 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61  rd can also be a
1f00: 6e 20 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f 2f  n identifier..//
1f10: 0a 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 69 64  .%token_class id
1f20: 20 20 49 44 7c 49 4e 44 45 58 45 44 2e 0a 0a 2f    ID|INDEXED.../
1f30: 2f 20 41 6e 64 20 22 69 64 73 22 20 69 73 20 61  / And "ids" is a
1f40: 6e 20 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d 73  n identifer-or-s
1f50: 74 72 69 6e 67 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e  tring..//.%token
1f60: 5f 63 6c 61 73 73 20 69 64 73 20 20 49 44 7c 53  _class ids  ID|S
1f70: 54 52 49 4e 47 2e 0a 0a 2f 2f 20 54 68 65 20 6e  TRING...// The n
1f80: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
1f90: 6f 72 20 74 61 62 6c 65 20 63 61 6e 20 62 65 20  or table can be 
1fa0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
1fb0: 77 69 6e 67 3a 0a 2f 2f 0a 25 74 79 70 65 20 6e  wing:.//.%type n
1fc0: 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e 6d 28 41 29 20  m {Token}.nm(A) 
1fd0: 3a 3a 3d 20 69 64 28 41 29 2e 0a 6e 6d 28 41 29  ::= id(A)..nm(A)
1fe0: 20 3a 3a 3d 20 53 54 52 49 4e 47 28 41 29 2e 0a   ::= STRING(A)..
1ff0: 6e 6d 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b  nm(A) ::= JOIN_K
2000: 57 28 41 29 2e 0a 0a 2f 2f 20 41 20 74 79 70 65  W(A)...// A type
2010: 74 6f 6b 65 6e 20 69 73 20 72 65 61 6c 6c 79 20  token is really 
2020: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 6f 6b  zero or more tok
2030: 65 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 61 20  ens that form a 
2040: 74 79 70 65 20 6e 61 6d 65 20 73 75 63 68 0a 2f  type name such./
2050: 2f 20 61 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  / as can be foun
2060: 64 20 61 66 74 65 72 20 74 68 65 20 63 6f 6c 75  d after the colu
2070: 6d 6e 20 6e 61 6d 65 20 69 6e 20 61 20 43 52 45  mn name in a CRE
2080: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
2090: 65 6e 74 2e 0a 2f 2f 20 4d 75 6c 74 69 70 6c 65  ent..// Multiple
20a0: 20 74 6f 6b 65 6e 73 20 61 72 65 20 63 6f 6e 63   tokens are conc
20b0: 61 74 65 6e 61 74 65 64 20 74 6f 20 66 6f 72 6d  atenated to form
20c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
20d0: 65 20 74 79 70 65 74 6f 6b 65 6e 2e 0a 2f 2f 0a  e typetoken..//.
20e0: 25 74 79 70 65 20 74 79 70 65 74 6f 6b 65 6e 20  %type typetoken 
20f0: 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 74 6f 6b 65  {Token}.typetoke
2100: 6e 28 41 29 20 3a 3a 3d 20 2e 20 20 20 7b 41 2e  n(A) ::= .   {A.
2110: 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20 30 3b 7d  n = 0; A.z = 0;}
2120: 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a  .typetoken(A) ::
2130: 3d 20 74 79 70 65 6e 61 6d 65 28 41 29 2e 0a 74  = typename(A)..t
2140: 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20  ypetoken(A) ::= 
2150: 74 79 70 65 6e 61 6d 65 28 41 29 20 4c 50 20 73  typename(A) LP s
2160: 69 67 6e 65 64 20 52 50 28 59 29 2e 20 7b 0a 20  igned RP(Y). {. 
2170: 20 41 2e 6e 20 3d 20 28 69 6e 74 29 28 26 59 2e   A.n = (int)(&Y.
2180: 7a 5b 59 2e 6e 5d 20 2d 20 41 2e 7a 29 3b 0a 7d  z[Y.n] - A.z);.}
2190: 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a  .typetoken(A) ::
21a0: 3d 20 74 79 70 65 6e 61 6d 65 28 41 29 20 4c 50  = typename(A) LP
21b0: 20 73 69 67 6e 65 64 20 43 4f 4d 4d 41 20 73 69   signed COMMA si
21c0: 67 6e 65 64 20 52 50 28 59 29 2e 20 7b 0a 20 20  gned RP(Y). {.  
21d0: 41 2e 6e 20 3d 20 28 69 6e 74 29 28 26 59 2e 7a  A.n = (int)(&Y.z
21e0: 5b 59 2e 6e 5d 20 2d 20 41 2e 7a 29 3b 0a 7d 0a  [Y.n] - A.z);.}.
21f0: 25 74 79 70 65 20 74 79 70 65 6e 61 6d 65 20 7b  %type typename {
2200: 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61 6d 65 28  Token}.typename(
2210: 41 29 20 3a 3a 3d 20 69 64 73 28 41 29 2e 0a 74  A) ::= ids(A)..t
2220: 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 74  ypename(A) ::= t
2230: 79 70 65 6e 61 6d 65 28 41 29 20 69 64 73 28 59  ypename(A) ids(Y
2240: 29 2e 20 7b 41 2e 6e 3d 59 2e 6e 2b 28 69 6e 74  ). {A.n=Y.n+(int
2250: 29 28 59 2e 7a 2d 41 2e 7a 29 3b 7d 0a 73 69 67  )(Y.z-A.z);}.sig
2260: 6e 65 64 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d  ned ::= plus_num
2270: 2e 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 6d 69 6e  ..signed ::= min
2280: 75 73 5f 6e 75 6d 2e 0a 0a 2f 2f 20 22 63 61 72  us_num...// "car
2290: 67 6c 69 73 74 22 20 69 73 20 61 20 6c 69 73 74  glist" is a list
22a0: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63   of additional c
22b0: 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20  onstraints that 
22c0: 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 0a 2f  come after the./
22d0: 2f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e  / column name an
22e0: 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e  d column type in
22f0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
2300: 73 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 0a 63 61  statement..//.ca
2310: 72 67 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c  rglist ::= cargl
2320: 69 73 74 20 63 63 6f 6e 73 2e 0a 63 61 72 67 6c  ist ccons..cargl
2330: 69 73 74 20 3a 3a 3d 20 2e 0a 63 63 6f 6e 73 20  ist ::= ..ccons 
2340: 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e  ::= CONSTRAINT n
2350: 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  m(X).           
2360: 7b 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61  {pParse->constra
2370: 69 6e 74 4e 61 6d 65 20 3d 20 58 3b 7d 0a 63 63  intName = X;}.cc
2380: 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  ons ::= DEFAULT 
2390: 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20 20  term(X).        
23a0: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44      {sqlite3AddD
23b0: 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72  efaultValue(pPar
23c0: 73 65 2c 26 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a  se,&X);}.ccons :
23d0: 3a 3d 20 44 45 46 41 55 4c 54 20 4c 50 20 65 78  := DEFAULT LP ex
23e0: 70 72 28 58 29 20 52 50 2e 20 20 20 20 20 20 7b  pr(X) RP.      {
23f0: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
2400: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58  tValue(pParse,&X
2410: 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45  );}.ccons ::= DE
2420: 46 41 55 4c 54 20 50 4c 55 53 20 74 65 72 6d 28  FAULT PLUS term(
2430: 58 29 2e 20 20 20 20 20 20 20 7b 73 71 6c 69 74  X).       {sqlit
2440: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
2450: 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63  e(pParse,&X);}.c
2460: 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54  cons ::= DEFAULT
2470: 20 4d 49 4e 55 53 28 41 29 20 74 65 72 6d 28 58   MINUS(A) term(X
2480: 29 2e 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72  ).      {.  Expr
2490: 53 70 61 6e 20 76 3b 0a 20 20 76 2e 70 45 78 70  Span v;.  v.pExp
24a0: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
24b0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 4d 49 4e  (pParse, TK_UMIN
24c0: 55 53 2c 20 58 2e 70 45 78 70 72 2c 20 30 29 3b  US, X.pExpr, 0);
24d0: 0a 20 20 76 2e 7a 53 74 61 72 74 20 3d 20 41 2e  .  v.zStart = A.
24e0: 7a 3b 0a 20 20 76 2e 7a 45 6e 64 20 3d 20 58 2e  z;.  v.zEnd = X.
24f0: 7a 45 6e 64 3b 0a 20 20 73 71 6c 69 74 65 33 41  zEnd;.  sqlite3A
2500: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70  ddDefaultValue(p
2510: 50 61 72 73 65 2c 26 76 29 3b 0a 7d 0a 63 63 6f  Parse,&v);.}.cco
2520: 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 69  ns ::= DEFAULT i
2530: 64 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  d(X).           
2540: 20 20 20 7b 0a 20 20 45 78 70 72 53 70 61 6e 20     {.  ExprSpan 
2550: 76 3b 0a 20 20 73 70 61 6e 45 78 70 72 28 26 76  v;.  spanExpr(&v
2560: 2c 20 70 50 61 72 73 65 2c 20 54 4b 5f 53 54 52  , pParse, TK_STR
2570: 49 4e 47 2c 20 58 29 3b 0a 20 20 73 71 6c 69 74  ING, X);.  sqlit
2580: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
2590: 65 28 70 50 61 72 73 65 2c 26 76 29 3b 0a 7d 0a  e(pParse,&v);.}.
25a0: 0a 2f 2f 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  .// In addition 
25b0: 74 6f 20 74 68 65 20 74 79 70 65 20 6e 61 6d 65  to the type name
25c0: 2c 20 77 65 20 61 6c 73 6f 20 63 61 72 65 20 61  , we also care a
25d0: 62 6f 75 74 20 74 68 65 20 70 72 69 6d 61 72 79  bout the primary
25e0: 20 6b 65 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51   key and.// UNIQ
25f0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  UE constraints..
2600: 2f 2f 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 55 4c  //.ccons ::= NUL
2610: 4c 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20  L onconf..ccons 
2620: 3a 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 63  ::= NOT NULL onc
2630: 6f 6e 66 28 52 29 2e 20 20 20 20 7b 73 71 6c 69  onf(R).    {sqli
2640: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 70 50  te3AddNotNull(pP
2650: 61 72 73 65 2c 20 52 29 3b 7d 0a 63 63 6f 6e 73  arse, R);}.ccons
2660: 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59   ::= PRIMARY KEY
2670: 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 20 6f 6e   sortorder(Z) on
2680: 63 6f 6e 66 28 52 29 20 61 75 74 6f 69 6e 63 28  conf(R) autoinc(
2690: 49 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  I)..            
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64       {sqlite3Add
26c0: 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72 73  PrimaryKey(pPars
26d0: 65 2c 30 2c 52 2c 49 2c 5a 29 3b 7d 0a 63 63 6f  e,0,R,I,Z);}.cco
26e0: 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 6f 6e  ns ::= UNIQUE on
26f0: 63 6f 6e 66 28 52 29 2e 20 20 20 20 20 20 7b 73  conf(R).      {s
2700: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
2710: 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 30  x(pParse,0,0,0,0
2720: 2c 52 2c 30 2c 30 2c 30 2c 30 2c 0a 20 20 20 20  ,R,0,0,0,0,.    
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2750: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e  QLITE_IDXTYPE_UN
2760: 49 51 55 45 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  IQUE);}.ccons ::
2770: 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70 72 28  = CHECK LP expr(
2780: 58 29 20 52 50 2e 20 20 20 7b 73 71 6c 69 74 65  X) RP.   {sqlite
2790: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  3AddCheckConstra
27a0: 69 6e 74 28 70 50 61 72 73 65 2c 58 2e 70 45 78  int(pParse,X.pEx
27b0: 70 72 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  pr);}.ccons ::= 
27c0: 52 45 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29  REFERENCES nm(T)
27d0: 20 65 69 64 6c 69 73 74 5f 6f 70 74 28 54 41 29   eidlist_opt(TA)
27e0: 20 72 65 66 61 72 67 73 28 52 29 2e 0a 20 20 20   refargs(R)..   
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
2810: 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
2820: 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 30 2c  ignKey(pParse,0,
2830: 26 54 2c 54 41 2c 52 29 3b 7d 0a 63 63 6f 6e 73  &T,TA,R);}.ccons
2840: 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62 63 6c   ::= defer_subcl
2850: 61 75 73 65 28 44 29 2e 20 20 20 20 7b 73 71 6c  ause(D).    {sql
2860: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
2870: 4b 65 79 28 70 50 61 72 73 65 2c 44 29 3b 7d 0a  Key(pParse,D);}.
2880: 63 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4c 4c 41 54  ccons ::= COLLAT
2890: 45 20 69 64 73 28 43 29 2e 20 20 20 20 20 20 20  E ids(C).       
28a0: 20 7b 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c   {sqlite3AddColl
28b0: 61 74 65 54 79 70 65 28 70 50 61 72 73 65 2c 20  ateType(pParse, 
28c0: 26 43 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6f 70  &C);}..// The op
28d0: 74 69 6f 6e 61 6c 20 41 55 54 4f 49 4e 43 52 45  tional AUTOINCRE
28e0: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 0a 25 74 79  MENT keyword.%ty
28f0: 70 65 20 61 75 74 6f 69 6e 63 20 7b 69 6e 74 7d  pe autoinc {int}
2900: 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d 20  .autoinc(X) ::= 
2910: 2e 20 20 20 20 20 20 20 20 20 20 7b 58 20 3d 20  .          {X = 
2920: 30 3b 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a  0;}.autoinc(X) :
2930: 3a 3d 20 41 55 54 4f 49 4e 43 52 2e 20 20 7b 58  := AUTOINCR.  {X
2940: 20 3d 20 31 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e   = 1;}..// The n
2950: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 75 6c  ext group of rul
2960: 65 73 20 70 61 72 73 65 73 20 74 68 65 20 61 72  es parses the ar
2970: 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 52 45 46  guments to a REF
2980: 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65 0a 2f  ERENCES clause./
2990: 2f 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  / that determine
29a0: 20 69 66 20 74 68 65 20 72 65 66 65 72 65 6e 74   if the referent
29b0: 69 61 6c 20 69 6e 74 65 67 72 69 74 79 20 63 68  ial integrity ch
29c0: 65 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ecking is deferr
29d0: 65 64 20 6f 72 0a 2f 2f 20 6f 72 20 69 6d 6d 65  ed or.// or imme
29e0: 64 69 61 74 65 20 61 6e 64 20 77 68 69 63 68 20  diate and which 
29f0: 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20 61  determine what a
2a00: 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 66  ction to take if
2a10: 20 61 20 72 65 66 2d 69 6e 74 65 67 0a 2f 2f 20   a ref-integ.// 
2a20: 63 68 65 63 6b 20 66 61 69 6c 73 2e 0a 2f 2f 0a  check fails..//.
2a30: 25 74 79 70 65 20 72 65 66 61 72 67 73 20 7b 69  %type refargs {i
2a40: 6e 74 7d 0a 72 65 66 61 72 67 73 28 41 29 20 3a  nt}.refargs(A) :
2a50: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
2a60: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 4e        { A = OE_N
2a70: 6f 6e 65 2a 30 78 30 31 30 31 3b 20 2f 2a 20 45  one*0x0101; /* E
2a80: 56 3a 20 52 2d 31 39 38 30 33 2d 34 35 38 38 34  V: R-19803-45884
2a90: 20 2a 2f 7d 0a 72 65 66 61 72 67 73 28 41 29 20   */}.refargs(A) 
2aa0: 3a 3a 3d 20 72 65 66 61 72 67 73 28 41 29 20 72  ::= refargs(A) r
2ab0: 65 66 61 72 67 28 59 29 2e 20 7b 20 41 20 3d 20  efarg(Y). { A = 
2ac0: 28 41 20 26 20 7e 59 2e 6d 61 73 6b 29 20 7c 20  (A & ~Y.mask) | 
2ad0: 59 2e 76 61 6c 75 65 3b 20 7d 0a 25 74 79 70 65  Y.value; }.%type
2ae0: 20 72 65 66 61 72 67 20 7b 73 74 72 75 63 74 20   refarg {struct 
2af0: 7b 69 6e 74 20 76 61 6c 75 65 3b 20 69 6e 74 20  {int value; int 
2b00: 6d 61 73 6b 3b 7d 7d 0a 72 65 66 61 72 67 28 41  mask;}}.refarg(A
2b10: 29 20 3a 3a 3d 20 4d 41 54 43 48 20 6e 6d 2e 20  ) ::= MATCH nm. 
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
2b30: 2e 76 61 6c 75 65 20 3d 20 30 3b 20 20 20 20 20  .value = 0;     
2b40: 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 30  A.mask = 0x00000
2b50: 30 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a  0; }.refarg(A) :
2b60: 3a 3d 20 4f 4e 20 49 4e 53 45 52 54 20 72 65 66  := ON INSERT ref
2b70: 61 63 74 2e 20 20 20 20 20 20 7b 20 41 2e 76 61  act.      { A.va
2b80: 6c 75 65 20 3d 20 30 3b 20 20 20 20 20 41 2e 6d  lue = 0;     A.m
2b90: 61 73 6b 20 3d 20 30 78 30 30 30 30 30 30 3b 20  ask = 0x000000; 
2ba0: 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20  }.refarg(A) ::= 
2bb0: 4f 4e 20 44 45 4c 45 54 45 20 72 65 66 61 63 74  ON DELETE refact
2bc0: 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65  (X).   { A.value
2bd0: 20 3d 20 58 3b 20 20 20 20 20 41 2e 6d 61 73 6b   = X;     A.mask
2be0: 20 3d 20 30 78 30 30 30 30 66 66 3b 20 7d 0a 72   = 0x0000ff; }.r
2bf0: 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20  efarg(A) ::= ON 
2c00: 55 50 44 41 54 45 20 72 65 66 61 63 74 28 58 29  UPDATE refact(X)
2c10: 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20  .   { A.value = 
2c20: 58 3c 3c 38 3b 20 20 41 2e 6d 61 73 6b 20 3d 20  X<<8;  A.mask = 
2c30: 30 78 30 30 66 66 30 30 3b 20 7d 0a 25 74 79 70  0x00ff00; }.%typ
2c40: 65 20 72 65 66 61 63 74 20 7b 69 6e 74 7d 0a 72  e refact {int}.r
2c50: 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45 54  efact(A) ::= SET
2c60: 20 4e 55 4c 4c 2e 20 20 20 20 20 20 20 20 20 20   NULL.          
2c70: 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74      { A = OE_Set
2c80: 4e 75 6c 6c 3b 20 20 2f 2a 20 45 56 3a 20 52 2d  Null;  /* EV: R-
2c90: 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a  33326-45252 */}.
2ca0: 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45  refact(A) ::= SE
2cb0: 54 20 44 45 46 41 55 4c 54 2e 20 20 20 20 20 20  T DEFAULT.      
2cc0: 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65       { A = OE_Se
2cd0: 74 44 66 6c 74 3b 20 20 2f 2a 20 45 56 3a 20 52  tDflt;  /* EV: R
2ce0: 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d  -33326-45252 */}
2cf0: 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 43  .refact(A) ::= C
2d00: 41 53 43 41 44 45 2e 20 20 20 20 20 20 20 20 20  ASCADE.         
2d10: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 43        { A = OE_C
2d20: 61 73 63 61 64 65 3b 20 20 2f 2a 20 45 56 3a 20  ascade;  /* EV: 
2d30: 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f  R-33326-45252 */
2d40: 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20  }.refact(A) ::= 
2d50: 52 45 53 54 52 49 43 54 2e 20 20 20 20 20 20 20  RESTRICT.       
2d60: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f         { A = OE_
2d70: 52 65 73 74 72 69 63 74 3b 20 2f 2a 20 45 56 3a  Restrict; /* EV:
2d80: 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a   R-33326-45252 *
2d90: 2f 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d  /}.refact(A) ::=
2da0: 20 4e 4f 20 41 43 54 49 4f 4e 2e 20 20 20 20 20   NO ACTION.     
2db0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
2dc0: 5f 4e 6f 6e 65 3b 20 20 20 20 20 2f 2a 20 45 56  _None;     /* EV
2dd0: 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20  : R-33326-45252 
2de0: 2a 2f 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f  */}.%type defer_
2df0: 73 75 62 63 6c 61 75 73 65 20 7b 69 6e 74 7d 0a  subclause {int}.
2e00: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28  defer_subclause(
2e10: 41 29 20 3a 3a 3d 20 4e 4f 54 20 44 45 46 45 52  A) ::= NOT DEFER
2e20: 52 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72  RABLE init_defer
2e30: 72 65 64 5f 70 72 65 64 5f 6f 70 74 2e 20 20 20  red_pred_opt.   
2e40: 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72    {A = 0;}.defer
2e50: 5f 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a  _subclause(A) ::
2e60: 3d 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e 69  = DEFERRABLE ini
2e70: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f  t_deferred_pred_
2e80: 6f 70 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20  opt(X).      {A 
2e90: 3d 20 58 3b 7d 0a 25 74 79 70 65 20 69 6e 69 74  = X;}.%type init
2ea0: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f  _deferred_pred_o
2eb0: 70 74 20 7b 69 6e 74 7d 0a 69 6e 69 74 5f 64 65  pt {int}.init_de
2ec0: 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28  ferred_pred_opt(
2ed0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2ef0: 41 20 3d 20 30 3b 7d 0a 69 6e 69 74 5f 64 65 66  A = 0;}.init_def
2f00: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41  erred_pred_opt(A
2f10: 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20  ) ::= INITIALLY 
2f20: 44 45 46 45 52 52 45 44 2e 20 20 20 20 20 7b 41  DEFERRED.     {A
2f30: 20 3d 20 31 3b 7d 0a 69 6e 69 74 5f 64 65 66 65   = 1;}.init_defe
2f40: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29  rred_pred_opt(A)
2f50: 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 49   ::= INITIALLY I
2f60: 4d 4d 45 44 49 41 54 45 2e 20 20 20 20 7b 41 20  MMEDIATE.    {A 
2f70: 3d 20 30 3b 7d 0a 0a 63 6f 6e 73 6c 69 73 74 5f  = 0;}..conslist_
2f80: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 20 20 7b 41 2e 6e 20 3d 20 30 3b 20 41       {A.n = 0; A
2fb0: 2e 7a 20 3d 20 30 3b 7d 0a 63 6f 6e 73 6c 69 73  .z = 0;}.conslis
2fc0: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 43 4f 4d  t_opt(A) ::= COM
2fd0: 4d 41 28 41 29 20 63 6f 6e 73 6c 69 73 74 2e 0a  MA(A) conslist..
2fe0: 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e  conslist ::= con
2ff0: 73 6c 69 73 74 20 74 63 6f 6e 73 63 6f 6d 6d 61  slist tconscomma
3000: 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74   tcons..conslist
3010: 20 3a 3a 3d 20 74 63 6f 6e 73 2e 0a 74 63 6f 6e   ::= tcons..tcon
3020: 73 63 6f 6d 6d 61 20 3a 3a 3d 20 43 4f 4d 4d 41  scomma ::= COMMA
3030: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 70 50  .            {pP
3040: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
3050: 4e 61 6d 65 2e 6e 20 3d 20 30 3b 7d 0a 74 63 6f  Name.n = 0;}.tco
3060: 6e 73 63 6f 6d 6d 61 20 3a 3a 3d 20 2e 0a 74 63  nscomma ::= ..tc
3070: 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49  ons ::= CONSTRAI
3080: 4e 54 20 6e 6d 28 58 29 2e 20 20 20 20 20 20 7b  NT nm(X).      {
3090: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
30a0: 6e 74 4e 61 6d 65 20 3d 20 58 3b 7d 0a 74 63 6f  ntName = X;}.tco
30b0: 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b  ns ::= PRIMARY K
30c0: 45 59 20 4c 50 20 73 6f 72 74 6c 69 73 74 28 58  EY LP sortlist(X
30d0: 29 20 61 75 74 6f 69 6e 63 28 49 29 20 52 50 20  ) autoinc(I) RP 
30e0: 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20  onconf(R)..     
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
3110: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
3120: 79 28 70 50 61 72 73 65 2c 58 2c 52 2c 49 2c 30  y(pParse,X,R,I,0
3130: 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 55 4e  );}.tcons ::= UN
3140: 49 51 55 45 20 4c 50 20 73 6f 72 74 6c 69 73 74  IQUE LP sortlist
3150: 28 58 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29  (X) RP onconf(R)
3160: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74     {sqlite3Creat
3190: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c  eIndex(pParse,0,
31a0: 30 2c 30 2c 58 2c 52 2c 30 2c 30 2c 30 2c 30 2c  0,0,X,R,0,0,0,0,
31b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
31e0: 44 58 54 59 50 45 5f 55 4e 49 51 55 45 29 3b 7d  DXTYPE_UNIQUE);}
31f0: 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b  .tcons ::= CHECK
3200: 20 4c 50 20 65 78 70 72 28 45 29 20 52 50 20 6f   LP expr(E) RP o
3210: 6e 63 6f 6e 66 2e 0a 20 20 20 20 20 20 20 20 20  nconf..         
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
3240: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
3250: 6e 74 28 70 50 61 72 73 65 2c 45 2e 70 45 78 70  nt(pParse,E.pExp
3260: 72 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 46  r);}.tcons ::= F
3270: 4f 52 45 49 47 4e 20 4b 45 59 20 4c 50 20 65 69  OREIGN KEY LP ei
3280: 64 6c 69 73 74 28 46 41 29 20 52 50 0a 20 20 20  dlist(FA) RP.   
3290: 20 20 20 20 20 20 20 52 45 46 45 52 45 4e 43 45         REFERENCE
32a0: 53 20 6e 6d 28 54 29 20 65 69 64 6c 69 73 74 5f  S nm(T) eidlist_
32b0: 6f 70 74 28 54 41 29 20 72 65 66 61 72 67 73 28  opt(TA) refargs(
32c0: 52 29 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75  R) defer_subclau
32d0: 73 65 5f 6f 70 74 28 44 29 2e 20 7b 0a 20 20 20  se_opt(D). {.   
32e0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f   sqlite3CreateFo
32f0: 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c  reignKey(pParse,
3300: 20 46 41 2c 20 26 54 2c 20 54 41 2c 20 52 29 3b   FA, &T, TA, R);
3310: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 66 65  .    sqlite3Defe
3320: 72 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72  rForeignKey(pPar
3330: 73 65 2c 20 44 29 3b 0a 7d 0a 25 74 79 70 65 20  se, D);.}.%type 
3340: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f  defer_subclause_
3350: 6f 70 74 20 7b 69 6e 74 7d 0a 64 65 66 65 72 5f  opt {int}.defer_
3360: 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 41 29  subclause_opt(A)
3370: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
3380: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
3390: 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75  ;}.defer_subclau
33a0: 73 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 64 65  se_opt(A) ::= de
33b0: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 41 29  fer_subclause(A)
33c0: 2e 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77  ...// The follow
33d0: 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74 61  ing is a non-sta
33e0: 6e 64 61 72 64 20 65 78 74 65 6e 73 69 6f 6e 20  ndard extension 
33f0: 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 20 74  that allows us t
3400: 6f 20 64 65 63 6c 61 72 65 20 74 68 65 0a 2f 2f  o declare the.//
3410: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
3420: 72 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  r when there is 
3430: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e  a constraint con
3440: 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65 20  flict..//.%type 
3450: 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79  onconf {int}.%ty
3460: 70 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74 7d 0a  pe orconf {int}.
3470: 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74 79 70  %type resolvetyp
3480: 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28 41  e {int}.onconf(A
3490: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34b0: 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44 65 66       {A = OE_Def
34c0: 61 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28 41 29  ault;}.onconf(A)
34d0: 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   ::= ON CONFLICT
34e0: 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e   resolvetype(X).
34f0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f 72 63      {A = X;}.orc
3500: 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  onf(A) ::= .    
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f            {A = O
3530: 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72 63 6f  E_Default;}.orco
3540: 6e 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72 65 73  nf(A) ::= OR res
3550: 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20 20 20  olvetype(X).    
3560: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
3570: 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29  }.resolvetype(A)
3580: 20 3a 3a 3d 20 72 61 69 73 65 74 79 70 65 28 41   ::= raisetype(A
3590: 29 2e 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41  )..resolvetype(A
35a0: 29 20 3a 3a 3d 20 49 47 4e 4f 52 45 2e 20 20 20  ) ::= IGNORE.   
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 7b 41 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 7d  {A = OE_Ignore;}
35d0: 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20  .resolvetype(A) 
35e0: 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20  ::= REPLACE.    
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
3600: 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a   = OE_Replace;}.
3610: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
3620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
3630: 44 52 4f 50 20 54 41 42 4c 45 20 2f 2f 2f 2f 2f  DROP TABLE /////
3640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3660: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50  .//.cmd ::= DROP
3670: 20 54 41 42 4c 45 20 69 66 65 78 69 73 74 73 28   TABLE ifexists(
3680: 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20  E) fullname(X). 
3690: 7b 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54  {.  sqlite3DropT
36a0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 58 2c 20  able(pParse, X, 
36b0: 30 2c 20 45 29 3b 0a 7d 0a 25 74 79 70 65 20 69  0, E);.}.%type i
36c0: 66 65 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66  fexists {int}.if
36d0: 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 49 46  exists(A) ::= IF
36e0: 20 45 58 49 53 54 53 2e 20 20 20 7b 41 20 3d 20   EXISTS.   {A = 
36f0: 31 3b 7d 0a 69 66 65 78 69 73 74 73 28 41 29 20  1;}.ifexists(A) 
3700: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
3710: 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f   {A = 0;}../////
3720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3730: 20 54 68 65 20 43 52 45 41 54 45 20 56 49 45 57   The CREATE VIEW
3740: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
3750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3760: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e  ////////.//.%ifn
3770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3780: 56 49 45 57 0a 63 6d 64 20 3a 3a 3d 20 63 72 65  VIEW.cmd ::= cre
3790: 61 74 65 6b 77 28 58 29 20 74 65 6d 70 28 54 29  atekw(X) temp(T)
37a0: 20 56 49 45 57 20 69 66 6e 6f 74 65 78 69 73 74   VIEW ifnotexist
37b0: 73 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28  s(E) nm(Y) dbnm(
37c0: 5a 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28 43  Z) eidlist_opt(C
37d0: 29 0a 20 20 20 20 20 20 20 20 20 20 41 53 20 73  ).          AS s
37e0: 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71  elect(S). {.  sq
37f0: 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
3800: 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20  pParse, &X, &Y, 
3810: 26 5a 2c 20 43 2c 20 53 2c 20 54 2c 20 45 29 3b  &Z, C, S, T, E);
3820: 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20  .}.cmd ::= DROP 
3830: 56 49 45 57 20 69 66 65 78 69 73 74 73 28 45 29  VIEW ifexists(E)
3840: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a   fullname(X). {.
3850: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62    sqlite3DropTab
3860: 6c 65 28 70 50 61 72 73 65 2c 20 58 2c 20 31 2c  le(pParse, X, 1,
3870: 20 45 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53   E);.}.%endif  S
3880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
3890: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
38a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53 45  ///////// The SE
38b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2f  LECT statement /
38c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
38d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
38e0: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c 65  .//.cmd ::= sele
38f0: 63 74 28 58 29 2e 20 20 7b 0a 20 20 53 65 6c 65  ct(X).  {.  Sele
3900: 63 74 44 65 73 74 20 64 65 73 74 20 3d 20 7b 53  ctDest dest = {S
3910: 52 54 5f 4f 75 74 70 75 74 2c 20 30 2c 20 30 2c  RT_Output, 0, 0,
3920: 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 73 71 6c   0, 0, 0};.  sql
3930: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
3940: 65 2c 20 58 2c 20 26 64 65 73 74 29 3b 0a 20 20  e, X, &dest);.  
3950: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
3960: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
3970: 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73 65 6c  X);.}..%type sel
3980: 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64  ect {Select*}.%d
3990: 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65 63 74  estructor select
39a0: 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   {sqlite3SelectD
39b0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
39c0: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 65  , $$);}.%type se
39d0: 6c 65 63 74 6e 6f 77 69 74 68 20 7b 53 65 6c 65  lectnowith {Sele
39e0: 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  ct*}.%destructor
39f0: 20 73 65 6c 65 63 74 6e 6f 77 69 74 68 20 7b 73   selectnowith {s
3a00: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3a10: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
3a20: 24 29 3b 7d 0a 25 74 79 70 65 20 6f 6e 65 73 65  $);}.%type onese
3a30: 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25  lect {Select*}.%
3a40: 64 65 73 74 72 75 63 74 6f 72 20 6f 6e 65 73 65  destructor onese
3a50: 6c 65 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c  lect {sqlite3Sel
3a60: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
3a70: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 69 6e  ->db, $$);}..%in
3a80: 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 0a 20 20 2a  clude {.  /*.  *
3a90: 2a 20 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64  * For a compound
3aa0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3ab0: 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 2d 3e  t, make sure p->
3ac0: 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70  pPrior->pNext==p
3ad0: 20 66 6f 72 0a 20 20 2a 2a 20 61 6c 6c 20 65 6c   for.  ** all el
3ae0: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69  ements in the li
3af0: 73 74 2e 20 20 41 6e 64 20 6d 61 6b 65 20 73 75  st.  And make su
3b00: 72 65 20 6c 69 73 74 20 6c 65 6e 67 74 68 20 64  re list length d
3b10: 6f 65 73 20 6e 6f 74 20 65 78 63 65 65 64 0a 20  oes not exceed. 
3b20: 20 2a 2a 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54   ** SQLITE_LIMIT
3b30: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
3b40: 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
3b50: 76 6f 69 64 20 70 61 72 73 65 72 44 6f 75 62 6c  void parserDoubl
3b60: 65 4c 69 6e 6b 53 65 6c 65 63 74 28 50 61 72 73  eLinkSelect(Pars
3b70: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63  e *pParse, Selec
3b80: 74 20 2a 70 29 7b 0a 20 20 20 20 69 66 28 20 70  t *p){.    if( p
3b90: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
3ba0: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74 20    Select *pNext 
3bb0: 3d 20 30 2c 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20  = 0, *pLoop;.   
3bc0: 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 2c     int mxSelect,
3bd0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   cnt = 0;.      
3be0: 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f  for(pLoop=p; pLo
3bf0: 6f 70 3b 20 70 4e 65 78 74 3d 70 4c 6f 6f 70 2c  op; pNext=pLoop,
3c00: 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50   pLoop=pLoop->pP
3c10: 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20  rior, cnt++){.  
3c20: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65        pLoop->pNe
3c30: 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20  xt = pNext;.    
3c40: 20 20 20 20 70 4c 6f 6f 70 2d 3e 73 65 6c 46 6c      pLoop->selFl
3c50: 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6f 75  ags |= SF_Compou
3c60: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
3c70: 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
3c80: 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c  gs & SF_MultiVal
3c90: 75 65 29 3d 3d 30 20 26 26 20 0a 20 20 20 20 20  ue)==0 && .     
3ca0: 20 20 20 28 6d 78 53 65 6c 65 63 74 20 3d 20 70     (mxSelect = p
3cb0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
3cc0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
3cd0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 29  OMPOUND_SELECT])
3ce0: 3e 30 20 26 26 0a 20 20 20 20 20 20 20 20 63 6e  >0 &&.        cn
3cf0: 74 3e 6d 78 53 65 6c 65 63 74 0a 20 20 20 20 20  t>mxSelect.     
3d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
3d10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
3d20: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
3d30: 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20  rms in compound 
3d40: 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20  SELECT");.      
3d50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  }.    }.  }.}..s
3d60: 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 77 69 74  elect(A) ::= wit
3d70: 68 28 57 29 20 73 65 6c 65 63 74 6e 6f 77 69 74  h(W) selectnowit
3d80: 68 28 58 29 2e 20 7b 0a 20 20 53 65 6c 65 63 74  h(X). {.  Select
3d90: 20 2a 70 20 3d 20 58 3b 0a 20 20 69 66 28 20 70   *p = X;.  if( p
3da0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 69 74 68   ){.    p->pWith
3db0: 20 3d 20 57 3b 0a 20 20 20 20 70 61 72 73 65 72   = W;.    parser
3dc0: 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74  DoubleLinkSelect
3dd0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d  (pParse, p);.  }
3de0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
3df0: 33 57 69 74 68 44 65 6c 65 74 65 28 70 50 61 72  3WithDelete(pPar
3e00: 73 65 2d 3e 64 62 2c 20 57 29 3b 0a 20 20 7d 0a  se->db, W);.  }.
3e10: 20 20 41 20 3d 20 70 3b 20 2f 2a 41 2d 6f 76 65    A = p; /*A-ove
3e20: 72 77 72 69 74 65 73 2d 57 2a 2f 0a 7d 0a 0a 73  rwrites-W*/.}..s
3e30: 65 6c 65 63 74 6e 6f 77 69 74 68 28 41 29 20 3a  electnowith(A) :
3e40: 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28 41 29 2e  := oneselect(A).
3e50: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
3e60: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
3e70: 4c 45 43 54 0a 73 65 6c 65 63 74 6e 6f 77 69 74  LECT.selectnowit
3e80: 68 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74 6e  h(A) ::= selectn
3e90: 6f 77 69 74 68 28 41 29 20 6d 75 6c 74 69 73 65  owith(A) multise
3ea0: 6c 65 63 74 5f 6f 70 28 59 29 20 6f 6e 65 73 65  lect_op(Y) onese
3eb0: 6c 65 63 74 28 5a 29 2e 20 20 7b 0a 20 20 53 65  lect(Z).  {.  Se
3ec0: 6c 65 63 74 20 2a 70 52 68 73 20 3d 20 5a 3b 0a  lect *pRhs = Z;.
3ed0: 20 20 53 65 6c 65 63 74 20 2a 70 4c 68 73 20 3d    Select *pLhs =
3ee0: 20 41 3b 0a 20 20 69 66 28 20 70 52 68 73 20 26   A;.  if( pRhs &
3ef0: 26 20 70 52 68 73 2d 3e 70 50 72 69 6f 72 20 29  & pRhs->pPrior )
3f00: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
3f10: 46 72 6f 6d 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  From;.    Token 
3f20: 78 3b 0a 20 20 20 20 78 2e 6e 20 3d 20 30 3b 0a  x;.    x.n = 0;.
3f30: 20 20 20 20 70 61 72 73 65 72 44 6f 75 62 6c 65      parserDouble
3f40: 4c 69 6e 6b 53 65 6c 65 63 74 28 70 50 61 72 73  LinkSelect(pPars
3f50: 65 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 70 46  e, pRhs);.    pF
3f60: 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 53 72 63  rom = sqlite3Src
3f70: 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
3f80: 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c  rm(pParse,0,0,0,
3f90: 26 78 2c 70 52 68 73 2c 30 2c 30 29 3b 0a 20 20  &x,pRhs,0,0);.  
3fa0: 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33    pRhs = sqlite3
3fb0: 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65  SelectNew(pParse
3fc0: 2c 30 2c 70 46 72 6f 6d 2c 30 2c 30 2c 30 2c 30  ,0,pFrom,0,0,0,0
3fd0: 2c 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 69  ,0,0,0);.  }.  i
3fe0: 66 28 20 70 52 68 73 20 29 7b 0a 20 20 20 20 70  f( pRhs ){.    p
3ff0: 52 68 73 2d 3e 6f 70 20 3d 20 28 75 38 29 59 3b  Rhs->op = (u8)Y;
4000: 0a 20 20 20 20 70 52 68 73 2d 3e 70 50 72 69 6f  .    pRhs->pPrio
4010: 72 20 3d 20 70 4c 68 73 3b 0a 20 20 20 20 69 66  r = pLhs;.    if
4020: 28 20 41 4c 57 41 59 53 28 70 4c 68 73 29 20 29  ( ALWAYS(pLhs) )
4030: 20 70 4c 68 73 2d 3e 73 65 6c 46 6c 61 67 73 20   pLhs->selFlags 
4040: 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75  &= ~SF_MultiValu
4050: 65 3b 0a 20 20 20 20 70 52 68 73 2d 3e 73 65 6c  e;.    pRhs->sel
4060: 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c  Flags &= ~SF_Mul
4070: 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28  tiValue;.    if(
4080: 20 59 21 3d 54 4b 5f 41 4c 4c 20 29 20 70 50 61   Y!=TK_ALL ) pPa
4090: 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64  rse->hasCompound
40a0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
40b0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
40c0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
40d0: 62 2c 20 70 4c 68 73 29 3b 0a 20 20 7d 0a 20 20  b, pLhs);.  }.  
40e0: 41 20 3d 20 70 52 68 73 3b 0a 7d 0a 25 74 79 70  A = pRhs;.}.%typ
40f0: 65 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70  e multiselect_op
4100: 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65   {int}.multisele
4110: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49  ct_op(A) ::= UNI
4120: 4f 4e 28 4f 50 29 2e 20 20 20 20 20 20 20 20 20  ON(OP).         
4130: 20 20 20 20 7b 41 20 3d 20 40 4f 50 3b 20 2f 2a      {A = @OP; /*
4140: 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 4f 50 2a  A-overwrites-OP*
4150: 2f 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f  /}.multiselect_o
4160: 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 20 41  p(A) ::= UNION A
4170: 4c 4c 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  LL.             
4180: 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d 75  {A = TK_ALL;}.mu
4190: 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20  ltiselect_op(A) 
41a0: 3a 3a 3d 20 45 58 43 45 50 54 7c 49 4e 54 45 52  ::= EXCEPT|INTER
41b0: 53 45 43 54 28 4f 50 29 2e 20 20 7b 41 20 3d 20  SECT(OP).  {A = 
41c0: 40 4f 50 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69  @OP; /*A-overwri
41d0: 74 65 73 2d 4f 50 2a 2f 7d 0a 25 65 6e 64 69 66  tes-OP*/}.%endif
41e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
41f0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 6f 6e 65  POUND_SELECT.one
4200: 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 53 45  select(A) ::= SE
4210: 4c 45 43 54 28 53 29 20 64 69 73 74 69 6e 63 74  LECT(S) distinct
4220: 28 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57  (D) selcollist(W
4230: 29 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65 5f  ) from(X) where_
4240: 6f 70 74 28 59 29 0a 20 20 20 20 20 20 20 20 20  opt(Y).         
4250: 20 20 20 20 20 20 20 20 67 72 6f 75 70 62 79 5f          groupby_
4260: 6f 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f 70  opt(P) having_op
4270: 74 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70 74  t(Q) orderby_opt
4280: 28 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29  (Z) limit_opt(L)
4290: 2e 20 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52  . {.#if SELECTTR
42a0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 54 6f  ACE_ENABLED.  To
42b0: 6b 65 6e 20 73 20 3d 20 53 3b 20 2f 2a 41 2d 6f  ken s = S; /*A-o
42c0: 76 65 72 77 72 69 74 65 73 2d 53 2a 2f 0a 23 65  verwrites-S*/.#e
42d0: 6e 64 69 66 0a 20 20 41 20 3d 20 73 71 6c 69 74  ndif.  A = sqlit
42e0: 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72  e3SelectNew(pPar
42f0: 73 65 2c 57 2c 58 2c 59 2c 50 2c 51 2c 5a 2c 44  se,W,X,Y,P,Q,Z,D
4300: 2c 4c 2e 70 4c 69 6d 69 74 2c 4c 2e 70 4f 66 66  ,L.pLimit,L.pOff
4310: 73 65 74 29 3b 0a 23 69 66 20 53 45 4c 45 43 54  set);.#if SELECT
4320: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20  TRACE_ENABLED.  
4330: 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
4340: 53 65 6c 65 63 74 2e 7a 53 65 6c 4e 61 6d 65 5b  Select.zSelName[
4350: 5d 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73  ] string that is
4360: 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 77 69   used to help wi
4370: 74 68 0a 20 20 2a 2a 20 71 75 65 72 79 20 70 6c  th.  ** query pl
4380: 61 6e 6e 65 72 20 64 65 62 75 67 67 69 6e 67 2c  anner debugging,
4390: 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74   to differentiat
43a0: 65 20 62 65 74 77 65 65 6e 20 6d 75 6c 74 69 70  e between multip
43b0: 6c 65 20 53 65 6c 65 63 74 0a 20 20 2a 2a 20 6f  le Select.  ** o
43c0: 62 6a 65 63 74 73 20 69 6e 20 61 20 63 6f 6d 70  bjects in a comp
43d0: 6c 65 78 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  lex query..  **.
43e0: 20 20 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45    ** If the SELE
43f0: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 69 6d  CT keyword is im
4400: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77  mediately follow
4410: 65 64 20 62 79 20 61 20 43 2d 73 74 79 6c 65 20  ed by a C-style 
4420: 63 6f 6d 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65  comment.  ** the
4430: 6e 20 65 78 74 72 61 63 74 20 74 68 65 20 66 69  n extract the fi
4440: 72 73 74 20 66 65 77 20 61 6c 70 68 61 6e 75 6d  rst few alphanum
4450: 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73 20  eric characters 
4460: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 61 74  from within that
4470: 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74 6f  .  ** comment to
4480: 20 62 65 20 74 68 65 20 7a 53 65 6c 4e 61 6d 65   be the zSelName
4490: 20 76 61 6c 75 65 2e 20 20 4f 74 68 65 72 77 69   value.  Otherwi
44a0: 73 65 2c 20 74 68 65 20 6c 61 62 65 6c 20 69 73  se, the label is
44b0: 20 23 4e 20 77 68 65 72 65 0a 20 20 2a 2a 20 69   #N where.  ** i
44c0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61  s an integer tha
44d0: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
44e0: 20 77 69 74 68 20 65 61 63 68 20 53 45 4c 45 43   with each SELEC
44f0: 54 20 73 74 61 74 65 6d 65 6e 74 20 73 65 65 6e  T statement seen
4500: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 21 3d  ..  */.  if( A!=
4510: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
4520: 68 61 72 20 2a 7a 20 3d 20 73 2e 7a 2b 36 3b 0a  har *z = s.z+6;.
4530: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73      int i;.    s
4540: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
4550: 73 69 7a 65 6f 66 28 41 2d 3e 7a 53 65 6c 4e 61  sizeof(A->zSelNa
4560: 6d 65 29 2c 20 41 2d 3e 7a 53 65 6c 4e 61 6d 65  me), A->zSelName
4570: 2c 20 22 23 25 64 22 2c 0a 20 20 20 20 20 20 20  , "#%d",.       
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2b                ++
4590: 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 29  pParse->nSelect)
45a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30  ;.    while( z[0
45b0: 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]==' ' ) z++;.  
45c0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20    if( z[0]=='/' 
45d0: 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a  && z[1]=='*' ){.
45e0: 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20        z += 2;.  
45f0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3d      while( z[0]=
4600: 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  =' ' ) z++;.    
4610: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74    for(i=0; sqlit
4620: 65 33 49 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 3b  e3Isalnum(z[i]);
4630: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 73 71   i++){}.      sq
4640: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
4650: 69 7a 65 6f 66 28 41 2d 3e 7a 53 65 6c 4e 61 6d  izeof(A->zSelNam
4660: 65 29 2c 20 41 2d 3e 7a 53 65 6c 4e 61 6d 65 2c  e), A->zSelName,
4670: 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a   "%.*s", i, z);.
4680: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
4690: 20 2f 2a 20 53 45 4c 45 43 54 52 41 43 45 5f 45   /* SELECTRACE_E
46a0: 4e 41 42 4c 45 44 20 2a 2f 0a 7d 0a 6f 6e 65 73  NABLED */.}.ones
46b0: 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 76 61 6c  elect(A) ::= val
46c0: 75 65 73 28 41 29 2e 0a 0a 25 74 79 70 65 20 76  ues(A)...%type v
46d0: 61 6c 75 65 73 20 7b 53 65 6c 65 63 74 2a 7d 0a  alues {Select*}.
46e0: 25 64 65 73 74 72 75 63 74 6f 72 20 76 61 6c 75  %destructor valu
46f0: 65 73 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  es {sqlite3Selec
4700: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
4710: 64 62 2c 20 24 24 29 3b 7d 0a 76 61 6c 75 65 73  db, $$);}.values
4720: 28 41 29 20 3a 3a 3d 20 56 41 4c 55 45 53 20 4c  (A) ::= VALUES L
4730: 50 20 6e 65 78 70 72 6c 69 73 74 28 58 29 20 52  P nexprlist(X) R
4740: 50 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  P. {.  A = sqlit
4750: 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72  e3SelectNew(pPar
4760: 73 65 2c 58 2c 30 2c 30 2c 30 2c 30 2c 30 2c 53  se,X,0,0,0,0,0,S
4770: 46 5f 56 61 6c 75 65 73 2c 30 2c 30 29 3b 0a 7d  F_Values,0,0);.}
4780: 0a 76 61 6c 75 65 73 28 41 29 20 3a 3a 3d 20 76  .values(A) ::= v
4790: 61 6c 75 65 73 28 41 29 20 43 4f 4d 4d 41 20 4c  alues(A) COMMA L
47a0: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50  P exprlist(Y) RP
47b0: 2e 20 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52  . {.  Select *pR
47c0: 69 67 68 74 2c 20 2a 70 4c 65 66 74 20 3d 20 41  ight, *pLeft = A
47d0: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c  ;.  pRight = sql
47e0: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50  ite3SelectNew(pP
47f0: 61 72 73 65 2c 59 2c 30 2c 30 2c 30 2c 30 2c 30  arse,Y,0,0,0,0,0
4800: 2c 53 46 5f 56 61 6c 75 65 73 7c 53 46 5f 4d 75  ,SF_Values|SF_Mu
4810: 6c 74 69 56 61 6c 75 65 2c 30 2c 30 29 3b 0a 20  ltiValue,0,0);. 
4820: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 65 66   if( ALWAYS(pLef
4830: 74 29 20 29 20 70 4c 65 66 74 2d 3e 73 65 6c 46  t) ) pLeft->selF
4840: 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74  lags &= ~SF_Mult
4850: 69 56 61 6c 75 65 3b 0a 20 20 69 66 28 20 70 52  iValue;.  if( pR
4860: 69 67 68 74 20 29 7b 0a 20 20 20 20 70 52 69 67  ight ){.    pRig
4870: 68 74 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b  ht->op = TK_ALL;
4880: 0a 20 20 20 20 70 52 69 67 68 74 2d 3e 70 50 72  .    pRight->pPr
4890: 69 6f 72 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20  ior = pLeft;.   
48a0: 20 41 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 7d   A = pRight;.  }
48b0: 65 6c 73 65 7b 0a 20 20 20 20 41 20 3d 20 70 4c  else{.    A = pL
48c0: 65 66 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 54  eft;.  }.}..// T
48d0: 68 65 20 22 64 69 73 74 69 6e 63 74 22 20 6e 6f  he "distinct" no
48e0: 6e 74 65 72 6d 69 6e 61 6c 20 69 73 20 74 72 75  nterminal is tru
48f0: 65 20 28 31 29 20 69 66 20 74 68 65 20 44 49 53  e (1) if the DIS
4900: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73  TINCT keyword is
4910: 0a 2f 2f 20 70 72 65 73 65 6e 74 20 61 6e 64 20  .// present and 
4920: 66 61 6c 73 65 20 28 30 29 20 69 66 20 69 74 20  false (0) if it 
4930: 69 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65  is not..//.%type
4940: 20 64 69 73 74 69 6e 63 74 20 7b 69 6e 74 7d 0a   distinct {int}.
4950: 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20  distinct(A) ::= 
4960: 44 49 53 54 49 4e 43 54 2e 20 20 20 7b 41 20 3d  DISTINCT.   {A =
4970: 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 7d 0a 64   SF_Distinct;}.d
4980: 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 41  istinct(A) ::= A
4990: 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20  LL.        {A = 
49a0: 53 46 5f 41 6c 6c 3b 7d 0a 64 69 73 74 69 6e 63  SF_All;}.distinc
49b0: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
49c0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f       {A = 0;}../
49d0: 2f 20 73 65 6c 63 6f 6c 6c 69 73 74 20 69 73 20  / selcollist is 
49e0: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
49f0: 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 74  sions that are t
4a00: 6f 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  o become the ret
4a10: 75 72 6e 0a 2f 2f 20 76 61 6c 75 65 73 20 6f 66  urn.// values of
4a20: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
4a30: 65 6d 65 6e 74 2e 20 20 54 68 65 20 22 2a 22 20  ement.  The "*" 
4a40: 69 6e 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  in statements li
4a50: 6b 65 0a 2f 2f 20 22 53 45 4c 45 43 54 20 2a 20  ke.// "SELECT * 
4a60: 46 52 4f 4d 20 2e 2e 2e 22 20 69 73 20 65 6e 63  FROM ..." is enc
4a70: 6f 64 65 64 20 61 73 20 61 20 73 70 65 63 69 61  oded as a specia
4a80: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  l expression wit
4a90: 68 20 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f  h an.// opcode o
4aa0: 66 20 54 4b 5f 41 53 54 45 52 49 53 4b 2e 0a 2f  f TK_ASTERISK../
4ab0: 2f 0a 25 74 79 70 65 20 73 65 6c 63 6f 6c 6c 69  /.%type selcolli
4ac0: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
4ad0: 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 63 6f  destructor selco
4ae0: 6c 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  llist {sqlite3Ex
4af0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
4b00: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
4b10: 74 79 70 65 20 73 63 6c 70 20 7b 45 78 70 72 4c  type sclp {ExprL
4b20: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
4b30: 72 20 73 63 6c 70 20 7b 73 71 6c 69 74 65 33 45  r sclp {sqlite3E
4b40: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
4b50: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
4b60: 73 63 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c 63  sclp(A) ::= selc
4b70: 6f 6c 6c 69 73 74 28 41 29 20 43 4f 4d 4d 41 2e  ollist(A) COMMA.
4b80: 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20 2e 20 20  .sclp(A) ::= .  
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
4bb0: 20 3d 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73   = 0;}.selcollis
4bc0: 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 41 29  t(A) ::= sclp(A)
4bd0: 20 65 78 70 72 28 58 29 20 61 73 28 59 29 2e 20   expr(X) as(Y). 
4be0: 20 20 20 20 7b 0a 20 20 20 41 20 3d 20 73 71 6c      {.   A = sql
4bf0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
4c00: 6e 64 28 70 50 61 72 73 65 2c 20 41 2c 20 58 2e  nd(pParse, A, X.
4c10: 70 45 78 70 72 29 3b 0a 20 20 20 69 66 28 20 59  pExpr);.   if( Y
4c20: 2e 6e 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78  .n>0 ) sqlite3Ex
4c30: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
4c40: 61 72 73 65 2c 20 41 2c 20 26 59 2c 20 31 29 3b  arse, A, &Y, 1);
4c50: 0a 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  .   sqlite3ExprL
4c60: 69 73 74 53 65 74 53 70 61 6e 28 70 50 61 72 73  istSetSpan(pPars
4c70: 65 2c 41 2c 26 58 29 3b 0a 7d 0a 73 65 6c 63 6f  e,A,&X);.}.selco
4c80: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c  llist(A) ::= scl
4c90: 70 28 41 29 20 53 54 41 52 2e 20 7b 0a 20 20 45  p(A) STAR. {.  E
4ca0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
4cb0: 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c  Expr(pParse->db,
4cc0: 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29   TK_ASTERISK, 0)
4cd0: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
4ce0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
4cf0: 61 72 73 65 2c 20 41 2c 20 70 29 3b 0a 7d 0a 73  arse, A, p);.}.s
4d00: 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d  elcollist(A) ::=
4d10: 20 73 63 6c 70 28 41 29 20 6e 6d 28 58 29 20 44   sclp(A) nm(X) D
4d20: 4f 54 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70  OT STAR. {.  Exp
4d30: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
4d40: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
4d50: 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 2c   TK_ASTERISK, 0,
4d60: 20 30 29 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65   0);.  Expr *pLe
4d70: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
4d80: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
4d90: 2c 20 54 4b 5f 49 44 2c 20 26 58 2c 20 31 29 3b  , TK_ID, &X, 1);
4da0: 0a 20 20 45 78 70 72 20 2a 70 44 6f 74 20 3d 20  .  Expr *pDot = 
4db0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
4dc0: 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65  rse, TK_DOT, pLe
4dd0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 41  ft, pRight);.  A
4de0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4df0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
4e00: 41 2c 20 70 44 6f 74 29 3b 0a 7d 0a 0a 2f 2f 20  A, pDot);.}..// 
4e10: 41 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20 3c 69  An option "AS <i
4e20: 64 3e 22 20 70 68 72 61 73 65 20 74 68 61 74 20  d>" phrase that 
4e30: 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65 20 6f  can follow one o
4e40: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
4e50: 73 20 74 68 61 74 0a 2f 2f 20 64 65 66 69 6e 65  s that.// define
4e60: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
4e70: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
4e80: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
4e90: 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25 74 79  M clause..//.%ty
4ea0: 70 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a 61 73  pe as {Token}.as
4eb0: 28 58 29 20 3a 3a 3d 20 41 53 20 6e 6d 28 59 29  (X) ::= AS nm(Y)
4ec0: 2e 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a 61 73  .    {X = Y;}.as
4ed0: 28 58 29 20 3a 3a 3d 20 69 64 73 28 58 29 2e 0a  (X) ::= ids(X)..
4ee0: 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20  as(X) ::= .     
4ef0: 20 20 20 20 20 20 20 7b 58 2e 6e 20 3d 20 30 3b         {X.n = 0;
4f00: 20 58 2e 7a 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79   X.z = 0;}...%ty
4f10: 70 65 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 53  pe seltablist {S
4f20: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  rcList*}.%destru
4f30: 63 74 6f 72 20 73 65 6c 74 61 62 6c 69 73 74 20  ctor seltablist 
4f40: 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  {sqlite3SrcListD
4f50: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
4f60: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 74  , $$);}.%type st
4f70: 6c 5f 70 72 65 66 69 78 20 7b 53 72 63 4c 69 73  l_prefix {SrcLis
4f80: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
4f90: 73 74 6c 5f 70 72 65 66 69 78 20 7b 73 71 6c 69  stl_prefix {sqli
4fa0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
4fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
4fc0: 3b 7d 0a 25 74 79 70 65 20 66 72 6f 6d 20 7b 53  ;}.%type from {S
4fd0: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  rcList*}.%destru
4fe0: 63 74 6f 72 20 66 72 6f 6d 20 7b 73 71 6c 69 74  ctor from {sqlit
4ff0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
5000: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
5010: 7d 0a 0a 2f 2f 20 41 20 63 6f 6d 70 6c 65 74 65  }..// A complete
5020: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f   FROM clause..//
5030: 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 2e 20 20  .from(A) ::= .  
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
5050: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
5060: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
5070: 62 2c 20 73 69 7a 65 6f 66 28 2a 41 29 29 3b 7d  b, sizeof(*A));}
5080: 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 46 52 4f  .from(A) ::= FRO
5090: 4d 20 73 65 6c 74 61 62 6c 69 73 74 28 58 29 2e  M seltablist(X).
50a0: 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20 20 73 71   {.  A = X;.  sq
50b0: 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
50c0: 74 4a 6f 69 6e 54 79 70 65 28 41 29 3b 0a 7d 0a  tJoinType(A);.}.
50d0: 0a 2f 2f 20 22 73 65 6c 74 61 62 6c 69 73 74 22  .// "seltablist"
50e0: 20 69 73 20 61 20 22 53 65 6c 65 63 74 20 54 61   is a "Select Ta
50f0: 62 6c 65 20 4c 69 73 74 22 20 2d 20 74 68 65 20  ble List" - the 
5100: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 46  content of the F
5110: 52 4f 4d 20 63 6c 61 75 73 65 0a 2f 2f 20 69 6e  ROM clause.// in
5120: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
5130: 65 6e 74 2e 20 20 22 73 74 6c 5f 70 72 65 66 69  ent.  "stl_prefi
5140: 78 22 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  x" is a prefix o
5150: 66 20 74 68 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a  f this list..//.
5160: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a  stl_prefix(A) ::
5170: 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20  = seltablist(A) 
5180: 6a 6f 69 6e 6f 70 28 59 29 2e 20 20 20 20 7b 0a  joinop(Y).    {.
5190: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 41 20     if( ALWAYS(A 
51a0: 26 26 20 41 2d 3e 6e 53 72 63 3e 30 29 20 29 20  && A->nSrc>0) ) 
51b0: 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e  A->a[A->nSrc-1].
51c0: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 28 75  fg.jointype = (u
51d0: 38 29 59 3b 0a 7d 0a 73 74 6c 5f 70 72 65 66 69  8)Y;.}.stl_prefi
51e0: 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  x(A) ::= .      
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5200: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65       {A = 0;}.se
5210: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ltablist(A) ::= 
5220: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 6e 6d  stl_prefix(A) nm
5230: 28 59 29 20 64 62 6e 6d 28 44 29 20 61 73 28 5a  (Y) dbnm(D) as(Z
5240: 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29  ) indexed_opt(I)
5250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5260: 20 20 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69     on_opt(N) usi
5270: 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 41  ng_opt(U). {.  A
5280: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
5290: 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
52a0: 70 50 61 72 73 65 2c 41 2c 26 59 2c 26 44 2c 26  pParse,A,&Y,&D,&
52b0: 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20 73 71 6c 69  Z,0,N,U);.  sqli
52c0: 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
52d0: 64 42 79 28 70 50 61 72 73 65 2c 20 41 2c 20 26  dBy(pParse, A, &
52e0: 49 29 3b 0a 7d 0a 73 65 6c 74 61 62 6c 69 73 74  I);.}.seltablist
52f0: 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66  (A) ::= stl_pref
5300: 69 78 28 41 29 20 6e 6d 28 59 29 20 64 62 6e 6d  ix(A) nm(Y) dbnm
5310: 28 44 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28  (D) LP exprlist(
5320: 45 29 20 52 50 20 61 73 28 5a 29 0a 20 20 20 20  E) RP as(Z).    
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e                on
5340: 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70  _opt(N) using_op
5350: 74 28 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  t(U). {.  A = sq
5360: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
5370: 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73  ndFromTerm(pPars
5380: 65 2c 41 2c 26 59 2c 26 44 2c 26 5a 2c 30 2c 4e  e,A,&Y,&D,&Z,0,N
5390: 2c 55 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  ,U);.  sqlite3Sr
53a0: 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28 70 50  cListFuncArgs(pP
53b0: 61 72 73 65 2c 20 41 2c 20 45 29 3b 0a 7d 0a 25  arse, A, E);.}.%
53c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
53d0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 73 65  IT_SUBQUERY.  se
53e0: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ltablist(A) ::= 
53f0: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 4c 50  stl_prefix(A) LP
5400: 20 73 65 6c 65 63 74 28 53 29 20 52 50 0a 20 20   select(S) RP.  
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5420: 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e    as(Z) on_opt(N
5430: 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20  ) using_opt(U). 
5440: 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65  {.    A = sqlite
5450: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
5460: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c  omTerm(pParse,A,
5470: 30 2c 30 2c 26 5a 2c 53 2c 4e 2c 55 29 3b 0a 20  0,0,&Z,S,N,U);. 
5480: 20 7d 0a 20 20 73 65 6c 74 61 62 6c 69 73 74 28   }.  seltablist(
5490: 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69  A) ::= stl_prefi
54a0: 78 28 41 29 20 4c 50 20 73 65 6c 74 61 62 6c 69  x(A) LP seltabli
54b0: 73 74 28 46 29 20 52 50 0a 20 20 20 20 20 20 20  st(F) RP.       
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 28               as(
54d0: 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69  Z) on_opt(N) usi
54e0: 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 20  ng_opt(U). {.   
54f0: 20 69 66 28 20 41 3d 3d 30 20 26 26 20 5a 2e 6e   if( A==0 && Z.n
5500: 3d 3d 30 20 26 26 20 4e 3d 3d 30 20 26 26 20 55  ==0 && N==0 && U
5510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 41 20 3d  ==0 ){.      A =
5520: 20 46 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   F;.    }else if
5530: 28 20 46 2d 3e 6e 53 72 63 3d 3d 31 20 29 7b 0a  ( F->nSrc==1 ){.
5540: 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65        A = sqlite
5550: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
5560: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c  omTerm(pParse,A,
5570: 30 2c 30 2c 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20  0,0,&Z,0,N,U);. 
5580: 20 20 20 20 20 69 66 28 20 41 20 29 7b 0a 20 20       if( A ){.  
5590: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
55a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 20  List_item *pNew 
55b0: 3d 20 26 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d  = &A->a[A->nSrc-
55c0: 31 5d 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75  1];.        stru
55d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
55e0: 2a 70 4f 6c 64 20 3d 20 46 2d 3e 61 3b 0a 20 20  *pOld = F->a;.  
55f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d        pNew->zNam
5600: 65 20 3d 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 3b  e = pOld->zName;
5610: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a  .        pNew->z
5620: 44 61 74 61 62 61 73 65 20 3d 20 70 4f 6c 64 2d  Database = pOld-
5630: 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20  >zDatabase;.    
5640: 20 20 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63      pNew->pSelec
5650: 74 20 3d 20 70 4f 6c 64 2d 3e 70 53 65 6c 65 63  t = pOld->pSelec
5660: 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 2d  t;.        pOld-
5670: 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c 64 2d 3e 7a  >zName = pOld->z
5680: 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
5690: 20 20 20 20 20 20 70 4f 6c 64 2d 3e 70 53 65 6c        pOld->pSel
56a0: 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ect = 0;.      }
56b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
56c0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  cListDelete(pPar
56d0: 73 65 2d 3e 64 62 2c 20 46 29 3b 0a 20 20 20 20  se->db, F);.    
56e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 65 6c  }else{.      Sel
56f0: 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 3b 0a  ect *pSubquery;.
5700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
5710: 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
5720: 65 28 46 29 3b 0a 20 20 20 20 20 20 70 53 75 62  e(F);.      pSub
5730: 71 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 53  query = sqlite3S
5740: 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c  electNew(pParse,
5750: 30 2c 46 2c 30 2c 30 2c 30 2c 30 2c 53 46 5f 4e  0,F,0,0,0,0,SF_N
5760: 65 73 74 65 64 46 72 6f 6d 2c 30 2c 30 29 3b 0a  estedFrom,0,0);.
5770: 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65        A = sqlite
5780: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
5790: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c  omTerm(pParse,A,
57a0: 30 2c 30 2c 26 5a 2c 70 53 75 62 71 75 65 72 79  0,0,&Z,pSubquery
57b0: 2c 4e 2c 55 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ,N,U);.    }.  }
57c0: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
57d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a 25  OMIT_SUBQUERY..%
57e0: 74 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65 6e  type dbnm {Token
57f0: 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e 20  }.dbnm(A) ::= . 
5800: 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b           {A.z=0;
5810: 20 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41 29   A.n=0;}.dbnm(A)
5820: 20 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e 20   ::= DOT nm(X). 
5830: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
5840: 66 75 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69 73  fullname {SrcLis
5850: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
5860: 66 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74 65  fullname {sqlite
5870: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
5880: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
5890: 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a 3d  .fullname(A) ::=
58a0: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e 20   nm(X) dbnm(Y). 
58b0: 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65   .   {A = sqlite
58c0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
58d0: 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 58 2c 26  Parse->db,0,&X,&
58e0: 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  Y); /*A-overwrit
58f0: 65 73 2d 58 2a 2f 7d 0a 0a 25 74 79 70 65 20 6a  es-X*/}..%type j
5900: 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 6a 6f 69 6e  oinop {int}.join
5910: 6f 70 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 7c  op(X) ::= COMMA|
5920: 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20 20 20 20  JOIN.           
5930: 20 20 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45     { X = JT_INNE
5940: 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a  R; }.joinop(X) :
5950: 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f  := JOIN_KW(A) JO
5960: 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN..            
5970: 20 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69 74        {X = sqlit
5980: 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73  e3JoinType(pPars
5990: 65 2c 26 41 2c 30 2c 30 29 3b 20 20 2f 2a 58 2d  e,&A,0,0);  /*X-
59a0: 6f 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d 0a  overwrites-A*/}.
59b0: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f  joinop(X) ::= JO
59c0: 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 4a  IN_KW(A) nm(B) J
59d0: 4f 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20  OIN..           
59e0: 20 20 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69         {X = sqli
59f0: 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72  te3JoinType(pPar
5a00: 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20 2f 2a 58  se,&A,&B,0); /*X
5a10: 2d 6f 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d  -overwrites-A*/}
5a20: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
5a30: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
5a40: 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20  nm(C) JOIN..    
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 58                {X
5a60: 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79   = sqlite3JoinTy
5a70: 70 65 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c  pe(pParse,&A,&B,
5a80: 26 43 29 3b 2f 2a 58 2d 6f 76 65 72 77 72 69 74  &C);/*X-overwrit
5a90: 65 73 2d 41 2a 2f 7d 0a 0a 25 74 79 70 65 20 6f  es-A*/}..%type o
5aa0: 6e 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64  n_opt {Expr*}.%d
5ab0: 65 73 74 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74  estructor on_opt
5ac0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
5ad0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
5ae0: 24 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20  $$);}.on_opt(N) 
5af0: 3a 3a 3d 20 4f 4e 20 65 78 70 72 28 45 29 2e 20  ::= ON expr(E). 
5b00: 20 20 7b 4e 20 3d 20 45 2e 70 45 78 70 72 3b 7d    {N = E.pExpr;}
5b10: 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 2e  .on_opt(N) ::= .
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 4e 20               {N 
5b30: 3d 20 30 3b 7d 0a 0a 2f 2f 20 4e 6f 74 65 20 74  = 0;}..// Note t
5b40: 68 61 74 20 74 68 69 73 20 62 6c 6f 63 6b 20 61  hat this block a
5b50: 62 75 73 65 73 20 74 68 65 20 54 6f 6b 65 6e 20  buses the Token 
5b60: 74 79 70 65 20 6a 75 73 74 20 61 20 6c 69 74 74  type just a litt
5b70: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  le. If there is.
5b80: 2f 2f 20 6e 6f 20 22 49 4e 44 45 58 45 44 20 42  // no "INDEXED B
5b90: 59 22 20 63 6c 61 75 73 65 2c 20 74 68 65 20 72  Y" clause, the r
5ba0: 65 74 75 72 6e 65 64 20 74 6f 6b 65 6e 20 69 73  eturned token is
5bb0: 20 65 6d 70 74 79 20 28 7a 3d 3d 30 20 26 26 20   empty (z==0 && 
5bc0: 6e 3d 3d 30 29 2e 20 49 66 0a 2f 2f 20 74 68 65  n==0). If.// the
5bd0: 72 65 20 69 73 20 61 6e 20 49 4e 44 45 58 45 44  re is an INDEXED
5be0: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
5bf0: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 70 6f   the token is po
5c00: 70 75 6c 61 74 65 64 20 61 73 20 70 65 72 20 6e  pulated as per n
5c10: 6f 72 6d 61 6c 2c 0a 2f 2f 20 77 69 74 68 20 7a  ormal,.// with z
5c20: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
5c30: 20 74 6f 6b 65 6e 20 64 61 74 61 20 61 6e 64 20   token data and 
5c40: 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  n containing the
5c50: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5c60: 0a 2f 2f 20 69 6e 20 74 68 65 20 74 6f 6b 65 6e  .// in the token
5c70: 2e 0a 2f 2f 0a 2f 2f 20 49 66 20 74 68 65 72 65  ..//.// If there
5c80: 20 69 73 20 61 20 22 4e 4f 54 20 49 4e 44 45 58   is a "NOT INDEX
5c90: 45 44 22 20 63 6c 61 75 73 65 2c 20 74 68 65 6e  ED" clause, then
5ca0: 20 28 7a 3d 3d 30 20 26 26 20 6e 3d 3d 31 29 2c   (z==0 && n==1),
5cb0: 20 77 68 69 63 68 20 69 73 20 0a 2f 2f 20 6e 6f   which is .// no
5cc0: 72 6d 61 6c 6c 79 20 69 6c 6c 65 67 61 6c 2e 20  rmally illegal. 
5cd0: 54 68 65 20 73 71 6c 69 74 65 33 53 72 63 4c 69  The sqlite3SrcLi
5ce0: 73 74 49 6e 64 65 78 65 64 42 79 28 29 20 66 75  stIndexedBy() fu
5cf0: 6e 63 74 69 6f 6e 20 0a 2f 2f 20 72 65 63 6f 67  nction .// recog
5d00: 6e 69 7a 65 73 20 61 6e 64 20 69 6e 74 65 72 70  nizes and interp
5d10: 72 65 74 73 20 74 68 69 73 20 61 73 20 61 20 73  rets this as a s
5d20: 70 65 63 69 61 6c 20 63 61 73 65 2e 0a 2f 2f 0a  pecial case..//.
5d30: 25 74 79 70 65 20 69 6e 64 65 78 65 64 5f 6f 70  %type indexed_op
5d40: 74 20 7b 54 6f 6b 65 6e 7d 0a 69 6e 64 65 78 65  t {Token}.indexe
5d50: 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  d_opt(A) ::= .  
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5d70: 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 30 3b 7d 0a 69  A.z=0; A.n=0;}.i
5d80: 6e 64 65 78 65 64 5f 6f 70 74 28 41 29 20 3a 3a  ndexed_opt(A) ::
5d90: 3d 20 49 4e 44 45 58 45 44 20 42 59 20 6e 6d 28  = INDEXED BY nm(
5da0: 58 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 64  X). {A = X;}.ind
5db0: 65 78 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  exed_opt(A) ::= 
5dc0: 4e 4f 54 20 49 4e 44 45 58 45 44 2e 20 20 20 20  NOT INDEXED.    
5dd0: 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 31 3b    {A.z=0; A.n=1;
5de0: 7d 0a 0a 25 74 79 70 65 20 75 73 69 6e 67 5f 6f  }..%type using_o
5df0: 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65  pt {IdList*}.%de
5e00: 73 74 72 75 63 74 6f 72 20 75 73 69 6e 67 5f 6f  structor using_o
5e10: 70 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73  pt {sqlite3IdLis
5e20: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
5e30: 64 62 2c 20 24 24 29 3b 7d 0a 75 73 69 6e 67 5f  db, $$);}.using_
5e40: 6f 70 74 28 55 29 20 3a 3a 3d 20 55 53 49 4e 47  opt(U) ::= USING
5e50: 20 4c 50 20 69 64 6c 69 73 74 28 4c 29 20 52 50   LP idlist(L) RP
5e60: 2e 20 20 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e  .  {U = L;}.usin
5e70: 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20  g_opt(U) ::= .  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 20 20 20 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a        {U = 0;}..
5ea0: 0a 25 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f  .%type orderby_o
5eb0: 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  pt {ExprList*}.%
5ec0: 64 65 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72  destructor order
5ed0: 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  by_opt {sqlite3E
5ee0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
5ef0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
5f00: 0a 2f 2f 20 74 68 65 20 73 6f 72 74 6c 69 73 74  .// the sortlist
5f10: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 74   non-terminal st
5f20: 6f 72 65 73 20 61 20 6c 69 73 74 20 6f 66 20 65  ores a list of e
5f30: 78 70 72 65 73 73 69 6f 6e 20 77 68 65 72 65 20  xpression where 
5f40: 65 61 63 68 0a 2f 2f 20 65 78 70 72 65 73 73 69  each.// expressi
5f50: 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 6c 79  on is optionally
5f60: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 41 53 43   followed by ASC
5f70: 20 6f 72 20 44 45 53 43 20 74 6f 20 69 6e 64 69   or DESC to indi
5f80: 63 61 74 65 20 74 68 65 0a 2f 2f 20 73 6f 72 74  cate the.// sort
5f90: 20 6f 72 64 65 72 2e 0a 2f 2f 0a 25 74 79 70 65   order..//.%type
5fa0: 20 73 6f 72 74 6c 69 73 74 20 7b 45 78 70 72 4c   sortlist {ExprL
5fb0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
5fc0: 72 20 73 6f 72 74 6c 69 73 74 20 7b 73 71 6c 69  r sortlist {sqli
5fd0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
5fe0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
5ff0: 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70 74  );}..orderby_opt
6000: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6020: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64 65     {A = 0;}.orde
6030: 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4f  rby_opt(A) ::= O
6040: 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73 74  RDER BY sortlist
6050: 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58  (X).      {A = X
6060: 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a  ;}.sortlist(A) :
6070: 3a 3d 20 73 6f 72 74 6c 69 73 74 28 41 29 20 43  := sortlist(A) C
6080: 4f 4d 4d 41 20 65 78 70 72 28 59 29 20 73 6f 72  OMMA expr(Y) sor
6090: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
60a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
60b0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
60c0: 41 2c 59 2e 70 45 78 70 72 29 3b 0a 20 20 73 71  A,Y.pExpr);.  sq
60d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
60e0: 53 6f 72 74 4f 72 64 65 72 28 41 2c 5a 29 3b 0a  SortOrder(A,Z);.
60f0: 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a  }.sortlist(A) ::
6100: 3d 20 65 78 70 72 28 59 29 20 73 6f 72 74 6f 72  = expr(Y) sortor
6110: 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20  der(Z). {.  A = 
6120: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6130: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 59  ppend(pParse,0,Y
6140: 2e 70 45 78 70 72 29 3b 20 2f 2a 41 2d 6f 76 65  .pExpr); /*A-ove
6150: 72 77 72 69 74 65 73 2d 59 2a 2f 0a 20 20 73 71  rwrites-Y*/.  sq
6160: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
6170: 53 6f 72 74 4f 72 64 65 72 28 41 2c 5a 29 3b 0a  SortOrder(A,Z);.
6180: 7d 0a 0a 25 74 79 70 65 20 73 6f 72 74 6f 72 64  }..%type sortord
6190: 65 72 20 7b 69 6e 74 7d 0a 0a 73 6f 72 74 6f 72  er {int}..sortor
61a0: 64 65 72 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20  der(A) ::= ASC. 
61b0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53            {A = S
61c0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73  QLITE_SO_ASC;}.s
61d0: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20  ortorder(A) ::= 
61e0: 44 45 53 43 2e 20 20 20 20 20 20 20 20 20 20 7b  DESC.          {
61f0: 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45  A = SQLITE_SO_DE
6200: 53 43 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41  SC;}.sortorder(A
6210: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
6220: 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45       {A = SQLITE
6230: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3b 7d 0a  _SO_UNDEFINED;}.
6240: 0a 25 74 79 70 65 20 67 72 6f 75 70 62 79 5f 6f  .%type groupby_o
6250: 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  pt {ExprList*}.%
6260: 64 65 73 74 72 75 63 74 6f 72 20 67 72 6f 75 70  destructor group
6270: 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  by_opt {sqlite3E
6280: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
6290: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
62a0: 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a  groupby_opt(A) :
62b0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
62c0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
62d0: 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41  ;}.groupby_opt(A
62e0: 29 20 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 6e  ) ::= GROUP BY n
62f0: 65 78 70 72 6c 69 73 74 28 58 29 2e 20 7b 41 20  exprlist(X). {A 
6300: 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76  = X;}..%type hav
6310: 69 6e 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a  ing_opt {Expr*}.
6320: 25 64 65 73 74 72 75 63 74 6f 72 20 68 61 76 69  %destructor havi
6330: 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  ng_opt {sqlite3E
6340: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
6350: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 68 61 76 69  ->db, $$);}.havi
6360: 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  ng_opt(A) ::= . 
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6380: 41 20 3d 20 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f  A = 0;}.having_o
6390: 70 74 28 41 29 20 3a 3a 3d 20 48 41 56 49 4e 47  pt(A) ::= HAVING
63a0: 20 65 78 70 72 28 58 29 2e 20 20 7b 41 20 3d 20   expr(X).  {A = 
63b0: 58 2e 70 45 78 70 72 3b 7d 0a 0a 25 74 79 70 65  X.pExpr;}..%type
63c0: 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 73 74 72 75   limit_opt {stru
63d0: 63 74 20 4c 69 6d 69 74 56 61 6c 7d 0a 0a 2f 2f  ct LimitVal}..//
63e0: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
63f0: 66 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 77 69  for limit_opt wi
6400: 6c 6c 20 6e 65 76 65 72 20 66 69 72 65 20 69 6e  ll never fire in
6410: 20 74 68 65 20 63 75 72 72 65 6e 74 20 67 72 61   the current gra
6420: 6d 6d 61 72 2e 0a 2f 2f 20 54 68 65 20 6c 69 6d  mmar..// The lim
6430: 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69  it_opt non-termi
6440: 6e 61 6c 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  nal only occurs 
6450: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
6460: 73 69 6e 67 6c 65 20 70 72 6f 64 75 63 74 69 6f  single productio
6470: 6e 0a 2f 2f 20 72 75 6c 65 20 66 6f 72 20 53 45  n.// rule for SE
6480: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
6490: 20 20 41 73 20 73 6f 6f 6e 20 61 73 20 74 68 65    As soon as the
64a0: 20 72 75 6c 65 20 74 68 61 74 20 63 72 65 61 74   rule that creat
64b0: 65 20 74 68 65 20 0a 2f 2f 20 6c 69 6d 69 74 5f  e the .// limit_
64c0: 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  opt non-terminal
64d0: 20 72 65 64 75 63 65 73 2c 20 74 68 65 20 53 45   reduces, the SE
64e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72  LECT statement r
64f0: 75 6c 65 20 77 69 6c 6c 20 61 6c 73 6f 0a 2f 2f  ule will also.//
6500: 20 72 65 64 75 63 65 2e 20 20 53 6f 20 74 68 65   reduce.  So the
6510: 72 65 20 69 73 20 6e 65 76 65 72 20 61 20 6c 69  re is never a li
6520: 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d  mit_opt non-term
6530: 69 6e 61 6c 20 6f 6e 20 74 68 65 20 73 74 61 63  inal on the stac
6540: 6b 20 0a 2f 2f 20 65 78 63 65 70 74 20 61 73 20  k .// except as 
6550: 61 20 74 72 61 6e 73 69 65 6e 74 2e 20 20 53 6f  a transient.  So
6560: 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
6570: 61 6e 79 74 68 69 6e 67 20 74 6f 20 64 65 73 74  anything to dest
6580: 72 6f 79 2e 0a 2f 2f 0a 2f 2f 25 64 65 73 74 72  roy..//.//%destr
6590: 75 63 74 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20  uctor limit_opt 
65a0: 7b 0a 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70  {.//  sqlite3Exp
65b0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
65c0: 64 62 2c 20 24 24 2e 70 4c 69 6d 69 74 29 3b 0a  db, $$.pLimit);.
65d0: 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  //  sqlite3ExprD
65e0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
65f0: 2c 20 24 24 2e 70 4f 66 66 73 65 74 29 3b 0a 2f  , $$.pOffset);./
6600: 2f 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  /}.limit_opt(A) 
6610: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
6620: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d           {A.pLim
6630: 69 74 20 3d 20 30 3b 20 41 2e 70 4f 66 66 73 65  it = 0; A.pOffse
6640: 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70  t = 0;}.limit_op
6650: 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65  t(A) ::= LIMIT e
6660: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 7b 41  xpr(X).       {A
6670: 2e 70 4c 69 6d 69 74 20 3d 20 58 2e 70 45 78 70  .pLimit = X.pExp
6680: 72 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 30  r; A.pOffset = 0
6690: 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  ;}.limit_opt(A) 
66a0: 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58  ::= LIMIT expr(X
66b0: 29 20 4f 46 46 53 45 54 20 65 78 70 72 28 59 29  ) OFFSET expr(Y)
66c0: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  . .             
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66e0: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d           {A.pLim
66f0: 69 74 20 3d 20 58 2e 70 45 78 70 72 3b 20 41 2e  it = X.pExpr; A.
6700: 70 4f 66 66 73 65 74 20 3d 20 59 2e 70 45 78 70  pOffset = Y.pExp
6710: 72 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  r;}.limit_opt(A)
6720: 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28   ::= LIMIT expr(
6730: 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29  X) COMMA expr(Y)
6740: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  . .             
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6760: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4f 66 66           {A.pOff
6770: 73 65 74 20 3d 20 58 2e 70 45 78 70 72 3b 20 41  set = X.pExpr; A
6780: 2e 70 4c 69 6d 69 74 20 3d 20 59 2e 70 45 78 70  .pLimit = Y.pExp
6790: 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  r;}..///////////
67a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
67b0: 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   The DELETE stat
67c0: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
67d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
67e0: 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65 66 20 53 51  ///.//.%ifdef SQ
67f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
6800: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a  TE_DELETE_LIMIT.
6810: 63 6d 64 20 3a 3a 3d 20 77 69 74 68 28 43 29 20  cmd ::= with(C) 
6820: 44 45 4c 45 54 45 20 46 52 4f 4d 20 66 75 6c 6c  DELETE FROM full
6830: 6e 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f  name(X) indexed_
6840: 6f 70 74 28 49 29 20 77 68 65 72 65 5f 6f 70 74  opt(I) where_opt
6850: 28 57 29 20 0a 20 20 20 20 20 20 20 20 6f 72 64  (W) .        ord
6860: 65 72 62 79 5f 6f 70 74 28 4f 29 20 6c 69 6d 69  erby_opt(O) limi
6870: 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 73 71  t_opt(L). {.  sq
6880: 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50  lite3WithPush(pP
6890: 61 72 73 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73  arse, C, 1);.  s
68a0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
68b0: 65 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 58  exedBy(pParse, X
68c0: 2c 20 26 49 29 3b 0a 20 20 57 20 3d 20 73 71 6c  , &I);.  W = sql
68d0: 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65 28 70  ite3LimitWhere(p
68e0: 50 61 72 73 65 2c 20 58 2c 20 57 2c 20 4f 2c 20  Parse, X, W, O, 
68f0: 4c 2e 70 4c 69 6d 69 74 2c 20 4c 2e 70 4f 66 66  L.pLimit, L.pOff
6900: 73 65 74 2c 20 22 44 45 4c 45 54 45 22 29 3b 0a  set, "DELETE");.
6910: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46    sqlite3DeleteF
6920: 72 6f 6d 28 70 50 61 72 73 65 2c 58 2c 57 29 3b  rom(pParse,X,W);
6930: 0a 7d 0a 25 65 6e 64 69 66 0a 25 69 66 6e 64 65  .}.%endif.%ifnde
6940: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6950: 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49  UPDATE_DELETE_LI
6960: 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68  MIT.cmd ::= with
6970: 28 43 29 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  (C) DELETE FROM 
6980: 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65  fullname(X) inde
6990: 78 65 64 5f 6f 70 74 28 49 29 20 77 68 65 72 65  xed_opt(I) where
69a0: 5f 6f 70 74 28 57 29 2e 20 7b 0a 20 20 73 71 6c  _opt(W). {.  sql
69b0: 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
69c0: 72 73 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73 71  rse, C, 1);.  sq
69d0: 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
69e0: 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c  xedBy(pParse, X,
69f0: 20 26 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 44   &I);.  sqlite3D
6a00: 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65  eleteFrom(pParse
6a10: 2c 58 2c 57 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a  ,X,W);.}.%endif.
6a20: 0a 25 74 79 70 65 20 77 68 65 72 65 5f 6f 70 74  .%type where_opt
6a30: 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75   {Expr*}.%destru
6a40: 63 74 6f 72 20 77 68 65 72 65 5f 6f 70 74 20 7b  ctor where_opt {
6a50: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6a60: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
6a70: 29 3b 7d 0a 0a 77 68 65 72 65 5f 6f 70 74 28 41  );}..where_opt(A
6a80: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
6a90: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
6aa0: 30 3b 7d 0a 77 68 65 72 65 5f 6f 70 74 28 41 29  0;}.where_opt(A)
6ab0: 20 3a 3a 3d 20 57 48 45 52 45 20 65 78 70 72 28   ::= WHERE expr(
6ac0: 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58  X).       {A = X
6ad0: 2e 70 45 78 70 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  .pExpr;}..//////
6ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6af0: 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20  //// The UPDATE 
6b00: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
6b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6b20: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64  ////////.//.%ifd
6b30: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6b40: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
6b50: 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74  IMIT.cmd ::= wit
6b60: 68 28 43 29 20 55 50 44 41 54 45 20 6f 72 63 6f  h(C) UPDATE orco
6b70: 6e 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58  nf(R) fullname(X
6b80: 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29  ) indexed_opt(I)
6b90: 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 0a   SET setlist(Y).
6ba0: 20 20 20 20 20 20 20 20 77 68 65 72 65 5f 6f 70          where_op
6bb0: 74 28 57 29 20 6f 72 64 65 72 62 79 5f 6f 70 74  t(W) orderby_opt
6bc0: 28 4f 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29  (O) limit_opt(L)
6bd0: 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 57 69  .  {.  sqlite3Wi
6be0: 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 43  thPush(pParse, C
6bf0: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
6c00: 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
6c10: 70 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a  pParse, X, &I);.
6c20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
6c30: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61  tCheckLength(pPa
6c40: 72 73 65 2c 59 2c 22 73 65 74 20 6c 69 73 74 22  rse,Y,"set list"
6c50: 29 3b 20 0a 20 20 57 20 3d 20 73 71 6c 69 74 65  ); .  W = sqlite
6c60: 33 4c 69 6d 69 74 57 68 65 72 65 28 70 50 61 72  3LimitWhere(pPar
6c70: 73 65 2c 20 58 2c 20 57 2c 20 4f 2c 20 4c 2e 70  se, X, W, O, L.p
6c80: 4c 69 6d 69 74 2c 20 4c 2e 70 4f 66 66 73 65 74  Limit, L.pOffset
6c90: 2c 20 22 55 50 44 41 54 45 22 29 3b 0a 20 20 73  , "UPDATE");.  s
6ca0: 71 6c 69 74 65 33 55 70 64 61 74 65 28 70 50 61  qlite3Update(pPa
6cb0: 72 73 65 2c 58 2c 59 2c 57 2c 52 29 3b 0a 7d 0a  rse,X,Y,W,R);.}.
6cc0: 25 65 6e 64 69 66 0a 25 69 66 6e 64 65 66 20 53  %endif.%ifndef S
6cd0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44  QLITE_ENABLE_UPD
6ce0: 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54  ATE_DELETE_LIMIT
6cf0: 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 28 43 29  .cmd ::= with(C)
6d00: 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52   UPDATE orconf(R
6d10: 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e  ) fullname(X) in
6d20: 64 65 78 65 64 5f 6f 70 74 28 49 29 20 53 45 54  dexed_opt(I) SET
6d30: 20 73 65 74 6c 69 73 74 28 59 29 0a 20 20 20 20   setlist(Y).    
6d40: 20 20 20 20 77 68 65 72 65 5f 6f 70 74 28 57 29      where_opt(W)
6d50: 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 57 69  .  {.  sqlite3Wi
6d60: 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 43  thPush(pParse, C
6d70: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
6d80: 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
6d90: 70 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a  pParse, X, &I);.
6da0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
6db0: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61  tCheckLength(pPa
6dc0: 72 73 65 2c 59 2c 22 73 65 74 20 6c 69 73 74 22  rse,Y,"set list"
6dd0: 29 3b 20 0a 20 20 73 71 6c 69 74 65 33 55 70 64  ); .  sqlite3Upd
6de0: 61 74 65 28 70 50 61 72 73 65 2c 58 2c 59 2c 57  ate(pParse,X,Y,W
6df0: 2c 52 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25  ,R);.}.%endif..%
6e00: 74 79 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78  type setlist {Ex
6e10: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
6e20: 63 74 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71  ctor setlist {sq
6e30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6e40: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
6e50: 24 24 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41  $$);}..setlist(A
6e60: 29 20 3a 3a 3d 20 73 65 74 6c 69 73 74 28 41 29  ) ::= setlist(A)
6e70: 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20   COMMA nm(X) EQ 
6e80: 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d  expr(Y). {.  A =
6e90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6ea0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 41  Append(pParse, A
6eb0: 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 73 71  , Y.pExpr);.  sq
6ec0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
6ed0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 41 2c 20  Name(pParse, A, 
6ee0: 26 58 2c 20 31 29 3b 0a 7d 0a 73 65 74 6c 69 73  &X, 1);.}.setlis
6ef0: 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c 69 73 74  t(A) ::= setlist
6f00: 28 41 29 20 43 4f 4d 4d 41 20 4c 50 20 69 64 6c  (A) COMMA LP idl
6f10: 69 73 74 28 58 29 20 52 50 20 45 51 20 65 78 70  ist(X) RP EQ exp
6f20: 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  r(Y). {.  A = sq
6f30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
6f40: 65 6e 64 56 65 63 74 6f 72 28 70 50 61 72 73 65  endVector(pParse
6f50: 2c 20 41 2c 20 58 2c 20 59 2e 70 45 78 70 72 29  , A, X, Y.pExpr)
6f60: 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41 29 20 3a  ;.}.setlist(A) :
6f70: 3a 3d 20 6e 6d 28 58 29 20 45 51 20 65 78 70 72  := nm(X) EQ expr
6f80: 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (Y). {.  A = sql
6f90: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6fa0: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 59 2e  nd(pParse, 0, Y.
6fb0: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
6fc0: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
6fd0: 28 70 50 61 72 73 65 2c 20 41 2c 20 26 58 2c 20  (pParse, A, &X, 
6fe0: 31 29 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41 29  1);.}.setlist(A)
6ff0: 20 3a 3a 3d 20 4c 50 20 69 64 6c 69 73 74 28 58   ::= LP idlist(X
7000: 29 20 52 50 20 45 51 20 65 78 70 72 28 59 29 2e  ) RP EQ expr(Y).
7010: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
7020: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65  ExprListAppendVe
7030: 63 74 6f 72 28 70 50 61 72 73 65 2c 20 30 2c 20  ctor(pParse, 0, 
7040: 58 2c 20 59 2e 70 45 78 70 72 29 3b 0a 7d 0a 0a  X, Y.pExpr);.}..
7050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 49  ////////// The I
7070: 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20 2f 2f  NSERT command //
7080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
70a0: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 28  //.cmd ::= with(
70b0: 57 29 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29  W) insert_cmd(R)
70c0: 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28 58   INTO fullname(X
70d0: 29 20 69 64 6c 69 73 74 5f 6f 70 74 28 46 29 20  ) idlist_opt(F) 
70e0: 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73  select(S). {.  s
70f0: 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
7100: 50 61 72 73 65 2c 20 57 2c 20 31 29 3b 0a 20 20  Parse, W, 1);.  
7110: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70 50  sqlite3Insert(pP
7120: 61 72 73 65 2c 20 58 2c 20 53 2c 20 46 2c 20 52  arse, X, S, F, R
7130: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 77 69 74  );.}.cmd ::= wit
7140: 68 28 57 29 20 69 6e 73 65 72 74 5f 63 6d 64 28  h(W) insert_cmd(
7150: 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65  R) INTO fullname
7160: 28 58 29 20 69 64 6c 69 73 74 5f 6f 70 74 28 46  (X) idlist_opt(F
7170: 29 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53  ) DEFAULT VALUES
7180: 2e 0a 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 74  ..{.  sqlite3Wit
7190: 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 57 2c  hPush(pParse, W,
71a0: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e   1);.  sqlite3In
71b0: 73 65 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20  sert(pParse, X, 
71c0: 30 2c 20 46 2c 20 52 29 3b 0a 7d 0a 0a 25 74 79  0, F, R);.}..%ty
71d0: 70 65 20 69 6e 73 65 72 74 5f 63 6d 64 20 7b 69  pe insert_cmd {i
71e0: 6e 74 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41  nt}.insert_cmd(A
71f0: 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63  ) ::= INSERT orc
7200: 6f 6e 66 28 52 29 2e 20 20 20 7b 41 20 3d 20 52  onf(R).   {A = R
7210: 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29  ;}.insert_cmd(A)
7220: 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20   ::= REPLACE.   
7230: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
7240: 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 25 74 79 70  _Replace;}..%typ
7250: 65 20 69 64 6c 69 73 74 5f 6f 70 74 20 7b 49 64  e idlist_opt {Id
7260: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
7270: 6f 72 20 69 64 6c 69 73 74 5f 6f 70 74 20 7b 73  or idlist_opt {s
7280: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
7290: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
72a0: 24 29 3b 7d 0a 25 74 79 70 65 20 69 64 6c 69 73  $);}.%type idlis
72b0: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73  t {IdList*}.%des
72c0: 74 72 75 63 74 6f 72 20 69 64 6c 69 73 74 20 7b  tructor idlist {
72d0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
72e0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
72f0: 24 24 29 3b 7d 0a 0a 69 64 6c 69 73 74 5f 6f 70  $$);}..idlist_op
7300: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 20 7b 41 20 3d 20 30 3b 7d 0a 69 64 6c 69 73 74   {A = 0;}.idlist
7330: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69  _opt(A) ::= LP i
7340: 64 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20 20  dlist(X) RP.    
7350: 7b 41 20 3d 20 58 3b 7d 0a 69 64 6c 69 73 74 28  {A = X;}.idlist(
7360: 41 29 20 3a 3a 3d 20 69 64 6c 69 73 74 28 41 29  A) ::= idlist(A)
7370: 20 43 4f 4d 4d 41 20 6e 6d 28 59 29 2e 0a 20 20   COMMA nm(Y)..  
7380: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49 64    {A = sqlite3Id
7390: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
73a0: 65 2d 3e 64 62 2c 41 2c 26 59 29 3b 7d 0a 69 64  e->db,A,&Y);}.id
73b0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59  list(A) ::= nm(Y
73c0: 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  )..    {A = sqli
73d0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
73e0: 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59 29  pParse->db,0,&Y)
73f0: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
7400: 2d 59 2a 2f 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  -Y*/}../////////
7410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7420: 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20 50 72  // Expression Pr
7430: 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f  ocessing ///////
7440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7450: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65  //////.//..%type
7460: 20 65 78 70 72 20 7b 45 78 70 72 53 70 61 6e 7d   expr {ExprSpan}
7470: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78 70  .%destructor exp
7480: 72 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  r {sqlite3ExprDe
7490: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
74a0: 20 24 24 2e 70 45 78 70 72 29 3b 7d 0a 25 74 79   $$.pExpr);}.%ty
74b0: 70 65 20 74 65 72 6d 20 7b 45 78 70 72 53 70 61  pe term {ExprSpa
74c0: 6e 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74  n}.%destructor t
74d0: 65 72 6d 20 7b 73 71 6c 69 74 65 33 45 78 70 72  erm {sqlite3Expr
74e0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
74f0: 62 2c 20 24 24 2e 70 45 78 70 72 29 3b 7d 0a 0a  b, $$.pExpr);}..
7500: 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20  %include {.  /* 
7510: 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
7520: 79 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  y routine used t
7530: 6f 20 73 65 74 20 74 68 65 20 45 78 70 72 53 70  o set the ExprSp
7540: 61 6e 2e 7a 53 74 61 72 74 20 61 6e 64 0a 20 20  an.zStart and.  
7550: 2a 2a 20 45 78 70 72 53 70 61 6e 2e 7a 45 6e 64  ** ExprSpan.zEnd
7560: 20 76 61 6c 75 65 73 20 6f 66 20 70 4f 75 74 20   values of pOut 
7570: 73 6f 20 74 68 61 74 20 74 68 65 20 73 70 61 6e  so that the span
7580: 20 63 6f 76 65 72 73 20 74 68 65 20 63 6f 6d 70   covers the comp
7590: 6c 65 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 20  lete.  ** range 
75a0: 6f 66 20 74 65 78 74 20 62 65 67 69 6e 6e 69 6e  of text beginnin
75b0: 67 20 77 69 74 68 20 70 53 74 61 72 74 20 61 6e  g with pStart an
75c0: 64 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 20 65  d going to the e
75d0: 6e 64 20 6f 66 20 70 45 6e 64 2e 0a 20 20 2a 2f  nd of pEnd..  */
75e0: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73  .  static void s
75f0: 70 61 6e 53 65 74 28 45 78 70 72 53 70 61 6e 20  panSet(ExprSpan 
7600: 2a 70 4f 75 74 2c 20 54 6f 6b 65 6e 20 2a 70 53  *pOut, Token *pS
7610: 74 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e  tart, Token *pEn
7620: 64 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53  d){.    pOut->zS
7630: 74 61 72 74 20 3d 20 70 53 74 61 72 74 2d 3e 7a  tart = pStart->z
7640: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64  ;.    pOut->zEnd
7650: 20 3d 20 26 70 45 6e 64 2d 3e 7a 5b 70 45 6e 64   = &pEnd->z[pEnd
7660: 2d 3e 6e 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ->n];.  }..  /* 
7670: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
7680: 45 78 70 72 20 6f 62 6a 65 63 74 20 66 72 6f 6d  Expr object from
7690: 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
76a0: 66 69 65 72 2e 20 20 55 73 65 20 74 68 65 0a 20  fier.  Use the. 
76b0: 20 2a 2a 20 6e 65 77 20 45 78 70 72 20 74 6f 20   ** new Expr to 
76c0: 70 6f 70 75 6c 61 74 65 20 70 4f 75 74 2e 20 20  populate pOut.  
76d0: 53 65 74 20 74 68 65 20 73 70 61 6e 20 6f 66 20  Set the span of 
76e0: 70 4f 75 74 20 74 6f 20 62 65 20 74 68 65 20 69  pOut to be the i
76f0: 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 74  dentifier.  ** t
7700: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20  hat created the 
7710: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2f  expression..  */
7720: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73  .  static void s
7730: 70 61 6e 45 78 70 72 28 45 78 70 72 53 70 61 6e  panExpr(ExprSpan
7740: 20 2a 70 4f 75 74 2c 20 50 61 72 73 65 20 2a 70   *pOut, Parse *p
7750: 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
7760: 6f 6b 65 6e 20 74 29 7b 0a 20 20 20 20 45 78 70  oken t){.    Exp
7770: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62  r *p = sqlite3Db
7780: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72  MallocRawNN(pPar
7790: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45  se->db, sizeof(E
77a0: 78 70 72 29 2b 74 2e 6e 2b 31 29 3b 0a 20 20 20  xpr)+t.n+1);.   
77b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
77c0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
77d0: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20  eof(Expr));.    
77e0: 20 20 70 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70    p->op = (u8)op
77f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ;.      p->flags
7800: 20 3d 20 45 50 5f 4c 65 61 66 3b 0a 20 20 20 20   = EP_Leaf;.    
7810: 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a    p->iAgg = -1;.
7820: 20 20 20 20 20 20 70 2d 3e 75 2e 7a 54 6f 6b 65        p->u.zToke
7830: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d  n = (char*)&p[1]
7840: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
7850: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 74 2e 7a 2c  ->u.zToken, t.z,
7860: 20 74 2e 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e   t.n);.      p->
7870: 75 2e 7a 54 6f 6b 65 6e 5b 74 2e 6e 5d 20 3d 20  u.zToken[t.n] = 
7880: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  0;.      if( sql
7890: 69 74 65 33 49 73 71 75 6f 74 65 28 70 2d 3e 75  ite3Isquote(p->u
78a0: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20  .zToken[0]) ){. 
78b0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 75 2e         if( p->u.
78c0: 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29  zToken[0]=='"' )
78d0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   p->flags |= EP_
78e0: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20  DblQuoted;.     
78f0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
7900: 65 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  e(p->u.zToken);.
7910: 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49        }.#if SQLI
7920: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
7930: 48 3e 30 0a 20 20 20 20 20 20 70 2d 3e 6e 48 65  H>0.      p->nHe
7940: 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66  ight = 1;.#endif
7950: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75    .    }.    pOu
7960: 74 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20  t->pExpr = p;.  
7970: 20 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d    pOut->zStart =
7980: 20 74 2e 7a 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   t.z;.    pOut->
7990: 7a 45 6e 64 20 3d 20 26 74 2e 7a 5b 74 2e 6e 5d  zEnd = &t.z[t.n]
79a0: 3b 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29  ;.  }.}..expr(A)
79b0: 20 3a 3a 3d 20 74 65 72 6d 28 41 29 2e 0a 65 78   ::= term(A)..ex
79c0: 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20  pr(A) ::= LP(B) 
79d0: 65 78 70 72 28 58 29 20 52 50 28 45 29 2e 0a 20  expr(X) RP(E).. 
79e0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e             {span
79f0: 53 65 74 28 26 41 2c 26 42 2c 26 45 29 3b 20 2f  Set(&A,&B,&E); /
7a00: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 42 2a  *A-overwrites-B*
7a10: 2f 20 20 41 2e 70 45 78 70 72 20 3d 20 58 2e 70  /  A.pExpr = X.p
7a20: 45 78 70 72 3b 7d 0a 65 78 70 72 28 41 29 20 3a  Expr;}.expr(A) :
7a30: 3a 3d 20 69 64 28 58 29 2e 20 20 20 20 20 20 20  := id(X).       
7a40: 20 20 20 7b 73 70 61 6e 45 78 70 72 28 26 41 2c     {spanExpr(&A,
7a50: 70 50 61 72 73 65 2c 54 4b 5f 49 44 2c 58 29 3b  pParse,TK_ID,X);
7a60: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
7a70: 58 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  X*/}.expr(A) ::=
7a80: 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20   JOIN_KW(X).    
7a90: 20 7b 73 70 61 6e 45 78 70 72 28 26 41 2c 70 50   {spanExpr(&A,pP
7aa0: 61 72 73 65 2c 54 4b 5f 49 44 2c 58 29 3b 20 2f  arse,TK_ID,X); /
7ab0: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a  *A-overwrites-X*
7ac0: 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e  /}.expr(A) ::= n
7ad0: 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29 2e 20  m(X) DOT nm(Y). 
7ae0: 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20  {.  Expr *temp1 
7af0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7b00: 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
7b10: 4b 5f 49 44 2c 20 26 58 2c 20 31 29 3b 0a 20 20  K_ID, &X, 1);.  
7b20: 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71  Expr *temp2 = sq
7b30: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
7b40: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 44  Parse->db, TK_ID
7b50: 2c 20 26 59 2c 20 31 29 3b 0a 20 20 73 70 61 6e  , &Y, 1);.  span
7b60: 53 65 74 28 26 41 2c 26 58 2c 26 59 29 3b 20 2f  Set(&A,&X,&Y); /
7b70: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a  *A-overwrites-X*
7b80: 2f 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71  /.  A.pExpr = sq
7b90: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
7ba0: 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31  e, TK_DOT, temp1
7bb0: 2c 20 74 65 6d 70 32 29 3b 0a 7d 0a 65 78 70 72  , temp2);.}.expr
7bc0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f  (A) ::= nm(X) DO
7bd0: 54 20 6e 6d 28 59 29 20 44 4f 54 20 6e 6d 28 5a  T nm(Y) DOT nm(Z
7be0: 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d  ). {.  Expr *tem
7bf0: 70 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  p1 = sqlite3Expr
7c00: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
7c10: 2c 20 54 4b 5f 49 44 2c 20 26 58 2c 20 31 29 3b  , TK_ID, &X, 1);
7c20: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20 3d  .  Expr *temp2 =
7c30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
7c40: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b  c(pParse->db, TK
7c50: 5f 49 44 2c 20 26 59 2c 20 31 29 3b 0a 20 20 45  _ID, &Y, 1);.  E
7c60: 78 70 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c  xpr *temp3 = sql
7c70: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
7c80: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c  arse->db, TK_ID,
7c90: 20 26 5a 2c 20 31 29 3b 0a 20 20 45 78 70 72 20   &Z, 1);.  Expr 
7ca0: 2a 74 65 6d 70 34 20 3d 20 73 71 6c 69 74 65 33  *temp4 = sqlite3
7cb0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
7cc0: 5f 44 4f 54 2c 20 74 65 6d 70 32 2c 20 74 65 6d  _DOT, temp2, tem
7cd0: 70 33 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26  p3);.  spanSet(&
7ce0: 41 2c 26 58 2c 26 5a 29 3b 20 2f 2a 41 2d 6f 76  A,&X,&Z); /*A-ov
7cf0: 65 72 77 72 69 74 65 73 2d 58 2a 2f 0a 20 20 41  erwrites-X*/.  A
7d00: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
7d10: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
7d20: 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d  _DOT, temp1, tem
7d30: 70 34 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a  p4);.}.term(A) :
7d40: 3a 3d 20 4e 55 4c 4c 7c 46 4c 4f 41 54 7c 42 4c  := NULL|FLOAT|BL
7d50: 4f 42 28 58 29 2e 20 7b 73 70 61 6e 45 78 70 72  OB(X). {spanExpr
7d60: 28 26 41 2c 70 50 61 72 73 65 2c 40 58 2c 58 29  (&A,pParse,@X,X)
7d70: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
7d80: 2d 58 2a 2f 7d 0a 74 65 72 6d 28 41 29 20 3a 3a  -X*/}.term(A) ::
7d90: 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20  = STRING(X).    
7da0: 20 20 20 20 20 20 7b 73 70 61 6e 45 78 70 72 28        {spanExpr(
7db0: 26 41 2c 70 50 61 72 73 65 2c 40 58 2c 58 29 3b  &A,pParse,@X,X);
7dc0: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
7dd0: 58 2a 2f 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d  X*/}.term(A) ::=
7de0: 20 49 4e 54 45 47 45 52 28 58 29 2e 20 7b 0a 20   INTEGER(X). {. 
7df0: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74   A.pExpr = sqlit
7e00: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
7e10: 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47  se->db, TK_INTEG
7e20: 45 52 2c 20 26 58 2c 20 31 29 3b 0a 20 20 41 2e  ER, &X, 1);.  A.
7e30: 7a 53 74 61 72 74 20 3d 20 58 2e 7a 3b 0a 20 20  zStart = X.z;.  
7e40: 41 2e 7a 45 6e 64 20 3d 20 58 2e 7a 20 2b 20 58  A.zEnd = X.z + X
7e50: 2e 6e 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  .n;.}.expr(A) ::
7e60: 3d 20 56 41 52 49 41 42 4c 45 28 58 29 2e 20 20  = VARIABLE(X).  
7e70: 20 20 20 7b 0a 20 20 69 66 28 20 21 28 58 2e 7a     {.  if( !(X.z
7e80: 5b 30 5d 3d 3d 27 23 27 20 26 26 20 73 71 6c 69  [0]=='#' && sqli
7e90: 74 65 33 49 73 64 69 67 69 74 28 58 2e 7a 5b 31  te3Isdigit(X.z[1
7ea0: 5d 29 29 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  ])) ){.    u32 n
7eb0: 20 3d 20 58 2e 6e 3b 0a 20 20 20 20 73 70 61 6e   = X.n;.    span
7ec0: 45 78 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c  Expr(&A, pParse,
7ed0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 2c 20 58 29   TK_VARIABLE, X)
7ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
7ef0: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72  rAssignVarNumber
7f00: 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72  (pParse, A.pExpr
7f10: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
7f20: 20 20 20 2f 2a 20 57 68 65 6e 20 64 6f 69 6e 67     /* When doing
7f30: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c   a nested parse,
7f40: 20 6f 6e 65 20 63 61 6e 20 69 6e 63 6c 75 64 65   one can include
7f50: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70   terms in an exp
7f60: 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74  ression.    ** t
7f70: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68  hat look like th
7f80: 69 73 3a 20 20 20 23 31 20 23 32 20 2e 2e 2e 20  is:   #1 #2 ... 
7f90: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66   These terms ref
7fa0: 65 72 20 74 6f 20 72 65 67 69 73 74 65 72 73 0a  er to registers.
7fb0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 76 69      ** in the vi
7fc0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
7fd0: 23 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20 72  #N is the N-th r
7fe0: 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20  egister. */.    
7ff0: 54 6f 6b 65 6e 20 74 20 3d 20 58 3b 20 2f 2a 41  Token t = X; /*A
8000: 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 0a  -overwrites-X*/.
8010: 20 20 20 20 61 73 73 65 72 74 28 20 74 2e 6e 3e      assert( t.n>
8020: 3d 32 20 29 3b 0a 20 20 20 20 73 70 61 6e 53 65  =2 );.    spanSe
8030: 74 28 26 41 2c 20 26 74 2c 20 26 74 29 3b 0a 20  t(&A, &t, &t);. 
8040: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
8050: 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ested==0 ){.    
8060: 20 20 70 61 72 73 65 72 53 79 6e 74 61 78 45 72    parserSyntaxEr
8070: 72 6f 72 28 70 50 61 72 73 65 2c 20 26 74 29 3b  ror(pParse, &t);
8080: 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d  .      A.pExpr =
8090: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
80a0: 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73       A.pExpr = s
80b0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
80c0: 73 65 2c 20 54 4b 5f 52 45 47 49 53 54 45 52 2c  se, TK_REGISTER,
80d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
80e0: 28 20 41 2e 70 45 78 70 72 20 29 20 73 71 6c 69  ( A.pExpr ) sqli
80f0: 74 65 33 47 65 74 49 6e 74 33 32 28 26 74 2e 7a  te3GetInt32(&t.z
8100: 5b 31 5d 2c 20 26 41 2e 70 45 78 70 72 2d 3e 69  [1], &A.pExpr->i
8110: 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Table);.    }.  
8120: 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.}.expr(A) ::= 
8130: 65 78 70 72 28 41 29 20 43 4f 4c 4c 41 54 45 20  expr(A) COLLATE 
8140: 69 64 73 28 43 29 2e 20 7b 0a 20 20 41 2e 70 45  ids(C). {.  A.pE
8150: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
8160: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
8170: 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72  (pParse, A.pExpr
8180: 2c 20 26 43 2c 20 31 29 3b 0a 20 20 41 2e 7a 45  , &C, 1);.  A.zE
8190: 6e 64 20 3d 20 26 43 2e 7a 5b 43 2e 6e 5d 3b 0a  nd = &C.z[C.n];.
81a0: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
81b0: 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28  _OMIT_CAST.expr(
81c0: 41 29 20 3a 3a 3d 20 43 41 53 54 28 58 29 20 4c  A) ::= CAST(X) L
81d0: 50 20 65 78 70 72 28 45 29 20 41 53 20 74 79 70  P expr(E) AS typ
81e0: 65 74 6f 6b 65 6e 28 54 29 20 52 50 28 59 29 2e  etoken(T) RP(Y).
81f0: 20 7b 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c   {.  spanSet(&A,
8200: 26 58 2c 26 59 29 3b 20 2f 2a 41 2d 6f 76 65 72  &X,&Y); /*A-over
8210: 77 72 69 74 65 73 2d 58 2a 2f 0a 20 20 41 2e 70  writes-X*/.  A.p
8220: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
8230: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
8240: 64 62 2c 20 54 4b 5f 43 41 53 54 2c 20 26 54 2c  db, TK_CAST, &T,
8250: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78   1);.  sqlite3Ex
8260: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
8270: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 41 2e 70  (pParse->db, A.p
8280: 45 78 70 72 2c 20 45 2e 70 45 78 70 72 2c 20 30  Expr, E.pExpr, 0
8290: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  );.}.%endif  SQL
82a0: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78  ITE_OMIT_CAST.ex
82b0: 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 20  pr(A) ::= id(X) 
82c0: 4c 50 20 64 69 73 74 69 6e 63 74 28 44 29 20 65  LP distinct(D) e
82d0: 78 70 72 6c 69 73 74 28 59 29 20 52 50 28 45 29  xprlist(Y) RP(E)
82e0: 2e 20 7b 0a 20 20 69 66 28 20 59 20 26 26 20 59  . {.  if( Y && Y
82f0: 2d 3e 6e 45 78 70 72 3e 70 50 61 72 73 65 2d 3e  ->nExpr>pParse->
8300: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8310: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
8320: 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c  _ARG] ){.    sql
8330: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8340: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  rse, "too many a
8350: 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63  rguments on func
8360: 74 69 6f 6e 20 25 54 22 2c 20 26 58 29 3b 0a 20  tion %T", &X);. 
8370: 20 7d 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73   }.  A.pExpr = s
8380: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
8390: 6f 6e 28 70 50 61 72 73 65 2c 20 59 2c 20 26 58  on(pParse, Y, &X
83a0: 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c  );.  spanSet(&A,
83b0: 26 58 2c 26 45 29 3b 0a 20 20 69 66 28 20 44 3d  &X,&E);.  if( D=
83c0: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 26 26 20  =SF_Distinct && 
83d0: 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 41  A.pExpr ){.    A
83e0: 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d  .pExpr->flags |=
83f0: 20 45 50 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   EP_Distinct;.  
8400: 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.}.expr(A) ::= 
8410: 69 64 28 58 29 20 4c 50 20 53 54 41 52 20 52 50  id(X) LP STAR RP
8420: 28 45 29 2e 20 7b 0a 20 20 41 2e 70 45 78 70 72  (E). {.  A.pExpr
8430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75   = sqlite3ExprFu
8440: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  nction(pParse, 0
8450: 2c 20 26 58 29 3b 0a 20 20 73 70 61 6e 53 65 74  , &X);.  spanSet
8460: 28 26 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 74 65  (&A,&X,&E);.}.te
8470: 72 6d 28 41 29 20 3a 3a 3d 20 43 54 49 4d 45 5f  rm(A) ::= CTIME_
8480: 4b 57 28 4f 50 29 2e 20 7b 0a 20 20 41 2e 70 45  KW(OP). {.  A.pE
8490: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
84a0: 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  rFunction(pParse
84b0: 2c 20 30 2c 20 26 4f 50 29 3b 0a 20 20 73 70 61  , 0, &OP);.  spa
84c0: 6e 53 65 74 28 26 41 2c 20 26 4f 50 2c 20 26 4f  nSet(&A, &OP, &O
84d0: 50 29 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 64 65 20  P);.}..%include 
84e0: 7b 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  {.  /* This rout
84f0: 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73 20 61  ine constructs a
8500: 20 62 69 6e 61 72 79 20 65 78 70 72 65 73 73 69   binary expressi
8510: 6f 6e 20 6e 6f 64 65 20 6f 75 74 20 6f 66 20 74  on node out of t
8520: 77 6f 20 45 78 70 72 53 70 61 6e 0a 20 20 2a 2a  wo ExprSpan.  **
8530: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 75 73 65   objects and use
8540: 73 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20  s the result to 
8550: 70 6f 70 75 6c 61 74 65 20 61 20 6e 65 77 20 45  populate a new E
8560: 78 70 72 53 70 61 6e 20 6f 62 6a 65 63 74 2e 0a  xprSpan object..
8570: 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f    */.  static vo
8580: 69 64 20 73 70 61 6e 42 69 6e 61 72 79 45 78 70  id spanBinaryExp
8590: 72 28 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  r(.    Parse *pP
85a0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
85b0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
85c0: 74 2e 20 20 45 72 72 6f 72 73 20 61 63 63 75 6d  t.  Errors accum
85d0: 75 6c 61 74 65 20 68 65 72 65 20 2a 2f 0a 20 20  ulate here */.  
85e0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
85f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
8600: 61 72 79 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ary operation */
8610: 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70  .    ExprSpan *p
8620: 4c 65 66 74 2c 20 20 20 20 2f 2a 20 54 68 65 20  Left,    /* The 
8630: 6c 65 66 74 20 6f 70 65 72 61 6e 64 2c 20 61 6e  left operand, an
8640: 64 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  d output */.    
8650: 45 78 70 72 53 70 61 6e 20 2a 70 52 69 67 68 74  ExprSpan *pRight
8660: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
8670: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 29 7b   operand */.  ){
8680: 0a 20 20 20 20 70 4c 65 66 74 2d 3e 70 45 78 70  .    pLeft->pExp
8690: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
86a0: 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 70 4c 65  (pParse, op, pLe
86b0: 66 74 2d 3e 70 45 78 70 72 2c 20 70 52 69 67 68  ft->pExpr, pRigh
86c0: 74 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 70  t->pExpr);.    p
86d0: 4c 65 66 74 2d 3e 7a 45 6e 64 20 3d 20 70 52 69  Left->zEnd = pRi
86e0: 67 68 74 2d 3e 7a 45 6e 64 3b 0a 20 20 7d 0a 0a  ght->zEnd;.  }..
86f0: 20 20 2f 2a 20 49 66 20 64 6f 4e 6f 74 20 69 73    /* If doNot is
8700: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 64 64 20   true, then add 
8710: 61 20 54 4b 5f 4e 4f 54 20 45 78 70 72 2d 6e 6f  a TK_NOT Expr-no
8720: 64 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  de wrapper aroun
8730: 64 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 73 69  d the.  ** outsi
8740: 64 65 20 6f 66 20 2a 70 70 45 78 70 72 2e 0a 20  de of *ppExpr.. 
8750: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
8760: 64 20 65 78 70 72 4e 6f 74 28 50 61 72 73 65 20  d exprNot(Parse 
8770: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 64 6f 4e  *pParse, int doN
8780: 6f 74 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53  ot, ExprSpan *pS
8790: 70 61 6e 29 7b 0a 20 20 20 20 69 66 28 20 64 6f  pan){.    if( do
87a0: 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 70 53 70  Not ){.      pSp
87b0: 61 6e 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  an->pExpr = sqli
87c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
87d0: 20 54 4b 5f 4e 4f 54 2c 20 70 53 70 61 6e 2d 3e   TK_NOT, pSpan->
87e0: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 7d  pExpr, 0);.    }
87f0: 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20  .  }.}..expr(A) 
8800: 3a 3a 3d 20 4c 50 28 4c 29 20 6e 65 78 70 72 6c  ::= LP(L) nexprl
8810: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  ist(X) COMMA exp
8820: 72 28 59 29 20 52 50 28 52 29 2e 20 7b 0a 20 20  r(Y) RP(R). {.  
8830: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
8840: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8850: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
8860: 58 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 41  X, Y.pExpr);.  A
8870: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
8880: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
8890: 5f 56 45 43 54 4f 52 2c 20 30 2c 20 30 29 3b 0a  _VECTOR, 0, 0);.
88a0: 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29 7b    if( A.pExpr ){
88b0: 0a 20 20 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e  .    A.pExpr->x.
88c0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
88d0: 20 20 20 73 70 61 6e 53 65 74 28 26 41 2c 20 26     spanSet(&A, &
88e0: 4c 2c 20 26 52 29 3b 0a 20 20 7d 65 6c 73 65 7b  L, &R);.  }else{
88f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8900: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
8910: 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  e->db, pList);. 
8920: 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a   }.}..expr(A) ::
8930: 3d 20 65 78 70 72 28 41 29 20 41 4e 44 28 4f 50  = expr(A) AND(OP
8940: 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 73  ) expr(Y).    {s
8950: 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 70 50  panBinaryExpr(pP
8960: 61 72 73 65 2c 40 4f 50 2c 26 41 2c 26 59 29 3b  arse,@OP,&A,&Y);
8970: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
8980: 70 72 28 41 29 20 4f 52 28 4f 50 29 20 65 78 70  pr(A) OR(OP) exp
8990: 72 28 59 29 2e 20 20 20 20 20 7b 73 70 61 6e 42  r(Y).     {spanB
89a0: 69 6e 61 72 79 45 78 70 72 28 70 50 61 72 73 65  inaryExpr(pParse
89b0: 2c 40 4f 50 2c 26 41 2c 26 59 29 3b 7d 0a 65 78  ,@OP,&A,&Y);}.ex
89c0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
89d0: 29 20 4c 54 7c 47 54 7c 47 45 7c 4c 45 28 4f 50  ) LT|GT|GE|LE(OP
89e0: 29 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20  ) expr(Y)..     
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78     {spanBinaryEx
8a20: 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 26 41  pr(pParse,@OP,&A
8a30: 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  ,&Y);}.expr(A) :
8a40: 3a 3d 20 65 78 70 72 28 41 29 20 45 51 7c 4e 45  := expr(A) EQ|NE
8a50: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 7b  (OP) expr(Y).  {
8a60: 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 70  spanBinaryExpr(p
8a70: 50 61 72 73 65 2c 40 4f 50 2c 26 41 2c 26 59 29  Parse,@OP,&A,&Y)
8a80: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
8a90: 78 70 72 28 41 29 20 42 49 54 41 4e 44 7c 42 49  xpr(A) BITAND|BI
8aa0: 54 4f 52 7c 4c 53 48 49 46 54 7c 52 53 48 49 46  TOR|LSHIFT|RSHIF
8ab0: 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20  T(OP) expr(Y).. 
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ae0: 20 20 20 20 20 20 20 7b 73 70 61 6e 42 69 6e 61         {spanBina
8af0: 72 79 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f  ryExpr(pParse,@O
8b00: 50 2c 26 41 2c 26 59 29 3b 7d 0a 65 78 70 72 28  P,&A,&Y);}.expr(
8b10: 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 50  A) ::= expr(A) P
8b20: 4c 55 53 7c 4d 49 4e 55 53 28 4f 50 29 20 65 78  LUS|MINUS(OP) ex
8b30: 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20  pr(Y)..         
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8b60: 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 70  spanBinaryExpr(p
8b70: 50 61 72 73 65 2c 40 4f 50 2c 26 41 2c 26 59 29  Parse,@OP,&A,&Y)
8b80: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
8b90: 78 70 72 28 41 29 20 53 54 41 52 7c 53 4c 41 53  xpr(A) STAR|SLAS
8ba0: 48 7c 52 45 4d 28 4f 50 29 20 65 78 70 72 28 59  H|REM(OP) expr(Y
8bb0: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bd0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e             {span
8be0: 42 69 6e 61 72 79 45 78 70 72 28 70 50 61 72 73  BinaryExpr(pPars
8bf0: 65 2c 40 4f 50 2c 26 41 2c 26 59 29 3b 7d 0a 65  e,@OP,&A,&Y);}.e
8c00: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
8c10: 41 29 20 43 4f 4e 43 41 54 28 4f 50 29 20 65 78  A) CONCAT(OP) ex
8c20: 70 72 28 59 29 2e 20 7b 73 70 61 6e 42 69 6e 61  pr(Y). {spanBina
8c30: 72 79 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f  ryExpr(pParse,@O
8c40: 50 2c 26 41 2c 26 59 29 3b 7d 0a 25 74 79 70 65  P,&A,&Y);}.%type
8c50: 20 6c 69 6b 65 6f 70 20 7b 54 6f 6b 65 6e 7d 0a   likeop {Token}.
8c60: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4c 49  likeop(A) ::= LI
8c70: 4b 45 5f 4b 57 7c 4d 41 54 43 48 28 41 29 2e 0a  KE_KW|MATCH(A)..
8c80: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f  likeop(A) ::= NO
8c90: 54 20 4c 49 4b 45 5f 4b 57 7c 4d 41 54 43 48 28  T LIKE_KW|MATCH(
8ca0: 58 29 2e 20 7b 41 3d 58 3b 20 41 2e 6e 7c 3d 30  X). {A=X; A.n|=0
8cb0: 78 38 30 30 30 30 30 30 30 3b 20 2f 2a 41 2d 6f  x80000000; /*A-o
8cc0: 76 65 72 77 72 69 74 65 2d 58 2a 2f 7d 0a 65 78  verwrite-X*/}.ex
8cd0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
8ce0: 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65 78 70  ) likeop(OP) exp
8cf0: 72 28 59 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57 5d  r(Y).  [LIKE_KW]
8d00: 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a    {.  ExprList *
8d10: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 62 4e 6f  pList;.  int bNo
8d20: 74 20 3d 20 4f 50 2e 6e 20 26 20 30 78 38 30 30  t = OP.n & 0x800
8d30: 30 30 30 30 30 3b 0a 20 20 4f 50 2e 6e 20 26 3d  00000;.  OP.n &=
8d40: 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 70   0x7fffffff;.  p
8d50: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
8d60: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
8d70: 72 73 65 2c 30 2c 20 59 2e 70 45 78 70 72 29 3b  rse,0, Y.pExpr);
8d80: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
8d90: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
8da0: 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 41  (pParse,pList, A
8db0: 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70 45 78  .pExpr);.  A.pEx
8dc0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
8dd0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
8de0: 20 70 4c 69 73 74 2c 20 26 4f 50 29 3b 0a 20 20   pList, &OP);.  
8df0: 65 78 70 72 4e 6f 74 28 70 50 61 72 73 65 2c 20  exprNot(pParse, 
8e00: 62 4e 6f 74 2c 20 26 41 29 3b 0a 20 20 41 2e 7a  bNot, &A);.  A.z
8e10: 45 6e 64 20 3d 20 59 2e 7a 45 6e 64 3b 0a 20 20  End = Y.zEnd;.  
8e20: 69 66 28 20 41 2e 70 45 78 70 72 20 29 20 41 2e  if( A.pExpr ) A.
8e30: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pExpr->flags |= 
8e40: 45 50 5f 49 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a  EP_InfixFunc;.}.
8e50: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
8e60: 28 41 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65  (A) likeop(OP) e
8e70: 78 70 72 28 59 29 20 45 53 43 41 50 45 20 65 78  xpr(Y) ESCAPE ex
8e80: 70 72 28 45 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57  pr(E).  [LIKE_KW
8e90: 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  ]  {.  ExprList 
8ea0: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 62 4e  *pList;.  int bN
8eb0: 6f 74 20 3d 20 4f 50 2e 6e 20 26 20 30 78 38 30  ot = OP.n & 0x80
8ec0: 30 30 30 30 30 30 3b 0a 20 20 4f 50 2e 6e 20 26  000000;.  OP.n &
8ed0: 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
8ee0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
8ef0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
8f00: 61 72 73 65 2c 30 2c 20 59 2e 70 45 78 70 72 29  arse,0, Y.pExpr)
8f10: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
8f20: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8f30: 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20  d(pParse,pList, 
8f40: 41 2e 70 45 78 70 72 29 3b 0a 20 20 70 4c 69 73  A.pExpr);.  pLis
8f50: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8f60: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
8f70: 2c 70 4c 69 73 74 2c 20 45 2e 70 45 78 70 72 29  ,pList, E.pExpr)
8f80: 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71  ;.  A.pExpr = sq
8f90: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
8fa0: 6e 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  n(pParse, pList,
8fb0: 20 26 4f 50 29 3b 0a 20 20 65 78 70 72 4e 6f 74   &OP);.  exprNot
8fc0: 28 70 50 61 72 73 65 2c 20 62 4e 6f 74 2c 20 26  (pParse, bNot, &
8fd0: 41 29 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 45  A);.  A.zEnd = E
8fe0: 2e 7a 45 6e 64 3b 0a 20 20 69 66 28 20 41 2e 70  .zEnd;.  if( A.p
8ff0: 45 78 70 72 20 29 20 41 2e 70 45 78 70 72 2d 3e  Expr ) A.pExpr->
9000: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 66 69  flags |= EP_Infi
9010: 78 46 75 6e 63 3b 0a 7d 0a 0a 25 69 6e 63 6c 75  xFunc;.}..%inclu
9020: 64 65 20 7b 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  de {.  /* Constr
9030: 75 63 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uct an expressio
9040: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 75 6e 61  n node for a una
9050: 72 79 20 70 6f 73 74 66 69 78 20 6f 70 65 72 61  ry postfix opera
9060: 74 6f 72 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  tor.  */.  stati
9070: 63 20 76 6f 69 64 20 73 70 61 6e 55 6e 61 72 79  c void spanUnary
9080: 50 6f 73 74 66 69 78 28 0a 20 20 20 20 50 61 72  Postfix(.    Par
9090: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
90a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
90b0: 6f 6e 74 65 78 74 20 74 6f 20 72 65 63 6f 72 64  ontext to record
90c0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 69   errors */.    i
90d0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
90e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65        /* The ope
90f0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
9100: 72 53 70 61 6e 20 2a 70 4f 70 65 72 61 6e 64 2c  rSpan *pOperand,
9110: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61      /* The opera
9120: 6e 64 2c 20 61 6e 64 20 6f 75 74 70 75 74 20 2a  nd, and output *
9130: 2f 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50 6f  /.    Token *pPo
9140: 73 74 4f 70 20 20 20 20 20 20 20 20 20 2f 2a 20  stOp         /* 
9150: 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65  The operand toke
9160: 6e 20 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68  n for setting th
9170: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20  e span */.  ){. 
9180: 20 20 20 70 4f 70 65 72 61 6e 64 2d 3e 70 45 78     pOperand->pEx
9190: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
91a0: 72 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 70 4f  r(pParse, op, pO
91b0: 70 65 72 61 6e 64 2d 3e 70 45 78 70 72 2c 20 30  perand->pExpr, 0
91c0: 29 3b 0a 20 20 20 20 70 4f 70 65 72 61 6e 64 2d  );.    pOperand-
91d0: 3e 7a 45 6e 64 20 3d 20 26 70 50 6f 73 74 4f 70  >zEnd = &pPostOp
91e0: 2d 3e 7a 5b 70 50 6f 73 74 4f 70 2d 3e 6e 5d 3b  ->z[pPostOp->n];
91f0: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
9210: 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  }..expr(A) ::= e
9220: 78 70 72 28 41 29 20 49 53 4e 55 4c 4c 7c 4e 4f  xpr(A) ISNULL|NO
9230: 54 4e 55 4c 4c 28 45 29 2e 20 20 20 7b 73 70 61  TNULL(E).   {spa
9240: 6e 55 6e 61 72 79 50 6f 73 74 66 69 78 28 70 50  nUnaryPostfix(pP
9250: 61 72 73 65 2c 40 45 2c 26 41 2c 26 45 29 3b 7d  arse,@E,&A,&E);}
9260: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
9270: 72 28 41 29 20 4e 4f 54 20 4e 55 4c 4c 28 45 29  r(A) NOT NULL(E)
9280: 2e 20 7b 73 70 61 6e 55 6e 61 72 79 50 6f 73 74  . {spanUnaryPost
9290: 66 69 78 28 70 50 61 72 73 65 2c 54 4b 5f 4e 4f  fix(pParse,TK_NO
92a0: 54 4e 55 4c 4c 2c 26 41 2c 26 45 29 3b 7d 0a 0a  TNULL,&A,&E);}..
92b0: 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20  %include {.  /* 
92c0: 41 20 72 6f 75 74 69 6e 65 20 74 6f 20 63 6f 6e  A routine to con
92d0: 76 65 72 74 20 61 20 62 69 6e 61 72 79 20 54 4b  vert a binary TK
92e0: 5f 49 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54 20  _IS or TK_ISNOT 
92f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20  expression into 
9300: 61 0a 20 20 2a 2a 20 75 6e 61 72 79 20 54 4b 5f  a.  ** unary TK_
9310: 49 53 4e 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54  ISNULL or TK_NOT
9320: 4e 55 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e  NULL expression.
9330: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
9340: 64 20 62 69 6e 61 72 79 54 6f 55 6e 61 72 79 49  d binaryToUnaryI
9350: 66 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  fNull(Parse *pPa
9360: 72 73 65 2c 20 45 78 70 72 20 2a 70 59 2c 20 45  rse, Expr *pY, E
9370: 78 70 72 20 2a 70 41 2c 20 69 6e 74 20 6f 70 29  xpr *pA, int op)
9380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
9390: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
93a0: 20 20 20 20 69 66 28 20 70 41 20 26 26 20 70 59      if( pA && pY
93b0: 20 26 26 20 70 59 2d 3e 6f 70 3d 3d 54 4b 5f 4e   && pY->op==TK_N
93c0: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 41 2d  ULL ){.      pA-
93d0: 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  >op = (u8)op;.  
93e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
93f0: 65 6c 65 74 65 28 64 62 2c 20 70 41 2d 3e 70 52  elete(db, pA->pR
9400: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 41 2d  ight);.      pA-
9410: 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  >pRight = 0;.   
9420: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 20 20 20   }.  }.}..//    
9430: 65 78 70 72 31 20 49 53 20 65 78 70 72 32 0a 2f  expr1 IS expr2./
9440: 2f 20 20 20 20 65 78 70 72 31 20 49 53 20 4e 4f  /    expr1 IS NO
9450: 54 20 65 78 70 72 32 0a 2f 2f 0a 2f 2f 20 49 66  T expr2.//.// If
9460: 20 65 78 70 72 32 20 69 73 20 4e 55 4c 4c 20 74   expr2 is NULL t
9470: 68 65 6e 20 63 6f 64 65 20 61 73 20 54 4b 5f 49  hen code as TK_I
9480: 53 4e 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e  SNULL or TK_NOTN
9490: 55 4c 4c 2e 20 20 49 66 20 65 78 70 72 32 0a 2f  ULL.  If expr2./
94a0: 2f 20 69 73 20 61 6e 79 20 6f 74 68 65 72 20 65  / is any other e
94b0: 78 70 72 65 73 73 69 6f 6e 2c 20 63 6f 64 65 20  xpression, code 
94c0: 61 73 20 54 4b 5f 49 53 20 6f 72 20 54 4b 5f 49  as TK_IS or TK_I
94d0: 53 4e 4f 54 2e 0a 2f 2f 20 0a 65 78 70 72 28 41  SNOT..// .expr(A
94e0: 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 49 53  ) ::= expr(A) IS
94f0: 20 65 78 70 72 28 59 29 2e 20 20 20 20 20 7b 0a   expr(Y).     {.
9500: 20 20 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72    spanBinaryExpr
9510: 28 70 50 61 72 73 65 2c 54 4b 5f 49 53 2c 26 41  (pParse,TK_IS,&A
9520: 2c 26 59 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f  ,&Y);.  binaryTo
9530: 55 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50 61 72  UnaryIfNull(pPar
9540: 73 65 2c 20 59 2e 70 45 78 70 72 2c 20 41 2e 70  se, Y.pExpr, A.p
9550: 45 78 70 72 2c 20 54 4b 5f 49 53 4e 55 4c 4c 29  Expr, TK_ISNULL)
9560: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
9570: 65 78 70 72 28 41 29 20 49 53 20 4e 4f 54 20 65  expr(A) IS NOT e
9580: 78 70 72 28 59 29 2e 20 7b 0a 20 20 73 70 61 6e  xpr(Y). {.  span
9590: 42 69 6e 61 72 79 45 78 70 72 28 70 50 61 72 73  BinaryExpr(pPars
95a0: 65 2c 54 4b 5f 49 53 4e 4f 54 2c 26 41 2c 26 59  e,TK_ISNOT,&A,&Y
95b0: 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55 6e 61  );.  binaryToUna
95c0: 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73 65 2c  ryIfNull(pParse,
95d0: 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 45 78 70   Y.pExpr, A.pExp
95e0: 72 2c 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  r, TK_NOTNULL);.
95f0: 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20  }..%include {.  
9600: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6e 20  /* Construct an 
9610: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
9620: 66 6f 72 20 61 20 75 6e 61 72 79 20 70 72 65 66  for a unary pref
9630: 69 78 20 6f 70 65 72 61 74 6f 72 0a 20 20 2a 2f  ix operator.  */
9640: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73  .  static void s
9650: 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28 0a  panUnaryPrefix(.
9660: 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70 4f      ExprSpan *pO
9670: 75 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ut,        /* Wr
9680: 69 74 65 20 74 68 65 20 6e 65 77 20 65 78 70 72  ite the new expr
9690: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 68 65 72 65  ession node here
96a0: 20 2a 2f 0a 20 20 20 20 50 61 72 73 65 20 2a 70   */.    Parse *p
96b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
96c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
96d0: 74 20 74 6f 20 72 65 63 6f 72 64 20 65 72 72 6f  t to record erro
96e0: 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  rs */.    int op
96f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9700: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72   /* The operator
9710: 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 70 61 6e   */.    ExprSpan
9720: 20 2a 70 4f 70 65 72 61 6e 64 2c 20 20 20 20 2f   *pOperand,    /
9730: 2a 20 54 68 65 20 6f 70 65 72 61 6e 64 20 2a 2f  * The operand */
9740: 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50 72 65  .    Token *pPre
9750: 4f 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Op         /* Th
9760: 65 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65 6e 20  e operand token 
9770: 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68 65 20  for setting the 
9780: 73 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  span */.  ){.   
9790: 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d 20   pOut->zStart = 
97a0: 70 50 72 65 4f 70 2d 3e 7a 3b 0a 20 20 20 20 70  pPreOp->z;.    p
97b0: 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c  Out->pExpr = sql
97c0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
97d0: 2c 20 6f 70 2c 20 70 4f 70 65 72 61 6e 64 2d 3e  , op, pOperand->
97e0: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 70  pExpr, 0);.    p
97f0: 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 70 4f 70 65  Out->zEnd = pOpe
9800: 72 61 6e 64 2d 3e 7a 45 6e 64 3b 0a 20 20 7d 0a  rand->zEnd;.  }.
9810: 7d 0a 0a 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d  }....expr(A) ::=
9820: 20 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e   NOT(B) expr(X).
9830: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
9840: 20 7b 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69   {spanUnaryPrefi
9850: 78 28 26 41 2c 70 50 61 72 73 65 2c 40 42 2c 26  x(&A,pParse,@B,&
9860: 58 2c 26 42 29 3b 2f 2a 41 2d 6f 76 65 72 77 72  X,&B);/*A-overwr
9870: 69 74 65 73 2d 42 2a 2f 7d 0a 65 78 70 72 28 41  ites-B*/}.expr(A
9880: 29 20 3a 3a 3d 20 42 49 54 4e 4f 54 28 42 29 20  ) ::= BITNOT(B) 
9890: 65 78 70 72 28 58 29 2e 0a 20 20 20 20 20 20 20  expr(X)..       
98a0: 20 20 20 20 20 20 20 7b 73 70 61 6e 55 6e 61 72         {spanUnar
98b0: 79 50 72 65 66 69 78 28 26 41 2c 70 50 61 72 73  yPrefix(&A,pPars
98c0: 65 2c 40 42 2c 26 58 2c 26 42 29 3b 2f 2a 41 2d  e,@B,&X,&B);/*A-
98d0: 6f 76 65 72 77 72 69 74 65 73 2d 42 2a 2f 7d 0a  overwrites-B*/}.
98e0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55  expr(A) ::= MINU
98f0: 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b 42  S(B) expr(X). [B
9900: 49 54 4e 4f 54 5d 0a 20 20 20 20 20 20 20 20 20  ITNOT].         
9910: 20 20 20 20 20 7b 73 70 61 6e 55 6e 61 72 79 50       {spanUnaryP
9920: 72 65 66 69 78 28 26 41 2c 70 50 61 72 73 65 2c  refix(&A,pParse,
9930: 54 4b 5f 55 4d 49 4e 55 53 2c 26 58 2c 26 42 29  TK_UMINUS,&X,&B)
9940: 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d  ;/*A-overwrites-
9950: 42 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  B*/}.expr(A) ::=
9960: 20 50 4c 55 53 28 42 29 20 65 78 70 72 28 58 29   PLUS(B) expr(X)
9970: 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20 20 20  . [BITNOT].     
9980: 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 55 6e           {spanUn
9990: 61 72 79 50 72 65 66 69 78 28 26 41 2c 70 50 61  aryPrefix(&A,pPa
99a0: 72 73 65 2c 54 4b 5f 55 50 4c 55 53 2c 26 58 2c  rse,TK_UPLUS,&X,
99b0: 26 42 29 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74  &B);/*A-overwrit
99c0: 65 73 2d 42 2a 2f 7d 0a 0a 25 74 79 70 65 20 62  es-B*/}..%type b
99d0: 65 74 77 65 65 6e 5f 6f 70 20 7b 69 6e 74 7d 0a  etween_op {int}.
99e0: 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20 3a 3a  between_op(A) ::
99f0: 3d 20 42 45 54 57 45 45 4e 2e 20 20 20 20 20 7b  = BETWEEN.     {
9a00: 41 20 3d 20 30 3b 7d 0a 62 65 74 77 65 65 6e 5f  A = 0;}.between_
9a10: 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 42 45  op(A) ::= NOT BE
9a20: 54 57 45 45 4e 2e 20 7b 41 20 3d 20 31 3b 7d 0a  TWEEN. {A = 1;}.
9a30: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
9a40: 28 41 29 20 62 65 74 77 65 65 6e 5f 6f 70 28 4e  (A) between_op(N
9a50: 29 20 65 78 70 72 28 58 29 20 41 4e 44 20 65 78  ) expr(X) AND ex
9a60: 70 72 28 59 29 2e 20 5b 42 45 54 57 45 45 4e 5d  pr(Y). [BETWEEN]
9a70: 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70   {.  ExprList *p
9a80: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
9a90: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
9aa0: 72 73 65 2c 30 2c 20 58 2e 70 45 78 70 72 29 3b  rse,0, X.pExpr);
9ab0: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
9ac0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9ad0: 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 59  (pParse,pList, Y
9ae0: 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70 45 78  .pExpr);.  A.pEx
9af0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9b00: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 42 45 54  r(pParse, TK_BET
9b10: 57 45 45 4e 2c 20 41 2e 70 45 78 70 72 2c 20 30  WEEN, A.pExpr, 0
9b20: 29 3b 0a 20 20 69 66 28 20 41 2e 70 45 78 70 72  );.  if( A.pExpr
9b30: 20 29 7b 0a 20 20 20 20 41 2e 70 45 78 70 72 2d   ){.    A.pExpr-
9b40: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
9b50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9b60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9b70: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9b80: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 20 0a 20 20   pList);.  } .  
9b90: 65 78 70 72 4e 6f 74 28 70 50 61 72 73 65 2c 20  exprNot(pParse, 
9ba0: 4e 2c 20 26 41 29 3b 0a 20 20 41 2e 7a 45 6e 64  N, &A);.  A.zEnd
9bb0: 20 3d 20 59 2e 7a 45 6e 64 3b 0a 7d 0a 25 69 66   = Y.zEnd;.}.%if
9bc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9bd0: 5f 53 55 42 51 55 45 52 59 0a 20 20 25 74 79 70  _SUBQUERY.  %typ
9be0: 65 20 69 6e 5f 6f 70 20 7b 69 6e 74 7d 0a 20 20  e in_op {int}.  
9bf0: 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 49 4e 2e  in_op(A) ::= IN.
9c00: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 20        {A = 0;}. 
9c10: 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f   in_op(A) ::= NO
9c20: 54 20 49 4e 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a  T IN.  {A = 1;}.
9c30: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78    expr(A) ::= ex
9c40: 70 72 28 41 29 20 69 6e 5f 6f 70 28 4e 29 20 4c  pr(A) in_op(N) L
9c50: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50  P exprlist(Y) RP
9c60: 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20 20 20  (E). [IN] {.    
9c70: 69 66 28 20 59 3d 3d 30 20 29 7b 0a 20 20 20 20  if( Y==0 ){.    
9c80: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
9c90: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 20   of the form.   
9ca0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
9cb0: 20 20 20 20 65 78 70 72 31 20 49 4e 20 28 29 0a      expr1 IN ().
9cc0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 65 78        **      ex
9cd0: 70 72 31 20 4e 4f 54 20 49 4e 20 28 29 0a 20 20  pr1 NOT IN ().  
9ce0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9cf0: 73 69 6d 70 6c 69 66 79 20 74 6f 20 63 6f 6e 73  simplify to cons
9d00: 74 61 6e 74 73 20 30 20 28 66 61 6c 73 65 29 20  tants 0 (false) 
9d10: 61 6e 64 20 31 20 28 74 72 75 65 29 2c 20 72 65  and 1 (true), re
9d20: 73 70 65 63 74 69 76 65 6c 79 2c 0a 20 20 20 20  spectively,.    
9d30: 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20    ** regardless 
9d40: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
9d50: 65 78 70 72 31 2e 0a 20 20 20 20 20 20 2a 2f 0a  expr1..      */.
9d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9d70: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
9d80: 64 62 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20  db, A.pExpr);.  
9d90: 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71      A.pExpr = sq
9da0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
9db0: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e  Parse->db, TK_IN
9dc0: 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e  TEGER,&sqlite3In
9dd0: 74 54 6f 6b 65 6e 73 5b 4e 5d 2c 31 29 3b 0a 20  tTokens[N],1);. 
9de0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 59 2d 3e     }else if( Y->
9df0: 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
9e00: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
9e10: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
9e20: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9e30: 20 20 20 20 20 65 78 70 72 31 20 49 4e 20 28 3f       expr1 IN (?
9e40: 31 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  1).      **     
9e50: 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20 28 3f   expr1 NOT IN (?
9e60: 32 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  2).      **.    
9e70: 20 20 2a 2a 20 77 69 74 68 20 65 78 61 63 74 6c    ** with exactl
9e80: 79 20 6f 6e 65 20 76 61 6c 75 65 20 6f 6e 20 74  y one value on t
9e90: 68 65 20 52 48 53 20 63 61 6e 20 62 65 20 73 69  he RHS can be si
9ea0: 6d 70 6c 69 66 69 65 64 20 74 6f 20 73 6f 6d 65  mplified to some
9eb0: 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6c  thing.      ** l
9ec0: 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 20 20  ike this:.      
9ed0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
9ee0: 20 65 78 70 72 31 20 3d 3d 20 3f 31 0a 20 20 20   expr1 == ?1.   
9ef0: 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31     **      expr1
9f00: 20 3c 3e 20 3f 32 0a 20 20 20 20 20 20 2a 2a 0a   <> ?2.      **.
9f10: 20 20 20 20 20 20 2a 2a 20 42 75 74 2c 20 74 68        ** But, th
9f20: 65 20 52 48 53 20 6f 66 20 74 68 65 20 3d 3d 20  e RHS of the == 
9f30: 6f 72 20 3c 3e 20 69 73 20 6d 61 72 6b 65 64 20  or <> is marked 
9f40: 77 69 74 68 20 74 68 65 20 45 50 5f 47 65 6e 65  with the EP_Gene
9f50: 72 69 63 20 66 6c 61 67 0a 20 20 20 20 20 20 2a  ric flag.      *
9f60: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 79  * so that it may
9f70: 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
9f80: 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  to the computati
9f90: 6f 6e 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  on of comparison
9fa0: 0a 20 20 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  .      ** affini
9fb0: 74 79 20 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  ty or the collat
9fc0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
9fd0: 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  use for comparis
9fe0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  on.  Otherwise,.
9ff0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 6d        ** the sem
a000: 61 6e 74 69 63 73 20 77 6f 75 6c 64 20 62 65 20  antics would be 
a010: 73 75 62 74 6c 79 20 64 69 66 66 65 72 65 6e 74  subtly different
a020: 20 66 72 6f 6d 20 49 4e 20 6f 72 20 4e 4f 54 20   from IN or NOT 
a030: 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
a040: 20 20 20 45 78 70 72 20 2a 70 52 48 53 20 3d 20     Expr *pRHS = 
a050: 59 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  Y->a[0].pExpr;. 
a060: 20 20 20 20 20 59 2d 3e 61 5b 30 5d 2e 70 45 78       Y->a[0].pEx
a070: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  pr = 0;.      sq
a080: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
a090: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
a0a0: 59 29 3b 0a 20 20 20 20 20 20 2f 2a 20 70 52 48  Y);.      /* pRH
a0b0: 53 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  S cannot be NULL
a0c0: 20 62 65 63 61 75 73 65 20 61 20 6d 61 6c 6c 6f   because a mallo
a0d0: 63 20 65 72 72 6f 72 20 77 6f 75 6c 64 20 68 61  c error would ha
a0e0: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ve been detected
a0f0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  .      ** before
a100: 20 6e 6f 77 20 61 6e 64 20 63 6f 6e 74 72 6f 6c   now and control
a110: 20 77 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65   would have neve
a120: 72 20 72 65 61 63 68 65 64 20 74 68 69 73 20 70  r reached this p
a130: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  oint */.      if
a140: 28 20 41 4c 57 41 59 53 28 70 52 48 53 29 20 29  ( ALWAYS(pRHS) )
a150: 7b 0a 20 20 20 20 20 20 20 20 70 52 48 53 2d 3e  {.        pRHS->
a160: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
a170: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52  late;.        pR
a180: 48 53 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  HS->flags |= EP_
a190: 47 65 6e 65 72 69 63 3b 0a 20 20 20 20 20 20 7d  Generic;.      }
a1a0: 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d  .      A.pExpr =
a1b0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
a1c0: 61 72 73 65 2c 20 4e 20 3f 20 54 4b 5f 4e 45 20  arse, N ? TK_NE 
a1d0: 3a 20 54 4b 5f 45 51 2c 20 41 2e 70 45 78 70 72  : TK_EQ, A.pExpr
a1e0: 2c 20 70 52 48 53 29 3b 0a 20 20 20 20 7d 65 6c  , pRHS);.    }el
a1f0: 73 65 7b 0a 20 20 20 20 20 20 41 2e 70 45 78 70  se{.      A.pExp
a200: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
a210: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20  (pParse, TK_IN, 
a220: 41 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  A.pExpr, 0);.   
a230: 20 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29     if( A.pExpr )
a240: 7b 0a 20 20 20 20 20 20 20 20 41 2e 70 45 78 70  {.        A.pExp
a250: 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 59 3b 0a  r->x.pList = Y;.
a260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a270: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
a280: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 41 2e 70  lags(pParse, A.p
a290: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
a2a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a2b0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
a2c0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29  e(pParse->db, Y)
a2d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a2e0: 65 78 70 72 4e 6f 74 28 70 50 61 72 73 65 2c 20  exprNot(pParse, 
a2f0: 4e 2c 20 26 41 29 3b 0a 20 20 20 20 7d 0a 20 20  N, &A);.    }.  
a300: 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b    A.zEnd = &E.z[
a310: 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72  E.n];.  }.  expr
a320: 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 73 65  (A) ::= LP(B) se
a330: 6c 65 63 74 28 58 29 20 52 50 28 45 29 2e 20 7b  lect(X) RP(E). {
a340: 0a 20 20 20 20 73 70 61 6e 53 65 74 28 26 41 2c  .    spanSet(&A,
a350: 26 42 2c 26 45 29 3b 20 2f 2a 41 2d 6f 76 65 72  &B,&E); /*A-over
a360: 77 72 69 74 65 73 2d 42 2a 2f 0a 20 20 20 20 41  writes-B*/.    A
a370: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
a380: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
a390: 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a  _SELECT, 0, 0);.
a3a0: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
a3b0: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
a3c0: 2c 20 41 2e 70 45 78 70 72 2c 20 58 29 3b 0a 20  , A.pExpr, X);. 
a3d0: 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d   }.  expr(A) ::=
a3e0: 20 65 78 70 72 28 41 29 20 69 6e 5f 6f 70 28 4e   expr(A) in_op(N
a3f0: 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52  ) LP select(Y) R
a400: 50 28 45 29 2e 20 20 5b 49 4e 5d 20 7b 0a 20 20  P(E).  [IN] {.  
a410: 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69    A.pExpr = sqli
a420: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
a430: 20 54 4b 5f 49 4e 2c 20 41 2e 70 45 78 70 72 2c   TK_IN, A.pExpr,
a440: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a450: 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70  PExprAddSelect(p
a460: 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 2c 20  Parse, A.pExpr, 
a470: 59 29 3b 0a 20 20 20 20 65 78 70 72 4e 6f 74 28  Y);.    exprNot(
a480: 70 50 61 72 73 65 2c 20 4e 2c 20 26 41 29 3b 0a  pParse, N, &A);.
a490: 20 20 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e      A.zEnd = &E.
a4a0: 7a 5b 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78  z[E.n];.  }.  ex
a4b0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
a4c0: 29 20 69 6e 5f 6f 70 28 4e 29 20 6e 6d 28 59 29  ) in_op(N) nm(Y)
a4d0: 20 64 62 6e 6d 28 5a 29 20 70 61 72 65 6e 5f 65   dbnm(Z) paren_e
a4e0: 78 70 72 6c 69 73 74 28 45 29 2e 20 5b 49 4e 5d  xprlist(E). [IN]
a4f0: 20 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a   {.    SrcList *
a500: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
a510: 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  cListAppend(pPar
a520: 73 65 2d 3e 64 62 2c 20 30 2c 26 59 2c 26 5a 29  se->db, 0,&Y,&Z)
a530: 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
a540: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
a550: 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c  electNew(pParse,
a560: 20 30 2c 70 53 72 63 2c 30 2c 30 2c 30 2c 30 2c   0,pSrc,0,0,0,0,
a570: 30 2c 30 2c 30 29 3b 0a 20 20 20 20 69 66 28 20  0,0,0);.    if( 
a580: 45 20 29 20 20 73 71 6c 69 74 65 33 53 72 63 4c  E )  sqlite3SrcL
a590: 69 73 74 46 75 6e 63 41 72 67 73 28 70 50 61 72  istFuncArgs(pPar
a5a0: 73 65 2c 20 70 53 65 6c 65 63 74 20 3f 20 70 53  se, pSelect ? pS
a5b0: 72 63 20 3a 20 30 2c 20 45 29 3b 0a 20 20 20 20  rc : 0, E);.    
a5c0: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
a5d0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
a5e0: 4b 5f 49 4e 2c 20 41 2e 70 45 78 70 72 2c 20 30  K_IN, A.pExpr, 0
a5f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45  );.    sqlite3PE
a600: 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61  xprAddSelect(pPa
a610: 72 73 65 2c 20 41 2e 70 45 78 70 72 2c 20 70 53  rse, A.pExpr, pS
a620: 65 6c 65 63 74 29 3b 0a 20 20 20 20 65 78 70 72  elect);.    expr
a630: 4e 6f 74 28 70 50 61 72 73 65 2c 20 4e 2c 20 26  Not(pParse, N, &
a640: 41 29 3b 0a 20 20 20 20 41 2e 7a 45 6e 64 20 3d  A);.    A.zEnd =
a650: 20 5a 2e 7a 20 3f 20 26 5a 2e 7a 5b 5a 2e 6e 5d   Z.z ? &Z.z[Z.n]
a660: 20 3a 20 26 59 2e 7a 5b 59 2e 6e 5d 3b 0a 20 20   : &Y.z[Y.n];.  
a670: 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.  expr(A) ::= 
a680: 45 58 49 53 54 53 28 42 29 20 4c 50 20 73 65 6c  EXISTS(B) LP sel
a690: 65 63 74 28 59 29 20 52 50 28 45 29 2e 20 7b 0a  ect(Y) RP(E). {.
a6a0: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
a6b0: 20 73 70 61 6e 53 65 74 28 26 41 2c 26 42 2c 26   spanSet(&A,&B,&
a6c0: 45 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  E); /*A-overwrit
a6d0: 65 73 2d 42 2a 2f 0a 20 20 20 20 70 20 3d 20 41  es-B*/.    p = A
a6e0: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
a6f0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
a700: 5f 45 58 49 53 54 53 2c 20 30 2c 20 30 29 3b 0a  _EXISTS, 0, 0);.
a710: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
a720: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
a730: 2c 20 70 2c 20 59 29 3b 0a 20 20 7d 0a 25 65 6e  , p, Y);.  }.%en
a740: 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  dif SQLITE_OMIT_
a750: 53 55 42 51 55 45 52 59 0a 0a 2f 2a 20 43 41 53  SUBQUERY../* CAS
a760: 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  E expressions */
a770: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53  .expr(A) ::= CAS
a780: 45 28 43 29 20 63 61 73 65 5f 6f 70 65 72 61 6e  E(C) case_operan
a790: 64 28 58 29 20 63 61 73 65 5f 65 78 70 72 6c 69  d(X) case_exprli
a7a0: 73 74 28 59 29 20 63 61 73 65 5f 65 6c 73 65 28  st(Y) case_else(
a7b0: 5a 29 20 45 4e 44 28 45 29 2e 20 7b 0a 20 20 73  Z) END(E). {.  s
a7c0: 70 61 6e 53 65 74 28 26 41 2c 26 43 2c 26 45 29  panSet(&A,&C,&E)
a7d0: 3b 20 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  ;  /*A-overwrite
a7e0: 73 2d 43 2a 2f 0a 20 20 41 2e 70 45 78 70 72 20  s-C*/.  A.pExpr 
a7f0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
a800: 50 61 72 73 65 2c 20 54 4b 5f 43 41 53 45 2c 20  Parse, TK_CASE, 
a810: 58 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 2e 70  X, 0);.  if( A.p
a820: 45 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70 45  Expr ){.    A.pE
a830: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 5a  xpr->x.pList = Z
a840: 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ? sqlite3ExprLi
a850: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
a860: 59 2c 5a 29 20 3a 20 59 3b 0a 20 20 20 20 73 71  Y,Z) : Y;.    sq
a870: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
a880: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
a890: 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20 7d  e, A.pExpr);.  }
a8a0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
a8b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a8c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29 3b 0a  pParse->db, Y);.
a8d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
a8e0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
a8f0: 2c 20 5a 29 3b 0a 20 20 7d 0a 7d 0a 25 74 79 70  , Z);.  }.}.%typ
a900: 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20  e case_exprlist 
a910: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
a920: 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70  tructor case_exp
a930: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
a940: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
a950: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63  rse->db, $$);}.c
a960: 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20  ase_exprlist(A) 
a970: 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c 69 73  ::= case_exprlis
a980: 74 28 41 29 20 57 48 45 4e 20 65 78 70 72 28 59  t(A) WHEN expr(Y
a990: 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20  ) THEN expr(Z). 
a9a0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
a9b0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a9c0: 61 72 73 65 2c 41 2c 20 59 2e 70 45 78 70 72 29  arse,A, Y.pExpr)
a9d0: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
a9e0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a9f0: 61 72 73 65 2c 41 2c 20 5a 2e 70 45 78 70 72 29  arse,A, Z.pExpr)
aa00: 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73  ;.}.case_exprlis
aa10: 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78  t(A) ::= WHEN ex
aa20: 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28  pr(Y) THEN expr(
aa30: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
aa40: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
aa50: 64 28 70 50 61 72 73 65 2c 30 2c 20 59 2e 70 45  d(pParse,0, Y.pE
aa60: 78 70 72 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  xpr);.  A = sqli
aa70: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
aa80: 64 28 70 50 61 72 73 65 2c 41 2c 20 5a 2e 70 45  d(pParse,A, Z.pE
aa90: 78 70 72 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61  xpr);.}.%type ca
aaa0: 73 65 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a  se_else {Expr*}.
aab0: 25 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65  %destructor case
aac0: 5f 65 6c 73 65 20 7b 73 71 6c 69 74 65 33 45 78  _else {sqlite3Ex
aad0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
aae0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f  >db, $$);}.case_
aaf0: 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53  else(A) ::=  ELS
ab00: 45 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  E expr(X).      
ab10: 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70 72 3b     {A = X.pExpr;
ab20: 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a  }.case_else(A) :
ab30: 3a 3d 20 20 2e 20 20 20 20 20 20 20 20 20 20 20  :=  .           
ab40: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
ab50: 3b 7d 20 0a 25 74 79 70 65 20 63 61 73 65 5f 6f  ;} .%type case_o
ab60: 70 65 72 61 6e 64 20 7b 45 78 70 72 2a 7d 0a 25  perand {Expr*}.%
ab70: 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f  destructor case_
ab80: 6f 70 65 72 61 6e 64 20 7b 73 71 6c 69 74 65 33  operand {sqlite3
ab90: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
aba0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73  e->db, $$);}.cas
abb0: 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d  e_operand(A) ::=
abc0: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
abd0: 20 20 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70       {A = X.pExp
abe0: 72 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  r; /*A-overwrite
abf0: 73 2d 58 2a 2f 7d 20 0a 63 61 73 65 5f 6f 70 65  s-X*/} .case_ope
ac00: 72 61 6e 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20  rand(A) ::= .   
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac20: 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65  {A = 0;} ..%type
ac30: 20 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c   exprlist {ExprL
ac40: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
ac50: 72 20 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69  r exprlist {sqli
ac60: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
ac70: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
ac80: 29 3b 7d 0a 25 74 79 70 65 20 6e 65 78 70 72 6c  );}.%type nexprl
ac90: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
aca0: 25 64 65 73 74 72 75 63 74 6f 72 20 6e 65 78 70  %destructor nexp
acb0: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
acc0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
acd0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a  rse->db, $$);}..
ace0: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20  exprlist(A) ::= 
acf0: 6e 65 78 70 72 6c 69 73 74 28 41 29 2e 0a 65 78  nexprlist(A)..ex
ad00: 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e 20  prlist(A) ::= . 
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad20: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
ad30: 30 3b 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41 29  0;}.nexprlist(A)
ad40: 20 3a 3a 3d 20 6e 65 78 70 72 6c 69 73 74 28 41   ::= nexprlist(A
ad50: 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e  ) COMMA expr(Y).
ad60: 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  .    {A = sqlite
ad70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
ad80: 70 50 61 72 73 65 2c 41 2c 59 2e 70 45 78 70 72  pParse,A,Y.pExpr
ad90: 29 3b 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41 29  );}.nexprlist(A)
ada0: 20 3a 3a 3d 20 65 78 70 72 28 59 29 2e 0a 20 20   ::= expr(Y)..  
adb0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
adc0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
add0: 72 73 65 2c 30 2c 59 2e 70 45 78 70 72 29 3b 20  rse,0,Y.pExpr); 
ade0: 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 59  /*A-overwrites-Y
adf0: 2a 2f 7d 0a 0a 25 69 66 6e 64 65 66 20 53 51 4c  */}..%ifndef SQL
ae00: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
ae10: 59 0a 2f 2a 20 41 20 70 61 72 65 6e 5f 65 78 70  Y./* A paren_exp
ae20: 72 6c 69 73 74 20 69 73 20 61 6e 20 6f 70 74 69  rlist is an opti
ae30: 6f 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  onal expression 
ae40: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 65 64 20 69  list contained i
ae50: 6e 73 69 64 65 0a 2a 2a 20 6f 66 20 70 61 72 65  nside.** of pare
ae60: 6e 74 68 65 73 69 73 20 2a 2f 0a 25 74 79 70 65  nthesis */.%type
ae70: 20 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 74 20   paren_exprlist 
ae80: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
ae90: 74 72 75 63 74 6f 72 20 70 61 72 65 6e 5f 65 78  tructor paren_ex
aea0: 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45  prlist {sqlite3E
aeb0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
aec0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
aed0: 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 74 28 41  paren_exprlist(A
aee0: 29 20 3a 3a 3d 20 2e 20 20 20 7b 41 20 3d 20 30  ) ::= .   {A = 0
aef0: 3b 7d 0a 70 61 72 65 6e 5f 65 78 70 72 6c 69 73  ;}.paren_exprlis
af00: 74 28 41 29 20 3a 3a 3d 20 4c 50 20 65 78 70 72  t(A) ::= LP expr
af10: 6c 69 73 74 28 58 29 20 52 50 2e 20 20 7b 41 20  list(X) RP.  {A 
af20: 3d 20 58 3b 7d 0a 25 65 6e 64 69 66 20 53 51 4c  = X;}.%endif SQL
af30: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
af40: 59 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  Y...////////////
af50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
af60: 2f 20 54 68 65 20 43 52 45 41 54 45 20 49 4e 44  / The CREATE IND
af70: 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  EX command /////
af80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
af90: 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63 72  //.//.cmd ::= cr
afa0: 65 61 74 65 6b 77 28 53 29 20 75 6e 69 71 75 65  eatekw(S) unique
afb0: 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20 69 66  flag(U) INDEX if
afc0: 6e 6f 74 65 78 69 73 74 73 28 4e 45 29 20 6e 6d  notexists(NE) nm
afd0: 28 58 29 20 64 62 6e 6d 28 44 29 0a 20 20 20 20  (X) dbnm(D).    
afe0: 20 20 20 20 4f 4e 20 6e 6d 28 59 29 20 4c 50 20      ON nm(Y) LP 
aff0: 73 6f 72 74 6c 69 73 74 28 5a 29 20 52 50 20 77  sortlist(Z) RP w
b000: 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b 0a 20  here_opt(W). {. 
b010: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
b020: 64 65 78 28 70 50 61 72 73 65 2c 20 26 58 2c 20  dex(pParse, &X, 
b030: 26 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  &D, .           
b040: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b050: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
b060: 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59 2c 30  Parse->db,0,&Y,0
b070: 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20 20 20 20  ), Z, U,.       
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
b090: 53 2c 20 57 2c 20 53 51 4c 49 54 45 5f 53 4f 5f  S, W, SQLITE_SO_
b0a0: 41 53 43 2c 20 4e 45 2c 20 53 51 4c 49 54 45 5f  ASC, NE, SQLITE_
b0b0: 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 3b  IDXTYPE_APPDEF);
b0c0: 0a 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71 75 65  .}..%type unique
b0d0: 66 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75  flag {int}.uniqu
b0e0: 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49  eflag(A) ::= UNI
b0f0: 51 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f 41 62  QUE.  {A = OE_Ab
b100: 6f 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c 61 67  ort;}.uniqueflag
b110: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
b120: 20 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 7d 0a   {A = OE_None;}.
b130: 0a 0a 2f 2f 20 54 68 65 20 65 69 64 6c 69 73 74  ..// The eidlist
b140: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 28 45   non-terminal (E
b150: 78 70 72 65 73 73 69 6f 6e 20 49 64 20 4c 69 73  xpression Id Lis
b160: 74 29 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  t) generates an 
b170: 45 78 70 72 4c 69 73 74 0a 2f 2f 20 66 72 6f 6d  ExprList.// from
b180: 20 61 20 6c 69 73 74 20 6f 66 20 69 64 65 6e 74   a list of ident
b190: 69 66 69 65 72 73 2e 20 20 54 68 65 20 69 64 65  ifiers.  The ide
b1a0: 6e 74 69 66 69 65 72 20 6e 61 6d 65 73 20 61 72  ntifier names ar
b1b0: 65 20 69 6e 20 45 78 70 72 4c 69 73 74 2e 61 5b  e in ExprList.a[
b1c0: 5d 2e 7a 4e 61 6d 65 2e 0a 2f 2f 20 54 68 69 73  ].zName..// This
b1d0: 20 6c 69 73 74 20 69 73 20 73 74 6f 72 65 64 20   list is stored 
b1e0: 69 6e 20 61 6e 20 45 78 70 72 4c 69 73 74 20 72  in an ExprList r
b1f0: 61 74 68 65 72 20 74 68 61 6e 20 61 6e 20 49 64  ather than an Id
b200: 4c 69 73 74 20 73 6f 20 74 68 61 74 20 69 74 0a  List so that it.
b210: 2f 2f 20 63 61 6e 20 62 65 20 65 61 73 69 6c 79  // can be easily
b220: 20 73 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33   sent to sqlite3
b230: 43 6f 6c 75 6d 6e 73 45 78 70 72 4c 69 73 74 28  ColumnsExprList(
b240: 29 2e 0a 2f 2f 0a 2f 2f 20 65 69 64 6c 69 73 74  )..//.// eidlist
b250: 20 69 73 20 67 72 6f 75 70 65 64 20 77 69 74 68   is grouped with
b260: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62 65   CREATE INDEX be
b270: 63 61 75 73 65 20 69 74 20 75 73 65 64 20 74 6f  cause it used to
b280: 20 62 65 20 74 68 65 20 6e 6f 6e 2d 74 65 72 6d   be the non-term
b290: 69 6e 61 6c 0a 2f 2f 20 75 73 65 64 20 66 6f 72  inal.// used for
b2a0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   the arguments t
b2b0: 6f 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 61  o an index.  Tha
b2c0: 74 20 69 73 20 6a 75 73 74 20 61 6e 20 68 69 73  t is just an his
b2d0: 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65 6e 74  torical accident
b2e0: 2e 0a 2f 2f 0a 2f 2f 20 49 4d 50 4f 52 54 41 4e  ..//.// IMPORTAN
b2f0: 54 20 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 20  T COMPATIBILITY 
b300: 4e 4f 54 45 3a 20 20 53 6f 6d 65 20 70 72 69 6f  NOTE:  Some prio
b310: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
b320: 4c 69 74 65 20 61 63 63 65 70 74 65 64 0a 2f 2f  Lite accepted.//
b330: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 73   COLLATE clauses
b340: 20 61 6e 64 20 41 53 43 20 6f 72 20 44 45 53 43   and ASC or DESC
b350: 20 6b 65 79 77 6f 72 64 73 20 6f 6e 20 49 44 20   keywords on ID 
b360: 6c 69 73 74 73 20 69 6e 20 69 6e 61 70 70 72 6f  lists in inappro
b370: 70 72 69 61 74 65 0a 2f 2f 20 70 6c 61 63 65 73  priate.// places
b380: 20 2d 20 70 6c 61 63 65 73 20 74 68 61 74 20 6d   - places that m
b390: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 73  ight have been s
b3a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c  tored in the sql
b3b0: 69 74 65 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  ite_master schem
b3c0: 61 2e 0a 2f 2f 20 54 68 6f 73 65 20 65 78 74 72  a..// Those extr
b3d0: 61 20 66 65 61 74 75 72 65 73 20 77 65 72 65 20  a features were 
b3e0: 69 67 6e 6f 72 65 64 2e 20 20 42 75 74 20 62 65  ignored.  But be
b3f0: 63 61 75 73 65 20 74 68 65 79 20 6d 69 67 68 74  cause they might
b400: 20 62 65 20 69 6e 20 73 6f 6d 65 0a 2f 2f 20 28   be in some.// (
b410: 62 75 73 74 65 64 29 20 6f 6c 64 20 64 61 74 61  busted) old data
b420: 62 61 73 65 73 2c 20 77 65 20 6e 65 65 64 20 74  bases, we need t
b430: 6f 20 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69  o continue parsi
b440: 6e 67 20 74 68 65 6d 20 77 68 65 6e 20 6c 6f 61  ng them when loa
b450: 64 69 6e 67 0a 2f 2f 20 68 69 73 74 6f 72 69 63  ding.// historic
b460: 61 6c 20 73 63 68 65 6d 61 73 2e 0a 2f 2f 0a 25  al schemas..//.%
b470: 74 79 70 65 20 65 69 64 6c 69 73 74 20 7b 45 78  type eidlist {Ex
b480: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
b490: 63 74 6f 72 20 65 69 64 6c 69 73 74 20 7b 73 71  ctor eidlist {sq
b4a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
b4b0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
b4c0: 24 24 29 3b 7d 0a 25 74 79 70 65 20 65 69 64 6c  $$);}.%type eidl
b4d0: 69 73 74 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73  ist_opt {ExprLis
b4e0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
b4f0: 65 69 64 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c  eidlist_opt {sql
b500: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
b510: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
b520: 24 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b  $);}..%include {
b530: 0a 20 20 2f 2a 20 41 64 64 20 61 20 73 69 6e 67  .  /* Add a sing
b540: 6c 65 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 61  le new term to a
b550: 6e 20 45 78 70 72 4c 69 73 74 20 74 68 61 74 20  n ExprList that 
b560: 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
b570: 20 61 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20   a.  ** list of 
b580: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 52 65  identifiers.  Re
b590: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
b5a0: 20 74 68 65 20 49 44 20 6c 69 73 74 20 63 6f 6e   the ID list con
b5b0: 74 61 69 6e 73 0a 20 20 2a 2a 20 61 20 43 4f 4c  tains.  ** a COL
b5c0: 4c 41 54 45 20 63 6c 61 75 73 65 20 6f 72 20 61  LATE clause or a
b5d0: 6e 20 41 53 43 20 6f 72 20 44 45 53 43 20 6b 65  n ASC or DESC ke
b5e0: 79 77 6f 72 64 2c 20 65 78 63 65 70 74 20 69 67  yword, except ig
b5f0: 6e 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 65 72  nore the.  ** er
b600: 72 6f 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ror while parsin
b610: 67 20 61 20 6c 65 67 61 63 79 20 73 63 68 65 6d  g a legacy schem
b620: 61 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  a..  */.  static
b630: 20 45 78 70 72 4c 69 73 74 20 2a 70 61 72 73 65   ExprList *parse
b640: 72 41 64 64 45 78 70 72 49 64 4c 69 73 74 54 65  rAddExprIdListTe
b650: 72 6d 28 0a 20 20 20 20 50 61 72 73 65 20 2a 70  rm(.    Parse *p
b660: 50 61 72 73 65 2c 0a 20 20 20 20 45 78 70 72 4c  Parse,.    ExprL
b670: 69 73 74 20 2a 70 50 72 69 6f 72 2c 0a 20 20 20  ist *pPrior,.   
b680: 20 54 6f 6b 65 6e 20 2a 70 49 64 54 6f 6b 65 6e   Token *pIdToken
b690: 2c 0a 20 20 20 20 69 6e 74 20 68 61 73 43 6f 6c  ,.    int hasCol
b6a0: 6c 61 74 65 2c 0a 20 20 20 20 69 6e 74 20 73 6f  late,.    int so
b6b0: 72 74 4f 72 64 65 72 0a 20 20 29 7b 0a 20 20 20  rtOrder.  ){.   
b6c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 73   ExprList *p = s
b6d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b6e0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 50 72  pend(pParse, pPr
b6f0: 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ior, 0);.    if(
b700: 20 28 68 61 73 43 6f 6c 6c 61 74 65 20 7c 7c 20   (hasCollate || 
b710: 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54  sortOrder!=SQLIT
b720: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 29 0a  E_SO_UNDEFINED).
b730: 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 73          && pPars
b740: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
b750: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
b760: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b770: 28 70 50 61 72 73 65 2c 20 22 73 79 6e 74 61 78  (pParse, "syntax
b780: 20 65 72 72 6f 72 20 61 66 74 65 72 20 63 6f 6c   error after col
b790: 75 6d 6e 20 6e 61 6d 65 20 5c 22 25 2e 2a 73 5c  umn name \"%.*s\
b7a0: 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
b7c0: 54 6f 6b 65 6e 2d 3e 6e 2c 20 70 49 64 54 6f 6b  Token->n, pIdTok
b7d0: 65 6e 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  en->z);.    }.  
b7e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b7f0: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
b800: 20 70 2c 20 70 49 64 54 6f 6b 65 6e 2c 20 31 29   p, pIdToken, 1)
b810: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a  ;.    return p;.
b820: 20 20 7d 0a 7d 20 2f 2f 20 65 6e 64 20 25 69 6e    }.} // end %in
b830: 63 6c 75 64 65 0a 0a 65 69 64 6c 69 73 74 5f 6f  clude..eidlist_o
b840: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 65 69 64      {A = 0;}.eid
b870: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
b880: 4c 50 20 65 69 64 6c 69 73 74 28 58 29 20 52 50  LP eidlist(X) RP
b890: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
b8a0: 3b 7d 0a 65 69 64 6c 69 73 74 28 41 29 20 3a 3a  ;}.eidlist(A) ::
b8b0: 3d 20 65 69 64 6c 69 73 74 28 41 29 20 43 4f 4d  = eidlist(A) COM
b8c0: 4d 41 20 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65  MA nm(Y) collate
b8d0: 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29  (C) sortorder(Z)
b8e0: 2e 20 20 7b 0a 20 20 41 20 3d 20 70 61 72 73 65  .  {.  A = parse
b8f0: 72 41 64 64 45 78 70 72 49 64 4c 69 73 74 54 65  rAddExprIdListTe
b900: 72 6d 28 70 50 61 72 73 65 2c 20 41 2c 20 26 59  rm(pParse, A, &Y
b910: 2c 20 43 2c 20 5a 29 3b 0a 7d 0a 65 69 64 6c 69  , C, Z);.}.eidli
b920: 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59 29 20  st(A) ::= nm(Y) 
b930: 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74 6f  collate(C) sorto
b940: 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d  rder(Z). {.  A =
b950: 20 70 61 72 73 65 72 41 64 64 45 78 70 72 49 64   parserAddExprId
b960: 4c 69 73 74 54 65 72 6d 28 70 50 61 72 73 65 2c  ListTerm(pParse,
b970: 20 30 2c 20 26 59 2c 20 43 2c 20 5a 29 3b 20 2f   0, &Y, C, Z); /
b980: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 59 2a  *A-overwrites-Y*
b990: 2f 0a 7d 0a 0a 25 74 79 70 65 20 63 6f 6c 6c 61  /.}..%type colla
b9a0: 74 65 20 7b 69 6e 74 7d 0a 63 6f 6c 6c 61 74 65  te {int}.collate
b9b0: 28 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (C) ::= .       
b9c0: 20 20 20 20 20 20 20 7b 43 20 3d 20 30 3b 7d 0a         {C = 0;}.
b9d0: 63 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d 20 43  collate(C) ::= C
b9e0: 4f 4c 4c 41 54 45 20 69 64 73 2e 20 20 20 7b 43  OLLATE ids.   {C
b9f0: 20 3d 20 31 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f   = 1;}...///////
ba00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ba10: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20  ////// The DROP 
ba20: 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f  INDEX command //
ba30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ba40: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
ba50: 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20 69 66  := DROP INDEX if
ba60: 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61  exists(E) fullna
ba70: 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74 65  me(X).   {sqlite
ba80: 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72 73  3DropIndex(pPars
ba90: 65 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f 2f  e, X, E);}..////
baa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56 41  ///////// The VA
bac0: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  CUUM command ///
bad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69  //////////.//.%i
baf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bb00: 54 5f 56 41 43 55 55 4d 0a 25 69 66 6e 64 65 66  T_VACUUM.%ifndef
bb10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54   SQLITE_OMIT_ATT
bb20: 41 43 48 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55  ACH.cmd ::= VACU
bb30: 55 4d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  UM.             
bb40: 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75     {sqlite3Vacuu
bb50: 6d 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a 63 6d  m(pParse,0);}.cm
bb60: 64 20 3a 3a 3d 20 56 41 43 55 55 4d 20 6e 6d 28  d ::= VACUUM nm(
bb70: 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 73 71  X).          {sq
bb80: 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50 61 72  lite3Vacuum(pPar
bb90: 73 65 2c 26 58 29 3b 7d 0a 25 65 6e 64 69 66 20  se,&X);}.%endif 
bba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54   SQLITE_OMIT_ATT
bbb0: 41 43 48 0a 25 65 6e 64 69 66 20 20 53 51 4c 49  ACH.%endif  SQLI
bbc0: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 0a  TE_OMIT_VACUUM..
bbd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bbe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
bbf0: 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  e PRAGMA command
bc00: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
bc10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
bc20: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
bc30: 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 63 6d 64  _OMIT_PRAGMA.cmd
bc40: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58   ::= PRAGMA nm(X
bc50: 29 20 64 62 6e 6d 28 5a 29 2e 20 20 20 20 20 20  ) dbnm(Z).      
bc60: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
bc70: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  e3Pragma(pParse,
bc80: 26 58 2c 26 5a 2c 30 2c 30 29 3b 7d 0a 63 6d 64  &X,&Z,0,0);}.cmd
bc90: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58   ::= PRAGMA nm(X
bca0: 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6e 6d 6e  ) dbnm(Z) EQ nmn
bcb0: 75 6d 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74  um(Y).    {sqlit
bcc0: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  e3Pragma(pParse,
bcd0: 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d  &X,&Z,&Y,0);}.cm
bce0: 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28  d ::= PRAGMA nm(
bcf0: 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20 6e 6d  X) dbnm(Z) LP nm
bd00: 6e 75 6d 28 59 29 20 52 50 2e 20 7b 73 71 6c 69  num(Y) RP. {sqli
bd10: 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65  te3Pragma(pParse
bd20: 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63  ,&X,&Z,&Y,0);}.c
bd30: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
bd40: 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6d  (X) dbnm(Z) EQ m
bd50: 69 6e 75 73 5f 6e 75 6d 28 59 29 2e 20 0a 20 20  inus_num(Y). .  
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
bd90: 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65  te3Pragma(pParse
bda0: 2c 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 7d 0a 63  ,&X,&Z,&Y,1);}.c
bdb0: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
bdc0: 28 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20 6d  (X) dbnm(Z) LP m
bdd0: 69 6e 75 73 5f 6e 75 6d 28 59 29 20 52 50 2e 0a  inus_num(Y) RP..
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
be10: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
be20: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 7d  se,&X,&Z,&Y,1);}
be30: 0a 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 70  ..nmnum(A) ::= p
be40: 6c 75 73 5f 6e 75 6d 28 41 29 2e 0a 6e 6d 6e 75  lus_num(A)..nmnu
be50: 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 41 29 2e 0a  m(A) ::= nm(A)..
be60: 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 4f 4e 28  nmnum(A) ::= ON(
be70: 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d  A)..nmnum(A) ::=
be80: 20 44 45 4c 45 54 45 28 41 29 2e 0a 6e 6d 6e 75   DELETE(A)..nmnu
be90: 6d 28 41 29 20 3a 3a 3d 20 44 45 46 41 55 4c 54  m(A) ::= DEFAULT
bea0: 28 41 29 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49  (A)..%endif SQLI
beb0: 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 25  TE_OMIT_PRAGMA.%
bec0: 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6e 75 6d 62  token_class numb
bed0: 65 72 20 49 4e 54 45 47 45 52 7c 46 4c 4f 41 54  er INTEGER|FLOAT
bee0: 2e 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a  ..plus_num(A) ::
bef0: 3d 20 50 4c 55 53 20 6e 75 6d 62 65 72 28 58 29  = PLUS number(X)
bf00: 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  .       {A = X;}
bf10: 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d  .plus_num(A) ::=
bf20: 20 6e 75 6d 62 65 72 28 41 29 2e 0a 6d 69 6e 75   number(A)..minu
bf30: 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e  s_num(A) ::= MIN
bf40: 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20  US number(X).   
bf50: 20 20 7b 41 20 3d 20 58 3b 7d 0a 2f 2f 2f 2f 2f    {A = X;}./////
bf60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bf70: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41  /////// The CREA
bf80: 54 45 20 54 52 49 47 47 45 52 20 63 6f 6d 6d 61  TE TRIGGER comma
bf90: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
bfa0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64 65  ////////..%ifnde
bfb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
bfc0: 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20 63  IGGER..cmd ::= c
bfd0: 72 65 61 74 65 6b 77 20 74 72 69 67 67 65 72 5f  reatekw trigger_
bfe0: 64 65 63 6c 28 41 29 20 42 45 47 49 4e 20 74 72  decl(A) BEGIN tr
bff0: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53  igger_cmd_list(S
c000: 29 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f  ) END(Z). {.  To
c010: 6b 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a  ken all;.  all.z
c020: 20 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20   = A.z;.  all.n 
c030: 3d 20 28 69 6e 74 29 28 5a 2e 7a 20 2d 20 41 2e  = (int)(Z.z - A.
c040: 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71 6c 69  z) + Z.n;.  sqli
c050: 74 65 33 46 69 6e 69 73 68 54 72 69 67 67 65 72  te3FinishTrigger
c060: 28 70 50 61 72 73 65 2c 20 53 2c 20 26 61 6c 6c  (pParse, S, &all
c070: 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72 5f 64 65  );.}..trigger_de
c080: 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d 70 28 54  cl(A) ::= temp(T
c090: 29 20 54 52 49 47 47 45 52 20 69 66 6e 6f 74 65  ) TRIGGER ifnote
c0a0: 78 69 73 74 73 28 4e 4f 45 52 52 29 20 6e 6d 28  xists(NOERR) nm(
c0b0: 42 29 20 64 62 6e 6d 28 5a 29 20 0a 20 20 20 20  B) dbnm(Z) .    
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 43 29 20  trigger_time(C) 
c0e0: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28 44 29  trigger_event(D)
c0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c100: 20 20 20 20 20 4f 4e 20 66 75 6c 6c 6e 61 6d 65       ON fullname
c110: 28 45 29 20 66 6f 72 65 61 63 68 5f 63 6c 61 75  (E) foreach_clau
c120: 73 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 28 47  se when_clause(G
c130: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 42 65  ). {.  sqlite3Be
c140: 67 69 6e 54 72 69 67 67 65 72 28 70 50 61 72 73  ginTrigger(pPars
c150: 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c 20 44 2e  e, &B, &Z, C, D.
c160: 61 2c 20 44 2e 62 2c 20 45 2c 20 47 2c 20 54 2c  a, D.b, E, G, T,
c170: 20 4e 4f 45 52 52 29 3b 0a 20 20 41 20 3d 20 28   NOERR);.  A = (
c180: 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29 3b 20 2f 2a 41  Z.n==0?B:Z); /*A
c190: 2d 6f 76 65 72 77 72 69 74 65 73 2d 54 2a 2f 0a  -overwrites-T*/.
c1a0: 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72  }..%type trigger
c1b0: 5f 74 69 6d 65 20 7b 69 6e 74 7d 0a 74 72 69 67  _time {int}.trig
c1c0: 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20  ger_time(A) ::= 
c1d0: 42 45 46 4f 52 45 7c 41 46 54 45 52 28 58 29 2e  BEFORE|AFTER(X).
c1e0: 20 20 7b 20 41 20 3d 20 40 58 3b 20 2f 2a 41 2d    { A = @X; /*A-
c1f0: 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 20 7d  overwrites-X*/ }
c200: 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29  .trigger_time(A)
c210: 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46 2e   ::= INSTEAD OF.
c220: 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54 45    { A = TK_INSTE
c230: 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d  AD;}.trigger_tim
c240: 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  e(A) ::= .      
c250: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42        { A = TK_B
c260: 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65 20  EFORE; }..%type 
c270: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73  trigger_event {s
c280: 74 72 75 63 74 20 54 72 69 67 45 76 65 6e 74 7d  truct TrigEvent}
c290: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72 69  .%destructor tri
c2a0: 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c 69  gger_event {sqli
c2b0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
c2c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e 62  pParse->db, $$.b
c2d0: 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e  );}.trigger_even
c2e0: 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 7c  t(A) ::= DELETE|
c2f0: 49 4e 53 45 52 54 28 58 29 2e 20 20 20 7b 41 2e  INSERT(X).   {A.
c300: 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72  a = @X; /*A-over
c310: 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e 62 20 3d  writes-X*/ A.b =
c320: 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65   0;}.trigger_eve
c330: 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45  nt(A) ::= UPDATE
c340: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 41  (X).          {A
c350: 2e 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65  .a = @X; /*A-ove
c360: 72 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e 62 20  rwrites-X*/ A.b 
c370: 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76  = 0;}.trigger_ev
c380: 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54  ent(A) ::= UPDAT
c390: 45 20 4f 46 20 69 64 6c 69 73 74 28 58 29 2e 7b  E OF idlist(X).{
c3a0: 41 2e 61 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b  A.a = TK_UPDATE;
c3b0: 20 41 2e 62 20 3d 20 58 3b 7d 0a 0a 66 6f 72 65   A.b = X;}..fore
c3c0: 61 63 68 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 2e  ach_clause ::= .
c3d0: 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 20  .foreach_clause 
c3e0: 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 52 4f 57  ::= FOR EACH ROW
c3f0: 2e 0a 0a 25 74 79 70 65 20 77 68 65 6e 5f 63 6c  ...%type when_cl
c400: 61 75 73 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65  ause {Expr*}.%de
c410: 73 74 72 75 63 74 6f 72 20 77 68 65 6e 5f 63 6c  structor when_cl
c420: 61 75 73 65 20 7b 73 71 6c 69 74 65 33 45 78 70  ause {sqlite3Exp
c430: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
c440: 64 62 2c 20 24 24 29 3b 7d 0a 77 68 65 6e 5f 63  db, $$);}.when_c
c450: 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20  lause(A) ::= .  
c460: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
c470: 20 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61 75 73   0; }.when_claus
c480: 65 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78  e(A) ::= WHEN ex
c490: 70 72 28 58 29 2e 20 7b 20 41 20 3d 20 58 2e 70  pr(X). { A = X.p
c4a0: 45 78 70 72 3b 20 7d 0a 0a 25 74 79 70 65 20 74  Expr; }..%type t
c4b0: 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20  rigger_cmd_list 
c4c0: 7b 54 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25  {TriggerStep*}.%
c4d0: 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67 67  destructor trigg
c4e0: 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 73 71 6c  er_cmd_list {sql
c4f0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
c500: 72 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62  rStep(pParse->db
c510: 2c 20 24 24 29 3b 7d 0a 74 72 69 67 67 65 72 5f  , $$);}.trigger_
c520: 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20  cmd_list(A) ::= 
c530: 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74  trigger_cmd_list
c540: 28 41 29 20 74 72 69 67 67 65 72 5f 63 6d 64 28  (A) trigger_cmd(
c550: 58 29 20 53 45 4d 49 2e 20 7b 0a 20 20 61 73 73  X) SEMI. {.  ass
c560: 65 72 74 28 20 41 21 3d 30 20 29 3b 0a 20 20 41  ert( A!=0 );.  A
c570: 2d 3e 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d  ->pLast->pNext =
c580: 20 58 3b 0a 20 20 41 2d 3e 70 4c 61 73 74 20 3d   X;.  A->pLast =
c590: 20 58 3b 0a 7d 0a 74 72 69 67 67 65 72 5f 63 6d   X;.}.trigger_cm
c5a0: 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72  d_list(A) ::= tr
c5b0: 69 67 67 65 72 5f 63 6d 64 28 41 29 20 53 45 4d  igger_cmd(A) SEM
c5c0: 49 2e 20 7b 20 0a 20 20 61 73 73 65 72 74 28 20  I. { .  assert( 
c5d0: 41 21 3d 30 20 29 3b 0a 20 20 41 2d 3e 70 4c 61  A!=0 );.  A->pLa
c5e0: 73 74 20 3d 20 41 3b 0a 7d 0a 0a 2f 2f 20 44 69  st = A;.}..// Di
c5f0: 73 61 6c 6c 6f 77 20 71 75 61 6c 69 66 69 65 64  sallow qualified
c600: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 6f 6e 20   table names on 
c610: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
c620: 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61 74 65  and DELETE state
c630: 6d 65 6e 74 73 0a 2f 2f 20 77 69 74 68 69 6e 20  ments.// within 
c640: 61 20 74 72 69 67 67 65 72 2e 20 20 54 68 65 20  a trigger.  The 
c650: 74 61 62 6c 65 20 74 6f 20 49 4e 53 45 52 54 2c  table to INSERT,
c660: 20 55 50 44 41 54 45 2c 20 6f 72 20 44 45 4c 45   UPDATE, or DELE
c670: 54 45 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  TE is always in 
c680: 0a 2f 2f 20 74 68 65 20 73 61 6d 65 20 64 61 74  .// the same dat
c690: 61 62 61 73 65 20 61 73 20 74 68 65 20 74 61 62  abase as the tab
c6a0: 6c 65 20 74 68 61 74 20 74 68 65 20 74 72 69 67  le that the trig
c6b0: 67 65 72 20 66 69 72 65 73 20 6f 6e 2e 0a 2f 2f  ger fires on..//
c6c0: 0a 25 74 79 70 65 20 74 72 6e 6d 20 7b 54 6f 6b  .%type trnm {Tok
c6d0: 65 6e 7d 0a 74 72 6e 6d 28 41 29 20 3a 3a 3d 20  en}.trnm(A) ::= 
c6e0: 6e 6d 28 41 29 2e 0a 74 72 6e 6d 28 41 29 20 3a  nm(A)..trnm(A) :
c6f0: 3a 3d 20 6e 6d 20 44 4f 54 20 6e 6d 28 58 29 2e  := nm DOT nm(X).
c700: 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20 20 73 71   {.  A = X;.  sq
c710: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c720: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
c730: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
c740: 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74 20 61 6c  names are not al
c750: 6c 6f 77 65 64 20 6f 6e 20 49 4e 53 45 52 54 2c  lowed on INSERT,
c760: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c   UPDATE, and DEL
c770: 45 54 45 20 22 0a 20 20 20 20 20 20 20 20 22 73  ETE ".        "s
c780: 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e  tatements within
c790: 20 74 72 69 67 67 65 72 73 22 29 3b 0a 7d 0a 0a   triggers");.}..
c7a0: 2f 2f 20 44 69 73 61 6c 6c 6f 77 20 74 68 65 20  // Disallow the 
c7b0: 49 4e 44 45 58 20 42 59 20 61 6e 64 20 4e 4f 54  INDEX BY and NOT
c7c0: 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73   INDEXED clauses
c7d0: 20 6f 6e 20 55 50 44 41 54 45 20 61 6e 64 20 44   on UPDATE and D
c7e0: 45 4c 45 54 45 0a 2f 2f 20 73 74 61 74 65 6d 65  ELETE.// stateme
c7f0: 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67  nts within trigg
c800: 65 72 73 2e 20 20 57 65 20 6d 61 6b 65 20 61 20  ers.  We make a 
c810: 73 70 65 63 69 66 69 63 20 65 72 72 6f 72 20 6d  specific error m
c820: 65 73 73 61 67 65 20 66 6f 72 20 74 68 69 73 0a  essage for this.
c830: 2f 2f 20 73 69 6e 63 65 20 69 74 20 69 73 20 61  // since it is a
c840: 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
c850: 68 65 20 64 65 66 61 75 6c 74 20 67 72 61 6d 6d  he default gramm
c860: 61 72 20 72 75 6c 65 73 2e 0a 2f 2f 0a 74 72 69  ar rules..//.tri
c870: 64 78 62 79 20 3a 3a 3d 20 2e 0a 74 72 69 64 78  dxby ::= ..tridx
c880: 62 79 20 3a 3a 3d 20 49 4e 44 45 58 45 44 20 42  by ::= INDEXED B
c890: 59 20 6e 6d 2e 20 7b 0a 20 20 73 71 6c 69 74 65  Y nm. {.  sqlite
c8a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c8b0: 2c 0a 20 20 20 20 20 20 20 20 22 74 68 65 20 49  ,.        "the I
c8c0: 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
c8d0: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
c8e0: 6f 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  on UPDATE or DEL
c8f0: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 22  ETE statements "
c900: 0a 20 20 20 20 20 20 20 20 22 77 69 74 68 69 6e  .        "within
c910: 20 74 72 69 67 67 65 72 73 22 29 3b 0a 7d 0a 74   triggers");.}.t
c920: 72 69 64 78 62 79 20 3a 3a 3d 20 4e 4f 54 20 49  ridxby ::= NOT I
c930: 4e 44 45 58 45 44 2e 20 7b 0a 20 20 73 71 6c 69  NDEXED. {.  sqli
c940: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c950: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 74 68 65  se,.        "the
c960: 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
c970: 75 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  use is not allow
c980: 65 64 20 6f 6e 20 55 50 44 41 54 45 20 6f 72 20  ed on UPDATE or 
c990: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
c9a0: 73 20 22 0a 20 20 20 20 20 20 20 20 22 77 69 74  s ".        "wit
c9b0: 68 69 6e 20 74 72 69 67 67 65 72 73 22 29 3b 0a  hin triggers");.
c9c0: 7d 0a 0a 0a 0a 25 74 79 70 65 20 74 72 69 67 67  }....%type trigg
c9d0: 65 72 5f 63 6d 64 20 7b 54 72 69 67 67 65 72 53  er_cmd {TriggerS
c9e0: 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  tep*}.%destructo
c9f0: 72 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 73  r trigger_cmd {s
ca00: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
ca10: 67 65 72 53 74 65 70 28 70 50 61 72 73 65 2d 3e  gerStep(pParse->
ca20: 64 62 2c 20 24 24 29 3b 7d 0a 2f 2f 20 55 50 44  db, $$);}.// UPD
ca30: 41 54 45 20 0a 74 72 69 67 67 65 72 5f 63 6d 64  ATE .trigger_cmd
ca40: 28 41 29 20 3a 3a 3d 0a 20 20 20 55 50 44 41 54  (A) ::=.   UPDAT
ca50: 45 20 6f 72 63 6f 6e 66 28 52 29 20 74 72 6e 6d  E orconf(R) trnm
ca60: 28 58 29 20 74 72 69 64 78 62 79 20 53 45 54 20  (X) tridxby SET 
ca70: 73 65 74 6c 69 73 74 28 59 29 20 77 68 65 72 65  setlist(Y) where
ca80: 5f 6f 70 74 28 5a 29 2e 20 20 0a 20 20 20 7b 41  _opt(Z).  .   {A
ca90: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
caa0: 72 55 70 64 61 74 65 53 74 65 70 28 70 50 61 72  rUpdateStep(pPar
cab0: 73 65 2d 3e 64 62 2c 20 26 58 2c 20 59 2c 20 5a  se->db, &X, Y, Z
cac0: 2c 20 52 29 3b 7d 0a 0a 2f 2f 20 49 4e 53 45 52  , R);}..// INSER
cad0: 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  T.trigger_cmd(A)
cae0: 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28   ::= insert_cmd(
caf0: 52 29 20 49 4e 54 4f 20 74 72 6e 6d 28 58 29 20  R) INTO trnm(X) 
cb00: 69 64 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65  idlist_opt(F) se
cb10: 6c 65 63 74 28 53 29 2e 0a 20 20 20 7b 41 20 3d  lect(S)..   {A =
cb20: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 49   sqlite3TriggerI
cb30: 6e 73 65 72 74 53 74 65 70 28 70 50 61 72 73 65  nsertStep(pParse
cb40: 2d 3e 64 62 2c 20 26 58 2c 20 46 2c 20 53 2c 20  ->db, &X, F, S, 
cb50: 52 29 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  R);/*A-overwrite
cb60: 73 2d 52 2a 2f 7d 0a 0a 2f 2f 20 44 45 4c 45 54  s-R*/}..// DELET
cb70: 45 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  E.trigger_cmd(A)
cb80: 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f 4d   ::= DELETE FROM
cb90: 20 74 72 6e 6d 28 58 29 20 74 72 69 64 78 62 79   trnm(X) tridxby
cba0: 20 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 0a 20   where_opt(Y).. 
cbb0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72    {A = sqlite3Tr
cbc0: 69 67 67 65 72 44 65 6c 65 74 65 53 74 65 70 28  iggerDeleteStep(
cbd0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58 2c 20  pParse->db, &X, 
cbe0: 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a  Y);}..// SELECT.
cbf0: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a  trigger_cmd(A) :
cc00: 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 0a 20 20  := select(X)..  
cc10: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69   {A = sqlite3Tri
cc20: 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28 70  ggerSelectStep(p
cc30: 50 61 72 73 65 2d 3e 64 62 2c 20 58 29 3b 20 2f  Parse->db, X); /
cc40: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a  *A-overwrites-X*
cc50: 2f 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63 69  /}..// The speci
cc60: 61 6c 20 52 41 49 53 45 20 65 78 70 72 65 73 73  al RAISE express
cc70: 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63 63  ion that may occ
cc80: 75 72 20 69 6e 20 74 72 69 67 67 65 72 20 70 72  ur in trigger pr
cc90: 6f 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20 3a  ograms.expr(A) :
cca0: 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 49  := RAISE(X) LP I
ccb0: 47 4e 4f 52 45 20 52 50 28 59 29 2e 20 20 7b 0a  GNORE RP(Y).  {.
ccc0: 20 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c    spanSet(&A,&X,
ccd0: 26 59 29 3b 20 20 2f 2a 41 2d 6f 76 65 72 77 72  &Y);  /*A-overwr
cce0: 69 74 65 73 2d 58 2a 2f 0a 20 20 41 2e 70 45 78  ites-X*/.  A.pEx
ccf0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
cd00: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 41 49  r(pParse, TK_RAI
cd10: 53 45 2c 20 30 2c 20 30 29 3b 20 0a 20 20 69 66  SE, 0, 0); .  if
cd20: 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  ( A.pExpr ){.   
cd30: 20 41 2e 70 45 78 70 72 2d 3e 61 66 66 69 6e 69   A.pExpr->affini
cd40: 74 79 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 0a  ty = OE_Ignore;.
cd50: 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a    }.}.expr(A) ::
cd60: 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 72 61  = RAISE(X) LP ra
cd70: 69 73 65 74 79 70 65 28 54 29 20 43 4f 4d 4d 41  isetype(T) COMMA
cd80: 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20 20 7b   nm(Z) RP(Y).  {
cd90: 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58  .  spanSet(&A,&X
cda0: 2c 26 59 29 3b 20 20 2f 2a 41 2d 6f 76 65 72 77  ,&Y);  /*A-overw
cdb0: 72 69 74 65 73 2d 58 2a 2f 0a 20 20 41 2e 70 45  rites-X*/.  A.pE
cdc0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
cdd0: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
cde0: 62 2c 20 54 4b 5f 52 41 49 53 45 2c 20 26 5a 2c  b, TK_RAISE, &Z,
cdf0: 20 31 29 3b 20 0a 20 20 69 66 28 20 41 2e 70 45   1); .  if( A.pE
ce00: 78 70 72 20 29 20 7b 0a 20 20 20 20 41 2e 70 45  xpr ) {.    A.pE
ce10: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
ce20: 28 63 68 61 72 29 54 3b 0a 20 20 7d 0a 7d 0a 25  (char)T;.  }.}.%
ce30: 65 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f  endif  !SQLITE_O
ce40: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 25 74 79  MIT_TRIGGER..%ty
ce50: 70 65 20 72 61 69 73 65 74 79 70 65 20 7b 69 6e  pe raisetype {in
ce60: 74 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20  t}.raisetype(A) 
ce70: 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b  ::= ROLLBACK.  {
ce80: 41 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b  A = OE_Rollback;
ce90: 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a  }.raisetype(A) :
cea0: 3a 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 7b 41  := ABORT.     {A
ceb0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61   = OE_Abort;}.ra
cec0: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46  isetype(A) ::= F
ced0: 41 49 4c 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f  AIL.      {A = O
cee0: 45 5f 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f  E_Fail;}.../////
cef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cf00: 2f 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45  ///  DROP TRIGGE
cf10: 52 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  R statement ////
cf20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cf30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
cf40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
cf50: 52 49 47 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44  RIGGER.cmd ::= D
cf60: 52 4f 50 20 54 52 49 47 47 45 52 20 69 66 65 78  ROP TRIGGER ifex
cf70: 69 73 74 73 28 4e 4f 45 52 52 29 20 66 75 6c 6c  ists(NOERR) full
cf80: 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c  name(X). {.  sql
cf90: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28  ite3DropTrigger(
cfa0: 70 50 61 72 73 65 2c 58 2c 4e 4f 45 52 52 29 3b  pParse,X,NOERR);
cfb0: 0a 7d 0a 25 65 6e 64 69 66 20 20 21 53 51 4c 49  .}.%endif  !SQLI
cfc0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
cfd0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
cfe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 54 54 41 43 48  ///////// ATTACH
cff0: 20 44 41 54 41 42 41 53 45 20 66 69 6c 65 20 41   DATABASE file A
d000: 53 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  S name /////////
d010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d020: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
d030: 4f 4d 49 54 5f 41 54 54 41 43 48 0a 63 6d 64 20  OMIT_ATTACH.cmd 
d040: 3a 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61 62  ::= ATTACH datab
d050: 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28  ase_kw_opt expr(
d060: 46 29 20 41 53 20 65 78 70 72 28 44 29 20 6b 65  F) AS expr(D) ke
d070: 79 5f 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71  y_opt(K). {.  sq
d080: 6c 69 74 65 33 41 74 74 61 63 68 28 70 50 61 72  lite3Attach(pPar
d090: 73 65 2c 20 46 2e 70 45 78 70 72 2c 20 44 2e 70  se, F.pExpr, D.p
d0a0: 45 78 70 72 2c 20 4b 29 3b 0a 7d 0a 63 6d 64 20  Expr, K);.}.cmd 
d0b0: 3a 3a 3d 20 44 45 54 41 43 48 20 64 61 74 61 62  ::= DETACH datab
d0c0: 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28  ase_kw_opt expr(
d0d0: 44 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44  D). {.  sqlite3D
d0e0: 65 74 61 63 68 28 70 50 61 72 73 65 2c 20 44 2e  etach(pParse, D.
d0f0: 70 45 78 70 72 29 3b 0a 7d 0a 0a 25 74 79 70 65  pExpr);.}..%type
d100: 20 6b 65 79 5f 6f 70 74 20 7b 45 78 70 72 2a 7d   key_opt {Expr*}
d110: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79  .%destructor key
d120: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70  _opt {sqlite3Exp
d130: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
d140: 64 62 2c 20 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70  db, $$);}.key_op
d150: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
d170: 20 41 20 3d 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70   A = 0; }.key_op
d180: 74 28 41 29 20 3a 3a 3d 20 4b 45 59 20 65 78 70  t(A) ::= KEY exp
d190: 72 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b  r(X).          {
d1a0: 20 41 20 3d 20 58 2e 70 45 78 70 72 3b 20 7d 0a   A = X.pExpr; }.
d1b0: 0a 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74  .database_kw_opt
d1c0: 20 3a 3a 3d 20 44 41 54 41 42 41 53 45 2e 0a 64   ::= DATABASE..d
d1d0: 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a  atabase_kw_opt :
d1e0: 3a 3d 20 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49  := ..%endif SQLI
d1f0: 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 0a  TE_OMIT_ATTACH..
d200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44  ////////// REIND
d220: 45 58 20 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f  EX collation ///
d230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
d250: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
d260: 4d 49 54 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20  MIT_REINDEX.cmd 
d270: 3a 3a 3d 20 52 45 49 4e 44 45 58 2e 20 20 20 20  ::= REINDEX.    
d280: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
d290: 69 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72  ite3Reindex(pPar
d2a0: 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20  se, 0, 0);}.cmd 
d2b0: 3a 3a 3d 20 52 45 49 4e 44 45 58 20 6e 6d 28 58  ::= REINDEX nm(X
d2c0: 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c  ) dbnm(Y).  {sql
d2d0: 69 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72  ite3Reindex(pPar
d2e0: 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65  se, &X, &Y);}.%e
d2f0: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
d300: 54 5f 52 45 49 4e 44 45 58 0a 0a 2f 2f 2f 2f 2f  T_REINDEX../////
d310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41  ////////////// A
d330: 4e 41 4c 59 5a 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  NALYZE /////////
d340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
d360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d370: 4e 41 4c 59 5a 45 0a 63 6d 64 20 3a 3a 3d 20 41  NALYZE.cmd ::= A
d380: 4e 41 4c 59 5a 45 2e 20 20 20 20 20 20 20 20 20  NALYZE.         
d390: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41         {sqlite3A
d3a0: 6e 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 30  nalyze(pParse, 0
d3b0: 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 41  , 0);}.cmd ::= A
d3c0: 4e 41 4c 59 5a 45 20 6e 6d 28 58 29 20 64 62 6e  NALYZE nm(X) dbn
d3d0: 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 41  m(Y).  {sqlite3A
d3e0: 6e 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 26  nalyze(pParse, &
d3f0: 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66 0a  X, &Y);}.%endif.
d400: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
d410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20  ///////// ALTER 
d420: 54 41 42 4c 45 20 74 61 62 6c 65 20 2e 2e 2e 20  TABLE table ... 
d430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d450: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
d460: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
d470: 63 6d 64 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41  cmd ::= ALTER TA
d480: 42 4c 45 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20  BLE fullname(X) 
d490: 52 45 4e 41 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e  RENAME TO nm(Z).
d4a0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65   {.  sqlite3Alte
d4b0: 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 70 50 61  rRenameTable(pPa
d4c0: 72 73 65 2c 58 2c 26 5a 29 3b 0a 7d 0a 63 6d 64  rse,X,&Z);.}.cmd
d4d0: 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45   ::= ALTER TABLE
d4e0: 20 61 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c   add_column_full
d4f0: 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 41 44 44  name.        ADD
d500: 20 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63 6f   kwcolumn_opt co
d510: 6c 75 6d 6e 6e 61 6d 65 28 59 29 20 63 61 72 67  lumnname(Y) carg
d520: 6c 69 73 74 2e 20 7b 0a 20 20 59 2e 6e 20 3d 20  list. {.  Y.n = 
d530: 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c  (int)(pParse->sL
d540: 61 73 74 54 6f 6b 65 6e 2e 7a 2d 59 2e 7a 29 20  astToken.z-Y.z) 
d550: 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  + pParse->sLastT
d560: 6f 6b 65 6e 2e 6e 3b 0a 20 20 73 71 6c 69 74 65  oken.n;.  sqlite
d570: 33 41 6c 74 65 72 46 69 6e 69 73 68 41 64 64 43  3AlterFinishAddC
d580: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 26 59  olumn(pParse, &Y
d590: 29 3b 0a 7d 0a 61 64 64 5f 63 6f 6c 75 6d 6e 5f  );.}.add_column_
d5a0: 66 75 6c 6c 6e 61 6d 65 20 3a 3a 3d 20 66 75 6c  fullname ::= ful
d5b0: 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 64 69  lname(X). {.  di
d5c0: 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 28 70  sableLookaside(p
d5d0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
d5e0: 33 41 6c 74 65 72 42 65 67 69 6e 41 64 64 43 6f  3AlterBeginAddCo
d5f0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 58 29 3b  lumn(pParse, X);
d600: 0a 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20  .}.kwcolumn_opt 
d610: 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f  ::= ..kwcolumn_o
d620: 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57 2e  pt ::= COLUMNKW.
d630: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
d640: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
d650: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
d660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54 45  ///////// CREATE
d670: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 2e   VIRTUAL TABLE .
d680: 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .. /////////////
d690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d6a0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
d6b0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d6c0: 45 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65  E.cmd ::= create
d6d0: 5f 76 74 61 62 2e 20 20 20 20 20 20 20 20 20 20  _vtab.          
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
d6f0: 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50  lite3VtabFinishP
d700: 61 72 73 65 28 70 50 61 72 73 65 2c 30 29 3b 7d  arse(pParse,0);}
d710: 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f  .cmd ::= create_
d720: 76 74 61 62 20 4c 50 20 76 74 61 62 61 72 67 6c  vtab LP vtabargl
d730: 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c  ist RP(X).  {sql
d740: 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50 61  ite3VtabFinishPa
d750: 72 73 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d  rse(pParse,&X);}
d760: 0a 63 72 65 61 74 65 5f 76 74 61 62 20 3a 3a 3d  .create_vtab ::=
d770: 20 63 72 65 61 74 65 6b 77 20 56 49 52 54 55 41   createkw VIRTUA
d780: 4c 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78 69  L TABLE ifnotexi
d790: 73 74 73 28 45 29 0a 20 20 20 20 20 20 20 20 20  sts(E).         
d7a0: 20 20 20 20 20 20 20 6e 6d 28 58 29 20 64 62 6e         nm(X) dbn
d7b0: 6d 28 59 29 20 55 53 49 4e 47 20 6e 6d 28 5a 29  m(Y) USING nm(Z)
d7c0: 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  . {.    sqlite3V
d7d0: 74 61 62 42 65 67 69 6e 50 61 72 73 65 28 70 50  tabBeginParse(pP
d7e0: 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a  arse, &X, &Y, &Z
d7f0: 2c 20 45 29 3b 0a 7d 0a 76 74 61 62 61 72 67 6c  , E);.}.vtabargl
d800: 69 73 74 20 3a 3a 3d 20 76 74 61 62 61 72 67 2e  ist ::= vtabarg.
d810: 0a 76 74 61 62 61 72 67 6c 69 73 74 20 3a 3a 3d  .vtabarglist ::=
d820: 20 76 74 61 62 61 72 67 6c 69 73 74 20 43 4f 4d   vtabarglist COM
d830: 4d 41 20 76 74 61 62 61 72 67 2e 0a 76 74 61 62  MA vtabarg..vtab
d840: 61 72 67 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  arg ::= .       
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 49  {sqlite3VtabArgI
d870: 6e 69 74 28 70 50 61 72 73 65 29 3b 7d 0a 76 74  nit(pParse);}.vt
d880: 61 62 61 72 67 20 3a 3a 3d 20 76 74 61 62 61 72  abarg ::= vtabar
d890: 67 20 76 74 61 62 61 72 67 74 6f 6b 65 6e 2e 0a  g vtabargtoken..
d8a0: 76 74 61 62 61 72 67 74 6f 6b 65 6e 20 3a 3a 3d  vtabargtoken ::=
d8b0: 20 41 4e 59 28 58 29 2e 20 20 20 20 20 20 20 20   ANY(X).        
d8c0: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62      {sqlite3Vtab
d8d0: 41 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65  ArgExtend(pParse
d8e0: 2c 26 58 29 3b 7d 0a 76 74 61 62 61 72 67 74 6f  ,&X);}.vtabargto
d8f0: 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c 69  ken ::= lp anyli
d900: 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c 69  st RP(X).  {sqli
d910: 74 65 33 56 74 61 62 41 72 67 45 78 74 65 6e 64  te3VtabArgExtend
d920: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 6c 70  (pParse,&X);}.lp
d930: 20 3a 3a 3d 20 4c 50 28 58 29 2e 20 20 20 20 20   ::= LP(X).     
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d950: 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72    {sqlite3VtabAr
d960: 67 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c 26  gExtend(pParse,&
d970: 58 29 3b 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d  X);}.anylist ::=
d980: 20 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61   ..anylist ::= a
d990: 6e 79 6c 69 73 74 20 4c 50 20 61 6e 79 6c 69 73  nylist LP anylis
d9a0: 74 20 52 50 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a  t RP..anylist ::
d9b0: 3d 20 61 6e 79 6c 69 73 74 20 41 4e 59 2e 0a 25  = anylist ANY..%
d9c0: 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d  endif  SQLITE_OM
d9d0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
d9e0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
d9f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 4f 4d 4d 4f  ////////// COMMO
da00: 4e 20 54 41 42 4c 45 20 45 58 50 52 45 53 53 49  N TABLE EXPRESSI
da10: 4f 4e 53 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ONS ////////////
da20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
da30: 0a 25 74 79 70 65 20 77 69 74 68 20 7b 57 69 74  .%type with {Wit
da40: 68 2a 7d 0a 25 74 79 70 65 20 77 71 6c 69 73 74  h*}.%type wqlist
da50: 20 7b 57 69 74 68 2a 7d 0a 25 64 65 73 74 72 75   {With*}.%destru
da60: 63 74 6f 72 20 77 69 74 68 20 7b 73 71 6c 69 74  ctor with {sqlit
da70: 65 33 57 69 74 68 44 65 6c 65 74 65 28 70 50 61  e3WithDelete(pPa
da80: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
da90: 64 65 73 74 72 75 63 74 6f 72 20 77 71 6c 69 73  destructor wqlis
daa0: 74 20 7b 73 71 6c 69 74 65 33 57 69 74 68 44 65  t {sqlite3WithDe
dab0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
dac0: 20 24 24 29 3b 7d 0a 0a 77 69 74 68 28 41 29 20   $$);}..with(A) 
dad0: 3a 3a 3d 20 2e 20 7b 41 20 3d 20 30 3b 7d 0a 25  ::= . {A = 0;}.%
dae0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
daf0: 49 54 5f 43 54 45 0a 77 69 74 68 28 41 29 20 3a  IT_CTE.with(A) :
db00: 3a 3d 20 57 49 54 48 20 77 71 6c 69 73 74 28 57  := WITH wqlist(W
db10: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
db20: 7b 20 41 20 3d 20 57 3b 20 7d 0a 77 69 74 68 28  { A = W; }.with(
db30: 41 29 20 3a 3a 3d 20 57 49 54 48 20 52 45 43 55  A) ::= WITH RECU
db40: 52 53 49 56 45 20 77 71 6c 69 73 74 28 57 29 2e  RSIVE wqlist(W).
db50: 20 20 20 20 7b 20 41 20 3d 20 57 3b 20 7d 0a 0a      { A = W; }..
db60: 77 71 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d  wqlist(A) ::= nm
db70: 28 58 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28  (X) eidlist_opt(
db80: 59 29 20 41 53 20 4c 50 20 73 65 6c 65 63 74 28  Y) AS LP select(
db90: 5a 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73  Z) RP. {.  A = s
dba0: 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 70 50  qlite3WithAdd(pP
dbb0: 61 72 73 65 2c 20 30 2c 20 26 58 2c 20 59 2c 20  arse, 0, &X, Y, 
dbc0: 5a 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  Z); /*A-overwrit
dbd0: 65 73 2d 58 2a 2f 0a 7d 0a 77 71 6c 69 73 74 28  es-X*/.}.wqlist(
dbe0: 41 29 20 3a 3a 3d 20 77 71 6c 69 73 74 28 41 29  A) ::= wqlist(A)
dbf0: 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 65 69 64   COMMA nm(X) eid
dc00: 6c 69 73 74 5f 6f 70 74 28 59 29 20 41 53 20 4c  list_opt(Y) AS L
dc10: 50 20 73 65 6c 65 63 74 28 5a 29 20 52 50 2e 20  P select(Z) RP. 
dc20: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 57  {.  A = sqlite3W
dc30: 69 74 68 41 64 64 28 70 50 61 72 73 65 2c 20 41  ithAdd(pParse, A
dc40: 2c 20 26 58 2c 20 59 2c 20 5a 29 3b 0a 7d 0a 25  , &X, Y, Z);.}.%
dc50: 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d  endif  SQLITE_OM
dc60: 49 54 5f 43 54 45 0a                             IT_CTE.