/ Hex Artifact Content
Login

Artifact d12dad9be6676ec6d71375ee4daf12446479c37c3e67b5d161ced94770ed891f:


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 63 6d 64 78 20 53 45 4d  cmd ::= cmdx SEM
0cc0: 49 2e 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  I..%ifndef SQLIT
0cd0: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 65  E_OMIT_EXPLAIN.e
0ce0: 63 6d 64 20 3a 3a 3d 20 65 78 70 6c 61 69 6e 20  cmd ::= explain 
0cf0: 63 6d 64 78 2e 0a 65 78 70 6c 61 69 6e 20 3a 3a  cmdx..explain ::
0d00: 3d 20 45 58 50 4c 41 49 4e 2e 20 20 20 20 20 20  = EXPLAIN.      
0d10: 20 20 20 20 20 20 20 20 7b 20 70 50 61 72 73 65          { pParse
0d20: 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 31 3b 20 7d  ->explain = 1; }
0d30: 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50  .explain ::= EXP
0d40: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
0d50: 20 20 20 7b 20 70 50 61 72 73 65 2d 3e 65 78 70     { pParse->exp
0d60: 6c 61 69 6e 20 3d 20 32 3b 20 7d 0a 25 65 6e 64  lain = 2; }.%end
0d70: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
0d80: 45 58 50 4c 41 49 4e 0a 63 6d 64 78 20 3a 3a 3d  EXPLAIN.cmdx ::=
0d90: 20 63 6d 64 2e 20 20 20 20 20 20 20 20 20 20 20   cmd.           
0da0: 7b 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  { sqlite3FinishC
0db0: 6f 64 69 6e 67 28 70 50 61 72 73 65 29 3b 20 7d  oding(pParse); }
0dc0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
0dd0: 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69 6e 20 61 6e  /////// Begin an
0de0: 64 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  d end transactio
0df0: 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ns. ////////////
0e00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e10: 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 42 45 47  .//..cmd ::= BEG
0e20: 49 4e 20 74 72 61 6e 73 74 79 70 65 28 59 29 20  IN transtype(Y) 
0e30: 74 72 61 6e 73 5f 6f 70 74 2e 20 20 7b 73 71 6c  trans_opt.  {sql
0e40: 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
0e50: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 59 29 3b  tion(pParse, Y);
0e60: 7d 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20  }.trans_opt ::= 
0e70: 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20  ..trans_opt ::= 
0e80: 54 52 41 4e 53 41 43 54 49 4f 4e 2e 0a 74 72 61  TRANSACTION..tra
0e90: 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53  ns_opt ::= TRANS
0ea0: 41 43 54 49 4f 4e 20 6e 6d 2e 0a 25 74 79 70 65  ACTION nm..%type
0eb0: 20 74 72 61 6e 73 74 79 70 65 20 7b 69 6e 74 7d   transtype {int}
0ec0: 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a  .transtype(A) ::
0ed0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
0ee0: 7b 41 20 3d 20 54 4b 5f 44 45 46 45 52 52 45 44  {A = TK_DEFERRED
0ef0: 3b 7d 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20  ;}.transtype(A) 
0f00: 3a 3a 3d 20 44 45 46 45 52 52 45 44 28 58 29 2e  ::= DEFERRED(X).
0f10: 20 20 7b 41 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f    {A = @X; /*A-o
0f20: 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 74  verwrites-X*/}.t
0f30: 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20  ranstype(A) ::= 
0f40: 49 4d 4d 45 44 49 41 54 45 28 58 29 2e 20 7b 41  IMMEDIATE(X). {A
0f50: 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 77   = @X; /*A-overw
0f60: 72 69 74 65 73 2d 58 2a 2f 7d 0a 74 72 61 6e 73  rites-X*/}.trans
0f70: 74 79 70 65 28 41 29 20 3a 3a 3d 20 45 58 43 4c  type(A) ::= EXCL
0f80: 55 53 49 56 45 28 58 29 2e 20 7b 41 20 3d 20 40  USIVE(X). {A = @
0f90: 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65  X; /*A-overwrite
0fa0: 73 2d 58 2a 2f 7d 0a 63 6d 64 20 3a 3a 3d 20 43  s-X*/}.cmd ::= C
0fb0: 4f 4d 4d 49 54 7c 45 4e 44 28 58 29 20 74 72 61  OMMIT|END(X) tra
0fc0: 6e 73 5f 6f 70 74 2e 20 20 20 7b 73 71 6c 69 74  ns_opt.   {sqlit
0fd0: 65 33 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  e3EndTransaction
0fe0: 28 70 50 61 72 73 65 2c 40 58 29 3b 7d 0a 63 6d  (pParse,@X);}.cm
0ff0: 64 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 28 58  d ::= ROLLBACK(X
1000: 29 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20  ) trans_opt.    
1010: 20 7b 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e   {sqlite3EndTran
1020: 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 40  saction(pParse,@
1030: 58 29 3b 7d 0a 0a 73 61 76 65 70 6f 69 6e 74 5f  X);}..savepoint_
1040: 6f 70 74 20 3a 3a 3d 20 53 41 56 45 50 4f 49 4e  opt ::= SAVEPOIN
1050: 54 2e 0a 73 61 76 65 70 6f 69 6e 74 5f 6f 70 74  T..savepoint_opt
1060: 20 3a 3a 3d 20 2e 0a 63 6d 64 20 3a 3a 3d 20 53   ::= ..cmd ::= S
1070: 41 56 45 50 4f 49 4e 54 20 6e 6d 28 58 29 2e 20  AVEPOINT nm(X). 
1080: 7b 0a 20 20 73 71 6c 69 74 65 33 53 61 76 65 70  {.  sqlite3Savep
1090: 6f 69 6e 74 28 70 50 61 72 73 65 2c 20 53 41 56  oint(pParse, SAV
10a0: 45 50 4f 49 4e 54 5f 42 45 47 49 4e 2c 20 26 58  EPOINT_BEGIN, &X
10b0: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45 4c  );.}.cmd ::= REL
10c0: 45 41 53 45 20 73 61 76 65 70 6f 69 6e 74 5f 6f  EASE savepoint_o
10d0: 70 74 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71  pt nm(X). {.  sq
10e0: 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 70  lite3Savepoint(p
10f0: 50 61 72 73 65 2c 20 53 41 56 45 50 4f 49 4e 54  Parse, SAVEPOINT
1100: 5f 52 45 4c 45 41 53 45 2c 20 26 58 29 3b 0a 7d  _RELEASE, &X);.}
1110: 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43  .cmd ::= ROLLBAC
1120: 4b 20 74 72 61 6e 73 5f 6f 70 74 20 54 4f 20 73  K trans_opt TO s
1130: 61 76 65 70 6f 69 6e 74 5f 6f 70 74 20 6e 6d 28  avepoint_opt nm(
1140: 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 53  X). {.  sqlite3S
1150: 61 76 65 70 6f 69 6e 74 28 70 50 61 72 73 65 2c  avepoint(pParse,
1160: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
1170: 41 43 4b 2c 20 26 58 29 3b 0a 7d 0a 0a 2f 2f 2f  ACK, &X);.}..///
1180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1190: 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 54 41  // The CREATE TA
11a0: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f  BLE 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 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
11d0: 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61 62  d ::= create_tab
11e0: 6c 65 20 63 72 65 61 74 65 5f 74 61 62 6c 65 5f  le create_table_
11f0: 61 72 67 73 2e 0a 63 72 65 61 74 65 5f 74 61 62  args..create_tab
1200: 6c 65 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 20  le ::= createkw 
1210: 74 65 6d 70 28 54 29 20 54 41 42 4c 45 20 69 66  temp(T) TABLE if
1220: 6e 6f 74 65 78 69 73 74 73 28 45 29 20 6e 6d 28  notexists(E) nm(
1230: 59 29 20 64 62 6e 6d 28 5a 29 2e 20 7b 0a 20 20  Y) dbnm(Z). {.  
1240: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
1250: 6c 65 28 70 50 61 72 73 65 2c 26 59 2c 26 5a 2c  le(pParse,&Y,&Z,
1260: 54 2c 30 2c 30 2c 45 29 3b 0a 7d 0a 63 72 65 61  T,0,0,E);.}.crea
1270: 74 65 6b 77 28 41 29 20 3a 3a 3d 20 43 52 45 41  tekw(A) ::= CREA
1280: 54 45 28 41 29 2e 20 20 7b 64 69 73 61 62 6c 65  TE(A).  {disable
1290: 4c 6f 6f 6b 61 73 69 64 65 28 70 50 61 72 73 65  Lookaside(pParse
12a0: 29 3b 7d 0a 0a 25 74 79 70 65 20 69 66 6e 6f 74  );}..%type ifnot
12b0: 65 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66 6e  exists {int}.ifn
12c0: 6f 74 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20  otexists(A) ::= 
12d0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
12e0: 41 20 3d 20 30 3b 7d 0a 69 66 6e 6f 74 65 78 69  A = 0;}.ifnotexi
12f0: 73 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 4e 4f  sts(A) ::= IF NO
1300: 54 20 45 58 49 53 54 53 2e 20 7b 41 20 3d 20 31  T EXISTS. {A = 1
1310: 3b 7d 0a 25 74 79 70 65 20 74 65 6d 70 20 7b 69  ;}.%type temp {i
1320: 6e 74 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  nt}.%ifndef SQLI
1330: 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 74  TE_OMIT_TEMPDB.t
1340: 65 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e  emp(A) ::= TEMP.
1350: 20 20 7b 41 20 3d 20 31 3b 7d 0a 25 65 6e 64 69    {A = 1;}.%endi
1360: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  f  SQLITE_OMIT_T
1370: 45 4d 50 44 42 0a 74 65 6d 70 28 41 29 20 3a 3a  EMPDB.temp(A) ::
1380: 3d 20 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b  = .      {A = 0;
1390: 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61  }.create_table_a
13a0: 72 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d  rgs ::= LP colum
13b0: 6e 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74 5f 6f  nlist conslist_o
13c0: 70 74 28 58 29 20 52 50 28 45 29 20 74 61 62 6c  pt(X) RP(E) tabl
13d0: 65 5f 6f 70 74 69 6f 6e 73 28 46 29 2e 20 7b 0a  e_options(F). {.
13e0: 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
13f0: 65 28 70 50 61 72 73 65 2c 26 58 2c 26 45 2c 46  e(pParse,&X,&E,F
1400: 2c 30 29 3b 0a 7d 0a 63 72 65 61 74 65 5f 74 61  ,0);.}.create_ta
1410: 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 41 53 20  ble_args ::= AS 
1420: 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73  select(S). {.  s
1430: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70  qlite3EndTable(p
1440: 50 61 72 73 65 2c 30 2c 30 2c 30 2c 53 29 3b 0a  Parse,0,0,0,S);.
1450: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
1460: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
1470: 2c 20 53 29 3b 0a 7d 0a 25 74 79 70 65 20 74 61  , S);.}.%type ta
1480: 62 6c 65 5f 6f 70 74 69 6f 6e 73 20 7b 69 6e 74  ble_options {int
1490: 7d 0a 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73 28  }.table_options(
14a0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 7b 41 20 3d  A) ::= .    {A =
14b0: 20 30 3b 7d 0a 74 61 62 6c 65 5f 6f 70 74 69 6f   0;}.table_optio
14c0: 6e 73 28 41 29 20 3a 3a 3d 20 57 49 54 48 4f 55  ns(A) ::= WITHOU
14d0: 54 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 69 66 28  T nm(X). {.  if(
14e0: 20 58 2e 6e 3d 3d 35 20 26 26 20 73 71 6c 69 74   X.n==5 && sqlit
14f0: 65 33 5f 73 74 72 6e 69 63 6d 70 28 58 2e 7a 2c  e3_strnicmp(X.z,
1500: 22 72 6f 77 69 64 22 2c 35 29 3d 3d 30 20 29 7b  "rowid",5)==0 ){
1510: 0a 20 20 20 20 41 20 3d 20 54 46 5f 57 69 74 68  .    A = TF_With
1520: 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f  outRowid | TF_No
1530: 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20  VisibleRowid;.  
1540: 7d 65 6c 73 65 7b 0a 20 20 20 20 41 20 3d 20 30  }else{.    A = 0
1550: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
1560: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1570: 6e 6b 6e 6f 77 6e 20 74 61 62 6c 65 20 6f 70 74  nknown table opt
1580: 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 58 2e 6e 2c  ion: %.*s", X.n,
1590: 20 58 2e 7a 29 3b 0a 20 20 7d 0a 7d 0a 63 6f 6c   X.z);.  }.}.col
15a0: 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 75  umnlist ::= colu
15b0: 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63 6f 6c  mnlist COMMA col
15c0: 75 6d 6e 6e 61 6d 65 20 63 61 72 67 6c 69 73 74  umnname carglist
15d0: 2e 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d  ..columnlist ::=
15e0: 20 63 6f 6c 75 6d 6e 6e 61 6d 65 20 63 61 72 67   columnname carg
15f0: 6c 69 73 74 2e 0a 63 6f 6c 75 6d 6e 6e 61 6d 65  list..columnname
1600: 28 41 29 20 3a 3a 3d 20 6e 6d 28 41 29 20 74 79  (A) ::= nm(A) ty
1610: 70 65 74 6f 6b 65 6e 28 59 29 2e 20 7b 73 71 6c  petoken(Y). {sql
1620: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70 50  ite3AddColumn(pP
1630: 61 72 73 65 2c 26 41 2c 26 59 29 3b 7d 0a 0a 2f  arse,&A,&Y);}../
1640: 2f 20 44 65 63 6c 61 72 65 20 73 6f 6d 65 20 74  / Declare some t
1650: 6f 6b 65 6e 73 20 65 61 72 6c 79 20 69 6e 20 6f  okens early in o
1660: 72 64 65 72 20 74 6f 20 69 6e 66 6c 75 65 6e 63  rder to influenc
1670: 65 20 74 68 65 69 72 20 76 61 6c 75 65 73 2c 20  e their values, 
1680: 74 6f 20 0a 2f 2f 20 69 6d 70 72 6f 76 65 20 70  to .// improve p
1690: 65 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 72  erformance and r
16a0: 65 64 75 63 65 20 74 68 65 20 65 78 65 63 75 74  educe the execut
16b0: 61 62 6c 65 20 73 69 7a 65 2e 20 20 54 68 65 20  able size.  The 
16c0: 67 6f 61 6c 20 68 65 72 65 20 69 73 0a 2f 2f 20  goal here is.// 
16d0: 74 6f 20 67 65 74 20 74 68 65 20 22 6a 75 6d 70  to get the "jump
16e0: 22 20 6f 70 65 72 61 74 69 6f 6e 73 20 69 6e 20  " operations in 
16f0: 49 53 4e 55 4c 4c 20 74 68 72 6f 75 67 68 20 45  ISNULL through E
1700: 53 43 41 50 45 20 74 6f 20 68 61 76 65 20 6e 75  SCAPE to have nu
1710: 6d 65 72 69 63 0a 2f 2f 20 76 61 6c 75 65 73 20  meric.// values 
1720: 74 68 61 74 20 61 72 65 20 65 61 72 6c 79 20 65  that are early e
1730: 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 6c  nough so that al
1740: 6c 20 6a 75 6d 70 20 6f 70 65 72 61 74 69 6f 6e  l jump operation
1750: 73 20 61 72 65 20 63 6c 75 73 74 65 72 65 64 0a  s are clustered.
1760: 2f 2f 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  // at the beginn
1770: 69 6e 67 2c 20 62 75 74 20 61 6c 73 6f 20 73 6f  ing, but also so
1780: 20 74 68 61 74 20 74 68 65 20 63 6f 6d 70 61 72   that the compar
1790: 69 73 6f 6e 20 74 6f 6b 65 6e 73 20 4e 45 20 74  ison tokens NE t
17a0: 68 72 6f 75 67 68 20 47 45 0a 2f 2f 20 61 72 65  hrough GE.// are
17b0: 20 61 73 20 6c 61 72 67 65 20 61 73 20 70 6f 73   as large as pos
17c0: 73 69 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68  sible so that th
17d0: 65 79 20 61 72 65 20 6e 65 61 72 20 74 6f 20 46  ey are near to F
17e0: 55 4e 43 54 49 4f 4e 2c 20 77 68 69 63 68 20 69  UNCTION, which i
17f0: 73 20 61 0a 2f 2f 20 74 6f 6b 65 6e 20 73 79 6e  s a.// token syn
1800: 74 68 65 73 69 7a 65 64 20 62 79 20 61 64 64 6f  thesized by addo
1810: 70 63 6f 64 65 73 2e 74 63 6c 2e 0a 2f 2f 0a 25  pcodes.tcl..//.%
1820: 74 6f 6b 65 6e 20 41 42 4f 52 54 20 41 43 54 49  token ABORT ACTI
1830: 4f 4e 20 41 46 54 45 52 20 41 4e 41 4c 59 5a 45  ON AFTER ANALYZE
1840: 20 41 53 43 20 41 54 54 41 43 48 20 42 45 46 4f   ASC ATTACH BEFO
1850: 52 45 20 42 45 47 49 4e 20 42 59 20 43 41 53 43  RE BEGIN BY CASC
1860: 41 44 45 20 43 41 53 54 2e 0a 25 74 6f 6b 65 6e  ADE CAST..%token
1870: 20 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42 41   CONFLICT DATABA
1880: 53 45 20 44 45 46 45 52 52 45 44 20 44 45 53 43  SE DEFERRED DESC
1890: 20 44 45 54 41 43 48 20 45 41 43 48 20 45 4e 44   DETACH EACH END
18a0: 20 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c 41   EXCLUSIVE EXPLA
18b0: 49 4e 20 46 41 49 4c 2e 0a 25 74 6f 6b 65 6e 20  IN FAIL..%token 
18c0: 4f 52 20 41 4e 44 20 4e 4f 54 20 49 53 20 4d 41  OR AND NOT IS MA
18d0: 54 43 48 20 4c 49 4b 45 5f 4b 57 20 42 45 54 57  TCH LIKE_KW BETW
18e0: 45 45 4e 20 49 4e 20 49 53 4e 55 4c 4c 20 4e 4f  EEN IN ISNULL NO
18f0: 54 4e 55 4c 4c 20 4e 45 20 45 51 2e 0a 25 74 6f  TNULL NE EQ..%to
1900: 6b 65 6e 20 47 54 20 4c 45 20 4c 54 20 47 45 20  ken GT LE LT GE 
1910: 45 53 43 41 50 45 2e 0a 0a 2f 2f 20 54 68 65 20  ESCAPE...// The 
1920: 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 72 65 63 74  following direct
1930: 69 76 65 20 63 61 75 73 65 73 20 74 6f 6b 65 6e  ive causes token
1940: 73 20 41 42 4f 52 54 2c 20 41 46 54 45 52 2c 20  s ABORT, AFTER, 
1950: 41 53 43 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20  ASC, etc. to.// 
1960: 66 61 6c 6c 62 61 63 6b 20 74 6f 20 49 44 20 69  fallback to ID i
1970: 66 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20  f they will not 
1980: 70 61 72 73 65 20 61 73 20 74 68 65 69 72 20 6f  parse as their o
1990: 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f  riginal value../
19a0: 2f 20 54 68 69 73 20 6f 62 76 69 61 74 65 73 20  / This obviates 
19b0: 74 68 65 20 6e 65 65 64 20 66 6f 72 20 74 68 65  the need for the
19c0: 20 22 69 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61   "id" nontermina
19d0: 6c 2e 0a 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20  l..//.%fallback 
19e0: 49 44 0a 20 20 41 42 4f 52 54 20 41 43 54 49 4f  ID.  ABORT ACTIO
19f0: 4e 20 41 46 54 45 52 20 41 4e 41 4c 59 5a 45 20  N AFTER ANALYZE 
1a00: 41 53 43 20 41 54 54 41 43 48 20 42 45 46 4f 52  ASC ATTACH BEFOR
1a10: 45 20 42 45 47 49 4e 20 42 59 20 43 41 53 43 41  E BEGIN BY CASCA
1a20: 44 45 20 43 41 53 54 20 43 4f 4c 55 4d 4e 4b 57  DE CAST COLUMNKW
1a30: 0a 20 20 43 4f 4e 46 4c 49 43 54 20 44 41 54 41  .  CONFLICT DATA
1a40: 42 41 53 45 20 44 45 46 45 52 52 45 44 20 44 45  BASE DEFERRED DE
1a50: 53 43 20 44 45 54 41 43 48 20 44 4f 20 45 41 43  SC DETACH DO EAC
1a60: 48 20 45 4e 44 20 45 58 43 4c 55 53 49 56 45 20  H END EXCLUSIVE 
1a70: 45 58 50 4c 41 49 4e 20 46 41 49 4c 20 46 4f 52  EXPLAIN FAIL FOR
1a80: 0a 20 20 49 47 4e 4f 52 45 20 49 4d 4d 45 44 49  .  IGNORE IMMEDI
1a90: 41 54 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4e  ATE INITIALLY IN
1aa0: 53 54 45 41 44 20 4c 49 4b 45 5f 4b 57 20 4d 41  STEAD LIKE_KW MA
1ab0: 54 43 48 20 4e 4f 20 50 4c 41 4e 0a 20 20 51 55  TCH NO PLAN.  QU
1ac0: 45 52 59 20 4b 45 59 20 4f 46 20 4f 46 46 53 45  ERY KEY OF OFFSE
1ad0: 54 20 50 52 41 47 4d 41 20 52 41 49 53 45 20 52  T PRAGMA RAISE R
1ae0: 45 43 55 52 53 49 56 45 20 52 45 4c 45 41 53 45  ECURSIVE RELEASE
1af0: 20 52 45 50 4c 41 43 45 20 52 45 53 54 52 49 43   REPLACE RESTRIC
1b00: 54 20 52 4f 57 0a 20 20 52 4f 4c 4c 42 41 43 4b  T ROW.  ROLLBACK
1b10: 20 53 41 56 45 50 4f 49 4e 54 20 54 45 4d 50 20   SAVEPOINT TEMP 
1b20: 54 52 49 47 47 45 52 20 56 41 43 55 55 4d 20 56  TRIGGER VACUUM V
1b30: 49 45 57 20 56 49 52 54 55 41 4c 20 57 49 54 48  IEW VIRTUAL WITH
1b40: 20 57 49 54 48 4f 55 54 0a 25 69 66 64 65 66 20   WITHOUT.%ifdef 
1b50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
1b60: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 45 58  OUND_SELECT.  EX
1b70: 43 45 50 54 20 49 4e 54 45 52 53 45 43 54 20 55  CEPT INTERSECT U
1b80: 4e 49 4f 4e 0a 25 65 6e 64 69 66 20 53 51 4c 49  NION.%endif SQLI
1b90: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
1ba0: 5f 53 45 4c 45 43 54 0a 20 20 52 45 49 4e 44 45  _SELECT.  REINDE
1bb0: 58 20 52 45 4e 41 4d 45 20 43 54 49 4d 45 5f 4b  X RENAME CTIME_K
1bc0: 57 20 49 46 0a 20 20 2e 0a 25 77 69 6c 64 63 61  W IF.  ..%wildca
1bd0: 72 64 20 41 4e 59 2e 0a 0a 2f 2f 20 44 65 66 69  rd ANY...// Defi
1be0: 6e 65 20 6f 70 65 72 61 74 6f 72 20 70 72 65 63  ne operator prec
1bf0: 65 64 65 6e 63 65 20 65 61 72 6c 79 20 73 6f 20  edence early so 
1c00: 74 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65  that this is the
1c10: 20 66 69 72 73 74 20 6f 63 63 75 72 72 65 6e 63   first occurrenc
1c20: 65 0a 2f 2f 20 6f 66 20 74 68 65 20 6f 70 65 72  e.// of the oper
1c30: 61 74 6f 72 20 74 6f 6b 65 6e 73 20 69 6e 20 74  ator tokens in t
1c40: 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 4b 65 65  he grammer.  Kee
1c50: 70 69 6e 67 20 74 68 65 20 6f 70 65 72 61 74 6f  ping the operato
1c60: 72 73 20 74 6f 67 65 74 68 65 72 0a 2f 2f 20 63  rs together.// c
1c70: 61 75 73 65 73 20 74 68 65 6d 20 74 6f 20 62 65  auses them to be
1c80: 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65 67 65   assigned intege
1c90: 72 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 72  r values that ar
1ca0: 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72  e close together
1cb0: 2c 0a 2f 2f 20 77 68 69 63 68 20 6b 65 65 70 73  ,.// which keeps
1cc0: 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 73   parser tables s
1cd0: 6d 61 6c 6c 65 72 2e 0a 2f 2f 0a 2f 2f 20 54 68  maller..//.// Th
1ce0: 65 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 61  e token values a
1cf0: 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 73 65  ssigned to these
1d00: 20 73 79 6d 62 6f 6c 73 20 69 73 20 64 65 74 65   symbols is dete
1d10: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 72  rmined by the or
1d20: 64 65 72 0a 2f 2f 20 69 6e 20 77 68 69 63 68 20  der.// in which 
1d30: 6c 65 6d 6f 6e 20 66 69 72 73 74 20 73 65 65 73  lemon first sees
1d40: 20 74 68 65 6d 2e 20 20 49 74 20 6d 75 73 74 20   them.  It must 
1d50: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
1d60: 20 49 53 4e 55 4c 4c 2f 4e 4f 54 4e 55 4c 4c 2c   ISNULL/NOTNULL,
1d70: 0a 2f 2f 20 4e 45 2f 45 51 2c 20 47 54 2f 4c 45  .// NE/EQ, GT/LE
1d80: 2c 20 61 6e 64 20 47 45 2f 4c 54 20 61 72 65 20  , and GE/LT are 
1d90: 73 65 70 61 72 61 74 65 64 20 62 79 20 6f 6e 6c  separated by onl
1da0: 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65  y a single value
1db0: 2e 20 20 53 65 65 0a 2f 2f 20 74 68 65 20 73 71  .  See.// the sq
1dc0: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
1dd0: 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
1de0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
1df0: 61 74 69 6f 6e 20 6f 6e 20 74 68 69 73 0a 2f 2f  ation on this.//
1e00: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2f 2f 0a   constraint..//.
1e10: 25 6c 65 66 74 20 4f 52 2e 0a 25 6c 65 66 74 20  %left OR..%left 
1e20: 41 4e 44 2e 0a 25 72 69 67 68 74 20 4e 4f 54 2e  AND..%right NOT.
1e30: 0a 25 6c 65 66 74 20 49 53 20 4d 41 54 43 48 20  .%left IS MATCH 
1e40: 4c 49 4b 45 5f 4b 57 20 42 45 54 57 45 45 4e 20  LIKE_KW BETWEEN 
1e50: 49 4e 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c  IN ISNULL NOTNUL
1e60: 4c 20 4e 45 20 45 51 2e 0a 25 6c 65 66 74 20 47  L NE EQ..%left G
1e70: 54 20 4c 45 20 4c 54 20 47 45 2e 0a 25 72 69 67  T LE LT GE..%rig
1e80: 68 74 20 45 53 43 41 50 45 2e 0a 25 6c 65 66 74  ht ESCAPE..%left
1e90: 20 42 49 54 41 4e 44 20 42 49 54 4f 52 20 4c 53   BITAND BITOR LS
1ea0: 48 49 46 54 20 52 53 48 49 46 54 2e 0a 25 6c 65  HIFT RSHIFT..%le
1eb0: 66 74 20 50 4c 55 53 20 4d 49 4e 55 53 2e 0a 25  ft PLUS MINUS..%
1ec0: 6c 65 66 74 20 53 54 41 52 20 53 4c 41 53 48 20  left STAR SLASH 
1ed0: 52 45 4d 2e 0a 25 6c 65 66 74 20 43 4f 4e 43 41  REM..%left CONCA
1ee0: 54 2e 0a 25 6c 65 66 74 20 43 4f 4c 4c 41 54 45  T..%left COLLATE
1ef0: 2e 0a 25 72 69 67 68 74 20 42 49 54 4e 4f 54 2e  ..%right BITNOT.
1f00: 0a 25 6e 6f 6e 61 73 73 6f 63 20 4f 4e 2e 0a 0a  .%nonassoc ON...
1f10: 2f 2f 20 41 6e 20 49 44 45 4e 54 49 46 49 45 52  // An IDENTIFIER
1f20: 20 63 61 6e 20 62 65 20 61 20 67 65 6e 65 72 69   can be a generi
1f30: 63 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72  c identifier, or
1f40: 20 6f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 0a   one of several.
1f50: 2f 2f 20 6b 65 79 77 6f 72 64 73 2e 20 20 41 6e  // keywords.  An
1f60: 79 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 6b  y non-standard k
1f70: 65 79 77 6f 72 64 20 63 61 6e 20 61 6c 73 6f 20  eyword can also 
1f80: 62 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  be an identifier
1f90: 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 63 6c 61 73  ..//.%token_clas
1fa0: 73 20 69 64 20 20 49 44 7c 49 4e 44 45 58 45 44  s id  ID|INDEXED
1fb0: 2e 0a 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73 22  ....// And "ids"
1fc0: 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 65 72   is an identifer
1fd0: 2d 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a 25  -or-string..//.%
1fe0: 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 69 64 73 20  token_class ids 
1ff0: 20 49 44 7c 53 54 52 49 4e 47 2e 0a 0a 2f 2f 20   ID|STRING...// 
2000: 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  The name of a co
2010: 6c 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20 63 61  lumn or table ca
2020: 6e 20 62 65 20 61 6e 79 20 6f 66 20 74 68 65 20  n be any of the 
2030: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a 25 74  following:.//.%t
2040: 79 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e  ype nm {Token}.n
2050: 6d 28 41 29 20 3a 3a 3d 20 69 64 28 41 29 2e 0a  m(A) ::= id(A)..
2060: 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47  nm(A) ::= STRING
2070: 28 41 29 2e 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a  (A)..nm(A) ::= J
2080: 4f 49 4e 5f 4b 57 28 41 29 2e 0a 0a 2f 2f 20 41  OIN_KW(A)...// A
2090: 20 74 79 70 65 74 6f 6b 65 6e 20 69 73 20 72 65   typetoken is re
20a0: 61 6c 6c 79 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  ally zero or mor
20b0: 65 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 66 6f  e tokens that fo
20c0: 72 6d 20 61 20 74 79 70 65 20 6e 61 6d 65 20 73  rm a type name s
20d0: 75 63 68 0a 2f 2f 20 61 73 20 63 61 6e 20 62 65  uch.// as can be
20e0: 20 66 6f 75 6e 64 20 61 66 74 65 72 20 74 68 65   found after the
20f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20   column name in 
2100: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
2110: 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 20 4d 75 6c  tatement..// Mul
2120: 74 69 70 6c 65 20 74 6f 6b 65 6e 73 20 61 72 65  tiple tokens are
2130: 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 20 74 6f   concatenated to
2140: 20 66 6f 72 6d 20 74 68 65 20 76 61 6c 75 65 20   form the value 
2150: 6f 66 20 74 68 65 20 74 79 70 65 74 6f 6b 65 6e  of the typetoken
2160: 2e 0a 2f 2f 0a 25 74 79 70 65 20 74 79 70 65 74  ..//.%type typet
2170: 6f 6b 65 6e 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70  oken {Token}.typ
2180: 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 2e 20  etoken(A) ::= . 
2190: 20 20 7b 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20    {A.n = 0; A.z 
21a0: 3d 20 30 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e 28  = 0;}.typetoken(
21b0: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
21c0: 41 29 2e 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29  A)..typetoken(A)
21d0: 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 41 29   ::= typename(A)
21e0: 20 4c 50 20 73 69 67 6e 65 64 20 52 50 28 59 29   LP signed RP(Y)
21f0: 2e 20 7b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74  . {.  A.n = (int
2200: 29 28 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 41 2e  )(&Y.z[Y.n] - A.
2210: 7a 29 3b 0a 7d 0a 74 79 70 65 74 6f 6b 65 6e 28  z);.}.typetoken(
2220: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
2230: 41 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d  A) LP signed COM
2240: 4d 41 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e  MA signed RP(Y).
2250: 20 7b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74 29   {.  A.n = (int)
2260: 28 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 41 2e 7a  (&Y.z[Y.n] - A.z
2270: 29 3b 0a 7d 0a 25 74 79 70 65 20 74 79 70 65 6e  );.}.%type typen
2280: 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65  ame {Token}.type
2290: 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73 28  name(A) ::= ids(
22a0: 41 29 2e 0a 74 79 70 65 6e 61 6d 65 28 41 29 20  A)..typename(A) 
22b0: 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 41 29 20  ::= typename(A) 
22c0: 69 64 73 28 59 29 2e 20 7b 41 2e 6e 3d 59 2e 6e  ids(Y). {A.n=Y.n
22d0: 2b 28 69 6e 74 29 28 59 2e 7a 2d 41 2e 7a 29 3b  +(int)(Y.z-A.z);
22e0: 7d 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 70 6c 75  }.signed ::= plu
22f0: 73 5f 6e 75 6d 2e 0a 73 69 67 6e 65 64 20 3a 3a  s_num..signed ::
2300: 3d 20 6d 69 6e 75 73 5f 6e 75 6d 2e 0a 0a 2f 2f  = minus_num...//
2310: 20 54 68 65 20 73 63 61 6e 70 74 20 6e 6f 6e 2d   The scanpt non-
2320: 74 65 72 6d 69 6e 61 6c 20 74 61 6b 65 73 20 61  terminal takes a
2330: 20 76 61 6c 75 65 20 77 68 69 63 68 20 69 73 20   value which is 
2340: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2350: 0a 2f 2f 20 69 6e 70 75 74 20 74 65 78 74 20 6a  .// input text j
2360: 75 73 74 20 70 61 73 74 20 74 68 65 20 6c 61 73  ust past the las
2370: 74 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 61 73  t token that has
2380: 20 62 65 65 6e 20 73 68 69 66 74 65 64 20 69 6e   been shifted in
2390: 74 6f 0a 2f 2f 20 74 68 65 20 70 61 72 73 65 72  to.// the parser
23a0: 2e 20 20 42 79 20 73 75 72 72 6f 75 6e 64 69 6e  .  By surroundin
23b0: 67 20 73 6f 6d 65 20 70 68 72 61 73 65 20 69 6e  g some phrase in
23c0: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 77 69 74   the grammar wit
23d0: 68 20 74 77 6f 0a 2f 2f 20 73 63 61 6e 70 74 20  h two.// scanpt 
23e0: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 2c 20 77  non-terminals, w
23f0: 65 20 63 61 6e 20 63 61 70 74 75 72 65 20 74 68  e can capture th
2400: 65 20 69 6e 70 75 74 20 74 65 78 74 20 66 6f 72  e input text for
2410: 20 74 68 61 74 20 70 68 72 61 73 65 2e 0a 2f 2f   that phrase..//
2420: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2f 2f   For example:.//
2430: 0a 2f 2f 20 20 20 20 20 20 73 6f 6d 65 74 68 69  .//      somethi
2440: 6e 67 20 3a 3a 3d 20 2e 2e 2e 2e 20 73 63 61 6e  ng ::= .... scan
2450: 70 74 28 41 29 20 70 68 72 61 73 65 20 73 63 61  pt(A) phrase sca
2460: 6e 70 74 28 5a 29 2e 0a 2f 2f 0a 2f 2f 20 54 68  npt(Z)..//.// Th
2470: 65 20 74 65 78 74 20 74 68 61 74 20 69 73 20 70  e text that is p
2480: 61 72 73 65 64 20 61 73 20 22 70 68 72 61 73 65  arsed as "phrase
2490: 22 20 69 73 20 61 20 73 74 72 69 6e 67 20 73 74  " is a string st
24a0: 61 72 74 69 6e 67 20 61 74 20 41 0a 2f 2f 20 61  arting at A.// a
24b0: 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 28 69  nd containing (i
24c0: 6e 74 29 28 5a 2d 41 29 20 63 68 61 72 61 63 74  nt)(Z-A) charact
24d0: 65 72 73 2e 20 20 54 68 65 72 65 20 6d 69 67 68  ers.  There migh
24e0: 74 20 62 65 20 73 6f 6d 65 20 65 78 74 72 61 0a  t be some extra.
24f0: 2f 2f 20 77 68 69 74 65 73 70 61 63 65 20 6f 6e  // whitespace on
2500: 20 65 69 74 68 65 72 20 65 6e 64 20 6f 66 20 74   either end of t
2510: 68 65 20 74 65 78 74 2c 20 62 75 74 20 74 68 61  he text, but tha
2520: 74 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64  t can be removed
2530: 20 69 6e 0a 2f 2f 20 70 6f 73 74 2d 70 72 6f 63   in.// post-proc
2540: 65 73 73 69 6e 67 2c 20 69 66 20 6e 65 65 64 65  essing, if neede
2550: 64 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 63 61 6e  d..//.%type scan
2560: 70 74 20 7b 63 6f 6e 73 74 20 63 68 61 72 2a 7d  pt {const char*}
2570: 0a 73 63 61 6e 70 74 28 41 29 20 3a 3a 3d 20 2e  .scanpt(A) ::= .
2580: 20 7b 0a 20 20 61 73 73 65 72 74 28 20 79 79 4c   {.  assert( yyL
2590: 6f 6f 6b 61 68 65 61 64 21 3d 59 59 4e 4f 43 4f  ookahead!=YYNOCO
25a0: 44 45 20 29 3b 0a 20 20 41 20 3d 20 79 79 4c 6f  DE );.  A = yyLo
25b0: 6f 6b 61 68 65 61 64 54 6f 6b 65 6e 2e 7a 3b 0a  okaheadToken.z;.
25c0: 7d 0a 0a 2f 2f 20 22 63 61 72 67 6c 69 73 74 22  }..// "carglist"
25d0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 61 64   is a list of ad
25e0: 64 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61  ditional constra
25f0: 69 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61  ints that come a
2600: 66 74 65 72 20 74 68 65 0a 2f 2f 20 63 6f 6c 75  fter the.// colu
2610: 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75  mn name and colu
2620: 6d 6e 20 74 79 70 65 20 69 6e 20 61 20 43 52 45  mn type in a CRE
2630: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
2640: 65 6e 74 2e 0a 2f 2f 0a 63 61 72 67 6c 69 73 74  ent..//.carglist
2650: 20 3a 3a 3d 20 63 61 72 67 6c 69 73 74 20 63 63   ::= carglist cc
2660: 6f 6e 73 2e 0a 63 61 72 67 6c 69 73 74 20 3a 3a  ons..carglist ::
2670: 3d 20 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 4f  = ..ccons ::= CO
2680: 4e 53 54 52 41 49 4e 54 20 6e 6d 28 58 29 2e 20  NSTRAINT nm(X). 
2690: 20 20 20 20 20 20 20 20 20 20 7b 70 50 61 72 73            {pPars
26a0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
26b0: 65 20 3d 20 58 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  e = X;}.ccons ::
26c0: 3d 20 44 45 46 41 55 4c 54 20 73 63 61 6e 70 74  = DEFAULT scanpt
26d0: 28 41 29 20 74 65 72 6d 28 58 29 20 73 63 61 6e  (A) term(X) scan
26e0: 70 74 28 5a 29 2e 0a 20 20 20 20 20 20 20 20 20  pt(Z)..         
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65     {sqlite3AddDe
2710: 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73  faultValue(pPars
2720: 65 2c 58 2c 41 2c 5a 29 3b 7d 0a 63 63 6f 6e 73  e,X,A,Z);}.ccons
2730: 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4c 50 28   ::= DEFAULT LP(
2740: 41 29 20 65 78 70 72 28 58 29 20 52 50 28 5a 29  A) expr(X) RP(Z)
2750: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
2770: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
2780: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 58 2c 41  Value(pParse,X,A
2790: 2e 7a 2b 31 2c 5a 2e 7a 29 3b 7d 0a 63 63 6f 6e  .z+1,Z.z);}.ccon
27a0: 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50 4c  s ::= DEFAULT PL
27b0: 55 53 28 41 29 20 74 65 72 6d 28 58 29 20 73 63  US(A) term(X) sc
27c0: 61 6e 70 74 28 5a 29 2e 0a 20 20 20 20 20 20 20  anpt(Z)..       
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64       {sqlite3Add
27f0: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61  DefaultValue(pPa
2800: 72 73 65 2c 58 2c 41 2e 7a 2c 5a 29 3b 7d 0a 63  rse,X,A.z,Z);}.c
2810: 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54  cons ::= DEFAULT
2820: 20 4d 49 4e 55 53 28 41 29 20 74 65 72 6d 28 58   MINUS(A) term(X
2830: 29 20 73 63 61 6e 70 74 28 5a 29 2e 20 20 20 20  ) scanpt(Z).    
2840: 20 20 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20    {.  Expr *p = 
2850: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
2860: 72 73 65 2c 20 54 4b 5f 55 4d 49 4e 55 53 2c 20  rse, TK_UMINUS, 
2870: 58 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  X, 0);.  sqlite3
2880: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
2890: 70 50 61 72 73 65 2c 70 2c 41 2e 7a 2c 5a 29 3b  pParse,p,A.z,Z);
28a0: 0a 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46  .}.ccons ::= DEF
28b0: 41 55 4c 54 20 73 63 61 6e 70 74 20 69 64 28 58  AULT scanpt id(X
28c0: 29 2e 20 20 20 20 20 20 20 7b 0a 20 20 45 78 70  ).       {.  Exp
28d0: 72 20 2a 70 20 3d 20 74 6f 6b 65 6e 45 78 70 72  r *p = tokenExpr
28e0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 54 52 49  (pParse, TK_STRI
28f0: 4e 47 2c 20 58 29 3b 0a 20 20 69 66 28 20 70 20  NG, X);.  if( p 
2900: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2910: 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28  prIdToTrueFalse(
2920: 70 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  p);.    testcase
2930: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45  ( p->op==TK_TRUE
2940: 46 41 4c 53 45 20 26 26 20 73 71 6c 69 74 65 33  FALSE && sqlite3
2950: 45 78 70 72 54 72 75 74 68 56 61 6c 75 65 28 70  ExprTruthValue(p
2960: 29 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ) );.  }.  sqlit
2970: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
2980: 65 28 70 50 61 72 73 65 2c 70 2c 58 2e 7a 2c 58  e(pParse,p,X.z,X
2990: 2e 7a 2b 58 2e 6e 29 3b 0a 7d 0a 0a 2f 2f 20 49  .z+X.n);.}..// I
29a0: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
29b0: 65 20 74 79 70 65 20 6e 61 6d 65 2c 20 77 65 20  e type name, we 
29c0: 61 6c 73 6f 20 63 61 72 65 20 61 62 6f 75 74 20  also care about 
29d0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
29e0: 61 6e 64 0a 2f 2f 20 55 4e 49 51 55 45 20 63 6f  and.// UNIQUE co
29f0: 6e 73 74 72 61 69 6e 74 73 2e 0a 2f 2f 0a 63 63  nstraints..//.cc
2a00: 6f 6e 73 20 3a 3a 3d 20 4e 55 4c 4c 20 6f 6e 63  ons ::= NULL onc
2a10: 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e  onf..ccons ::= N
2a20: 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 28 52  OT NULL onconf(R
2a30: 29 2e 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64  ).    {sqlite3Ad
2a40: 64 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c  dNotNull(pParse,
2a50: 20 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20   R);}.ccons ::= 
2a60: 50 52 49 4d 41 52 59 20 4b 45 59 20 73 6f 72 74  PRIMARY KEY sort
2a70: 6f 72 64 65 72 28 5a 29 20 6f 6e 63 6f 6e 66 28  order(Z) onconf(
2a80: 52 29 20 61 75 74 6f 69 6e 63 28 49 29 2e 0a 20  R) autoinc(I).. 
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 7b 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61  {sqlite3AddPrima
2ac0: 72 79 4b 65 79 28 70 50 61 72 73 65 2c 30 2c 52  ryKey(pParse,0,R
2ad0: 2c 49 2c 5a 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  ,I,Z);}.ccons ::
2ae0: 3d 20 55 4e 49 51 55 45 20 6f 6e 63 6f 6e 66 28  = UNIQUE onconf(
2af0: 52 29 2e 20 20 20 20 20 20 7b 73 71 6c 69 74 65  R).      {sqlite
2b00: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
2b10: 72 73 65 2c 30 2c 30 2c 30 2c 30 2c 52 2c 30 2c  rse,0,0,0,0,R,0,
2b20: 30 2c 30 2c 30 2c 0a 20 20 20 20 20 20 20 20 20  0,0,0,.         
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2b50: 5f 49 44 58 54 59 50 45 5f 55 4e 49 51 55 45 29  _IDXTYPE_UNIQUE)
2b60: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 48 45  ;}.ccons ::= CHE
2b70: 43 4b 20 4c 50 20 65 78 70 72 28 58 29 20 52 50  CK LP expr(X) RP
2b80: 2e 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43  .   {sqlite3AddC
2b90: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70  heckConstraint(p
2ba0: 50 61 72 73 65 2c 58 29 3b 7d 0a 63 63 6f 6e 73  Parse,X);}.ccons
2bb0: 20 3a 3a 3d 20 52 45 46 45 52 45 4e 43 45 53 20   ::= REFERENCES 
2bc0: 6e 6d 28 54 29 20 65 69 64 6c 69 73 74 5f 6f 70  nm(T) eidlist_op
2bd0: 74 28 54 41 29 20 72 65 66 61 72 67 73 28 52 29  t(TA) refargs(R)
2be0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74     {sqlite3Creat
2c10: 65 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72  eForeignKey(pPar
2c20: 73 65 2c 30 2c 26 54 2c 54 41 2c 52 29 3b 7d 0a  se,0,&T,TA,R);}.
2c30: 63 63 6f 6e 73 20 3a 3a 3d 20 64 65 66 65 72 5f  ccons ::= defer_
2c40: 73 75 62 63 6c 61 75 73 65 28 44 29 2e 20 20 20  subclause(D).   
2c50: 20 7b 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f   {sqlite3DeferFo
2c60: 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c  reignKey(pParse,
2c70: 44 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43  D);}.ccons ::= C
2c80: 4f 4c 4c 41 54 45 20 69 64 73 28 43 29 2e 20 20  OLLATE ids(C).  
2c90: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
2ca0: 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 70 50 61  dCollateType(pPa
2cb0: 72 73 65 2c 20 26 43 29 3b 7d 0a 0a 2f 2f 20 54  rse, &C);}..// T
2cc0: 68 65 20 6f 70 74 69 6f 6e 61 6c 20 41 55 54 4f  he optional AUTO
2cd0: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
2ce0: 64 0a 25 74 79 70 65 20 61 75 74 6f 69 6e 63 20  d.%type autoinc 
2cf0: 7b 69 6e 74 7d 0a 61 75 74 6f 69 6e 63 28 58 29  {int}.autoinc(X)
2d00: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
2d10: 7b 58 20 3d 20 30 3b 7d 0a 61 75 74 6f 69 6e 63  {X = 0;}.autoinc
2d20: 28 58 29 20 3a 3a 3d 20 41 55 54 4f 49 4e 43 52  (X) ::= AUTOINCR
2d30: 2e 20 20 7b 58 20 3d 20 31 3b 7d 0a 0a 2f 2f 20  .  {X = 1;}..// 
2d40: 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f  The next group o
2d50: 66 20 72 75 6c 65 73 20 70 61 72 73 65 73 20 74  f rules parses t
2d60: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  he arguments to 
2d70: 61 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61  a REFERENCES cla
2d80: 75 73 65 0a 2f 2f 20 74 68 61 74 20 64 65 74 65  use.// that dete
2d90: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 72 65 66  rmine if the ref
2da0: 65 72 65 6e 74 69 61 6c 20 69 6e 74 65 67 72 69  erential integri
2db0: 74 79 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  ty checking is d
2dc0: 65 66 65 72 72 65 64 20 6f 72 0a 2f 2f 20 6f 72  eferred or.// or
2dd0: 20 69 6d 6d 65 64 69 61 74 65 20 61 6e 64 20 77   immediate and w
2de0: 68 69 63 68 20 64 65 74 65 72 6d 69 6e 65 20 77  hich determine w
2df0: 68 61 74 20 61 63 74 69 6f 6e 20 74 6f 20 74 61  hat action to ta
2e00: 6b 65 20 69 66 20 61 20 72 65 66 2d 69 6e 74 65  ke if a ref-inte
2e10: 67 0a 2f 2f 20 63 68 65 63 6b 20 66 61 69 6c 73  g.// check fails
2e20: 2e 0a 2f 2f 0a 25 74 79 70 65 20 72 65 66 61 72  ..//.%type refar
2e30: 67 73 20 7b 69 6e 74 7d 0a 72 65 66 61 72 67 73  gs {int}.refargs
2e40: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
2e50: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
2e60: 20 4f 45 5f 4e 6f 6e 65 2a 30 78 30 31 30 31 3b   OE_None*0x0101;
2e70: 20 2f 2a 20 45 56 3a 20 52 2d 31 39 38 30 33 2d   /* EV: R-19803-
2e80: 34 35 38 38 34 20 2a 2f 7d 0a 72 65 66 61 72 67  45884 */}.refarg
2e90: 73 28 41 29 20 3a 3a 3d 20 72 65 66 61 72 67 73  s(A) ::= refargs
2ea0: 28 41 29 20 72 65 66 61 72 67 28 59 29 2e 20 7b  (A) refarg(Y). {
2eb0: 20 41 20 3d 20 28 41 20 26 20 7e 59 2e 6d 61 73   A = (A & ~Y.mas
2ec0: 6b 29 20 7c 20 59 2e 76 61 6c 75 65 3b 20 7d 0a  k) | Y.value; }.
2ed0: 25 74 79 70 65 20 72 65 66 61 72 67 20 7b 73 74  %type refarg {st
2ee0: 72 75 63 74 20 7b 69 6e 74 20 76 61 6c 75 65 3b  ruct {int value;
2ef0: 20 69 6e 74 20 6d 61 73 6b 3b 7d 7d 0a 72 65 66   int mask;}}.ref
2f00: 61 72 67 28 41 29 20 3a 3a 3d 20 4d 41 54 43 48  arg(A) ::= MATCH
2f10: 20 6e 6d 2e 20 20 20 20 20 20 20 20 20 20 20 20   nm.            
2f20: 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b    { A.value = 0;
2f30: 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78       A.mask = 0x
2f40: 30 30 30 30 30 30 3b 20 7d 0a 72 65 66 61 72 67  000000; }.refarg
2f50: 28 41 29 20 3a 3a 3d 20 4f 4e 20 49 4e 53 45 52  (A) ::= ON INSER
2f60: 54 20 72 65 66 61 63 74 2e 20 20 20 20 20 20 7b  T refact.      {
2f70: 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b 20 20 20   A.value = 0;   
2f80: 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30    A.mask = 0x000
2f90: 30 30 30 3b 20 7d 0a 72 65 66 61 72 67 28 41 29  000; }.refarg(A)
2fa0: 20 3a 3a 3d 20 4f 4e 20 44 45 4c 45 54 45 20 72   ::= ON DELETE r
2fb0: 65 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e  efact(X).   { A.
2fc0: 76 61 6c 75 65 20 3d 20 58 3b 20 20 20 20 20 41  value = X;     A
2fd0: 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 66 66  .mask = 0x0000ff
2fe0: 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a  ; }.refarg(A) ::
2ff0: 3d 20 4f 4e 20 55 50 44 41 54 45 20 72 65 66 61  = ON UPDATE refa
3000: 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c  ct(X).   { A.val
3010: 75 65 20 3d 20 58 3c 3c 38 3b 20 20 41 2e 6d 61  ue = X<<8;  A.ma
3020: 73 6b 20 3d 20 30 78 30 30 66 66 30 30 3b 20 7d  sk = 0x00ff00; }
3030: 0a 25 74 79 70 65 20 72 65 66 61 63 74 20 7b 69  .%type refact {i
3040: 6e 74 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a  nt}.refact(A) ::
3050: 3d 20 53 45 54 20 4e 55 4c 4c 2e 20 20 20 20 20  = SET NULL.     
3060: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f           { A = O
3070: 45 5f 53 65 74 4e 75 6c 6c 3b 20 20 2f 2a 20 45  E_SetNull;  /* E
3080: 56 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32  V: R-33326-45252
3090: 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41 29 20 3a   */}.refact(A) :
30a0: 3a 3d 20 53 45 54 20 44 45 46 41 55 4c 54 2e 20  := SET DEFAULT. 
30b0: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
30c0: 4f 45 5f 53 65 74 44 66 6c 74 3b 20 20 2f 2a 20  OE_SetDflt;  /* 
30d0: 45 56 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35  EV: R-33326-4525
30e0: 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41 29 20  2 */}.refact(A) 
30f0: 3a 3a 3d 20 43 41 53 43 41 44 45 2e 20 20 20 20  ::= CASCADE.    
3100: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
3110: 20 4f 45 5f 43 61 73 63 61 64 65 3b 20 20 2f 2a   OE_Cascade;  /*
3120: 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34 35 32   EV: R-33326-452
3130: 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41 29  52 */}.refact(A)
3140: 20 3a 3a 3d 20 52 45 53 54 52 49 43 54 2e 20 20   ::= RESTRICT.  
3150: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
3160: 3d 20 4f 45 5f 52 65 73 74 72 69 63 74 3b 20 2f  = OE_Restrict; /
3170: 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34 35  * EV: R-33326-45
3180: 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41  252 */}.refact(A
3190: 29 20 3a 3a 3d 20 4e 4f 20 41 43 54 49 4f 4e 2e  ) ::= NO ACTION.
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
31b0: 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 20 20 20 20 20   = OE_None;     
31c0: 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34  /* EV: R-33326-4
31d0: 35 32 35 32 20 2a 2f 7d 0a 25 74 79 70 65 20 64  5252 */}.%type d
31e0: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 20 7b  efer_subclause {
31f0: 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c  int}.defer_subcl
3200: 61 75 73 65 28 41 29 20 3a 3a 3d 20 4e 4f 54 20  ause(A) ::= NOT 
3210: 44 45 46 45 52 52 41 42 4c 45 20 69 6e 69 74 5f  DEFERRABLE init_
3220: 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70  deferred_pred_op
3230: 74 2e 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a  t.     {A = 0;}.
3240: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28  defer_subclause(
3250: 41 29 20 3a 3a 3d 20 44 45 46 45 52 52 41 42 4c  A) ::= DEFERRABL
3260: 45 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f  E init_deferred_
3270: 70 72 65 64 5f 6f 70 74 28 58 29 2e 20 20 20 20  pred_opt(X).    
3280: 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 74 79 70 65    {A = X;}.%type
3290: 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70   init_deferred_p
32a0: 72 65 64 5f 6f 70 74 20 7b 69 6e 74 7d 0a 69 6e  red_opt {int}.in
32b0: 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64  it_deferred_pred
32c0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 69      {A = 0;}.ini
32f0: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f  t_deferred_pred_
3300: 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49  opt(A) ::= INITI
3310: 41 4c 4c 59 20 44 45 46 45 52 52 45 44 2e 20 20  ALLY DEFERRED.  
3320: 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 69 6e 69 74     {A = 1;}.init
3330: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f  _deferred_pred_o
3340: 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41  pt(A) ::= INITIA
3350: 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 20 20  LLY IMMEDIATE.  
3360: 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 63 6f 6e 73    {A = 0;}..cons
3370: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
3380: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3390: 20 20 20 20 20 20 20 20 20 20 7b 41 2e 6e 20 3d            {A.n =
33a0: 20 30 3b 20 41 2e 7a 20 3d 20 30 3b 7d 0a 63 6f   0; A.z = 0;}.co
33b0: 6e 73 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a  nslist_opt(A) ::
33c0: 3d 20 43 4f 4d 4d 41 28 41 29 20 63 6f 6e 73 6c  = COMMA(A) consl
33d0: 69 73 74 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a  ist..conslist ::
33e0: 3d 20 63 6f 6e 73 6c 69 73 74 20 74 63 6f 6e 73  = conslist tcons
33f0: 63 6f 6d 6d 61 20 74 63 6f 6e 73 2e 0a 63 6f 6e  comma tcons..con
3400: 73 6c 69 73 74 20 3a 3a 3d 20 74 63 6f 6e 73 2e  slist ::= tcons.
3410: 0a 74 63 6f 6e 73 63 6f 6d 6d 61 20 3a 3a 3d 20  .tconscomma ::= 
3420: 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20 20 20  COMMA.          
3430: 20 20 7b 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74    {pParse->const
3440: 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30 3b  raintName.n = 0;
3450: 7d 0a 74 63 6f 6e 73 63 6f 6d 6d 61 20 3a 3a 3d  }.tconscomma ::=
3460: 20 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e   ..tcons ::= CON
3470: 53 54 52 41 49 4e 54 20 6e 6d 28 58 29 2e 20 20  STRAINT nm(X).  
3480: 20 20 20 20 7b 70 50 61 72 73 65 2d 3e 63 6f 6e      {pParse->con
3490: 73 74 72 61 69 6e 74 4e 61 6d 65 20 3d 20 58 3b  straintName = X;
34a0: 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d  }.tcons ::= PRIM
34b0: 41 52 59 20 4b 45 59 20 4c 50 20 73 6f 72 74 6c  ARY KEY LP sortl
34c0: 69 73 74 28 58 29 20 61 75 74 6f 69 6e 63 28 49  ist(X) autoinc(I
34d0: 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a  ) RP onconf(R)..
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3500: 20 7b 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d   {sqlite3AddPrim
3510: 61 72 79 4b 65 79 28 70 50 61 72 73 65 2c 58 2c  aryKey(pParse,X,
3520: 52 2c 49 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20 3a  R,I,0);}.tcons :
3530: 3a 3d 20 55 4e 49 51 55 45 20 4c 50 20 73 6f 72  := UNIQUE LP sor
3540: 74 6c 69 73 74 28 58 29 20 52 50 20 6f 6e 63 6f  tlist(X) RP onco
3550: 6e 66 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20  nf(R)..         
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
3580: 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72  CreateIndex(pPar
3590: 73 65 2c 30 2c 30 2c 30 2c 58 2c 52 2c 30 2c 30  se,0,0,0,X,R,0,0
35a0: 2c 30 2c 30 2c 0a 20 20 20 20 20 20 20 20 20 20  ,0,0,.          
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
35d0: 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e 49 51  ITE_IDXTYPE_UNIQ
35e0: 55 45 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20  UE);}.tcons ::= 
35f0: 43 48 45 43 4b 20 4c 50 20 65 78 70 72 28 45 29  CHECK LP expr(E)
3600: 20 52 50 20 6f 6e 63 6f 6e 66 2e 0a 20 20 20 20   RP onconf..    
3610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3620: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
3630: 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e  lite3AddCheckCon
3640: 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 45  straint(pParse,E
3650: 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 46 4f  );}.tcons ::= FO
3660: 52 45 49 47 4e 20 4b 45 59 20 4c 50 20 65 69 64  REIGN KEY LP eid
3670: 6c 69 73 74 28 46 41 29 20 52 50 0a 20 20 20 20  list(FA) RP.    
3680: 20 20 20 20 20 20 52 45 46 45 52 45 4e 43 45 53        REFERENCES
3690: 20 6e 6d 28 54 29 20 65 69 64 6c 69 73 74 5f 6f   nm(T) eidlist_o
36a0: 70 74 28 54 41 29 20 72 65 66 61 72 67 73 28 52  pt(TA) refargs(R
36b0: 29 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  ) defer_subclaus
36c0: 65 5f 6f 70 74 28 44 29 2e 20 7b 0a 20 20 20 20  e_opt(D). {.    
36d0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
36e0: 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 20  eignKey(pParse, 
36f0: 46 41 2c 20 26 54 2c 20 54 41 2c 20 52 29 3b 0a  FA, &T, TA, R);.
3700: 20 20 20 20 73 71 6c 69 74 65 33 44 65 66 65 72      sqlite3Defer
3710: 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73  ForeignKey(pPars
3720: 65 2c 20 44 29 3b 0a 7d 0a 25 74 79 70 65 20 64  e, D);.}.%type d
3730: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f  efer_subclause_o
3740: 70 74 20 7b 69 6e 74 7d 0a 64 65 66 65 72 5f 73  pt {int}.defer_s
3750: 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 41 29 20  ubclause_opt(A) 
3760: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
3770: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
3780: 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  }.defer_subclaus
3790: 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 64 65 66  e_opt(A) ::= def
37a0: 65 72 5f 73 75 62 63 6c 61 75 73 65 28 41 29 2e  er_subclause(A).
37b0: 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ..// The followi
37c0: 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74 61 6e  ng is a non-stan
37d0: 64 61 72 64 20 65 78 74 65 6e 73 69 6f 6e 20 74  dard extension t
37e0: 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f  hat allows us to
37f0: 20 64 65 63 6c 61 72 65 20 74 68 65 0a 2f 2f 20   declare the.// 
3800: 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72  default behavior
3810: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
3820: 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e 66   constraint conf
3830: 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f  lict..//.%type o
3840: 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 70  nconf {int}.%typ
3850: 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25  e orconf {int}.%
3860: 74 79 70 65 20 72 65 73 6f 6c 76 65 74 79 70 65  type resolvetype
3870: 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28 41 29   {int}.onconf(A)
3880: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44 65 66 61      {A = OE_Defa
38b0: 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20  ult;}.onconf(A) 
38c0: 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ::= ON CONFLICT 
38d0: 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20  resolvetype(X). 
38e0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f 72 63 6f     {A = X;}.orco
38f0: 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  nf(A) ::= .     
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3910: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
3920: 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72 63 6f 6e  _Default;}.orcon
3930: 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72 65 73 6f  f(A) ::= OR reso
3940: 6c 76 65 74 79 70 65 28 58 29 2e 20 20 20 20 20  lvetype(X).     
3950: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
3960: 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20  .resolvetype(A) 
3970: 3a 3a 3d 20 72 61 69 73 65 74 79 70 65 28 41 29  ::= raisetype(A)
3980: 2e 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29  ..resolvetype(A)
3990: 20 3a 3a 3d 20 49 47 4e 4f 52 45 2e 20 20 20 20   ::= IGNORE.    
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
39b0: 41 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 7d 0a  A = OE_Ignore;}.
39c0: 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a  resolvetype(A) :
39d0: 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20 20  := REPLACE.     
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
39f0: 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a  = OE_Replace;}..
3a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44  ////////// The D
3a20: 52 4f 50 20 54 41 42 4c 45 20 2f 2f 2f 2f 2f 2f  ROP TABLE //////
3a30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3a40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
3a50: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20  //.cmd ::= DROP 
3a60: 54 41 42 4c 45 20 69 66 65 78 69 73 74 73 28 45  TABLE ifexists(E
3a70: 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b  ) fullname(X). {
3a80: 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  .  sqlite3DropTa
3a90: 62 6c 65 28 70 50 61 72 73 65 2c 20 58 2c 20 30  ble(pParse, X, 0
3aa0: 2c 20 45 29 3b 0a 7d 0a 25 74 79 70 65 20 69 66  , E);.}.%type if
3ab0: 65 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66 65  exists {int}.ife
3ac0: 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 49 46 20  xists(A) ::= IF 
3ad0: 45 58 49 53 54 53 2e 20 20 20 7b 41 20 3d 20 31  EXISTS.   {A = 1
3ae0: 3b 7d 0a 69 66 65 78 69 73 74 73 28 41 29 20 3a  ;}.ifexists(A) :
3af0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
3b00: 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  {A = 0;}..//////
3b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
3b20: 54 68 65 20 43 52 45 41 54 45 20 56 49 45 57 20  The CREATE VIEW 
3b30: 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f  statement //////
3b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b50: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64  ///////.//.%ifnd
3b60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
3b70: 49 45 57 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61  IEW.cmd ::= crea
3b80: 74 65 6b 77 28 58 29 20 74 65 6d 70 28 54 29 20  tekw(X) temp(T) 
3b90: 56 49 45 57 20 69 66 6e 6f 74 65 78 69 73 74 73  VIEW ifnotexists
3ba0: 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a  (E) nm(Y) dbnm(Z
3bb0: 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28 43 29  ) eidlist_opt(C)
3bc0: 0a 20 20 20 20 20 20 20 20 20 20 41 53 20 73 65  .          AS se
3bd0: 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c  lect(S). {.  sql
3be0: 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 70  ite3CreateView(p
3bf0: 50 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26  Parse, &X, &Y, &
3c00: 5a 2c 20 43 2c 20 53 2c 20 54 2c 20 45 29 3b 0a  Z, C, S, T, E);.
3c10: 7d 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 56  }.cmd ::= DROP V
3c20: 49 45 57 20 69 66 65 78 69 73 74 73 28 45 29 20  IEW ifexists(E) 
3c30: 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20  fullname(X). {. 
3c40: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
3c50: 65 28 70 50 61 72 73 65 2c 20 58 2c 20 31 2c 20  e(pParse, X, 1, 
3c60: 45 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51  E);.}.%endif  SQ
3c70: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 0a  LITE_OMIT_VIEW..
3c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3c90: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53 45 4c  //////// The SEL
3ca0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f  ECT statement //
3cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
3cd0: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c 65 63  //.cmd ::= selec
3ce0: 74 28 58 29 2e 20 20 7b 0a 20 20 53 65 6c 65 63  t(X).  {.  Selec
3cf0: 74 44 65 73 74 20 64 65 73 74 20 3d 20 7b 53 52  tDest dest = {SR
3d00: 54 5f 4f 75 74 70 75 74 2c 20 30 2c 20 30 2c 20  T_Output, 0, 0, 
3d10: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 73 71 6c 69  0, 0, 0};.  sqli
3d20: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
3d30: 2c 20 58 2c 20 26 64 65 73 74 29 3b 0a 20 20 73  , X, &dest);.  s
3d40: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3d50: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 58  te(pParse->db, X
3d60: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73 65 6c 65  );.}..%type sele
3d70: 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65  ct {Select*}.%de
3d80: 73 74 72 75 63 74 6f 72 20 73 65 6c 65 63 74 20  structor select 
3d90: 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65  {sqlite3SelectDe
3da0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
3db0: 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 65 6c   $$);}.%type sel
3dc0: 65 63 74 6e 6f 77 69 74 68 20 7b 53 65 6c 65 63  ectnowith {Selec
3dd0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3de0: 73 65 6c 65 63 74 6e 6f 77 69 74 68 20 7b 73 71  selectnowith {sq
3df0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3e00: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
3e10: 29 3b 7d 0a 25 74 79 70 65 20 6f 6e 65 73 65 6c  );}.%type onesel
3e20: 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64  ect {Select*}.%d
3e30: 65 73 74 72 75 63 74 6f 72 20 6f 6e 65 73 65 6c  estructor onesel
3e40: 65 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65  ect {sqlite3Sele
3e50: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
3e60: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 69 6e 63  >db, $$);}..%inc
3e70: 6c 75 64 65 20 7b 0a 20 20 2f 2a 0a 20 20 2a 2a  lude {.  /*.  **
3e80: 20 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   For a compound 
3e90: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
3ea0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 2d 3e 70  , make sure p->p
3eb0: 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
3ec0: 66 6f 72 0a 20 20 2a 2a 20 61 6c 6c 20 65 6c 65  for.  ** all ele
3ed0: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73  ments in the lis
3ee0: 74 2e 20 20 41 6e 64 20 6d 61 6b 65 20 73 75 72  t.  And make sur
3ef0: 65 20 6c 69 73 74 20 6c 65 6e 67 74 68 20 64 6f  e list length do
3f00: 65 73 20 6e 6f 74 20 65 78 63 65 65 64 0a 20 20  es not exceed.  
3f10: 2a 2a 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ** SQLITE_LIMIT_
3f20: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2e  COMPOUND_SELECT.
3f30: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  .  */.  static v
3f40: 6f 69 64 20 70 61 72 73 65 72 44 6f 75 62 6c 65  oid parserDouble
3f50: 4c 69 6e 6b 53 65 6c 65 63 74 28 50 61 72 73 65  LinkSelect(Parse
3f60: 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 74   *pParse, Select
3f70: 20 2a 70 29 7b 0a 20 20 20 20 69 66 28 20 70 2d   *p){.    if( p-
3f80: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 20  >pPrior ){.     
3f90: 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74 20 3d   Select *pNext =
3fa0: 20 30 2c 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 20   0, *pLoop;.    
3fb0: 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 2c 20    int mxSelect, 
3fc0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66  cnt = 0;.      f
3fd0: 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f  or(pLoop=p; pLoo
3fe0: 70 3b 20 70 4e 65 78 74 3d 70 4c 6f 6f 70 2c 20  p; pNext=pLoop, 
3ff0: 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72  pLoop=pLoop->pPr
4000: 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 20  ior, cnt++){.   
4010: 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78       pLoop->pNex
4020: 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20  t = pNext;.     
4030: 20 20 20 70 4c 6f 6f 70 2d 3e 73 65 6c 46 6c 61     pLoop->selFla
4040: 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6f 75 6e  gs |= SF_Compoun
4050: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
4060: 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
4070: 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c 75  s & SF_MultiValu
4080: 65 29 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20  e)==0 && .      
4090: 20 20 28 6d 78 53 65 6c 65 63 74 20 3d 20 70 50    (mxSelect = pP
40a0: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
40b0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
40c0: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 29 3e  MPOUND_SELECT])>
40d0: 30 20 26 26 0a 20 20 20 20 20 20 20 20 63 6e 74  0 &&.        cnt
40e0: 3e 6d 78 53 65 6c 65 63 74 0a 20 20 20 20 20 20  >mxSelect.      
40f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4100: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4110: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72  e, "too many ter
4120: 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53  ms in compound S
4130: 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20 7d  ELECT");.      }
4140: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 65  .    }.  }.}..se
4150: 6c 65 63 74 28 41 29 20 3a 3a 3d 20 57 49 54 48  lect(A) ::= WITH
4160: 20 77 71 6c 69 73 74 28 57 29 20 73 65 6c 65 63   wqlist(W) selec
4170: 74 6e 6f 77 69 74 68 28 58 29 2e 20 7b 0a 20 20  tnowith(X). {.  
4180: 53 65 6c 65 63 74 20 2a 70 20 3d 20 58 3b 0a 20  Select *p = X;. 
4190: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 2d   if( p ){.    p-
41a0: 3e 70 57 69 74 68 20 3d 20 57 3b 0a 20 20 20 20  >pWith = W;.    
41b0: 70 61 72 73 65 72 44 6f 75 62 6c 65 4c 69 6e 6b  parserDoubleLink
41c0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
41d0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
41e0: 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74  sqlite3WithDelet
41f0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 57 29  e(pParse->db, W)
4200: 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 70 3b 0a 7d  ;.  }.  A = p;.}
4210: 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 57  .select(A) ::= W
4220: 49 54 48 20 52 45 43 55 52 53 49 56 45 20 77 71  ITH RECURSIVE wq
4230: 6c 69 73 74 28 57 29 20 73 65 6c 65 63 74 6e 6f  list(W) selectno
4240: 77 69 74 68 28 58 29 2e 20 7b 0a 20 20 53 65 6c  with(X). {.  Sel
4250: 65 63 74 20 2a 70 20 3d 20 58 3b 0a 20 20 69 66  ect *p = X;.  if
4260: 28 20 70 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57  ( p ){.    p->pW
4270: 69 74 68 20 3d 20 57 3b 0a 20 20 20 20 70 61 72  ith = W;.    par
4280: 73 65 72 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c  serDoubleLinkSel
4290: 65 63 74 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ect(pParse, p);.
42a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
42b0: 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28 70  ite3WithDelete(p
42c0: 50 61 72 73 65 2d 3e 64 62 2c 20 57 29 3b 0a 20  Parse->db, W);. 
42d0: 20 7d 0a 20 20 41 20 3d 20 70 3b 0a 7d 0a 73 65   }.  A = p;.}.se
42e0: 6c 65 63 74 28 41 29 20 3a 3a 3d 20 73 65 6c 65  lect(A) ::= sele
42f0: 63 74 6e 6f 77 69 74 68 28 58 29 2e 20 7b 0a 20  ctnowith(X). {. 
4300: 20 53 65 6c 65 63 74 20 2a 70 20 3d 20 58 3b 0a   Select *p = X;.
4310: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
4320: 61 72 73 65 72 44 6f 75 62 6c 65 4c 69 6e 6b 53  arserDoubleLinkS
4330: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 29  elect(pParse, p)
4340: 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 70 3b 20 2f  ;.  }.  A = p; /
4350: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a  *A-overwrites-X*
4360: 2f 0a 7d 0a 0a 73 65 6c 65 63 74 6e 6f 77 69 74  /.}..selectnowit
4370: 68 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65  h(A) ::= onesele
4380: 63 74 28 41 29 2e 0a 25 69 66 6e 64 65 66 20 53  ct(A)..%ifndef S
4390: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
43a0: 55 4e 44 5f 53 45 4c 45 43 54 0a 73 65 6c 65 63  UND_SELECT.selec
43b0: 74 6e 6f 77 69 74 68 28 41 29 20 3a 3a 3d 20 73  tnowith(A) ::= s
43c0: 65 6c 65 63 74 6e 6f 77 69 74 68 28 41 29 20 6d  electnowith(A) m
43d0: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 59 29  ultiselect_op(Y)
43e0: 20 6f 6e 65 73 65 6c 65 63 74 28 5a 29 2e 20 20   oneselect(Z).  
43f0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 68 73  {.  Select *pRhs
4400: 20 3d 20 5a 3b 0a 20 20 53 65 6c 65 63 74 20 2a   = Z;.  Select *
4410: 70 4c 68 73 20 3d 20 41 3b 0a 20 20 69 66 28 20  pLhs = A;.  if( 
4420: 70 52 68 73 20 26 26 20 70 52 68 73 2d 3e 70 50  pRhs && pRhs->pP
4430: 72 69 6f 72 20 29 7b 0a 20 20 20 20 53 72 63 4c  rior ){.    SrcL
4440: 69 73 74 20 2a 70 46 72 6f 6d 3b 0a 20 20 20 20  ist *pFrom;.    
4450: 54 6f 6b 65 6e 20 78 3b 0a 20 20 20 20 78 2e 6e  Token x;.    x.n
4460: 20 3d 20 30 3b 0a 20 20 20 20 70 61 72 73 65 72   = 0;.    parser
4470: 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74  DoubleLinkSelect
4480: 28 70 50 61 72 73 65 2c 20 70 52 68 73 29 3b 0a  (pParse, pRhs);.
4490: 20 20 20 20 70 46 72 6f 6d 20 3d 20 73 71 6c 69      pFrom = sqli
44a0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
44b0: 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
44c0: 30 2c 30 2c 30 2c 26 78 2c 70 52 68 73 2c 30 2c  0,0,0,&x,pRhs,0,
44d0: 30 29 3b 0a 20 20 20 20 70 52 68 73 20 3d 20 73  0);.    pRhs = s
44e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
44f0: 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2c 30  pParse,0,pFrom,0
4500: 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 7d  ,0,0,0,0,0);.  }
4510: 0a 20 20 69 66 28 20 70 52 68 73 20 29 7b 0a 20  .  if( pRhs ){. 
4520: 20 20 20 70 52 68 73 2d 3e 6f 70 20 3d 20 28 75     pRhs->op = (u
4530: 38 29 59 3b 0a 20 20 20 20 70 52 68 73 2d 3e 70  8)Y;.    pRhs->p
4540: 50 72 69 6f 72 20 3d 20 70 4c 68 73 3b 0a 20 20  Prior = pLhs;.  
4550: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 68    if( ALWAYS(pLh
4560: 73 29 20 29 20 70 4c 68 73 2d 3e 73 65 6c 46 6c  s) ) pLhs->selFl
4570: 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 69  ags &= ~SF_Multi
4580: 56 61 6c 75 65 3b 0a 20 20 20 20 70 52 68 73 2d  Value;.    pRhs-
4590: 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46  >selFlags &= ~SF
45a0: 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20  _MultiValue;.   
45b0: 20 69 66 28 20 59 21 3d 54 4b 5f 41 4c 4c 20 29   if( Y!=TK_ALL )
45c0: 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70   pParse->hasComp
45d0: 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ound = 1;.  }els
45e0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e{.    sqlite3Se
45f0: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
4600: 65 2d 3e 64 62 2c 20 70 4c 68 73 29 3b 0a 20 20  e->db, pLhs);.  
4610: 7d 0a 20 20 41 20 3d 20 70 52 68 73 3b 0a 7d 0a  }.  A = pRhs;.}.
4620: 25 74 79 70 65 20 6d 75 6c 74 69 73 65 6c 65 63  %type multiselec
4630: 74 5f 6f 70 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69  t_op {int}.multi
4640: 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d  select_op(A) ::=
4650: 20 55 4e 49 4f 4e 28 4f 50 29 2e 20 20 20 20 20   UNION(OP).     
4660: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 40 4f 50          {A = @OP
4670: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
4680: 2d 4f 50 2a 2f 7d 0a 6d 75 6c 74 69 73 65 6c 65  -OP*/}.multisele
4690: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49  ct_op(A) ::= UNI
46a0: 4f 4e 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 20  ON ALL.         
46b0: 20 20 20 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b      {A = TK_ALL;
46c0: 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70  }.multiselect_op
46d0: 28 41 29 20 3a 3a 3d 20 45 58 43 45 50 54 7c 49  (A) ::= EXCEPT|I
46e0: 4e 54 45 52 53 45 43 54 28 4f 50 29 2e 20 20 7b  NTERSECT(OP).  {
46f0: 41 20 3d 20 40 4f 50 3b 20 2f 2a 41 2d 6f 76 65  A = @OP; /*A-ove
4700: 72 77 72 69 74 65 73 2d 4f 50 2a 2f 7d 0a 25 65  rwrites-OP*/}.%e
4710: 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndif SQLITE_OMIT
4720: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
4730: 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a  .oneselect(A) ::
4740: 3d 20 53 45 4c 45 43 54 28 53 29 20 64 69 73 74  = SELECT(S) dist
4750: 69 6e 63 74 28 44 29 20 73 65 6c 63 6f 6c 6c 69  inct(D) selcolli
4760: 73 74 28 57 29 20 66 72 6f 6d 28 58 29 20 77 68  st(W) from(X) wh
4770: 65 72 65 5f 6f 70 74 28 59 29 0a 20 20 20 20 20  ere_opt(Y).     
4780: 20 20 20 20 20 20 20 20 20 20 20 20 67 72 6f 75              grou
4790: 70 62 79 5f 6f 70 74 28 50 29 20 68 61 76 69 6e  pby_opt(P) havin
47a0: 67 5f 6f 70 74 28 51 29 20 6f 72 64 65 72 62 79  g_opt(Q) orderby
47b0: 5f 6f 70 74 28 5a 29 20 6c 69 6d 69 74 5f 6f 70  _opt(Z) limit_op
47c0: 74 28 4c 29 2e 20 7b 0a 23 69 66 20 53 45 4c 45  t(L). {.#if SELE
47d0: 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a  CTTRACE_ENABLED.
47e0: 20 20 54 6f 6b 65 6e 20 73 20 3d 20 53 3b 20 2f    Token s = S; /
47f0: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 53 2a  *A-overwrites-S*
4800: 2f 0a 23 65 6e 64 69 66 0a 20 20 41 20 3d 20 73  /.#endif.  A = s
4810: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
4820: 70 50 61 72 73 65 2c 57 2c 58 2c 59 2c 50 2c 51  pParse,W,X,Y,P,Q
4830: 2c 5a 2c 44 2c 4c 29 3b 0a 23 69 66 20 53 45 4c  ,Z,D,L);.#if SEL
4840: 45 43 54 54 52 41 43 45 5f 45 4e 41 42 4c 45 44  ECTTRACE_ENABLED
4850: 0a 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74  .  /* Populate t
4860: 68 65 20 53 65 6c 65 63 74 2e 7a 53 65 6c 4e 61  he Select.zSelNa
4870: 6d 65 5b 5d 20 73 74 72 69 6e 67 20 74 68 61 74  me[] string that
4880: 20 69 73 20 75 73 65 64 20 74 6f 20 68 65 6c 70   is used to help
4890: 20 77 69 74 68 0a 20 20 2a 2a 20 71 75 65 72 79   with.  ** query
48a0: 20 70 6c 61 6e 6e 65 72 20 64 65 62 75 67 67 69   planner debuggi
48b0: 6e 67 2c 20 74 6f 20 64 69 66 66 65 72 65 6e 74  ng, to different
48c0: 69 61 74 65 20 62 65 74 77 65 65 6e 20 6d 75 6c  iate between mul
48d0: 74 69 70 6c 65 20 53 65 6c 65 63 74 0a 20 20 2a  tiple Select.  *
48e0: 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 61 20 63  * objects in a c
48f0: 6f 6d 70 6c 65 78 20 71 75 65 72 79 2e 0a 20 20  omplex query..  
4900: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 53  **.  ** If the S
4910: 45 4c 45 43 54 20 6b 65 79 77 6f 72 64 20 69 73  ELECT keyword is
4920: 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c   immediately fol
4930: 6c 6f 77 65 64 20 62 79 20 61 20 43 2d 73 74 79  lowed by a C-sty
4940: 6c 65 20 63 6f 6d 6d 65 6e 74 0a 20 20 2a 2a 20  le comment.  ** 
4950: 74 68 65 6e 20 65 78 74 72 61 63 74 20 74 68 65  then extract the
4960: 20 66 69 72 73 74 20 66 65 77 20 61 6c 70 68 61   first few alpha
4970: 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65  numeric characte
4980: 72 73 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  rs from within t
4990: 68 61 74 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74  hat.  ** comment
49a0: 20 74 6f 20 62 65 20 74 68 65 20 7a 53 65 6c 4e   to be the zSelN
49b0: 61 6d 65 20 76 61 6c 75 65 2e 20 20 4f 74 68 65  ame value.  Othe
49c0: 72 77 69 73 65 2c 20 74 68 65 20 6c 61 62 65 6c  rwise, the label
49d0: 20 69 73 20 23 4e 20 77 68 65 72 65 0a 20 20 2a   is #N where.  *
49e0: 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  * is an integer 
49f0: 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
4a00: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 53 45  ted with each SE
4a10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 73  LECT statement s
4a20: 65 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  een..  */.  if( 
4a30: 41 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  A!=0 ){.    cons
4a40: 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 2e 7a 2b  t char *z = s.z+
4a50: 36 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  6;.    int i;.  
4a60: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
4a70: 74 66 28 73 69 7a 65 6f 66 28 41 2d 3e 7a 53 65  tf(sizeof(A->zSe
4a80: 6c 4e 61 6d 65 29 2c 20 41 2d 3e 7a 53 65 6c 4e  lName), A->zSelN
4a90: 61 6d 65 2c 22 23 25 64 22 2c 2b 2b 70 50 61 72  ame,"#%d",++pPar
4aa0: 73 65 2d 3e 6e 53 65 6c 65 63 74 29 3b 0a 20 20  se->nSelect);.  
4ab0: 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27    while( z[0]=='
4ac0: 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66   ' ) z++;.    if
4ad0: 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a  ( z[0]=='/' && z
4ae0: 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  [1]=='*' ){.    
4af0: 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    z += 2;.      
4b00: 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 20 27  while( z[0]==' '
4b10: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 66 6f   ) z++;.      fo
4b20: 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73  r(i=0; sqlite3Is
4b30: 61 6c 6e 75 6d 28 7a 5b 69 5d 29 3b 20 69 2b 2b  alnum(z[i]); i++
4b40: 29 7b 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ){}.      sqlite
4b50: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
4b60: 66 28 41 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20  f(A->zSelName), 
4b70: 41 2d 3e 7a 53 65 6c 4e 61 6d 65 2c 20 22 25 2e  A->zSelName, "%.
4b80: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
4b90: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
4ba0: 53 45 4c 45 43 54 52 41 43 45 5f 45 4e 41 42 4c  SELECTRACE_ENABL
4bb0: 45 44 20 2a 2f 0a 7d 0a 6f 6e 65 73 65 6c 65 63  ED */.}.oneselec
4bc0: 74 28 41 29 20 3a 3a 3d 20 76 61 6c 75 65 73 28  t(A) ::= values(
4bd0: 41 29 2e 0a 0a 25 74 79 70 65 20 76 61 6c 75 65  A)...%type value
4be0: 73 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73  s {Select*}.%des
4bf0: 74 72 75 63 74 6f 72 20 76 61 6c 75 65 73 20 7b  tructor values {
4c00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
4c10: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
4c20: 24 24 29 3b 7d 0a 76 61 6c 75 65 73 28 41 29 20  $$);}.values(A) 
4c30: 3a 3a 3d 20 56 41 4c 55 45 53 20 4c 50 20 6e 65  ::= VALUES LP ne
4c40: 78 70 72 6c 69 73 74 28 58 29 20 52 50 2e 20 7b  xprlist(X) RP. {
4c50: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 65  .  A = sqlite3Se
4c60: 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c 58  lectNew(pParse,X
4c70: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 53 46 5f 56 61  ,0,0,0,0,0,SF_Va
4c80: 6c 75 65 73 2c 30 29 3b 0a 7d 0a 76 61 6c 75 65  lues,0);.}.value
4c90: 73 28 41 29 20 3a 3a 3d 20 76 61 6c 75 65 73 28  s(A) ::= values(
4ca0: 41 29 20 43 4f 4d 4d 41 20 4c 50 20 65 78 70 72  A) COMMA LP expr
4cb0: 6c 69 73 74 28 59 29 20 52 50 2e 20 7b 0a 20 20  list(Y) RP. {.  
4cc0: 53 65 6c 65 63 74 20 2a 70 52 69 67 68 74 2c 20  Select *pRight, 
4cd0: 2a 70 4c 65 66 74 20 3d 20 41 3b 0a 20 20 70 52  *pLeft = A;.  pR
4ce0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 53 65  ight = sqlite3Se
4cf0: 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c 59  lectNew(pParse,Y
4d00: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 53 46 5f 56 61  ,0,0,0,0,0,SF_Va
4d10: 6c 75 65 73 7c 53 46 5f 4d 75 6c 74 69 56 61 6c  lues|SF_MultiVal
4d20: 75 65 2c 30 29 3b 0a 20 20 69 66 28 20 41 4c 57  ue,0);.  if( ALW
4d30: 41 59 53 28 70 4c 65 66 74 29 20 29 20 70 4c 65  AYS(pLeft) ) pLe
4d40: 66 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 3d 20  ft->selFlags &= 
4d50: 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 65 3b 0a  ~SF_MultiValue;.
4d60: 20 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a    if( pRight ){.
4d70: 20 20 20 20 70 52 69 67 68 74 2d 3e 6f 70 20 3d      pRight->op =
4d80: 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 52 69   TK_ALL;.    pRi
4d90: 67 68 74 2d 3e 70 50 72 69 6f 72 20 3d 20 70 4c  ght->pPrior = pL
4da0: 65 66 74 3b 0a 20 20 20 20 41 20 3d 20 70 52 69  eft;.    A = pRi
4db0: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ght;.  }else{.  
4dc0: 20 20 41 20 3d 20 70 4c 65 66 74 3b 0a 20 20 7d    A = pLeft;.  }
4dd0: 0a 7d 0a 0a 2f 2f 20 54 68 65 20 22 64 69 73 74  .}..// The "dist
4de0: 69 6e 63 74 22 20 6e 6f 6e 74 65 72 6d 69 6e 61  inct" nontermina
4df0: 6c 20 69 73 20 74 72 75 65 20 28 31 29 20 69 66  l is true (1) if
4e00: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
4e10: 79 77 6f 72 64 20 69 73 0a 2f 2f 20 70 72 65 73  yword is.// pres
4e20: 65 6e 74 20 61 6e 64 20 66 61 6c 73 65 20 28 30  ent and false (0
4e30: 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a  ) if it is not..
4e40: 2f 2f 0a 25 74 79 70 65 20 64 69 73 74 69 6e 63  //.%type distinc
4e50: 74 20 7b 69 6e 74 7d 0a 64 69 73 74 69 6e 63 74  t {int}.distinct
4e60: 28 41 29 20 3a 3a 3d 20 44 49 53 54 49 4e 43 54  (A) ::= DISTINCT
4e70: 2e 20 20 20 7b 41 20 3d 20 53 46 5f 44 69 73 74  .   {A = SF_Dist
4e80: 69 6e 63 74 3b 7d 0a 64 69 73 74 69 6e 63 74 28  inct;}.distinct(
4e90: 41 29 20 3a 3a 3d 20 41 4c 4c 2e 20 20 20 20 20  A) ::= ALL.     
4ea0: 20 20 20 7b 41 20 3d 20 53 46 5f 41 6c 6c 3b 7d     {A = SF_All;}
4eb0: 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d  .distinct(A) ::=
4ec0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 7b 41 20   .           {A 
4ed0: 3d 20 30 3b 7d 0a 0a 2f 2f 20 73 65 6c 63 6f 6c  = 0;}..// selcol
4ee0: 6c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  list is a list o
4ef0: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  f expressions th
4f00: 61 74 20 61 72 65 20 74 6f 20 62 65 63 6f 6d 65  at are to become
4f10: 20 74 68 65 20 72 65 74 75 72 6e 0a 2f 2f 20 76   the return.// v
4f20: 61 6c 75 65 73 20 6f 66 20 74 68 65 20 53 45 4c  alues of the SEL
4f30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
4f40: 54 68 65 20 22 2a 22 20 69 6e 20 73 74 61 74 65  The "*" in state
4f50: 6d 65 6e 74 73 20 6c 69 6b 65 0a 2f 2f 20 22 53  ments like.// "S
4f60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e  ELECT * FROM ...
4f70: 22 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20  " is encoded as 
4f80: 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65 73  a special expres
4f90: 73 69 6f 6e 20 77 69 74 68 20 61 6e 0a 2f 2f 20  sion with an.// 
4fa0: 6f 70 63 6f 64 65 20 6f 66 20 54 4b 5f 41 53 54  opcode of TK_AST
4fb0: 45 52 49 53 4b 2e 0a 2f 2f 0a 25 74 79 70 65 20  ERISK..//.%type 
4fc0: 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72  selcollist {Expr
4fd0: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
4fe0: 6f 72 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73  or selcollist {s
4ff0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
5000: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
5010: 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 63 6c   $$);}.%type scl
5020: 70 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  p {ExprList*}.%d
5030: 65 73 74 72 75 63 74 6f 72 20 73 63 6c 70 20 7b  estructor sclp {
5040: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5050: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
5060: 2c 20 24 24 29 3b 7d 0a 73 63 6c 70 28 41 29 20  , $$);}.sclp(A) 
5070: 3a 3a 3d 20 73 65 6c 63 6f 6c 6c 69 73 74 28 41  ::= selcollist(A
5080: 29 20 43 4f 4d 4d 41 2e 0a 73 63 6c 70 28 41 29  ) COMMA..sclp(A)
5090: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73        {A = 0;}.s
50c0: 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d  elcollist(A) ::=
50d0: 20 73 63 6c 70 28 41 29 20 73 63 61 6e 70 74 28   sclp(A) scanpt(
50e0: 42 29 20 65 78 70 72 28 58 29 20 73 63 61 6e 70  B) expr(X) scanp
50f0: 74 28 5a 29 20 61 73 28 59 29 2e 20 20 20 20 20  t(Z) as(Y).     
5100: 7b 0a 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33  {.   A = sqlite3
5110: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
5120: 50 61 72 73 65 2c 20 41 2c 20 58 29 3b 0a 20 20  Parse, A, X);.  
5130: 20 69 66 28 20 59 2e 6e 3e 30 20 29 20 73 71 6c   if( Y.n>0 ) sql
5140: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
5150: 61 6d 65 28 70 50 61 72 73 65 2c 20 41 2c 20 26  ame(pParse, A, &
5160: 59 2c 20 31 29 3b 0a 20 20 20 73 71 6c 69 74 65  Y, 1);.   sqlite
5170: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
5180: 28 70 50 61 72 73 65 2c 41 2c 42 2c 5a 29 3b 0a  (pParse,A,B,Z);.
5190: 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20  }.selcollist(A) 
51a0: 3a 3a 3d 20 73 63 6c 70 28 41 29 20 73 63 61 6e  ::= sclp(A) scan
51b0: 70 74 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70  pt STAR. {.  Exp
51c0: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
51d0: 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54  pr(pParse->db, T
51e0: 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 3b 0a  K_ASTERISK, 0);.
51f0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
5200: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
5210: 73 65 2c 20 41 2c 20 70 29 3b 0a 7d 0a 73 65 6c  se, A, p);.}.sel
5220: 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  collist(A) ::= s
5230: 63 6c 70 28 41 29 20 73 63 61 6e 70 74 20 6e 6d  clp(A) scanpt nm
5240: 28 58 29 20 44 4f 54 20 53 54 41 52 2e 20 7b 0a  (X) DOT STAR. {.
5250: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
5260: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
5270: 61 72 73 65 2c 20 54 4b 5f 41 53 54 45 52 49 53  arse, TK_ASTERIS
5280: 4b 2c 20 30 2c 20 30 29 3b 0a 20 20 45 78 70 72  K, 0, 0);.  Expr
5290: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
52a0: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
52b0: 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c 20 26 58  e->db, TK_ID, &X
52c0: 2c 20 31 29 3b 0a 20 20 45 78 70 72 20 2a 70 44  , 1);.  Expr *pD
52d0: 6f 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  ot = sqlite3PExp
52e0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
52f0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
5300: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
5310: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
5320: 61 72 73 65 2c 41 2c 20 70 44 6f 74 29 3b 0a 7d  arse,A, pDot);.}
5330: 0a 0a 2f 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22  ..// An option "
5340: 41 53 20 3c 69 64 3e 22 20 70 68 72 61 73 65 20  AS <id>" phrase 
5350: 74 68 61 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  that can follow 
5360: 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  one of the expre
5370: 73 73 69 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64  ssions that.// d
5380: 65 66 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74  efine the result
5390: 20 73 65 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20   set, or one of 
53a0: 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
53b0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f  e FROM clause../
53c0: 2f 0a 25 74 79 70 65 20 61 73 20 7b 54 6f 6b 65  /.%type as {Toke
53d0: 6e 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 41 53 20  n}.as(X) ::= AS 
53e0: 6e 6d 28 59 29 2e 20 20 20 20 7b 58 20 3d 20 59  nm(Y).    {X = Y
53f0: 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 69 64 73  ;}.as(X) ::= ids
5400: 28 58 29 2e 0a 61 73 28 58 29 20 3a 3a 3d 20 2e  (X)..as(X) ::= .
5410: 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 2e 6e              {X.n
5420: 20 3d 20 30 3b 20 58 2e 7a 20 3d 20 30 3b 7d 0a   = 0; X.z = 0;}.
5430: 0a 0a 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69  ..%type seltabli
5440: 73 74 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  st {SrcList*}.%d
5450: 65 73 74 72 75 63 74 6f 72 20 73 65 6c 74 61 62  estructor seltab
5460: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 53 72 63  list {sqlite3Src
5470: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
5480: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79  e->db, $$);}.%ty
5490: 70 65 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 53  pe stl_prefix {S
54a0: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  rcList*}.%destru
54b0: 63 74 6f 72 20 73 74 6c 5f 70 72 65 66 69 78 20  ctor stl_prefix 
54c0: 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  {sqlite3SrcListD
54d0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
54e0: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 66 72  , $$);}.%type fr
54f0: 6f 6d 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  om {SrcList*}.%d
5500: 65 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b  estructor from {
5510: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
5520: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
5530: 20 24 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f 6d   $$);}..// A com
5540: 70 6c 65 74 65 20 46 52 4f 4d 20 63 6c 61 75 73  plete FROM claus
5550: 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a 3a  e..//.from(A) ::
5560: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
5570: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 44     {A = sqlite3D
5580: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
5590: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
55a0: 41 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a  A));}.from(A) ::
55b0: 3d 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73  = FROM seltablis
55c0: 74 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 58 3b  t(X). {.  A = X;
55d0: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
55e0: 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 41  tShiftJoinType(A
55f0: 29 3b 0a 7d 0a 0a 2f 2f 20 22 73 65 6c 74 61 62  );.}..// "seltab
5600: 6c 69 73 74 22 20 69 73 20 61 20 22 53 65 6c 65  list" is a "Sele
5610: 63 74 20 54 61 62 6c 65 20 4c 69 73 74 22 20 2d  ct Table List" -
5620: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
5630: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
5640: 2f 2f 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73  // in a SELECT s
5650: 74 61 74 65 6d 65 6e 74 2e 20 20 22 73 74 6c 5f  tatement.  "stl_
5660: 70 72 65 66 69 78 22 20 69 73 20 61 20 70 72 65  prefix" is a pre
5670: 66 69 78 20 6f 66 20 74 68 69 73 20 6c 69 73 74  fix of this list
5680: 2e 0a 2f 2f 0a 73 74 6c 5f 70 72 65 66 69 78 28  ..//.stl_prefix(
5690: 41 29 20 3a 3a 3d 20 73 65 6c 74 61 62 6c 69 73  A) ::= seltablis
56a0: 74 28 41 29 20 6a 6f 69 6e 6f 70 28 59 29 2e 20  t(A) joinop(Y). 
56b0: 20 20 20 7b 0a 20 20 20 69 66 28 20 41 4c 57 41     {.   if( ALWA
56c0: 59 53 28 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e  YS(A && A->nSrc>
56d0: 30 29 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72  0) ) A->a[A->nSr
56e0: 63 2d 31 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  c-1].fg.jointype
56f0: 20 3d 20 28 75 38 29 59 3b 0a 7d 0a 73 74 6c 5f   = (u8)Y;.}.stl_
5700: 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20  prefix(A) ::= . 
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
5730: 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28 41 29  ;}.seltablist(A)
5740: 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28   ::= stl_prefix(
5750: 41 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 44 29  A) nm(Y) dbnm(D)
5760: 20 61 73 28 5a 29 20 69 6e 64 65 78 65 64 5f 6f   as(Z) indexed_o
5770: 70 74 28 49 29 0a 20 20 20 20 20 20 20 20 20 20  pt(I).          
5780: 20 20 20 20 20 20 20 20 6f 6e 5f 6f 70 74 28 4e          on_opt(N
5790: 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20  ) using_opt(U). 
57a0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53  {.  A = sqlite3S
57b0: 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d  rcListAppendFrom
57c0: 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c 26 59  Term(pParse,A,&Y
57d0: 2c 26 44 2c 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20  ,&D,&Z,0,N,U);. 
57e0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49   sqlite3SrcListI
57f0: 6e 64 65 78 65 64 42 79 28 70 50 61 72 73 65 2c  ndexedBy(pParse,
5800: 20 41 2c 20 26 49 29 3b 0a 7d 0a 73 65 6c 74 61   A, &I);.}.selta
5810: 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c  blist(A) ::= stl
5820: 5f 70 72 65 66 69 78 28 41 29 20 6e 6d 28 59 29  _prefix(A) nm(Y)
5830: 20 64 62 6e 6d 28 44 29 20 4c 50 20 65 78 70 72   dbnm(D) LP expr
5840: 6c 69 73 74 28 45 29 20 52 50 20 61 73 28 5a 29  list(E) RP as(Z)
5850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5860: 20 20 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69     on_opt(N) usi
5870: 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 41  ng_opt(U). {.  A
5880: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
5890: 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
58a0: 70 50 61 72 73 65 2c 41 2c 26 59 2c 26 44 2c 26  pParse,A,&Y,&D,&
58b0: 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20 73 71 6c 69  Z,0,N,U);.  sqli
58c0: 74 65 33 53 72 63 4c 69 73 74 46 75 6e 63 41 72  te3SrcListFuncAr
58d0: 67 73 28 70 50 61 72 73 65 2c 20 41 2c 20 45 29  gs(pParse, A, E)
58e0: 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.%ifndef SQLI
58f0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5900: 0a 20 20 73 65 6c 74 61 62 6c 69 73 74 28 41 29  .  seltablist(A)
5910: 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28   ::= stl_prefix(
5920: 41 29 20 4c 50 20 73 65 6c 65 63 74 28 53 29 20  A) LP select(S) 
5930: 52 50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RP.             
5940: 20 20 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f         as(Z) on_
5950: 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74  opt(N) using_opt
5960: 28 55 29 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73  (U). {.    A = s
5970: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
5980: 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
5990: 73 65 2c 41 2c 30 2c 30 2c 26 5a 2c 53 2c 4e 2c  se,A,0,0,&Z,S,N,
59a0: 55 29 3b 0a 20 20 7d 0a 20 20 73 65 6c 74 61 62  U);.  }.  seltab
59b0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f  list(A) ::= stl_
59c0: 70 72 65 66 69 78 28 41 29 20 4c 50 20 73 65 6c  prefix(A) LP sel
59d0: 74 61 62 6c 69 73 74 28 46 29 20 52 50 0a 20 20  tablist(F) RP.  
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59f0: 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e    as(Z) on_opt(N
5a00: 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20  ) using_opt(U). 
5a10: 7b 0a 20 20 20 20 69 66 28 20 41 3d 3d 30 20 26  {.    if( A==0 &
5a20: 26 20 5a 2e 6e 3d 3d 30 20 26 26 20 4e 3d 3d 30  & Z.n==0 && N==0
5a30: 20 26 26 20 55 3d 3d 30 20 29 7b 0a 20 20 20 20   && U==0 ){.    
5a40: 20 20 41 20 3d 20 46 3b 0a 20 20 20 20 7d 65 6c    A = F;.    }el
5a50: 73 65 20 69 66 28 20 46 2d 3e 6e 53 72 63 3d 3d  se if( F->nSrc==
5a60: 31 20 29 7b 0a 20 20 20 20 20 20 41 20 3d 20 73  1 ){.      A = s
5a70: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
5a80: 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
5a90: 73 65 2c 41 2c 30 2c 30 2c 26 5a 2c 30 2c 4e 2c  se,A,0,0,&Z,0,N,
5aa0: 55 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 20  U);.      if( A 
5ab0: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
5ac0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
5ad0: 70 4e 65 77 20 3d 20 26 41 2d 3e 61 5b 41 2d 3e  pNew = &A->a[A->
5ae0: 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 20 20 20  nSrc-1];.       
5af0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
5b00: 69 74 65 6d 20 2a 70 4f 6c 64 20 3d 20 46 2d 3e  item *pOld = F->
5b10: 61 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  a;.        pNew-
5b20: 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c 64 2d 3e 7a  >zName = pOld->z
5b30: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  Name;.        pN
5b40: 65 77 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  ew->zDatabase = 
5b50: 70 4f 6c 64 2d 3e 7a 44 61 74 61 62 61 73 65 3b  pOld->zDatabase;
5b60: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
5b70: 53 65 6c 65 63 74 20 3d 20 70 4f 6c 64 2d 3e 70  Select = pOld->p
5b80: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
5b90: 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 20 3d 20 70 4f  pOld->zName = pO
5ba0: 6c 64 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  ld->zDatabase = 
5bb0: 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 2d  0;.        pOld-
5bc0: 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20  >pSelect = 0;.  
5bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
5be0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
5bf0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 46 29 3b  (pParse->db, F);
5c00: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5c10: 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75    Select *pSubqu
5c20: 65 72 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ery;.      sqlit
5c30: 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
5c40: 69 6e 54 79 70 65 28 46 29 3b 0a 20 20 20 20 20  inType(F);.     
5c50: 20 70 53 75 62 71 75 65 72 79 20 3d 20 73 71 6c   pSubquery = sql
5c60: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50  ite3SelectNew(pP
5c70: 61 72 73 65 2c 30 2c 46 2c 30 2c 30 2c 30 2c 30  arse,0,F,0,0,0,0
5c80: 2c 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 2c 30  ,SF_NestedFrom,0
5c90: 29 3b 0a 20 20 20 20 20 20 41 20 3d 20 73 71 6c  );.      A = sql
5ca0: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
5cb0: 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
5cc0: 2c 41 2c 30 2c 30 2c 26 5a 2c 70 53 75 62 71 75  ,A,0,0,&Z,pSubqu
5cd0: 65 72 79 2c 4e 2c 55 29 3b 0a 20 20 20 20 7d 0a  ery,N,U);.    }.
5ce0: 20 20 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49    }.%endif  SQLI
5cf0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5d00: 0a 0a 25 74 79 70 65 20 64 62 6e 6d 20 7b 54 6f  ..%type dbnm {To
5d10: 6b 65 6e 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d  ken}.dbnm(A) ::=
5d20: 20 2e 20 20 20 20 20 20 20 20 20 20 7b 41 2e 7a   .          {A.z
5d30: 3d 30 3b 20 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d  =0; A.n=0;}.dbnm
5d40: 28 41 29 20 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58  (A) ::= DOT nm(X
5d50: 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79  ). {A = X;}..%ty
5d60: 70 65 20 66 75 6c 6c 6e 61 6d 65 20 7b 53 72 63  pe fullname {Src
5d70: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
5d80: 6f 72 20 66 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c  or fullname {sql
5d90: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
5da0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
5db0: 29 3b 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20  );}.fullname(A) 
5dc0: 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20 0a 20 20 20  ::= nm(X).  .   
5dd0: 7b 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  {A = sqlite3SrcL
5de0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
5df0: 2d 3e 64 62 2c 30 2c 26 58 2c 30 29 3b 20 2f 2a  ->db,0,&X,0); /*
5e00: 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f  A-overwrites-X*/
5e10: 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a  }.fullname(A) ::
5e20: 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59  = nm(X) DOT nm(Y
5e30: 29 2e 20 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c  ).  .   {A = sql
5e40: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
5e50: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26  d(pParse->db,0,&
5e60: 58 2c 26 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77  X,&Y); /*A-overw
5e70: 72 69 74 65 73 2d 58 2a 2f 7d 0a 0a 25 74 79 70  rites-X*/}..%typ
5e80: 65 20 6a 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 6a  e joinop {int}.j
5e90: 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43 4f 4d  oinop(X) ::= COM
5ea0: 4d 41 7c 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20  MA|JOIN.        
5eb0: 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54 5f 49        { X = JT_I
5ec0: 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58  NNER; }.joinop(X
5ed0: 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29  ) ::= JOIN_KW(A)
5ee0: 20 4a 4f 49 4e 2e 0a 20 20 20 20 20 20 20 20 20   JOIN..         
5ef0: 20 20 20 20 20 20 20 20 20 7b 58 20 3d 20 73 71           {X = sq
5f00: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50  lite3JoinType(pP
5f10: 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20 20 2f  arse,&A,0,0);  /
5f20: 2a 58 2d 6f 76 65 72 77 72 69 74 65 73 2d 41 2a  *X-overwrites-A*
5f30: 2f 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d  /}.joinop(X) ::=
5f40: 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42   JOIN_KW(A) nm(B
5f50: 29 20 4a 4f 49 4e 2e 0a 20 20 20 20 20 20 20 20  ) JOIN..        
5f60: 20 20 20 20 20 20 20 20 20 20 7b 58 20 3d 20 73            {X = s
5f70: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70  qlite3JoinType(p
5f80: 50 61 72 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20  Parse,&A,&B,0); 
5f90: 2f 2a 58 2d 6f 76 65 72 77 72 69 74 65 73 2d 41  /*X-overwrites-A
5fa0: 2a 2f 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a  */}.joinop(X) ::
5fb0: 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28  = JOIN_KW(A) nm(
5fc0: 42 29 20 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20  B) nm(C) JOIN.. 
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 7b 58 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69   {X = sqlite3Joi
5ff0: 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 41 2c  nType(pParse,&A,
6000: 26 42 2c 26 43 29 3b 2f 2a 58 2d 6f 76 65 72 77  &B,&C);/*X-overw
6010: 72 69 74 65 73 2d 41 2a 2f 7d 0a 0a 2f 2f 20 54  rites-A*/}..// T
6020: 68 65 72 65 20 69 73 20 61 20 70 61 72 73 69 6e  here is a parsin
6030: 67 20 61 62 69 67 75 69 74 79 20 69 6e 20 61 6e  g abiguity in an
6040: 20 75 70 73 65 72 74 20 73 74 61 74 65 6d 65 6e   upsert statemen
6050: 74 20 74 68 61 74 20 75 73 65 73 20 61 0a 2f 2f  t that uses a.//
6060: 20 53 45 4c 45 43 54 20 6f 6e 20 74 68 65 20 52   SELECT on the R
6070: 48 53 20 6f 66 20 61 20 74 68 65 20 49 4e 53 45  HS of a the INSE
6080: 52 54 3a 0a 2f 2f 0a 2f 2f 20 20 20 20 20 20 49  RT:.//.//      I
6090: 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20 53  NSERT INTO tab S
60a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 61 61  ELECT * FROM aaa
60b0: 20 4a 4f 49 4e 20 62 62 62 20 4f 4e 20 43 4f 4e   JOIN bbb ON CON
60c0: 46 4c 49 43 54 20 2e 2e 2e 0a 2f 2f 20 20 20 20  FLICT ....//    
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 20 68 65 72 65 20 2d 2d 2d 2d 5e 5e 0a      here ----^^.
6100: 2f 2f 0a 2f 2f 20 57 68 65 6e 20 74 68 65 20 4f  //.// When the O
6110: 4e 20 74 6f 6b 65 6e 20 69 73 20 65 6e 63 6f 75  N token is encou
6120: 6e 74 65 72 65 64 2c 20 74 68 65 20 70 61 72 73  ntered, the pars
6130: 65 72 20 64 6f 65 73 20 6e 6f 74 20 6b 6e 6f 77  er does not know
6140: 20 69 66 20 69 74 20 69 73 0a 2f 2f 20 74 68 65   if it is.// the
6150: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
6160: 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
6170: 75 73 65 2c 20 6f 72 20 74 68 65 20 62 65 67 69  use, or the begi
6180: 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 4f 4e 0a 2f  nning of an ON./
6190: 2f 20 63 6c 61 75 73 65 20 61 73 73 6f 63 69 61  / clause associa
61a0: 74 65 64 20 77 69 74 68 20 74 68 65 20 4a 4f 49  ted with the JOI
61b0: 4e 2e 20 20 54 68 65 20 63 6f 6e 66 6c 69 63 74  N.  The conflict
61c0: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 69 6e 20   is resolved in 
61d0: 66 61 76 6f 72 0a 2f 2f 20 6f 66 20 74 68 65 20  favor.// of the 
61e0: 4a 4f 49 4e 2e 20 20 49 66 20 61 6e 20 4f 4e 20  JOIN.  If an ON 
61f0: 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 20  CONFLICT clause 
6200: 69 73 20 69 6e 74 65 6e 64 65 64 2c 20 69 6e 73  is intended, ins
6210: 65 72 74 20 61 20 64 75 6d 6d 79 0a 2f 2f 20 57  ert a dummy.// W
6220: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 62  HERE clause in b
6230: 65 74 77 65 65 6e 2c 20 6c 69 6b 65 20 74 68 69  etween, like thi
6240: 73 3a 0a 2f 2f 0a 2f 2f 20 20 20 20 20 20 49 4e  s:.//.//      IN
6250: 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20 53 45  SERT INTO tab SE
6260: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 61 61 20  LECT * FROM aaa 
6270: 4a 4f 49 4e 20 62 62 62 20 57 48 45 52 45 20 74  JOIN bbb WHERE t
6280: 72 75 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  rue ON CONFLICT 
6290: 2e 2e 2e 0a 2f 2f 0a 2f 2f 20 54 68 65 20 5b 41  ....//.// The [A
62a0: 4e 44 5d 20 61 6e 64 20 5b 4f 52 5d 20 70 72 65  ND] and [OR] pre
62b0: 63 65 64 65 6e 63 65 20 6d 61 72 6b 73 20 69 6e  cedence marks in
62c0: 20 74 68 65 20 72 75 6c 65 73 20 66 6f 72 20 6f   the rules for o
62d0: 6e 5f 6f 70 74 20 63 61 75 73 65 20 74 68 65 0a  n_opt cause the.
62e0: 2f 2f 20 4f 4e 20 69 6e 20 74 68 69 73 20 63 6f  // ON in this co
62f0: 6e 74 65 78 74 20 74 6f 20 61 6c 77 61 79 73 20  ntext to always 
6300: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  be interpreted a
6310: 73 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  s belonging to t
6320: 68 65 20 4a 4f 49 4e 2e 0a 2f 2f 0a 25 74 79 70  he JOIN..//.%typ
6330: 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70 72 2a 7d  e on_opt {Expr*}
6340: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f 6e 5f  .%destructor on_
6350: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
6360: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6370: 62 2c 20 24 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28  b, $$);}.on_opt(
6380: 4e 29 20 3a 3a 3d 20 4f 4e 20 65 78 70 72 28 45  N) ::= ON expr(E
6390: 29 2e 20 20 7b 4e 20 3d 20 45 3b 7d 0a 6f 6e 5f  ).  {N = E;}.on_
63a0: 6f 70 74 28 4e 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(N) ::= .    
63b0: 20 5b 4f 52 5d 20 20 20 7b 4e 20 3d 20 30 3b 7d   [OR]   {N = 0;}
63c0: 0a 0a 2f 2f 20 4e 6f 74 65 20 74 68 61 74 20 74  ..// Note that t
63d0: 68 69 73 20 62 6c 6f 63 6b 20 61 62 75 73 65 73  his block abuses
63e0: 20 74 68 65 20 54 6f 6b 65 6e 20 74 79 70 65 20   the Token type 
63f0: 6a 75 73 74 20 61 20 6c 69 74 74 6c 65 2e 20 49  just a little. I
6400: 66 20 74 68 65 72 65 20 69 73 0a 2f 2f 20 6e 6f  f there is.// no
6410: 20 22 49 4e 44 45 58 45 44 20 42 59 22 20 63 6c   "INDEXED BY" cl
6420: 61 75 73 65 2c 20 74 68 65 20 72 65 74 75 72 6e  ause, the return
6430: 65 64 20 74 6f 6b 65 6e 20 69 73 20 65 6d 70 74  ed token is empt
6440: 79 20 28 7a 3d 3d 30 20 26 26 20 6e 3d 3d 30 29  y (z==0 && n==0)
6450: 2e 20 49 66 0a 2f 2f 20 74 68 65 72 65 20 69 73  . If.// there is
6460: 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63   an INDEXED BY c
6470: 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 65 20  lause, then the 
6480: 74 6f 6b 65 6e 20 69 73 20 70 6f 70 75 6c 61 74  token is populat
6490: 65 64 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  ed as per normal
64a0: 2c 0a 2f 2f 20 77 69 74 68 20 7a 20 70 6f 69 6e  ,.// with z poin
64b0: 74 69 6e 67 20 74 6f 20 74 68 65 20 74 6f 6b 65  ting to the toke
64c0: 6e 20 64 61 74 61 20 61 6e 64 20 6e 20 63 6f 6e  n data and n con
64d0: 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 75 6d 62  taining the numb
64e0: 65 72 20 6f 66 20 62 79 74 65 73 0a 2f 2f 20 69  er of bytes.// i
64f0: 6e 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2f 2f 0a  n the token..//.
6500: 2f 2f 20 49 66 20 74 68 65 72 65 20 69 73 20 61  // If there is a
6510: 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63   "NOT INDEXED" c
6520: 6c 61 75 73 65 2c 20 74 68 65 6e 20 28 7a 3d 3d  lause, then (z==
6530: 30 20 26 26 20 6e 3d 3d 31 29 2c 20 77 68 69 63  0 && n==1), whic
6540: 68 20 69 73 20 0a 2f 2f 20 6e 6f 72 6d 61 6c 6c  h is .// normall
6550: 79 20 69 6c 6c 65 67 61 6c 2e 20 54 68 65 20 73  y illegal. The s
6560: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
6570: 65 78 65 64 42 79 28 29 20 66 75 6e 63 74 69 6f  exedBy() functio
6580: 6e 20 0a 2f 2f 20 72 65 63 6f 67 6e 69 7a 65 73  n .// recognizes
6590: 20 61 6e 64 20 69 6e 74 65 72 70 72 65 74 73 20   and interprets 
65a0: 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69 61  this as a specia
65b0: 6c 20 63 61 73 65 2e 0a 2f 2f 0a 25 74 79 70 65  l case..//.%type
65c0: 20 69 6e 64 65 78 65 64 5f 6f 70 74 20 7b 54 6f   indexed_opt {To
65d0: 6b 65 6e 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74  ken}.indexed_opt
65e0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
65f0: 20 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30            {A.z=0
6600: 3b 20 41 2e 6e 3d 30 3b 7d 0a 69 6e 64 65 78 65  ; A.n=0;}.indexe
6610: 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e 44  d_opt(A) ::= IND
6620: 45 58 45 44 20 42 59 20 6e 6d 28 58 29 2e 20 7b  EXED BY nm(X). {
6630: 41 20 3d 20 58 3b 7d 0a 69 6e 64 65 78 65 64 5f  A = X;}.indexed_
6640: 6f 70 74 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 49  opt(A) ::= NOT I
6650: 4e 44 45 58 45 44 2e 20 20 20 20 20 20 7b 41 2e  NDEXED.      {A.
6660: 7a 3d 30 3b 20 41 2e 6e 3d 31 3b 7d 0a 0a 25 74  z=0; A.n=1;}..%t
6670: 79 70 65 20 75 73 69 6e 67 5f 6f 70 74 20 7b 49  ype using_opt {I
6680: 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  dList*}.%destruc
6690: 74 6f 72 20 75 73 69 6e 67 5f 6f 70 74 20 7b 73  tor using_opt {s
66a0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
66b0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
66c0: 24 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55  $);}.using_opt(U
66d0: 29 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20 69  ) ::= USING LP i
66e0: 64 6c 69 73 74 28 4c 29 20 52 50 2e 20 20 7b 55  dlist(L) RP.  {U
66f0: 20 3d 20 4c 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74   = L;}.using_opt
6700: 28 55 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (U) ::= .       
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 7b 55 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70   {U = 0;}...%typ
6730: 65 20 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b 45  e orderby_opt {E
6740: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
6750: 75 63 74 6f 72 20 6f 72 64 65 72 62 79 5f 6f 70  uctor orderby_op
6760: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
6770: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
6780: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 2f 2f 20 74  >db, $$);}..// t
6790: 68 65 20 73 6f 72 74 6c 69 73 74 20 6e 6f 6e 2d  he sortlist non-
67a0: 74 65 72 6d 69 6e 61 6c 20 73 74 6f 72 65 73 20  terminal stores 
67b0: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
67c0: 73 69 6f 6e 20 77 68 65 72 65 20 65 61 63 68 0a  sion where each.
67d0: 2f 2f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  // expression is
67e0: 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 66 6f 6c 6c   optionally foll
67f0: 6f 77 65 64 20 62 79 20 41 53 43 20 6f 72 20 44  owed by ASC or D
6800: 45 53 43 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ESC to indicate 
6810: 74 68 65 0a 2f 2f 20 73 6f 72 74 20 6f 72 64 65  the.// sort orde
6820: 72 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 6f 72 74  r..//.%type sort
6830: 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d  list {ExprList*}
6840: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 6f 72  .%destructor sor
6850: 74 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  tlist {sqlite3Ex
6860: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
6870: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a  rse->db, $$);}..
6880: 6f 72 64 65 72 62 79 5f 6f 70 74 28 41 29 20 3a  orderby_opt(A) :
6890: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
68b0: 20 3d 20 30 3b 7d 0a 6f 72 64 65 72 62 79 5f 6f   = 0;}.orderby_o
68c0: 70 74 28 41 29 20 3a 3a 3d 20 4f 52 44 45 52 20  pt(A) ::= ORDER 
68d0: 42 59 20 73 6f 72 74 6c 69 73 74 28 58 29 2e 20  BY sortlist(X). 
68e0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 6f       {A = X;}.so
68f0: 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f  rtlist(A) ::= so
6900: 72 74 6c 69 73 74 28 41 29 20 43 4f 4d 4d 41 20  rtlist(A) COMMA 
6910: 65 78 70 72 28 59 29 20 73 6f 72 74 6f 72 64 65  expr(Y) sortorde
6920: 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  r(Z). {.  A = sq
6930: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
6940: 65 6e 64 28 70 50 61 72 73 65 2c 41 2c 59 29 3b  end(pParse,A,Y);
6950: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
6960: 73 74 53 65 74 53 6f 72 74 4f 72 64 65 72 28 41  stSetSortOrder(A
6970: 2c 5a 29 3b 0a 7d 0a 73 6f 72 74 6c 69 73 74 28  ,Z);.}.sortlist(
6980: 41 29 20 3a 3a 3d 20 65 78 70 72 28 59 29 20 73  A) ::= expr(Y) s
6990: 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20  ortorder(Z). {. 
69a0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
69b0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
69c0: 65 2c 30 2c 59 29 3b 20 2f 2a 41 2d 6f 76 65 72  e,0,Y); /*A-over
69d0: 77 72 69 74 65 73 2d 59 2a 2f 0a 20 20 73 71 6c  writes-Y*/.  sql
69e0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
69f0: 6f 72 74 4f 72 64 65 72 28 41 2c 5a 29 3b 0a 7d  ortOrder(A,Z);.}
6a00: 0a 0a 25 74 79 70 65 20 73 6f 72 74 6f 72 64 65  ..%type sortorde
6a10: 72 20 7b 69 6e 74 7d 0a 0a 73 6f 72 74 6f 72 64  r {int}..sortord
6a20: 65 72 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20 20  er(A) ::= ASC.  
6a30: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51           {A = SQ
6a40: 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f  LITE_SO_ASC;}.so
6a50: 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 44  rtorder(A) ::= D
6a60: 45 53 43 2e 20 20 20 20 20 20 20 20 20 20 7b 41  ESC.          {A
6a70: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53   = SQLITE_SO_DES
6a80: 43 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29  C;}.sortorder(A)
6a90: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
6aa0: 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f      {A = SQLITE_
6ab0: 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3b 7d 0a 0a  SO_UNDEFINED;}..
6ac0: 25 74 79 70 65 20 67 72 6f 75 70 62 79 5f 6f 70  %type groupby_op
6ad0: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
6ae0: 65 73 74 72 75 63 74 6f 72 20 67 72 6f 75 70 62  estructor groupb
6af0: 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  y_opt {sqlite3Ex
6b00: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
6b10: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 67  rse->db, $$);}.g
6b20: 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a  roupby_opt(A) ::
6b30: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
6b40: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
6b50: 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29  }.groupby_opt(A)
6b60: 20 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 6e 65   ::= GROUP BY ne
6b70: 78 70 72 6c 69 73 74 28 58 29 2e 20 7b 41 20 3d  xprlist(X). {A =
6b80: 20 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76 69   X;}..%type havi
6b90: 6e 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25  ng_opt {Expr*}.%
6ba0: 64 65 73 74 72 75 63 74 6f 72 20 68 61 76 69 6e  destructor havin
6bb0: 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  g_opt {sqlite3Ex
6bc0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
6bd0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 68 61 76 69 6e  >db, $$);}.havin
6be0: 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  g_opt(A) ::= .  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
6c00: 20 3d 20 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70   = 0;}.having_op
6c10: 74 28 41 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20  t(A) ::= HAVING 
6c20: 65 78 70 72 28 58 29 2e 20 20 7b 41 20 3d 20 58  expr(X).  {A = X
6c30: 3b 7d 0a 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f  ;}..%type limit_
6c40: 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 0a 2f 2f 20  opt {Expr*}..// 
6c50: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  The destructor f
6c60: 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 77 69 6c  or limit_opt wil
6c70: 6c 20 6e 65 76 65 72 20 66 69 72 65 20 69 6e 20  l never fire in 
6c80: 74 68 65 20 63 75 72 72 65 6e 74 20 67 72 61 6d  the current gram
6c90: 6d 61 72 2e 0a 2f 2f 20 54 68 65 20 6c 69 6d 69  mar..// The limi
6ca0: 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e  t_opt non-termin
6cb0: 61 6c 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 61  al only occurs a
6cc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 73  t the end of a s
6cd0: 69 6e 67 6c 65 20 70 72 6f 64 75 63 74 69 6f 6e  ingle production
6ce0: 0a 2f 2f 20 72 75 6c 65 20 66 6f 72 20 53 45 4c  .// rule for SEL
6cf0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ECT statements. 
6d00: 20 41 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   As soon as the 
6d10: 72 75 6c 65 20 74 68 61 74 20 63 72 65 61 74 65  rule that create
6d20: 20 74 68 65 20 0a 2f 2f 20 6c 69 6d 69 74 5f 6f   the .// limit_o
6d30: 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  pt non-terminal 
6d40: 72 65 64 75 63 65 73 2c 20 74 68 65 20 53 45 4c  reduces, the SEL
6d50: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 75  ECT statement ru
6d60: 6c 65 20 77 69 6c 6c 20 61 6c 73 6f 0a 2f 2f 20  le will also.// 
6d70: 72 65 64 75 63 65 2e 20 20 53 6f 20 74 68 65 72  reduce.  So ther
6d80: 65 20 69 73 20 6e 65 76 65 72 20 61 20 6c 69 6d  e is never a lim
6d90: 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69  it_opt non-termi
6da0: 6e 61 6c 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  nal on the stack
6db0: 20 0a 2f 2f 20 65 78 63 65 70 74 20 61 73 20 61   .// except as a
6dc0: 20 74 72 61 6e 73 69 65 6e 74 2e 20 20 53 6f 20   transient.  So 
6dd0: 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
6de0: 6e 79 74 68 69 6e 67 20 74 6f 20 64 65 73 74 72  nything to destr
6df0: 6f 79 2e 0a 2f 2f 0a 2f 2f 25 64 65 73 74 72 75  oy..//.//%destru
6e00: 63 74 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 7b  ctor limit_opt {
6e10: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6e20: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
6e30: 29 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  );}.limit_opt(A)
6e40: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 7b 41 20   ::= .       {A 
6e50: 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28  = 0;}.limit_opt(
6e60: 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70  A) ::= LIMIT exp
6e70: 72 28 58 29 2e 0a 20 20 20 20 20 20 20 20 20 20  r(X)..          
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6e90: 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  A = sqlite3PExpr
6ea0: 28 70 50 61 72 73 65 2c 54 4b 5f 4c 49 4d 49 54  (pParse,TK_LIMIT
6eb0: 2c 58 2c 30 29 3b 7d 0a 6c 69 6d 69 74 5f 6f 70  ,X,0);}.limit_op
6ec0: 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65  t(A) ::= LIMIT e
6ed0: 78 70 72 28 58 29 20 4f 46 46 53 45 54 20 65 78  xpr(X) OFFSET ex
6ee0: 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20  pr(Y). .        
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78   {A = sqlite3PEx
6f10: 70 72 28 70 50 61 72 73 65 2c 54 4b 5f 4c 49 4d  pr(pParse,TK_LIM
6f20: 49 54 2c 58 2c 59 29 3b 7d 0a 6c 69 6d 69 74 5f  IT,X,Y);}.limit_
6f30: 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54  opt(A) ::= LIMIT
6f40: 20 65 78 70 72 28 58 29 20 43 4f 4d 4d 41 20 65   expr(X) COMMA e
6f50: 78 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20  xpr(Y). .       
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45    {A = sqlite3PE
6f80: 78 70 72 28 70 50 61 72 73 65 2c 54 4b 5f 4c 49  xpr(pParse,TK_LI
6f90: 4d 49 54 2c 59 2c 58 29 3b 7d 0a 0a 2f 2f 2f 2f  MIT,Y,X);}..////
6fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6fb0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 45 4c 45  /////// The DELE
6fc0: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  TE statement ///
6fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69  //////////.//.%i
6ff0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7000: 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45  LE_UPDATE_DELETE
7010: 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77  _LIMIT.cmd ::= w
7020: 69 74 68 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  ith DELETE FROM 
7030: 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65  fullname(X) inde
7040: 78 65 64 5f 6f 70 74 28 49 29 20 77 68 65 72 65  xed_opt(I) where
7050: 5f 6f 70 74 28 57 29 20 0a 20 20 20 20 20 20 20  _opt(W) .       
7060: 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 4f 29 20   orderby_opt(O) 
7070: 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a  limit_opt(L). {.
7080: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
7090: 49 6e 64 65 78 65 64 42 79 28 70 50 61 72 73 65  IndexedBy(pParse
70a0: 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69  , X, &I);.  sqli
70b0: 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50  te3DeleteFrom(pP
70c0: 61 72 73 65 2c 58 2c 57 2c 4f 2c 4c 29 3b 0a 7d  arse,X,W,O,L);.}
70d0: 0a 25 65 6e 64 69 66 0a 25 69 66 6e 64 65 66 20  .%endif.%ifndef 
70e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50  SQLITE_ENABLE_UP
70f0: 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49  DATE_DELETE_LIMI
7100: 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 20 44  T.cmd ::= with D
7110: 45 4c 45 54 45 20 46 52 4f 4d 20 66 75 6c 6c 6e  ELETE FROM fulln
7120: 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f 6f  ame(X) indexed_o
7130: 70 74 28 49 29 20 77 68 65 72 65 5f 6f 70 74 28  pt(I) where_opt(
7140: 57 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 53  W). {.  sqlite3S
7150: 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
7160: 70 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a  pParse, X, &I);.
7170: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46    sqlite3DeleteF
7180: 72 6f 6d 28 70 50 61 72 73 65 2c 58 2c 57 2c 30  rom(pParse,X,W,0
7190: 2c 30 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25  ,0);.}.%endif..%
71a0: 74 79 70 65 20 77 68 65 72 65 5f 6f 70 74 20 7b  type where_opt {
71b0: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
71c0: 6f 72 20 77 68 65 72 65 5f 6f 70 74 20 7b 73 71  or where_opt {sq
71d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
71e0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
71f0: 7d 0a 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 20  }..where_opt(A) 
7200: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
7210: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
7220: 7d 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a  }.where_opt(A) :
7230: 3a 3d 20 57 48 45 52 45 20 65 78 70 72 28 58 29  := WHERE expr(X)
7240: 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  .       {A = X;}
7250: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
7260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
7270: 20 55 50 44 41 54 45 20 63 6f 6d 6d 61 6e 64 20   UPDATE command 
7280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
72a0: 0a 2f 2f 0a 25 69 66 64 65 66 20 53 51 4c 49 54  .//.%ifdef SQLIT
72b0: 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f  E_ENABLE_UPDATE_
72c0: 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a 63 6d 64  DELETE_LIMIT.cmd
72d0: 20 3a 3a 3d 20 77 69 74 68 20 55 50 44 41 54 45   ::= with UPDATE
72e0: 20 6f 72 63 6f 6e 66 28 52 29 20 66 75 6c 6c 6e   orconf(R) fulln
72f0: 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f 6f  ame(X) indexed_o
7300: 70 74 28 49 29 20 53 45 54 20 73 65 74 6c 69 73  pt(I) SET setlis
7310: 74 28 59 29 0a 20 20 20 20 20 20 20 20 77 68 65  t(Y).        whe
7320: 72 65 5f 6f 70 74 28 57 29 20 6f 72 64 65 72 62  re_opt(W) orderb
7330: 79 5f 6f 70 74 28 4f 29 20 6c 69 6d 69 74 5f 6f  y_opt(O) limit_o
7340: 70 74 28 4c 29 2e 20 20 7b 0a 20 20 73 71 6c 69  pt(L).  {.  sqli
7350: 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
7360: 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20 26  dBy(pParse, X, &
7370: 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  I);.  sqlite3Exp
7380: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
7390: 28 70 50 61 72 73 65 2c 59 2c 22 73 65 74 20 6c  (pParse,Y,"set l
73a0: 69 73 74 22 29 3b 20 0a 20 20 73 71 6c 69 74 65  ist"); .  sqlite
73b0: 33 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 58  3Update(pParse,X
73c0: 2c 59 2c 57 2c 52 2c 4f 2c 4c 29 3b 0a 7d 0a 25  ,Y,W,R,O,L);.}.%
73d0: 65 6e 64 69 66 0a 25 69 66 6e 64 65 66 20 53 51  endif.%ifndef SQ
73e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
73f0: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a  TE_DELETE_LIMIT.
7400: 63 6d 64 20 3a 3a 3d 20 77 69 74 68 20 55 50 44  cmd ::= with UPD
7410: 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20 66 75  ATE orconf(R) fu
7420: 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65 78 65  llname(X) indexe
7430: 64 5f 6f 70 74 28 49 29 20 53 45 54 20 73 65 74  d_opt(I) SET set
7440: 6c 69 73 74 28 59 29 0a 20 20 20 20 20 20 20 20  list(Y).        
7450: 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 20 7b  where_opt(W).  {
7460: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
7470: 74 49 6e 64 65 78 65 64 42 79 28 70 50 61 72 73  tIndexedBy(pPars
7480: 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c  e, X, &I);.  sql
7490: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
74a0: 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 59  kLength(pParse,Y
74b0: 2c 22 73 65 74 20 6c 69 73 74 22 29 3b 20 0a 20  ,"set list"); . 
74c0: 20 73 71 6c 69 74 65 33 55 70 64 61 74 65 28 70   sqlite3Update(p
74d0: 50 61 72 73 65 2c 58 2c 59 2c 57 2c 52 2c 30 2c  Parse,X,Y,W,R,0,
74e0: 30 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25 74  0);.}.%endif..%t
74f0: 79 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 70  ype setlist {Exp
7500: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
7510: 74 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 6c  tor setlist {sql
7520: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
7530: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
7540: 24 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29  $);}..setlist(A)
7550: 20 3a 3a 3d 20 73 65 74 6c 69 73 74 28 41 29 20   ::= setlist(A) 
7560: 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65  COMMA nm(X) EQ e
7570: 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20  xpr(Y). {.  A = 
7580: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
7590: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 41 2c  ppend(pParse, A,
75a0: 20 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78   Y);.  sqlite3Ex
75b0: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
75c0: 61 72 73 65 2c 20 41 2c 20 26 58 2c 20 31 29 3b  arse, A, &X, 1);
75d0: 0a 7d 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a  .}.setlist(A) ::
75e0: 3d 20 73 65 74 6c 69 73 74 28 41 29 20 43 4f 4d  = setlist(A) COM
75f0: 4d 41 20 4c 50 20 69 64 6c 69 73 74 28 58 29 20  MA LP idlist(X) 
7600: 52 50 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b  RP EQ expr(Y). {
7610: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
7620: 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74  prListAppendVect
7630: 6f 72 28 70 50 61 72 73 65 2c 20 41 2c 20 58 2c  or(pParse, A, X,
7640: 20 59 29 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41   Y);.}.setlist(A
7650: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51 20 65  ) ::= nm(X) EQ e
7660: 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20  xpr(Y). {.  A = 
7670: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
7680: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
7690: 20 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78   Y);.  sqlite3Ex
76a0: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50  prListSetName(pP
76b0: 61 72 73 65 2c 20 41 2c 20 26 58 2c 20 31 29 3b  arse, A, &X, 1);
76c0: 0a 7d 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a  .}.setlist(A) ::
76d0: 3d 20 4c 50 20 69 64 6c 69 73 74 28 58 29 20 52  = LP idlist(X) R
76e0: 50 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a  P EQ expr(Y). {.
76f0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
7700: 72 4c 69 73 74 41 70 70 65 6e 64 56 65 63 74 6f  rListAppendVecto
7710: 72 28 70 50 61 72 73 65 2c 20 30 2c 20 58 2c 20  r(pParse, 0, X, 
7720: 59 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  Y);.}../////////
7730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7740: 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63 6f 6d  / The INSERT com
7750: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
7760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7770: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
7780: 3d 20 77 69 74 68 20 69 6e 73 65 72 74 5f 63 6d  = with insert_cm
7790: 64 28 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61  d(R) INTO fullna
77a0: 6d 65 28 58 29 20 69 64 6c 69 73 74 5f 6f 70 74  me(X) idlist_opt
77b0: 28 46 29 20 73 65 6c 65 63 74 28 53 29 0a 20 20  (F) select(S).  
77c0: 20 20 20 20 20 20 75 70 73 65 72 74 28 55 29 2e        upsert(U).
77d0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65   {.  sqlite3Inse
77e0: 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53 2c  rt(pParse, X, S,
77f0: 20 46 2c 20 52 2c 20 55 29 3b 0a 7d 0a 63 6d 64   F, R, U);.}.cmd
7800: 20 3a 3a 3d 20 77 69 74 68 20 69 6e 73 65 72 74   ::= with insert
7810: 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75 6c  _cmd(R) INTO ful
7820: 6c 6e 61 6d 65 28 58 29 20 69 64 6c 69 73 74 5f  lname(X) idlist_
7830: 6f 70 74 28 46 29 20 44 45 46 41 55 4c 54 20 56  opt(F) DEFAULT V
7840: 41 4c 55 45 53 2e 0a 7b 0a 20 20 73 71 6c 69 74  ALUES..{.  sqlit
7850: 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c  e3Insert(pParse,
7860: 20 58 2c 20 30 2c 20 46 2c 20 52 2c 20 30 29 3b   X, 0, F, R, 0);
7870: 0a 7d 0a 0a 25 74 79 70 65 20 75 70 73 65 72 74  .}..%type upsert
7880: 20 7b 55 70 73 65 72 74 2a 7d 0a 25 64 65 73 74   {Upsert*}.%dest
7890: 72 75 63 74 6f 72 20 75 70 73 65 72 74 20 7b 73  ructor upsert {s
78a0: 71 6c 69 74 65 33 55 70 73 65 72 74 44 65 6c 65  qlite3UpsertDele
78b0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 24 24  te(pParse->db,$$
78c0: 29 3b 7d 0a 75 70 73 65 72 74 28 41 29 20 3a 3a  );}.upsert(A) ::
78d0: 3d 20 2e 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 75  = . { A = 0; }.u
78e0: 70 73 65 72 74 28 41 29 20 3a 3a 3d 20 4f 4e 20  psert(A) ::= ON 
78f0: 43 4f 4e 46 4c 49 43 54 20 44 4f 20 55 50 44 41  CONFLICT DO UPDA
7900: 54 45 20 53 45 54 20 73 65 74 6c 69 73 74 2e 20  TE SET setlist. 
7910: 7b 20 41 20 3d 20 30 3b 20 7d 0a 75 70 73 65 72  { A = 0; }.upser
7920: 74 28 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46  t(A) ::= ON CONF
7930: 4c 49 43 54 20 44 4f 20 4e 4f 54 48 49 4e 47 2e  LICT DO NOTHING.
7940: 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 0a 25 74 79   { A = 0; }..%ty
7950: 70 65 20 69 6e 73 65 72 74 5f 63 6d 64 20 7b 69  pe insert_cmd {i
7960: 6e 74 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41  nt}.insert_cmd(A
7970: 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63  ) ::= INSERT orc
7980: 6f 6e 66 28 52 29 2e 20 20 20 7b 41 20 3d 20 52  onf(R).   {A = R
7990: 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29  ;}.insert_cmd(A)
79a0: 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20   ::= REPLACE.   
79b0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
79c0: 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 25 74 79 70  _Replace;}..%typ
79d0: 65 20 69 64 6c 69 73 74 5f 6f 70 74 20 7b 49 64  e idlist_opt {Id
79e0: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
79f0: 6f 72 20 69 64 6c 69 73 74 5f 6f 70 74 20 7b 73  or idlist_opt {s
7a00: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
7a10: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
7a20: 24 29 3b 7d 0a 25 74 79 70 65 20 69 64 6c 69 73  $);}.%type idlis
7a30: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73  t {IdList*}.%des
7a40: 74 72 75 63 74 6f 72 20 69 64 6c 69 73 74 20 7b  tructor idlist {
7a50: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
7a60: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
7a70: 24 24 29 3b 7d 0a 0a 69 64 6c 69 73 74 5f 6f 70  $$);}..idlist_op
7a80: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 7b 41 20 3d 20 30 3b 7d 0a 69 64 6c 69 73 74   {A = 0;}.idlist
7ab0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69  _opt(A) ::= LP i
7ac0: 64 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20 20  dlist(X) RP.    
7ad0: 7b 41 20 3d 20 58 3b 7d 0a 69 64 6c 69 73 74 28  {A = X;}.idlist(
7ae0: 41 29 20 3a 3a 3d 20 69 64 6c 69 73 74 28 41 29  A) ::= idlist(A)
7af0: 20 43 4f 4d 4d 41 20 6e 6d 28 59 29 2e 0a 20 20   COMMA nm(Y)..  
7b00: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49 64    {A = sqlite3Id
7b10: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
7b20: 65 2d 3e 64 62 2c 41 2c 26 59 29 3b 7d 0a 69 64  e->db,A,&Y);}.id
7b30: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59  list(A) ::= nm(Y
7b40: 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  )..    {A = sqli
7b50: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
7b60: 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59 29  pParse->db,0,&Y)
7b70: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
7b80: 2d 59 2a 2f 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  -Y*/}../////////
7b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ba0: 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20 50 72  // Expression Pr
7bb0: 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f  ocessing ///////
7bc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7bd0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65  //////.//..%type
7be0: 20 65 78 70 72 20 7b 45 78 70 72 2a 7d 0a 25 64   expr {Expr*}.%d
7bf0: 65 73 74 72 75 63 74 6f 72 20 65 78 70 72 20 7b  estructor expr {
7c00: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
7c10: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
7c20: 29 3b 7d 0a 25 74 79 70 65 20 74 65 72 6d 20 7b  );}.%type term {
7c30: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
7c40: 6f 72 20 74 65 72 6d 20 7b 73 71 6c 69 74 65 33  or term {sqlite3
7c50: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
7c60: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 69  e->db, $$);}..%i
7c70: 6e 63 6c 75 64 65 20 7b 0a 0a 20 20 2f 2a 20 43  nclude {..  /* C
7c80: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 45  onstruct a new E
7c90: 78 70 72 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  xpr object from 
7ca0: 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
7cb0: 69 65 72 2e 20 20 55 73 65 20 74 68 65 0a 20 20  ier.  Use the.  
7cc0: 2a 2a 20 6e 65 77 20 45 78 70 72 20 74 6f 20 70  ** new Expr to p
7cd0: 6f 70 75 6c 61 74 65 20 70 4f 75 74 2e 20 20 53  opulate pOut.  S
7ce0: 65 74 20 74 68 65 20 73 70 61 6e 20 6f 66 20 70  et the span of p
7cf0: 4f 75 74 20 74 6f 20 62 65 20 74 68 65 20 69 64  Out to be the id
7d00: 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 74 68  entifier.  ** th
7d10: 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20 65  at created the e
7d20: 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2f 0a  xpression..  */.
7d30: 20 20 73 74 61 74 69 63 20 45 78 70 72 20 2a 74    static Expr *t
7d40: 6f 6b 65 6e 45 78 70 72 28 50 61 72 73 65 20 2a  okenExpr(Parse *
7d50: 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
7d60: 54 6f 6b 65 6e 20 74 29 7b 0a 20 20 20 20 45 78  Token t){.    Ex
7d70: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44  pr *p = sqlite3D
7d80: 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61  bMallocRawNN(pPa
7d90: 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28  rse->db, sizeof(
7da0: 45 78 70 72 29 2b 74 2e 6e 2b 31 29 3b 0a 20 20  Expr)+t.n+1);.  
7db0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
7dc0: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
7dd0: 7a 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20  zeof(Expr));.   
7de0: 20 20 20 70 2d 3e 6f 70 20 3d 20 28 75 38 29 6f     p->op = (u8)o
7df0: 70 3b 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  p;.      p->flag
7e00: 73 20 3d 20 45 50 5f 4c 65 61 66 3b 0a 20 20 20  s = EP_Leaf;.   
7e10: 20 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b     p->iAgg = -1;
7e20: 0a 20 20 20 20 20 20 70 2d 3e 75 2e 7a 54 6f 6b  .      p->u.zTok
7e30: 65 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 5b 31  en = (char*)&p[1
7e40: 5d 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ];.      memcpy(
7e50: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 74 2e 7a  p->u.zToken, t.z
7e60: 2c 20 74 2e 6e 29 3b 0a 20 20 20 20 20 20 70 2d  , t.n);.      p-
7e70: 3e 75 2e 7a 54 6f 6b 65 6e 5b 74 2e 6e 5d 20 3d  >u.zToken[t.n] =
7e80: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
7e90: 6c 69 74 65 33 49 73 71 75 6f 74 65 28 70 2d 3e  lite3Isquote(p->
7ea0: 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a  u.zToken[0]) ){.
7eb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 75          if( p->u
7ec0: 2e 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20  .zToken[0]=='"' 
7ed0: 29 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  ) p->flags |= EP
7ee0: 5f 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20  _DblQuoted;.    
7ef0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
7f00: 74 65 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  te(p->u.zToken);
7f10: 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  .      }.#if SQL
7f20: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
7f30: 54 48 3e 30 0a 20 20 20 20 20 20 70 2d 3e 6e 48  TH>0.      p->nH
7f40: 65 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69  eight = 1;.#endi
7f50: 66 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  f  .    }.    re
7f60: 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 65  turn p;.  }.}..e
7f70: 78 70 72 28 41 29 20 3a 3a 3d 20 74 65 72 6d 28  xpr(A) ::= term(
7f80: 41 29 2e 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  A)..expr(A) ::= 
7f90: 4c 50 20 65 78 70 72 28 58 29 20 52 50 2e 20 7b  LP expr(X) RP. {
7fa0: 41 20 3d 20 58 3b 7d 0a 65 78 70 72 28 41 29 20  A = X;}.expr(A) 
7fb0: 3a 3a 3d 20 69 64 28 58 29 2e 20 20 20 20 20 20  ::= id(X).      
7fc0: 20 20 20 20 7b 41 3d 74 6f 6b 65 6e 45 78 70 72      {A=tokenExpr
7fd0: 28 70 50 61 72 73 65 2c 54 4b 5f 49 44 2c 58 29  (pParse,TK_ID,X)
7fe0: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
7ff0: 2d 58 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a  -X*/}.expr(A) ::
8000: 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20  = JOIN_KW(X).   
8010: 20 20 7b 41 3d 74 6f 6b 65 6e 45 78 70 72 28 70    {A=tokenExpr(p
8020: 50 61 72 73 65 2c 54 4b 5f 49 44 2c 58 29 3b 20  Parse,TK_ID,X); 
8030: 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58  /*A-overwrites-X
8040: 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  */}.expr(A) ::= 
8050: 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29 2e  nm(X) DOT nm(Y).
8060: 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 31   {.  Expr *temp1
8070: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
8080: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
8090: 54 4b 5f 49 44 2c 20 26 58 2c 20 31 29 3b 0a 20  TK_ID, &X, 1);. 
80a0: 20 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20 73   Expr *temp2 = s
80b0: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
80c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49  pParse->db, TK_I
80d0: 44 2c 20 26 59 2c 20 31 29 3b 0a 20 20 41 20 3d  D, &Y, 1);.  A =
80e0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
80f0: 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65  arse, TK_DOT, te
8100: 6d 70 31 2c 20 74 65 6d 70 32 29 3b 0a 7d 0a 65  mp1, temp2);.}.e
8110: 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29  xpr(A) ::= nm(X)
8120: 20 44 4f 54 20 6e 6d 28 59 29 20 44 4f 54 20 6e   DOT nm(Y) DOT n
8130: 6d 28 5a 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a  m(Z). {.  Expr *
8140: 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 45  temp1 = sqlite3E
8150: 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  xprAlloc(pParse-
8160: 3e 64 62 2c 20 54 4b 5f 49 44 2c 20 26 58 2c 20  >db, TK_ID, &X, 
8170: 31 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70  1);.  Expr *temp
8180: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  2 = sqlite3ExprA
8190: 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c  lloc(pParse->db,
81a0: 20 54 4b 5f 49 44 2c 20 26 59 2c 20 31 29 3b 0a   TK_ID, &Y, 1);.
81b0: 20 20 45 78 70 72 20 2a 74 65 6d 70 33 20 3d 20    Expr *temp3 = 
81c0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
81d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
81e0: 49 44 2c 20 26 5a 2c 20 31 29 3b 0a 20 20 45 78  ID, &Z, 1);.  Ex
81f0: 70 72 20 2a 74 65 6d 70 34 20 3d 20 73 71 6c 69  pr *temp4 = sqli
8200: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
8210: 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 32 2c 20   TK_DOT, temp2, 
8220: 74 65 6d 70 33 29 3b 0a 20 20 41 20 3d 20 73 71  temp3);.  A = sq
8230: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
8240: 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31  e, TK_DOT, temp1
8250: 2c 20 74 65 6d 70 34 29 3b 0a 7d 0a 74 65 72 6d  , temp4);.}.term
8260: 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c 7c 46 4c 4f  (A) ::= NULL|FLO
8270: 41 54 7c 42 4c 4f 42 28 58 29 2e 20 7b 41 3d 74  AT|BLOB(X). {A=t
8280: 6f 6b 65 6e 45 78 70 72 28 70 50 61 72 73 65 2c  okenExpr(pParse,
8290: 40 58 2c 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77  @X,X); /*A-overw
82a0: 72 69 74 65 73 2d 58 2a 2f 7d 0a 74 65 72 6d 28  rites-X*/}.term(
82b0: 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29  A) ::= STRING(X)
82c0: 2e 20 20 20 20 20 20 20 20 20 20 7b 41 3d 74 6f  .          {A=to
82d0: 6b 65 6e 45 78 70 72 28 70 50 61 72 73 65 2c 40  kenExpr(pParse,@
82e0: 58 2c 58 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  X,X); /*A-overwr
82f0: 69 74 65 73 2d 58 2a 2f 7d 0a 74 65 72 6d 28 41  ites-X*/}.term(A
8300: 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 28 58 29  ) ::= INTEGER(X)
8310: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
8320: 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 73  3ExprAlloc(pPars
8330: 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  e->db, TK_INTEGE
8340: 52 2c 20 26 58 2c 20 31 29 3b 0a 7d 0a 65 78 70  R, &X, 1);.}.exp
8350: 72 28 41 29 20 3a 3a 3d 20 56 41 52 49 41 42 4c  r(A) ::= VARIABL
8360: 45 28 58 29 2e 20 20 20 20 20 7b 0a 20 20 69 66  E(X).     {.  if
8370: 28 20 21 28 58 2e 7a 5b 30 5d 3d 3d 27 23 27 20  ( !(X.z[0]=='#' 
8380: 26 26 20 73 71 6c 69 74 65 33 49 73 64 69 67 69  && sqlite3Isdigi
8390: 74 28 58 2e 7a 5b 31 5d 29 29 20 29 7b 0a 20 20  t(X.z[1])) ){.  
83a0: 20 20 75 33 32 20 6e 20 3d 20 58 2e 6e 3b 0a 20    u32 n = X.n;. 
83b0: 20 20 20 41 20 3d 20 74 6f 6b 65 6e 45 78 70 72     A = tokenExpr
83c0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 56 41 52 49  (pParse, TK_VARI
83d0: 41 42 4c 45 2c 20 58 29 3b 0a 20 20 20 20 73 71  ABLE, X);.    sq
83e0: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
83f0: 61 72 4e 75 6d 62 65 72 28 70 50 61 72 73 65 2c  arNumber(pParse,
8400: 20 41 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b   A, n);.  }else{
8410: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 64 6f 69  .    /* When doi
8420: 6e 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73  ng a nested pars
8430: 65 2c 20 6f 6e 65 20 63 61 6e 20 69 6e 63 6c 75  e, one can inclu
8440: 64 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65  de terms in an e
8450: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a  xpression.    **
8460: 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20   that look like 
8470: 74 68 69 73 3a 20 20 20 23 31 20 23 32 20 2e 2e  this:   #1 #2 ..
8480: 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 72  .  These terms r
8490: 65 66 65 72 20 74 6f 20 72 65 67 69 73 74 65 72  efer to register
84a0: 73 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  s.    ** in the 
84b0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
84c0: 20 20 23 4e 20 69 73 20 74 68 65 20 4e 2d 74 68    #N is the N-th
84d0: 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20   register. */.  
84e0: 20 20 54 6f 6b 65 6e 20 74 20 3d 20 58 3b 20 2f    Token t = X; /
84f0: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a  *A-overwrites-X*
8500: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 74 2e  /.    assert( t.
8510: 6e 3e 3d 32 20 29 3b 0a 20 20 20 20 69 66 28 20  n>=2 );.    if( 
8520: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
8530: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
8540: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8550: 65 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a  e, "near \"%T\":
8560: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20   syntax error", 
8570: 26 74 29 3b 0a 20 20 20 20 20 20 41 20 3d 20 30  &t);.      A = 0
8580: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8590: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45     A = sqlite3PE
85a0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52  xpr(pParse, TK_R
85b0: 45 47 49 53 54 45 52 2c 20 30 2c 20 30 29 3b 0a  EGISTER, 0, 0);.
85c0: 20 20 20 20 20 20 69 66 28 20 41 20 29 20 73 71        if( A ) sq
85d0: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 26 74  lite3GetInt32(&t
85e0: 2e 7a 5b 31 5d 2c 20 26 41 2d 3e 69 54 61 62 6c  .z[1], &A->iTabl
85f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
8600: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
8610: 28 41 29 20 43 4f 4c 4c 41 54 45 20 69 64 73 28  (A) COLLATE ids(
8620: 43 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  C). {.  A = sqli
8630: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
8640: 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 41  eToken(pParse, A
8650: 2c 20 26 43 2c 20 31 29 3b 0a 7d 0a 25 69 66 6e  , &C, 1);.}.%ifn
8660: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8670: 43 41 53 54 0a 65 78 70 72 28 41 29 20 3a 3a 3d  CAST.expr(A) ::=
8680: 20 43 41 53 54 20 4c 50 20 65 78 70 72 28 45 29   CAST LP expr(E)
8690: 20 41 53 20 74 79 70 65 74 6f 6b 65 6e 28 54 29   AS typetoken(T)
86a0: 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c   RP. {.  A = sql
86b0: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50  ite3ExprAlloc(pP
86c0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 41 53  arse->db, TK_CAS
86d0: 54 2c 20 26 54 2c 20 31 29 3b 0a 20 20 73 71 6c  T, &T, 1);.  sql
86e0: 69 74 65 33 45 78 70 72 41 74 74 61 63 68 53 75  ite3ExprAttachSu
86f0: 62 74 72 65 65 73 28 70 50 61 72 73 65 2d 3e 64  btrees(pParse->d
8700: 62 2c 20 41 2c 20 45 2c 20 30 29 3b 0a 7d 0a 25  b, A, E, 0);.}.%
8710: 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d  endif  SQLITE_OM
8720: 49 54 5f 43 41 53 54 0a 65 78 70 72 28 41 29 20  IT_CAST.expr(A) 
8730: 3a 3a 3d 20 69 64 28 58 29 20 4c 50 20 64 69 73  ::= id(X) LP dis
8740: 74 69 6e 63 74 28 44 29 20 65 78 70 72 6c 69 73  tinct(D) exprlis
8750: 74 28 59 29 20 52 50 2e 20 7b 0a 20 20 69 66 28  t(Y) RP. {.  if(
8760: 20 59 20 26 26 20 59 2d 3e 6e 45 78 70 72 3e 70   Y && Y->nExpr>p
8770: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69  Parse->db->aLimi
8780: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46  t[SQLITE_LIMIT_F
8790: 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a  UNCTION_ARG] ){.
87a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
87b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
87c0: 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20   many arguments 
87d0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c  on function %T",
87e0: 20 26 58 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20   &X);.  }.  A = 
87f0: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
8800: 69 6f 6e 28 70 50 61 72 73 65 2c 20 59 2c 20 26  ion(pParse, Y, &
8810: 58 29 3b 0a 20 20 69 66 28 20 44 3d 3d 53 46 5f  X);.  if( D==SF_
8820: 44 69 73 74 69 6e 63 74 20 26 26 20 41 20 29 7b  Distinct && A ){
8830: 0a 20 20 20 20 41 2d 3e 66 6c 61 67 73 20 7c 3d  .    A->flags |=
8840: 20 45 50 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20   EP_Distinct;.  
8850: 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.}.expr(A) ::= 
8860: 69 64 28 58 29 20 4c 50 20 53 54 41 52 20 52 50  id(X) LP STAR RP
8870: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
8880: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50  3ExprFunction(pP
8890: 61 72 73 65 2c 20 30 2c 20 26 58 29 3b 0a 7d 0a  arse, 0, &X);.}.
88a0: 74 65 72 6d 28 41 29 20 3a 3a 3d 20 43 54 49 4d  term(A) ::= CTIM
88b0: 45 5f 4b 57 28 4f 50 29 2e 20 7b 0a 20 20 41 20  E_KW(OP). {.  A 
88c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e  = sqlite3ExprFun
88d0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c  ction(pParse, 0,
88e0: 20 26 4f 50 29 3b 0a 7d 0a 0a 65 78 70 72 28 41   &OP);.}..expr(A
88f0: 29 20 3a 3a 3d 20 4c 50 20 6e 65 78 70 72 6c 69  ) ::= LP nexprli
8900: 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72  st(X) COMMA expr
8910: 28 59 29 20 52 50 2e 20 7b 0a 20 20 45 78 70 72  (Y) RP. {.  Expr
8920: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 73 71  List *pList = sq
8930: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
8940: 65 6e 64 28 70 50 61 72 73 65 2c 20 58 2c 20 59  end(pParse, X, Y
8950: 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33  );.  A = sqlite3
8960: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
8970: 5f 56 45 43 54 4f 52 2c 20 30 2c 20 30 29 3b 0a  _VECTOR, 0, 0);.
8980: 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41    if( A ){.    A
8990: 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ->x.pList = pLis
89a0: 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
89b0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
89c0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
89d0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
89e0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
89f0: 72 28 41 29 20 41 4e 44 28 4f 50 29 20 65 78 70  r(A) AND(OP) exp
8a00: 72 28 59 29 2e 20 20 20 20 7b 41 3d 73 71 6c 69  r(Y).    {A=sqli
8a10: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
8a20: 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72 28  @OP,A,Y);}.expr(
8a30: 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 4f  A) ::= expr(A) O
8a40: 52 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  R(OP) expr(Y).  
8a50: 20 20 20 7b 41 3d 73 71 6c 69 74 65 33 50 45 78     {A=sqlite3PEx
8a60: 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 41 2c  pr(pParse,@OP,A,
8a70: 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  Y);}.expr(A) ::=
8a80: 20 65 78 70 72 28 41 29 20 4c 54 7c 47 54 7c 47   expr(A) LT|GT|G
8a90: 45 7c 4c 45 28 4f 50 29 20 65 78 70 72 28 59 29  E|LE(OP) expr(Y)
8aa0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 20 20 20 20 20 20 20 20 20 20 7b 41 3d 73 71 6c            {A=sql
8ad0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
8ae0: 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72  ,@OP,A,Y);}.expr
8af0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
8b00: 45 51 7c 4e 45 28 4f 50 29 20 65 78 70 72 28 59  EQ|NE(OP) expr(Y
8b10: 29 2e 20 20 7b 41 3d 73 71 6c 69 74 65 33 50 45  ).  {A=sqlite3PE
8b20: 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 41  xpr(pParse,@OP,A
8b30: 2c 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  ,Y);}.expr(A) ::
8b40: 3d 20 65 78 70 72 28 41 29 20 42 49 54 41 4e 44  = expr(A) BITAND
8b50: 7c 42 49 54 4f 52 7c 4c 53 48 49 46 54 7c 52 53  |BITOR|LSHIFT|RS
8b60: 48 49 46 54 28 4f 50 29 20 65 78 70 72 28 59 29  HIFT(OP) expr(Y)
8b70: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b90: 20 20 20 20 20 20 20 20 20 20 7b 41 3d 73 71 6c            {A=sql
8ba0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
8bb0: 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72  ,@OP,A,Y);}.expr
8bc0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
8bd0: 50 4c 55 53 7c 4d 49 4e 55 53 28 4f 50 29 20 65  PLUS|MINUS(OP) e
8be0: 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20  xpr(Y)..        
8bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c10: 7b 41 3d 73 71 6c 69 74 65 33 50 45 78 70 72 28  {A=sqlite3PExpr(
8c20: 70 50 61 72 73 65 2c 40 4f 50 2c 41 2c 59 29 3b  pParse,@OP,A,Y);
8c30: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
8c40: 70 72 28 41 29 20 53 54 41 52 7c 53 4c 41 53 48  pr(A) STAR|SLASH
8c50: 7c 52 45 4d 28 4f 50 29 20 65 78 70 72 28 59 29  |REM(OP) expr(Y)
8c60: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c80: 20 20 20 20 20 20 20 20 20 20 7b 41 3d 73 71 6c            {A=sql
8c90: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
8ca0: 2c 40 4f 50 2c 41 2c 59 29 3b 7d 0a 65 78 70 72  ,@OP,A,Y);}.expr
8cb0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20  (A) ::= expr(A) 
8cc0: 43 4f 4e 43 41 54 28 4f 50 29 20 65 78 70 72 28  CONCAT(OP) expr(
8cd0: 59 29 2e 20 7b 41 3d 73 71 6c 69 74 65 33 50 45  Y). {A=sqlite3PE
8ce0: 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 41  xpr(pParse,@OP,A
8cf0: 2c 59 29 3b 7d 0a 25 74 79 70 65 20 6c 69 6b 65  ,Y);}.%type like
8d00: 6f 70 20 7b 54 6f 6b 65 6e 7d 0a 6c 69 6b 65 6f  op {Token}.likeo
8d10: 70 28 41 29 20 3a 3a 3d 20 4c 49 4b 45 5f 4b 57  p(A) ::= LIKE_KW
8d20: 7c 4d 41 54 43 48 28 41 29 2e 0a 6c 69 6b 65 6f  |MATCH(A)..likeo
8d30: 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4c 49 4b  p(A) ::= NOT LIK
8d40: 45 5f 4b 57 7c 4d 41 54 43 48 28 58 29 2e 20 7b  E_KW|MATCH(X). {
8d50: 41 3d 58 3b 20 41 2e 6e 7c 3d 30 78 38 30 30 30  A=X; A.n|=0x8000
8d60: 30 30 30 30 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  0000; /*A-overwr
8d70: 69 74 65 2d 58 2a 2f 7d 0a 65 78 70 72 28 41 29  ite-X*/}.expr(A)
8d80: 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 6c 69 6b   ::= expr(A) lik
8d90: 65 6f 70 28 4f 50 29 20 65 78 70 72 28 59 29 2e  eop(OP) expr(Y).
8da0: 20 20 5b 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20    [LIKE_KW]  {. 
8db0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
8dc0: 3b 0a 20 20 69 6e 74 20 62 4e 6f 74 20 3d 20 4f  ;.  int bNot = O
8dd0: 50 2e 6e 20 26 20 30 78 38 30 30 30 30 30 30 30  P.n & 0x80000000
8de0: 3b 0a 20 20 4f 50 2e 6e 20 26 3d 20 30 78 37 66  ;.  OP.n &= 0x7f
8df0: 66 66 66 66 66 66 3b 0a 20 20 70 4c 69 73 74 20  ffffff;.  pList 
8e00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8e10: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30  tAppend(pParse,0
8e20: 2c 20 59 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  , Y);.  pList = 
8e30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
8e40: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69  ppend(pParse,pLi
8e50: 73 74 2c 20 41 29 3b 0a 20 20 41 20 3d 20 73 71  st, A);.  A = sq
8e60: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
8e70: 6e 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  n(pParse, pList,
8e80: 20 26 4f 50 29 3b 0a 20 20 69 66 28 20 62 4e 6f   &OP);.  if( bNo
8e90: 74 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33 50  t ) A = sqlite3P
8ea0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
8eb0: 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20 69 66  NOT, A, 0);.  if
8ec0: 28 20 41 20 29 20 41 2d 3e 66 6c 61 67 73 20 7c  ( A ) A->flags |
8ed0: 3d 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 3b 0a  = EP_InfixFunc;.
8ee0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
8ef0: 70 72 28 41 29 20 6c 69 6b 65 6f 70 28 4f 50 29  pr(A) likeop(OP)
8f00: 20 65 78 70 72 28 59 29 20 45 53 43 41 50 45 20   expr(Y) ESCAPE 
8f10: 65 78 70 72 28 45 29 2e 20 20 5b 4c 49 4b 45 5f  expr(E).  [LIKE_
8f20: 4b 57 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69 73  KW]  {.  ExprLis
8f30: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  t *pList;.  int 
8f40: 62 4e 6f 74 20 3d 20 4f 50 2e 6e 20 26 20 30 78  bNot = OP.n & 0x
8f50: 38 30 30 30 30 30 30 30 3b 0a 20 20 4f 50 2e 6e  80000000;.  OP.n
8f60: 20 26 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a   &= 0x7fffffff;.
8f70: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
8f80: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
8f90: 70 50 61 72 73 65 2c 30 2c 20 59 29 3b 0a 20 20  pParse,0, Y);.  
8fa0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
8fb0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
8fc0: 61 72 73 65 2c 70 4c 69 73 74 2c 20 41 29 3b 0a  arse,pList, A);.
8fd0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
8fe0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
8ff0: 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 45 29  pParse,pList, E)
9000: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
9010: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  xprFunction(pPar
9020: 73 65 2c 20 70 4c 69 73 74 2c 20 26 4f 50 29 3b  se, pList, &OP);
9030: 0a 20 20 69 66 28 20 62 4e 6f 74 20 29 20 41 20  .  if( bNot ) A 
9040: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9050: 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41  Parse, TK_NOT, A
9060: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20  , 0);.  if( A ) 
9070: 41 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  A->flags |= EP_I
9080: 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a 0a 65 78 70  nfixFunc;.}..exp
9090: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29  r(A) ::= expr(A)
90a0: 20 49 53 4e 55 4c 4c 7c 4e 4f 54 4e 55 4c 4c 28   ISNULL|NOTNULL(
90b0: 45 29 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  E).   {A = sqlit
90c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 40  e3PExpr(pParse,@
90d0: 45 2c 41 2c 30 29 3b 7d 0a 65 78 70 72 28 41 29  E,A,0);}.expr(A)
90e0: 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 4e 4f 54   ::= expr(A) NOT
90f0: 20 4e 55 4c 4c 2e 20 20 20 20 7b 41 20 3d 20 73   NULL.    {A = s
9100: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
9110: 73 65 2c 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 41 2c  se,TK_NOTNULL,A,
9120: 30 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b  0);}..%include {
9130: 0a 20 20 2f 2a 20 41 20 72 6f 75 74 69 6e 65 20  .  /* A routine 
9140: 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 62 69 6e  to convert a bin
9150: 61 72 79 20 54 4b 5f 49 53 20 6f 72 20 54 4b 5f  ary TK_IS or TK_
9160: 49 53 4e 4f 54 20 65 78 70 72 65 73 73 69 6f 6e  ISNOT expression
9170: 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 75 6e 61   into a.  ** una
9180: 72 79 20 54 4b 5f 49 53 4e 55 4c 4c 20 6f 72 20  ry TK_ISNULL or 
9190: 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 65 78 70 72 65  TK_NOTNULL expre
91a0: 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 73 74 61 74  ssion. */.  stat
91b0: 69 63 20 76 6f 69 64 20 62 69 6e 61 72 79 54 6f  ic void binaryTo
91c0: 55 6e 61 72 79 49 66 4e 75 6c 6c 28 50 61 72 73  UnaryIfNull(Pars
91d0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
91e0: 2a 70 59 2c 20 45 78 70 72 20 2a 70 41 2c 20 69  *pY, Expr *pA, i
91f0: 6e 74 20 6f 70 29 7b 0a 20 20 20 20 73 71 6c 69  nt op){.    sqli
9200: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
9210: 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 70 41  ->db;.    if( pA
9220: 20 26 26 20 70 59 20 26 26 20 70 59 2d 3e 6f 70   && pY && pY->op
9230: 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20  ==TK_NULL ){.   
9240: 20 20 20 70 41 2d 3e 6f 70 20 3d 20 28 75 38 29     pA->op = (u8)
9250: 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  op;.      sqlite
9260: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
9270: 70 41 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pA->pRight);.   
9280: 20 20 20 70 41 2d 3e 70 52 69 67 68 74 20 3d 20     pA->pRight = 
9290: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
92a0: 2f 2f 20 20 20 20 65 78 70 72 31 20 49 53 20 65  //    expr1 IS e
92b0: 78 70 72 32 0a 2f 2f 20 20 20 20 65 78 70 72 31  xpr2.//    expr1
92c0: 20 49 53 20 4e 4f 54 20 65 78 70 72 32 0a 2f 2f   IS NOT expr2.//
92d0: 0a 2f 2f 20 49 66 20 65 78 70 72 32 20 69 73 20  .// If expr2 is 
92e0: 4e 55 4c 4c 20 74 68 65 6e 20 63 6f 64 65 20 61  NULL then code a
92f0: 73 20 54 4b 5f 49 53 4e 55 4c 4c 20 6f 72 20 54  s TK_ISNULL or T
9300: 4b 5f 4e 4f 54 4e 55 4c 4c 2e 20 20 49 66 20 65  K_NOTNULL.  If e
9310: 78 70 72 32 0a 2f 2f 20 69 73 20 61 6e 79 20 6f  xpr2.// is any o
9320: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 2c  ther expression,
9330: 20 63 6f 64 65 20 61 73 20 54 4b 5f 49 53 20 6f   code as TK_IS o
9340: 72 20 54 4b 5f 49 53 4e 4f 54 2e 0a 2f 2f 20 0a  r TK_ISNOT..// .
9350: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
9360: 28 41 29 20 49 53 20 65 78 70 72 28 59 29 2e 20  (A) IS expr(Y). 
9370: 20 20 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69      {.  A = sqli
9380: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
9390: 54 4b 5f 49 53 2c 41 2c 59 29 3b 0a 20 20 62 69  TK_IS,A,Y);.  bi
93a0: 6e 61 72 79 54 6f 55 6e 61 72 79 49 66 4e 75 6c  naryToUnaryIfNul
93b0: 6c 28 70 50 61 72 73 65 2c 20 59 2c 20 41 2c 20  l(pParse, Y, A, 
93c0: 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 7d 0a 65 78  TK_ISNULL);.}.ex
93d0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
93e0: 29 20 49 53 20 4e 4f 54 20 65 78 70 72 28 59 29  ) IS NOT expr(Y)
93f0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
9400: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 54 4b  3PExpr(pParse,TK
9410: 5f 49 53 4e 4f 54 2c 41 2c 59 29 3b 0a 20 20 62  _ISNOT,A,Y);.  b
9420: 69 6e 61 72 79 54 6f 55 6e 61 72 79 49 66 4e 75  inaryToUnaryIfNu
9430: 6c 6c 28 70 50 61 72 73 65 2c 20 59 2c 20 41 2c  ll(pParse, Y, A,
9440: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 7d 0a   TK_NOTNULL);.}.
9450: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4e 4f 54  .expr(A) ::= NOT
9460: 28 42 29 20 65 78 70 72 28 58 29 2e 20 20 0a 20  (B) expr(X).  . 
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
9480: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9490: 50 61 72 73 65 2c 20 40 42 2c 20 58 2c 20 30 29  Parse, @B, X, 0)
94a0: 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d  ;/*A-overwrites-
94b0: 42 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  B*/}.expr(A) ::=
94c0: 20 42 49 54 4e 4f 54 28 42 29 20 65 78 70 72 28   BITNOT(B) expr(
94d0: 58 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  X)..            
94e0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45    {A = sqlite3PE
94f0: 78 70 72 28 70 50 61 72 73 65 2c 20 40 42 2c 20  xpr(pParse, @B, 
9500: 58 2c 20 30 29 3b 2f 2a 41 2d 6f 76 65 72 77 72  X, 0);/*A-overwr
9510: 69 74 65 73 2d 42 2a 2f 7d 0a 65 78 70 72 28 41  ites-B*/}.expr(A
9520: 29 20 3a 3a 3d 20 4d 49 4e 55 53 20 65 78 70 72  ) ::= MINUS expr
9530: 28 58 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20  (X). [BITNOT].  
9540: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
9550: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
9560: 61 72 73 65 2c 20 54 4b 5f 55 4d 49 4e 55 53 2c  arse, TK_UMINUS,
9570: 20 58 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   X, 0);}.expr(A)
9580: 20 3a 3a 3d 20 50 4c 55 53 20 65 78 70 72 28 58   ::= PLUS expr(X
9590: 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20 20  ). [BITNOT].    
95a0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
95b0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
95c0: 73 65 2c 20 54 4b 5f 55 50 4c 55 53 2c 20 58 2c  se, TK_UPLUS, X,
95d0: 20 30 29 3b 7d 0a 0a 25 74 79 70 65 20 62 65 74   0);}..%type bet
95e0: 77 65 65 6e 5f 6f 70 20 7b 69 6e 74 7d 0a 62 65  ween_op {int}.be
95f0: 74 77 65 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20  tween_op(A) ::= 
9600: 42 45 54 57 45 45 4e 2e 20 20 20 20 20 7b 41 20  BETWEEN.     {A 
9610: 3d 20 30 3b 7d 0a 62 65 74 77 65 65 6e 5f 6f 70  = 0;}.between_op
9620: 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 42 45 54 57  (A) ::= NOT BETW
9630: 45 45 4e 2e 20 7b 41 20 3d 20 31 3b 7d 0a 65 78  EEN. {A = 1;}.ex
9640: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41  pr(A) ::= expr(A
9650: 29 20 62 65 74 77 65 65 6e 5f 6f 70 28 4e 29 20  ) between_op(N) 
9660: 65 78 70 72 28 58 29 20 41 4e 44 20 65 78 70 72  expr(X) AND expr
9670: 28 59 29 2e 20 5b 42 45 54 57 45 45 4e 5d 20 7b  (Y). [BETWEEN] {
9680: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
9690: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
96a0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
96b0: 65 2c 30 2c 20 58 29 3b 0a 20 20 70 4c 69 73 74  e,0, X);.  pList
96c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
96d0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
96e0: 70 4c 69 73 74 2c 20 59 29 3b 0a 20 20 41 20 3d  pList, Y);.  A =
96f0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
9700: 61 72 73 65 2c 20 54 4b 5f 42 45 54 57 45 45 4e  arse, TK_BETWEEN
9710: 2c 20 41 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  , A, 0);.  if( A
9720: 20 29 7b 0a 20 20 20 20 41 2d 3e 78 2e 70 4c 69   ){.    A->x.pLi
9730: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 65  st = pList;.  }e
9740: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
9750: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
9760: 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74  Parse->db, pList
9770: 29 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 4e 20  );.  } .  if( N 
9780: 29 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78  ) A = sqlite3PEx
9790: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f  pr(pParse, TK_NO
97a0: 54 2c 20 41 2c 20 30 29 3b 0a 7d 0a 25 69 66 6e  T, A, 0);.}.%ifn
97b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
97c0: 53 55 42 51 55 45 52 59 0a 20 20 25 74 79 70 65  SUBQUERY.  %type
97d0: 20 69 6e 5f 6f 70 20 7b 69 6e 74 7d 0a 20 20 69   in_op {int}.  i
97e0: 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 49 4e 2e 20  n_op(A) ::= IN. 
97f0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 20 20       {A = 0;}.  
9800: 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54  in_op(A) ::= NOT
9810: 20 49 4e 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a 20   IN.  {A = 1;}. 
9820: 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70   expr(A) ::= exp
9830: 72 28 41 29 20 69 6e 5f 6f 70 28 4e 29 20 4c 50  r(A) in_op(N) LP
9840: 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 2e   exprlist(Y) RP.
9850: 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 69 66 28 20   [IN] {.    if( 
9860: 59 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Y==0 ){.      /*
9870: 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   Expressions of 
9880: 74 68 65 20 66 6f 72 6d 0a 20 20 20 20 20 20 2a  the form.      *
9890: 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  *.      **      
98a0: 65 78 70 72 31 20 49 4e 20 28 29 0a 20 20 20 20  expr1 IN ().    
98b0: 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31 20    **      expr1 
98c0: 4e 4f 54 20 49 4e 20 28 29 0a 20 20 20 20 20 20  NOT IN ().      
98d0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 73 69 6d 70  **.      ** simp
98e0: 6c 69 66 79 20 74 6f 20 63 6f 6e 73 74 61 6e 74  lify to constant
98f0: 73 20 30 20 28 66 61 6c 73 65 29 20 61 6e 64 20  s 0 (false) and 
9900: 31 20 28 74 72 75 65 29 2c 20 72 65 73 70 65 63  1 (true), respec
9910: 74 69 76 65 6c 79 2c 0a 20 20 20 20 20 20 2a 2a  tively,.      **
9920: 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74   regardless of t
9930: 68 65 20 76 61 6c 75 65 20 6f 66 20 65 78 70 72  he value of expr
9940: 31 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  1..      */.    
9950: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9960: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
9970: 41 29 3b 0a 20 20 20 20 20 20 41 20 3d 20 73 71  A);.      A = sq
9980: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70  lite3ExprAlloc(p
9990: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e  Parse->db, TK_IN
99a0: 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e  TEGER,&sqlite3In
99b0: 74 54 6f 6b 65 6e 73 5b 4e 5d 2c 31 29 3b 0a 20  tTokens[N],1);. 
99c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 59 2d 3e     }else if( Y->
99d0: 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
99e0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
99f0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
9a00: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9a10: 20 20 20 20 20 65 78 70 72 31 20 49 4e 20 28 3f       expr1 IN (?
9a20: 31 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  1).      **     
9a30: 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20 28 3f   expr1 NOT IN (?
9a40: 32 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  2).      **.    
9a50: 20 20 2a 2a 20 77 69 74 68 20 65 78 61 63 74 6c    ** with exactl
9a60: 79 20 6f 6e 65 20 76 61 6c 75 65 20 6f 6e 20 74  y one value on t
9a70: 68 65 20 52 48 53 20 63 61 6e 20 62 65 20 73 69  he RHS can be si
9a80: 6d 70 6c 69 66 69 65 64 20 74 6f 20 73 6f 6d 65  mplified to some
9a90: 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6c  thing.      ** l
9aa0: 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 20 20  ike this:.      
9ab0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
9ac0: 20 65 78 70 72 31 20 3d 3d 20 3f 31 0a 20 20 20   expr1 == ?1.   
9ad0: 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31     **      expr1
9ae0: 20 3c 3e 20 3f 32 0a 20 20 20 20 20 20 2a 2a 0a   <> ?2.      **.
9af0: 20 20 20 20 20 20 2a 2a 20 42 75 74 2c 20 74 68        ** But, th
9b00: 65 20 52 48 53 20 6f 66 20 74 68 65 20 3d 3d 20  e RHS of the == 
9b10: 6f 72 20 3c 3e 20 69 73 20 6d 61 72 6b 65 64 20  or <> is marked 
9b20: 77 69 74 68 20 74 68 65 20 45 50 5f 47 65 6e 65  with the EP_Gene
9b30: 72 69 63 20 66 6c 61 67 0a 20 20 20 20 20 20 2a  ric flag.      *
9b40: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 79  * so that it may
9b50: 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
9b60: 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  to the computati
9b70: 6f 6e 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  on of comparison
9b80: 0a 20 20 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  .      ** affini
9b90: 74 79 20 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  ty or the collat
9ba0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
9bb0: 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  use for comparis
9bc0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  on.  Otherwise,.
9bd0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 6d        ** the sem
9be0: 61 6e 74 69 63 73 20 77 6f 75 6c 64 20 62 65 20  antics would be 
9bf0: 73 75 62 74 6c 79 20 64 69 66 66 65 72 65 6e 74  subtly different
9c00: 20 66 72 6f 6d 20 49 4e 20 6f 72 20 4e 4f 54 20   from IN or NOT 
9c10: 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
9c20: 20 20 20 45 78 70 72 20 2a 70 52 48 53 20 3d 20     Expr *pRHS = 
9c30: 59 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  Y->a[0].pExpr;. 
9c40: 20 20 20 20 20 59 2d 3e 61 5b 30 5d 2e 70 45 78       Y->a[0].pEx
9c50: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  pr = 0;.      sq
9c60: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
9c70: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
9c80: 59 29 3b 0a 20 20 20 20 20 20 2f 2a 20 70 52 48  Y);.      /* pRH
9c90: 53 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  S cannot be NULL
9ca0: 20 62 65 63 61 75 73 65 20 61 20 6d 61 6c 6c 6f   because a mallo
9cb0: 63 20 65 72 72 6f 72 20 77 6f 75 6c 64 20 68 61  c error would ha
9cc0: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ve been detected
9cd0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  .      ** before
9ce0: 20 6e 6f 77 20 61 6e 64 20 63 6f 6e 74 72 6f 6c   now and control
9cf0: 20 77 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65   would have neve
9d00: 72 20 72 65 61 63 68 65 64 20 74 68 69 73 20 70  r reached this p
9d10: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  oint */.      if
9d20: 28 20 41 4c 57 41 59 53 28 70 52 48 53 29 20 29  ( ALWAYS(pRHS) )
9d30: 7b 0a 20 20 20 20 20 20 20 20 70 52 48 53 2d 3e  {.        pRHS->
9d40: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
9d50: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52  late;.        pR
9d60: 48 53 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  HS->flags |= EP_
9d70: 47 65 6e 65 72 69 63 3b 0a 20 20 20 20 20 20 7d  Generic;.      }
9d80: 0a 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74  .      A = sqlit
9d90: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
9da0: 4e 20 3f 20 54 4b 5f 4e 45 20 3a 20 54 4b 5f 45  N ? TK_NE : TK_E
9db0: 51 2c 20 41 2c 20 70 52 48 53 29 3b 0a 20 20 20  Q, A, pRHS);.   
9dc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 20   }else{.      A 
9dd0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9de0: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 41 2c  Parse, TK_IN, A,
9df0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41   0);.      if( A
9e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 41 2d 3e 78   ){.        A->x
9e10: 2e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 20 20  .pList = Y;.    
9e20: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
9e30: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
9e40: 28 70 50 61 72 73 65 2c 20 41 29 3b 0a 20 20 20  (pParse, A);.   
9e50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9e60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9e70: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
9e80: 64 62 2c 20 59 29 3b 0a 20 20 20 20 20 20 7d 0a  db, Y);.      }.
9e90: 20 20 20 20 20 20 69 66 28 20 4e 20 29 20 41 20        if( N ) A 
9ea0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9eb0: 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41  Parse, TK_NOT, A
9ec0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
9ed0: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50    expr(A) ::= LP
9ee0: 20 73 65 6c 65 63 74 28 58 29 20 52 50 2e 20 7b   select(X) RP. {
9ef0: 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33  .    A = sqlite3
9f00: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
9f10: 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a  _SELECT, 0, 0);.
9f20: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
9f30: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
9f40: 2c 20 41 2c 20 58 29 3b 0a 20 20 7d 0a 20 20 65  , A, X);.  }.  e
9f50: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
9f60: 41 29 20 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 73  A) in_op(N) LP s
9f70: 65 6c 65 63 74 28 59 29 20 52 50 2e 20 20 5b 49  elect(Y) RP.  [I
9f80: 4e 5d 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c  N] {.    A = sql
9f90: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
9fa0: 2c 20 54 4b 5f 49 4e 2c 20 41 2c 20 30 29 3b 0a  , TK_IN, A, 0);.
9fb0: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72      sqlite3PExpr
9fc0: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65  AddSelect(pParse
9fd0: 2c 20 41 2c 20 59 29 3b 0a 20 20 20 20 69 66 28  , A, Y);.    if(
9fe0: 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33   N ) A = sqlite3
9ff0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
a000: 5f 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20 7d  _NOT, A, 0);.  }
a010: 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .  expr(A) ::= e
a020: 78 70 72 28 41 29 20 69 6e 5f 6f 70 28 4e 29 20  xpr(A) in_op(N) 
a030: 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 20 70 61  nm(Y) dbnm(Z) pa
a040: 72 65 6e 5f 65 78 70 72 6c 69 73 74 28 45 29 2e  ren_exprlist(E).
a050: 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 53 72 63 4c   [IN] {.    SrcL
a060: 69 73 74 20 2a 70 53 72 63 20 3d 20 73 71 6c 69  ist *pSrc = sqli
a070: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
a080: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 26  (pParse->db, 0,&
a090: 59 2c 26 5a 29 3b 0a 20 20 20 20 53 65 6c 65 63  Y,&Z);.    Selec
a0a0: 74 20 2a 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  t *pSelect = sql
a0b0: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50  ite3SelectNew(pP
a0c0: 61 72 73 65 2c 20 30 2c 70 53 72 63 2c 30 2c 30  arse, 0,pSrc,0,0
a0d0: 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 69  ,0,0,0,0);.    i
a0e0: 66 28 20 45 20 29 20 20 73 71 6c 69 74 65 33 53  f( E )  sqlite3S
a0f0: 72 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28 70  rcListFuncArgs(p
a100: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 20 3f  Parse, pSelect ?
a110: 20 70 53 72 63 20 3a 20 30 2c 20 45 29 3b 0a 20   pSrc : 0, E);. 
a120: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45     A = sqlite3PE
a130: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
a140: 4e 2c 20 41 2c 20 30 29 3b 0a 20 20 20 20 73 71  N, A, 0);.    sq
a150: 6c 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c  lite3PExprAddSel
a160: 65 63 74 28 70 50 61 72 73 65 2c 20 41 2c 20 70  ect(pParse, A, p
a170: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
a180: 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33   N ) A = sqlite3
a190: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
a1a0: 5f 4e 4f 54 2c 20 41 2c 20 30 29 3b 0a 20 20 7d  _NOT, A, 0);.  }
a1b0: 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 45  .  expr(A) ::= E
a1c0: 58 49 53 54 53 20 4c 50 20 73 65 6c 65 63 74 28  XISTS LP select(
a1d0: 59 29 20 52 50 2e 20 7b 0a 20 20 20 20 45 78 70  Y) RP. {.    Exp
a1e0: 72 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 41 20  r *p;.    p = A 
a1f0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
a200: 50 61 72 73 65 2c 20 54 4b 5f 45 58 49 53 54 53  Parse, TK_EXISTS
a210: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
a220: 69 74 65 33 50 45 78 70 72 41 64 64 53 65 6c 65  ite3PExprAddSele
a230: 63 74 28 70 50 61 72 73 65 2c 20 70 2c 20 59 29  ct(pParse, p, Y)
a240: 3b 0a 20 20 7d 0a 25 65 6e 64 69 66 20 53 51 4c  ;.  }.%endif SQL
a250: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
a260: 59 0a 0a 2f 2a 20 43 41 53 45 20 65 78 70 72 65  Y../* CASE expre
a270: 73 73 69 6f 6e 73 20 2a 2f 0a 65 78 70 72 28 41  ssions */.expr(A
a280: 29 20 3a 3a 3d 20 43 41 53 45 20 63 61 73 65 5f  ) ::= CASE case_
a290: 6f 70 65 72 61 6e 64 28 58 29 20 63 61 73 65 5f  operand(X) case_
a2a0: 65 78 70 72 6c 69 73 74 28 59 29 20 63 61 73 65  exprlist(Y) case
a2b0: 5f 65 6c 73 65 28 5a 29 20 45 4e 44 2e 20 7b 0a  _else(Z) END. {.
a2c0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78    A = sqlite3PEx
a2d0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 41  pr(pParse, TK_CA
a2e0: 53 45 2c 20 58 2c 20 30 29 3b 0a 20 20 69 66 28  SE, X, 0);.  if(
a2f0: 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e 78 2e 70   A ){.    A->x.p
a300: 4c 69 73 74 20 3d 20 5a 20 3f 20 73 71 6c 69 74  List = Z ? sqlit
a310: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
a320: 28 70 50 61 72 73 65 2c 59 2c 5a 29 20 3a 20 59  (pParse,Y,Z) : Y
a330: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
a340: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
a350: 67 73 28 70 50 61 72 73 65 2c 20 41 29 3b 0a 20  gs(pParse, A);. 
a360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
a370: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
a380: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29  e(pParse->db, Y)
a390: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
a3a0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
a3b0: 64 62 2c 20 5a 29 3b 0a 20 20 7d 0a 7d 0a 25 74  db, Z);.  }.}.%t
a3c0: 79 70 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73  ype case_exprlis
a3d0: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
a3e0: 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65  estructor case_e
a3f0: 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  xprlist {sqlite3
a400: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
a410: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
a420: 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41  .case_exprlist(A
a430: 29 20 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c  ) ::= case_exprl
a440: 69 73 74 28 41 29 20 57 48 45 4e 20 65 78 70 72  ist(A) WHEN expr
a450: 28 59 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29  (Y) THEN expr(Z)
a460: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
a470: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a480: 70 50 61 72 73 65 2c 41 2c 20 59 29 3b 0a 20 20  pParse,A, Y);.  
a490: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
a4a0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
a4b0: 2c 41 2c 20 5a 29 3b 0a 7d 0a 63 61 73 65 5f 65  ,A, Z);.}.case_e
a4c0: 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 57  xprlist(A) ::= W
a4d0: 48 45 4e 20 65 78 70 72 28 59 29 20 54 48 45 4e  HEN expr(Y) THEN
a4e0: 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20 20 41 20   expr(Z). {.  A 
a4f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
a500: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30  tAppend(pParse,0
a510: 2c 20 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  , Y);.  A = sqli
a520: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
a530: 64 28 70 50 61 72 73 65 2c 41 2c 20 5a 29 3b 0a  d(pParse,A, Z);.
a540: 7d 0a 25 74 79 70 65 20 63 61 73 65 5f 65 6c 73  }.%type case_els
a550: 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72  e {Expr*}.%destr
a560: 75 63 74 6f 72 20 63 61 73 65 5f 65 6c 73 65 20  uctor case_else 
a570: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
a580: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
a590: 24 29 3b 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41  $);}.case_else(A
a5a0: 29 20 3a 3a 3d 20 20 45 4c 53 45 20 65 78 70 72  ) ::=  ELSE expr
a5b0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
a5c0: 3d 20 58 3b 7d 0a 63 61 73 65 5f 65 6c 73 65 28  = X;}.case_else(
a5d0: 41 29 20 3a 3a 3d 20 20 2e 20 20 20 20 20 20 20  A) ::=  .       
a5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
a5f0: 20 3d 20 30 3b 7d 20 0a 25 74 79 70 65 20 63 61   = 0;} .%type ca
a600: 73 65 5f 6f 70 65 72 61 6e 64 20 7b 45 78 70 72  se_operand {Expr
a610: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63  *}.%destructor c
a620: 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b 73 71 6c  ase_operand {sql
a630: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
a640: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
a650: 0a 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 41 29  .case_operand(A)
a660: 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20   ::= expr(X).   
a670: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
a680: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
a690: 58 2a 2f 7d 20 0a 63 61 73 65 5f 6f 70 65 72 61  X*/} .case_opera
a6a0: 6e 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  nd(A) ::= .     
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
a6c0: 20 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65 20 65   = 0;} ..%type e
a6d0: 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  xprlist {ExprLis
a6e0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
a6f0: 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65  exprlist {sqlite
a700: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a710: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
a720: 7d 0a 25 74 79 70 65 20 6e 65 78 70 72 6c 69 73  }.%type nexprlis
a730: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
a740: 65 73 74 72 75 63 74 6f 72 20 6e 65 78 70 72 6c  estructor nexprl
a750: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
a760: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
a770: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 65 78  e->db, $$);}..ex
a780: 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 65  prlist(A) ::= ne
a790: 78 70 72 6c 69 73 74 28 41 29 2e 0a 65 78 70 72  xprlist(A)..expr
a7a0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  list(A) ::= .   
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
a7d0: 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41 29 20 3a  }.nexprlist(A) :
a7e0: 3a 3d 20 6e 65 78 70 72 6c 69 73 74 28 41 29 20  := nexprlist(A) 
a7f0: 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e 0a 20  COMMA expr(Y).. 
a800: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
a810: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a820: 61 72 73 65 2c 41 2c 59 29 3b 7d 0a 6e 65 78 70  arse,A,Y);}.nexp
a830: 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70  rlist(A) ::= exp
a840: 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  r(Y)..    {A = s
a850: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
a860: 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 59 29  pend(pParse,0,Y)
a870: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73  ; /*A-overwrites
a880: 2d 59 2a 2f 7d 0a 0a 25 69 66 6e 64 65 66 20 53  -Y*/}..%ifndef S
a890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a8a0: 45 52 59 0a 2f 2a 20 41 20 70 61 72 65 6e 5f 65  ERY./* A paren_e
a8b0: 78 70 72 6c 69 73 74 20 69 73 20 61 6e 20 6f 70  xprlist is an op
a8c0: 74 69 6f 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  tional expressio
a8d0: 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 65 64  n list contained
a8e0: 20 69 6e 73 69 64 65 0a 2a 2a 20 6f 66 20 70 61   inside.** of pa
a8f0: 72 65 6e 74 68 65 73 69 73 20 2a 2f 0a 25 74 79  renthesis */.%ty
a900: 70 65 20 70 61 72 65 6e 5f 65 78 70 72 6c 69 73  pe paren_exprlis
a910: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
a920: 65 73 74 72 75 63 74 6f 72 20 70 61 72 65 6e 5f  estructor paren_
a930: 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65  exprlist {sqlite
a940: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a950: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
a960: 7d 0a 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 74  }.paren_exprlist
a970: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 7b 41 20 3d  (A) ::= .   {A =
a980: 20 30 3b 7d 0a 70 61 72 65 6e 5f 65 78 70 72 6c   0;}.paren_exprl
a990: 69 73 74 28 41 29 20 3a 3a 3d 20 4c 50 20 65 78  ist(A) ::= LP ex
a9a0: 70 72 6c 69 73 74 28 58 29 20 52 50 2e 20 20 7b  prlist(X) RP.  {
a9b0: 41 20 3d 20 58 3b 7d 0a 25 65 6e 64 69 66 20 53  A = X;}.%endif S
a9c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
a9d0: 45 52 59 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ERY...//////////
a9e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a9f0: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 49  /// The CREATE I
aa00: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  NDEX command ///
aa10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aa20: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
aa30: 63 72 65 61 74 65 6b 77 28 53 29 20 75 6e 69 71  createkw(S) uniq
aa40: 75 65 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20  ueflag(U) INDEX 
aa50: 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 45 29 20  ifnotexists(NE) 
aa60: 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29 0a 20 20  nm(X) dbnm(D).  
aa70: 20 20 20 20 20 20 4f 4e 20 6e 6d 28 59 29 20 4c        ON nm(Y) L
aa80: 50 20 73 6f 72 74 6c 69 73 74 28 5a 29 20 52 50  P sortlist(Z) RP
aa90: 20 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b   where_opt(W). {
aaa0: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
aab0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 58  Index(pParse, &X
aac0: 2c 20 26 44 2c 20 0a 20 20 20 20 20 20 20 20 20  , &D, .         
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
aae0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
aaf0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59  (pParse->db,0,&Y
ab00: 2c 30 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20 20  ,0), Z, U,.     
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 26 53 2c 20 57 2c 20 53 51 4c 49 54 45 5f 53   &S, W, SQLITE_S
ab30: 4f 5f 41 53 43 2c 20 4e 45 2c 20 53 51 4c 49 54  O_ASC, NE, SQLIT
ab40: 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44 45 46  E_IDXTYPE_APPDEF
ab50: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71  );.}..%type uniq
ab60: 75 65 66 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69  ueflag {int}.uni
ab70: 71 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55  queflag(A) ::= U
ab80: 4e 49 51 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f  NIQUE.  {A = OE_
ab90: 41 62 6f 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c  Abort;}.uniquefl
aba0: 61 67 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  ag(A) ::= .     
abb0: 20 20 20 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b     {A = OE_None;
abc0: 7d 0a 0a 0a 2f 2f 20 54 68 65 20 65 69 64 6c 69  }...// The eidli
abd0: 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  st non-terminal 
abe0: 28 45 78 70 72 65 73 73 69 6f 6e 20 49 64 20 4c  (Expression Id L
abf0: 69 73 74 29 20 67 65 6e 65 72 61 74 65 73 20 61  ist) generates a
ac00: 6e 20 45 78 70 72 4c 69 73 74 0a 2f 2f 20 66 72  n ExprList.// fr
ac10: 6f 6d 20 61 20 6c 69 73 74 20 6f 66 20 69 64 65  om a list of ide
ac20: 6e 74 69 66 69 65 72 73 2e 20 20 54 68 65 20 69  ntifiers.  The i
ac30: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 73 20  dentifier names 
ac40: 61 72 65 20 69 6e 20 45 78 70 72 4c 69 73 74 2e  are in ExprList.
ac50: 61 5b 5d 2e 7a 4e 61 6d 65 2e 0a 2f 2f 20 54 68  a[].zName..// Th
ac60: 69 73 20 6c 69 73 74 20 69 73 20 73 74 6f 72 65  is list is store
ac70: 64 20 69 6e 20 61 6e 20 45 78 70 72 4c 69 73 74  d in an ExprList
ac80: 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 6e 20   rather than an 
ac90: 49 64 4c 69 73 74 20 73 6f 20 74 68 61 74 20 69  IdList so that i
aca0: 74 0a 2f 2f 20 63 61 6e 20 62 65 20 65 61 73 69  t.// can be easi
acb0: 6c 79 20 73 65 6e 74 20 74 6f 20 73 71 6c 69 74  ly sent to sqlit
acc0: 65 33 43 6f 6c 75 6d 6e 73 45 78 70 72 4c 69 73  e3ColumnsExprLis
acd0: 74 28 29 2e 0a 2f 2f 0a 2f 2f 20 65 69 64 6c 69  t()..//.// eidli
ace0: 73 74 20 69 73 20 67 72 6f 75 70 65 64 20 77 69  st is grouped wi
acf0: 74 68 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  th CREATE INDEX 
ad00: 62 65 63 61 75 73 65 20 69 74 20 75 73 65 64 20  because it used 
ad10: 74 6f 20 62 65 20 74 68 65 20 6e 6f 6e 2d 74 65  to be the non-te
ad20: 72 6d 69 6e 61 6c 0a 2f 2f 20 75 73 65 64 20 66  rminal.// used f
ad30: 6f 72 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  or the arguments
ad40: 20 74 6f 20 61 6e 20 69 6e 64 65 78 2e 20 20 54   to an index.  T
ad50: 68 61 74 20 69 73 20 6a 75 73 74 20 61 6e 20 68  hat is just an h
ad60: 69 73 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65  istorical accide
ad70: 6e 74 2e 0a 2f 2f 0a 2f 2f 20 49 4d 50 4f 52 54  nt..//.// IMPORT
ad80: 41 4e 54 20 43 4f 4d 50 41 54 49 42 49 4c 49 54  ANT COMPATIBILIT
ad90: 59 20 4e 4f 54 45 3a 20 20 53 6f 6d 65 20 70 72  Y NOTE:  Some pr
ada0: 69 6f 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ior versions of 
adb0: 53 51 4c 69 74 65 20 61 63 63 65 70 74 65 64 0a  SQLite accepted.
adc0: 2f 2f 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  // COLLATE claus
add0: 65 73 20 61 6e 64 20 41 53 43 20 6f 72 20 44 45  es and ASC or DE
ade0: 53 43 20 6b 65 79 77 6f 72 64 73 20 6f 6e 20 49  SC keywords on I
adf0: 44 20 6c 69 73 74 73 20 69 6e 20 69 6e 61 70 70  D lists in inapp
ae00: 72 6f 70 72 69 61 74 65 0a 2f 2f 20 70 6c 61 63  ropriate.// plac
ae10: 65 73 20 2d 20 70 6c 61 63 65 73 20 74 68 61 74  es - places that
ae20: 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e   might have been
ae30: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
ae40: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 73 63 68  qlite_master sch
ae50: 65 6d 61 2e 0a 2f 2f 20 54 68 6f 73 65 20 65 78  ema..// Those ex
ae60: 74 72 61 20 66 65 61 74 75 72 65 73 20 77 65 72  tra features wer
ae70: 65 20 69 67 6e 6f 72 65 64 2e 20 20 42 75 74 20  e ignored.  But 
ae80: 62 65 63 61 75 73 65 20 74 68 65 79 20 6d 69 67  because they mig
ae90: 68 74 20 62 65 20 69 6e 20 73 6f 6d 65 0a 2f 2f  ht be in some.//
aea0: 20 28 62 75 73 74 65 64 29 20 6f 6c 64 20 64 61   (busted) old da
aeb0: 74 61 62 61 73 65 73 2c 20 77 65 20 6e 65 65 64  tabases, we need
aec0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 70 61 72   to continue par
aed0: 73 69 6e 67 20 74 68 65 6d 20 77 68 65 6e 20 6c  sing them when l
aee0: 6f 61 64 69 6e 67 0a 2f 2f 20 68 69 73 74 6f 72  oading.// histor
aef0: 69 63 61 6c 20 73 63 68 65 6d 61 73 2e 0a 2f 2f  ical schemas..//
af00: 0a 25 74 79 70 65 20 65 69 64 6c 69 73 74 20 7b  .%type eidlist {
af10: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
af20: 72 75 63 74 6f 72 20 65 69 64 6c 69 73 74 20 7b  ructor eidlist {
af30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
af40: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
af50: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 65 69  , $$);}.%type ei
af60: 64 6c 69 73 74 5f 6f 70 74 20 7b 45 78 70 72 4c  dlist_opt {ExprL
af70: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
af80: 72 20 65 69 64 6c 69 73 74 5f 6f 70 74 20 7b 73  r eidlist_opt {s
af90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
afa0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
afb0: 20 24 24 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65   $$);}..%include
afc0: 20 7b 0a 20 20 2f 2a 20 41 64 64 20 61 20 73 69   {.  /* Add a si
afd0: 6e 67 6c 65 20 6e 65 77 20 74 65 72 6d 20 74 6f  ngle new term to
afe0: 20 61 6e 20 45 78 70 72 4c 69 73 74 20 74 68 61   an ExprList tha
aff0: 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  t is used to sto
b000: 72 65 20 61 0a 20 20 2a 2a 20 6c 69 73 74 20 6f  re a.  ** list o
b010: 66 20 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20  f identifiers.  
b020: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
b030: 69 66 20 74 68 65 20 49 44 20 6c 69 73 74 20 63  if the ID list c
b040: 6f 6e 74 61 69 6e 73 0a 20 20 2a 2a 20 61 20 43  ontains.  ** a C
b050: 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 20 6f 72  OLLATE clause or
b060: 20 61 6e 20 41 53 43 20 6f 72 20 44 45 53 43 20   an ASC or DESC 
b070: 6b 65 79 77 6f 72 64 2c 20 65 78 63 65 70 74 20  keyword, except 
b080: 69 67 6e 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20  ignore the.  ** 
b090: 65 72 72 6f 72 20 77 68 69 6c 65 20 70 61 72 73  error while pars
b0a0: 69 6e 67 20 61 20 6c 65 67 61 63 79 20 73 63 68  ing a legacy sch
b0b0: 65 6d 61 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74  ema..  */.  stat
b0c0: 69 63 20 45 78 70 72 4c 69 73 74 20 2a 70 61 72  ic ExprList *par
b0d0: 73 65 72 41 64 64 45 78 70 72 49 64 4c 69 73 74  serAddExprIdList
b0e0: 54 65 72 6d 28 0a 20 20 20 20 50 61 72 73 65 20  Term(.    Parse 
b0f0: 2a 70 50 61 72 73 65 2c 0a 20 20 20 20 45 78 70  *pParse,.    Exp
b100: 72 4c 69 73 74 20 2a 70 50 72 69 6f 72 2c 0a 20  rList *pPrior,. 
b110: 20 20 20 54 6f 6b 65 6e 20 2a 70 49 64 54 6f 6b     Token *pIdTok
b120: 65 6e 2c 0a 20 20 20 20 69 6e 74 20 68 61 73 43  en,.    int hasC
b130: 6f 6c 6c 61 74 65 2c 0a 20 20 20 20 69 6e 74 20  ollate,.    int 
b140: 73 6f 72 74 4f 72 64 65 72 0a 20 20 29 7b 0a 20  sortOrder.  ){. 
b150: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d     ExprList *p =
b160: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
b170: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70  Append(pParse, p
b180: 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 69  Prior, 0);.    i
b190: 66 28 20 28 68 61 73 43 6f 6c 6c 61 74 65 20 7c  f( (hasCollate |
b1a0: 7c 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c  | sortOrder!=SQL
b1b0: 49 54 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44  ITE_SO_UNDEFINED
b1c0: 29 0a 20 20 20 20 20 20 20 20 26 26 20 70 50 61  ).        && pPa
b1d0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
b1e0: 73 79 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  sy==0.    ){.   
b1f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b200: 73 67 28 70 50 61 72 73 65 2c 20 22 73 79 6e 74  sg(pParse, "synt
b210: 61 78 20 65 72 72 6f 72 20 61 66 74 65 72 20 63  ax error after c
b220: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5c 22 25 2e 2a  olumn name \"%.*
b230: 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b250: 49 64 54 6f 6b 65 6e 2d 3e 6e 2c 20 70 49 64 54  IdToken->n, pIdT
b260: 6f 6b 65 6e 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a  oken->z);.    }.
b270: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
b280: 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
b290: 65 2c 20 70 2c 20 70 49 64 54 6f 6b 65 6e 2c 20  e, p, pIdToken, 
b2a0: 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  1);.    return p
b2b0: 3b 0a 20 20 7d 0a 7d 20 2f 2f 20 65 6e 64 20 25  ;.  }.} // end %
b2c0: 69 6e 63 6c 75 64 65 0a 0a 65 69 64 6c 69 73 74  include..eidlist
b2d0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
b2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2f0: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 65        {A = 0;}.e
b300: 69 64 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a  idlist_opt(A) ::
b310: 3d 20 4c 50 20 65 69 64 6c 69 73 74 28 58 29 20  = LP eidlist(X) 
b320: 52 50 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d  RP.         {A =
b330: 20 58 3b 7d 0a 65 69 64 6c 69 73 74 28 41 29 20   X;}.eidlist(A) 
b340: 3a 3a 3d 20 65 69 64 6c 69 73 74 28 41 29 20 43  ::= eidlist(A) C
b350: 4f 4d 4d 41 20 6e 6d 28 59 29 20 63 6f 6c 6c 61  OMMA nm(Y) colla
b360: 74 65 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28  te(C) sortorder(
b370: 5a 29 2e 20 20 7b 0a 20 20 41 20 3d 20 70 61 72  Z).  {.  A = par
b380: 73 65 72 41 64 64 45 78 70 72 49 64 4c 69 73 74  serAddExprIdList
b390: 54 65 72 6d 28 70 50 61 72 73 65 2c 20 41 2c 20  Term(pParse, A, 
b3a0: 26 59 2c 20 43 2c 20 5a 29 3b 0a 7d 0a 65 69 64  &Y, C, Z);.}.eid
b3b0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59  list(A) ::= nm(Y
b3c0: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
b3d0: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
b3e0: 20 3d 20 70 61 72 73 65 72 41 64 64 45 78 70 72   = parserAddExpr
b3f0: 49 64 4c 69 73 74 54 65 72 6d 28 70 50 61 72 73  IdListTerm(pPars
b400: 65 2c 20 30 2c 20 26 59 2c 20 43 2c 20 5a 29 3b  e, 0, &Y, C, Z);
b410: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d   /*A-overwrites-
b420: 59 2a 2f 0a 7d 0a 0a 25 74 79 70 65 20 63 6f 6c  Y*/.}..%type col
b430: 6c 61 74 65 20 7b 69 6e 74 7d 0a 63 6f 6c 6c 61  late {int}.colla
b440: 74 65 28 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20  te(C) ::= .     
b450: 20 20 20 20 20 20 20 20 20 7b 43 20 3d 20 30 3b           {C = 0;
b460: 7d 0a 63 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d  }.collate(C) ::=
b470: 20 43 4f 4c 4c 41 54 45 20 69 64 73 2e 20 20 20   COLLATE ids.   
b480: 7b 43 20 3d 20 31 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f  {C = 1;}.../////
b490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b4a0: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f  //////// The DRO
b4b0: 50 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20  P INDEX command 
b4c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b4d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
b4e0: 20 3a 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20   ::= DROP INDEX 
b4f0: 69 66 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c  ifexists(E) full
b500: 6e 61 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69  name(X).   {sqli
b510: 74 65 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61  te3DropIndex(pPa
b520: 72 73 65 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f  rse, X, E);}..//
b530: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
b550: 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f  VACUUM command /
b560: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
b580: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
b590: 4d 49 54 5f 56 41 43 55 55 4d 0a 25 69 66 6e 64  MIT_VACUUM.%ifnd
b5a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
b5b0: 54 54 41 43 48 0a 63 6d 64 20 3a 3a 3d 20 56 41  TTACH.cmd ::= VA
b5c0: 43 55 55 4d 2e 20 20 20 20 20 20 20 20 20 20 20  CUUM.           
b5d0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63       {sqlite3Vac
b5e0: 75 75 6d 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a  uum(pParse,0);}.
b5f0: 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d 20 6e  cmd ::= VACUUM n
b600: 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b  m(X).          {
b610: 73 71 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50  sqlite3Vacuum(pP
b620: 61 72 73 65 2c 26 58 29 3b 7d 0a 25 65 6e 64 69  arse,&X);}.%endi
b630: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  f  SQLITE_OMIT_A
b640: 54 54 41 43 48 0a 25 65 6e 64 69 66 20 20 53 51  TTACH.%endif  SQ
b650: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
b660: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
b670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
b680: 54 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61  The PRAGMA comma
b690: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
b6a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b6b0: 0a 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  .//.%ifndef SQLI
b6c0: 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 63  TE_OMIT_PRAGMA.c
b6d0: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
b6e0: 28 58 29 20 64 62 6e 6d 28 5a 29 2e 20 20 20 20  (X) dbnm(Z).    
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
b700: 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73  ite3Pragma(pPars
b710: 65 2c 26 58 2c 26 5a 2c 30 2c 30 29 3b 7d 0a 63  e,&X,&Z,0,0);}.c
b720: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
b730: 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6e  (X) dbnm(Z) EQ n
b740: 6d 6e 75 6d 28 59 29 2e 20 20 20 20 7b 73 71 6c  mnum(Y).    {sql
b750: 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73  ite3Pragma(pPars
b760: 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a  e,&X,&Z,&Y,0);}.
b770: 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e  cmd ::= PRAGMA n
b780: 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20  m(X) dbnm(Z) LP 
b790: 6e 6d 6e 75 6d 28 59 29 20 52 50 2e 20 7b 73 71  nmnum(Y) RP. {sq
b7a0: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
b7b0: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d  se,&X,&Z,&Y,0);}
b7c0: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
b7d0: 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51  nm(X) dbnm(Z) EQ
b7e0: 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29 2e 20 0a   minus_num(Y). .
b7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
b820: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
b830: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 7d  se,&X,&Z,&Y,1);}
b840: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
b850: 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50  nm(X) dbnm(Z) LP
b860: 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29 20 52 50   minus_num(Y) RP
b870: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
b8a0: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50  sqlite3Pragma(pP
b8b0: 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29  arse,&X,&Z,&Y,1)
b8c0: 3b 7d 0a 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d  ;}..nmnum(A) ::=
b8d0: 20 70 6c 75 73 5f 6e 75 6d 28 41 29 2e 0a 6e 6d   plus_num(A)..nm
b8e0: 6e 75 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 41 29  num(A) ::= nm(A)
b8f0: 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 4f  ..nmnum(A) ::= O
b900: 4e 28 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a  N(A)..nmnum(A) :
b910: 3a 3d 20 44 45 4c 45 54 45 28 41 29 2e 0a 6e 6d  := DELETE(A)..nm
b920: 6e 75 6d 28 41 29 20 3a 3a 3d 20 44 45 46 41 55  num(A) ::= DEFAU
b930: 4c 54 28 41 29 2e 0a 25 65 6e 64 69 66 20 53 51  LT(A)..%endif SQ
b940: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41  LITE_OMIT_PRAGMA
b950: 0a 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6e 75  .%token_class nu
b960: 6d 62 65 72 20 49 4e 54 45 47 45 52 7c 46 4c 4f  mber INTEGER|FLO
b970: 41 54 2e 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20  AT..plus_num(A) 
b980: 3a 3a 3d 20 50 4c 55 53 20 6e 75 6d 62 65 72 28  ::= PLUS number(
b990: 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58  X).       {A = X
b9a0: 3b 7d 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a  ;}.plus_num(A) :
b9b0: 3a 3d 20 6e 75 6d 62 65 72 28 41 29 2e 0a 6d 69  := number(A)..mi
b9c0: 6e 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d  nus_num(A) ::= M
b9d0: 49 4e 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20  INUS number(X). 
b9e0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 2f 2f 2f      {A = X;}.///
b9f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ba00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52  ///////// The CR
ba10: 45 41 54 45 20 54 52 49 47 47 45 52 20 63 6f 6d  EATE TRIGGER com
ba20: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
ba30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e  //////////..%ifn
ba40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
ba50: 54 52 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d  TRIGGER..cmd ::=
ba60: 20 63 72 65 61 74 65 6b 77 20 74 72 69 67 67 65   createkw trigge
ba70: 72 5f 64 65 63 6c 28 41 29 20 42 45 47 49 4e 20  r_decl(A) BEGIN 
ba80: 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74  trigger_cmd_list
ba90: 28 53 29 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20  (S) END(Z). {.  
baa0: 54 6f 6b 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c  Token all;.  all
bab0: 2e 7a 20 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e  .z = A.z;.  all.
bac0: 6e 20 3d 20 28 69 6e 74 29 28 5a 2e 7a 20 2d 20  n = (int)(Z.z - 
bad0: 41 2e 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71  A.z) + Z.n;.  sq
bae0: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
baf0: 65 72 28 70 50 61 72 73 65 2c 20 53 2c 20 26 61  er(pParse, S, &a
bb00: 6c 6c 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72 5f  ll);.}..trigger_
bb10: 64 65 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d 70  decl(A) ::= temp
bb20: 28 54 29 20 54 52 49 47 47 45 52 20 69 66 6e 6f  (T) TRIGGER ifno
bb30: 74 65 78 69 73 74 73 28 4e 4f 45 52 52 29 20 6e  texists(NOERR) n
bb40: 6d 28 42 29 20 64 62 6e 6d 28 5a 29 20 0a 20 20  m(B) dbnm(Z) .  
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb60: 20 20 74 72 69 67 67 65 72 5f 74 69 6d 65 28 43    trigger_time(C
bb70: 29 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28  ) trigger_event(
bb80: 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D).             
bb90: 20 20 20 20 20 20 20 4f 4e 20 66 75 6c 6c 6e 61         ON fullna
bba0: 6d 65 28 45 29 20 66 6f 72 65 61 63 68 5f 63 6c  me(E) foreach_cl
bbb0: 61 75 73 65 20 77 68 65 6e 5f 63 6c 61 75 73 65  ause when_clause
bbc0: 28 47 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (G). {.  sqlite3
bbd0: 42 65 67 69 6e 54 72 69 67 67 65 72 28 70 50 61  BeginTrigger(pPa
bbe0: 72 73 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c 20  rse, &B, &Z, C, 
bbf0: 44 2e 61 2c 20 44 2e 62 2c 20 45 2c 20 47 2c 20  D.a, D.b, E, G, 
bc00: 54 2c 20 4e 4f 45 52 52 29 3b 0a 20 20 41 20 3d  T, NOERR);.  A =
bc10: 20 28 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29 3b 20 2f   (Z.n==0?B:Z); /
bc20: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 54 2a  *A-overwrites-T*
bc30: 2f 0a 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  /.}..%type trigg
bc40: 65 72 5f 74 69 6d 65 20 7b 69 6e 74 7d 0a 74 72  er_time {int}.tr
bc50: 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a  igger_time(A) ::
bc60: 3d 20 42 45 46 4f 52 45 7c 41 46 54 45 52 28 58  = BEFORE|AFTER(X
bc70: 29 2e 20 20 7b 20 41 20 3d 20 40 58 3b 20 2f 2a  ).  { A = @X; /*
bc80: 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f  A-overwrites-X*/
bc90: 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28   }.trigger_time(
bca0: 41 29 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20 4f  A) ::= INSTEAD O
bcb0: 46 2e 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e 53  F.  { A = TK_INS
bcc0: 54 45 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f 74  TEAD;}.trigger_t
bcd0: 69 6d 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  ime(A) ::= .    
bce0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b          { A = TK
bcf0: 5f 42 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79 70  _BEFORE; }..%typ
bd00: 65 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20  e trigger_event 
bd10: 7b 73 74 72 75 63 74 20 54 72 69 67 45 76 65 6e  {struct TrigEven
bd20: 74 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74  t}.%destructor t
bd30: 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 71  rigger_event {sq
bd40: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
bd50: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
bd60: 2e 62 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76  .b);}.trigger_ev
bd70: 65 6e 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54  ent(A) ::= DELET
bd80: 45 7c 49 4e 53 45 52 54 28 58 29 2e 20 20 20 7b  E|INSERT(X).   {
bd90: 41 2e 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76  A.a = @X; /*A-ov
bda0: 65 72 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e 62  erwrites-X*/ A.b
bdb0: 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65   = 0;}.trigger_e
bdc0: 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41  vent(A) ::= UPDA
bdd0: 54 45 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  TE(X).          
bde0: 7b 41 2e 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f  {A.a = @X; /*A-o
bdf0: 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e  verwrites-X*/ A.
be00: 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f  b = 0;}.trigger_
be10: 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44  event(A) ::= UPD
be20: 41 54 45 20 4f 46 20 69 64 6c 69 73 74 28 58 29  ATE OF idlist(X)
be30: 2e 7b 41 2e 61 20 3d 20 54 4b 5f 55 50 44 41 54  .{A.a = TK_UPDAT
be40: 45 3b 20 41 2e 62 20 3d 20 58 3b 7d 0a 0a 66 6f  E; A.b = X;}..fo
be50: 72 65 61 63 68 5f 63 6c 61 75 73 65 20 3a 3a 3d  reach_clause ::=
be60: 20 2e 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73   ..foreach_claus
be70: 65 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 52  e ::= FOR EACH R
be80: 4f 57 2e 0a 0a 25 74 79 70 65 20 77 68 65 6e 5f  OW...%type when_
be90: 63 6c 61 75 73 65 20 7b 45 78 70 72 2a 7d 0a 25  clause {Expr*}.%
bea0: 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 6e 5f  destructor when_
beb0: 63 6c 61 75 73 65 20 7b 73 71 6c 69 74 65 33 45  clause {sqlite3E
bec0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
bed0: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 77 68 65 6e  ->db, $$);}.when
bee0: 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e  _clause(A) ::= .
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
bf00: 20 3d 20 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61   = 0; }.when_cla
bf10: 75 73 65 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20  use(A) ::= WHEN 
bf20: 65 78 70 72 28 58 29 2e 20 7b 20 41 20 3d 20 58  expr(X). { A = X
bf30: 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  ; }..%type trigg
bf40: 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 54 72 69  er_cmd_list {Tri
bf50: 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65 73 74  ggerStep*}.%dest
bf60: 72 75 63 74 6f 72 20 74 72 69 67 67 65 72 5f 63  ructor trigger_c
bf70: 6d 64 5f 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  md_list {sqlite3
bf80: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
bf90: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  p(pParse->db, $$
bfa0: 29 3b 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f  );}.trigger_cmd_
bfb0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72 69 67  list(A) ::= trig
bfc0: 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20  ger_cmd_list(A) 
bfd0: 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29 20 53  trigger_cmd(X) S
bfe0: 45 4d 49 2e 20 7b 0a 20 20 61 73 73 65 72 74 28  EMI. {.  assert(
bff0: 20 41 21 3d 30 20 29 3b 0a 20 20 41 2d 3e 70 4c   A!=0 );.  A->pL
c000: 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 58 3b 0a  ast->pNext = X;.
c010: 20 20 41 2d 3e 70 4c 61 73 74 20 3d 20 58 3b 0a    A->pLast = X;.
c020: 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  }.trigger_cmd_li
c030: 73 74 28 41 29 20 3a 3a 3d 20 74 72 69 67 67 65  st(A) ::= trigge
c040: 72 5f 63 6d 64 28 41 29 20 53 45 4d 49 2e 20 7b  r_cmd(A) SEMI. {
c050: 20 0a 20 20 61 73 73 65 72 74 28 20 41 21 3d 30   .  assert( A!=0
c060: 20 29 3b 0a 20 20 41 2d 3e 70 4c 61 73 74 20 3d   );.  A->pLast =
c070: 20 41 3b 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c   A;.}..// Disall
c080: 6f 77 20 71 75 61 6c 69 66 69 65 64 20 74 61 62  ow qualified tab
c090: 6c 65 20 6e 61 6d 65 73 20 6f 6e 20 49 4e 53 45  le names on INSE
c0a0: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
c0b0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
c0c0: 73 0a 2f 2f 20 77 69 74 68 69 6e 20 61 20 74 72  s.// within a tr
c0d0: 69 67 67 65 72 2e 20 20 54 68 65 20 74 61 62 6c  igger.  The tabl
c0e0: 65 20 74 6f 20 49 4e 53 45 52 54 2c 20 55 50 44  e to INSERT, UPD
c0f0: 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 45 20 69  ATE, or DELETE i
c100: 73 20 61 6c 77 61 79 73 20 69 6e 20 0a 2f 2f 20  s always in .// 
c110: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
c120: 65 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  e as the table t
c130: 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20  hat the trigger 
c140: 66 69 72 65 73 20 6f 6e 2e 0a 2f 2f 0a 25 74 79  fires on..//.%ty
c150: 70 65 20 74 72 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a  pe trnm {Token}.
c160: 74 72 6e 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 41  trnm(A) ::= nm(A
c170: 29 2e 0a 74 72 6e 6d 28 41 29 20 3a 3a 3d 20 6e  )..trnm(A) ::= n
c180: 6d 20 44 4f 54 20 6e 6d 28 58 29 2e 20 7b 0a 20  m DOT nm(X). {. 
c190: 20 41 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65   A = X;.  sqlite
c1a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c1b0: 2c 20 0a 20 20 20 20 20 20 20 20 22 71 75 61 6c  , .        "qual
c1c0: 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65  ified table name
c1d0: 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
c1e0: 64 20 6f 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  d on INSERT, UPD
c1f0: 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20  ATE, and DELETE 
c200: 22 0a 20 20 20 20 20 20 20 20 22 73 74 61 74 65  ".        "state
c210: 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69  ments within tri
c220: 67 67 65 72 73 22 29 3b 0a 7d 0a 0a 2f 2f 20 44  ggers");.}..// D
c230: 69 73 61 6c 6c 6f 77 20 74 68 65 20 49 4e 44 45  isallow the INDE
c240: 58 20 42 59 20 61 6e 64 20 4e 4f 54 20 49 4e 44  X BY and NOT IND
c250: 45 58 45 44 20 63 6c 61 75 73 65 73 20 6f 6e 20  EXED clauses on 
c260: 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54  UPDATE and DELET
c270: 45 0a 2f 2f 20 73 74 61 74 65 6d 65 6e 74 73 20  E.// statements 
c280: 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 2e  within triggers.
c290: 20 20 57 65 20 6d 61 6b 65 20 61 20 73 70 65 63    We make a spec
c2a0: 69 66 69 63 20 65 72 72 6f 72 20 6d 65 73 73 61  ific error messa
c2b0: 67 65 20 66 6f 72 20 74 68 69 73 0a 2f 2f 20 73  ge for this.// s
c2c0: 69 6e 63 65 20 69 74 20 69 73 20 61 6e 20 65 78  ince it is an ex
c2d0: 63 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 64  ception to the d
c2e0: 65 66 61 75 6c 74 20 67 72 61 6d 6d 61 72 20 72  efault grammar r
c2f0: 75 6c 65 73 2e 0a 2f 2f 0a 74 72 69 64 78 62 79  ules..//.tridxby
c300: 20 3a 3a 3d 20 2e 0a 74 72 69 64 78 62 79 20 3a   ::= ..tridxby :
c310: 3a 3d 20 49 4e 44 45 58 45 44 20 42 59 20 6e 6d  := INDEXED BY nm
c320: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  . {.  sqlite3Err
c330: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
c340: 20 20 20 20 20 20 22 74 68 65 20 49 4e 44 45 58        "the INDEX
c350: 45 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ED BY clause is 
c360: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 55  not allowed on U
c370: 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
c380: 73 74 61 74 65 6d 65 6e 74 73 20 22 0a 20 20 20  statements ".   
c390: 20 20 20 20 20 22 77 69 74 68 69 6e 20 74 72 69       "within tri
c3a0: 67 67 65 72 73 22 29 3b 0a 7d 0a 74 72 69 64 78  ggers");.}.tridx
c3b0: 62 79 20 3a 3a 3d 20 4e 4f 54 20 49 4e 44 45 58  by ::= NOT INDEX
c3c0: 45 44 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45  ED. {.  sqlite3E
c3d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
c3e0: 20 20 20 20 20 20 20 20 22 74 68 65 20 4e 4f 54          "the NOT
c3f0: 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
c400: 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f  is not allowed o
c410: 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
c420: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 22 0a  TE statements ".
c430: 20 20 20 20 20 20 20 20 22 77 69 74 68 69 6e 20          "within 
c440: 74 72 69 67 67 65 72 73 22 29 3b 0a 7d 0a 0a 0a  triggers");.}...
c450: 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 63  .%type trigger_c
c460: 6d 64 20 7b 54 72 69 67 67 65 72 53 74 65 70 2a  md {TriggerStep*
c470: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72  }.%destructor tr
c480: 69 67 67 65 72 5f 63 6d 64 20 7b 73 71 6c 69 74  igger_cmd {sqlit
c490: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53  e3DeleteTriggerS
c4a0: 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  tep(pParse->db, 
c4b0: 24 24 29 3b 7d 0a 2f 2f 20 55 50 44 41 54 45 20  $$);}.// UPDATE 
c4c0: 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20  .trigger_cmd(A) 
c4d0: 3a 3a 3d 0a 20 20 20 55 50 44 41 54 45 28 42 29  ::=.   UPDATE(B)
c4e0: 20 6f 72 63 6f 6e 66 28 52 29 20 74 72 6e 6d 28   orconf(R) trnm(
c4f0: 58 29 20 74 72 69 64 78 62 79 20 53 45 54 20 73  X) tridxby SET s
c500: 65 74 6c 69 73 74 28 59 29 20 77 68 65 72 65 5f  etlist(Y) where_
c510: 6f 70 74 28 5a 29 20 73 63 61 6e 70 74 28 45 29  opt(Z) scanpt(E)
c520: 2e 20 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69  .  .   {A = sqli
c530: 74 65 33 54 72 69 67 67 65 72 55 70 64 61 74 65  te3TriggerUpdate
c540: 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  Step(pParse->db,
c550: 20 26 58 2c 20 59 2c 20 5a 2c 20 52 2c 20 42 2e   &X, Y, Z, R, B.
c560: 7a 2c 20 45 29 3b 7d 0a 0a 2f 2f 20 49 4e 53 45  z, E);}..// INSE
c570: 52 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  RT.trigger_cmd(A
c580: 29 20 3a 3a 3d 20 73 63 61 6e 70 74 28 42 29 20  ) ::= scanpt(B) 
c590: 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e  insert_cmd(R) IN
c5a0: 54 4f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  TO.             
c5b0: 20 20 20 20 20 20 20 20 20 74 72 6e 6d 28 58 29           trnm(X)
c5c0: 20 69 64 6c 69 73 74 5f 6f 70 74 28 46 29 20 73   idlist_opt(F) s
c5d0: 65 6c 65 63 74 28 53 29 20 75 70 73 65 72 74 28  elect(S) upsert(
c5e0: 55 29 20 73 63 61 6e 70 74 28 5a 29 2e 20 7b 0a  U) scanpt(Z). {.
c5f0: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 54 72     A = sqlite3Tr
c600: 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 70 28  iggerInsertStep(
c610: 70 50 61 72 73 65 2d 3e 64 62 2c 26 58 2c 46 2c  pParse->db,&X,F,
c620: 53 2c 52 2c 55 2c 42 2c 5a 29 3b 2f 2a 41 2d 6f  S,R,U,B,Z);/*A-o
c630: 76 65 72 77 72 69 74 65 73 2d 52 2a 2f 0a 7d 0a  verwrites-R*/.}.
c640: 2f 2f 20 44 45 4c 45 54 45 0a 74 72 69 67 67 65  // DELETE.trigge
c650: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45 4c  r_cmd(A) ::= DEL
c660: 45 54 45 28 42 29 20 46 52 4f 4d 20 74 72 6e 6d  ETE(B) FROM trnm
c670: 28 58 29 20 74 72 69 64 78 62 79 20 77 68 65 72  (X) tridxby wher
c680: 65 5f 6f 70 74 28 59 29 20 73 63 61 6e 70 74 28  e_opt(Y) scanpt(
c690: 45 29 2e 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69  E)..   {A = sqli
c6a0: 74 65 33 54 72 69 67 67 65 72 44 65 6c 65 74 65  te3TriggerDelete
c6b0: 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  Step(pParse->db,
c6c0: 20 26 58 2c 20 59 2c 20 42 2e 7a 2c 20 45 29 3b   &X, Y, B.z, E);
c6d0: 7d 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a 74 72 69  }..// SELECT.tri
c6e0: 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20  gger_cmd(A) ::= 
c6f0: 73 63 61 6e 70 74 28 42 29 20 73 65 6c 65 63 74  scanpt(B) select
c700: 28 58 29 20 73 63 61 6e 70 74 28 45 29 2e 0a 20  (X) scanpt(E).. 
c710: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72    {A = sqlite3Tr
c720: 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28  iggerSelectStep(
c730: 70 50 61 72 73 65 2d 3e 64 62 2c 20 58 2c 20 42  pParse->db, X, B
c740: 2c 20 45 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  , E); /*A-overwr
c750: 69 74 65 73 2d 58 2a 2f 7d 0a 0a 2f 2f 20 54 68  ites-X*/}..// Th
c760: 65 20 73 70 65 63 69 61 6c 20 52 41 49 53 45 20  e special RAISE 
c770: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
c780: 6d 61 79 20 6f 63 63 75 72 20 69 6e 20 74 72 69  may occur in tri
c790: 67 67 65 72 20 70 72 6f 67 72 61 6d 73 0a 65 78  gger programs.ex
c7a0: 70 72 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 20  pr(A) ::= RAISE 
c7b0: 4c 50 20 49 47 4e 4f 52 45 20 52 50 2e 20 20 7b  LP IGNORE RP.  {
c7c0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45  .  A = sqlite3PE
c7d0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52  xpr(pParse, TK_R
c7e0: 41 49 53 45 2c 20 30 2c 20 30 29 3b 20 0a 20 20  AISE, 0, 0); .  
c7f0: 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e  if( A ){.    A->
c800: 61 66 66 69 6e 69 74 79 20 3d 20 4f 45 5f 49 67  affinity = OE_Ig
c810: 6e 6f 72 65 3b 0a 20 20 7d 0a 7d 0a 65 78 70 72  nore;.  }.}.expr
c820: 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 20 4c 50  (A) ::= RAISE LP
c830: 20 72 61 69 73 65 74 79 70 65 28 54 29 20 43 4f   raisetype(T) CO
c840: 4d 4d 41 20 6e 6d 28 5a 29 20 52 50 2e 20 20 7b  MMA nm(Z) RP.  {
c850: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
c860: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  prAlloc(pParse->
c870: 64 62 2c 20 54 4b 5f 52 41 49 53 45 2c 20 26 5a  db, TK_RAISE, &Z
c880: 2c 20 31 29 3b 20 0a 20 20 69 66 28 20 41 20 29  , 1); .  if( A )
c890: 20 7b 0a 20 20 20 20 41 2d 3e 61 66 66 69 6e 69   {.    A->affini
c8a0: 74 79 20 3d 20 28 63 68 61 72 29 54 3b 0a 20 20  ty = (char)T;.  
c8b0: 7d 0a 7d 0a 25 65 6e 64 69 66 20 20 21 53 51 4c  }.}.%endif  !SQL
c8c0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
c8d0: 0a 0a 25 74 79 70 65 20 72 61 69 73 65 74 79 70  ..%type raisetyp
c8e0: 65 20 7b 69 6e 74 7d 0a 72 61 69 73 65 74 79 70  e {int}.raisetyp
c8f0: 65 28 41 29 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43  e(A) ::= ROLLBAC
c900: 4b 2e 20 20 7b 41 20 3d 20 4f 45 5f 52 6f 6c 6c  K.  {A = OE_Roll
c910: 62 61 63 6b 3b 7d 0a 72 61 69 73 65 74 79 70 65  back;}.raisetype
c920: 28 41 29 20 3a 3a 3d 20 41 42 4f 52 54 2e 20 20  (A) ::= ABORT.  
c930: 20 20 20 7b 41 20 3d 20 4f 45 5f 41 62 6f 72 74     {A = OE_Abort
c940: 3b 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20  ;}.raisetype(A) 
c950: 3a 3a 3d 20 46 41 49 4c 2e 20 20 20 20 20 20 7b  ::= FAIL.      {
c960: 41 20 3d 20 4f 45 5f 46 61 69 6c 3b 7d 0a 0a 0a  A = OE_Fail;}...
c970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c980: 2f 2f 2f 2f 2f 2f 2f 2f 20 20 44 52 4f 50 20 54  ////////  DROP T
c990: 52 49 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74  RIGGER statement
c9a0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
c9b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
c9c0: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
c9d0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 63 6d 64 20  MIT_TRIGGER.cmd 
c9e0: 3a 3a 3d 20 44 52 4f 50 20 54 52 49 47 47 45 52  ::= DROP TRIGGER
c9f0: 20 69 66 65 78 69 73 74 73 28 4e 4f 45 52 52 29   ifexists(NOERR)
ca00: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a   fullname(X). {.
ca10: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
ca20: 67 67 65 72 28 70 50 61 72 73 65 2c 58 2c 4e 4f  gger(pParse,X,NO
ca30: 45 52 52 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20  ERR);.}.%endif  
ca40: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  !SQLITE_OMIT_TRI
ca50: 47 47 45 52 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  GGER..//////////
ca60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41  ////////////// A
ca70: 54 54 41 43 48 20 44 41 54 41 42 41 53 45 20 66  TTACH DATABASE f
ca80: 69 6c 65 20 41 53 20 6e 61 6d 65 20 2f 2f 2f 2f  ile AS name ////
ca90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
caa0: 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51  /////.%ifndef SQ
cab0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48  LITE_OMIT_ATTACH
cac0: 0a 63 6d 64 20 3a 3a 3d 20 41 54 54 41 43 48 20  .cmd ::= ATTACH 
cad0: 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20  database_kw_opt 
cae0: 65 78 70 72 28 46 29 20 41 53 20 65 78 70 72 28  expr(F) AS expr(
caf0: 44 29 20 6b 65 79 5f 6f 70 74 28 4b 29 2e 20 7b  D) key_opt(K). {
cb00: 0a 20 20 73 71 6c 69 74 65 33 41 74 74 61 63 68  .  sqlite3Attach
cb10: 28 70 50 61 72 73 65 2c 20 46 2c 20 44 2c 20 4b  (pParse, F, D, K
cb20: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44 45 54  );.}.cmd ::= DET
cb30: 41 43 48 20 64 61 74 61 62 61 73 65 5f 6b 77 5f  ACH database_kw_
cb40: 6f 70 74 20 65 78 70 72 28 44 29 2e 20 7b 0a 20  opt expr(D). {. 
cb50: 20 73 71 6c 69 74 65 33 44 65 74 61 63 68 28 70   sqlite3Detach(p
cb60: 50 61 72 73 65 2c 20 44 29 3b 0a 7d 0a 0a 25 74  Parse, D);.}..%t
cb70: 79 70 65 20 6b 65 79 5f 6f 70 74 20 7b 45 78 70  ype key_opt {Exp
cb80: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
cb90: 6b 65 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33  key_opt {sqlite3
cba0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
cbb0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 6b 65 79  e->db, $$);}.key
cbc0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
cbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbe0: 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 6b 65 79    { A = 0; }.key
cbf0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4b 45 59 20  _opt(A) ::= KEY 
cc00: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20  expr(X).        
cc10: 20 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 64 61    { A = X; }..da
cc20: 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a  tabase_kw_opt ::
cc30: 3d 20 44 41 54 41 42 41 53 45 2e 0a 64 61 74 61  = DATABASE..data
cc40: 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20  base_kw_opt ::= 
cc50: 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f  ..%endif SQLITE_
cc60: 4f 4d 49 54 5f 41 54 54 41 43 48 0a 0a 2f 2f 2f  OMIT_ATTACH..///
cc70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cc80: 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44 45 58 20  /////// REINDEX 
cc90: 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f  collation //////
cca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ccb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66  ////////////.%if
ccc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ccd0: 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d  _REINDEX.cmd ::=
cce0: 20 52 45 49 4e 44 45 58 2e 20 20 20 20 20 20 20   REINDEX.       
ccf0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
cd00: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
cd10: 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d   0, 0);}.cmd ::=
cd20: 20 52 45 49 4e 44 45 58 20 6e 6d 28 58 29 20 64   REINDEX nm(X) d
cd30: 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65  bnm(Y).  {sqlite
cd40: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
cd50: 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69   &X, &Y);}.%endi
cd60: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  f  SQLITE_OMIT_R
cd70: 45 49 4e 44 45 58 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  EINDEX..////////
cd80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cd90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4e 41 4c  /////////// ANAL
cda0: 59 5a 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  YZE ////////////
cdb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cdc0: 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20  ///////.%ifndef 
cdd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c  SQLITE_OMIT_ANAL
cde0: 59 5a 45 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c  YZE.cmd ::= ANAL
cdf0: 59 5a 45 2e 20 20 20 20 20 20 20 20 20 20 20 20  YZE.            
ce00: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c      {sqlite3Anal
ce10: 79 7a 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  yze(pParse, 0, 0
ce20: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c  );}.cmd ::= ANAL
ce30: 59 5a 45 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59  YZE nm(X) dbnm(Y
ce40: 29 2e 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c  ).  {sqlite3Anal
ce50: 79 7a 65 28 70 50 61 72 73 65 2c 20 26 58 2c 20  yze(pParse, &X, 
ce60: 26 59 29 3b 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f  &Y);}.%endif..//
ce70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ce80: 2f 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20 54 41 42  ////// ALTER TAB
ce90: 4c 45 20 74 61 62 6c 65 20 2e 2e 2e 20 2f 2f 2f  LE table ... ///
cea0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ceb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69  /////////////.%i
cec0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ced0: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 63 6d 64  T_ALTERTABLE.cmd
cee0: 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45   ::= ALTER TABLE
cef0: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 52 45 4e   fullname(X) REN
cf00: 41 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e 20 7b 0a  AME TO nm(Z). {.
cf10: 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 52 65    sqlite3AlterRe
cf20: 6e 61 6d 65 54 61 62 6c 65 28 70 50 61 72 73 65  nameTable(pParse
cf30: 2c 58 2c 26 5a 29 3b 0a 7d 0a 63 6d 64 20 3a 3a  ,X,&Z);.}.cmd ::
cf40: 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20 61 64  = ALTER TABLE ad
cf50: 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d  d_column_fullnam
cf60: 65 0a 20 20 20 20 20 20 20 20 41 44 44 20 6b 77  e.        ADD kw
cf70: 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63 6f 6c 75 6d  column_opt colum
cf80: 6e 6e 61 6d 65 28 59 29 20 63 61 72 67 6c 69 73  nname(Y) carglis
cf90: 74 2e 20 7b 0a 20 20 59 2e 6e 20 3d 20 28 69 6e  t. {.  Y.n = (in
cfa0: 74 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74  t)(pParse->sLast
cfb0: 54 6f 6b 65 6e 2e 7a 2d 59 2e 7a 29 20 2b 20 70  Token.z-Y.z) + p
cfc0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
cfd0: 6e 2e 6e 3b 0a 20 20 73 71 6c 69 74 65 33 41 6c  n.n;.  sqlite3Al
cfe0: 74 65 72 46 69 6e 69 73 68 41 64 64 43 6f 6c 75  terFinishAddColu
cff0: 6d 6e 28 70 50 61 72 73 65 2c 20 26 59 29 3b 0a  mn(pParse, &Y);.
d000: 7d 0a 61 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c  }.add_column_ful
d010: 6c 6e 61 6d 65 20 3a 3a 3d 20 66 75 6c 6c 6e 61  lname ::= fullna
d020: 6d 65 28 58 29 2e 20 7b 0a 20 20 64 69 73 61 62  me(X). {.  disab
d030: 6c 65 4c 6f 6f 6b 61 73 69 64 65 28 70 50 61 72  leLookaside(pPar
d040: 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 41 6c  se);.  sqlite3Al
d050: 74 65 72 42 65 67 69 6e 41 64 64 43 6f 6c 75 6d  terBeginAddColum
d060: 6e 28 70 50 61 72 73 65 2c 20 58 29 3b 0a 7d 0a  n(pParse, X);.}.
d070: 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 3a 3a 3d  kwcolumn_opt ::=
d080: 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20   ..kwcolumn_opt 
d090: 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57 2e 0a 25 65  ::= COLUMNKW..%e
d0a0: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
d0b0: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 0a 2f 2f  T_ALTERTABLE..//
d0c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d0d0: 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54 45 20 56 49  ////// CREATE VI
d0e0: 52 54 55 41 4c 20 54 41 42 4c 45 20 2e 2e 2e 20  RTUAL TABLE ... 
d0f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69  /////////////.%i
d110: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d120: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 63  T_VIRTUALTABLE.c
d130: 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f 76 74  md ::= create_vt
d140: 61 62 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ab.             
d150: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
d160: 65 33 56 74 61 62 46 69 6e 69 73 68 50 61 72 73  e3VtabFinishPars
d170: 65 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a 63 6d  e(pParse,0);}.cm
d180: 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f 76 74 61  d ::= create_vta
d190: 62 20 4c 50 20 76 74 61 62 61 72 67 6c 69 73 74  b LP vtabarglist
d1a0: 20 52 50 28 58 29 2e 20 20 7b 73 71 6c 69 74 65   RP(X).  {sqlite
d1b0: 33 56 74 61 62 46 69 6e 69 73 68 50 61 72 73 65  3VtabFinishParse
d1c0: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63 72  (pParse,&X);}.cr
d1d0: 65 61 74 65 5f 76 74 61 62 20 3a 3a 3d 20 63 72  eate_vtab ::= cr
d1e0: 65 61 74 65 6b 77 20 56 49 52 54 55 41 4c 20 54  eatekw VIRTUAL T
d1f0: 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 73 74 73  ABLE ifnotexists
d200: 28 45 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (E).            
d210: 20 20 20 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59      nm(X) dbnm(Y
d220: 29 20 55 53 49 4e 47 20 6e 6d 28 5a 29 2e 20 7b  ) USING nm(Z). {
d230: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
d240: 42 65 67 69 6e 50 61 72 73 65 28 70 50 61 72 73  BeginParse(pPars
d250: 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a 2c 20 45  e, &X, &Y, &Z, E
d260: 29 3b 0a 7d 0a 76 74 61 62 61 72 67 6c 69 73 74  );.}.vtabarglist
d270: 20 3a 3a 3d 20 76 74 61 62 61 72 67 2e 0a 76 74   ::= vtabarg..vt
d280: 61 62 61 72 67 6c 69 73 74 20 3a 3a 3d 20 76 74  abarglist ::= vt
d290: 61 62 61 72 67 6c 69 73 74 20 43 4f 4d 4d 41 20  abarglist COMMA 
d2a0: 76 74 61 62 61 72 67 2e 0a 76 74 61 62 61 72 67  vtabarg..vtabarg
d2b0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
d2d0: 6c 69 74 65 33 56 74 61 62 41 72 67 49 6e 69 74  lite3VtabArgInit
d2e0: 28 70 50 61 72 73 65 29 3b 7d 0a 76 74 61 62 61  (pParse);}.vtaba
d2f0: 72 67 20 3a 3a 3d 20 76 74 61 62 61 72 67 20 76  rg ::= vtabarg v
d300: 74 61 62 61 72 67 74 6f 6b 65 6e 2e 0a 76 74 61  tabargtoken..vta
d310: 62 61 72 67 74 6f 6b 65 6e 20 3a 3a 3d 20 41 4e  bargtoken ::= AN
d320: 59 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  Y(X).           
d330: 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67   {sqlite3VtabArg
d340: 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58  Extend(pParse,&X
d350: 29 3b 7d 0a 76 74 61 62 61 72 67 74 6f 6b 65 6e  );}.vtabargtoken
d360: 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c 69 73 74 20   ::= lp anylist 
d370: 52 50 28 58 29 2e 20 20 7b 73 71 6c 69 74 65 33  RP(X).  {sqlite3
d380: 56 74 61 62 41 72 67 45 78 74 65 6e 64 28 70 50  VtabArgExtend(pP
d390: 61 72 73 65 2c 26 58 29 3b 7d 0a 6c 70 20 3a 3a  arse,&X);}.lp ::
d3a0: 3d 20 4c 50 28 58 29 2e 20 20 20 20 20 20 20 20  = LP(X).        
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
d3c0: 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 45 78  sqlite3VtabArgEx
d3d0: 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58 29 3b  tend(pParse,&X);
d3e0: 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 2e 0a  }.anylist ::= ..
d3f0: 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61 6e 79 6c  anylist ::= anyl
d400: 69 73 74 20 4c 50 20 61 6e 79 6c 69 73 74 20 52  ist LP anylist R
d410: 50 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61  P..anylist ::= a
d420: 6e 79 6c 69 73 74 20 41 4e 59 2e 0a 25 65 6e 64  nylist ANY..%end
d430: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
d440: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 0a 0a 2f  VIRTUALTABLE.../
d450: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
d460: 2f 2f 2f 2f 2f 2f 2f 20 43 4f 4d 4d 4f 4e 20 54  /////// COMMON T
d470: 41 42 4c 45 20 45 58 50 52 45 53 53 49 4f 4e 53  ABLE EXPRESSIONS
d480: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
d490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 74  /////////////.%t
d4a0: 79 70 65 20 77 71 6c 69 73 74 20 7b 57 69 74 68  ype wqlist {With
d4b0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77  *}.%destructor w
d4c0: 71 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 57 69  qlist {sqlite3Wi
d4d0: 74 68 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  thDelete(pParse-
d4e0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 77 69 74 68  >db, $$);}..with
d4f0: 20 3a 3a 3d 20 2e 0a 25 69 66 6e 64 65 66 20 53   ::= ..%ifndef S
d500: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 77  QLITE_OMIT_CTE.w
d510: 69 74 68 20 3a 3a 3d 20 57 49 54 48 20 77 71 6c  ith ::= WITH wql
d520: 69 73 74 28 57 29 2e 20 20 20 20 20 20 20 20 20  ist(W).         
d530: 20 20 20 20 20 7b 20 73 71 6c 69 74 65 33 57 69       { sqlite3Wi
d540: 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 57  thPush(pParse, W
d550: 2c 20 31 29 3b 20 7d 0a 77 69 74 68 20 3a 3a 3d  , 1); }.with ::=
d560: 20 57 49 54 48 20 52 45 43 55 52 53 49 56 45 20   WITH RECURSIVE 
d570: 77 71 6c 69 73 74 28 57 29 2e 20 20 20 20 7b 20  wqlist(W).    { 
d580: 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28  sqlite3WithPush(
d590: 70 50 61 72 73 65 2c 20 57 2c 20 31 29 3b 20 7d  pParse, W, 1); }
d5a0: 0a 0a 77 71 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ..wqlist(A) ::= 
d5b0: 6e 6d 28 58 29 20 65 69 64 6c 69 73 74 5f 6f 70  nm(X) eidlist_op
d5c0: 74 28 59 29 20 41 53 20 4c 50 20 73 65 6c 65 63  t(Y) AS LP selec
d5d0: 74 28 5a 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d  t(Z) RP. {.  A =
d5e0: 20 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28   sqlite3WithAdd(
d5f0: 70 50 61 72 73 65 2c 20 30 2c 20 26 58 2c 20 59  pParse, 0, &X, Y
d600: 2c 20 5a 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72  , Z); /*A-overwr
d610: 69 74 65 73 2d 58 2a 2f 0a 7d 0a 77 71 6c 69 73  ites-X*/.}.wqlis
d620: 74 28 41 29 20 3a 3a 3d 20 77 71 6c 69 73 74 28  t(A) ::= wqlist(
d630: 41 29 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 65  A) COMMA nm(X) e
d640: 69 64 6c 69 73 74 5f 6f 70 74 28 59 29 20 41 53  idlist_opt(Y) AS
d650: 20 4c 50 20 73 65 6c 65 63 74 28 5a 29 20 52 50   LP select(Z) RP
d660: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
d670: 33 57 69 74 68 41 64 64 28 70 50 61 72 73 65 2c  3WithAdd(pParse,
d680: 20 41 2c 20 26 58 2c 20 59 2c 20 5a 29 3b 0a 7d   A, &X, Y, Z);.}
d690: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
d6a0: 4f 4d 49 54 5f 43 54 45 0a                       OMIT_CTE.