/ Hex Artifact Content
Login

Artifact 969fa5ddf747ba1034c9960cce49610c4b3fa617:


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 37 20 32 30 30 36 2f 30 32 2f 32 37 20  .197 2006/02/27 
0290: 32 31 3a 35 38 3a 30 38 20 64 72 68 20 45 78 70  21:58:08 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 29 7b 0a 20 20 20 20 41 2d 3e 66  f( D ){.    A->f
5b80: 6c 61 67 73 20 7c 3d 20 45 50 5f 44 69 73 74 69  lags |= EP_Disti
5b90: 6e 63 74 3b 0a 20 20 7d 0a 7d 0a 65 78 70 72 28  nct;.  }.}.expr(
5ba0: 41 29 20 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20  A) ::= ID(X) LP 
5bb0: 53 54 41 52 20 52 50 28 45 29 2e 20 7b 0a 20 20  STAR RP(E). {.  
5bc0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  A = sqlite3ExprF
5bd0: 75 6e 63 74 69 6f 6e 28 30 2c 20 26 58 29 3b 0a  unction(0, &X);.
5be0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
5bf0: 6e 28 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 74 65  n(A,&X,&E);.}.te
5c00: 72 6d 28 41 29 20 3a 3a 3d 20 43 54 49 4d 45 5f  rm(A) ::= CTIME_
5c10: 4b 57 28 4f 50 29 2e 20 7b 0a 20 20 2f 2a 20 54  KW(OP). {.  /* T
5c20: 68 65 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 2c  he CURRENT_TIME,
5c30: 20 43 55 52 52 45 4e 54 5f 44 41 54 45 2c 20 61   CURRENT_DATE, a
5c40: 6e 64 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 53  nd CURRENT_TIMES
5c50: 54 41 4d 50 20 76 61 6c 75 65 73 20 61 72 65 0a  TAMP values are.
5c60: 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20    ** treated as 
5c70: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  functions that r
5c80: 65 74 75 72 6e 20 63 6f 6e 73 74 61 6e 74 73 20  eturn constants 
5c90: 2a 2f 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33  */.  A = sqlite3
5ca0: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 30 2c 26  ExprFunction(0,&
5cb0: 4f 50 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41  OP);.  if( A ) A
5cc0: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4e 53 54 5f  ->op = TK_CONST_
5cd0: 46 55 4e 43 3b 20 20 0a 7d 0a 65 78 70 72 28 41  FUNC;  .}.expr(A
5ce0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 41 4e  ) ::= expr(X) AN
5cf0: 44 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  D(OP) expr(Y).  
5d00: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
5d10: 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20  qlite3Expr(@OP, 
5d20: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
5d30: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4f  A) ::= expr(X) O
5d40: 52 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  R(OP) expr(Y).  
5d50: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
5d60: 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c  sqlite3Expr(@OP,
5d70: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
5d80: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
5d90: 4c 54 7c 47 54 7c 47 45 7c 4c 45 28 4f 50 29 20  LT|GT|GE|LE(OP) 
5da0: 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d  expr(Y).    {A =
5db0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50   sqlite3Expr(@OP
5dc0: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
5dd0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
5de0: 20 45 51 7c 4e 45 28 4f 50 29 20 65 78 70 72 28   EQ|NE(OP) expr(
5df0: 59 29 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20  Y).          {A 
5e00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f  = sqlite3Expr(@O
5e10: 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78  P, X, Y, 0);}.ex
5e20: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
5e30: 29 20 42 49 54 41 4e 44 7c 42 49 54 4f 52 7c 4c  ) BITAND|BITOR|L
5e40: 53 48 49 46 54 7c 52 53 48 49 46 54 28 4f 50 29  SHIFT|RSHIFT(OP)
5e50: 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20   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 7b 41 20 3d 20 73            {A = s
5e90: 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20  qlite3Expr(@OP, 
5ea0: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
5eb0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 50  A) ::= expr(X) P
5ec0: 4c 55 53 7c 4d 49 4e 55 53 28 4f 50 29 20 65 78  LUS|MINUS(OP) ex
5ed0: 70 72 28 59 29 2e 20 20 20 20 20 7b 41 20 3d 20  pr(Y).     {A = 
5ee0: 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c  sqlite3Expr(@OP,
5ef0: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
5f00: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
5f10: 53 54 41 52 7c 53 4c 41 53 48 7c 52 45 4d 28 4f  STAR|SLASH|REM(O
5f20: 50 29 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d  P) expr(Y). {A =
5f30: 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50   sqlite3Expr(@OP
5f40: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
5f50: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
5f60: 20 43 4f 4e 43 41 54 28 4f 50 29 20 65 78 70 72   CONCAT(OP) expr
5f70: 28 59 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (Y).         {A 
5f80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f  = sqlite3Expr(@O
5f90: 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 25 74  P, X, Y, 0);}.%t
5fa0: 79 70 65 20 6c 69 6b 65 6f 70 20 7b 73 74 72 75  ype likeop {stru
5fb0: 63 74 20 4c 69 6b 65 4f 70 7d 0a 6c 69 6b 65 6f  ct LikeOp}.likeo
5fc0: 70 28 41 29 20 3a 3a 3d 20 4c 49 4b 45 5f 4b 57  p(A) ::= LIKE_KW
5fd0: 28 58 29 2e 20 20 20 20 20 7b 41 2e 65 4f 70 65  (X).     {A.eOpe
5fe0: 72 61 74 6f 72 20 3d 20 58 3b 20 41 2e 6e 6f 74  rator = X; A.not
5ff0: 20 3d 20 30 3b 7d 0a 6c 69 6b 65 6f 70 28 41 29   = 0;}.likeop(A)
6000: 20 3a 3a 3d 20 4e 4f 54 20 4c 49 4b 45 5f 4b 57   ::= NOT LIKE_KW
6010: 28 58 29 2e 20 7b 41 2e 65 4f 70 65 72 61 74 6f  (X). {A.eOperato
6020: 72 20 3d 20 58 3b 20 41 2e 6e 6f 74 20 3d 20 31  r = X; A.not = 1
6030: 3b 7d 0a 25 74 79 70 65 20 65 73 63 61 70 65 20  ;}.%type escape 
6040: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
6050: 74 6f 72 20 65 73 63 61 70 65 20 7b 73 71 6c 69  tor escape {sqli
6060: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
6070: 29 3b 7d 0a 65 73 63 61 70 65 28 58 29 20 3a 3a  );}.escape(X) ::
6080: 3d 20 45 53 43 41 50 45 20 65 78 70 72 28 41 29  = ESCAPE expr(A)
6090: 2e 20 5b 45 53 43 41 50 45 5d 20 7b 58 20 3d 20  . [ESCAPE] {X = 
60a0: 41 3b 7d 0a 65 73 63 61 70 65 28 58 29 20 3a 3a  A;}.escape(X) ::
60b0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
60c0: 20 20 5b 45 53 43 41 50 45 5d 20 7b 58 20 3d 20    [ESCAPE] {X = 
60d0: 30 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  0;}.expr(A) ::= 
60e0: 65 78 70 72 28 58 29 20 6c 69 6b 65 6f 70 28 4f  expr(X) likeop(O
60f0: 50 29 20 65 78 70 72 28 59 29 20 65 73 63 61 70  P) expr(Y) escap
6100: 65 28 45 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57 5d  e(E).  [LIKE_KW]
6110: 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a    {.  ExprList *
6120: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
6130: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
6140: 20 59 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74 20   Y, 0);.  pList 
6150: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
6160: 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 58  tAppend(pList, X
6170: 2c 20 30 29 3b 0a 20 20 69 66 28 20 45 20 29 7b  , 0);.  if( E ){
6180: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
6190: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
61a0: 6e 64 28 70 4c 69 73 74 2c 20 45 2c 20 30 29 3b  nd(pList, E, 0);
61b0: 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c 69 74  .  }.  A = sqlit
61c0: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70  e3ExprFunction(p
61d0: 4c 69 73 74 2c 20 26 4f 50 2e 65 4f 70 65 72 61  List, &OP.eOpera
61e0: 74 6f 72 29 3b 0a 20 20 69 66 28 20 4f 50 2e 6e  tor);.  if( OP.n
61f0: 6f 74 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33  ot ) A = sqlite3
6200: 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20  Expr(TK_NOT, A, 
6210: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
6220: 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58 2d 3e  ExprSpan(A, &X->
6230: 73 70 61 6e 2c 20 26 59 2d 3e 73 70 61 6e 29 3b  span, &Y->span);
6240: 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  .}..expr(A) ::= 
6250: 65 78 70 72 28 58 29 20 49 53 4e 55 4c 4c 7c 4e  expr(X) ISNULL|N
6260: 4f 54 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41  OTNULL(E). {.  A
6270: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40   = sqlite3Expr(@
6280: 45 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73  E, X, 0, 0);.  s
6290: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
62a0: 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d  ,&X->span,&E);.}
62b0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
62c0: 72 28 58 29 20 49 53 20 4e 55 4c 4c 28 45 29 2e  r(X) IS NULL(E).
62d0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
62e0: 45 78 70 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20  Expr(TK_ISNULL, 
62f0: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
6300: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58  te3ExprSpan(A,&X
6310: 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78  ->span,&E);.}.ex
6320: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
6330: 29 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20 7b  ) NOT NULL(E). {
6340: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
6350: 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58  pr(TK_NOTNULL, X
6360: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
6370: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  e3ExprSpan(A,&X-
6380: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70  >span,&E);.}.exp
6390: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
63a0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e   IS NOT NULL(E).
63b0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
63c0: 45 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c  Expr(TK_NOTNULL,
63d0: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   X, 0, 0);.  sql
63e0: 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26  ite3ExprSpan(A,&
63f0: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
6400: 78 70 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 7c 42  xpr(A) ::= NOT|B
6410: 49 54 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29  ITNOT(B) expr(X)
6420: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
6430: 33 45 78 70 72 28 40 42 2c 20 58 2c 20 30 2c 20  3Expr(@B, X, 0, 
6440: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  0);.  sqlite3Exp
6450: 72 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73  rSpan(A,&B,&X->s
6460: 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  pan);.}.expr(A) 
6470: 3a 3a 3d 20 4d 49 4e 55 53 28 42 29 20 65 78 70  ::= MINUS(B) exp
6480: 72 28 58 29 2e 20 5b 55 4d 49 4e 55 53 5d 20 7b  r(X). [UMINUS] {
6490: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
64a0: 70 72 28 54 4b 5f 55 4d 49 4e 55 53 2c 20 58 2c  pr(TK_UMINUS, X,
64b0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
64c0: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26  3ExprSpan(A,&B,&
64d0: 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72  X->span);.}.expr
64e0: 28 41 29 20 3a 3a 3d 20 50 4c 55 53 28 42 29 20  (A) ::= PLUS(B) 
64f0: 65 78 70 72 28 58 29 2e 20 5b 55 50 4c 55 53 5d  expr(X). [UPLUS]
6500: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
6510: 45 78 70 72 28 54 4b 5f 55 50 4c 55 53 2c 20 58  Expr(TK_UPLUS, X
6520: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
6530: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c  e3ExprSpan(A,&B,
6540: 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 25 74 79  &X->span);.}.%ty
6550: 70 65 20 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69  pe between_op {i
6560: 6e 74 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41  nt}.between_op(A
6570: 29 20 3a 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20  ) ::= BETWEEN.  
6580: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77     {A = 0;}.betw
6590: 65 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f  een_op(A) ::= NO
65a0: 54 20 42 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20  T BETWEEN. {A = 
65b0: 31 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  1;}.expr(A) ::= 
65c0: 65 78 70 72 28 57 29 20 62 65 74 77 65 65 6e 5f  expr(W) between_
65d0: 6f 70 28 4e 29 20 65 78 70 72 28 58 29 20 41 4e  op(N) expr(X) AN
65e0: 44 20 65 78 70 72 28 59 29 2e 20 5b 42 45 54 57  D expr(Y). [BETW
65f0: 45 45 4e 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73  EEN] {.  ExprLis
6600: 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  t *pList = sqlit
6610: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6620: 28 30 2c 20 58 2c 20 30 29 3b 0a 20 20 70 4c 69  (0, X, 0);.  pLi
6630: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
6640: 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74  ListAppend(pList
6650: 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73  , Y, 0);.  A = s
6660: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 42 45  qlite3Expr(TK_BE
6670: 54 57 45 45 4e 2c 20 57 2c 20 30 2c 20 30 29 3b  TWEEN, W, 0, 0);
6680: 0a 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20  .  if( A ){.    
6690: 41 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  A->pList = pList
66a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
66b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
66c0: 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 7d  lete(pList);.  }
66d0: 20 0a 20 20 69 66 28 20 4e 20 29 20 41 20 3d 20   .  if( N ) A = 
66e0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e  sqlite3Expr(TK_N
66f0: 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20  OT, A, 0, 0);.  
6700: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
6710: 41 2c 26 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73  A,&W->span,&Y->s
6720: 70 61 6e 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20  pan);.}.%ifndef 
6730: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6740: 55 45 52 59 0a 20 20 25 74 79 70 65 20 69 6e 5f  UERY.  %type in_
6750: 6f 70 20 7b 69 6e 74 7d 0a 20 20 69 6e 5f 6f 70  op {int}.  in_op
6760: 28 41 29 20 3a 3a 3d 20 49 4e 2e 20 20 20 20 20  (A) ::= IN.     
6770: 20 7b 41 20 3d 20 30 3b 7d 0a 20 20 69 6e 5f 6f   {A = 0;}.  in_o
6780: 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e 2e  p(A) ::= NOT IN.
6790: 20 20 7b 41 20 3d 20 31 3b 7d 0a 20 20 65 78 70    {A = 1;}.  exp
67a0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
67b0: 20 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 65 78 70   in_op(N) LP exp
67c0: 72 6c 69 73 74 28 59 29 20 52 50 28 45 29 2e 20  rlist(Y) RP(E). 
67d0: 5b 49 4e 5d 20 7b 0a 20 20 20 20 41 20 3d 20 73  [IN] {.    A = s
67e0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
67f0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , X, 0, 0);.    
6800: 69 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20 41  if( A ){.      A
6810: 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 20  ->pList = Y;.   
6820: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
6830: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6840: 65 74 65 28 59 29 3b 0a 20 20 20 20 7d 0a 20 20  ete(Y);.    }.  
6850: 20 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73 71    if( N ) A = sq
6860: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f 54  lite3Expr(TK_NOT
6870: 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , A, 0, 0);.    
6880: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
6890: 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a  A,&X->span,&E);.
68a0: 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a    }.  expr(A) ::
68b0: 3d 20 4c 50 28 42 29 20 73 65 6c 65 63 74 28 58  = LP(B) select(X
68c0: 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 20 20 41  ) RP(E). {.    A
68d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
68e0: 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  K_SELECT, 0, 0, 
68f0: 30 29 3b 0a 20 20 20 20 69 66 28 20 41 20 29 7b  0);.    if( A ){
6900: 0a 20 20 20 20 20 20 41 2d 3e 70 53 65 6c 65 63  .      A->pSelec
6910: 74 20 3d 20 58 3b 0a 20 20 20 20 7d 65 6c 73 65  t = X;.    }else
6920: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
6930: 65 6c 65 63 74 44 65 6c 65 74 65 28 58 29 3b 0a  electDelete(X);.
6940: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6950: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26  3ExprSpan(A,&B,&
6960: 45 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41  E);.  }.  expr(A
6970: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69 6e  ) ::= expr(X) in
6980: 5f 6f 70 28 4e 29 20 4c 50 20 73 65 6c 65 63 74  _op(N) LP select
6990: 28 59 29 20 52 50 28 45 29 2e 20 20 5b 49 4e 5d  (Y) RP(E).  [IN]
69a0: 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74   {.    A = sqlit
69b0: 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c  e3Expr(TK_IN, X,
69c0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
69d0: 41 20 29 7b 0a 20 20 20 20 20 20 41 2d 3e 70 53  A ){.      A->pS
69e0: 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 20 20 7d  elect = Y;.    }
69f0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
6a00: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
6a10: 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Y);.    }.    if
6a20: 28 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65  ( N ) A = sqlite
6a30: 33 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c  3Expr(TK_NOT, A,
6a40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6a50: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58  te3ExprSpan(A,&X
6a60: 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 20 20 7d 0a  ->span,&E);.  }.
6a70: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78    expr(A) ::= ex
6a80: 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29 20 6e  pr(X) in_op(N) n
6a90: 6d 28 59 29 20 64 62 6e 6d 28 5a 29 2e 20 5b 49  m(Y) dbnm(Z). [I
6aa0: 4e 5d 20 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  N] {.    SrcList
6ab0: 20 2a 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33   *pSrc = sqlite3
6ac0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  SrcListAppend(0,
6ad0: 26 59 2c 26 5a 29 3b 0a 20 20 20 20 41 20 3d 20  &Y,&Z);.    A = 
6ae0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
6af0: 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20  N, X, 0, 0);.   
6b00: 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20   if( A ){.      
6b10: 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  A->pSelect = sql
6b20: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 30 2c  ite3SelectNew(0,
6b30: 70 53 72 63 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  pSrc,0,0,0,0,0,0
6b40: 2c 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ,0);.    }else{.
6b50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
6b60: 4c 69 73 74 44 65 6c 65 74 65 28 70 53 72 63 29  ListDelete(pSrc)
6b70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
6b80: 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33 45  N ) A = sqlite3E
6b90: 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30  xpr(TK_NOT, A, 0
6ba0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
6bb0: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  3ExprSpan(A,&X->
6bc0: 73 70 61 6e 2c 5a 2e 7a 3f 26 5a 3a 26 59 29 3b  span,Z.z?&Z:&Y);
6bd0: 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a  .  }.  expr(A) :
6be0: 3a 3d 20 45 58 49 53 54 53 28 42 29 20 4c 50 20  := EXISTS(B) LP 
6bf0: 73 65 6c 65 63 74 28 59 29 20 52 50 28 45 29 2e  select(Y) RP(E).
6c00: 20 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d   {.    Expr *p =
6c10: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6c20: 28 54 4b 5f 45 58 49 53 54 53 2c 20 30 2c 20 30  (TK_EXISTS, 0, 0
6c30: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
6c40: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53 65 6c  ){.      p->pSel
6c50: 65 63 74 20 3d 20 59 3b 0a 20 20 20 20 20 20 73  ect = Y;.      s
6c60: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 70  qlite3ExprSpan(p
6c70: 2c 26 42 2c 26 45 29 3b 0a 20 20 20 20 7d 65 6c  ,&B,&E);.    }el
6c80: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
6c90: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 59 29  3SelectDelete(Y)
6ca0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 25 65 6e 64  ;.    }.  }.%end
6cb0: 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d 49  if // SQLITE_OMI
6cc0: 54 5f 53 55 42 51 55 45 52 59 0a 0a 2f 2a 20 43  T_SUBQUERY../* C
6cd0: 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ASE expressions 
6ce0: 2a 2f 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 43  */.expr(A) ::= C
6cf0: 41 53 45 28 43 29 20 63 61 73 65 5f 6f 70 65 72  ASE(C) case_oper
6d00: 61 6e 64 28 58 29 20 63 61 73 65 5f 65 78 70 72  and(X) case_expr
6d10: 6c 69 73 74 28 59 29 20 63 61 73 65 5f 65 6c 73  list(Y) case_els
6d20: 65 28 5a 29 20 45 4e 44 28 45 29 2e 20 7b 0a 20  e(Z) END(E). {. 
6d30: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6d40: 28 54 4b 5f 43 41 53 45 2c 20 58 2c 20 5a 2c 20  (TK_CASE, X, Z, 
6d50: 30 29 3b 0a 20 20 69 66 28 20 41 20 29 7b 0a 20  0);.  if( A ){. 
6d60: 20 20 20 41 2d 3e 70 4c 69 73 74 20 3d 20 59 3b     A->pList = Y;
6d70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
6d80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
6d90: 65 74 65 28 59 29 3b 0a 20 20 7d 0a 20 20 73 71  ete(Y);.  }.  sq
6da0: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
6db0: 20 26 43 2c 20 26 45 29 3b 0a 7d 0a 25 74 79 70   &C, &E);.}.%typ
6dc0: 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20  e case_exprlist 
6dd0: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
6de0: 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70  tructor case_exp
6df0: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
6e00: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
6e10: 3b 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74  ;}.case_exprlist
6e20: 28 41 29 20 3a 3a 3d 20 63 61 73 65 5f 65 78 70  (A) ::= case_exp
6e30: 72 6c 69 73 74 28 58 29 20 57 48 45 4e 20 65 78  rlist(X) WHEN ex
6e40: 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28  pr(Y) THEN expr(
6e50: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
6e60: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6e70: 64 28 58 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20  d(X, Y, 0);.  A 
6e80: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
6e90: 74 41 70 70 65 6e 64 28 41 2c 20 5a 2c 20 30 29  tAppend(A, Z, 0)
6ea0: 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73  ;.}.case_exprlis
6eb0: 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78  t(A) ::= WHEN ex
6ec0: 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28  pr(Y) THEN expr(
6ed0: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
6ee0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6ef0: 64 28 30 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20  d(0, Y, 0);.  A 
6f00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
6f10: 74 41 70 70 65 6e 64 28 41 2c 20 5a 2c 20 30 29  tAppend(A, Z, 0)
6f20: 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73 65 5f 65  ;.}.%type case_e
6f30: 6c 73 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73  lse {Expr*}.%des
6f40: 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 6c 73  tructor case_els
6f50: 65 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  e {sqlite3ExprDe
6f60: 6c 65 74 65 28 24 24 29 3b 7d 0a 63 61 73 65 5f  lete($$);}.case_
6f70: 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53  else(A) ::=  ELS
6f80: 45 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  E expr(X).      
6f90: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 63 61 73 65     {A = X;}.case
6fa0: 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 2e 20  _else(A) ::=  . 
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 25 74      {A = 0;} .%t
6fd0: 79 70 65 20 63 61 73 65 5f 6f 70 65 72 61 6e 64  ype case_operand
6fe0: 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75   {Expr*}.%destru
6ff0: 63 74 6f 72 20 63 61 73 65 5f 6f 70 65 72 61 6e  ctor case_operan
7000: 64 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  d {sqlite3ExprDe
7010: 6c 65 74 65 28 24 24 29 3b 7d 0a 63 61 73 65 5f  lete($$);}.case_
7020: 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 65  operand(A) ::= e
7030: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20 20  xpr(X).         
7040: 20 20 20 7b 41 20 3d 20 58 3b 7d 20 0a 63 61 73     {A = X;} .cas
7050: 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d  e_operand(A) ::=
7060: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7070: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a       {A = 0;} ..
7080: 25 74 79 70 65 20 65 78 70 72 6c 69 73 74 20 7b  %type exprlist {
7090: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
70a0: 72 75 63 74 6f 72 20 65 78 70 72 6c 69 73 74 20  ructor exprlist 
70b0: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
70c0: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
70d0: 70 65 20 65 78 70 72 69 74 65 6d 20 7b 45 78 70  pe expritem {Exp
70e0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
70f0: 65 78 70 72 69 74 65 6d 20 7b 73 71 6c 69 74 65  expritem {sqlite
7100: 33 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b  3ExprDelete($$);
7110: 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a  }..exprlist(A) :
7120: 3a 3d 20 65 78 70 72 6c 69 73 74 28 58 29 20 43  := exprlist(X) C
7130: 4f 4d 4d 41 20 65 78 70 72 69 74 65 6d 28 59 29  OMMA expritem(Y)
7140: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  . .             
7150: 20 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 7b 41 20 3d 20             {A = 
7170: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
7180: 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b 7d 0a 65  ppend(X,Y,0);}.e
7190: 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65  xprlist(A) ::= e
71a0: 78 70 72 69 74 65 6d 28 58 29 2e 20 20 20 20 20  xpritem(X).     
71b0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
71c0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
71d0: 64 28 30 2c 58 2c 30 29 3b 7d 0a 65 78 70 72 69  d(0,X,0);}.expri
71e0: 74 65 6d 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  tem(A) ::= expr(
71f0: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
7200: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72     {A = X;}.expr
7210: 69 74 65 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20  item(A) ::= .   
7220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7230: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f      {A = 0;}..//
7240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7250: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
7260: 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 6f 6d  CREATE INDEX com
7270: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
7280: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
7290: 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45 28 53  cmd ::= CREATE(S
72a0: 29 20 75 6e 69 71 75 65 66 6c 61 67 28 55 29 20  ) uniqueflag(U) 
72b0: 49 4e 44 45 58 20 69 66 6e 6f 74 65 78 69 73 74  INDEX ifnotexist
72c0: 73 28 4e 45 29 20 6e 6d 28 58 29 20 64 62 6e 6d  s(NE) nm(X) dbnm
72d0: 28 44 29 0a 20 20 20 20 20 20 20 20 4f 4e 20 6e  (D).        ON n
72e0: 6d 28 59 29 20 4c 50 20 69 64 78 6c 69 73 74 28  m(Y) LP idxlist(
72f0: 5a 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 73 71  Z) RP(E). {.  sq
7300: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
7310: 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 44 2c  (pParse, &X, &D,
7320: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
7330: 70 70 65 6e 64 28 30 2c 26 59 2c 30 29 2c 20 5a  ppend(0,&Y,0), Z
7340: 2c 20 55 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , U,.           
7350: 20 20 20 20 20 20 20 20 20 20 20 26 53 2c 20 26             &S, &
7360: 45 2c 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  E, SQLITE_SO_ASC
7370: 2c 20 4e 45 29 3b 0a 7d 0a 0a 25 74 79 70 65 20  , NE);.}..%type 
7380: 75 6e 69 71 75 65 66 6c 61 67 20 7b 69 6e 74 7d  uniqueflag {int}
7390: 0a 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a  .uniqueflag(A) :
73a0: 3a 3d 20 55 4e 49 51 55 45 2e 20 20 7b 41 20 3d  := UNIQUE.  {A =
73b0: 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 75 6e 69 71   OE_Abort;}.uniq
73c0: 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 2e 20  ueflag(A) ::= . 
73d0: 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 4e         {A = OE_N
73e0: 6f 6e 65 3b 7d 0a 0a 25 74 79 70 65 20 69 64 78  one;}..%type idx
73f0: 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d  list {ExprList*}
7400: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69 64 78  .%destructor idx
7410: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70  list {sqlite3Exp
7420: 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  rListDelete($$);
7430: 7d 0a 25 74 79 70 65 20 69 64 78 6c 69 73 74 5f  }.%type idxlist_
7440: 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  opt {ExprList*}.
7450: 25 64 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c  %destructor idxl
7460: 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33  ist_opt {sqlite3
7470: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24  ExprListDelete($
7480: 24 29 3b 7d 0a 25 74 79 70 65 20 69 64 78 69 74  $);}.%type idxit
7490: 65 6d 20 7b 54 6f 6b 65 6e 7d 0a 0a 69 64 78 6c  em {Token}..idxl
74a0: 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  ist_opt(A) ::= .
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
74d0: 7d 0a 69 64 78 6c 69 73 74 5f 6f 70 74 28 41 29  }.idxlist_opt(A)
74e0: 20 3a 3a 3d 20 4c 50 20 69 64 78 6c 69 73 74 28   ::= LP idxlist(
74f0: 58 29 20 52 50 2e 20 20 20 20 20 20 20 20 20 7b  X) RP.         {
7500: 41 20 3d 20 58 3b 7d 0a 69 64 78 6c 69 73 74 28  A = X;}.idxlist(
7510: 41 29 20 3a 3a 3d 20 69 64 78 6c 69 73 74 28 58  A) ::= idxlist(X
7520: 29 20 43 4f 4d 4d 41 20 69 64 78 69 74 65 6d 28  ) COMMA idxitem(
7530: 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f  Y) collate(C) so
7540: 72 74 6f 72 64 65 72 28 5a 29 2e 20 20 7b 0a 20  rtorder(Z).  {. 
7550: 20 45 78 70 72 20 2a 70 20 3d 20 30 3b 0a 20 20   Expr *p = 0;.  
7560: 69 66 28 20 43 2e 6e 3e 30 20 29 7b 0a 20 20 20  if( C.n>0 ){.   
7570: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
7580: 28 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30  (TK_COLUMN, 0, 0
7590: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
75a0: 29 20 70 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  ) p->pColl = sql
75b0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
75c0: 71 28 70 50 61 72 73 65 2c 20 28 63 68 61 72 2a  q(pParse, (char*
75d0: 29 43 2e 7a 2c 20 43 2e 6e 29 3b 0a 20 20 7d 0a  )C.z, C.n);.  }.
75e0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
75f0: 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 20 70  rListAppend(X, p
7600: 2c 20 26 59 29 3b 0a 20 20 69 66 28 20 41 20 29  , &Y);.  if( A )
7610: 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70 72 2d 31   A->a[A->nExpr-1
7620: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a 3b  ].sortOrder = Z;
7630: 0a 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a  .}.idxlist(A) ::
7640: 3d 20 69 64 78 69 74 65 6d 28 59 29 20 63 6f 6c  = idxitem(Y) col
7650: 6c 61 74 65 28 43 29 20 73 6f 72 74 6f 72 64 65  late(C) sortorde
7660: 72 28 5a 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a  r(Z). {.  Expr *
7670: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 2e 6e  p = 0;.  if( C.n
7680: 3e 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  >0 ){.    p = sq
7690: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c  lite3Expr(TK_COL
76a0: 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  UMN, 0, 0, 0);. 
76b0: 20 20 20 69 66 28 20 70 20 29 20 70 2d 3e 70 43     if( p ) p->pC
76c0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
76d0: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
76e0: 65 2c 20 28 63 68 61 72 2a 29 43 2e 7a 2c 20 43  e, (char*)C.z, C
76f0: 2e 6e 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73  .n);.  }.  A = s
7700: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
7710: 70 65 6e 64 28 30 2c 20 70 2c 20 26 59 29 3b 0a  pend(0, p, &Y);.
7720: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41    if( A ) A->a[A
7730: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
7740: 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a 69 64 78 69  rder = Z;.}.idxi
7750: 74 65 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29  tem(A) ::= nm(X)
7760: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
7770: 41 20 3d 20 58 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f  A = X;}...//////
7780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7790: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50  /////// The DROP
77a0: 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f   INDEX command /
77b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
77c0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
77d0: 3a 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20 69  ::= DROP INDEX i
77e0: 66 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e  fexists(E) fulln
77f0: 61 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74  ame(X).   {sqlit
7800: 65 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72  e3DropIndex(pPar
7810: 73 65 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f  se, X, E);}..///
7820: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56  ////////// The V
7840: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f  ACUUM command //
7850: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
7870: 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d 2e 20 20  md ::= VACUUM.  
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
7890: 71 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50 61  qlite3Vacuum(pPa
78a0: 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 56  rse);}.cmd ::= V
78b0: 41 43 55 55 4d 20 6e 6d 2e 20 20 20 20 20 20 20  ACUUM nm.       
78c0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 61        {sqlite3Va
78d0: 63 75 75 6d 28 70 50 61 72 73 65 29 3b 7d 0a 0a  cuum(pParse);}..
78e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
78f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
7900: 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64  e PRAGMA command
7910: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
7920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
7930: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
7940: 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 63 6d 64  _OMIT_PRAGMA.cmd
7950: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58   ::= PRAGMA nm(X
7960: 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6e 6d 28  ) dbnm(Z) EQ nm(
7970: 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 50 72 61  Y).  {sqlite3Pra
7980: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
7990: 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  ,&Y,0);}.cmd ::=
79a0: 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62   PRAGMA nm(X) db
79b0: 6e 6d 28 5a 29 20 45 51 20 4f 4e 28 59 29 2e 20  nm(Z) EQ ON(Y). 
79c0: 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28   {sqlite3Pragma(
79d0: 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c  pParse,&X,&Z,&Y,
79e0: 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  0);}.cmd ::= PRA
79f0: 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a  GMA nm(X) dbnm(Z
7a00: 29 20 45 51 20 70 6c 75 73 5f 6e 75 6d 28 59 29  ) EQ plus_num(Y)
7a10: 2e 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61  . {sqlite3Pragma
7a20: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59  (pParse,&X,&Z,&Y
7a30: 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52  ,0);}.cmd ::= PR
7a40: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
7a50: 5a 29 20 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28  Z) EQ minus_num(
7a60: 59 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 50  Y). {.  sqlite3P
7a70: 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c  ragma(pParse,&X,
7a80: 26 5a 2c 26 59 2c 31 29 3b 0a 7d 0a 63 6d 64 20  &Z,&Y,1);.}.cmd 
7a90: 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29  ::= PRAGMA nm(X)
7aa0: 20 64 62 6e 6d 28 5a 29 20 4c 50 20 6e 6d 28 59   dbnm(Z) LP nm(Y
7ab0: 29 20 52 50 2e 20 7b 73 71 6c 69 74 65 33 50 72  ) RP. {sqlite3Pr
7ac0: 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26  agma(pParse,&X,&
7ad0: 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a  Z,&Y,0);}.cmd ::
7ae0: 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64  = PRAGMA nm(X) d
7af0: 62 6e 6d 28 5a 29 2e 20 20 20 20 20 20 20 20 20  bnm(Z).         
7b00: 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67      {sqlite3Prag
7b10: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
7b20: 30 2c 30 29 3b 7d 0a 25 65 6e 64 69 66 20 2f 2f  0,0);}.%endif //
7b30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41   SQLITE_OMIT_PRA
7b40: 47 4d 41 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20  GMA.plus_num(A) 
7b50: 3a 3a 3d 20 70 6c 75 73 5f 6f 70 74 20 6e 75 6d  ::= plus_opt num
7b60: 62 65 72 28 58 29 2e 20 20 20 7b 41 20 3d 20 58  ber(X).   {A = X
7b70: 3b 7d 0a 6d 69 6e 75 73 5f 6e 75 6d 28 41 29 20  ;}.minus_num(A) 
7b80: 3a 3a 3d 20 4d 49 4e 55 53 20 6e 75 6d 62 65 72  ::= MINUS number
7b90: 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b  (X).     {A = X;
7ba0: 7d 0a 6e 75 6d 62 65 72 28 41 29 20 3a 3a 3d 20  }.number(A) ::= 
7bb0: 49 4e 54 45 47 45 52 7c 46 4c 4f 41 54 28 58 29  INTEGER|FLOAT(X)
7bc0: 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  .       {A = X;}
7bd0: 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d 20 50 4c  .plus_opt ::= PL
7be0: 55 53 2e 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d  US..plus_opt ::=
7bf0: 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ...////////////
7c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7c10: 20 54 68 65 20 43 52 45 41 54 45 20 54 52 49 47   The CREATE TRIG
7c20: 47 45 52 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  GER command ////
7c30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7c40: 2f 0a 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  /..%ifndef SQLIT
7c50: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a  E_OMIT_TRIGGER..
7c60: 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45 20 74  cmd ::= CREATE t
7c70: 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20 42  rigger_decl(A) B
7c80: 45 47 49 4e 20 74 72 69 67 67 65 72 5f 63 6d 64  EGIN trigger_cmd
7c90: 5f 6c 69 73 74 28 53 29 20 45 4e 44 28 5a 29 2e  _list(S) END(Z).
7ca0: 20 7b 0a 20 20 54 6f 6b 65 6e 20 61 6c 6c 3b 0a   {.  Token all;.
7cb0: 20 20 61 6c 6c 2e 7a 20 3d 20 41 2e 7a 3b 0a 20    all.z = A.z;. 
7cc0: 20 61 6c 6c 2e 6e 20 3d 20 28 5a 2e 7a 20 2d 20   all.n = (Z.z - 
7cd0: 41 2e 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71  A.z) + Z.n;.  sq
7ce0: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
7cf0: 65 72 28 70 50 61 72 73 65 2c 20 53 2c 20 26 61  er(pParse, S, &a
7d00: 6c 6c 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72 5f  ll);.}..trigger_
7d10: 64 65 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d 70  decl(A) ::= temp
7d20: 28 54 29 20 54 52 49 47 47 45 52 20 6e 6d 28 42  (T) TRIGGER nm(B
7d30: 29 20 64 62 6e 6d 28 5a 29 20 74 72 69 67 67 65  ) dbnm(Z) trigge
7d40: 72 5f 74 69 6d 65 28 43 29 0a 20 20 20 20 20 20  r_time(C).      
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
7d60: 69 67 67 65 72 5f 65 76 65 6e 74 28 44 29 0a 20  igger_event(D). 
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 4f 4e 20 66 75 6c 6c 6e 61 6d 65 28 45     ON fullname(E
7d90: 29 20 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65  ) foreach_clause
7da0: 28 46 29 20 77 68 65 6e 5f 63 6c 61 75 73 65 28  (F) when_clause(
7db0: 47 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 42  G). {.  sqlite3B
7dc0: 65 67 69 6e 54 72 69 67 67 65 72 28 70 50 61 72  eginTrigger(pPar
7dd0: 73 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c 20 44  se, &B, &Z, C, D
7de0: 2e 61 2c 20 44 2e 62 2c 20 45 2c 20 46 2c 20 47  .a, D.b, E, F, G
7df0: 2c 20 54 29 3b 0a 20 20 41 20 3d 20 28 5a 2e 6e  , T);.  A = (Z.n
7e00: 3d 3d 30 3f 42 3a 5a 29 3b 0a 7d 0a 0a 25 74 79  ==0?B:Z);.}..%ty
7e10: 70 65 20 74 72 69 67 67 65 72 5f 74 69 6d 65 20  pe trigger_time 
7e20: 20 7b 69 6e 74 7d 0a 74 72 69 67 67 65 72 5f 74   {int}.trigger_t
7e30: 69 6d 65 28 41 29 20 3a 3a 3d 20 42 45 46 4f 52  ime(A) ::= BEFOR
7e40: 45 2e 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b  E.      { A = TK
7e50: 5f 42 45 46 4f 52 45 3b 20 7d 0a 74 72 69 67 67  _BEFORE; }.trigg
7e60: 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 41  er_time(A) ::= A
7e70: 46 54 45 52 2e 20 20 20 20 20 20 20 7b 20 41 20  FTER.       { A 
7e80: 3d 20 54 4b 5f 41 46 54 45 52 3b 20 20 7d 0a 74  = TK_AFTER;  }.t
7e90: 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a  rigger_time(A) :
7ea0: 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46 2e 20 20  := INSTEAD OF.  
7eb0: 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54 45 41 44  { A = TK_INSTEAD
7ec0: 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28  ;}.trigger_time(
7ed0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
7ee0: 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46      { A = TK_BEF
7ef0: 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72  ORE; }..%type tr
7f00: 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 74 72  igger_event {str
7f10: 75 63 74 20 54 72 69 67 45 76 65 6e 74 7d 0a 25  uct TrigEvent}.%
7f20: 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67 67  destructor trigg
7f30: 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c 69 74 65  er_event {sqlite
7f40: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24  3IdListDelete($$
7f50: 2e 62 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76  .b);}.trigger_ev
7f60: 65 6e 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54  ent(A) ::= DELET
7f70: 45 7c 49 4e 53 45 52 54 28 4f 50 29 2e 20 20 20  E|INSERT(OP).   
7f80: 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b 20      {A.a = @OP; 
7f90: 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65  A.b = 0;}.trigge
7fa0: 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55  r_event(A) ::= U
7fb0: 50 44 41 54 45 28 4f 50 29 2e 20 20 20 20 20 20  PDATE(OP).      
7fc0: 20 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 40          {A.a = @
7fd0: 4f 50 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72  OP; A.b = 0;}.tr
7fe0: 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a  igger_event(A) :
7ff0: 3a 3d 20 55 50 44 41 54 45 20 4f 46 20 69 6e 73  := UPDATE OF ins
8000: 63 6f 6c 6c 69 73 74 28 58 29 2e 20 7b 41 2e 61  collist(X). {A.a
8010: 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b 20 41 2e   = TK_UPDATE; A.
8020: 62 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 66  b = X;}..%type f
8030: 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 20 7b 69  oreach_clause {i
8040: 6e 74 7d 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75  nt}.foreach_clau
8050: 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  se(A) ::= .     
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
8070: 41 20 3d 20 54 4b 5f 52 4f 57 3b 20 7d 0a 66 6f  A = TK_ROW; }.fo
8080: 72 65 61 63 68 5f 63 6c 61 75 73 65 28 41 29 20  reach_clause(A) 
8090: 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 52 4f 57  ::= FOR EACH ROW
80a0: 2e 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b  .       { A = TK
80b0: 5f 52 4f 57 3b 20 7d 0a 66 6f 72 65 61 63 68 5f  _ROW; }.foreach_
80c0: 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 46 4f  clause(A) ::= FO
80d0: 52 20 45 41 43 48 20 53 54 41 54 45 4d 45 4e 54  R EACH STATEMENT
80e0: 2e 20 7b 20 41 20 3d 20 54 4b 5f 53 54 41 54 45  . { A = TK_STATE
80f0: 4d 45 4e 54 3b 20 7d 0a 0a 25 74 79 70 65 20 77  MENT; }..%type w
8100: 68 65 6e 5f 63 6c 61 75 73 65 20 7b 45 78 70 72  hen_clause {Expr
8110: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77  *}.%destructor w
8120: 68 65 6e 5f 63 6c 61 75 73 65 20 7b 73 71 6c 69  hen_clause {sqli
8130: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
8140: 29 3b 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28  );}.when_clause(
8150: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
8160: 20 20 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a       { A = 0; }.
8170: 77 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a  when_clause(A) :
8180: 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 58 29 2e  := WHEN expr(X).
8190: 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 25 74 79   { A = X; }..%ty
81a0: 70 65 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c  pe trigger_cmd_l
81b0: 69 73 74 20 7b 54 72 69 67 67 65 72 53 74 65 70  ist {TriggerStep
81c0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74  *}.%destructor t
81d0: 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20  rigger_cmd_list 
81e0: 7b 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72  {sqlite3DeleteTr
81f0: 69 67 67 65 72 53 74 65 70 28 24 24 29 3b 7d 0a  iggerStep($$);}.
8200: 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74  trigger_cmd_list
8210: 28 41 29 20 3a 3a 3d 20 74 72 69 67 67 65 72 5f  (A) ::= trigger_
8220: 63 6d 64 28 58 29 20 53 45 4d 49 20 74 72 69 67  cmd(X) SEMI trig
8230: 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 59 29 2e  ger_cmd_list(Y).
8240: 20 7b 0a 20 20 58 2d 3e 70 4e 65 78 74 20 3d 20   {.  X->pNext = 
8250: 59 3b 0a 20 20 41 20 3d 20 58 3b 0a 7d 0a 74 72  Y;.  A = X;.}.tr
8260: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41  igger_cmd_list(A
8270: 29 20 3a 3a 3d 20 2e 20 7b 20 41 20 3d 20 30 3b  ) ::= . { A = 0;
8280: 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65   }..%type trigge
8290: 72 5f 63 6d 64 20 7b 54 72 69 67 67 65 72 53 74  r_cmd {TriggerSt
82a0: 65 70 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  ep*}.%destructor
82b0: 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 73 71   trigger_cmd {sq
82c0: 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67  lite3DeleteTrigg
82d0: 65 72 53 74 65 70 28 24 24 29 3b 7d 0a 2f 2f 20  erStep($$);}.// 
82e0: 55 50 44 41 54 45 20 0a 74 72 69 67 67 65 72 5f  UPDATE .trigger_
82f0: 63 6d 64 28 41 29 20 3a 3a 3d 20 55 50 44 41 54  cmd(A) ::= UPDAT
8300: 45 20 6f 72 63 6f 6e 66 28 52 29 20 6e 6d 28 58  E orconf(R) nm(X
8310: 29 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29  ) SET setlist(Y)
8320: 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 20 20   where_opt(Z).  
8330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8340: 7b 20 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69  { A = sqlite3Tri
8350: 67 67 65 72 55 70 64 61 74 65 53 74 65 70 28 26  ggerUpdateStep(&
8360: 58 2c 20 59 2c 20 5a 2c 20 52 29 3b 20 7d 0a 0a  X, Y, Z, R); }..
8370: 2f 2f 20 49 4e 53 45 52 54 0a 74 72 69 67 67 65  // INSERT.trigge
8380: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 69 6e 73  r_cmd(A) ::= ins
8390: 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20  ert_cmd(R) INTO 
83a0: 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74  nm(X) inscollist
83b0: 5f 6f 70 74 28 46 29 20 0a 20 20 20 20 20 20 20  _opt(F) .       
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 56 41 4c 55              VALU
83d0: 45 53 20 4c 50 20 69 74 65 6d 6c 69 73 74 28 59  ES LP itemlist(Y
83e0: 29 20 52 50 2e 20 20 0a 20 20 20 20 20 20 20 20  ) RP.  .        
83f0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
8400: 74 65 33 54 72 69 67 67 65 72 49 6e 73 65 72 74  te3TriggerInsert
8410: 53 74 65 70 28 26 58 2c 20 46 2c 20 59 2c 20 30  Step(&X, F, Y, 0
8420: 2c 20 52 29 3b 7d 0a 0a 74 72 69 67 67 65 72 5f  , R);}..trigger_
8430: 63 6d 64 28 41 29 20 3a 3a 3d 20 69 6e 73 65 72  cmd(A) ::= inser
8440: 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 6e 6d  t_cmd(R) INTO nm
8450: 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f  (X) inscollist_o
8460: 70 74 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e  pt(F) select(S).
8470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8480: 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  {A = sqlite3Trig
8490: 67 65 72 49 6e 73 65 72 74 53 74 65 70 28 26 58  gerInsertStep(&X
84a0: 2c 20 46 2c 20 30 2c 20 53 2c 20 52 29 3b 7d 0a  , F, 0, S, R);}.
84b0: 0a 2f 2f 20 44 45 4c 45 54 45 0a 74 72 69 67 67  .// DELETE.trigg
84c0: 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45  er_cmd(A) ::= DE
84d0: 4c 45 54 45 20 46 52 4f 4d 20 6e 6d 28 58 29 20  LETE FROM nm(X) 
84e0: 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 0a 20 20  where_opt(Y)..  
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
8500: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
8510: 44 65 6c 65 74 65 53 74 65 70 28 26 58 2c 20 59  DeleteStep(&X, Y
8520: 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a 74  );}..// SELECT.t
8530: 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a  rigger_cmd(A) ::
8540: 3d 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b 41  = select(X).  {A
8550: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
8560: 72 53 65 6c 65 63 74 53 74 65 70 28 58 29 3b 20  rSelectStep(X); 
8570: 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63 69 61  }..// The specia
8580: 6c 20 52 41 49 53 45 20 65 78 70 72 65 73 73 69  l RAISE expressi
8590: 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63 63 75  on that may occu
85a0: 72 20 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f  r in trigger pro
85b0: 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20 3a 3a  grams.expr(A) ::
85c0: 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 49 47  = RAISE(X) LP IG
85d0: 4e 4f 52 45 20 52 50 28 59 29 2e 20 20 7b 0a 20  NORE RP(Y).  {. 
85e0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
85f0: 28 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30 2c  (TK_RAISE, 0, 0,
8600: 20 30 29 3b 20 0a 20 20 41 2d 3e 69 43 6f 6c 75   0); .  A->iColu
8610: 6d 6e 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 0a  mn = OE_Ignore;.
8620: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
8630: 6e 28 41 2c 20 26 58 2c 20 26 59 29 3b 0a 7d 0a  n(A, &X, &Y);.}.
8640: 65 78 70 72 28 41 29 20 3a 3a 3d 20 52 41 49 53  expr(A) ::= RAIS
8650: 45 28 58 29 20 4c 50 20 72 61 69 73 65 74 79 70  E(X) LP raisetyp
8660: 65 28 54 29 20 43 4f 4d 4d 41 20 6e 6d 28 5a 29  e(T) COMMA nm(Z)
8670: 20 52 50 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d   RP(Y).  {.  A =
8680: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
8690: 52 41 49 53 45 2c 20 30 2c 20 30 2c 20 26 5a 29  RAISE, 0, 0, &Z)
86a0: 3b 20 0a 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20  ; .  A->iColumn 
86b0: 3d 20 54 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = T;.  sqlite3Ex
86c0: 70 72 53 70 61 6e 28 41 2c 20 26 58 2c 20 26 59  prSpan(A, &X, &Y
86d0: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 2f 2f 20 21  );.}.%endif // !
86e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
86f0: 47 45 52 0a 0a 25 74 79 70 65 20 72 61 69 73 65  GER..%type raise
8700: 74 79 70 65 20 7b 69 6e 74 7d 0a 72 61 69 73 65  type {int}.raise
8710: 74 79 70 65 28 41 29 20 3a 3a 3d 20 52 4f 4c 4c  type(A) ::= ROLL
8720: 42 41 43 4b 2e 20 20 7b 41 20 3d 20 4f 45 5f 52  BACK.  {A = OE_R
8730: 6f 6c 6c 62 61 63 6b 3b 7d 0a 72 61 69 73 65 74  ollback;}.raiset
8740: 79 70 65 28 41 29 20 3a 3a 3d 20 41 42 4f 52 54  ype(A) ::= ABORT
8750: 2e 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 41 62  .     {A = OE_Ab
8760: 6f 72 74 3b 7d 0a 72 61 69 73 65 74 79 70 65 28  ort;}.raisetype(
8770: 41 29 20 3a 3a 3d 20 46 41 49 4c 2e 20 20 20 20  A) ::= FAIL.    
8780: 20 20 7b 41 20 3d 20 4f 45 5f 46 61 69 6c 3b 7d    {A = OE_Fail;}
8790: 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .../////////////
87a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 20 44 52 4f  ///////////  DRO
87b0: 50 20 54 52 49 47 47 45 52 20 73 74 61 74 65 6d  P TRIGGER statem
87c0: 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ent ////////////
87d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87e0: 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  //.%ifndef SQLIT
87f0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 63  E_OMIT_TRIGGER.c
8800: 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 52 49 47  md ::= DROP TRIG
8810: 47 45 52 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e  GER fullname(X).
8820: 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70   {.  sqlite3Drop
8830: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 58  Trigger(pParse,X
8840: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 2f 2f 20 21  );.}.%endif // !
8850: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
8860: 47 45 52 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  GER..///////////
8870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 54  ///////////// AT
8880: 54 41 43 48 20 44 41 54 41 42 41 53 45 20 66 69  TACH DATABASE fi
8890: 6c 65 20 41 53 20 6e 61 6d 65 20 2f 2f 2f 2f 2f  le AS name /////
88a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
88b0: 2f 2f 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 41 54 54  ////.cmd ::= ATT
88c0: 41 43 48 20 64 61 74 61 62 61 73 65 5f 6b 77 5f  ACH database_kw_
88d0: 6f 70 74 20 65 78 70 72 28 46 29 20 41 53 20 65  opt expr(F) AS e
88e0: 78 70 72 28 44 29 20 6b 65 79 5f 6f 70 74 28 4b  xpr(D) key_opt(K
88f0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 41 74  ). {.  sqlite3At
8900: 74 61 63 68 28 70 50 61 72 73 65 2c 20 46 2c 20  tach(pParse, F, 
8910: 44 2c 20 4b 29 3b 0a 7d 0a 25 74 79 70 65 20 6b  D, K);.}.%type k
8920: 65 79 5f 6f 70 74 20 7b 45 78 70 72 20 2a 7d 0a  ey_opt {Expr *}.
8930: 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 5f  %destructor key_
8940: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
8950: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 6b 65 79  Delete($$);}.key
8960: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8980: 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 6b 65 79    { A = 0; }.key
8990: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4b 45 59 20  _opt(A) ::= KEY 
89a0: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20  expr(X).        
89b0: 20 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 64 61    { A = X; }..da
89c0: 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a  tabase_kw_opt ::
89d0: 3d 20 44 41 54 41 42 41 53 45 2e 0a 64 61 74 61  = DATABASE..data
89e0: 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20  base_kw_opt ::= 
89f0: 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .../////////////
8a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 44 45 54 41  /////////// DETA
8a10: 43 48 20 44 41 54 41 42 41 53 45 20 6e 61 6d 65  CH DATABASE name
8a20: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
8a30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8a40: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 45 54 41 43  //.cmd ::= DETAC
8a50: 48 20 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70  H database_kw_op
8a60: 74 20 65 78 70 72 28 44 29 2e 20 7b 0a 20 20 73  t expr(D). {.  s
8a70: 71 6c 69 74 65 33 44 65 74 61 63 68 28 70 50 61  qlite3Detach(pPa
8a80: 72 73 65 2c 20 44 29 3b 0a 7d 0a 0a 2f 2f 2f 2f  rse, D);.}..////
8a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8aa0: 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44 45 58 20 63  ////// REINDEX c
8ab0: 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f 2f  ollation ///////
8ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e  ///////////.%ifn
8ae0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8af0: 52 45 49 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d 20  REINDEX.cmd ::= 
8b00: 52 45 49 4e 44 45 58 2e 20 20 20 20 20 20 20 20  REINDEX.        
8b10: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
8b20: 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c 20  Reindex(pParse, 
8b30: 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  0, 0);}.cmd ::= 
8b40: 52 45 49 4e 44 45 58 20 6e 6d 28 58 29 20 64 62  REINDEX nm(X) db
8b50: 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33  nm(Y).  {sqlite3
8b60: 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c 20  Reindex(pParse, 
8b70: 26 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66  &X, &Y);}.%endif
8b80: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
8b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ba0: 2f 2f 2f 2f 2f 20 41 4e 41 4c 59 5a 45 20 2f 2f  ///// ANALYZE //
8bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8bc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8bd0: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
8be0: 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 63 6d  _OMIT_ANALYZE.cm
8bf0: 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 2e 20 20  d ::= ANALYZE.  
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
8c10: 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70 50  qlite3Analyze(pP
8c20: 61 72 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63 6d  arse, 0, 0);}.cm
8c30: 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 20 6e 6d  d ::= ANALYZE nm
8c40: 28 58 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b 73  (X) dbnm(Y).  {s
8c50: 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28 70 50  qlite3Analyze(pP
8c60: 61 72 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d 0a  arse, &X, &Y);}.
8c70: 25 65 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  %endif..////////
8c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c90: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74 61 62   ALTER TABLE tab
8ca0: 6c 65 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  le ... /////////
8cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8cc0: 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20  ///////.%ifndef 
8cd0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45  SQLITE_OMIT_ALTE
8ce0: 52 54 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20 41  RTABLE.cmd ::= A
8cf0: 4c 54 45 52 20 54 41 42 4c 45 20 66 75 6c 6c 6e  LTER TABLE fulln
8d00: 61 6d 65 28 58 29 20 52 45 4e 41 4d 45 20 54 4f  ame(X) RENAME TO
8d10: 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 73 71 6c 69   nm(Z). {.  sqli
8d20: 74 65 33 41 6c 74 65 72 52 65 6e 61 6d 65 54 61  te3AlterRenameTa
8d30: 62 6c 65 28 70 50 61 72 73 65 2c 58 2c 26 5a 29  ble(pParse,X,&Z)
8d40: 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4c 54 45  ;.}.cmd ::= ALTE
8d50: 52 20 54 41 42 4c 45 20 61 64 64 5f 63 6f 6c 75  R TABLE add_colu
8d60: 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 41 44 44 20  mn_fullname ADD 
8d70: 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63 6f 6c  kwcolumn_opt col
8d80: 75 6d 6e 28 59 29 2e 20 7b 0a 20 20 73 71 6c 69  umn(Y). {.  sqli
8d90: 74 65 33 41 6c 74 65 72 46 69 6e 69 73 68 41 64  te3AlterFinishAd
8da0: 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  dColumn(pParse, 
8db0: 26 59 29 3b 0a 7d 0a 61 64 64 5f 63 6f 6c 75 6d  &Y);.}.add_colum
8dc0: 6e 5f 66 75 6c 6c 6e 61 6d 65 20 3a 3a 3d 20 66  n_fullname ::= f
8dd0: 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20  ullname(X). {.  
8de0: 73 71 6c 69 74 65 33 41 6c 74 65 72 42 65 67 69  sqlite3AlterBegi
8df0: 6e 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73  nAddColumn(pPars
8e00: 65 2c 20 58 29 3b 0a 7d 0a 6b 77 63 6f 6c 75 6d  e, X);.}.kwcolum
8e10: 6e 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 6b 77 63 6f  n_opt ::= ..kwco
8e20: 6c 75 6d 6e 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4c  lumn_opt ::= COL
8e30: 55 4d 4e 4b 57 2e 0a 25 65 6e 64 69 66 0a        UMNKW..%endif.