SQLite
Hex Artifact Content
Not logged in

Artifact 52ef3cecd0934e9da4a45b585883a03243ad615d338ad94f44501a05891dcdfa:


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 73 71 6c 69 74 65 33 45 72 72 6f  */.  sqlite3Erro
04a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65  rMsg(pParse, "ne
04b0: 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61  ar \"%T\": synta
04c0: 78 20 65 72 72 6f 72 22 2c 20 26 54 4f 4b 45 4e  x error", &TOKEN
04d0: 29 3b 0a 7d 0a 25 73 74 61 63 6b 5f 6f 76 65 72  );.}.%stack_over
04e0: 66 6c 6f 77 20 7b 0a 20 20 73 71 6c 69 74 65 33  flow {.  sqlite3
04f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
0500: 20 22 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f   "parser stack o
0510: 76 65 72 66 6c 6f 77 22 29 3b 0a 7d 0a 0a 2f 2f  verflow");.}..//
0520: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
0530: 20 67 65 6e 65 72 61 74 65 64 20 70 72 6f 63 65   generated proce
0540: 64 75 72 65 20 74 68 61 74 20 69 6d 70 6c 65 6d  dure that implem
0550: 65 6e 74 73 20 74 68 65 20 70 61 72 73 65 72 0a  ents the parser.
0560: 2f 2f 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  // is as follows
0570: 3a 0a 25 6e 61 6d 65 20 73 71 6c 69 74 65 33 50  :.%name sqlite3P
0580: 61 72 73 65 72 0a 0a 2f 2f 20 54 68 65 20 66 6f  arser..// The fo
0590: 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20 69 73 20  llowing text is 
05a0: 69 6e 63 6c 75 64 65 64 20 6e 65 61 72 20 74 68  included near th
05b0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
05c0: 68 65 20 43 20 73 6f 75 72 63 65 0a 2f 2f 20 63  he C source.// c
05d0: 6f 64 65 20 66 69 6c 65 20 74 68 61 74 20 69 6d  ode file that im
05e0: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 70 61 72  plements the par
05f0: 73 65 72 2e 0a 2f 2f 0a 25 69 6e 63 6c 75 64 65  ser..//.%include
0600: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c   {.#include "sql
0610: 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a  iteInt.h"../*.**
0620: 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 65 72 72   Disable all err
0630: 6f 72 20 72 65 63 6f 76 65 72 79 20 70 72 6f 63  or recovery proc
0640: 65 73 73 69 6e 67 20 69 6e 20 74 68 65 20 70 61  essing in the pa
0650: 72 73 65 72 20 70 75 73 68 2d 64 6f 77 6e 0a 2a  rser push-down.*
0660: 2a 20 61 75 74 6f 6d 61 74 6f 6e 2e 0a 2a 2f 0a  * automaton..*/.
0670: 23 64 65 66 69 6e 65 20 59 59 4e 4f 45 52 52 4f  #define YYNOERRO
0680: 52 52 45 43 4f 56 45 52 59 20 31 0a 0a 2f 2a 0a  RRECOVERY 1../*.
0690: 2a 2a 20 4d 61 6b 65 20 79 79 74 65 73 74 63 61  ** Make yytestca
06a0: 73 65 28 29 20 74 68 65 20 73 61 6d 65 20 61 73  se() the same as
06b0: 20 74 65 73 74 63 61 73 65 28 29 0a 2a 2f 0a 23   testcase().*/.#
06c0: 64 65 66 69 6e 65 20 79 79 74 65 73 74 63 61 73  define yytestcas
06d0: 65 28 58 29 20 74 65 73 74 63 61 73 65 28 58 29  e(X) testcase(X)
06e0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
06f0: 20 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 72   that sqlite3Par
0700: 73 65 72 46 72 65 65 28 29 20 77 69 6c 6c 20 6e  serFree() will n
0710: 65 76 65 72 20 62 65 20 63 61 6c 6c 65 64 20 77  ever be called w
0720: 69 74 68 20 61 20 6e 75 6c 6c 0a 2a 2a 20 70 6f  ith a null.** po
0730: 69 6e 74 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  inter..*/.#defin
0740: 65 20 59 59 50 41 52 53 45 46 52 45 45 4e 45 56  e YYPARSEFREENEV
0750: 45 52 4e 55 4c 4c 20 31 0a 0a 2f 2a 0a 2a 2a 20  ERNULL 1../*.** 
0760: 49 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74  In the amalgamat
0770: 69 6f 6e 2c 20 74 68 65 20 70 61 72 73 65 2e 63  ion, the parse.c
0780: 20 66 69 6c 65 20 67 65 6e 65 72 61 74 65 64 20   file generated 
0790: 62 79 20 6c 65 6d 6f 6e 20 61 6e 64 20 74 68 65  by lemon and the
07a0: 0a 2a 2a 20 74 6f 6b 65 6e 69 7a 65 2e 63 20 66  .** tokenize.c f
07b0: 69 6c 65 20 61 72 65 20 63 6f 6e 63 61 74 65 6e  ile are concaten
07c0: 61 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63  ated.  In that c
07d0: 61 73 65 2c 20 73 71 6c 69 74 65 33 52 75 6e 50  ase, sqlite3RunP
07e0: 61 72 73 65 72 28 29 0a 2a 2a 20 68 61 73 20 61  arser().** has a
07f0: 63 63 65 73 73 20 74 6f 20 74 68 65 20 74 68 65  ccess to the the
0800: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 79 79 50   size of the yyP
0810: 61 72 73 65 72 20 6f 62 6a 65 63 74 20 61 6e 64  arser object and
0820: 20 73 6f 20 74 68 65 20 70 61 72 73 65 72 0a 2a   so the parser.*
0830: 2a 20 65 6e 67 69 6e 65 20 63 61 6e 20 62 65 20  * engine can be 
0840: 61 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 73  allocated from s
0850: 74 61 63 6b 2e 20 20 49 6e 20 74 68 61 74 20 63  tack.  In that c
0860: 61 73 65 2c 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a  ase, only the.**
0870: 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 49 6e   sqlite3ParserIn
0880: 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  it() and sqlite3
0890: 50 61 72 73 65 72 46 69 6e 61 6c 69 7a 65 28 29  ParserFinalize()
08a0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6e   routines are in
08b0: 76 6f 6b 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65  voked.** and the
08c0: 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 41 6c   sqlite3ParserAl
08d0: 6c 6f 63 28 29 20 61 6e 64 20 73 71 6c 69 74 65  loc() and sqlite
08e0: 33 50 61 72 73 65 72 46 72 65 65 28 29 20 72 6f  3ParserFree() ro
08f0: 75 74 69 6e 65 73 20 63 61 6e 20 62 65 0a 2a 2a  utines can be.**
0900: 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 23 69 66   omitted..*/.#if
0910: 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47  def SQLITE_AMALG
0920: 41 4d 41 54 49 4f 4e 0a 23 20 64 65 66 69 6e 65  AMATION.# define
0930: 20 73 71 6c 69 74 65 33 50 61 72 73 65 72 5f 45   sqlite3Parser_E
0940: 4e 47 49 4e 45 41 4c 57 41 59 53 4f 4e 53 54 41  NGINEALWAYSONSTA
0950: 43 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  CK 1.#endif../*.
0960: 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64  ** Alternative d
0970: 61 74 61 74 79 70 65 20 66 6f 72 20 74 68 65 20  atatype for the 
0980: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
0990: 6d 61 6c 6c 6f 63 28 29 20 72 6f 75 74 69 6e 65  malloc() routine
09a0: 20 70 61 73 73 65 64 0a 2a 2a 20 69 6e 74 6f 20   passed.** into 
09b0: 73 71 6c 69 74 65 33 50 61 72 73 65 72 41 6c 6c  sqlite3ParserAll
09c0: 6f 63 28 29 2e 20 20 54 68 65 20 64 65 66 61 75  oc().  The defau
09d0: 6c 74 20 69 73 20 73 69 7a 65 5f 74 2e 0a 2a 2f  lt is size_t..*/
09e0: 0a 23 64 65 66 69 6e 65 20 59 59 4d 41 4c 4c 4f  .#define YYMALLO
09f0: 43 41 52 47 54 59 50 45 20 20 75 36 34 0a 0a 2f  CARGTYPE  u64../
0a00: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
0a10: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
0a20: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
0a30: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 0a 2a  tion about the.*
0a40: 2a 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  * LIMIT clause o
0a50: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
0a60: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ment..*/.struct 
0a70: 4c 69 6d 69 74 56 61 6c 20 7b 0a 20 20 45 78 70  LimitVal {.  Exp
0a80: 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a  r *pLimit;    /*
0a90: 20 54 68 65 20 4c 49 4d 49 54 20 65 78 70 72 65   The LIMIT expre
0aa0: 73 73 69 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66 20  ssion.  NULL if 
0ab0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69  there is no limi
0ac0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66  t */.  Expr *pOf
0ad0: 66 73 65 74 3b 20 20 20 2f 2a 20 54 68 65 20 4f  fset;   /* The O
0ae0: 46 46 53 45 54 20 65 78 70 72 65 73 73 69 6f 6e  FFSET expression
0af0: 2e 20 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  .  NULL if there
0b00: 20 69 73 20 6e 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a   is none */.};..
0b10: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0b20: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0b30: 6e 67 20 73 74 72 75 63 74 75 72 65 20 64 65 73  ng structure des
0b40: 63 72 69 62 65 73 20 74 68 65 20 65 76 65 6e 74  cribes the event
0b50: 20 6f 66 20 61 0a 2a 2a 20 54 52 49 47 47 45 52   of a.** TRIGGER
0b60: 2e 20 20 22 61 22 20 69 73 20 74 68 65 20 65 76  .  "a" is the ev
0b70: 65 6e 74 20 74 79 70 65 2c 20 6f 6e 65 20 6f 66  ent type, one of
0b80: 20 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 49   TK_UPDATE, TK_I
0b90: 4e 53 45 52 54 2c 0a 2a 2a 20 54 4b 5f 44 45 4c  NSERT,.** TK_DEL
0ba0: 45 54 45 2c 20 6f 72 20 54 4b 5f 49 4e 53 54 45  ETE, or TK_INSTE
0bb0: 41 44 2e 20 20 49 66 20 74 68 65 20 65 76 65 6e  AD.  If the even
0bc0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
0bd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 55 50 44 41  .**.**      UPDA
0be0: 54 45 20 4f 4e 20 28 61 2c 62 2c 63 29 0a 2a 2a  TE ON (a,b,c).**
0bf0: 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 22 62 22  .** Then the "b"
0c00: 20 49 64 4c 69 73 74 20 72 65 63 6f 72 64 73 20   IdList records 
0c10: 74 68 65 20 6c 69 73 74 20 22 61 2c 62 2c 63 22  the list "a,b,c"
0c20: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 72 69 67  ..*/.struct Trig
0c30: 45 76 65 6e 74 20 7b 20 69 6e 74 20 61 3b 20 49  Event { int a; I
0c40: 64 4c 69 73 74 20 2a 20 62 3b 20 7d 3b 0a 0a 2f  dList * b; };../
0c50: 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 6c 6f 6f  *.** Disable loo
0c60: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 61 6c  kaside memory al
0c70: 6c 6f 63 61 74 69 6f 6e 20 66 6f 72 20 6f 62 6a  location for obj
0c80: 65 63 74 73 20 74 68 61 74 20 6d 69 67 68 74 20  ects that might 
0c90: 62 65 0a 2a 2a 20 73 68 61 72 65 64 20 61 63 72  be.** shared acr
0ca0: 6f 73 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  oss database con
0cb0: 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  nections..*/.sta
0cc0: 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
0cd0: 4c 6f 6f 6b 61 73 69 64 65 28 50 61 72 73 65 20  Lookaside(Parse 
0ce0: 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72  *pParse){.  pPar
0cf0: 73 65 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f 6b 61  se->disableLooka
0d00: 73 69 64 65 2b 2b 3b 0a 20 20 70 50 61 72 73 65  side++;.  pParse
0d10: 2d 3e 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ->db->lookaside.
0d20: 62 44 69 73 61 62 6c 65 2b 2b 3b 0a 7d 0a 0a 7d  bDisable++;.}..}
0d30: 20 2f 2f 20 65 6e 64 20 25 69 6e 63 6c 75 64 65   // end %include
0d40: 0a 0a 2f 2f 20 49 6e 70 75 74 20 69 73 20 61 20  ..// Input is a 
0d50: 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
0d60: 6e 64 0a 69 6e 70 75 74 20 3a 3a 3d 20 63 6d 64  nd.input ::= cmd
0d70: 6c 69 73 74 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a  list..cmdlist ::
0d80: 3d 20 63 6d 64 6c 69 73 74 20 65 63 6d 64 2e 0a  = cmdlist ecmd..
0d90: 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 65 63 6d 64  cmdlist ::= ecmd
0da0: 2e 0a 65 63 6d 64 20 3a 3a 3d 20 53 45 4d 49 2e  ..ecmd ::= SEMI.
0db0: 0a 65 63 6d 64 20 3a 3a 3d 20 65 78 70 6c 61 69  .ecmd ::= explai
0dc0: 6e 20 63 6d 64 78 20 53 45 4d 49 2e 0a 65 78 70  n cmdx SEMI..exp
0dd0: 6c 61 69 6e 20 3a 3a 3d 20 2e 0a 25 69 66 6e 64  lain ::= ..%ifnd
0de0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
0df0: 58 50 4c 41 49 4e 0a 65 78 70 6c 61 69 6e 20 3a  XPLAIN.explain :
0e00: 3a 3d 20 45 58 50 4c 41 49 4e 2e 20 20 20 20 20  := EXPLAIN.     
0e10: 20 20 20 20 20 20 20 20 20 7b 20 70 50 61 72 73           { pPars
0e20: 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 31 3b 20  e->explain = 1; 
0e30: 7d 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58  }.explain ::= EX
0e40: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
0e50: 2e 20 20 20 7b 20 70 50 61 72 73 65 2d 3e 65 78  .   { pParse->ex
0e60: 70 6c 61 69 6e 20 3d 20 32 3b 20 7d 0a 25 65 6e  plain = 2; }.%en
0e70: 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54  dif  SQLITE_OMIT
0e80: 5f 45 58 50 4c 41 49 4e 0a 63 6d 64 78 20 3a 3a  _EXPLAIN.cmdx ::
0e90: 3d 20 63 6d 64 2e 20 20 20 20 20 20 20 20 20 20  = cmd.          
0ea0: 20 7b 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68   { sqlite3Finish
0eb0: 43 6f 64 69 6e 67 28 70 50 61 72 73 65 29 3b 20  Coding(pParse); 
0ec0: 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }../////////////
0ed0: 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69 6e 20 61  //////// Begin a
0ee0: 6e 64 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69  nd end transacti
0ef0: 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ons. ///////////
0f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0f10: 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 42 45  /.//..cmd ::= BE
0f20: 47 49 4e 20 74 72 61 6e 73 74 79 70 65 28 59 29  GIN transtype(Y)
0f30: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 7b 73 71   trans_opt.  {sq
0f40: 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61  lite3BeginTransa
0f50: 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 59 29  ction(pParse, Y)
0f60: 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d  ;}.trans_opt ::=
0f70: 20 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d   ..trans_opt ::=
0f80: 20 54 52 41 4e 53 41 43 54 49 4f 4e 2e 0a 74 72   TRANSACTION..tr
0f90: 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 4e  ans_opt ::= TRAN
0fa0: 53 41 43 54 49 4f 4e 20 6e 6d 2e 0a 25 74 79 70  SACTION nm..%typ
0fb0: 65 20 74 72 61 6e 73 74 79 70 65 20 7b 69 6e 74  e transtype {int
0fc0: 7d 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a  }.transtype(A) :
0fd0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
0fe0: 20 7b 41 20 3d 20 54 4b 5f 44 45 46 45 52 52 45   {A = TK_DEFERRE
0ff0: 44 3b 7d 0a 74 72 61 6e 73 74 79 70 65 28 41 29  D;}.transtype(A)
1000: 20 3a 3a 3d 20 44 45 46 45 52 52 45 44 28 58 29   ::= DEFERRED(X)
1010: 2e 20 20 7b 41 20 3d 20 40 58 3b 20 2f 2a 41 2d  .  {A = @X; /*A-
1020: 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 7d 0a  overwrites-X*/}.
1030: 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d  transtype(A) ::=
1040: 20 49 4d 4d 45 44 49 41 54 45 28 58 29 2e 20 7b   IMMEDIATE(X). {
1050: 41 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72  A = @X; /*A-over
1060: 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 74 72 61 6e  writes-X*/}.tran
1070: 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 45 58 43  stype(A) ::= EXC
1080: 4c 55 53 49 56 45 28 58 29 2e 20 7b 41 20 3d 20  LUSIVE(X). {A = 
1090: 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  @X; /*A-overwrit
10a0: 65 73 2d 58 2a 2f 7d 0a 63 6d 64 20 3a 3a 3d 20  es-X*/}.cmd ::= 
10b0: 43 4f 4d 4d 49 54 7c 45 4e 44 28 58 29 20 74 72  COMMIT|END(X) tr
10c0: 61 6e 73 5f 6f 70 74 2e 20 20 20 7b 73 71 6c 69  ans_opt.   {sqli
10d0: 74 65 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  te3EndTransactio
10e0: 6e 28 70 50 61 72 73 65 2c 40 58 29 3b 7d 0a 63  n(pParse,@X);}.c
10f0: 6d 64 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 28  md ::= ROLLBACK(
1100: 58 29 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20  X) trans_opt.   
1110: 20 20 7b 73 71 6c 69 74 65 33 45 6e 64 54 72 61    {sqlite3EndTra
1120: 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  nsaction(pParse,
1130: 40 58 29 3b 7d 0a 0a 73 61 76 65 70 6f 69 6e 74  @X);}..savepoint
1140: 5f 6f 70 74 20 3a 3a 3d 20 53 41 56 45 50 4f 49  _opt ::= SAVEPOI
1150: 4e 54 2e 0a 73 61 76 65 70 6f 69 6e 74 5f 6f 70  NT..savepoint_op
1160: 74 20 3a 3a 3d 20 2e 0a 63 6d 64 20 3a 3a 3d 20  t ::= ..cmd ::= 
1170: 53 41 56 45 50 4f 49 4e 54 20 6e 6d 28 58 29 2e  SAVEPOINT nm(X).
1180: 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 61 76 65   {.  sqlite3Save
1190: 70 6f 69 6e 74 28 70 50 61 72 73 65 2c 20 53 41  point(pParse, SA
11a0: 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 26  VEPOINT_BEGIN, &
11b0: 58 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45  X);.}.cmd ::= RE
11c0: 4c 45 41 53 45 20 73 61 76 65 70 6f 69 6e 74 5f  LEASE savepoint_
11d0: 6f 70 74 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73  opt nm(X). {.  s
11e0: 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
11f0: 70 50 61 72 73 65 2c 20 53 41 56 45 50 4f 49 4e  pParse, SAVEPOIN
1200: 54 5f 52 45 4c 45 41 53 45 2c 20 26 58 29 3b 0a  T_RELEASE, &X);.
1210: 7d 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c 4c 42 41  }.cmd ::= ROLLBA
1220: 43 4b 20 74 72 61 6e 73 5f 6f 70 74 20 54 4f 20  CK trans_opt TO 
1230: 73 61 76 65 70 6f 69 6e 74 5f 6f 70 74 20 6e 6d  savepoint_opt nm
1240: 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (X). {.  sqlite3
1250: 53 61 76 65 70 6f 69 6e 74 28 70 50 61 72 73 65  Savepoint(pParse
1260: 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
1270: 42 41 43 4b 2c 20 26 58 29 3b 0a 7d 0a 0a 2f 2f  BACK, &X);.}..//
1280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1290: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 54  /// The CREATE T
12a0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2f  ABLE statement /
12b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
12c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
12d0: 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61  md ::= create_ta
12e0: 62 6c 65 20 63 72 65 61 74 65 5f 74 61 62 6c 65  ble create_table
12f0: 5f 61 72 67 73 2e 0a 63 72 65 61 74 65 5f 74 61  _args..create_ta
1300: 62 6c 65 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77  ble ::= createkw
1310: 20 74 65 6d 70 28 54 29 20 54 41 42 4c 45 20 69   temp(T) TABLE i
1320: 66 6e 6f 74 65 78 69 73 74 73 28 45 29 20 6e 6d  fnotexists(E) nm
1330: 28 59 29 20 64 62 6e 6d 28 5a 29 2e 20 7b 0a 20  (Y) dbnm(Z). {. 
1340: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
1350: 62 6c 65 28 70 50 61 72 73 65 2c 26 59 2c 26 5a  ble(pParse,&Y,&Z
1360: 2c 54 2c 30 2c 30 2c 45 29 3b 0a 7d 0a 63 72 65  ,T,0,0,E);.}.cre
1370: 61 74 65 6b 77 28 41 29 20 3a 3a 3d 20 43 52 45  atekw(A) ::= CRE
1380: 41 54 45 28 41 29 2e 20 20 7b 64 69 73 61 62 6c  ATE(A).  {disabl
1390: 65 4c 6f 6f 6b 61 73 69 64 65 28 70 50 61 72 73  eLookaside(pPars
13a0: 65 29 3b 7d 0a 0a 25 74 79 70 65 20 69 66 6e 6f  e);}..%type ifno
13b0: 74 65 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66  texists {int}.if
13c0: 6e 6f 74 65 78 69 73 74 73 28 41 29 20 3a 3a 3d  notexists(A) ::=
13d0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13e0: 7b 41 20 3d 20 30 3b 7d 0a 69 66 6e 6f 74 65 78  {A = 0;}.ifnotex
13f0: 69 73 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 4e  ists(A) ::= IF N
1400: 4f 54 20 45 58 49 53 54 53 2e 20 7b 41 20 3d 20  OT EXISTS. {A = 
1410: 31 3b 7d 0a 25 74 79 70 65 20 74 65 6d 70 20 7b  1;}.%type temp {
1420: 69 6e 74 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c  int}.%ifndef SQL
1430: 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
1440: 74 65 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d 50  temp(A) ::= TEMP
1450: 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a 25 65 6e 64  .  {A = 1;}.%end
1460: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
1470: 54 45 4d 50 44 42 0a 74 65 6d 70 28 41 29 20 3a  TEMPDB.temp(A) :
1480: 3a 3d 20 2e 20 20 20 20 20 20 7b 41 20 3d 20 30  := .      {A = 0
1490: 3b 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f  ;}.create_table_
14a0: 61 72 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c 75  args ::= LP colu
14b0: 6d 6e 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74 5f  mnlist conslist_
14c0: 6f 70 74 28 58 29 20 52 50 28 45 29 20 74 61 62  opt(X) RP(E) tab
14d0: 6c 65 5f 6f 70 74 69 6f 6e 73 28 46 29 2e 20 7b  le_options(F). {
14e0: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
14f0: 6c 65 28 70 50 61 72 73 65 2c 26 58 2c 26 45 2c  le(pParse,&X,&E,
1500: 46 2c 30 29 3b 0a 7d 0a 63 72 65 61 74 65 5f 74  F,0);.}.create_t
1510: 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 41 53  able_args ::= AS
1520: 20 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20   select(S). {.  
1530: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
1540: 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 53 29 3b  pParse,0,0,0,S);
1550: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
1560: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
1570: 62 2c 20 53 29 3b 0a 7d 0a 25 74 79 70 65 20 74  b, S);.}.%type t
1580: 61 62 6c 65 5f 6f 70 74 69 6f 6e 73 20 7b 69 6e  able_options {in
1590: 74 7d 0a 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73  t}.table_options
15a0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 7b 41 20  (A) ::= .    {A 
15b0: 3d 20 30 3b 7d 0a 74 61 62 6c 65 5f 6f 70 74 69  = 0;}.table_opti
15c0: 6f 6e 73 28 41 29 20 3a 3a 3d 20 57 49 54 48 4f  ons(A) ::= WITHO
15d0: 55 54 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 69 66  UT nm(X). {.  if
15e0: 28 20 58 2e 6e 3d 3d 35 20 26 26 20 73 71 6c 69  ( X.n==5 && sqli
15f0: 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 58 2e 7a  te3_strnicmp(X.z
1600: 2c 22 72 6f 77 69 64 22 2c 35 29 3d 3d 30 20 29  ,"rowid",5)==0 )
1610: 7b 0a 20 20 20 20 41 20 3d 20 54 46 5f 57 69 74  {.    A = TF_Wit
1620: 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e  houtRowid | TF_N
1630: 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20  oVisibleRowid;. 
1640: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 41 20 3d 20   }else{.    A = 
1650: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  0;.    sqlite3Er
1660: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1670: 75 6e 6b 6e 6f 77 6e 20 74 61 62 6c 65 20 6f 70  unknown table op
1680: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 58 2e 6e  tion: %.*s", X.n
1690: 2c 20 58 2e 7a 29 3b 0a 20 20 7d 0a 7d 0a 63 6f  , X.z);.  }.}.co
16a0: 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c  lumnlist ::= col
16b0: 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63 6f  umnlist COMMA co
16c0: 6c 75 6d 6e 6e 61 6d 65 20 63 61 72 67 6c 69 73  lumnname carglis
16d0: 74 2e 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a  t..columnlist ::
16e0: 3d 20 63 6f 6c 75 6d 6e 6e 61 6d 65 20 63 61 72  = columnname car
16f0: 67 6c 69 73 74 2e 0a 63 6f 6c 75 6d 6e 6e 61 6d  glist..columnnam
1700: 65 28 41 29 20 3a 3a 3d 20 6e 6d 28 41 29 20 74  e(A) ::= nm(A) t
1710: 79 70 65 74 6f 6b 65 6e 28 59 29 2e 20 7b 73 71  ypetoken(Y). {sq
1720: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70  lite3AddColumn(p
1730: 50 61 72 73 65 2c 26 41 2c 26 59 29 3b 7d 0a 0a  Parse,&A,&Y);}..
1740: 2f 2f 20 44 65 63 6c 61 72 65 20 73 6f 6d 65 20  // Declare some 
1750: 74 6f 6b 65 6e 73 20 65 61 72 6c 79 20 69 6e 20  tokens early in 
1760: 6f 72 64 65 72 20 74 6f 20 69 6e 66 6c 75 65 6e  order to influen
1770: 63 65 20 74 68 65 69 72 20 76 61 6c 75 65 73 2c  ce their values,
1780: 20 74 6f 20 0a 2f 2f 20 69 6d 70 72 6f 76 65 20   to .// improve 
1790: 70 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20  performance and 
17a0: 72 65 64 75 63 65 20 74 68 65 20 65 78 65 63 75  reduce the execu
17b0: 74 61 62 6c 65 20 73 69 7a 65 2e 20 20 54 68 65  table size.  The
17c0: 20 67 6f 61 6c 20 68 65 72 65 20 69 73 0a 2f 2f   goal here is.//
17d0: 20 74 6f 20 67 65 74 20 74 68 65 20 22 6a 75 6d   to get the "jum
17e0: 70 22 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e  p" operations in
17f0: 20 49 53 4e 55 4c 4c 20 74 68 72 6f 75 67 68 20   ISNULL through 
1800: 45 53 43 41 50 45 20 74 6f 20 68 61 76 65 20 6e  ESCAPE to have n
1810: 75 6d 65 72 69 63 0a 2f 2f 20 76 61 6c 75 65 73  umeric.// values
1820: 20 74 68 61 74 20 61 72 65 20 65 61 72 6c 79 20   that are early 
1830: 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
1840: 6c 6c 20 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f  ll jump operatio
1850: 6e 73 20 61 72 65 20 63 6c 75 73 74 65 72 65 64  ns are clustered
1860: 0a 2f 2f 20 61 74 20 74 68 65 20 62 65 67 69 6e  .// at the begin
1870: 6e 69 6e 67 2c 20 62 75 74 20 61 6c 73 6f 20 73  ning, but also s
1880: 6f 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 61  o that the compa
1890: 72 69 73 6f 6e 20 74 6f 6b 65 6e 73 20 4e 45 20  rison tokens NE 
18a0: 74 68 72 6f 75 67 68 20 47 45 0a 2f 2f 20 61 72  through GE.// ar
18b0: 65 20 61 73 20 6c 61 72 67 65 20 61 73 20 70 6f  e as large as po
18c0: 73 73 69 62 6c 65 20 73 6f 20 74 68 61 74 20 74  ssible so that t
18d0: 68 65 79 20 61 72 65 20 6e 65 61 72 20 74 6f 20  hey are near to 
18e0: 46 55 4e 43 54 49 4f 4e 2c 20 77 68 69 63 68 20  FUNCTION, which 
18f0: 69 73 20 61 0a 2f 2f 20 74 6f 6b 65 6e 20 73 79  is a.// token sy
1900: 6e 74 68 65 73 69 7a 65 64 20 62 79 20 61 64 64  nthesized by add
1910: 6f 70 63 6f 64 65 73 2e 74 63 6c 2e 0a 2f 2f 0a  opcodes.tcl..//.
1920: 25 74 6f 6b 65 6e 20 41 42 4f 52 54 20 41 43 54  %token ABORT ACT
1930: 49 4f 4e 20 41 46 54 45 52 20 41 4e 41 4c 59 5a  ION AFTER ANALYZ
1940: 45 20 41 53 43 20 41 54 54 41 43 48 20 42 45 46  E ASC ATTACH BEF
1950: 4f 52 45 20 42 45 47 49 4e 20 42 59 20 43 41 53  ORE BEGIN BY CAS
1960: 43 41 44 45 20 43 41 53 54 2e 0a 25 74 6f 6b 65  CADE CAST..%toke
1970: 6e 20 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42  n CONFLICT DATAB
1980: 41 53 45 20 44 45 46 45 52 52 45 44 20 44 45 53  ASE DEFERRED DES
1990: 43 20 44 45 54 41 43 48 20 45 41 43 48 20 45 4e  C DETACH EACH EN
19a0: 44 20 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c  D EXCLUSIVE EXPL
19b0: 41 49 4e 20 46 41 49 4c 2e 0a 25 74 6f 6b 65 6e  AIN FAIL..%token
19c0: 20 4f 52 20 41 4e 44 20 4e 4f 54 20 49 53 20 4d   OR AND NOT IS M
19d0: 41 54 43 48 20 4c 49 4b 45 5f 4b 57 20 42 45 54  ATCH LIKE_KW BET
19e0: 57 45 45 4e 20 49 4e 20 49 53 4e 55 4c 4c 20 4e  WEEN IN ISNULL N
19f0: 4f 54 4e 55 4c 4c 20 4e 45 20 45 51 2e 0a 25 74  OTNULL NE EQ..%t
1a00: 6f 6b 65 6e 20 47 54 20 4c 45 20 4c 54 20 47 45  oken GT LE LT GE
1a10: 20 45 53 43 41 50 45 2e 0a 0a 2f 2f 20 54 68 65   ESCAPE...// The
1a20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 72 65 63   following direc
1a30: 74 69 76 65 20 63 61 75 73 65 73 20 74 6f 6b 65  tive causes toke
1a40: 6e 73 20 41 42 4f 52 54 2c 20 41 46 54 45 52 2c  ns ABORT, AFTER,
1a50: 20 41 53 43 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f   ASC, etc. to.//
1a60: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 49 44 20   fallback to ID 
1a70: 69 66 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74  if they will not
1a80: 20 70 61 72 73 65 20 61 73 20 74 68 65 69 72 20   parse as their 
1a90: 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 2e 0a  original value..
1aa0: 2f 2f 20 54 68 69 73 20 6f 62 76 69 61 74 65 73  // This obviates
1ab0: 20 74 68 65 20 6e 65 65 64 20 66 6f 72 20 74 68   the need for th
1ac0: 65 20 22 69 64 22 20 6e 6f 6e 74 65 72 6d 69 6e  e "id" nontermin
1ad0: 61 6c 2e 0a 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b  al..//.%fallback
1ae0: 20 49 44 0a 20 20 41 42 4f 52 54 20 41 43 54 49   ID.  ABORT ACTI
1af0: 4f 4e 20 41 46 54 45 52 20 41 4e 41 4c 59 5a 45  ON AFTER ANALYZE
1b00: 20 41 53 43 20 41 54 54 41 43 48 20 42 45 46 4f   ASC ATTACH BEFO
1b10: 52 45 20 42 45 47 49 4e 20 42 59 20 43 41 53 43  RE BEGIN BY CASC
1b20: 41 44 45 20 43 41 53 54 20 43 4f 4c 55 4d 4e 4b  ADE CAST COLUMNK
1b30: 57 0a 20 20 43 4f 4e 46 4c 49 43 54 20 44 41 54  W.  CONFLICT DAT
1b40: 41 42 41 53 45 20 44 45 46 45 52 52 45 44 20 44  ABASE DEFERRED D
1b50: 45 53 43 20 44 45 54 41 43 48 20 45 41 43 48 20  ESC DETACH EACH 
1b60: 45 4e 44 20 45 58 43 4c 55 53 49 56 45 20 45 58  END EXCLUSIVE EX
1b70: 50 4c 41 49 4e 20 46 41 49 4c 20 46 4f 52 0a 20  PLAIN FAIL FOR. 
1b80: 20 49 47 4e 4f 52 45 20 49 4d 4d 45 44 49 41 54   IGNORE IMMEDIAT
1b90: 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4e 53 54  E INITIALLY INST
1ba0: 45 41 44 20 4c 49 4b 45 5f 4b 57 20 4d 41 54 43  EAD LIKE_KW MATC
1bb0: 48 20 4e 4f 20 50 4c 41 4e 0a 20 20 51 55 45 52  H NO PLAN.  QUER
1bc0: 59 20 4b 45 59 20 4f 46 20 4f 46 46 53 45 54 20  Y KEY OF OFFSET 
1bd0: 50 52 41 47 4d 41 20 52 41 49 53 45 20 52 45 43  PRAGMA RAISE REC
1be0: 55 52 53 49 56 45 20 52 45 4c 45 41 53 45 20 52  URSIVE RELEASE R
1bf0: 45 50 4c 41 43 45 20 52 45 53 54 52 49 43 54 20  EPLACE RESTRICT 
1c00: 52 4f 57 0a 20 20 52 4f 4c 4c 42 41 43 4b 20 53  ROW.  ROLLBACK S
1c10: 41 56 45 50 4f 49 4e 54 20 54 45 4d 50 20 54 52  AVEPOINT TEMP TR
1c20: 49 47 47 45 52 20 56 41 43 55 55 4d 20 56 49 45  IGGER VACUUM VIE
1c30: 57 20 56 49 52 54 55 41 4c 20 57 49 54 48 20 57  W VIRTUAL WITH W
1c40: 49 54 48 4f 55 54 0a 25 69 66 64 65 66 20 53 51  ITHOUT.%ifdef SQ
1c50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
1c60: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 45 58 43 45  ND_SELECT.  EXCE
1c70: 50 54 20 49 4e 54 45 52 53 45 43 54 20 55 4e 49  PT INTERSECT UNI
1c80: 4f 4e 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45  ON.%endif SQLITE
1c90: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
1ca0: 45 4c 45 43 54 0a 20 20 52 45 49 4e 44 45 58 20  ELECT.  REINDEX 
1cb0: 52 45 4e 41 4d 45 20 43 54 49 4d 45 5f 4b 57 20  RENAME CTIME_KW 
1cc0: 49 46 0a 20 20 2e 0a 25 77 69 6c 64 63 61 72 64  IF.  ..%wildcard
1cd0: 20 41 4e 59 2e 0a 0a 2f 2f 20 44 65 66 69 6e 65   ANY...// Define
1ce0: 20 6f 70 65 72 61 74 6f 72 20 70 72 65 63 65 64   operator preced
1cf0: 65 6e 63 65 20 65 61 72 6c 79 20 73 6f 20 74 68  ence early so th
1d00: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 66  at this is the f
1d10: 69 72 73 74 20 6f 63 63 75 72 72 65 6e 63 65 0a  irst occurrence.
1d20: 2f 2f 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  // of the operat
1d30: 6f 72 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65  or tokens in the
1d40: 20 67 72 61 6d 6d 65 72 2e 20 20 4b 65 65 70 69   grammer.  Keepi
1d50: 6e 67 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  ng the operators
1d60: 20 74 6f 67 65 74 68 65 72 0a 2f 2f 20 63 61 75   together.// cau
1d70: 73 65 73 20 74 68 65 6d 20 74 6f 20 62 65 20 61  ses them to be a
1d80: 73 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  ssigned integer 
1d90: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
1da0: 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 0a  close together,.
1db0: 2f 2f 20 77 68 69 63 68 20 6b 65 65 70 73 20 70  // which keeps p
1dc0: 61 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61  arser tables sma
1dd0: 6c 6c 65 72 2e 0a 2f 2f 0a 2f 2f 20 54 68 65 20  ller..//.// The 
1de0: 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 61 73 73  token values ass
1df0: 69 67 6e 65 64 20 74 6f 20 74 68 65 73 65 20 73  igned to these s
1e00: 79 6d 62 6f 6c 73 20 69 73 20 64 65 74 65 72 6d  ymbols is determ
1e10: 69 6e 65 64 20 62 79 20 74 68 65 20 6f 72 64 65  ined by the orde
1e20: 72 0a 2f 2f 20 69 6e 20 77 68 69 63 68 20 6c 65  r.// in which le
1e30: 6d 6f 6e 20 66 69 72 73 74 20 73 65 65 73 20 74  mon first sees t
1e40: 68 65 6d 2e 20 20 49 74 20 6d 75 73 74 20 62 65  hem.  It must be
1e50: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 49   the case that I
1e60: 53 4e 55 4c 4c 2f 4e 4f 54 4e 55 4c 4c 2c 0a 2f  SNULL/NOTNULL,./
1e70: 2f 20 4e 45 2f 45 51 2c 20 47 54 2f 4c 45 2c 20  / NE/EQ, GT/LE, 
1e80: 61 6e 64 20 47 45 2f 4c 54 20 61 72 65 20 73 65  and GE/LT are se
1e90: 70 61 72 61 74 65 64 20 62 79 20 6f 6e 6c 79 20  parated by only 
1ea0: 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 2e 20  a single value. 
1eb0: 20 53 65 65 0a 2f 2f 20 74 68 65 20 73 71 6c 69   See.// the sqli
1ec0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
1ed0: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
1ee0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1ef0: 69 6f 6e 20 6f 6e 20 74 68 69 73 0a 2f 2f 20 63  ion on this.// c
1f00: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2f 2f 0a 25 6c  onstraint..//.%l
1f10: 65 66 74 20 4f 52 2e 0a 25 6c 65 66 74 20 41 4e  eft OR..%left AN
1f20: 44 2e 0a 25 72 69 67 68 74 20 4e 4f 54 2e 0a 25  D..%right NOT..%
1f30: 6c 65 66 74 20 49 53 20 4d 41 54 43 48 20 4c 49  left IS MATCH LI
1f40: 4b 45 5f 4b 57 20 42 45 54 57 45 45 4e 20 49 4e  KE_KW BETWEEN IN
1f50: 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20   ISNULL NOTNULL 
1f60: 4e 45 20 45 51 2e 0a 25 6c 65 66 74 20 47 54 20  NE EQ..%left GT 
1f70: 4c 45 20 4c 54 20 47 45 2e 0a 25 72 69 67 68 74  LE LT GE..%right
1f80: 20 45 53 43 41 50 45 2e 0a 25 6c 65 66 74 20 42   ESCAPE..%left B
1f90: 49 54 41 4e 44 20 42 49 54 4f 52 20 4c 53 48 49  ITAND BITOR LSHI
1fa0: 46 54 20 52 53 48 49 46 54 2e 0a 25 6c 65 66 74  FT RSHIFT..%left
1fb0: 20 50 4c 55 53 20 4d 49 4e 55 53 2e 0a 25 6c 65   PLUS MINUS..%le
1fc0: 66 74 20 53 54 41 52 20 53 4c 41 53 48 20 52 45  ft STAR SLASH RE
1fd0: 4d 2e 0a 25 6c 65 66 74 20 43 4f 4e 43 41 54 2e  M..%left CONCAT.
1fe0: 0a 25 6c 65 66 74 20 43 4f 4c 4c 41 54 45 2e 0a  .%left COLLATE..
1ff0: 25 72 69 67 68 74 20 42 49 54 4e 4f 54 2e 0a 0a  %right BITNOT...
2000: 2f 2f 20 41 6e 20 49 44 45 4e 54 49 46 49 45 52  // An IDENTIFIER
2010: 20 63 61 6e 20 62 65 20 61 20 67 65 6e 65 72 69   can be a generi
2020: 63 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72  c identifier, or
2030: 20 6f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 0a   one of several.
2040: 2f 2f 20 6b 65 79 77 6f 72 64 73 2e 20 20 41 6e  // keywords.  An
2050: 79 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 6b  y non-standard k
2060: 65 79 77 6f 72 64 20 63 61 6e 20 61 6c 73 6f 20  eyword can also 
2070: 62 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  be an identifier
2080: 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 63 6c 61 73  ..//.%token_clas
2090: 73 20 69 64 20 20 49 44 7c 49 4e 44 45 58 45 44  s id  ID|INDEXED
20a0: 2e 0a 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73 22  ....// And "ids"
20b0: 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 65 72   is an identifer
20c0: 2d 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a 25  -or-string..//.%
20d0: 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 69 64 73 20  token_class ids 
20e0: 20 49 44 7c 53 54 52 49 4e 47 2e 0a 0a 2f 2f 20   ID|STRING...// 
20f0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  The name of a co
2100: 6c 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20 63 61  lumn or table ca
2110: 6e 20 62 65 20 61 6e 79 20 6f 66 20 74 68 65 20  n be any of the 
2120: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a 25 74  following:.//.%t
2130: 79 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e  ype nm {Token}.n
2140: 6d 28 41 29 20 3a 3a 3d 20 69 64 28 41 29 2e 0a  m(A) ::= id(A)..
2150: 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47  nm(A) ::= STRING
2160: 28 41 29 2e 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a  (A)..nm(A) ::= J
2170: 4f 49 4e 5f 4b 57 28 41 29 2e 0a 0a 2f 2f 20 41  OIN_KW(A)...// A
2180: 20 74 79 70 65 74 6f 6b 65 6e 20 69 73 20 72 65   typetoken is re
2190: 61 6c 6c 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  ally zero or mor
21a0: 65 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 66 6f  e tokens that fo
21b0: 72 6d 20 61 20 74 79 70 65 20 6e 61 6d 65 20 73  rm a type name s
21c0: 75 63 68 0a 2f 2f 20 61 73 20 63 61 6e 20 62 65  uch.// as can be
21d0: 20 66 6f 75 6e 64 20 61 66 74 65 72 20 74 68 65   found after the
21e0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20   column name in 
21f0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
2200: 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 20 4d 75 6c  tatement..// Mul
2210: 74 69 70 6c 65 20 74 6f 6b 65 6e 73 20 61 72 65  tiple tokens are
2220: 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 20 74 6f   concatenated to
2230: 20 66 6f 72 6d 20 74 68 65 20 76 61 6c 75 65 20   form the value 
2240: 6f 66 20 74 68 65 20 74 79 70 65 74 6f 6b 65 6e  of the typetoken
2250: 2e 0a 2f 2f 0a 25 74 79 70 65 20 74 79 70 65 74  ..//.%type typet
2260: 6f 6b 65 6e 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70  oken {Token}.typ
2270: 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 2e 20  etoken(A) ::= . 
2280: 20 20 7b 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20    {A.n = 0; A.z 
2290: 3d 20 30 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e 28  = 0;}.typetoken(
22a0: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
22b0: 41 29 2e 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29  A)..typetoken(A)
22c0: 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 41 29   ::= typename(A)
22d0: 20 4c 50 20 73 69 67 6e 65 64 20 52 50 28 59 29   LP signed RP(Y)
22e0: 2e 20 7b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74  . {.  A.n = (int
22f0: 29 28 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 41 2e  )(&Y.z[Y.n] - A.
2300: 7a 29 3b 0a 7d 0a 74 79 70 65 74 6f 6b 65 6e 28  z);.}.typetoken(
2310: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
2320: 41 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d  A) LP signed COM
2330: 4d 41 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e  MA signed RP(Y).
2340: 20 7b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74 29   {.  A.n = (int)
2350: 28 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 41 2e 7a  (&Y.z[Y.n] - A.z
2360: 29 3b 0a 7d 0a 25 74 79 70 65 20 74 79 70 65 6e  );.}.%type typen
2370: 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65  ame {Token}.type
2380: 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73 28  name(A) ::= ids(
2390: 41 29 2e 0a 74 79 70 65 6e 61 6d 65 28 41 29 20  A)..typename(A) 
23a0: 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 41 29 20  ::= typename(A) 
23b0: 69 64 73 28 59 29 2e 20 7b 41 2e 6e 3d 59 2e 6e  ids(Y). {A.n=Y.n
23c0: 2b 28 69 6e 74 29 28 59 2e 7a 2d 41 2e 7a 29 3b  +(int)(Y.z-A.z);
23d0: 7d 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 70 6c 75  }.signed ::= plu
23e0: 73 5f 6e 75 6d 2e 0a 73 69 67 6e 65 64 20 3a 3a  s_num..signed ::
23f0: 3d 20 6d 69 6e 75 73 5f 6e 75 6d 2e 0a 0a 2f 2f  = minus_num...//
2400: 20 22 63 61 72 67 6c 69 73 74 22 20 69 73 20 61   "carglist" is a
2410: 20 6c 69 73 74 20 6f 66 20 61 64 64 69 74 69 6f   list of additio
2420: 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nal constraints 
2430: 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
2440: 74 68 65 0a 2f 2f 20 63 6f 6c 75 6d 6e 20 6e 61  the.// column na
2450: 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 79  me and column ty
2460: 70 65 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  pe in a CREATE T
2470: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
2480: 2f 2f 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20  //.carglist ::= 
2490: 63 61 72 67 6c 69 73 74 20 63 63 6f 6e 73 2e 0a  carglist ccons..
24a0: 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20 2e 0a 63  carglist ::= ..c
24b0: 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54 52 41  cons ::= CONSTRA
24c0: 49 4e 54 20 6e 6d 28 58 29 2e 20 20 20 20 20 20  INT nm(X).      
24d0: 20 20 20 20 20 7b 70 50 61 72 73 65 2d 3e 63 6f       {pParse->co
24e0: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 20 3d 20 58  nstraintName = X
24f0: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46  ;}.ccons ::= DEF
2500: 41 55 4c 54 20 74 65 72 6d 28 58 29 2e 20 20 20  AULT term(X).   
2510: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
2520: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
2530: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63 63  (pParse,&X);}.cc
2540: 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  ons ::= DEFAULT 
2550: 4c 50 20 65 78 70 72 28 58 29 20 52 50 2e 20 20  LP expr(X) RP.  
2560: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44      {sqlite3AddD
2570: 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72  efaultValue(pPar
2580: 73 65 2c 26 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a  se,&X);}.ccons :
2590: 3a 3d 20 44 45 46 41 55 4c 54 20 50 4c 55 53 20  := DEFAULT PLUS 
25a0: 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20 7b  term(X).       {
25b0: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
25c0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58  tValue(pParse,&X
25d0: 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45  );}.ccons ::= DE
25e0: 46 41 55 4c 54 20 4d 49 4e 55 53 28 41 29 20 74  FAULT MINUS(A) t
25f0: 65 72 6d 28 58 29 2e 20 20 20 20 20 20 7b 0a 20  erm(X).      {. 
2600: 20 45 78 70 72 53 70 61 6e 20 76 3b 0a 20 20 76   ExprSpan v;.  v
2610: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
2620: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
2630: 5f 55 4d 49 4e 55 53 2c 20 58 2e 70 45 78 70 72  _UMINUS, X.pExpr
2640: 2c 20 30 29 3b 0a 20 20 76 2e 7a 53 74 61 72 74  , 0);.  v.zStart
2650: 20 3d 20 41 2e 7a 3b 0a 20 20 76 2e 7a 45 6e 64   = A.z;.  v.zEnd
2660: 20 3d 20 58 2e 7a 45 6e 64 3b 0a 20 20 73 71 6c   = X.zEnd;.  sql
2670: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
2680: 6c 75 65 28 70 50 61 72 73 65 2c 26 76 29 3b 0a  lue(pParse,&v);.
2690: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41  }.ccons ::= DEFA
26a0: 55 4c 54 20 69 64 28 58 29 2e 20 20 20 20 20 20  ULT id(X).      
26b0: 20 20 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72          {.  Expr
26c0: 53 70 61 6e 20 76 3b 0a 20 20 73 70 61 6e 45 78  Span v;.  spanEx
26d0: 70 72 28 26 76 2c 20 70 50 61 72 73 65 2c 20 54  pr(&v, pParse, T
26e0: 4b 5f 53 54 52 49 4e 47 2c 20 58 29 3b 0a 20 20  K_STRING, X);.  
26f0: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
2700: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 76  tValue(pParse,&v
2710: 29 3b 0a 7d 0a 0a 2f 2f 20 49 6e 20 61 64 64 69  );.}..// In addi
2720: 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 79 70 65  tion to the type
2730: 20 6e 61 6d 65 2c 20 77 65 20 61 6c 73 6f 20 63   name, we also c
2740: 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 70 72  are about the pr
2750: 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 0a 2f 2f  imary key and.//
2760: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
2770: 6e 74 73 2e 0a 2f 2f 0a 63 63 6f 6e 73 20 3a 3a  nts..//.ccons ::
2780: 3d 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 2e 0a 63  = NULL onconf..c
2790: 63 6f 6e 73 20 3a 3a 3d 20 4e 4f 54 20 4e 55 4c  cons ::= NOT NUL
27a0: 4c 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20  L onconf(R).    
27b0: 7b 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75  {sqlite3AddNotNu
27c0: 6c 6c 28 70 50 61 72 73 65 2c 20 52 29 3b 7d 0a  ll(pParse, R);}.
27d0: 63 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52  ccons ::= PRIMAR
27e0: 59 20 4b 45 59 20 73 6f 72 74 6f 72 64 65 72 28  Y KEY sortorder(
27f0: 5a 29 20 6f 6e 63 6f 6e 66 28 52 29 20 61 75 74  Z) onconf(R) aut
2800: 6f 69 6e 63 28 49 29 2e 0a 20 20 20 20 20 20 20  oinc(I)..       
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
2830: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
2840: 70 50 61 72 73 65 2c 30 2c 52 2c 49 2c 5a 29 3b  pParse,0,R,I,Z);
2850: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51  }.ccons ::= UNIQ
2860: 55 45 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20  UE onconf(R).   
2870: 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74     {sqlite3Creat
2880: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c  eIndex(pParse,0,
2890: 30 2c 30 2c 30 2c 52 2c 30 2c 30 2c 30 2c 30 2c  0,0,0,R,0,0,0,0,
28a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 53 51 4c 49 54 45 5f 49 44 58 54 59      SQLITE_IDXTY
28d0: 50 45 5f 55 4e 49 51 55 45 29 3b 7d 0a 63 63 6f  PE_UNIQUE);}.cco
28e0: 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20  ns ::= CHECK LP 
28f0: 65 78 70 72 28 58 29 20 52 50 2e 20 20 20 7b 73  expr(X) RP.   {s
2900: 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f  qlite3AddCheckCo
2910: 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
2920: 58 2e 70 45 78 70 72 29 3b 7d 0a 63 63 6f 6e 73  X.pExpr);}.ccons
2930: 20 3a 3a 3d 20 52 45 46 45 52 45 4e 43 45 53 20   ::= REFERENCES 
2940: 6e 6d 28 54 29 20 65 69 64 6c 69 73 74 5f 6f 70  nm(T) eidlist_op
2950: 74 28 54 41 29 20 72 65 66 61 72 67 73 28 52 29  t(TA) refargs(R)
2960: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74     {sqlite3Creat
2990: 65 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72  eForeignKey(pPar
29a0: 73 65 2c 30 2c 26 54 2c 54 41 2c 52 29 3b 7d 0a  se,0,&T,TA,R);}.
29b0: 63 63 6f 6e 73 20 3a 3a 3d 20 64 65 66 65 72 5f  ccons ::= defer_
29c0: 73 75 62 63 6c 61 75 73 65 28 44 29 2e 20 20 20  subclause(D).   
29d0: 20 7b 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f   {sqlite3DeferFo
29e0: 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c  reignKey(pParse,
29f0: 44 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43  D);}.ccons ::= C
2a00: 4f 4c 4c 41 54 45 20 69 64 73 28 43 29 2e 20 20  OLLATE ids(C).  
2a10: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
2a20: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 70 50 61  dCollateType(pPa
2a30: 72 73 65 2c 20 26 43 29 3b 7d 0a 0a 2f 2f 20 54  rse, &C);}..// T
2a40: 68 65 20 6f 70 74 69 6f 6e 61 6c 20 41 55 54 4f  he optional AUTO
2a50: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
2a60: 64 0a 25 74 79 70 65 20 61 75 74 6f 69 6e 63 20  d.%type autoinc 
2a70: 7b 69 6e 74 7d 0a 61 75 74 6f 69 6e 63 28 58 29  {int}.autoinc(X)
2a80: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
2a90: 7b 58 20 3d 20 30 3b 7d 0a 61 75 74 6f 69 6e 63  {X = 0;}.autoinc
2aa0: 28 58 29 20 3a 3a 3d 20 41 55 54 4f 49 4e 43 52  (X) ::= AUTOINCR
2ab0: 2e 20 20 7b 58 20 3d 20 31 3b 7d 0a 0a 2f 2f 20  .  {X = 1;}..// 
2ac0: 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
2ad0: 66 20 72 75 6c 65 73 20 70 61 72 73 65 73 20 74  f rules parses t
2ae0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
2af0: 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61  a REFERENCES cla
2b00: 75 73 65 0a 2f 2f 20 74 68 61 74 20 64 65 74 65  use.// that dete
2b10: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 72 65 66  rmine if the ref
2b20: 65 72 65 6e 74 69 61 6c 20 69 6e 74 65 67 72 69  erential integri
2b30: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  ty checking is d
2b40: 65 66 65 72 72 65 64 20 6f 72 0a 2f 2f 20 6f 72  eferred or.// or
2b50: 20 69 6d 6d 65 64 69 61 74 65 20 61 6e 64 20 77   immediate and w
2b60: 68 69 63 68 20 64 65 74 65 72 6d 69 6e 65 20 77  hich determine w
2b70: 68 61 74 20 61 63 74 69 6f 6e 20 74 6f 20 74 61  hat action to ta
2b80: 6b 65 20 69 66 20 61 20 72 65 66 2d 69 6e 74 65  ke if a ref-inte
2b90: 67 0a 2f 2f 20 63 68 65 63 6b 20 66 61 69 6c 73  g.// check fails
2ba0: 2e 0a 2f 2f 0a 25 74 79 70 65 20 72 65 66 61 72  ..//.%type refar
2bb0: 67 73 20 7b 69 6e 74 7d 0a 72 65 66 61 72 67 73  gs {int}.refargs
2bc0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
2bd0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
2be0: 20 4f 45 5f 4e 6f 6e 65 2a 30 78 30 31 30 31 3b   OE_None*0x0101;
2bf0: 20 2f 2a 20 45 56 3a 20 52 2d 31 39 38 30 33 2d   /* EV: R-19803-
2c00: 34 35 38 38 34 20 2a 2f 7d 0a 72 65 66 61 72 67  45884 */}.refarg
2c10: 73 28 41 29 20 3a 3a 3d 20 72 65 66 61 72 67 73  s(A) ::= refargs
2c20: 28 41 29 20 72 65 66 61 72 67 28 59 29 2e 20 7b  (A) refarg(Y). {
2c30: 20 41 20 3d 20 28 41 20 26 20 7e 59 2e 6d 61 73   A = (A & ~Y.mas
2c40: 6b 29 20 7c 20 59 2e 76 61 6c 75 65 3b 20 7d 0a  k) | Y.value; }.
2c50: 25 74 79 70 65 20 72 65 66 61 72 67 20 7b 73 74  %type refarg {st
2c60: 72 75 63 74 20 7b 69 6e 74 20 76 61 6c 75 65 3b  ruct {int value;
2c70: 20 69 6e 74 20 6d 61 73 6b 3b 7d 7d 0a 72 65 66   int mask;}}.ref
2c80: 61 72 67 28 41 29 20 3a 3a 3d 20 4d 41 54 43 48  arg(A) ::= MATCH
2c90: 20 6e 6d 2e 20 20 20 20 20 20 20 20 20 20 20 20   nm.            
2ca0: 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b    { A.value = 0;
2cb0: 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78       A.mask = 0x
2cc0: 30 30 30 30 30 30 3b 20 7d 0a 72 65 66 61 72 67  000000; }.refarg
2cd0: 28 41 29 20 3a 3a 3d 20 4f 4e 20 49 4e 53 45 52  (A) ::= ON INSER
2ce0: 54 20 72 65 66 61 63 74 2e 20 20 20 20 20 20 7b  T refact.      {
2cf0: 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b 20 20 20   A.value = 0;   
2d00: 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30    A.mask = 0x000
2d10: 30 30 30 3b 20 7d 0a 72 65 66 61 72 67 28 41 29  000; }.refarg(A)
2d20: 20 3a 3a 3d 20 4f 4e 20 44 45 4c 45 54 45 20 72   ::= ON DELETE r
2d30: 65 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e  efact(X).   { A.
2d40: 76 61 6c 75 65 20 3d 20 58 3b 20 20 20 20 20 41  value = X;     A
2d50: 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 66 66  .mask = 0x0000ff
2d60: 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a  ; }.refarg(A) ::
2d70: 3d 20 4f 4e 20 55 50 44 41 54 45 20 72 65 66 61  = ON UPDATE refa
2d80: 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c  ct(X).   { A.val
2d90: 75 65 20 3d 20 58 3c 3c 38 3b 20 20 41 2e 6d 61  ue = X<<8;  A.ma
2da0: 73 6b 20 3d 20 30 78 30 30 66 66 30 30 3b 20 7d  sk = 0x00ff00; }
2db0: 0a 25 74 79 70 65 20 72 65 66 61 63 74 20 7b 69  .%type refact {i
2dc0: 6e 74 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a  nt}.refact(A) ::
2dd0: 3d 20 53 45 54 20 4e 55 4c 4c 2e 20 20 20 20 20  = SET NULL.     
2de0: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f           { A = O
2df0: 45 5f 53 65 74 4e 75 6c 6c 3b 20 20 2f 2a 20 45  E_SetNull;  /* E
2e00: 56 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32  V: R-33326-45252
2e10: 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41 29 20 3a   */}.refact(A) :
2e20: 3a 3d 20 53 45 54 20 44 45 46 41 55 4c 54 2e 20  := SET DEFAULT. 
2e30: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
2e40: 4f 45 5f 53 65 74 44 66 6c 74 3b 20 20 2f 2a 20  OE_SetDflt;  /* 
2e50: 45 56 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35  EV: R-33326-4525
2e60: 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41 29 20  2 */}.refact(A) 
2e70: 3a 3a 3d 20 43 41 53 43 41 44 45 2e 20 20 20 20  ::= CASCADE.    
2e80: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
2e90: 20 4f 45 5f 43 61 73 63 61 64 65 3b 20 20 2f 2a   OE_Cascade;  /*
2ea0: 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34 35 32   EV: R-33326-452
2eb0: 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41 29  52 */}.refact(A)
2ec0: 20 3a 3a 3d 20 52 45 53 54 52 49 43 54 2e 20 20   ::= RESTRICT.  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
2ee0: 3d 20 4f 45 5f 52 65 73 74 72 69 63 74 3b 20 2f  = OE_Restrict; /
2ef0: 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34 35  * EV: R-33326-45
2f00: 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41  252 */}.refact(A
2f10: 29 20 3a 3a 3d 20 4e 4f 20 41 43 54 49 4f 4e 2e  ) ::= NO ACTION.
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
2f30: 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 20 20 20 20 20   = OE_None;     
2f40: 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34  /* EV: R-33326-4
2f50: 35 32 35 32 20 2a 2f 7d 0a 25 74 79 70 65 20 64  5252 */}.%type d
2f60: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 20 7b  efer_subclause {
2f70: 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c  int}.defer_subcl
2f80: 61 75 73 65 28 41 29 20 3a 3a 3d 20 4e 4f 54 20  ause(A) ::= NOT 
2f90: 44 45 46 45 52 52 41 42 4c 45 20 69 6e 69 74 5f  DEFERRABLE init_
2fa0: 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70  deferred_pred_op
2fb0: 74 2e 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a  t.     {A = 0;}.
2fc0: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28  defer_subclause(
2fd0: 41 29 20 3a 3a 3d 20 44 45 46 45 52 52 41 42 4c  A) ::= DEFERRABL
2fe0: 45 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f  E init_deferred_
2ff0: 70 72 65 64 5f 6f 70 74 28 58 29 2e 20 20 20 20  pred_opt(X).    
3000: 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 74 79 70 65    {A = X;}.%type
3010: 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70   init_deferred_p
3020: 72 65 64 5f 6f 70 74 20 7b 69 6e 74 7d 0a 69 6e  red_opt {int}.in
3030: 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64  it_deferred_pred
3040: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 69      {A = 0;}.ini
3070: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f  t_deferred_pred_
3080: 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49  opt(A) ::= INITI
3090: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 2e 20 20  ALLY DEFERRED.  
30a0: 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 69 6e 69 74     {A = 1;}.init
30b0: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f  _deferred_pred_o
30c0: 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41  pt(A) ::= INITIA
30d0: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 20 20  LLY IMMEDIATE.  
30e0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 63 6f 6e 73    {A = 0;}..cons
30f0: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
3100: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3110: 20 20 20 20 20 20 20 20 20 20 7b 41 2e 6e 20 3d            {A.n =
3120: 20 30 3b 20 41 2e 7a 20 3d 20 30 3b 7d 0a 63 6f   0; A.z = 0;}.co
3130: 6e 73 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a  nslist_opt(A) ::
3140: 3d 20 43 4f 4d 4d 41 28 41 29 20 63 6f 6e 73 6c  = COMMA(A) consl
3150: 69 73 74 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a  ist..conslist ::
3160: 3d 20 63 6f 6e 73 6c 69 73 74 20 74 63 6f 6e 73  = conslist tcons
3170: 63 6f 6d 6d 61 20 74 63 6f 6e 73 2e 0a 63 6f 6e  comma tcons..con
3180: 73 6c 69 73 74 20 3a 3a 3d 20 74 63 6f 6e 73 2e  slist ::= tcons.
3190: 0a 74 63 6f 6e 73 63 6f 6d 6d 61 20 3a 3a 3d 20  .tconscomma ::= 
31a0: 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20 20 20  COMMA.          
31b0: 20 20 7b 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74    {pParse->const
31c0: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
31d0: 7d 0a 74 63 6f 6e 73 63 6f 6d 6d 61 20 3a 3a 3d  }.tconscomma ::=
31e0: 20 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e   ..tcons ::= CON
31f0: 53 54 52 41 49 4e 54 20 6e 6d 28 58 29 2e 20 20  STRAINT nm(X).  
3200: 20 20 20 20 7b 70 50 61 72 73 65 2d 3e 63 6f 6e      {pParse->con
3210: 73 74 72 61 69 6e 74 4e 61 6d 65 20 3d 20 58 3b  straintName = X;
3220: 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d  }.tcons ::= PRIM
3230: 41 52 59 20 4b 45 59 20 4c 50 20 73 6f 72 74 6c  ARY KEY LP sortl
3240: 69 73 74 28 58 29 20 61 75 74 6f 69 6e 63 28 49  ist(X) autoinc(I
3250: 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a  ) RP onconf(R)..
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 7b 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d   {sqlite3AddPrim
3290: 61 72 79 4b 65 79 28 70 50 61 72 73 65 2c 58 2c  aryKey(pParse,X,
32a0: 52 2c 49 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20 3a  R,I,0);}.tcons :
32b0: 3a 3d 20 55 4e 49 51 55 45 20 4c 50 20 73 6f 72  := UNIQUE LP sor
32c0: 74 6c 69 73 74 28 58 29 20 52 50 20 6f 6e 63 6f  tlist(X) RP onco
32d0: 6e 66 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20  nf(R)..         
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f0: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
3300: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
3310: 73 65 2c 30 2c 30 2c 30 2c 58 2c 52 2c 30 2c 30  se,0,0,0,X,R,0,0
3320: 2c 30 2c 30 2c 0a 20 20 20 20 20 20 20 20 20 20  ,0,0,.          
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
3350: 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e 49 51  ITE_IDXTYPE_UNIQ
3360: 55 45 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20  UE);}.tcons ::= 
3370: 43 48 45 43 4b 20 4c 50 20 65 78 70 72 28 45 29  CHECK LP expr(E)
3380: 20 52 50 20 6f 6e 63 6f 6e 66 2e 0a 20 20 20 20   RP onconf..    
3390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
33b0: 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e  lite3AddCheckCon
33c0: 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 45  straint(pParse,E
33d0: 2e 70 45 78 70 72 29 3b 7d 0a 74 63 6f 6e 73 20  .pExpr);}.tcons 
33e0: 3a 3a 3d 20 46 4f 52 45 49 47 4e 20 4b 45 59 20  ::= FOREIGN KEY 
33f0: 4c 50 20 65 69 64 6c 69 73 74 28 46 41 29 20 52  LP eidlist(FA) R
3400: 50 0a 20 20 20 20 20 20 20 20 20 20 52 45 46 45  P.          REFE
3410: 52 45 4e 43 45 53 20 6e 6d 28 54 29 20 65 69 64  RENCES nm(T) eid
3420: 6c 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66  list_opt(TA) ref
3430: 61 72 67 73 28 52 29 20 64 65 66 65 72 5f 73 75  args(R) defer_su
3440: 62 63 6c 61 75 73 65 5f 6f 70 74 28 44 29 2e 20  bclause_opt(D). 
3450: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
3460: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 70 50  ateForeignKey(pP
3470: 61 72 73 65 2c 20 46 41 2c 20 26 54 2c 20 54 41  arse, FA, &T, TA
3480: 2c 20 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , R);.    sqlite
3490: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
34a0: 28 70 50 61 72 73 65 2c 20 44 29 3b 0a 7d 0a 25  (pParse, D);.}.%
34b0: 74 79 70 65 20 64 65 66 65 72 5f 73 75 62 63 6c  type defer_subcl
34c0: 61 75 73 65 5f 6f 70 74 20 7b 69 6e 74 7d 0a 64  ause_opt {int}.d
34d0: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f  efer_subclause_o
34e0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
3500: 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72 5f 73 75  A = 0;}.defer_su
3510: 62 63 6c 61 75 73 65 5f 6f 70 74 28 41 29 20 3a  bclause_opt(A) :
3520: 3a 3d 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75  := defer_subclau
3530: 73 65 28 41 29 2e 0a 0a 2f 2f 20 54 68 65 20 66  se(A)...// The f
3540: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f  ollowing is a no
3550: 6e 2d 73 74 61 6e 64 61 72 64 20 65 78 74 65 6e  n-standard exten
3560: 73 69 6f 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73  sion that allows
3570: 20 75 73 20 74 6f 20 64 65 63 6c 61 72 65 20 74   us to declare t
3580: 68 65 0a 2f 2f 20 64 65 66 61 75 6c 74 20 62 65  he.// default be
3590: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 72  havior when ther
35a0: 65 20 69 73 20 61 20 63 6f 6e 73 74 72 61 69 6e  e is a constrain
35b0: 74 20 63 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25  t conflict..//.%
35c0: 74 79 70 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74  type onconf {int
35d0: 7d 0a 25 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b  }.%type orconf {
35e0: 69 6e 74 7d 0a 25 74 79 70 65 20 72 65 73 6f 6c  int}.%type resol
35f0: 76 65 74 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63  vetype {int}.onc
3600: 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  onf(A) ::= .    
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f            {A = O
3630: 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 6e 63 6f  E_Default;}.onco
3640: 6e 66 28 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e  nf(A) ::= ON CON
3650: 46 4c 49 43 54 20 72 65 73 6f 6c 76 65 74 79 70  FLICT resolvetyp
3660: 65 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b  e(X).    {A = X;
3670: 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20  }.orconf(A) ::= 
3680: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
36a0: 41 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 7d  A = OE_Default;}
36b0: 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f  .orconf(A) ::= O
36c0: 52 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29  R resolvetype(X)
36d0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
36e0: 20 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76 65 74 79   = X;}.resolvety
36f0: 70 65 28 41 29 20 3a 3a 3d 20 72 61 69 73 65 74  pe(A) ::= raiset
3700: 79 70 65 28 41 29 2e 0a 72 65 73 6f 6c 76 65 74  ype(A)..resolvet
3710: 79 70 65 28 41 29 20 3a 3a 3d 20 49 47 4e 4f 52  ype(A) ::= IGNOR
3720: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
3730: 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 49 67 6e       {A = OE_Ign
3740: 6f 72 65 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70  ore;}.resolvetyp
3750: 65 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45  e(A) ::= REPLACE
3760: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3770: 20 20 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61     {A = OE_Repla
3780: 63 65 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ce;}..//////////
3790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
37a0: 20 54 68 65 20 44 52 4f 50 20 54 41 42 4c 45 20   The DROP TABLE 
37b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
37c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
37d0: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
37e0: 20 44 52 4f 50 20 54 41 42 4c 45 20 69 66 65 78   DROP TABLE ifex
37f0: 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65  ists(E) fullname
3800: 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (X). {.  sqlite3
3810: 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
3820: 2c 20 58 2c 20 30 2c 20 45 29 3b 0a 7d 0a 25 74  , X, 0, E);.}.%t
3830: 79 70 65 20 69 66 65 78 69 73 74 73 20 7b 69 6e  ype ifexists {in
3840: 74 7d 0a 69 66 65 78 69 73 74 73 28 41 29 20 3a  t}.ifexists(A) :
3850: 3a 3d 20 49 46 20 45 58 49 53 54 53 2e 20 20 20  := IF EXISTS.   
3860: 7b 41 20 3d 20 31 3b 7d 0a 69 66 65 78 69 73 74  {A = 1;}.ifexist
3870: 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  s(A) ::= .      
3880: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a        {A = 0;}..
3890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
38a0: 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45  ///// The CREATE
38b0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW 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 0a 2f 2f  /////////////.//
38e0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
38f0: 4f 4d 49 54 5f 56 49 45 57 0a 63 6d 64 20 3a 3a  OMIT_VIEW.cmd ::
3900: 3d 20 63 72 65 61 74 65 6b 77 28 58 29 20 74 65  = createkw(X) te
3910: 6d 70 28 54 29 20 56 49 45 57 20 69 66 6e 6f 74  mp(T) VIEW ifnot
3920: 65 78 69 73 74 73 28 45 29 20 6e 6d 28 59 29 20  exists(E) nm(Y) 
3930: 64 62 6e 6d 28 5a 29 20 65 69 64 6c 69 73 74 5f  dbnm(Z) eidlist_
3940: 6f 70 74 28 43 29 0a 20 20 20 20 20 20 20 20 20  opt(C).         
3950: 20 41 53 20 73 65 6c 65 63 74 28 53 29 2e 20 7b   AS select(S). {
3960: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
3970: 56 69 65 77 28 70 50 61 72 73 65 2c 20 26 58 2c  View(pParse, &X,
3980: 20 26 59 2c 20 26 5a 2c 20 43 2c 20 53 2c 20 54   &Y, &Z, C, S, T
3990: 2c 20 45 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20  , E);.}.cmd ::= 
39a0: 44 52 4f 50 20 56 49 45 57 20 69 66 65 78 69 73  DROP VIEW ifexis
39b0: 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58  ts(E) fullname(X
39c0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72  ). {.  sqlite3Dr
39d0: 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
39e0: 58 2c 20 31 2c 20 45 29 3b 0a 7d 0a 25 65 6e 64  X, 1, E);.}.%end
39f0: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
3a00: 56 49 45 57 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  VIEW..//////////
3a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
3a20: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3a30: 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ent ////////////
3a40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a50: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
3a60: 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b 0a 20   select(X).  {. 
3a70: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
3a80: 20 3d 20 7b 53 52 54 5f 4f 75 74 70 75 74 2c 20   = {SRT_Output, 
3a90: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0, 0, 0, 0, 0};.
3aa0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28    sqlite3Select(
3ab0: 70 50 61 72 73 65 2c 20 58 2c 20 26 64 65 73 74  pParse, X, &dest
3ac0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
3ad0: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
3ae0: 3e 64 62 2c 20 58 29 3b 0a 7d 0a 0a 25 74 79 70  >db, X);.}..%typ
3af0: 65 20 73 65 6c 65 63 74 20 7b 53 65 6c 65 63 74  e select {Select
3b00: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
3b10: 65 6c 65 63 74 20 7b 73 71 6c 69 74 65 33 53 65  elect {sqlite3Se
3b20: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
3b30: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79  e->db, $$);}.%ty
3b40: 70 65 20 73 65 6c 65 63 74 6e 6f 77 69 74 68 20  pe selectnowith 
3b50: 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72  {Select*}.%destr
3b60: 75 63 74 6f 72 20 73 65 6c 65 63 74 6e 6f 77 69  uctor selectnowi
3b70: 74 68 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  th {sqlite3Selec
3b80: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
3b90: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
3ba0: 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65 6c 65 63  oneselect {Selec
3bb0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3bc0: 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71 6c 69 74  oneselect {sqlit
3bd0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
3be0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
3bf0: 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f  ..%include {.  /
3c00: 2a 0a 20 20 2a 2a 20 46 6f 72 20 61 20 63 6f 6d  *.  ** For a com
3c10: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61  pound SELECT sta
3c20: 74 65 6d 65 6e 74 2c 20 6d 61 6b 65 20 73 75 72  tement, make sur
3c30: 65 20 70 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  e p->pPrior->pNe
3c40: 78 74 3d 3d 70 20 66 6f 72 0a 20 20 2a 2a 20 61  xt==p for.  ** a
3c50: 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  ll elements in t
3c60: 68 65 20 6c 69 73 74 2e 20 20 41 6e 64 20 6d 61  he list.  And ma
3c70: 6b 65 20 73 75 72 65 20 6c 69 73 74 20 6c 65 6e  ke sure list len
3c80: 67 74 68 20 64 6f 65 73 20 6e 6f 74 20 65 78 63  gth does not exc
3c90: 65 65 64 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  eed.  ** SQLITE_
3ca0: 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
3cb0: 45 4c 45 43 54 2e 0a 20 20 2a 2f 0a 20 20 73 74  ELECT..  */.  st
3cc0: 61 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 72  atic void parser
3cd0: 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74  DoubleLinkSelect
3ce0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
3cf0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 20 20  Select *p){.    
3d00: 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20 29 7b  if( p->pPrior ){
3d10: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
3d20: 4e 65 78 74 20 3d 20 30 2c 20 2a 70 4c 6f 6f 70  Next = 0, *pLoop
3d30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 78 53 65  ;.      int mxSe
3d40: 6c 65 63 74 2c 20 63 6e 74 20 3d 20 30 3b 0a 20  lect, cnt = 0;. 
3d50: 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70       for(pLoop=p
3d60: 3b 20 70 4c 6f 6f 70 3b 20 70 4e 65 78 74 3d 70  ; pLoop; pNext=p
3d70: 4c 6f 6f 70 2c 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop, pLoop=pLoo
3d80: 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e 74 2b 2b  p->pPrior, cnt++
3d90: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70  ){.        pLoop
3da0: 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65 78 74 3b  ->pNext = pNext;
3db0: 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e  .        pLoop->
3dc0: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 43  selFlags |= SF_C
3dd0: 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20 20 20 7d  ompound;.      }
3de0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 2d 3e 73  .      if( (p->s
3df0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4d 75 6c  elFlags & SF_Mul
3e00: 74 69 56 61 6c 75 65 29 3d 3d 30 20 26 26 20 0a  tiValue)==0 && .
3e10: 20 20 20 20 20 20 20 20 28 6d 78 53 65 6c 65 63          (mxSelec
3e20: 74 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  t = pParse->db->
3e30: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
3e40: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
3e50: 45 43 54 5d 29 3e 30 20 26 26 0a 20 20 20 20 20  ECT])>0 &&.     
3e60: 20 20 20 63 6e 74 3e 6d 78 53 65 6c 65 63 74 0a     cnt>mxSelect.
3e70: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
3e80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3e90: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
3ea0: 6e 79 20 74 65 72 6d 73 20 69 6e 20 63 6f 6d 70  ny terms in comp
3eb0: 6f 75 6e 64 20 53 45 4c 45 43 54 22 29 3b 0a 20  ound SELECT");. 
3ec0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3ed0: 0a 7d 0a 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a  .}..select(A) ::
3ee0: 3d 20 77 69 74 68 28 57 29 20 73 65 6c 65 63 74  = with(W) select
3ef0: 6e 6f 77 69 74 68 28 58 29 2e 20 7b 0a 20 20 53  nowith(X). {.  S
3f00: 65 6c 65 63 74 20 2a 70 20 3d 20 58 3b 0a 20 20  elect *p = X;.  
3f10: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e  if( p ){.    p->
3f20: 70 57 69 74 68 20 3d 20 57 3b 0a 20 20 20 20 70  pWith = W;.    p
3f30: 61 72 73 65 72 44 6f 75 62 6c 65 4c 69 6e 6b 53  arserDoubleLinkS
3f40: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 29  elect(pParse, p)
3f50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
3f60: 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
3f70: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 57 29 3b  (pParse->db, W);
3f80: 0a 20 20 7d 0a 20 20 41 20 3d 20 70 3b 20 2f 2a  .  }.  A = p; /*
3f90: 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 57 2a 2f  A-overwrites-W*/
3fa0: 0a 7d 0a 0a 73 65 6c 65 63 74 6e 6f 77 69 74 68  .}..selectnowith
3fb0: 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63  (A) ::= oneselec
3fc0: 74 28 41 29 2e 0a 25 69 66 6e 64 65 66 20 53 51  t(A)..%ifndef SQ
3fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
3fe0: 4e 44 5f 53 45 4c 45 43 54 0a 73 65 6c 65 63 74  ND_SELECT.select
3ff0: 6e 6f 77 69 74 68 28 41 29 20 3a 3a 3d 20 73 65  nowith(A) ::= se
4000: 6c 65 63 74 6e 6f 77 69 74 68 28 41 29 20 6d 75  lectnowith(A) mu
4010: 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 59 29 20  ltiselect_op(Y) 
4020: 6f 6e 65 73 65 6c 65 63 74 28 5a 29 2e 20 20 7b  oneselect(Z).  {
4030: 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 68 73 20  .  Select *pRhs 
4040: 3d 20 5a 3b 0a 20 20 53 65 6c 65 63 74 20 2a 70  = Z;.  Select *p
4050: 4c 68 73 20 3d 20 41 3b 0a 20 20 69 66 28 20 70  Lhs = A;.  if( p
4060: 52 68 73 20 26 26 20 70 52 68 73 2d 3e 70 50 72  Rhs && pRhs->pPr
4070: 69 6f 72 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  ior ){.    SrcLi
4080: 73 74 20 2a 70 46 72 6f 6d 3b 0a 20 20 20 20 54  st *pFrom;.    T
4090: 6f 6b 65 6e 20 78 3b 0a 20 20 20 20 78 2e 6e 20  oken x;.    x.n 
40a0: 3d 20 30 3b 0a 20 20 20 20 70 61 72 73 65 72 44  = 0;.    parserD
40b0: 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74 28  oubleLinkSelect(
40c0: 70 50 61 72 73 65 2c 20 70 52 68 73 29 3b 0a 20  pParse, pRhs);. 
40d0: 20 20 20 70 46 72 6f 6d 20 3d 20 73 71 6c 69 74     pFrom = sqlit
40e0: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
40f0: 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 30  romTerm(pParse,0
4100: 2c 30 2c 30 2c 26 78 2c 70 52 68 73 2c 30 2c 30  ,0,0,&x,pRhs,0,0
4110: 29 3b 0a 20 20 20 20 70 52 68 73 20 3d 20 73 71  );.    pRhs = sq
4120: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70  lite3SelectNew(p
4130: 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2c 30 2c  Parse,0,pFrom,0,
4140: 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  0,0,0,0,0,0);.  
4150: 7d 0a 20 20 69 66 28 20 70 52 68 73 20 29 7b 0a  }.  if( pRhs ){.
4160: 20 20 20 20 70 52 68 73 2d 3e 6f 70 20 3d 20 28      pRhs->op = (
4170: 75 38 29 59 3b 0a 20 20 20 20 70 52 68 73 2d 3e  u8)Y;.    pRhs->
4180: 70 50 72 69 6f 72 20 3d 20 70 4c 68 73 3b 0a 20  pPrior = pLhs;. 
4190: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
41a0: 68 73 29 20 29 20 70 4c 68 73 2d 3e 73 65 6c 46  hs) ) pLhs->selF
41b0: 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74  lags &= ~SF_Mult
41c0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 70 52 68 73  iValue;.    pRhs
41d0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53  ->selFlags &= ~S
41e0: 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20  F_MultiValue;.  
41f0: 20 20 69 66 28 20 59 21 3d 54 4b 5f 41 4c 4c 20    if( Y!=TK_ALL 
4200: 29 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d  ) pParse->hasCom
4210: 70 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 7d 65 6c  pound = 1;.  }el
4220: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  se{.    sqlite3S
4230: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72  electDelete(pPar
4240: 73 65 2d 3e 64 62 2c 20 70 4c 68 73 29 3b 0a 20  se->db, pLhs);. 
4250: 20 7d 0a 20 20 41 20 3d 20 70 52 68 73 3b 0a 7d   }.  A = pRhs;.}
4260: 0a 25 74 79 70 65 20 6d 75 6c 74 69 73 65 6c 65  .%type multisele
4270: 63 74 5f 6f 70 20 7b 69 6e 74 7d 0a 6d 75 6c 74  ct_op {int}.mult
4280: 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a  iselect_op(A) ::
4290: 3d 20 55 4e 49 4f 4e 28 4f 50 29 2e 20 20 20 20  = UNION(OP).    
42a0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 40 4f           {A = @O
42b0: 50 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  P; /*A-overwrite
42c0: 73 2d 4f 50 2a 2f 7d 0a 6d 75 6c 74 69 73 65 6c  s-OP*/}.multisel
42d0: 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e  ect_op(A) ::= UN
42e0: 49 4f 4e 20 41 4c 4c 2e 20 20 20 20 20 20 20 20  ION ALL.        
42f0: 20 20 20 20 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c       {A = TK_ALL
4300: 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f  ;}.multiselect_o
4310: 70 28 41 29 20 3a 3a 3d 20 45 58 43 45 50 54 7c  p(A) ::= EXCEPT|
4320: 49 4e 54 45 52 53 45 43 54 28 4f 50 29 2e 20 20  INTERSECT(OP).  
4330: 7b 41 20 3d 20 40 4f 50 3b 20 2f 2a 41 2d 6f 76  {A = @OP; /*A-ov
4340: 65 72 77 72 69 74 65 73 2d 4f 50 2a 2f 7d 0a 25  erwrites-OP*/}.%
4350: 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  endif SQLITE_OMI
4360: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
4370: 54 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29 20 3a  T.oneselect(A) :
4380: 3a 3d 20 53 45 4c 45 43 54 28 53 29 20 64 69 73  := SELECT(S) dis
4390: 74 69 6e 63 74 28 44 29 20 73 65 6c 63 6f 6c 6c  tinct(D) selcoll
43a0: 69 73 74 28 57 29 20 66 72 6f 6d 28 58 29 20 77  ist(W) from(X) w
43b0: 68 65 72 65 5f 6f 70 74 28 59 29 0a 20 20 20 20  here_opt(Y).    
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 72 6f               gro
43d0: 75 70 62 79 5f 6f 70 74 28 50 29 20 68 61 76 69  upby_opt(P) havi
43e0: 6e 67 5f 6f 70 74 28 51 29 20 6f 72 64 65 72 62  ng_opt(Q) orderb
43f0: 79 5f 6f 70 74 28 5a 29 20 6c 69 6d 69 74 5f 6f  y_opt(Z) limit_o
4400: 70 74 28 4c 29 2e 20 7b 0a 23 69 66 20 53 45 4c  pt(L). {.#if SEL
4410: 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
4420: 0a 20 20 54 6f 6b 65 6e 20 73 20 3d 20 53 3b 20  .  Token s = S; 
4430: 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 53  /*A-overwrites-S
4440: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 41 20 3d 20  */.#endif.  A = 
4450: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
4460: 28 70 50 61 72 73 65 2c 57 2c 58 2c 59 2c 50 2c  (pParse,W,X,Y,P,
4470: 51 2c 5a 2c 44 2c 4c 2e 70 4c 69 6d 69 74 2c 4c  Q,Z,D,L.pLimit,L
4480: 2e 70 4f 66 66 73 65 74 29 3b 0a 23 69 66 20 53  .pOffset);.#if S
4490: 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c  ELECTTRACE_ENABL
44a0: 45 44 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  ED.  /* Populate
44b0: 20 74 68 65 20 53 65 6c 65 63 74 2e 7a 53 65 6c   the Select.zSel
44c0: 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20 74 68  Name[] string th
44d0: 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 68 65  at is used to he
44e0: 6c 70 20 77 69 74 68 0a 20 20 2a 2a 20 71 75 65  lp with.  ** que
44f0: 72 79 20 70 6c 61 6e 6e 65 72 20 64 65 62 75 67  ry planner debug
4500: 67 69 6e 67 2c 20 74 6f 20 64 69 66 66 65 72 65  ging, to differe
4510: 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 20 6d  ntiate between m
4520: 75 6c 74 69 70 6c 65 20 53 65 6c 65 63 74 0a 20  ultiple Select. 
4530: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 61   ** objects in a
4540: 20 63 6f 6d 70 6c 65 78 20 71 75 65 72 79 2e 0a   complex query..
4550: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
4560: 20 53 45 4c 45 43 54 20 6b 65 79 77 6f 72 64 20   SELECT keyword 
4570: 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  is immediately f
4580: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 2d 73  ollowed by a C-s
4590: 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 2a  tyle comment.  *
45a0: 2a 20 74 68 65 6e 20 65 78 74 72 61 63 74 20 74  * then extract t
45b0: 68 65 20 66 69 72 73 74 20 66 65 77 20 61 6c 70  he first few alp
45c0: 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63  hanumeric charac
45d0: 74 65 72 73 20 66 72 6f 6d 20 77 69 74 68 69 6e  ters from within
45e0: 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6d 6d 65   that.  ** comme
45f0: 6e 74 20 74 6f 20 62 65 20 74 68 65 20 7a 53 65  nt to be the zSe
4600: 6c 4e 61 6d 65 20 76 61 6c 75 65 2e 20 20 4f 74  lName value.  Ot
4610: 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 61 62  herwise, the lab
4620: 65 6c 20 69 73 20 23 4e 20 77 68 65 72 65 0a 20  el is #N where. 
4630: 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65   ** is an intege
4640: 72 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d  r that is increm
4650: 65 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20  ented with each 
4660: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
4670: 20 73 65 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66   seen..  */.  if
4680: 28 20 41 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  ( A!=0 ){.    co
4690: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 2e  nst char *z = s.
46a0: 7a 2b 36 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  z+6;.    int i;.
46b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
46c0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 41 2d 3e 7a  intf(sizeof(A->z
46d0: 53 65 6c 4e 61 6d 65 29 2c 20 41 2d 3e 7a 53 65  SelName), A->zSe
46e0: 6c 4e 61 6d 65 2c 20 22 23 25 64 22 2c 0a 20 20  lName, "#%d",.  
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4700: 20 20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 53 65     ++pParse->nSe
4710: 6c 65 63 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  lect);.    while
4720: 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a 2b  ( z[0]==' ' ) z+
4730: 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  +;.    if( z[0]=
4740: 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2a  ='/' && z[1]=='*
4750: 27 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b 3d 20  ' ){.      z += 
4760: 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
4770: 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b  z[0]==' ' ) z++;
4780: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4790: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
47a0: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20  [i]); i++){}.   
47b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
47c0: 6e 74 66 28 73 69 7a 65 6f 66 28 41 2d 3e 7a 53  ntf(sizeof(A->zS
47d0: 65 6c 4e 61 6d 65 29 2c 20 41 2d 3e 7a 53 65 6c  elName), A->zSel
47e0: 4e 61 6d 65 2c 20 22 25 2e 2a 73 22 2c 20 69 2c  Name, "%.*s", i,
47f0: 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23   z);.    }.  }.#
4800: 65 6e 64 69 66 20 2f 2a 20 53 45 4c 45 43 54 52  endif /* SELECTR
4810: 41 43 45 5f 45 4e 41 42 4c 45 44 20 2a 2f 0a 7d  ACE_ENABLED */.}
4820: 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a  .oneselect(A) ::
4830: 3d 20 76 61 6c 75 65 73 28 41 29 2e 0a 0a 25 74  = values(A)...%t
4840: 79 70 65 20 76 61 6c 75 65 73 20 7b 53 65 6c 65  ype values {Sele
4850: 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  ct*}.%destructor
4860: 20 76 61 6c 75 65 73 20 7b 73 71 6c 69 74 65 33   values {sqlite3
4870: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61  SelectDelete(pPa
4880: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 76  rse->db, $$);}.v
4890: 61 6c 75 65 73 28 41 29 20 3a 3a 3d 20 56 41 4c  alues(A) ::= VAL
48a0: 55 45 53 20 4c 50 20 6e 65 78 70 72 6c 69 73 74  UES LP nexprlist
48b0: 28 58 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20  (X) RP. {.  A = 
48c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
48d0: 28 70 50 61 72 73 65 2c 58 2c 30 2c 30 2c 30 2c  (pParse,X,0,0,0,
48e0: 30 2c 30 2c 53 46 5f 56 61 6c 75 65 73 2c 30 2c  0,0,SF_Values,0,
48f0: 30 29 3b 0a 7d 0a 76 61 6c 75 65 73 28 41 29 20  0);.}.values(A) 
4900: 3a 3a 3d 20 76 61 6c 75 65 73 28 41 29 20 43 4f  ::= values(A) CO
4910: 4d 4d 41 20 4c 50 20 65 78 70 72 6c 69 73 74 28  MMA LP exprlist(
4920: 59 29 20 52 50 2e 20 7b 0a 20 20 53 65 6c 65 63  Y) RP. {.  Selec
4930: 74 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  t *pRight, *pLef
4940: 74 20 3d 20 41 3b 0a 20 20 70 52 69 67 68 74 20  t = A;.  pRight 
4950: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
4960: 65 77 28 70 50 61 72 73 65 2c 59 2c 30 2c 30 2c  ew(pParse,Y,0,0,
4970: 30 2c 30 2c 30 2c 53 46 5f 56 61 6c 75 65 73 7c  0,0,0,SF_Values|
4980: 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 2c 30 2c  SF_MultiValue,0,
4990: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
49a0: 28 70 4c 65 66 74 29 20 29 20 70 4c 65 66 74 2d  (pLeft) ) pLeft-
49b0: 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
49c0: 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 69  _MultiValue;.  i
49d0: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
49e0: 20 70 52 69 67 68 74 2d 3e 6f 70 20 3d 20 54 4b   pRight->op = TK
49f0: 5f 41 4c 4c 3b 0a 20 20 20 20 70 52 69 67 68 74  _ALL;.    pRight
4a00: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4c 65 66 74  ->pPrior = pLeft
4a10: 3b 0a 20 20 20 20 41 20 3d 20 70 52 69 67 68 74  ;.    A = pRight
4a20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 41  ;.  }else{.    A
4a30: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 7d 0a 7d 0a   = pLeft;.  }.}.
4a40: 0a 2f 2f 20 54 68 65 20 22 64 69 73 74 69 6e 63  .// The "distinc
4a50: 74 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 69  t" nonterminal i
4a60: 73 20 74 72 75 65 20 28 31 29 20 69 66 20 74 68  s true (1) if th
4a70: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4a80: 72 64 20 69 73 0a 2f 2f 20 70 72 65 73 65 6e 74  rd is.// present
4a90: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
4aa0: 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2f 2f 0a  f it is not..//.
4ab0: 25 74 79 70 65 20 64 69 73 74 69 6e 63 74 20 7b  %type distinct {
4ac0: 69 6e 74 7d 0a 64 69 73 74 69 6e 63 74 28 41 29  int}.distinct(A)
4ad0: 20 3a 3a 3d 20 44 49 53 54 49 4e 43 54 2e 20 20   ::= DISTINCT.  
4ae0: 20 7b 41 20 3d 20 53 46 5f 44 69 73 74 69 6e 63   {A = SF_Distinc
4af0: 74 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20  t;}.distinct(A) 
4b00: 3a 3a 3d 20 41 4c 4c 2e 20 20 20 20 20 20 20 20  ::= ALL.        
4b10: 7b 41 20 3d 20 53 46 5f 41 6c 6c 3b 7d 0a 64 69  {A = SF_All;}.di
4b20: 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 2e 20  stinct(A) ::= . 
4b30: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
4b40: 3b 7d 0a 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69 73  ;}..// selcollis
4b50: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65  t is a list of e
4b60: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
4b70: 61 72 65 20 74 6f 20 62 65 63 6f 6d 65 20 74 68  are to become th
4b80: 65 20 72 65 74 75 72 6e 0a 2f 2f 20 76 61 6c 75  e return.// valu
4b90: 65 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  es of the SELECT
4ba0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
4bb0: 20 22 2a 22 20 69 6e 20 73 74 61 74 65 6d 65 6e   "*" in statemen
4bc0: 74 73 20 6c 69 6b 65 0a 2f 2f 20 22 53 45 4c 45  ts like.// "SELE
4bd0: 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 20 69  CT * FROM ..." i
4be0: 73 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73  s encoded as a s
4bf0: 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
4c00: 6e 20 77 69 74 68 20 61 6e 0a 2f 2f 20 6f 70 63  n with an.// opc
4c10: 6f 64 65 20 6f 66 20 54 4b 5f 41 53 54 45 52 49  ode of TK_ASTERI
4c20: 53 4b 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 65 6c  SK..//.%type sel
4c30: 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  collist {ExprLis
4c40: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
4c50: 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69  selcollist {sqli
4c60: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4c70: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
4c80: 29 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70 20 7b  );}.%type sclp {
4c90: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
4ca0: 72 75 63 74 6f 72 20 73 63 6c 70 20 7b 73 71 6c  ructor sclp {sql
4cb0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4cc0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
4cd0: 24 29 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d  $);}.sclp(A) ::=
4ce0: 20 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 43   selcollist(A) C
4cf0: 4f 4d 4d 41 2e 0a 73 63 6c 70 28 41 29 20 3a 3a  OMMA..sclp(A) ::
4d00: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d20: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63     {A = 0;}.selc
4d30: 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63  ollist(A) ::= sc
4d40: 6c 70 28 41 29 20 65 78 70 72 28 58 29 20 61 73  lp(A) expr(X) as
4d50: 28 59 29 2e 20 20 20 20 20 7b 0a 20 20 20 41 20  (Y).     {.   A 
4d60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4d70: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
4d80: 41 2c 20 58 2e 70 45 78 70 72 29 3b 0a 20 20 20  A, X.pExpr);.   
4d90: 69 66 28 20 59 2e 6e 3e 30 20 29 20 73 71 6c 69  if( Y.n>0 ) sqli
4da0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
4db0: 6d 65 28 70 50 61 72 73 65 2c 20 41 2c 20 26 59  me(pParse, A, &Y
4dc0: 2c 20 31 29 3b 0a 20 20 20 73 71 6c 69 74 65 33  , 1);.   sqlite3
4dd0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
4de0: 70 50 61 72 73 65 2c 41 2c 26 58 29 3b 0a 7d 0a  pParse,A,&X);.}.
4df0: 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a  selcollist(A) ::
4e00: 3d 20 73 63 6c 70 28 41 29 20 53 54 41 52 2e 20  = sclp(A) STAR. 
4e10: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
4e20: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
4e30: 2d 3e 64 62 2c 20 54 4b 5f 41 53 54 45 52 49 53  ->db, TK_ASTERIS
4e40: 4b 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c  K, 0);.  A = sql
4e50: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
4e60: 6e 64 28 70 50 61 72 73 65 2c 20 41 2c 20 70 29  nd(pParse, A, p)
4e70: 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41  ;.}.selcollist(A
4e80: 29 20 3a 3a 3d 20 73 63 6c 70 28 41 29 20 6e 6d  ) ::= sclp(A) nm
4e90: 28 58 29 20 44 4f 54 20 53 54 41 52 2e 20 7b 0a  (X) DOT STAR. {.
4ea0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
4eb0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
4ec0: 61 72 73 65 2c 20 54 4b 5f 41 53 54 45 52 49 53  arse, TK_ASTERIS
4ed0: 4b 2c 20 30 2c 20 30 29 3b 0a 20 20 45 78 70 72  K, 0, 0);.  Expr
4ee0: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
4ef0: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
4f00: 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c 20 26 58  e->db, TK_ID, &X
4f10: 2c 20 31 29 3b 0a 20 20 45 78 70 72 20 2a 70 44  , 1);.  Expr *pD
4f20: 6f 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ot = sqlite3PExp
4f30: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
4f40: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
4f50: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
4f60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
4f70: 61 72 73 65 2c 41 2c 20 70 44 6f 74 29 3b 0a 7d  arse,A, pDot);.}
4f80: 0a 0a 2f 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22  ..// An option "
4f90: 41 53 20 3c 69 64 3e 22 20 70 68 72 61 73 65 20  AS <id>" phrase 
4fa0: 74 68 61 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  that can follow 
4fb0: 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  one of the expre
4fc0: 73 73 69 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64  ssions that.// d
4fd0: 65 66 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74  efine the result
4fe0: 20 73 65 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20   set, or one of 
4ff0: 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
5000: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f  e FROM clause../
5010: 2f 0a 25 74 79 70 65 20 61 73 20 7b 54 6f 6b 65  /.%type as {Toke
5020: 6e 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 41 53 20  n}.as(X) ::= AS 
5030: 6e 6d 28 59 29 2e 20 20 20 20 7b 58 20 3d 20 59  nm(Y).    {X = Y
5040: 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 69 64 73  ;}.as(X) ::= ids
5050: 28 58 29 2e 0a 61 73 28 58 29 20 3a 3a 3d 20 2e  (X)..as(X) ::= .
5060: 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 2e 6e              {X.n
5070: 20 3d 20 30 3b 20 58 2e 7a 20 3d 20 30 3b 7d 0a   = 0; X.z = 0;}.
5080: 0a 0a 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69  ..%type seltabli
5090: 73 74 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  st {SrcList*}.%d
50a0: 65 73 74 72 75 63 74 6f 72 20 73 65 6c 74 61 62  estructor seltab
50b0: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 53 72 63  list {sqlite3Src
50c0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
50d0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79  e->db, $$);}.%ty
50e0: 70 65 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 53  pe stl_prefix {S
50f0: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  rcList*}.%destru
5100: 63 74 6f 72 20 73 74 6c 5f 70 72 65 66 69 78 20  ctor stl_prefix 
5110: 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  {sqlite3SrcListD
5120: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
5130: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 66 72  , $$);}.%type fr
5140: 6f 6d 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  om {SrcList*}.%d
5150: 65 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b  estructor from {
5160: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
5170: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
5180: 20 24 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f 6d   $$);}..// A com
5190: 70 6c 65 74 65 20 46 52 4f 4d 20 63 6c 61 75 73  plete FROM claus
51a0: 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a 3a  e..//.from(A) ::
51b0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
51c0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 44     {A = sqlite3D
51d0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
51e0: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
51f0: 41 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a  A));}.from(A) ::
5200: 3d 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73  = FROM seltablis
5210: 74 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 58 3b  t(X). {.  A = X;
5220: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
5230: 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 41  tShiftJoinType(A
5240: 29 3b 0a 7d 0a 0a 2f 2f 20 22 73 65 6c 74 61 62  );.}..// "seltab
5250: 6c 69 73 74 22 20 69 73 20 61 20 22 53 65 6c 65  list" is a "Sele
5260: 63 74 20 54 61 62 6c 65 20 4c 69 73 74 22 20 2d  ct Table List" -
5270: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
5280: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
5290: 2f 2f 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73  // in a SELECT s
52a0: 74 61 74 65 6d 65 6e 74 2e 20 20 22 73 74 6c 5f  tatement.  "stl_
52b0: 70 72 65 66 69 78 22 20 69 73 20 61 20 70 72 65  prefix" is a pre
52c0: 66 69 78 20 6f 66 20 74 68 69 73 20 6c 69 73 74  fix of this list
52d0: 2e 0a 2f 2f 0a 73 74 6c 5f 70 72 65 66 69 78 28  ..//.stl_prefix(
52e0: 41 29 20 3a 3a 3d 20 73 65 6c 74 61 62 6c 69 73  A) ::= seltablis
52f0: 74 28 41 29 20 6a 6f 69 6e 6f 70 28 59 29 2e 20  t(A) joinop(Y). 
5300: 20 20 20 7b 0a 20 20 20 69 66 28 20 41 4c 57 41     {.   if( ALWA
5310: 59 53 28 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e  YS(A && A->nSrc>
5320: 30 29 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72  0) ) A->a[A->nSr
5330: 63 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  c-1].fg.jointype
5340: 20 3d 20 28 75 38 29 59 3b 0a 7d 0a 73 74 6c 5f   = (u8)Y;.}.stl_
5350: 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20  prefix(A) ::= . 
5360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5370: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
5380: 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28 41 29  ;}.seltablist(A)
5390: 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28   ::= stl_prefix(
53a0: 41 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 44 29  A) nm(Y) dbnm(D)
53b0: 20 61 73 28 5a 29 20 69 6e 64 65 78 65 64 5f 6f   as(Z) indexed_o
53c0: 70 74 28 49 29 0a 20 20 20 20 20 20 20 20 20 20  pt(I).          
53d0: 20 20 20 20 20 20 20 20 6f 6e 5f 6f 70 74 28 4e          on_opt(N
53e0: 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20  ) using_opt(U). 
53f0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53  {.  A = sqlite3S
5400: 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
5410: 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c 26 59  Term(pParse,A,&Y
5420: 2c 26 44 2c 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20  ,&D,&Z,0,N,U);. 
5430: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49   sqlite3SrcListI
5440: 6e 64 65 78 65 64 42 79 28 70 50 61 72 73 65 2c  ndexedBy(pParse,
5450: 20 41 2c 20 26 49 29 3b 0a 7d 0a 73 65 6c 74 61   A, &I);.}.selta
5460: 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c  blist(A) ::= stl
5470: 5f 70 72 65 66 69 78 28 41 29 20 6e 6d 28 59 29  _prefix(A) nm(Y)
5480: 20 64 62 6e 6d 28 44 29 20 4c 50 20 65 78 70 72   dbnm(D) LP expr
5490: 6c 69 73 74 28 45 29 20 52 50 20 61 73 28 5a 29  list(E) RP as(Z)
54a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
54b0: 20 20 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69     on_opt(N) usi
54c0: 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 41  ng_opt(U). {.  A
54d0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
54e0: 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
54f0: 70 50 61 72 73 65 2c 41 2c 26 59 2c 26 44 2c 26  pParse,A,&Y,&D,&
5500: 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20 73 71 6c 69  Z,0,N,U);.  sqli
5510: 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
5520: 67 73 28 70 50 61 72 73 65 2c 20 41 2c 20 45 29  gs(pParse, A, E)
5530: 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.%ifndef SQLI
5540: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5550: 0a 20 20 73 65 6c 74 61 62 6c 69 73 74 28 41 29  .  seltablist(A)
5560: 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28   ::= stl_prefix(
5570: 41 29 20 4c 50 20 73 65 6c 65 63 74 28 53 29 20  A) LP select(S) 
5580: 52 50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RP.             
5590: 20 20 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f         as(Z) on_
55a0: 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74  opt(N) using_opt
55b0: 28 55 29 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73  (U). {.    A = s
55c0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
55d0: 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
55e0: 73 65 2c 41 2c 30 2c 30 2c 26 5a 2c 53 2c 4e 2c  se,A,0,0,&Z,S,N,
55f0: 55 29 3b 0a 20 20 7d 0a 20 20 73 65 6c 74 61 62  U);.  }.  seltab
5600: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f  list(A) ::= stl_
5610: 70 72 65 66 69 78 28 41 29 20 4c 50 20 73 65 6c  prefix(A) LP sel
5620: 74 61 62 6c 69 73 74 28 46 29 20 52 50 0a 20 20  tablist(F) RP.  
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5640: 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e    as(Z) on_opt(N
5650: 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20  ) using_opt(U). 
5660: 7b 0a 20 20 20 20 69 66 28 20 41 3d 3d 30 20 26  {.    if( A==0 &
5670: 26 20 5a 2e 6e 3d 3d 30 20 26 26 20 4e 3d 3d 30  & Z.n==0 && N==0
5680: 20 26 26 20 55 3d 3d 30 20 29 7b 0a 20 20 20 20   && U==0 ){.    
5690: 20 20 41 20 3d 20 46 3b 0a 20 20 20 20 7d 65 6c    A = F;.    }el
56a0: 73 65 20 69 66 28 20 46 2d 3e 6e 53 72 63 3d 3d  se if( F->nSrc==
56b0: 31 20 29 7b 0a 20 20 20 20 20 20 41 20 3d 20 73  1 ){.      A = s
56c0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
56d0: 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
56e0: 73 65 2c 41 2c 30 2c 30 2c 26 5a 2c 30 2c 4e 2c  se,A,0,0,&Z,0,N,
56f0: 55 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 20  U);.      if( A 
5700: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
5710: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
5720: 70 4e 65 77 20 3d 20 26 41 2d 3e 61 5b 41 2d 3e  pNew = &A->a[A->
5730: 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 20 20 20  nSrc-1];.       
5740: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
5750: 69 74 65 6d 20 2a 70 4f 6c 64 20 3d 20 46 2d 3e  item *pOld = F->
5760: 61 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  a;.        pNew-
5770: 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c 64 2d 3e 7a  >zName = pOld->z
5780: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  Name;.        pN
5790: 65 77 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  ew->zDatabase = 
57a0: 70 4f 6c 64 2d 3e 7a 44 61 74 61 62 61 73 65 3b  pOld->zDatabase;
57b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
57c0: 53 65 6c 65 63 74 20 3d 20 70 4f 6c 64 2d 3e 70  Select = pOld->p
57d0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
57e0: 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 20 3d 20 70 4f  pOld->zName = pO
57f0: 6c 64 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  ld->zDatabase = 
5800: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 2d  0;.        pOld-
5810: 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  >pSelect = 0;.  
5820: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
5830: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
5840: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 46 29 3b  (pParse->db, F);
5850: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5860: 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
5870: 65 72 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ery;.      sqlit
5880: 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
5890: 69 6e 54 79 70 65 28 46 29 3b 0a 20 20 20 20 20  inType(F);.     
58a0: 20 70 53 75 62 71 75 65 72 79 20 3d 20 73 71 6c   pSubquery = sql
58b0: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50  ite3SelectNew(pP
58c0: 61 72 73 65 2c 30 2c 46 2c 30 2c 30 2c 30 2c 30  arse,0,F,0,0,0,0
58d0: 2c 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 2c 30  ,SF_NestedFrom,0
58e0: 2c 30 29 3b 0a 20 20 20 20 20 20 41 20 3d 20 73  ,0);.      A = s
58f0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
5900: 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
5910: 73 65 2c 41 2c 30 2c 30 2c 26 5a 2c 70 53 75 62  se,A,0,0,&Z,pSub
5920: 71 75 65 72 79 2c 4e 2c 55 29 3b 0a 20 20 20 20  query,N,U);.    
5930: 7d 0a 20 20 7d 0a 25 65 6e 64 69 66 20 20 53 51  }.  }.%endif  SQ
5940: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5950: 52 59 0a 0a 25 74 79 70 65 20 64 62 6e 6d 20 7b  RY..%type dbnm {
5960: 54 6f 6b 65 6e 7d 0a 64 62 6e 6d 28 41 29 20 3a  Token}.dbnm(A) :
5970: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 7b 41  := .          {A
5980: 2e 7a 3d 30 3b 20 41 2e 6e 3d 30 3b 7d 0a 64 62  .z=0; A.n=0;}.db
5990: 6e 6d 28 41 29 20 3a 3a 3d 20 44 4f 54 20 6e 6d  nm(A) ::= DOT nm
59a0: 28 58 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25  (X). {A = X;}..%
59b0: 74 79 70 65 20 66 75 6c 6c 6e 61 6d 65 20 7b 53  type fullname {S
59c0: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  rcList*}.%destru
59d0: 63 74 6f 72 20 66 75 6c 6c 6e 61 6d 65 20 7b 73  ctor fullname {s
59e0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
59f0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
5a00: 24 24 29 3b 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41  $$);}.fullname(A
5a10: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 64 62 6e 6d  ) ::= nm(X) dbnm
5a20: 28 59 29 2e 20 20 0a 20 20 20 7b 41 20 3d 20 73  (Y).  .   {A = s
5a30: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
5a40: 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30  end(pParse->db,0
5a50: 2c 26 58 2c 26 59 29 3b 20 2f 2a 41 2d 6f 76 65  ,&X,&Y); /*A-ove
5a60: 72 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 0a 25 74  rwrites-X*/}..%t
5a70: 79 70 65 20 6a 6f 69 6e 6f 70 20 7b 69 6e 74 7d  ype joinop {int}
5a80: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43  .joinop(X) ::= C
5a90: 4f 4d 4d 41 7c 4a 4f 49 4e 2e 20 20 20 20 20 20  OMMA|JOIN.      
5aa0: 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54          { X = JT
5ab0: 5f 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70  _INNER; }.joinop
5ac0: 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28  (X) ::= JOIN_KW(
5ad0: 41 29 20 4a 4f 49 4e 2e 0a 20 20 20 20 20 20 20  A) JOIN..       
5ae0: 20 20 20 20 20 20 20 20 20 20 20 7b 58 20 3d 20             {X = 
5af0: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
5b00: 70 50 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20  pParse,&A,0,0); 
5b10: 20 2f 2a 58 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*X-overwrites-
5b20: 41 2a 2f 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a  A*/}.joinop(X) :
5b30: 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d  := JOIN_KW(A) nm
5b40: 28 42 29 20 4a 4f 49 4e 2e 0a 20 20 20 20 20 20  (B) JOIN..      
5b50: 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 20 3d              {X =
5b60: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
5b70: 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c 30 29  (pParse,&A,&B,0)
5b80: 3b 20 2f 2a 58 2d 6f 76 65 72 77 72 69 74 65 73  ; /*X-overwrites
5b90: 2d 41 2a 2f 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20  -A*/}.joinop(X) 
5ba0: 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e  ::= JOIN_KW(A) n
5bb0: 6d 28 42 29 20 6e 6d 28 43 29 20 4a 4f 49 4e 2e  m(B) nm(C) JOIN.
5bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5bd0: 20 20 20 7b 58 20 3d 20 73 71 6c 69 74 65 33 4a     {X = sqlite3J
5be0: 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26  oinType(pParse,&
5bf0: 41 2c 26 42 2c 26 43 29 3b 2f 2a 58 2d 6f 76 65  A,&B,&C);/*X-ove
5c00: 72 77 72 69 74 65 73 2d 41 2a 2f 7d 0a 0a 25 74  rwrites-A*/}..%t
5c10: 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70 72  ype on_opt {Expr
5c20: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f  *}.%destructor o
5c30: 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  n_opt {sqlite3Ex
5c40: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
5c50: 3e 64 62 2c 20 24 24 29 3b 7d 0a 6f 6e 5f 6f 70  >db, $$);}.on_op
5c60: 74 28 4e 29 20 3a 3a 3d 20 4f 4e 20 65 78 70 72  t(N) ::= ON expr
5c70: 28 45 29 2e 20 20 20 7b 4e 20 3d 20 45 2e 70 45  (E).   {N = E.pE
5c80: 78 70 72 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20  xpr;}.on_opt(N) 
5c90: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
5ca0: 20 20 7b 4e 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 4e    {N = 0;}..// N
5cb0: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 62 6c  ote that this bl
5cc0: 6f 63 6b 20 61 62 75 73 65 73 20 74 68 65 20 54  ock abuses the T
5cd0: 6f 6b 65 6e 20 74 79 70 65 20 6a 75 73 74 20 61  oken type just a
5ce0: 20 6c 69 74 74 6c 65 2e 20 49 66 20 74 68 65 72   little. If ther
5cf0: 65 20 69 73 0a 2f 2f 20 6e 6f 20 22 49 4e 44 45  e is.// no "INDE
5d00: 58 45 44 20 42 59 22 20 63 6c 61 75 73 65 2c 20  XED BY" clause, 
5d10: 74 68 65 20 72 65 74 75 72 6e 65 64 20 74 6f 6b  the returned tok
5d20: 65 6e 20 69 73 20 65 6d 70 74 79 20 28 7a 3d 3d  en is empty (z==
5d30: 30 20 26 26 20 6e 3d 3d 30 29 2e 20 49 66 0a 2f  0 && n==0). If./
5d40: 2f 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  / there is an IN
5d50: 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
5d60: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
5d70: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 61 73 20  is populated as 
5d80: 70 65 72 20 6e 6f 72 6d 61 6c 2c 0a 2f 2f 20 77  per normal,.// w
5d90: 69 74 68 20 7a 20 70 6f 69 6e 74 69 6e 67 20 74  ith z pointing t
5da0: 6f 20 74 68 65 20 74 6f 6b 65 6e 20 64 61 74 61  o the token data
5db0: 20 61 6e 64 20 6e 20 63 6f 6e 74 61 69 6e 69 6e   and n containin
5dc0: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
5dd0: 62 79 74 65 73 0a 2f 2f 20 69 6e 20 74 68 65 20  bytes.// in the 
5de0: 74 6f 6b 65 6e 2e 0a 2f 2f 0a 2f 2f 20 49 66 20  token..//.// If 
5df0: 74 68 65 72 65 20 69 73 20 61 20 22 4e 4f 54 20  there is a "NOT 
5e00: 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 2c  INDEXED" clause,
5e10: 20 74 68 65 6e 20 28 7a 3d 3d 30 20 26 26 20 6e   then (z==0 && n
5e20: 3d 3d 31 29 2c 20 77 68 69 63 68 20 69 73 20 0a  ==1), which is .
5e30: 2f 2f 20 6e 6f 72 6d 61 6c 6c 79 20 69 6c 6c 65  // normally ille
5e40: 67 61 6c 2e 20 54 68 65 20 73 71 6c 69 74 65 33  gal. The sqlite3
5e50: 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
5e60: 28 29 20 66 75 6e 63 74 69 6f 6e 20 0a 2f 2f 20  () function .// 
5e70: 72 65 63 6f 67 6e 69 7a 65 73 20 61 6e 64 20 69  recognizes and i
5e80: 6e 74 65 72 70 72 65 74 73 20 74 68 69 73 20 61  nterprets this a
5e90: 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
5ea0: 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 6e 64 65 78  ..//.%type index
5eb0: 65 64 5f 6f 70 74 20 7b 54 6f 6b 65 6e 7d 0a 69  ed_opt {Token}.i
5ec0: 6e 64 65 78 65 64 5f 6f 70 74 28 41 29 20 3a 3a  ndexed_opt(A) ::
5ed0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
5ee0: 20 20 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d      {A.z=0; A.n=
5ef0: 30 3b 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28  0;}.indexed_opt(
5f00: 41 29 20 3a 3a 3d 20 49 4e 44 45 58 45 44 20 42  A) ::= INDEXED B
5f10: 59 20 6e 6d 28 58 29 2e 20 7b 41 20 3d 20 58 3b  Y nm(X). {A = X;
5f20: 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28 41 29  }.indexed_opt(A)
5f30: 20 3a 3a 3d 20 4e 4f 54 20 49 4e 44 45 58 45 44   ::= NOT INDEXED
5f40: 2e 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20 41  .      {A.z=0; A
5f50: 2e 6e 3d 31 3b 7d 0a 0a 25 74 79 70 65 20 75 73  .n=1;}..%type us
5f60: 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73 74 2a  ing_opt {IdList*
5f70: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 75 73  }.%destructor us
5f80: 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33  ing_opt {sqlite3
5f90: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  IdListDelete(pPa
5fa0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 75  rse->db, $$);}.u
5fb0: 73 69 6e 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20  sing_opt(U) ::= 
5fc0: 55 53 49 4e 47 20 4c 50 20 69 64 6c 69 73 74 28  USING LP idlist(
5fd0: 4c 29 20 52 50 2e 20 20 7b 55 20 3d 20 4c 3b 7d  L) RP.  {U = L;}
5fe0: 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29 20 3a 3a  .using_opt(U) ::
5ff0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
6000: 20 20 20 20 20 20 20 20 20 20 20 7b 55 20 3d 20             {U = 
6010: 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 6f 72 64 65  0;}...%type orde
6020: 72 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73  rby_opt {ExprLis
6030: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
6040: 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b 73 71 6c  orderby_opt {sql
6050: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
6060: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
6070: 24 29 3b 7d 0a 0a 2f 2f 20 74 68 65 20 73 6f 72  $);}..// the sor
6080: 74 6c 69 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e  tlist non-termin
6090: 61 6c 20 73 74 6f 72 65 73 20 61 20 6c 69 73 74  al stores a list
60a0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20 77   of expression w
60b0: 68 65 72 65 20 65 61 63 68 0a 2f 2f 20 65 78 70  here each.// exp
60c0: 72 65 73 73 69 6f 6e 20 69 73 20 6f 70 74 69 6f  ression is optio
60d0: 6e 61 6c 6c 79 20 66 6f 6c 6c 6f 77 65 64 20 62  nally followed b
60e0: 79 20 41 53 43 20 6f 72 20 44 45 53 43 20 74 6f  y ASC or DESC to
60f0: 20 69 6e 64 69 63 61 74 65 20 74 68 65 0a 2f 2f   indicate the.//
6100: 20 73 6f 72 74 20 6f 72 64 65 72 2e 0a 2f 2f 0a   sort order..//.
6110: 25 74 79 70 65 20 73 6f 72 74 6c 69 73 74 20 7b  %type sortlist {
6120: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
6130: 72 75 63 74 6f 72 20 73 6f 72 74 6c 69 73 74 20  ructor sortlist 
6140: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
6150: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6160: 62 2c 20 24 24 29 3b 7d 0a 0a 6f 72 64 65 72 62  b, $$);}..orderb
6170: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  y_opt(A) ::= .  
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
61a0: 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28 41 29 20  .orderby_opt(A) 
61b0: 3a 3a 3d 20 4f 52 44 45 52 20 42 59 20 73 6f 72  ::= ORDER BY sor
61c0: 74 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20 7b  tlist(X).      {
61d0: 41 20 3d 20 58 3b 7d 0a 73 6f 72 74 6c 69 73 74  A = X;}.sortlist
61e0: 28 41 29 20 3a 3a 3d 20 73 6f 72 74 6c 69 73 74  (A) ::= sortlist
61f0: 28 41 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59  (A) COMMA expr(Y
6200: 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20  ) sortorder(Z). 
6210: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
6220: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
6230: 61 72 73 65 2c 41 2c 59 2e 70 45 78 70 72 29 3b  arse,A,Y.pExpr);
6240: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
6250: 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 41  stSetSortOrder(A
6260: 2c 5a 29 3b 0a 7d 0a 73 6f 72 74 6c 69 73 74 28  ,Z);.}.sortlist(
6270: 41 29 20 3a 3a 3d 20 65 78 70 72 28 59 29 20 73  A) ::= expr(Y) s
6280: 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20  ortorder(Z). {. 
6290: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
62a0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
62b0: 65 2c 30 2c 59 2e 70 45 78 70 72 29 3b 20 2f 2a  e,0,Y.pExpr); /*
62c0: 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 59 2a 2f  A-overwrites-Y*/
62d0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
62e0: 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 41  stSetSortOrder(A
62f0: 2c 5a 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73 6f  ,Z);.}..%type so
6300: 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d 0a 0a 73  rtorder {int}..s
6310: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20  ortorder(A) ::= 
6320: 41 53 43 2e 20 20 20 20 20 20 20 20 20 20 20 7b  ASC.           {
6330: 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  A = SQLITE_SO_AS
6340: 43 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29  C;}.sortorder(A)
6350: 20 3a 3a 3d 20 44 45 53 43 2e 20 20 20 20 20 20   ::= DESC.      
6360: 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f      {A = SQLITE_
6370: 53 4f 5f 44 45 53 43 3b 7d 0a 73 6f 72 74 6f 72  SO_DESC;}.sortor
6380: 64 65 72 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  der(A) ::= .    
6390: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53            {A = S
63a0: 51 4c 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e  QLITE_SO_UNDEFIN
63b0: 45 44 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75  ED;}..%type grou
63c0: 70 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73  pby_opt {ExprLis
63d0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
63e0: 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c  groupby_opt {sql
63f0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
6400: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
6410: 24 29 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74  $);}.groupby_opt
6420: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6440: 41 20 3d 20 30 3b 7d 0a 67 72 6f 75 70 62 79 5f  A = 0;}.groupby_
6450: 6f 70 74 28 41 29 20 3a 3a 3d 20 47 52 4f 55 50  opt(A) ::= GROUP
6460: 20 42 59 20 6e 65 78 70 72 6c 69 73 74 28 58 29   BY nexprlist(X)
6470: 2e 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70  . {A = X;}..%typ
6480: 65 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 45 78  e having_opt {Ex
6490: 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pr*}.%destructor
64a0: 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 73 71 6c   having_opt {sql
64b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
64c0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
64d0: 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41 29 20 3a  .having_opt(A) :
64e0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
64f0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 68 61 76      {A = 0;}.hav
6500: 69 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 48  ing_opt(A) ::= H
6510: 41 56 49 4e 47 20 65 78 70 72 28 58 29 2e 20 20  AVING expr(X).  
6520: 7b 41 20 3d 20 58 2e 70 45 78 70 72 3b 7d 0a 0a  {A = X.pExpr;}..
6530: 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74 20  %type limit_opt 
6540: 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61 6c  {struct LimitVal
6550: 7d 0a 0a 2f 2f 20 54 68 65 20 64 65 73 74 72 75  }..// The destru
6560: 63 74 6f 72 20 66 6f 72 20 6c 69 6d 69 74 5f 6f  ctor for limit_o
6570: 70 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 66 69  pt will never fi
6580: 72 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  re in the curren
6590: 74 20 67 72 61 6d 6d 61 72 2e 0a 2f 2f 20 54 68  t grammar..// Th
65a0: 65 20 6c 69 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d  e limit_opt non-
65b0: 74 65 72 6d 69 6e 61 6c 20 6f 6e 6c 79 20 6f 63  terminal only oc
65c0: 63 75 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  curs at the end 
65d0: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 64  of a single prod
65e0: 75 63 74 69 6f 6e 0a 2f 2f 20 72 75 6c 65 20 66  uction.// rule f
65f0: 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  or SELECT statem
6600: 65 6e 74 73 2e 20 20 41 73 20 73 6f 6f 6e 20 61  ents.  As soon a
6610: 73 20 74 68 65 20 72 75 6c 65 20 74 68 61 74 20  s the rule that 
6620: 63 72 65 61 74 65 20 74 68 65 20 0a 2f 2f 20 6c  create the .// l
6630: 69 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72  imit_opt non-ter
6640: 6d 69 6e 61 6c 20 72 65 64 75 63 65 73 2c 20 74  minal reduces, t
6650: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6660: 65 6e 74 20 72 75 6c 65 20 77 69 6c 6c 20 61 6c  ent rule will al
6670: 73 6f 0a 2f 2f 20 72 65 64 75 63 65 2e 20 20 53  so.// reduce.  S
6680: 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
6690: 20 61 20 6c 69 6d 69 74 5f 6f 70 74 20 6e 6f 6e   a limit_opt non
66a0: 2d 74 65 72 6d 69 6e 61 6c 20 6f 6e 20 74 68 65  -terminal on the
66b0: 20 73 74 61 63 6b 20 0a 2f 2f 20 65 78 63 65 70   stack .// excep
66c0: 74 20 61 73 20 61 20 74 72 61 6e 73 69 65 6e 74  t as a transient
66d0: 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  .  So there is n
66e0: 65 76 65 72 20 61 6e 79 74 68 69 6e 67 20 74 6f  ever anything to
66f0: 20 64 65 73 74 72 6f 79 2e 0a 2f 2f 0a 2f 2f 25   destroy..//.//%
6700: 64 65 73 74 72 75 63 74 6f 72 20 6c 69 6d 69 74  destructor limit
6710: 5f 6f 70 74 20 7b 0a 2f 2f 20 20 73 71 6c 69 74  _opt {.//  sqlit
6720: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
6730: 72 73 65 2d 3e 64 62 2c 20 24 24 2e 70 4c 69 6d  rse->db, $$.pLim
6740: 69 74 29 3b 0a 2f 2f 20 20 73 71 6c 69 74 65 33  it);.//  sqlite3
6750: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6760: 65 2d 3e 64 62 2c 20 24 24 2e 70 4f 66 66 73 65  e->db, $$.pOffse
6770: 74 29 3b 0a 2f 2f 7d 0a 6c 69 6d 69 74 5f 6f 70  t);.//}.limit_op
6780: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
67a0: 2e 70 4c 69 6d 69 74 20 3d 20 30 3b 20 41 2e 70  .pLimit = 0; A.p
67b0: 4f 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d  Offset = 0;}.lim
67c0: 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49  it_opt(A) ::= LI
67d0: 4d 49 54 20 65 78 70 72 28 58 29 2e 20 20 20 20  MIT expr(X).    
67e0: 20 20 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20 58     {A.pLimit = X
67f0: 2e 70 45 78 70 72 3b 20 41 2e 70 4f 66 66 73 65  .pExpr; A.pOffse
6800: 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70  t = 0;}.limit_op
6810: 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65  t(A) ::= LIMIT e
6820: 78 70 72 28 58 29 20 4f 46 46 53 45 54 20 65 78  xpr(X) OFFSET ex
6830: 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20  pr(Y). .        
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
6860: 2e 70 4c 69 6d 69 74 20 3d 20 58 2e 70 45 78 70  .pLimit = X.pExp
6870: 72 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 59  r; A.pOffset = Y
6880: 2e 70 45 78 70 72 3b 7d 0a 6c 69 6d 69 74 5f 6f  .pExpr;}.limit_o
6890: 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20  pt(A) ::= LIMIT 
68a0: 65 78 70 72 28 58 29 20 43 4f 4d 4d 41 20 65 78  expr(X) COMMA ex
68b0: 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20  pr(Y). .        
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
68e0: 2e 70 4f 66 66 73 65 74 20 3d 20 58 2e 70 45 78  .pOffset = X.pEx
68f0: 70 72 3b 20 41 2e 70 4c 69 6d 69 74 20 3d 20 59  pr; A.pLimit = Y
6900: 2e 70 45 78 70 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  .pExpr;}..//////
6910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6920: 2f 2f 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54 45  ///// The DELETE
6930: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
6940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6950: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64  ////////.//.%ifd
6960: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6970: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
6980: 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74  IMIT.cmd ::= wit
6990: 68 28 43 29 20 44 45 4c 45 54 45 20 46 52 4f 4d  h(C) DELETE FROM
69a0: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64   fullname(X) ind
69b0: 65 78 65 64 5f 6f 70 74 28 49 29 20 77 68 65 72  exed_opt(I) wher
69c0: 65 5f 6f 70 74 28 57 29 20 0a 20 20 20 20 20 20  e_opt(W) .      
69d0: 20 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 4f 29    orderby_opt(O)
69e0: 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b   limit_opt(L). {
69f0: 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75  .  sqlite3WithPu
6a00: 73 68 28 70 50 61 72 73 65 2c 20 43 2c 20 31 29  sh(pParse, C, 1)
6a10: 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  ;.  sqlite3SrcLi
6a20: 73 74 49 6e 64 65 78 65 64 42 79 28 70 50 61 72  stIndexedBy(pPar
6a30: 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20 57 20  se, X, &I);.  W 
6a40: 3d 20 73 71 6c 69 74 65 33 4c 69 6d 69 74 57 68  = sqlite3LimitWh
6a50: 65 72 65 28 70 50 61 72 73 65 2c 20 58 2c 20 57  ere(pParse, X, W
6a60: 2c 20 4f 2c 20 4c 2e 70 4c 69 6d 69 74 2c 20 4c  , O, L.pLimit, L
6a70: 2e 70 4f 66 66 73 65 74 2c 20 22 44 45 4c 45 54  .pOffset, "DELET
6a80: 45 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  E");.  sqlite3De
6a90: 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c  leteFrom(pParse,
6aa0: 58 2c 57 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 25  X,W);.}.%endif.%
6ab0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
6ac0: 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45  ABLE_UPDATE_DELE
6ad0: 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d  TE_LIMIT.cmd ::=
6ae0: 20 77 69 74 68 28 43 29 20 44 45 4c 45 54 45 20   with(C) DELETE 
6af0: 46 52 4f 4d 20 66 75 6c 6c 6e 61 6d 65 28 58 29  FROM fullname(X)
6b00: 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 20   indexed_opt(I) 
6b10: 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b 0a  where_opt(W). {.
6b20: 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73    sqlite3WithPus
6b30: 68 28 70 50 61 72 73 65 2c 20 43 2c 20 31 29 3b  h(pParse, C, 1);
6b40: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
6b50: 74 49 6e 64 65 78 65 64 42 79 28 70 50 61 72 73  tIndexedBy(pPars
6b60: 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c  e, X, &I);.  sql
6b70: 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 70  ite3DeleteFrom(p
6b80: 50 61 72 73 65 2c 58 2c 57 29 3b 0a 7d 0a 25 65  Parse,X,W);.}.%e
6b90: 6e 64 69 66 0a 0a 25 74 79 70 65 20 77 68 65 72  ndif..%type wher
6ba0: 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64  e_opt {Expr*}.%d
6bb0: 65 73 74 72 75 63 74 6f 72 20 77 68 65 72 65 5f  estructor where_
6bc0: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
6bd0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6be0: 62 2c 20 24 24 29 3b 7d 0a 0a 77 68 65 72 65 5f  b, $$);}..where_
6bf0: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 7b 41 20 3d 20 30 3b 7d 0a 77 68 65 72 65 5f 6f  {A = 0;}.where_o
6c20: 70 74 28 41 29 20 3a 3a 3d 20 57 48 45 52 45 20  pt(A) ::= WHERE 
6c30: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 7b  expr(X).       {
6c40: 41 20 3d 20 58 2e 70 45 78 70 72 3b 7d 0a 0a 2f  A = X.pExpr;}../
6c50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 55 50  ///////// The UP
6c70: 44 41 54 45 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  DATE command ///
6c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
6ca0: 0a 25 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .%ifdef SQLITE_E
6cb0: 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c  NABLE_UPDATE_DEL
6cc0: 45 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a  ETE_LIMIT.cmd ::
6cd0: 3d 20 77 69 74 68 28 43 29 20 55 50 44 41 54 45  = with(C) UPDATE
6ce0: 20 6f 72 63 6f 6e 66 28 52 29 20 66 75 6c 6c 6e   orconf(R) fulln
6cf0: 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f 6f  ame(X) indexed_o
6d00: 70 74 28 49 29 20 53 45 54 20 73 65 74 6c 69 73  pt(I) SET setlis
6d10: 74 28 59 29 0a 20 20 20 20 20 20 20 20 77 68 65  t(Y).        whe
6d20: 72 65 5f 6f 70 74 28 57 29 20 6f 72 64 65 72 62  re_opt(W) orderb
6d30: 79 5f 6f 70 74 28 4f 29 20 6c 69 6d 69 74 5f 6f  y_opt(O) limit_o
6d40: 70 74 28 4c 29 2e 20 20 7b 0a 20 20 73 71 6c 69  pt(L).  {.  sqli
6d50: 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
6d60: 73 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73 71 6c  se, C, 1);.  sql
6d70: 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
6d80: 65 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20  edBy(pParse, X, 
6d90: 26 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  &I);.  sqlite3Ex
6da0: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
6db0: 68 28 70 50 61 72 73 65 2c 59 2c 22 73 65 74 20  h(pParse,Y,"set 
6dc0: 6c 69 73 74 22 29 3b 20 0a 20 20 57 20 3d 20 73  list"); .  W = s
6dd0: 71 6c 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65  qlite3LimitWhere
6de0: 28 70 50 61 72 73 65 2c 20 58 2c 20 57 2c 20 4f  (pParse, X, W, O
6df0: 2c 20 4c 2e 70 4c 69 6d 69 74 2c 20 4c 2e 70 4f  , L.pLimit, L.pO
6e00: 66 66 73 65 74 2c 20 22 55 50 44 41 54 45 22 29  ffset, "UPDATE")
6e10: 3b 0a 20 20 73 71 6c 69 74 65 33 55 70 64 61 74  ;.  sqlite3Updat
6e20: 65 28 70 50 61 72 73 65 2c 58 2c 59 2c 57 2c 52  e(pParse,X,Y,W,R
6e30: 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 25 69 66 6e  );.}.%endif.%ifn
6e40: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6e50: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
6e60: 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69  LIMIT.cmd ::= wi
6e70: 74 68 28 43 29 20 55 50 44 41 54 45 20 6f 72 63  th(C) UPDATE orc
6e80: 6f 6e 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28  onf(R) fullname(
6e90: 58 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49  X) indexed_opt(I
6ea0: 29 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29  ) SET setlist(Y)
6eb0: 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 5f 6f  .        where_o
6ec0: 70 74 28 57 29 2e 20 20 7b 0a 20 20 73 71 6c 69  pt(W).  {.  sqli
6ed0: 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
6ee0: 73 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73 71 6c  se, C, 1);.  sql
6ef0: 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
6f00: 65 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20  edBy(pParse, X, 
6f10: 26 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  &I);.  sqlite3Ex
6f20: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
6f30: 68 28 70 50 61 72 73 65 2c 59 2c 22 73 65 74 20  h(pParse,Y,"set 
6f40: 6c 69 73 74 22 29 3b 20 0a 20 20 73 71 6c 69 74  list"); .  sqlit
6f50: 65 33 55 70 64 61 74 65 28 70 50 61 72 73 65 2c  e3Update(pParse,
6f60: 58 2c 59 2c 57 2c 52 29 3b 0a 7d 0a 25 65 6e 64  X,Y,W,R);.}.%end
6f70: 69 66 0a 0a 25 74 79 70 65 20 73 65 74 6c 69 73  if..%type setlis
6f80: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
6f90: 65 73 74 72 75 63 74 6f 72 20 73 65 74 6c 69 73  estructor setlis
6fa0: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
6fb0: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
6fc0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 73 65 74 6c  >db, $$);}..setl
6fd0: 69 73 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c 69  ist(A) ::= setli
6fe0: 73 74 28 41 29 20 43 4f 4d 4d 41 20 6e 6d 28 58  st(A) COMMA nm(X
6ff0: 29 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a  ) EQ expr(Y). {.
7000: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
7010: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
7020: 73 65 2c 20 41 2c 20 59 2e 70 45 78 70 72 29 3b  se, A, Y.pExpr);
7030: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
7040: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
7050: 2c 20 41 2c 20 26 58 2c 20 31 29 3b 0a 7d 0a 73  , A, &X, 1);.}.s
7060: 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 65  etlist(A) ::= se
7070: 74 6c 69 73 74 28 41 29 20 43 4f 4d 4d 41 20 4c  tlist(A) COMMA L
7080: 50 20 69 64 6c 69 73 74 28 58 29 20 52 50 20 45  P idlist(X) RP E
7090: 51 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 41  Q expr(Y). {.  A
70a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
70b0: 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72 28 70  stAppendVector(p
70c0: 50 61 72 73 65 2c 20 41 2c 20 58 2c 20 59 2e 70  Parse, A, X, Y.p
70d0: 45 78 70 72 29 3b 0a 7d 0a 73 65 74 6c 69 73 74  Expr);.}.setlist
70e0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51  (A) ::= nm(X) EQ
70f0: 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20   expr(Y). {.  A 
7100: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
7110: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
7120: 30 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 73  0, Y.pExpr);.  s
7130: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
7140: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 41 2c  tName(pParse, A,
7150: 20 26 58 2c 20 31 29 3b 0a 7d 0a 73 65 74 6c 69   &X, 1);.}.setli
7160: 73 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 64 6c  st(A) ::= LP idl
7170: 69 73 74 28 58 29 20 52 50 20 45 51 20 65 78 70  ist(X) RP EQ exp
7180: 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  r(Y). {.  A = sq
7190: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
71a0: 65 6e 64 56 65 63 74 6f 72 28 70 50 61 72 73 65  endVector(pParse
71b0: 2c 20 30 2c 20 58 2c 20 59 2e 70 45 78 70 72 29  , 0, X, Y.pExpr)
71c0: 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;.}..///////////
71d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
71e0: 54 68 65 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61  The INSERT comma
71f0: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
7200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7210: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
7220: 77 69 74 68 28 57 29 20 69 6e 73 65 72 74 5f 63  with(W) insert_c
7230: 6d 64 28 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e  md(R) INTO fulln
7240: 61 6d 65 28 58 29 20 69 64 6c 69 73 74 5f 6f 70  ame(X) idlist_op
7250: 74 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e 20  t(F) select(S). 
7260: 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  {.  sqlite3WithP
7270: 75 73 68 28 70 50 61 72 73 65 2c 20 57 2c 20 31  ush(pParse, W, 1
7280: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65  );.  sqlite3Inse
7290: 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53 2c  rt(pParse, X, S,
72a0: 20 46 2c 20 52 29 3b 0a 7d 0a 63 6d 64 20 3a 3a   F, R);.}.cmd ::
72b0: 3d 20 77 69 74 68 28 57 29 20 69 6e 73 65 72 74  = with(W) insert
72c0: 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75 6c  _cmd(R) INTO ful
72d0: 6c 6e 61 6d 65 28 58 29 20 69 64 6c 69 73 74 5f  lname(X) idlist_
72e0: 6f 70 74 28 46 29 20 44 45 46 41 55 4c 54 20 56  opt(F) DEFAULT V
72f0: 41 4c 55 45 53 2e 0a 7b 0a 20 20 73 71 6c 69 74  ALUES..{.  sqlit
7300: 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
7310: 65 2c 20 57 2c 20 31 29 3b 0a 20 20 73 71 6c 69  e, W, 1);.  sqli
7320: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
7330: 2c 20 58 2c 20 30 2c 20 46 2c 20 52 29 3b 0a 7d  , X, 0, F, R);.}
7340: 0a 0a 25 74 79 70 65 20 69 6e 73 65 72 74 5f 63  ..%type insert_c
7350: 6d 64 20 7b 69 6e 74 7d 0a 69 6e 73 65 72 74 5f  md {int}.insert_
7360: 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e 53 45 52  cmd(A) ::= INSER
7370: 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20 20 20 7b  T orconf(R).   {
7380: 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72 74 5f 63  A = R;}.insert_c
7390: 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43  md(A) ::= REPLAC
73a0: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  E.            {A
73b0: 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a   = OE_Replace;}.
73c0: 0a 25 74 79 70 65 20 69 64 6c 69 73 74 5f 6f 70  .%type idlist_op
73d0: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73  t {IdList*}.%des
73e0: 74 72 75 63 74 6f 72 20 69 64 6c 69 73 74 5f 6f  tructor idlist_o
73f0: 70 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73  pt {sqlite3IdLis
7400: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
7410: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
7420: 69 64 6c 69 73 74 20 7b 49 64 4c 69 73 74 2a 7d  idlist {IdList*}
7430: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69 64 6c  .%destructor idl
7440: 69 73 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69  ist {sqlite3IdLi
7450: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
7460: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 69 64 6c 69  >db, $$);}..idli
7470: 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  st_opt(A) ::= . 
7480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7490: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69        {A = 0;}.i
74a0: 64 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  dlist_opt(A) ::=
74b0: 20 4c 50 20 69 64 6c 69 73 74 28 58 29 20 52 50   LP idlist(X) RP
74c0: 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64  .    {A = X;}.id
74d0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 6c 69  list(A) ::= idli
74e0: 73 74 28 41 29 20 43 4f 4d 4d 41 20 6e 6d 28 59  st(A) COMMA nm(Y
74f0: 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  )..    {A = sqli
7500: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
7510: 70 50 61 72 73 65 2d 3e 64 62 2c 41 2c 26 59 29  pParse->db,A,&Y)
7520: 3b 7d 0a 69 64 6c 69 73 74 28 41 29 20 3a 3a 3d  ;}.idlist(A) ::=
7530: 20 6e 6d 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d   nm(Y)..    {A =
7540: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
7550: 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  pend(pParse->db,
7560: 30 2c 26 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77  0,&Y); /*A-overw
7570: 72 69 74 65 73 2d 59 2a 2f 7d 0a 0a 2f 2f 2f 2f  rites-Y*/}..////
7580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7590: 2f 2f 2f 2f 2f 2f 2f 20 45 78 70 72 65 73 73 69  /////// Expressi
75a0: 6f 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 2f 2f  on Processing //
75b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
75c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a  ///////////.//..
75d0: 25 74 79 70 65 20 65 78 70 72 20 7b 45 78 70 72  %type expr {Expr
75e0: 53 70 61 6e 7d 0a 25 64 65 73 74 72 75 63 74 6f  Span}.%destructo
75f0: 72 20 65 78 70 72 20 7b 73 71 6c 69 74 65 33 45  r expr {sqlite3E
7600: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
7610: 2d 3e 64 62 2c 20 24 24 2e 70 45 78 70 72 29 3b  ->db, $$.pExpr);
7620: 7d 0a 25 74 79 70 65 20 74 65 72 6d 20 7b 45 78  }.%type term {Ex
7630: 70 72 53 70 61 6e 7d 0a 25 64 65 73 74 72 75 63  prSpan}.%destruc
7640: 74 6f 72 20 74 65 72 6d 20 7b 73 71 6c 69 74 65  tor term {sqlite
7650: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
7660: 73 65 2d 3e 64 62 2c 20 24 24 2e 70 45 78 70 72  se->db, $$.pExpr
7670: 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a  );}..%include {.
7680: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 75    /* This is a u
7690: 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 75  tility routine u
76a0: 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 45  sed to set the E
76b0: 78 70 72 53 70 61 6e 2e 7a 53 74 61 72 74 20 61  xprSpan.zStart a
76c0: 6e 64 0a 20 20 2a 2a 20 45 78 70 72 53 70 61 6e  nd.  ** ExprSpan
76d0: 2e 7a 45 6e 64 20 76 61 6c 75 65 73 20 6f 66 20  .zEnd values of 
76e0: 70 4f 75 74 20 73 6f 20 74 68 61 74 20 74 68 65  pOut so that the
76f0: 20 73 70 61 6e 20 63 6f 76 65 72 73 20 74 68 65   span covers the
7700: 20 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 20 72   complete.  ** r
7710: 61 6e 67 65 20 6f 66 20 74 65 78 74 20 62 65 67  ange of text beg
7720: 69 6e 6e 69 6e 67 20 77 69 74 68 20 70 53 74 61  inning with pSta
7730: 72 74 20 61 6e 64 20 67 6f 69 6e 67 20 74 6f 20  rt and going to 
7740: 74 68 65 20 65 6e 64 20 6f 66 20 70 45 6e 64 2e  the end of pEnd.
7750: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  .  */.  static v
7760: 6f 69 64 20 73 70 61 6e 53 65 74 28 45 78 70 72  oid spanSet(Expr
7770: 53 70 61 6e 20 2a 70 4f 75 74 2c 20 54 6f 6b 65  Span *pOut, Toke
7780: 6e 20 2a 70 53 74 61 72 74 2c 20 54 6f 6b 65 6e  n *pStart, Token
7790: 20 2a 70 45 6e 64 29 7b 0a 20 20 20 20 70 4f 75   *pEnd){.    pOu
77a0: 74 2d 3e 7a 53 74 61 72 74 20 3d 20 70 53 74 61  t->zStart = pSta
77b0: 72 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 75 74 2d  rt->z;.    pOut-
77c0: 3e 7a 45 6e 64 20 3d 20 26 70 45 6e 64 2d 3e 7a  >zEnd = &pEnd->z
77d0: 5b 70 45 6e 64 2d 3e 6e 5d 3b 0a 20 20 7d 0a 0a  [pEnd->n];.  }..
77e0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
77f0: 20 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74   new Expr object
7800: 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
7810: 64 65 6e 74 69 66 69 65 72 2e 20 20 55 73 65 20  dentifier.  Use 
7820: 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 45 78 70  the.  ** new Exp
7830: 72 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 4f  r to populate pO
7840: 75 74 2e 20 20 53 65 74 20 74 68 65 20 73 70 61  ut.  Set the spa
7850: 6e 20 6f 66 20 70 4f 75 74 20 74 6f 20 62 65 20  n of pOut to be 
7860: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
7870: 20 2a 2a 20 74 68 61 74 20 63 72 65 61 74 65 64   ** that created
7880: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
7890: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  .  */.  static v
78a0: 6f 69 64 20 73 70 61 6e 45 78 70 72 28 45 78 70  oid spanExpr(Exp
78b0: 72 53 70 61 6e 20 2a 70 4f 75 74 2c 20 50 61 72  rSpan *pOut, Par
78c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
78d0: 6f 70 2c 20 54 6f 6b 65 6e 20 74 29 7b 0a 20 20  op, Token t){.  
78e0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
78f0: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e  te3DbMallocRawNN
7900: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
7910: 65 6f 66 28 45 78 70 72 29 2b 74 2e 6e 2b 31 29  eof(Expr)+t.n+1)
7920: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
7930: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30       memset(p, 0
7940: 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29 29 3b  , sizeof(Expr));
7950: 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d 20 28  .      p->op = (
7960: 75 38 29 6f 70 3b 0a 20 20 20 20 20 20 70 2d 3e  u8)op;.      p->
7970: 66 6c 61 67 73 20 3d 20 45 50 5f 4c 65 61 66 3b  flags = EP_Leaf;
7980: 0a 20 20 20 20 20 20 70 2d 3e 69 41 67 67 20 3d  .      p->iAgg =
7990: 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 75 2e   -1;.      p->u.
79a0: 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72 2a 29  zToken = (char*)
79b0: 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20 6d 65 6d  &p[1];.      mem
79c0: 63 70 79 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  cpy(p->u.zToken,
79d0: 20 74 2e 7a 2c 20 74 2e 6e 29 3b 0a 20 20 20 20   t.z, t.n);.    
79e0: 20 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 74 2e    p->u.zToken[t.
79f0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  n] = 0;.      if
7a00: 28 20 73 71 6c 69 74 65 33 49 73 71 75 6f 74 65  ( sqlite3Isquote
7a10: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29  (p->u.zToken[0])
7a20: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
7a30: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d  p->u.zToken[0]==
7a40: 27 22 27 20 29 20 70 2d 3e 66 6c 61 67 73 20 7c  '"' ) p->flags |
7a50: 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64 3b 0a  = EP_DblQuoted;.
7a60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7a70: 65 71 75 6f 74 65 28 70 2d 3e 75 2e 7a 54 6f 6b  equote(p->u.zTok
7a80: 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  en);.      }.#if
7a90: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
7aa0: 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 20 20 70  _DEPTH>0.      p
7ab0: 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b 0a 23  ->nHeight = 1;.#
7ac0: 65 6e 64 69 66 20 20 0a 20 20 20 20 7d 0a 20 20  endif  .    }.  
7ad0: 20 20 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20    pOut->pExpr = 
7ae0: 70 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53 74  p;.    pOut->zSt
7af0: 61 72 74 20 3d 20 74 2e 7a 3b 0a 20 20 20 20 70  art = t.z;.    p
7b00: 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 26 74 2e 7a  Out->zEnd = &t.z
7b10: 5b 74 2e 6e 5d 3b 0a 20 20 7d 0a 7d 0a 0a 65 78  [t.n];.  }.}..ex
7b20: 70 72 28 41 29 20 3a 3a 3d 20 74 65 72 6d 28 41  pr(A) ::= term(A
7b30: 29 2e 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c  )..expr(A) ::= L
7b40: 50 28 42 29 20 65 78 70 72 28 58 29 20 52 50 28  P(B) expr(X) RP(
7b50: 45 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  E)..            
7b60: 7b 73 70 61 6e 53 65 74 28 26 41 2c 26 42 2c 26  {spanSet(&A,&B,&
7b70: 45 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  E); /*A-overwrit
7b80: 65 73 2d 42 2a 2f 20 20 41 2e 70 45 78 70 72 20  es-B*/  A.pExpr 
7b90: 3d 20 58 2e 70 45 78 70 72 3b 7d 0a 65 78 70 72  = X.pExpr;}.expr
7ba0: 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 2e 20 20  (A) ::= id(X).  
7bb0: 20 20 20 20 20 20 20 20 7b 73 70 61 6e 45 78 70          {spanExp
7bc0: 72 28 26 41 2c 70 50 61 72 73 65 2c 54 4b 5f 49  r(&A,pParse,TK_I
7bd0: 44 2c 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  D,X); /*A-overwr
7be0: 69 74 65 73 2d 58 2a 2f 7d 0a 65 78 70 72 28 41  ites-X*/}.expr(A
7bf0: 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29  ) ::= JOIN_KW(X)
7c00: 2e 20 20 20 20 20 7b 73 70 61 6e 45 78 70 72 28  .     {spanExpr(
7c10: 26 41 2c 70 50 61 72 73 65 2c 54 4b 5f 49 44 2c  &A,pParse,TK_ID,
7c20: 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  X); /*A-overwrit
7c30: 65 73 2d 58 2a 2f 7d 0a 65 78 70 72 28 41 29 20  es-X*/}.expr(A) 
7c40: 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d  ::= nm(X) DOT nm
7c50: 28 59 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74  (Y). {.  Expr *t
7c60: 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 45 78  emp1 = sqlite3Ex
7c70: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
7c80: 64 62 2c 20 54 4b 5f 49 44 2c 20 26 58 2c 20 31  db, TK_ID, &X, 1
7c90: 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32  );.  Expr *temp2
7ca0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
7cb0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
7cc0: 54 4b 5f 49 44 2c 20 26 59 2c 20 31 29 3b 0a 20  TK_ID, &Y, 1);. 
7cd0: 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c 26   spanSet(&A,&X,&
7ce0: 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  Y); /*A-overwrit
7cf0: 65 73 2d 58 2a 2f 0a 20 20 41 2e 70 45 78 70 72  es-X*/.  A.pExpr
7d00: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
7d10: 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
7d20: 74 65 6d 70 31 2c 20 74 65 6d 70 32 29 3b 0a 7d  temp1, temp2);.}
7d30: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28  .expr(A) ::= nm(
7d40: 58 29 20 44 4f 54 20 6e 6d 28 59 29 20 44 4f 54  X) DOT nm(Y) DOT
7d50: 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 45 78 70 72   nm(Z). {.  Expr
7d60: 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65   *temp1 = sqlite
7d70: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
7d80: 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c 20 26 58  e->db, TK_ID, &X
7d90: 2c 20 31 29 3b 0a 20 20 45 78 70 72 20 2a 74 65  , 1);.  Expr *te
7da0: 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mp2 = sqlite3Exp
7db0: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
7dc0: 62 2c 20 54 4b 5f 49 44 2c 20 26 59 2c 20 31 29  b, TK_ID, &Y, 1)
7dd0: 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 33 20  ;.  Expr *temp3 
7de0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
7df0: 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  oc(pParse->db, T
7e00: 4b 5f 49 44 2c 20 26 5a 2c 20 31 29 3b 0a 20 20  K_ID, &Z, 1);.  
7e10: 45 78 70 72 20 2a 74 65 6d 70 34 20 3d 20 73 71  Expr *temp4 = sq
7e20: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
7e30: 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 32  e, TK_DOT, temp2
7e40: 2c 20 74 65 6d 70 33 29 3b 0a 20 20 73 70 61 6e  , temp3);.  span
7e50: 53 65 74 28 26 41 2c 26 58 2c 26 5a 29 3b 20 2f  Set(&A,&X,&Z); /
7e60: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a  *A-overwrites-X*
7e70: 2f 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71  /.  A.pExpr = sq
7e80: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
7e90: 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31  e, TK_DOT, temp1
7ea0: 2c 20 74 65 6d 70 34 29 3b 0a 7d 0a 74 65 72 6d  , temp4);.}.term
7eb0: 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c 7c 46 4c 4f  (A) ::= NULL|FLO
7ec0: 41 54 7c 42 4c 4f 42 28 58 29 2e 20 7b 73 70 61  AT|BLOB(X). {spa
7ed0: 6e 45 78 70 72 28 26 41 2c 70 50 61 72 73 65 2c  nExpr(&A,pParse,
7ee0: 40 58 2c 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77  @X,X); /*A-overw
7ef0: 72 69 74 65 73 2d 58 2a 2f 7d 0a 74 65 72 6d 28  rites-X*/}.term(
7f00: 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29  A) ::= STRING(X)
7f10: 2e 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e  .          {span
7f20: 45 78 70 72 28 26 41 2c 70 50 61 72 73 65 2c 40  Expr(&A,pParse,@
7f30: 58 2c 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  X,X); /*A-overwr
7f40: 69 74 65 73 2d 58 2a 2f 7d 0a 74 65 72 6d 28 41  ites-X*/}.term(A
7f50: 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 28 58 29  ) ::= INTEGER(X)
7f60: 2e 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20  . {.  A.pExpr = 
7f70: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7f80: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
7f90: 49 4e 54 45 47 45 52 2c 20 26 58 2c 20 31 29 3b  INTEGER, &X, 1);
7fa0: 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e  .  A.zStart = X.
7fb0: 7a 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 58 2e  z;.  A.zEnd = X.
7fc0: 7a 20 2b 20 58 2e 6e 3b 0a 7d 0a 65 78 70 72 28  z + X.n;.}.expr(
7fd0: 41 29 20 3a 3a 3d 20 56 41 52 49 41 42 4c 45 28  A) ::= VARIABLE(
7fe0: 58 29 2e 20 20 20 20 20 7b 0a 20 20 69 66 28 20  X).     {.  if( 
7ff0: 21 28 58 2e 7a 5b 30 5d 3d 3d 27 23 27 20 26 26  !(X.z[0]=='#' &&
8000: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
8010: 58 2e 7a 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20  X.z[1])) ){.    
8020: 75 33 32 20 6e 20 3d 20 58 2e 6e 3b 0a 20 20 20  u32 n = X.n;.   
8030: 20 73 70 61 6e 45 78 70 72 28 26 41 2c 20 70 50   spanExpr(&A, pP
8040: 61 72 73 65 2c 20 54 4b 5f 56 41 52 49 41 42 4c  arse, TK_VARIABL
8050: 45 2c 20 58 29 3b 0a 20 20 20 20 73 71 6c 69 74  E, X);.    sqlit
8060: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
8070: 75 6d 62 65 72 28 70 50 61 72 73 65 2c 20 41 2e  umber(pParse, A.
8080: 70 45 78 70 72 2c 20 6e 29 3b 0a 20 20 7d 65 6c  pExpr, n);.  }el
8090: 73 65 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  se{.    /* When 
80a0: 64 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70  doing a nested p
80b0: 61 72 73 65 2c 20 6f 6e 65 20 63 61 6e 20 69 6e  arse, one can in
80c0: 63 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61  clude terms in a
80d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 20  n expression.   
80e0: 20 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69   ** that look li
80f0: 6b 65 20 74 68 69 73 3a 20 20 20 23 31 20 23 32  ke this:   #1 #2
8100: 20 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d   ...  These term
8110: 73 20 72 65 66 65 72 20 74 6f 20 72 65 67 69 73  s refer to regis
8120: 74 65 72 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74  ters.    ** in t
8130: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
8140: 6e 65 2e 20 20 23 4e 20 69 73 20 74 68 65 20 4e  ne.  #N is the N
8150: 2d 74 68 20 72 65 67 69 73 74 65 72 2e 20 2a 2f  -th register. */
8160: 0a 20 20 20 20 54 6f 6b 65 6e 20 74 20 3d 20 58  .    Token t = X
8170: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
8180: 2d 58 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  -X*/.    assert(
8190: 20 74 2e 6e 3e 3d 32 20 29 3b 0a 20 20 20 20 73   t.n>=2 );.    s
81a0: 70 61 6e 53 65 74 28 26 41 2c 20 26 74 2c 20 26  panSet(&A, &t, &
81b0: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72  t);.    if( pPar
81c0: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b  se->nested==0 ){
81d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
81e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
81f0: 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e  near \"%T\": syn
8200: 74 61 78 20 65 72 72 6f 72 22 2c 20 26 74 29 3b  tax error", &t);
8210: 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d  .      A.pExpr =
8220: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
8230: 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73       A.pExpr = s
8240: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
8250: 73 65 2c 20 54 4b 5f 52 45 47 49 53 54 45 52 2c  se, TK_REGISTER,
8260: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
8270: 28 20 41 2e 70 45 78 70 72 20 29 20 73 71 6c 69  ( A.pExpr ) sqli
8280: 74 65 33 47 65 74 49 6e 74 33 32 28 26 74 2e 7a  te3GetInt32(&t.z
8290: 5b 31 5d 2c 20 26 41 2e 70 45 78 70 72 2d 3e 69  [1], &A.pExpr->i
82a0: 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Table);.    }.  
82b0: 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.}.expr(A) ::= 
82c0: 65 78 70 72 28 41 29 20 43 4f 4c 4c 41 54 45 20  expr(A) COLLATE 
82d0: 69 64 73 28 43 29 2e 20 7b 0a 20 20 41 2e 70 45  ids(C). {.  A.pE
82e0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
82f0: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e  rAddCollateToken
8300: 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72  (pParse, A.pExpr
8310: 2c 20 26 43 2c 20 31 29 3b 0a 20 20 41 2e 7a 45  , &C, 1);.  A.zE
8320: 6e 64 20 3d 20 26 43 2e 7a 5b 43 2e 6e 5d 3b 0a  nd = &C.z[C.n];.
8330: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
8340: 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28  _OMIT_CAST.expr(
8350: 41 29 20 3a 3a 3d 20 43 41 53 54 28 58 29 20 4c  A) ::= CAST(X) L
8360: 50 20 65 78 70 72 28 45 29 20 41 53 20 74 79 70  P expr(E) AS typ
8370: 65 74 6f 6b 65 6e 28 54 29 20 52 50 28 59 29 2e  etoken(T) RP(Y).
8380: 20 7b 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c   {.  spanSet(&A,
8390: 26 58 2c 26 59 29 3b 20 2f 2a 41 2d 6f 76 65 72  &X,&Y); /*A-over
83a0: 77 72 69 74 65 73 2d 58 2a 2f 0a 20 20 41 2e 70  writes-X*/.  A.p
83b0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
83c0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
83d0: 64 62 2c 20 54 4b 5f 43 41 53 54 2c 20 26 54 2c  db, TK_CAST, &T,
83e0: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78   1);.  sqlite3Ex
83f0: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73  prAttachSubtrees
8400: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 41 2e 70  (pParse->db, A.p
8410: 45 78 70 72 2c 20 45 2e 70 45 78 70 72 2c 20 30  Expr, E.pExpr, 0
8420: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  );.}.%endif  SQL
8430: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78  ITE_OMIT_CAST.ex
8440: 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 20  pr(A) ::= id(X) 
8450: 4c 50 20 64 69 73 74 69 6e 63 74 28 44 29 20 65  LP distinct(D) e
8460: 78 70 72 6c 69 73 74 28 59 29 20 52 50 28 45 29  xprlist(Y) RP(E)
8470: 2e 20 7b 0a 20 20 69 66 28 20 59 20 26 26 20 59  . {.  if( Y && Y
8480: 2d 3e 6e 45 78 70 72 3e 70 50 61 72 73 65 2d 3e  ->nExpr>pParse->
8490: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
84a0: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
84b0: 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c  _ARG] ){.    sql
84c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
84d0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  rse, "too many a
84e0: 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63  rguments on func
84f0: 74 69 6f 6e 20 25 54 22 2c 20 26 58 29 3b 0a 20  tion %T", &X);. 
8500: 20 7d 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73   }.  A.pExpr = s
8510: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
8520: 6f 6e 28 70 50 61 72 73 65 2c 20 59 2c 20 26 58  on(pParse, Y, &X
8530: 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c  );.  spanSet(&A,
8540: 26 58 2c 26 45 29 3b 0a 20 20 69 66 28 20 44 3d  &X,&E);.  if( D=
8550: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 26 26 20  =SF_Distinct && 
8560: 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 41  A.pExpr ){.    A
8570: 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d  .pExpr->flags |=
8580: 20 45 50 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   EP_Distinct;.  
8590: 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.}.expr(A) ::= 
85a0: 69 64 28 58 29 20 4c 50 20 53 54 41 52 20 52 50  id(X) LP STAR RP
85b0: 28 45 29 2e 20 7b 0a 20 20 41 2e 70 45 78 70 72  (E). {.  A.pExpr
85c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75   = sqlite3ExprFu
85d0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  nction(pParse, 0
85e0: 2c 20 26 58 29 3b 0a 20 20 73 70 61 6e 53 65 74  , &X);.  spanSet
85f0: 28 26 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 74 65  (&A,&X,&E);.}.te
8600: 72 6d 28 41 29 20 3a 3a 3d 20 43 54 49 4d 45 5f  rm(A) ::= CTIME_
8610: 4b 57 28 4f 50 29 2e 20 7b 0a 20 20 41 2e 70 45  KW(OP). {.  A.pE
8620: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
8630: 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  rFunction(pParse
8640: 2c 20 30 2c 20 26 4f 50 29 3b 0a 20 20 73 70 61  , 0, &OP);.  spa
8650: 6e 53 65 74 28 26 41 2c 20 26 4f 50 2c 20 26 4f  nSet(&A, &OP, &O
8660: 50 29 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 64 65 20  P);.}..%include 
8670: 7b 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  {.  /* This rout
8680: 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73 20 61  ine constructs a
8690: 20 62 69 6e 61 72 79 20 65 78 70 72 65 73 73 69   binary expressi
86a0: 6f 6e 20 6e 6f 64 65 20 6f 75 74 20 6f 66 20 74  on node out of t
86b0: 77 6f 20 45 78 70 72 53 70 61 6e 0a 20 20 2a 2a  wo ExprSpan.  **
86c0: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 75 73 65   objects and use
86d0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20  s the result to 
86e0: 70 6f 70 75 6c 61 74 65 20 61 20 6e 65 77 20 45  populate a new E
86f0: 78 70 72 53 70 61 6e 20 6f 62 6a 65 63 74 2e 0a  xprSpan object..
8700: 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f    */.  static vo
8710: 69 64 20 73 70 61 6e 42 69 6e 61 72 79 45 78 70  id spanBinaryExp
8720: 72 28 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  r(.    Parse *pP
8730: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
8740: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
8750: 74 2e 20 20 45 72 72 6f 72 73 20 61 63 63 75 6d  t.  Errors accum
8760: 75 6c 61 74 65 20 68 65 72 65 20 2a 2f 0a 20 20  ulate here */.  
8770: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
8780: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
8790: 61 72 79 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ary operation */
87a0: 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70  .    ExprSpan *p
87b0: 4c 65 66 74 2c 20 20 20 20 2f 2a 20 54 68 65 20  Left,    /* The 
87c0: 6c 65 66 74 20 6f 70 65 72 61 6e 64 2c 20 61 6e  left operand, an
87d0: 64 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  d output */.    
87e0: 45 78 70 72 53 70 61 6e 20 2a 70 52 69 67 68 74  ExprSpan *pRight
87f0: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
8800: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 29 7b   operand */.  ){
8810: 0a 20 20 20 20 70 4c 65 66 74 2d 3e 70 45 78 70  .    pLeft->pExp
8820: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
8830: 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 70 4c 65  (pParse, op, pLe
8840: 66 74 2d 3e 70 45 78 70 72 2c 20 70 52 69 67 68  ft->pExpr, pRigh
8850: 74 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 70  t->pExpr);.    p
8860: 4c 65 66 74 2d 3e 7a 45 6e 64 20 3d 20 70 52 69  Left->zEnd = pRi
8870: 67 68 74 2d 3e 7a 45 6e 64 3b 0a 20 20 7d 0a 0a  ght->zEnd;.  }..
8880: 20 20 2f 2a 20 49 66 20 64 6f 4e 6f 74 20 69 73    /* If doNot is
8890: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 64 64 20   true, then add 
88a0: 61 20 54 4b 5f 4e 4f 54 20 45 78 70 72 2d 6e 6f  a TK_NOT Expr-no
88b0: 64 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e  de wrapper aroun
88c0: 64 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 73 69  d the.  ** outsi
88d0: 64 65 20 6f 66 20 2a 70 70 45 78 70 72 2e 0a 20  de of *ppExpr.. 
88e0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
88f0: 64 20 65 78 70 72 4e 6f 74 28 50 61 72 73 65 20  d exprNot(Parse 
8900: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 64 6f 4e  *pParse, int doN
8910: 6f 74 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53  ot, ExprSpan *pS
8920: 70 61 6e 29 7b 0a 20 20 20 20 69 66 28 20 64 6f  pan){.    if( do
8930: 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 70 53 70  Not ){.      pSp
8940: 61 6e 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  an->pExpr = sqli
8950: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
8960: 20 54 4b 5f 4e 4f 54 2c 20 70 53 70 61 6e 2d 3e   TK_NOT, pSpan->
8970: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 7d  pExpr, 0);.    }
8980: 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20  .  }.}..expr(A) 
8990: 3a 3a 3d 20 4c 50 28 4c 29 20 6e 65 78 70 72 6c  ::= LP(L) nexprl
89a0: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  ist(X) COMMA exp
89b0: 72 28 59 29 20 52 50 28 52 29 2e 20 7b 0a 20 20  r(Y) RP(R). {.  
89c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
89d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
89e0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
89f0: 58 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 41  X, Y.pExpr);.  A
8a00: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
8a10: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
8a20: 5f 56 45 43 54 4f 52 2c 20 30 2c 20 30 29 3b 0a  _VECTOR, 0, 0);.
8a30: 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29 7b    if( A.pExpr ){
8a40: 0a 20 20 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e  .    A.pExpr->x.
8a50: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
8a60: 20 20 20 73 70 61 6e 53 65 74 28 26 41 2c 20 26     spanSet(&A, &
8a70: 4c 2c 20 26 52 29 3b 0a 20 20 7d 65 6c 73 65 7b  L, &R);.  }else{
8a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
8a90: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
8aa0: 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  e->db, pList);. 
8ab0: 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a   }.}..expr(A) ::
8ac0: 3d 20 65 78 70 72 28 41 29 20 41 4e 44 28 4f 50  = expr(A) AND(OP
8ad0: 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 73  ) expr(Y).    {s
8ae0: 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 70 50  panBinaryExpr(pP
8af0: 61 72 73 65 2c 40 4f 50 2c 26 41 2c 26 59 29 3b  arse,@OP,&A,&Y);
8b00: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
8b10: 70 72 28 41 29 20 4f 52 28 4f 50 29 20 65 78 70  pr(A) OR(OP) exp
8b20: 72 28 59 29 2e 20 20 20 20 20 7b 73 70 61 6e 42  r(Y).     {spanB
8b30: 69 6e 61 72 79 45 78 70 72 28 70 50 61 72 73 65  inaryExpr(pParse
8b40: 2c 40 4f 50 2c 26 41 2c 26 59 29 3b 7d 0a 65 78  ,@OP,&A,&Y);}.ex
8b50: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
8b60: 29 20 4c 54 7c 47 54 7c 47 45 7c 4c 45 28 4f 50  ) LT|GT|GE|LE(OP
8b70: 29 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20  ) expr(Y)..     
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78     {spanBinaryEx
8bb0: 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 26 41  pr(pParse,@OP,&A
8bc0: 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  ,&Y);}.expr(A) :
8bd0: 3a 3d 20 65 78 70 72 28 41 29 20 45 51 7c 4e 45  := expr(A) EQ|NE
8be0: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 7b  (OP) expr(Y).  {
8bf0: 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 70  spanBinaryExpr(p
8c00: 50 61 72 73 65 2c 40 4f 50 2c 26 41 2c 26 59 29  Parse,@OP,&A,&Y)
8c10: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
8c20: 78 70 72 28 41 29 20 42 49 54 41 4e 44 7c 42 49  xpr(A) BITAND|BI
8c30: 54 4f 52 7c 4c 53 48 49 46 54 7c 52 53 48 49 46  TOR|LSHIFT|RSHIF
8c40: 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20  T(OP) expr(Y).. 
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 20 20 20 20 7b 73 70 61 6e 42 69 6e 61         {spanBina
8c80: 72 79 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f  ryExpr(pParse,@O
8c90: 50 2c 26 41 2c 26 59 29 3b 7d 0a 65 78 70 72 28  P,&A,&Y);}.expr(
8ca0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 50  A) ::= expr(A) P
8cb0: 4c 55 53 7c 4d 49 4e 55 53 28 4f 50 29 20 65 78  LUS|MINUS(OP) ex
8cc0: 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20  pr(Y)..         
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8cf0: 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 70  spanBinaryExpr(p
8d00: 50 61 72 73 65 2c 40 4f 50 2c 26 41 2c 26 59 29  Parse,@OP,&A,&Y)
8d10: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
8d20: 78 70 72 28 41 29 20 53 54 41 52 7c 53 4c 41 53  xpr(A) STAR|SLAS
8d30: 48 7c 52 45 4d 28 4f 50 29 20 65 78 70 72 28 59  H|REM(OP) expr(Y
8d40: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d60: 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e             {span
8d70: 42 69 6e 61 72 79 45 78 70 72 28 70 50 61 72 73  BinaryExpr(pPars
8d80: 65 2c 40 4f 50 2c 26 41 2c 26 59 29 3b 7d 0a 65  e,@OP,&A,&Y);}.e
8d90: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
8da0: 41 29 20 43 4f 4e 43 41 54 28 4f 50 29 20 65 78  A) CONCAT(OP) ex
8db0: 70 72 28 59 29 2e 20 7b 73 70 61 6e 42 69 6e 61  pr(Y). {spanBina
8dc0: 72 79 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f  ryExpr(pParse,@O
8dd0: 50 2c 26 41 2c 26 59 29 3b 7d 0a 25 74 79 70 65  P,&A,&Y);}.%type
8de0: 20 6c 69 6b 65 6f 70 20 7b 54 6f 6b 65 6e 7d 0a   likeop {Token}.
8df0: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4c 49  likeop(A) ::= LI
8e00: 4b 45 5f 4b 57 7c 4d 41 54 43 48 28 41 29 2e 0a  KE_KW|MATCH(A)..
8e10: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f  likeop(A) ::= NO
8e20: 54 20 4c 49 4b 45 5f 4b 57 7c 4d 41 54 43 48 28  T LIKE_KW|MATCH(
8e30: 58 29 2e 20 7b 41 3d 58 3b 20 41 2e 6e 7c 3d 30  X). {A=X; A.n|=0
8e40: 78 38 30 30 30 30 30 30 30 3b 20 2f 2a 41 2d 6f  x80000000; /*A-o
8e50: 76 65 72 77 72 69 74 65 2d 58 2a 2f 7d 0a 65 78  verwrite-X*/}.ex
8e60: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
8e70: 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65 78 70  ) likeop(OP) exp
8e80: 72 28 59 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57 5d  r(Y).  [LIKE_KW]
8e90: 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a    {.  ExprList *
8ea0: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 62 4e 6f  pList;.  int bNo
8eb0: 74 20 3d 20 4f 50 2e 6e 20 26 20 30 78 38 30 30  t = OP.n & 0x800
8ec0: 30 30 30 30 30 3b 0a 20 20 4f 50 2e 6e 20 26 3d  00000;.  OP.n &=
8ed0: 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 70   0x7fffffff;.  p
8ee0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
8ef0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
8f00: 72 73 65 2c 30 2c 20 59 2e 70 45 78 70 72 29 3b  rse,0, Y.pExpr);
8f10: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
8f20: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
8f30: 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 41  (pParse,pList, A
8f40: 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70 45 78  .pExpr);.  A.pEx
8f50: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
8f60: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
8f70: 20 70 4c 69 73 74 2c 20 26 4f 50 29 3b 0a 20 20   pList, &OP);.  
8f80: 65 78 70 72 4e 6f 74 28 70 50 61 72 73 65 2c 20  exprNot(pParse, 
8f90: 62 4e 6f 74 2c 20 26 41 29 3b 0a 20 20 41 2e 7a  bNot, &A);.  A.z
8fa0: 45 6e 64 20 3d 20 59 2e 7a 45 6e 64 3b 0a 20 20  End = Y.zEnd;.  
8fb0: 69 66 28 20 41 2e 70 45 78 70 72 20 29 20 41 2e  if( A.pExpr ) A.
8fc0: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pExpr->flags |= 
8fd0: 45 50 5f 49 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a  EP_InfixFunc;.}.
8fe0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
8ff0: 28 41 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65  (A) likeop(OP) e
9000: 78 70 72 28 59 29 20 45 53 43 41 50 45 20 65 78  xpr(Y) ESCAPE ex
9010: 70 72 28 45 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57  pr(E).  [LIKE_KW
9020: 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  ]  {.  ExprList 
9030: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 62 4e  *pList;.  int bN
9040: 6f 74 20 3d 20 4f 50 2e 6e 20 26 20 30 78 38 30  ot = OP.n & 0x80
9050: 30 30 30 30 30 30 3b 0a 20 20 4f 50 2e 6e 20 26  000000;.  OP.n &
9060: 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
9070: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
9080: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
9090: 61 72 73 65 2c 30 2c 20 59 2e 70 45 78 70 72 29  arse,0, Y.pExpr)
90a0: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
90b0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
90c0: 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20  d(pParse,pList, 
90d0: 41 2e 70 45 78 70 72 29 3b 0a 20 20 70 4c 69 73  A.pExpr);.  pLis
90e0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
90f0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
9100: 2c 70 4c 69 73 74 2c 20 45 2e 70 45 78 70 72 29  ,pList, E.pExpr)
9110: 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71  ;.  A.pExpr = sq
9120: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
9130: 6e 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  n(pParse, pList,
9140: 20 26 4f 50 29 3b 0a 20 20 65 78 70 72 4e 6f 74   &OP);.  exprNot
9150: 28 70 50 61 72 73 65 2c 20 62 4e 6f 74 2c 20 26  (pParse, bNot, &
9160: 41 29 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 45  A);.  A.zEnd = E
9170: 2e 7a 45 6e 64 3b 0a 20 20 69 66 28 20 41 2e 70  .zEnd;.  if( A.p
9180: 45 78 70 72 20 29 20 41 2e 70 45 78 70 72 2d 3e  Expr ) A.pExpr->
9190: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 66 69  flags |= EP_Infi
91a0: 78 46 75 6e 63 3b 0a 7d 0a 0a 25 69 6e 63 6c 75  xFunc;.}..%inclu
91b0: 64 65 20 7b 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  de {.  /* Constr
91c0: 75 63 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uct an expressio
91d0: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 75 6e 61  n node for a una
91e0: 72 79 20 70 6f 73 74 66 69 78 20 6f 70 65 72 61  ry postfix opera
91f0: 74 6f 72 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  tor.  */.  stati
9200: 63 20 76 6f 69 64 20 73 70 61 6e 55 6e 61 72 79  c void spanUnary
9210: 50 6f 73 74 66 69 78 28 0a 20 20 20 20 50 61 72  Postfix(.    Par
9220: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9230: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9240: 6f 6e 74 65 78 74 20 74 6f 20 72 65 63 6f 72 64  ontext to record
9250: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 69   errors */.    i
9260: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
9270: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65        /* The ope
9280: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
9290: 72 53 70 61 6e 20 2a 70 4f 70 65 72 61 6e 64 2c  rSpan *pOperand,
92a0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61      /* The opera
92b0: 6e 64 2c 20 61 6e 64 20 6f 75 74 70 75 74 20 2a  nd, and output *
92c0: 2f 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50 6f  /.    Token *pPo
92d0: 73 74 4f 70 20 20 20 20 20 20 20 20 20 2f 2a 20  stOp         /* 
92e0: 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65  The operand toke
92f0: 6e 20 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68  n for setting th
9300: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20  e span */.  ){. 
9310: 20 20 20 70 4f 70 65 72 61 6e 64 2d 3e 70 45 78     pOperand->pEx
9320: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9330: 72 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 70 4f  r(pParse, op, pO
9340: 70 65 72 61 6e 64 2d 3e 70 45 78 70 72 2c 20 30  perand->pExpr, 0
9350: 29 3b 0a 20 20 20 20 70 4f 70 65 72 61 6e 64 2d  );.    pOperand-
9360: 3e 7a 45 6e 64 20 3d 20 26 70 50 6f 73 74 4f 70  >zEnd = &pPostOp
9370: 2d 3e 7a 5b 70 50 6f 73 74 4f 70 2d 3e 6e 5d 3b  ->z[pPostOp->n];
9380: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20  .  }            
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a                 .
93a0: 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  }..expr(A) ::= e
93b0: 78 70 72 28 41 29 20 49 53 4e 55 4c 4c 7c 4e 4f  xpr(A) ISNULL|NO
93c0: 54 4e 55 4c 4c 28 45 29 2e 20 20 20 7b 73 70 61  TNULL(E).   {spa
93d0: 6e 55 6e 61 72 79 50 6f 73 74 66 69 78 28 70 50  nUnaryPostfix(pP
93e0: 61 72 73 65 2c 40 45 2c 26 41 2c 26 45 29 3b 7d  arse,@E,&A,&E);}
93f0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
9400: 72 28 41 29 20 4e 4f 54 20 4e 55 4c 4c 28 45 29  r(A) NOT NULL(E)
9410: 2e 20 7b 73 70 61 6e 55 6e 61 72 79 50 6f 73 74  . {spanUnaryPost
9420: 66 69 78 28 70 50 61 72 73 65 2c 54 4b 5f 4e 4f  fix(pParse,TK_NO
9430: 54 4e 55 4c 4c 2c 26 41 2c 26 45 29 3b 7d 0a 0a  TNULL,&A,&E);}..
9440: 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20  %include {.  /* 
9450: 41 20 72 6f 75 74 69 6e 65 20 74 6f 20 63 6f 6e  A routine to con
9460: 76 65 72 74 20 61 20 62 69 6e 61 72 79 20 54 4b  vert a binary TK
9470: 5f 49 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54 20  _IS or TK_ISNOT 
9480: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20  expression into 
9490: 61 0a 20 20 2a 2a 20 75 6e 61 72 79 20 54 4b 5f  a.  ** unary TK_
94a0: 49 53 4e 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54  ISNULL or TK_NOT
94b0: 4e 55 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e  NULL expression.
94c0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
94d0: 64 20 62 69 6e 61 72 79 54 6f 55 6e 61 72 79 49  d binaryToUnaryI
94e0: 66 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61  fNull(Parse *pPa
94f0: 72 73 65 2c 20 45 78 70 72 20 2a 70 59 2c 20 45  rse, Expr *pY, E
9500: 78 70 72 20 2a 70 41 2c 20 69 6e 74 20 6f 70 29  xpr *pA, int op)
9510: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  {.    sqlite3 *d
9520: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9530: 20 20 20 20 69 66 28 20 70 41 20 26 26 20 70 59      if( pA && pY
9540: 20 26 26 20 70 59 2d 3e 6f 70 3d 3d 54 4b 5f 4e   && pY->op==TK_N
9550: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 41 2d  ULL ){.      pA-
9560: 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  >op = (u8)op;.  
9570: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
9580: 65 6c 65 74 65 28 64 62 2c 20 70 41 2d 3e 70 52  elete(db, pA->pR
9590: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 41 2d  ight);.      pA-
95a0: 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20  >pRight = 0;.   
95b0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 20 20 20   }.  }.}..//    
95c0: 65 78 70 72 31 20 49 53 20 65 78 70 72 32 0a 2f  expr1 IS expr2./
95d0: 2f 20 20 20 20 65 78 70 72 31 20 49 53 20 4e 4f  /    expr1 IS NO
95e0: 54 20 65 78 70 72 32 0a 2f 2f 0a 2f 2f 20 49 66  T expr2.//.// If
95f0: 20 65 78 70 72 32 20 69 73 20 4e 55 4c 4c 20 74   expr2 is NULL t
9600: 68 65 6e 20 63 6f 64 65 20 61 73 20 54 4b 5f 49  hen code as TK_I
9610: 53 4e 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e  SNULL or TK_NOTN
9620: 55 4c 4c 2e 20 20 49 66 20 65 78 70 72 32 0a 2f  ULL.  If expr2./
9630: 2f 20 69 73 20 61 6e 79 20 6f 74 68 65 72 20 65  / is any other e
9640: 78 70 72 65 73 73 69 6f 6e 2c 20 63 6f 64 65 20  xpression, code 
9650: 61 73 20 54 4b 5f 49 53 20 6f 72 20 54 4b 5f 49  as TK_IS or TK_I
9660: 53 4e 4f 54 2e 0a 2f 2f 20 0a 65 78 70 72 28 41  SNOT..// .expr(A
9670: 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 49 53  ) ::= expr(A) IS
9680: 20 65 78 70 72 28 59 29 2e 20 20 20 20 20 7b 0a   expr(Y).     {.
9690: 20 20 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72    spanBinaryExpr
96a0: 28 70 50 61 72 73 65 2c 54 4b 5f 49 53 2c 26 41  (pParse,TK_IS,&A
96b0: 2c 26 59 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f  ,&Y);.  binaryTo
96c0: 55 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50 61 72  UnaryIfNull(pPar
96d0: 73 65 2c 20 59 2e 70 45 78 70 72 2c 20 41 2e 70  se, Y.pExpr, A.p
96e0: 45 78 70 72 2c 20 54 4b 5f 49 53 4e 55 4c 4c 29  Expr, TK_ISNULL)
96f0: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
9700: 65 78 70 72 28 41 29 20 49 53 20 4e 4f 54 20 65  expr(A) IS NOT e
9710: 78 70 72 28 59 29 2e 20 7b 0a 20 20 73 70 61 6e  xpr(Y). {.  span
9720: 42 69 6e 61 72 79 45 78 70 72 28 70 50 61 72 73  BinaryExpr(pPars
9730: 65 2c 54 4b 5f 49 53 4e 4f 54 2c 26 41 2c 26 59  e,TK_ISNOT,&A,&Y
9740: 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55 6e 61  );.  binaryToUna
9750: 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73 65 2c  ryIfNull(pParse,
9760: 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 45 78 70   Y.pExpr, A.pExp
9770: 72 2c 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  r, TK_NOTNULL);.
9780: 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20  }..%include {.  
9790: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6e 20  /* Construct an 
97a0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
97b0: 66 6f 72 20 61 20 75 6e 61 72 79 20 70 72 65 66  for a unary pref
97c0: 69 78 20 6f 70 65 72 61 74 6f 72 0a 20 20 2a 2f  ix operator.  */
97d0: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73  .  static void s
97e0: 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28 0a  panUnaryPrefix(.
97f0: 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70 4f      ExprSpan *pO
9800: 75 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ut,        /* Wr
9810: 69 74 65 20 74 68 65 20 6e 65 77 20 65 78 70 72  ite the new expr
9820: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 68 65 72 65  ession node here
9830: 20 2a 2f 0a 20 20 20 20 50 61 72 73 65 20 2a 70   */.    Parse *p
9840: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
9850: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9860: 74 20 74 6f 20 72 65 63 6f 72 64 20 65 72 72 6f  t to record erro
9870: 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  rs */.    int op
9880: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9890: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72   /* The operator
98a0: 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 70 61 6e   */.    ExprSpan
98b0: 20 2a 70 4f 70 65 72 61 6e 64 2c 20 20 20 20 2f   *pOperand,    /
98c0: 2a 20 54 68 65 20 6f 70 65 72 61 6e 64 20 2a 2f  * The operand */
98d0: 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50 72 65  .    Token *pPre
98e0: 4f 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Op         /* Th
98f0: 65 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65 6e 20  e operand token 
9900: 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68 65 20  for setting the 
9910: 73 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  span */.  ){.   
9920: 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d 20   pOut->zStart = 
9930: 70 50 72 65 4f 70 2d 3e 7a 3b 0a 20 20 20 20 70  pPreOp->z;.    p
9940: 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c  Out->pExpr = sql
9950: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
9960: 2c 20 6f 70 2c 20 70 4f 70 65 72 61 6e 64 2d 3e  , op, pOperand->
9970: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 70  pExpr, 0);.    p
9980: 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 70 4f 70 65  Out->zEnd = pOpe
9990: 72 61 6e 64 2d 3e 7a 45 6e 64 3b 0a 20 20 7d 0a  rand->zEnd;.  }.
99a0: 7d 0a 0a 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d  }....expr(A) ::=
99b0: 20 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e   NOT(B) expr(X).
99c0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
99d0: 20 7b 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69   {spanUnaryPrefi
99e0: 78 28 26 41 2c 70 50 61 72 73 65 2c 40 42 2c 26  x(&A,pParse,@B,&
99f0: 58 2c 26 42 29 3b 2f 2a 41 2d 6f 76 65 72 77 72  X,&B);/*A-overwr
9a00: 69 74 65 73 2d 42 2a 2f 7d 0a 65 78 70 72 28 41  ites-B*/}.expr(A
9a10: 29 20 3a 3a 3d 20 42 49 54 4e 4f 54 28 42 29 20  ) ::= BITNOT(B) 
9a20: 65 78 70 72 28 58 29 2e 0a 20 20 20 20 20 20 20  expr(X)..       
9a30: 20 20 20 20 20 20 20 7b 73 70 61 6e 55 6e 61 72         {spanUnar
9a40: 79 50 72 65 66 69 78 28 26 41 2c 70 50 61 72 73  yPrefix(&A,pPars
9a50: 65 2c 40 42 2c 26 58 2c 26 42 29 3b 2f 2a 41 2d  e,@B,&X,&B);/*A-
9a60: 6f 76 65 72 77 72 69 74 65 73 2d 42 2a 2f 7d 0a  overwrites-B*/}.
9a70: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55  expr(A) ::= MINU
9a80: 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b 42  S(B) expr(X). [B
9a90: 49 54 4e 4f 54 5d 0a 20 20 20 20 20 20 20 20 20  ITNOT].         
9aa0: 20 20 20 20 20 7b 73 70 61 6e 55 6e 61 72 79 50       {spanUnaryP
9ab0: 72 65 66 69 78 28 26 41 2c 70 50 61 72 73 65 2c  refix(&A,pParse,
9ac0: 54 4b 5f 55 4d 49 4e 55 53 2c 26 58 2c 26 42 29  TK_UMINUS,&X,&B)
9ad0: 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d  ;/*A-overwrites-
9ae0: 42 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  B*/}.expr(A) ::=
9af0: 20 50 4c 55 53 28 42 29 20 65 78 70 72 28 58 29   PLUS(B) expr(X)
9b00: 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20 20 20  . [BITNOT].     
9b10: 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 55 6e           {spanUn
9b20: 61 72 79 50 72 65 66 69 78 28 26 41 2c 70 50 61  aryPrefix(&A,pPa
9b30: 72 73 65 2c 54 4b 5f 55 50 4c 55 53 2c 26 58 2c  rse,TK_UPLUS,&X,
9b40: 26 42 29 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74  &B);/*A-overwrit
9b50: 65 73 2d 42 2a 2f 7d 0a 0a 25 74 79 70 65 20 62  es-B*/}..%type b
9b60: 65 74 77 65 65 6e 5f 6f 70 20 7b 69 6e 74 7d 0a  etween_op {int}.
9b70: 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20 3a 3a  between_op(A) ::
9b80: 3d 20 42 45 54 57 45 45 4e 2e 20 20 20 20 20 7b  = BETWEEN.     {
9b90: 41 20 3d 20 30 3b 7d 0a 62 65 74 77 65 65 6e 5f  A = 0;}.between_
9ba0: 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 42 45  op(A) ::= NOT BE
9bb0: 54 57 45 45 4e 2e 20 7b 41 20 3d 20 31 3b 7d 0a  TWEEN. {A = 1;}.
9bc0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
9bd0: 28 41 29 20 62 65 74 77 65 65 6e 5f 6f 70 28 4e  (A) between_op(N
9be0: 29 20 65 78 70 72 28 58 29 20 41 4e 44 20 65 78  ) expr(X) AND ex
9bf0: 70 72 28 59 29 2e 20 5b 42 45 54 57 45 45 4e 5d  pr(Y). [BETWEEN]
9c00: 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70   {.  ExprList *p
9c10: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
9c20: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
9c30: 72 73 65 2c 30 2c 20 58 2e 70 45 78 70 72 29 3b  rse,0, X.pExpr);
9c40: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
9c50: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9c60: 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 59  (pParse,pList, Y
9c70: 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70 45 78  .pExpr);.  A.pEx
9c80: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9c90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 42 45 54  r(pParse, TK_BET
9ca0: 57 45 45 4e 2c 20 41 2e 70 45 78 70 72 2c 20 30  WEEN, A.pExpr, 0
9cb0: 29 3b 0a 20 20 69 66 28 20 41 2e 70 45 78 70 72  );.  if( A.pExpr
9cc0: 20 29 7b 0a 20 20 20 20 41 2e 70 45 78 70 72 2d   ){.    A.pExpr-
9cd0: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
9ce0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9cf0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9d00: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9d10: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 20 0a 20 20   pList);.  } .  
9d20: 65 78 70 72 4e 6f 74 28 70 50 61 72 73 65 2c 20  exprNot(pParse, 
9d30: 4e 2c 20 26 41 29 3b 0a 20 20 41 2e 7a 45 6e 64  N, &A);.  A.zEnd
9d40: 20 3d 20 59 2e 7a 45 6e 64 3b 0a 7d 0a 25 69 66   = Y.zEnd;.}.%if
9d50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9d60: 5f 53 55 42 51 55 45 52 59 0a 20 20 25 74 79 70  _SUBQUERY.  %typ
9d70: 65 20 69 6e 5f 6f 70 20 7b 69 6e 74 7d 0a 20 20  e in_op {int}.  
9d80: 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 49 4e 2e  in_op(A) ::= IN.
9d90: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 20        {A = 0;}. 
9da0: 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f   in_op(A) ::= NO
9db0: 54 20 49 4e 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a  T IN.  {A = 1;}.
9dc0: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78    expr(A) ::= ex
9dd0: 70 72 28 41 29 20 69 6e 5f 6f 70 28 4e 29 20 4c  pr(A) in_op(N) L
9de0: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50  P exprlist(Y) RP
9df0: 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20 20 20  (E). [IN] {.    
9e00: 69 66 28 20 59 3d 3d 30 20 29 7b 0a 20 20 20 20  if( Y==0 ){.    
9e10: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
9e20: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 20   of the form.   
9e30: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20     **.      **  
9e40: 20 20 20 20 65 78 70 72 31 20 49 4e 20 28 29 0a      expr1 IN ().
9e50: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 65 78        **      ex
9e60: 70 72 31 20 4e 4f 54 20 49 4e 20 28 29 0a 20 20  pr1 NOT IN ().  
9e70: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9e80: 73 69 6d 70 6c 69 66 79 20 74 6f 20 63 6f 6e 73  simplify to cons
9e90: 74 61 6e 74 73 20 30 20 28 66 61 6c 73 65 29 20  tants 0 (false) 
9ea0: 61 6e 64 20 31 20 28 74 72 75 65 29 2c 20 72 65  and 1 (true), re
9eb0: 73 70 65 63 74 69 76 65 6c 79 2c 0a 20 20 20 20  spectively,.    
9ec0: 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20    ** regardless 
9ed0: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
9ee0: 65 78 70 72 31 2e 0a 20 20 20 20 20 20 2a 2f 0a  expr1..      */.
9ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9f00: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
9f10: 64 62 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20  db, A.pExpr);.  
9f20: 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71      A.pExpr = sq
9f30: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
9f40: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e  Parse->db, TK_IN
9f50: 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e  TEGER,&sqlite3In
9f60: 74 54 6f 6b 65 6e 73 5b 4e 5d 2c 31 29 3b 0a 20  tTokens[N],1);. 
9f70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 59 2d 3e     }else if( Y->
9f80: 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
9f90: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
9fa0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
9fb0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9fc0: 20 20 20 20 20 65 78 70 72 31 20 49 4e 20 28 3f       expr1 IN (?
9fd0: 31 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  1).      **     
9fe0: 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20 28 3f   expr1 NOT IN (?
9ff0: 32 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  2).      **.    
a000: 20 20 2a 2a 20 77 69 74 68 20 65 78 61 63 74 6c    ** with exactl
a010: 79 20 6f 6e 65 20 76 61 6c 75 65 20 6f 6e 20 74  y one value on t
a020: 68 65 20 52 48 53 20 63 61 6e 20 62 65 20 73 69  he RHS can be si
a030: 6d 70 6c 69 66 69 65 64 20 74 6f 20 73 6f 6d 65  mplified to some
a040: 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6c  thing.      ** l
a050: 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 20 20  ike this:.      
a060: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
a070: 20 65 78 70 72 31 20 3d 3d 20 3f 31 0a 20 20 20   expr1 == ?1.   
a080: 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31     **      expr1
a090: 20 3c 3e 20 3f 32 0a 20 20 20 20 20 20 2a 2a 0a   <> ?2.      **.
a0a0: 20 20 20 20 20 20 2a 2a 20 42 75 74 2c 20 74 68        ** But, th
a0b0: 65 20 52 48 53 20 6f 66 20 74 68 65 20 3d 3d 20  e RHS of the == 
a0c0: 6f 72 20 3c 3e 20 69 73 20 6d 61 72 6b 65 64 20  or <> is marked 
a0d0: 77 69 74 68 20 74 68 65 20 45 50 5f 47 65 6e 65  with the EP_Gene
a0e0: 72 69 63 20 66 6c 61 67 0a 20 20 20 20 20 20 2a  ric flag.      *
a0f0: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 79  * so that it may
a100: 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
a110: 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  to the computati
a120: 6f 6e 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  on of comparison
a130: 0a 20 20 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  .      ** affini
a140: 74 79 20 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  ty or the collat
a150: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
a160: 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  use for comparis
a170: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  on.  Otherwise,.
a180: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 6d        ** the sem
a190: 61 6e 74 69 63 73 20 77 6f 75 6c 64 20 62 65 20  antics would be 
a1a0: 73 75 62 74 6c 79 20 64 69 66 66 65 72 65 6e 74  subtly different
a1b0: 20 66 72 6f 6d 20 49 4e 20 6f 72 20 4e 4f 54 20   from IN or NOT 
a1c0: 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
a1d0: 20 20 20 45 78 70 72 20 2a 70 52 48 53 20 3d 20     Expr *pRHS = 
a1e0: 59 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  Y->a[0].pExpr;. 
a1f0: 20 20 20 20 20 59 2d 3e 61 5b 30 5d 2e 70 45 78       Y->a[0].pEx
a200: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  pr = 0;.      sq
a210: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
a220: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
a230: 59 29 3b 0a 20 20 20 20 20 20 2f 2a 20 70 52 48  Y);.      /* pRH
a240: 53 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  S cannot be NULL
a250: 20 62 65 63 61 75 73 65 20 61 20 6d 61 6c 6c 6f   because a mallo
a260: 63 20 65 72 72 6f 72 20 77 6f 75 6c 64 20 68 61  c error would ha
a270: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ve been detected
a280: 0a 20 20 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  .      ** before
a290: 20 6e 6f 77 20 61 6e 64 20 63 6f 6e 74 72 6f 6c   now and control
a2a0: 20 77 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65   would have neve
a2b0: 72 20 72 65 61 63 68 65 64 20 74 68 69 73 20 70  r reached this p
a2c0: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  oint */.      if
a2d0: 28 20 41 4c 57 41 59 53 28 70 52 48 53 29 20 29  ( ALWAYS(pRHS) )
a2e0: 7b 0a 20 20 20 20 20 20 20 20 70 52 48 53 2d 3e  {.        pRHS->
a2f0: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
a300: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52  late;.        pR
a310: 48 53 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  HS->flags |= EP_
a320: 47 65 6e 65 72 69 63 3b 0a 20 20 20 20 20 20 7d  Generic;.      }
a330: 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d  .      A.pExpr =
a340: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
a350: 61 72 73 65 2c 20 4e 20 3f 20 54 4b 5f 4e 45 20  arse, N ? TK_NE 
a360: 3a 20 54 4b 5f 45 51 2c 20 41 2e 70 45 78 70 72  : TK_EQ, A.pExpr
a370: 2c 20 70 52 48 53 29 3b 0a 20 20 20 20 7d 65 6c  , pRHS);.    }el
a380: 73 65 7b 0a 20 20 20 20 20 20 41 2e 70 45 78 70  se{.      A.pExp
a390: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
a3a0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20  (pParse, TK_IN, 
a3b0: 41 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  A.pExpr, 0);.   
a3c0: 20 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29     if( A.pExpr )
a3d0: 7b 0a 20 20 20 20 20 20 20 20 41 2e 70 45 78 70  {.        A.pExp
a3e0: 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 59 3b 0a  r->x.pList = Y;.
a3f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a400: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46  xprSetHeightAndF
a410: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 41 2e 70  lags(pParse, A.p
a420: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
a430: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a440: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
a450: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29  e(pParse->db, Y)
a460: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a470: 65 78 70 72 4e 6f 74 28 70 50 61 72 73 65 2c 20  exprNot(pParse, 
a480: 4e 2c 20 26 41 29 3b 0a 20 20 20 20 7d 0a 20 20  N, &A);.    }.  
a490: 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b    A.zEnd = &E.z[
a4a0: 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72  E.n];.  }.  expr
a4b0: 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 73 65  (A) ::= LP(B) se
a4c0: 6c 65 63 74 28 58 29 20 52 50 28 45 29 2e 20 7b  lect(X) RP(E). {
a4d0: 0a 20 20 20 20 73 70 61 6e 53 65 74 28 26 41 2c  .    spanSet(&A,
a4e0: 26 42 2c 26 45 29 3b 20 2f 2a 41 2d 6f 76 65 72  &B,&E); /*A-over
a4f0: 77 72 69 74 65 73 2d 42 2a 2f 0a 20 20 20 20 41  writes-B*/.    A
a500: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
a510: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
a520: 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a  _SELECT, 0, 0);.
a530: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
a540: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
a550: 2c 20 41 2e 70 45 78 70 72 2c 20 58 29 3b 0a 20  , A.pExpr, X);. 
a560: 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d   }.  expr(A) ::=
a570: 20 65 78 70 72 28 41 29 20 69 6e 5f 6f 70 28 4e   expr(A) in_op(N
a580: 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52  ) LP select(Y) R
a590: 50 28 45 29 2e 20 20 5b 49 4e 5d 20 7b 0a 20 20  P(E).  [IN] {.  
a5a0: 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69    A.pExpr = sqli
a5b0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
a5c0: 20 54 4b 5f 49 4e 2c 20 41 2e 70 45 78 70 72 2c   TK_IN, A.pExpr,
a5d0: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
a5e0: 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70  PExprAddSelect(p
a5f0: 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 2c 20  Parse, A.pExpr, 
a600: 59 29 3b 0a 20 20 20 20 65 78 70 72 4e 6f 74 28  Y);.    exprNot(
a610: 70 50 61 72 73 65 2c 20 4e 2c 20 26 41 29 3b 0a  pParse, N, &A);.
a620: 20 20 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e      A.zEnd = &E.
a630: 7a 5b 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78  z[E.n];.  }.  ex
a640: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
a650: 29 20 69 6e 5f 6f 70 28 4e 29 20 6e 6d 28 59 29  ) in_op(N) nm(Y)
a660: 20 64 62 6e 6d 28 5a 29 20 70 61 72 65 6e 5f 65   dbnm(Z) paren_e
a670: 78 70 72 6c 69 73 74 28 45 29 2e 20 5b 49 4e 5d  xprlist(E). [IN]
a680: 20 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a   {.    SrcList *
a690: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
a6a0: 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  cListAppend(pPar
a6b0: 73 65 2d 3e 64 62 2c 20 30 2c 26 59 2c 26 5a 29  se->db, 0,&Y,&Z)
a6c0: 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53  ;.    Select *pS
a6d0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
a6e0: 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c  electNew(pParse,
a6f0: 20 30 2c 70 53 72 63 2c 30 2c 30 2c 30 2c 30 2c   0,pSrc,0,0,0,0,
a700: 30 2c 30 2c 30 29 3b 0a 20 20 20 20 69 66 28 20  0,0,0);.    if( 
a710: 45 20 29 20 20 73 71 6c 69 74 65 33 53 72 63 4c  E )  sqlite3SrcL
a720: 69 73 74 46 75 6e 63 41 72 67 73 28 70 50 61 72  istFuncArgs(pPar
a730: 73 65 2c 20 70 53 65 6c 65 63 74 20 3f 20 70 53  se, pSelect ? pS
a740: 72 63 20 3a 20 30 2c 20 45 29 3b 0a 20 20 20 20  rc : 0, E);.    
a750: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
a760: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
a770: 4b 5f 49 4e 2c 20 41 2e 70 45 78 70 72 2c 20 30  K_IN, A.pExpr, 0
a780: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45  );.    sqlite3PE
a790: 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61  xprAddSelect(pPa
a7a0: 72 73 65 2c 20 41 2e 70 45 78 70 72 2c 20 70 53  rse, A.pExpr, pS
a7b0: 65 6c 65 63 74 29 3b 0a 20 20 20 20 65 78 70 72  elect);.    expr
a7c0: 4e 6f 74 28 70 50 61 72 73 65 2c 20 4e 2c 20 26  Not(pParse, N, &
a7d0: 41 29 3b 0a 20 20 20 20 41 2e 7a 45 6e 64 20 3d  A);.    A.zEnd =
a7e0: 20 5a 2e 7a 20 3f 20 26 5a 2e 7a 5b 5a 2e 6e 5d   Z.z ? &Z.z[Z.n]
a7f0: 20 3a 20 26 59 2e 7a 5b 59 2e 6e 5d 3b 0a 20 20   : &Y.z[Y.n];.  
a800: 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.  expr(A) ::= 
a810: 45 58 49 53 54 53 28 42 29 20 4c 50 20 73 65 6c  EXISTS(B) LP sel
a820: 65 63 74 28 59 29 20 52 50 28 45 29 2e 20 7b 0a  ect(Y) RP(E). {.
a830: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20      Expr *p;.   
a840: 20 73 70 61 6e 53 65 74 28 26 41 2c 26 42 2c 26   spanSet(&A,&B,&
a850: 45 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  E); /*A-overwrit
a860: 65 73 2d 42 2a 2f 0a 20 20 20 20 70 20 3d 20 41  es-B*/.    p = A
a870: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
a880: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
a890: 5f 45 58 49 53 54 53 2c 20 30 2c 20 30 29 3b 0a  _EXISTS, 0, 0);.
a8a0: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
a8b0: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
a8c0: 2c 20 70 2c 20 59 29 3b 0a 20 20 7d 0a 25 65 6e  , p, Y);.  }.%en
a8d0: 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  dif SQLITE_OMIT_
a8e0: 53 55 42 51 55 45 52 59 0a 0a 2f 2a 20 43 41 53  SUBQUERY../* CAS
a8f0: 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  E expressions */
a900: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53  .expr(A) ::= CAS
a910: 45 28 43 29 20 63 61 73 65 5f 6f 70 65 72 61 6e  E(C) case_operan
a920: 64 28 58 29 20 63 61 73 65 5f 65 78 70 72 6c 69  d(X) case_exprli
a930: 73 74 28 59 29 20 63 61 73 65 5f 65 6c 73 65 28  st(Y) case_else(
a940: 5a 29 20 45 4e 44 28 45 29 2e 20 7b 0a 20 20 73  Z) END(E). {.  s
a950: 70 61 6e 53 65 74 28 26 41 2c 26 43 2c 26 45 29  panSet(&A,&C,&E)
a960: 3b 20 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  ;  /*A-overwrite
a970: 73 2d 43 2a 2f 0a 20 20 41 2e 70 45 78 70 72 20  s-C*/.  A.pExpr 
a980: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
a990: 50 61 72 73 65 2c 20 54 4b 5f 43 41 53 45 2c 20  Parse, TK_CASE, 
a9a0: 58 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 2e 70  X, 0);.  if( A.p
a9b0: 45 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70 45  Expr ){.    A.pE
a9c0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 5a  xpr->x.pList = Z
a9d0: 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ? sqlite3ExprLi
a9e0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
a9f0: 59 2c 5a 29 20 3a 20 59 3b 0a 20 20 20 20 73 71  Y,Z) : Y;.    sq
aa00: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
aa10: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
aa20: 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20 7d  e, A.pExpr);.  }
aa30: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
aa40: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
aa50: 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29 3b 0a  pParse->db, Y);.
aa60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
aa70: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
aa80: 2c 20 5a 29 3b 0a 20 20 7d 0a 7d 0a 25 74 79 70  , Z);.  }.}.%typ
aa90: 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20  e case_exprlist 
aaa0: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
aab0: 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70  tructor case_exp
aac0: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
aad0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
aae0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63  rse->db, $$);}.c
aaf0: 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20  ase_exprlist(A) 
ab00: 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c 69 73  ::= case_exprlis
ab10: 74 28 41 29 20 57 48 45 4e 20 65 78 70 72 28 59  t(A) WHEN expr(Y
ab20: 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20  ) THEN expr(Z). 
ab30: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
ab40: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
ab50: 61 72 73 65 2c 41 2c 20 59 2e 70 45 78 70 72 29  arse,A, Y.pExpr)
ab60: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
ab70: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
ab80: 61 72 73 65 2c 41 2c 20 5a 2e 70 45 78 70 72 29  arse,A, Z.pExpr)
ab90: 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73  ;.}.case_exprlis
aba0: 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78  t(A) ::= WHEN ex
abb0: 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28  pr(Y) THEN expr(
abc0: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
abd0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
abe0: 64 28 70 50 61 72 73 65 2c 30 2c 20 59 2e 70 45  d(pParse,0, Y.pE
abf0: 78 70 72 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  xpr);.  A = sqli
ac00: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
ac10: 64 28 70 50 61 72 73 65 2c 41 2c 20 5a 2e 70 45  d(pParse,A, Z.pE
ac20: 78 70 72 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61  xpr);.}.%type ca
ac30: 73 65 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a  se_else {Expr*}.
ac40: 25 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65  %destructor case
ac50: 5f 65 6c 73 65 20 7b 73 71 6c 69 74 65 33 45 78  _else {sqlite3Ex
ac60: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
ac70: 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f  >db, $$);}.case_
ac80: 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53  else(A) ::=  ELS
ac90: 45 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  E expr(X).      
aca0: 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70 72 3b     {A = X.pExpr;
acb0: 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a  }.case_else(A) :
acc0: 3a 3d 20 20 2e 20 20 20 20 20 20 20 20 20 20 20  :=  .           
acd0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
ace0: 3b 7d 20 0a 25 74 79 70 65 20 63 61 73 65 5f 6f  ;} .%type case_o
acf0: 70 65 72 61 6e 64 20 7b 45 78 70 72 2a 7d 0a 25  perand {Expr*}.%
ad00: 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f  destructor case_
ad10: 6f 70 65 72 61 6e 64 20 7b 73 71 6c 69 74 65 33  operand {sqlite3
ad20: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
ad30: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73  e->db, $$);}.cas
ad40: 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d  e_operand(A) ::=
ad50: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
ad60: 20 20 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70       {A = X.pExp
ad70: 72 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  r; /*A-overwrite
ad80: 73 2d 58 2a 2f 7d 20 0a 63 61 73 65 5f 6f 70 65  s-X*/} .case_ope
ad90: 72 61 6e 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20  rand(A) ::= .   
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65  {A = 0;} ..%type
adc0: 20 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c   exprlist {ExprL
add0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
ade0: 72 20 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69  r exprlist {sqli
adf0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
ae00: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
ae10: 29 3b 7d 0a 25 74 79 70 65 20 6e 65 78 70 72 6c  );}.%type nexprl
ae20: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
ae30: 25 64 65 73 74 72 75 63 74 6f 72 20 6e 65 78 70  %destructor nexp
ae40: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
ae50: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
ae60: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a  rse->db, $$);}..
ae70: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20  exprlist(A) ::= 
ae80: 6e 65 78 70 72 6c 69 73 74 28 41 29 2e 0a 65 78  nexprlist(A)..ex
ae90: 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e 20  prlist(A) ::= . 
aea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aeb0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
aec0: 30 3b 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41 29  0;}.nexprlist(A)
aed0: 20 3a 3a 3d 20 6e 65 78 70 72 6c 69 73 74 28 41   ::= nexprlist(A
aee0: 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e  ) COMMA expr(Y).
aef0: 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  .    {A = sqlite
af00: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
af10: 70 50 61 72 73 65 2c 41 2c 59 2e 70 45 78 70 72  pParse,A,Y.pExpr
af20: 29 3b 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41 29  );}.nexprlist(A)
af30: 20 3a 3a 3d 20 65 78 70 72 28 59 29 2e 0a 20 20   ::= expr(Y)..  
af40: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
af50: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
af60: 72 73 65 2c 30 2c 59 2e 70 45 78 70 72 29 3b 20  rse,0,Y.pExpr); 
af70: 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 59  /*A-overwrites-Y
af80: 2a 2f 7d 0a 0a 25 69 66 6e 64 65 66 20 53 51 4c  */}..%ifndef SQL
af90: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
afa0: 59 0a 2f 2a 20 41 20 70 61 72 65 6e 5f 65 78 70  Y./* A paren_exp
afb0: 72 6c 69 73 74 20 69 73 20 61 6e 20 6f 70 74 69  rlist is an opti
afc0: 6f 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  onal expression 
afd0: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 65 64 20 69  list contained i
afe0: 6e 73 69 64 65 0a 2a 2a 20 6f 66 20 70 61 72 65  nside.** of pare
aff0: 6e 74 68 65 73 69 73 20 2a 2f 0a 25 74 79 70 65  nthesis */.%type
b000: 20 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 74 20   paren_exprlist 
b010: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
b020: 74 72 75 63 74 6f 72 20 70 61 72 65 6e 5f 65 78  tructor paren_ex
b030: 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45  prlist {sqlite3E
b040: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
b050: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
b060: 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 74 28 41  paren_exprlist(A
b070: 29 20 3a 3a 3d 20 2e 20 20 20 7b 41 20 3d 20 30  ) ::= .   {A = 0
b080: 3b 7d 0a 70 61 72 65 6e 5f 65 78 70 72 6c 69 73  ;}.paren_exprlis
b090: 74 28 41 29 20 3a 3a 3d 20 4c 50 20 65 78 70 72  t(A) ::= LP expr
b0a0: 6c 69 73 74 28 58 29 20 52 50 2e 20 20 7b 41 20  list(X) RP.  {A 
b0b0: 3d 20 58 3b 7d 0a 25 65 6e 64 69 66 20 53 51 4c  = X;}.%endif SQL
b0c0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
b0d0: 59 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  Y...////////////
b0e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b0f0: 2f 20 54 68 65 20 43 52 45 41 54 45 20 49 4e 44  / The CREATE IND
b100: 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  EX command /////
b110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b120: 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63 72  //.//.cmd ::= cr
b130: 65 61 74 65 6b 77 28 53 29 20 75 6e 69 71 75 65  eatekw(S) unique
b140: 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20 69 66  flag(U) INDEX if
b150: 6e 6f 74 65 78 69 73 74 73 28 4e 45 29 20 6e 6d  notexists(NE) nm
b160: 28 58 29 20 64 62 6e 6d 28 44 29 0a 20 20 20 20  (X) dbnm(D).    
b170: 20 20 20 20 4f 4e 20 6e 6d 28 59 29 20 4c 50 20      ON nm(Y) LP 
b180: 73 6f 72 74 6c 69 73 74 28 5a 29 20 52 50 20 77  sortlist(Z) RP w
b190: 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b 0a 20  here_opt(W). {. 
b1a0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
b1b0: 64 65 78 28 70 50 61 72 73 65 2c 20 26 58 2c 20  dex(pParse, &X, 
b1c0: 26 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  &D, .           
b1d0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b1e0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
b1f0: 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59 2c 30  Parse->db,0,&Y,0
b200: 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20 20 20 20  ), Z, U,.       
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
b220: 53 2c 20 57 2c 20 53 51 4c 49 54 45 5f 53 4f 5f  S, W, SQLITE_SO_
b230: 41 53 43 2c 20 4e 45 2c 20 53 51 4c 49 54 45 5f  ASC, NE, SQLITE_
b240: 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 3b  IDXTYPE_APPDEF);
b250: 0a 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71 75 65  .}..%type unique
b260: 66 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75  flag {int}.uniqu
b270: 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49  eflag(A) ::= UNI
b280: 51 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f 41 62  QUE.  {A = OE_Ab
b290: 6f 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c 61 67  ort;}.uniqueflag
b2a0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
b2b0: 20 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 7d 0a   {A = OE_None;}.
b2c0: 0a 0a 2f 2f 20 54 68 65 20 65 69 64 6c 69 73 74  ..// The eidlist
b2d0: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 28 45   non-terminal (E
b2e0: 78 70 72 65 73 73 69 6f 6e 20 49 64 20 4c 69 73  xpression Id Lis
b2f0: 74 29 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  t) generates an 
b300: 45 78 70 72 4c 69 73 74 0a 2f 2f 20 66 72 6f 6d  ExprList.// from
b310: 20 61 20 6c 69 73 74 20 6f 66 20 69 64 65 6e 74   a list of ident
b320: 69 66 69 65 72 73 2e 20 20 54 68 65 20 69 64 65  ifiers.  The ide
b330: 6e 74 69 66 69 65 72 20 6e 61 6d 65 73 20 61 72  ntifier names ar
b340: 65 20 69 6e 20 45 78 70 72 4c 69 73 74 2e 61 5b  e in ExprList.a[
b350: 5d 2e 7a 4e 61 6d 65 2e 0a 2f 2f 20 54 68 69 73  ].zName..// This
b360: 20 6c 69 73 74 20 69 73 20 73 74 6f 72 65 64 20   list is stored 
b370: 69 6e 20 61 6e 20 45 78 70 72 4c 69 73 74 20 72  in an ExprList r
b380: 61 74 68 65 72 20 74 68 61 6e 20 61 6e 20 49 64  ather than an Id
b390: 4c 69 73 74 20 73 6f 20 74 68 61 74 20 69 74 0a  List so that it.
b3a0: 2f 2f 20 63 61 6e 20 62 65 20 65 61 73 69 6c 79  // can be easily
b3b0: 20 73 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33   sent to sqlite3
b3c0: 43 6f 6c 75 6d 6e 73 45 78 70 72 4c 69 73 74 28  ColumnsExprList(
b3d0: 29 2e 0a 2f 2f 0a 2f 2f 20 65 69 64 6c 69 73 74  )..//.// eidlist
b3e0: 20 69 73 20 67 72 6f 75 70 65 64 20 77 69 74 68   is grouped with
b3f0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62 65   CREATE INDEX be
b400: 63 61 75 73 65 20 69 74 20 75 73 65 64 20 74 6f  cause it used to
b410: 20 62 65 20 74 68 65 20 6e 6f 6e 2d 74 65 72 6d   be the non-term
b420: 69 6e 61 6c 0a 2f 2f 20 75 73 65 64 20 66 6f 72  inal.// used for
b430: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74   the arguments t
b440: 6f 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 61  o an index.  Tha
b450: 74 20 69 73 20 6a 75 73 74 20 61 6e 20 68 69 73  t is just an his
b460: 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65 6e 74  torical accident
b470: 2e 0a 2f 2f 0a 2f 2f 20 49 4d 50 4f 52 54 41 4e  ..//.// IMPORTAN
b480: 54 20 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 20  T COMPATIBILITY 
b490: 4e 4f 54 45 3a 20 20 53 6f 6d 65 20 70 72 69 6f  NOTE:  Some prio
b4a0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
b4b0: 4c 69 74 65 20 61 63 63 65 70 74 65 64 0a 2f 2f  Lite accepted.//
b4c0: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 73   COLLATE clauses
b4d0: 20 61 6e 64 20 41 53 43 20 6f 72 20 44 45 53 43   and ASC or DESC
b4e0: 20 6b 65 79 77 6f 72 64 73 20 6f 6e 20 49 44 20   keywords on ID 
b4f0: 6c 69 73 74 73 20 69 6e 20 69 6e 61 70 70 72 6f  lists in inappro
b500: 70 72 69 61 74 65 0a 2f 2f 20 70 6c 61 63 65 73  priate.// places
b510: 20 2d 20 70 6c 61 63 65 73 20 74 68 61 74 20 6d   - places that m
b520: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 73  ight have been s
b530: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c  tored in the sql
b540: 69 74 65 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  ite_master schem
b550: 61 2e 0a 2f 2f 20 54 68 6f 73 65 20 65 78 74 72  a..// Those extr
b560: 61 20 66 65 61 74 75 72 65 73 20 77 65 72 65 20  a features were 
b570: 69 67 6e 6f 72 65 64 2e 20 20 42 75 74 20 62 65  ignored.  But be
b580: 63 61 75 73 65 20 74 68 65 79 20 6d 69 67 68 74  cause they might
b590: 20 62 65 20 69 6e 20 73 6f 6d 65 0a 2f 2f 20 28   be in some.// (
b5a0: 62 75 73 74 65 64 29 20 6f 6c 64 20 64 61 74 61  busted) old data
b5b0: 62 61 73 65 73 2c 20 77 65 20 6e 65 65 64 20 74  bases, we need t
b5c0: 6f 20 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69  o continue parsi
b5d0: 6e 67 20 74 68 65 6d 20 77 68 65 6e 20 6c 6f 61  ng them when loa
b5e0: 64 69 6e 67 0a 2f 2f 20 68 69 73 74 6f 72 69 63  ding.// historic
b5f0: 61 6c 20 73 63 68 65 6d 61 73 2e 0a 2f 2f 0a 25  al schemas..//.%
b600: 74 79 70 65 20 65 69 64 6c 69 73 74 20 7b 45 78  type eidlist {Ex
b610: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
b620: 63 74 6f 72 20 65 69 64 6c 69 73 74 20 7b 73 71  ctor eidlist {sq
b630: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
b640: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
b650: 24 24 29 3b 7d 0a 25 74 79 70 65 20 65 69 64 6c  $$);}.%type eidl
b660: 69 73 74 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73  ist_opt {ExprLis
b670: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
b680: 65 69 64 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c  eidlist_opt {sql
b690: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
b6a0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
b6b0: 24 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b  $);}..%include {
b6c0: 0a 20 20 2f 2a 20 41 64 64 20 61 20 73 69 6e 67  .  /* Add a sing
b6d0: 6c 65 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 61  le new term to a
b6e0: 6e 20 45 78 70 72 4c 69 73 74 20 74 68 61 74 20  n ExprList that 
b6f0: 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65  is used to store
b700: 20 61 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20   a.  ** list of 
b710: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 52 65  identifiers.  Re
b720: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66  port an error if
b730: 20 74 68 65 20 49 44 20 6c 69 73 74 20 63 6f 6e   the ID list con
b740: 74 61 69 6e 73 0a 20 20 2a 2a 20 61 20 43 4f 4c  tains.  ** a COL
b750: 4c 41 54 45 20 63 6c 61 75 73 65 20 6f 72 20 61  LATE clause or a
b760: 6e 20 41 53 43 20 6f 72 20 44 45 53 43 20 6b 65  n ASC or DESC ke
b770: 79 77 6f 72 64 2c 20 65 78 63 65 70 74 20 69 67  yword, except ig
b780: 6e 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 65 72  nore the.  ** er
b790: 72 6f 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e  ror while parsin
b7a0: 67 20 61 20 6c 65 67 61 63 79 20 73 63 68 65 6d  g a legacy schem
b7b0: 61 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  a..  */.  static
b7c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 61 72 73 65   ExprList *parse
b7d0: 72 41 64 64 45 78 70 72 49 64 4c 69 73 74 54 65  rAddExprIdListTe
b7e0: 72 6d 28 0a 20 20 20 20 50 61 72 73 65 20 2a 70  rm(.    Parse *p
b7f0: 50 61 72 73 65 2c 0a 20 20 20 20 45 78 70 72 4c  Parse,.    ExprL
b800: 69 73 74 20 2a 70 50 72 69 6f 72 2c 0a 20 20 20  ist *pPrior,.   
b810: 20 54 6f 6b 65 6e 20 2a 70 49 64 54 6f 6b 65 6e   Token *pIdToken
b820: 2c 0a 20 20 20 20 69 6e 74 20 68 61 73 43 6f 6c  ,.    int hasCol
b830: 6c 61 74 65 2c 0a 20 20 20 20 69 6e 74 20 73 6f  late,.    int so
b840: 72 74 4f 72 64 65 72 0a 20 20 29 7b 0a 20 20 20  rtOrder.  ){.   
b850: 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 73   ExprList *p = s
b860: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
b870: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 50 72  pend(pParse, pPr
b880: 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ior, 0);.    if(
b890: 20 28 68 61 73 43 6f 6c 6c 61 74 65 20 7c 7c 20   (hasCollate || 
b8a0: 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54  sortOrder!=SQLIT
b8b0: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 29 0a  E_SO_UNDEFINED).
b8c0: 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 73          && pPars
b8d0: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
b8e0: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
b8f0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b900: 28 70 50 61 72 73 65 2c 20 22 73 79 6e 74 61 78  (pParse, "syntax
b910: 20 65 72 72 6f 72 20 61 66 74 65 72 20 63 6f 6c   error after col
b920: 75 6d 6e 20 6e 61 6d 65 20 5c 22 25 2e 2a 73 5c  umn name \"%.*s\
b930: 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "",.            
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64               pId
b950: 54 6f 6b 65 6e 2d 3e 6e 2c 20 70 49 64 54 6f 6b  Token->n, pIdTok
b960: 65 6e 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20  en->z);.    }.  
b970: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
b980: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
b990: 20 70 2c 20 70 49 64 54 6f 6b 65 6e 2c 20 31 29   p, pIdToken, 1)
b9a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a  ;.    return p;.
b9b0: 20 20 7d 0a 7d 20 2f 2f 20 65 6e 64 20 25 69 6e    }.} // end %in
b9c0: 63 6c 75 64 65 0a 0a 65 69 64 6c 69 73 74 5f 6f  clude..eidlist_o
b9d0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 65 69 64      {A = 0;}.eid
ba00: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
ba10: 4c 50 20 65 69 64 6c 69 73 74 28 58 29 20 52 50  LP eidlist(X) RP
ba20: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
ba30: 3b 7d 0a 65 69 64 6c 69 73 74 28 41 29 20 3a 3a  ;}.eidlist(A) ::
ba40: 3d 20 65 69 64 6c 69 73 74 28 41 29 20 43 4f 4d  = eidlist(A) COM
ba50: 4d 41 20 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65  MA nm(Y) collate
ba60: 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29  (C) sortorder(Z)
ba70: 2e 20 20 7b 0a 20 20 41 20 3d 20 70 61 72 73 65  .  {.  A = parse
ba80: 72 41 64 64 45 78 70 72 49 64 4c 69 73 74 54 65  rAddExprIdListTe
ba90: 72 6d 28 70 50 61 72 73 65 2c 20 41 2c 20 26 59  rm(pParse, A, &Y
baa0: 2c 20 43 2c 20 5a 29 3b 0a 7d 0a 65 69 64 6c 69  , C, Z);.}.eidli
bab0: 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59 29 20  st(A) ::= nm(Y) 
bac0: 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74 6f  collate(C) sorto
bad0: 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d  rder(Z). {.  A =
bae0: 20 70 61 72 73 65 72 41 64 64 45 78 70 72 49 64   parserAddExprId
baf0: 4c 69 73 74 54 65 72 6d 28 70 50 61 72 73 65 2c  ListTerm(pParse,
bb00: 20 30 2c 20 26 59 2c 20 43 2c 20 5a 29 3b 20 2f   0, &Y, C, Z); /
bb10: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 59 2a  *A-overwrites-Y*
bb20: 2f 0a 7d 0a 0a 25 74 79 70 65 20 63 6f 6c 6c 61  /.}..%type colla
bb30: 74 65 20 7b 69 6e 74 7d 0a 63 6f 6c 6c 61 74 65  te {int}.collate
bb40: 28 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (C) ::= .       
bb50: 20 20 20 20 20 20 20 7b 43 20 3d 20 30 3b 7d 0a         {C = 0;}.
bb60: 63 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d 20 43  collate(C) ::= C
bb70: 4f 4c 4c 41 54 45 20 69 64 73 2e 20 20 20 7b 43  OLLATE ids.   {C
bb80: 20 3d 20 31 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f   = 1;}...///////
bb90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bba0: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20  ////// The DROP 
bbb0: 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f  INDEX command //
bbc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bbd0: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
bbe0: 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20 69 66  := DROP INDEX if
bbf0: 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61  exists(E) fullna
bc00: 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74 65  me(X).   {sqlite
bc10: 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72 73  3DropIndex(pPars
bc20: 65 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f 2f  e, X, E);}..////
bc30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bc40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56 41  ///////// The VA
bc50: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  CUUM command ///
bc60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bc70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69  //////////.//.%i
bc80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bc90: 54 5f 56 41 43 55 55 4d 0a 25 69 66 6e 64 65 66  T_VACUUM.%ifndef
bca0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54   SQLITE_OMIT_ATT
bcb0: 41 43 48 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55  ACH.cmd ::= VACU
bcc0: 55 4d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  UM.             
bcd0: 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75     {sqlite3Vacuu
bce0: 6d 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a 63 6d  m(pParse,0);}.cm
bcf0: 64 20 3a 3a 3d 20 56 41 43 55 55 4d 20 6e 6d 28  d ::= VACUUM nm(
bd00: 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 73 71  X).          {sq
bd10: 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50 61 72  lite3Vacuum(pPar
bd20: 73 65 2c 26 58 29 3b 7d 0a 25 65 6e 64 69 66 20  se,&X);}.%endif 
bd30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54   SQLITE_OMIT_ATT
bd40: 41 43 48 0a 25 65 6e 64 69 66 20 20 53 51 4c 49  ACH.%endif  SQLI
bd50: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 0a  TE_OMIT_VACUUM..
bd60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bd70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
bd80: 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  e PRAGMA command
bd90: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
bda0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
bdb0: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
bdc0: 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 63 6d 64  _OMIT_PRAGMA.cmd
bdd0: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58   ::= PRAGMA nm(X
bde0: 29 20 64 62 6e 6d 28 5a 29 2e 20 20 20 20 20 20  ) dbnm(Z).      
bdf0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
be00: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  e3Pragma(pParse,
be10: 26 58 2c 26 5a 2c 30 2c 30 29 3b 7d 0a 63 6d 64  &X,&Z,0,0);}.cmd
be20: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58   ::= PRAGMA nm(X
be30: 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6e 6d 6e  ) dbnm(Z) EQ nmn
be40: 75 6d 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74  um(Y).    {sqlit
be50: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  e3Pragma(pParse,
be60: 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d  &X,&Z,&Y,0);}.cm
be70: 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28  d ::= PRAGMA nm(
be80: 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20 6e 6d  X) dbnm(Z) LP nm
be90: 6e 75 6d 28 59 29 20 52 50 2e 20 7b 73 71 6c 69  num(Y) RP. {sqli
bea0: 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65  te3Pragma(pParse
beb0: 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63  ,&X,&Z,&Y,0);}.c
bec0: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
bed0: 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6d  (X) dbnm(Z) EQ m
bee0: 69 6e 75 73 5f 6e 75 6d 28 59 29 2e 20 0a 20 20  inus_num(Y). .  
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
bf20: 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65  te3Pragma(pParse
bf30: 2c 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 7d 0a 63  ,&X,&Z,&Y,1);}.c
bf40: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
bf50: 28 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20 6d  (X) dbnm(Z) LP m
bf60: 69 6e 75 73 5f 6e 75 6d 28 59 29 20 52 50 2e 0a  inus_num(Y) RP..
bf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
bfa0: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
bfb0: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 7d  se,&X,&Z,&Y,1);}
bfc0: 0a 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 70  ..nmnum(A) ::= p
bfd0: 6c 75 73 5f 6e 75 6d 28 41 29 2e 0a 6e 6d 6e 75  lus_num(A)..nmnu
bfe0: 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 41 29 2e 0a  m(A) ::= nm(A)..
bff0: 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 4f 4e 28  nmnum(A) ::= ON(
c000: 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d  A)..nmnum(A) ::=
c010: 20 44 45 4c 45 54 45 28 41 29 2e 0a 6e 6d 6e 75   DELETE(A)..nmnu
c020: 6d 28 41 29 20 3a 3a 3d 20 44 45 46 41 55 4c 54  m(A) ::= DEFAULT
c030: 28 41 29 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49  (A)..%endif SQLI
c040: 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 25  TE_OMIT_PRAGMA.%
c050: 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6e 75 6d 62  token_class numb
c060: 65 72 20 49 4e 54 45 47 45 52 7c 46 4c 4f 41 54  er INTEGER|FLOAT
c070: 2e 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a  ..plus_num(A) ::
c080: 3d 20 50 4c 55 53 20 6e 75 6d 62 65 72 28 58 29  = PLUS number(X)
c090: 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  .       {A = X;}
c0a0: 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d  .plus_num(A) ::=
c0b0: 20 6e 75 6d 62 65 72 28 41 29 2e 0a 6d 69 6e 75   number(A)..minu
c0c0: 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e  s_num(A) ::= MIN
c0d0: 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20  US number(X).   
c0e0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 2f 2f 2f 2f 2f    {A = X;}./////
c0f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c100: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41  /////// The CREA
c110: 54 45 20 54 52 49 47 47 45 52 20 63 6f 6d 6d 61  TE TRIGGER comma
c120: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
c130: 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64 65  ////////..%ifnde
c140: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
c150: 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20 63  IGGER..cmd ::= c
c160: 72 65 61 74 65 6b 77 20 74 72 69 67 67 65 72 5f  reatekw trigger_
c170: 64 65 63 6c 28 41 29 20 42 45 47 49 4e 20 74 72  decl(A) BEGIN tr
c180: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53  igger_cmd_list(S
c190: 29 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f  ) END(Z). {.  To
c1a0: 6b 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a  ken all;.  all.z
c1b0: 20 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20   = A.z;.  all.n 
c1c0: 3d 20 28 69 6e 74 29 28 5a 2e 7a 20 2d 20 41 2e  = (int)(Z.z - A.
c1d0: 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71 6c 69  z) + Z.n;.  sqli
c1e0: 74 65 33 46 69 6e 69 73 68 54 72 69 67 67 65 72  te3FinishTrigger
c1f0: 28 70 50 61 72 73 65 2c 20 53 2c 20 26 61 6c 6c  (pParse, S, &all
c200: 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72 5f 64 65  );.}..trigger_de
c210: 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d 70 28 54  cl(A) ::= temp(T
c220: 29 20 54 52 49 47 47 45 52 20 69 66 6e 6f 74 65  ) TRIGGER ifnote
c230: 78 69 73 74 73 28 4e 4f 45 52 52 29 20 6e 6d 28  xists(NOERR) nm(
c240: 42 29 20 64 62 6e 6d 28 5a 29 20 0a 20 20 20 20  B) dbnm(Z) .    
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 43 29 20  trigger_time(C) 
c270: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28 44 29  trigger_event(D)
c280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c290: 20 20 20 20 20 4f 4e 20 66 75 6c 6c 6e 61 6d 65       ON fullname
c2a0: 28 45 29 20 66 6f 72 65 61 63 68 5f 63 6c 61 75  (E) foreach_clau
c2b0: 73 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 28 47  se when_clause(G
c2c0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 42 65  ). {.  sqlite3Be
c2d0: 67 69 6e 54 72 69 67 67 65 72 28 70 50 61 72 73  ginTrigger(pPars
c2e0: 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c 20 44 2e  e, &B, &Z, C, D.
c2f0: 61 2c 20 44 2e 62 2c 20 45 2c 20 47 2c 20 54 2c  a, D.b, E, G, T,
c300: 20 4e 4f 45 52 52 29 3b 0a 20 20 41 20 3d 20 28   NOERR);.  A = (
c310: 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29 3b 20 2f 2a 41  Z.n==0?B:Z); /*A
c320: 2d 6f 76 65 72 77 72 69 74 65 73 2d 54 2a 2f 0a  -overwrites-T*/.
c330: 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72  }..%type trigger
c340: 5f 74 69 6d 65 20 7b 69 6e 74 7d 0a 74 72 69 67  _time {int}.trig
c350: 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20  ger_time(A) ::= 
c360: 42 45 46 4f 52 45 7c 41 46 54 45 52 28 58 29 2e  BEFORE|AFTER(X).
c370: 20 20 7b 20 41 20 3d 20 40 58 3b 20 2f 2a 41 2d    { A = @X; /*A-
c380: 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 20 7d  overwrites-X*/ }
c390: 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29  .trigger_time(A)
c3a0: 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46 2e   ::= INSTEAD OF.
c3b0: 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54 45    { A = TK_INSTE
c3c0: 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d  AD;}.trigger_tim
c3d0: 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  e(A) ::= .      
c3e0: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42        { A = TK_B
c3f0: 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65 20  EFORE; }..%type 
c400: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73  trigger_event {s
c410: 74 72 75 63 74 20 54 72 69 67 45 76 65 6e 74 7d  truct TrigEvent}
c420: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72 69  .%destructor tri
c430: 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c 69  gger_event {sqli
c440: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
c450: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e 62  pParse->db, $$.b
c460: 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e  );}.trigger_even
c470: 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 7c  t(A) ::= DELETE|
c480: 49 4e 53 45 52 54 28 58 29 2e 20 20 20 7b 41 2e  INSERT(X).   {A.
c490: 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72  a = @X; /*A-over
c4a0: 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e 62 20 3d  writes-X*/ A.b =
c4b0: 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65   0;}.trigger_eve
c4c0: 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45  nt(A) ::= UPDATE
c4d0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 41  (X).          {A
c4e0: 2e 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65  .a = @X; /*A-ove
c4f0: 72 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e 62 20  rwrites-X*/ A.b 
c500: 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76  = 0;}.trigger_ev
c510: 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54  ent(A) ::= UPDAT
c520: 45 20 4f 46 20 69 64 6c 69 73 74 28 58 29 2e 7b  E OF idlist(X).{
c530: 41 2e 61 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b  A.a = TK_UPDATE;
c540: 20 41 2e 62 20 3d 20 58 3b 7d 0a 0a 66 6f 72 65   A.b = X;}..fore
c550: 61 63 68 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 2e  ach_clause ::= .
c560: 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 20  .foreach_clause 
c570: 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 52 4f 57  ::= FOR EACH ROW
c580: 2e 0a 0a 25 74 79 70 65 20 77 68 65 6e 5f 63 6c  ...%type when_cl
c590: 61 75 73 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65  ause {Expr*}.%de
c5a0: 73 74 72 75 63 74 6f 72 20 77 68 65 6e 5f 63 6c  structor when_cl
c5b0: 61 75 73 65 20 7b 73 71 6c 69 74 65 33 45 78 70  ause {sqlite3Exp
c5c0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
c5d0: 64 62 2c 20 24 24 29 3b 7d 0a 77 68 65 6e 5f 63  db, $$);}.when_c
c5e0: 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20  lause(A) ::= .  
c5f0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
c600: 20 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61 75 73   0; }.when_claus
c610: 65 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78  e(A) ::= WHEN ex
c620: 70 72 28 58 29 2e 20 7b 20 41 20 3d 20 58 2e 70  pr(X). { A = X.p
c630: 45 78 70 72 3b 20 7d 0a 0a 25 74 79 70 65 20 74  Expr; }..%type t
c640: 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20  rigger_cmd_list 
c650: 7b 54 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25  {TriggerStep*}.%
c660: 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67 67  destructor trigg
c670: 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 73 71 6c  er_cmd_list {sql
c680: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65  ite3DeleteTrigge
c690: 72 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62  rStep(pParse->db
c6a0: 2c 20 24 24 29 3b 7d 0a 74 72 69 67 67 65 72 5f  , $$);}.trigger_
c6b0: 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20  cmd_list(A) ::= 
c6c0: 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74  trigger_cmd_list
c6d0: 28 41 29 20 74 72 69 67 67 65 72 5f 63 6d 64 28  (A) trigger_cmd(
c6e0: 58 29 20 53 45 4d 49 2e 20 7b 0a 20 20 61 73 73  X) SEMI. {.  ass
c6f0: 65 72 74 28 20 41 21 3d 30 20 29 3b 0a 20 20 41  ert( A!=0 );.  A
c700: 2d 3e 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d  ->pLast->pNext =
c710: 20 58 3b 0a 20 20 41 2d 3e 70 4c 61 73 74 20 3d   X;.  A->pLast =
c720: 20 58 3b 0a 7d 0a 74 72 69 67 67 65 72 5f 63 6d   X;.}.trigger_cm
c730: 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72  d_list(A) ::= tr
c740: 69 67 67 65 72 5f 63 6d 64 28 41 29 20 53 45 4d  igger_cmd(A) SEM
c750: 49 2e 20 7b 20 0a 20 20 61 73 73 65 72 74 28 20  I. { .  assert( 
c760: 41 21 3d 30 20 29 3b 0a 20 20 41 2d 3e 70 4c 61  A!=0 );.  A->pLa
c770: 73 74 20 3d 20 41 3b 0a 7d 0a 0a 2f 2f 20 44 69  st = A;.}..// Di
c780: 73 61 6c 6c 6f 77 20 71 75 61 6c 69 66 69 65 64  sallow qualified
c790: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 6f 6e 20   table names on 
c7a0: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
c7b0: 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61 74 65  and DELETE state
c7c0: 6d 65 6e 74 73 0a 2f 2f 20 77 69 74 68 69 6e 20  ments.// within 
c7d0: 61 20 74 72 69 67 67 65 72 2e 20 20 54 68 65 20  a trigger.  The 
c7e0: 74 61 62 6c 65 20 74 6f 20 49 4e 53 45 52 54 2c  table to INSERT,
c7f0: 20 55 50 44 41 54 45 2c 20 6f 72 20 44 45 4c 45   UPDATE, or DELE
c800: 54 45 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  TE is always in 
c810: 0a 2f 2f 20 74 68 65 20 73 61 6d 65 20 64 61 74  .// the same dat
c820: 61 62 61 73 65 20 61 73 20 74 68 65 20 74 61 62  abase as the tab
c830: 6c 65 20 74 68 61 74 20 74 68 65 20 74 72 69 67  le that the trig
c840: 67 65 72 20 66 69 72 65 73 20 6f 6e 2e 0a 2f 2f  ger fires on..//
c850: 0a 25 74 79 70 65 20 74 72 6e 6d 20 7b 54 6f 6b  .%type trnm {Tok
c860: 65 6e 7d 0a 74 72 6e 6d 28 41 29 20 3a 3a 3d 20  en}.trnm(A) ::= 
c870: 6e 6d 28 41 29 2e 0a 74 72 6e 6d 28 41 29 20 3a  nm(A)..trnm(A) :
c880: 3a 3d 20 6e 6d 20 44 4f 54 20 6e 6d 28 58 29 2e  := nm DOT nm(X).
c890: 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20 20 73 71   {.  A = X;.  sq
c8a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
c8b0: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22  arse, .        "
c8c0: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
c8d0: 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74 20 61 6c  names are not al
c8e0: 6c 6f 77 65 64 20 6f 6e 20 49 4e 53 45 52 54 2c  lowed on INSERT,
c8f0: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c   UPDATE, and DEL
c900: 45 54 45 20 22 0a 20 20 20 20 20 20 20 20 22 73  ETE ".        "s
c910: 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e  tatements within
c920: 20 74 72 69 67 67 65 72 73 22 29 3b 0a 7d 0a 0a   triggers");.}..
c930: 2f 2f 20 44 69 73 61 6c 6c 6f 77 20 74 68 65 20  // Disallow the 
c940: 49 4e 44 45 58 20 42 59 20 61 6e 64 20 4e 4f 54  INDEX BY and NOT
c950: 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73   INDEXED clauses
c960: 20 6f 6e 20 55 50 44 41 54 45 20 61 6e 64 20 44   on UPDATE and D
c970: 45 4c 45 54 45 0a 2f 2f 20 73 74 61 74 65 6d 65  ELETE.// stateme
c980: 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67  nts within trigg
c990: 65 72 73 2e 20 20 57 65 20 6d 61 6b 65 20 61 20  ers.  We make a 
c9a0: 73 70 65 63 69 66 69 63 20 65 72 72 6f 72 20 6d  specific error m
c9b0: 65 73 73 61 67 65 20 66 6f 72 20 74 68 69 73 0a  essage for this.
c9c0: 2f 2f 20 73 69 6e 63 65 20 69 74 20 69 73 20 61  // since it is a
c9d0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74  n exception to t
c9e0: 68 65 20 64 65 66 61 75 6c 74 20 67 72 61 6d 6d  he default gramm
c9f0: 61 72 20 72 75 6c 65 73 2e 0a 2f 2f 0a 74 72 69  ar rules..//.tri
ca00: 64 78 62 79 20 3a 3a 3d 20 2e 0a 74 72 69 64 78  dxby ::= ..tridx
ca10: 62 79 20 3a 3a 3d 20 49 4e 44 45 58 45 44 20 42  by ::= INDEXED B
ca20: 59 20 6e 6d 2e 20 7b 0a 20 20 73 71 6c 69 74 65  Y nm. {.  sqlite
ca30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ca40: 2c 0a 20 20 20 20 20 20 20 20 22 74 68 65 20 49  ,.        "the I
ca50: 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
ca60: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20   is not allowed 
ca70: 6f 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  on UPDATE or DEL
ca80: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 22  ETE statements "
ca90: 0a 20 20 20 20 20 20 20 20 22 77 69 74 68 69 6e  .        "within
caa0: 20 74 72 69 67 67 65 72 73 22 29 3b 0a 7d 0a 74   triggers");.}.t
cab0: 72 69 64 78 62 79 20 3a 3a 3d 20 4e 4f 54 20 49  ridxby ::= NOT I
cac0: 4e 44 45 58 45 44 2e 20 7b 0a 20 20 73 71 6c 69  NDEXED. {.  sqli
cad0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
cae0: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 74 68 65  se,.        "the
caf0: 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
cb00: 75 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  use is not allow
cb10: 65 64 20 6f 6e 20 55 50 44 41 54 45 20 6f 72 20  ed on UPDATE or 
cb20: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
cb30: 73 20 22 0a 20 20 20 20 20 20 20 20 22 77 69 74  s ".        "wit
cb40: 68 69 6e 20 74 72 69 67 67 65 72 73 22 29 3b 0a  hin triggers");.
cb50: 7d 0a 0a 0a 0a 25 74 79 70 65 20 74 72 69 67 67  }....%type trigg
cb60: 65 72 5f 63 6d 64 20 7b 54 72 69 67 67 65 72 53  er_cmd {TriggerS
cb70: 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  tep*}.%destructo
cb80: 72 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 73  r trigger_cmd {s
cb90: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
cba0: 67 65 72 53 74 65 70 28 70 50 61 72 73 65 2d 3e  gerStep(pParse->
cbb0: 64 62 2c 20 24 24 29 3b 7d 0a 2f 2f 20 55 50 44  db, $$);}.// UPD
cbc0: 41 54 45 20 0a 74 72 69 67 67 65 72 5f 63 6d 64  ATE .trigger_cmd
cbd0: 28 41 29 20 3a 3a 3d 0a 20 20 20 55 50 44 41 54  (A) ::=.   UPDAT
cbe0: 45 20 6f 72 63 6f 6e 66 28 52 29 20 74 72 6e 6d  E orconf(R) trnm
cbf0: 28 58 29 20 74 72 69 64 78 62 79 20 53 45 54 20  (X) tridxby SET 
cc00: 73 65 74 6c 69 73 74 28 59 29 20 77 68 65 72 65  setlist(Y) where
cc10: 5f 6f 70 74 28 5a 29 2e 20 20 0a 20 20 20 7b 41  _opt(Z).  .   {A
cc20: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
cc30: 72 55 70 64 61 74 65 53 74 65 70 28 70 50 61 72  rUpdateStep(pPar
cc40: 73 65 2d 3e 64 62 2c 20 26 58 2c 20 59 2c 20 5a  se->db, &X, Y, Z
cc50: 2c 20 52 29 3b 7d 0a 0a 2f 2f 20 49 4e 53 45 52  , R);}..// INSER
cc60: 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  T.trigger_cmd(A)
cc70: 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28   ::= insert_cmd(
cc80: 52 29 20 49 4e 54 4f 20 74 72 6e 6d 28 58 29 20  R) INTO trnm(X) 
cc90: 69 64 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65  idlist_opt(F) se
cca0: 6c 65 63 74 28 53 29 2e 0a 20 20 20 7b 41 20 3d  lect(S)..   {A =
ccb0: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 49   sqlite3TriggerI
ccc0: 6e 73 65 72 74 53 74 65 70 28 70 50 61 72 73 65  nsertStep(pParse
ccd0: 2d 3e 64 62 2c 20 26 58 2c 20 46 2c 20 53 2c 20  ->db, &X, F, S, 
cce0: 52 29 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  R);/*A-overwrite
ccf0: 73 2d 52 2a 2f 7d 0a 0a 2f 2f 20 44 45 4c 45 54  s-R*/}..// DELET
cd00: 45 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  E.trigger_cmd(A)
cd10: 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f 4d   ::= DELETE FROM
cd20: 20 74 72 6e 6d 28 58 29 20 74 72 69 64 78 62 79   trnm(X) tridxby
cd30: 20 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 0a 20   where_opt(Y).. 
cd40: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72    {A = sqlite3Tr
cd50: 69 67 67 65 72 44 65 6c 65 74 65 53 74 65 70 28  iggerDeleteStep(
cd60: 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58 2c 20  pParse->db, &X, 
cd70: 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a  Y);}..// SELECT.
cd80: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a  trigger_cmd(A) :
cd90: 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 0a 20 20  := select(X)..  
cda0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69   {A = sqlite3Tri
cdb0: 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28 70  ggerSelectStep(p
cdc0: 50 61 72 73 65 2d 3e 64 62 2c 20 58 29 3b 20 2f  Parse->db, X); /
cdd0: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a  *A-overwrites-X*
cde0: 2f 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63 69  /}..// The speci
cdf0: 61 6c 20 52 41 49 53 45 20 65 78 70 72 65 73 73  al RAISE express
ce00: 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63 63  ion that may occ
ce10: 75 72 20 69 6e 20 74 72 69 67 67 65 72 20 70 72  ur in trigger pr
ce20: 6f 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20 3a  ograms.expr(A) :
ce30: 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 49  := RAISE(X) LP I
ce40: 47 4e 4f 52 45 20 52 50 28 59 29 2e 20 20 7b 0a  GNORE RP(Y).  {.
ce50: 20 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c    spanSet(&A,&X,
ce60: 26 59 29 3b 20 20 2f 2a 41 2d 6f 76 65 72 77 72  &Y);  /*A-overwr
ce70: 69 74 65 73 2d 58 2a 2f 0a 20 20 41 2e 70 45 78  ites-X*/.  A.pEx
ce80: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
ce90: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 41 49  r(pParse, TK_RAI
cea0: 53 45 2c 20 30 2c 20 30 29 3b 20 0a 20 20 69 66  SE, 0, 0); .  if
ceb0: 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  ( A.pExpr ){.   
cec0: 20 41 2e 70 45 78 70 72 2d 3e 61 66 66 69 6e 69   A.pExpr->affini
ced0: 74 79 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 0a  ty = OE_Ignore;.
cee0: 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a    }.}.expr(A) ::
cef0: 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 72 61  = RAISE(X) LP ra
cf00: 69 73 65 74 79 70 65 28 54 29 20 43 4f 4d 4d 41  isetype(T) COMMA
cf10: 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20 20 7b   nm(Z) RP(Y).  {
cf20: 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58  .  spanSet(&A,&X
cf30: 2c 26 59 29 3b 20 20 2f 2a 41 2d 6f 76 65 72 77  ,&Y);  /*A-overw
cf40: 72 69 74 65 73 2d 58 2a 2f 0a 20 20 41 2e 70 45  rites-X*/.  A.pE
cf50: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
cf60: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
cf70: 62 2c 20 54 4b 5f 52 41 49 53 45 2c 20 26 5a 2c  b, TK_RAISE, &Z,
cf80: 20 31 29 3b 20 0a 20 20 69 66 28 20 41 2e 70 45   1); .  if( A.pE
cf90: 78 70 72 20 29 20 7b 0a 20 20 20 20 41 2e 70 45  xpr ) {.    A.pE
cfa0: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
cfb0: 28 63 68 61 72 29 54 3b 0a 20 20 7d 0a 7d 0a 25  (char)T;.  }.}.%
cfc0: 65 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f  endif  !SQLITE_O
cfd0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 25 74 79  MIT_TRIGGER..%ty
cfe0: 70 65 20 72 61 69 73 65 74 79 70 65 20 7b 69 6e  pe raisetype {in
cff0: 74 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20  t}.raisetype(A) 
d000: 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b  ::= ROLLBACK.  {
d010: 41 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b  A = OE_Rollback;
d020: 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a  }.raisetype(A) :
d030: 3a 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 7b 41  := ABORT.     {A
d040: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61   = OE_Abort;}.ra
d050: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46  isetype(A) ::= F
d060: 41 49 4c 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f  AIL.      {A = O
d070: 45 5f 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f  E_Fail;}.../////
d080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d090: 2f 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45  ///  DROP TRIGGE
d0a0: 52 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  R statement ////
d0b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d0c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
d0d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
d0e0: 52 49 47 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44  RIGGER.cmd ::= D
d0f0: 52 4f 50 20 54 52 49 47 47 45 52 20 69 66 65 78  ROP TRIGGER ifex
d100: 69 73 74 73 28 4e 4f 45 52 52 29 20 66 75 6c 6c  ists(NOERR) full
d110: 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c  name(X). {.  sql
d120: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28  ite3DropTrigger(
d130: 70 50 61 72 73 65 2c 58 2c 4e 4f 45 52 52 29 3b  pParse,X,NOERR);
d140: 0a 7d 0a 25 65 6e 64 69 66 20 20 21 53 51 4c 49  .}.%endif  !SQLI
d150: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
d160: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
d170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 54 54 41 43 48  ///////// ATTACH
d180: 20 44 41 54 41 42 41 53 45 20 66 69 6c 65 20 41   DATABASE file A
d190: 53 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  S name /////////
d1a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d1b0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
d1c0: 4f 4d 49 54 5f 41 54 54 41 43 48 0a 63 6d 64 20  OMIT_ATTACH.cmd 
d1d0: 3a 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61 62  ::= ATTACH datab
d1e0: 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28  ase_kw_opt expr(
d1f0: 46 29 20 41 53 20 65 78 70 72 28 44 29 20 6b 65  F) AS expr(D) ke
d200: 79 5f 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71  y_opt(K). {.  sq
d210: 6c 69 74 65 33 41 74 74 61 63 68 28 70 50 61 72  lite3Attach(pPar
d220: 73 65 2c 20 46 2e 70 45 78 70 72 2c 20 44 2e 70  se, F.pExpr, D.p
d230: 45 78 70 72 2c 20 4b 29 3b 0a 7d 0a 63 6d 64 20  Expr, K);.}.cmd 
d240: 3a 3a 3d 20 44 45 54 41 43 48 20 64 61 74 61 62  ::= DETACH datab
d250: 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28  ase_kw_opt expr(
d260: 44 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44  D). {.  sqlite3D
d270: 65 74 61 63 68 28 70 50 61 72 73 65 2c 20 44 2e  etach(pParse, D.
d280: 70 45 78 70 72 29 3b 0a 7d 0a 0a 25 74 79 70 65  pExpr);.}..%type
d290: 20 6b 65 79 5f 6f 70 74 20 7b 45 78 70 72 2a 7d   key_opt {Expr*}
d2a0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79  .%destructor key
d2b0: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70  _opt {sqlite3Exp
d2c0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
d2d0: 64 62 2c 20 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70  db, $$);}.key_op
d2e0: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
d300: 20 41 20 3d 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70   A = 0; }.key_op
d310: 74 28 41 29 20 3a 3a 3d 20 4b 45 59 20 65 78 70  t(A) ::= KEY exp
d320: 72 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b  r(X).          {
d330: 20 41 20 3d 20 58 2e 70 45 78 70 72 3b 20 7d 0a   A = X.pExpr; }.
d340: 0a 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74  .database_kw_opt
d350: 20 3a 3a 3d 20 44 41 54 41 42 41 53 45 2e 0a 64   ::= DATABASE..d
d360: 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a  atabase_kw_opt :
d370: 3a 3d 20 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49  := ..%endif SQLI
d380: 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 0a  TE_OMIT_ATTACH..
d390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d3a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44  ////////// REIND
d3b0: 45 58 20 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f  EX collation ///
d3c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d3d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
d3e0: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
d3f0: 4d 49 54 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20  MIT_REINDEX.cmd 
d400: 3a 3a 3d 20 52 45 49 4e 44 45 58 2e 20 20 20 20  ::= REINDEX.    
d410: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
d420: 69 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72  ite3Reindex(pPar
d430: 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20  se, 0, 0);}.cmd 
d440: 3a 3a 3d 20 52 45 49 4e 44 45 58 20 6e 6d 28 58  ::= REINDEX nm(X
d450: 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c  ) dbnm(Y).  {sql
d460: 69 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72  ite3Reindex(pPar
d470: 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65  se, &X, &Y);}.%e
d480: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
d490: 54 5f 52 45 49 4e 44 45 58 0a 0a 2f 2f 2f 2f 2f  T_REINDEX../////
d4a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d4b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41  ////////////// A
d4c0: 4e 41 4c 59 5a 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  NALYZE /////////
d4d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
d4f0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
d500: 4e 41 4c 59 5a 45 0a 63 6d 64 20 3a 3a 3d 20 41  NALYZE.cmd ::= A
d510: 4e 41 4c 59 5a 45 2e 20 20 20 20 20 20 20 20 20  NALYZE.         
d520: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41         {sqlite3A
d530: 6e 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 30  nalyze(pParse, 0
d540: 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 41  , 0);}.cmd ::= A
d550: 4e 41 4c 59 5a 45 20 6e 6d 28 58 29 20 64 62 6e  NALYZE nm(X) dbn
d560: 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 41  m(Y).  {sqlite3A
d570: 6e 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 26  nalyze(pParse, &
d580: 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66 0a  X, &Y);}.%endif.
d590: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
d5a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20  ///////// ALTER 
d5b0: 54 41 42 4c 45 20 74 61 62 6c 65 20 2e 2e 2e 20  TABLE table ... 
d5c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d5d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d5e0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
d5f0: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
d600: 63 6d 64 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41  cmd ::= ALTER TA
d610: 42 4c 45 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20  BLE fullname(X) 
d620: 52 45 4e 41 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e  RENAME TO nm(Z).
d630: 20 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65   {.  sqlite3Alte
d640: 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 70 50 61  rRenameTable(pPa
d650: 72 73 65 2c 58 2c 26 5a 29 3b 0a 7d 0a 63 6d 64  rse,X,&Z);.}.cmd
d660: 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45   ::= ALTER TABLE
d670: 20 61 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c   add_column_full
d680: 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 41 44 44  name.        ADD
d690: 20 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63 6f   kwcolumn_opt co
d6a0: 6c 75 6d 6e 6e 61 6d 65 28 59 29 20 63 61 72 67  lumnname(Y) carg
d6b0: 6c 69 73 74 2e 20 7b 0a 20 20 59 2e 6e 20 3d 20  list. {.  Y.n = 
d6c0: 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c  (int)(pParse->sL
d6d0: 61 73 74 54 6f 6b 65 6e 2e 7a 2d 59 2e 7a 29 20  astToken.z-Y.z) 
d6e0: 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  + pParse->sLastT
d6f0: 6f 6b 65 6e 2e 6e 3b 0a 20 20 73 71 6c 69 74 65  oken.n;.  sqlite
d700: 33 41 6c 74 65 72 46 69 6e 69 73 68 41 64 64 43  3AlterFinishAddC
d710: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 26 59  olumn(pParse, &Y
d720: 29 3b 0a 7d 0a 61 64 64 5f 63 6f 6c 75 6d 6e 5f  );.}.add_column_
d730: 66 75 6c 6c 6e 61 6d 65 20 3a 3a 3d 20 66 75 6c  fullname ::= ful
d740: 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 64 69  lname(X). {.  di
d750: 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 28 70  sableLookaside(p
d760: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
d770: 33 41 6c 74 65 72 42 65 67 69 6e 41 64 64 43 6f  3AlterBeginAddCo
d780: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 58 29 3b  lumn(pParse, X);
d790: 0a 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20  .}.kwcolumn_opt 
d7a0: 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f  ::= ..kwcolumn_o
d7b0: 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57 2e  pt ::= COLUMNKW.
d7c0: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
d7d0: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
d7e0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
d7f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54 45  ///////// CREATE
d800: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 2e   VIRTUAL TABLE .
d810: 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .. /////////////
d820: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d830: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
d840: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d850: 45 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65  E.cmd ::= create
d860: 5f 76 74 61 62 2e 20 20 20 20 20 20 20 20 20 20  _vtab.          
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
d880: 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50  lite3VtabFinishP
d890: 61 72 73 65 28 70 50 61 72 73 65 2c 30 29 3b 7d  arse(pParse,0);}
d8a0: 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f  .cmd ::= create_
d8b0: 76 74 61 62 20 4c 50 20 76 74 61 62 61 72 67 6c  vtab LP vtabargl
d8c0: 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c  ist RP(X).  {sql
d8d0: 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50 61  ite3VtabFinishPa
d8e0: 72 73 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d  rse(pParse,&X);}
d8f0: 0a 63 72 65 61 74 65 5f 76 74 61 62 20 3a 3a 3d  .create_vtab ::=
d900: 20 63 72 65 61 74 65 6b 77 20 56 49 52 54 55 41   createkw VIRTUA
d910: 4c 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78 69  L TABLE ifnotexi
d920: 73 74 73 28 45 29 0a 20 20 20 20 20 20 20 20 20  sts(E).         
d930: 20 20 20 20 20 20 20 6e 6d 28 58 29 20 64 62 6e         nm(X) dbn
d940: 6d 28 59 29 20 55 53 49 4e 47 20 6e 6d 28 5a 29  m(Y) USING nm(Z)
d950: 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  . {.    sqlite3V
d960: 74 61 62 42 65 67 69 6e 50 61 72 73 65 28 70 50  tabBeginParse(pP
d970: 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a  arse, &X, &Y, &Z
d980: 2c 20 45 29 3b 0a 7d 0a 76 74 61 62 61 72 67 6c  , E);.}.vtabargl
d990: 69 73 74 20 3a 3a 3d 20 76 74 61 62 61 72 67 2e  ist ::= vtabarg.
d9a0: 0a 76 74 61 62 61 72 67 6c 69 73 74 20 3a 3a 3d  .vtabarglist ::=
d9b0: 20 76 74 61 62 61 72 67 6c 69 73 74 20 43 4f 4d   vtabarglist COM
d9c0: 4d 41 20 76 74 61 62 61 72 67 2e 0a 76 74 61 62  MA vtabarg..vtab
d9d0: 61 72 67 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  arg ::= .       
d9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9f0: 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 49  {sqlite3VtabArgI
da00: 6e 69 74 28 70 50 61 72 73 65 29 3b 7d 0a 76 74  nit(pParse);}.vt
da10: 61 62 61 72 67 20 3a 3a 3d 20 76 74 61 62 61 72  abarg ::= vtabar
da20: 67 20 76 74 61 62 61 72 67 74 6f 6b 65 6e 2e 0a  g vtabargtoken..
da30: 76 74 61 62 61 72 67 74 6f 6b 65 6e 20 3a 3a 3d  vtabargtoken ::=
da40: 20 41 4e 59 28 58 29 2e 20 20 20 20 20 20 20 20   ANY(X).        
da50: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62      {sqlite3Vtab
da60: 41 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65  ArgExtend(pParse
da70: 2c 26 58 29 3b 7d 0a 76 74 61 62 61 72 67 74 6f  ,&X);}.vtabargto
da80: 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c 69  ken ::= lp anyli
da90: 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c 69  st RP(X).  {sqli
daa0: 74 65 33 56 74 61 62 41 72 67 45 78 74 65 6e 64  te3VtabArgExtend
dab0: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 6c 70  (pParse,&X);}.lp
dac0: 20 3a 3a 3d 20 4c 50 28 58 29 2e 20 20 20 20 20   ::= LP(X).     
dad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dae0: 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72    {sqlite3VtabAr
daf0: 67 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c 26  gExtend(pParse,&
db00: 58 29 3b 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d  X);}.anylist ::=
db10: 20 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61   ..anylist ::= a
db20: 6e 79 6c 69 73 74 20 4c 50 20 61 6e 79 6c 69 73  nylist LP anylis
db30: 74 20 52 50 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a  t RP..anylist ::
db40: 3d 20 61 6e 79 6c 69 73 74 20 41 4e 59 2e 0a 25  = anylist ANY..%
db50: 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d  endif  SQLITE_OM
db60: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
db70: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
db80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 4f 4d 4d 4f  ////////// COMMO
db90: 4e 20 54 41 42 4c 45 20 45 58 50 52 45 53 53 49  N TABLE EXPRESSI
dba0: 4f 4e 53 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ONS ////////////
dbb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
dbc0: 0a 25 74 79 70 65 20 77 69 74 68 20 7b 57 69 74  .%type with {Wit
dbd0: 68 2a 7d 0a 25 74 79 70 65 20 77 71 6c 69 73 74  h*}.%type wqlist
dbe0: 20 7b 57 69 74 68 2a 7d 0a 25 64 65 73 74 72 75   {With*}.%destru
dbf0: 63 74 6f 72 20 77 69 74 68 20 7b 73 71 6c 69 74  ctor with {sqlit
dc00: 65 33 57 69 74 68 44 65 6c 65 74 65 28 70 50 61  e3WithDelete(pPa
dc10: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
dc20: 64 65 73 74 72 75 63 74 6f 72 20 77 71 6c 69 73  destructor wqlis
dc30: 74 20 7b 73 71 6c 69 74 65 33 57 69 74 68 44 65  t {sqlite3WithDe
dc40: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
dc50: 20 24 24 29 3b 7d 0a 0a 77 69 74 68 28 41 29 20   $$);}..with(A) 
dc60: 3a 3a 3d 20 2e 20 7b 41 20 3d 20 30 3b 7d 0a 25  ::= . {A = 0;}.%
dc70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dc80: 49 54 5f 43 54 45 0a 77 69 74 68 28 41 29 20 3a  IT_CTE.with(A) :
dc90: 3a 3d 20 57 49 54 48 20 77 71 6c 69 73 74 28 57  := WITH wqlist(W
dca0: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
dcb0: 7b 20 41 20 3d 20 57 3b 20 7d 0a 77 69 74 68 28  { A = W; }.with(
dcc0: 41 29 20 3a 3a 3d 20 57 49 54 48 20 52 45 43 55  A) ::= WITH RECU
dcd0: 52 53 49 56 45 20 77 71 6c 69 73 74 28 57 29 2e  RSIVE wqlist(W).
dce0: 20 20 20 20 7b 20 41 20 3d 20 57 3b 20 7d 0a 0a      { A = W; }..
dcf0: 77 71 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d  wqlist(A) ::= nm
dd00: 28 58 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28  (X) eidlist_opt(
dd10: 59 29 20 41 53 20 4c 50 20 73 65 6c 65 63 74 28  Y) AS LP select(
dd20: 5a 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73  Z) RP. {.  A = s
dd30: 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 70 50  qlite3WithAdd(pP
dd40: 61 72 73 65 2c 20 30 2c 20 26 58 2c 20 59 2c 20  arse, 0, &X, Y, 
dd50: 5a 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  Z); /*A-overwrit
dd60: 65 73 2d 58 2a 2f 0a 7d 0a 77 71 6c 69 73 74 28  es-X*/.}.wqlist(
dd70: 41 29 20 3a 3a 3d 20 77 71 6c 69 73 74 28 41 29  A) ::= wqlist(A)
dd80: 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 65 69 64   COMMA nm(X) eid
dd90: 6c 69 73 74 5f 6f 70 74 28 59 29 20 41 53 20 4c  list_opt(Y) AS L
dda0: 50 20 73 65 6c 65 63 74 28 5a 29 20 52 50 2e 20  P select(Z) RP. 
ddb0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 57  {.  A = sqlite3W
ddc0: 69 74 68 41 64 64 28 70 50 61 72 73 65 2c 20 41  ithAdd(pParse, A
ddd0: 2c 20 26 58 2c 20 59 2c 20 5a 29 3b 0a 7d 0a 25  , &X, Y, Z);.}.%
dde0: 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d  endif  SQLITE_OM
ddf0: 49 54 5f 43 54 45 0a                             IT_CTE.