/ Hex Artifact Content
Login

Artifact d0f76d2cb8d6883d5600dc20beb961a6022b94b8:


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 2a 0a 2a 2a 20 40 28 23 29 20  ens..**.** @(#) 
0270: 24 49 64 3a 20 70 61 72 73 65 2e 79 2c 76 20 31  $Id: parse.y,v 1
0280: 2e 32 35 32 20 32 30 30 38 2f 30 38 2f 32 30 20  .252 2008/08/20 
0290: 31 36 3a 33 35 3a 31 30 20 64 72 68 20 45 78 70  16:35:10 drh Exp
02a0: 20 24 0a 2a 2f 0a 0a 2f 2f 20 41 6c 6c 20 74 6f   $.*/..// All to
02b0: 6b 65 6e 20 63 6f 64 65 73 20 61 72 65 20 73 6d  ken codes are sm
02c0: 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 77 69 74  all integers wit
02d0: 68 20 23 64 65 66 69 6e 65 73 20 74 68 61 74 20  h #defines that 
02e0: 62 65 67 69 6e 20 77 69 74 68 20 22 54 4b 5f 22  begin with "TK_"
02f0: 0a 25 74 6f 6b 65 6e 5f 70 72 65 66 69 78 20 54  .%token_prefix T
0300: 4b 5f 0a 0a 2f 2f 20 54 68 65 20 74 79 70 65 20  K_..// The type 
0310: 6f 66 20 74 68 65 20 64 61 74 61 20 61 74 74 61  of the data atta
0320: 63 68 65 64 20 74 6f 20 65 61 63 68 20 74 6f 6b  ched to each tok
0330: 65 6e 20 69 73 20 54 6f 6b 65 6e 2e 20 20 54 68  en is Token.  Th
0340: 69 73 20 69 73 20 61 6c 73 6f 20 74 68 65 0a 2f  is is also the./
0350: 2f 20 64 65 66 61 75 6c 74 20 74 79 70 65 20 66  / default type f
0360: 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  or non-terminals
0370: 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 74 79 70 65  ..//.%token_type
0380: 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66 61 75 6c   {Token}.%defaul
0390: 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e 7d 0a 0a  t_type {Token}..
03a0: 2f 2f 20 54 68 65 20 67 65 6e 65 72 61 74 65 64  // The generated
03b0: 20 70 61 72 73 65 72 20 66 75 6e 63 74 69 6f 6e   parser function
03c0: 20 74 61 6b 65 73 20 61 20 34 74 68 20 61 72 67   takes a 4th arg
03d0: 75 6d 65 6e 74 20 61 73 20 66 6f 6c 6c 6f 77 73  ument as follows
03e0: 3a 0a 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  :.%extra_argumen
03f0: 74 20 7b 50 61 72 73 65 20 2a 70 50 61 72 73 65  t {Parse *pParse
0400: 7d 0a 0a 2f 2f 20 54 68 69 73 20 63 6f 64 65 20  }..// This code 
0410: 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 74 68  runs whenever th
0420: 65 72 65 20 69 73 20 61 20 73 79 6e 74 61 78 20  ere is a syntax 
0430: 65 72 72 6f 72 0a 2f 2f 0a 25 73 79 6e 74 61 78  error.//.%syntax
0440: 5f 65 72 72 6f 72 20 7b 0a 20 20 61 73 73 65 72  _error {.  asser
0450: 74 28 20 54 4f 4b 45 4e 2e 7a 5b 30 5d 20 29 3b  t( TOKEN.z[0] );
0460: 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 69 7a    /* The tokeniz
0470: 65 72 20 61 6c 77 61 79 73 20 67 69 76 65 73 20  er always gives 
0480: 75 73 20 61 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  us a token */.  
0490: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
04a0: 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22  pParse, "near \"
04b0: 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72  %T\": syntax err
04c0: 6f 72 22 2c 20 26 54 4f 4b 45 4e 29 3b 0a 20 20  or", &TOKEN);.  
04d0: 70 50 61 72 73 65 2d 3e 70 61 72 73 65 45 72 72  pParse->parseErr
04e0: 6f 72 20 3d 20 31 3b 0a 7d 0a 25 73 74 61 63 6b  or = 1;.}.%stack
04f0: 5f 6f 76 65 72 66 6c 6f 77 20 7b 0a 20 20 73 71  _overflow {.  sq
0500: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
0510: 61 72 73 65 2c 20 22 70 61 72 73 65 72 20 73 74  arse, "parser st
0520: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 22 29 3b 0a  ack overflow");.
0530: 20 20 70 50 61 72 73 65 2d 3e 70 61 72 73 65 45    pParse->parseE
0540: 72 72 6f 72 20 3d 20 31 3b 0a 7d 0a 0a 2f 2f 20  rror = 1;.}..// 
0550: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
0560: 67 65 6e 65 72 61 74 65 64 20 70 72 6f 63 65 64  generated proced
0570: 75 72 65 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ure that impleme
0580: 6e 74 73 20 74 68 65 20 70 61 72 73 65 72 0a 2f  nts the parser./
0590: 2f 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  / is as follows:
05a0: 0a 25 6e 61 6d 65 20 73 71 6c 69 74 65 33 50 61  .%name sqlite3Pa
05b0: 72 73 65 72 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c  rser..// The fol
05c0: 6c 6f 77 69 6e 67 20 74 65 78 74 20 69 73 20 69  lowing text is i
05d0: 6e 63 6c 75 64 65 64 20 6e 65 61 72 20 74 68 65  ncluded near the
05e0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
05f0: 65 20 43 20 73 6f 75 72 63 65 0a 2f 2f 20 63 6f  e C source.// co
0600: 64 65 20 66 69 6c 65 20 74 68 61 74 20 69 6d 70  de file that imp
0610: 6c 65 6d 65 6e 74 73 20 74 68 65 20 70 61 72 73  lements the pars
0620: 65 72 2e 0a 2f 2f 0a 25 69 6e 63 6c 75 64 65 20  er..//.%include 
0630: 7b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  {.#include "sqli
0640: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0650: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0660: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f  his structure ho
0670: 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lds information 
0680: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 4c 49 4d  about the.** LIM
0690: 49 54 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  IT clause of a S
06a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
06b0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 69 6d 69 74  .*/.struct Limit
06c0: 56 61 6c 20 7b 0a 20 20 45 78 70 72 20 2a 70 4c  Val {.  Expr *pL
06d0: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  imit;    /* The 
06e0: 4c 49 4d 49 54 20 65 78 70 72 65 73 73 69 6f 6e  LIMIT expression
06f0: 2e 20 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  .  NULL if there
0700: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 2a 2f 0a   is no limit */.
0710: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 3b    Expr *pOffset;
0720: 20 20 20 2f 2a 20 54 68 65 20 4f 46 46 53 45 54     /* The OFFSET
0730: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4e 55   expression.  NU
0740: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
0750: 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  one */.};../*.**
0760: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
0770: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
0780: 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
0790: 74 68 65 20 4c 49 4b 45 2c 0a 2a 2a 20 47 4c 4f  the LIKE,.** GLO
07a0: 42 2c 20 4e 4f 54 20 4c 49 4b 45 2c 20 61 6e 64  B, NOT LIKE, and
07b0: 20 4e 4f 54 20 47 4c 4f 42 20 6f 70 65 72 61 74   NOT GLOB operat
07c0: 6f 72 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c  ors..*/.struct L
07d0: 69 6b 65 4f 70 20 7b 0a 20 20 54 6f 6b 65 6e 20  ikeOp {.  Token 
07e0: 65 4f 70 65 72 61 74 6f 72 3b 20 20 2f 2a 20 22  eOperator;  /* "
07f0: 6c 69 6b 65 22 20 6f 72 20 22 67 6c 6f 62 22 20  like" or "glob" 
0800: 6f 72 20 22 72 65 67 65 78 70 22 20 2a 2f 0a 20  or "regexp" */. 
0810: 20 69 6e 74 20 6e 6f 74 3b 20 20 20 20 20 20 20   int not;       
0820: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
0830: 20 4e 4f 54 20 6b 65 79 77 6f 72 64 20 69 73 20   NOT keyword is 
0840: 70 72 65 73 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  present */.};../
0850: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
0860: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0870: 67 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63  g structure desc
0880: 72 69 62 65 73 20 74 68 65 20 65 76 65 6e 74 20  ribes the event 
0890: 6f 66 20 61 0a 2a 2a 20 54 52 49 47 47 45 52 2e  of a.** TRIGGER.
08a0: 20 20 22 61 22 20 69 73 20 74 68 65 20 65 76 65    "a" is the eve
08b0: 6e 74 20 74 79 70 65 2c 20 6f 6e 65 20 6f 66 20  nt type, one of 
08c0: 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 49 4e  TK_UPDATE, TK_IN
08d0: 53 45 52 54 2c 0a 2a 2a 20 54 4b 5f 44 45 4c 45  SERT,.** TK_DELE
08e0: 54 45 2c 20 6f 72 20 54 4b 5f 49 4e 53 54 45 41  TE, or TK_INSTEA
08f0: 44 2e 20 20 49 66 20 74 68 65 20 65 76 65 6e 74  D.  If the event
0900: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
0910: 2a 2a 0a 2a 2a 20 20 20 20 20 20 55 50 44 41 54  **.**      UPDAT
0920: 45 20 4f 4e 20 28 61 2c 62 2c 63 29 0a 2a 2a 0a  E ON (a,b,c).**.
0930: 2a 2a 20 54 68 65 6e 20 74 68 65 20 22 62 22 20  ** Then the "b" 
0940: 49 64 4c 69 73 74 20 72 65 63 6f 72 64 73 20 74  IdList records t
0950: 68 65 20 6c 69 73 74 20 22 61 2c 62 2c 63 22 2e  he list "a,b,c".
0960: 0a 2a 2f 0a 73 74 72 75 63 74 20 54 72 69 67 45  .*/.struct TrigE
0970: 76 65 6e 74 20 7b 20 69 6e 74 20 61 3b 20 49 64  vent { int a; Id
0980: 4c 69 73 74 20 2a 20 62 3b 20 7d 3b 0a 0a 2f 2a  List * b; };../*
0990: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
09a0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
09b0: 65 20 68 6f 6c 64 73 20 74 68 65 20 41 54 54 41  e holds the ATTA
09c0: 43 48 20 6b 65 79 20 61 6e 64 20 74 68 65 20 6b  CH key and the k
09d0: 65 79 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75  ey type..*/.stru
09e0: 63 74 20 41 74 74 61 63 68 4b 65 79 20 7b 20 69  ct AttachKey { i
09f0: 6e 74 20 74 79 70 65 3b 20 20 54 6f 6b 65 6e 20  nt type;  Token 
0a00: 6b 65 79 3b 20 7d 3b 0a 0a 7d 20 2f 2f 20 65 6e  key; };..} // en
0a10: 64 20 25 69 6e 63 6c 75 64 65 0a 0a 2f 2f 20 49  d %include..// I
0a20: 6e 70 75 74 20 69 73 20 61 20 73 69 6e 67 6c 65  nput is a single
0a30: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 0a 69 6e 70   SQL command.inp
0a40: 75 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74 2e 0a  ut ::= cmdlist..
0a50: 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 63 6d 64 6c  cmdlist ::= cmdl
0a60: 69 73 74 20 65 63 6d 64 2e 0a 63 6d 64 6c 69 73  ist ecmd..cmdlis
0a70: 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a 65 63 6d 64  t ::= ecmd..ecmd
0a80: 20 3a 3a 3d 20 53 45 4d 49 2e 0a 65 63 6d 64 20   ::= SEMI..ecmd 
0a90: 3a 3a 3d 20 65 78 70 6c 61 69 6e 20 63 6d 64 78  ::= explain cmdx
0aa0: 20 53 45 4d 49 2e 0a 65 78 70 6c 61 69 6e 20 3a   SEMI..explain :
0ab0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 7b  := .           {
0ac0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72   sqlite3BeginPar
0ad0: 73 65 28 70 50 61 72 73 65 2c 20 30 29 3b 20 7d  se(pParse, 0); }
0ae0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
0af0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 65 78 70  OMIT_EXPLAIN.exp
0b00: 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c 41 49 4e  lain ::= EXPLAIN
0b10: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
0b20: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72   sqlite3BeginPar
0b30: 73 65 28 70 50 61 72 73 65 2c 20 31 29 3b 20 7d  se(pParse, 1); }
0b40: 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50  .explain ::= EXP
0b50: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
0b60: 20 20 20 7b 20 73 71 6c 69 74 65 33 42 65 67 69     { sqlite3Begi
0b70: 6e 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 32  nParse(pParse, 2
0b80: 29 3b 20 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  ); }.%endif  SQL
0b90: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
0ba0: 0a 63 6d 64 78 20 3a 3a 3d 20 63 6d 64 2e 20 20  .cmdx ::= cmd.  
0bb0: 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c 69 74           { sqlit
0bc0: 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 70  e3FinishCoding(p
0bd0: 50 61 72 73 65 29 3b 20 7d 0a 0a 2f 2f 2f 2f 2f  Parse); }../////
0be0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0bf0: 20 42 65 67 69 6e 20 61 6e 64 20 65 6e 64 20 74   Begin and end t
0c00: 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 2f 2f 2f  ransactions. ///
0c10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0c20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 63 6d  /////////.//..cm
0c30: 64 20 3a 3a 3d 20 42 45 47 49 4e 20 74 72 61 6e  d ::= BEGIN tran
0c40: 73 74 79 70 65 28 59 29 20 74 72 61 6e 73 5f 6f  stype(Y) trans_o
0c50: 70 74 2e 20 20 7b 73 71 6c 69 74 65 33 42 65 67  pt.  {sqlite3Beg
0c60: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  inTransaction(pP
0c70: 61 72 73 65 2c 20 59 29 3b 7d 0a 74 72 61 6e 73  arse, Y);}.trans
0c80: 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 74 72 61 6e 73  _opt ::= ..trans
0c90: 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41 43  _opt ::= TRANSAC
0ca0: 54 49 4f 4e 2e 0a 74 72 61 6e 73 5f 6f 70 74 20  TION..trans_opt 
0cb0: 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e 20  ::= TRANSACTION 
0cc0: 6e 6d 2e 0a 25 74 79 70 65 20 74 72 61 6e 73 74  nm..%type transt
0cd0: 79 70 65 20 7b 69 6e 74 7d 0a 74 72 61 6e 73 74  ype {int}.transt
0ce0: 79 70 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  ype(A) ::= .    
0cf0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 54 4b           {A = TK
0d00: 5f 44 45 46 45 52 52 45 44 3b 7d 0a 74 72 61 6e  _DEFERRED;}.tran
0d10: 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 44 45 46  stype(A) ::= DEF
0d20: 45 52 52 45 44 28 58 29 2e 20 20 7b 41 20 3d 20  ERRED(X).  {A = 
0d30: 40 58 3b 7d 0a 74 72 61 6e 73 74 79 70 65 28 41  @X;}.transtype(A
0d40: 29 20 3a 3a 3d 20 49 4d 4d 45 44 49 41 54 45 28  ) ::= IMMEDIATE(
0d50: 58 29 2e 20 7b 41 20 3d 20 40 58 3b 7d 0a 74 72  X). {A = @X;}.tr
0d60: 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 45  anstype(A) ::= E
0d70: 58 43 4c 55 53 49 56 45 28 58 29 2e 20 7b 41 20  XCLUSIVE(X). {A 
0d80: 3d 20 40 58 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 43  = @X;}.cmd ::= C
0d90: 4f 4d 4d 49 54 20 74 72 61 6e 73 5f 6f 70 74 2e  OMMIT trans_opt.
0da0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 6f        {sqlite3Co
0db0: 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28  mmitTransaction(
0dc0: 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a  pParse);}.cmd ::
0dd0: 3d 20 45 4e 44 20 74 72 61 6e 73 5f 6f 70 74 2e  = END trans_opt.
0de0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
0df0: 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
0e00: 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64  on(pParse);}.cmd
0e10: 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 20 74 72   ::= ROLLBACK tr
0e20: 61 6e 73 5f 6f 70 74 2e 20 20 20 20 7b 73 71 6c  ans_opt.    {sql
0e30: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
0e40: 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  saction(pParse);
0e50: 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }../////////////
0e60: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45  //////// The CRE
0e70: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
0e80: 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ent ////////////
0e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ea0: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61  .//.cmd ::= crea
0eb0: 74 65 5f 74 61 62 6c 65 20 63 72 65 61 74 65 5f  te_table create_
0ec0: 74 61 62 6c 65 5f 61 72 67 73 2e 0a 63 72 65 61  table_args..crea
0ed0: 74 65 5f 74 61 62 6c 65 20 3a 3a 3d 20 43 52 45  te_table ::= CRE
0ee0: 41 54 45 20 74 65 6d 70 28 54 29 20 54 41 42 4c  ATE temp(T) TABL
0ef0: 45 20 69 66 6e 6f 74 65 78 69 73 74 73 28 45 29  E ifnotexists(E)
0f00: 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 2e 20   nm(Y) dbnm(Z). 
0f10: 7b 0a 20 20 20 73 71 6c 69 74 65 33 53 74 61 72  {.   sqlite3Star
0f20: 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 26 59  tTable(pParse,&Y
0f30: 2c 26 5a 2c 54 2c 30 2c 30 2c 45 29 3b 0a 7d 0a  ,&Z,T,0,0,E);.}.
0f40: 25 74 79 70 65 20 69 66 6e 6f 74 65 78 69 73 74  %type ifnotexist
0f50: 73 20 7b 69 6e 74 7d 0a 69 66 6e 6f 74 65 78 69  s {int}.ifnotexi
0f60: 73 74 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  sts(A) ::= .    
0f70: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
0f80: 3b 7d 0a 69 66 6e 6f 74 65 78 69 73 74 73 28 41  ;}.ifnotexists(A
0f90: 29 20 3a 3a 3d 20 49 46 20 4e 4f 54 20 45 58 49  ) ::= IF NOT EXI
0fa0: 53 54 53 2e 20 7b 41 20 3d 20 31 3b 7d 0a 25 74  STS. {A = 1;}.%t
0fb0: 79 70 65 20 74 65 6d 70 20 7b 69 6e 74 7d 0a 25  ype temp {int}.%
0fc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0fd0: 49 54 5f 54 45 4d 50 44 42 0a 74 65 6d 70 28 41  IT_TEMPDB.temp(A
0fe0: 29 20 3a 3a 3d 20 54 45 4d 50 2e 20 20 7b 41 20  ) ::= TEMP.  {A 
0ff0: 3d 20 31 3b 7d 0a 25 65 6e 64 69 66 20 20 53 51  = 1;}.%endif  SQ
1000: 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
1010: 0a 74 65 6d 70 28 41 29 20 3a 3a 3d 20 2e 20 20  .temp(A) ::= .  
1020: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 63 72 65      {A = 0;}.cre
1030: 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 20 3a  ate_table_args :
1040: 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e 6c 69 73 74  := LP columnlist
1050: 20 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 58 29   conslist_opt(X)
1060: 20 52 50 28 59 29 2e 20 7b 0a 20 20 73 71 6c 69   RP(Y). {.  sqli
1070: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
1080: 73 65 2c 26 58 2c 26 59 2c 30 29 3b 0a 7d 0a 63  se,&X,&Y,0);.}.c
1090: 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73  reate_table_args
10a0: 20 3a 3a 3d 20 41 53 20 73 65 6c 65 63 74 28 53   ::= AS select(S
10b0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 6e  ). {.  sqlite3En
10c0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30 2c  dTable(pParse,0,
10d0: 30 2c 53 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  0,S);.  sqlite3S
10e0: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72  electDelete(pPar
10f0: 73 65 2d 3e 64 62 2c 20 53 29 3b 0a 7d 0a 63 6f  se->db, S);.}.co
1100: 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c  lumnlist ::= col
1110: 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63 6f  umnlist COMMA co
1120: 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e 6c 69 73 74  lumn..columnlist
1130: 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e 0a 0a 2f 2f   ::= column...//
1140: 20 41 20 22 63 6f 6c 75 6d 6e 22 20 69 73 20 61   A "column" is a
1150: 20 63 6f 6d 70 6c 65 74 65 20 64 65 73 63 72 69   complete descri
1160: 70 74 69 6f 6e 20 6f 66 20 61 20 73 69 6e 67 6c  ption of a singl
1170: 65 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 0a 2f 2f  e column in a.//
1180: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
1190: 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 69  atement.  This i
11a0: 6e 63 6c 75 64 65 73 20 74 68 65 20 63 6f 6c 75  ncludes the colu
11b0: 6d 6e 20 6e 61 6d 65 2c 20 69 74 73 0a 2f 2f 20  mn name, its.// 
11c0: 64 61 74 61 74 79 70 65 2c 20 61 6e 64 20 6f 74  datatype, and ot
11d0: 68 65 72 20 6b 65 79 77 6f 72 64 73 20 73 75 63  her keywords suc
11e0: 68 20 61 73 20 50 52 49 4d 41 52 59 20 4b 45 59  h as PRIMARY KEY
11f0: 2c 20 55 4e 49 51 55 45 2c 20 52 45 46 45 52 45  , UNIQUE, REFERE
1200: 4e 43 45 53 2c 0a 2f 2f 20 4e 4f 54 20 4e 55 4c  NCES,.// NOT NUL
1210: 4c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a  L and so forth..
1220: 2f 2f 0a 63 6f 6c 75 6d 6e 28 41 29 20 3a 3a 3d  //.column(A) ::=
1230: 20 63 6f 6c 75 6d 6e 69 64 28 58 29 20 74 79 70   columnid(X) typ
1240: 65 20 63 61 72 67 6c 69 73 74 2e 20 7b 0a 20 20  e carglist. {.  
1250: 41 2e 7a 20 3d 20 58 2e 7a 3b 0a 20 20 41 2e 6e  A.z = X.z;.  A.n
1260: 20 3d 20 28 70 50 61 72 73 65 2d 3e 73 4c 61 73   = (pParse->sLas
1270: 74 54 6f 6b 65 6e 2e 7a 2d 58 2e 7a 29 20 2b 20  tToken.z-X.z) + 
1280: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
1290: 65 6e 2e 6e 3b 0a 7d 0a 63 6f 6c 75 6d 6e 69 64  en.n;.}.columnid
12a0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 7b  (A) ::= nm(X). {
12b0: 0a 20 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  .  sqlite3AddCol
12c0: 75 6d 6e 28 70 50 61 72 73 65 2c 26 58 29 3b 0a  umn(pParse,&X);.
12d0: 20 20 41 20 3d 20 58 3b 0a 7d 0a 0a 0a 2f 2f 20    A = X;.}...// 
12e0: 41 6e 20 49 44 45 4e 54 49 46 49 45 52 20 63 61  An IDENTIFIER ca
12f0: 6e 20 62 65 20 61 20 67 65 6e 65 72 69 63 20 69  n be a generic i
1300: 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e  dentifier, or on
1310: 65 20 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20  e of several.// 
1320: 6b 65 79 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e  keywords.  Any n
1330: 6f 6e 2d 73 74 61 6e 64 61 72 64 20 6b 65 79 77  on-standard keyw
1340: 6f 72 64 20 63 61 6e 20 61 6c 73 6f 20 62 65 20  ord can also be 
1350: 61 6e 20 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f  an identifier../
1360: 2f 0a 25 74 79 70 65 20 69 64 20 7b 54 6f 6b 65  /.%type id {Toke
1370: 6e 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 49 44 28  n}.id(A) ::= ID(
1380: 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d  X).         {A =
1390: 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c   X;}..// The fol
13a0: 6c 6f 77 69 6e 67 20 64 69 72 65 63 74 69 76 65  lowing directive
13b0: 20 63 61 75 73 65 73 20 74 6f 6b 65 6e 73 20 41   causes tokens A
13c0: 42 4f 52 54 2c 20 41 46 54 45 52 2c 20 41 53 43  BORT, AFTER, ASC
13d0: 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61 6c  , etc. to.// fal
13e0: 6c 62 61 63 6b 20 74 6f 20 49 44 20 69 66 20 74  lback to ID if t
13f0: 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61 72  hey will not par
1400: 73 65 20 61 73 20 74 68 65 69 72 20 6f 72 69 67  se as their orig
1410: 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20 54  inal value..// T
1420: 68 69 73 20 6f 62 76 69 61 74 65 73 20 74 68 65  his obviates the
1430: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 20 22 69   need for the "i
1440: 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  d" nonterminal..
1450: 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44 0a  //.%fallback ID.
1460: 20 20 41 42 4f 52 54 20 41 46 54 45 52 20 41 4e    ABORT AFTER AN
1470: 41 4c 59 5a 45 20 41 53 43 20 41 54 54 41 43 48  ALYZE ASC ATTACH
1480: 20 42 45 46 4f 52 45 20 42 45 47 49 4e 20 43 41   BEFORE BEGIN CA
1490: 53 43 41 44 45 20 43 41 53 54 20 43 4f 4e 46 4c  SCADE CAST CONFL
14a0: 49 43 54 0a 20 20 44 41 54 41 42 41 53 45 20 44  ICT.  DATABASE D
14b0: 45 46 45 52 52 45 44 20 44 45 53 43 20 44 45 54  EFERRED DESC DET
14c0: 41 43 48 20 45 41 43 48 20 45 4e 44 20 45 58 43  ACH EACH END EXC
14d0: 4c 55 53 49 56 45 20 45 58 50 4c 41 49 4e 20 46  LUSIVE EXPLAIN F
14e0: 41 49 4c 20 46 4f 52 0a 20 20 49 47 4e 4f 52 45  AIL FOR.  IGNORE
14f0: 20 49 4d 4d 45 44 49 41 54 45 20 49 4e 49 54 49   IMMEDIATE INITI
1500: 41 4c 4c 59 20 49 4e 53 54 45 41 44 20 4c 49 4b  ALLY INSTEAD LIK
1510: 45 5f 4b 57 20 4d 41 54 43 48 20 50 4c 41 4e 0a  E_KW MATCH PLAN.
1520: 20 20 51 55 45 52 59 20 4b 45 59 20 4f 46 20 4f    QUERY KEY OF O
1530: 46 46 53 45 54 20 50 52 41 47 4d 41 20 52 41 49  FFSET PRAGMA RAI
1540: 53 45 20 52 45 50 4c 41 43 45 20 52 45 53 54 52  SE REPLACE RESTR
1550: 49 43 54 20 52 4f 57 0a 20 20 54 45 4d 50 20 54  ICT ROW.  TEMP T
1560: 52 49 47 47 45 52 20 56 41 43 55 55 4d 20 56 49  RIGGER VACUUM VI
1570: 45 57 20 56 49 52 54 55 41 4c 0a 25 69 66 64 65  EW VIRTUAL.%ifde
1580: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1590: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
15a0: 45 58 43 45 50 54 20 49 4e 54 45 52 53 45 43 54  EXCEPT INTERSECT
15b0: 20 55 4e 49 4f 4e 0a 25 65 6e 64 69 66 20 53 51   UNION.%endif SQ
15c0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
15d0: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 52 45 49 4e  ND_SELECT.  REIN
15e0: 44 45 58 20 52 45 4e 41 4d 45 20 43 54 49 4d 45  DEX RENAME CTIME
15f0: 5f 4b 57 20 49 46 0a 20 20 2e 0a 25 77 69 6c 64  _KW IF.  ..%wild
1600: 63 61 72 64 20 41 4e 59 2e 0a 0a 2f 2f 20 44 65  card ANY...// De
1610: 66 69 6e 65 20 6f 70 65 72 61 74 6f 72 20 70 72  fine operator pr
1620: 65 63 65 64 65 6e 63 65 20 65 61 72 6c 79 20 73  ecedence early s
1630: 6f 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74  o that this is t
1640: 68 65 20 66 69 72 73 74 20 6f 63 63 75 72 61 6e  he first occuran
1650: 63 65 0a 2f 2f 20 6f 66 20 74 68 65 20 6f 70 65  ce.// of the ope
1660: 72 61 74 6f 72 20 74 6f 6b 65 6e 73 20 69 6e 20  rator tokens in 
1670: 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 4b 65  the grammer.  Ke
1680: 65 70 69 6e 67 20 74 68 65 20 6f 70 65 72 61 74  eping the operat
1690: 6f 72 73 20 74 6f 67 65 74 68 65 72 0a 2f 2f 20  ors together.// 
16a0: 63 61 75 73 65 73 20 74 68 65 6d 20 74 6f 20 62  causes them to b
16b0: 65 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65 67  e assigned integ
16c0: 65 72 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  er values that a
16d0: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
16e0: 72 2c 0a 2f 2f 20 77 68 69 63 68 20 6b 65 65 70  r,.// which keep
16f0: 73 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20  s parser tables 
1700: 73 6d 61 6c 6c 65 72 2e 0a 2f 2f 0a 2f 2f 20 54  smaller..//.// T
1710: 68 65 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  he token values 
1720: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 73  assigned to thes
1730: 65 20 73 79 6d 62 6f 6c 73 20 69 73 20 64 65 74  e symbols is det
1740: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
1750: 72 64 65 72 0a 2f 2f 20 69 6e 20 77 68 69 63 68  rder.// in which
1760: 20 6c 65 6d 6f 6e 20 66 69 72 73 74 20 73 65 65   lemon first see
1770: 73 20 74 68 65 6d 2e 20 20 49 74 20 6d 75 73 74  s them.  It must
1780: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1790: 74 20 49 53 4e 55 4c 4c 2f 4e 4f 54 4e 55 4c 4c  t ISNULL/NOTNULL
17a0: 2c 0a 2f 2f 20 4e 45 2f 45 51 2c 20 47 54 2f 4c  ,.// NE/EQ, GT/L
17b0: 45 2c 20 61 6e 64 20 47 45 2f 4c 54 20 61 72 65  E, and GE/LT are
17c0: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 6f 6e   separated by on
17d0: 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75  ly a single valu
17e0: 65 2e 20 20 53 65 65 0a 2f 2f 20 74 68 65 20 73  e.  See.// the s
17f0: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1800: 65 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  e() routine for 
1810: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
1820: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 69 73 0a 2f  mation on this./
1830: 2f 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2f 2f  / constraint..//
1840: 0a 25 6c 65 66 74 20 4f 52 2e 0a 25 6c 65 66 74  .%left OR..%left
1850: 20 41 4e 44 2e 0a 25 72 69 67 68 74 20 4e 4f 54   AND..%right NOT
1860: 2e 0a 25 6c 65 66 74 20 49 53 20 4d 41 54 43 48  ..%left IS MATCH
1870: 20 4c 49 4b 45 5f 4b 57 20 42 45 54 57 45 45 4e   LIKE_KW BETWEEN
1880: 20 49 4e 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55   IN ISNULL NOTNU
1890: 4c 4c 20 4e 45 20 45 51 2e 0a 25 6c 65 66 74 20  LL NE EQ..%left 
18a0: 47 54 20 4c 45 20 4c 54 20 47 45 2e 0a 25 72 69  GT LE LT GE..%ri
18b0: 67 68 74 20 45 53 43 41 50 45 2e 0a 25 6c 65 66  ght ESCAPE..%lef
18c0: 74 20 42 49 54 41 4e 44 20 42 49 54 4f 52 20 4c  t BITAND BITOR L
18d0: 53 48 49 46 54 20 52 53 48 49 46 54 2e 0a 25 6c  SHIFT RSHIFT..%l
18e0: 65 66 74 20 50 4c 55 53 20 4d 49 4e 55 53 2e 0a  eft PLUS MINUS..
18f0: 25 6c 65 66 74 20 53 54 41 52 20 53 4c 41 53 48  %left STAR SLASH
1900: 20 52 45 4d 2e 0a 25 6c 65 66 74 20 43 4f 4e 43   REM..%left CONC
1910: 41 54 2e 0a 25 6c 65 66 74 20 43 4f 4c 4c 41 54  AT..%left COLLAT
1920: 45 2e 0a 25 72 69 67 68 74 20 55 4d 49 4e 55 53  E..%right UMINUS
1930: 20 55 50 4c 55 53 20 42 49 54 4e 4f 54 2e 0a 0a   UPLUS BITNOT...
1940: 2f 2f 20 41 6e 64 20 22 69 64 73 22 20 69 73 20  // And "ids" is 
1950: 61 6e 20 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d  an identifer-or-
1960: 73 74 72 69 6e 67 2e 0a 2f 2f 0a 25 74 79 70 65  string..//.%type
1970: 20 69 64 73 20 7b 54 6f 6b 65 6e 7d 0a 69 64 73   ids {Token}.ids
1980: 28 41 29 20 3a 3a 3d 20 49 44 7c 53 54 52 49 4e  (A) ::= ID|STRIN
1990: 47 28 58 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d  G(X).   {A = X;}
19a0: 0a 0a 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66  ..// The name of
19b0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 72 20 74 61 62   a column or tab
19c0: 6c 65 20 63 61 6e 20 62 65 20 61 6e 79 20 6f 66  le can be any of
19d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
19e0: 2f 2f 0a 25 74 79 70 65 20 6e 6d 20 7b 54 6f 6b  //.%type nm {Tok
19f0: 65 6e 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 49 44  en}.nm(A) ::= ID
1a00: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
1a10: 3d 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20  = X;}.nm(A) ::= 
1a20: 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20 20 7b  STRING(X).     {
1a30: 41 20 3d 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a 3a  A = X;}.nm(A) ::
1a40: 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20  = JOIN_KW(X).   
1a50: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 41 20   {A = X;}..// A 
1a60: 74 79 70 65 74 6f 6b 65 6e 20 69 73 20 72 65 61  typetoken is rea
1a70: 6c 6c 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  lly one or more 
1a80: 74 6f 6b 65 6e 73 20 74 68 61 74 20 66 6f 72 6d  tokens that form
1a90: 20 61 20 74 79 70 65 20 6e 61 6d 65 20 73 75 63   a type name suc
1aa0: 68 0a 2f 2f 20 61 73 20 63 61 6e 20 62 65 20 66  h.// as can be f
1ab0: 6f 75 6e 64 20 61 66 74 65 72 20 74 68 65 20 63  ound after the c
1ac0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 61 20  olumn name in a 
1ad0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1ae0: 74 65 6d 65 6e 74 2e 0a 2f 2f 20 4d 75 6c 74 69  tement..// Multi
1af0: 70 6c 65 20 74 6f 6b 65 6e 73 20 61 72 65 20 63  ple tokens are c
1b00: 6f 6e 63 61 74 65 6e 61 74 65 64 20 74 6f 20 66  oncatenated to f
1b10: 6f 72 6d 20 74 68 65 20 76 61 6c 75 65 20 6f 66  orm the value of
1b20: 20 74 68 65 20 74 79 70 65 74 6f 6b 65 6e 2e 0a   the typetoken..
1b30: 2f 2f 0a 25 74 79 70 65 20 74 79 70 65 74 6f 6b  //.%type typetok
1b40: 65 6e 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 20  en {Token}.type 
1b50: 3a 3a 3d 20 2e 0a 74 79 70 65 20 3a 3a 3d 20 74  ::= ..type ::= t
1b60: 79 70 65 74 6f 6b 65 6e 28 58 29 2e 20 20 20 20  ypetoken(X).    
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1b80: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
1b90: 54 79 70 65 28 70 50 61 72 73 65 2c 26 58 29 3b  Type(pParse,&X);
1ba0: 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a  }.typetoken(A) :
1bb0: 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 2e 20  := typename(X). 
1bc0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 74 79 70 65 74    {A = X;}.typet
1bd0: 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79 70 65  oken(A) ::= type
1be0: 6e 61 6d 65 28 58 29 20 4c 50 20 73 69 67 6e 65  name(X) LP signe
1bf0: 64 20 52 50 28 59 29 2e 20 7b 0a 20 20 41 2e 7a  d RP(Y). {.  A.z
1c00: 20 3d 20 58 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20   = X.z;.  A.n = 
1c10: 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 58 2e 7a 3b  &Y.z[Y.n] - X.z;
1c20: 0a 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20  .}.typetoken(A) 
1c30: 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 20  ::= typename(X) 
1c40: 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d 4d 41 20  LP signed COMMA 
1c50: 73 69 67 6e 65 64 20 52 50 28 59 29 2e 20 7b 0a  signed RP(Y). {.
1c60: 20 20 41 2e 7a 20 3d 20 58 2e 7a 3b 0a 20 20 41    A.z = X.z;.  A
1c70: 2e 6e 20 3d 20 26 59 2e 7a 5b 59 2e 6e 5d 20 2d  .n = &Y.z[Y.n] -
1c80: 20 58 2e 7a 3b 0a 7d 0a 25 74 79 70 65 20 74 79   X.z;.}.%type ty
1c90: 70 65 6e 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a 74  pename {Token}.t
1ca0: 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 69  ypename(A) ::= i
1cb0: 64 73 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  ds(X).          
1cc0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 74 79 70 65     {A = X;}.type
1cd0: 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 74 79 70 65  name(A) ::= type
1ce0: 6e 61 6d 65 28 58 29 20 69 64 73 28 59 29 2e 20  name(X) ids(Y). 
1cf0: 7b 41 2e 7a 3d 58 2e 7a 3b 20 41 2e 6e 3d 59 2e  {A.z=X.z; A.n=Y.
1d00: 6e 2b 28 59 2e 7a 2d 58 2e 7a 29 3b 7d 0a 73 69  n+(Y.z-X.z);}.si
1d10: 67 6e 65 64 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75  gned ::= plus_nu
1d20: 6d 2e 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 6d 69  m..signed ::= mi
1d30: 6e 75 73 5f 6e 75 6d 2e 0a 0a 2f 2f 20 22 63 61  nus_num...// "ca
1d40: 72 67 6c 69 73 74 22 20 69 73 20 61 20 6c 69 73  rglist" is a lis
1d50: 74 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  t of additional 
1d60: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
1d70: 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 0a   come after the.
1d80: 2f 2f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  // column name a
1d90: 6e 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  nd column type i
1da0: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
1db0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 0a 63   statement..//.c
1dc0: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67  arglist ::= carg
1dd0: 6c 69 73 74 20 63 61 72 67 2e 0a 63 61 72 67 6c  list carg..cargl
1de0: 69 73 74 20 3a 3a 3d 20 2e 0a 63 61 72 67 20 3a  ist ::= ..carg :
1df0: 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d  := CONSTRAINT nm
1e00: 20 63 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d   ccons..carg ::=
1e10: 20 63 63 6f 6e 73 2e 0a 63 63 6f 6e 73 20 3a 3a   ccons..ccons ::
1e20: 3d 20 44 45 46 41 55 4c 54 20 74 65 72 6d 28 58  = DEFAULT term(X
1e30: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 73  ).            {s
1e40: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
1e50: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 58 29 3b  Value(pParse,X);
1e60: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41  }.ccons ::= DEFA
1e70: 55 4c 54 20 4c 50 20 65 78 70 72 28 58 29 20 52  ULT LP expr(X) R
1e80: 50 2e 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33  P.      {sqlite3
1e90: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
1ea0: 70 50 61 72 73 65 2c 58 29 3b 7d 0a 63 63 6f 6e  pParse,X);}.ccon
1eb0: 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50 4c  s ::= DEFAULT PL
1ec0: 55 53 20 74 65 72 6d 28 58 29 2e 20 20 20 20 20  US term(X).     
1ed0: 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66    {sqlite3AddDef
1ee0: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
1ef0: 2c 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,X);}.ccons ::= 
1f00: 44 45 46 41 55 4c 54 20 4d 49 4e 55 53 20 74 65  DEFAULT MINUS te
1f10: 72 6d 28 58 29 2e 20 20 20 20 20 20 7b 0a 20 20  rm(X).      {.  
1f20: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
1f30: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
1f40: 4b 5f 55 4d 49 4e 55 53 2c 20 58 2c 20 30 2c 20  K_UMINUS, X, 0, 
1f50: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 41 64 64  0);.  sqlite3Add
1f60: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61  DefaultValue(pPa
1f70: 72 73 65 2c 70 29 3b 0a 7d 0a 63 63 6f 6e 73 20  rse,p);.}.ccons 
1f80: 3a 3a 3d 20 44 45 46 41 55 4c 54 20 69 64 28 58  ::= DEFAULT id(X
1f90: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1fa0: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
1fb0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
1fc0: 65 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c  e, TK_STRING, 0,
1fd0: 20 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74   0, &X);.  sqlit
1fe0: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
1ff0: 65 28 70 50 61 72 73 65 2c 70 29 3b 0a 7d 0a 0a  e(pParse,p);.}..
2000: 2f 2f 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  // In addition t
2010: 6f 20 74 68 65 20 74 79 70 65 20 6e 61 6d 65 2c  o the type name,
2020: 20 77 65 20 61 6c 73 6f 20 63 61 72 65 20 61 62   we also care ab
2030: 6f 75 74 20 74 68 65 20 70 72 69 6d 61 72 79 20  out the primary 
2040: 6b 65 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 55  key and.// UNIQU
2050: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2f  E constraints../
2060: 2f 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 55 4c 4c  /.ccons ::= NULL
2070: 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a   onconf..ccons :
2080: 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f  := NOT NULL onco
2090: 6e 66 28 52 29 2e 20 20 20 20 20 20 20 20 20 20  nf(R).          
20a0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64       {sqlite3Add
20b0: 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  NotNull(pParse, 
20c0: 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 50  R);}.ccons ::= P
20d0: 52 49 4d 41 52 59 20 4b 45 59 20 73 6f 72 74 6f  RIMARY KEY sorto
20e0: 72 64 65 72 28 5a 29 20 6f 6e 63 6f 6e 66 28 52  rder(Z) onconf(R
20f0: 29 20 61 75 74 6f 69 6e 63 28 49 29 2e 0a 20 20  ) autoinc(I)..  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 50 72     {sqlite3AddPr
2130: 69 6d 61 72 79 4b 65 79 28 70 50 61 72 73 65 2c  imaryKey(pParse,
2140: 30 2c 52 2c 49 2c 5a 29 3b 7d 0a 63 63 6f 6e 73  0,R,I,Z);}.ccons
2150: 20 3a 3a 3d 20 55 4e 49 51 55 45 20 6f 6e 63 6f   ::= UNIQUE onco
2160: 6e 66 28 52 29 2e 20 20 20 20 7b 73 71 6c 69 74  nf(R).    {sqlit
2170: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
2180: 61 72 73 65 2c 30 2c 30 2c 30 2c 30 2c 52 2c 30  arse,0,0,0,0,R,0
2190: 2c 30 2c 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20  ,0,0,0);}.ccons 
21a0: 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70  ::= CHECK LP exp
21b0: 72 28 58 29 20 52 50 2e 20 20 20 20 20 20 20 7b  r(X) RP.       {
21c0: 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b 43  sqlite3AddCheckC
21d0: 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
21e0: 2c 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,X);}.ccons ::= 
21f0: 52 45 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29  REFERENCES nm(T)
2200: 20 69 64 78 6c 69 73 74 5f 6f 70 74 28 54 41 29   idxlist_opt(TA)
2210: 20 72 65 66 61 72 67 73 28 52 29 2e 0a 20 20 20   refargs(R)..   
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
2240: 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
2250: 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 30 2c 26  gnKey(pParse,0,&
2260: 54 2c 54 41 2c 52 29 3b 7d 0a 63 63 6f 6e 73 20  T,TA,R);}.ccons 
2270: 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62 63 6c 61  ::= defer_subcla
2280: 75 73 65 28 44 29 2e 20 20 20 7b 73 71 6c 69 74  use(D).   {sqlit
2290: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
22a0: 79 28 70 50 61 72 73 65 2c 44 29 3b 7d 0a 63 63  y(pParse,D);}.cc
22b0: 6f 6e 73 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20  ons ::= COLLATE 
22c0: 69 64 73 28 43 29 2e 20 20 7b 73 71 6c 69 74 65  ids(C).  {sqlite
22d0: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
22e0: 70 50 61 72 73 65 2c 20 26 43 29 3b 7d 0a 0a 2f  pParse, &C);}../
22f0: 2f 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20 41  / The optional A
2300: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
2310: 77 6f 72 64 0a 25 74 79 70 65 20 61 75 74 6f 69  word.%type autoi
2320: 6e 63 20 7b 69 6e 74 7d 0a 61 75 74 6f 69 6e 63  nc {int}.autoinc
2330: 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (X) ::= .       
2340: 20 20 20 7b 58 20 3d 20 30 3b 7d 0a 61 75 74 6f     {X = 0;}.auto
2350: 69 6e 63 28 58 29 20 3a 3a 3d 20 41 55 54 4f 49  inc(X) ::= AUTOI
2360: 4e 43 52 2e 20 20 7b 58 20 3d 20 31 3b 7d 0a 0a  NCR.  {X = 1;}..
2370: 2f 2f 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  // The next grou
2380: 70 20 6f 66 20 72 75 6c 65 73 20 70 61 72 73 65  p of rules parse
2390: 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
23a0: 74 6f 20 61 20 52 45 46 45 52 45 4e 43 45 53 20  to a REFERENCES 
23b0: 63 6c 61 75 73 65 0a 2f 2f 20 74 68 61 74 20 64  clause.// that d
23c0: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
23d0: 72 65 66 65 72 65 6e 74 69 61 6c 20 69 6e 74 65  referential inte
23e0: 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  grity checking i
23f0: 73 20 64 65 66 65 72 72 65 64 20 6f 72 0a 2f 2f  s deferred or.//
2400: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 61 6e   or immediate an
2410: 64 20 77 68 69 63 68 20 64 65 74 65 72 6d 69 6e  d which determin
2420: 65 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74 6f  e what action to
2430: 20 74 61 6b 65 20 69 66 20 61 20 72 65 66 2d 69   take if a ref-i
2440: 6e 74 65 67 0a 2f 2f 20 63 68 65 63 6b 20 66 61  nteg.// check fa
2450: 69 6c 73 2e 0a 2f 2f 0a 25 74 79 70 65 20 72 65  ils..//.%type re
2460: 66 61 72 67 73 20 7b 69 6e 74 7d 0a 72 65 66 61  fargs {int}.refa
2470: 72 67 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  rgs(A) ::= .    
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 7b 20 41 20 3d 20 4f 45 5f 52 65 73 74 72 69   { A = OE_Restri
24a0: 63 74 20 2a 20 30 78 30 31 30 31 30 31 3b 20 7d  ct * 0x010101; }
24b0: 0a 72 65 66 61 72 67 73 28 41 29 20 3a 3a 3d 20  .refargs(A) ::= 
24c0: 72 65 66 61 72 67 73 28 58 29 20 72 65 66 61 72  refargs(X) refar
24d0: 67 28 59 29 2e 20 7b 20 41 20 3d 20 28 58 20 26  g(Y). { A = (X &
24e0: 20 59 2e 6d 61 73 6b 29 20 7c 20 59 2e 76 61 6c   Y.mask) | Y.val
24f0: 75 65 3b 20 7d 0a 25 74 79 70 65 20 72 65 66 61  ue; }.%type refa
2500: 72 67 20 7b 73 74 72 75 63 74 20 7b 69 6e 74 20  rg {struct {int 
2510: 76 61 6c 75 65 3b 20 69 6e 74 20 6d 61 73 6b 3b  value; int mask;
2520: 7d 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d  }}.refarg(A) ::=
2530: 20 4d 41 54 43 48 20 6e 6d 2e 20 20 20 20 20 20   MATCH nm.      
2540: 20 20 20 20 20 20 20 20 7b 20 41 2e 76 61 6c 75          { A.valu
2550: 65 20 3d 20 30 3b 20 20 20 20 20 41 2e 6d 61 73  e = 0;     A.mas
2560: 6b 20 3d 20 30 78 30 30 30 30 30 30 3b 20 7d 0a  k = 0x000000; }.
2570: 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e  refarg(A) ::= ON
2580: 20 44 45 4c 45 54 45 20 72 65 66 61 63 74 28 58   DELETE refact(X
2590: 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d  ).   { A.value =
25a0: 20 58 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d   X;     A.mask =
25b0: 20 30 78 30 30 30 30 66 66 3b 20 7d 0a 72 65 66   0x0000ff; }.ref
25c0: 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 55 50  arg(A) ::= ON UP
25d0: 44 41 54 45 20 72 65 66 61 63 74 28 58 29 2e 20  DATE refact(X). 
25e0: 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58 3c    { A.value = X<
25f0: 3c 38 3b 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78  <8;  A.mask = 0x
2600: 30 30 66 66 30 30 3b 20 7d 0a 72 65 66 61 72 67  00ff00; }.refarg
2610: 28 41 29 20 3a 3a 3d 20 4f 4e 20 49 4e 53 45 52  (A) ::= ON INSER
2620: 54 20 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b  T refact(X).   {
2630: 20 41 2e 76 61 6c 75 65 20 3d 20 58 3c 3c 31 36   A.value = X<<16
2640: 3b 20 41 2e 6d 61 73 6b 20 3d 20 30 78 66 66 30  ; A.mask = 0xff0
2650: 30 30 30 3b 20 7d 0a 25 74 79 70 65 20 72 65 66  000; }.%type ref
2660: 61 63 74 20 7b 69 6e 74 7d 0a 72 65 66 61 63 74  act {int}.refact
2670: 28 41 29 20 3a 3a 3d 20 53 45 54 20 4e 55 4c 4c  (A) ::= SET NULL
2680: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
2690: 20 41 20 3d 20 4f 45 5f 53 65 74 4e 75 6c 6c 3b   A = OE_SetNull;
26a0: 20 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d   }.refact(A) ::=
26b0: 20 53 45 54 20 44 45 46 41 55 4c 54 2e 20 20 20   SET DEFAULT.   
26c0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
26d0: 5f 53 65 74 44 66 6c 74 3b 20 7d 0a 72 65 66 61  _SetDflt; }.refa
26e0: 63 74 28 41 29 20 3a 3a 3d 20 43 41 53 43 41 44  ct(A) ::= CASCAD
26f0: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
2700: 20 7b 20 41 20 3d 20 4f 45 5f 43 61 73 63 61 64   { A = OE_Cascad
2710: 65 3b 20 7d 0a 72 65 66 61 63 74 28 41 29 20 3a  e; }.refact(A) :
2720: 3a 3d 20 52 45 53 54 52 49 43 54 2e 20 20 20 20  := RESTRICT.    
2730: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
2740: 4f 45 5f 52 65 73 74 72 69 63 74 3b 20 7d 0a 25  OE_Restrict; }.%
2750: 74 79 70 65 20 64 65 66 65 72 5f 73 75 62 63 6c  type defer_subcl
2760: 61 75 73 65 20 7b 69 6e 74 7d 0a 64 65 66 65 72  ause {int}.defer
2770: 5f 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a  _subclause(A) ::
2780: 3d 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45  = NOT DEFERRABLE
2790: 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70   init_deferred_p
27a0: 72 65 64 5f 6f 70 74 28 58 29 2e 20 20 7b 41 20  red_opt(X).  {A 
27b0: 3d 20 58 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63  = X;}.defer_subc
27c0: 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 44 45 46  lause(A) ::= DEF
27d0: 45 52 52 41 42 4c 45 20 69 6e 69 74 5f 64 65 66  ERRABLE init_def
27e0: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 58  erred_pred_opt(X
27f0: 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  ).      {A = X;}
2800: 0a 25 74 79 70 65 20 69 6e 69 74 5f 64 65 66 65  .%type init_defe
2810: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 20 7b 69  rred_pred_opt {i
2820: 6e 74 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65  nt}.init_deferre
2830: 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a  d_pred_opt(A) ::
2840: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
2850: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
2860: 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64  ;}.init_deferred
2870: 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d  _pred_opt(A) ::=
2880: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
2890: 52 45 44 2e 20 20 20 20 20 7b 41 20 3d 20 31 3b  RED.     {A = 1;
28a0: 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f  }.init_deferred_
28b0: 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  pred_opt(A) ::= 
28c0: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
28d0: 41 54 45 2e 20 20 20 20 7b 41 20 3d 20 30 3b 7d  ATE.    {A = 0;}
28e0: 0a 0a 2f 2f 20 46 6f 72 20 74 68 65 20 74 69 6d  ..// For the tim
28f0: 65 20 62 65 69 6e 67 2c 20 74 68 65 20 6f 6e 6c  e being, the onl
2900: 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 65 20  y constraint we 
2910: 63 61 72 65 20 61 62 6f 75 74 20 69 73 20 74 68  care about is th
2920: 65 20 70 72 69 6d 61 72 79 0a 2f 2f 20 6b 65 79  e primary.// key
2930: 20 61 6e 64 20 55 4e 49 51 55 45 2e 20 20 42 6f   and UNIQUE.  Bo
2940: 74 68 20 63 72 65 61 74 65 20 69 6e 64 69 63 65  th create indice
2950: 73 2e 0a 2f 2f 0a 63 6f 6e 73 6c 69 73 74 5f 6f  s..//.conslist_o
2960: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
2980: 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20 30 3b  .n = 0; A.z = 0;
2990: 7d 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41  }.conslist_opt(A
29a0: 29 20 3a 3a 3d 20 43 4f 4d 4d 41 28 58 29 20 63  ) ::= COMMA(X) c
29b0: 6f 6e 73 6c 69 73 74 2e 20 20 7b 41 20 3d 20 58  onslist.  {A = X
29c0: 3b 7d 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20  ;}.conslist ::= 
29d0: 63 6f 6e 73 6c 69 73 74 20 43 4f 4d 4d 41 20 74  conslist COMMA t
29e0: 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a  cons..conslist :
29f0: 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 74 63 6f 6e  := conslist tcon
2a00: 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20  s..conslist ::= 
2a10: 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73 20 3a 3a 3d  tcons..tcons ::=
2a20: 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 2e 0a   CONSTRAINT nm..
2a30: 74 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52  tcons ::= PRIMAR
2a40: 59 20 4b 45 59 20 4c 50 20 69 64 78 6c 69 73 74  Y KEY LP idxlist
2a50: 28 58 29 20 61 75 74 6f 69 6e 63 28 49 29 20 52  (X) autoinc(I) R
2a60: 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20  P onconf(R)..   
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
2aa0: 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72  dPrimaryKey(pPar
2ab0: 73 65 2c 58 2c 52 2c 49 2c 30 29 3b 7d 0a 74 63  se,X,R,I,0);}.tc
2ac0: 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 4c  ons ::= UNIQUE L
2ad0: 50 20 69 64 78 6c 69 73 74 28 58 29 20 52 50 20  P idxlist(X) RP 
2ae0: 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20  onconf(R)..     
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
2b10: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
2b20: 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 58 2c 52  pParse,0,0,0,X,R
2b30: 2c 30 2c 30 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e  ,0,0,0,0);}.tcon
2b40: 73 20 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65  s ::= CHECK LP e
2b50: 78 70 72 28 45 29 20 52 50 20 6f 6e 63 6f 6e 66  xpr(E) RP onconf
2b60: 2e 20 7b 73 71 6c 69 74 65 33 41 64 64 43 68 65  . {sqlite3AddChe
2b70: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ckConstraint(pPa
2b80: 72 73 65 2c 45 29 3b 7d 0a 74 63 6f 6e 73 20 3a  rse,E);}.tcons :
2b90: 3a 3d 20 46 4f 52 45 49 47 4e 20 4b 45 59 20 4c  := FOREIGN KEY L
2ba0: 50 20 69 64 78 6c 69 73 74 28 46 41 29 20 52 50  P idxlist(FA) RP
2bb0: 0a 20 20 20 20 20 20 20 20 20 20 52 45 46 45 52  .          REFER
2bc0: 45 4e 43 45 53 20 6e 6d 28 54 29 20 69 64 78 6c  ENCES nm(T) idxl
2bd0: 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66 61  ist_opt(TA) refa
2be0: 72 67 73 28 52 29 20 64 65 66 65 72 5f 73 75 62  rgs(R) defer_sub
2bf0: 63 6c 61 75 73 65 5f 6f 70 74 28 44 29 2e 20 7b  clause_opt(D). {
2c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65 61  .    sqlite3Crea
2c10: 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61  teForeignKey(pPa
2c20: 72 73 65 2c 20 46 41 2c 20 26 54 2c 20 54 41 2c  rse, FA, &T, TA,
2c30: 20 52 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   R);.    sqlite3
2c40: 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
2c50: 70 50 61 72 73 65 2c 20 44 29 3b 0a 7d 0a 25 74  pParse, D);.}.%t
2c60: 79 70 65 20 64 65 66 65 72 5f 73 75 62 63 6c 61  ype defer_subcla
2c70: 75 73 65 5f 6f 70 74 20 7b 69 6e 74 7d 0a 64 65  use_opt {int}.de
2c80: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70  fer_subclause_op
2c90: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
2cb0: 20 3d 20 30 3b 7d 0a 64 65 66 65 72 5f 73 75 62   = 0;}.defer_sub
2cc0: 63 6c 61 75 73 65 5f 6f 70 74 28 41 29 20 3a 3a  clause_opt(A) ::
2cd0: 3d 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  = defer_subclaus
2ce0: 65 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  e(X).  {A = X;}.
2cf0: 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .// The followin
2d00: 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74 61 6e 64  g is a non-stand
2d10: 61 72 64 20 65 78 74 65 6e 73 69 6f 6e 20 74 68  ard extension th
2d20: 61 74 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20  at allows us to 
2d30: 64 65 63 6c 61 72 65 20 74 68 65 0a 2f 2f 20 64  declare the.// d
2d40: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20  efault behavior 
2d50: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  when there is a 
2d60: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e 66 6c  constraint confl
2d70: 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f 6e  ict..//.%type on
2d80: 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 70 65  conf {int}.%type
2d90: 20 6f 72 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74   orconf {int}.%t
2da0: 79 70 65 20 72 65 73 6f 6c 76 65 74 79 70 65 20  ype resolvetype 
2db0: 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20  {int}.onconf(A) 
2dc0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 7b 41 20 3d 20 4f 45 5f 44 65 66 61 75     {A = OE_Defau
2df0: 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20 3a  lt;}.onconf(A) :
2e00: 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 72  := ON CONFLICT r
2e10: 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20  esolvetype(X).  
2e20: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f 72 63 6f 6e    {A = X;}.orcon
2e30: 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  f(A) ::= .      
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f          {A = OE_
2e60: 44 65 66 61 75 6c 74 3b 7d 0a 6f 72 63 6f 6e 66  Default;}.orconf
2e70: 28 41 29 20 3a 3a 3d 20 4f 52 20 72 65 73 6f 6c  (A) ::= OR resol
2e80: 76 65 74 79 70 65 28 58 29 2e 20 20 20 20 20 20  vetype(X).      
2e90: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
2ea0: 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a  resolvetype(A) :
2eb0: 3a 3d 20 72 61 69 73 65 74 79 70 65 28 58 29 2e  := raisetype(X).
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
2ed0: 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70  = X;}.resolvetyp
2ee0: 65 28 41 29 20 3a 3a 3d 20 49 47 4e 4f 52 45 2e  e(A) ::= IGNORE.
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 7b 41 20 3d 20 4f 45 5f 49 67 6e 6f 72     {A = OE_Ignor
2f10: 65 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28  e;}.resolvetype(
2f20: 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20  A) ::= REPLACE. 
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65   {A = OE_Replace
2f50: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
2f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
2f70: 68 65 20 44 52 4f 50 20 54 41 42 4c 45 20 2f 2f  he DROP TABLE //
2f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2fa0: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44  ///.//.cmd ::= D
2fb0: 52 4f 50 20 54 41 42 4c 45 20 69 66 65 78 69 73  ROP TABLE ifexis
2fc0: 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58  ts(E) fullname(X
2fd0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72  ). {.  sqlite3Dr
2fe0: 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
2ff0: 58 2c 20 30 2c 20 45 29 3b 0a 7d 0a 25 74 79 70  X, 0, E);.}.%typ
3000: 65 20 69 66 65 78 69 73 74 73 20 7b 69 6e 74 7d  e ifexists {int}
3010: 0a 69 66 65 78 69 73 74 73 28 41 29 20 3a 3a 3d  .ifexists(A) ::=
3020: 20 49 46 20 45 58 49 53 54 53 2e 20 20 20 7b 41   IF EXISTS.   {A
3030: 20 3d 20 31 3b 7d 0a 69 66 65 78 69 73 74 73 28   = 1;}.ifexists(
3040: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
3050: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f      {A = 0;}..//
3060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3070: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 56  /// The CREATE V
3080: 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f  IEW statement //
3090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
30a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25  ///////////.//.%
30b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
30c0: 49 54 5f 56 49 45 57 0a 63 6d 64 20 3a 3a 3d 20  IT_VIEW.cmd ::= 
30d0: 43 52 45 41 54 45 28 58 29 20 74 65 6d 70 28 54  CREATE(X) temp(T
30e0: 29 20 56 49 45 57 20 69 66 6e 6f 74 65 78 69 73  ) VIEW ifnotexis
30f0: 74 73 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d  ts(E) nm(Y) dbnm
3100: 28 5a 29 20 41 53 20 73 65 6c 65 63 74 28 53 29  (Z) AS select(S)
3110: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 43 72 65  . {.  sqlite3Cre
3120: 61 74 65 56 69 65 77 28 70 50 61 72 73 65 2c 20  ateView(pParse, 
3130: 26 58 2c 20 26 59 2c 20 26 5a 2c 20 53 2c 20 54  &X, &Y, &Z, S, T
3140: 2c 20 45 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20  , E);.}.cmd ::= 
3150: 44 52 4f 50 20 56 49 45 57 20 69 66 65 78 69 73  DROP VIEW ifexis
3160: 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58  ts(E) fullname(X
3170: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72  ). {.  sqlite3Dr
3180: 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
3190: 58 2c 20 31 2c 20 45 29 3b 0a 7d 0a 25 65 6e 64  X, 1, E);.}.%end
31a0: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
31b0: 56 49 45 57 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  VIEW..//////////
31c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
31d0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
31e0: 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ent ////////////
31f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3200: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
3210: 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b 0a 20   select(X).  {. 
3220: 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74   SelectDest dest
3230: 20 3d 20 7b 53 52 54 5f 4f 75 74 70 75 74 2c 20   = {SRT_Output, 
3240: 30 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 73  0, 0, 0, 0};.  s
3250: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
3260: 72 73 65 2c 20 58 2c 20 26 64 65 73 74 29 3b 0a  rse, X, &dest);.
3270: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3280: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
3290: 2c 20 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  , X);.}..%type s
32a0: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
32b0: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
32c0: 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  ct {sqlite3Selec
32d0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
32e0: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
32f0: 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65 6c 65 63  oneselect {Selec
3300: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3310: 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71 6c 69 74  oneselect {sqlit
3320: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
3330: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
3340: 0a 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20  ..select(A) ::= 
3350: 6f 6e 65 73 65 6c 65 63 74 28 58 29 2e 20 20 20  oneselect(X).   
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3370: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 69 66 6e     {A = X;}.%ifn
3380: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3390: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
33a0: 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 73 65  select(A) ::= se
33b0: 6c 65 63 74 28 58 29 20 6d 75 6c 74 69 73 65 6c  lect(X) multisel
33c0: 65 63 74 5f 6f 70 28 59 29 20 6f 6e 65 73 65 6c  ect_op(Y) onesel
33d0: 65 63 74 28 5a 29 2e 20 20 7b 0a 20 20 69 66 28  ect(Z).  {.  if(
33e0: 20 5a 20 29 7b 0a 20 20 20 20 5a 2d 3e 6f 70 20   Z ){.    Z->op 
33f0: 3d 20 59 3b 0a 20 20 20 20 5a 2d 3e 70 50 72 69  = Y;.    Z->pPri
3400: 6f 72 20 3d 20 58 3b 0a 20 20 7d 65 6c 73 65 7b  or = X;.  }else{
3410: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
3420: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
3430: 3e 64 62 2c 20 58 29 3b 0a 20 20 7d 0a 20 20 41  >db, X);.  }.  A
3440: 20 3d 20 5a 3b 0a 7d 0a 25 74 79 70 65 20 6d 75   = Z;.}.%type mu
3450: 6c 74 69 73 65 6c 65 63 74 5f 6f 70 20 7b 69 6e  ltiselect_op {in
3460: 74 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f  t}.multiselect_o
3470: 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 28 4f  p(A) ::= UNION(O
3480: 50 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  P).             
3490: 7b 41 20 3d 20 40 4f 50 3b 7d 0a 6d 75 6c 74 69  {A = @OP;}.multi
34a0: 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d  select_op(A) ::=
34b0: 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 20 20 20   UNION ALL.     
34c0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 54 4b 5f          {A = TK_
34d0: 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65 63  ALL;}.multiselec
34e0: 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 45 58 43 45  t_op(A) ::= EXCE
34f0: 50 54 7c 49 4e 54 45 52 53 45 43 54 28 4f 50 29  PT|INTERSECT(OP)
3500: 2e 20 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a 25 65  .  {A = @OP;}.%e
3510: 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndif SQLITE_OMIT
3520: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
3530: 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a  .oneselect(A) ::
3540: 3d 20 53 45 4c 45 43 54 20 64 69 73 74 69 6e 63  = SELECT distinc
3550: 74 28 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28  t(D) selcollist(
3560: 57 29 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65  W) from(X) where
3570: 5f 6f 70 74 28 59 29 0a 20 20 20 20 20 20 20 20  _opt(Y).        
3580: 20 20 20 20 20 20 20 20 20 67 72 6f 75 70 62 79           groupby
3590: 5f 6f 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f  _opt(P) having_o
35a0: 70 74 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70  pt(Q) orderby_op
35b0: 74 28 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c  t(Z) limit_opt(L
35c0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
35d0: 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72  e3SelectNew(pPar
35e0: 73 65 2c 57 2c 58 2c 59 2c 50 2c 51 2c 5a 2c 44  se,W,X,Y,P,Q,Z,D
35f0: 2c 4c 2e 70 4c 69 6d 69 74 2c 4c 2e 70 4f 66 66  ,L.pLimit,L.pOff
3600: 73 65 74 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20  set);.}..// The 
3610: 22 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e 74 65  "distinct" nonte
3620: 72 6d 69 6e 61 6c 20 69 73 20 74 72 75 65 20 28  rminal is true (
3630: 31 29 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  1) if the DISTIN
3640: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 0a 2f 2f  CT keyword is.//
3650: 20 70 72 65 73 65 6e 74 20 61 6e 64 20 66 61 6c   present and fal
3660: 73 65 20 28 30 29 20 69 66 20 69 74 20 69 73 20  se (0) if it is 
3670: 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 64 69  not..//.%type di
3680: 73 74 69 6e 63 74 20 7b 69 6e 74 7d 0a 64 69 73  stinct {int}.dis
3690: 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44 49 53  tinct(A) ::= DIS
36a0: 54 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20 31 3b  TINCT.   {A = 1;
36b0: 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a  }.distinct(A) ::
36c0: 3d 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41  = ALL.        {A
36d0: 20 3d 20 30 3b 7d 0a 64 69 73 74 69 6e 63 74 28   = 0;}.distinct(
36e0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
36f0: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20     {A = 0;}..// 
3700: 73 65 6c 63 6f 6c 6c 69 73 74 20 69 73 20 61 20  selcollist is a 
3710: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
3720: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 74 6f 20  ons that are to 
3730: 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
3740: 6e 0a 2f 2f 20 76 61 6c 75 65 73 20 6f 66 20 74  n.// values of t
3750: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3760: 65 6e 74 2e 20 20 54 68 65 20 22 2a 22 20 69 6e  ent.  The "*" in
3770: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
3780: 0a 2f 2f 20 22 53 45 4c 45 43 54 20 2a 20 46 52  .// "SELECT * FR
3790: 4f 4d 20 2e 2e 2e 22 20 69 73 20 65 6e 63 6f 64  OM ..." is encod
37a0: 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  ed as a special 
37b0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
37c0: 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f 66 20  an.// opcode of 
37d0: 54 4b 5f 41 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65  TK_ALL..//.%type
37e0: 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 45 78 70   selcollist {Exp
37f0: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
3800: 74 6f 72 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b  tor selcollist {
3810: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3820: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
3830: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 63  , $$);}.%type sc
3840: 6c 70 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  lp {ExprList*}.%
3850: 64 65 73 74 72 75 63 74 6f 72 20 73 63 6c 70 20  destructor sclp 
3860: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
3870: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
3880: 62 2c 20 24 24 29 3b 7d 0a 73 63 6c 70 28 41 29  b, $$);}.sclp(A)
3890: 20 3a 3a 3d 20 73 65 6c 63 6f 6c 6c 69 73 74 28   ::= selcollist(
38a0: 58 29 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20  X) COMMA.       
38b0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73        {A = X;}.s
38c0: 63 6c 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  clp(A) ::= .    
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
38f0: 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28   0;}.selcollist(
3900: 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20 65  A) ::= sclp(P) e
3910: 78 70 72 28 58 29 20 61 73 28 59 29 2e 20 20 20  xpr(X) as(Y).   
3920: 20 20 7b 0a 20 20 20 41 20 3d 20 73 71 6c 69 74    {.   A = sqlit
3930: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
3940: 28 70 50 61 72 73 65 2c 50 2c 58 2c 59 2e 6e 3f  (pParse,P,X,Y.n?
3950: 26 59 3a 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c  &Y:0);.}.selcoll
3960: 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28  ist(A) ::= sclp(
3970: 50 29 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70  P) STAR. {.  Exp
3980: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 45  r *p = sqlite3PE
3990: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41  xpr(pParse, TK_A
39a0: 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  LL, 0, 0, 0);.  
39b0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
39c0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
39d0: 2c 20 50 2c 20 70 2c 20 30 29 3b 0a 7d 0a 73 65  , P, p, 0);.}.se
39e0: 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20  lcollist(A) ::= 
39f0: 73 63 6c 70 28 50 29 20 6e 6d 28 58 29 20 44 4f  sclp(P) nm(X) DO
3a00: 54 20 53 54 41 52 28 59 29 2e 20 7b 0a 20 20 45  T STAR(Y). {.  E
3a10: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71  xpr *pRight = sq
3a20: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
3a30: 65 2c 20 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c  e, TK_ALL, 0, 0,
3a40: 20 26 59 29 3b 0a 20 20 45 78 70 72 20 2a 70 4c   &Y);.  Expr *pL
3a50: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  eft = sqlite3PEx
3a60: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
3a70: 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45  , 0, 0, &X);.  E
3a80: 78 70 72 20 2a 70 44 6f 74 20 3d 20 73 71 6c 69  xpr *pDot = sqli
3a90: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
3aa0: 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
3ab0: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 41 20  pRight, 0);.  A 
3ac0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
3ad0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 50  tAppend(pParse,P
3ae0: 2c 20 70 44 6f 74 2c 20 30 29 3b 0a 7d 0a 0a 2f  , pDot, 0);.}../
3af0: 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20  / An option "AS 
3b00: 3c 69 64 3e 22 20 70 68 72 61 73 65 20 74 68 61  <id>" phrase tha
3b10: 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65  t can follow one
3b20: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
3b30: 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64 65 66 69  ons that.// defi
3b40: 6e 65 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ne the result se
3b50: 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  t, or one of the
3b60: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
3b70: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25  ROM clause..//.%
3b80: 74 79 70 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a  type as {Token}.
3b90: 61 73 28 58 29 20 3a 3a 3d 20 41 53 20 6e 6d 28  as(X) ::= AS nm(
3ba0: 59 29 2e 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a  Y).    {X = Y;}.
3bb0: 61 73 28 58 29 20 3a 3a 3d 20 69 64 73 28 59 29  as(X) ::= ids(Y)
3bc0: 2e 20 20 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a  .      {X = Y;}.
3bd0: 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20  as(X) ::= .     
3be0: 20 20 20 20 20 20 20 7b 58 2e 6e 20 3d 20 30 3b         {X.n = 0;
3bf0: 7d 0a 0a 0a 25 74 79 70 65 20 73 65 6c 74 61 62  }...%type seltab
3c00: 6c 69 73 74 20 7b 53 72 63 4c 69 73 74 2a 7d 0a  list {SrcList*}.
3c10: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 74  %destructor selt
3c20: 61 62 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 53  ablist {sqlite3S
3c30: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  rcListDelete(pPa
3c40: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
3c50: 74 79 70 65 20 73 74 6c 5f 70 72 65 66 69 78 20  type stl_prefix 
3c60: 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74  {SrcList*}.%dest
3c70: 72 75 63 74 6f 72 20 73 74 6c 5f 70 72 65 66 69  ructor stl_prefi
3c80: 78 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73  x {sqlite3SrcLis
3c90: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
3ca0: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
3cb0: 66 72 6f 6d 20 7b 53 72 63 4c 69 73 74 2a 7d 0a  from {SrcList*}.
3cc0: 25 64 65 73 74 72 75 63 74 6f 72 20 66 72 6f 6d  %destructor from
3cd0: 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   {sqlite3SrcList
3ce0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
3cf0: 62 2c 20 24 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63  b, $$);}..// A c
3d00: 6f 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63 6c 61  omplete FROM cla
3d10: 75 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20  use..//.from(A) 
3d20: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
3d30: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
3d40: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50  3DbMallocZero(pP
3d50: 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66  arse->db, sizeof
3d60: 28 2a 41 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20  (*A));}.from(A) 
3d70: 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c  ::= FROM seltabl
3d80: 69 73 74 28 58 29 2e 20 20 7b 0a 20 20 41 20 3d  ist(X).  {.  A =
3d90: 20 58 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63   X;.  sqlite3Src
3da0: 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
3db0: 65 28 41 29 3b 0a 7d 0a 0a 2f 2f 20 22 73 65 6c  e(A);.}..// "sel
3dc0: 74 61 62 6c 69 73 74 22 20 69 73 20 61 20 22 53  tablist" is a "S
3dd0: 65 6c 65 63 74 20 54 61 62 6c 65 20 4c 69 73 74  elect Table List
3de0: 22 20 2d 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  " - the content 
3df0: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
3e00: 73 65 0a 2f 2f 20 69 6e 20 61 20 53 45 4c 45 43  se.// in a SELEC
3e10: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 22 73  T statement.  "s
3e20: 74 6c 5f 70 72 65 66 69 78 22 20 69 73 20 61 20  tl_prefix" is a 
3e30: 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 6c  prefix of this l
3e40: 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f 70 72 65 66  ist..//.stl_pref
3e50: 69 78 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61 62  ix(A) ::= seltab
3e60: 6c 69 73 74 28 58 29 20 6a 6f 69 6e 6f 70 28 59  list(X) joinop(Y
3e70: 29 2e 20 20 20 20 7b 0a 20 20 20 41 20 3d 20 58  ).    {.   A = X
3e80: 3b 0a 20 20 20 69 66 28 20 41 20 26 26 20 41 2d  ;.   if( A && A-
3e90: 3e 6e 53 72 63 3e 30 20 29 20 41 2d 3e 61 5b 41  >nSrc>0 ) A->a[A
3ea0: 2d 3e 6e 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79  ->nSrc-1].jointy
3eb0: 70 65 20 3d 20 59 3b 0a 7d 0a 73 74 6c 5f 70 72  pe = Y;.}.stl_pr
3ec0: 65 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20  efix(A) ::= .   
3ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ee0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
3ef0: 0a 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a  .seltablist(A) :
3f00: 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29  := stl_prefix(X)
3f10: 20 6e 6d 28 59 29 20 64 62 6e 6d 28 44 29 20 61   nm(Y) dbnm(D) a
3f20: 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75  s(Z) on_opt(N) u
3f30: 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20  sing_opt(U). {. 
3f40: 20 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   A = sqlite3SrcL
3f50: 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
3f60: 6d 28 70 50 61 72 73 65 2c 58 2c 26 59 2c 26 44  m(pParse,X,&Y,&D
3f70: 2c 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 7d 0a 25 69  ,&Z,0,N,U);.}.%i
3f80: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3f90: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 73 65 6c  T_SUBQUERY.  sel
3fa0: 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  tablist(A) ::= s
3fb0: 74 6c 5f 70 72 65 66 69 78 28 58 29 20 4c 50 20  tl_prefix(X) LP 
3fc0: 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e  seltablist_paren
3fd0: 28 53 29 20 52 50 0a 20 20 20 20 20 20 20 20 20  (S) RP.         
3fe0: 20 20 20 20 20 20 20 20 20 20 20 61 73 28 5a 29             as(Z)
3ff0: 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67   on_opt(N) using
4000: 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 20 20 41  _opt(U). {.    A
4010: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
4020: 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
4030: 70 50 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a 2c  pParse,X,0,0,&Z,
4040: 53 2c 4e 2c 55 29 3b 0a 20 20 7d 0a 20 20 0a 20  S,N,U);.  }.  . 
4050: 20 2f 2f 20 41 20 73 65 6c 74 61 62 6c 69 73 74   // A seltablist
4060: 5f 70 61 72 65 6e 20 6e 6f 6e 74 65 72 6d 69 6e  _paren nontermin
4070: 61 6c 20 72 65 70 72 65 73 65 6e 74 73 20 61 6e  al represents an
4080: 79 74 68 69 6e 67 20 69 6e 20 61 20 46 52 4f 4d  ything in a FROM
4090: 20 74 68 61 74 0a 20 20 2f 2f 20 69 73 20 63 6f   that.  // is co
40a0: 6e 74 61 69 6e 65 64 20 69 6e 73 69 64 65 20 70  ntained inside p
40b0: 61 72 65 6e 74 68 65 73 65 73 2e 20 20 54 68 69  arentheses.  Thi
40c0: 73 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  s can be either 
40d0: 61 20 73 75 62 71 75 65 72 79 20 6f 72 0a 20 20  a subquery or.  
40e0: 2f 2f 20 61 20 67 72 6f 75 70 69 6e 67 20 6f 66  // a grouping of
40f0: 20 74 61 62 6c 65 20 61 6e 64 20 73 75 62 71 75   table and subqu
4100: 65 72 69 65 73 2e 0a 20 20 2f 2f 0a 20 20 25 74  eries..  //.  %t
4110: 79 70 65 20 73 65 6c 74 61 62 6c 69 73 74 5f 70  ype seltablist_p
4120: 61 72 65 6e 20 7b 53 65 6c 65 63 74 2a 7d 0a 20  aren {Select*}. 
4130: 20 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c   %destructor sel
4140: 74 61 62 6c 69 73 74 5f 70 61 72 65 6e 20 7b 73  tablist_paren {s
4150: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
4160: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
4170: 24 29 3b 7d 0a 20 20 73 65 6c 74 61 62 6c 69 73  $);}.  seltablis
4180: 74 5f 70 61 72 65 6e 28 41 29 20 3a 3a 3d 20 73  t_paren(A) ::= s
4190: 65 6c 65 63 74 28 53 29 2e 20 20 20 20 20 20 7b  elect(S).      {
41a0: 41 20 3d 20 53 3b 7d 0a 20 20 73 65 6c 74 61 62  A = S;}.  seltab
41b0: 6c 69 73 74 5f 70 61 72 65 6e 28 41 29 20 3a 3a  list_paren(A) ::
41c0: 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 46 29 2e  = seltablist(F).
41d0: 20 20 7b 0a 20 20 20 20 20 73 71 6c 69 74 65 33    {.     sqlite3
41e0: 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e  SrcListShiftJoin
41f0: 54 79 70 65 28 46 29 3b 0a 20 20 20 20 20 41 20  Type(F);.     A 
4200: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
4210: 65 77 28 70 50 61 72 73 65 2c 30 2c 46 2c 30 2c  ew(pParse,0,F,0,
4220: 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  0,0,0,0,0,0);.  
4230: 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  }.%endif  SQLITE
4240: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a  _OMIT_SUBQUERY..
4250: 25 74 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65  %type dbnm {Toke
4260: 6e 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e  n}.dbnm(A) ::= .
4270: 20 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30            {A.z=0
4280: 3b 20 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41  ; A.n=0;}.dbnm(A
4290: 29 20 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e  ) ::= DOT nm(X).
42a0: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65   {A = X;}..%type
42b0: 20 66 75 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69   fullname {SrcLi
42c0: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
42d0: 20 66 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74   fullname {sqlit
42e0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
42f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
4300: 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a  }.fullname(A) ::
4310: 3d 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e  = nm(X) dbnm(Y).
4320: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 53 72    {A = sqlite3Sr
4330: 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  cListAppend(pPar
4340: 73 65 2d 3e 64 62 2c 30 2c 26 58 2c 26 59 29 3b  se->db,0,&X,&Y);
4350: 7d 0a 0a 25 74 79 70 65 20 6a 6f 69 6e 6f 70 20  }..%type joinop 
4360: 7b 69 6e 74 7d 0a 25 74 79 70 65 20 6a 6f 69 6e  {int}.%type join
4370: 6f 70 32 20 7b 69 6e 74 7d 0a 6a 6f 69 6e 6f 70  op2 {int}.joinop
4380: 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 7c 4a 4f  (X) ::= COMMA|JO
4390: 49 4e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  IN.             
43a0: 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b   { X = JT_INNER;
43b0: 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d   }.joinop(X) ::=
43c0: 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f 49 4e   JOIN_KW(A) JOIN
43d0: 2e 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20  .         { X = 
43e0: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
43f0: 70 50 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20  pParse,&A,0,0); 
4400: 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20  }.joinop(X) ::= 
4410: 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29  JOIN_KW(A) nm(B)
4420: 20 4a 4f 49 4e 2e 20 20 20 7b 20 58 20 3d 20 73   JOIN.   { X = s
4430: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70  qlite3JoinType(p
4440: 50 61 72 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20  Parse,&A,&B,0); 
4450: 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20  }.joinop(X) ::= 
4460: 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29  JOIN_KW(A) nm(B)
4470: 20 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20   nm(C) JOIN..   
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44a0: 20 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65      { X = sqlite
44b0: 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65  3JoinType(pParse
44c0: 2c 26 41 2c 26 42 2c 26 43 29 3b 20 7d 0a 0a 25  ,&A,&B,&C); }..%
44d0: 74 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70  type on_opt {Exp
44e0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
44f0: 6f 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  on_opt {sqlite3E
4500: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
4510: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 6f 6e 5f 6f  ->db, $$);}.on_o
4520: 70 74 28 4e 29 20 3a 3a 3d 20 4f 4e 20 65 78 70  pt(N) ::= ON exp
4530: 72 28 45 29 2e 20 20 20 7b 4e 20 3d 20 45 3b 7d  r(E).   {N = E;}
4540: 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 2e  .on_opt(N) ::= .
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 4e 20               {N 
4560: 3d 20 30 3b 7d 0a 0a 25 74 79 70 65 20 75 73 69  = 0;}..%type usi
4570: 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73 74 2a 7d  ng_opt {IdList*}
4580: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 75 73 69  .%destructor usi
4590: 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 49  ng_opt {sqlite3I
45a0: 64 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  dListDelete(pPar
45b0: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 75 73  se->db, $$);}.us
45c0: 69 6e 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 55  ing_opt(U) ::= U
45d0: 53 49 4e 47 20 4c 50 20 69 6e 73 63 6f 6c 6c 69  SING LP inscolli
45e0: 73 74 28 4c 29 20 52 50 2e 20 20 7b 55 20 3d 20  st(L) RP.  {U = 
45f0: 4c 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29  L;}.using_opt(U)
4600: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 55                {U
4620: 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 6f   = 0;}...%type o
4630: 72 64 65 72 62 79 5f 6f 70 74 20 7b 45 78 70 72  rderby_opt {Expr
4640: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
4650: 6f 72 20 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b  or orderby_opt {
4660: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4670: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
4680: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 6f  , $$);}.%type so
4690: 72 74 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  rtlist {ExprList
46a0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
46b0: 6f 72 74 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  ortlist {sqlite3
46c0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
46d0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
46e0: 0a 25 74 79 70 65 20 73 6f 72 74 69 74 65 6d 20  .%type sortitem 
46f0: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
4700: 74 6f 72 20 73 6f 72 74 69 74 65 6d 20 7b 73 71  tor sortitem {sq
4710: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4720: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
4730: 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28 41  }..orderby_opt(A
4740: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4760: 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64 65 72 62   {A = 0;}.orderb
4770: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4f 52 44  y_opt(A) ::= ORD
4780: 45 52 20 42 59 20 73 6f 72 74 6c 69 73 74 28 58  ER BY sortlist(X
4790: 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  ).      {A = X;}
47a0: 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d  .sortlist(A) ::=
47b0: 20 73 6f 72 74 6c 69 73 74 28 58 29 20 43 4f 4d   sortlist(X) COM
47c0: 4d 41 20 73 6f 72 74 69 74 65 6d 28 59 29 20 73  MA sortitem(Y) s
47d0: 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20  ortorder(Z). {. 
47e0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
47f0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
4800: 65 2c 58 2c 59 2c 30 29 3b 0a 20 20 69 66 28 20  e,X,Y,0);.  if( 
4810: 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70  A ) A->a[A->nExp
4820: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
4830: 20 5a 3b 0a 7d 0a 73 6f 72 74 6c 69 73 74 28 41   Z;.}.sortlist(A
4840: 29 20 3a 3a 3d 20 73 6f 72 74 69 74 65 6d 28 59  ) ::= sortitem(Y
4850: 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20  ) sortorder(Z). 
4860: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
4870: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
4880: 61 72 73 65 2c 30 2c 59 2c 30 29 3b 0a 20 20 69  arse,0,Y,0);.  i
4890: 66 28 20 41 20 26 26 20 41 2d 3e 61 20 29 20 41  f( A && A->a ) A
48a0: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
48b0: 20 3d 20 5a 3b 0a 7d 0a 73 6f 72 74 69 74 65 6d   = Z;.}.sortitem
48c0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e  (A) ::= expr(X).
48d0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79     {A = X;}..%ty
48e0: 70 65 20 73 6f 72 74 6f 72 64 65 72 20 7b 69 6e  pe sortorder {in
48f0: 74 7d 0a 0a 73 6f 72 74 6f 72 64 65 72 28 41 29  t}..sortorder(A)
4900: 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20 20 20 20   ::= ASC.       
4910: 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f      {A = SQLITE_
4920: 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74 6f 72 64  SO_ASC;}.sortord
4930: 65 72 28 41 29 20 3a 3a 3d 20 44 45 53 43 2e 20  er(A) ::= DESC. 
4940: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51           {A = SQ
4950: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 7d 0a 73  LITE_SO_DESC;}.s
4960: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20  ortorder(A) ::= 
4970: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
4980: 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  A = SQLITE_SO_AS
4990: 43 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75 70  C;}..%type group
49a0: 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74  by_opt {ExprList
49b0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 67  *}.%destructor g
49c0: 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c 69  roupby_opt {sqli
49d0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
49e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
49f0: 29 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28  );}.groupby_opt(
4a00: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
4a20: 20 3d 20 30 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f   = 0;}.groupby_o
4a30: 70 74 28 41 29 20 3a 3a 3d 20 47 52 4f 55 50 20  pt(A) ::= GROUP 
4a40: 42 59 20 6e 65 78 70 72 6c 69 73 74 28 58 29 2e  BY nexprlist(X).
4a50: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65   {A = X;}..%type
4a60: 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 45 78 70   having_opt {Exp
4a70: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
4a80: 68 61 76 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69  having_opt {sqli
4a90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
4aa0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
4ab0: 68 61 76 69 6e 67 5f 6f 70 74 28 41 29 20 3a 3a  having_opt(A) ::
4ac0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4ad0: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 68 61 76 69     {A = 0;}.havi
4ae0: 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 48 41  ng_opt(A) ::= HA
4af0: 56 49 4e 47 20 65 78 70 72 28 58 29 2e 20 20 7b  VING expr(X).  {
4b00: 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 6c  A = X;}..%type l
4b10: 69 6d 69 74 5f 6f 70 74 20 7b 73 74 72 75 63 74  imit_opt {struct
4b20: 20 4c 69 6d 69 74 56 61 6c 7d 0a 0a 2f 2f 20 54   LimitVal}..// T
4b30: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
4b40: 72 20 6c 69 6d 69 74 5f 6f 70 74 20 77 69 6c 6c  r limit_opt will
4b50: 20 6e 65 76 65 72 20 66 69 72 65 20 69 6e 20 74   never fire in t
4b60: 68 65 20 63 75 72 72 65 6e 74 20 67 72 61 6d 6d  he current gramm
4b70: 61 72 2e 0a 2f 2f 20 54 68 65 20 6c 69 6d 69 74  ar..// The limit
4b80: 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  _opt non-termina
4b90: 6c 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 61 74  l only occurs at
4ba0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 73 69   the end of a si
4bb0: 6e 67 6c 65 20 70 72 6f 64 75 63 74 69 6f 6e 0a  ngle production.
4bc0: 2f 2f 20 72 75 6c 65 20 66 6f 72 20 53 45 4c 45  // rule for SELE
4bd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  CT statements.  
4be0: 41 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 72  As soon as the r
4bf0: 75 6c 65 20 74 68 61 74 20 63 72 65 61 74 65 20  ule that create 
4c00: 74 68 65 20 0a 2f 2f 20 6c 69 6d 69 74 5f 6f 70  the .// limit_op
4c10: 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 72  t non-terminal r
4c20: 65 64 75 63 65 73 2c 20 74 68 65 20 53 45 4c 45  educes, the SELE
4c30: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 75 6c  CT statement rul
4c40: 65 20 77 69 6c 6c 20 61 6c 73 6f 0a 2f 2f 20 72  e will also.// r
4c50: 65 64 75 63 65 2e 20 20 53 6f 20 74 68 65 72 65  educe.  So there
4c60: 20 69 73 20 6e 65 76 65 72 20 61 20 6c 69 6d 69   is never a limi
4c70: 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e  t_opt non-termin
4c80: 61 6c 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  al on the stack 
4c90: 0a 2f 2f 20 65 78 63 65 70 74 20 61 73 20 61 20  .// except as a 
4ca0: 74 72 61 6e 73 69 65 6e 74 2e 20 20 53 6f 20 74  transient.  So t
4cb0: 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
4cc0: 79 74 68 69 6e 67 20 74 6f 20 64 65 73 74 72 6f  ything to destro
4cd0: 79 2e 0a 2f 2f 0a 2f 2f 25 64 65 73 74 72 75 63  y..//.//%destruc
4ce0: 74 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 0a  tor limit_opt {.
4cf0: 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  //  sqlite3ExprD
4d00: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
4d10: 2c 20 24 24 2e 70 4c 69 6d 69 74 29 3b 0a 2f 2f  , $$.pLimit);.//
4d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4d30: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
4d40: 24 24 2e 70 4f 66 66 73 65 74 29 3b 0a 2f 2f 7d  $$.pOffset);.//}
4d50: 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a  .limit_opt(A) ::
4d60: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4d70: 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d 69          {A.pLimi
4d80: 74 20 3d 20 30 3b 20 41 2e 70 4f 66 66 73 65 74  t = 0; A.pOffset
4d90: 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74   = 0;}.limit_opt
4da0: 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78  (A) ::= LIMIT ex
4db0: 70 72 28 58 29 2e 20 20 20 20 20 20 20 20 7b 41  pr(X).        {A
4dc0: 2e 70 4c 69 6d 69 74 20 3d 20 58 3b 20 41 2e 70  .pLimit = X; A.p
4dd0: 4f 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d  Offset = 0;}.lim
4de0: 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49  it_opt(A) ::= LI
4df0: 4d 49 54 20 65 78 70 72 28 58 29 20 4f 46 46 53  MIT expr(X) OFFS
4e00: 45 54 20 65 78 70 72 28 59 29 2e 20 0a 20 20 20  ET expr(Y). .   
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20      {A.pLimit = 
4e40: 58 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 59  X; A.pOffset = Y
4e50: 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  ;}.limit_opt(A) 
4e60: 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58  ::= LIMIT expr(X
4e70: 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e  ) COMMA expr(Y).
4e80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4f 66 66           {A.pOff
4eb0: 73 65 74 20 3d 20 58 3b 20 41 2e 70 4c 69 6d 69  set = X; A.pLimi
4ec0: 74 20 3d 20 59 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  t = Y;}..///////
4ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ee0: 2f 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54 45 20  //// The DELETE 
4ef0: 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f  statement //////
4f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f10: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
4f20: 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 66  := DELETE FROM f
4f30: 75 6c 6c 6e 61 6d 65 28 58 29 20 77 68 65 72 65  ullname(X) where
4f40: 5f 6f 70 74 28 59 29 2e 20 7b 73 71 6c 69 74 65  _opt(Y). {sqlite
4f50: 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72  3DeleteFrom(pPar
4f60: 73 65 2c 58 2c 59 29 3b 7d 0a 0a 25 74 79 70 65  se,X,Y);}..%type
4f70: 20 77 68 65 72 65 5f 6f 70 74 20 7b 45 78 70 72   where_opt {Expr
4f80: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77  *}.%destructor w
4f90: 68 65 72 65 5f 6f 70 74 20 7b 73 71 6c 69 74 65  here_opt {sqlite
4fa0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
4fb0: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 77  se->db, $$);}..w
4fc0: 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  here_opt(A) ::= 
4fd0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4fe0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 77 68       {A = 0;}.wh
4ff0: 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 57  ere_opt(A) ::= W
5000: 48 45 52 45 20 65 78 70 72 28 58 29 2e 20 20 20  HERE expr(X).   
5010: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f      {A = X;}..//
5020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5030: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 55 50 44  //////// The UPD
5040: 41 54 45 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  ATE command ////
5050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
5070: 63 6d 64 20 3a 3a 3d 20 55 50 44 41 54 45 20 6f  cmd ::= UPDATE o
5080: 72 63 6f 6e 66 28 52 29 20 66 75 6c 6c 6e 61 6d  rconf(R) fullnam
5090: 65 28 58 29 20 53 45 54 20 73 65 74 6c 69 73 74  e(X) SET setlist
50a0: 28 59 29 20 77 68 65 72 65 5f 6f 70 74 28 5a 29  (Y) where_opt(Z)
50b0: 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 78  .  {.  sqlite3Ex
50c0: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
50d0: 68 28 70 50 61 72 73 65 2c 59 2c 22 73 65 74 20  h(pParse,Y,"set 
50e0: 6c 69 73 74 22 29 3b 20 0a 20 20 73 71 6c 69 74  list"); .  sqlit
50f0: 65 33 55 70 64 61 74 65 28 70 50 61 72 73 65 2c  e3Update(pParse,
5100: 58 2c 59 2c 5a 2c 52 29 3b 0a 7d 0a 0a 25 74 79  X,Y,Z,R);.}..%ty
5110: 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 70 72  pe setlist {Expr
5120: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
5130: 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 6c 69  or setlist {sqli
5140: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
5150: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
5160: 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20  );}..setlist(A) 
5170: 3a 3a 3d 20 73 65 74 6c 69 73 74 28 5a 29 20 43  ::= setlist(Z) C
5180: 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65 78  OMMA nm(X) EQ ex
5190: 70 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20  pr(Y)..    {A = 
51a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
51b0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 5a 2c 59  ppend(pParse,Z,Y
51c0: 2c 26 58 29 3b 7d 0a 73 65 74 6c 69 73 74 28 41  ,&X);}.setlist(A
51d0: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51 20 65  ) ::= nm(X) EQ e
51e0: 78 70 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d  xpr(Y)..    {A =
51f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5200: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c  Append(pParse,0,
5210: 59 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  Y,&X);}..///////
5220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5230: 2f 2f 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63  /// The INSERT c
5240: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
5250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5260: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
5270: 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52  ::= insert_cmd(R
5280: 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28  ) INTO fullname(
5290: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
52a0: 74 28 46 29 20 0a 20 20 20 20 20 20 20 20 56 41  t(F) .        VA
52b0: 4c 55 45 53 20 4c 50 20 69 74 65 6d 6c 69 73 74  LUES LP itemlist
52c0: 28 59 29 20 52 50 2e 0a 20 20 20 20 20 20 20 20  (Y) RP..        
52d0: 20 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73 65      {sqlite3Inse
52e0: 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 59 2c  rt(pParse, X, Y,
52f0: 20 30 2c 20 46 2c 20 52 29 3b 7d 0a 63 6d 64 20   0, F, R);}.cmd 
5300: 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52  ::= insert_cmd(R
5310: 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28  ) INTO fullname(
5320: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
5330: 74 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e 0a  t(F) select(S)..
5340: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
5350: 69 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73  ite3Insert(pPars
5360: 65 2c 20 58 2c 20 30 2c 20 53 2c 20 46 2c 20 52  e, X, 0, S, F, R
5370: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65  );}.cmd ::= inse
5380: 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66  rt_cmd(R) INTO f
5390: 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63 6f  ullname(X) insco
53a0: 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 44 45 46  llist_opt(F) DEF
53b0: 41 55 4c 54 20 56 41 4c 55 45 53 2e 0a 20 20 20  AULT VALUES..   
53c0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
53d0: 33 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20  3Insert(pParse, 
53e0: 58 2c 20 30 2c 20 30 2c 20 46 2c 20 52 29 3b 7d  X, 0, 0, F, R);}
53f0: 0a 0a 25 74 79 70 65 20 69 6e 73 65 72 74 5f 63  ..%type insert_c
5400: 6d 64 20 7b 69 6e 74 7d 0a 69 6e 73 65 72 74 5f  md {int}.insert_
5410: 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e 53 45 52  cmd(A) ::= INSER
5420: 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20 20 20 7b  T orconf(R).   {
5430: 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72 74 5f 63  A = R;}.insert_c
5440: 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43  md(A) ::= REPLAC
5450: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  E.            {A
5460: 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a   = OE_Replace;}.
5470: 0a 0a 25 74 79 70 65 20 69 74 65 6d 6c 69 73 74  ..%type itemlist
5480: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
5490: 73 74 72 75 63 74 6f 72 20 69 74 65 6d 6c 69 73  structor itemlis
54a0: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
54b0: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
54c0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 69 74 65 6d  >db, $$);}..item
54d0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 74 65 6d  list(A) ::= item
54e0: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78  list(X) COMMA ex
54f0: 70 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20  pr(Y)..    {A = 
5500: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5510: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 58 2c 59  ppend(pParse,X,Y
5520: 2c 30 29 3b 7d 0a 69 74 65 6d 6c 69 73 74 28 41  ,0);}.itemlist(A
5530: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 0a 20  ) ::= expr(X).. 
5540: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
5550: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
5560: 61 72 73 65 2c 30 2c 58 2c 30 29 3b 7d 0a 0a 25  arse,0,X,0);}..%
5570: 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74 5f  type inscollist_
5580: 6f 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64  opt {IdList*}.%d
5590: 65 73 74 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c  estructor inscol
55a0: 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65  list_opt {sqlite
55b0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 50  3IdListDelete(pP
55c0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
55d0: 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74  %type inscollist
55e0: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74   {IdList*}.%dest
55f0: 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73  ructor inscollis
5600: 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t {sqlite3IdList
5610: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
5620: 62 2c 20 24 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c  b, $$);}..inscol
5630: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
5640: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5650: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
5660: 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28  .inscollist_opt(
5670: 41 29 20 3a 3a 3d 20 4c 50 20 69 6e 73 63 6f 6c  A) ::= LP inscol
5680: 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20 20 7b  list(X) RP.    {
5690: 41 20 3d 20 58 3b 7d 0a 69 6e 73 63 6f 6c 6c 69  A = X;}.inscolli
56a0: 73 74 28 41 29 20 3a 3a 3d 20 69 6e 73 63 6f 6c  st(A) ::= inscol
56b0: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 6e 6d  list(X) COMMA nm
56c0: 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71  (Y)..    {A = sq
56d0: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
56e0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 58 2c 26  d(pParse->db,X,&
56f0: 59 29 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28  Y);}.inscollist(
5700: 41 29 20 3a 3a 3d 20 6e 6d 28 59 29 2e 0a 20 20  A) ::= nm(Y)..  
5710: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49 64    {A = sqlite3Id
5720: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
5730: 65 2d 3e 64 62 2c 30 2c 26 59 29 3b 7d 0a 0a 2f  e->db,0,&Y);}../
5740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 45 78 70 72 65  ////////// Expre
5760: 73 73 69 6f 6e 20 50 72 6f 63 65 73 73 69 6e 67  ssion Processing
5770: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
5780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
5790: 2f 0a 0a 25 74 79 70 65 20 65 78 70 72 20 7b 45  /..%type expr {E
57a0: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
57b0: 72 20 65 78 70 72 20 7b 73 71 6c 69 74 65 33 45  r expr {sqlite3E
57c0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
57d0: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70  ->db, $$);}.%typ
57e0: 65 20 74 65 72 6d 20 7b 45 78 70 72 2a 7d 0a 25  e term {Expr*}.%
57f0: 64 65 73 74 72 75 63 74 6f 72 20 74 65 72 6d 20  destructor term 
5800: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
5810: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
5820: 24 29 3b 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a  $);}..expr(A) ::
5830: 3d 20 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20  = term(X).      
5840: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
5850: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42  expr(A) ::= LP(B
5860: 29 20 65 78 70 72 28 58 29 20 52 50 28 45 29 2e  ) expr(X) RP(E).
5870: 20 7b 41 20 3d 20 58 3b 20 73 71 6c 69 74 65 33   {A = X; sqlite3
5880: 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45  ExprSpan(A,&B,&E
5890: 29 3b 20 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d  ); }.term(A) ::=
58a0: 20 4e 55 4c 4c 28 58 29 2e 20 20 20 20 20 20 20   NULL(X).       
58b0: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
58c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
58d0: 40 58 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a  @X, 0, 0, &X);}.
58e0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58  expr(A) ::= ID(X
58f0: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
5900: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78   {A = sqlite3PEx
5910: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
5920: 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78  , 0, 0, &X);}.ex
5930: 70 72 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b  pr(A) ::= JOIN_K
5940: 57 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b  W(X).          {
5950: 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  A = sqlite3PExpr
5960: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20  (pParse, TK_ID, 
5970: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72  0, 0, &X);}.expr
5980: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f  (A) ::= nm(X) DO
5990: 54 20 6e 6d 28 59 29 2e 20 7b 0a 20 20 45 78 70  T nm(Y). {.  Exp
59a0: 72 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74  r *temp1 = sqlit
59b0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
59c0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29  TK_ID, 0, 0, &X)
59d0: 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20  ;.  Expr *temp2 
59e0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
59f0: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c  Parse, TK_ID, 0,
5a00: 20 30 2c 20 26 59 29 3b 0a 20 20 41 20 3d 20 73   0, &Y);.  A = s
5a10: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
5a20: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70  se, TK_DOT, temp
5a30: 31 2c 20 74 65 6d 70 32 2c 20 30 29 3b 0a 7d 0a  1, temp2, 0);.}.
5a40: 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28 58  expr(A) ::= nm(X
5a50: 29 20 44 4f 54 20 6e 6d 28 59 29 20 44 4f 54 20  ) DOT nm(Y) DOT 
5a60: 6e 6d 28 5a 29 2e 20 7b 0a 20 20 45 78 70 72 20  nm(Z). {.  Expr 
5a70: 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 33  *temp1 = sqlite3
5a80: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
5a90: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a  _ID, 0, 0, &X);.
5aa0: 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20    Expr *temp2 = 
5ab0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
5ac0: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
5ad0: 2c 20 26 59 29 3b 0a 20 20 45 78 70 72 20 2a 74  , &Y);.  Expr *t
5ae0: 65 6d 70 33 20 3d 20 73 71 6c 69 74 65 33 50 45  emp3 = sqlite3PE
5af0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
5b00: 44 2c 20 30 2c 20 30 2c 20 26 5a 29 3b 0a 20 20  D, 0, 0, &Z);.  
5b10: 45 78 70 72 20 2a 74 65 6d 70 34 20 3d 20 73 71  Expr *temp4 = sq
5b20: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
5b30: 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 32  e, TK_DOT, temp2
5b40: 2c 20 74 65 6d 70 33 2c 20 30 29 3b 0a 20 20 41  , temp3, 0);.  A
5b50: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
5b60: 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
5b70: 74 65 6d 70 31 2c 20 74 65 6d 70 34 2c 20 30 29  temp1, temp4, 0)
5b80: 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20  ;.}.term(A) ::= 
5b90: 49 4e 54 45 47 45 52 7c 46 4c 4f 41 54 7c 42 4c  INTEGER|FLOAT|BL
5ba0: 4f 42 28 58 29 2e 20 20 7b 41 20 3d 20 73 71 6c  OB(X).  {A = sql
5bb0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
5bc0: 2c 20 40 58 2c 20 30 2c 20 30 2c 20 26 58 29 3b  , @X, 0, 0, &X);
5bd0: 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 53 54  }.term(A) ::= ST
5be0: 52 49 4e 47 28 58 29 2e 20 20 20 20 20 20 20 7b  RING(X).       {
5bf0: 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  A = sqlite3PExpr
5c00: 28 70 50 61 72 73 65 2c 20 40 58 2c 20 30 2c 20  (pParse, @X, 0, 
5c10: 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  0, &X);}.expr(A)
5c20: 20 3a 3a 3d 20 52 45 47 49 53 54 45 52 28 58 29   ::= REGISTER(X)
5c30: 2e 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  .     {A = sqlit
5c40: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 70  e3RegisterExpr(p
5c50: 50 61 72 73 65 2c 20 26 58 29 3b 7d 0a 65 78 70  Parse, &X);}.exp
5c60: 72 28 41 29 20 3a 3a 3d 20 56 41 52 49 41 42 4c  r(A) ::= VARIABL
5c70: 45 28 58 29 2e 20 20 20 20 20 7b 0a 20 20 54 6f  E(X).     {.  To
5c80: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 58  ken *pToken = &X
5c90: 3b 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  ;.  Expr *pExpr 
5ca0: 3d 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78  = A = sqlite3PEx
5cb0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 56 41  pr(pParse, TK_VA
5cc0: 52 49 41 42 4c 45 2c 20 30 2c 20 30 2c 20 70 54  RIABLE, 0, 0, pT
5cd0: 6f 6b 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  oken);.  sqlite3
5ce0: 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d  ExprAssignVarNum
5cf0: 62 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70  ber(pParse, pExp
5d00: 72 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  r);.}.expr(A) ::
5d10: 3d 20 65 78 70 72 28 45 29 20 43 4f 4c 4c 41 54  = expr(E) COLLAT
5d20: 45 20 69 64 73 28 43 29 2e 20 7b 0a 20 20 41 20  E ids(C). {.  A 
5d30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74  = sqlite3ExprSet
5d40: 43 6f 6c 6c 28 70 50 61 72 73 65 2c 20 45 2c 20  Coll(pParse, E, 
5d50: 26 43 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53  &C);.}.%ifndef S
5d60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
5d70: 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53 54  expr(A) ::= CAST
5d80: 28 58 29 20 4c 50 20 65 78 70 72 28 45 29 20 41  (X) LP expr(E) A
5d90: 53 20 74 79 70 65 74 6f 6b 65 6e 28 54 29 20 52  S typetoken(T) R
5da0: 50 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  P(Y). {.  A = sq
5db0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
5dc0: 65 2c 20 54 4b 5f 43 41 53 54 2c 20 45 2c 20 30  e, TK_CAST, E, 0
5dd0: 2c 20 26 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  , &T);.  sqlite3
5de0: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26 59  ExprSpan(A,&X,&Y
5df0: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  );.}.%endif  SQL
5e00: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78  ITE_OMIT_CAST.ex
5e10: 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 20  pr(A) ::= ID(X) 
5e20: 4c 50 20 64 69 73 74 69 6e 63 74 28 44 29 20 65  LP distinct(D) e
5e30: 78 70 72 6c 69 73 74 28 59 29 20 52 50 28 45 29  xprlist(Y) RP(E)
5e40: 2e 20 7b 0a 20 20 69 66 28 20 59 20 26 26 20 59  . {.  if( Y && Y
5e50: 2d 3e 6e 45 78 70 72 3e 53 51 4c 49 54 45 5f 4d  ->nExpr>SQLITE_M
5e60: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
5e70: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
5e80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
5e90: 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e  too many argumen
5ea0: 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 25  ts on function %
5eb0: 54 22 2c 20 26 58 29 3b 0a 20 20 7d 0a 20 20 41  T", &X);.  }.  A
5ec0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75   = sqlite3ExprFu
5ed0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 59  nction(pParse, Y
5ee0: 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74 65 33  , &X);.  sqlite3
5ef0: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26 45  ExprSpan(A,&X,&E
5f00: 29 3b 0a 20 20 69 66 28 20 44 20 26 26 20 41 20  );.  if( D && A 
5f10: 29 7b 0a 20 20 20 20 41 2d 3e 66 6c 61 67 73 20  ){.    A->flags 
5f20: 7c 3d 20 45 50 5f 44 69 73 74 69 6e 63 74 3b 0a  |= EP_Distinct;.
5f30: 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a    }.}.expr(A) ::
5f40: 3d 20 49 44 28 58 29 20 4c 50 20 53 54 41 52 20  = ID(X) LP STAR 
5f50: 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  RP(E). {.  A = s
5f60: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
5f70: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 26 58  on(pParse, 0, &X
5f80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
5f90: 53 70 61 6e 28 41 2c 26 58 2c 26 45 29 3b 0a 7d  Span(A,&X,&E);.}
5fa0: 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 43 54 49  .term(A) ::= CTI
5fb0: 4d 45 5f 4b 57 28 4f 50 29 2e 20 7b 0a 20 20 2f  ME_KW(OP). {.  /
5fc0: 2a 20 54 68 65 20 43 55 52 52 45 4e 54 5f 54 49  * The CURRENT_TI
5fd0: 4d 45 2c 20 43 55 52 52 45 4e 54 5f 44 41 54 45  ME, CURRENT_DATE
5fe0: 2c 20 61 6e 64 20 43 55 52 52 45 4e 54 5f 54 49  , and CURRENT_TI
5ff0: 4d 45 53 54 41 4d 50 20 76 61 6c 75 65 73 20 61  MESTAMP values a
6000: 72 65 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20  re.  ** treated 
6010: 61 73 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  as functions tha
6020: 74 20 72 65 74 75 72 6e 20 63 6f 6e 73 74 61 6e  t return constan
6030: 74 73 20 2a 2f 0a 20 20 41 20 3d 20 73 71 6c 69  ts */.  A = sqli
6040: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
6050: 70 50 61 72 73 65 2c 20 30 2c 26 4f 50 29 3b 0a  pParse, 0,&OP);.
6060: 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41    if( A ){.    A
6070: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4e 53 54 5f  ->op = TK_CONST_
6080: 46 55 4e 43 3b 20 20 0a 20 20 20 20 41 2d 3e 73  FUNC;  .    A->s
6090: 70 61 6e 20 3d 20 4f 50 3b 0a 20 20 7d 0a 7d 0a  pan = OP;.  }.}.
60a0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
60b0: 28 58 29 20 41 4e 44 28 4f 50 29 20 65 78 70 72  (X) AND(OP) expr
60c0: 28 59 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20  (Y).       {A = 
60d0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
60e0: 72 73 65 2c 40 4f 50 2c 58 2c 59 2c 30 29 3b 7d  rse,@OP,X,Y,0);}
60f0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
6100: 72 28 58 29 20 4f 52 28 4f 50 29 20 65 78 70 72  r(X) OR(OP) expr
6110: 28 59 29 2e 20 20 20 20 20 20 20 20 7b 41 20 3d  (Y).        {A =
6120: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
6130: 61 72 73 65 2c 40 4f 50 2c 58 2c 59 2c 30 29 3b  arse,@OP,X,Y,0);
6140: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
6150: 70 72 28 58 29 20 4c 54 7c 47 54 7c 47 45 7c 4c  pr(X) LT|GT|GE|L
6160: 45 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20  E(OP) expr(Y).. 
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
61a0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
61b0: 73 65 2c 40 4f 50 2c 58 2c 59 2c 30 29 3b 7d 0a  se,@OP,X,Y,0);}.
61c0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
61d0: 28 58 29 20 45 51 7c 4e 45 28 4f 50 29 20 65 78  (X) EQ|NE(OP) ex
61e0: 70 72 28 59 29 2e 20 20 20 20 20 7b 41 20 3d 20  pr(Y).     {A = 
61f0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
6200: 72 73 65 2c 40 4f 50 2c 58 2c 59 2c 30 29 3b 7d  rse,@OP,X,Y,0);}
6210: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
6220: 72 28 58 29 20 42 49 54 41 4e 44 7c 42 49 54 4f  r(X) BITAND|BITO
6230: 52 7c 4c 53 48 49 46 54 7c 52 53 48 49 46 54 28  R|LSHIFT|RSHIFT(
6240: 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20 20 20  OP) expr(Y)..   
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6270: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
6280: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
6290: 2c 40 4f 50 2c 58 2c 59 2c 30 29 3b 7d 0a 65 78  ,@OP,X,Y,0);}.ex
62a0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
62b0: 29 20 50 4c 55 53 7c 4d 49 4e 55 53 28 4f 50 29  ) PLUS|MINUS(OP)
62c0: 20 65 78 70 72 28 59 29 2e 7b 41 20 3d 20 73 71   expr(Y).{A = sq
62d0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
62e0: 65 2c 40 4f 50 2c 58 2c 59 2c 30 29 3b 7d 0a 65  e,@OP,X,Y,0);}.e
62f0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
6300: 58 29 20 53 54 41 52 7c 53 4c 41 53 48 7c 52 45  X) STAR|SLASH|RE
6310: 4d 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20  M(OP) expr(Y).. 
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6340: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
6350: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
6360: 73 65 2c 40 4f 50 2c 58 2c 59 2c 30 29 3b 7d 0a  se,@OP,X,Y,0);}.
6370: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
6380: 28 58 29 20 43 4f 4e 43 41 54 28 4f 50 29 20 65  (X) CONCAT(OP) e
6390: 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20  xpr(Y).    {A = 
63a0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
63b0: 72 73 65 2c 40 4f 50 2c 58 2c 59 2c 30 29 3b 7d  rse,@OP,X,Y,0);}
63c0: 0a 25 74 79 70 65 20 6c 69 6b 65 6f 70 20 7b 73  .%type likeop {s
63d0: 74 72 75 63 74 20 4c 69 6b 65 4f 70 7d 0a 6c 69  truct LikeOp}.li
63e0: 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4c 49 4b 45  keop(A) ::= LIKE
63f0: 5f 4b 57 28 58 29 2e 20 20 20 20 20 7b 41 2e 65  _KW(X).     {A.e
6400: 4f 70 65 72 61 74 6f 72 20 3d 20 58 3b 20 41 2e  Operator = X; A.
6410: 6e 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b 65 6f 70  not = 0;}.likeop
6420: 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4c 49 4b 45  (A) ::= NOT LIKE
6430: 5f 4b 57 28 58 29 2e 20 7b 41 2e 65 4f 70 65 72  _KW(X). {A.eOper
6440: 61 74 6f 72 20 3d 20 58 3b 20 41 2e 6e 6f 74 20  ator = X; A.not 
6450: 3d 20 31 3b 7d 0a 6c 69 6b 65 6f 70 28 41 29 20  = 1;}.likeop(A) 
6460: 3a 3a 3d 20 4d 41 54 43 48 28 58 29 2e 20 20 20  ::= MATCH(X).   
6470: 20 20 20 20 7b 41 2e 65 4f 70 65 72 61 74 6f 72      {A.eOperator
6480: 20 3d 20 58 3b 20 41 2e 6e 6f 74 20 3d 20 30 3b   = X; A.not = 0;
6490: 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20  }.likeop(A) ::= 
64a0: 4e 4f 54 20 4d 41 54 43 48 28 58 29 2e 20 20 20  NOT MATCH(X).   
64b0: 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20 58  {A.eOperator = X
64c0: 3b 20 41 2e 6e 6f 74 20 3d 20 31 3b 7d 0a 25 74  ; A.not = 1;}.%t
64d0: 79 70 65 20 65 73 63 61 70 65 20 7b 45 78 70 72  ype escape {Expr
64e0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65  *}.%destructor e
64f0: 73 63 61 70 65 20 7b 73 71 6c 69 74 65 33 45 78  scape {sqlite3Ex
6500: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
6510: 3e 64 62 2c 20 24 24 29 3b 7d 0a 65 73 63 61 70  >db, $$);}.escap
6520: 65 28 58 29 20 3a 3a 3d 20 45 53 43 41 50 45 20  e(X) ::= ESCAPE 
6530: 65 78 70 72 28 41 29 2e 20 5b 45 53 43 41 50 45  expr(A). [ESCAPE
6540: 5d 20 7b 58 20 3d 20 41 3b 7d 0a 65 73 63 61 70  ] {X = A;}.escap
6550: 65 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  e(X) ::= .      
6560: 20 20 20 20 20 20 20 20 20 5b 45 53 43 41 50 45           [ESCAPE
6570: 5d 20 7b 58 20 3d 20 30 3b 7d 0a 65 78 70 72 28  ] {X = 0;}.expr(
6580: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 6c  A) ::= expr(X) l
6590: 69 6b 65 6f 70 28 4f 50 29 20 65 78 70 72 28 59  ikeop(OP) expr(Y
65a0: 29 20 65 73 63 61 70 65 28 45 29 2e 20 20 5b 4c  ) escape(E).  [L
65b0: 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20 20 45 78 70  IKE_KW]  {.  Exp
65c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  rList *pList;.  
65d0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
65e0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
65f0: 61 72 73 65 2c 30 2c 20 59 2c 20 30 29 3b 0a 20  arse,0, Y, 0);. 
6600: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
6610: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
6620: 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 58 2c 20  Parse,pList, X, 
6630: 30 29 3b 0a 20 20 69 66 28 20 45 20 29 7b 0a 20  0);.  if( E ){. 
6640: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
6650: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6660: 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 45  (pParse,pList, E
6670: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20  , 0);.  }.  A = 
6680: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
6690: 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ion(pParse, pLis
66a0: 74 2c 20 26 4f 50 2e 65 4f 70 65 72 61 74 6f 72  t, &OP.eOperator
66b0: 29 3b 0a 20 20 69 66 28 20 4f 50 2e 6e 6f 74 20  );.  if( OP.not 
66c0: 29 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78  ) A = sqlite3PEx
66d0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f  pr(pParse, TK_NO
66e0: 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73  T, A, 0, 0);.  s
66f0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
6700: 2c 20 26 58 2d 3e 73 70 61 6e 2c 20 26 59 2d 3e  , &X->span, &Y->
6710: 73 70 61 6e 29 3b 0a 20 20 69 66 28 20 41 20 29  span);.  if( A )
6720: 20 41 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   A->flags |= EP_
6730: 49 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a 0a 65 78  InfixFunc;.}..ex
6740: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
6750: 29 20 49 53 4e 55 4c 4c 7c 4e 4f 54 4e 55 4c 4c  ) ISNULL|NOTNULL
6760: 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (E). {.  A = sql
6770: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
6780: 2c 20 40 45 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  , @E, X, 0, 0);.
6790: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
67a0: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29  n(A,&X->span,&E)
67b0: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
67c0: 65 78 70 72 28 58 29 20 49 53 20 4e 55 4c 4c 28  expr(X) IS NULL(
67d0: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  E). {.  A = sqli
67e0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
67f0: 20 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 30   TK_ISNULL, X, 0
6800: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  , 0);.  sqlite3E
6810: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
6820: 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41  an,&E);.}.expr(A
6830: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f  ) ::= expr(X) NO
6840: 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41  T NULL(E). {.  A
6850: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
6860: 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 4e 55  pParse, TK_NOTNU
6870: 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  LL, X, 0, 0);.  
6880: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
6890: 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a  A,&X->span,&E);.
68a0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
68b0: 70 72 28 58 29 20 49 53 20 4e 4f 54 20 4e 55 4c  pr(X) IS NOT NUL
68c0: 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  L(E). {.  A = sq
68d0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
68e0: 65 2c 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58  e, TK_NOTNULL, X
68f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
6900: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  e3ExprSpan(A,&X-
6910: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70  >span,&E);.}.exp
6920: 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 28 42 29 20  r(A) ::= NOT(B) 
6930: 65 78 70 72 28 58 29 2e 20 7b 0a 20 20 41 20 3d  expr(X). {.  A =
6940: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
6950: 61 72 73 65 2c 20 40 42 2c 20 58 2c 20 30 2c 20  arse, @B, X, 0, 
6960: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  0);.  sqlite3Exp
6970: 72 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73  rSpan(A,&B,&X->s
6980: 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  pan);.}.expr(A) 
6990: 3a 3a 3d 20 42 49 54 4e 4f 54 28 42 29 20 65 78  ::= BITNOT(B) ex
69a0: 70 72 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(X). {.  A = s
69b0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
69c0: 73 65 2c 20 40 42 2c 20 58 2c 20 30 2c 20 30 29  se, @B, X, 0, 0)
69d0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
69e0: 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61  pan(A,&B,&X->spa
69f0: 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  n);.}.expr(A) ::
6a00: 3d 20 4d 49 4e 55 53 28 42 29 20 65 78 70 72 28  = MINUS(B) expr(
6a10: 58 29 2e 20 5b 55 4d 49 4e 55 53 5d 20 7b 0a 20  X). [UMINUS] {. 
6a20: 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70   A = sqlite3PExp
6a30: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 4d 49  r(pParse, TK_UMI
6a40: 4e 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20  NUS, X, 0, 0);. 
6a50: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
6a60: 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b  (A,&B,&X->span);
6a70: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 50  .}.expr(A) ::= P
6a80: 4c 55 53 28 42 29 20 65 78 70 72 28 58 29 2e 20  LUS(B) expr(X). 
6a90: 5b 55 50 4c 55 53 5d 20 7b 0a 20 20 41 20 3d 20  [UPLUS] {.  A = 
6aa0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
6ab0: 72 73 65 2c 20 54 4b 5f 55 50 4c 55 53 2c 20 58  rse, TK_UPLUS, X
6ac0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
6ad0: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c  e3ExprSpan(A,&B,
6ae0: 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 25 74 79  &X->span);.}.%ty
6af0: 70 65 20 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69  pe between_op {i
6b00: 6e 74 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41  nt}.between_op(A
6b10: 29 20 3a 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20  ) ::= BETWEEN.  
6b20: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77     {A = 0;}.betw
6b30: 65 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f  een_op(A) ::= NO
6b40: 54 20 42 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20  T BETWEEN. {A = 
6b50: 31 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  1;}.expr(A) ::= 
6b60: 65 78 70 72 28 57 29 20 62 65 74 77 65 65 6e 5f  expr(W) between_
6b70: 6f 70 28 4e 29 20 65 78 70 72 28 58 29 20 41 4e  op(N) expr(X) AN
6b80: 44 20 65 78 70 72 28 59 29 2e 20 5b 42 45 54 57  D expr(Y). [BETW
6b90: 45 45 4e 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73  EEN] {.  ExprLis
6ba0: 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  t *pList = sqlit
6bb0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6bc0: 28 70 50 61 72 73 65 2c 30 2c 20 58 2c 20 30 29  (pParse,0, X, 0)
6bd0: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
6be0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6bf0: 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20  d(pParse,pList, 
6c00: 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c  Y, 0);.  A = sql
6c10: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
6c20: 2c 20 54 4b 5f 42 45 54 57 45 45 4e 2c 20 57 2c  , TK_BETWEEN, W,
6c30: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20   0, 0);.  if( A 
6c40: 29 7b 0a 20 20 20 20 41 2d 3e 70 4c 69 73 74 20  ){.    A->pList 
6c50: 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 65 6c 73 65  = pList;.  }else
6c60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
6c70: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
6c80: 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
6c90: 20 20 7d 20 0a 20 20 69 66 28 20 4e 20 29 20 41    } .  if( N ) A
6ca0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
6cb0: 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20  pParse, TK_NOT, 
6cc0: 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  A, 0, 0);.  sqli
6cd0: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 57  te3ExprSpan(A,&W
6ce0: 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70 61 6e 29  ->span,&Y->span)
6cf0: 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.%ifndef SQLI
6d00: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
6d10: 0a 20 20 25 74 79 70 65 20 69 6e 5f 6f 70 20 7b  .  %type in_op {
6d20: 69 6e 74 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20  int}.  in_op(A) 
6d30: 3a 3a 3d 20 49 4e 2e 20 20 20 20 20 20 7b 41 20  ::= IN.      {A 
6d40: 3d 20 30 3b 7d 0a 20 20 69 6e 5f 6f 70 28 41 29  = 0;}.  in_op(A)
6d50: 20 3a 3a 3d 20 4e 4f 54 20 49 4e 2e 20 20 7b 41   ::= NOT IN.  {A
6d60: 20 3d 20 31 3b 7d 0a 20 20 65 78 70 72 28 41 29   = 1;}.  expr(A)
6d70: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f   ::= expr(X) in_
6d80: 6f 70 28 4e 29 20 4c 50 20 65 78 70 72 6c 69 73  op(N) LP exprlis
6d90: 74 28 59 29 20 52 50 28 45 29 2e 20 5b 49 4e 5d  t(Y) RP(E). [IN]
6da0: 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74   {.    A = sqlit
6db0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
6dc0: 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b  TK_IN, X, 0, 0);
6dd0: 0a 20 20 20 20 69 66 28 20 41 20 29 7b 0a 20 20  .    if( A ){.  
6de0: 20 20 20 20 41 2d 3e 70 4c 69 73 74 20 3d 20 59      A->pList = Y
6df0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
6e00: 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61  xprSetHeight(pPa
6e10: 72 73 65 2c 20 41 29 3b 0a 20 20 20 20 7d 65 6c  rse, A);.    }el
6e20: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
6e30: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
6e40: 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29 3b 0a  pParse->db, Y);.
6e50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 4e 20      }.    if( N 
6e60: 29 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78  ) A = sqlite3PEx
6e70: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f  pr(pParse, TK_NO
6e80: 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 20  T, A, 0, 0);.   
6e90: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
6ea0: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b  (A,&X->span,&E);
6eb0: 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a  .  }.  expr(A) :
6ec0: 3a 3d 20 4c 50 28 42 29 20 73 65 6c 65 63 74 28  := LP(B) select(
6ed0: 58 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 20 20  X) RP(E). {.    
6ee0: 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  A = sqlite3PExpr
6ef0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
6f00: 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
6f10: 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 20    if( A ){.     
6f20: 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20 58 3b   A->pSelect = X;
6f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
6f40: 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61 72  prSetHeight(pPar
6f50: 73 65 2c 20 41 29 3b 0a 20 20 20 20 7d 65 6c 73  se, A);.    }els
6f60: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
6f70: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61  SelectDelete(pPa
6f80: 72 73 65 2d 3e 64 62 2c 20 58 29 3b 0a 20 20 20  rse->db, X);.   
6f90: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
6fa0: 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b  prSpan(A,&B,&E);
6fb0: 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a  .  }.  expr(A) :
6fc0: 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70  := expr(X) in_op
6fd0: 28 4e 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29  (N) LP select(Y)
6fe0: 20 52 50 28 45 29 2e 20 20 5b 49 4e 5d 20 7b 0a   RP(E).  [IN] {.
6ff0: 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50      A = sqlite3P
7000: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
7010: 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  IN, X, 0, 0);.  
7020: 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 20    if( A ){.     
7030: 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20 59 3b   A->pSelect = Y;
7040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
7050: 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61 72  prSetHeight(pPar
7060: 73 65 2c 20 41 29 3b 0a 20 20 20 20 7d 65 6c 73  se, A);.    }els
7070: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
7080: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61  SelectDelete(pPa
7090: 72 73 65 2d 3e 64 62 2c 20 59 29 3b 0a 20 20 20  rse->db, Y);.   
70a0: 20 7d 0a 20 20 20 20 69 66 28 20 4e 20 29 20 41   }.    if( N ) A
70b0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
70c0: 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20  pParse, TK_NOT, 
70d0: 41 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  A, 0, 0);.    sq
70e0: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
70f0: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 20 20  &X->span,&E);.  
7100: 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.  expr(A) ::= 
7110: 65 78 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29  expr(X) in_op(N)
7120: 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 2e 20   nm(Y) dbnm(Z). 
7130: 5b 49 4e 5d 20 7b 0a 20 20 20 20 53 72 63 4c 69  [IN] {.    SrcLi
7140: 73 74 20 2a 70 53 72 63 20 3d 20 73 71 6c 69 74  st *pSrc = sqlit
7150: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
7160: 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 26 59  pParse->db, 0,&Y
7170: 2c 26 5a 29 3b 0a 20 20 20 20 41 20 3d 20 73 71  ,&Z);.    A = sq
7180: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
7190: 65 2c 20 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20  e, TK_IN, X, 0, 
71a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 41 20 29 7b  0);.    if( A ){
71b0: 0a 20 20 20 20 20 20 41 2d 3e 70 53 65 6c 65 63  .      A->pSelec
71c0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
71d0: 74 4e 65 77 28 70 50 61 72 73 65 2c 20 30 2c 70  tNew(pParse, 0,p
71e0: 53 72 63 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c  Src,0,0,0,0,0,0,
71f0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
7200: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28 70  3ExprSetHeight(p
7210: 50 61 72 73 65 2c 20 41 29 3b 0a 20 20 20 20 7d  Parse, A);.    }
7220: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
7230: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
7240: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 72  (pParse->db, pSr
7250: 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  c);.    }.    if
7260: 28 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65  ( N ) A = sqlite
7270: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7280: 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b  K_NOT, A, 0, 0);
7290: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
72a0: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
72b0: 5a 2e 7a 3f 26 5a 3a 26 59 29 3b 0a 20 20 7d 0a  Z.z?&Z:&Y);.  }.
72c0: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 45 58    expr(A) ::= EX
72d0: 49 53 54 53 28 42 29 20 4c 50 20 73 65 6c 65 63  ISTS(B) LP selec
72e0: 74 28 59 29 20 52 50 28 45 29 2e 20 7b 0a 20 20  t(Y) RP(E). {.  
72f0: 20 20 45 78 70 72 20 2a 70 20 3d 20 41 20 3d 20    Expr *p = A = 
7300: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7310: 72 73 65 2c 20 54 4b 5f 45 58 49 53 54 53 2c 20  rse, TK_EXISTS, 
7320: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
7330: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ( p ){.      p->
7340: 70 53 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 20  pSelect = Y;.   
7350: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70     sqlite3ExprSp
7360: 61 6e 28 70 2c 26 42 2c 26 45 29 3b 0a 20 20 20  an(p,&B,&E);.   
7370: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
7380: 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  tHeight(pParse, 
7390: 41 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  A);.    }else{. 
73a0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
73b0: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
73c0: 3e 64 62 2c 20 59 29 3b 0a 20 20 20 20 7d 0a 20  >db, Y);.    }. 
73d0: 20 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45   }.%endif SQLITE
73e0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a  _OMIT_SUBQUERY..
73f0: 2f 2a 20 43 41 53 45 20 65 78 70 72 65 73 73 69  /* CASE expressi
7400: 6f 6e 73 20 2a 2f 0a 65 78 70 72 28 41 29 20 3a  ons */.expr(A) :
7410: 3a 3d 20 43 41 53 45 28 43 29 20 63 61 73 65 5f  := CASE(C) case_
7420: 6f 70 65 72 61 6e 64 28 58 29 20 63 61 73 65 5f  operand(X) case_
7430: 65 78 70 72 6c 69 73 74 28 59 29 20 63 61 73 65  exprlist(Y) case
7440: 5f 65 6c 73 65 28 5a 29 20 45 4e 44 28 45 29 2e  _else(Z) END(E).
7450: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
7460: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
7470: 5f 43 41 53 45 2c 20 58 2c 20 5a 2c 20 30 29 3b  _CASE, X, Z, 0);
7480: 0a 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20  .  if( A ){.    
7490: 41 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20  A->pList = Y;.  
74a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
74b0: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 41  Height(pParse, A
74c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
74d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
74e0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
74f0: 2c 20 59 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , Y);.  }.  sqli
7500: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26  te3ExprSpan(A, &
7510: 43 2c 20 26 45 29 3b 0a 7d 0a 25 74 79 70 65 20  C, &E);.}.%type 
7520: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 45  case_exprlist {E
7530: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
7540: 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70 72 6c  uctor case_exprl
7550: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
7560: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
7570: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73  e->db, $$);}.cas
7580: 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a  e_exprlist(A) ::
7590: 3d 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28  = case_exprlist(
75a0: 58 29 20 57 48 45 4e 20 65 78 70 72 28 59 29 20  X) WHEN expr(Y) 
75b0: 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a  THEN expr(Z). {.
75c0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
75d0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
75e0: 73 65 2c 58 2c 20 59 2c 20 30 29 3b 0a 20 20 41  se,X, Y, 0);.  A
75f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
7600: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
7610: 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a 63 61 73 65  A, Z, 0);.}.case
7620: 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  _exprlist(A) ::=
7630: 20 57 48 45 4e 20 65 78 70 72 28 59 29 20 54 48   WHEN expr(Y) TH
7640: 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20 20  EN expr(Z). {.  
7650: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
7660: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
7670: 2c 30 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d  ,0, Y, 0);.  A =
7680: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
7690: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 41 2c  Append(pParse,A,
76a0: 20 5a 2c 20 30 29 3b 0a 7d 0a 25 74 79 70 65 20   Z, 0);.}.%type 
76b0: 63 61 73 65 5f 65 6c 73 65 20 7b 45 78 70 72 2a  case_else {Expr*
76c0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63 61  }.%destructor ca
76d0: 73 65 5f 65 6c 73 65 20 7b 73 71 6c 69 74 65 33  se_else {sqlite3
76e0: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
76f0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73  e->db, $$);}.cas
7700: 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45  e_else(A) ::=  E
7710: 4c 53 45 20 65 78 70 72 28 58 29 2e 20 20 20 20  LSE expr(X).    
7720: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 63 61       {A = X;}.ca
7730: 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20  se_else(A) ::=  
7740: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7750: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a        {A = 0;} .
7760: 25 74 79 70 65 20 63 61 73 65 5f 6f 70 65 72 61  %type case_opera
7770: 6e 64 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  nd {Expr*}.%dest
7780: 72 75 63 74 6f 72 20 63 61 73 65 5f 6f 70 65 72  ructor case_oper
7790: 61 6e 64 20 7b 73 71 6c 69 74 65 33 45 78 70 72  and {sqlite3Expr
77a0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
77b0: 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f 6f 70  b, $$);}.case_op
77c0: 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 65 78 70  erand(A) ::= exp
77d0: 72 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  r(X).           
77e0: 20 7b 41 20 3d 20 58 3b 7d 20 0a 63 61 73 65 5f   {A = X;} .case_
77f0: 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 2e  operand(A) ::= .
7800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7810: 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25 74     {A = 0;} ..%t
7820: 79 70 65 20 65 78 70 72 6c 69 73 74 20 7b 45 78  ype exprlist {Ex
7830: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
7840: 63 74 6f 72 20 65 78 70 72 6c 69 73 74 20 7b 73  ctor exprlist {s
7850: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7860: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7870: 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 6e 65 78   $$);}.%type nex
7880: 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  prlist {ExprList
7890: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6e  *}.%destructor n
78a0: 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65  exprlist {sqlite
78b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
78c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
78d0: 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a  }..exprlist(A) :
78e0: 3a 3d 20 6e 65 78 70 72 6c 69 73 74 28 58 29 2e  := nexprlist(X).
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72 6c 69 73  {A = X;}.exprlis
7910: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6e        {A = 0;}.n
7940: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20  exprlist(A) ::= 
7950: 6e 65 78 70 72 6c 69 73 74 28 58 29 20 43 4f 4d  nexprlist(X) COM
7960: 4d 41 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20  MA expr(Y)..    
7970: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
7980: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
7990: 65 2c 58 2c 59 2c 30 29 3b 7d 0a 6e 65 78 70 72  e,X,Y,0);}.nexpr
79a0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72  list(A) ::= expr
79b0: 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71  (Y)..    {A = sq
79c0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
79d0: 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 59 2c 30  end(pParse,0,Y,0
79e0: 29 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );}...//////////
79f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7a00: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 49  /// The CREATE I
7a10: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  NDEX command ///
7a20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7a30: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
7a40: 43 52 45 41 54 45 28 53 29 20 75 6e 69 71 75 65  CREATE(S) unique
7a50: 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20 69 66  flag(U) INDEX if
7a60: 6e 6f 74 65 78 69 73 74 73 28 4e 45 29 20 6e 6d  notexists(NE) nm
7a70: 28 58 29 20 64 62 6e 6d 28 44 29 0a 20 20 20 20  (X) dbnm(D).    
7a80: 20 20 20 20 4f 4e 20 6e 6d 28 59 29 20 4c 50 20      ON nm(Y) LP 
7a90: 69 64 78 6c 69 73 74 28 5a 29 20 52 50 28 45 29  idxlist(Z) RP(E)
7aa0: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 43 72 65  . {.  sqlite3Cre
7ab0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
7ac0: 20 26 58 2c 20 26 44 2c 20 0a 20 20 20 20 20 20   &X, &D, .      
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
7ae0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
7af0: 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30  end(pParse->db,0
7b00: 2c 26 59 2c 30 29 2c 20 5a 2c 20 55 2c 0a 20 20  ,&Y,0), Z, U,.  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 26 53 2c 20 26 45 2c 20 53 51 4c 49      &S, &E, SQLI
7b30: 54 45 5f 53 4f 5f 41 53 43 2c 20 4e 45 29 3b 0a  TE_SO_ASC, NE);.
7b40: 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71 75 65 66  }..%type uniquef
7b50: 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75 65  lag {int}.unique
7b60: 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49 51  flag(A) ::= UNIQ
7b70: 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f 41 62 6f  UE.  {A = OE_Abo
7b80: 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28  rt;}.uniqueflag(
7b90: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
7ba0: 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 7d 0a 0a  {A = OE_None;}..
7bb0: 25 74 79 70 65 20 69 64 78 6c 69 73 74 20 7b 45  %type idxlist {E
7bc0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
7bd0: 75 63 74 6f 72 20 69 64 78 6c 69 73 74 20 7b 73  uctor idxlist {s
7be0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
7bf0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
7c00: 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 69 64 78   $$);}.%type idx
7c10: 6c 69 73 74 5f 6f 70 74 20 7b 45 78 70 72 4c 69  list_opt {ExprLi
7c20: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
7c30: 20 69 64 78 6c 69 73 74 5f 6f 70 74 20 7b 73 71   idxlist_opt {sq
7c40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
7c50: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
7c60: 24 24 29 3b 7d 0a 0a 69 64 78 6c 69 73 74 5f 6f  $$);}..idxlist_o
7c70: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 64 78      {A = 0;}.idx
7ca0: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
7cb0: 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52 50  LP idxlist(X) RP
7cc0: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
7cd0: 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a  ;}.idxlist(A) ::
7ce0: 3d 20 69 64 78 6c 69 73 74 28 58 29 20 43 4f 4d  = idxlist(X) COM
7cf0: 4d 41 20 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65  MA nm(Y) collate
7d00: 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29  (C) sortorder(Z)
7d10: 2e 20 20 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  .  {.  Expr *p =
7d20: 20 30 3b 0a 20 20 69 66 28 20 43 2e 6e 3e 30 20   0;.  if( C.n>0 
7d30: 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
7d40: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
7d50: 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c  TK_COLUMN, 0, 0,
7d60: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
7d70: 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 50 61 72  ExprSetColl(pPar
7d80: 73 65 2c 20 70 2c 20 26 43 29 3b 0a 20 20 7d 0a  se, p, &C);.  }.
7d90: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
7da0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
7db0: 73 65 2c 58 2c 20 70 2c 20 26 59 29 3b 0a 20 20  se,X, p, &Y);.  
7dc0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
7dd0: 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73  heckLength(pPars
7de0: 65 2c 20 41 2c 20 22 69 6e 64 65 78 22 29 3b 0a  e, A, "index");.
7df0: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41    if( A ) A->a[A
7e00: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
7e10: 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a 69 64 78 6c  rder = Z;.}.idxl
7e20: 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59 29  ist(A) ::= nm(Y)
7e30: 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74   collate(C) sort
7e40: 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 45 78  order(Z). {.  Ex
7e50: 70 72 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66 28  pr *p = 0;.  if(
7e60: 20 43 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 70 20   C.n>0 ){.    p 
7e70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
7e80: 50 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e  Parse, TK_COLUMN
7e90: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
7ea0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
7eb0: 6c 6c 28 70 50 61 72 73 65 2c 20 70 2c 20 26 43  ll(pParse, p, &C
7ec0: 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c  );.  }.  A = sql
7ed0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
7ee0: 6e 64 28 70 50 61 72 73 65 2c 30 2c 20 70 2c 20  nd(pParse,0, p, 
7ef0: 26 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  &Y);.  sqlite3Ex
7f00: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
7f10: 68 28 70 50 61 72 73 65 2c 20 41 2c 20 22 69 6e  h(pParse, A, "in
7f20: 64 65 78 22 29 3b 0a 20 20 69 66 28 20 41 20 29  dex");.  if( A )
7f30: 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70 72 2d 31   A->a[A->nExpr-1
7f40: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a 3b  ].sortOrder = Z;
7f50: 0a 7d 0a 0a 25 74 79 70 65 20 63 6f 6c 6c 61 74  .}..%type collat
7f60: 65 20 7b 54 6f 6b 65 6e 7d 0a 63 6f 6c 6c 61 74  e {Token}.collat
7f70: 65 28 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  e(C) ::= .      
7f80: 20 20 20 20 20 20 20 20 20 20 7b 43 2e 7a 20 3d            {C.z =
7f90: 20 30 3b 20 43 2e 6e 20 3d 20 30 3b 7d 0a 63 6f   0; C.n = 0;}.co
7fa0: 6c 6c 61 74 65 28 43 29 20 3a 3a 3d 20 43 4f 4c  llate(C) ::= COL
7fb0: 4c 41 54 45 20 69 64 73 28 58 29 2e 20 20 20 7b  LATE ids(X).   {
7fc0: 43 20 3d 20 58 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f  C = X;}...//////
7fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7fe0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50  /////// The DROP
7ff0: 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f   INDEX command /
8000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8010: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
8020: 3a 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20 69  ::= DROP INDEX i
8030: 66 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e  fexists(E) fulln
8040: 61 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74  ame(X).   {sqlit
8050: 65 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72  e3DropIndex(pPar
8060: 73 65 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f  se, X, E);}..///
8070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56  ////////// The V
8090: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f  ACUUM command //
80a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
80b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25  ///////////.//.%
80c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
80d0: 49 54 5f 56 41 43 55 55 4d 0a 25 69 66 6e 64 65  IT_VACUUM.%ifnde
80e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54  f SQLITE_OMIT_AT
80f0: 54 41 43 48 0a 63 6d 64 20 3a 3a 3d 20 56 41 43  TACH.cmd ::= VAC
8100: 55 55 4d 2e 20 20 20 20 20 20 20 20 20 20 20 20  UUM.            
8110: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63 75      {sqlite3Vacu
8120: 75 6d 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64  um(pParse);}.cmd
8130: 20 3a 3a 3d 20 56 41 43 55 55 4d 20 6e 6d 2e 20   ::= VACUUM nm. 
8140: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
8150: 69 74 65 33 56 61 63 75 75 6d 28 70 50 61 72 73  ite3Vacuum(pPars
8160: 65 29 3b 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  e);}.%endif  SQL
8170: 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a  ITE_OMIT_ATTACH.
8180: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
8190: 4d 49 54 5f 56 41 43 55 55 4d 0a 0a 2f 2f 2f 2f  MIT_VACUUM..////
81a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 50 52  ///////// The PR
81c0: 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  AGMA command ///
81d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
81e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69  //////////.//.%i
81f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8200: 54 5f 50 41 52 53 45 52 0a 25 69 66 6e 64 65 66  T_PARSER.%ifndef
8210: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41   SQLITE_OMIT_PRA
8220: 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  GMA.cmd ::= PRAG
8230: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
8240: 20 45 51 20 6e 6d 6e 75 6d 28 59 29 2e 20 20 20   EQ nmnum(Y).   
8250: 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70  {sqlite3Pragma(p
8260: 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30  Parse,&X,&Z,&Y,0
8270: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  );}.cmd ::= PRAG
8280: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
8290: 20 45 51 20 4f 4e 28 59 29 2e 20 20 20 20 20 20   EQ ON(Y).      
82a0: 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70  {sqlite3Pragma(p
82b0: 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30  Parse,&X,&Z,&Y,0
82c0: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  );}.cmd ::= PRAG
82d0: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
82e0: 20 45 51 20 44 45 4c 45 54 45 28 59 29 2e 20 20   EQ DELETE(Y).  
82f0: 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70  {sqlite3Pragma(p
8300: 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30  Parse,&X,&Z,&Y,0
8310: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  );}.cmd ::= PRAG
8320: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
8330: 20 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29   EQ minus_num(Y)
8340: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 50 72 61  . {.  sqlite3Pra
8350: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
8360: 2c 26 59 2c 31 29 3b 0a 7d 0a 63 6d 64 20 3a 3a  ,&Y,1);.}.cmd ::
8370: 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64  = PRAGMA nm(X) d
8380: 62 6e 6d 28 5a 29 20 4c 50 20 6e 6d 6e 75 6d 28  bnm(Z) LP nmnum(
8390: 59 29 20 52 50 2e 20 7b 73 71 6c 69 74 65 33 50  Y) RP. {sqlite3P
83a0: 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c  ragma(pParse,&X,
83b0: 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a  &Z,&Y,0);}.cmd :
83c0: 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20  := PRAGMA nm(X) 
83d0: 64 62 6e 6d 28 5a 29 2e 20 20 20 20 20 20 20 20  dbnm(Z).        
83e0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61       {sqlite3Pra
83f0: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
8400: 2c 30 2c 30 29 3b 7d 0a 6e 6d 6e 75 6d 28 41 29  ,0,0);}.nmnum(A)
8410: 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d 28 58 29   ::= plus_num(X)
8420: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
8430: 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20   = X;}.nmnum(A) 
8440: 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20 20 20 20 20  ::= nm(X).      
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
8460: 3d 20 58 3b 7d 0a 25 65 6e 64 69 66 20 53 51 4c  = X;}.%endif SQL
8470: 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a  ITE_OMIT_PRAGMA.
8480: 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d  %endif SQLITE_OM
8490: 49 54 5f 50 41 52 53 45 52 0a 70 6c 75 73 5f 6e  IT_PARSER.plus_n
84a0: 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6f  um(A) ::= plus_o
84b0: 70 74 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20  pt number(X).   
84c0: 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75 73 5f 6e  {A = X;}.minus_n
84d0: 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 20  um(A) ::= MINUS 
84e0: 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20 7b  number(X).     {
84f0: 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72 28 41  A = X;}.number(A
8500: 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 7c 46 4c  ) ::= INTEGER|FL
8510: 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20 7b 41  OAT(X).       {A
8520: 20 3d 20 58 3b 7d 0a 70 6c 75 73 5f 6f 70 74 20   = X;}.plus_opt 
8530: 3a 3a 3d 20 50 4c 55 53 2e 0a 70 6c 75 73 5f 6f  ::= PLUS..plus_o
8540: 70 74 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f 2f 2f  pt ::= ...//////
8550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8560: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54  ////// The CREAT
8570: 45 20 54 52 49 47 47 45 52 20 63 6f 6d 6d 61 6e  E TRIGGER comman
8580: 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  d //////////////
8590: 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64 65 66  ///////..%ifndef
85a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
85b0: 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20 43 52  GGER..cmd ::= CR
85c0: 45 41 54 45 20 74 72 69 67 67 65 72 5f 64 65 63  EATE trigger_dec
85d0: 6c 28 41 29 20 42 45 47 49 4e 20 74 72 69 67 67  l(A) BEGIN trigg
85e0: 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53 29 20 45  er_cmd_list(S) E
85f0: 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f 6b 65 6e  ND(Z). {.  Token
8600: 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a 20 3d 20   all;.  all.z = 
8610: 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20 3d 20 28  A.z;.  all.n = (
8620: 5a 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a 2e 6e  Z.z - A.z) + Z.n
8630: 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6e 69 73  ;.  sqlite3Finis
8640: 68 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  hTrigger(pParse,
8650: 20 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a 0a 74 72   S, &all);.}..tr
8660: 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20 3a 3a  igger_decl(A) ::
8670: 3d 20 74 65 6d 70 28 54 29 20 54 52 49 47 47 45  = temp(T) TRIGGE
8680: 52 20 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 4f  R ifnotexists(NO
8690: 45 52 52 29 20 6e 6d 28 42 29 20 64 62 6e 6d 28  ERR) nm(B) dbnm(
86a0: 5a 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Z) .            
86b0: 20 20 20 20 20 20 20 20 74 72 69 67 67 65 72 5f          trigger_
86c0: 74 69 6d 65 28 43 29 20 74 72 69 67 67 65 72 5f  time(C) trigger_
86d0: 65 76 65 6e 74 28 44 29 0a 20 20 20 20 20 20 20  event(D).       
86e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20               ON 
86f0: 66 75 6c 6c 6e 61 6d 65 28 45 29 20 66 6f 72 65  fullname(E) fore
8700: 61 63 68 5f 63 6c 61 75 73 65 20 77 68 65 6e 5f  ach_clause when_
8710: 63 6c 61 75 73 65 28 47 29 2e 20 7b 0a 20 20 73  clause(G). {.  s
8720: 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69 67 67  qlite3BeginTrigg
8730: 65 72 28 70 50 61 72 73 65 2c 20 26 42 2c 20 26  er(pParse, &B, &
8740: 5a 2c 20 43 2c 20 44 2e 61 2c 20 44 2e 62 2c 20  Z, C, D.a, D.b, 
8750: 45 2c 20 47 2c 20 54 2c 20 4e 4f 45 52 52 29 3b  E, G, T, NOERR);
8760: 0a 20 20 41 20 3d 20 28 5a 2e 6e 3d 3d 30 3f 42  .  A = (Z.n==0?B
8770: 3a 5a 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 74 72  :Z);.}..%type tr
8780: 69 67 67 65 72 5f 74 69 6d 65 20 7b 69 6e 74 7d  igger_time {int}
8790: 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29  .trigger_time(A)
87a0: 20 3a 3a 3d 20 42 45 46 4f 52 45 2e 20 20 20 20   ::= BEFORE.    
87b0: 20 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46 4f 52    { A = TK_BEFOR
87c0: 45 3b 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d  E; }.trigger_tim
87d0: 65 28 41 29 20 3a 3a 3d 20 41 46 54 45 52 2e 20  e(A) ::= AFTER. 
87e0: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 41        { A = TK_A
87f0: 46 54 45 52 3b 20 20 7d 0a 74 72 69 67 67 65 72  FTER;  }.trigger
8800: 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 49 4e 53  _time(A) ::= INS
8810: 54 45 41 44 20 4f 46 2e 20 20 7b 20 41 20 3d 20  TEAD OF.  { A = 
8820: 54 4b 5f 49 4e 53 54 45 41 44 3b 7d 0a 74 72 69  TK_INSTEAD;}.tri
8830: 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d  gger_time(A) ::=
8840: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
8850: 41 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d  A = TK_BEFORE; }
8860: 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f  ..%type trigger_
8870: 65 76 65 6e 74 20 7b 73 74 72 75 63 74 20 54 72  event {struct Tr
8880: 69 67 45 76 65 6e 74 7d 0a 25 64 65 73 74 72 75  igEvent}.%destru
8890: 63 74 6f 72 20 74 72 69 67 67 65 72 5f 65 76 65  ctor trigger_eve
88a0: 6e 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73  nt {sqlite3IdLis
88b0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
88c0: 64 62 2c 20 24 24 2e 62 29 3b 7d 0a 74 72 69 67  db, $$.b);}.trig
88d0: 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d  ger_event(A) ::=
88e0: 20 44 45 4c 45 54 45 7c 49 4e 53 45 52 54 28 4f   DELETE|INSERT(O
88f0: 50 29 2e 20 20 20 20 20 20 20 7b 41 2e 61 20 3d  P).       {A.a =
8900: 20 40 4f 50 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a   @OP; A.b = 0;}.
8910: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29  trigger_event(A)
8920: 20 3a 3a 3d 20 55 50 44 41 54 45 28 4f 50 29 2e   ::= UPDATE(OP).
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
8940: 2e 61 20 3d 20 40 4f 50 3b 20 41 2e 62 20 3d 20  .a = @OP; A.b = 
8950: 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e  0;}.trigger_even
8960: 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45 20  t(A) ::= UPDATE 
8970: 4f 46 20 69 6e 73 63 6f 6c 6c 69 73 74 28 58 29  OF inscollist(X)
8980: 2e 20 7b 41 2e 61 20 3d 20 54 4b 5f 55 50 44 41  . {A.a = TK_UPDA
8990: 54 45 3b 20 41 2e 62 20 3d 20 58 3b 7d 0a 0a 66  TE; A.b = X;}..f
89a0: 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 20 3a 3a  oreach_clause ::
89b0: 3d 20 2e 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75  = ..foreach_clau
89c0: 73 65 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20  se ::= FOR EACH 
89d0: 52 4f 57 2e 0a 0a 25 74 79 70 65 20 77 68 65 6e  ROW...%type when
89e0: 5f 63 6c 61 75 73 65 20 7b 45 78 70 72 2a 7d 0a  _clause {Expr*}.
89f0: 25 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 6e  %destructor when
8a00: 5f 63 6c 61 75 73 65 20 7b 73 71 6c 69 74 65 33  _clause {sqlite3
8a10: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
8a20: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 77 68 65  e->db, $$);}.whe
8a30: 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20  n_clause(A) ::= 
8a40: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  .             { 
8a50: 41 20 3d 20 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c  A = 0; }.when_cl
8a60: 61 75 73 65 28 41 29 20 3a 3a 3d 20 57 48 45 4e  ause(A) ::= WHEN
8a70: 20 65 78 70 72 28 58 29 2e 20 7b 20 41 20 3d 20   expr(X). { A = 
8a80: 58 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67  X; }..%type trig
8a90: 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 54 72  ger_cmd_list {Tr
8aa0: 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65 73  iggerStep*}.%des
8ab0: 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72 5f  tructor trigger_
8ac0: 63 6d 64 5f 6c 69 73 74 20 7b 73 71 6c 69 74 65  cmd_list {sqlite
8ad0: 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74  3DeleteTriggerSt
8ae0: 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  ep(pParse->db, $
8af0: 24 29 3b 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64  $);}.trigger_cmd
8b00: 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72 69  _list(A) ::= tri
8b10: 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 59 29  gger_cmd_list(Y)
8b20: 20 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29 20   trigger_cmd(X) 
8b30: 53 45 4d 49 2e 20 7b 0a 2f 2a 0a 20 20 69 66 28  SEMI. {./*.  if(
8b40: 20 59 20 29 7b 0a 20 20 20 20 59 2d 3e 70 4c 61   Y ){.    Y->pLa
8b50: 73 74 2d 3e 70 4e 65 78 74 20 3d 20 58 3b 0a 20  st->pNext = X;. 
8b60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 59 20 3d 20   }else{.    Y = 
8b70: 58 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 61 73 73 65  X;.  }.*/.  asse
8b80: 72 74 28 20 59 21 3d 30 20 29 3b 0a 20 20 59 2d  rt( Y!=0 );.  Y-
8b90: 3e 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20  >pLast->pNext = 
8ba0: 58 3b 0a 20 20 59 2d 3e 70 4c 61 73 74 20 3d 20  X;.  Y->pLast = 
8bb0: 58 3b 0a 20 20 41 20 3d 20 59 3b 0a 7d 0a 74 72  X;.  A = Y;.}.tr
8bc0: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41  igger_cmd_list(A
8bd0: 29 20 3a 3a 3d 20 74 72 69 67 67 65 72 5f 63 6d  ) ::= trigger_cm
8be0: 64 28 58 29 20 53 45 4d 49 2e 20 7b 20 0a 20 20  d(X) SEMI. { .  
8bf0: 2f 2a 20 69 66 28 20 58 20 29 20 2a 2f 0a 20 20  /* if( X ) */.  
8c00: 61 73 73 65 72 74 28 20 58 21 3d 30 20 29 3b 0a  assert( X!=0 );.
8c10: 20 20 58 2d 3e 70 4c 61 73 74 20 3d 20 58 3b 0a    X->pLast = X;.
8c20: 20 20 41 20 3d 20 58 3b 0a 7d 0a 0a 25 74 79 70    A = X;.}..%typ
8c30: 65 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 54  e trigger_cmd {T
8c40: 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65  riggerStep*}.%de
8c50: 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72  structor trigger
8c60: 5f 63 6d 64 20 7b 73 71 6c 69 74 65 33 44 65 6c  _cmd {sqlite3Del
8c70: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 70  eteTriggerStep(p
8c80: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
8c90: 0a 2f 2f 20 55 50 44 41 54 45 20 0a 74 72 69 67  .// UPDATE .trig
8ca0: 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 55  ger_cmd(A) ::= U
8cb0: 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20  PDATE orconf(R) 
8cc0: 6e 6d 28 58 29 20 53 45 54 20 73 65 74 6c 69 73  nm(X) SET setlis
8cd0: 74 28 59 29 20 77 68 65 72 65 5f 6f 70 74 28 5a  t(Y) where_opt(Z
8ce0: 29 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  ).  .           
8cf0: 20 20 20 20 7b 20 41 20 3d 20 73 71 6c 69 74 65      { A = sqlite
8d00: 33 54 72 69 67 67 65 72 55 70 64 61 74 65 53 74  3TriggerUpdateSt
8d10: 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26  ep(pParse->db, &
8d20: 58 2c 20 59 2c 20 5a 2c 20 52 29 3b 20 7d 0a 0a  X, Y, Z, R); }..
8d30: 2f 2f 20 49 4e 53 45 52 54 0a 74 72 69 67 67 65  // INSERT.trigge
8d40: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 69 6e 73  r_cmd(A) ::= ins
8d50: 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20  ert_cmd(R) INTO 
8d60: 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74  nm(X) inscollist
8d70: 5f 6f 70 74 28 46 29 20 0a 20 20 20 20 20 20 20  _opt(F) .       
8d80: 20 20 20 20 20 20 20 20 20 20 20 20 56 41 4c 55              VALU
8d90: 45 53 20 4c 50 20 69 74 65 6d 6c 69 73 74 28 59  ES LP itemlist(Y
8da0: 29 20 52 50 2e 20 20 0a 20 20 20 20 20 20 20 20  ) RP.  .        
8db0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
8dc0: 74 65 33 54 72 69 67 67 65 72 49 6e 73 65 72 74  te3TriggerInsert
8dd0: 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  Step(pParse->db,
8de0: 20 26 58 2c 20 46 2c 20 59 2c 20 30 2c 20 52 29   &X, F, Y, 0, R)
8df0: 3b 7d 0a 0a 74 72 69 67 67 65 72 5f 63 6d 64 28  ;}..trigger_cmd(
8e00: 41 29 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d  A) ::= insert_cm
8e10: 64 28 52 29 20 49 4e 54 4f 20 6e 6d 28 58 29 20  d(R) INTO nm(X) 
8e20: 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46  inscollist_opt(F
8e30: 29 20 73 65 6c 65 63 74 28 53 29 2e 0a 20 20 20  ) select(S)..   
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
8e50: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 49   sqlite3TriggerI
8e60: 6e 73 65 72 74 53 74 65 70 28 70 50 61 72 73 65  nsertStep(pParse
8e70: 2d 3e 64 62 2c 20 26 58 2c 20 46 2c 20 30 2c 20  ->db, &X, F, 0, 
8e80: 53 2c 20 52 29 3b 7d 0a 0a 2f 2f 20 44 45 4c 45  S, R);}..// DELE
8e90: 54 45 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  TE.trigger_cmd(A
8ea0: 29 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f  ) ::= DELETE FRO
8eb0: 4d 20 6e 6d 28 58 29 20 77 68 65 72 65 5f 6f 70  M nm(X) where_op
8ec0: 74 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20  t(Y)..          
8ed0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
8ee0: 33 54 72 69 67 67 65 72 44 65 6c 65 74 65 53 74  3TriggerDeleteSt
8ef0: 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26  ep(pParse->db, &
8f00: 58 2c 20 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45  X, Y);}..// SELE
8f10: 43 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  CT.trigger_cmd(A
8f20: 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e  ) ::= select(X).
8f30: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72    {A = sqlite3Tr
8f40: 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28  iggerSelectStep(
8f50: 70 50 61 72 73 65 2d 3e 64 62 2c 20 58 29 3b 20  pParse->db, X); 
8f60: 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63 69 61  }..// The specia
8f70: 6c 20 52 41 49 53 45 20 65 78 70 72 65 73 73 69  l RAISE expressi
8f80: 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63 63 75  on that may occu
8f90: 72 20 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f  r in trigger pro
8fa0: 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20 3a 3a  grams.expr(A) ::
8fb0: 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 49 47  = RAISE(X) LP IG
8fc0: 4e 4f 52 45 20 52 50 28 59 29 2e 20 20 7b 0a 20  NORE RP(Y).  {. 
8fd0: 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70   A = sqlite3PExp
8fe0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 41 49  r(pParse, TK_RAI
8ff0: 53 45 2c 20 30 2c 20 30 2c 20 30 29 3b 20 0a 20  SE, 0, 0, 0); . 
9000: 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41 2d   if( A ){.    A-
9010: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 4f 45 5f 49 67  >iColumn = OE_Ig
9020: 6e 6f 72 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  nore;.    sqlite
9030: 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58 2c  3ExprSpan(A, &X,
9040: 20 26 59 29 3b 0a 20 20 7d 0a 7d 0a 65 78 70 72   &Y);.  }.}.expr
9050: 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 28 58 29  (A) ::= RAISE(X)
9060: 20 4c 50 20 72 61 69 73 65 74 79 70 65 28 54 29   LP raisetype(T)
9070: 20 43 4f 4d 4d 41 20 6e 6d 28 5a 29 20 52 50 28   COMMA nm(Z) RP(
9080: 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c  Y).  {.  A = sql
9090: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
90a0: 2c 20 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30  , TK_RAISE, 0, 0
90b0: 2c 20 26 5a 29 3b 20 0a 20 20 69 66 28 20 41 20  , &Z); .  if( A 
90c0: 29 20 7b 0a 20 20 20 20 41 2d 3e 69 43 6f 6c 75  ) {.    A->iColu
90d0: 6d 6e 20 3d 20 54 3b 0a 20 20 20 20 73 71 6c 69  mn = T;.    sqli
90e0: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26  te3ExprSpan(A, &
90f0: 58 2c 20 26 59 29 3b 0a 20 20 7d 0a 7d 0a 25 65  X, &Y);.  }.}.%e
9100: 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f 4d  ndif  !SQLITE_OM
9110: 49 54 5f 54 52 49 47 47 45 52 0a 0a 25 74 79 70  IT_TRIGGER..%typ
9120: 65 20 72 61 69 73 65 74 79 70 65 20 7b 69 6e 74  e raisetype {int
9130: 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a  }.raisetype(A) :
9140: 3a 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b 41  := ROLLBACK.  {A
9150: 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b 7d   = OE_Rollback;}
9160: 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a 3a  .raisetype(A) ::
9170: 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 7b 41 20  = ABORT.     {A 
9180: 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61 69  = OE_Abort;}.rai
9190: 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46 41  setype(A) ::= FA
91a0: 49 4c 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f 45  IL.      {A = OE
91b0: 5f 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f  _Fail;}...//////
91c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
91d0: 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45 52  //  DROP TRIGGER
91e0: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
91f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65  /////////.%ifnde
9210: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
9220: 49 47 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44 52  IGGER.cmd ::= DR
9230: 4f 50 20 54 52 49 47 47 45 52 20 69 66 65 78 69  OP TRIGGER ifexi
9240: 73 74 73 28 4e 4f 45 52 52 29 20 66 75 6c 6c 6e  sts(NOERR) fulln
9250: 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69  ame(X). {.  sqli
9260: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28 70  te3DropTrigger(p
9270: 50 61 72 73 65 2c 58 2c 4e 4f 45 52 52 29 3b 0a  Parse,X,NOERR);.
9280: 7d 0a 25 65 6e 64 69 66 20 20 21 53 51 4c 49 54  }.%endif  !SQLIT
9290: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a  E_OMIT_TRIGGER..
92a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
92b0: 2f 2f 2f 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 20  //////// ATTACH 
92c0: 44 41 54 41 42 41 53 45 20 66 69 6c 65 20 41 53  DATABASE file AS
92d0: 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   name //////////
92e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
92f0: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
9300: 4d 49 54 5f 41 54 54 41 43 48 0a 63 6d 64 20 3a  MIT_ATTACH.cmd :
9310: 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61 62 61  := ATTACH databa
9320: 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 46  se_kw_opt expr(F
9330: 29 20 41 53 20 65 78 70 72 28 44 29 20 6b 65 79  ) AS expr(D) key
9340: 5f 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71 6c  _opt(K). {.  sql
9350: 69 74 65 33 41 74 74 61 63 68 28 70 50 61 72 73  ite3Attach(pPars
9360: 65 2c 20 46 2c 20 44 2c 20 4b 29 3b 0a 7d 0a 63  e, F, D, K);.}.c
9370: 6d 64 20 3a 3a 3d 20 44 45 54 41 43 48 20 64 61  md ::= DETACH da
9380: 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78  tabase_kw_opt ex
9390: 70 72 28 44 29 2e 20 7b 0a 20 20 73 71 6c 69 74  pr(D). {.  sqlit
93a0: 65 33 44 65 74 61 63 68 28 70 50 61 72 73 65 2c  e3Detach(pParse,
93b0: 20 44 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 6b 65   D);.}..%type ke
93c0: 79 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64  y_opt {Expr*}.%d
93d0: 65 73 74 72 75 63 74 6f 72 20 6b 65 79 5f 6f 70  estructor key_op
93e0: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  t {sqlite3ExprDe
93f0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9400: 20 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70 74 28 41   $$);}.key_opt(A
9410: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
9420: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
9430: 3d 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41  = 0; }.key_opt(A
9440: 29 20 3a 3a 3d 20 4b 45 59 20 65 78 70 72 28 58  ) ::= KEY expr(X
9450: 29 2e 20 20 20 20 20 20 20 20 20 20 7b 20 41 20  ).          { A 
9460: 3d 20 58 3b 20 7d 0a 0a 64 61 74 61 62 61 73 65  = X; }..database
9470: 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 44 41 54 41  _kw_opt ::= DATA
9480: 42 41 53 45 2e 0a 64 61 74 61 62 61 73 65 5f 6b  BASE..database_k
9490: 77 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 25 65 6e 64  w_opt ::= ..%end
94a0: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  if SQLITE_OMIT_A
94b0: 54 54 41 43 48 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  TTACH../////////
94c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
94d0: 2f 20 52 45 49 4e 44 45 58 20 63 6f 6c 6c 61 74  / REINDEX collat
94e0: 69 6f 6e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ion ////////////
94f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9500: 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53  //////.%ifndef S
9510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
9520: 45 58 0a 63 6d 64 20 3a 3a 3d 20 52 45 49 4e 44  EX.cmd ::= REIND
9530: 45 58 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  EX.             
9540: 20 20 20 7b 73 71 6c 69 74 65 33 52 65 69 6e 64     {sqlite3Reind
9550: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  ex(pParse, 0, 0)
9560: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45 49 4e 44  ;}.cmd ::= REIND
9570: 45 58 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29  EX nm(X) dbnm(Y)
9580: 2e 20 20 7b 73 71 6c 69 74 65 33 52 65 69 6e 64  .  {sqlite3Reind
9590: 65 78 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26  ex(pParse, &X, &
95a0: 59 29 3b 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  Y);}.%endif  SQL
95b0: 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
95c0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
95d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
95e0: 2f 2f 2f 2f 2f 20 41 4e 41 4c 59 5a 45 20 2f 2f  ///// ANALYZE //
95f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9610: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
9620: 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 63 6d  _OMIT_ANALYZE.cm
9630: 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 2e 20 20  d ::= ANALYZE.  
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
9650: 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70 50  qlite3Analyze(pP
9660: 61 72 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63 6d  arse, 0, 0);}.cm
9670: 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 20 6e 6d  d ::= ANALYZE nm
9680: 28 58 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b 73  (X) dbnm(Y).  {s
9690: 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70 50  qlite3Analyze(pP
96a0: 61 72 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d 0a  arse, &X, &Y);}.
96b0: 25 65 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  %endif..////////
96c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
96d0: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 61 62   ALTER TABLE tab
96e0: 6c 65 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  le ... /////////
96f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9700: 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20  ///////.%ifndef 
9710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
9720: 52 54 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20 41  RTABLE.cmd ::= A
9730: 4c 54 45 52 20 54 41 42 4c 45 20 66 75 6c 6c 6e  LTER TABLE fulln
9740: 61 6d 65 28 58 29 20 52 45 4e 41 4d 45 20 54 4f  ame(X) RENAME TO
9750: 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 73 71 6c 69   nm(Z). {.  sqli
9760: 74 65 33 41 6c 74 65 72 52 65 6e 61 6d 65 54 61  te3AlterRenameTa
9770: 62 6c 65 28 70 50 61 72 73 65 2c 58 2c 26 5a 29  ble(pParse,X,&Z)
9780: 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4c 54 45  ;.}.cmd ::= ALTE
9790: 52 20 54 41 42 4c 45 20 61 64 64 5f 63 6f 6c 75  R TABLE add_colu
97a0: 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 41 44 44 20  mn_fullname ADD 
97b0: 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63 6f 6c  kwcolumn_opt col
97c0: 75 6d 6e 28 59 29 2e 20 7b 0a 20 20 73 71 6c 69  umn(Y). {.  sqli
97d0: 74 65 33 41 6c 74 65 72 46 69 6e 69 73 68 41 64  te3AlterFinishAd
97e0: 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  dColumn(pParse, 
97f0: 26 59 29 3b 0a 7d 0a 61 64 64 5f 63 6f 6c 75 6d  &Y);.}.add_colum
9800: 6e 5f 66 75 6c 6c 6e 61 6d 65 20 3a 3a 3d 20 66  n_fullname ::= f
9810: 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20  ullname(X). {.  
9820: 73 71 6c 69 74 65 33 41 6c 74 65 72 42 65 67 69  sqlite3AlterBegi
9830: 6e 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73  nAddColumn(pPars
9840: 65 2c 20 58 29 3b 0a 7d 0a 6b 77 63 6f 6c 75 6d  e, X);.}.kwcolum
9850: 6e 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 6b 77 63 6f  n_opt ::= ..kwco
9860: 6c 75 6d 6e 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4c  lumn_opt ::= COL
9870: 55 4d 4e 4b 57 2e 0a 25 65 6e 64 69 66 20 20 53  UMNKW..%endif  S
9880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
9890: 54 41 42 4c 45 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  TABLE../////////
98a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
98b0: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
98c0: 41 42 4c 45 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f  ABLE ... ///////
98d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
98e0: 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53  //////.%ifndef S
98f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9900: 41 4c 54 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20  ALTABLE.cmd ::= 
9910: 63 72 65 61 74 65 5f 76 74 61 62 2e 20 20 20 20  create_vtab.    
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 46     {sqlite3VtabF
9940: 69 6e 69 73 68 50 61 72 73 65 28 70 50 61 72 73  inishParse(pPars
9950: 65 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 63  e,0);}.cmd ::= c
9960: 72 65 61 74 65 5f 76 74 61 62 20 4c 50 20 76 74  reate_vtab LP vt
9970: 61 62 61 72 67 6c 69 73 74 20 52 50 28 58 29 2e  abarglist RP(X).
9980: 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 46 69    {sqlite3VtabFi
9990: 6e 69 73 68 50 61 72 73 65 28 70 50 61 72 73 65  nishParse(pParse
99a0: 2c 26 58 29 3b 7d 0a 63 72 65 61 74 65 5f 76 74  ,&X);}.create_vt
99b0: 61 62 20 3a 3a 3d 20 43 52 45 41 54 45 20 56 49  ab ::= CREATE VI
99c0: 52 54 55 41 4c 20 54 41 42 4c 45 20 6e 6d 28 58  RTUAL TABLE nm(X
99d0: 29 20 64 62 6e 6d 28 59 29 20 55 53 49 4e 47 20  ) dbnm(Y) USING 
99e0: 6e 6d 28 5a 29 2e 20 7b 0a 20 20 20 20 73 71 6c  nm(Z). {.    sql
99f0: 69 74 65 33 56 74 61 62 42 65 67 69 6e 50 61 72  ite3VtabBeginPar
9a00: 73 65 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26  se(pParse, &X, &
9a10: 59 2c 20 26 5a 29 3b 0a 7d 0a 76 74 61 62 61 72  Y, &Z);.}.vtabar
9a20: 67 6c 69 73 74 20 3a 3a 3d 20 76 74 61 62 61 72  glist ::= vtabar
9a30: 67 2e 0a 76 74 61 62 61 72 67 6c 69 73 74 20 3a  g..vtabarglist :
9a40: 3a 3d 20 76 74 61 62 61 72 67 6c 69 73 74 20 43  := vtabarglist C
9a50: 4f 4d 4d 41 20 76 74 61 62 61 72 67 2e 0a 76 74  OMMA vtabarg..vt
9a60: 61 62 61 72 67 20 3a 3a 3d 20 2e 20 20 20 20 20  abarg ::= .     
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72    {sqlite3VtabAr
9a90: 67 49 6e 69 74 28 70 50 61 72 73 65 29 3b 7d 0a  gInit(pParse);}.
9aa0: 76 74 61 62 61 72 67 20 3a 3a 3d 20 76 74 61 62  vtabarg ::= vtab
9ab0: 61 72 67 20 76 74 61 62 61 72 67 74 6f 6b 65 6e  arg vtabargtoken
9ac0: 2e 0a 76 74 61 62 61 72 67 74 6f 6b 65 6e 20 3a  ..vtabargtoken :
9ad0: 3a 3d 20 41 4e 59 28 58 29 2e 20 20 20 20 20 20  := ANY(X).      
9ae0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74        {sqlite3Vt
9af0: 61 62 41 72 67 45 78 74 65 6e 64 28 70 50 61 72  abArgExtend(pPar
9b00: 73 65 2c 26 58 29 3b 7d 0a 76 74 61 62 61 72 67  se,&X);}.vtabarg
9b10: 74 6f 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61 6e 79  token ::= lp any
9b20: 6c 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71  list RP(X).  {sq
9b30: 6c 69 74 65 33 56 74 61 62 41 72 67 45 78 74 65  lite3VtabArgExte
9b40: 6e 64 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a  nd(pParse,&X);}.
9b50: 6c 70 20 3a 3a 3d 20 4c 50 28 58 29 2e 20 20 20  lp ::= LP(X).   
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b70: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62      {sqlite3Vtab
9b80: 41 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65  ArgExtend(pParse
9b90: 2c 26 58 29 3b 7d 0a 61 6e 79 6c 69 73 74 20 3a  ,&X);}.anylist :
9ba0: 3a 3d 20 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d  := ..anylist ::=
9bb0: 20 61 6e 79 6c 69 73 74 20 41 4e 59 28 58 29 2e   anylist ANY(X).
9bc0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
9bd0: 33 56 74 61 62 41 72 67 45 78 74 65 6e 64 28 70  3VtabArgExtend(p
9be0: 50 61 72 73 65 2c 26 58 29 3b 7d 0a 25 65 6e 64  Parse,&X);}.%end
9bf0: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
9c00: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a           VIRTUALTABLE.