/ Hex Artifact Content
Login

Artifact ee1887ce0e6eea15cc728913ad3462898f88e9b0:


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 31 39 39 20 32 30 30 36 2f 30 33 2f 31 33 20  .199 2006/03/13 
0290: 31 32 3a 35 34 3a 31 30 20 64 72 68 20 45 78 70  12:54: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 69 66 28 20 70  _error {.  if( p
0450: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 3d 3d  Parse->zErrMsg==
0460: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 54 4f 4b  0 ){.    if( TOK
0470: 45 4e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20  EN.z[0] ){.     
0480: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
0490: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
04a0: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
04b0: 72 6f 72 22 2c 20 26 54 4f 4b 45 4e 29 3b 0a 20  ror", &TOKEN);. 
04c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
04d0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
04e0: 70 50 61 72 73 65 2c 20 22 69 6e 63 6f 6d 70 6c  pParse, "incompl
04f0: 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
0500: 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  t");.    }.  }.}
0510: 0a 25 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77  .%stack_overflow
0520: 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   {.  sqlite3Erro
0530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 70 61  rMsg(pParse, "pa
0540: 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66  rser stack overf
0550: 6c 6f 77 22 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65  low");.}..// The
0560: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 67 65 6e   name of the gen
0570: 65 72 61 74 65 64 20 70 72 6f 63 65 64 75 72 65  erated procedure
0580: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
0590: 20 74 68 65 20 70 61 72 73 65 72 0a 2f 2f 20 69   the parser.// i
05a0: 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 25 6e  s as follows:.%n
05b0: 61 6d 65 20 73 71 6c 69 74 65 33 50 61 72 73 65  ame sqlite3Parse
05c0: 72 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77  r..// The follow
05d0: 69 6e 67 20 74 65 78 74 20 69 73 20 69 6e 63 6c  ing text is incl
05e0: 75 64 65 64 20 6e 65 61 72 20 74 68 65 20 62 65  uded near the be
05f0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 43  ginning of the C
0600: 20 73 6f 75 72 63 65 0a 2f 2f 20 63 6f 64 65 20   source.// code 
0610: 66 69 6c 65 20 74 68 61 74 20 69 6d 70 6c 65 6d  file that implem
0620: 65 6e 74 73 20 74 68 65 20 70 61 72 73 65 72 2e  ents the parser.
0630: 0a 2f 2f 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 23  .//.%include {.#
0640: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0650: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0660: 70 61 72 73 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  parse.h"../*.** 
0670: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0680: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f  his structure ho
0690: 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lds information 
06a0: 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 4c 49 4d  about the.** LIM
06b0: 49 54 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  IT clause of a S
06c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
06d0: 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 69 6d 69 74  .*/.struct Limit
06e0: 56 61 6c 20 7b 0a 20 20 45 78 70 72 20 2a 70 4c  Val {.  Expr *pL
06f0: 69 6d 69 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  imit;    /* The 
0700: 4c 49 4d 49 54 20 65 78 70 72 65 73 73 69 6f 6e  LIMIT expression
0710: 2e 20 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  .  NULL if there
0720: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 2a 2f 0a   is no limit */.
0730: 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65 74 3b    Expr *pOffset;
0740: 20 20 20 2f 2a 20 54 68 65 20 4f 46 46 53 45 54     /* The OFFSET
0750: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4e 55   expression.  NU
0760: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
0770: 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  one */.};../*.**
0780: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
0790: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
07a0: 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20  s used to store 
07b0: 74 68 65 20 4c 49 4b 45 2c 0a 2a 2a 20 47 4c 4f  the LIKE,.** GLO
07c0: 42 2c 20 4e 4f 54 20 4c 49 4b 45 2c 20 61 6e 64  B, NOT LIKE, and
07d0: 20 4e 4f 54 20 47 4c 4f 42 20 6f 70 65 72 61 74   NOT GLOB operat
07e0: 6f 72 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c  ors..*/.struct L
07f0: 69 6b 65 4f 70 20 7b 0a 20 20 54 6f 6b 65 6e 20  ikeOp {.  Token 
0800: 65 4f 70 65 72 61 74 6f 72 3b 20 20 2f 2a 20 22  eOperator;  /* "
0810: 6c 69 6b 65 22 20 6f 72 20 22 67 6c 6f 62 22 20  like" or "glob" 
0820: 6f 72 20 22 72 65 67 65 78 70 22 20 2a 2f 0a 20  or "regexp" */. 
0830: 20 69 6e 74 20 6e 6f 74 3b 20 20 20 20 20 20 20   int not;       
0840: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
0850: 20 4e 4f 54 20 6b 65 79 77 6f 72 64 20 69 73 20   NOT keyword is 
0860: 70 72 65 73 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f  present */.};../
0870: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
0880: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
0890: 67 20 73 74 72 75 63 74 75 72 65 20 64 65 73 63  g structure desc
08a0: 72 69 62 65 73 20 74 68 65 20 65 76 65 6e 74 20  ribes the event 
08b0: 6f 66 20 61 0a 2a 2a 20 54 52 49 47 47 45 52 2e  of a.** TRIGGER.
08c0: 20 20 22 61 22 20 69 73 20 74 68 65 20 65 76 65    "a" is the eve
08d0: 6e 74 20 74 79 70 65 2c 20 6f 6e 65 20 6f 66 20  nt type, one of 
08e0: 54 4b 5f 55 50 44 41 54 45 2c 20 54 4b 5f 49 4e  TK_UPDATE, TK_IN
08f0: 53 45 52 54 2c 0a 2a 2a 20 54 4b 5f 44 45 4c 45  SERT,.** TK_DELE
0900: 54 45 2c 20 6f 72 20 54 4b 5f 49 4e 53 54 45 41  TE, or TK_INSTEA
0910: 44 2e 20 20 49 66 20 74 68 65 20 65 76 65 6e 74  D.  If the event
0920: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a   is of the form.
0930: 2a 2a 0a 2a 2a 20 20 20 20 20 20 55 50 44 41 54  **.**      UPDAT
0940: 45 20 4f 4e 20 28 61 2c 62 2c 63 29 0a 2a 2a 0a  E ON (a,b,c).**.
0950: 2a 2a 20 54 68 65 6e 20 74 68 65 20 22 62 22 20  ** Then the "b" 
0960: 49 64 4c 69 73 74 20 72 65 63 6f 72 64 73 20 74  IdList records t
0970: 68 65 20 6c 69 73 74 20 22 61 2c 62 2c 63 22 2e  he list "a,b,c".
0980: 0a 2a 2f 0a 73 74 72 75 63 74 20 54 72 69 67 45  .*/.struct TrigE
0990: 76 65 6e 74 20 7b 20 69 6e 74 20 61 3b 20 49 64  vent { int a; Id
09a0: 4c 69 73 74 20 2a 20 62 3b 20 7d 3b 0a 0a 2f 2a  List * b; };../*
09b0: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
09c0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
09d0: 65 20 68 6f 6c 64 73 20 74 68 65 20 41 54 54 41  e holds the ATTA
09e0: 43 48 20 6b 65 79 20 61 6e 64 20 74 68 65 20 6b  CH key and the k
09f0: 65 79 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 72 75  ey type..*/.stru
0a00: 63 74 20 41 74 74 61 63 68 4b 65 79 20 7b 20 69  ct AttachKey { i
0a10: 6e 74 20 74 79 70 65 3b 20 20 54 6f 6b 65 6e 20  nt type;  Token 
0a20: 6b 65 79 3b 20 7d 3b 0a 0a 7d 20 2f 2f 20 65 6e  key; };..} // en
0a30: 64 20 25 69 6e 63 6c 75 64 65 0a 0a 2f 2f 20 49  d %include..// I
0a40: 6e 70 75 74 20 69 73 20 61 20 73 69 6e 67 6c 65  nput is a single
0a50: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 0a 69 6e 70   SQL command.inp
0a60: 75 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74 2e 0a  ut ::= cmdlist..
0a70: 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 63 6d 64 6c  cmdlist ::= cmdl
0a80: 69 73 74 20 65 63 6d 64 2e 0a 63 6d 64 6c 69 73  ist ecmd..cmdlis
0a90: 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a 63 6d 64 78  t ::= ecmd..cmdx
0aa0: 20 3a 3a 3d 20 63 6d 64 2e 20 20 20 20 20 20 20   ::= cmd.       
0ab0: 20 20 20 20 7b 20 73 71 6c 69 74 65 33 46 69 6e      { sqlite3Fin
0ac0: 69 73 68 43 6f 64 69 6e 67 28 70 50 61 72 73 65  ishCoding(pParse
0ad0: 29 3b 20 7d 0a 65 63 6d 64 20 3a 3a 3d 20 53 45  ); }.ecmd ::= SE
0ae0: 4d 49 2e 0a 65 63 6d 64 20 3a 3a 3d 20 65 78 70  MI..ecmd ::= exp
0af0: 6c 61 69 6e 20 63 6d 64 78 20 53 45 4d 49 2e 0a  lain cmdx SEMI..
0b00: 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 2e 20 20 20  explain ::= .   
0b10: 20 20 20 20 20 20 20 20 7b 20 73 71 6c 69 74 65          { sqlite
0b20: 33 42 65 67 69 6e 50 61 72 73 65 28 70 50 61 72  3BeginParse(pPar
0b30: 73 65 2c 20 30 29 3b 20 7d 0a 25 69 66 6e 64 65  se, 0); }.%ifnde
0b40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
0b50: 50 4c 41 49 4e 0a 65 78 70 6c 61 69 6e 20 3a 3a  PLAIN.explain ::
0b60: 3d 20 45 58 50 4c 41 49 4e 2e 20 20 20 20 20 20  = EXPLAIN.      
0b70: 20 20 20 20 20 20 20 20 7b 20 73 71 6c 69 74 65          { sqlite
0b80: 33 42 65 67 69 6e 50 61 72 73 65 28 70 50 61 72  3BeginParse(pPar
0b90: 73 65 2c 20 31 29 3b 20 7d 0a 65 78 70 6c 61 69  se, 1); }.explai
0ba0: 6e 20 3a 3a 3d 20 45 58 50 4c 41 49 4e 20 51 55  n ::= EXPLAIN QU
0bb0: 45 52 59 20 50 4c 41 4e 2e 20 20 20 7b 20 73 71  ERY PLAN.   { sq
0bc0: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0bd0: 70 50 61 72 73 65 2c 20 32 29 3b 20 7d 0a 25 65  pParse, 2); }.%e
0be0: 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ndif..//////////
0bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69  /////////// Begi
0c00: 6e 20 61 6e 64 20 65 6e 64 20 74 72 61 6e 73 61  n and end transa
0c10: 63 74 69 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f  ctions. ////////
0c20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0c30: 2f 2f 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d  ////.//..cmd ::=
0c40: 20 42 45 47 49 4e 20 74 72 61 6e 73 74 79 70 65   BEGIN transtype
0c50: 28 59 29 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20  (Y) trans_opt.  
0c60: 7b 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61  {sqlite3BeginTra
0c70: 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  nsaction(pParse,
0c80: 20 59 29 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74 20   Y);}.trans_opt 
0c90: 3a 3a 3d 20 2e 0a 74 72 61 6e 73 5f 6f 70 74 20  ::= ..trans_opt 
0ca0: 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e 2e  ::= TRANSACTION.
0cb0: 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54  .trans_opt ::= T
0cc0: 52 41 4e 53 41 43 54 49 4f 4e 20 6e 6d 2e 0a 25  RANSACTION nm..%
0cd0: 74 79 70 65 20 74 72 61 6e 73 74 79 70 65 20 7b  type transtype {
0ce0: 69 6e 74 7d 0a 74 72 61 6e 73 74 79 70 65 28 41  int}.transtype(A
0cf0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
0d00: 20 20 20 20 7b 41 20 3d 20 54 4b 5f 44 45 46 45      {A = TK_DEFE
0d10: 52 52 45 44 3b 7d 0a 74 72 61 6e 73 74 79 70 65  RRED;}.transtype
0d20: 28 41 29 20 3a 3a 3d 20 44 45 46 45 52 52 45 44  (A) ::= DEFERRED
0d30: 28 58 29 2e 20 20 7b 41 20 3d 20 40 58 3b 7d 0a  (X).  {A = @X;}.
0d40: 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d  transtype(A) ::=
0d50: 20 49 4d 4d 45 44 49 41 54 45 28 58 29 2e 20 7b   IMMEDIATE(X). {
0d60: 41 20 3d 20 40 58 3b 7d 0a 74 72 61 6e 73 74 79  A = @X;}.transty
0d70: 70 65 28 41 29 20 3a 3a 3d 20 45 58 43 4c 55 53  pe(A) ::= EXCLUS
0d80: 49 56 45 28 58 29 2e 20 7b 41 20 3d 20 40 58 3b  IVE(X). {A = @X;
0d90: 7d 0a 63 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54  }.cmd ::= COMMIT
0da0: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20   trans_opt.     
0db0: 20 7b 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54   {sqlite3CommitT
0dc0: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73  ransaction(pPars
0dd0: 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 45 4e 44  e);}.cmd ::= END
0de0: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20   trans_opt.     
0df0: 20 20 20 20 7b 73 71 6c 69 74 65 33 43 6f 6d 6d      {sqlite3Comm
0e00: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  itTransaction(pP
0e10: 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  arse);}.cmd ::= 
0e20: 52 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73 5f 6f  ROLLBACK trans_o
0e30: 70 74 2e 20 20 20 20 7b 73 71 6c 69 74 65 33 52  pt.    {sqlite3R
0e40: 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
0e50: 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a 0a 2f 2f  on(pParse);}..//
0e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0e70: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 54  /// The CREATE T
0e80: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2f  ABLE statement /
0e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ea0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
0eb0: 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61  md ::= create_ta
0ec0: 62 6c 65 20 63 72 65 61 74 65 5f 74 61 62 6c 65  ble create_table
0ed0: 5f 61 72 67 73 2e 0a 63 72 65 61 74 65 5f 74 61  _args..create_ta
0ee0: 62 6c 65 20 3a 3a 3d 20 43 52 45 41 54 45 20 74  ble ::= CREATE t
0ef0: 65 6d 70 28 54 29 20 54 41 42 4c 45 20 69 66 6e  emp(T) TABLE ifn
0f00: 6f 74 65 78 69 73 74 73 28 45 29 20 6e 6d 28 59  otexists(E) nm(Y
0f10: 29 20 64 62 6e 6d 28 5a 29 2e 20 7b 0a 20 20 20  ) dbnm(Z). {.   
0f20: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
0f30: 65 28 70 50 61 72 73 65 2c 26 59 2c 26 5a 2c 54  e(pParse,&Y,&Z,T
0f40: 2c 30 2c 45 29 3b 0a 7d 0a 25 74 79 70 65 20 69  ,0,E);.}.%type i
0f50: 66 6e 6f 74 65 78 69 73 74 73 20 7b 69 6e 74 7d  fnotexists {int}
0f60: 0a 69 66 6e 6f 74 65 78 69 73 74 73 28 41 29 20  .ifnotexists(A) 
0f70: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
0f80: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 66 6e 6f     {A = 0;}.ifno
0f90: 74 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 49  texists(A) ::= I
0fa0: 46 20 4e 4f 54 20 45 58 49 53 54 53 2e 20 7b 41  F NOT EXISTS. {A
0fb0: 20 3d 20 31 3b 7d 0a 25 74 79 70 65 20 74 65 6d   = 1;}.%type tem
0fc0: 70 20 7b 69 6e 74 7d 0a 25 69 66 6e 64 65 66 20  p {int}.%ifndef 
0fd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
0fe0: 44 42 0a 74 65 6d 70 28 41 29 20 3a 3a 3d 20 54  DB.temp(A) ::= T
0ff0: 45 4d 50 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a 25  EMP.  {A = 1;}.%
1000: 65 6e 64 69 66 0a 74 65 6d 70 28 41 29 20 3a 3a  endif.temp(A) ::
1010: 3d 20 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b  = .      {A = 0;
1020: 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61  }.create_table_a
1030: 72 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d  rgs ::= LP colum
1040: 6e 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74 5f 6f  nlist conslist_o
1050: 70 74 28 58 29 20 52 50 28 59 29 2e 20 7b 0a 20  pt(X) RP(Y). {. 
1060: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
1070: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29  (pParse,&X,&Y,0)
1080: 3b 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65  ;.}.create_table
1090: 5f 61 72 67 73 20 3a 3a 3d 20 41 53 20 73 65 6c  _args ::= AS sel
10a0: 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69  ect(S). {.  sqli
10b0: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
10c0: 73 65 2c 30 2c 30 2c 53 29 3b 0a 20 20 73 71 6c  se,0,0,S);.  sql
10d0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
10e0: 28 53 29 3b 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69 73  (S);.}.columnlis
10f0: 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73 74  t ::= columnlist
1100: 20 43 4f 4d 4d 41 20 63 6f 6c 75 6d 6e 2e 0a 63   COMMA column..c
1110: 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f  olumnlist ::= co
1120: 6c 75 6d 6e 2e 0a 0a 2f 2f 20 41 20 22 63 6f 6c  lumn...// A "col
1130: 75 6d 6e 22 20 69 73 20 61 20 63 6f 6d 70 6c 65  umn" is a comple
1140: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  te description o
1150: 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
1160: 6e 20 69 6e 20 61 0a 2f 2f 20 43 52 45 41 54 45  n in a.// CREATE
1170: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1180: 2e 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73  .  This includes
1190: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
11a0: 2c 20 69 74 73 0a 2f 2f 20 64 61 74 61 74 79 70  , its.// datatyp
11b0: 65 2c 20 61 6e 64 20 6f 74 68 65 72 20 6b 65 79  e, and other key
11c0: 77 6f 72 64 73 20 73 75 63 68 20 61 73 20 50 52  words such as PR
11d0: 49 4d 41 52 59 20 4b 45 59 2c 20 55 4e 49 51 55  IMARY KEY, UNIQU
11e0: 45 2c 20 52 45 46 45 52 45 4e 43 45 53 2c 0a 2f  E, REFERENCES,./
11f0: 2f 20 4e 4f 54 20 4e 55 4c 4c 20 61 6e 64 20 73  / NOT NULL and s
1200: 6f 20 66 6f 72 74 68 2e 0a 2f 2f 0a 63 6f 6c 75  o forth..//.colu
1210: 6d 6e 28 41 29 20 3a 3a 3d 20 63 6f 6c 75 6d 6e  mn(A) ::= column
1220: 69 64 28 58 29 20 74 79 70 65 20 63 61 72 67 6c  id(X) type cargl
1230: 69 73 74 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58  ist. {.  A.z = X
1240: 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20 28 70 50 61  .z;.  A.n = (pPa
1250: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1260: 7a 2d 58 2e 7a 29 20 2b 20 70 50 61 72 73 65 2d  z-X.z) + pParse-
1270: 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 7d  >sLastToken.n;.}
1280: 0a 63 6f 6c 75 6d 6e 69 64 28 41 29 20 3a 3a 3d  .columnid(A) ::=
1290: 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69   nm(X). {.  sqli
12a0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61  te3AddColumn(pPa
12b0: 72 73 65 2c 26 58 29 3b 0a 20 20 41 20 3d 20 58  rse,&X);.  A = X
12c0: 3b 0a 7d 0a 0a 0a 2f 2f 20 41 6e 20 49 44 45 4e  ;.}...// An IDEN
12d0: 54 49 46 49 45 52 20 63 61 6e 20 62 65 20 61 20  TIFIER can be a 
12e0: 67 65 6e 65 72 69 63 20 69 64 65 6e 74 69 66 69  generic identifi
12f0: 65 72 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 73 65  er, or one of se
1300: 76 65 72 61 6c 0a 2f 2f 20 6b 65 79 77 6f 72 64  veral.// keyword
1310: 73 2e 20 20 41 6e 79 20 6e 6f 6e 2d 73 74 61 6e  s.  Any non-stan
1320: 64 61 72 64 20 6b 65 79 77 6f 72 64 20 63 61 6e  dard keyword can
1330: 20 61 6c 73 6f 20 62 65 20 61 6e 20 69 64 65 6e   also be an iden
1340: 74 69 66 69 65 72 2e 0a 2f 2f 0a 25 74 79 70 65  tifier..//.%type
1350: 20 69 64 20 7b 54 6f 6b 65 6e 7d 0a 69 64 28 41   id {Token}.id(A
1360: 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20 20 20  ) ::= ID(X).    
1370: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f       {A = X;}../
1380: 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  / The following 
1390: 64 69 72 65 63 74 69 76 65 20 63 61 75 73 65 73  directive causes
13a0: 20 74 6f 6b 65 6e 73 20 41 42 4f 52 54 2c 20 41   tokens ABORT, A
13b0: 46 54 45 52 2c 20 41 53 43 2c 20 65 74 63 2e 20  FTER, ASC, etc. 
13c0: 74 6f 0a 2f 2f 20 66 61 6c 6c 62 61 63 6b 20 74  to.// fallback t
13d0: 6f 20 49 44 20 69 66 20 74 68 65 79 20 77 69 6c  o ID if they wil
13e0: 6c 20 6e 6f 74 20 70 61 72 73 65 20 61 73 20 74  l not parse as t
13f0: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 76 61  heir original va
1400: 6c 75 65 2e 0a 2f 2f 20 54 68 69 73 20 6f 62 76  lue..// This obv
1410: 69 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 66  iates the need f
1420: 6f 72 20 74 68 65 20 22 69 64 22 20 6e 6f 6e 74  or the "id" nont
1430: 65 72 6d 69 6e 61 6c 2e 0a 2f 2f 0a 25 66 61 6c  erminal..//.%fal
1440: 6c 62 61 63 6b 20 49 44 0a 20 20 41 42 4f 52 54  lback ID.  ABORT
1450: 20 41 46 54 45 52 20 41 4e 41 4c 59 5a 45 20 41   AFTER ANALYZE A
1460: 53 43 20 41 54 54 41 43 48 20 42 45 46 4f 52 45  SC ATTACH BEFORE
1470: 20 42 45 47 49 4e 20 43 41 53 43 41 44 45 20 43   BEGIN CASCADE C
1480: 41 53 54 20 43 4f 4e 46 4c 49 43 54 0a 20 20 44  AST CONFLICT.  D
1490: 41 54 41 42 41 53 45 20 44 45 46 45 52 52 45 44  ATABASE DEFERRED
14a0: 20 44 45 53 43 20 44 45 54 41 43 48 20 45 41 43   DESC DETACH EAC
14b0: 48 20 45 4e 44 20 45 58 43 4c 55 53 49 56 45 20  H END EXCLUSIVE 
14c0: 45 58 50 4c 41 49 4e 20 46 41 49 4c 20 46 4f 52  EXPLAIN FAIL FOR
14d0: 0a 20 20 49 47 4e 4f 52 45 20 49 4d 4d 45 44 49  .  IGNORE IMMEDI
14e0: 41 54 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4e  ATE INITIALLY IN
14f0: 53 54 45 41 44 20 4c 49 4b 45 5f 4b 57 20 4d 41  STEAD LIKE_KW MA
1500: 54 43 48 20 50 4c 41 4e 20 51 55 45 52 59 20 4b  TCH PLAN QUERY K
1510: 45 59 0a 20 20 4f 46 20 4f 46 46 53 45 54 20 50  EY.  OF OFFSET P
1520: 52 41 47 4d 41 20 52 41 49 53 45 20 52 45 50 4c  RAGMA RAISE REPL
1530: 41 43 45 20 52 45 53 54 52 49 43 54 20 52 4f 57  ACE RESTRICT ROW
1540: 20 53 54 41 54 45 4d 45 4e 54 0a 20 20 54 45 4d   STATEMENT.  TEM
1550: 50 20 54 52 49 47 47 45 52 20 56 41 43 55 55 4d  P TRIGGER VACUUM
1560: 20 56 49 45 57 0a 25 69 66 64 65 66 20 53 51 4c   VIEW.%ifdef SQL
1570: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
1580: 44 5f 53 45 4c 45 43 54 0a 20 20 45 58 43 45 50  D_SELECT.  EXCEP
1590: 54 20 49 4e 54 45 52 53 45 43 54 20 55 4e 49 4f  T INTERSECT UNIO
15a0: 4e 0a 25 65 6e 64 69 66 0a 20 20 52 45 49 4e 44  N.%endif.  REIND
15b0: 45 58 20 52 45 4e 41 4d 45 20 43 54 49 4d 45 5f  EX RENAME CTIME_
15c0: 4b 57 20 49 46 0a 20 20 2e 0a 0a 2f 2f 20 44 65  KW IF.  ...// De
15d0: 66 69 6e 65 20 6f 70 65 72 61 74 6f 72 20 70 72  fine operator pr
15e0: 65 63 65 64 65 6e 63 65 20 65 61 72 6c 79 20 73  ecedence early s
15f0: 6f 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74  o that this is t
1600: 68 65 20 66 69 72 73 74 20 6f 63 63 75 72 61 6e  he first occuran
1610: 63 65 0a 2f 2f 20 6f 66 20 74 68 65 20 6f 70 65  ce.// of the ope
1620: 72 61 74 6f 72 20 74 6f 6b 65 6e 73 20 69 6e 20  rator tokens in 
1630: 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 4b 65  the grammer.  Ke
1640: 65 70 69 6e 67 20 74 68 65 20 6f 70 65 72 61 74  eping the operat
1650: 6f 72 73 20 74 6f 67 65 74 68 65 72 0a 2f 2f 20  ors together.// 
1660: 63 61 75 73 65 73 20 74 68 65 6d 20 74 6f 20 62  causes them to b
1670: 65 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65 67  e assigned integ
1680: 65 72 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  er values that a
1690: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
16a0: 72 2c 0a 2f 2f 20 77 68 69 63 68 20 6b 65 65 70  r,.// which keep
16b0: 73 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20  s parser tables 
16c0: 73 6d 61 6c 6c 65 72 2e 0a 2f 2f 0a 2f 2f 20 54  smaller..//.// T
16d0: 68 65 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  he token values 
16e0: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 73  assigned to thes
16f0: 65 20 73 79 6d 62 6f 6c 73 20 69 73 20 64 65 74  e symbols is det
1700: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
1710: 72 64 65 72 0a 2f 2f 20 69 6e 20 77 68 69 63 68  rder.// in which
1720: 20 6c 65 6d 6f 6e 20 66 69 72 73 74 20 73 65 65   lemon first see
1730: 73 20 74 68 65 6d 2e 20 20 49 74 20 6d 75 73 74  s them.  It must
1740: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1750: 74 20 49 53 4e 55 4c 4c 2f 4e 4f 54 4e 55 4c 4c  t ISNULL/NOTNULL
1760: 2c 0a 2f 2f 20 4e 45 2f 45 51 2c 20 47 54 2f 4c  ,.// NE/EQ, GT/L
1770: 45 2c 20 61 6e 64 20 47 45 2f 4c 54 20 61 72 65  E, and GE/LT are
1780: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 6f 6e   separated by on
1790: 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75  ly a single valu
17a0: 65 2e 20 20 53 65 65 0a 2f 2f 20 74 68 65 20 73  e.  See.// the s
17b0: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
17c0: 65 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  e() routine for 
17d0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
17e0: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 69 73 0a 2f  mation on this./
17f0: 2f 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2f 2f  / constraint..//
1800: 0a 25 6c 65 66 74 20 4f 52 2e 0a 25 6c 65 66 74  .%left OR..%left
1810: 20 41 4e 44 2e 0a 25 72 69 67 68 74 20 4e 4f 54   AND..%right NOT
1820: 2e 0a 25 6c 65 66 74 20 49 53 20 4c 49 4b 45 5f  ..%left IS LIKE_
1830: 4b 57 20 42 45 54 57 45 45 4e 20 49 4e 20 49 53  KW BETWEEN IN IS
1840: 4e 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 4e 45 20  NULL NOTNULL NE 
1850: 45 51 2e 0a 25 6c 65 66 74 20 47 54 20 4c 45 20  EQ..%left GT LE 
1860: 4c 54 20 47 45 2e 0a 25 72 69 67 68 74 20 45 53  LT GE..%right ES
1870: 43 41 50 45 2e 0a 25 6c 65 66 74 20 42 49 54 41  CAPE..%left BITA
1880: 4e 44 20 42 49 54 4f 52 20 4c 53 48 49 46 54 20  ND BITOR LSHIFT 
1890: 52 53 48 49 46 54 2e 0a 25 6c 65 66 74 20 50 4c  RSHIFT..%left PL
18a0: 55 53 20 4d 49 4e 55 53 2e 0a 25 6c 65 66 74 20  US MINUS..%left 
18b0: 53 54 41 52 20 53 4c 41 53 48 20 52 45 4d 2e 0a  STAR SLASH REM..
18c0: 25 6c 65 66 74 20 43 4f 4e 43 41 54 2e 0a 25 72  %left CONCAT..%r
18d0: 69 67 68 74 20 55 4d 49 4e 55 53 20 55 50 4c 55  ight UMINUS UPLU
18e0: 53 20 42 49 54 4e 4f 54 2e 0a 0a 2f 2f 20 41 6e  S BITNOT...// An
18f0: 64 20 22 69 64 73 22 20 69 73 20 61 6e 20 69 64  d "ids" is an id
1900: 65 6e 74 69 66 65 72 2d 6f 72 2d 73 74 72 69 6e  entifer-or-strin
1910: 67 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64 73 20  g..//.%type ids 
1920: 7b 54 6f 6b 65 6e 7d 0a 69 64 73 28 41 29 20 3a  {Token}.ids(A) :
1930: 3a 3d 20 49 44 7c 53 54 52 49 4e 47 28 58 29 2e  := ID|STRING(X).
1940: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20     {A = X;}..// 
1950: 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  The name of a co
1960: 6c 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20 63 61  lumn or table ca
1970: 6e 20 62 65 20 61 6e 79 20 6f 66 20 74 68 65 20  n be any of the 
1980: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a 25 74  following:.//.%t
1990: 79 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e  ype nm {Token}.n
19a0: 6d 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20  m(A) ::= ID(X). 
19b0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
19c0: 0a 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e  .nm(A) ::= STRIN
19d0: 47 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58  G(X).     {A = X
19e0: 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a 4f 49  ;}.nm(A) ::= JOI
19f0: 4e 5f 4b 57 28 58 29 2e 20 20 20 20 7b 41 20 3d  N_KW(X).    {A =
1a00: 20 58 3b 7d 0a 0a 2f 2f 20 41 20 74 79 70 65 74   X;}..// A typet
1a10: 6f 6b 65 6e 20 69 73 20 72 65 61 6c 6c 79 20 6f  oken is really o
1a20: 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e  ne or more token
1a30: 73 20 74 68 61 74 20 66 6f 72 6d 20 61 20 74 79  s that form a ty
1a40: 70 65 20 6e 61 6d 65 20 73 75 63 68 0a 2f 2f 20  pe name such.// 
1a50: 61 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  as can be found 
1a60: 61 66 74 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e  after the column
1a70: 20 6e 61 6d 65 20 69 6e 20 61 20 43 52 45 41 54   name in a CREAT
1a80: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1a90: 74 2e 0a 2f 2f 20 4d 75 6c 74 69 70 6c 65 20 74  t..// Multiple t
1aa0: 6f 6b 65 6e 73 20 61 72 65 20 63 6f 6e 63 61 74  okens are concat
1ab0: 65 6e 61 74 65 64 20 74 6f 20 66 6f 72 6d 20 74  enated to form t
1ac0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1ad0: 74 79 70 65 74 6f 6b 65 6e 2e 0a 2f 2f 0a 25 74  typetoken..//.%t
1ae0: 79 70 65 20 74 79 70 65 74 6f 6b 65 6e 20 7b 54  ype typetoken {T
1af0: 6f 6b 65 6e 7d 0a 74 79 70 65 20 3a 3a 3d 20 2e  oken}.type ::= .
1b00: 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 74 6f  .type ::= typeto
1b10: 6b 65 6e 28 58 29 2e 20 20 20 20 20 20 20 20 20  ken(X).         
1b20: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
1b30: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
1b40: 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 74 79 70  pParse,&X);}.typ
1b50: 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79  etoken(A) ::= ty
1b60: 70 65 6e 61 6d 65 28 58 29 2e 20 20 20 7b 41 20  pename(X).   {A 
1b70: 3d 20 58 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e 28  = X;}.typetoken(
1b80: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
1b90: 58 29 20 4c 50 20 73 69 67 6e 65 64 20 52 50 28  X) LP signed RP(
1ba0: 59 29 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e  Y). {.  A.z = X.
1bb0: 7a 3b 0a 20 20 41 2e 6e 20 3d 20 26 59 2e 7a 5b  z;.  A.n = &Y.z[
1bc0: 59 2e 6e 5d 20 2d 20 58 2e 7a 3b 0a 7d 0a 74 79  Y.n] - X.z;.}.ty
1bd0: 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74  petoken(A) ::= t
1be0: 79 70 65 6e 61 6d 65 28 58 29 20 4c 50 20 73 69  ypename(X) LP si
1bf0: 67 6e 65 64 20 43 4f 4d 4d 41 20 73 69 67 6e 65  gned COMMA signe
1c00: 64 20 52 50 28 59 29 2e 20 7b 0a 20 20 41 2e 7a  d RP(Y). {.  A.z
1c10: 20 3d 20 58 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20   = X.z;.  A.n = 
1c20: 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 58 2e 7a 3b  &Y.z[Y.n] - X.z;
1c30: 0a 7d 0a 25 74 79 70 65 20 74 79 70 65 6e 61 6d  .}.%type typenam
1c40: 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61  e {Token}.typena
1c50: 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73 28 58 29  me(A) ::= ids(X)
1c60: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
1c70: 20 3d 20 58 3b 7d 0a 74 79 70 65 6e 61 6d 65 28   = X;}.typename(
1c80: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
1c90: 58 29 20 69 64 73 28 59 29 2e 20 7b 41 2e 7a 3d  X) ids(Y). {A.z=
1ca0: 58 2e 7a 3b 20 41 2e 6e 3d 59 2e 6e 2b 28 59 2e  X.z; A.n=Y.n+(Y.
1cb0: 7a 2d 58 2e 7a 29 3b 7d 0a 25 74 79 70 65 20 73  z-X.z);}.%type s
1cc0: 69 67 6e 65 64 20 7b 69 6e 74 7d 0a 73 69 67 6e  igned {int}.sign
1cd0: 65 64 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6e  ed(A) ::= plus_n
1ce0: 75 6d 28 58 29 2e 20 20 20 20 7b 20 41 20 3d 20  um(X).    { A = 
1cf0: 61 74 6f 69 28 28 63 68 61 72 2a 29 58 2e 7a 29  atoi((char*)X.z)
1d00: 3b 20 7d 0a 73 69 67 6e 65 64 28 41 29 20 3a 3a  ; }.signed(A) ::
1d10: 3d 20 6d 69 6e 75 73 5f 6e 75 6d 28 58 29 2e 20  = minus_num(X). 
1d20: 20 20 7b 20 41 20 3d 20 2d 61 74 6f 69 28 28 63    { A = -atoi((c
1d30: 68 61 72 2a 29 58 2e 7a 29 3b 20 7d 0a 0a 2f 2f  har*)X.z); }..//
1d40: 20 22 63 61 72 67 6c 69 73 74 22 20 69 73 20 61   "carglist" is a
1d50: 20 6c 69 73 74 20 6f 66 20 61 64 64 69 74 69 6f   list of additio
1d60: 6e 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  nal constraints 
1d70: 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
1d80: 74 68 65 0a 2f 2f 20 63 6f 6c 75 6d 6e 20 6e 61  the.// column na
1d90: 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 79  me and column ty
1da0: 70 65 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  pe in a CREATE T
1db0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
1dc0: 2f 2f 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20  //.carglist ::= 
1dd0: 63 61 72 67 6c 69 73 74 20 63 61 72 67 2e 0a 63  carglist carg..c
1de0: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 2e 0a 63 61  arglist ::= ..ca
1df0: 72 67 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e  rg ::= CONSTRAIN
1e00: 54 20 6e 6d 20 63 63 6f 6e 73 2e 0a 63 61 72 67  T nm ccons..carg
1e10: 20 3a 3a 3d 20 63 63 6f 6e 73 2e 0a 63 61 72 67   ::= ccons..carg
1e20: 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 74 65 72   ::= DEFAULT ter
1e30: 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  m(X).           
1e40: 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66 61   {sqlite3AddDefa
1e50: 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  ultValue(pParse,
1e60: 58 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45  X);}.carg ::= DE
1e70: 46 41 55 4c 54 20 4c 50 20 65 78 70 72 28 58 29  FAULT LP expr(X)
1e80: 20 52 50 2e 20 20 20 20 20 20 7b 73 71 6c 69 74   RP.      {sqlit
1e90: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
1ea0: 65 28 70 50 61 72 73 65 2c 58 29 3b 7d 0a 63 61  e(pParse,X);}.ca
1eb0: 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50  rg ::= DEFAULT P
1ec0: 4c 55 53 20 74 65 72 6d 28 58 29 2e 20 20 20 20  LUS term(X).    
1ed0: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65     {sqlite3AddDe
1ee0: 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73  faultValue(pPars
1ef0: 65 2c 58 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20  e,X);}.carg ::= 
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 45 78 70 72 28 54 4b 5f 55 4d 49 4e 55 53 2c  3Expr(TK_UMINUS,
1f40: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   X, 0, 0);.  sql
1f50: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
1f60: 6c 75 65 28 70 50 61 72 73 65 2c 70 29 3b 0a 7d  lue(pParse,p);.}
1f70: 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c  .carg ::= DEFAUL
1f80: 54 20 69 64 28 58 29 2e 20 20 20 20 20 20 20 20  T id(X).        
1f90: 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72 20 2a        {.  Expr *
1fa0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  p = sqlite3Expr(
1fb0: 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c  TK_STRING, 0, 0,
1fc0: 20 26 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 41   &X);.  sqlite3A
1fd0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70  ddDefaultValue(p
1fe0: 50 61 72 73 65 2c 70 29 3b 0a 7d 0a 0a 2f 2f 20  Parse,p);.}..// 
1ff0: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74  In addition to t
2000: 68 65 20 74 79 70 65 20 6e 61 6d 65 2c 20 77 65  he type name, we
2010: 20 61 6c 73 6f 20 63 61 72 65 20 61 62 6f 75 74   also care about
2020: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
2030: 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 55 45 20 63   and.// UNIQUE c
2040: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2f 2f 0a 63  onstraints..//.c
2050: 63 6f 6e 73 20 3a 3a 3d 20 4e 55 4c 4c 20 6f 6e  cons ::= NULL on
2060: 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20  conf..ccons ::= 
2070: 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 28  NOT NULL onconf(
2080: 52 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  R).             
2090: 20 20 7b 73 71 6c 69 74 65 33 41 64 64 4e 6f 74    {sqlite3AddNot
20a0: 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 52 29 3b  Null(pParse, R);
20b0: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d  }.ccons ::= PRIM
20c0: 41 52 59 20 4b 45 59 20 73 6f 72 74 6f 72 64 65  ARY KEY sortorde
20d0: 72 28 5a 29 20 6f 6e 63 6f 6e 66 28 52 29 20 61  r(Z) onconf(R) a
20e0: 75 74 6f 69 6e 63 28 49 29 2e 0a 20 20 20 20 20  utoinc(I)..     
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 7b 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61  {sqlite3AddPrima
2120: 72 79 4b 65 79 28 70 50 61 72 73 65 2c 30 2c 52  ryKey(pParse,0,R
2130: 2c 49 2c 5a 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  ,I,Z);}.ccons ::
2140: 3d 20 55 4e 49 51 55 45 20 6f 6e 63 6f 6e 66 28  = UNIQUE onconf(
2150: 52 29 2e 20 20 20 20 7b 73 71 6c 69 74 65 33 43  R).    {sqlite3C
2160: 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73  reateIndex(pPars
2170: 65 2c 30 2c 30 2c 30 2c 30 2c 52 2c 30 2c 30 2c  e,0,0,0,0,R,0,0,
2180: 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d  0,0);}.ccons ::=
2190: 20 43 48 45 43 4b 20 4c 50 20 65 78 70 72 28 58   CHECK LP expr(X
21a0: 29 20 52 50 2e 20 20 20 20 20 20 20 7b 73 71 6c  ) RP.       {sql
21b0: 69 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73  ite3AddCheckCons
21c0: 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 58 29  traint(pParse,X)
21d0: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 52 45 46  ;}.ccons ::= REF
21e0: 45 52 45 4e 43 45 53 20 6e 6d 28 54 29 20 69 64  ERENCES nm(T) id
21f0: 78 6c 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65  xlist_opt(TA) re
2200: 66 61 72 67 73 28 52 29 2e 0a 20 20 20 20 20 20  fargs(R)..      
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
2230: 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
2240: 65 79 28 70 50 61 72 73 65 2c 30 2c 26 54 2c 54  ey(pParse,0,&T,T
2250: 41 2c 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d  A,R);}.ccons ::=
2260: 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65   defer_subclause
2270: 28 44 29 2e 20 20 20 7b 73 71 6c 69 74 65 33 44  (D).   {sqlite3D
2280: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 70  eferForeignKey(p
2290: 50 61 72 73 65 2c 44 29 3b 7d 0a 63 63 6f 6e 73  Parse,D);}.ccons
22a0: 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20 69 64 28   ::= COLLATE id(
22b0: 43 29 2e 20 20 7b 73 71 6c 69 74 65 33 41 64 64  C).  {sqlite3Add
22c0: 43 6f 6c 6c 61 74 65 54 79 70 65 28 70 50 61 72  CollateType(pPar
22d0: 73 65 2c 20 28 63 68 61 72 2a 29 43 2e 7a 2c 20  se, (char*)C.z, 
22e0: 43 2e 6e 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6f  C.n);}..// The o
22f0: 70 74 69 6f 6e 61 6c 20 41 55 54 4f 49 4e 43 52  ptional AUTOINCR
2300: 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 0a 25 74  EMENT keyword.%t
2310: 79 70 65 20 61 75 74 6f 69 6e 63 20 7b 69 6e 74  ype autoinc {int
2320: 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d  }.autoinc(X) ::=
2330: 20 2e 20 20 20 20 20 20 20 20 20 20 7b 58 20 3d   .          {X =
2340: 20 30 3b 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20   0;}.autoinc(X) 
2350: 3a 3a 3d 20 41 55 54 4f 49 4e 43 52 2e 20 20 7b  ::= AUTOINCR.  {
2360: 58 20 3d 20 31 3b 7d 0a 0a 2f 2f 20 54 68 65 20  X = 1;}..// The 
2370: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 75  next group of ru
2380: 6c 65 73 20 70 61 72 73 65 73 20 74 68 65 20 61  les parses the a
2390: 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 52 45  rguments to a RE
23a0: 46 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65 0a  FERENCES clause.
23b0: 2f 2f 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  // that determin
23c0: 65 20 69 66 20 74 68 65 20 72 65 66 65 72 65 6e  e if the referen
23d0: 74 69 61 6c 20 69 6e 74 65 67 72 69 74 79 20 63  tial integrity c
23e0: 68 65 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72  hecking is defer
23f0: 72 65 64 20 6f 72 0a 2f 2f 20 6f 72 20 69 6d 6d  red or.// or imm
2400: 65 64 69 61 74 65 20 61 6e 64 20 77 68 69 63 68  ediate and which
2410: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20   determine what 
2420: 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69  action to take i
2430: 66 20 61 20 72 65 66 2d 69 6e 74 65 67 0a 2f 2f  f a ref-integ.//
2440: 20 63 68 65 63 6b 20 66 61 69 6c 73 2e 0a 2f 2f   check fails..//
2450: 0a 25 74 79 70 65 20 72 65 66 61 72 67 73 20 7b  .%type refargs {
2460: 69 6e 74 7d 0a 72 65 66 61 72 67 73 28 41 29 20  int}.refargs(A) 
2470: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
2480: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
2490: 4f 45 5f 52 65 73 74 72 69 63 74 20 2a 20 30 78  OE_Restrict * 0x
24a0: 30 31 30 31 30 31 3b 20 7d 0a 72 65 66 61 72 67  010101; }.refarg
24b0: 73 28 41 29 20 3a 3a 3d 20 72 65 66 61 72 67 73  s(A) ::= refargs
24c0: 28 58 29 20 72 65 66 61 72 67 28 59 29 2e 20 7b  (X) refarg(Y). {
24d0: 20 41 20 3d 20 28 58 20 26 20 59 2e 6d 61 73 6b   A = (X & Y.mask
24e0: 29 20 7c 20 59 2e 76 61 6c 75 65 3b 20 7d 0a 25  ) | Y.value; }.%
24f0: 74 79 70 65 20 72 65 66 61 72 67 20 7b 73 74 72  type refarg {str
2500: 75 63 74 20 7b 69 6e 74 20 76 61 6c 75 65 3b 20  uct {int value; 
2510: 69 6e 74 20 6d 61 73 6b 3b 7d 7d 0a 72 65 66 61  int mask;}}.refa
2520: 72 67 28 41 29 20 3a 3a 3d 20 4d 41 54 43 48 20  rg(A) ::= MATCH 
2530: 6e 6d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  nm.             
2540: 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b 20   { A.value = 0; 
2550: 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30      A.mask = 0x0
2560: 30 30 30 30 30 3b 20 7d 0a 72 65 66 61 72 67 28  00000; }.refarg(
2570: 41 29 20 3a 3a 3d 20 4f 4e 20 44 45 4c 45 54 45  A) ::= ON DELETE
2580: 20 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b 20   refact(X).   { 
2590: 41 2e 76 61 6c 75 65 20 3d 20 58 3b 20 20 20 20  A.value = X;    
25a0: 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30   A.mask = 0x0000
25b0: 66 66 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20  ff; }.refarg(A) 
25c0: 3a 3a 3d 20 4f 4e 20 55 50 44 41 54 45 20 72 65  ::= ON UPDATE re
25d0: 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76  fact(X).   { A.v
25e0: 61 6c 75 65 20 3d 20 58 3c 3c 38 3b 20 20 41 2e  alue = X<<8;  A.
25f0: 6d 61 73 6b 20 3d 20 30 78 30 30 66 66 30 30 3b  mask = 0x00ff00;
2600: 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d   }.refarg(A) ::=
2610: 20 4f 4e 20 49 4e 53 45 52 54 20 72 65 66 61 63   ON INSERT refac
2620: 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75  t(X).   { A.valu
2630: 65 20 3d 20 58 3c 3c 31 36 3b 20 41 2e 6d 61 73  e = X<<16; A.mas
2640: 6b 20 3d 20 30 78 66 66 30 30 30 30 3b 20 7d 0a  k = 0xff0000; }.
2650: 25 74 79 70 65 20 72 65 66 61 63 74 20 7b 69 6e  %type refact {in
2660: 74 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d  t}.refact(A) ::=
2670: 20 53 45 54 20 4e 55 4c 4c 2e 20 20 20 20 20 20   SET NULL.      
2680: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
2690: 5f 53 65 74 4e 75 6c 6c 3b 20 7d 0a 72 65 66 61  _SetNull; }.refa
26a0: 63 74 28 41 29 20 3a 3a 3d 20 53 45 54 20 44 45  ct(A) ::= SET DE
26b0: 46 41 55 4c 54 2e 20 20 20 20 20 20 20 20 20 20  FAULT.          
26c0: 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74 44 66 6c   { A = OE_SetDfl
26d0: 74 3b 20 7d 0a 72 65 66 61 63 74 28 41 29 20 3a  t; }.refact(A) :
26e0: 3a 3d 20 43 41 53 43 41 44 45 2e 20 20 20 20 20  := CASCADE.     
26f0: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
2700: 4f 45 5f 43 61 73 63 61 64 65 3b 20 7d 0a 72 65  OE_Cascade; }.re
2710: 66 61 63 74 28 41 29 20 3a 3a 3d 20 52 45 53 54  fact(A) ::= REST
2720: 52 49 43 54 2e 20 20 20 20 20 20 20 20 20 20 20  RICT.           
2730: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65 73 74     { A = OE_Rest
2740: 72 69 63 74 3b 20 7d 0a 25 74 79 70 65 20 64 65  rict; }.%type de
2750: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 20 7b 69  fer_subclause {i
2760: 6e 74 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61  nt}.defer_subcla
2770: 75 73 65 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 44  use(A) ::= NOT D
2780: 45 46 45 52 52 41 42 4c 45 20 69 6e 69 74 5f 64  EFERRABLE init_d
2790: 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74  eferred_pred_opt
27a0: 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 64  (X).  {A = X;}.d
27b0: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 41  efer_subclause(A
27c0: 29 20 3a 3a 3d 20 44 45 46 45 52 52 41 42 4c 45  ) ::= DEFERRABLE
27d0: 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70   init_deferred_p
27e0: 72 65 64 5f 6f 70 74 28 58 29 2e 20 20 20 20 20  red_opt(X).     
27f0: 20 7b 41 20 3d 20 58 3b 7d 0a 25 74 79 70 65 20   {A = X;}.%type 
2800: 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72  init_deferred_pr
2810: 65 64 5f 6f 70 74 20 7b 69 6e 74 7d 0a 69 6e 69  ed_opt {int}.ini
2820: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f  t_deferred_pred_
2830: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 69 74     {A = 0;}.init
2860: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f  _deferred_pred_o
2870: 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41  pt(A) ::= INITIA
2880: 4c 4c 59 20 44 45 46 45 52 52 45 44 2e 20 20 20  LLY DEFERRED.   
2890: 20 20 7b 41 20 3d 20 31 3b 7d 0a 69 6e 69 74 5f    {A = 1;}.init_
28a0: 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70  deferred_pred_op
28b0: 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c  t(A) ::= INITIAL
28c0: 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 20 20 20  LY IMMEDIATE.   
28d0: 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 46 6f   {A = 0;}..// Fo
28e0: 72 20 74 68 65 20 74 69 6d 65 20 62 65 69 6e 67  r the time being
28f0: 2c 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6e 73 74  , the only const
2900: 72 61 69 6e 74 20 77 65 20 63 61 72 65 20 61 62  raint we care ab
2910: 6f 75 74 20 69 73 20 74 68 65 20 70 72 69 6d 61  out is the prima
2920: 72 79 0a 2f 2f 20 6b 65 79 20 61 6e 64 20 55 4e  ry.// key and UN
2930: 49 51 55 45 2e 20 20 42 6f 74 68 20 63 72 65 61  IQUE.  Both crea
2940: 74 65 20 69 6e 64 69 63 65 73 2e 0a 2f 2f 0a 63  te indices..//.c
2950: 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  onslist_opt(A) :
2960: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
2970: 20 20 20 20 20 20 20 7b 41 2e 6e 20 3d 20 30 3b         {A.n = 0;
2980: 20 41 2e 7a 20 3d 20 30 3b 7d 0a 63 6f 6e 73 6c   A.z = 0;}.consl
2990: 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 43  ist_opt(A) ::= C
29a0: 4f 4d 4d 41 28 58 29 20 63 6f 6e 73 6c 69 73 74  OMMA(X) conslist
29b0: 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 63 6f 6e 73  .  {A = X;}.cons
29c0: 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73  list ::= conslis
29d0: 74 20 43 4f 4d 4d 41 20 74 63 6f 6e 73 2e 0a 63  t COMMA tcons..c
29e0: 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e 73  onslist ::= cons
29f0: 6c 69 73 74 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73  list tcons..cons
2a00: 6c 69 73 74 20 3a 3a 3d 20 74 63 6f 6e 73 2e 0a  list ::= tcons..
2a10: 74 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54 52  tcons ::= CONSTR
2a20: 41 49 4e 54 20 6e 6d 2e 0a 74 63 6f 6e 73 20 3a  AINT nm..tcons :
2a30: 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4c  := PRIMARY KEY L
2a40: 50 20 69 64 78 6c 69 73 74 28 58 29 20 61 75 74  P idxlist(X) aut
2a50: 6f 69 6e 63 28 49 29 20 52 50 20 6f 6e 63 6f 6e  oinc(I) RP oncon
2a60: 66 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20  f(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 7b                 {
2a90: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
2aa0: 79 4b 65 79 28 70 50 61 72 73 65 2c 58 2c 52 2c  yKey(pParse,X,R,
2ab0: 49 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d  I,0);}.tcons ::=
2ac0: 20 55 4e 49 51 55 45 20 4c 50 20 69 64 78 6c 69   UNIQUE LP idxli
2ad0: 73 74 28 58 29 20 52 50 20 6f 6e 63 6f 6e 66 28  st(X) RP onconf(
2ae0: 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  R)..            
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65       {sqlite3Cre
2b10: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
2b20: 30 2c 30 2c 30 2c 58 2c 52 2c 30 2c 30 2c 30 2c  0,0,0,X,R,0,0,0,
2b30: 30 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43  0);}.tcons ::= C
2b40: 48 45 43 4b 20 4c 50 20 65 78 70 72 28 45 29 20  HECK LP expr(E) 
2b50: 52 50 20 6f 6e 63 6f 6e 66 2e 20 7b 73 71 6c 69  RP onconf. {sqli
2b60: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
2b70: 72 61 69 6e 74 28 70 50 61 72 73 65 2c 45 29 3b  raint(pParse,E);
2b80: 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 46 4f 52 45  }.tcons ::= FORE
2b90: 49 47 4e 20 4b 45 59 20 4c 50 20 69 64 78 6c 69  IGN KEY LP idxli
2ba0: 73 74 28 46 41 29 20 52 50 0a 20 20 20 20 20 20  st(FA) RP.      
2bb0: 20 20 20 20 52 45 46 45 52 45 4e 43 45 53 20 6e      REFERENCES n
2bc0: 6d 28 54 29 20 69 64 78 6c 69 73 74 5f 6f 70 74  m(T) idxlist_opt
2bd0: 28 54 41 29 20 72 65 66 61 72 67 73 28 52 29 20  (TA) refargs(R) 
2be0: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f  defer_subclause_
2bf0: 6f 70 74 28 44 29 2e 20 7b 0a 20 20 20 20 73 71  opt(D). {.    sq
2c00: 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69  lite3CreateForei
2c10: 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 20 46 41  gnKey(pParse, FA
2c20: 2c 20 26 54 2c 20 54 41 2c 20 52 29 3b 0a 20 20  , &T, TA, R);.  
2c30: 20 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f    sqlite3DeferFo
2c40: 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c  reignKey(pParse,
2c50: 20 44 29 3b 0a 7d 0a 25 74 79 70 65 20 64 65 66   D);.}.%type def
2c60: 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74  er_subclause_opt
2c70: 20 7b 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75 62   {int}.defer_sub
2c80: 63 6c 61 75 73 65 5f 6f 70 74 28 41 29 20 3a 3a  clause_opt(A) ::
2c90: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
2ca0: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
2cb0: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f  defer_subclause_
2cc0: 6f 70 74 28 41 29 20 3a 3a 3d 20 64 65 66 65 72  opt(A) ::= defer
2cd0: 5f 73 75 62 63 6c 61 75 73 65 28 58 29 2e 20 20  _subclause(X).  
2ce0: 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65  {A = X;}..// The
2cf0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20   following is a 
2d00: 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 65 78 74  non-standard ext
2d10: 65 6e 73 69 6f 6e 20 74 68 61 74 20 61 6c 6c 6f  ension that allo
2d20: 77 73 20 75 73 20 74 6f 20 64 65 63 6c 61 72 65  ws us to declare
2d30: 20 74 68 65 0a 2f 2f 20 64 65 66 61 75 6c 74 20   the.// default 
2d40: 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68  behavior when th
2d50: 65 72 65 20 69 73 20 61 20 63 6f 6e 73 74 72 61  ere is a constra
2d60: 69 6e 74 20 63 6f 6e 66 6c 69 63 74 2e 0a 2f 2f  int conflict..//
2d70: 0a 25 74 79 70 65 20 6f 6e 63 6f 6e 66 20 7b 69  .%type onconf {i
2d80: 6e 74 7d 0a 25 74 79 70 65 20 6f 72 63 6f 6e 66  nt}.%type orconf
2d90: 20 7b 69 6e 74 7d 0a 25 74 79 70 65 20 72 65 73   {int}.%type res
2da0: 6f 6c 76 65 74 79 70 65 20 7b 69 6e 74 7d 0a 6f  olvetype {int}.o
2db0: 6e 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20  nconf(A) ::= .  
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
2de0: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 6e   OE_Default;}.on
2df0: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 4e 20 43  conf(A) ::= ON C
2e00: 4f 4e 46 4c 49 43 54 20 72 65 73 6f 6c 76 65 74  ONFLICT resolvet
2e10: 79 70 65 28 58 29 2e 20 20 20 20 7b 41 20 3d 20  ype(X).    {A = 
2e20: 58 3b 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a  X;}.orconf(A) ::
2e30: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 7b 41 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74   {A = OE_Default
2e60: 3b 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d  ;}.orconf(A) ::=
2e70: 20 4f 52 20 72 65 73 6f 6c 76 65 74 79 70 65 28   OR resolvetype(
2e80: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
2e90: 7b 41 20 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76 65  {A = X;}.resolve
2ea0: 74 79 70 65 28 41 29 20 3a 3a 3d 20 72 61 69 73  type(A) ::= rais
2eb0: 65 74 79 70 65 28 58 29 2e 20 20 20 20 20 20 20  etype(X).       
2ec0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 72        {A = X;}.r
2ed0: 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a  esolvetype(A) ::
2ee0: 3d 20 49 47 4e 4f 52 45 2e 20 20 20 20 20 20 20  = IGNORE.       
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
2f00: 20 4f 45 5f 49 67 6e 6f 72 65 3b 7d 0a 72 65 73   OE_Ignore;}.res
2f10: 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20  olvetype(A) ::= 
2f20: 52 45 50 4c 41 43 45 2e 20 20 20 20 20 20 20 20  REPLACE.        
2f30: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f            {A = O
2f40: 45 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 2f 2f 2f  E_Replace;}..///
2f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2f60: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50  /////// The DROP
2f70: 20 54 41 42 4c 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f   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 0a 2f 2f 0a  ////////////.//.
2fa0: 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 41 42  cmd ::= DROP TAB
2fb0: 4c 45 20 69 66 65 78 69 73 74 73 28 45 29 20 66  LE ifexists(E) f
2fc0: 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20  ullname(X). {.  
2fd0: 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
2fe0: 28 70 50 61 72 73 65 2c 20 58 2c 20 30 2c 20 45  (pParse, X, 0, E
2ff0: 29 3b 0a 7d 0a 25 74 79 70 65 20 69 66 65 78 69  );.}.%type ifexi
3000: 73 74 73 20 7b 69 6e 74 7d 0a 69 66 65 78 69 73  sts {int}.ifexis
3010: 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 45 58 49  ts(A) ::= IF EXI
3020: 53 54 53 2e 20 20 20 7b 41 20 3d 20 31 3b 7d 0a  STS.   {A = 1;}.
3030: 69 66 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20  ifexists(A) ::= 
3040: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20  .            {A 
3050: 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  = 0;}../////////
3060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
3070: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
3080: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
3090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
30a0: 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20  ////.//.%ifndef 
30b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
30c0: 0a 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45 28  .cmd ::= CREATE(
30d0: 58 29 20 74 65 6d 70 28 54 29 20 56 49 45 57 20  X) temp(T) VIEW 
30e0: 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 20 41 53  nm(Y) dbnm(Z) AS
30f0: 20 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20   select(S). {.  
3100: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
3110: 77 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59  w(pParse, &X, &Y
3120: 2c 20 26 5a 2c 20 53 2c 20 54 29 3b 0a 7d 0a 63  , &Z, S, T);.}.c
3130: 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 56 49 45 57  md ::= DROP VIEW
3140: 20 69 66 65 78 69 73 74 73 28 45 29 20 66 75 6c   ifexists(E) ful
3150: 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71  lname(X). {.  sq
3160: 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 70  lite3DropTable(p
3170: 50 61 72 73 65 2c 20 58 2c 20 31 2c 20 45 29 3b  Parse, X, 1, E);
3180: 0a 7d 0a 25 65 6e 64 69 66 20 2f 2f 20 53 51 4c  .}.%endif // SQL
3190: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 0a 2f  ITE_OMIT_VIEW../
31a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
31b0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53 45 4c 45  /////// The SELE
31c0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  CT statement ///
31d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
31e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
31f0: 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c 65 63 74  /.cmd ::= select
3200: 28 58 29 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65  (X).  {.  sqlite
3210: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
3220: 58 2c 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 2c  X, SRT_Callback,
3230: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b   0, 0, 0, 0, 0);
3240: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
3250: 44 65 6c 65 74 65 28 58 29 3b 0a 7d 0a 0a 25 74  Delete(X);.}..%t
3260: 79 70 65 20 73 65 6c 65 63 74 20 7b 53 65 6c 65  ype select {Sele
3270: 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  ct*}.%destructor
3280: 20 73 65 6c 65 63 74 20 7b 73 71 6c 69 74 65 33   select {sqlite3
3290: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 24 24 29  SelectDelete($$)
32a0: 3b 7d 0a 25 74 79 70 65 20 6f 6e 65 73 65 6c 65  ;}.%type onesele
32b0: 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65  ct {Select*}.%de
32c0: 73 74 72 75 63 74 6f 72 20 6f 6e 65 73 65 6c 65  structor onesele
32d0: 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  ct {sqlite3Selec
32e0: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 73  tDelete($$);}..s
32f0: 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 6f 6e 65  elect(A) ::= one
3300: 73 65 6c 65 63 74 28 58 29 2e 20 20 20 20 20 20  select(X).      
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 7b 41 20 3d 20 58 3b 7d 0a 25 69 66 6e 64 65 66  {A = X;}.%ifndef
3330: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
3340: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 65 6c  POUND_SELECT.sel
3350: 65 63 74 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63  ect(A) ::= selec
3360: 74 28 58 29 20 6d 75 6c 74 69 73 65 6c 65 63 74  t(X) multiselect
3370: 5f 6f 70 28 59 29 20 6f 6e 65 73 65 6c 65 63 74  _op(Y) oneselect
3380: 28 5a 29 2e 20 20 7b 0a 20 20 69 66 28 20 5a 20  (Z).  {.  if( Z 
3390: 29 7b 0a 20 20 20 20 5a 2d 3e 6f 70 20 3d 20 59  ){.    Z->op = Y
33a0: 3b 0a 20 20 20 20 5a 2d 3e 70 50 72 69 6f 72 20  ;.    Z->pPrior 
33b0: 3d 20 58 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 5a  = X;.  }.  A = Z
33c0: 3b 0a 7d 0a 25 74 79 70 65 20 6d 75 6c 74 69 73  ;.}.%type multis
33d0: 65 6c 65 63 74 5f 6f 70 20 7b 69 6e 74 7d 0a 6d  elect_op {int}.m
33e0: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29  ultiselect_op(A)
33f0: 20 3a 3a 3d 20 55 4e 49 4f 4e 28 4f 50 29 2e 20   ::= UNION(OP). 
3400: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3410: 20 40 4f 50 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65   @OP;}.multisele
3420: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49  ct_op(A) ::= UNI
3430: 4f 4e 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 20  ON ALL.         
3440: 20 20 20 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b      {A = TK_ALL;
3450: 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70  }.multiselect_op
3460: 28 41 29 20 3a 3a 3d 20 45 58 43 45 50 54 7c 49  (A) ::= EXCEPT|I
3470: 4e 54 45 52 53 45 43 54 28 4f 50 29 2e 20 20 7b  NTERSECT(OP).  {
3480: 41 20 3d 20 40 4f 50 3b 7d 0a 25 65 6e 64 69 66  A = @OP;}.%endif
3490: 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   // SQLITE_OMIT_
34a0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
34b0: 6f 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d  oneselect(A) ::=
34c0: 20 53 45 4c 45 43 54 20 64 69 73 74 69 6e 63 74   SELECT distinct
34d0: 28 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57  (D) selcollist(W
34e0: 29 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65 5f  ) from(X) where_
34f0: 6f 70 74 28 59 29 0a 20 20 20 20 20 20 20 20 20  opt(Y).         
3500: 20 20 20 20 20 20 20 20 67 72 6f 75 70 62 79 5f          groupby_
3510: 6f 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f 70  opt(P) having_op
3520: 74 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70 74  t(Q) orderby_opt
3530: 28 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29  (Z) limit_opt(L)
3540: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
3550: 33 53 65 6c 65 63 74 4e 65 77 28 57 2c 58 2c 59  3SelectNew(W,X,Y
3560: 2c 50 2c 51 2c 5a 2c 44 2c 4c 2e 70 4c 69 6d 69  ,P,Q,Z,D,L.pLimi
3570: 74 2c 4c 2e 70 4f 66 66 73 65 74 29 3b 0a 7d 0a  t,L.pOffset);.}.
3580: 0a 2f 2f 20 54 68 65 20 22 64 69 73 74 69 6e 63  .// The "distinc
3590: 74 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 69  t" nonterminal i
35a0: 73 20 74 72 75 65 20 28 31 29 20 69 66 20 74 68  s true (1) if th
35b0: 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f  e DISTINCT keywo
35c0: 72 64 20 69 73 0a 2f 2f 20 70 72 65 73 65 6e 74  rd is.// present
35d0: 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69   and false (0) i
35e0: 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2f 2f 0a  f it is not..//.
35f0: 25 74 79 70 65 20 64 69 73 74 69 6e 63 74 20 7b  %type distinct {
3600: 69 6e 74 7d 0a 64 69 73 74 69 6e 63 74 28 41 29  int}.distinct(A)
3610: 20 3a 3a 3d 20 44 49 53 54 49 4e 43 54 2e 20 20   ::= DISTINCT.  
3620: 20 7b 41 20 3d 20 31 3b 7d 0a 64 69 73 74 69 6e   {A = 1;}.distin
3630: 63 74 28 41 29 20 3a 3a 3d 20 41 4c 4c 2e 20 20  ct(A) ::= ALL.  
3640: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64        {A = 0;}.d
3650: 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 2e  istinct(A) ::= .
3660: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3670: 30 3b 7d 0a 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69  0;}..// selcolli
3680: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
3690: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
36a0: 20 61 72 65 20 74 6f 20 62 65 63 6f 6d 65 20 74   are to become t
36b0: 68 65 20 72 65 74 75 72 6e 0a 2f 2f 20 76 61 6c  he return.// val
36c0: 75 65 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ues of the SELEC
36d0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  T statement.  Th
36e0: 65 20 22 2a 22 20 69 6e 20 73 74 61 74 65 6d 65  e "*" in stateme
36f0: 6e 74 73 20 6c 69 6b 65 0a 2f 2f 20 22 53 45 4c  nts like.// "SEL
3700: 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 20  ECT * FROM ..." 
3710: 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20  is encoded as a 
3720: 73 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69  special expressi
3730: 6f 6e 20 77 69 74 68 20 61 6e 0a 2f 2f 20 6f 70  on with an.// op
3740: 63 6f 64 65 20 6f 66 20 54 4b 5f 41 4c 4c 2e 0a  code of TK_ALL..
3750: 2f 2f 0a 25 74 79 70 65 20 73 65 6c 63 6f 6c 6c  //.%type selcoll
3760: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
3770: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 63  %destructor selc
3780: 6f 6c 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45  ollist {sqlite3E
3790: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24  xprListDelete($$
37a0: 29 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70 20 7b  );}.%type sclp {
37b0: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
37c0: 72 75 63 74 6f 72 20 73 63 6c 70 20 7b 73 71 6c  ructor sclp {sql
37d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
37e0: 74 65 28 24 24 29 3b 7d 0a 73 63 6c 70 28 41 29  te($$);}.sclp(A)
37f0: 20 3a 3a 3d 20 73 65 6c 63 6f 6c 6c 69 73 74 28   ::= selcollist(
3800: 58 29 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20  X) COMMA.       
3810: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73        {A = X;}.s
3820: 63 6c 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  clp(A) ::= .    
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3850: 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28   0;}.selcollist(
3860: 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20 65  A) ::= sclp(P) e
3870: 78 70 72 28 58 29 20 61 73 28 59 29 2e 20 20 20  xpr(X) as(Y).   
3880: 20 20 7b 0a 20 20 20 41 20 3d 20 73 71 6c 69 74    {.   A = sqlit
3890: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
38a0: 28 50 2c 58 2c 59 2e 6e 3f 26 59 3a 30 29 3b 0a  (P,X,Y.n?&Y:0);.
38b0: 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20  }.selcollist(A) 
38c0: 3a 3a 3d 20 73 63 6c 70 28 50 29 20 53 54 41 52  ::= sclp(P) STAR
38d0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
38e0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
38f0: 50 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 54  P, sqlite3Expr(T
3900: 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c  K_ALL, 0, 0, 0),
3910: 20 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73   0);.}.selcollis
3920: 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29  t(A) ::= sclp(P)
3930: 20 6e 6d 28 58 29 20 44 4f 54 20 53 54 41 52 2e   nm(X) DOT STAR.
3940: 20 7b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68   {.  Expr *pRigh
3950: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  t = sqlite3Expr(
3960: 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  TK_ALL, 0, 0, 0)
3970: 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20  ;.  Expr *pLeft 
3980: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
3990: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a  _ID, 0, 0, &X);.
39a0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
39b0: 72 4c 69 73 74 41 70 70 65 6e 64 28 50 2c 20 73  rListAppend(P, s
39c0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f  qlite3Expr(TK_DO
39d0: 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  T, pLeft, pRight
39e0: 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 0a 2f 2f 20  , 0), 0);.}..// 
39f0: 41 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20 3c 69  An option "AS <i
3a00: 64 3e 22 20 70 68 72 61 73 65 20 74 68 61 74 20  d>" phrase that 
3a10: 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65 20 6f  can follow one o
3a20: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
3a30: 73 20 74 68 61 74 0a 2f 2f 20 64 65 66 69 6e 65  s that.// define
3a40: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
3a50: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
3a60: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
3a70: 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25 74 79  M clause..//.%ty
3a80: 70 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a 61 73  pe as {Token}.as
3a90: 28 58 29 20 3a 3a 3d 20 41 53 20 6e 6d 28 59 29  (X) ::= AS nm(Y)
3aa0: 2e 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a 61 73  .    {X = Y;}.as
3ab0: 28 58 29 20 3a 3a 3d 20 69 64 73 28 59 29 2e 20  (X) ::= ids(Y). 
3ac0: 20 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a 61 73       {X = Y;}.as
3ad0: 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (X) ::= .       
3ae0: 20 20 20 20 20 7b 58 2e 6e 20 3d 20 30 3b 7d 0a       {X.n = 0;}.
3af0: 0a 0a 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69  ..%type seltabli
3b00: 73 74 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  st {SrcList*}.%d
3b10: 65 73 74 72 75 63 74 6f 72 20 73 65 6c 74 61 62  estructor seltab
3b20: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 53 72 63  list {sqlite3Src
3b30: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
3b40: 0a 25 74 79 70 65 20 73 74 6c 5f 70 72 65 66 69  .%type stl_prefi
3b50: 78 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65  x {SrcList*}.%de
3b60: 73 74 72 75 63 74 6f 72 20 73 74 6c 5f 70 72 65  structor stl_pre
3b70: 66 69 78 20 7b 73 71 6c 69 74 65 33 53 72 63 4c  fix {sqlite3SrcL
3b80: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
3b90: 25 74 79 70 65 20 66 72 6f 6d 20 7b 53 72 63 4c  %type from {SrcL
3ba0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
3bb0: 72 20 66 72 6f 6d 20 7b 73 71 6c 69 74 65 33 53  r from {sqlite3S
3bc0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  rcListDelete($$)
3bd0: 3b 7d 0a 0a 2f 2f 20 41 20 63 6f 6d 70 6c 65 74  ;}..// A complet
3be0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f  e FROM clause../
3bf0: 2f 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 2e 20  /.from(A) ::= . 
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 7b 41 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  {A = sqliteMallo
3c30: 63 28 73 69 7a 65 6f 66 28 2a 41 29 29 3b 7d 0a  c(sizeof(*A));}.
3c40: 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 46 52 4f 4d  from(A) ::= FROM
3c50: 20 73 65 6c 74 61 62 6c 69 73 74 28 58 29 2e 20   seltablist(X). 
3c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
3c70: 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 22 73 65 6c 74   = X;}..// "selt
3c80: 61 62 6c 69 73 74 22 20 69 73 20 61 20 22 53 65  ablist" is a "Se
3c90: 6c 65 63 74 20 54 61 62 6c 65 20 4c 69 73 74 22  lect Table List"
3ca0: 20 2d 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f   - the content o
3cb0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
3cc0: 65 0a 2f 2f 20 69 6e 20 61 20 53 45 4c 45 43 54  e.// in a SELECT
3cd0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 22 73 74   statement.  "st
3ce0: 6c 5f 70 72 65 66 69 78 22 20 69 73 20 61 20 70  l_prefix" is a p
3cf0: 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 6c 69  refix of this li
3d00: 73 74 2e 0a 2f 2f 0a 73 74 6c 5f 70 72 65 66 69  st..//.stl_prefi
3d10: 78 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61 62 6c  x(A) ::= seltabl
3d20: 69 73 74 28 58 29 20 6a 6f 69 6e 6f 70 28 59 29  ist(X) joinop(Y)
3d30: 2e 20 20 20 20 7b 0a 20 20 20 41 20 3d 20 58 3b  .    {.   A = X;
3d40: 0a 20 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e  .   if( A && A->
3d50: 6e 53 72 63 3e 30 20 29 20 41 2d 3e 61 5b 41 2d  nSrc>0 ) A->a[A-
3d60: 3e 6e 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70  >nSrc-1].jointyp
3d70: 65 20 3d 20 59 3b 0a 7d 0a 73 74 6c 5f 70 72 65  e = Y;.}.stl_pre
3d80: 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  fix(A) ::= .    
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
3db0: 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a  seltablist(A) ::
3dc0: 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20  = stl_prefix(X) 
3dd0: 6e 6d 28 59 29 20 64 62 6e 6d 28 44 29 20 61 73  nm(Y) dbnm(D) as
3de0: 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73  (Z) on_opt(N) us
3df0: 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20  ing_opt(U). {.  
3e00: 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  A = sqlite3SrcLi
3e10: 73 74 41 70 70 65 6e 64 28 58 2c 26 59 2c 26 44  stAppend(X,&Y,&D
3e20: 29 3b 0a 20 20 69 66 28 20 5a 2e 6e 20 29 20 73  );.  if( Z.n ) s
3e30: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 64 64  qlite3SrcListAdd
3e40: 41 6c 69 61 73 28 41 2c 26 5a 29 3b 0a 20 20 69  Alias(A,&Z);.  i
3e50: 66 28 20 4e 20 29 7b 0a 20 20 20 20 69 66 28 20  f( N ){.    if( 
3e60: 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29  A && A->nSrc>1 )
3e70: 7b 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32  { A->a[A->nSrc-2
3e80: 5d 2e 70 4f 6e 20 3d 20 4e 3b 20 7d 0a 20 20 20  ].pOn = N; }.   
3e90: 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65 33 45   else { sqlite3E
3ea0: 78 70 72 44 65 6c 65 74 65 28 4e 29 3b 20 7d 0a  xprDelete(N); }.
3eb0: 20 20 7d 0a 20 20 69 66 28 20 55 20 29 7b 0a 20    }.  if( U ){. 
3ec0: 20 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e 6e     if( A && A->n
3ed0: 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41 2d  Src>1 ){ A->a[A-
3ee0: 3e 6e 53 72 63 2d 32 5d 2e 70 55 73 69 6e 67 20  >nSrc-2].pUsing 
3ef0: 3d 20 55 3b 20 7d 0a 20 20 20 20 65 6c 73 65 20  = U; }.    else 
3f00: 7b 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  { sqlite3IdListD
3f10: 65 6c 65 74 65 28 55 29 3b 20 7d 0a 20 20 7d 0a  elete(U); }.  }.
3f20: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
3f30: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
3f40: 20 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a   seltablist(A) :
3f50: 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29  := stl_prefix(X)
3f60: 20 4c 50 20 73 65 6c 74 61 62 6c 69 73 74 5f 70   LP seltablist_p
3f70: 61 72 65 6e 28 53 29 20 52 50 0a 20 20 20 20 20  aren(S) RP.     
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
3f90: 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75  s(Z) on_opt(N) u
3fa0: 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20  sing_opt(U). {. 
3fb0: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 72     A = sqlite3Sr
3fc0: 63 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 30 2c  cListAppend(X,0,
3fd0: 30 29 3b 0a 20 20 20 20 41 2d 3e 61 5b 41 2d 3e  0);.    A->a[A->
3fe0: 6e 53 72 63 2d 31 5d 2e 70 53 65 6c 65 63 74 20  nSrc-1].pSelect 
3ff0: 3d 20 53 3b 0a 20 20 20 20 69 66 28 20 5a 2e 6e  = S;.    if( Z.n
4000: 20 29 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   ) sqlite3SrcLis
4010: 74 41 64 64 41 6c 69 61 73 28 41 2c 26 5a 29 3b  tAddAlias(A,&Z);
4020: 0a 20 20 20 20 69 66 28 20 4e 20 29 7b 0a 20 20  .    if( N ){.  
4030: 20 20 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e      if( A && A->
4040: 6e 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41  nSrc>1 ){ A->a[A
4050: 2d 3e 6e 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d 20  ->nSrc-2].pOn = 
4060: 4e 3b 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20  N; }.      else 
4070: 7b 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  { sqlite3ExprDel
4080: 65 74 65 28 4e 29 3b 20 7d 0a 20 20 20 20 7d 0a  ete(N); }.    }.
4090: 20 20 20 20 69 66 28 20 55 20 29 7b 0a 20 20 20      if( U ){.   
40a0: 20 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e 6e     if( A && A->n
40b0: 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41 2d  Src>1 ){ A->a[A-
40c0: 3e 6e 53 72 63 2d 32 5d 2e 70 55 73 69 6e 67 20  >nSrc-2].pUsing 
40d0: 3d 20 55 3b 20 7d 0a 20 20 20 20 20 20 65 6c 73  = U; }.      els
40e0: 65 20 7b 20 73 71 6c 69 74 65 33 49 64 4c 69 73  e { sqlite3IdLis
40f0: 74 44 65 6c 65 74 65 28 55 29 3b 20 7d 0a 20 20  tDelete(U); }.  
4100: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20    }.  }.  .  // 
4110: 41 20 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72  A seltablist_par
4120: 65 6e 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 72  en nonterminal r
4130: 65 70 72 65 73 65 6e 74 73 20 61 6e 79 74 68 69  epresents anythi
4140: 6e 67 20 69 6e 20 61 20 46 52 4f 4d 20 74 68 61  ng in a FROM tha
4150: 74 0a 20 20 2f 2f 20 69 73 20 63 6f 6e 74 61 69  t.  // is contai
4160: 6e 65 64 20 69 6e 73 69 64 65 20 70 61 72 65 6e  ned inside paren
4170: 74 68 65 73 65 73 2e 20 20 54 68 69 73 20 63 61  theses.  This ca
4180: 6e 20 62 65 20 65 69 74 68 65 72 20 61 20 73 75  n be either a su
4190: 62 71 75 65 72 79 20 6f 72 0a 20 20 2f 2f 20 61  bquery or.  // a
41a0: 20 67 72 6f 75 70 69 6e 67 20 6f 66 20 74 61 62   grouping of tab
41b0: 6c 65 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  le and subquerie
41c0: 73 2e 0a 20 20 2f 2f 0a 20 20 25 74 79 70 65 20  s..  //.  %type 
41d0: 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e  seltablist_paren
41e0: 20 7b 53 65 6c 65 63 74 2a 7d 0a 20 20 25 64 65   {Select*}.  %de
41f0: 73 74 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c  structor seltabl
4200: 69 73 74 5f 70 61 72 65 6e 20 7b 73 71 6c 69 74  ist_paren {sqlit
4210: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 24  e3SelectDelete($
4220: 24 29 3b 7d 0a 20 20 73 65 6c 74 61 62 6c 69 73  $);}.  seltablis
4230: 74 5f 70 61 72 65 6e 28 41 29 20 3a 3a 3d 20 73  t_paren(A) ::= s
4240: 65 6c 65 63 74 28 53 29 2e 20 20 20 20 20 20 7b  elect(S).      {
4250: 41 20 3d 20 53 3b 7d 0a 20 20 73 65 6c 74 61 62  A = S;}.  seltab
4260: 6c 69 73 74 5f 70 61 72 65 6e 28 41 29 20 3a 3a  list_paren(A) ::
4270: 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 46 29 2e  = seltablist(F).
4280: 20 20 7b 0a 20 20 20 20 20 41 20 3d 20 73 71 6c    {.     A = sql
4290: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 30 2c  ite3SelectNew(0,
42a0: 46 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29  F,0,0,0,0,0,0,0)
42b0: 3b 0a 20 20 7d 0a 25 65 6e 64 69 66 20 2f 2f 20  ;.  }.%endif // 
42c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
42d0: 55 45 52 59 0a 0a 25 74 79 70 65 20 64 62 6e 6d  UERY..%type dbnm
42e0: 20 7b 54 6f 6b 65 6e 7d 0a 64 62 6e 6d 28 41 29   {Token}.dbnm(A)
42f0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
4300: 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 30 3b 7d 0a  {A.z=0; A.n=0;}.
4310: 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 44 4f 54 20  dbnm(A) ::= DOT 
4320: 6e 6d 28 58 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a  nm(X). {A = X;}.
4330: 0a 25 74 79 70 65 20 66 75 6c 6c 6e 61 6d 65 20  .%type fullname 
4340: 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74  {SrcList*}.%dest
4350: 72 75 63 74 6f 72 20 66 75 6c 6c 6e 61 6d 65 20  ructor fullname 
4360: 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  {sqlite3SrcListD
4370: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 66 75 6c 6c  elete($$);}.full
4380: 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 6e 6d 28 58  name(A) ::= nm(X
4390: 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b 41 20 3d  ) dbnm(Y).  {A =
43a0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
43b0: 70 70 65 6e 64 28 30 2c 26 58 2c 26 59 29 3b 7d  ppend(0,&X,&Y);}
43c0: 0a 0a 25 74 79 70 65 20 6a 6f 69 6e 6f 70 20 7b  ..%type joinop {
43d0: 69 6e 74 7d 0a 25 74 79 70 65 20 6a 6f 69 6e 6f  int}.%type joino
43e0: 70 32 20 7b 69 6e 74 7d 0a 6a 6f 69 6e 6f 70 28  p2 {int}.joinop(
43f0: 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 7c 4a 4f 49  X) ::= COMMA|JOI
4400: 4e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
4410: 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 20  { X = JT_INNER; 
4420: 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20  }.joinop(X) ::= 
4430: 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f 49 4e 2e  JOIN_KW(A) JOIN.
4440: 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 73           { X = s
4450: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70  qlite3JoinType(p
4460: 50 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20 7d  Parse,&A,0,0); }
4470: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
4480: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
4490: 4a 4f 49 4e 2e 20 20 20 7b 20 58 20 3d 20 73 71  JOIN.   { X = sq
44a0: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50  lite3JoinType(pP
44b0: 61 72 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20 7d  arse,&A,&B,0); }
44c0: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
44d0: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
44e0: 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20  nm(C) JOIN..    
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33     { X = sqlite3
4520: 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c  JoinType(pParse,
4530: 26 41 2c 26 42 2c 26 43 29 3b 20 7d 0a 0a 25 74  &A,&B,&C); }..%t
4540: 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70 72  ype on_opt {Expr
4550: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f  *}.%destructor o
4560: 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  n_opt {sqlite3Ex
4570: 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 6f  prDelete($$);}.o
4580: 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 4f 4e 20  n_opt(N) ::= ON 
4590: 65 78 70 72 28 45 29 2e 20 20 20 7b 4e 20 3d 20  expr(E).   {N = 
45a0: 45 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a  E;}.on_opt(N) ::
45b0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
45c0: 7b 4e 20 3d 20 30 3b 7d 0a 0a 25 74 79 70 65 20  {N = 0;}..%type 
45d0: 75 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73  using_opt {IdLis
45e0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
45f0: 75 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74  using_opt {sqlit
4600: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24  e3IdListDelete($
4610: 24 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55  $);}.using_opt(U
4620: 29 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20 69  ) ::= USING LP i
4630: 6e 73 63 6f 6c 6c 69 73 74 28 4c 29 20 52 50 2e  nscollist(L) RP.
4640: 20 20 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e 67    {U = L;}.using
4650: 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20 20  _opt(U) ::= .   
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 20 20 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a 0a       {U = 0;}...
4680: 25 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f 70  %type orderby_op
4690: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
46a0: 65 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72 62  estructor orderb
46b0: 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  y_opt {sqlite3Ex
46c0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
46d0: 3b 7d 0a 25 74 79 70 65 20 73 6f 72 74 6c 69 73  ;}.%type sortlis
46e0: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
46f0: 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74 6c 69  estructor sortli
4700: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
4710: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
4720: 25 74 79 70 65 20 73 6f 72 74 69 74 65 6d 20 7b  %type sortitem {
4730: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
4740: 6f 72 20 73 6f 72 74 69 74 65 6d 20 7b 73 71 6c  or sortitem {sql
4750: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
4760: 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70  $);}..orderby_op
4770: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64      {A = 0;}.ord
47a0: 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  erby_opt(A) ::= 
47b0: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73  ORDER BY sortlis
47c0: 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20  t(X).      {A = 
47d0: 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20  X;}.sortlist(A) 
47e0: 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29 20  ::= sortlist(X) 
47f0: 43 4f 4d 4d 41 20 73 6f 72 74 69 74 65 6d 28 59  COMMA sortitem(Y
4800: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
4810: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
4820: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4830: 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 43 2e 6e  stAppend(X,Y,C.n
4840: 3e 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28 20  >0?&C:0);.  if( 
4850: 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70  A ) A->a[A->nExp
4860: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
4870: 20 5a 3b 0a 7d 0a 73 6f 72 74 6c 69 73 74 28 41   Z;.}.sortlist(A
4880: 29 20 3a 3a 3d 20 73 6f 72 74 69 74 65 6d 28 59  ) ::= sortitem(Y
4890: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
48a0: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
48b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
48c0: 73 74 41 70 70 65 6e 64 28 30 2c 59 2c 43 2e 6e  stAppend(0,Y,C.n
48d0: 3e 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28 20  >0?&C:0);.  if( 
48e0: 41 20 26 26 20 41 2d 3e 61 20 29 20 41 2d 3e 61  A && A->a ) A->a
48f0: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
4900: 5a 3b 0a 7d 0a 73 6f 72 74 69 74 65 6d 28 41 29  Z;.}.sortitem(A)
4910: 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20   ::= expr(X).   
4920: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
4930: 73 6f 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d 0a  sortorder {int}.
4940: 25 74 79 70 65 20 63 6f 6c 6c 61 74 65 20 7b 54  %type collate {T
4950: 6f 6b 65 6e 7d 0a 0a 73 6f 72 74 6f 72 64 65 72  oken}..sortorder
4960: 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20  (A) ::= ASC.    
4970: 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49         {A = SQLI
4980: 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74  TE_SO_ASC;}.sort
4990: 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 44 45 53  order(A) ::= DES
49a0: 43 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d  C.          {A =
49b0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b   SQLITE_SO_DESC;
49c0: 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a  }.sortorder(A) :
49d0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
49e0: 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f    {A = SQLITE_SO
49f0: 5f 41 53 43 3b 7d 0a 63 6f 6c 6c 61 74 65 28 43  _ASC;}.collate(C
4a00: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
4a10: 20 20 20 20 20 20 20 7b 43 2e 7a 20 3d 20 30 3b         {C.z = 0;
4a20: 20 43 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c 6c 61   C.n = 0;}.colla
4a30: 74 65 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41 54  te(C) ::= COLLAT
4a40: 45 20 69 64 28 58 29 2e 20 20 20 7b 43 20 3d 20  E id(X).   {C = 
4a50: 58 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75 70  X;}..%type group
4a60: 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74  by_opt {ExprList
4a70: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 67  *}.%destructor g
4a80: 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c 69  roupby_opt {sqli
4a90: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4aa0: 65 28 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79 5f  e($$);}.groupby_
4ab0: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75 70    {A = 0;}.group
4ae0: 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47 52  by_opt(A) ::= GR
4af0: 4f 55 50 20 42 59 20 65 78 70 72 6c 69 73 74 28  OUP BY exprlist(
4b00: 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25  X).  {A = X;}..%
4b10: 74 79 70 65 20 68 61 76 69 6e 67 5f 6f 70 74 20  type having_opt 
4b20: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
4b30: 74 6f 72 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b  tor having_opt {
4b40: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4b50: 65 28 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f  e($$);}.having_o
4b60: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
4b70: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
4b80: 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41  0;}.having_opt(A
4b90: 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78 70  ) ::= HAVING exp
4ba0: 72 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  r(X).  {A = X;}.
4bb0: 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74  .%type limit_opt
4bc0: 20 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61   {struct LimitVa
4bd0: 6c 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6c  l}.%destructor l
4be0: 69 6d 69 74 5f 6f 70 74 20 7b 0a 20 20 73 71 6c  imit_opt {.  sql
4bf0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
4c00: 24 2e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71 6c  $.pLimit);.  sql
4c10: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
4c20: 24 2e 70 4f 66 66 73 65 74 29 3b 0a 7d 0a 6c 69  $.pOffset);.}.li
4c30: 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  mit_opt(A) ::= .
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c50: 20 20 20 20 20 7b 41 2e 70 4c 69 6d 69 74 20 3d       {A.pLimit =
4c60: 20 30 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20   0; A.pOffset = 
4c70: 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  0;}.limit_opt(A)
4c80: 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28   ::= LIMIT expr(
4c90: 58 29 2e 20 20 20 20 20 20 20 20 7b 41 2e 70 4c  X).        {A.pL
4ca0: 69 6d 69 74 20 3d 20 58 3b 20 41 2e 70 4f 66 66  imit = X; A.pOff
4cb0: 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f  set = 0;}.limit_
4cc0: 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54  opt(A) ::= LIMIT
4cd0: 20 65 78 70 72 28 58 29 20 4f 46 46 53 45 54 20   expr(X) OFFSET 
4ce0: 65 78 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20  expr(Y). .      
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d10: 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20 58 3b 20   {A.pLimit = X; 
4d20: 41 2e 70 4f 66 66 73 65 74 20 3d 20 59 3b 7d 0a  A.pOffset = Y;}.
4d30: 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  limit_opt(A) ::=
4d40: 20 4c 49 4d 49 54 20 65 78 70 72 28 58 29 20 43   LIMIT expr(X) C
4d50: 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e 20 0a 20  OMMA expr(Y). . 
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 7b 41 2e 70 4f 66 66 73 65 74        {A.pOffset
4d90: 20 3d 20 58 3b 20 41 2e 70 4c 69 6d 69 74 20 3d   = X; A.pLimit =
4da0: 20 59 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   Y;}..//////////
4db0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4dc0: 2f 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61  / The DELETE sta
4dd0: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
4de0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4df0: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
4e00: 44 45 4c 45 54 45 20 46 52 4f 4d 20 66 75 6c 6c  DELETE FROM full
4e10: 6e 61 6d 65 28 58 29 20 77 68 65 72 65 5f 6f 70  name(X) where_op
4e20: 74 28 59 29 2e 20 7b 73 71 6c 69 74 65 33 44 65  t(Y). {sqlite3De
4e30: 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c  leteFrom(pParse,
4e40: 58 2c 59 29 3b 7d 0a 0a 25 74 79 70 65 20 77 68  X,Y);}..%type wh
4e50: 65 72 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a  ere_opt {Expr*}.
4e60: 25 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 72  %destructor wher
4e70: 65 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  e_opt {sqlite3Ex
4e80: 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a  prDelete($$);}..
4e90: 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d  where_opt(A) ::=
4ea0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
4eb0: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 77        {A = 0;}.w
4ec0: 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  here_opt(A) ::= 
4ed0: 57 48 45 52 45 20 65 78 70 72 28 58 29 2e 20 20  WHERE expr(X).  
4ee0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f       {A = X;}../
4ef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 55 50  ///////// The UP
4f10: 44 41 54 45 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  DATE command ///
4f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
4f40: 0a 63 6d 64 20 3a 3a 3d 20 55 50 44 41 54 45 20  .cmd ::= UPDATE 
4f50: 6f 72 63 6f 6e 66 28 52 29 20 66 75 6c 6c 6e 61  orconf(R) fullna
4f60: 6d 65 28 58 29 20 53 45 54 20 73 65 74 6c 69 73  me(X) SET setlis
4f70: 74 28 59 29 20 77 68 65 72 65 5f 6f 70 74 28 5a  t(Y) where_opt(Z
4f80: 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 33 55  )..    {sqlite3U
4f90: 70 64 61 74 65 28 70 50 61 72 73 65 2c 58 2c 59  pdate(pParse,X,Y
4fa0: 2c 5a 2c 52 29 3b 7d 0a 0a 25 74 79 70 65 20 73  ,Z,R);}..%type s
4fb0: 65 74 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  etlist {ExprList
4fc0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
4fd0: 65 74 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45  etlist {sqlite3E
4fe0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24  xprListDelete($$
4ff0: 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20  );}..setlist(A) 
5000: 3a 3a 3d 20 73 65 74 6c 69 73 74 28 5a 29 20 43  ::= setlist(Z) C
5010: 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65 78  OMMA nm(X) EQ ex
5020: 70 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20  pr(Y)..    {A = 
5030: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5040: 70 70 65 6e 64 28 5a 2c 59 2c 26 58 29 3b 7d 0a  ppend(Z,Y,&X);}.
5050: 73 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e  setlist(A) ::= n
5060: 6d 28 58 29 20 45 51 20 65 78 70 72 28 59 29 2e  m(X) EQ expr(Y).
5070: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
5080: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
5090: 59 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  Y,&X);}..///////
50a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
50b0: 2f 2f 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63  /// The INSERT c
50c0: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
50d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
50e0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
50f0: 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52  ::= insert_cmd(R
5100: 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28  ) INTO fullname(
5110: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
5120: 74 28 46 29 20 0a 20 20 20 20 20 20 20 20 56 41  t(F) .        VA
5130: 4c 55 45 53 20 4c 50 20 69 74 65 6d 6c 69 73 74  LUES LP itemlist
5140: 28 59 29 20 52 50 2e 0a 20 20 20 20 20 20 20 20  (Y) RP..        
5150: 20 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73 65      {sqlite3Inse
5160: 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 59 2c  rt(pParse, X, Y,
5170: 20 30 2c 20 46 2c 20 52 29 3b 7d 0a 63 6d 64 20   0, F, R);}.cmd 
5180: 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52  ::= insert_cmd(R
5190: 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28  ) INTO fullname(
51a0: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
51b0: 74 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e 0a  t(F) select(S)..
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
51d0: 69 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73  ite3Insert(pPars
51e0: 65 2c 20 58 2c 20 30 2c 20 53 2c 20 46 2c 20 52  e, X, 0, S, F, R
51f0: 29 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 65 72  );}..%type inser
5200: 74 5f 63 6d 64 20 7b 69 6e 74 7d 0a 69 6e 73 65  t_cmd {int}.inse
5210: 72 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e  rt_cmd(A) ::= IN
5220: 53 45 52 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20  SERT orconf(R). 
5230: 20 20 7b 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72    {A = R;}.inser
5240: 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50  t_cmd(A) ::= REP
5250: 4c 41 43 45 2e 20 20 20 20 20 20 20 20 20 20 20  LACE.           
5260: 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65   {A = OE_Replace
5270: 3b 7d 0a 0a 0a 25 74 79 70 65 20 69 74 65 6d 6c  ;}...%type iteml
5280: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
5290: 25 64 65 73 74 72 75 63 74 6f 72 20 69 74 65 6d  %destructor item
52a0: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70  list {sqlite3Exp
52b0: 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  rListDelete($$);
52c0: 7d 0a 0a 69 74 65 6d 6c 69 73 74 28 41 29 20 3a  }..itemlist(A) :
52d0: 3a 3d 20 69 74 65 6d 6c 69 73 74 28 58 29 20 43  := itemlist(X) C
52e0: 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e 20 20 7b  OMMA expr(Y).  {
52f0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
5300: 69 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 30 29  istAppend(X,Y,0)
5310: 3b 7d 0a 69 74 65 6d 6c 69 73 74 28 41 29 20 3a  ;}.itemlist(A) :
5320: 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 20 20  := expr(X).     
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5340: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
5350: 69 73 74 41 70 70 65 6e 64 28 30 2c 58 2c 30 29  istAppend(0,X,0)
5360: 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 63 6f 6c  ;}..%type inscol
5370: 6c 69 73 74 5f 6f 70 74 20 7b 49 64 4c 69 73 74  list_opt {IdList
5380: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69  *}.%destructor i
5390: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b 73  nscollist_opt {s
53a0: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
53b0: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 69  te($$);}.%type i
53c0: 6e 73 63 6f 6c 6c 69 73 74 20 7b 49 64 4c 69 73  nscollist {IdLis
53d0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
53e0: 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69  inscollist {sqli
53f0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
5400: 24 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c 6c 69 73  $$);}..inscollis
5410: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  t_opt(A) ::= .  
5420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5430: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e       {A = 0;}.in
5440: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20  scollist_opt(A) 
5450: 3a 3a 3d 20 4c 50 20 69 6e 73 63 6f 6c 6c 69 73  ::= LP inscollis
5460: 74 28 58 29 20 52 50 2e 20 20 20 20 7b 41 20 3d  t(X) RP.    {A =
5470: 20 58 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28   X;}.inscollist(
5480: 41 29 20 3a 3a 3d 20 69 6e 73 63 6f 6c 6c 69 73  A) ::= inscollis
5490: 74 28 58 29 20 43 4f 4d 4d 41 20 6e 6d 28 59 29  t(X) COMMA nm(Y)
54a0: 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49  .  {A = sqlite3I
54b0: 64 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59  dListAppend(X,&Y
54c0: 29 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28 41  );}.inscollist(A
54d0: 29 20 3a 3a 3d 20 6e 6d 28 59 29 2e 20 20 20 20  ) ::= nm(Y).    
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49 64    {A = sqlite3Id
5500: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59 29  ListAppend(0,&Y)
5510: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
5520: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
5530: 45 78 70 72 65 73 73 69 6f 6e 20 50 72 6f 63 65  Expression Proce
5540: 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ssing //////////
5550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5560: 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65 20 65 78  ///.//..%type ex
5570: 70 72 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pr {Expr*}.%dest
5580: 72 75 63 74 6f 72 20 65 78 70 72 20 7b 73 71 6c  ructor expr {sql
5590: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
55a0: 24 29 3b 7d 0a 25 74 79 70 65 20 74 65 72 6d 20  $);}.%type term 
55b0: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
55c0: 74 6f 72 20 74 65 72 6d 20 7b 73 71 6c 69 74 65  tor term {sqlite
55d0: 33 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b  3ExprDelete($$);
55e0: 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 74  }..expr(A) ::= t
55f0: 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20  erm(X).         
5600: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70      {A = X;}.exp
5610: 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 65  r(A) ::= LP(B) e
5620: 78 70 72 28 58 29 20 52 50 28 45 29 2e 20 7b 41  xpr(X) RP(E). {A
5630: 20 3d 20 58 3b 20 73 71 6c 69 74 65 33 45 78 70   = X; sqlite3Exp
5640: 72 53 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b 20  rSpan(A,&B,&E); 
5650: 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 4e 55  }.term(A) ::= NU
5660: 4c 4c 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  LL(X).          
5670: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
5680: 78 70 72 28 40 58 2c 20 30 2c 20 30 2c 20 26 58  xpr(@X, 0, 0, &X
5690: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
56a0: 49 44 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  ID(X).          
56b0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
56c0: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
56d0: 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  0, &X);}.expr(A)
56e0: 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e   ::= JOIN_KW(X).
56f0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
5700: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
5710: 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78  , 0, 0, &X);}.ex
5720: 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20  pr(A) ::= nm(X) 
5730: 44 4f 54 20 6e 6d 28 59 29 2e 20 7b 0a 20 20 45  DOT nm(Y). {.  E
5740: 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c  xpr *temp1 = sql
5750: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
5760: 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78 70  0, 0, &X);.  Exp
5770: 72 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69 74  r *temp2 = sqlit
5780: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
5790: 20 30 2c 20 26 59 29 3b 0a 20 20 41 20 3d 20 73   0, &Y);.  A = s
57a0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f  qlite3Expr(TK_DO
57b0: 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d 70 32 2c  T, temp1, temp2,
57c0: 20 30 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a   0);.}.expr(A) :
57d0: 3a 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28  := nm(X) DOT nm(
57e0: 59 29 20 44 4f 54 20 6e 6d 28 5a 29 2e 20 7b 0a  Y) DOT nm(Z). {.
57f0: 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20    Expr *temp1 = 
5800: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
5810: 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20  D, 0, 0, &X);.  
5820: 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71  Expr *temp2 = sq
5830: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
5840: 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 45 78   0, 0, &Y);.  Ex
5850: 70 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c 69  pr *temp3 = sqli
5860: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
5870: 2c 20 30 2c 20 26 5a 29 3b 0a 20 20 45 78 70 72  , 0, &Z);.  Expr
5880: 20 2a 74 65 6d 70 34 20 3d 20 73 71 6c 69 74 65   *temp4 = sqlite
5890: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 74 65  3Expr(TK_DOT, te
58a0: 6d 70 32 2c 20 74 65 6d 70 33 2c 20 30 29 3b 0a  mp2, temp3, 0);.
58b0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
58c0: 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c  r(TK_DOT, temp1,
58d0: 20 74 65 6d 70 34 2c 20 30 29 3b 0a 7d 0a 74 65   temp4, 0);.}.te
58e0: 72 6d 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45  rm(A) ::= INTEGE
58f0: 52 7c 46 4c 4f 41 54 7c 42 4c 4f 42 28 58 29 2e  R|FLOAT|BLOB(X).
5900: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
5910: 65 33 45 78 70 72 28 40 58 2c 20 30 2c 20 30 2c  e3Expr(@X, 0, 0,
5920: 20 26 58 29 3b 7d 0a 74 65 72 6d 28 41 29 20 3a   &X);}.term(A) :
5930: 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20 20  := STRING(X).   
5940: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
5950: 45 78 70 72 28 40 58 2c 20 30 2c 20 30 2c 20 26  Expr(@X, 0, 0, &
5960: 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  X);}.expr(A) ::=
5970: 20 52 45 47 49 53 54 45 52 28 58 29 2e 20 20 20   REGISTER(X).   
5980: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 52 65    {A = sqlite3Re
5990: 67 69 73 74 65 72 45 78 70 72 28 70 50 61 72 73  gisterExpr(pPars
59a0: 65 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  e, &X);}.expr(A)
59b0: 20 3a 3a 3d 20 56 41 52 49 41 42 4c 45 28 58 29   ::= VARIABLE(X)
59c0: 2e 20 20 20 20 20 7b 0a 20 20 54 6f 6b 65 6e 20  .     {.  Token 
59d0: 2a 70 54 6f 6b 65 6e 20 3d 20 26 58 3b 0a 20 20  *pToken = &X;.  
59e0: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 41 20  Expr *pExpr = A 
59f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
5a00: 5f 56 41 52 49 41 42 4c 45 2c 20 30 2c 20 30 2c  _VARIABLE, 0, 0,
5a10: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 73 71 6c 69   pToken);.  sqli
5a20: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
5a30: 4e 75 6d 62 65 72 28 70 50 61 72 73 65 2c 20 70  Number(pParse, p
5a40: 45 78 70 72 29 3b 0a 7d 0a 25 69 66 6e 64 65 66  Expr);.}.%ifndef
5a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53   SQLITE_OMIT_CAS
5a60: 54 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41  T.expr(A) ::= CA
5a70: 53 54 28 58 29 20 4c 50 20 65 78 70 72 28 45 29  ST(X) LP expr(E)
5a80: 20 41 53 20 74 79 70 65 74 6f 6b 65 6e 28 54 29   AS typetoken(T)
5a90: 20 52 50 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20   RP(Y). {.  A = 
5aa0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 43  sqlite3Expr(TK_C
5ab0: 41 53 54 2c 20 45 2c 20 30 2c 20 26 54 29 3b 0a  AST, E, 0, &T);.
5ac0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
5ad0: 6e 28 41 2c 26 58 2c 26 59 29 3b 0a 7d 0a 25 65  n(A,&X,&Y);.}.%e
5ae0: 6e 64 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f  ndif // SQLITE_O
5af0: 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28 41 29  MIT_CAST.expr(A)
5b00: 20 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20 64 69   ::= ID(X) LP di
5b10: 73 74 69 6e 63 74 28 44 29 20 65 78 70 72 6c 69  stinct(D) exprli
5b20: 73 74 28 59 29 20 52 50 28 45 29 2e 20 7b 0a 20  st(Y) RP(E). {. 
5b30: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
5b40: 46 75 6e 63 74 69 6f 6e 28 59 2c 20 26 58 29 3b  Function(Y, &X);
5b50: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  .  sqlite3ExprSp
5b60: 61 6e 28 41 2c 26 58 2c 26 45 29 3b 0a 20 20 69  an(A,&X,&E);.  i
5b70: 66 28 20 44 20 26 26 20 41 20 29 7b 0a 20 20 20  f( D && A ){.   
5b80: 20 41 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f   A->flags |= EP_
5b90: 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 7d 0a  Distinct;.  }.}.
5ba0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58  expr(A) ::= ID(X
5bb0: 29 20 4c 50 20 53 54 41 52 20 52 50 28 45 29 2e  ) LP STAR RP(E).
5bc0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
5bd0: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 30 2c 20  ExprFunction(0, 
5be0: 26 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  &X);.  sqlite3Ex
5bf0: 70 72 53 70 61 6e 28 41 2c 26 58 2c 26 45 29 3b  prSpan(A,&X,&E);
5c00: 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 43  .}.term(A) ::= C
5c10: 54 49 4d 45 5f 4b 57 28 4f 50 29 2e 20 7b 0a 20  TIME_KW(OP). {. 
5c20: 20 2f 2a 20 54 68 65 20 43 55 52 52 45 4e 54 5f   /* The CURRENT_
5c30: 54 49 4d 45 2c 20 43 55 52 52 45 4e 54 5f 44 41  TIME, CURRENT_DA
5c40: 54 45 2c 20 61 6e 64 20 43 55 52 52 45 4e 54 5f  TE, and CURRENT_
5c50: 54 49 4d 45 53 54 41 4d 50 20 76 61 6c 75 65 73  TIMESTAMP values
5c60: 20 61 72 65 0a 20 20 2a 2a 20 74 72 65 61 74 65   are.  ** treate
5c70: 64 20 61 73 20 66 75 6e 63 74 69 6f 6e 73 20 74  d as functions t
5c80: 68 61 74 20 72 65 74 75 72 6e 20 63 6f 6e 73 74  hat return const
5c90: 61 6e 74 73 20 2a 2f 0a 20 20 41 20 3d 20 73 71  ants */.  A = sq
5ca0: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f  lite3ExprFunctio
5cb0: 6e 28 30 2c 26 4f 50 29 3b 0a 20 20 69 66 28 20  n(0,&OP);.  if( 
5cc0: 41 20 29 20 41 2d 3e 6f 70 20 3d 20 54 4b 5f 43  A ) A->op = TK_C
5cd0: 4f 4e 53 54 5f 46 55 4e 43 3b 20 20 0a 7d 0a 65  ONST_FUNC;  .}.e
5ce0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
5cf0: 58 29 20 41 4e 44 28 4f 50 29 20 65 78 70 72 28  X) AND(OP) expr(
5d00: 59 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b  Y).            {
5d10: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5d20: 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  @OP, X, Y, 0);}.
5d30: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
5d40: 28 58 29 20 4f 52 28 4f 50 29 20 65 78 70 72 28  (X) OR(OP) expr(
5d50: 59 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  Y).             
5d60: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
5d70: 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  (@OP, X, Y, 0);}
5d80: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
5d90: 72 28 58 29 20 4c 54 7c 47 54 7c 47 45 7c 4c 45  r(X) LT|GT|GE|LE
5da0: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20  (OP) expr(Y).   
5db0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
5dc0: 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b  r(@OP, X, Y, 0);
5dd0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5de0: 70 72 28 58 29 20 45 51 7c 4e 45 28 4f 50 29 20  pr(X) EQ|NE(OP) 
5df0: 65 78 70 72 28 59 29 2e 20 20 20 20 20 20 20 20  expr(Y).        
5e00: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
5e10: 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29  pr(@OP, X, Y, 0)
5e20: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
5e30: 78 70 72 28 58 29 20 42 49 54 41 4e 44 7c 42 49  xpr(X) BITAND|BI
5e40: 54 4f 52 7c 4c 53 48 49 46 54 7c 52 53 48 49 46  TOR|LSHIFT|RSHIF
5e50: 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20  T(OP) expr(Y).. 
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5e90: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5ea0: 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  @OP, X, Y, 0);}.
5eb0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
5ec0: 28 58 29 20 50 4c 55 53 7c 4d 49 4e 55 53 28 4f  (X) PLUS|MINUS(O
5ed0: 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 20  P) expr(Y).     
5ee0: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
5ef0: 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  (@OP, X, Y, 0);}
5f00: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
5f10: 72 28 58 29 20 53 54 41 52 7c 53 4c 41 53 48 7c  r(X) STAR|SLASH|
5f20: 52 45 4d 28 4f 50 29 20 65 78 70 72 28 59 29 2e  REM(OP) expr(Y).
5f30: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
5f40: 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b  r(@OP, X, Y, 0);
5f50: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5f60: 70 72 28 58 29 20 43 4f 4e 43 41 54 28 4f 50 29  pr(X) CONCAT(OP)
5f70: 20 65 78 70 72 28 59 29 2e 20 20 20 20 20 20 20   expr(Y).       
5f80: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
5f90: 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29  pr(@OP, X, Y, 0)
5fa0: 3b 7d 0a 25 74 79 70 65 20 6c 69 6b 65 6f 70 20  ;}.%type likeop 
5fb0: 7b 73 74 72 75 63 74 20 4c 69 6b 65 4f 70 7d 0a  {struct LikeOp}.
5fc0: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4c 49  likeop(A) ::= LI
5fd0: 4b 45 5f 4b 57 28 58 29 2e 20 20 20 20 20 7b 41  KE_KW(X).     {A
5fe0: 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20 58 3b 20  .eOperator = X; 
5ff0: 41 2e 6e 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b 65  A.not = 0;}.like
6000: 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4c 49  op(A) ::= NOT LI
6010: 4b 45 5f 4b 57 28 58 29 2e 20 7b 41 2e 65 4f 70  KE_KW(X). {A.eOp
6020: 65 72 61 74 6f 72 20 3d 20 58 3b 20 41 2e 6e 6f  erator = X; A.no
6030: 74 20 3d 20 31 3b 7d 0a 25 74 79 70 65 20 65 73  t = 1;}.%type es
6040: 63 61 70 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65  cape {Expr*}.%de
6050: 73 74 72 75 63 74 6f 72 20 65 73 63 61 70 65 20  structor escape 
6060: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
6070: 74 65 28 24 24 29 3b 7d 0a 65 73 63 61 70 65 28  te($$);}.escape(
6080: 58 29 20 3a 3a 3d 20 45 53 43 41 50 45 20 65 78  X) ::= ESCAPE ex
6090: 70 72 28 41 29 2e 20 5b 45 53 43 41 50 45 5d 20  pr(A). [ESCAPE] 
60a0: 7b 58 20 3d 20 41 3b 7d 0a 65 73 63 61 70 65 28  {X = A;}.escape(
60b0: 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  X) ::= .        
60c0: 20 20 20 20 20 20 20 5b 45 53 43 41 50 45 5d 20         [ESCAPE] 
60d0: 7b 58 20 3d 20 30 3b 7d 0a 65 78 70 72 28 41 29  {X = 0;}.expr(A)
60e0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 6c 69 6b   ::= expr(X) lik
60f0: 65 6f 70 28 4f 50 29 20 65 78 70 72 28 59 29 20  eop(OP) expr(Y) 
6100: 65 73 63 61 70 65 28 45 29 2e 20 20 5b 4c 49 4b  escape(E).  [LIK
6110: 45 5f 4b 57 5d 20 20 7b 0a 20 20 45 78 70 72 4c  E_KW]  {.  ExprL
6120: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c  ist *pList;.  pL
6130: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
6140: 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 59  rListAppend(0, Y
6150: 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  , 0);.  pList = 
6160: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6170: 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 58 2c 20  ppend(pList, X, 
6180: 30 29 3b 0a 20 20 69 66 28 20 45 20 29 7b 0a 20  0);.  if( E ){. 
6190: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
61a0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
61b0: 28 70 4c 69 73 74 2c 20 45 2c 20 30 29 3b 0a 20  (pList, E, 0);. 
61c0: 20 7d 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   }.  A = sqlite3
61d0: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 4c 69  ExprFunction(pLi
61e0: 73 74 2c 20 26 4f 50 2e 65 4f 70 65 72 61 74 6f  st, &OP.eOperato
61f0: 72 29 3b 0a 20 20 69 66 28 20 4f 50 2e 6e 6f 74  r);.  if( OP.not
6200: 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78   ) A = sqlite3Ex
6210: 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c  pr(TK_NOT, A, 0,
6220: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78   0);.  sqlite3Ex
6230: 70 72 53 70 61 6e 28 41 2c 20 26 58 2d 3e 73 70  prSpan(A, &X->sp
6240: 61 6e 2c 20 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d  an, &Y->span);.}
6250: 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  ..expr(A) ::= ex
6260: 70 72 28 58 29 20 49 53 4e 55 4c 4c 7c 4e 4f 54  pr(X) ISNULL|NOT
6270: 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d  NULL(E). {.  A =
6280: 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 45 2c   sqlite3Expr(@E,
6290: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   X, 0, 0);.  sql
62a0: 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26  ite3ExprSpan(A,&
62b0: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
62c0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
62d0: 58 29 20 49 53 20 4e 55 4c 4c 28 45 29 2e 20 7b  X) IS NULL(E). {
62e0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
62f0: 70 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c  pr(TK_ISNULL, X,
6300: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
6310: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  3ExprSpan(A,&X->
6320: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72  span,&E);.}.expr
6330: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
6340: 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20  NOT NULL(E). {. 
6350: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6360: 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20  (TK_NOTNULL, X, 
6370: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
6380: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73  ExprSpan(A,&X->s
6390: 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28  pan,&E);.}.expr(
63a0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49  A) ::= expr(X) I
63b0: 53 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20 7b  S NOT NULL(E). {
63c0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
63d0: 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58  pr(TK_NOTNULL, X
63e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
63f0: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  e3ExprSpan(A,&X-
6400: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70  >span,&E);.}.exp
6410: 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 7c 42 49 54  r(A) ::= NOT|BIT
6420: 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e 20  NOT(B) expr(X). 
6430: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
6440: 78 70 72 28 40 42 2c 20 58 2c 20 30 2c 20 30 29  xpr(@B, X, 0, 0)
6450: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
6460: 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61  pan(A,&B,&X->spa
6470: 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  n);.}.expr(A) ::
6480: 3d 20 4d 49 4e 55 53 28 42 29 20 65 78 70 72 28  = MINUS(B) expr(
6490: 58 29 2e 20 5b 55 4d 49 4e 55 53 5d 20 7b 0a 20  X). [UMINUS] {. 
64a0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
64b0: 28 54 4b 5f 55 4d 49 4e 55 53 2c 20 58 2c 20 30  (TK_UMINUS, X, 0
64c0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  , 0);.  sqlite3E
64d0: 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d  xprSpan(A,&B,&X-
64e0: 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41  >span);.}.expr(A
64f0: 29 20 3a 3a 3d 20 50 4c 55 53 28 42 29 20 65 78  ) ::= PLUS(B) ex
6500: 70 72 28 58 29 2e 20 5b 55 50 4c 55 53 5d 20 7b  pr(X). [UPLUS] {
6510: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
6520: 70 72 28 54 4b 5f 55 50 4c 55 53 2c 20 58 2c 20  pr(TK_UPLUS, X, 
6530: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
6540: 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 58  ExprSpan(A,&B,&X
6550: 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 25 74 79 70 65  ->span);.}.%type
6560: 20 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69 6e 74   between_op {int
6570: 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20  }.between_op(A) 
6580: 3a 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20 20 20  ::= BETWEEN.    
6590: 20 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77 65 65   {A = 0;}.betwee
65a0: 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20  n_op(A) ::= NOT 
65b0: 42 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20 31 3b  BETWEEN. {A = 1;
65c0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
65d0: 70 72 28 57 29 20 62 65 74 77 65 65 6e 5f 6f 70  pr(W) between_op
65e0: 28 4e 29 20 65 78 70 72 28 58 29 20 41 4e 44 20  (N) expr(X) AND 
65f0: 65 78 70 72 28 59 29 2e 20 5b 42 45 54 57 45 45  expr(Y). [BETWEE
6600: 4e 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  N] {.  ExprList 
6610: 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
6620: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
6630: 2c 20 58 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74  , X, 0);.  pList
6640: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6650: 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20  stAppend(pList, 
6660: 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c  Y, 0);.  A = sql
6670: 69 74 65 33 45 78 70 72 28 54 4b 5f 42 45 54 57  ite3Expr(TK_BETW
6680: 45 45 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a 20  EEN, W, 0, 0);. 
6690: 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41 2d   if( A ){.    A-
66a0: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
66b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
66c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
66d0: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 7d 20 0a  te(pList);.  } .
66e0: 20 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73 71    if( N ) A = sq
66f0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f 54  lite3Expr(TK_NOT
6700: 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , A, 0, 0);.  sq
6710: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
6720: 26 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70 61  &W->span,&Y->spa
6730: 6e 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53 51  n);.}.%ifndef SQ
6740: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6750: 52 59 0a 20 20 25 74 79 70 65 20 69 6e 5f 6f 70  RY.  %type in_op
6760: 20 7b 69 6e 74 7d 0a 20 20 69 6e 5f 6f 70 28 41   {int}.  in_op(A
6770: 29 20 3a 3a 3d 20 49 4e 2e 20 20 20 20 20 20 7b  ) ::= IN.      {
6780: 41 20 3d 20 30 3b 7d 0a 20 20 69 6e 5f 6f 70 28  A = 0;}.  in_op(
6790: 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e 2e 20 20  A) ::= NOT IN.  
67a0: 7b 41 20 3d 20 31 3b 7d 0a 20 20 65 78 70 72 28  {A = 1;}.  expr(
67b0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69  A) ::= expr(X) i
67c0: 6e 5f 6f 70 28 4e 29 20 4c 50 20 65 78 70 72 6c  n_op(N) LP exprl
67d0: 69 73 74 28 59 29 20 52 50 28 45 29 2e 20 5b 49  ist(Y) RP(E). [I
67e0: 4e 5d 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c  N] {.    A = sql
67f0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20  ite3Expr(TK_IN, 
6800: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  X, 0, 0);.    if
6810: 28 20 41 20 29 7b 0a 20 20 20 20 20 20 41 2d 3e  ( A ){.      A->
6820: 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 20 20 7d  pList = Y;.    }
6830: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
6840: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
6850: 65 28 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(Y);.    }.    
6860: 69 66 28 20 4e 20 29 20 41 20 3d 20 73 71 6c 69  if( N ) A = sqli
6870: 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20  te3Expr(TK_NOT, 
6880: 41 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  A, 0, 0);.    sq
6890: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
68a0: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 20 20  &X->span,&E);.  
68b0: 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.  expr(A) ::= 
68c0: 4c 50 28 42 29 20 73 65 6c 65 63 74 28 58 29 20  LP(B) select(X) 
68d0: 52 50 28 45 29 2e 20 7b 0a 20 20 20 20 41 20 3d  RP(E). {.    A =
68e0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
68f0: 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29  SELECT, 0, 0, 0)
6900: 3b 0a 20 20 20 20 69 66 28 20 41 20 29 7b 0a 20  ;.    if( A ){. 
6910: 20 20 20 20 20 41 2d 3e 70 53 65 6c 65 63 74 20       A->pSelect 
6920: 3d 20 58 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = X;.    }else{.
6930: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
6940: 65 63 74 44 65 6c 65 74 65 28 58 29 3b 0a 20 20  ectDelete(X);.  
6950: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
6960: 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45 29  xprSpan(A,&B,&E)
6970: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20  ;.  }.  expr(A) 
6980: 3a 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f 6f  ::= expr(X) in_o
6990: 70 28 4e 29 20 4c 50 20 73 65 6c 65 63 74 28 59  p(N) LP select(Y
69a0: 29 20 52 50 28 45 29 2e 20 20 5b 49 4e 5d 20 7b  ) RP(E).  [IN] {
69b0: 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33  .    A = sqlite3
69c0: 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20 30  Expr(TK_IN, X, 0
69d0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 41 20  , 0);.    if( A 
69e0: 29 7b 0a 20 20 20 20 20 20 41 2d 3e 70 53 65 6c  ){.      A->pSel
69f0: 65 63 74 20 3d 20 59 3b 0a 20 20 20 20 7d 65 6c  ect = Y;.    }el
6a00: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
6a10: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 59 29  3SelectDelete(Y)
6a20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6a30: 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33 45  N ) A = sqlite3E
6a40: 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30  xpr(TK_NOT, A, 0
6a50: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6a60: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  3ExprSpan(A,&X->
6a70: 73 70 61 6e 2c 26 45 29 3b 0a 20 20 7d 0a 20 20  span,&E);.  }.  
6a80: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
6a90: 28 58 29 20 69 6e 5f 6f 70 28 4e 29 20 6e 6d 28  (X) in_op(N) nm(
6aa0: 59 29 20 64 62 6e 6d 28 5a 29 2e 20 5b 49 4e 5d  Y) dbnm(Z). [IN]
6ab0: 20 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a   {.    SrcList *
6ac0: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72  pSrc = sqlite3Sr
6ad0: 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59  cListAppend(0,&Y
6ae0: 2c 26 5a 29 3b 0a 20 20 20 20 41 20 3d 20 73 71  ,&Z);.    A = sq
6af0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c  lite3Expr(TK_IN,
6b00: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   X, 0, 0);.    i
6b10: 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20 41 2d  f( A ){.      A-
6b20: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
6b30: 65 33 53 65 6c 65 63 74 4e 65 77 28 30 2c 70 53  e3SelectNew(0,pS
6b40: 72 63 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  rc,0,0,0,0,0,0,0
6b50: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6b60: 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
6b70: 73 74 44 65 6c 65 74 65 28 70 53 72 63 29 3b 0a  stDelete(pSrc);.
6b80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 4e 20      }.    if( N 
6b90: 29 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ) A = sqlite3Exp
6ba0: 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20  r(TK_NOT, A, 0, 
6bb0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
6bc0: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
6bd0: 61 6e 2c 5a 2e 7a 3f 26 5a 3a 26 59 29 3b 0a 20  an,Z.z?&Z:&Y);. 
6be0: 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d   }.  expr(A) ::=
6bf0: 20 45 58 49 53 54 53 28 42 29 20 4c 50 20 73 65   EXISTS(B) LP se
6c00: 6c 65 63 74 28 59 29 20 52 50 28 45 29 2e 20 7b  lect(Y) RP(E). {
6c10: 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20 41  .    Expr *p = A
6c20: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
6c30: 4b 5f 45 58 49 53 54 53 2c 20 30 2c 20 30 2c 20  K_EXISTS, 0, 0, 
6c40: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  0);.    if( p ){
6c50: 0a 20 20 20 20 20 20 70 2d 3e 70 53 65 6c 65 63  .      p->pSelec
6c60: 74 20 3d 20 59 3b 0a 20 20 20 20 20 20 73 71 6c  t = Y;.      sql
6c70: 69 74 65 33 45 78 70 72 53 70 61 6e 28 70 2c 26  ite3ExprSpan(p,&
6c80: 42 2c 26 45 29 3b 0a 20 20 20 20 7d 65 6c 73 65  B,&E);.    }else
6c90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
6ca0: 65 6c 65 63 74 44 65 6c 65 74 65 28 59 29 3b 0a  electDelete(Y);.
6cb0: 20 20 20 20 7d 0a 20 20 7d 0a 25 65 6e 64 69 66      }.  }.%endif
6cc0: 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   // SQLITE_OMIT_
6cd0: 53 55 42 51 55 45 52 59 0a 0a 2f 2a 20 43 41 53  SUBQUERY../* CAS
6ce0: 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f  E expressions */
6cf0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53  .expr(A) ::= CAS
6d00: 45 28 43 29 20 63 61 73 65 5f 6f 70 65 72 61 6e  E(C) case_operan
6d10: 64 28 58 29 20 63 61 73 65 5f 65 78 70 72 6c 69  d(X) case_exprli
6d20: 73 74 28 59 29 20 63 61 73 65 5f 65 6c 73 65 28  st(Y) case_else(
6d30: 5a 29 20 45 4e 44 28 45 29 2e 20 7b 0a 20 20 41  Z) END(E). {.  A
6d40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
6d50: 4b 5f 43 41 53 45 2c 20 58 2c 20 5a 2c 20 30 29  K_CASE, X, Z, 0)
6d60: 3b 0a 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20  ;.  if( A ){.   
6d70: 20 41 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20   A->pList = Y;. 
6d80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
6d90: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
6da0: 65 28 59 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  e(Y);.  }.  sqli
6db0: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26  te3ExprSpan(A, &
6dc0: 43 2c 20 26 45 29 3b 0a 7d 0a 25 74 79 70 65 20  C, &E);.}.%type 
6dd0: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 45  case_exprlist {E
6de0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
6df0: 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70 72 6c  uctor case_exprl
6e00: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
6e10: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
6e20: 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41  .case_exprlist(A
6e30: 29 20 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c  ) ::= case_exprl
6e40: 69 73 74 28 58 29 20 57 48 45 4e 20 65 78 70 72  ist(X) WHEN expr
6e50: 28 59 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29  (Y) THEN expr(Z)
6e60: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
6e70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6e80: 58 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20  X, Y, 0);.  A = 
6e90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6ea0: 70 70 65 6e 64 28 41 2c 20 5a 2c 20 30 29 3b 0a  ppend(A, Z, 0);.
6eb0: 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28  }.case_exprlist(
6ec0: 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72  A) ::= WHEN expr
6ed0: 28 59 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29  (Y) THEN expr(Z)
6ee0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
6ef0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6f00: 30 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20  0, Y, 0);.  A = 
6f10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6f20: 70 70 65 6e 64 28 41 2c 20 5a 2c 20 30 29 3b 0a  ppend(A, Z, 0);.
6f30: 7d 0a 25 74 79 70 65 20 63 61 73 65 5f 65 6c 73  }.%type case_els
6f40: 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72  e {Expr*}.%destr
6f50: 75 63 74 6f 72 20 63 61 73 65 5f 65 6c 73 65 20  uctor case_else 
6f60: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
6f70: 74 65 28 24 24 29 3b 7d 0a 63 61 73 65 5f 65 6c  te($$);}.case_el
6f80: 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53 45 20  se(A) ::=  ELSE 
6f90: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20  expr(X).        
6fa0: 20 7b 41 20 3d 20 58 3b 7d 0a 63 61 73 65 5f 65   {A = X;}.case_e
6fb0: 6c 73 65 28 41 29 20 3a 3a 3d 20 20 2e 20 20 20  lse(A) ::=  .   
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 25 74 79 70    {A = 0;} .%typ
6fe0: 65 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b  e case_operand {
6ff0: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
7000: 6f 72 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 20  or case_operand 
7010: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
7020: 74 65 28 24 24 29 3b 7d 0a 63 61 73 65 5f 6f 70  te($$);}.case_op
7030: 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 65 78 70  erand(A) ::= exp
7040: 72 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  r(X).           
7050: 20 7b 41 20 3d 20 58 3b 7d 20 0a 63 61 73 65 5f   {A = X;} .case_
7060: 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 2e  operand(A) ::= .
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25 74     {A = 0;} ..%t
7090: 79 70 65 20 65 78 70 72 6c 69 73 74 20 7b 45 78  ype exprlist {Ex
70a0: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
70b0: 63 74 6f 72 20 65 78 70 72 6c 69 73 74 20 7b 73  ctor exprlist {s
70c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
70d0: 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65  lete($$);}.%type
70e0: 20 65 78 70 72 69 74 65 6d 20 7b 45 78 70 72 2a   expritem {Expr*
70f0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78  }.%destructor ex
7100: 70 72 69 74 65 6d 20 7b 73 71 6c 69 74 65 33 45  pritem {sqlite3E
7110: 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  xprDelete($$);}.
7120: 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  .exprlist(A) ::=
7130: 20 65 78 70 72 6c 69 73 74 28 58 29 20 43 4f 4d   exprlist(X) COM
7140: 4d 41 20 65 78 70 72 69 74 65 6d 28 59 29 2e 20  MA expritem(Y). 
7150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7170: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
7180: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
7190: 65 6e 64 28 58 2c 59 2c 30 29 3b 7d 0a 65 78 70  end(X,Y,0);}.exp
71a0: 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70  rlist(A) ::= exp
71b0: 72 69 74 65 6d 28 58 29 2e 20 20 20 20 20 20 20  ritem(X).       
71c0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
71d0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
71e0: 30 2c 58 2c 30 29 3b 7d 0a 65 78 70 72 69 74 65  0,X,0);}.exprite
71f0: 6d 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  m(A) ::= expr(X)
7200: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7210: 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72 69 74   {A = X;}.exprit
7220: 65 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  em(A) ::= .     
7230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7240: 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f    {A = 0;}..////
7250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52  ///////// The CR
7270: 45 41 54 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61  EATE INDEX comma
7280: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
7290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
72a0: 64 20 3a 3a 3d 20 43 52 45 41 54 45 28 53 29 20  d ::= CREATE(S) 
72b0: 75 6e 69 71 75 65 66 6c 61 67 28 55 29 20 49 4e  uniqueflag(U) IN
72c0: 44 45 58 20 69 66 6e 6f 74 65 78 69 73 74 73 28  DEX ifnotexists(
72d0: 4e 45 29 20 6e 6d 28 58 29 20 64 62 6e 6d 28 44  NE) nm(X) dbnm(D
72e0: 29 0a 20 20 20 20 20 20 20 20 4f 4e 20 6e 6d 28  ).        ON nm(
72f0: 59 29 20 4c 50 20 69 64 78 6c 69 73 74 28 5a 29  Y) LP idxlist(Z)
7300: 20 52 50 28 45 29 2e 20 7b 0a 20 20 73 71 6c 69   RP(E). {.  sqli
7310: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
7320: 50 61 72 73 65 2c 20 26 58 2c 20 26 44 2c 20 73  Parse, &X, &D, s
7330: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
7340: 65 6e 64 28 30 2c 26 59 2c 30 29 2c 20 5a 2c 20  end(0,&Y,0), Z, 
7350: 55 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  U,.             
7360: 20 20 20 20 20 20 20 20 20 26 53 2c 20 26 45 2c           &S, &E,
7370: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 2c 20   SQLITE_SO_ASC, 
7380: 4e 45 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 75 6e  NE);.}..%type un
7390: 69 71 75 65 66 6c 61 67 20 7b 69 6e 74 7d 0a 75  iqueflag {int}.u
73a0: 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d  niqueflag(A) ::=
73b0: 20 55 4e 49 51 55 45 2e 20 20 7b 41 20 3d 20 4f   UNIQUE.  {A = O
73c0: 45 5f 41 62 6f 72 74 3b 7d 0a 75 6e 69 71 75 65  E_Abort;}.unique
73d0: 66 6c 61 67 28 41 29 20 3a 3a 3d 20 2e 20 20 20  flag(A) ::= .   
73e0: 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 4e 6f 6e       {A = OE_Non
73f0: 65 3b 7d 0a 0a 25 74 79 70 65 20 69 64 78 6c 69  e;}..%type idxli
7400: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
7410: 64 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c 69  destructor idxli
7420: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
7430: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
7440: 25 74 79 70 65 20 69 64 78 6c 69 73 74 5f 6f 70  %type idxlist_op
7450: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
7460: 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c 69 73  estructor idxlis
7470: 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  t_opt {sqlite3Ex
7480: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
7490: 3b 7d 0a 25 74 79 70 65 20 69 64 78 69 74 65 6d  ;}.%type idxitem
74a0: 20 7b 54 6f 6b 65 6e 7d 0a 0a 69 64 78 6c 69 73   {Token}..idxlis
74b0: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  t_opt(A) ::= .  
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
74e0: 69 64 78 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  idxlist_opt(A) :
74f0: 3a 3d 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29  := LP idxlist(X)
7500: 20 52 50 2e 20 20 20 20 20 20 20 20 20 7b 41 20   RP.         {A 
7510: 3d 20 58 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29  = X;}.idxlist(A)
7520: 20 3a 3a 3d 20 69 64 78 6c 69 73 74 28 58 29 20   ::= idxlist(X) 
7530: 43 4f 4d 4d 41 20 69 64 78 69 74 65 6d 28 59 29  COMMA idxitem(Y)
7540: 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74   collate(C) sort
7550: 6f 72 64 65 72 28 5a 29 2e 20 20 7b 0a 20 20 45  order(Z).  {.  E
7560: 78 70 72 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66  xpr *p = 0;.  if
7570: 28 20 43 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 70  ( C.n>0 ){.    p
7580: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
7590: 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20  K_COLUMN, 0, 0, 
75a0: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  0);.    if( p ) 
75b0: 70 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  p->pColl = sqlit
75c0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
75d0: 70 50 61 72 73 65 2c 20 28 63 68 61 72 2a 29 43  pParse, (char*)C
75e0: 2e 7a 2c 20 43 2e 6e 29 3b 0a 20 20 7d 0a 20 20  .z, C.n);.  }.  
75f0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
7600: 69 73 74 41 70 70 65 6e 64 28 58 2c 20 70 2c 20  istAppend(X, p, 
7610: 26 59 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41  &Y);.  if( A ) A
7620: 2d 3e 61 5b 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e  ->a[A->nExpr-1].
7630: 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a 3b 0a 7d  sortOrder = Z;.}
7640: 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20  .idxlist(A) ::= 
7650: 69 64 78 69 74 65 6d 28 59 29 20 63 6f 6c 6c 61  idxitem(Y) colla
7660: 74 65 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28  te(C) sortorder(
7670: 5a 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 70 20  Z). {.  Expr *p 
7680: 3d 20 30 3b 0a 20 20 69 66 28 20 43 2e 6e 3e 30  = 0;.  if( C.n>0
7690: 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   ){.    p = sqli
76a0: 74 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55 4d  te3Expr(TK_COLUM
76b0: 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  N, 0, 0, 0);.   
76c0: 20 69 66 28 20 70 20 29 20 70 2d 3e 70 43 6f 6c   if( p ) p->pCol
76d0: 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74  l = sqlite3Locat
76e0: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
76f0: 20 28 63 68 61 72 2a 29 43 2e 7a 2c 20 43 2e 6e   (char*)C.z, C.n
7700: 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c  );.  }.  A = sql
7710: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
7720: 6e 64 28 30 2c 20 70 2c 20 26 59 29 3b 0a 20 20  nd(0, p, &Y);.  
7730: 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e  if( A ) A->a[A->
7740: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
7750: 65 72 20 3d 20 5a 3b 0a 7d 0a 69 64 78 69 74 65  er = Z;.}.idxite
7760: 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20  m(A) ::= nm(X). 
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
7780: 3d 20 58 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  = X;}...////////
7790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
77a0: 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20 49  ///// The DROP I
77b0: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  NDEX command ///
77c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
77d0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
77e0: 3d 20 44 52 4f 50 20 49 4e 44 45 58 20 69 66 65  = DROP INDEX ife
77f0: 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d  xists(E) fullnam
7800: 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74 65 33  e(X).   {sqlite3
7810: 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72 73 65  DropIndex(pParse
7820: 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f 2f 2f  , X, E);}../////
7830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7840: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56 41 43  //////// The VAC
7850: 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  UUM command ////
7860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
7880: 20 3a 3a 3d 20 56 41 43 55 55 4d 2e 20 20 20 20   ::= VACUUM.    
7890: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
78a0: 69 74 65 33 56 61 63 75 75 6d 28 70 50 61 72 73  ite3Vacuum(pPars
78b0: 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41 43  e);}.cmd ::= VAC
78c0: 55 55 4d 20 6e 6d 2e 20 20 20 20 20 20 20 20 20  UUM nm.         
78d0: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63 75      {sqlite3Vacu
78e0: 75 6d 28 70 50 61 72 73 65 29 3b 7d 0a 0a 2f 2f  um(pParse);}..//
78f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
7910: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 2f  PRAGMA command /
7920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
7940: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
7950: 4d 49 54 5f 50 52 41 47 4d 41 0a 63 6d 64 20 3a  MIT_PRAGMA.cmd :
7960: 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20  := PRAGMA nm(X) 
7970: 64 62 6e 6d 28 5a 29 20 45 51 20 6e 6d 28 59 29  dbnm(Z) EQ nm(Y)
7980: 2e 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d  .  {sqlite3Pragm
7990: 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26  a(pParse,&X,&Z,&
79a0: 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50  Y,0);}.cmd ::= P
79b0: 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d  RAGMA nm(X) dbnm
79c0: 28 5a 29 20 45 51 20 4f 4e 28 59 29 2e 20 20 7b  (Z) EQ ON(Y).  {
79d0: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50  sqlite3Pragma(pP
79e0: 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29  arse,&X,&Z,&Y,0)
79f0: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  ;}.cmd ::= PRAGM
7a00: 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20  A nm(X) dbnm(Z) 
7a10: 45 51 20 70 6c 75 73 5f 6e 75 6d 28 59 29 2e 20  EQ plus_num(Y). 
7a20: 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70  {sqlite3Pragma(p
7a30: 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30  Parse,&X,&Z,&Y,0
7a40: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  );}.cmd ::= PRAG
7a50: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
7a60: 20 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29   EQ minus_num(Y)
7a70: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 50 72 61  . {.  sqlite3Pra
7a80: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
7a90: 2c 26 59 2c 31 29 3b 0a 7d 0a 63 6d 64 20 3a 3a  ,&Y,1);.}.cmd ::
7aa0: 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64  = PRAGMA nm(X) d
7ab0: 62 6e 6d 28 5a 29 20 4c 50 20 6e 6d 28 59 29 20  bnm(Z) LP nm(Y) 
7ac0: 52 50 2e 20 7b 73 71 6c 69 74 65 33 50 72 61 67  RP. {sqlite3Prag
7ad0: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
7ae0: 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  &Y,0);}.cmd ::= 
7af0: 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e  PRAGMA nm(X) dbn
7b00: 6d 28 5a 29 2e 20 20 20 20 20 20 20 20 20 20 20  m(Z).           
7b10: 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61    {sqlite3Pragma
7b20: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 30 2c  (pParse,&X,&Z,0,
7b30: 30 29 3b 7d 0a 25 65 6e 64 69 66 20 2f 2f 20 53  0);}.%endif // S
7b40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
7b50: 41 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a  A.plus_num(A) ::
7b60: 3d 20 70 6c 75 73 5f 6f 70 74 20 6e 75 6d 62 65  = plus_opt numbe
7b70: 72 28 58 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d  r(X).   {A = X;}
7b80: 0a 6d 69 6e 75 73 5f 6e 75 6d 28 41 29 20 3a 3a  .minus_num(A) ::
7b90: 3d 20 4d 49 4e 55 53 20 6e 75 6d 62 65 72 28 58  = MINUS number(X
7ba0: 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a  ).     {A = X;}.
7bb0: 6e 75 6d 62 65 72 28 41 29 20 3a 3a 3d 20 49 4e  number(A) ::= IN
7bc0: 54 45 47 45 52 7c 46 4c 4f 41 54 28 58 29 2e 20  TEGER|FLOAT(X). 
7bd0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 70        {A = X;}.p
7be0: 6c 75 73 5f 6f 70 74 20 3a 3a 3d 20 50 4c 55 53  lus_opt ::= PLUS
7bf0: 2e 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d 20 2e  ..plus_opt ::= .
7c00: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
7c10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
7c20: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
7c30: 52 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  R command //////
7c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
7c50: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
7c60: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 63 6d  OMIT_TRIGGER..cm
7c70: 64 20 3a 3a 3d 20 43 52 45 41 54 45 20 74 72 69  d ::= CREATE tri
7c80: 67 67 65 72 5f 64 65 63 6c 28 41 29 20 42 45 47  gger_decl(A) BEG
7c90: 49 4e 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c  IN trigger_cmd_l
7ca0: 69 73 74 28 53 29 20 45 4e 44 28 5a 29 2e 20 7b  ist(S) END(Z). {
7cb0: 0a 20 20 54 6f 6b 65 6e 20 61 6c 6c 3b 0a 20 20  .  Token all;.  
7cc0: 61 6c 6c 2e 7a 20 3d 20 41 2e 7a 3b 0a 20 20 61  all.z = A.z;.  a
7cd0: 6c 6c 2e 6e 20 3d 20 28 5a 2e 7a 20 2d 20 41 2e  ll.n = (Z.z - A.
7ce0: 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71 6c 69  z) + Z.n;.  sqli
7cf0: 74 65 33 46 69 6e 69 73 68 54 72 69 67 67 65 72  te3FinishTrigger
7d00: 28 70 50 61 72 73 65 2c 20 53 2c 20 26 61 6c 6c  (pParse, S, &all
7d10: 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72 5f 64 65  );.}..trigger_de
7d20: 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d 70 28 54  cl(A) ::= temp(T
7d30: 29 20 54 52 49 47 47 45 52 20 6e 6d 28 42 29 20  ) TRIGGER nm(B) 
7d40: 64 62 6e 6d 28 5a 29 20 74 72 69 67 67 65 72 5f  dbnm(Z) trigger_
7d50: 74 69 6d 65 28 43 29 0a 20 20 20 20 20 20 20 20  time(C).        
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 69 67              trig
7d70: 67 65 72 5f 65 76 65 6e 74 28 44 29 0a 20 20 20  ger_event(D).   
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 4f 4e 20 66 75 6c 6c 6e 61 6d 65 28 45 29 20   ON fullname(E) 
7da0: 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28 46  foreach_clause(F
7db0: 29 20 77 68 65 6e 5f 63 6c 61 75 73 65 28 47 29  ) when_clause(G)
7dc0: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 42 65 67  . {.  sqlite3Beg
7dd0: 69 6e 54 72 69 67 67 65 72 28 70 50 61 72 73 65  inTrigger(pParse
7de0: 2c 20 26 42 2c 20 26 5a 2c 20 43 2c 20 44 2e 61  , &B, &Z, C, D.a
7df0: 2c 20 44 2e 62 2c 20 45 2c 20 46 2c 20 47 2c 20  , D.b, E, F, G, 
7e00: 54 29 3b 0a 20 20 41 20 3d 20 28 5a 2e 6e 3d 3d  T);.  A = (Z.n==
7e10: 30 3f 42 3a 5a 29 3b 0a 7d 0a 0a 25 74 79 70 65  0?B:Z);.}..%type
7e20: 20 74 72 69 67 67 65 72 5f 74 69 6d 65 20 20 7b   trigger_time  {
7e30: 69 6e 74 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d  int}.trigger_tim
7e40: 65 28 41 29 20 3a 3a 3d 20 42 45 46 4f 52 45 2e  e(A) ::= BEFORE.
7e50: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42        { A = TK_B
7e60: 45 46 4f 52 45 3b 20 7d 0a 74 72 69 67 67 65 72  EFORE; }.trigger
7e70: 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 41 46 54  _time(A) ::= AFT
7e80: 45 52 2e 20 20 20 20 20 20 20 7b 20 41 20 3d 20  ER.       { A = 
7e90: 54 4b 5f 41 46 54 45 52 3b 20 20 7d 0a 74 72 69  TK_AFTER;  }.tri
7ea0: 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d  gger_time(A) ::=
7eb0: 20 49 4e 53 54 45 41 44 20 4f 46 2e 20 20 7b 20   INSTEAD OF.  { 
7ec0: 41 20 3d 20 54 4b 5f 49 4e 53 54 45 41 44 3b 7d  A = TK_INSTEAD;}
7ed0: 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29  .trigger_time(A)
7ee0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
7ef0: 20 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46 4f 52    { A = TK_BEFOR
7f00: 45 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67  E; }..%type trig
7f10: 67 65 72 5f 65 76 65 6e 74 20 7b 73 74 72 75 63  ger_event {struc
7f20: 74 20 54 72 69 67 45 76 65 6e 74 7d 0a 25 64 65  t TrigEvent}.%de
7f30: 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72  structor trigger
7f40: 5f 65 76 65 6e 74 20 7b 73 71 6c 69 74 65 33 49  _event {sqlite3I
7f50: 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24 2e 62  dListDelete($$.b
7f60: 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e  );}.trigger_even
7f70: 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 7c  t(A) ::= DELETE|
7f80: 49 4e 53 45 52 54 28 4f 50 29 2e 20 20 20 20 20  INSERT(OP).     
7f90: 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b 20 41 2e    {A.a = @OP; A.
7fa0: 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f  b = 0;}.trigger_
7fb0: 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44  event(A) ::= UPD
7fc0: 41 54 45 28 4f 50 29 2e 20 20 20 20 20 20 20 20  ATE(OP).        
7fd0: 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50        {A.a = @OP
7fe0: 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67  ; A.b = 0;}.trig
7ff0: 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d  ger_event(A) ::=
8000: 20 55 50 44 41 54 45 20 4f 46 20 69 6e 73 63 6f   UPDATE OF insco
8010: 6c 6c 69 73 74 28 58 29 2e 20 7b 41 2e 61 20 3d  llist(X). {A.a =
8020: 20 54 4b 5f 55 50 44 41 54 45 3b 20 41 2e 62 20   TK_UPDATE; A.b 
8030: 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 66 6f 72  = X;}..%type for
8040: 65 61 63 68 5f 63 6c 61 75 73 65 20 7b 69 6e 74  each_clause {int
8050: 7d 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65  }.foreach_clause
8060: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
8070: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
8080: 3d 20 54 4b 5f 52 4f 57 3b 20 7d 0a 66 6f 72 65  = TK_ROW; }.fore
8090: 61 63 68 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a  ach_clause(A) ::
80a0: 3d 20 46 4f 52 20 45 41 43 48 20 52 4f 57 2e 20  = FOR EACH ROW. 
80b0: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 52        { A = TK_R
80c0: 4f 57 3b 20 7d 0a 66 6f 72 65 61 63 68 5f 63 6c  OW; }.foreach_cl
80d0: 61 75 73 65 28 41 29 20 3a 3a 3d 20 46 4f 52 20  ause(A) ::= FOR 
80e0: 45 41 43 48 20 53 54 41 54 45 4d 45 4e 54 2e 20  EACH STATEMENT. 
80f0: 7b 20 41 20 3d 20 54 4b 5f 53 54 41 54 45 4d 45  { A = TK_STATEME
8100: 4e 54 3b 20 7d 0a 0a 25 74 79 70 65 20 77 68 65  NT; }..%type whe
8110: 6e 5f 63 6c 61 75 73 65 20 7b 45 78 70 72 2a 7d  n_clause {Expr*}
8120: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77 68 65  .%destructor whe
8130: 6e 5f 63 6c 61 75 73 65 20 7b 73 71 6c 69 74 65  n_clause {sqlite
8140: 33 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b  3ExprDelete($$);
8150: 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28 41 29  }.when_clause(A)
8160: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
8170: 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 77 68     { A = 0; }.wh
8180: 65 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d  en_clause(A) ::=
8190: 20 57 48 45 4e 20 65 78 70 72 28 58 29 2e 20 7b   WHEN expr(X). {
81a0: 20 41 20 3d 20 58 3b 20 7d 0a 0a 25 74 79 70 65   A = X; }..%type
81b0: 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73   trigger_cmd_lis
81c0: 74 20 7b 54 72 69 67 67 65 72 53 74 65 70 2a 7d  t {TriggerStep*}
81d0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72 69  .%destructor tri
81e0: 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 73  gger_cmd_list {s
81f0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
8200: 67 65 72 53 74 65 70 28 24 24 29 3b 7d 0a 74 72  gerStep($$);}.tr
8210: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41  igger_cmd_list(A
8220: 29 20 3a 3a 3d 20 74 72 69 67 67 65 72 5f 63 6d  ) ::= trigger_cm
8230: 64 5f 6c 69 73 74 28 59 29 20 74 72 69 67 67 65  d_list(Y) trigge
8240: 72 5f 63 6d 64 28 58 29 20 53 45 4d 49 2e 20 7b  r_cmd(X) SEMI. {
8250: 0a 20 20 69 66 28 20 59 20 29 7b 0a 20 20 20 20  .  if( Y ){.    
8260: 59 2d 3e 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20  Y->pLast->pNext 
8270: 3d 20 58 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = X;.  }else{.  
8280: 20 20 59 20 3d 20 58 3b 0a 20 20 7d 0a 20 20 59    Y = X;.  }.  Y
8290: 2d 3e 70 4c 61 73 74 20 3d 20 58 3b 0a 20 20 41  ->pLast = X;.  A
82a0: 20 3d 20 59 3b 0a 7d 0a 74 72 69 67 67 65 72 5f   = Y;.}.trigger_
82b0: 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20  cmd_list(A) ::= 
82c0: 2e 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 0a 25 74  . { A = 0; }..%t
82d0: 79 70 65 20 74 72 69 67 67 65 72 5f 63 6d 64 20  ype trigger_cmd 
82e0: 7b 54 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25  {TriggerStep*}.%
82f0: 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67 67  destructor trigg
8300: 65 72 5f 63 6d 64 20 7b 73 71 6c 69 74 65 33 44  er_cmd {sqlite3D
8310: 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70  eleteTriggerStep
8320: 28 24 24 29 3b 7d 0a 2f 2f 20 55 50 44 41 54 45  ($$);}.// UPDATE
8330: 20 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29   .trigger_cmd(A)
8340: 20 3a 3a 3d 20 55 50 44 41 54 45 20 6f 72 63 6f   ::= UPDATE orco
8350: 6e 66 28 52 29 20 6e 6d 28 58 29 20 53 45 54 20  nf(R) nm(X) SET 
8360: 73 65 74 6c 69 73 74 28 59 29 20 77 68 65 72 65  setlist(Y) where
8370: 5f 6f 70 74 28 5a 29 2e 20 20 0a 20 20 20 20 20  _opt(Z).  .     
8380: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
8390: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 55 70  sqlite3TriggerUp
83a0: 64 61 74 65 53 74 65 70 28 26 58 2c 20 59 2c 20  dateStep(&X, Y, 
83b0: 5a 2c 20 52 29 3b 20 7d 0a 0a 2f 2f 20 49 4e 53  Z, R); }..// INS
83c0: 45 52 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28  ERT.trigger_cmd(
83d0: 41 29 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d  A) ::= insert_cm
83e0: 64 28 52 29 20 49 4e 54 4f 20 6e 6d 28 58 29 20  d(R) INTO nm(X) 
83f0: 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46  inscollist_opt(F
8400: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
8410: 20 20 20 20 20 20 56 41 4c 55 45 53 20 4c 50 20        VALUES LP 
8420: 69 74 65 6d 6c 69 73 74 28 59 29 20 52 50 2e 20  itemlist(Y) RP. 
8430: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8440: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69   {A = sqlite3Tri
8450: 67 67 65 72 49 6e 73 65 72 74 53 74 65 70 28 26  ggerInsertStep(&
8460: 58 2c 20 46 2c 20 59 2c 20 30 2c 20 52 29 3b 7d  X, F, Y, 0, R);}
8470: 0a 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  ..trigger_cmd(A)
8480: 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28   ::= insert_cmd(
8490: 52 29 20 49 4e 54 4f 20 6e 6d 28 58 29 20 69 6e  R) INTO nm(X) in
84a0: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20  scollist_opt(F) 
84b0: 73 65 6c 65 63 74 28 53 29 2e 0a 20 20 20 20 20  select(S)..     
84c0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
84d0: 71 6c 69 74 65 33 54 72 69 67 67 65 72 49 6e 73  qlite3TriggerIns
84e0: 65 72 74 53 74 65 70 28 26 58 2c 20 46 2c 20 30  ertStep(&X, F, 0
84f0: 2c 20 53 2c 20 52 29 3b 7d 0a 0a 2f 2f 20 44 45  , S, R);}..// DE
8500: 4c 45 54 45 0a 74 72 69 67 67 65 72 5f 63 6d 64  LETE.trigger_cmd
8510: 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46  (A) ::= DELETE F
8520: 52 4f 4d 20 6e 6d 28 58 29 20 77 68 65 72 65 5f  ROM nm(X) where_
8530: 6f 70 74 28 59 29 2e 0a 20 20 20 20 20 20 20 20  opt(Y)..        
8540: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
8550: 74 65 33 54 72 69 67 67 65 72 44 65 6c 65 74 65  te3TriggerDelete
8560: 53 74 65 70 28 26 58 2c 20 59 29 3b 7d 0a 0a 2f  Step(&X, Y);}../
8570: 2f 20 53 45 4c 45 43 54 0a 74 72 69 67 67 65 72  / SELECT.trigger
8580: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 73 65 6c 65  _cmd(A) ::= sele
8590: 63 74 28 58 29 2e 20 20 7b 41 20 3d 20 73 71 6c  ct(X).  {A = sql
85a0: 69 74 65 33 54 72 69 67 67 65 72 53 65 6c 65 63  ite3TriggerSelec
85b0: 74 53 74 65 70 28 58 29 3b 20 7d 0a 0a 2f 2f 20  tStep(X); }..// 
85c0: 54 68 65 20 73 70 65 63 69 61 6c 20 52 41 49 53  The special RAIS
85d0: 45 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  E expression tha
85e0: 74 20 6d 61 79 20 6f 63 63 75 72 20 69 6e 20 74  t may occur in t
85f0: 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 0a  rigger programs.
8600: 65 78 70 72 28 41 29 20 3a 3a 3d 20 52 41 49 53  expr(A) ::= RAIS
8610: 45 28 58 29 20 4c 50 20 49 47 4e 4f 52 45 20 52  E(X) LP IGNORE R
8620: 50 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73  P(Y).  {.  A = s
8630: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52 41  qlite3Expr(TK_RA
8640: 49 53 45 2c 20 30 2c 20 30 2c 20 30 29 3b 20 0a  ISE, 0, 0, 0); .
8650: 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41    if( A ){.    A
8660: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 4f 45 5f 49  ->iColumn = OE_I
8670: 67 6e 6f 72 65 3b 0a 20 20 20 20 73 71 6c 69 74  gnore;.    sqlit
8680: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58  e3ExprSpan(A, &X
8690: 2c 20 26 59 29 3b 0a 20 20 7d 0a 7d 0a 65 78 70  , &Y);.  }.}.exp
86a0: 72 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 28 58  r(A) ::= RAISE(X
86b0: 29 20 4c 50 20 72 61 69 73 65 74 79 70 65 28 54  ) LP raisetype(T
86c0: 29 20 43 4f 4d 4d 41 20 6e 6d 28 5a 29 20 52 50  ) COMMA nm(Z) RP
86d0: 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71  (Y).  {.  A = sq
86e0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52 41 49  lite3Expr(TK_RAI
86f0: 53 45 2c 20 30 2c 20 30 2c 20 26 5a 29 3b 20 0a  SE, 0, 0, &Z); .
8700: 20 20 69 66 28 20 41 20 29 20 7b 0a 20 20 20 20    if( A ) {.    
8710: 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 54 3b 0a  A->iColumn = T;.
8720: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
8730: 70 61 6e 28 41 2c 20 26 58 2c 20 26 59 29 3b 0a  pan(A, &X, &Y);.
8740: 20 20 7d 0a 7d 0a 25 65 6e 64 69 66 20 2f 2f 20    }.}.%endif // 
8750: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  !SQLITE_OMIT_TRI
8760: 47 47 45 52 0a 0a 25 74 79 70 65 20 72 61 69 73  GGER..%type rais
8770: 65 74 79 70 65 20 7b 69 6e 74 7d 0a 72 61 69 73  etype {int}.rais
8780: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52 4f 4c  etype(A) ::= ROL
8790: 4c 42 41 43 4b 2e 20 20 7b 41 20 3d 20 4f 45 5f  LBACK.  {A = OE_
87a0: 52 6f 6c 6c 62 61 63 6b 3b 7d 0a 72 61 69 73 65  Rollback;}.raise
87b0: 74 79 70 65 28 41 29 20 3a 3a 3d 20 41 42 4f 52  type(A) ::= ABOR
87c0: 54 2e 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 41  T.     {A = OE_A
87d0: 62 6f 72 74 3b 7d 0a 72 61 69 73 65 74 79 70 65  bort;}.raisetype
87e0: 28 41 29 20 3a 3a 3d 20 46 41 49 4c 2e 20 20 20  (A) ::= FAIL.   
87f0: 20 20 20 7b 41 20 3d 20 4f 45 5f 46 61 69 6c 3b     {A = OE_Fail;
8800: 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }...////////////
8810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 20 44 52  ////////////  DR
8820: 4f 50 20 54 52 49 47 47 45 52 20 73 74 61 74 65  OP TRIGGER state
8830: 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ment ///////////
8840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8850: 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  ///.%ifndef SQLI
8860: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
8870: 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 52 49  cmd ::= DROP TRI
8880: 47 47 45 52 20 66 75 6c 6c 6e 61 6d 65 28 58 29  GGER fullname(X)
8890: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72 6f  . {.  sqlite3Dro
88a0: 70 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  pTrigger(pParse,
88b0: 58 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 2f 2f 20  X);.}.%endif // 
88c0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  !SQLITE_OMIT_TRI
88d0: 47 47 45 52 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  GGER..//////////
88e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41  ////////////// A
88f0: 54 54 41 43 48 20 44 41 54 41 42 41 53 45 20 66  TTACH DATABASE f
8900: 69 6c 65 20 41 53 20 6e 61 6d 65 20 2f 2f 2f 2f  ile AS name ////
8910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8920: 2f 2f 2f 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 41 54  /////.cmd ::= AT
8930: 54 41 43 48 20 64 61 74 61 62 61 73 65 5f 6b 77  TACH database_kw
8940: 5f 6f 70 74 20 65 78 70 72 28 46 29 20 41 53 20  _opt expr(F) AS 
8950: 65 78 70 72 28 44 29 20 6b 65 79 5f 6f 70 74 28  expr(D) key_opt(
8960: 4b 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 41  K). {.  sqlite3A
8970: 74 74 61 63 68 28 70 50 61 72 73 65 2c 20 46 2c  ttach(pParse, F,
8980: 20 44 2c 20 4b 29 3b 0a 7d 0a 25 74 79 70 65 20   D, K);.}.%type 
8990: 6b 65 79 5f 6f 70 74 20 7b 45 78 70 72 20 2a 7d  key_opt {Expr *}
89a0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79  .%destructor key
89b0: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70  _opt {sqlite3Exp
89c0: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 6b 65  rDelete($$);}.ke
89d0: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  y_opt(A) ::= .  
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89f0: 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 6b 65     { A = 0; }.ke
8a00: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4b 45 59  y_opt(A) ::= KEY
8a10: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
8a20: 20 20 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 64     { A = X; }..d
8a30: 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a  atabase_kw_opt :
8a40: 3a 3d 20 44 41 54 41 42 41 53 45 2e 0a 64 61 74  := DATABASE..dat
8a50: 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d  abase_kw_opt ::=
8a60: 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ...////////////
8a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 44 45 54  //////////// DET
8a80: 41 43 48 20 44 41 54 41 42 41 53 45 20 6e 61 6d  ACH DATABASE nam
8a90: 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  e //////////////
8aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ab0: 2f 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 45 54 41  ///.cmd ::= DETA
8ac0: 43 48 20 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f  CH database_kw_o
8ad0: 70 74 20 65 78 70 72 28 44 29 2e 20 7b 0a 20 20  pt expr(D). {.  
8ae0: 73 71 6c 69 74 65 33 44 65 74 61 63 68 28 70 50  sqlite3Detach(pP
8af0: 61 72 73 65 2c 20 44 29 3b 0a 7d 0a 0a 2f 2f 2f  arse, D);.}..///
8b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8b10: 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44 45 58 20  /////// REINDEX 
8b20: 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f  collation //////
8b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66  ////////////.%if
8b50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8b60: 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d  _REINDEX.cmd ::=
8b70: 20 52 45 49 4e 44 45 58 2e 20 20 20 20 20 20 20   REINDEX.       
8b80: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
8b90: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
8ba0: 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d   0, 0);}.cmd ::=
8bb0: 20 52 45 49 4e 44 45 58 20 6e 6d 28 58 29 20 64   REINDEX nm(X) d
8bc0: 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65  bnm(Y).  {sqlite
8bd0: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
8be0: 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69   &X, &Y);}.%endi
8bf0: 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  f../////////////
8c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c10: 2f 2f 2f 2f 2f 2f 20 41 4e 41 4c 59 5a 45 20 2f  ////// ANALYZE /
8c20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c40: 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  //.%ifndef SQLIT
8c50: 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 63  E_OMIT_ANALYZE.c
8c60: 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 2e 20  md ::= ANALYZE. 
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8c80: 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70  sqlite3Analyze(p
8c90: 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63  Parse, 0, 0);}.c
8ca0: 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 20 6e  md ::= ANALYZE n
8cb0: 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b  m(X) dbnm(Y).  {
8cc0: 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70  sqlite3Analyze(p
8cd0: 50 61 72 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d  Parse, &X, &Y);}
8ce0: 0a 25 65 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f 2f  .%endif..///////
8cf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8d00: 2f 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 61  / ALTER TABLE ta
8d10: 62 6c 65 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f  ble ... ////////
8d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8d30: 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66  ////////.%ifndef
8d40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
8d50: 45 52 54 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20  ERTABLE.cmd ::= 
8d60: 41 4c 54 45 52 20 54 41 42 4c 45 20 66 75 6c 6c  ALTER TABLE full
8d70: 6e 61 6d 65 28 58 29 20 52 45 4e 41 4d 45 20 54  name(X) RENAME T
8d80: 4f 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 73 71 6c  O nm(Z). {.  sql
8d90: 69 74 65 33 41 6c 74 65 72 52 65 6e 61 6d 65 54  ite3AlterRenameT
8da0: 61 62 6c 65 28 70 50 61 72 73 65 2c 58 2c 26 5a  able(pParse,X,&Z
8db0: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4c 54  );.}.cmd ::= ALT
8dc0: 45 52 20 54 41 42 4c 45 20 61 64 64 5f 63 6f 6c  ER TABLE add_col
8dd0: 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 41 44 44  umn_fullname ADD
8de0: 20 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63 6f   kwcolumn_opt co
8df0: 6c 75 6d 6e 28 59 29 2e 20 7b 0a 20 20 73 71 6c  lumn(Y). {.  sql
8e00: 69 74 65 33 41 6c 74 65 72 46 69 6e 69 73 68 41  ite3AlterFinishA
8e10: 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ddColumn(pParse,
8e20: 20 26 59 29 3b 0a 7d 0a 61 64 64 5f 63 6f 6c 75   &Y);.}.add_colu
8e30: 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 3a 3a 3d 20  mn_fullname ::= 
8e40: 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20  fullname(X). {. 
8e50: 20 73 71 6c 69 74 65 33 41 6c 74 65 72 42 65 67   sqlite3AlterBeg
8e60: 69 6e 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72  inAddColumn(pPar
8e70: 73 65 2c 20 58 29 3b 0a 7d 0a 6b 77 63 6f 6c 75  se, X);.}.kwcolu
8e80: 6d 6e 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 6b 77 63  mn_opt ::= ..kwc
8e90: 6f 6c 75 6d 6e 5f 6f 70 74 20 3a 3a 3d 20 43 4f  olumn_opt ::= CO
8ea0: 4c 55 4d 4e 4b 57 2e 0a 25 65 6e 64 69 66 0a     LUMNKW..%endif.