/ Hex Artifact Content
Login

Artifact 4e750e1b261ff9f1d0b6b5d40a829c66d691899f48953fde839d8b52d41aa148:


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: 69 66 28 20 54 4f 4b 45 4e 2e 7a 5b 30 5d 20 29  if( TOKEN.z[0] )
0460: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
0470: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
0480: 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74  ear \"%T\": synt
0490: 61 78 20 65 72 72 6f 72 22 2c 20 26 54 4f 4b 45  ax error", &TOKE
04a0: 4e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  N);.  }else{.   
04b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
04c0: 28 70 50 61 72 73 65 2c 20 22 69 6e 63 6f 6d 70  (pParse, "incomp
04d0: 6c 65 74 65 20 69 6e 70 75 74 22 29 3b 0a 20 20  lete input");.  
04e0: 7d 0a 7d 0a 25 73 74 61 63 6b 5f 6f 76 65 72 66  }.}.%stack_overf
04f0: 6c 6f 77 20 7b 0a 20 20 73 71 6c 69 74 65 33 45  low {.  sqlite3E
0500: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
0510: 22 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76  "parser stack ov
0520: 65 72 66 6c 6f 77 22 29 3b 0a 7d 0a 0a 2f 2f 20  erflow");.}..// 
0530: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
0540: 67 65 6e 65 72 61 74 65 64 20 70 72 6f 63 65 64  generated proced
0550: 75 72 65 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ure that impleme
0560: 6e 74 73 20 74 68 65 20 70 61 72 73 65 72 0a 2f  nts the parser./
0570: 2f 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  / is as follows:
0580: 0a 25 6e 61 6d 65 20 73 71 6c 69 74 65 33 50 61  .%name sqlite3Pa
0590: 72 73 65 72 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c  rser..// The fol
05a0: 6c 6f 77 69 6e 67 20 74 65 78 74 20 69 73 20 69  lowing text is i
05b0: 6e 63 6c 75 64 65 64 20 6e 65 61 72 20 74 68 65  ncluded near the
05c0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
05d0: 65 20 43 20 73 6f 75 72 63 65 0a 2f 2f 20 63 6f  e C source.// co
05e0: 64 65 20 66 69 6c 65 20 74 68 61 74 20 69 6d 70  de file that imp
05f0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 70 61 72 73  lements the pars
0600: 65 72 2e 0a 2f 2f 0a 25 69 6e 63 6c 75 64 65 20  er..//.%include 
0610: 7b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  {.#include "sqli
0620: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0630: 44 69 73 61 62 6c 65 20 61 6c 6c 20 65 72 72 6f  Disable all erro
0640: 72 20 72 65 63 6f 76 65 72 79 20 70 72 6f 63 65  r recovery proce
0650: 73 73 69 6e 67 20 69 6e 20 74 68 65 20 70 61 72  ssing in the par
0660: 73 65 72 20 70 75 73 68 2d 64 6f 77 6e 0a 2a 2a  ser push-down.**
0670: 20 61 75 74 6f 6d 61 74 6f 6e 2e 0a 2a 2f 0a 23   automaton..*/.#
0680: 64 65 66 69 6e 65 20 59 59 4e 4f 45 52 52 4f 52  define YYNOERROR
0690: 52 45 43 4f 56 45 52 59 20 31 0a 0a 2f 2a 0a 2a  RECOVERY 1../*.*
06a0: 2a 20 4d 61 6b 65 20 79 79 74 65 73 74 63 61 73  * Make yytestcas
06b0: 65 28 29 20 74 68 65 20 73 61 6d 65 20 61 73 20  e() the same as 
06c0: 74 65 73 74 63 61 73 65 28 29 0a 2a 2f 0a 23 64  testcase().*/.#d
06d0: 65 66 69 6e 65 20 79 79 74 65 73 74 63 61 73 65  efine yytestcase
06e0: 28 58 29 20 74 65 73 74 63 61 73 65 28 58 29 0a  (X) testcase(X).
06f0: 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20  ./*.** Indicate 
0700: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 72 73  that sqlite3Pars
0710: 65 72 46 72 65 65 28 29 20 77 69 6c 6c 20 6e 65  erFree() will ne
0720: 76 65 72 20 62 65 20 63 61 6c 6c 65 64 20 77 69  ver be called wi
0730: 74 68 20 61 20 6e 75 6c 6c 0a 2a 2a 20 70 6f 69  th a null.** poi
0740: 6e 74 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  nter..*/.#define
0750: 20 59 59 50 41 52 53 45 46 52 45 45 4e 45 56 45   YYPARSEFREENEVE
0760: 52 4e 55 4c 4c 20 31 0a 0a 2f 2a 0a 2a 2a 20 49  RNULL 1../*.** I
0770: 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  n the amalgamati
0780: 6f 6e 2c 20 74 68 65 20 70 61 72 73 65 2e 63 20  on, the parse.c 
0790: 66 69 6c 65 20 67 65 6e 65 72 61 74 65 64 20 62  file generated b
07a0: 79 20 6c 65 6d 6f 6e 20 61 6e 64 20 74 68 65 0a  y lemon and the.
07b0: 2a 2a 20 74 6f 6b 65 6e 69 7a 65 2e 63 20 66 69  ** tokenize.c fi
07c0: 6c 65 20 61 72 65 20 63 6f 6e 63 61 74 65 6e 61  le are concatena
07d0: 74 65 64 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ted.  In that ca
07e0: 73 65 2c 20 73 71 6c 69 74 65 33 52 75 6e 50 61  se, sqlite3RunPa
07f0: 72 73 65 72 28 29 0a 2a 2a 20 68 61 73 20 61 63  rser().** has ac
0800: 63 65 73 73 20 74 6f 20 74 68 65 20 74 68 65 20  cess to the the 
0810: 73 69 7a 65 20 6f 66 20 74 68 65 20 79 79 50 61  size of the yyPa
0820: 72 73 65 72 20 6f 62 6a 65 63 74 20 61 6e 64 20  rser object and 
0830: 73 6f 20 74 68 65 20 70 61 72 73 65 72 0a 2a 2a  so the parser.**
0840: 20 65 6e 67 69 6e 65 20 63 61 6e 20 62 65 20 61   engine can be a
0850: 6c 6c 6f 63 61 74 65 64 20 66 72 6f 6d 20 73 74  llocated from st
0860: 61 63 6b 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ack.  In that ca
0870: 73 65 2c 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  se, only the.** 
0880: 73 71 6c 69 74 65 33 50 61 72 73 65 72 49 6e 69  sqlite3ParserIni
0890: 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50  t() and sqlite3P
08a0: 61 72 73 65 72 46 69 6e 61 6c 69 7a 65 28 29 20  arserFinalize() 
08b0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6e 76  routines are inv
08c0: 6f 6b 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  oked.** and the 
08d0: 73 71 6c 69 74 65 33 50 61 72 73 65 72 41 6c 6c  sqlite3ParserAll
08e0: 6f 63 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  oc() and sqlite3
08f0: 50 61 72 73 65 72 46 72 65 65 28 29 20 72 6f 75  ParserFree() rou
0900: 74 69 6e 65 73 20 63 61 6e 20 62 65 0a 2a 2a 20  tines can be.** 
0910: 6f 6d 69 74 74 65 64 2e 0a 2a 2f 0a 23 69 66 64  omitted..*/.#ifd
0920: 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41  ef SQLITE_AMALGA
0930: 4d 41 54 49 4f 4e 0a 23 20 64 65 66 69 6e 65 20  MATION.# define 
0940: 73 71 6c 69 74 65 33 50 61 72 73 65 72 5f 45 4e  sqlite3Parser_EN
0950: 47 49 4e 45 41 4c 57 41 59 53 4f 4e 53 54 41 43  GINEALWAYSONSTAC
0960: 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 1.#endif../*.*
0970: 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 20 64 61  * Alternative da
0980: 74 61 74 79 70 65 20 66 6f 72 20 74 68 65 20 61  tatype for the a
0990: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 6d  rgument to the m
09a0: 61 6c 6c 6f 63 28 29 20 72 6f 75 74 69 6e 65 20  alloc() routine 
09b0: 70 61 73 73 65 64 0a 2a 2a 20 69 6e 74 6f 20 73  passed.** into s
09c0: 71 6c 69 74 65 33 50 61 72 73 65 72 41 6c 6c 6f  qlite3ParserAllo
09d0: 63 28 29 2e 20 20 54 68 65 20 64 65 66 61 75 6c  c().  The defaul
09e0: 74 20 69 73 20 73 69 7a 65 5f 74 2e 0a 2a 2f 0a  t is size_t..*/.
09f0: 23 64 65 66 69 6e 65 20 59 59 4d 41 4c 4c 4f 43  #define YYMALLOC
0a00: 41 52 47 54 59 50 45 20 20 75 36 34 0a 0a 2f 2a  ARGTYPE  u64../*
0a10: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
0a20: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0a30: 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63 72   structure descr
0a40: 69 62 65 73 20 74 68 65 20 65 76 65 6e 74 20 6f  ibes the event o
0a50: 66 20 61 0a 2a 2a 20 54 52 49 47 47 45 52 2e 20  f a.** TRIGGER. 
0a60: 20 22 61 22 20 69 73 20 74 68 65 20 65 76 65 6e   "a" is the even
0a70: 74 20 74 79 70 65 2c 20 6f 6e 65 20 6f 66 20 54  t type, one of T
0a80: 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53  K_UPDATE, TK_INS
0a90: 45 52 54 2c 0a 2a 2a 20 54 4b 5f 44 45 4c 45 54  ERT,.** TK_DELET
0aa0: 45 2c 20 6f 72 20 54 4b 5f 49 4e 53 54 45 41 44  E, or TK_INSTEAD
0ab0: 2e 20 20 49 66 20 74 68 65 20 65 76 65 6e 74 20  .  If the event 
0ac0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  is of the form.*
0ad0: 2a 0a 2a 2a 20 20 20 20 20 20 55 50 44 41 54 45  *.**      UPDATE
0ae0: 20 4f 4e 20 28 61 2c 62 2c 63 29 0a 2a 2a 0a 2a   ON (a,b,c).**.*
0af0: 2a 20 54 68 65 6e 20 74 68 65 20 22 62 22 20 49  * Then the "b" I
0b00: 64 4c 69 73 74 20 72 65 63 6f 72 64 73 20 74 68  dList records th
0b10: 65 20 6c 69 73 74 20 22 61 2c 62 2c 63 22 2e 0a  e list "a,b,c"..
0b20: 2a 2f 0a 73 74 72 75 63 74 20 54 72 69 67 45 76  */.struct TrigEv
0b30: 65 6e 74 20 7b 20 69 6e 74 20 61 3b 20 49 64 4c  ent { int a; IdL
0b40: 69 73 74 20 2a 20 62 3b 20 7d 3b 0a 0a 2f 2a 0a  ist * b; };../*.
0b50: 2a 2a 20 44 69 73 61 62 6c 65 20 6c 6f 6f 6b 61  ** Disable looka
0b60: 73 69 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  side memory allo
0b70: 63 61 74 69 6f 6e 20 66 6f 72 20 6f 62 6a 65 63  cation for objec
0b80: 74 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ts that might be
0b90: 0a 2a 2a 20 73 68 61 72 65 64 20 61 63 72 6f 73  .** shared acros
0ba0: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
0bb0: 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ctions..*/.stati
0bc0: 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 4c 6f  c void disableLo
0bd0: 6f 6b 61 73 69 64 65 28 50 61 72 73 65 20 2a 70  okaside(Parse *p
0be0: 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65  Parse){.  pParse
0bf0: 2d 3e 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69  ->disableLookasi
0c00: 64 65 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e  de++;.  pParse->
0c10: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44  db->lookaside.bD
0c20: 69 73 61 62 6c 65 2b 2b 3b 0a 7d 0a 0a 7d 20 2f  isable++;.}..} /
0c30: 2f 20 65 6e 64 20 25 69 6e 63 6c 75 64 65 0a 0a  / end %include..
0c40: 2f 2f 20 49 6e 70 75 74 20 69 73 20 61 20 73 69  // Input is a si
0c50: 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ngle SQL command
0c60: 0a 69 6e 70 75 74 20 3a 3a 3d 20 63 6d 64 6c 69  .input ::= cmdli
0c70: 73 74 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20  st..cmdlist ::= 
0c80: 63 6d 64 6c 69 73 74 20 65 63 6d 64 2e 0a 63 6d  cmdlist ecmd..cm
0c90: 64 6c 69 73 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a  dlist ::= ecmd..
0ca0: 65 63 6d 64 20 3a 3a 3d 20 53 45 4d 49 2e 0a 65  ecmd ::= SEMI..e
0cb0: 63 6d 64 20 3a 3a 3d 20 65 78 70 6c 61 69 6e 20  cmd ::= explain 
0cc0: 63 6d 64 78 20 53 45 4d 49 2e 0a 65 78 70 6c 61  cmdx SEMI..expla
0cd0: 69 6e 20 3a 3a 3d 20 2e 0a 25 69 66 6e 64 65 66  in ::= ..%ifndef
0ce0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
0cf0: 4c 41 49 4e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d  LAIN.explain ::=
0d00: 20 45 58 50 4c 41 49 4e 2e 20 20 20 20 20 20 20   EXPLAIN.       
0d10: 20 20 20 20 20 20 20 7b 20 70 50 61 72 73 65 2d         { pParse-
0d20: 3e 65 78 70 6c 61 69 6e 20 3d 20 31 3b 20 7d 0a  >explain = 1; }.
0d30: 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c  explain ::= EXPL
0d40: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 20  AIN QUERY PLAN. 
0d50: 20 20 7b 20 70 50 61 72 73 65 2d 3e 65 78 70 6c    { pParse->expl
0d60: 61 69 6e 20 3d 20 32 3b 20 7d 0a 25 65 6e 64 69  ain = 2; }.%endi
0d70: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  f  SQLITE_OMIT_E
0d80: 58 50 4c 41 49 4e 0a 63 6d 64 78 20 3a 3a 3d 20  XPLAIN.cmdx ::= 
0d90: 63 6d 64 2e 20 20 20 20 20 20 20 20 20 20 20 7b  cmd.           {
0da0: 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
0db0: 64 69 6e 67 28 70 50 61 72 73 65 29 3b 20 7d 0a  ding(pParse); }.
0dc0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
0dd0: 2f 2f 2f 2f 2f 2f 20 42 65 67 69 6e 20 61 6e 64  ////// Begin and
0de0: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
0df0: 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  s. /////////////
0e00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
0e10: 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 42 45 47 49  //..cmd ::= BEGI
0e20: 4e 20 74 72 61 6e 73 74 79 70 65 28 59 29 20 74  N transtype(Y) t
0e30: 72 61 6e 73 5f 6f 70 74 2e 20 20 7b 73 71 6c 69  rans_opt.  {sqli
0e40: 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
0e50: 69 6f 6e 28 70 50 61 72 73 65 2c 20 59 29 3b 7d  ion(pParse, Y);}
0e60: 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 2e  .trans_opt ::= .
0e70: 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54  .trans_opt ::= T
0e80: 52 41 4e 53 41 43 54 49 4f 4e 2e 0a 74 72 61 6e  RANSACTION..tran
0e90: 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41  s_opt ::= TRANSA
0ea0: 43 54 49 4f 4e 20 6e 6d 2e 0a 25 74 79 70 65 20  CTION nm..%type 
0eb0: 74 72 61 6e 73 74 79 70 65 20 7b 69 6e 74 7d 0a  transtype {int}.
0ec0: 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d  transtype(A) ::=
0ed0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b   .             {
0ee0: 41 20 3d 20 54 4b 5f 44 45 46 45 52 52 45 44 3b  A = TK_DEFERRED;
0ef0: 7d 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a  }.transtype(A) :
0f00: 3a 3d 20 44 45 46 45 52 52 45 44 28 58 29 2e 20  := DEFERRED(X). 
0f10: 20 7b 41 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76   {A = @X; /*A-ov
0f20: 65 72 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 74 72  erwrites-X*/}.tr
0f30: 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 49  anstype(A) ::= I
0f40: 4d 4d 45 44 49 41 54 45 28 58 29 2e 20 7b 41 20  MMEDIATE(X). {A 
0f50: 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  = @X; /*A-overwr
0f60: 69 74 65 73 2d 58 2a 2f 7d 0a 74 72 61 6e 73 74  ites-X*/}.transt
0f70: 79 70 65 28 41 29 20 3a 3a 3d 20 45 58 43 4c 55  ype(A) ::= EXCLU
0f80: 53 49 56 45 28 58 29 2e 20 7b 41 20 3d 20 40 58  SIVE(X). {A = @X
0f90: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
0fa0: 2d 58 2a 2f 7d 0a 63 6d 64 20 3a 3a 3d 20 43 4f  -X*/}.cmd ::= CO
0fb0: 4d 4d 49 54 7c 45 4e 44 28 58 29 20 74 72 61 6e  MMIT|END(X) tran
0fc0: 73 5f 6f 70 74 2e 20 20 20 7b 73 71 6c 69 74 65  s_opt.   {sqlite
0fd0: 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  3EndTransaction(
0fe0: 70 50 61 72 73 65 2c 40 58 29 3b 7d 0a 63 6d 64  pParse,@X);}.cmd
0ff0: 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 28 58 29   ::= ROLLBACK(X)
1000: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20   trans_opt.     
1010: 7b 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e 73  {sqlite3EndTrans
1020: 61 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 40 58  action(pParse,@X
1030: 29 3b 7d 0a 0a 73 61 76 65 70 6f 69 6e 74 5f 6f  );}..savepoint_o
1040: 70 74 20 3a 3a 3d 20 53 41 56 45 50 4f 49 4e 54  pt ::= SAVEPOINT
1050: 2e 0a 73 61 76 65 70 6f 69 6e 74 5f 6f 70 74 20  ..savepoint_opt 
1060: 3a 3a 3d 20 2e 0a 63 6d 64 20 3a 3a 3d 20 53 41  ::= ..cmd ::= SA
1070: 56 45 50 4f 49 4e 54 20 6e 6d 28 58 29 2e 20 7b  VEPOINT nm(X). {
1080: 0a 20 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f  .  sqlite3Savepo
1090: 69 6e 74 28 70 50 61 72 73 65 2c 20 53 41 56 45  int(pParse, SAVE
10a0: 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 26 58 29  POINT_BEGIN, &X)
10b0: 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45 4c 45  ;.}.cmd ::= RELE
10c0: 41 53 45 20 73 61 76 65 70 6f 69 6e 74 5f 6f 70  ASE savepoint_op
10d0: 74 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c  t nm(X). {.  sql
10e0: 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 70 50  ite3Savepoint(pP
10f0: 61 72 73 65 2c 20 53 41 56 45 50 4f 49 4e 54 5f  arse, SAVEPOINT_
1100: 52 45 4c 45 41 53 45 2c 20 26 58 29 3b 0a 7d 0a  RELEASE, &X);.}.
1110: 63 6d 64 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b  cmd ::= ROLLBACK
1120: 20 74 72 61 6e 73 5f 6f 70 74 20 54 4f 20 73 61   trans_opt TO sa
1130: 76 65 70 6f 69 6e 74 5f 6f 70 74 20 6e 6d 28 58  vepoint_opt nm(X
1140: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 61  ). {.  sqlite3Sa
1150: 76 65 70 6f 69 6e 74 28 70 50 61 72 73 65 2c 20  vepoint(pParse, 
1160: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1170: 43 4b 2c 20 26 58 29 3b 0a 7d 0a 0a 2f 2f 2f 2f  CK, &X);.}..////
1180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1190: 2f 20 54 68 65 20 43 52 45 41 54 45 20 54 41 42  / The CREATE TAB
11a0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  LE statement ///
11b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
11c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
11d0: 20 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61 62 6c   ::= create_tabl
11e0: 65 20 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61  e create_table_a
11f0: 72 67 73 2e 0a 63 72 65 61 74 65 5f 74 61 62 6c  rgs..create_tabl
1200: 65 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 20 74  e ::= createkw t
1210: 65 6d 70 28 54 29 20 54 41 42 4c 45 20 69 66 6e  emp(T) TABLE ifn
1220: 6f 74 65 78 69 73 74 73 28 45 29 20 6e 6d 28 59  otexists(E) nm(Y
1230: 29 20 64 62 6e 6d 28 5a 29 2e 20 7b 0a 20 20 20  ) dbnm(Z). {.   
1240: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
1250: 65 28 70 50 61 72 73 65 2c 26 59 2c 26 5a 2c 54  e(pParse,&Y,&Z,T
1260: 2c 30 2c 30 2c 45 29 3b 0a 7d 0a 63 72 65 61 74  ,0,0,E);.}.creat
1270: 65 6b 77 28 41 29 20 3a 3a 3d 20 43 52 45 41 54  ekw(A) ::= CREAT
1280: 45 28 41 29 2e 20 20 7b 64 69 73 61 62 6c 65 4c  E(A).  {disableL
1290: 6f 6f 6b 61 73 69 64 65 28 70 50 61 72 73 65 29  ookaside(pParse)
12a0: 3b 7d 0a 0a 25 74 79 70 65 20 69 66 6e 6f 74 65  ;}..%type ifnote
12b0: 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66 6e 6f  xists {int}.ifno
12c0: 74 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 2e  texists(A) ::= .
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
12e0: 20 3d 20 30 3b 7d 0a 69 66 6e 6f 74 65 78 69 73   = 0;}.ifnotexis
12f0: 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 4e 4f 54  ts(A) ::= IF NOT
1300: 20 45 58 49 53 54 53 2e 20 7b 41 20 3d 20 31 3b   EXISTS. {A = 1;
1310: 7d 0a 25 74 79 70 65 20 74 65 6d 70 20 7b 69 6e  }.%type temp {in
1320: 74 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  t}.%ifndef SQLIT
1330: 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 74 65  E_OMIT_TEMPDB.te
1340: 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20  mp(A) ::= TEMP. 
1350: 20 7b 41 20 3d 20 31 3b 7d 0a 25 65 6e 64 69 66   {A = 1;}.%endif
1360: 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45    SQLITE_OMIT_TE
1370: 4d 50 44 42 0a 74 65 6d 70 28 41 29 20 3a 3a 3d  MPDB.temp(A) ::=
1380: 20 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d   .      {A = 0;}
1390: 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72  .create_table_ar
13a0: 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e  gs ::= LP column
13b0: 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74 5f 6f 70  list conslist_op
13c0: 74 28 58 29 20 52 50 28 45 29 20 74 61 62 6c 65  t(X) RP(E) table
13d0: 5f 6f 70 74 69 6f 6e 73 28 46 29 2e 20 7b 0a 20  _options(F). {. 
13e0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
13f0: 28 70 50 61 72 73 65 2c 26 58 2c 26 45 2c 46 2c  (pParse,&X,&E,F,
1400: 30 29 3b 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62  0);.}.create_tab
1410: 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 41 53 20 73  le_args ::= AS s
1420: 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71  elect(S). {.  sq
1430: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
1440: 61 72 73 65 2c 30 2c 30 2c 30 2c 53 29 3b 0a 20  arse,0,0,0,S);. 
1450: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1460: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
1470: 20 53 29 3b 0a 7d 0a 25 74 79 70 65 20 74 61 62   S);.}.%type tab
1480: 6c 65 5f 6f 70 74 69 6f 6e 73 20 7b 69 6e 74 7d  le_options {int}
1490: 0a 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73 28 41  .table_options(A
14a0: 29 20 3a 3a 3d 20 2e 20 20 20 20 7b 41 20 3d 20  ) ::= .    {A = 
14b0: 30 3b 7d 0a 74 61 62 6c 65 5f 6f 70 74 69 6f 6e  0;}.table_option
14c0: 73 28 41 29 20 3a 3a 3d 20 57 49 54 48 4f 55 54  s(A) ::= WITHOUT
14d0: 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 69 66 28 20   nm(X). {.  if( 
14e0: 58 2e 6e 3d 3d 35 20 26 26 20 73 71 6c 69 74 65  X.n==5 && sqlite
14f0: 33 5f 73 74 72 6e 69 63 6d 70 28 58 2e 7a 2c 22  3_strnicmp(X.z,"
1500: 72 6f 77 69 64 22 2c 35 29 3d 3d 30 20 29 7b 0a  rowid",5)==0 ){.
1510: 20 20 20 20 41 20 3d 20 54 46 5f 57 69 74 68 6f      A = TF_Witho
1520: 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56  utRowid | TF_NoV
1530: 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 7d  isibleRowid;.  }
1540: 65 6c 73 65 7b 0a 20 20 20 20 41 20 3d 20 30 3b  else{.    A = 0;
1550: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1560: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e  rMsg(pParse, "un
1570: 6b 6e 6f 77 6e 20 74 61 62 6c 65 20 6f 70 74 69  known table opti
1580: 6f 6e 3a 20 25 2e 2a 73 22 2c 20 58 2e 6e 2c 20  on: %.*s", X.n, 
1590: 58 2e 7a 29 3b 0a 20 20 7d 0a 7d 0a 63 6f 6c 75  X.z);.  }.}.colu
15a0: 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d  mnlist ::= colum
15b0: 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63 6f 6c 75  nlist COMMA colu
15c0: 6d 6e 6e 61 6d 65 20 63 61 72 67 6c 69 73 74 2e  mnname carglist.
15d0: 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20  .columnlist ::= 
15e0: 63 6f 6c 75 6d 6e 6e 61 6d 65 20 63 61 72 67 6c  columnname cargl
15f0: 69 73 74 2e 0a 63 6f 6c 75 6d 6e 6e 61 6d 65 28  ist..columnname(
1600: 41 29 20 3a 3a 3d 20 6e 6d 28 41 29 20 74 79 70  A) ::= nm(A) typ
1610: 65 74 6f 6b 65 6e 28 59 29 2e 20 7b 73 71 6c 69  etoken(Y). {sqli
1620: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61  te3AddColumn(pPa
1630: 72 73 65 2c 26 41 2c 26 59 29 3b 7d 0a 0a 2f 2f  rse,&A,&Y);}..//
1640: 20 44 65 63 6c 61 72 65 20 73 6f 6d 65 20 74 6f   Declare some to
1650: 6b 65 6e 73 20 65 61 72 6c 79 20 69 6e 20 6f 72  kens early in or
1660: 64 65 72 20 74 6f 20 69 6e 66 6c 75 65 6e 63 65  der to influence
1670: 20 74 68 65 69 72 20 76 61 6c 75 65 73 2c 20 74   their values, t
1680: 6f 20 0a 2f 2f 20 69 6d 70 72 6f 76 65 20 70 65  o .// improve pe
1690: 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 72 65  rformance and re
16a0: 64 75 63 65 20 74 68 65 20 65 78 65 63 75 74 61  duce the executa
16b0: 62 6c 65 20 73 69 7a 65 2e 20 20 54 68 65 20 67  ble size.  The g
16c0: 6f 61 6c 20 68 65 72 65 20 69 73 0a 2f 2f 20 74  oal here is.// t
16d0: 6f 20 67 65 74 20 74 68 65 20 22 6a 75 6d 70 22  o get the "jump"
16e0: 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e 20 49   operations in I
16f0: 53 4e 55 4c 4c 20 74 68 72 6f 75 67 68 20 45 53  SNULL through ES
1700: 43 41 50 45 20 74 6f 20 68 61 76 65 20 6e 75 6d  CAPE to have num
1710: 65 72 69 63 0a 2f 2f 20 76 61 6c 75 65 73 20 74  eric.// values t
1720: 68 61 74 20 61 72 65 20 65 61 72 6c 79 20 65 6e  hat are early en
1730: 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 6c 6c  ough so that all
1740: 20 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e 73   jump operations
1750: 20 61 72 65 20 63 6c 75 73 74 65 72 65 64 0a 2f   are clustered./
1760: 2f 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  / at the beginni
1770: 6e 67 2c 20 62 75 74 20 61 6c 73 6f 20 73 6f 20  ng, but also so 
1780: 74 68 61 74 20 74 68 65 20 63 6f 6d 70 61 72 69  that the compari
1790: 73 6f 6e 20 74 6f 6b 65 6e 73 20 4e 45 20 74 68  son tokens NE th
17a0: 72 6f 75 67 68 20 47 45 0a 2f 2f 20 61 72 65 20  rough GE.// are 
17b0: 61 73 20 6c 61 72 67 65 20 61 73 20 70 6f 73 73  as large as poss
17c0: 69 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65  ible so that the
17d0: 79 20 61 72 65 20 6e 65 61 72 20 74 6f 20 46 55  y are near to FU
17e0: 4e 43 54 49 4f 4e 2c 20 77 68 69 63 68 20 69 73  NCTION, which is
17f0: 20 61 0a 2f 2f 20 74 6f 6b 65 6e 20 73 79 6e 74   a.// token synt
1800: 68 65 73 69 7a 65 64 20 62 79 20 61 64 64 6f 70  hesized by addop
1810: 63 6f 64 65 73 2e 74 63 6c 2e 0a 2f 2f 0a 25 74  codes.tcl..//.%t
1820: 6f 6b 65 6e 20 41 42 4f 52 54 20 41 43 54 49 4f  oken ABORT ACTIO
1830: 4e 20 41 46 54 45 52 20 41 4e 41 4c 59 5a 45 20  N AFTER ANALYZE 
1840: 41 53 43 20 41 54 54 41 43 48 20 42 45 46 4f 52  ASC ATTACH BEFOR
1850: 45 20 42 45 47 49 4e 20 42 59 20 43 41 53 43 41  E BEGIN BY CASCA
1860: 44 45 20 43 41 53 54 2e 0a 25 74 6f 6b 65 6e 20  DE CAST..%token 
1870: 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42 41 53  CONFLICT DATABAS
1880: 45 20 44 45 46 45 52 52 45 44 20 44 45 53 43 20  E DEFERRED DESC 
1890: 44 45 54 41 43 48 20 45 41 43 48 20 45 4e 44 20  DETACH EACH END 
18a0: 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49  EXCLUSIVE EXPLAI
18b0: 4e 20 46 41 49 4c 2e 0a 25 74 6f 6b 65 6e 20 4f  N FAIL..%token O
18c0: 52 20 41 4e 44 20 4e 4f 54 20 49 53 20 4d 41 54  R AND NOT IS MAT
18d0: 43 48 20 4c 49 4b 45 5f 4b 57 20 42 45 54 57 45  CH LIKE_KW BETWE
18e0: 45 4e 20 49 4e 20 49 53 4e 55 4c 4c 20 4e 4f 54  EN IN ISNULL NOT
18f0: 4e 55 4c 4c 20 4e 45 20 45 51 2e 0a 25 74 6f 6b  NULL NE EQ..%tok
1900: 65 6e 20 47 54 20 4c 45 20 4c 54 20 47 45 20 45  en GT LE LT GE E
1910: 53 43 41 50 45 2e 0a 0a 2f 2f 20 54 68 65 20 66  SCAPE...// The f
1920: 6f 6c 6c 6f 77 69 6e 67 20 64 69 72 65 63 74 69  ollowing directi
1930: 76 65 20 63 61 75 73 65 73 20 74 6f 6b 65 6e 73  ve causes tokens
1940: 20 41 42 4f 52 54 2c 20 41 46 54 45 52 2c 20 41   ABORT, AFTER, A
1950: 53 43 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20 66  SC, etc. to.// f
1960: 61 6c 6c 62 61 63 6b 20 74 6f 20 49 44 20 69 66  allback to ID if
1970: 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 70   they will not p
1980: 61 72 73 65 20 61 73 20 74 68 65 69 72 20 6f 72  arse as their or
1990: 69 67 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f  iginal value..//
19a0: 20 54 68 69 73 20 6f 62 76 69 61 74 65 73 20 74   This obviates t
19b0: 68 65 20 6e 65 65 64 20 66 6f 72 20 74 68 65 20  he need for the 
19c0: 22 69 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  "id" nonterminal
19d0: 2e 0a 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20 49  ..//.%fallback I
19e0: 44 0a 20 20 41 42 4f 52 54 20 41 43 54 49 4f 4e  D.  ABORT ACTION
19f0: 20 41 46 54 45 52 20 41 4e 41 4c 59 5a 45 20 41   AFTER ANALYZE A
1a00: 53 43 20 41 54 54 41 43 48 20 42 45 46 4f 52 45  SC ATTACH BEFORE
1a10: 20 42 45 47 49 4e 20 42 59 20 43 41 53 43 41 44   BEGIN BY CASCAD
1a20: 45 20 43 41 53 54 20 43 4f 4c 55 4d 4e 4b 57 0a  E CAST COLUMNKW.
1a30: 20 20 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42    CONFLICT DATAB
1a40: 41 53 45 20 44 45 46 45 52 52 45 44 20 44 45 53  ASE DEFERRED DES
1a50: 43 20 44 45 54 41 43 48 20 45 41 43 48 20 45 4e  C DETACH EACH EN
1a60: 44 20 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c  D EXCLUSIVE EXPL
1a70: 41 49 4e 20 46 41 49 4c 20 46 4f 52 0a 20 20 49  AIN FAIL FOR.  I
1a80: 47 4e 4f 52 45 20 49 4d 4d 45 44 49 41 54 45 20  GNORE IMMEDIATE 
1a90: 49 4e 49 54 49 41 4c 4c 59 20 49 4e 53 54 45 41  INITIALLY INSTEA
1aa0: 44 20 4c 49 4b 45 5f 4b 57 20 4d 41 54 43 48 20  D LIKE_KW MATCH 
1ab0: 4e 4f 20 50 4c 41 4e 0a 20 20 51 55 45 52 59 20  NO PLAN.  QUERY 
1ac0: 4b 45 59 20 4f 46 20 4f 46 46 53 45 54 20 50 52  KEY OF OFFSET PR
1ad0: 41 47 4d 41 20 52 41 49 53 45 20 52 45 43 55 52  AGMA RAISE RECUR
1ae0: 53 49 56 45 20 52 45 4c 45 41 53 45 20 52 45 50  SIVE RELEASE REP
1af0: 4c 41 43 45 20 52 45 53 54 52 49 43 54 20 52 4f  LACE RESTRICT RO
1b00: 57 0a 20 20 52 4f 4c 4c 42 41 43 4b 20 53 41 56  W.  ROLLBACK SAV
1b10: 45 50 4f 49 4e 54 20 54 45 4d 50 20 54 52 49 47  EPOINT TEMP TRIG
1b20: 47 45 52 20 56 41 43 55 55 4d 20 56 49 45 57 20  GER VACUUM VIEW 
1b30: 56 49 52 54 55 41 4c 20 57 49 54 48 20 57 49 54  VIRTUAL WITH WIT
1b40: 48 4f 55 54 0a 25 69 66 64 65 66 20 53 51 4c 49  HOUT.%ifdef SQLI
1b50: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
1b60: 5f 53 45 4c 45 43 54 0a 20 20 45 58 43 45 50 54  _SELECT.  EXCEPT
1b70: 20 49 4e 54 45 52 53 45 43 54 20 55 4e 49 4f 4e   INTERSECT UNION
1b80: 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f  .%endif SQLITE_O
1b90: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
1ba0: 45 43 54 0a 20 20 52 45 49 4e 44 45 58 20 52 45  ECT.  REINDEX RE
1bb0: 4e 41 4d 45 20 43 54 49 4d 45 5f 4b 57 20 49 46  NAME CTIME_KW IF
1bc0: 0a 20 20 2e 0a 25 77 69 6c 64 63 61 72 64 20 41  .  ..%wildcard A
1bd0: 4e 59 2e 0a 0a 2f 2f 20 44 65 66 69 6e 65 20 6f  NY...// Define o
1be0: 70 65 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e  perator preceden
1bf0: 63 65 20 65 61 72 6c 79 20 73 6f 20 74 68 61 74  ce early so that
1c00: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1c10: 73 74 20 6f 63 63 75 72 72 65 6e 63 65 0a 2f 2f  st occurrence.//
1c20: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
1c30: 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 67   tokens in the g
1c40: 72 61 6d 6d 65 72 2e 20 20 4b 65 65 70 69 6e 67  rammer.  Keeping
1c50: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74   the operators t
1c60: 6f 67 65 74 68 65 72 0a 2f 2f 20 63 61 75 73 65  ogether.// cause
1c70: 73 20 74 68 65 6d 20 74 6f 20 62 65 20 61 73 73  s them to be ass
1c80: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61  igned integer va
1c90: 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 63 6c  lues that are cl
1ca0: 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 0a 2f 2f  ose together,.//
1cb0: 20 77 68 69 63 68 20 6b 65 65 70 73 20 70 61 72   which keeps par
1cc0: 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c  ser tables small
1cd0: 65 72 2e 0a 2f 2f 0a 2f 2f 20 54 68 65 20 74 6f  er..//.// The to
1ce0: 6b 65 6e 20 76 61 6c 75 65 73 20 61 73 73 69 67  ken values assig
1cf0: 6e 65 64 20 74 6f 20 74 68 65 73 65 20 73 79 6d  ned to these sym
1d00: 62 6f 6c 73 20 69 73 20 64 65 74 65 72 6d 69 6e  bols is determin
1d10: 65 64 20 62 79 20 74 68 65 20 6f 72 64 65 72 0a  ed by the order.
1d20: 2f 2f 20 69 6e 20 77 68 69 63 68 20 6c 65 6d 6f  // in which lemo
1d30: 6e 20 66 69 72 73 74 20 73 65 65 73 20 74 68 65  n first sees the
1d40: 6d 2e 20 20 49 74 20 6d 75 73 74 20 62 65 20 74  m.  It must be t
1d50: 68 65 20 63 61 73 65 20 74 68 61 74 20 49 53 4e  he case that ISN
1d60: 55 4c 4c 2f 4e 4f 54 4e 55 4c 4c 2c 0a 2f 2f 20  ULL/NOTNULL,.// 
1d70: 4e 45 2f 45 51 2c 20 47 54 2f 4c 45 2c 20 61 6e  NE/EQ, GT/LE, an
1d80: 64 20 47 45 2f 4c 54 20 61 72 65 20 73 65 70 61  d GE/LT are sepa
1d90: 72 61 74 65 64 20 62 79 20 6f 6e 6c 79 20 61 20  rated by only a 
1da0: 73 69 6e 67 6c 65 20 76 61 6c 75 65 2e 20 20 53  single value.  S
1db0: 65 65 0a 2f 2f 20 74 68 65 20 73 71 6c 69 74 65  ee.// the sqlite
1dc0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 72  3ExprIfFalse() r
1dd0: 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
1de0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1df0: 6e 20 6f 6e 20 74 68 69 73 0a 2f 2f 20 63 6f 6e  n on this.// con
1e00: 73 74 72 61 69 6e 74 2e 0a 2f 2f 0a 25 6c 65 66  straint..//.%lef
1e10: 74 20 4f 52 2e 0a 25 6c 65 66 74 20 41 4e 44 2e  t OR..%left AND.
1e20: 0a 25 72 69 67 68 74 20 4e 4f 54 2e 0a 25 6c 65  .%right NOT..%le
1e30: 66 74 20 49 53 20 4d 41 54 43 48 20 4c 49 4b 45  ft IS MATCH LIKE
1e40: 5f 4b 57 20 42 45 54 57 45 45 4e 20 49 4e 20 49  _KW BETWEEN IN I
1e50: 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 4e 45  SNULL NOTNULL NE
1e60: 20 45 51 2e 0a 25 6c 65 66 74 20 47 54 20 4c 45   EQ..%left GT LE
1e70: 20 4c 54 20 47 45 2e 0a 25 72 69 67 68 74 20 45   LT GE..%right E
1e80: 53 43 41 50 45 2e 0a 25 6c 65 66 74 20 42 49 54  SCAPE..%left BIT
1e90: 41 4e 44 20 42 49 54 4f 52 20 4c 53 48 49 46 54  AND BITOR LSHIFT
1ea0: 20 52 53 48 49 46 54 2e 0a 25 6c 65 66 74 20 50   RSHIFT..%left P
1eb0: 4c 55 53 20 4d 49 4e 55 53 2e 0a 25 6c 65 66 74  LUS MINUS..%left
1ec0: 20 53 54 41 52 20 53 4c 41 53 48 20 52 45 4d 2e   STAR SLASH REM.
1ed0: 0a 25 6c 65 66 74 20 43 4f 4e 43 41 54 2e 0a 25  .%left CONCAT..%
1ee0: 6c 65 66 74 20 43 4f 4c 4c 41 54 45 2e 0a 25 72  left COLLATE..%r
1ef0: 69 67 68 74 20 42 49 54 4e 4f 54 2e 0a 0a 2f 2f  ight BITNOT...//
1f00: 20 41 6e 20 49 44 45 4e 54 49 46 49 45 52 20 63   An IDENTIFIER c
1f10: 61 6e 20 62 65 20 61 20 67 65 6e 65 72 69 63 20  an be a generic 
1f20: 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f  identifier, or o
1f30: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f  ne of several.//
1f40: 20 6b 65 79 77 6f 72 64 73 2e 20 20 41 6e 79 20   keywords.  Any 
1f50: 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 6b 65 79  non-standard key
1f60: 77 6f 72 64 20 63 61 6e 20 61 6c 73 6f 20 62 65  word can also be
1f70: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 2e 0a   an identifier..
1f80: 2f 2f 0a 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20  //.%token_class 
1f90: 69 64 20 20 49 44 7c 49 4e 44 45 58 45 44 2e 0a  id  ID|INDEXED..
1fa0: 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73 22 20 69  ..// And "ids" i
1fb0: 73 20 61 6e 20 69 64 65 6e 74 69 66 65 72 2d 6f  s an identifer-o
1fc0: 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a 25 74 6f  r-string..//.%to
1fd0: 6b 65 6e 5f 63 6c 61 73 73 20 69 64 73 20 20 49  ken_class ids  I
1fe0: 44 7c 53 54 52 49 4e 47 2e 0a 0a 2f 2f 20 54 68  D|STRING...// Th
1ff0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
2000: 6d 6e 20 6f 72 20 74 61 62 6c 65 20 63 61 6e 20  mn or table can 
2010: 62 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  be any of the fo
2020: 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a 25 74 79 70  llowing:.//.%typ
2030: 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e 6d 28  e nm {Token}.nm(
2040: 41 29 20 3a 3a 3d 20 69 64 28 41 29 2e 0a 6e 6d  A) ::= id(A)..nm
2050: 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 41  (A) ::= STRING(A
2060: 29 2e 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a 4f 49  )..nm(A) ::= JOI
2070: 4e 5f 4b 57 28 41 29 2e 0a 0a 2f 2f 20 41 20 74  N_KW(A)...// A t
2080: 79 70 65 74 6f 6b 65 6e 20 69 73 20 72 65 61 6c  ypetoken is real
2090: 6c 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  ly zero or more 
20a0: 74 6f 6b 65 6e 73 20 74 68 61 74 20 66 6f 72 6d  tokens that form
20b0: 20 61 20 74 79 70 65 20 6e 61 6d 65 20 73 75 63   a type name suc
20c0: 68 0a 2f 2f 20 61 73 20 63 61 6e 20 62 65 20 66  h.// as can be f
20d0: 6f 75 6e 64 20 61 66 74 65 72 20 74 68 65 20 63  ound after the c
20e0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 61 20  olumn name in a 
20f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
2100: 74 65 6d 65 6e 74 2e 0a 2f 2f 20 4d 75 6c 74 69  tement..// Multi
2110: 70 6c 65 20 74 6f 6b 65 6e 73 20 61 72 65 20 63  ple tokens are c
2120: 6f 6e 63 61 74 65 6e 61 74 65 64 20 74 6f 20 66  oncatenated to f
2130: 6f 72 6d 20 74 68 65 20 76 61 6c 75 65 20 6f 66  orm the value of
2140: 20 74 68 65 20 74 79 70 65 74 6f 6b 65 6e 2e 0a   the typetoken..
2150: 2f 2f 0a 25 74 79 70 65 20 74 79 70 65 74 6f 6b  //.%type typetok
2160: 65 6e 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 74  en {Token}.typet
2170: 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 2e 20 20 20  oken(A) ::= .   
2180: 7b 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20  {A.n = 0; A.z = 
2190: 30 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29  0;}.typetoken(A)
21a0: 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 41 29   ::= typename(A)
21b0: 2e 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a  ..typetoken(A) :
21c0: 3a 3d 20 74 79 70 65 6e 61 6d 65 28 41 29 20 4c  := typename(A) L
21d0: 50 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e 20  P signed RP(Y). 
21e0: 7b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74 29 28  {.  A.n = (int)(
21f0: 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 41 2e 7a 29  &Y.z[Y.n] - A.z)
2200: 3b 0a 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29  ;.}.typetoken(A)
2210: 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 41 29   ::= typename(A)
2220: 20 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d 4d 41   LP signed COMMA
2230: 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e 20 7b   signed RP(Y). {
2240: 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74 29 28 26  .  A.n = (int)(&
2250: 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 41 2e 7a 29 3b  Y.z[Y.n] - A.z);
2260: 0a 7d 0a 25 74 79 70 65 20 74 79 70 65 6e 61 6d  .}.%type typenam
2270: 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61  e {Token}.typena
2280: 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73 28 41 29  me(A) ::= ids(A)
2290: 2e 0a 74 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a  ..typename(A) ::
22a0: 3d 20 74 79 70 65 6e 61 6d 65 28 41 29 20 69 64  = typename(A) id
22b0: 73 28 59 29 2e 20 7b 41 2e 6e 3d 59 2e 6e 2b 28  s(Y). {A.n=Y.n+(
22c0: 69 6e 74 29 28 59 2e 7a 2d 41 2e 7a 29 3b 7d 0a  int)(Y.z-A.z);}.
22d0: 73 69 67 6e 65 64 20 3a 3a 3d 20 70 6c 75 73 5f  signed ::= plus_
22e0: 6e 75 6d 2e 0a 73 69 67 6e 65 64 20 3a 3a 3d 20  num..signed ::= 
22f0: 6d 69 6e 75 73 5f 6e 75 6d 2e 0a 0a 2f 2f 20 54  minus_num...// T
2300: 68 65 20 73 63 61 6e 70 74 20 6e 6f 6e 2d 74 65  he scanpt non-te
2310: 72 6d 69 6e 61 6c 20 74 61 6b 65 73 20 61 20 76  rminal takes a v
2320: 61 6c 75 65 20 77 68 69 63 68 20 69 73 20 61 20  alue which is a 
2330: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2f  pointer to the./
2340: 2f 20 69 6e 70 75 74 20 74 65 78 74 20 6a 75 73  / input text jus
2350: 74 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  t past the last 
2360: 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73 20 62  token that has b
2370: 65 65 6e 20 73 68 69 66 74 65 64 20 69 6e 74 6f  een shifted into
2380: 0a 2f 2f 20 74 68 65 20 70 61 72 73 65 72 2e 20  .// the parser. 
2390: 20 42 79 20 73 75 72 72 6f 75 6e 64 69 6e 67 20   By surrounding 
23a0: 73 6f 6d 65 20 70 68 72 61 73 65 20 69 6e 20 74  some phrase in t
23b0: 68 65 20 67 72 61 6d 6d 61 72 20 77 69 74 68 20  he grammar with 
23c0: 74 77 6f 0a 2f 2f 20 73 63 61 6e 70 74 20 6e 6f  two.// scanpt no
23d0: 6e 2d 74 65 72 6d 69 6e 61 6c 73 2c 20 77 65 20  n-terminals, we 
23e0: 63 61 6e 20 63 61 70 74 75 72 65 20 74 68 65 20  can capture the 
23f0: 69 6e 70 75 74 20 74 65 78 74 20 66 6f 72 20 74  input text for t
2400: 68 61 74 20 70 68 72 61 73 65 2e 0a 2f 2f 20 46  hat phrase..// F
2410: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2f 2f 0a 2f  or example:.//./
2420: 2f 20 20 20 20 20 20 73 6f 6d 65 74 68 69 6e 67  /      something
2430: 20 3a 3a 3d 20 2e 2e 2e 2e 20 73 63 61 6e 70 74   ::= .... scanpt
2440: 28 41 29 20 70 68 72 61 73 65 20 73 63 61 6e 70  (A) phrase scanp
2450: 74 28 5a 29 2e 0a 2f 2f 0a 2f 2f 20 54 68 65 20  t(Z)..//.// The 
2460: 74 65 78 74 20 74 68 61 74 20 69 73 20 70 61 72  text that is par
2470: 73 65 64 20 61 73 20 22 70 68 72 61 73 65 22 20  sed as "phrase" 
2480: 69 73 20 61 20 73 74 72 69 6e 67 20 73 74 61 72  is a string star
2490: 74 69 6e 67 20 61 74 20 41 0a 2f 2f 20 61 6e 64  ting at A.// and
24a0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 28 69 6e 74   containing (int
24b0: 29 28 5a 2d 41 29 20 63 68 61 72 61 63 74 65 72  )(Z-A) character
24c0: 73 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20  s.  There might 
24d0: 62 65 20 73 6f 6d 65 20 65 78 74 72 61 0a 2f 2f  be some extra.//
24e0: 20 77 68 69 74 65 73 70 61 63 65 20 6f 6e 20 65   whitespace on e
24f0: 69 74 68 65 72 20 65 6e 64 20 6f 66 20 74 68 65  ither end of the
2500: 20 74 65 78 74 2c 20 62 75 74 20 74 68 61 74 20   text, but that 
2510: 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 20 69  can be removed i
2520: 6e 0a 2f 2f 20 70 6f 73 74 2d 70 72 6f 63 65 73  n.// post-proces
2530: 73 69 6e 67 2c 20 69 66 20 6e 65 65 64 65 64 2e  sing, if needed.
2540: 0a 2f 2f 0a 25 74 79 70 65 20 73 63 61 6e 70 74  .//.%type scanpt
2550: 20 7b 63 6f 6e 73 74 20 63 68 61 72 2a 7d 0a 73   {const char*}.s
2560: 63 61 6e 70 74 28 41 29 20 3a 3a 3d 20 2e 20 7b  canpt(A) ::= . {
2570: 0a 20 20 61 73 73 65 72 74 28 20 79 79 4c 6f 6f  .  assert( yyLoo
2580: 6b 61 68 65 61 64 21 3d 59 59 4e 4f 43 4f 44 45  kahead!=YYNOCODE
2590: 20 29 3b 0a 20 20 41 20 3d 20 79 79 4c 6f 6f 6b   );.  A = yyLook
25a0: 61 68 65 61 64 54 6f 6b 65 6e 2e 7a 3b 0a 7d 0a  aheadToken.z;.}.
25b0: 0a 2f 2f 20 22 63 61 72 67 6c 69 73 74 22 20 69  .// "carglist" i
25c0: 73 20 61 20 6c 69 73 74 20 6f 66 20 61 64 64 69  s a list of addi
25d0: 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e  tional constrain
25e0: 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66 74  ts that come aft
25f0: 65 72 20 74 68 65 0a 2f 2f 20 63 6f 6c 75 6d 6e  er the.// column
2600: 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e   name and column
2610: 20 74 79 70 65 20 69 6e 20 61 20 43 52 45 41 54   type in a CREAT
2620: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
2630: 74 2e 0a 2f 2f 0a 63 61 72 67 6c 69 73 74 20 3a  t..//.carglist :
2640: 3a 3d 20 63 61 72 67 6c 69 73 74 20 63 63 6f 6e  := carglist ccon
2650: 73 2e 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20  s..carglist ::= 
2660: 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53  ..ccons ::= CONS
2670: 54 52 41 49 4e 54 20 6e 6d 28 58 29 2e 20 20 20  TRAINT nm(X).   
2680: 20 20 20 20 20 20 20 20 7b 70 50 61 72 73 65 2d          {pParse-
2690: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 20  >constraintName 
26a0: 3d 20 58 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  = X;}.ccons ::= 
26b0: 44 45 46 41 55 4c 54 20 73 63 61 6e 70 74 28 41  DEFAULT scanpt(A
26c0: 29 20 74 65 72 6d 28 58 29 20 73 63 61 6e 70 74  ) term(X) scanpt
26d0: 28 5a 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (Z)..           
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66 61   {sqlite3AddDefa
2700: 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  ultValue(pParse,
2710: 58 2c 41 2c 5a 29 3b 7d 0a 63 63 6f 6e 73 20 3a  X,A,Z);}.ccons :
2720: 3a 3d 20 44 45 46 41 55 4c 54 20 4c 50 28 41 29  := DEFAULT LP(A)
2730: 20 65 78 70 72 28 58 29 20 52 50 28 5a 29 2e 0a   expr(X) RP(Z)..
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
2760: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
2770: 6c 75 65 28 70 50 61 72 73 65 2c 58 2c 41 2e 7a  lue(pParse,X,A.z
2780: 2b 31 2c 5a 2e 7a 29 3b 7d 0a 63 63 6f 6e 73 20  +1,Z.z);}.ccons 
2790: 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50 4c 55 53  ::= DEFAULT PLUS
27a0: 28 41 29 20 74 65 72 6d 28 58 29 20 73 63 61 6e  (A) term(X) scan
27b0: 70 74 28 5a 29 2e 0a 20 20 20 20 20 20 20 20 20  pt(Z)..         
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65     {sqlite3AddDe
27e0: 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73  faultValue(pPars
27f0: 65 2c 58 2c 41 2e 7a 2c 5a 29 3b 7d 0a 63 63 6f  e,X,A.z,Z);}.cco
2800: 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4d  ns ::= DEFAULT M
2810: 49 4e 55 53 28 41 29 20 74 65 72 6d 28 58 29 20  INUS(A) term(X) 
2820: 73 63 61 6e 70 74 28 5a 29 2e 20 20 20 20 20 20  scanpt(Z).      
2830: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
2840: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
2850: 65 2c 20 54 4b 5f 55 4d 49 4e 55 53 2c 20 58 2c  e, TK_UMINUS, X,
2860: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 41 64   0);.  sqlite3Ad
2870: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
2880: 61 72 73 65 2c 70 2c 41 2e 7a 2c 5a 29 3b 0a 7d  arse,p,A.z,Z);.}
2890: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55  .ccons ::= DEFAU
28a0: 4c 54 20 73 63 61 6e 70 74 20 69 64 28 58 29 2e  LT scanpt id(X).
28b0: 20 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72 20         {.  Expr 
28c0: 2a 70 20 3d 20 74 6f 6b 65 6e 45 78 70 72 28 70  *p = tokenExpr(p
28d0: 50 61 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47  Parse, TK_STRING
28e0: 2c 20 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 41  , X);.  sqlite3A
28f0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70  ddDefaultValue(p
2900: 50 61 72 73 65 2c 70 2c 58 2e 7a 2c 58 2e 7a 2b  Parse,p,X.z,X.z+
2910: 58 2e 6e 29 3b 0a 7d 0a 0a 2f 2f 20 49 6e 20 61  X.n);.}..// In a
2920: 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
2930: 79 70 65 20 6e 61 6d 65 2c 20 77 65 20 61 6c 73  ype name, we als
2940: 6f 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  o care about the
2950: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64   primary key and
2960: 0a 2f 2f 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .// UNIQUE const
2970: 72 61 69 6e 74 73 2e 0a 2f 2f 0a 63 63 6f 6e 73  raints..//.ccons
2980: 20 3a 3a 3d 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66   ::= NULL onconf
2990: 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 4f 54 20  ..ccons ::= NOT 
29a0: 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 28 52 29 2e 20  NULL onconf(R). 
29b0: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 4e 6f     {sqlite3AddNo
29c0: 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 52 29  tNull(pParse, R)
29d0: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 50 52 49  ;}.ccons ::= PRI
29e0: 4d 41 52 59 20 4b 45 59 20 73 6f 72 74 6f 72 64  MARY KEY sortord
29f0: 65 72 28 5a 29 20 6f 6e 63 6f 6e 66 28 52 29 20  er(Z) onconf(R) 
2a00: 61 75 74 6f 69 6e 63 28 49 29 2e 0a 20 20 20 20  autoinc(I)..    
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
2a30: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
2a40: 65 79 28 70 50 61 72 73 65 2c 30 2c 52 2c 49 2c  ey(pParse,0,R,I,
2a50: 5a 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 55  Z);}.ccons ::= U
2a60: 4e 49 51 55 45 20 6f 6e 63 6f 6e 66 28 52 29 2e  NIQUE onconf(R).
2a70: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72        {sqlite3Cr
2a80: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
2a90: 2c 30 2c 30 2c 30 2c 30 2c 52 2c 30 2c 30 2c 30  ,0,0,0,0,R,0,0,0
2aa0: 2c 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ,0,.            
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 44         SQLITE_ID
2ad0: 58 54 59 50 45 5f 55 4e 49 51 55 45 29 3b 7d 0a  XTYPE_UNIQUE);}.
2ae0: 63 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20  ccons ::= CHECK 
2af0: 4c 50 20 65 78 70 72 28 58 29 20 52 50 2e 20 20  LP expr(X) RP.  
2b00: 20 7b 73 71 6c 69 74 65 33 41 64 64 43 68 65 63   {sqlite3AddChec
2b10: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  kConstraint(pPar
2b20: 73 65 2c 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  se,X);}.ccons ::
2b30: 3d 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6d 28  = REFERENCES nm(
2b40: 54 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28 54  T) eidlist_opt(T
2b50: 41 29 20 72 65 66 61 72 67 73 28 52 29 2e 0a 20  A) refargs(R).. 
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 7b 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f  {sqlite3CreateFo
2b90: 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c  reignKey(pParse,
2ba0: 30 2c 26 54 2c 54 41 2c 52 29 3b 7d 0a 63 63 6f  0,&T,TA,R);}.cco
2bb0: 6e 73 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62  ns ::= defer_sub
2bc0: 63 6c 61 75 73 65 28 44 29 2e 20 20 20 20 7b 73  clause(D).    {s
2bd0: 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
2be0: 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 44 29 3b  gnKey(pParse,D);
2bf0: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4c 4c  }.ccons ::= COLL
2c00: 41 54 45 20 69 64 73 28 43 29 2e 20 20 20 20 20  ATE ids(C).     
2c10: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43 6f     {sqlite3AddCo
2c20: 6c 6c 61 74 65 54 79 70 65 28 70 50 61 72 73 65  llateType(pParse
2c30: 2c 20 26 43 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20  , &C);}..// The 
2c40: 6f 70 74 69 6f 6e 61 6c 20 41 55 54 4f 49 4e 43  optional AUTOINC
2c50: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 0a 25  REMENT keyword.%
2c60: 74 79 70 65 20 61 75 74 6f 69 6e 63 20 7b 69 6e  type autoinc {in
2c70: 74 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a 3a  t}.autoinc(X) ::
2c80: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 7b 58 20  = .          {X 
2c90: 3d 20 30 3b 7d 0a 61 75 74 6f 69 6e 63 28 58 29  = 0;}.autoinc(X)
2ca0: 20 3a 3a 3d 20 41 55 54 4f 49 4e 43 52 2e 20 20   ::= AUTOINCR.  
2cb0: 7b 58 20 3d 20 31 3b 7d 0a 0a 2f 2f 20 54 68 65  {X = 1;}..// The
2cc0: 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72   next group of r
2cd0: 75 6c 65 73 20 70 61 72 73 65 73 20 74 68 65 20  ules parses the 
2ce0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 52  arguments to a R
2cf0: 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65  EFERENCES clause
2d00: 0a 2f 2f 20 74 68 61 74 20 64 65 74 65 72 6d 69  .// that determi
2d10: 6e 65 20 69 66 20 74 68 65 20 72 65 66 65 72 65  ne if the refere
2d20: 6e 74 69 61 6c 20 69 6e 74 65 67 72 69 74 79 20  ntial integrity 
2d30: 63 68 65 63 6b 69 6e 67 20 69 73 20 64 65 66 65  checking is defe
2d40: 72 72 65 64 20 6f 72 0a 2f 2f 20 6f 72 20 69 6d  rred or.// or im
2d50: 6d 65 64 69 61 74 65 20 61 6e 64 20 77 68 69 63  mediate and whic
2d60: 68 20 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74  h determine what
2d70: 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20   action to take 
2d80: 69 66 20 61 20 72 65 66 2d 69 6e 74 65 67 0a 2f  if a ref-integ./
2d90: 2f 20 63 68 65 63 6b 20 66 61 69 6c 73 2e 0a 2f  / check fails../
2da0: 2f 0a 25 74 79 70 65 20 72 65 66 61 72 67 73 20  /.%type refargs 
2db0: 7b 69 6e 74 7d 0a 72 65 66 61 72 67 73 28 41 29  {int}.refargs(A)
2dc0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
2dd0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
2de0: 5f 4e 6f 6e 65 2a 30 78 30 31 30 31 3b 20 2f 2a  _None*0x0101; /*
2df0: 20 45 56 3a 20 52 2d 31 39 38 30 33 2d 34 35 38   EV: R-19803-458
2e00: 38 34 20 2a 2f 7d 0a 72 65 66 61 72 67 73 28 41  84 */}.refargs(A
2e10: 29 20 3a 3a 3d 20 72 65 66 61 72 67 73 28 41 29  ) ::= refargs(A)
2e20: 20 72 65 66 61 72 67 28 59 29 2e 20 7b 20 41 20   refarg(Y). { A 
2e30: 3d 20 28 41 20 26 20 7e 59 2e 6d 61 73 6b 29 20  = (A & ~Y.mask) 
2e40: 7c 20 59 2e 76 61 6c 75 65 3b 20 7d 0a 25 74 79  | Y.value; }.%ty
2e50: 70 65 20 72 65 66 61 72 67 20 7b 73 74 72 75 63  pe refarg {struc
2e60: 74 20 7b 69 6e 74 20 76 61 6c 75 65 3b 20 69 6e  t {int value; in
2e70: 74 20 6d 61 73 6b 3b 7d 7d 0a 72 65 66 61 72 67  t mask;}}.refarg
2e80: 28 41 29 20 3a 3a 3d 20 4d 41 54 43 48 20 6e 6d  (A) ::= MATCH nm
2e90: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
2ea0: 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b 20 20 20   A.value = 0;   
2eb0: 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30    A.mask = 0x000
2ec0: 30 30 30 3b 20 7d 0a 72 65 66 61 72 67 28 41 29  000; }.refarg(A)
2ed0: 20 3a 3a 3d 20 4f 4e 20 49 4e 53 45 52 54 20 72   ::= ON INSERT r
2ee0: 65 66 61 63 74 2e 20 20 20 20 20 20 7b 20 41 2e  efact.      { A.
2ef0: 76 61 6c 75 65 20 3d 20 30 3b 20 20 20 20 20 41  value = 0;     A
2f00: 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 30 30  .mask = 0x000000
2f10: 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a  ; }.refarg(A) ::
2f20: 3d 20 4f 4e 20 44 45 4c 45 54 45 20 72 65 66 61  = ON DELETE refa
2f30: 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c  ct(X).   { A.val
2f40: 75 65 20 3d 20 58 3b 20 20 20 20 20 41 2e 6d 61  ue = X;     A.ma
2f50: 73 6b 20 3d 20 30 78 30 30 30 30 66 66 3b 20 7d  sk = 0x0000ff; }
2f60: 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f  .refarg(A) ::= O
2f70: 4e 20 55 50 44 41 54 45 20 72 65 66 61 63 74 28  N UPDATE refact(
2f80: 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20  X).   { A.value 
2f90: 3d 20 58 3c 3c 38 3b 20 20 41 2e 6d 61 73 6b 20  = X<<8;  A.mask 
2fa0: 3d 20 30 78 30 30 66 66 30 30 3b 20 7d 0a 25 74  = 0x00ff00; }.%t
2fb0: 79 70 65 20 72 65 66 61 63 74 20 7b 69 6e 74 7d  ype refact {int}
2fc0: 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 53  .refact(A) ::= S
2fd0: 45 54 20 4e 55 4c 4c 2e 20 20 20 20 20 20 20 20  ET NULL.        
2fe0: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53        { A = OE_S
2ff0: 65 74 4e 75 6c 6c 3b 20 20 2f 2a 20 45 56 3a 20  etNull;  /* EV: 
3000: 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f  R-33326-45252 */
3010: 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20  }.refact(A) ::= 
3020: 53 45 54 20 44 45 46 41 55 4c 54 2e 20 20 20 20  SET DEFAULT.    
3030: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f         { A = OE_
3040: 53 65 74 44 66 6c 74 3b 20 20 2f 2a 20 45 56 3a  SetDflt;  /* EV:
3050: 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a   R-33326-45252 *
3060: 2f 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d  /}.refact(A) ::=
3070: 20 43 41 53 43 41 44 45 2e 20 20 20 20 20 20 20   CASCADE.       
3080: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
3090: 5f 43 61 73 63 61 64 65 3b 20 20 2f 2a 20 45 56  _Cascade;  /* EV
30a0: 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20  : R-33326-45252 
30b0: 2a 2f 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a  */}.refact(A) ::
30c0: 3d 20 52 45 53 54 52 49 43 54 2e 20 20 20 20 20  = RESTRICT.     
30d0: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f           { A = O
30e0: 45 5f 52 65 73 74 72 69 63 74 3b 20 2f 2a 20 45  E_Restrict; /* E
30f0: 56 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32  V: R-33326-45252
3100: 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41 29 20 3a   */}.refact(A) :
3110: 3a 3d 20 4e 4f 20 41 43 54 49 4f 4e 2e 20 20 20  := NO ACTION.   
3120: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
3130: 4f 45 5f 4e 6f 6e 65 3b 20 20 20 20 20 2f 2a 20  OE_None;     /* 
3140: 45 56 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35  EV: R-33326-4525
3150: 32 20 2a 2f 7d 0a 25 74 79 70 65 20 64 65 66 65  2 */}.%type defe
3160: 72 5f 73 75 62 63 6c 61 75 73 65 20 7b 69 6e 74  r_subclause {int
3170: 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  }.defer_subclaus
3180: 65 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 44 45 46  e(A) ::= NOT DEF
3190: 45 52 52 41 42 4c 45 20 69 6e 69 74 5f 64 65 66  ERRABLE init_def
31a0: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 2e 20  erred_pred_opt. 
31b0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 65 66      {A = 0;}.def
31c0: 65 72 5f 73 75 62 63 6c 61 75 73 65 28 41 29 20  er_subclause(A) 
31d0: 3a 3a 3d 20 44 45 46 45 52 52 41 42 4c 45 20 69  ::= DEFERRABLE i
31e0: 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65  nit_deferred_pre
31f0: 64 5f 6f 70 74 28 58 29 2e 20 20 20 20 20 20 7b  d_opt(X).      {
3200: 41 20 3d 20 58 3b 7d 0a 25 74 79 70 65 20 69 6e  A = X;}.%type in
3210: 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64  it_deferred_pred
3220: 5f 6f 70 74 20 7b 69 6e 74 7d 0a 69 6e 69 74 5f  _opt {int}.init_
3230: 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70  deferred_pred_op
3240: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
3250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3260: 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 69 74 5f 64   {A = 0;}.init_d
3270: 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74  eferred_pred_opt
3280: 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c  (A) ::= INITIALL
3290: 59 20 44 45 46 45 52 52 45 44 2e 20 20 20 20 20  Y DEFERRED.     
32a0: 7b 41 20 3d 20 31 3b 7d 0a 69 6e 69 74 5f 64 65  {A = 1;}.init_de
32b0: 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28  ferred_pred_opt(
32c0: 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59  A) ::= INITIALLY
32d0: 20 49 4d 4d 45 44 49 41 54 45 2e 20 20 20 20 7b   IMMEDIATE.    {
32e0: 41 20 3d 20 30 3b 7d 0a 0a 63 6f 6e 73 6c 69 73  A = 0;}..conslis
32f0: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  t_opt(A) ::= .  
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 20 20 20 20 20 20 20 7b 41 2e 6e 20 3d 20 30 3b         {A.n = 0;
3320: 20 41 2e 7a 20 3d 20 30 3b 7d 0a 63 6f 6e 73 6c   A.z = 0;}.consl
3330: 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 43  ist_opt(A) ::= C
3340: 4f 4d 4d 41 28 41 29 20 63 6f 6e 73 6c 69 73 74  OMMA(A) conslist
3350: 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 63  ..conslist ::= c
3360: 6f 6e 73 6c 69 73 74 20 74 63 6f 6e 73 63 6f 6d  onslist tconscom
3370: 6d 61 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69  ma tcons..consli
3380: 73 74 20 3a 3a 3d 20 74 63 6f 6e 73 2e 0a 74 63  st ::= tcons..tc
3390: 6f 6e 73 63 6f 6d 6d 61 20 3a 3a 3d 20 43 4f 4d  onscomma ::= COM
33a0: 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b  MA.            {
33b0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
33c0: 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b 7d 0a 74  ntName.n = 0;}.t
33d0: 63 6f 6e 73 63 6f 6d 6d 61 20 3a 3a 3d 20 2e 0a  conscomma ::= ..
33e0: 74 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54 52  tcons ::= CONSTR
33f0: 41 49 4e 54 20 6e 6d 28 58 29 2e 20 20 20 20 20  AINT nm(X).     
3400: 20 7b 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72   {pParse->constr
3410: 61 69 6e 74 4e 61 6d 65 20 3d 20 58 3b 7d 0a 74  aintName = X;}.t
3420: 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59  cons ::= PRIMARY
3430: 20 4b 45 59 20 4c 50 20 73 6f 72 74 6c 69 73 74   KEY LP sortlist
3440: 28 58 29 20 61 75 74 6f 69 6e 63 28 49 29 20 52  (X) autoinc(I) R
3450: 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20  P onconf(R)..   
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
3480: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
3490: 4b 65 79 28 70 50 61 72 73 65 2c 58 2c 52 2c 49  Key(pParse,X,R,I
34a0: 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20  ,0);}.tcons ::= 
34b0: 55 4e 49 51 55 45 20 4c 50 20 73 6f 72 74 6c 69  UNIQUE LP sortli
34c0: 73 74 28 58 29 20 52 50 20 6f 6e 63 6f 6e 66 28  st(X) RP onconf(
34d0: 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  R)..            
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65       {sqlite3Cre
3500: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
3510: 30 2c 30 2c 30 2c 58 2c 52 2c 30 2c 30 2c 30 2c  0,0,0,X,R,0,0,0,
3520: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
3530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3540: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
3550: 5f 49 44 58 54 59 50 45 5f 55 4e 49 51 55 45 29  _IDXTYPE_UNIQUE)
3560: 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 48 45  ;}.tcons ::= CHE
3570: 43 4b 20 4c 50 20 65 78 70 72 28 45 29 20 52 50  CK LP expr(E) RP
3580: 20 6f 6e 63 6f 6e 66 2e 0a 20 20 20 20 20 20 20   onconf..       
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
35b0: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
35c0: 61 69 6e 74 28 70 50 61 72 73 65 2c 45 29 3b 7d  aint(pParse,E);}
35d0: 0a 74 63 6f 6e 73 20 3a 3a 3d 20 46 4f 52 45 49  .tcons ::= FOREI
35e0: 47 4e 20 4b 45 59 20 4c 50 20 65 69 64 6c 69 73  GN KEY LP eidlis
35f0: 74 28 46 41 29 20 52 50 0a 20 20 20 20 20 20 20  t(FA) RP.       
3600: 20 20 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6d     REFERENCES nm
3610: 28 54 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28  (T) eidlist_opt(
3620: 54 41 29 20 72 65 66 61 72 67 73 28 52 29 20 64  TA) refargs(R) d
3630: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f  efer_subclause_o
3640: 70 74 28 44 29 2e 20 7b 0a 20 20 20 20 73 71 6c  pt(D). {.    sql
3650: 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
3660: 6e 4b 65 79 28 70 50 61 72 73 65 2c 20 46 41 2c  nKey(pParse, FA,
3670: 20 26 54 2c 20 54 41 2c 20 52 29 3b 0a 20 20 20   &T, TA, R);.   
3680: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
3690: 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 20  eignKey(pParse, 
36a0: 44 29 3b 0a 7d 0a 25 74 79 70 65 20 64 65 66 65  D);.}.%type defe
36b0: 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 20  r_subclause_opt 
36c0: 7b 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75 62 63  {int}.defer_subc
36d0: 6c 61 75 73 65 5f 6f 70 74 28 41 29 20 3a 3a 3d  lause_opt(A) ::=
36e0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
36f0: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64        {A = 0;}.d
3700: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f  efer_subclause_o
3710: 70 74 28 41 29 20 3a 3a 3d 20 64 65 66 65 72 5f  pt(A) ::= defer_
3720: 73 75 62 63 6c 61 75 73 65 28 41 29 2e 0a 0a 2f  subclause(A).../
3730: 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  / The following 
3740: 69 73 20 61 20 6e 6f 6e 2d 73 74 61 6e 64 61 72  is a non-standar
3750: 64 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 61 74  d extension that
3760: 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 64 65   allows us to de
3770: 63 6c 61 72 65 20 74 68 65 0a 2f 2f 20 64 65 66  clare the.// def
3780: 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20 77 68  ault behavior wh
3790: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 6f  en there is a co
37a0: 6e 73 74 72 61 69 6e 74 20 63 6f 6e 66 6c 69 63  nstraint conflic
37b0: 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f 6e 63 6f  t..//.%type onco
37c0: 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 70 65 20 6f  nf {int}.%type o
37d0: 72 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 70  rconf {int}.%typ
37e0: 65 20 72 65 73 6f 6c 76 65 74 79 70 65 20 7b 69  e resolvetype {i
37f0: 6e 74 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20 3a 3a  nt}.onconf(A) ::
3800: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
3810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3820: 20 7b 41 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74   {A = OE_Default
3830: 3b 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20 3a 3a 3d  ;}.onconf(A) ::=
3840: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 72 65 73   ON CONFLICT res
3850: 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20 20 20  olvetype(X).    
3860: 7b 41 20 3d 20 58 3b 7d 0a 6f 72 63 6f 6e 66 28  {A = X;}.orconf(
3870: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44 65        {A = OE_De
38a0: 66 61 75 6c 74 3b 7d 0a 6f 72 63 6f 6e 66 28 41  fault;}.orconf(A
38b0: 29 20 3a 3a 3d 20 4f 52 20 72 65 73 6f 6c 76 65  ) ::= OR resolve
38c0: 74 79 70 65 28 58 29 2e 20 20 20 20 20 20 20 20  type(X).        
38d0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 72 65       {A = X;}.re
38e0: 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d  solvetype(A) ::=
38f0: 20 72 61 69 73 65 74 79 70 65 28 41 29 2e 0a 72   raisetype(A)..r
3900: 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a  esolvetype(A) ::
3910: 3d 20 49 47 4e 4f 52 45 2e 20 20 20 20 20 20 20  = IGNORE.       
3920: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3930: 20 4f 45 5f 49 67 6e 6f 72 65 3b 7d 0a 72 65 73   OE_Ignore;}.res
3940: 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20  olvetype(A) ::= 
3950: 52 45 50 4c 41 43 45 2e 20 20 20 20 20 20 20 20  REPLACE.        
3960: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f            {A = O
3970: 45 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 2f 2f 2f  E_Replace;}..///
3980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3990: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50  /////// The DROP
39a0: 20 54 41 42 4c 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f   TABLE /////////
39b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
39c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
39d0: 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 41 42  cmd ::= DROP TAB
39e0: 4c 45 20 69 66 65 78 69 73 74 73 28 45 29 20 66  LE ifexists(E) f
39f0: 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20  ullname(X). {.  
3a00: 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
3a10: 28 70 50 61 72 73 65 2c 20 58 2c 20 30 2c 20 45  (pParse, X, 0, E
3a20: 29 3b 0a 7d 0a 25 74 79 70 65 20 69 66 65 78 69  );.}.%type ifexi
3a30: 73 74 73 20 7b 69 6e 74 7d 0a 69 66 65 78 69 73  sts {int}.ifexis
3a40: 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 45 58 49  ts(A) ::= IF EXI
3a50: 53 54 53 2e 20 20 20 7b 41 20 3d 20 31 3b 7d 0a  STS.   {A = 1;}.
3a60: 69 66 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20  ifexists(A) ::= 
3a70: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20  .            {A 
3a80: 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  = 0;}../////////
3a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
3aa0: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
3ab0: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
3ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3ad0: 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20  ////.//.%ifndef 
3ae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
3af0: 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 6b  .cmd ::= createk
3b00: 77 28 58 29 20 74 65 6d 70 28 54 29 20 56 49 45  w(X) temp(T) VIE
3b10: 57 20 69 66 6e 6f 74 65 78 69 73 74 73 28 45 29  W ifnotexists(E)
3b20: 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 20 65   nm(Y) dbnm(Z) e
3b30: 69 64 6c 69 73 74 5f 6f 70 74 28 43 29 0a 20 20  idlist_opt(C).  
3b40: 20 20 20 20 20 20 20 20 41 53 20 73 65 6c 65 63          AS selec
3b50: 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  t(S). {.  sqlite
3b60: 33 43 72 65 61 74 65 56 69 65 77 28 70 50 61 72  3CreateView(pPar
3b70: 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a 2c 20  se, &X, &Y, &Z, 
3b80: 43 2c 20 53 2c 20 54 2c 20 45 29 3b 0a 7d 0a 63  C, S, T, E);.}.c
3b90: 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 56 49 45 57  md ::= DROP VIEW
3ba0: 20 69 66 65 78 69 73 74 73 28 45 29 20 66 75 6c   ifexists(E) ful
3bb0: 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71  lname(X). {.  sq
3bc0: 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 70  lite3DropTable(p
3bd0: 50 61 72 73 65 2c 20 58 2c 20 31 2c 20 45 29 3b  Parse, X, 1, E);
3be0: 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54  .}.%endif  SQLIT
3bf0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 0a 2f 2f 2f  E_OMIT_VIEW..///
3c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3c10: 2f 2f 2f 2f 2f 20 54 68 65 20 53 45 4c 45 43 54  ///// The SELECT
3c20: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
3c30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
3c50: 63 6d 64 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58  cmd ::= select(X
3c60: 29 2e 20 20 7b 0a 20 20 53 65 6c 65 63 74 44 65  ).  {.  SelectDe
3c70: 73 74 20 64 65 73 74 20 3d 20 7b 53 52 54 5f 4f  st dest = {SRT_O
3c80: 75 74 70 75 74 2c 20 30 2c 20 30 2c 20 30 2c 20  utput, 0, 0, 0, 
3c90: 30 2c 20 30 7d 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0};.  sqlite3
3ca0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 58  Select(pParse, X
3cb0: 2c 20 26 64 65 73 74 29 3b 0a 20 20 73 71 6c 69  , &dest);.  sqli
3cc0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
3cd0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 58 29 3b 0a  pParse->db, X);.
3ce0: 7d 0a 0a 25 74 79 70 65 20 73 65 6c 65 63 74 20  }..%type select 
3cf0: 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72  {Select*}.%destr
3d00: 75 63 74 6f 72 20 73 65 6c 65 63 74 20 7b 73 71  uctor select {sq
3d10: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3d20: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
3d30: 29 3b 7d 0a 25 74 79 70 65 20 73 65 6c 65 63 74  );}.%type select
3d40: 6e 6f 77 69 74 68 20 7b 53 65 6c 65 63 74 2a 7d  nowith {Select*}
3d50: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c  .%destructor sel
3d60: 65 63 74 6e 6f 77 69 74 68 20 7b 73 71 6c 69 74  ectnowith {sqlit
3d70: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
3d80: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
3d90: 0a 25 74 79 70 65 20 6f 6e 65 73 65 6c 65 63 74  .%type oneselect
3da0: 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74   {Select*}.%dest
3db0: 72 75 63 74 6f 72 20 6f 6e 65 73 65 6c 65 63 74  ructor oneselect
3dc0: 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   {sqlite3SelectD
3dd0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
3de0: 2c 20 24 24 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64  , $$);}..%includ
3df0: 65 20 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f  e {.  /*.  ** Fo
3e00: 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  r a compound SEL
3e10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 6d  ECT statement, m
3e20: 61 6b 65 20 73 75 72 65 20 70 2d 3e 70 50 72 69  ake sure p->pPri
3e30: 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20 66 6f 72  or->pNext==p for
3e40: 0a 20 20 2a 2a 20 61 6c 6c 20 65 6c 65 6d 65 6e  .  ** all elemen
3e50: 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 20  ts in the list. 
3e60: 20 41 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 6c   And make sure l
3e70: 69 73 74 20 6c 65 6e 67 74 68 20 64 6f 65 73 20  ist length does 
3e80: 6e 6f 74 20 65 78 63 65 65 64 0a 20 20 2a 2a 20  not exceed.  ** 
3e90: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
3ea0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2e 0a 20 20  POUND_SELECT..  
3eb0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
3ec0: 20 70 61 72 73 65 72 44 6f 75 62 6c 65 4c 69 6e   parserDoubleLin
3ed0: 6b 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70  kSelect(Parse *p
3ee0: 50 61 72 73 65 2c 20 53 65 6c 65 63 74 20 2a 70  Parse, Select *p
3ef0: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 50  ){.    if( p->pP
3f00: 72 69 6f 72 20 29 7b 0a 20 20 20 20 20 20 53 65  rior ){.      Se
3f10: 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d 20 30 2c  lect *pNext = 0,
3f20: 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 69   *pLoop;.      i
3f30: 6e 74 20 6d 78 53 65 6c 65 63 74 2c 20 63 6e 74  nt mxSelect, cnt
3f40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
3f50: 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20  pLoop=p; pLoop; 
3f60: 70 4e 65 78 74 3d 70 4c 6f 6f 70 2c 20 70 4c 6f  pNext=pLoop, pLo
3f70: 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72  op=pLoop->pPrior
3f80: 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20  , cnt++){.      
3f90: 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d    pLoop->pNext =
3fa0: 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20   pNext;.        
3fb0: 70 4c 6f 6f 70 2d 3e 73 65 6c 46 6c 61 67 73 20  pLoop->selFlags 
3fc0: 7c 3d 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a  |= SF_Compound;.
3fd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3fe0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
3ff0: 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 29 3d   SF_MultiValue)=
4000: 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 20 28  =0 && .        (
4010: 6d 78 53 65 6c 65 63 74 20 3d 20 70 50 61 72 73  mxSelect = pPars
4020: 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  e->db->aLimit[SQ
4030: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
4040: 55 4e 44 5f 53 45 4c 45 43 54 5d 29 3e 30 20 26  UND_SELECT])>0 &
4050: 26 0a 20 20 20 20 20 20 20 20 63 6e 74 3e 6d 78  &.        cnt>mx
4060: 53 65 6c 65 63 74 0a 20 20 20 20 20 20 29 7b 0a  Select.      ){.
4070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4080: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4090: 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
40a0: 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  in compound SELE
40b0: 43 54 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CT");.      }.  
40c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 65 6c 65 63    }.  }.}..selec
40d0: 74 28 41 29 20 3a 3a 3d 20 77 69 74 68 28 57 29  t(A) ::= with(W)
40e0: 20 73 65 6c 65 63 74 6e 6f 77 69 74 68 28 58 29   selectnowith(X)
40f0: 2e 20 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 20  . {.  Select *p 
4100: 3d 20 58 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  = X;.  if( p ){.
4110: 20 20 20 20 70 2d 3e 70 57 69 74 68 20 3d 20 57      p->pWith = W
4120: 3b 0a 20 20 20 20 70 61 72 73 65 72 44 6f 75 62  ;.    parserDoub
4130: 6c 65 4c 69 6e 6b 53 65 6c 65 63 74 28 70 50 61  leLinkSelect(pPa
4140: 72 73 65 2c 20 70 29 3b 0a 20 20 7d 65 6c 73 65  rse, p);.  }else
4150: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 69 74  {.    sqlite3Wit
4160: 68 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  hDelete(pParse->
4170: 64 62 2c 20 57 29 3b 0a 20 20 7d 0a 20 20 41 20  db, W);.  }.  A 
4180: 3d 20 70 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69  = p; /*A-overwri
4190: 74 65 73 2d 57 2a 2f 0a 7d 0a 0a 73 65 6c 65 63  tes-W*/.}..selec
41a0: 74 6e 6f 77 69 74 68 28 41 29 20 3a 3a 3d 20 6f  tnowith(A) ::= o
41b0: 6e 65 73 65 6c 65 63 74 28 41 29 2e 0a 25 69 66  neselect(A)..%if
41c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
41d0: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
41e0: 0a 73 65 6c 65 63 74 6e 6f 77 69 74 68 28 41 29  .selectnowith(A)
41f0: 20 3a 3a 3d 20 73 65 6c 65 63 74 6e 6f 77 69 74   ::= selectnowit
4200: 68 28 41 29 20 6d 75 6c 74 69 73 65 6c 65 63 74  h(A) multiselect
4210: 5f 6f 70 28 59 29 20 6f 6e 65 73 65 6c 65 63 74  _op(Y) oneselect
4220: 28 5a 29 2e 20 20 7b 0a 20 20 53 65 6c 65 63 74  (Z).  {.  Select
4230: 20 2a 70 52 68 73 20 3d 20 5a 3b 0a 20 20 53 65   *pRhs = Z;.  Se
4240: 6c 65 63 74 20 2a 70 4c 68 73 20 3d 20 41 3b 0a  lect *pLhs = A;.
4250: 20 20 69 66 28 20 70 52 68 73 20 26 26 20 70 52    if( pRhs && pR
4260: 68 73 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  hs->pPrior ){.  
4270: 20 20 53 72 63 4c 69 73 74 20 2a 70 46 72 6f 6d    SrcList *pFrom
4280: 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 78 3b 0a 20  ;.    Token x;. 
4290: 20 20 20 78 2e 6e 20 3d 20 30 3b 0a 20 20 20 20     x.n = 0;.    
42a0: 70 61 72 73 65 72 44 6f 75 62 6c 65 4c 69 6e 6b  parserDoubleLink
42b0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
42c0: 52 68 73 29 3b 0a 20 20 20 20 70 46 72 6f 6d 20  Rhs);.    pFrom 
42d0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
42e0: 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
42f0: 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26 78 2c 70  Parse,0,0,0,&x,p
4300: 52 68 73 2c 30 2c 30 29 3b 0a 20 20 20 20 70 52  Rhs,0,0);.    pR
4310: 68 73 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  hs = sqlite3Sele
4320: 63 74 4e 65 77 28 70 50 61 72 73 65 2c 30 2c 70  ctNew(pParse,0,p
4330: 46 72 6f 6d 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  From,0,0,0,0,0,0
4340: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52 68  );.  }.  if( pRh
4350: 73 20 29 7b 0a 20 20 20 20 70 52 68 73 2d 3e 6f  s ){.    pRhs->o
4360: 70 20 3d 20 28 75 38 29 59 3b 0a 20 20 20 20 70  p = (u8)Y;.    p
4370: 52 68 73 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4c  Rhs->pPrior = pL
4380: 68 73 3b 0a 20 20 20 20 69 66 28 20 41 4c 57 41  hs;.    if( ALWA
4390: 59 53 28 70 4c 68 73 29 20 29 20 70 4c 68 73 2d  YS(pLhs) ) pLhs-
43a0: 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
43b0: 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20  _MultiValue;.   
43c0: 20 70 52 68 73 2d 3e 73 65 6c 46 6c 61 67 73 20   pRhs->selFlags 
43d0: 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75  &= ~SF_MultiValu
43e0: 65 3b 0a 20 20 20 20 69 66 28 20 59 21 3d 54 4b  e;.    if( Y!=TK
43f0: 5f 41 4c 4c 20 29 20 70 50 61 72 73 65 2d 3e 68  _ALL ) pParse->h
4400: 61 73 43 6f 6d 70 6f 75 6e 64 20 3d 20 31 3b 0a  asCompound = 1;.
4410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
4420: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
4430: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 68  (pParse->db, pLh
4440: 73 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 70 52  s);.  }.  A = pR
4450: 68 73 3b 0a 7d 0a 25 74 79 70 65 20 6d 75 6c 74  hs;.}.%type mult
4460: 69 73 65 6c 65 63 74 5f 6f 70 20 7b 69 6e 74 7d  iselect_op {int}
4470: 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28  .multiselect_op(
4480: 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 28 4f 50 29  A) ::= UNION(OP)
4490: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
44a0: 20 3d 20 40 4f 50 3b 20 2f 2a 41 2d 6f 76 65 72   = @OP; /*A-over
44b0: 77 72 69 74 65 73 2d 4f 50 2a 2f 7d 0a 6d 75 6c  writes-OP*/}.mul
44c0: 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a  tiselect_op(A) :
44d0: 3a 3d 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 20  := UNION ALL.   
44e0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 54            {A = T
44f0: 4b 5f 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73 65 6c  K_ALL;}.multisel
4500: 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 45 58  ect_op(A) ::= EX
4510: 43 45 50 54 7c 49 4e 54 45 52 53 45 43 54 28 4f  CEPT|INTERSECT(O
4520: 50 29 2e 20 20 7b 41 20 3d 20 40 4f 50 3b 20 2f  P).  {A = @OP; /
4530: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 4f 50  *A-overwrites-OP
4540: 2a 2f 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54  */}.%endif SQLIT
4550: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
4560: 53 45 4c 45 43 54 0a 6f 6e 65 73 65 6c 65 63 74  SELECT.oneselect
4570: 28 41 29 20 3a 3a 3d 20 53 45 4c 45 43 54 28 53  (A) ::= SELECT(S
4580: 29 20 64 69 73 74 69 6e 63 74 28 44 29 20 73 65  ) distinct(D) se
4590: 6c 63 6f 6c 6c 69 73 74 28 57 29 20 66 72 6f 6d  lcollist(W) from
45a0: 28 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29  (X) where_opt(Y)
45b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
45c0: 20 20 67 72 6f 75 70 62 79 5f 6f 70 74 28 50 29    groupby_opt(P)
45d0: 20 68 61 76 69 6e 67 5f 6f 70 74 28 51 29 20 6f   having_opt(Q) o
45e0: 72 64 65 72 62 79 5f 6f 70 74 28 5a 29 20 6c 69  rderby_opt(Z) li
45f0: 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 23 69  mit_opt(L). {.#i
4600: 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
4610: 41 42 4c 45 44 0a 20 20 54 6f 6b 65 6e 20 73 20  ABLED.  Token s 
4620: 3d 20 53 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69  = S; /*A-overwri
4630: 74 65 73 2d 53 2a 2f 0a 23 65 6e 64 69 66 0a 20  tes-S*/.#endif. 
4640: 20 41 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65   A = sqlite3Sele
4650: 63 74 4e 65 77 28 70 50 61 72 73 65 2c 57 2c 58  ctNew(pParse,W,X
4660: 2c 59 2c 50 2c 51 2c 5a 2c 44 2c 4c 29 3b 0a 23  ,Y,P,Q,Z,D,L);.#
4670: 69 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45  if SELECTTRACE_E
4680: 4e 41 42 4c 45 44 0a 20 20 2f 2a 20 50 6f 70 75  NABLED.  /* Popu
4690: 6c 61 74 65 20 74 68 65 20 53 65 6c 65 63 74 2e  late the Select.
46a0: 7a 53 65 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e  zSelName[] strin
46b0: 67 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74  g that is used t
46c0: 6f 20 68 65 6c 70 20 77 69 74 68 0a 20 20 2a 2a  o help with.  **
46d0: 20 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 64   query planner d
46e0: 65 62 75 67 67 69 6e 67 2c 20 74 6f 20 64 69 66  ebugging, to dif
46f0: 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65  ferentiate betwe
4700: 65 6e 20 6d 75 6c 74 69 70 6c 65 20 53 65 6c 65  en multiple Sele
4710: 63 74 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20  ct.  ** objects 
4720: 69 6e 20 61 20 63 6f 6d 70 6c 65 78 20 71 75 65  in a complex que
4730: 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ry..  **.  ** If
4740: 20 74 68 65 20 53 45 4c 45 43 54 20 6b 65 79 77   the SELECT keyw
4750: 6f 72 64 20 69 73 20 69 6d 6d 65 64 69 61 74 65  ord is immediate
4760: 6c 79 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61  ly followed by a
4770: 20 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74   C-style comment
4780: 0a 20 20 2a 2a 20 74 68 65 6e 20 65 78 74 72 61  .  ** then extra
4790: 63 74 20 74 68 65 20 66 69 72 73 74 20 66 65 77  ct the first few
47a0: 20 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68   alphanumeric ch
47b0: 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 77 69  aracters from wi
47c0: 74 68 69 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63  thin that.  ** c
47d0: 6f 6d 6d 65 6e 74 20 74 6f 20 62 65 20 74 68 65  omment to be the
47e0: 20 7a 53 65 6c 4e 61 6d 65 20 76 61 6c 75 65 2e   zSelName value.
47f0: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65    Otherwise, the
4800: 20 6c 61 62 65 6c 20 69 73 20 23 4e 20 77 68 65   label is #N whe
4810: 72 65 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e  re.  ** is an in
4820: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 69 6e  teger that is in
4830: 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65  cremented with e
4840: 61 63 68 20 53 45 4c 45 43 54 20 73 74 61 74 65  ach SELECT state
4850: 6d 65 6e 74 20 73 65 65 6e 2e 0a 20 20 2a 2f 0a  ment seen..  */.
4860: 20 20 69 66 28 20 41 21 3d 30 20 29 7b 0a 20 20    if( A!=0 ){.  
4870: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
4880: 3d 20 73 2e 7a 2b 36 3b 0a 20 20 20 20 69 6e 74  = s.z+6;.    int
4890: 20 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   i;.    sqlite3_
48a0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
48b0: 41 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 41 2d  A->zSelName), A-
48c0: 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 23 25 64 22  >zSelName, "#%d"
48d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
48e0: 20 20 20 20 20 20 20 2b 2b 70 50 61 72 73 65 2d         ++pParse-
48f0: 3e 6e 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 77  >nSelect);.    w
4900: 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 20 27 20  hile( z[0]==' ' 
4910: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a  ) z++;.    if( z
4920: 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a 5b 31 5d  [0]=='/' && z[1]
4930: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 7a  =='*' ){.      z
4940: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69   += 2;.      whi
4950: 6c 65 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20  le( z[0]==' ' ) 
4960: 7a 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  z++;.      for(i
4970: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 61 6c 6e  =0; sqlite3Isaln
4980: 75 6d 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  um(z[i]); i++){}
4990: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
49a0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 41  nprintf(sizeof(A
49b0: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 41 2d 3e  ->zSelName), A->
49c0: 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 2e 2a 73 22  zSelName, "%.*s"
49d0: 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  , i, z);.    }. 
49e0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 45 4c   }.#endif /* SEL
49f0: 45 43 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20  ECTRACE_ENABLED 
4a00: 2a 2f 0a 7d 0a 6f 6e 65 73 65 6c 65 63 74 28 41  */.}.oneselect(A
4a10: 29 20 3a 3a 3d 20 76 61 6c 75 65 73 28 41 29 2e  ) ::= values(A).
4a20: 0a 0a 25 74 79 70 65 20 76 61 6c 75 65 73 20 7b  ..%type values {
4a30: 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75  Select*}.%destru
4a40: 63 74 6f 72 20 76 61 6c 75 65 73 20 7b 73 71 6c  ctor values {sql
4a50: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
4a60: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
4a70: 3b 7d 0a 76 61 6c 75 65 73 28 41 29 20 3a 3a 3d  ;}.values(A) ::=
4a80: 20 56 41 4c 55 45 53 20 4c 50 20 6e 65 78 70 72   VALUES LP nexpr
4a90: 6c 69 73 74 28 58 29 20 52 50 2e 20 7b 0a 20 20  list(X) RP. {.  
4aa0: 41 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  A = sqlite3Selec
4ab0: 74 4e 65 77 28 70 50 61 72 73 65 2c 58 2c 30 2c  tNew(pParse,X,0,
4ac0: 30 2c 30 2c 30 2c 30 2c 53 46 5f 56 61 6c 75 65  0,0,0,0,SF_Value
4ad0: 73 2c 30 29 3b 0a 7d 0a 76 61 6c 75 65 73 28 41  s,0);.}.values(A
4ae0: 29 20 3a 3a 3d 20 76 61 6c 75 65 73 28 41 29 20  ) ::= values(A) 
4af0: 43 4f 4d 4d 41 20 4c 50 20 65 78 70 72 6c 69 73  COMMA LP exprlis
4b00: 74 28 59 29 20 52 50 2e 20 7b 0a 20 20 53 65 6c  t(Y) RP. {.  Sel
4b10: 65 63 74 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  ect *pRight, *pL
4b20: 65 66 74 20 3d 20 41 3b 0a 20 20 70 52 69 67 68  eft = A;.  pRigh
4b30: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
4b40: 74 4e 65 77 28 70 50 61 72 73 65 2c 59 2c 30 2c  tNew(pParse,Y,0,
4b50: 30 2c 30 2c 30 2c 30 2c 53 46 5f 56 61 6c 75 65  0,0,0,0,SF_Value
4b60: 73 7c 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 2c  s|SF_MultiValue,
4b70: 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  0);.  if( ALWAYS
4b80: 28 70 4c 65 66 74 29 20 29 20 70 4c 65 66 74 2d  (pLeft) ) pLeft-
4b90: 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
4ba0: 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 69  _MultiValue;.  i
4bb0: 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  f( pRight ){.   
4bc0: 20 70 52 69 67 68 74 2d 3e 6f 70 20 3d 20 54 4b   pRight->op = TK
4bd0: 5f 41 4c 4c 3b 0a 20 20 20 20 70 52 69 67 68 74  _ALL;.    pRight
4be0: 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4c 65 66 74  ->pPrior = pLeft
4bf0: 3b 0a 20 20 20 20 41 20 3d 20 70 52 69 67 68 74  ;.    A = pRight
4c00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 41  ;.  }else{.    A
4c10: 20 3d 20 70 4c 65 66 74 3b 0a 20 20 7d 0a 7d 0a   = pLeft;.  }.}.
4c20: 0a 2f 2f 20 54 68 65 20 22 64 69 73 74 69 6e 63  .// The "distinc
4c30: 74 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 69  t" nonterminal i
4c40: 73 20 74 72 75 65 20 28 31 29 20 69 66 20 74 68  s true (1) if th
4c50: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
4c60: 72 64 20 69 73 0a 2f 2f 20 70 72 65 73 65 6e 74  rd is.// present
4c70: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
4c80: 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2f 2f 0a  f it is not..//.
4c90: 25 74 79 70 65 20 64 69 73 74 69 6e 63 74 20 7b  %type distinct {
4ca0: 69 6e 74 7d 0a 64 69 73 74 69 6e 63 74 28 41 29  int}.distinct(A)
4cb0: 20 3a 3a 3d 20 44 49 53 54 49 4e 43 54 2e 20 20   ::= DISTINCT.  
4cc0: 20 7b 41 20 3d 20 53 46 5f 44 69 73 74 69 6e 63   {A = SF_Distinc
4cd0: 74 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20  t;}.distinct(A) 
4ce0: 3a 3a 3d 20 41 4c 4c 2e 20 20 20 20 20 20 20 20  ::= ALL.        
4cf0: 7b 41 20 3d 20 53 46 5f 41 6c 6c 3b 7d 0a 64 69  {A = SF_All;}.di
4d00: 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 2e 20  stinct(A) ::= . 
4d10: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
4d20: 3b 7d 0a 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69 73  ;}..// selcollis
4d30: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65  t is a list of e
4d40: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
4d50: 61 72 65 20 74 6f 20 62 65 63 6f 6d 65 20 74 68  are to become th
4d60: 65 20 72 65 74 75 72 6e 0a 2f 2f 20 76 61 6c 75  e return.// valu
4d70: 65 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  es of the SELECT
4d80: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
4d90: 20 22 2a 22 20 69 6e 20 73 74 61 74 65 6d 65 6e   "*" in statemen
4da0: 74 73 20 6c 69 6b 65 0a 2f 2f 20 22 53 45 4c 45  ts like.// "SELE
4db0: 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 20 69  CT * FROM ..." i
4dc0: 73 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73  s encoded as a s
4dd0: 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
4de0: 6e 20 77 69 74 68 20 61 6e 0a 2f 2f 20 6f 70 63  n with an.// opc
4df0: 6f 64 65 20 6f 66 20 54 4b 5f 41 53 54 45 52 49  ode of TK_ASTERI
4e00: 53 4b 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 65 6c  SK..//.%type sel
4e10: 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  collist {ExprLis
4e20: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
4e30: 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69  selcollist {sqli
4e40: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4e50: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
4e60: 29 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70 20 7b  );}.%type sclp {
4e70: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
4e80: 72 75 63 74 6f 72 20 73 63 6c 70 20 7b 73 71 6c  ructor sclp {sql
4e90: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4ea0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
4eb0: 24 29 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d  $);}.sclp(A) ::=
4ec0: 20 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 43   selcollist(A) C
4ed0: 4f 4d 4d 41 2e 0a 73 63 6c 70 28 41 29 20 3a 3a  OMMA..sclp(A) ::
4ee0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f00: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63     {A = 0;}.selc
4f10: 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63  ollist(A) ::= sc
4f20: 6c 70 28 41 29 20 73 63 61 6e 70 74 28 42 29 20  lp(A) scanpt(B) 
4f30: 65 78 70 72 28 58 29 20 73 63 61 6e 70 74 28 5a  expr(X) scanpt(Z
4f40: 29 20 61 73 28 59 29 2e 20 20 20 20 20 7b 0a 20  ) as(Y).     {. 
4f50: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
4f60: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
4f70: 73 65 2c 20 41 2c 20 58 29 3b 0a 20 20 20 69 66  se, A, X);.   if
4f80: 28 20 59 2e 6e 3e 30 20 29 20 73 71 6c 69 74 65  ( Y.n>0 ) sqlite
4f90: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
4fa0: 28 70 50 61 72 73 65 2c 20 41 2c 20 26 59 2c 20  (pParse, A, &Y, 
4fb0: 31 29 3b 0a 20 20 20 73 71 6c 69 74 65 33 45 78  1);.   sqlite3Ex
4fc0: 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28 70 50  prListSetSpan(pP
4fd0: 61 72 73 65 2c 41 2c 42 2c 5a 29 3b 0a 7d 0a 73  arse,A,B,Z);.}.s
4fe0: 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d  elcollist(A) ::=
4ff0: 20 73 63 6c 70 28 41 29 20 73 63 61 6e 70 74 20   sclp(A) scanpt 
5000: 53 54 41 52 2e 20 7b 0a 20 20 45 78 70 72 20 2a  STAR. {.  Expr *
5010: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  p = sqlite3Expr(
5020: 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 41  pParse->db, TK_A
5030: 53 54 45 52 49 53 4b 2c 20 30 29 3b 0a 20 20 41  STERISK, 0);.  A
5040: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
5050: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
5060: 20 41 2c 20 70 29 3b 0a 7d 0a 73 65 6c 63 6f 6c   A, p);.}.selcol
5070: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70  list(A) ::= sclp
5080: 28 41 29 20 73 63 61 6e 70 74 20 6e 6d 28 58 29  (A) scanpt nm(X)
5090: 20 44 4f 54 20 53 54 41 52 2e 20 7b 0a 20 20 45   DOT STAR. {.  E
50a0: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71  xpr *pRight = sq
50b0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
50c0: 65 2c 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20  e, TK_ASTERISK, 
50d0: 30 2c 20 30 29 3b 0a 20 20 45 78 70 72 20 2a 70  0, 0);.  Expr *p
50e0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
50f0: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
5100: 64 62 2c 20 54 4b 5f 49 44 2c 20 26 58 2c 20 31  db, TK_ID, &X, 1
5110: 29 3b 0a 20 20 45 78 70 72 20 2a 70 44 6f 74 20  );.  Expr *pDot 
5120: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
5130: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
5140: 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20  Left, pRight);. 
5150: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
5160: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
5170: 65 2c 41 2c 20 70 44 6f 74 29 3b 0a 7d 0a 0a 2f  e,A, pDot);.}../
5180: 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20  / An option "AS 
5190: 3c 69 64 3e 22 20 70 68 72 61 73 65 20 74 68 61  <id>" phrase tha
51a0: 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65  t can follow one
51b0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
51c0: 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64 65 66 69  ons that.// defi
51d0: 6e 65 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ne the result se
51e0: 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  t, or one of the
51f0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
5200: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25  ROM clause..//.%
5210: 74 79 70 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a  type as {Token}.
5220: 61 73 28 58 29 20 3a 3a 3d 20 41 53 20 6e 6d 28  as(X) ::= AS nm(
5230: 59 29 2e 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a  Y).    {X = Y;}.
5240: 61 73 28 58 29 20 3a 3a 3d 20 69 64 73 28 58 29  as(X) ::= ids(X)
5250: 2e 0a 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20 20  ..as(X) ::= .   
5260: 20 20 20 20 20 20 20 20 20 7b 58 2e 6e 20 3d 20           {X.n = 
5270: 30 3b 20 58 2e 7a 20 3d 20 30 3b 7d 0a 0a 0a 25  0; X.z = 0;}...%
5280: 74 79 70 65 20 73 65 6c 74 61 62 6c 69 73 74 20  type seltablist 
5290: 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74  {SrcList*}.%dest
52a0: 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c 69 73  ructor seltablis
52b0: 74 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t {sqlite3SrcLis
52c0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
52d0: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
52e0: 73 74 6c 5f 70 72 65 66 69 78 20 7b 53 72 63 4c  stl_prefix {SrcL
52f0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
5300: 72 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 73 71  r stl_prefix {sq
5310: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
5320: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
5330: 24 29 3b 7d 0a 25 74 79 70 65 20 66 72 6f 6d 20  $);}.%type from 
5340: 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74  {SrcList*}.%dest
5350: 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b 73 71 6c  ructor from {sql
5360: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
5370: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
5380: 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f 6d 70 6c 65  );}..// A comple
5390: 74 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  te FROM clause..
53a0: 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 2e  //.from(A) ::= .
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53c0: 7b 41 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  {A = sqlite3DbMa
53d0: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
53e0: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 41 29 29  >db, sizeof(*A))
53f0: 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 46  ;}.from(A) ::= F
5400: 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73 74 28 58  ROM seltablist(X
5410: 29 2e 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20 20  ). {.  A = X;.  
5420: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
5430: 69 66 74 4a 6f 69 6e 54 79 70 65 28 41 29 3b 0a  iftJoinType(A);.
5440: 7d 0a 0a 2f 2f 20 22 73 65 6c 74 61 62 6c 69 73  }..// "seltablis
5450: 74 22 20 69 73 20 61 20 22 53 65 6c 65 63 74 20  t" is a "Select 
5460: 54 61 62 6c 65 20 4c 69 73 74 22 20 2d 20 74 68  Table List" - th
5470: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
5480: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2f 2f 20   FROM clause.// 
5490: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
54a0: 65 6d 65 6e 74 2e 20 20 22 73 74 6c 5f 70 72 65  ement.  "stl_pre
54b0: 66 69 78 22 20 69 73 20 61 20 70 72 65 66 69 78  fix" is a prefix
54c0: 20 6f 66 20 74 68 69 73 20 6c 69 73 74 2e 0a 2f   of this list../
54d0: 2f 0a 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20  /.stl_prefix(A) 
54e0: 3a 3a 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 41  ::= seltablist(A
54f0: 29 20 6a 6f 69 6e 6f 70 28 59 29 2e 20 20 20 20  ) joinop(Y).    
5500: 7b 0a 20 20 20 69 66 28 20 41 4c 57 41 59 53 28  {.   if( ALWAYS(
5510: 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 30 29 20  A && A->nSrc>0) 
5520: 29 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31  ) A->a[A->nSrc-1
5530: 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  ].fg.jointype = 
5540: 28 75 38 29 59 3b 0a 7d 0a 73 74 6c 5f 70 72 65  (u8)Y;.}.stl_pre
5550: 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  fix(A) ::= .    
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5570: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
5580: 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a  seltablist(A) ::
5590: 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20  = stl_prefix(A) 
55a0: 6e 6d 28 59 29 20 64 62 6e 6d 28 44 29 20 61 73  nm(Y) dbnm(D) as
55b0: 28 5a 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28  (Z) indexed_opt(
55c0: 49 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  I).             
55d0: 20 20 20 20 20 6f 6e 5f 6f 70 74 28 4e 29 20 75       on_opt(N) u
55e0: 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20  sing_opt(U). {. 
55f0: 20 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   A = sqlite3SrcL
5600: 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
5610: 6d 28 70 50 61 72 73 65 2c 41 2c 26 59 2c 26 44  m(pParse,A,&Y,&D
5620: 2c 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20 73 71  ,&Z,0,N,U);.  sq
5630: 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
5640: 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 41 2c  xedBy(pParse, A,
5650: 20 26 49 29 3b 0a 7d 0a 73 65 6c 74 61 62 6c 69   &I);.}.seltabli
5660: 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72  st(A) ::= stl_pr
5670: 65 66 69 78 28 41 29 20 6e 6d 28 59 29 20 64 62  efix(A) nm(Y) db
5680: 6e 6d 28 44 29 20 4c 50 20 65 78 70 72 6c 69 73  nm(D) LP exprlis
5690: 74 28 45 29 20 52 50 20 61 73 28 5a 29 0a 20 20  t(E) RP as(Z).  
56a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56b0: 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f  on_opt(N) using_
56c0: 6f 70 74 28 55 29 2e 20 7b 0a 20 20 41 20 3d 20  opt(U). {.  A = 
56d0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
56e0: 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61  pendFromTerm(pPa
56f0: 72 73 65 2c 41 2c 26 59 2c 26 44 2c 26 5a 2c 30  rse,A,&Y,&D,&Z,0
5700: 2c 4e 2c 55 29 3b 0a 20 20 73 71 6c 69 74 65 33  ,N,U);.  sqlite3
5710: 53 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28  SrcListFuncArgs(
5720: 70 50 61 72 73 65 2c 20 41 2c 20 45 29 3b 0a 7d  pParse, A, E);.}
5730: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
5740: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
5750: 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a  seltablist(A) ::
5760: 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20  = stl_prefix(A) 
5770: 4c 50 20 73 65 6c 65 63 74 28 53 29 20 52 50 0a  LP select(S) RP.
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5790: 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74      as(Z) on_opt
57a0: 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29  (N) using_opt(U)
57b0: 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69  . {.    A = sqli
57c0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
57d0: 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
57e0: 41 2c 30 2c 30 2c 26 5a 2c 53 2c 4e 2c 55 29 3b  A,0,0,&Z,S,N,U);
57f0: 0a 20 20 7d 0a 20 20 73 65 6c 74 61 62 6c 69 73  .  }.  seltablis
5800: 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65  t(A) ::= stl_pre
5810: 66 69 78 28 41 29 20 4c 50 20 73 65 6c 74 61 62  fix(A) LP seltab
5820: 6c 69 73 74 28 46 29 20 52 50 0a 20 20 20 20 20  list(F) RP.     
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
5840: 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75  s(Z) on_opt(N) u
5850: 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20  sing_opt(U). {. 
5860: 20 20 20 69 66 28 20 41 3d 3d 30 20 26 26 20 5a     if( A==0 && Z
5870: 2e 6e 3d 3d 30 20 26 26 20 4e 3d 3d 30 20 26 26  .n==0 && N==0 &&
5880: 20 55 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 41   U==0 ){.      A
5890: 20 3d 20 46 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = F;.    }else 
58a0: 69 66 28 20 46 2d 3e 6e 53 72 63 3d 3d 31 20 29  if( F->nSrc==1 )
58b0: 7b 0a 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69  {.      A = sqli
58c0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
58d0: 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
58e0: 41 2c 30 2c 30 2c 26 5a 2c 30 2c 4e 2c 55 29 3b  A,0,0,&Z,0,N,U);
58f0: 0a 20 20 20 20 20 20 69 66 28 20 41 20 29 7b 0a  .      if( A ){.
5900: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53          struct S
5910: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
5920: 77 20 3d 20 26 41 2d 3e 61 5b 41 2d 3e 6e 53 72  w = &A->a[A->nSr
5930: 63 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 73 74  c-1];.        st
5940: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
5950: 6d 20 2a 70 4f 6c 64 20 3d 20 46 2d 3e 61 3b 0a  m *pOld = F->a;.
5960: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e          pNew->zN
5970: 61 6d 65 20 3d 20 70 4f 6c 64 2d 3e 7a 4e 61 6d  ame = pOld->zNam
5980: 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
5990: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 70 4f 6c  >zDatabase = pOl
59a0: 64 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  d->zDatabase;.  
59b0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 53 65 6c        pNew->pSel
59c0: 65 63 74 20 3d 20 70 4f 6c 64 2d 3e 70 53 65 6c  ect = pOld->pSel
59d0: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c  ect;.        pOl
59e0: 64 2d 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c 64 2d  d->zName = pOld-
59f0: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a  >zDatabase = 0;.
5a00: 20 20 20 20 20 20 20 20 70 4f 6c 64 2d 3e 70 53          pOld->pS
5a10: 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 20  elect = 0;.     
5a20: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
5a30: 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 50  SrcListDelete(pP
5a40: 61 72 73 65 2d 3e 64 62 2c 20 46 29 3b 0a 20 20  arse->db, F);.  
5a50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53    }else{.      S
5a60: 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79  elect *pSubquery
5a70: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
5a80: 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
5a90: 79 70 65 28 46 29 3b 0a 20 20 20 20 20 20 70 53  ype(F);.      pS
5aa0: 75 62 71 75 65 72 79 20 3d 20 73 71 6c 69 74 65  ubquery = sqlite
5ab0: 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73  3SelectNew(pPars
5ac0: 65 2c 30 2c 46 2c 30 2c 30 2c 30 2c 30 2c 53 46  e,0,F,0,0,0,0,SF
5ad0: 5f 4e 65 73 74 65 64 46 72 6f 6d 2c 30 29 3b 0a  _NestedFrom,0);.
5ae0: 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65        A = sqlite
5af0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
5b00: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c  omTerm(pParse,A,
5b10: 30 2c 30 2c 26 5a 2c 70 53 75 62 71 75 65 72 79  0,0,&Z,pSubquery
5b20: 2c 4e 2c 55 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ,N,U);.    }.  }
5b30: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
5b40: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a 25  OMIT_SUBQUERY..%
5b50: 74 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65 6e  type dbnm {Token
5b60: 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e 20  }.dbnm(A) ::= . 
5b70: 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b           {A.z=0;
5b80: 20 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41 29   A.n=0;}.dbnm(A)
5b90: 20 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e 20   ::= DOT nm(X). 
5ba0: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
5bb0: 66 75 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69 73  fullname {SrcLis
5bc0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
5bd0: 66 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74 65  fullname {sqlite
5be0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
5bf0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
5c00: 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a 3d  .fullname(A) ::=
5c10: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e 20   nm(X) dbnm(Y). 
5c20: 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65   .   {A = sqlite
5c30: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
5c40: 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 58 2c 26  Parse->db,0,&X,&
5c50: 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  Y); /*A-overwrit
5c60: 65 73 2d 58 2a 2f 7d 0a 0a 25 74 79 70 65 20 6a  es-X*/}..%type j
5c70: 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 6a 6f 69 6e  oinop {int}.join
5c80: 6f 70 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 7c  op(X) ::= COMMA|
5c90: 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20 20 20 20  JOIN.           
5ca0: 20 20 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45     { X = JT_INNE
5cb0: 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a  R; }.joinop(X) :
5cc0: 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f  := JOIN_KW(A) JO
5cd0: 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN..            
5ce0: 20 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69 74        {X = sqlit
5cf0: 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73  e3JoinType(pPars
5d00: 65 2c 26 41 2c 30 2c 30 29 3b 20 20 2f 2a 58 2d  e,&A,0,0);  /*X-
5d10: 6f 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d 0a  overwrites-A*/}.
5d20: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f  joinop(X) ::= JO
5d30: 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 4a  IN_KW(A) nm(B) J
5d40: 4f 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20  OIN..           
5d50: 20 20 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69         {X = sqli
5d60: 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72  te3JoinType(pPar
5d70: 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20 2f 2a 58  se,&A,&B,0); /*X
5d80: 2d 6f 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d  -overwrites-A*/}
5d90: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
5da0: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
5db0: 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20  nm(C) JOIN..    
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 58                {X
5dd0: 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79   = sqlite3JoinTy
5de0: 70 65 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c  pe(pParse,&A,&B,
5df0: 26 43 29 3b 2f 2a 58 2d 6f 76 65 72 77 72 69 74  &C);/*X-overwrit
5e00: 65 73 2d 41 2a 2f 7d 0a 0a 25 74 79 70 65 20 6f  es-A*/}..%type o
5e10: 6e 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64  n_opt {Expr*}.%d
5e20: 65 73 74 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74  estructor on_opt
5e30: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
5e40: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
5e50: 24 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20  $$);}.on_opt(N) 
5e60: 3a 3a 3d 20 4f 4e 20 65 78 70 72 28 45 29 2e 20  ::= ON expr(E). 
5e70: 20 20 7b 4e 20 3d 20 45 3b 7d 0a 6f 6e 5f 6f 70    {N = E;}.on_op
5e80: 74 28 4e 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(N) ::= .      
5e90: 20 20 20 20 20 20 20 7b 4e 20 3d 20 30 3b 7d 0a         {N = 0;}.
5ea0: 0a 2f 2f 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .// Note that th
5eb0: 69 73 20 62 6c 6f 63 6b 20 61 62 75 73 65 73 20  is block abuses 
5ec0: 74 68 65 20 54 6f 6b 65 6e 20 74 79 70 65 20 6a  the Token type j
5ed0: 75 73 74 20 61 20 6c 69 74 74 6c 65 2e 20 49 66  ust a little. If
5ee0: 20 74 68 65 72 65 20 69 73 0a 2f 2f 20 6e 6f 20   there is.// no 
5ef0: 22 49 4e 44 45 58 45 44 20 42 59 22 20 63 6c 61  "INDEXED BY" cla
5f00: 75 73 65 2c 20 74 68 65 20 72 65 74 75 72 6e 65  use, the returne
5f10: 64 20 74 6f 6b 65 6e 20 69 73 20 65 6d 70 74 79  d token is empty
5f20: 20 28 7a 3d 3d 30 20 26 26 20 6e 3d 3d 30 29 2e   (z==0 && n==0).
5f30: 20 49 66 0a 2f 2f 20 74 68 65 72 65 20 69 73 20   If.// there is 
5f40: 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
5f50: 61 75 73 65 2c 20 74 68 65 6e 20 74 68 65 20 74  ause, then the t
5f60: 6f 6b 65 6e 20 69 73 20 70 6f 70 75 6c 61 74 65  oken is populate
5f70: 64 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2c  d as per normal,
5f80: 0a 2f 2f 20 77 69 74 68 20 7a 20 70 6f 69 6e 74  .// with z point
5f90: 69 6e 67 20 74 6f 20 74 68 65 20 74 6f 6b 65 6e  ing to the token
5fa0: 20 64 61 74 61 20 61 6e 64 20 6e 20 63 6f 6e 74   data and n cont
5fb0: 61 69 6e 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  aining the numbe
5fc0: 72 20 6f 66 20 62 79 74 65 73 0a 2f 2f 20 69 6e  r of bytes.// in
5fd0: 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2f 2f 0a 2f   the token..//./
5fe0: 2f 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  / If there is a 
5ff0: 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c  "NOT INDEXED" cl
6000: 61 75 73 65 2c 20 74 68 65 6e 20 28 7a 3d 3d 30  ause, then (z==0
6010: 20 26 26 20 6e 3d 3d 31 29 2c 20 77 68 69 63 68   && n==1), which
6020: 20 69 73 20 0a 2f 2f 20 6e 6f 72 6d 61 6c 6c 79   is .// normally
6030: 20 69 6c 6c 65 67 61 6c 2e 20 54 68 65 20 73 71   illegal. The sq
6040: 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
6050: 78 65 64 42 79 28 29 20 66 75 6e 63 74 69 6f 6e  xedBy() function
6060: 20 0a 2f 2f 20 72 65 63 6f 67 6e 69 7a 65 73 20   .// recognizes 
6070: 61 6e 64 20 69 6e 74 65 72 70 72 65 74 73 20 74  and interprets t
6080: 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61 6c  his as a special
6090: 20 63 61 73 65 2e 0a 2f 2f 0a 25 74 79 70 65 20   case..//.%type 
60a0: 69 6e 64 65 78 65 64 5f 6f 70 74 20 7b 54 6f 6b  indexed_opt {Tok
60b0: 65 6e 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28  en}.indexed_opt(
60c0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
60d0: 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b           {A.z=0;
60e0: 20 41 2e 6e 3d 30 3b 7d 0a 69 6e 64 65 78 65 64   A.n=0;}.indexed
60f0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e 44 45  _opt(A) ::= INDE
6100: 58 45 44 20 42 59 20 6e 6d 28 58 29 2e 20 7b 41  XED BY nm(X). {A
6110: 20 3d 20 58 3b 7d 0a 69 6e 64 65 78 65 64 5f 6f   = X;}.indexed_o
6120: 70 74 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e  pt(A) ::= NOT IN
6130: 44 45 58 45 44 2e 20 20 20 20 20 20 7b 41 2e 7a  DEXED.      {A.z
6140: 3d 30 3b 20 41 2e 6e 3d 31 3b 7d 0a 0a 25 74 79  =0; A.n=1;}..%ty
6150: 70 65 20 75 73 69 6e 67 5f 6f 70 74 20 7b 49 64  pe using_opt {Id
6160: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
6170: 6f 72 20 75 73 69 6e 67 5f 6f 70 74 20 7b 73 71  or using_opt {sq
6180: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
6190: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
61a0: 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29  );}.using_opt(U)
61b0: 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20 69 64   ::= USING LP id
61c0: 6c 69 73 74 28 4c 29 20 52 50 2e 20 20 7b 55 20  list(L) RP.  {U 
61d0: 3d 20 4c 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28  = L;}.using_opt(
61e0: 55 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  U) ::= .        
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 7b 55 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65  {U = 0;}...%type
6210: 20 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b 45 78   orderby_opt {Ex
6220: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
6230: 63 74 6f 72 20 6f 72 64 65 72 62 79 5f 6f 70 74  ctor orderby_opt
6240: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   {sqlite3ExprLis
6250: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
6260: 64 62 2c 20 24 24 29 3b 7d 0a 0a 2f 2f 20 74 68  db, $$);}..// th
6270: 65 20 73 6f 72 74 6c 69 73 74 20 6e 6f 6e 2d 74  e sortlist non-t
6280: 65 72 6d 69 6e 61 6c 20 73 74 6f 72 65 73 20 61  erminal stores a
6290: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
62a0: 69 6f 6e 20 77 68 65 72 65 20 65 61 63 68 0a 2f  ion where each./
62b0: 2f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  / expression is 
62c0: 6f 70 74 69 6f 6e 61 6c 6c 79 20 66 6f 6c 6c 6f  optionally follo
62d0: 77 65 64 20 62 79 20 41 53 43 20 6f 72 20 44 45  wed by ASC or DE
62e0: 53 43 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  SC to indicate t
62f0: 68 65 0a 2f 2f 20 73 6f 72 74 20 6f 72 64 65 72  he.// sort order
6300: 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 6f 72 74 6c  ..//.%type sortl
6310: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
6320: 25 64 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74  %destructor sort
6330: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70  list {sqlite3Exp
6340: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
6350: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 6f  se->db, $$);}..o
6360: 72 64 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a  rderby_opt(A) ::
6370: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
6390: 3d 20 30 3b 7d 0a 6f 72 64 65 72 62 79 5f 6f 70  = 0;}.orderby_op
63a0: 74 28 41 29 20 3a 3a 3d 20 4f 52 44 45 52 20 42  t(A) ::= ORDER B
63b0: 59 20 73 6f 72 74 6c 69 73 74 28 58 29 2e 20 20  Y sortlist(X).  
63c0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 6f 72      {A = X;}.sor
63d0: 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f 72  tlist(A) ::= sor
63e0: 74 6c 69 73 74 28 41 29 20 43 4f 4d 4d 41 20 65  tlist(A) COMMA e
63f0: 78 70 72 28 59 29 20 73 6f 72 74 6f 72 64 65 72  xpr(Y) sortorder
6400: 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (Z). {.  A = sql
6410: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6420: 6e 64 28 70 50 61 72 73 65 2c 41 2c 59 29 3b 0a  nd(pParse,A,Y);.
6430: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
6440: 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 41 2c  tSetSortOrder(A,
6450: 5a 29 3b 0a 7d 0a 73 6f 72 74 6c 69 73 74 28 41  Z);.}.sortlist(A
6460: 29 20 3a 3a 3d 20 65 78 70 72 28 59 29 20 73 6f  ) ::= expr(Y) so
6470: 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20  rtorder(Z). {.  
6480: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
6490: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
64a0: 2c 30 2c 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77  ,0,Y); /*A-overw
64b0: 72 69 74 65 73 2d 59 2a 2f 0a 20 20 73 71 6c 69  rites-Y*/.  sqli
64c0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f  te3ExprListSetSo
64d0: 72 74 4f 72 64 65 72 28 41 2c 5a 29 3b 0a 7d 0a  rtOrder(A,Z);.}.
64e0: 0a 25 74 79 70 65 20 73 6f 72 74 6f 72 64 65 72  .%type sortorder
64f0: 20 7b 69 6e 74 7d 0a 0a 73 6f 72 74 6f 72 64 65   {int}..sortorde
6500: 72 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20  r(A) ::= ASC.   
6510: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c          {A = SQL
6520: 49 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72  ITE_SO_ASC;}.sor
6530: 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 44 45  torder(A) ::= DE
6540: 53 43 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20  SC.          {A 
6550: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  = SQLITE_SO_DESC
6560: 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20  ;}.sortorder(A) 
6570: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
6580: 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53     {A = SQLITE_S
6590: 4f 5f 55 4e 44 45 46 49 4e 45 44 3b 7d 0a 0a 25  O_UNDEFINED;}..%
65a0: 74 79 70 65 20 67 72 6f 75 70 62 79 5f 6f 70 74  type groupby_opt
65b0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
65c0: 73 74 72 75 63 74 6f 72 20 67 72 6f 75 70 62 79  structor groupby
65d0: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70  _opt {sqlite3Exp
65e0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
65f0: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 67 72  se->db, $$);}.gr
6600: 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d  oupby_opt(A) ::=
6610: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6620: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
6630: 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20  .groupby_opt(A) 
6640: 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 6e 65 78  ::= GROUP BY nex
6650: 70 72 6c 69 73 74 28 58 29 2e 20 7b 41 20 3d 20  prlist(X). {A = 
6660: 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76 69 6e  X;}..%type havin
6670: 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64  g_opt {Expr*}.%d
6680: 65 73 74 72 75 63 74 6f 72 20 68 61 76 69 6e 67  estructor having
6690: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70  _opt {sqlite3Exp
66a0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
66b0: 64 62 2c 20 24 24 29 3b 7d 0a 68 61 76 69 6e 67  db, $$);}.having
66c0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
66e0: 3d 20 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74  = 0;}.having_opt
66f0: 28 41 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65  (A) ::= HAVING e
6700: 78 70 72 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b  xpr(X).  {A = X;
6710: 7d 0a 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f  }..%type limit_o
6720: 70 74 20 7b 45 78 70 72 2a 7d 0a 0a 2f 2f 20 54  pt {Expr*}..// T
6730: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
6740: 72 20 6c 69 6d 69 74 5f 6f 70 74 20 77 69 6c 6c  r limit_opt will
6750: 20 6e 65 76 65 72 20 66 69 72 65 20 69 6e 20 74   never fire in t
6760: 68 65 20 63 75 72 72 65 6e 74 20 67 72 61 6d 6d  he current gramm
6770: 61 72 2e 0a 2f 2f 20 54 68 65 20 6c 69 6d 69 74  ar..// The limit
6780: 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  _opt non-termina
6790: 6c 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 61 74  l only occurs at
67a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 73 69   the end of a si
67b0: 6e 67 6c 65 20 70 72 6f 64 75 63 74 69 6f 6e 0a  ngle production.
67c0: 2f 2f 20 72 75 6c 65 20 66 6f 72 20 53 45 4c 45  // rule for SELE
67d0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  CT statements.  
67e0: 41 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 72  As soon as the r
67f0: 75 6c 65 20 74 68 61 74 20 63 72 65 61 74 65 20  ule that create 
6800: 74 68 65 20 0a 2f 2f 20 6c 69 6d 69 74 5f 6f 70  the .// limit_op
6810: 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 72  t non-terminal r
6820: 65 64 75 63 65 73 2c 20 74 68 65 20 53 45 4c 45  educes, the SELE
6830: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 75 6c  CT statement rul
6840: 65 20 77 69 6c 6c 20 61 6c 73 6f 0a 2f 2f 20 72  e will also.// r
6850: 65 64 75 63 65 2e 20 20 53 6f 20 74 68 65 72 65  educe.  So there
6860: 20 69 73 20 6e 65 76 65 72 20 61 20 6c 69 6d 69   is never a limi
6870: 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e  t_opt non-termin
6880: 61 6c 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  al on the stack 
6890: 0a 2f 2f 20 65 78 63 65 70 74 20 61 73 20 61 20  .// except as a 
68a0: 74 72 61 6e 73 69 65 6e 74 2e 20 20 53 6f 20 74  transient.  So t
68b0: 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
68c0: 79 74 68 69 6e 67 20 74 6f 20 64 65 73 74 72 6f  ything to destro
68d0: 79 2e 0a 2f 2f 0a 2f 2f 25 64 65 73 74 72 75 63  y..//.//%destruc
68e0: 74 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 73  tor limit_opt {s
68f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6900: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
6910: 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  ;}.limit_opt(A) 
6920: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 7b 41 20 3d  ::= .       {A =
6930: 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41   0;}.limit_opt(A
6940: 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72  ) ::= LIMIT expr
6950: 28 58 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (X)..           
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
6970: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
6980: 70 50 61 72 73 65 2c 54 4b 5f 4c 49 4d 49 54 2c  pParse,TK_LIMIT,
6990: 58 2c 30 29 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74  X,0);}.limit_opt
69a0: 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78  (A) ::= LIMIT ex
69b0: 70 72 28 58 29 20 4f 46 46 53 45 54 20 65 78 70  pr(X) OFFSET exp
69c0: 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20  r(Y). .         
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  {A = sqlite3PExp
69f0: 72 28 70 50 61 72 73 65 2c 54 4b 5f 4c 49 4d 49  r(pParse,TK_LIMI
6a00: 54 2c 58 2c 59 29 3b 7d 0a 6c 69 6d 69 74 5f 6f  T,X,Y);}.limit_o
6a10: 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20  pt(A) ::= LIMIT 
6a20: 65 78 70 72 28 58 29 20 43 4f 4d 4d 41 20 65 78  expr(X) COMMA ex
6a30: 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20  pr(Y). .        
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a50: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78   {A = sqlite3PEx
6a60: 70 72 28 70 50 61 72 73 65 2c 54 4b 5f 4c 49 4d  pr(pParse,TK_LIM
6a70: 49 54 2c 59 2c 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f  IT,Y,X);}../////
6a80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a90: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54  ////// The DELET
6aa0: 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  E statement ////
6ab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66  /////////.//.%if
6ad0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6ae0: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
6af0: 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69  LIMIT.cmd ::= wi
6b00: 74 68 28 43 29 20 44 45 4c 45 54 45 20 46 52 4f  th(C) DELETE FRO
6b10: 4d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e  M fullname(X) in
6b20: 64 65 78 65 64 5f 6f 70 74 28 49 29 20 77 68 65  dexed_opt(I) whe
6b30: 72 65 5f 6f 70 74 28 57 29 20 0a 20 20 20 20 20  re_opt(W) .     
6b40: 20 20 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 4f     orderby_opt(O
6b50: 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20  ) limit_opt(L). 
6b60: 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  {.  sqlite3WithP
6b70: 75 73 68 28 70 50 61 72 73 65 2c 20 43 2c 20 31  ush(pParse, C, 1
6b80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
6b90: 69 73 74 49 6e 64 65 78 65 64 42 79 28 70 50 61  istIndexedBy(pPa
6ba0: 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73  rse, X, &I);.  s
6bb0: 71 6c 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d  qlite3DeleteFrom
6bc0: 28 70 50 61 72 73 65 2c 58 2c 57 2c 4f 2c 4c 29  (pParse,X,W,O,L)
6bd0: 3b 0a 7d 0a 25 65 6e 64 69 66 0a 25 69 66 6e 64  ;.}.%endif.%ifnd
6be0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6bf0: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
6c00: 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74  IMIT.cmd ::= wit
6c10: 68 28 43 29 20 44 45 4c 45 54 45 20 46 52 4f 4d  h(C) DELETE FROM
6c20: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64   fullname(X) ind
6c30: 65 78 65 64 5f 6f 70 74 28 49 29 20 77 68 65 72  exed_opt(I) wher
6c40: 65 5f 6f 70 74 28 57 29 2e 20 7b 0a 20 20 73 71  e_opt(W). {.  sq
6c50: 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50  lite3WithPush(pP
6c60: 61 72 73 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73  arse, C, 1);.  s
6c70: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
6c80: 65 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 58  exedBy(pParse, X
6c90: 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69 74 65 33  , &I);.  sqlite3
6ca0: 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73  DeleteFrom(pPars
6cb0: 65 2c 58 2c 57 2c 30 2c 30 29 3b 0a 7d 0a 25 65  e,X,W,0,0);.}.%e
6cc0: 6e 64 69 66 0a 0a 25 74 79 70 65 20 77 68 65 72  ndif..%type wher
6cd0: 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64  e_opt {Expr*}.%d
6ce0: 65 73 74 72 75 63 74 6f 72 20 77 68 65 72 65 5f  estructor where_
6cf0: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
6d00: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6d10: 62 2c 20 24 24 29 3b 7d 0a 0a 77 68 65 72 65 5f  b, $$);}..where_
6d20: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 7b 41 20 3d 20 30 3b 7d 0a 77 68 65 72 65 5f 6f  {A = 0;}.where_o
6d50: 70 74 28 41 29 20 3a 3a 3d 20 57 48 45 52 45 20  pt(A) ::= WHERE 
6d60: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 7b  expr(X).       {
6d70: 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  A = X;}..///////
6d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6d90: 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20 63  /// The UPDATE c
6da0: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
6db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6dc0: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65  ///////.//.%ifde
6dd0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6de0: 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49  UPDATE_DELETE_LI
6df0: 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68  MIT.cmd ::= with
6e00: 28 43 29 20 55 50 44 41 54 45 20 6f 72 63 6f 6e  (C) UPDATE orcon
6e10: 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29  f(R) fullname(X)
6e20: 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 20   indexed_opt(I) 
6e30: 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 0a 20  SET setlist(Y). 
6e40: 20 20 20 20 20 20 20 77 68 65 72 65 5f 6f 70 74         where_opt
6e50: 28 57 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 28  (W) orderby_opt(
6e60: 4f 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e  O) limit_opt(L).
6e70: 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 74    {.  sqlite3Wit
6e80: 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 43 2c  hPush(pParse, C,
6e90: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72   1);.  sqlite3Sr
6ea0: 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 70  cListIndexedBy(p
6eb0: 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20  Parse, X, &I);. 
6ec0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6ed0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
6ee0: 73 65 2c 59 2c 22 73 65 74 20 6c 69 73 74 22 29  se,Y,"set list")
6ef0: 3b 20 0a 20 20 73 71 6c 69 74 65 33 55 70 64 61  ; .  sqlite3Upda
6f00: 74 65 28 70 50 61 72 73 65 2c 58 2c 59 2c 57 2c  te(pParse,X,Y,W,
6f10: 52 2c 4f 2c 4c 29 3b 0a 7d 0a 25 65 6e 64 69 66  R,O,L);.}.%endif
6f20: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
6f30: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
6f40: 4c 45 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a  LETE_LIMIT.cmd :
6f50: 3a 3d 20 77 69 74 68 28 43 29 20 55 50 44 41 54  := with(C) UPDAT
6f60: 45 20 6f 72 63 6f 6e 66 28 52 29 20 66 75 6c 6c  E orconf(R) full
6f70: 6e 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f  name(X) indexed_
6f80: 6f 70 74 28 49 29 20 53 45 54 20 73 65 74 6c 69  opt(I) SET setli
6f90: 73 74 28 59 29 0a 20 20 20 20 20 20 20 20 77 68  st(Y).        wh
6fa0: 65 72 65 5f 6f 70 74 28 57 29 2e 20 20 7b 0a 20  ere_opt(W).  {. 
6fb0: 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
6fc0: 28 70 50 61 72 73 65 2c 20 43 2c 20 31 29 3b 0a  (pParse, C, 1);.
6fd0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
6fe0: 49 6e 64 65 78 65 64 42 79 28 70 50 61 72 73 65  IndexedBy(pParse
6ff0: 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69  , X, &I);.  sqli
7000: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
7010: 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 59 2c  Length(pParse,Y,
7020: 22 73 65 74 20 6c 69 73 74 22 29 3b 20 0a 20 20  "set list"); .  
7030: 73 71 6c 69 74 65 33 55 70 64 61 74 65 28 70 50  sqlite3Update(pP
7040: 61 72 73 65 2c 58 2c 59 2c 57 2c 52 2c 30 2c 30  arse,X,Y,W,R,0,0
7050: 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25 74 79  );.}.%endif..%ty
7060: 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 70 72  pe setlist {Expr
7070: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
7080: 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 6c 69  or setlist {sqli
7090: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
70a0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
70b0: 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20  );}..setlist(A) 
70c0: 3a 3a 3d 20 73 65 74 6c 69 73 74 28 41 29 20 43  ::= setlist(A) C
70d0: 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65 78  OMMA nm(X) EQ ex
70e0: 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Y). {.  A = s
70f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7100: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 41 2c 20  pend(pParse, A, 
7110: 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  Y);.  sqlite3Exp
7120: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
7130: 72 73 65 2c 20 41 2c 20 26 58 2c 20 31 29 3b 0a  rse, A, &X, 1);.
7140: 7d 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d  }.setlist(A) ::=
7150: 20 73 65 74 6c 69 73 74 28 41 29 20 43 4f 4d 4d   setlist(A) COMM
7160: 41 20 4c 50 20 69 64 6c 69 73 74 28 58 29 20 52  A LP idlist(X) R
7170: 50 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a  P EQ expr(Y). {.
7180: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
7190: 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f  rListAppendVecto
71a0: 72 28 70 50 61 72 73 65 2c 20 41 2c 20 58 2c 20  r(pParse, A, X, 
71b0: 59 29 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41 29  Y);.}.setlist(A)
71c0: 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51 20 65 78   ::= nm(X) EQ ex
71d0: 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Y). {.  A = s
71e0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
71f0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
7200: 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  Y);.  sqlite3Exp
7210: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
7220: 72 73 65 2c 20 41 2c 20 26 58 2c 20 31 29 3b 0a  rse, A, &X, 1);.
7230: 7d 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d  }.setlist(A) ::=
7240: 20 4c 50 20 69 64 6c 69 73 74 28 58 29 20 52 50   LP idlist(X) RP
7250: 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a 20   EQ expr(Y). {. 
7260: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
7270: 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f 72  ListAppendVector
7280: 28 70 50 61 72 73 65 2c 20 30 2c 20 58 2c 20 59  (pParse, 0, X, Y
7290: 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );.}..//////////
72a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
72b0: 20 54 68 65 20 49 4e 53 45 52 54 20 63 6f 6d 6d   The INSERT comm
72c0: 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  and ////////////
72d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
72e0: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
72f0: 20 77 69 74 68 28 57 29 20 69 6e 73 65 72 74 5f   with(W) insert_
7300: 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75 6c 6c  cmd(R) INTO full
7310: 6e 61 6d 65 28 58 29 20 69 64 6c 69 73 74 5f 6f  name(X) idlist_o
7320: 70 74 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e  pt(F) select(S).
7330: 20 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68   {.  sqlite3With
7340: 50 75 73 68 28 70 50 61 72 73 65 2c 20 57 2c 20  Push(pParse, W, 
7350: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73  1);.  sqlite3Ins
7360: 65 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53  ert(pParse, X, S
7370: 2c 20 46 2c 20 52 29 3b 0a 7d 0a 63 6d 64 20 3a  , F, R);.}.cmd :
7380: 3a 3d 20 77 69 74 68 28 57 29 20 69 6e 73 65 72  := with(W) inser
7390: 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75  t_cmd(R) INTO fu
73a0: 6c 6c 6e 61 6d 65 28 58 29 20 69 64 6c 69 73 74  llname(X) idlist
73b0: 5f 6f 70 74 28 46 29 20 44 45 46 41 55 4c 54 20  _opt(F) DEFAULT 
73c0: 56 41 4c 55 45 53 2e 0a 7b 0a 20 20 73 71 6c 69  VALUES..{.  sqli
73d0: 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
73e0: 73 65 2c 20 57 2c 20 31 29 3b 0a 20 20 73 71 6c  se, W, 1);.  sql
73f0: 69 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73  ite3Insert(pPars
7400: 65 2c 20 58 2c 20 30 2c 20 46 2c 20 52 29 3b 0a  e, X, 0, F, R);.
7410: 7d 0a 0a 25 74 79 70 65 20 69 6e 73 65 72 74 5f  }..%type insert_
7420: 63 6d 64 20 7b 69 6e 74 7d 0a 69 6e 73 65 72 74  cmd {int}.insert
7430: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e 53 45  _cmd(A) ::= INSE
7440: 52 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20 20 20  RT orconf(R).   
7450: 7b 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72 74 5f  {A = R;}.insert_
7460: 63 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41  cmd(A) ::= REPLA
7470: 43 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b  CE.            {
7480: 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d  A = OE_Replace;}
7490: 0a 0a 25 74 79 70 65 20 69 64 6c 69 73 74 5f 6f  ..%type idlist_o
74a0: 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65  pt {IdList*}.%de
74b0: 73 74 72 75 63 74 6f 72 20 69 64 6c 69 73 74 5f  structor idlist_
74c0: 6f 70 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69  opt {sqlite3IdLi
74d0: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
74e0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65  >db, $$);}.%type
74f0: 20 69 64 6c 69 73 74 20 7b 49 64 4c 69 73 74 2a   idlist {IdList*
7500: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69 64  }.%destructor id
7510: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 49 64 4c  list {sqlite3IdL
7520: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
7530: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 69 64 6c  ->db, $$);}..idl
7540: 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  ist_opt(A) ::= .
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7560: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
7570: 69 64 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a  idlist_opt(A) ::
7580: 3d 20 4c 50 20 69 64 6c 69 73 74 28 58 29 20 52  = LP idlist(X) R
7590: 50 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69  P.    {A = X;}.i
75a0: 64 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 6c  dlist(A) ::= idl
75b0: 69 73 74 28 41 29 20 43 4f 4d 4d 41 20 6e 6d 28  ist(A) COMMA nm(
75c0: 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c  Y)..    {A = sql
75d0: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
75e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 41 2c 26 59  (pParse->db,A,&Y
75f0: 29 3b 7d 0a 69 64 6c 69 73 74 28 41 29 20 3a 3a  );}.idlist(A) ::
7600: 3d 20 6e 6d 28 59 29 2e 0a 20 20 20 20 7b 41 20  = nm(Y)..    {A 
7610: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41  = sqlite3IdListA
7620: 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  ppend(pParse->db
7630: 2c 30 2c 26 59 29 3b 20 2f 2a 41 2d 6f 76 65 72  ,0,&Y); /*A-over
7640: 77 72 69 74 65 73 2d 59 2a 2f 7d 0a 0a 2f 2f 2f  writes-Y*/}..///
7650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7660: 2f 2f 2f 2f 2f 2f 2f 2f 20 45 78 70 72 65 73 73  //////// Express
7670: 69 6f 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 2f  ion Processing /
7680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
76a0: 0a 25 74 79 70 65 20 65 78 70 72 20 7b 45 78 70  .%type expr {Exp
76b0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
76c0: 65 78 70 72 20 7b 73 71 6c 69 74 65 33 45 78 70  expr {sqlite3Exp
76d0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
76e0: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
76f0: 74 65 72 6d 20 7b 45 78 70 72 2a 7d 0a 25 64 65  term {Expr*}.%de
7700: 73 74 72 75 63 74 6f 72 20 74 65 72 6d 20 7b 73  structor term {s
7710: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7720: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
7730: 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 0a  ;}..%include {..
7740: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
7750: 20 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74   new Expr object
7760: 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
7770: 64 65 6e 74 69 66 69 65 72 2e 20 20 55 73 65 20  dentifier.  Use 
7780: 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 45 78 70  the.  ** new Exp
7790: 72 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 4f  r to populate pO
77a0: 75 74 2e 20 20 53 65 74 20 74 68 65 20 73 70 61  ut.  Set the spa
77b0: 6e 20 6f 66 20 70 4f 75 74 20 74 6f 20 62 65 20  n of pOut to be 
77c0: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
77d0: 20 2a 2a 20 74 68 61 74 20 63 72 65 61 74 65 64   ** that created
77e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
77f0: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 45  .  */.  static E
7800: 78 70 72 20 2a 74 6f 6b 65 6e 45 78 70 72 28 50  xpr *tokenExpr(P
7810: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
7820: 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 74 29 7b 0a  t op, Token t){.
7830: 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71      Expr *p = sq
7840: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
7850: 4e 4e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  NN(pParse->db, s
7860: 69 7a 65 6f 66 28 45 78 70 72 29 2b 74 2e 6e 2b  izeof(Expr)+t.n+
7870: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  1);.    if( p ){
7880: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c  .      memset(p,
7890: 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 72 29   0, sizeof(Expr)
78a0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6f 70 20 3d  );.      p->op =
78b0: 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20 70   (u8)op;.      p
78c0: 2d 3e 66 6c 61 67 73 20 3d 20 45 50 5f 4c 65 61  ->flags = EP_Lea
78d0: 66 3b 0a 20 20 20 20 20 20 70 2d 3e 69 41 67 67  f;.      p->iAgg
78e0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e   = -1;.      p->
78f0: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
7900: 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 20 20 6d  *)&p[1];.      m
7910: 65 6d 63 70 79 28 70 2d 3e 75 2e 7a 54 6f 6b 65  emcpy(p->u.zToke
7920: 6e 2c 20 74 2e 7a 2c 20 74 2e 6e 29 3b 0a 20 20  n, t.z, t.n);.  
7930: 20 20 20 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b      p->u.zToken[
7940: 74 2e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  t.n] = 0;.      
7950: 69 66 28 20 73 71 6c 69 74 65 33 49 73 71 75 6f  if( sqlite3Isquo
7960: 74 65 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30  te(p->u.zToken[0
7970: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
7980: 28 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  ( p->u.zToken[0]
7990: 3d 3d 27 22 27 20 29 20 70 2d 3e 66 6c 61 67 73  =='"' ) p->flags
79a0: 20 7c 3d 20 45 50 5f 44 62 6c 51 75 6f 74 65 64   |= EP_DblQuoted
79b0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
79c0: 33 44 65 71 75 6f 74 65 28 70 2d 3e 75 2e 7a 54  3Dequote(p->u.zT
79d0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 23  oken);.      }.#
79e0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
79f0: 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 20  PR_DEPTH>0.     
7a00: 20 70 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31 3b   p->nHeight = 1;
7a10: 0a 23 65 6e 64 69 66 20 20 0a 20 20 20 20 7d 0a  .#endif  .    }.
7a20: 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20      return p;.  
7a30: 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d  }.}..expr(A) ::=
7a40: 20 74 65 72 6d 28 41 29 2e 0a 65 78 70 72 28 41   term(A)..expr(A
7a50: 29 20 3a 3a 3d 20 4c 50 20 65 78 70 72 28 58 29  ) ::= LP expr(X)
7a60: 20 52 50 2e 20 7b 41 20 3d 20 58 3b 7d 0a 65 78   RP. {A = X;}.ex
7a70: 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 2e  pr(A) ::= id(X).
7a80: 20 20 20 20 20 20 20 20 20 20 7b 41 3d 74 6f 6b            {A=tok
7a90: 65 6e 45 78 70 72 28 70 50 61 72 73 65 2c 54 4b  enExpr(pParse,TK
7aa0: 5f 49 44 2c 58 29 3b 20 2f 2a 41 2d 6f 76 65 72  _ID,X); /*A-over
7ab0: 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 65 78 70 72  writes-X*/}.expr
7ac0: 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28  (A) ::= JOIN_KW(
7ad0: 58 29 2e 20 20 20 20 20 7b 41 3d 74 6f 6b 65 6e  X).     {A=token
7ae0: 45 78 70 72 28 70 50 61 72 73 65 2c 54 4b 5f 49  Expr(pParse,TK_I
7af0: 44 2c 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  D,X); /*A-overwr
7b00: 69 74 65 73 2d 58 2a 2f 7d 0a 65 78 70 72 28 41  ites-X*/}.expr(A
7b10: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f 54 20  ) ::= nm(X) DOT 
7b20: 6e 6d 28 59 29 2e 20 7b 0a 20 20 45 78 70 72 20  nm(Y). {.  Expr 
7b30: 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 33  *temp1 = sqlite3
7b40: 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65  ExprAlloc(pParse
7b50: 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c 20 26 58 2c  ->db, TK_ID, &X,
7b60: 20 31 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d   1);.  Expr *tem
7b70: 70 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  p2 = sqlite3Expr
7b80: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  Alloc(pParse->db
7b90: 2c 20 54 4b 5f 49 44 2c 20 26 59 2c 20 31 29 3b  , TK_ID, &Y, 1);
7ba0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45  .  A = sqlite3PE
7bb0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44  xpr(pParse, TK_D
7bc0: 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d 70 32  OT, temp1, temp2
7bd0: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
7be0: 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29   nm(X) DOT nm(Y)
7bf0: 20 44 4f 54 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20   DOT nm(Z). {.  
7c00: 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71  Expr *temp1 = sq
7c10: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
7c20: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 44  Parse->db, TK_ID
7c30: 2c 20 26 58 2c 20 31 29 3b 0a 20 20 45 78 70 72  , &X, 1);.  Expr
7c40: 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69 74 65   *temp2 = sqlite
7c50: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
7c60: 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c 20 26 59  e->db, TK_ID, &Y
7c70: 2c 20 31 29 3b 0a 20 20 45 78 70 72 20 2a 74 65  , 1);.  Expr *te
7c80: 6d 70 33 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mp3 = sqlite3Exp
7c90: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  rAlloc(pParse->d
7ca0: 62 2c 20 54 4b 5f 49 44 2c 20 26 5a 2c 20 31 29  b, TK_ID, &Z, 1)
7cb0: 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 34 20  ;.  Expr *temp4 
7cc0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
7cd0: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 74  Parse, TK_DOT, t
7ce0: 65 6d 70 32 2c 20 74 65 6d 70 33 29 3b 0a 20 20  emp2, temp3);.  
7cf0: 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  A = sqlite3PExpr
7d00: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
7d10: 20 74 65 6d 70 31 2c 20 74 65 6d 70 34 29 3b 0a   temp1, temp4);.
7d20: 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 4e 55  }.term(A) ::= NU
7d30: 4c 4c 7c 46 4c 4f 41 54 7c 42 4c 4f 42 28 58 29  LL|FLOAT|BLOB(X)
7d40: 2e 20 7b 41 3d 74 6f 6b 65 6e 45 78 70 72 28 70  . {A=tokenExpr(p
7d50: 50 61 72 73 65 2c 40 58 2c 58 29 3b 20 2f 2a 41  Parse,@X,X); /*A
7d60: 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 7d  -overwrites-X*/}
7d70: 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 53 54 52  .term(A) ::= STR
7d80: 49 4e 47 28 58 29 2e 20 20 20 20 20 20 20 20 20  ING(X).         
7d90: 20 7b 41 3d 74 6f 6b 65 6e 45 78 70 72 28 70 50   {A=tokenExpr(pP
7da0: 61 72 73 65 2c 40 58 2c 58 29 3b 20 2f 2a 41 2d  arse,@X,X); /*A-
7db0: 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 7d 0a  overwrites-X*/}.
7dc0: 74 65 72 6d 28 41 29 20 3a 3a 3d 20 49 4e 54 45  term(A) ::= INTE
7dd0: 47 45 52 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20  GER(X). {.  A = 
7de0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
7df0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
7e00: 49 4e 54 45 47 45 52 2c 20 26 58 2c 20 31 29 3b  INTEGER, &X, 1);
7e10: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 56  .}.expr(A) ::= V
7e20: 41 52 49 41 42 4c 45 28 58 29 2e 20 20 20 20 20  ARIABLE(X).     
7e30: 7b 0a 20 20 69 66 28 20 21 28 58 2e 7a 5b 30 5d  {.  if( !(X.z[0]
7e40: 3d 3d 27 23 27 20 26 26 20 73 71 6c 69 74 65 33  =='#' && sqlite3
7e50: 49 73 64 69 67 69 74 28 58 2e 7a 5b 31 5d 29 29  Isdigit(X.z[1]))
7e60: 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 20 3d 20   ){.    u32 n = 
7e70: 58 2e 6e 3b 0a 20 20 20 20 41 20 3d 20 74 6f 6b  X.n;.    A = tok
7e80: 65 6e 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  enExpr(pParse, T
7e90: 4b 5f 56 41 52 49 41 42 4c 45 2c 20 58 29 3b 0a  K_VARIABLE, X);.
7ea0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
7eb0: 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 70  ssignVarNumber(p
7ec0: 50 61 72 73 65 2c 20 41 2c 20 6e 29 3b 0a 20 20  Parse, A, n);.  
7ed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 68  }else{.    /* Wh
7ee0: 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74 65  en doing a neste
7ef0: 64 20 70 61 72 73 65 2c 20 6f 6e 65 20 63 61 6e  d parse, one can
7f00: 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20 69   include terms i
7f10: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
7f20: 20 20 20 20 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b      ** that look
7f30: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23 31   like this:   #1
7f40: 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74   #2 ...  These t
7f50: 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20 72 65  erms refer to re
7f60: 67 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 69  gisters.    ** i
7f70: 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  n the virtual ma
7f80: 63 68 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68  chine.  #N is th
7f90: 65 20 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e  e N-th register.
7fa0: 20 2a 2f 0a 20 20 20 20 54 6f 6b 65 6e 20 74 20   */.    Token t 
7fb0: 3d 20 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69  = X; /*A-overwri
7fc0: 74 65 73 2d 58 2a 2f 0a 20 20 20 20 61 73 73 65  tes-X*/.    asse
7fd0: 72 74 28 20 74 2e 6e 3e 3d 32 20 29 3b 0a 20 20  rt( t.n>=2 );.  
7fe0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
7ff0: 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  sted==0 ){.     
8000: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8010: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
8020: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
8030: 72 6f 72 22 2c 20 26 74 29 3b 0a 20 20 20 20 20  ror", &t);.     
8040: 20 41 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   A = 0;.    }els
8050: 65 7b 0a 20 20 20 20 20 20 41 20 3d 20 73 71 6c  e{.      A = sql
8060: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
8070: 2c 20 54 4b 5f 52 45 47 49 53 54 45 52 2c 20 30  , TK_REGISTER, 0
8080: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
8090: 41 20 29 20 73 71 6c 69 74 65 33 47 65 74 49 6e  A ) sqlite3GetIn
80a0: 74 33 32 28 26 74 2e 7a 5b 31 5d 2c 20 26 41 2d  t32(&t.z[1], &A-
80b0: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a  >iTable);.    }.
80c0: 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a    }.}.expr(A) ::
80d0: 3d 20 65 78 70 72 28 41 29 20 43 4f 4c 4c 41 54  = expr(A) COLLAT
80e0: 45 20 69 64 73 28 43 29 2e 20 7b 0a 20 20 41 20  E ids(C). {.  A 
80f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64  = sqlite3ExprAdd
8100: 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61  CollateToken(pPa
8110: 72 73 65 2c 20 41 2c 20 26 43 2c 20 31 29 3b 0a  rse, A, &C, 1);.
8120: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
8130: 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28  _OMIT_CAST.expr(
8140: 41 29 20 3a 3a 3d 20 43 41 53 54 20 4c 50 20 65  A) ::= CAST LP e
8150: 78 70 72 28 45 29 20 41 53 20 74 79 70 65 74 6f  xpr(E) AS typeto
8160: 6b 65 6e 28 54 29 20 52 50 2e 20 7b 0a 20 20 41  ken(T) RP. {.  A
8170: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
8180: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
8190: 54 4b 5f 43 41 53 54 2c 20 26 54 2c 20 31 29 3b  TK_CAST, &T, 1);
81a0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74  .  sqlite3ExprAt
81b0: 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50 61  tachSubtrees(pPa
81c0: 72 73 65 2d 3e 64 62 2c 20 41 2c 20 45 2c 20 30  rse->db, A, E, 0
81d0: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  );.}.%endif  SQL
81e0: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78  ITE_OMIT_CAST.ex
81f0: 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 20  pr(A) ::= id(X) 
8200: 4c 50 20 64 69 73 74 69 6e 63 74 28 44 29 20 65  LP distinct(D) e
8210: 78 70 72 6c 69 73 74 28 59 29 20 52 50 2e 20 7b  xprlist(Y) RP. {
8220: 0a 20 20 69 66 28 20 59 20 26 26 20 59 2d 3e 6e  .  if( Y && Y->n
8230: 45 78 70 72 3e 70 50 61 72 73 65 2d 3e 64 62 2d  Expr>pParse->db-
8240: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8250: 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
8260: 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  G] ){.    sqlite
8270: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8280: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75  , "too many argu
8290: 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f  ments on functio
82a0: 6e 20 25 54 22 2c 20 26 58 29 3b 0a 20 20 7d 0a  n %T", &X);.  }.
82b0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
82c0: 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  rFunction(pParse
82d0: 2c 20 59 2c 20 26 58 29 3b 0a 20 20 69 66 28 20  , Y, &X);.  if( 
82e0: 44 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 26  D==SF_Distinct &
82f0: 26 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e 66 6c  & A ){.    A->fl
8300: 61 67 73 20 7c 3d 20 45 50 5f 44 69 73 74 69 6e  ags |= EP_Distin
8310: 63 74 3b 0a 20 20 7d 0a 7d 0a 65 78 70 72 28 41  ct;.  }.}.expr(A
8320: 29 20 3a 3a 3d 20 69 64 28 58 29 20 4c 50 20 53  ) ::= id(X) LP S
8330: 54 41 52 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20  TAR RP. {.  A = 
8340: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
8350: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 26  ion(pParse, 0, &
8360: 58 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a  X);.}.term(A) ::
8370: 3d 20 43 54 49 4d 45 5f 4b 57 28 4f 50 29 2e 20  = CTIME_KW(OP). 
8380: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
8390: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  xprFunction(pPar
83a0: 73 65 2c 20 30 2c 20 26 4f 50 29 3b 0a 7d 0a 0a  se, 0, &OP);.}..
83b0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 20 6e  expr(A) ::= LP n
83c0: 65 78 70 72 6c 69 73 74 28 58 29 20 43 4f 4d 4d  exprlist(X) COMM
83d0: 41 20 65 78 70 72 28 59 29 20 52 50 2e 20 7b 0a  A expr(Y) RP. {.
83e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
83f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8400: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
8410: 2c 20 58 2c 20 59 29 3b 0a 20 20 41 20 3d 20 73  , X, Y);.  A = s
8420: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
8430: 73 65 2c 20 54 4b 5f 56 45 43 54 4f 52 2c 20 30  se, TK_VECTOR, 0
8440: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 7b  , 0);.  if( A ){
8450: 0a 20 20 20 20 41 2d 3e 78 2e 70 4c 69 73 74 20  .    A->x.pList 
8460: 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 65 6c 73 65  = pList;.  }else
8470: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
8480: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
8490: 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
84a0: 20 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a    }.}..expr(A) :
84b0: 3a 3d 20 65 78 70 72 28 41 29 20 41 4e 44 28 4f  := expr(A) AND(O
84c0: 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b  P) expr(Y).    {
84d0: 41 3d 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  A=sqlite3PExpr(p
84e0: 50 61 72 73 65 2c 40 4f 50 2c 41 2c 59 29 3b 7d  Parse,@OP,A,Y);}
84f0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
8500: 72 28 41 29 20 4f 52 28 4f 50 29 20 65 78 70 72  r(A) OR(OP) expr
8510: 28 59 29 2e 20 20 20 20 20 7b 41 3d 73 71 6c 69  (Y).     {A=sqli
8520: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
8530: 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72 28  @OP,A,Y);}.expr(
8540: 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 4c  A) ::= expr(A) L
8550: 54 7c 47 54 7c 47 45 7c 4c 45 28 4f 50 29 20 65  T|GT|GE|LE(OP) e
8560: 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20  xpr(Y)..        
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8590: 7b 41 3d 73 71 6c 69 74 65 33 50 45 78 70 72 28  {A=sqlite3PExpr(
85a0: 70 50 61 72 73 65 2c 40 4f 50 2c 41 2c 59 29 3b  pParse,@OP,A,Y);
85b0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
85c0: 70 72 28 41 29 20 45 51 7c 4e 45 28 4f 50 29 20  pr(A) EQ|NE(OP) 
85d0: 65 78 70 72 28 59 29 2e 20 20 7b 41 3d 73 71 6c  expr(Y).  {A=sql
85e0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
85f0: 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72  ,@OP,A,Y);}.expr
8600: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
8610: 42 49 54 41 4e 44 7c 42 49 54 4f 52 7c 4c 53 48  BITAND|BITOR|LSH
8620: 49 46 54 7c 52 53 48 49 46 54 28 4f 50 29 20 65  IFT|RSHIFT(OP) e
8630: 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20  xpr(Y)..        
8640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8660: 7b 41 3d 73 71 6c 69 74 65 33 50 45 78 70 72 28  {A=sqlite3PExpr(
8670: 70 50 61 72 73 65 2c 40 4f 50 2c 41 2c 59 29 3b  pParse,@OP,A,Y);
8680: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
8690: 70 72 28 41 29 20 50 4c 55 53 7c 4d 49 4e 55 53  pr(A) PLUS|MINUS
86a0: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20 20  (OP) expr(Y)..  
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 20 20 20 20 20 20 7b 41 3d 73 71 6c 69 74 65 33        {A=sqlite3
86e0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50  PExpr(pParse,@OP
86f0: 2c 41 2c 59 29 3b 7d 0a 65 78 70 72 28 41 29 20  ,A,Y);}.expr(A) 
8700: 3a 3a 3d 20 65 78 70 72 28 41 29 20 53 54 41 52  ::= expr(A) STAR
8710: 7c 53 4c 41 53 48 7c 52 45 4d 28 4f 50 29 20 65  |SLASH|REM(OP) e
8720: 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20  xpr(Y)..        
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8750: 7b 41 3d 73 71 6c 69 74 65 33 50 45 78 70 72 28  {A=sqlite3PExpr(
8760: 70 50 61 72 73 65 2c 40 4f 50 2c 41 2c 59 29 3b  pParse,@OP,A,Y);
8770: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
8780: 70 72 28 41 29 20 43 4f 4e 43 41 54 28 4f 50 29  pr(A) CONCAT(OP)
8790: 20 65 78 70 72 28 59 29 2e 20 7b 41 3d 73 71 6c   expr(Y). {A=sql
87a0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
87b0: 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 25 74 79 70  ,@OP,A,Y);}.%typ
87c0: 65 20 6c 69 6b 65 6f 70 20 7b 54 6f 6b 65 6e 7d  e likeop {Token}
87d0: 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4c  .likeop(A) ::= L
87e0: 49 4b 45 5f 4b 57 7c 4d 41 54 43 48 28 41 29 2e  IKE_KW|MATCH(A).
87f0: 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4e  .likeop(A) ::= N
8800: 4f 54 20 4c 49 4b 45 5f 4b 57 7c 4d 41 54 43 48  OT LIKE_KW|MATCH
8810: 28 58 29 2e 20 7b 41 3d 58 3b 20 41 2e 6e 7c 3d  (X). {A=X; A.n|=
8820: 30 78 38 30 30 30 30 30 30 30 3b 20 2f 2a 41 2d  0x80000000; /*A-
8830: 6f 76 65 72 77 72 69 74 65 2d 58 2a 2f 7d 0a 65  overwrite-X*/}.e
8840: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
8850: 41 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65 78  A) likeop(OP) ex
8860: 70 72 28 59 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57  pr(Y).  [LIKE_KW
8870: 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  ]  {.  ExprList 
8880: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 62 4e  *pList;.  int bN
8890: 6f 74 20 3d 20 4f 50 2e 6e 20 26 20 30 78 38 30  ot = OP.n & 0x80
88a0: 30 30 30 30 30 30 3b 0a 20 20 4f 50 2e 6e 20 26  000000;.  OP.n &
88b0: 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20  = 0x7fffffff;.  
88c0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
88d0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
88e0: 61 72 73 65 2c 30 2c 20 59 29 3b 0a 20 20 70 4c  arse,0, Y);.  pL
88f0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
8900: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
8910: 73 65 2c 70 4c 69 73 74 2c 20 41 29 3b 0a 20 20  se,pList, A);.  
8920: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  A = sqlite3ExprF
8930: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  unction(pParse, 
8940: 70 4c 69 73 74 2c 20 26 4f 50 29 3b 0a 20 20 69  pList, &OP);.  i
8950: 66 28 20 62 4e 6f 74 20 29 20 41 20 3d 20 73 71  f( bNot ) A = sq
8960: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
8970: 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 29  e, TK_NOT, A, 0)
8980: 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 66  ;.  if( A ) A->f
8990: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 66 69 78  lags |= EP_Infix
89a0: 46 75 6e 63 3b 0a 7d 0a 65 78 70 72 28 41 29 20  Func;.}.expr(A) 
89b0: 3a 3a 3d 20 65 78 70 72 28 41 29 20 6c 69 6b 65  ::= expr(A) like
89c0: 6f 70 28 4f 50 29 20 65 78 70 72 28 59 29 20 45  op(OP) expr(Y) E
89d0: 53 43 41 50 45 20 65 78 70 72 28 45 29 2e 20 20  SCAPE expr(E).  
89e0: 5b 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20 20 45  [LIKE_KW]  {.  E
89f0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
8a00: 20 20 69 6e 74 20 62 4e 6f 74 20 3d 20 4f 50 2e    int bNot = OP.
8a10: 6e 20 26 20 30 78 38 30 30 30 30 30 30 30 3b 0a  n & 0x80000000;.
8a20: 20 20 4f 50 2e 6e 20 26 3d 20 30 78 37 66 66 66    OP.n &= 0x7fff
8a30: 66 66 66 66 3b 0a 20 20 70 4c 69 73 74 20 3d 20  ffff;.  pList = 
8a40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
8a50: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 20  ppend(pParse,0, 
8a60: 59 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  Y);.  pList = sq
8a70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
8a80: 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74  end(pParse,pList
8a90: 2c 20 41 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  , A);.  pList = 
8aa0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
8ab0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69  ppend(pParse,pLi
8ac0: 73 74 2c 20 45 29 3b 0a 20 20 41 20 3d 20 73 71  st, E);.  A = sq
8ad0: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
8ae0: 6e 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  n(pParse, pList,
8af0: 20 26 4f 50 29 3b 0a 20 20 69 66 28 20 62 4e 6f   &OP);.  if( bNo
8b00: 74 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33 50  t ) A = sqlite3P
8b10: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
8b20: 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20 69 66  NOT, A, 0);.  if
8b30: 28 20 41 20 29 20 41 2d 3e 66 6c 61 67 73 20 7c  ( A ) A->flags |
8b40: 3d 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 3b 0a  = EP_InfixFunc;.
8b50: 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  }..expr(A) ::= e
8b60: 78 70 72 28 41 29 20 49 53 4e 55 4c 4c 7c 4e 4f  xpr(A) ISNULL|NO
8b70: 54 4e 55 4c 4c 28 45 29 2e 20 20 20 7b 41 20 3d  TNULL(E).   {A =
8b80: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
8b90: 61 72 73 65 2c 40 45 2c 41 2c 30 29 3b 7d 0a 65  arse,@E,A,0);}.e
8ba0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
8bb0: 41 29 20 4e 4f 54 20 4e 55 4c 4c 2e 20 20 20 20  A) NOT NULL.    
8bc0: 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  {A = sqlite3PExp
8bd0: 72 28 70 50 61 72 73 65 2c 54 4b 5f 4e 4f 54 4e  r(pParse,TK_NOTN
8be0: 55 4c 4c 2c 41 2c 30 29 3b 7d 0a 0a 25 69 6e 63  ULL,A,0);}..%inc
8bf0: 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 41 20 72 6f  lude {.  /* A ro
8c00: 75 74 69 6e 65 20 74 6f 20 63 6f 6e 76 65 72 74  utine to convert
8c10: 20 61 20 62 69 6e 61 72 79 20 54 4b 5f 49 53 20   a binary TK_IS 
8c20: 6f 72 20 54 4b 5f 49 53 4e 4f 54 20 65 78 70 72  or TK_ISNOT expr
8c30: 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 0a 20 20  ession into a.  
8c40: 2a 2a 20 75 6e 61 72 79 20 54 4b 5f 49 53 4e 55  ** unary TK_ISNU
8c50: 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  LL or TK_NOTNULL
8c60: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a   expression. */.
8c70: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 62 69    static void bi
8c80: 6e 61 72 79 54 6f 55 6e 61 72 79 49 66 4e 75 6c  naryToUnaryIfNul
8c90: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
8ca0: 20 45 78 70 72 20 2a 70 59 2c 20 45 78 70 72 20   Expr *pY, Expr 
8cb0: 2a 70 41 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  *pA, int op){.  
8cc0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8cd0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
8ce0: 69 66 28 20 70 41 20 26 26 20 70 59 20 26 26 20  if( pA && pY && 
8cf0: 70 59 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20  pY->op==TK_NULL 
8d00: 29 7b 0a 20 20 20 20 20 20 70 41 2d 3e 6f 70 20  ){.      pA->op 
8d10: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20  = (u8)op;.      
8d20: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8d30: 65 28 64 62 2c 20 70 41 2d 3e 70 52 69 67 68 74  e(db, pA->pRight
8d40: 29 3b 0a 20 20 20 20 20 20 70 41 2d 3e 70 52 69  );.      pA->pRi
8d50: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ght = 0;.    }. 
8d60: 20 7d 0a 7d 0a 0a 2f 2f 20 20 20 20 65 78 70 72   }.}..//    expr
8d70: 31 20 49 53 20 65 78 70 72 32 0a 2f 2f 20 20 20  1 IS expr2.//   
8d80: 20 65 78 70 72 31 20 49 53 20 4e 4f 54 20 65 78   expr1 IS NOT ex
8d90: 70 72 32 0a 2f 2f 0a 2f 2f 20 49 66 20 65 78 70  pr2.//.// If exp
8da0: 72 32 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  r2 is NULL then 
8db0: 63 6f 64 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c  code as TK_ISNUL
8dc0: 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2e  L or TK_NOTNULL.
8dd0: 20 20 49 66 20 65 78 70 72 32 0a 2f 2f 20 69 73    If expr2.// is
8de0: 20 61 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   any other expre
8df0: 73 73 69 6f 6e 2c 20 63 6f 64 65 20 61 73 20 54  ssion, code as T
8e00: 4b 5f 49 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54  K_IS or TK_ISNOT
8e10: 2e 0a 2f 2f 20 0a 65 78 70 72 28 41 29 20 3a 3a  ..// .expr(A) ::
8e20: 3d 20 65 78 70 72 28 41 29 20 49 53 20 65 78 70  = expr(A) IS exp
8e30: 72 28 59 29 2e 20 20 20 20 20 7b 0a 20 20 41 20  r(Y).     {.  A 
8e40: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
8e50: 50 61 72 73 65 2c 54 4b 5f 49 53 2c 41 2c 59 29  Parse,TK_IS,A,Y)
8e60: 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55 6e 61 72  ;.  binaryToUnar
8e70: 79 49 66 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  yIfNull(pParse, 
8e80: 59 2c 20 41 2c 20 54 4b 5f 49 53 4e 55 4c 4c 29  Y, A, TK_ISNULL)
8e90: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
8ea0: 65 78 70 72 28 41 29 20 49 53 20 4e 4f 54 20 65  expr(A) IS NOT e
8eb0: 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20  xpr(Y). {.  A = 
8ec0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
8ed0: 72 73 65 2c 54 4b 5f 49 53 4e 4f 54 2c 41 2c 59  rse,TK_ISNOT,A,Y
8ee0: 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55 6e 61  );.  binaryToUna
8ef0: 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73 65 2c  ryIfNull(pParse,
8f00: 20 59 2c 20 41 2c 20 54 4b 5f 4e 4f 54 4e 55 4c   Y, A, TK_NOTNUL
8f10: 4c 29 3b 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a  L);.}..expr(A) :
8f20: 3a 3d 20 4e 4f 54 28 42 29 20 65 78 70 72 28 58  := NOT(B) expr(X
8f30: 29 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ).  .           
8f40: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50     {A = sqlite3P
8f50: 45 78 70 72 28 70 50 61 72 73 65 2c 20 40 42 2c  Expr(pParse, @B,
8f60: 20 58 2c 20 30 29 3b 2f 2a 41 2d 6f 76 65 72 77   X, 0);/*A-overw
8f70: 72 69 74 65 73 2d 42 2a 2f 7d 0a 65 78 70 72 28  rites-B*/}.expr(
8f80: 41 29 20 3a 3a 3d 20 42 49 54 4e 4f 54 28 42 29  A) ::= BITNOT(B)
8f90: 20 65 78 70 72 28 58 29 2e 0a 20 20 20 20 20 20   expr(X)..      
8fa0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
8fb0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
8fc0: 2c 20 40 42 2c 20 58 2c 20 30 29 3b 2f 2a 41 2d  , @B, X, 0);/*A-
8fd0: 6f 76 65 72 77 72 69 74 65 73 2d 42 2a 2f 7d 0a  overwrites-B*/}.
8fe0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55  expr(A) ::= MINU
8ff0: 53 20 65 78 70 72 28 58 29 2e 20 5b 42 49 54 4e  S expr(X). [BITN
9000: 4f 54 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  OT].            
9010: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45    {A = sqlite3PE
9020: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 55  xpr(pParse, TK_U
9030: 4d 49 4e 55 53 2c 20 58 2c 20 30 29 3b 7d 0a 65  MINUS, X, 0);}.e
9040: 78 70 72 28 41 29 20 3a 3a 3d 20 50 4c 55 53 20  xpr(A) ::= PLUS 
9050: 65 78 70 72 28 58 29 2e 20 5b 42 49 54 4e 4f 54  expr(X). [BITNOT
9060: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
9070: 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  {A = sqlite3PExp
9080: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 50 4c  r(pParse, TK_UPL
9090: 55 53 2c 20 58 2c 20 30 29 3b 7d 0a 0a 25 74 79  US, X, 0);}..%ty
90a0: 70 65 20 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69  pe between_op {i
90b0: 6e 74 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41  nt}.between_op(A
90c0: 29 20 3a 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20  ) ::= BETWEEN.  
90d0: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77     {A = 0;}.betw
90e0: 65 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f  een_op(A) ::= NO
90f0: 54 20 42 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20  T BETWEEN. {A = 
9100: 31 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  1;}.expr(A) ::= 
9110: 65 78 70 72 28 41 29 20 62 65 74 77 65 65 6e 5f  expr(A) between_
9120: 6f 70 28 4e 29 20 65 78 70 72 28 58 29 20 41 4e  op(N) expr(X) AN
9130: 44 20 65 78 70 72 28 59 29 2e 20 5b 42 45 54 57  D expr(Y). [BETW
9140: 45 45 4e 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73  EEN] {.  ExprLis
9150: 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  t *pList = sqlit
9160: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9170: 28 70 50 61 72 73 65 2c 30 2c 20 58 29 3b 0a 20  (pParse,0, X);. 
9180: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
9190: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
91a0: 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 59 29 3b  Parse,pList, Y);
91b0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45  .  A = sqlite3PE
91c0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 42  xpr(pParse, TK_B
91d0: 45 54 57 45 45 4e 2c 20 41 2c 20 30 29 3b 0a 20  ETWEEN, A, 0);. 
91e0: 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41 2d   if( A ){.    A-
91f0: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  >x.pList = pList
9200: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9210: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9220: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9230: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 20 0a 20 20   pList);.  } .  
9240: 69 66 28 20 4e 20 29 20 41 20 3d 20 73 71 6c 69  if( N ) A = sqli
9250: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
9260: 20 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a   TK_NOT, A, 0);.
9270: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
9280: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
9290: 20 25 74 79 70 65 20 69 6e 5f 6f 70 20 7b 69 6e   %type in_op {in
92a0: 74 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a  t}.  in_op(A) ::
92b0: 3d 20 49 4e 2e 20 20 20 20 20 20 7b 41 20 3d 20  = IN.      {A = 
92c0: 30 3b 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a  0;}.  in_op(A) :
92d0: 3a 3d 20 4e 4f 54 20 49 4e 2e 20 20 7b 41 20 3d  := NOT IN.  {A =
92e0: 20 31 3b 7d 0a 20 20 65 78 70 72 28 41 29 20 3a   1;}.  expr(A) :
92f0: 3a 3d 20 65 78 70 72 28 41 29 20 69 6e 5f 6f 70  := expr(A) in_op
9300: 28 4e 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28  (N) LP exprlist(
9310: 59 29 20 52 50 2e 20 5b 49 4e 5d 20 7b 0a 20 20  Y) RP. [IN] {.  
9320: 20 20 69 66 28 20 59 3d 3d 30 20 29 7b 0a 20 20    if( Y==0 ){.  
9330: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
9340: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20  ns of the form. 
9350: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
9360: 20 20 20 20 20 20 65 78 70 72 31 20 49 4e 20 28        expr1 IN (
9370: 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  ).      **      
9380: 65 78 70 72 31 20 4e 4f 54 20 49 4e 20 28 29 0a  expr1 NOT IN ().
9390: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
93a0: 2a 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 63 6f  * simplify to co
93b0: 6e 73 74 61 6e 74 73 20 30 20 28 66 61 6c 73 65  nstants 0 (false
93c0: 29 20 61 6e 64 20 31 20 28 74 72 75 65 29 2c 20  ) and 1 (true), 
93d0: 72 65 73 70 65 63 74 69 76 65 6c 79 2c 0a 20 20  respectively,.  
93e0: 20 20 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73      ** regardles
93f0: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
9400: 66 20 65 78 70 72 31 2e 0a 20 20 20 20 20 20 2a  f expr1..      *
9410: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  /.      sqlite3E
9420: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
9430: 2d 3e 64 62 2c 20 41 29 3b 0a 20 20 20 20 20 20  ->db, A);.      
9440: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  A = sqlite3ExprA
9450: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
9460: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 26 73 71 6c   TK_INTEGER,&sql
9470: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 4e 5d  ite3IntTokens[N]
9480: 2c 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ,1);.    }else i
9490: 66 28 20 59 2d 3e 6e 45 78 70 72 3d 3d 31 20 29  f( Y->nExpr==1 )
94a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  {.      /* Expre
94b0: 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f  ssions of the fo
94c0: 72 6d 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  rm:.      **.   
94d0: 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31     **      expr1
94e0: 20 49 4e 20 28 3f 31 29 0a 20 20 20 20 20 20 2a   IN (?1).      *
94f0: 2a 20 20 20 20 20 20 65 78 70 72 31 20 4e 4f 54  *      expr1 NOT
9500: 20 49 4e 20 28 3f 32 29 0a 20 20 20 20 20 20 2a   IN (?2).      *
9510: 2a 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20  *.      ** with 
9520: 65 78 61 63 74 6c 79 20 6f 6e 65 20 76 61 6c 75  exactly one valu
9530: 65 20 6f 6e 20 74 68 65 20 52 48 53 20 63 61 6e  e on the RHS can
9540: 20 62 65 20 73 69 6d 70 6c 69 66 69 65 64 20 74   be simplified t
9550: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20  o something.    
9560: 20 20 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a    ** like this:.
9570: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
9580: 2a 20 20 20 20 20 20 65 78 70 72 31 20 3d 3d 20  *      expr1 == 
9590: 3f 31 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ?1.      **     
95a0: 20 65 78 70 72 31 20 3c 3e 20 3f 32 0a 20 20 20   expr1 <> ?2.   
95b0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 42     **.      ** B
95c0: 75 74 2c 20 74 68 65 20 52 48 53 20 6f 66 20 74  ut, the RHS of t
95d0: 68 65 20 3d 3d 20 6f 72 20 3c 3e 20 69 73 20 6d  he == or <> is m
95e0: 61 72 6b 65 64 20 77 69 74 68 20 74 68 65 20 45  arked with the E
95f0: 50 5f 47 65 6e 65 72 69 63 20 66 6c 61 67 0a 20  P_Generic flag. 
9600: 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20       ** so that 
9610: 69 74 20 6d 61 79 20 6e 6f 74 20 63 6f 6e 74 72  it may not contr
9620: 69 62 75 74 65 20 74 6f 20 74 68 65 20 63 6f 6d  ibute to the com
9630: 70 75 74 61 74 69 6f 6e 20 6f 66 20 63 6f 6d 70  putation of comp
9640: 61 72 69 73 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  arison.      ** 
9650: 61 66 66 69 6e 69 74 79 20 6f 72 20 74 68 65 20  affinity or the 
9660: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
9670: 63 65 20 74 6f 20 75 73 65 20 66 6f 72 20 63 6f  ce to use for co
9680: 6d 70 61 72 69 73 6f 6e 2e 20 20 4f 74 68 65 72  mparison.  Other
9690: 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74  wise,.      ** t
96a0: 68 65 20 73 65 6d 61 6e 74 69 63 73 20 77 6f 75  he semantics wou
96b0: 6c 64 20 62 65 20 73 75 62 74 6c 79 20 64 69 66  ld be subtly dif
96c0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 49 4e 20 6f  ferent from IN o
96d0: 72 20 4e 4f 54 20 49 4e 2e 0a 20 20 20 20 20 20  r NOT IN..      
96e0: 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  */.      Expr *p
96f0: 52 48 53 20 3d 20 59 2d 3e 61 5b 30 5d 2e 70 45  RHS = Y->a[0].pE
9700: 78 70 72 3b 0a 20 20 20 20 20 20 59 2d 3e 61 5b  xpr;.      Y->a[
9710: 30 5d 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20  0].pExpr = 0;.  
9720: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
9730: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
9740: 2d 3e 64 62 2c 20 59 29 3b 0a 20 20 20 20 20 20  ->db, Y);.      
9750: 2f 2a 20 70 52 48 53 20 63 61 6e 6e 6f 74 20 62  /* pRHS cannot b
9760: 65 20 4e 55 4c 4c 20 62 65 63 61 75 73 65 20 61  e NULL because a
9770: 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 77 6f   malloc error wo
9780: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 64 65  uld have been de
9790: 74 65 63 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  tected.      ** 
97a0: 62 65 66 6f 72 65 20 6e 6f 77 20 61 6e 64 20 63  before now and c
97b0: 6f 6e 74 72 6f 6c 20 77 6f 75 6c 64 20 68 61 76  ontrol would hav
97c0: 65 20 6e 65 76 65 72 20 72 65 61 63 68 65 64 20  e never reached 
97d0: 74 68 69 73 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  this point */.  
97e0: 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
97f0: 52 48 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  RHS) ){.        
9800: 70 52 48 53 2d 3e 66 6c 61 67 73 20 26 3d 20 7e  pRHS->flags &= ~
9810: 45 50 5f 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20  EP_Collate;.    
9820: 20 20 20 20 70 52 48 53 2d 3e 66 6c 61 67 73 20      pRHS->flags 
9830: 7c 3d 20 45 50 5f 47 65 6e 65 72 69 63 3b 0a 20  |= EP_Generic;. 
9840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 41 20 3d       }.      A =
9850: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
9860: 61 72 73 65 2c 20 4e 20 3f 20 54 4b 5f 4e 45 20  arse, N ? TK_NE 
9870: 3a 20 54 4b 5f 45 51 2c 20 41 2c 20 70 52 48 53  : TK_EQ, A, pRHS
9880: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9890: 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50      A = sqlite3P
98a0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
98b0: 49 4e 2c 20 41 2c 20 30 29 3b 0a 20 20 20 20 20  IN, A, 0);.     
98c0: 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20   if( A ){.      
98d0: 20 20 41 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 59    A->x.pList = Y
98e0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
98f0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 41 6e  3ExprSetHeightAn
9900: 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c 20 41  dFlags(pParse, A
9910: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9930: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
9940: 61 72 73 65 2d 3e 64 62 2c 20 59 29 3b 0a 20 20  arse->db, Y);.  
9950: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9960: 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33 50  N ) A = sqlite3P
9970: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
9980: 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20 20 20  NOT, A, 0);.    
9990: 7d 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20  }.  }.  expr(A) 
99a0: 3a 3a 3d 20 4c 50 20 73 65 6c 65 63 74 28 58 29  ::= LP select(X)
99b0: 20 52 50 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73   RP. {.    A = s
99c0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
99d0: 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30  se, TK_SELECT, 0
99e0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
99f0: 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28  3PExprAddSelect(
9a00: 70 50 61 72 73 65 2c 20 41 2c 20 58 29 3b 0a 20  pParse, A, X);. 
9a10: 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d   }.  expr(A) ::=
9a20: 20 65 78 70 72 28 41 29 20 69 6e 5f 6f 70 28 4e   expr(A) in_op(N
9a30: 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52  ) LP select(Y) R
9a40: 50 2e 20 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 41  P.  [IN] {.    A
9a50: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
9a60: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 41  pParse, TK_IN, A
9a70: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
9a80: 33 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28  3PExprAddSelect(
9a90: 70 50 61 72 73 65 2c 20 41 2c 20 59 29 3b 0a 20  pParse, A, Y);. 
9aa0: 20 20 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73     if( N ) A = s
9ab0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
9ac0: 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30  se, TK_NOT, A, 0
9ad0: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29  );.  }.  expr(A)
9ae0: 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 69 6e 5f   ::= expr(A) in_
9af0: 6f 70 28 4e 29 20 6e 6d 28 59 29 20 64 62 6e 6d  op(N) nm(Y) dbnm
9b00: 28 5a 29 20 70 61 72 65 6e 5f 65 78 70 72 6c 69  (Z) paren_exprli
9b10: 73 74 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20  st(E). [IN] {.  
9b20: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
9b30: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
9b40: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64  Append(pParse->d
9b50: 62 2c 20 30 2c 26 59 2c 26 5a 29 3b 0a 20 20 20  b, 0,&Y,&Z);.   
9b60: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
9b70: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
9b80: 4e 65 77 28 70 50 61 72 73 65 2c 20 30 2c 70 53  New(pParse, 0,pS
9b90: 72 63 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b  rc,0,0,0,0,0,0);
9ba0: 0a 20 20 20 20 69 66 28 20 45 20 29 20 20 73 71  .    if( E )  sq
9bb0: 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63  lite3SrcListFunc
9bc0: 41 72 67 73 28 70 50 61 72 73 65 2c 20 70 53 65  Args(pParse, pSe
9bd0: 6c 65 63 74 20 3f 20 70 53 72 63 20 3a 20 30 2c  lect ? pSrc : 0,
9be0: 20 45 29 3b 0a 20 20 20 20 41 20 3d 20 73 71 6c   E);.    A = sql
9bf0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
9c00: 2c 20 54 4b 5f 49 4e 2c 20 41 2c 20 30 29 3b 0a  , TK_IN, A, 0);.
9c10: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
9c20: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
9c30: 2c 20 41 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  , A, pSelect);. 
9c40: 20 20 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73     if( N ) A = s
9c50: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
9c60: 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30  se, TK_NOT, A, 0
9c70: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29  );.  }.  expr(A)
9c80: 20 3a 3a 3d 20 45 58 49 53 54 53 20 4c 50 20 73   ::= EXISTS LP s
9c90: 65 6c 65 63 74 28 59 29 20 52 50 2e 20 7b 0a 20  elect(Y) RP. {. 
9ca0: 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 20     Expr *p;.    
9cb0: 70 20 3d 20 41 20 3d 20 73 71 6c 69 74 65 33 50  p = A = sqlite3P
9cc0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
9cd0: 45 58 49 53 54 53 2c 20 30 2c 20 30 29 3b 0a 20  EXISTS, 0, 0);. 
9ce0: 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 41     sqlite3PExprA
9cf0: 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ddSelect(pParse,
9d00: 20 70 2c 20 59 29 3b 0a 20 20 7d 0a 25 65 6e 64   p, Y);.  }.%end
9d10: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  if SQLITE_OMIT_S
9d20: 55 42 51 55 45 52 59 0a 0a 2f 2a 20 43 41 53 45  UBQUERY../* CASE
9d30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
9d40: 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53 45  expr(A) ::= CASE
9d50: 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 58 29   case_operand(X)
9d60: 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 59   case_exprlist(Y
9d70: 29 20 63 61 73 65 5f 65 6c 73 65 28 5a 29 20 45  ) case_else(Z) E
9d80: 4e 44 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  ND. {.  A = sqli
9d90: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
9da0: 20 54 4b 5f 43 41 53 45 2c 20 58 2c 20 30 29 3b   TK_CASE, X, 0);
9db0: 0a 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20  .  if( A ){.    
9dc0: 41 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 5a 20 3f  A->x.pList = Z ?
9dd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9de0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 59 2c  Append(pParse,Y,
9df0: 5a 29 20 3a 20 59 3b 0a 20 20 20 20 73 71 6c 69  Z) : Y;.    sqli
9e00: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
9e10: 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 65 2c  AndFlags(pParse,
9e20: 20 41 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   A);.  }else{.  
9e30: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9e40: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
9e50: 64 62 2c 20 59 29 3b 0a 20 20 20 20 73 71 6c 69  db, Y);.    sqli
9e60: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
9e70: 61 72 73 65 2d 3e 64 62 2c 20 5a 29 3b 0a 20 20  arse->db, Z);.  
9e80: 7d 0a 7d 0a 25 74 79 70 65 20 63 61 73 65 5f 65  }.}.%type case_e
9e90: 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  xprlist {ExprLis
9ea0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
9eb0: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 73  case_exprlist {s
9ec0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9ed0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9ee0: 20 24 24 29 3b 7d 0a 63 61 73 65 5f 65 78 70 72   $$);}.case_expr
9ef0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 63 61 73 65  list(A) ::= case
9f00: 5f 65 78 70 72 6c 69 73 74 28 41 29 20 57 48 45  _exprlist(A) WHE
9f10: 4e 20 65 78 70 72 28 59 29 20 54 48 45 4e 20 65  N expr(Y) THEN e
9f20: 78 70 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20  xpr(Z). {.  A = 
9f30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
9f40: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 41 2c 20  ppend(pParse,A, 
9f50: 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  Y);.  A = sqlite
9f60: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
9f70: 70 50 61 72 73 65 2c 41 2c 20 5a 29 3b 0a 7d 0a  pParse,A, Z);.}.
9f80: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29  case_exprlist(A)
9f90: 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 59   ::= WHEN expr(Y
9fa0: 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20  ) THEN expr(Z). 
9fb0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
9fc0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
9fd0: 61 72 73 65 2c 30 2c 20 59 29 3b 0a 20 20 41 20  arse,0, Y);.  A 
9fe0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9ff0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 41  tAppend(pParse,A
a000: 2c 20 5a 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61  , Z);.}.%type ca
a010: 73 65 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a  se_else {Expr*}.
a020: 25 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65  %destructor case
a030: 5f 65 6c 73 65 20 7b 73 71 6c 69 74 65 33 45 78  _else {sqlite3Ex
a040: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
a050: 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f  >db, $$);}.case_
a060: 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53  else(A) ::=  ELS
a070: 45 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  E expr(X).      
a080: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 63 61 73 65     {A = X;}.case
a090: 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 2e 20  _else(A) ::=  . 
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0b0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 25 74      {A = 0;} .%t
a0c0: 79 70 65 20 63 61 73 65 5f 6f 70 65 72 61 6e 64  ype case_operand
a0d0: 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75   {Expr*}.%destru
a0e0: 63 74 6f 72 20 63 61 73 65 5f 6f 70 65 72 61 6e  ctor case_operan
a0f0: 64 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  d {sqlite3ExprDe
a100: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
a110: 20 24 24 29 3b 7d 0a 63 61 73 65 5f 6f 70 65 72   $$);}.case_oper
a120: 61 6e 64 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  and(A) ::= expr(
a130: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b  X).            {
a140: 41 20 3d 20 58 3b 20 2f 2a 41 2d 6f 76 65 72 77  A = X; /*A-overw
a150: 72 69 74 65 73 2d 58 2a 2f 7d 20 0a 63 61 73 65  rites-X*/} .case
a160: 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20  _operand(A) ::= 
a170: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a180: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25      {A = 0;} ..%
a190: 74 79 70 65 20 65 78 70 72 6c 69 73 74 20 7b 45  type exprlist {E
a1a0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
a1b0: 75 63 74 6f 72 20 65 78 70 72 6c 69 73 74 20 7b  uctor exprlist {
a1c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a1d0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
a1e0: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 6e 65  , $$);}.%type ne
a1f0: 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  xprlist {ExprLis
a200: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
a210: 6e 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74  nexprlist {sqlit
a220: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
a230: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
a240: 3b 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20  ;}..exprlist(A) 
a250: 3a 3a 3d 20 6e 65 78 70 72 6c 69 73 74 28 41 29  ::= nexprlist(A)
a260: 2e 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a  ..exprlist(A) ::
a270: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
a290: 41 20 3d 20 30 3b 7d 0a 6e 65 78 70 72 6c 69 73  A = 0;}.nexprlis
a2a0: 74 28 41 29 20 3a 3a 3d 20 6e 65 78 70 72 6c 69  t(A) ::= nexprli
a2b0: 73 74 28 41 29 20 43 4f 4d 4d 41 20 65 78 70 72  st(A) COMMA expr
a2c0: 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71  (Y)..    {A = sq
a2d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
a2e0: 65 6e 64 28 70 50 61 72 73 65 2c 41 2c 59 29 3b  end(pParse,A,Y);
a2f0: 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41 29 20 3a  }.nexprlist(A) :
a300: 3a 3d 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20  := expr(Y)..    
a310: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
a320: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
a330: 65 2c 30 2c 59 29 3b 20 2f 2a 41 2d 6f 76 65 72  e,0,Y); /*A-over
a340: 77 72 69 74 65 73 2d 59 2a 2f 7d 0a 0a 25 69 66  writes-Y*/}..%if
a350: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a360: 5f 53 55 42 51 55 45 52 59 0a 2f 2a 20 41 20 70  _SUBQUERY./* A p
a370: 61 72 65 6e 5f 65 78 70 72 6c 69 73 74 20 69 73  aren_exprlist is
a380: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 65 78 70   an optional exp
a390: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 63 6f 6e  ression list con
a3a0: 74 61 69 6e 65 64 20 69 6e 73 69 64 65 0a 2a 2a  tained inside.**
a3b0: 20 6f 66 20 70 61 72 65 6e 74 68 65 73 69 73 20   of parenthesis 
a3c0: 2a 2f 0a 25 74 79 70 65 20 70 61 72 65 6e 5f 65  */.%type paren_e
a3d0: 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  xprlist {ExprLis
a3e0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
a3f0: 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 74 20 7b  paren_exprlist {
a400: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a410: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
a420: 2c 20 24 24 29 3b 7d 0a 70 61 72 65 6e 5f 65 78  , $$);}.paren_ex
a430: 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e 20  prlist(A) ::= . 
a440: 20 20 7b 41 20 3d 20 30 3b 7d 0a 70 61 72 65 6e    {A = 0;}.paren
a450: 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  _exprlist(A) ::=
a460: 20 4c 50 20 65 78 70 72 6c 69 73 74 28 58 29 20   LP exprlist(X) 
a470: 52 50 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 65  RP.  {A = X;}.%e
a480: 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndif SQLITE_OMIT
a490: 5f 53 55 42 51 55 45 52 59 0a 0a 0a 2f 2f 2f 2f  _SUBQUERY...////
a4a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a4b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52  ///////// The CR
a4c0: 45 41 54 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61  EATE INDEX comma
a4d0: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
a4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
a4f0: 64 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 28 53  d ::= createkw(S
a500: 29 20 75 6e 69 71 75 65 66 6c 61 67 28 55 29 20  ) uniqueflag(U) 
a510: 49 4e 44 45 58 20 69 66 6e 6f 74 65 78 69 73 74  INDEX ifnotexist
a520: 73 28 4e 45 29 20 6e 6d 28 58 29 20 64 62 6e 6d  s(NE) nm(X) dbnm
a530: 28 44 29 0a 20 20 20 20 20 20 20 20 4f 4e 20 6e  (D).        ON n
a540: 6d 28 59 29 20 4c 50 20 73 6f 72 74 6c 69 73 74  m(Y) LP sortlist
a550: 28 5a 29 20 52 50 20 77 68 65 72 65 5f 6f 70 74  (Z) RP where_opt
a560: 28 57 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (W). {.  sqlite3
a570: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
a580: 73 65 2c 20 26 58 2c 20 26 44 2c 20 0a 20 20 20  se, &X, &D, .   
a590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5a0: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
a5b0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64  Append(pParse->d
a5c0: 62 2c 30 2c 26 59 2c 30 29 2c 20 5a 2c 20 55 2c  b,0,&Y,0), Z, U,
a5d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a5e0: 20 20 20 20 20 20 20 26 53 2c 20 57 2c 20 53 51         &S, W, SQ
a5f0: 4c 49 54 45 5f 53 4f 5f 41 53 43 2c 20 4e 45 2c  LITE_SO_ASC, NE,
a600: 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f   SQLITE_IDXTYPE_
a610: 41 50 50 44 45 46 29 3b 0a 7d 0a 0a 25 74 79 70  APPDEF);.}..%typ
a620: 65 20 75 6e 69 71 75 65 66 6c 61 67 20 7b 69 6e  e uniqueflag {in
a630: 74 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28 41 29  t}.uniqueflag(A)
a640: 20 3a 3a 3d 20 55 4e 49 51 55 45 2e 20 20 7b 41   ::= UNIQUE.  {A
a650: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 75 6e   = OE_Abort;}.un
a660: 69 71 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20  iqueflag(A) ::= 
a670: 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45  .        {A = OE
a680: 5f 4e 6f 6e 65 3b 7d 0a 0a 0a 2f 2f 20 54 68 65  _None;}...// The
a690: 20 65 69 64 6c 69 73 74 20 6e 6f 6e 2d 74 65 72   eidlist non-ter
a6a0: 6d 69 6e 61 6c 20 28 45 78 70 72 65 73 73 69 6f  minal (Expressio
a6b0: 6e 20 49 64 20 4c 69 73 74 29 20 67 65 6e 65 72  n Id List) gener
a6c0: 61 74 65 73 20 61 6e 20 45 78 70 72 4c 69 73 74  ates an ExprList
a6d0: 0a 2f 2f 20 66 72 6f 6d 20 61 20 6c 69 73 74 20  .// from a list 
a6e0: 6f 66 20 69 64 65 6e 74 69 66 69 65 72 73 2e 20  of identifiers. 
a6f0: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
a700: 6e 61 6d 65 73 20 61 72 65 20 69 6e 20 45 78 70  names are in Exp
a710: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 2e  rList.a[].zName.
a720: 0a 2f 2f 20 54 68 69 73 20 6c 69 73 74 20 69 73  .// This list is
a730: 20 73 74 6f 72 65 64 20 69 6e 20 61 6e 20 45 78   stored in an Ex
a740: 70 72 4c 69 73 74 20 72 61 74 68 65 72 20 74 68  prList rather th
a750: 61 6e 20 61 6e 20 49 64 4c 69 73 74 20 73 6f 20  an an IdList so 
a760: 74 68 61 74 20 69 74 0a 2f 2f 20 63 61 6e 20 62  that it.// can b
a770: 65 20 65 61 73 69 6c 79 20 73 65 6e 74 20 74 6f  e easily sent to
a780: 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 73 45   sqlite3ColumnsE
a790: 78 70 72 4c 69 73 74 28 29 2e 0a 2f 2f 0a 2f 2f  xprList()..//.//
a7a0: 20 65 69 64 6c 69 73 74 20 69 73 20 67 72 6f 75   eidlist is grou
a7b0: 70 65 64 20 77 69 74 68 20 43 52 45 41 54 45 20  ped with CREATE 
a7c0: 49 4e 44 45 58 20 62 65 63 61 75 73 65 20 69 74  INDEX because it
a7d0: 20 75 73 65 64 20 74 6f 20 62 65 20 74 68 65 20   used to be the 
a7e0: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 0a 2f 2f 20  non-terminal.// 
a7f0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 61 72 67  used for the arg
a800: 75 6d 65 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64  uments to an ind
a810: 65 78 2e 20 20 54 68 61 74 20 69 73 20 6a 75 73  ex.  That is jus
a820: 74 20 61 6e 20 68 69 73 74 6f 72 69 63 61 6c 20  t an historical 
a830: 61 63 63 69 64 65 6e 74 2e 0a 2f 2f 0a 2f 2f 20  accident..//.// 
a840: 49 4d 50 4f 52 54 41 4e 54 20 43 4f 4d 50 41 54  IMPORTANT COMPAT
a850: 49 42 49 4c 49 54 59 20 4e 4f 54 45 3a 20 20 53  IBILITY NOTE:  S
a860: 6f 6d 65 20 70 72 69 6f 72 20 76 65 72 73 69 6f  ome prior versio
a870: 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 63 63  ns of SQLite acc
a880: 65 70 74 65 64 0a 2f 2f 20 43 4f 4c 4c 41 54 45  epted.// COLLATE
a890: 20 63 6c 61 75 73 65 73 20 61 6e 64 20 41 53 43   clauses and ASC
a8a0: 20 6f 72 20 44 45 53 43 20 6b 65 79 77 6f 72 64   or DESC keyword
a8b0: 73 20 6f 6e 20 49 44 20 6c 69 73 74 73 20 69 6e  s on ID lists in
a8c0: 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 0a 2f   inappropriate./
a8d0: 2f 20 70 6c 61 63 65 73 20 2d 20 70 6c 61 63 65  / places - place
a8e0: 73 20 74 68 61 74 20 6d 69 67 68 74 20 68 61 76  s that might hav
a8f0: 65 20 62 65 65 6e 20 73 74 6f 72 65 64 20 69 6e  e been stored in
a900: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
a910: 65 72 20 73 63 68 65 6d 61 2e 0a 2f 2f 20 54 68  er schema..// Th
a920: 6f 73 65 20 65 78 74 72 61 20 66 65 61 74 75 72  ose extra featur
a930: 65 73 20 77 65 72 65 20 69 67 6e 6f 72 65 64 2e  es were ignored.
a940: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
a950: 65 79 20 6d 69 67 68 74 20 62 65 20 69 6e 20 73  ey might be in s
a960: 6f 6d 65 0a 2f 2f 20 28 62 75 73 74 65 64 29 20  ome.// (busted) 
a970: 6f 6c 64 20 64 61 74 61 62 61 73 65 73 2c 20 77  old databases, w
a980: 65 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74 69 6e  e need to contin
a990: 75 65 20 70 61 72 73 69 6e 67 20 74 68 65 6d 20  ue parsing them 
a9a0: 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 2f 2f 20  when loading.// 
a9b0: 68 69 73 74 6f 72 69 63 61 6c 20 73 63 68 65 6d  historical schem
a9c0: 61 73 2e 0a 2f 2f 0a 25 74 79 70 65 20 65 69 64  as..//.%type eid
a9d0: 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d  list {ExprList*}
a9e0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 69 64  .%destructor eid
a9f0: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70  list {sqlite3Exp
aa00: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
aa10: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74  se->db, $$);}.%t
aa20: 79 70 65 20 65 69 64 6c 69 73 74 5f 6f 70 74 20  ype eidlist_opt 
aa30: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
aa40: 74 72 75 63 74 6f 72 20 65 69 64 6c 69 73 74 5f  tructor eidlist_
aa50: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
aa60: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
aa70: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 69  e->db, $$);}..%i
aa80: 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 41 64  nclude {.  /* Ad
aa90: 64 20 61 20 73 69 6e 67 6c 65 20 6e 65 77 20 74  d a single new t
aaa0: 65 72 6d 20 74 6f 20 61 6e 20 45 78 70 72 4c 69  erm to an ExprLi
aab0: 73 74 20 74 68 61 74 20 69 73 20 75 73 65 64 20  st that is used 
aac0: 74 6f 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  to store a.  ** 
aad0: 6c 69 73 74 20 6f 66 20 69 64 65 6e 74 69 66 69  list of identifi
aae0: 65 72 73 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ers.  Report an 
aaf0: 65 72 72 6f 72 20 69 66 20 74 68 65 20 49 44 20  error if the ID 
ab00: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20  list contains.  
ab10: 2a 2a 20 61 20 43 4f 4c 4c 41 54 45 20 63 6c 61  ** a COLLATE cla
ab20: 75 73 65 20 6f 72 20 61 6e 20 41 53 43 20 6f 72  use or an ASC or
ab30: 20 44 45 53 43 20 6b 65 79 77 6f 72 64 2c 20 65   DESC keyword, e
ab40: 78 63 65 70 74 20 69 67 6e 6f 72 65 20 74 68 65  xcept ignore the
ab50: 0a 20 20 2a 2a 20 65 72 72 6f 72 20 77 68 69 6c  .  ** error whil
ab60: 65 20 70 61 72 73 69 6e 67 20 61 20 6c 65 67 61  e parsing a lega
ab70: 63 79 20 73 63 68 65 6d 61 2e 0a 20 20 2a 2f 0a  cy schema..  */.
ab80: 20 20 73 74 61 74 69 63 20 45 78 70 72 4c 69 73    static ExprLis
ab90: 74 20 2a 70 61 72 73 65 72 41 64 64 45 78 70 72  t *parserAddExpr
aba0: 49 64 4c 69 73 74 54 65 72 6d 28 0a 20 20 20 20  IdListTerm(.    
abb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
abc0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 50 72     ExprList *pPr
abd0: 69 6f 72 2c 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  ior,.    Token *
abe0: 70 49 64 54 6f 6b 65 6e 2c 0a 20 20 20 20 69 6e  pIdToken,.    in
abf0: 74 20 68 61 73 43 6f 6c 6c 61 74 65 2c 0a 20 20  t hasCollate,.  
ac00: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 0a    int sortOrder.
ac10: 20 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73    ){.    ExprLis
ac20: 74 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  t *p = sqlite3Ex
ac30: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
ac40: 72 73 65 2c 20 70 50 72 69 6f 72 2c 20 30 29 3b  rse, pPrior, 0);
ac50: 0a 20 20 20 20 69 66 28 20 28 68 61 73 43 6f 6c  .    if( (hasCol
ac60: 6c 61 74 65 20 7c 7c 20 73 6f 72 74 4f 72 64 65  late || sortOrde
ac70: 72 21 3d 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 44  r!=SQLITE_SO_UND
ac80: 45 46 49 4e 45 44 29 0a 20 20 20 20 20 20 20 20  EFINED).        
ac90: 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69  && pParse->db->i
aca0: 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 20 20 20 20  nit.busy==0.    
acb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
acc0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
acd0: 20 22 73 79 6e 74 61 78 20 65 72 72 6f 72 20 61   "syntax error a
ace0: 66 74 65 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fter column name
acf0: 20 5c 22 25 2e 2a 73 5c 22 22 2c 0a 20 20 20 20   \"%.*s\"",.    
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad10: 20 20 20 20 20 70 49 64 54 6f 6b 65 6e 2d 3e 6e       pIdToken->n
ad20: 2c 20 70 49 64 54 6f 6b 65 6e 2d 3e 7a 29 3b 0a  , pIdToken->z);.
ad30: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ad40: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
ad50: 28 70 50 61 72 73 65 2c 20 70 2c 20 70 49 64 54  (pParse, p, pIdT
ad60: 6f 6b 65 6e 2c 20 31 29 3b 0a 20 20 20 20 72 65  oken, 1);.    re
ad70: 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 7d 20 2f 2f  turn p;.  }.} //
ad80: 20 65 6e 64 20 25 69 6e 63 6c 75 64 65 0a 0a 65   end %include..e
ad90: 69 64 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a  idlist_opt(A) ::
ada0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
adc0: 20 30 3b 7d 0a 65 69 64 6c 69 73 74 5f 6f 70 74   0;}.eidlist_opt
add0: 28 41 29 20 3a 3a 3d 20 4c 50 20 65 69 64 6c 69  (A) ::= LP eidli
ade0: 73 74 28 58 29 20 52 50 2e 20 20 20 20 20 20 20  st(X) RP.       
adf0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 65 69 64 6c 69    {A = X;}.eidli
ae00: 73 74 28 41 29 20 3a 3a 3d 20 65 69 64 6c 69 73  st(A) ::= eidlis
ae10: 74 28 41 29 20 43 4f 4d 4d 41 20 6e 6d 28 59 29  t(A) COMMA nm(Y)
ae20: 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74   collate(C) sort
ae30: 6f 72 64 65 72 28 5a 29 2e 20 20 7b 0a 20 20 41  order(Z).  {.  A
ae40: 20 3d 20 70 61 72 73 65 72 41 64 64 45 78 70 72   = parserAddExpr
ae50: 49 64 4c 69 73 74 54 65 72 6d 28 70 50 61 72 73  IdListTerm(pPars
ae60: 65 2c 20 41 2c 20 26 59 2c 20 43 2c 20 5a 29 3b  e, A, &Y, C, Z);
ae70: 0a 7d 0a 65 69 64 6c 69 73 74 28 41 29 20 3a 3a  .}.eidlist(A) ::
ae80: 3d 20 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65 28  = nm(Y) collate(
ae90: 43 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e  C) sortorder(Z).
aea0: 20 7b 0a 20 20 41 20 3d 20 70 61 72 73 65 72 41   {.  A = parserA
aeb0: 64 64 45 78 70 72 49 64 4c 69 73 74 54 65 72 6d  ddExprIdListTerm
aec0: 28 70 50 61 72 73 65 2c 20 30 2c 20 26 59 2c 20  (pParse, 0, &Y, 
aed0: 43 2c 20 5a 29 3b 20 2f 2a 41 2d 6f 76 65 72 77  C, Z); /*A-overw
aee0: 72 69 74 65 73 2d 59 2a 2f 0a 7d 0a 0a 25 74 79  rites-Y*/.}..%ty
aef0: 70 65 20 63 6f 6c 6c 61 74 65 20 7b 69 6e 74 7d  pe collate {int}
af00: 0a 63 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d 20  .collate(C) ::= 
af10: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
af20: 43 20 3d 20 30 3b 7d 0a 63 6f 6c 6c 61 74 65 28  C = 0;}.collate(
af30: 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20 69  C) ::= COLLATE i
af40: 64 73 2e 20 20 20 7b 43 20 3d 20 31 3b 7d 0a 0a  ds.   {C = 1;}..
af50: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
af60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
af70: 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 63 6f  he DROP INDEX co
af80: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
af90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
afa0: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20  //.cmd ::= DROP 
afb0: 49 4e 44 45 58 20 69 66 65 78 69 73 74 73 28 45  INDEX ifexists(E
afc0: 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 20  ) fullname(X).  
afd0: 20 7b 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64   {sqlite3DropInd
afe0: 65 78 28 70 50 61 72 73 65 2c 20 58 2c 20 45 29  ex(pParse, X, E)
aff0: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
b000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b010: 2f 20 54 68 65 20 56 41 43 55 55 4d 20 63 6f 6d  / The VACUUM com
b020: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
b030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b040: 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51  //.//.%ifndef SQ
b050: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
b060: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
b070: 4f 4d 49 54 5f 41 54 54 41 43 48 0a 63 6d 64 20  OMIT_ATTACH.cmd 
b080: 3a 3a 3d 20 56 41 43 55 55 4d 2e 20 20 20 20 20  ::= VACUUM.     
b090: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
b0a0: 74 65 33 56 61 63 75 75 6d 28 70 50 61 72 73 65  te3Vacuum(pParse
b0b0: 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41  ,0);}.cmd ::= VA
b0c0: 43 55 55 4d 20 6e 6d 28 58 29 2e 20 20 20 20 20  CUUM nm(X).     
b0d0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63       {sqlite3Vac
b0e0: 75 75 6d 28 70 50 61 72 73 65 2c 26 58 29 3b 7d  uum(pParse,&X);}
b0f0: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
b100: 4f 4d 49 54 5f 41 54 54 41 43 48 0a 25 65 6e 64  OMIT_ATTACH.%end
b110: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
b120: 56 41 43 55 55 4d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  VACUUM..////////
b130: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b140: 2f 2f 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d 41  ///// The PRAGMA
b150: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
b160: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b170: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65  //////.//.%ifnde
b180: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  f SQLITE_OMIT_PR
b190: 41 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  AGMA.cmd ::= PRA
b1a0: 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a  GMA nm(X) dbnm(Z
b1b0: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
b1c0: 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61    {sqlite3Pragma
b1d0: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 30 2c  (pParse,&X,&Z,0,
b1e0: 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  0);}.cmd ::= PRA
b1f0: 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a  GMA nm(X) dbnm(Z
b200: 29 20 45 51 20 6e 6d 6e 75 6d 28 59 29 2e 20 20  ) EQ nmnum(Y).  
b210: 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61    {sqlite3Pragma
b220: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59  (pParse,&X,&Z,&Y
b230: 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52  ,0);}.cmd ::= PR
b240: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
b250: 5a 29 20 4c 50 20 6e 6d 6e 75 6d 28 59 29 20 52  Z) LP nmnum(Y) R
b260: 50 2e 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d  P. {sqlite3Pragm
b270: 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26  a(pParse,&X,&Z,&
b280: 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50  Y,0);}.cmd ::= P
b290: 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d  RAGMA nm(X) dbnm
b2a0: 28 5a 29 20 45 51 20 6d 69 6e 75 73 5f 6e 75 6d  (Z) EQ minus_num
b2b0: 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20  (Y). .          
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2e0: 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d     {sqlite3Pragm
b2f0: 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26  a(pParse,&X,&Z,&
b300: 59 2c 31 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50  Y,1);}.cmd ::= P
b310: 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d  RAGMA nm(X) dbnm
b320: 28 5a 29 20 4c 50 20 6d 69 6e 75 73 5f 6e 75 6d  (Z) LP minus_num
b330: 28 59 29 20 52 50 2e 0a 20 20 20 20 20 20 20 20  (Y) RP..        
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61       {sqlite3Pra
b370: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
b380: 2c 26 59 2c 31 29 3b 7d 0a 0a 6e 6d 6e 75 6d 28  ,&Y,1);}..nmnum(
b390: 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d 28  A) ::= plus_num(
b3a0: 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d  A)..nmnum(A) ::=
b3b0: 20 6e 6d 28 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29   nm(A)..nmnum(A)
b3c0: 20 3a 3a 3d 20 4f 4e 28 41 29 2e 0a 6e 6d 6e 75   ::= ON(A)..nmnu
b3d0: 6d 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 28  m(A) ::= DELETE(
b3e0: 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d  A)..nmnum(A) ::=
b3f0: 20 44 45 46 41 55 4c 54 28 41 29 2e 0a 25 65 6e   DEFAULT(A)..%en
b400: 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  dif SQLITE_OMIT_
b410: 50 52 41 47 4d 41 0a 25 74 6f 6b 65 6e 5f 63 6c  PRAGMA.%token_cl
b420: 61 73 73 20 6e 75 6d 62 65 72 20 49 4e 54 45 47  ass number INTEG
b430: 45 52 7c 46 4c 4f 41 54 2e 0a 70 6c 75 73 5f 6e  ER|FLOAT..plus_n
b440: 75 6d 28 41 29 20 3a 3a 3d 20 50 4c 55 53 20 6e  um(A) ::= PLUS n
b450: 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20 20 20  umber(X).       
b460: 7b 41 20 3d 20 58 3b 7d 0a 70 6c 75 73 5f 6e 75  {A = X;}.plus_nu
b470: 6d 28 41 29 20 3a 3a 3d 20 6e 75 6d 62 65 72 28  m(A) ::= number(
b480: 41 29 2e 0a 6d 69 6e 75 73 5f 6e 75 6d 28 41 29  A)..minus_num(A)
b490: 20 3a 3a 3d 20 4d 49 4e 55 53 20 6e 75 6d 62 65   ::= MINUS numbe
b4a0: 72 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58  r(X).     {A = X
b4b0: 3b 7d 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}./////////////
b4c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
b4d0: 54 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47  The CREATE TRIGG
b4e0: 45 52 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  ER command /////
b4f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b500: 0a 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..%ifndef SQLITE
b510: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 63  _OMIT_TRIGGER..c
b520: 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 20  md ::= createkw 
b530: 74 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20  trigger_decl(A) 
b540: 42 45 47 49 4e 20 74 72 69 67 67 65 72 5f 63 6d  BEGIN trigger_cm
b550: 64 5f 6c 69 73 74 28 53 29 20 45 4e 44 28 5a 29  d_list(S) END(Z)
b560: 2e 20 7b 0a 20 20 54 6f 6b 65 6e 20 61 6c 6c 3b  . {.  Token all;
b570: 0a 20 20 61 6c 6c 2e 7a 20 3d 20 41 2e 7a 3b 0a  .  all.z = A.z;.
b580: 20 20 61 6c 6c 2e 6e 20 3d 20 28 69 6e 74 29 28    all.n = (int)(
b590: 5a 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a 2e 6e  Z.z - A.z) + Z.n
b5a0: 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6e 69 73  ;.  sqlite3Finis
b5b0: 68 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  hTrigger(pParse,
b5c0: 20 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a 0a 74 72   S, &all);.}..tr
b5d0: 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20 3a 3a  igger_decl(A) ::
b5e0: 3d 20 74 65 6d 70 28 54 29 20 54 52 49 47 47 45  = temp(T) TRIGGE
b5f0: 52 20 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 4f  R ifnotexists(NO
b600: 45 52 52 29 20 6e 6d 28 42 29 20 64 62 6e 6d 28  ERR) nm(B) dbnm(
b610: 5a 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Z) .            
b620: 20 20 20 20 20 20 20 20 74 72 69 67 67 65 72 5f          trigger_
b630: 74 69 6d 65 28 43 29 20 74 72 69 67 67 65 72 5f  time(C) trigger_
b640: 65 76 65 6e 74 28 44 29 0a 20 20 20 20 20 20 20  event(D).       
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20               ON 
b660: 66 75 6c 6c 6e 61 6d 65 28 45 29 20 66 6f 72 65  fullname(E) fore
b670: 61 63 68 5f 63 6c 61 75 73 65 20 77 68 65 6e 5f  ach_clause when_
b680: 63 6c 61 75 73 65 28 47 29 2e 20 7b 0a 20 20 73  clause(G). {.  s
b690: 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69 67 67  qlite3BeginTrigg
b6a0: 65 72 28 70 50 61 72 73 65 2c 20 26 42 2c 20 26  er(pParse, &B, &
b6b0: 5a 2c 20 43 2c 20 44 2e 61 2c 20 44 2e 62 2c 20  Z, C, D.a, D.b, 
b6c0: 45 2c 20 47 2c 20 54 2c 20 4e 4f 45 52 52 29 3b  E, G, T, NOERR);
b6d0: 0a 20 20 41 20 3d 20 28 5a 2e 6e 3d 3d 30 3f 42  .  A = (Z.n==0?B
b6e0: 3a 5a 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69  :Z); /*A-overwri
b6f0: 74 65 73 2d 54 2a 2f 0a 7d 0a 0a 25 74 79 70 65  tes-T*/.}..%type
b700: 20 74 72 69 67 67 65 72 5f 74 69 6d 65 20 7b 69   trigger_time {i
b710: 6e 74 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65  nt}.trigger_time
b720: 28 41 29 20 3a 3a 3d 20 42 45 46 4f 52 45 7c 41  (A) ::= BEFORE|A
b730: 46 54 45 52 28 58 29 2e 20 20 7b 20 41 20 3d 20  FTER(X).  { A = 
b740: 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74  @X; /*A-overwrit
b750: 65 73 2d 58 2a 2f 20 7d 0a 74 72 69 67 67 65 72  es-X*/ }.trigger
b760: 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 49 4e 53  _time(A) ::= INS
b770: 54 45 41 44 20 4f 46 2e 20 20 7b 20 41 20 3d 20  TEAD OF.  { A = 
b780: 54 4b 5f 49 4e 53 54 45 41 44 3b 7d 0a 74 72 69  TK_INSTEAD;}.tri
b790: 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d  gger_time(A) ::=
b7a0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
b7b0: 41 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d  A = TK_BEFORE; }
b7c0: 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f  ..%type trigger_
b7d0: 65 76 65 6e 74 20 7b 73 74 72 75 63 74 20 54 72  event {struct Tr
b7e0: 69 67 45 76 65 6e 74 7d 0a 25 64 65 73 74 72 75  igEvent}.%destru
b7f0: 63 74 6f 72 20 74 72 69 67 67 65 72 5f 65 76 65  ctor trigger_eve
b800: 6e 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73  nt {sqlite3IdLis
b810: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
b820: 64 62 2c 20 24 24 2e 62 29 3b 7d 0a 74 72 69 67  db, $$.b);}.trig
b830: 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d  ger_event(A) ::=
b840: 20 44 45 4c 45 54 45 7c 49 4e 53 45 52 54 28 58   DELETE|INSERT(X
b850: 29 2e 20 20 20 7b 41 2e 61 20 3d 20 40 58 3b 20  ).   {A.a = @X; 
b860: 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58  /*A-overwrites-X
b870: 2a 2f 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69  */ A.b = 0;}.tri
b880: 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a  gger_event(A) ::
b890: 3d 20 55 50 44 41 54 45 28 58 29 2e 20 20 20 20  = UPDATE(X).    
b8a0: 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 40 58 3b        {A.a = @X;
b8b0: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
b8c0: 58 2a 2f 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72  X*/ A.b = 0;}.tr
b8d0: 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a  igger_event(A) :
b8e0: 3a 3d 20 55 50 44 41 54 45 20 4f 46 20 69 64 6c  := UPDATE OF idl
b8f0: 69 73 74 28 58 29 2e 7b 41 2e 61 20 3d 20 54 4b  ist(X).{A.a = TK
b900: 5f 55 50 44 41 54 45 3b 20 41 2e 62 20 3d 20 58  _UPDATE; A.b = X
b910: 3b 7d 0a 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75  ;}..foreach_clau
b920: 73 65 20 3a 3a 3d 20 2e 0a 66 6f 72 65 61 63 68  se ::= ..foreach
b930: 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 46 4f 52 20  _clause ::= FOR 
b940: 45 41 43 48 20 52 4f 57 2e 0a 0a 25 74 79 70 65  EACH ROW...%type
b950: 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 45 78   when_clause {Ex
b960: 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pr*}.%destructor
b970: 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 73 71   when_clause {sq
b980: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
b990: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
b9a0: 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28 41 29  }.when_clause(A)
b9b0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
b9c0: 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 77 68     { A = 0; }.wh
b9d0: 65 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d  en_clause(A) ::=
b9e0: 20 57 48 45 4e 20 65 78 70 72 28 58 29 2e 20 7b   WHEN expr(X). {
b9f0: 20 41 20 3d 20 58 3b 20 7d 0a 0a 25 74 79 70 65   A = X; }..%type
ba00: 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73   trigger_cmd_lis
ba10: 74 20 7b 54 72 69 67 67 65 72 53 74 65 70 2a 7d  t {TriggerStep*}
ba20: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72 69  .%destructor tri
ba30: 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 73  gger_cmd_list {s
ba40: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
ba50: 67 65 72 53 74 65 70 28 70 50 61 72 73 65 2d 3e  gerStep(pParse->
ba60: 64 62 2c 20 24 24 29 3b 7d 0a 74 72 69 67 67 65  db, $$);}.trigge
ba70: 72 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a  r_cmd_list(A) ::
ba80: 3d 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  = trigger_cmd_li
ba90: 73 74 28 41 29 20 74 72 69 67 67 65 72 5f 63 6d  st(A) trigger_cm
baa0: 64 28 58 29 20 53 45 4d 49 2e 20 7b 0a 20 20 61  d(X) SEMI. {.  a
bab0: 73 73 65 72 74 28 20 41 21 3d 30 20 29 3b 0a 20  ssert( A!=0 );. 
bac0: 20 41 2d 3e 70 4c 61 73 74 2d 3e 70 4e 65 78 74   A->pLast->pNext
bad0: 20 3d 20 58 3b 0a 20 20 41 2d 3e 70 4c 61 73 74   = X;.  A->pLast
bae0: 20 3d 20 58 3b 0a 7d 0a 74 72 69 67 67 65 72 5f   = X;.}.trigger_
baf0: 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20  cmd_list(A) ::= 
bb00: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 53  trigger_cmd(A) S
bb10: 45 4d 49 2e 20 7b 20 0a 20 20 61 73 73 65 72 74  EMI. { .  assert
bb20: 28 20 41 21 3d 30 20 29 3b 0a 20 20 41 2d 3e 70  ( A!=0 );.  A->p
bb30: 4c 61 73 74 20 3d 20 41 3b 0a 7d 0a 0a 2f 2f 20  Last = A;.}..// 
bb40: 44 69 73 61 6c 6c 6f 77 20 71 75 61 6c 69 66 69  Disallow qualifi
bb50: 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 6f  ed table names o
bb60: 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
bb70: 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61  , and DELETE sta
bb80: 74 65 6d 65 6e 74 73 0a 2f 2f 20 77 69 74 68 69  tements.// withi
bb90: 6e 20 61 20 74 72 69 67 67 65 72 2e 20 20 54 68  n a trigger.  Th
bba0: 65 20 74 61 62 6c 65 20 74 6f 20 49 4e 53 45 52  e table to INSER
bbb0: 54 2c 20 55 50 44 41 54 45 2c 20 6f 72 20 44 45  T, UPDATE, or DE
bbc0: 4c 45 54 45 20 69 73 20 61 6c 77 61 79 73 20 69  LETE is always i
bbd0: 6e 20 0a 2f 2f 20 74 68 65 20 73 61 6d 65 20 64  n .// the same d
bbe0: 61 74 61 62 61 73 65 20 61 73 20 74 68 65 20 74  atabase as the t
bbf0: 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 74 72  able that the tr
bc00: 69 67 67 65 72 20 66 69 72 65 73 20 6f 6e 2e 0a  igger fires on..
bc10: 2f 2f 0a 25 74 79 70 65 20 74 72 6e 6d 20 7b 54  //.%type trnm {T
bc20: 6f 6b 65 6e 7d 0a 74 72 6e 6d 28 41 29 20 3a 3a  oken}.trnm(A) ::
bc30: 3d 20 6e 6d 28 41 29 2e 0a 74 72 6e 6d 28 41 29  = nm(A)..trnm(A)
bc40: 20 3a 3a 3d 20 6e 6d 20 44 4f 54 20 6e 6d 28 58   ::= nm DOT nm(X
bc50: 29 2e 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20 20  ). {.  A = X;.  
bc60: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
bc70: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
bc80: 20 22 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c   "qualified tabl
bc90: 65 20 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74 20  e names are not 
bca0: 61 6c 6c 6f 77 65 64 20 6f 6e 20 49 4e 53 45 52  allowed on INSER
bcb0: 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44  T, UPDATE, and D
bcc0: 45 4c 45 54 45 20 22 0a 20 20 20 20 20 20 20 20  ELETE ".        
bcd0: 22 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68  "statements with
bce0: 69 6e 20 74 72 69 67 67 65 72 73 22 29 3b 0a 7d  in triggers");.}
bcf0: 0a 0a 2f 2f 20 44 69 73 61 6c 6c 6f 77 20 74 68  ..// Disallow th
bd00: 65 20 49 4e 44 45 58 20 42 59 20 61 6e 64 20 4e  e INDEX BY and N
bd10: 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
bd20: 65 73 20 6f 6e 20 55 50 44 41 54 45 20 61 6e 64  es on UPDATE and
bd30: 20 44 45 4c 45 54 45 0a 2f 2f 20 73 74 61 74 65   DELETE.// state
bd40: 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69  ments within tri
bd50: 67 67 65 72 73 2e 20 20 57 65 20 6d 61 6b 65 20  ggers.  We make 
bd60: 61 20 73 70 65 63 69 66 69 63 20 65 72 72 6f 72  a specific error
bd70: 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 69   message for thi
bd80: 73 0a 2f 2f 20 73 69 6e 63 65 20 69 74 20 69 73  s.// since it is
bd90: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f   an exception to
bda0: 20 74 68 65 20 64 65 66 61 75 6c 74 20 67 72 61   the default gra
bdb0: 6d 6d 61 72 20 72 75 6c 65 73 2e 0a 2f 2f 0a 74  mmar rules..//.t
bdc0: 72 69 64 78 62 79 20 3a 3a 3d 20 2e 0a 74 72 69  ridxby ::= ..tri
bdd0: 64 78 62 79 20 3a 3a 3d 20 49 4e 44 45 58 45 44  dxby ::= INDEXED
bde0: 20 42 59 20 6e 6d 2e 20 7b 0a 20 20 73 71 6c 69   BY nm. {.  sqli
bdf0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
be00: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 74 68 65  se,.        "the
be10: 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
be20: 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  se is not allowe
be30: 64 20 6f 6e 20 55 50 44 41 54 45 20 6f 72 20 44  d on UPDATE or D
be40: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73  ELETE statements
be50: 20 22 0a 20 20 20 20 20 20 20 20 22 77 69 74 68   ".        "with
be60: 69 6e 20 74 72 69 67 67 65 72 73 22 29 3b 0a 7d  in triggers");.}
be70: 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20 4e 4f 54  .tridxby ::= NOT
be80: 20 49 4e 44 45 58 45 44 2e 20 7b 0a 20 20 73 71   INDEXED. {.  sq
be90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
bea0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 74  arse,.        "t
beb0: 68 65 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  he NOT INDEXED c
bec0: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c  lause is not all
bed0: 6f 77 65 64 20 6f 6e 20 55 50 44 41 54 45 20 6f  owed on UPDATE o
bee0: 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
bef0: 6e 74 73 20 22 0a 20 20 20 20 20 20 20 20 22 77  nts ".        "w
bf00: 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 22 29  ithin triggers")
bf10: 3b 0a 7d 0a 0a 0a 0a 25 74 79 70 65 20 74 72 69  ;.}....%type tri
bf20: 67 67 65 72 5f 63 6d 64 20 7b 54 72 69 67 67 65  gger_cmd {Trigge
bf30: 72 53 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63  rStep*}.%destruc
bf40: 74 6f 72 20 74 72 69 67 67 65 72 5f 63 6d 64 20  tor trigger_cmd 
bf50: 7b 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72  {sqlite3DeleteTr
bf60: 69 67 67 65 72 53 74 65 70 28 70 50 61 72 73 65  iggerStep(pParse
bf70: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 2f 2f 20 55  ->db, $$);}.// U
bf80: 50 44 41 54 45 20 0a 74 72 69 67 67 65 72 5f 63  PDATE .trigger_c
bf90: 6d 64 28 41 29 20 3a 3a 3d 0a 20 20 20 55 50 44  md(A) ::=.   UPD
bfa0: 41 54 45 28 42 29 20 6f 72 63 6f 6e 66 28 52 29  ATE(B) orconf(R)
bfb0: 20 74 72 6e 6d 28 58 29 20 74 72 69 64 78 62 79   trnm(X) tridxby
bfc0: 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 20   SET setlist(Y) 
bfd0: 77 68 65 72 65 5f 6f 70 74 28 5a 29 20 73 63 61  where_opt(Z) sca
bfe0: 6e 70 74 28 45 29 2e 20 20 0a 20 20 20 7b 41 20  npt(E).  .   {A 
bff0: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
c000: 55 70 64 61 74 65 53 74 65 70 28 70 50 61 72 73  UpdateStep(pPars
c010: 65 2d 3e 64 62 2c 20 26 58 2c 20 59 2c 20 5a 2c  e->db, &X, Y, Z,
c020: 20 52 2c 20 42 2e 7a 2c 20 45 29 3b 7d 0a 0a 2f   R, B.z, E);}../
c030: 2f 20 49 4e 53 45 52 54 0a 74 72 69 67 67 65 72  / INSERT.trigger
c040: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 73 63 61 6e  _cmd(A) ::= scan
c050: 70 74 28 42 29 20 69 6e 73 65 72 74 5f 63 6d 64  pt(B) insert_cmd
c060: 28 52 29 20 49 4e 54 4f 0a 20 20 20 20 20 20 20  (R) INTO.       
c070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
c080: 72 6e 6d 28 58 29 20 69 64 6c 69 73 74 5f 6f 70  rnm(X) idlist_op
c090: 74 28 46 29 20 73 65 6c 65 63 74 28 53 29 20 73  t(F) select(S) s
c0a0: 63 61 6e 70 74 28 5a 29 2e 0a 20 20 20 7b 41 20  canpt(Z)..   {A 
c0b0: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
c0c0: 49 6e 73 65 72 74 53 74 65 70 28 70 50 61 72 73  InsertStep(pPars
c0d0: 65 2d 3e 64 62 2c 26 58 2c 46 2c 53 2c 52 2c 42  e->db,&X,F,S,R,B
c0e0: 2c 5a 29 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74  ,Z);/*A-overwrit
c0f0: 65 73 2d 52 2a 2f 7d 0a 0a 2f 2f 20 44 45 4c 45  es-R*/}..// DELE
c100: 54 45 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  TE.trigger_cmd(A
c110: 29 20 3a 3a 3d 20 44 45 4c 45 54 45 28 42 29 20  ) ::= DELETE(B) 
c120: 46 52 4f 4d 20 74 72 6e 6d 28 58 29 20 74 72 69  FROM trnm(X) tri
c130: 64 78 62 79 20 77 68 65 72 65 5f 6f 70 74 28 59  dxby where_opt(Y
c140: 29 20 73 63 61 6e 70 74 28 45 29 2e 0a 20 20 20  ) scanpt(E)..   
c150: 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  {A = sqlite3Trig
c160: 67 65 72 44 65 6c 65 74 65 53 74 65 70 28 70 50  gerDeleteStep(pP
c170: 61 72 73 65 2d 3e 64 62 2c 20 26 58 2c 20 59 2c  arse->db, &X, Y,
c180: 20 42 2e 7a 2c 20 45 29 3b 7d 0a 0a 2f 2f 20 53   B.z, E);}..// S
c190: 45 4c 45 43 54 0a 74 72 69 67 67 65 72 5f 63 6d  ELECT.trigger_cm
c1a0: 64 28 41 29 20 3a 3a 3d 20 73 63 61 6e 70 74 28  d(A) ::= scanpt(
c1b0: 42 29 20 73 65 6c 65 63 74 28 58 29 20 73 63 61  B) select(X) sca
c1c0: 6e 70 74 28 45 29 2e 0a 20 20 20 7b 41 20 3d 20  npt(E)..   {A = 
c1d0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 53 65  sqlite3TriggerSe
c1e0: 6c 65 63 74 53 74 65 70 28 70 50 61 72 73 65 2d  lectStep(pParse-
c1f0: 3e 64 62 2c 20 58 2c 20 42 2c 20 45 29 3b 20 2f  >db, X, B, E); /
c200: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a  *A-overwrites-X*
c210: 2f 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63 69  /}..// The speci
c220: 61 6c 20 52 41 49 53 45 20 65 78 70 72 65 73 73  al RAISE express
c230: 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63 63  ion that may occ
c240: 75 72 20 69 6e 20 74 72 69 67 67 65 72 20 70 72  ur in trigger pr
c250: 6f 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20 3a  ograms.expr(A) :
c260: 3a 3d 20 52 41 49 53 45 20 4c 50 20 49 47 4e 4f  := RAISE LP IGNO
c270: 52 45 20 52 50 2e 20 20 7b 0a 20 20 41 20 3d 20  RE RP.  {.  A = 
c280: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
c290: 72 73 65 2c 20 54 4b 5f 52 41 49 53 45 2c 20 30  rse, TK_RAISE, 0
c2a0: 2c 20 30 29 3b 20 0a 20 20 69 66 28 20 41 20 29  , 0); .  if( A )
c2b0: 7b 0a 20 20 20 20 41 2d 3e 61 66 66 69 6e 69 74  {.    A->affinit
c2c0: 79 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 0a 20  y = OE_Ignore;. 
c2d0: 20 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d   }.}.expr(A) ::=
c2e0: 20 52 41 49 53 45 20 4c 50 20 72 61 69 73 65 74   RAISE LP raiset
c2f0: 79 70 65 28 54 29 20 43 4f 4d 4d 41 20 6e 6d 28  ype(T) COMMA nm(
c300: 5a 29 20 52 50 2e 20 20 7b 0a 20 20 41 20 3d 20  Z) RP.  {.  A = 
c310: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
c320: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
c330: 52 41 49 53 45 2c 20 26 5a 2c 20 31 29 3b 20 0a  RAISE, &Z, 1); .
c340: 20 20 69 66 28 20 41 20 29 20 7b 0a 20 20 20 20    if( A ) {.    
c350: 41 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 28 63  A->affinity = (c
c360: 68 61 72 29 54 3b 0a 20 20 7d 0a 7d 0a 25 65 6e  har)T;.  }.}.%en
c370: 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f 4d 49  dif  !SQLITE_OMI
c380: 54 5f 54 52 49 47 47 45 52 0a 0a 25 74 79 70 65  T_TRIGGER..%type
c390: 20 72 61 69 73 65 74 79 70 65 20 7b 69 6e 74 7d   raisetype {int}
c3a0: 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a 3a  .raisetype(A) ::
c3b0: 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b 41 20  = ROLLBACK.  {A 
c3c0: 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b 7d 0a  = OE_Rollback;}.
c3d0: 72 61 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d  raisetype(A) ::=
c3e0: 20 41 42 4f 52 54 2e 20 20 20 20 20 7b 41 20 3d   ABORT.     {A =
c3f0: 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61 69 73   OE_Abort;}.rais
c400: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46 41 49  etype(A) ::= FAI
c410: 4c 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f  L.      {A = OE_
c420: 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f  Fail;}...///////
c430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c440: 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20  /  DROP TRIGGER 
c450: 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f  statement //////
c460: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c470: 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66  ////////.%ifndef
c480: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
c490: 47 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f  GGER.cmd ::= DRO
c4a0: 50 20 54 52 49 47 47 45 52 20 69 66 65 78 69 73  P TRIGGER ifexis
c4b0: 74 73 28 4e 4f 45 52 52 29 20 66 75 6c 6c 6e 61  ts(NOERR) fullna
c4c0: 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74  me(X). {.  sqlit
c4d0: 65 33 44 72 6f 70 54 72 69 67 67 65 72 28 70 50  e3DropTrigger(pP
c4e0: 61 72 73 65 2c 58 2c 4e 4f 45 52 52 29 3b 0a 7d  arse,X,NOERR);.}
c4f0: 0a 25 65 6e 64 69 66 20 20 21 53 51 4c 49 54 45  .%endif  !SQLITE
c500: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f  _OMIT_TRIGGER../
c510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c520: 2f 2f 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 20 44  /////// ATTACH D
c530: 41 54 41 42 41 53 45 20 66 69 6c 65 20 41 53 20  ATABASE file AS 
c540: 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  name ///////////
c550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25  //////////////.%
c560: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c570: 49 54 5f 41 54 54 41 43 48 0a 63 6d 64 20 3a 3a  IT_ATTACH.cmd ::
c580: 3d 20 41 54 54 41 43 48 20 64 61 74 61 62 61 73  = ATTACH databas
c590: 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 46 29  e_kw_opt expr(F)
c5a0: 20 41 53 20 65 78 70 72 28 44 29 20 6b 65 79 5f   AS expr(D) key_
c5b0: 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71 6c 69  opt(K). {.  sqli
c5c0: 74 65 33 41 74 74 61 63 68 28 70 50 61 72 73 65  te3Attach(pParse
c5d0: 2c 20 46 2c 20 44 2c 20 4b 29 3b 0a 7d 0a 63 6d  , F, D, K);.}.cm
c5e0: 64 20 3a 3a 3d 20 44 45 54 41 43 48 20 64 61 74  d ::= DETACH dat
c5f0: 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70  abase_kw_opt exp
c600: 72 28 44 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  r(D). {.  sqlite
c610: 33 44 65 74 61 63 68 28 70 50 61 72 73 65 2c 20  3Detach(pParse, 
c620: 44 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 6b 65 79  D);.}..%type key
c630: 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65  _opt {Expr*}.%de
c640: 73 74 72 75 63 74 6f 72 20 6b 65 79 5f 6f 70 74  structor key_opt
c650: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
c660: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
c670: 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70 74 28 41 29  $$);}.key_opt(A)
c680: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
c690: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
c6a0: 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41 29   0; }.key_opt(A)
c6b0: 20 3a 3a 3d 20 4b 45 59 20 65 78 70 72 28 58 29   ::= KEY expr(X)
c6c0: 2e 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d  .          { A =
c6d0: 20 58 3b 20 7d 0a 0a 64 61 74 61 62 61 73 65 5f   X; }..database_
c6e0: 6b 77 5f 6f 70 74 20 3a 3a 3d 20 44 41 54 41 42  kw_opt ::= DATAB
c6f0: 41 53 45 2e 0a 64 61 74 61 62 61 73 65 5f 6b 77  ASE..database_kw
c700: 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 25 65 6e 64 69  _opt ::= ..%endi
c710: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54  f SQLITE_OMIT_AT
c720: 54 41 43 48 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  TACH..//////////
c730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c740: 20 52 45 49 4e 44 45 58 20 63 6f 6c 6c 61 74 69   REINDEX collati
c750: 6f 6e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  on /////////////
c760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c770: 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51  /////.%ifndef SQ
c780: 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
c790: 58 0a 63 6d 64 20 3a 3a 3d 20 52 45 49 4e 44 45  X.cmd ::= REINDE
c7a0: 58 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X.              
c7b0: 20 20 7b 73 71 6c 69 74 65 33 52 65 69 6e 64 65    {sqlite3Reinde
c7c0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  x(pParse, 0, 0);
c7d0: 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45 49 4e 44 45  }.cmd ::= REINDE
c7e0: 58 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e  X nm(X) dbnm(Y).
c7f0: 20 20 7b 73 71 6c 69 74 65 33 52 65 69 6e 64 65    {sqlite3Reinde
c800: 78 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59  x(pParse, &X, &Y
c810: 29 3b 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49  );}.%endif  SQLI
c820: 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
c830: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
c840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c850: 2f 2f 2f 2f 20 41 4e 41 4c 59 5a 45 20 2f 2f 2f  //// ANALYZE ///
c860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c880: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
c890: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 63 6d 64  OMIT_ANALYZE.cmd
c8a0: 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 2e 20 20 20   ::= ANALYZE.   
c8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
c8c0: 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70 50 61  lite3Analyze(pPa
c8d0: 72 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63 6d 64  rse, 0, 0);}.cmd
c8e0: 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 20 6e 6d 28   ::= ANALYZE nm(
c8f0: 58 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b 73 71  X) dbnm(Y).  {sq
c900: 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70 50 61  lite3Analyze(pPa
c910: 72 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d 0a 25  rse, &X, &Y);}.%
c920: 65 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  endif../////////
c930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
c940: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 61 62 6c  ALTER TABLE tabl
c950: 65 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  e ... //////////
c960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c970: 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53  //////.%ifndef S
c980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
c990: 54 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20 41 4c  TABLE.cmd ::= AL
c9a0: 54 45 52 20 54 41 42 4c 45 20 66 75 6c 6c 6e 61  TER TABLE fullna
c9b0: 6d 65 28 58 29 20 52 45 4e 41 4d 45 20 54 4f 20  me(X) RENAME TO 
c9c0: 6e 6d 28 5a 29 2e 20 7b 0a 20 20 73 71 6c 69 74  nm(Z). {.  sqlit
c9d0: 65 33 41 6c 74 65 72 52 65 6e 61 6d 65 54 61 62  e3AlterRenameTab
c9e0: 6c 65 28 70 50 61 72 73 65 2c 58 2c 26 5a 29 3b  le(pParse,X,&Z);
c9f0: 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4c 54 45 52  .}.cmd ::= ALTER
ca00: 20 54 41 42 4c 45 20 61 64 64 5f 63 6f 6c 75 6d   TABLE add_colum
ca10: 6e 5f 66 75 6c 6c 6e 61 6d 65 0a 20 20 20 20 20  n_fullname.     
ca20: 20 20 20 41 44 44 20 6b 77 63 6f 6c 75 6d 6e 5f     ADD kwcolumn_
ca30: 6f 70 74 20 63 6f 6c 75 6d 6e 6e 61 6d 65 28 59  opt columnname(Y
ca40: 29 20 63 61 72 67 6c 69 73 74 2e 20 7b 0a 20 20  ) carglist. {.  
ca50: 59 2e 6e 20 3d 20 28 69 6e 74 29 28 70 50 61 72  Y.n = (int)(pPar
ca60: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a  se->sLastToken.z
ca70: 2d 59 2e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e  -Y.z) + pParse->
ca80: 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20 20  sLastToken.n;.  
ca90: 73 71 6c 69 74 65 33 41 6c 74 65 72 46 69 6e 69  sqlite3AlterFini
caa0: 73 68 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72  shAddColumn(pPar
cab0: 73 65 2c 20 26 59 29 3b 0a 7d 0a 61 64 64 5f 63  se, &Y);.}.add_c
cac0: 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 3a  olumn_fullname :
cad0: 3a 3d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20  := fullname(X). 
cae0: 7b 0a 20 20 64 69 73 61 62 6c 65 4c 6f 6f 6b 61  {.  disableLooka
caf0: 73 69 64 65 28 70 50 61 72 73 65 29 3b 0a 20 20  side(pParse);.  
cb00: 73 71 6c 69 74 65 33 41 6c 74 65 72 42 65 67 69  sqlite3AlterBegi
cb10: 6e 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73  nAddColumn(pPars
cb20: 65 2c 20 58 29 3b 0a 7d 0a 6b 77 63 6f 6c 75 6d  e, X);.}.kwcolum
cb30: 6e 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 6b 77 63 6f  n_opt ::= ..kwco
cb40: 6c 75 6d 6e 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4c  lumn_opt ::= COL
cb50: 55 4d 4e 4b 57 2e 0a 25 65 6e 64 69 66 20 20 53  UMNKW..%endif  S
cb60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
cb70: 54 41 42 4c 45 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  TABLE../////////
cb80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
cb90: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
cba0: 41 42 4c 45 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f  ABLE ... ///////
cbb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cbc0: 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53  //////.%ifndef S
cbd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
cbe0: 41 4c 54 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20  ALTABLE.cmd ::= 
cbf0: 63 72 65 61 74 65 5f 76 74 61 62 2e 20 20 20 20  create_vtab.    
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 46     {sqlite3VtabF
cc20: 69 6e 69 73 68 50 61 72 73 65 28 70 50 61 72 73  inishParse(pPars
cc30: 65 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 63  e,0);}.cmd ::= c
cc40: 72 65 61 74 65 5f 76 74 61 62 20 4c 50 20 76 74  reate_vtab LP vt
cc50: 61 62 61 72 67 6c 69 73 74 20 52 50 28 58 29 2e  abarglist RP(X).
cc60: 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 46 69    {sqlite3VtabFi
cc70: 6e 69 73 68 50 61 72 73 65 28 70 50 61 72 73 65  nishParse(pParse
cc80: 2c 26 58 29 3b 7d 0a 63 72 65 61 74 65 5f 76 74  ,&X);}.create_vt
cc90: 61 62 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 20  ab ::= createkw 
cca0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 69 66  VIRTUAL TABLE if
ccb0: 6e 6f 74 65 78 69 73 74 73 28 45 29 0a 20 20 20  notexists(E).   
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6d 28               nm(
ccd0: 58 29 20 64 62 6e 6d 28 59 29 20 55 53 49 4e 47  X) dbnm(Y) USING
cce0: 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 20 20 73 71   nm(Z). {.    sq
ccf0: 6c 69 74 65 33 56 74 61 62 42 65 67 69 6e 50 61  lite3VtabBeginPa
cd00: 72 73 65 28 70 50 61 72 73 65 2c 20 26 58 2c 20  rse(pParse, &X, 
cd10: 26 59 2c 20 26 5a 2c 20 45 29 3b 0a 7d 0a 76 74  &Y, &Z, E);.}.vt
cd20: 61 62 61 72 67 6c 69 73 74 20 3a 3a 3d 20 76 74  abarglist ::= vt
cd30: 61 62 61 72 67 2e 0a 76 74 61 62 61 72 67 6c 69  abarg..vtabargli
cd40: 73 74 20 3a 3a 3d 20 76 74 61 62 61 72 67 6c 69  st ::= vtabargli
cd50: 73 74 20 43 4f 4d 4d 41 20 76 74 61 62 61 72 67  st COMMA vtabarg
cd60: 2e 0a 76 74 61 62 61 72 67 20 3a 3a 3d 20 2e 20  ..vtabarg ::= . 
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74        {sqlite3Vt
cd90: 61 62 41 72 67 49 6e 69 74 28 70 50 61 72 73 65  abArgInit(pParse
cda0: 29 3b 7d 0a 76 74 61 62 61 72 67 20 3a 3a 3d 20  );}.vtabarg ::= 
cdb0: 76 74 61 62 61 72 67 20 76 74 61 62 61 72 67 74  vtabarg vtabargt
cdc0: 6f 6b 65 6e 2e 0a 76 74 61 62 61 72 67 74 6f 6b  oken..vtabargtok
cdd0: 65 6e 20 3a 3a 3d 20 41 4e 59 28 58 29 2e 20 20  en ::= ANY(X).  
cde0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
cdf0: 65 33 56 74 61 62 41 72 67 45 78 74 65 6e 64 28  e3VtabArgExtend(
ce00: 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 76 74 61  pParse,&X);}.vta
ce10: 62 61 72 67 74 6f 6b 65 6e 20 3a 3a 3d 20 6c 70  bargtoken ::= lp
ce20: 20 61 6e 79 6c 69 73 74 20 52 50 28 58 29 2e 20   anylist RP(X). 
ce30: 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67   {sqlite3VtabArg
ce40: 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58  Extend(pParse,&X
ce50: 29 3b 7d 0a 6c 70 20 3a 3a 3d 20 4c 50 28 58 29  );}.lp ::= LP(X)
ce60: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ce70: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
ce80: 56 74 61 62 41 72 67 45 78 74 65 6e 64 28 70 50  VtabArgExtend(pP
ce90: 61 72 73 65 2c 26 58 29 3b 7d 0a 61 6e 79 6c 69  arse,&X);}.anyli
cea0: 73 74 20 3a 3a 3d 20 2e 0a 61 6e 79 6c 69 73 74  st ::= ..anylist
ceb0: 20 3a 3a 3d 20 61 6e 79 6c 69 73 74 20 4c 50 20   ::= anylist LP 
cec0: 61 6e 79 6c 69 73 74 20 52 50 2e 0a 61 6e 79 6c  anylist RP..anyl
ced0: 69 73 74 20 3a 3a 3d 20 61 6e 79 6c 69 73 74 20  ist ::= anylist 
cee0: 41 4e 59 2e 0a 25 65 6e 64 69 66 20 20 53 51 4c  ANY..%endif  SQL
cef0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
cf00: 54 41 42 4c 45 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  TABLE...////////
cf10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cf20: 20 43 4f 4d 4d 4f 4e 20 54 41 42 4c 45 20 45 58   COMMON TABLE EX
cf30: 50 52 45 53 53 49 4f 4e 53 20 2f 2f 2f 2f 2f 2f  PRESSIONS //////
cf40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cf50: 2f 2f 2f 2f 2f 2f 0a 25 74 79 70 65 20 77 69 74  //////.%type wit
cf60: 68 20 7b 57 69 74 68 2a 7d 0a 25 74 79 70 65 20  h {With*}.%type 
cf70: 77 71 6c 69 73 74 20 7b 57 69 74 68 2a 7d 0a 25  wqlist {With*}.%
cf80: 64 65 73 74 72 75 63 74 6f 72 20 77 69 74 68 20  destructor with 
cf90: 7b 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65  {sqlite3WithDele
cfa0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
cfb0: 24 29 3b 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  $);}.%destructor
cfc0: 20 77 71 6c 69 73 74 20 7b 73 71 6c 69 74 65 33   wqlist {sqlite3
cfd0: 57 69 74 68 44 65 6c 65 74 65 28 70 50 61 72 73  WithDelete(pPars
cfe0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 77 69  e->db, $$);}..wi
cff0: 74 68 28 41 29 20 3a 3a 3d 20 2e 20 7b 41 20 3d  th(A) ::= . {A =
d000: 20 30 3b 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c   0;}.%ifndef SQL
d010: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 77 69 74  ITE_OMIT_CTE.wit
d020: 68 28 41 29 20 3a 3a 3d 20 57 49 54 48 20 77 71  h(A) ::= WITH wq
d030: 6c 69 73 74 28 57 29 2e 20 20 20 20 20 20 20 20  list(W).        
d040: 20 20 20 20 20 20 7b 20 41 20 3d 20 57 3b 20 7d        { A = W; }
d050: 0a 77 69 74 68 28 41 29 20 3a 3a 3d 20 57 49 54  .with(A) ::= WIT
d060: 48 20 52 45 43 55 52 53 49 56 45 20 77 71 6c 69  H RECURSIVE wqli
d070: 73 74 28 57 29 2e 20 20 20 20 7b 20 41 20 3d 20  st(W).    { A = 
d080: 57 3b 20 7d 0a 0a 77 71 6c 69 73 74 28 41 29 20  W; }..wqlist(A) 
d090: 3a 3a 3d 20 6e 6d 28 58 29 20 65 69 64 6c 69 73  ::= nm(X) eidlis
d0a0: 74 5f 6f 70 74 28 59 29 20 41 53 20 4c 50 20 73  t_opt(Y) AS LP s
d0b0: 65 6c 65 63 74 28 5a 29 20 52 50 2e 20 7b 0a 20  elect(Z) RP. {. 
d0c0: 20 41 20 3d 20 73 71 6c 69 74 65 33 57 69 74 68   A = sqlite3With
d0d0: 41 64 64 28 70 50 61 72 73 65 2c 20 30 2c 20 26  Add(pParse, 0, &
d0e0: 58 2c 20 59 2c 20 5a 29 3b 20 2f 2a 41 2d 6f 76  X, Y, Z); /*A-ov
d0f0: 65 72 77 72 69 74 65 73 2d 58 2a 2f 0a 7d 0a 77  erwrites-X*/.}.w
d100: 71 6c 69 73 74 28 41 29 20 3a 3a 3d 20 77 71 6c  qlist(A) ::= wql
d110: 69 73 74 28 41 29 20 43 4f 4d 4d 41 20 6e 6d 28  ist(A) COMMA nm(
d120: 58 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28 59  X) eidlist_opt(Y
d130: 29 20 41 53 20 4c 50 20 73 65 6c 65 63 74 28 5a  ) AS LP select(Z
d140: 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73 71  ) RP. {.  A = sq
d150: 6c 69 74 65 33 57 69 74 68 41 64 64 28 70 50 61  lite3WithAdd(pPa
d160: 72 73 65 2c 20 41 2c 20 26 58 2c 20 59 2c 20 5a  rse, A, &X, Y, Z
d170: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  );.}.%endif  SQL
d180: 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a           ITE_OMIT_CTE.