/ Hex Artifact Content
Login

Artifact 2d2ce439dc6184621fb0b86f4fc5aca7f391a590:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 53 51 4c  ile contains SQL
0190: 69 74 65 27 73 20 67 72 61 6d 6d 61 72 20 66 6f  ite's grammar fo
01a0: 72 20 53 51 4c 2e 20 20 50 72 6f 63 65 73 73 20  r SQL.  Process 
01b0: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 75 73 69  this file.** usi
01c0: 6e 67 20 74 68 65 20 6c 65 6d 6f 6e 20 70 61 72  ng the lemon par
01d0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 74 6f  ser generator to
01e0: 20 67 65 6e 65 72 61 74 65 20 43 20 63 6f 64 65   generate C code
01f0: 20 74 68 61 74 20 72 75 6e 73 0a 2a 2a 20 74 68   that runs.** th
0200: 65 20 70 61 72 73 65 72 2e 20 20 4c 65 6d 6f 6e  e parser.  Lemon
0210: 20 77 69 6c 6c 20 61 6c 73 6f 20 67 65 6e 65 72   will also gener
0220: 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69 6c  ate a header fil
0230: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  e containing.** 
0240: 6e 75 6d 65 72 69 63 20 63 6f 64 65 73 20 66 6f  numeric codes fo
0250: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 6f 6b  r all of the tok
0260: 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20  ens..**.** @(#) 
0270: 24 49 64 3a 20 70 61 72 73 65 2e 79 2c 76 20 31  $Id: parse.y,v 1
0280: 2e 32 33 34 20 32 30 30 37 2f 30 38 2f 32 31 20  .234 2007/08/21 
0290: 31 30 3a 34 34 3a 31 36 20 64 72 68 20 45 78 70  10:44:16 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 21  _error {.  if( !
0450: 70 50 61 72 73 65 2d 3e 70 61 72 73 65 45 72 72  pParse->parseErr
0460: 6f 72 20 29 7b 0a 20 20 20 20 69 66 28 20 54 4f  or ){.    if( TO
0470: 4b 45 4e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  KEN.z[0] ){.    
0480: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
0490: 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20  g(pParse, "near 
04a0: 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65  \"%T\": syntax e
04b0: 72 72 6f 72 22 2c 20 26 54 4f 4b 45 4e 29 3b 0a  rror", &TOKEN);.
04c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
04d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
04e0: 28 70 50 61 72 73 65 2c 20 22 69 6e 63 6f 6d 70  (pParse, "incomp
04f0: 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
0500: 6e 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt");.    }.    
0510: 70 50 61 72 73 65 2d 3e 70 61 72 73 65 45 72 72  pParse->parseErr
0520: 6f 72 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 25 73  or = 1;.  }.}.%s
0530: 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 20 7b 0a  tack_overflow {.
0540: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
0550: 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 73 65  g(pParse, "parse
0560: 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  r stack overflow
0570: 22 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 61  ");.  pParse->pa
0580: 72 73 65 45 72 72 6f 72 20 3d 20 31 3b 0a 7d 0a  rseError = 1;.}.
0590: 0a 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 20  .// The name of 
05a0: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 72  the generated pr
05b0: 6f 63 65 64 75 72 65 20 74 68 61 74 20 69 6d 70  ocedure that imp
05c0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 70 61 72 73  lements the pars
05d0: 65 72 0a 2f 2f 20 69 73 20 61 73 20 66 6f 6c 6c  er.// is as foll
05e0: 6f 77 73 3a 0a 25 6e 61 6d 65 20 73 71 6c 69 74  ows:.%name sqlit
05f0: 65 33 50 61 72 73 65 72 0a 0a 2f 2f 20 54 68 65  e3Parser..// The
0600: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20   following text 
0610: 69 73 20 69 6e 63 6c 75 64 65 64 20 6e 65 61 72  is included near
0620: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
0630: 66 20 74 68 65 20 43 20 73 6f 75 72 63 65 0a 2f  f the C source./
0640: 2f 20 63 6f 64 65 20 66 69 6c 65 20 74 68 61 74  / code file that
0650: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
0660: 70 61 72 73 65 72 2e 0a 2f 2f 0a 25 69 6e 63 6c  parser..//.%incl
0670: 75 64 65 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22  ude {.#include "
0680: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0690: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
06a0: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
06b0: 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74  e holds informat
06c0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a  ion about the.**
06d0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 66   LIMIT clause of
06e0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
06f0: 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c  ent..*/.struct L
0700: 69 6d 69 74 56 61 6c 20 7b 0a 20 20 45 78 70 72  imitVal {.  Expr
0710: 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20   *pLimit;    /* 
0720: 54 68 65 20 4c 49 4d 49 54 20 65 78 70 72 65 73  The LIMIT expres
0730: 73 69 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66 20 74  sion.  NULL if t
0740: 68 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74  here is no limit
0750: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66   */.  Expr *pOff
0760: 73 65 74 3b 20 20 20 2f 2a 20 54 68 65 20 4f 46  set;   /* The OF
0770: 46 53 45 54 20 65 78 70 72 65 73 73 69 6f 6e 2e  FSET expression.
0780: 20 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20    NULL if there 
0790: 69 73 20 6e 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 2f  is none */.};../
07a0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
07b0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
07c0: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 73 74  re is used to st
07d0: 6f 72 65 20 74 68 65 20 4c 49 4b 45 2c 0a 2a 2a  ore the LIKE,.**
07e0: 20 47 4c 4f 42 2c 20 4e 4f 54 20 4c 49 4b 45 2c   GLOB, NOT LIKE,
07f0: 20 61 6e 64 20 4e 4f 54 20 47 4c 4f 42 20 6f 70   and NOT GLOB op
0800: 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 72 75  erators..*/.stru
0810: 63 74 20 4c 69 6b 65 4f 70 20 7b 0a 20 20 54 6f  ct LikeOp {.  To
0820: 6b 65 6e 20 65 4f 70 65 72 61 74 6f 72 3b 20 20  ken eOperator;  
0830: 2f 2a 20 22 6c 69 6b 65 22 20 6f 72 20 22 67 6c  /* "like" or "gl
0840: 6f 62 22 20 6f 72 20 22 72 65 67 65 78 70 22 20  ob" or "regexp" 
0850: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 74 3b 20 20 20  */.  int not;   
0860: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
0870: 20 74 68 65 20 4e 4f 54 20 6b 65 79 77 6f 72 64   the NOT keyword
0880: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 7d   is present */.}
0890: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
08a0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
08b0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
08c0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 76  describes the ev
08d0: 65 6e 74 20 6f 66 20 61 0a 2a 2a 20 54 52 49 47  ent of a.** TRIG
08e0: 47 45 52 2e 20 20 22 61 22 20 69 73 20 74 68 65  GER.  "a" is the
08f0: 20 65 76 65 6e 74 20 74 79 70 65 2c 20 6f 6e 65   event type, one
0900: 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20 54   of TK_UPDATE, T
0910: 4b 5f 49 4e 53 45 52 54 2c 0a 2a 2a 20 54 4b 5f  K_INSERT,.** TK_
0920: 44 45 4c 45 54 45 2c 20 6f 72 20 54 4b 5f 49 4e  DELETE, or TK_IN
0930: 53 54 45 41 44 2e 20 20 49 66 20 74 68 65 20 65  STEAD.  If the e
0940: 76 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  vent is of the f
0950: 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 55  orm.**.**      U
0960: 50 44 41 54 45 20 4f 4e 20 28 61 2c 62 2c 63 29  PDATE ON (a,b,c)
0970: 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
0980: 22 62 22 20 49 64 4c 69 73 74 20 72 65 63 6f 72  "b" IdList recor
0990: 64 73 20 74 68 65 20 6c 69 73 74 20 22 61 2c 62  ds the list "a,b
09a0: 2c 63 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54  ,c"..*/.struct T
09b0: 72 69 67 45 76 65 6e 74 20 7b 20 69 6e 74 20 61  rigEvent { int a
09c0: 3b 20 49 64 4c 69 73 74 20 2a 20 62 3b 20 7d 3b  ; IdList * b; };
09d0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
09e0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
09f0: 63 74 75 72 65 20 68 6f 6c 64 73 20 74 68 65 20  cture holds the 
0a00: 41 54 54 41 43 48 20 6b 65 79 20 61 6e 64 20 74  ATTACH key and t
0a10: 68 65 20 6b 65 79 20 74 79 70 65 2e 0a 2a 2f 0a  he key type..*/.
0a20: 73 74 72 75 63 74 20 41 74 74 61 63 68 4b 65 79  struct AttachKey
0a30: 20 7b 20 69 6e 74 20 74 79 70 65 3b 20 20 54 6f   { int type;  To
0a40: 6b 65 6e 20 6b 65 79 3b 20 7d 3b 0a 0a 7d 20 2f  ken key; };..} /
0a50: 2f 20 65 6e 64 20 25 69 6e 63 6c 75 64 65 0a 0a  / end %include..
0a60: 2f 2f 20 49 6e 70 75 74 20 69 73 20 61 20 73 69  // Input is a si
0a70: 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  ngle SQL command
0a80: 0a 69 6e 70 75 74 20 3a 3a 3d 20 63 6d 64 6c 69  .input ::= cmdli
0a90: 73 74 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20  st..cmdlist ::= 
0aa0: 63 6d 64 6c 69 73 74 20 65 63 6d 64 2e 0a 63 6d  cmdlist ecmd..cm
0ab0: 64 6c 69 73 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a  dlist ::= ecmd..
0ac0: 63 6d 64 78 20 3a 3a 3d 20 63 6d 64 2e 20 20 20  cmdx ::= cmd.   
0ad0: 20 20 20 20 20 20 20 20 7b 20 73 71 6c 69 74 65          { sqlite
0ae0: 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 70 50  3FinishCoding(pP
0af0: 61 72 73 65 29 3b 20 7d 0a 65 63 6d 64 20 3a 3a  arse); }.ecmd ::
0b00: 3d 20 53 45 4d 49 2e 0a 65 63 6d 64 20 3a 3a 3d  = SEMI..ecmd ::=
0b10: 20 65 78 70 6c 61 69 6e 20 63 6d 64 78 20 53 45   explain cmdx SE
0b20: 4d 49 2e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20  MI..explain ::= 
0b30: 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71  .           { sq
0b40: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0b50: 70 50 61 72 73 65 2c 20 30 29 3b 20 7d 0a 25 69  pParse, 0); }.%i
0b60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
0b70: 54 5f 45 58 50 4c 41 49 4e 0a 65 78 70 6c 61 69  T_EXPLAIN.explai
0b80: 6e 20 3a 3a 3d 20 45 58 50 4c 41 49 4e 2e 20 20  n ::= EXPLAIN.  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71              { sq
0ba0: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0bb0: 70 50 61 72 73 65 2c 20 31 29 3b 20 7d 0a 65 78  pParse, 1); }.ex
0bc0: 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c 41 49  plain ::= EXPLAI
0bd0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 20 20 20  N QUERY PLAN.   
0be0: 7b 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61  { sqlite3BeginPa
0bf0: 72 73 65 28 70 50 61 72 73 65 2c 20 32 29 3b 20  rse(pParse, 2); 
0c00: 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  }.%endif  SQLITE
0c10: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 0a 2f  _OMIT_EXPLAIN../
0c20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0c30: 2f 2f 2f 2f 20 42 65 67 69 6e 20 61 6e 64 20 65  //// Begin and e
0c40: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  nd transactions.
0c50: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
0c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
0c70: 0a 0a 63 6d 64 20 3a 3a 3d 20 42 45 47 49 4e 20  ..cmd ::= BEGIN 
0c80: 74 72 61 6e 73 74 79 70 65 28 59 29 20 74 72 61  transtype(Y) tra
0c90: 6e 73 5f 6f 70 74 2e 20 20 7b 73 71 6c 69 74 65  ns_opt.  {sqlite
0ca0: 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
0cb0: 6e 28 70 50 61 72 73 65 2c 20 59 29 3b 7d 0a 74  n(pParse, Y);}.t
0cc0: 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 74  rans_opt ::= ..t
0cd0: 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41  rans_opt ::= TRA
0ce0: 4e 53 41 43 54 49 4f 4e 2e 0a 74 72 61 6e 73 5f  NSACTION..trans_
0cf0: 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54  opt ::= TRANSACT
0d00: 49 4f 4e 20 6e 6d 2e 0a 25 74 79 70 65 20 74 72  ION nm..%type tr
0d10: 61 6e 73 74 79 70 65 20 7b 69 6e 74 7d 0a 74 72  anstype {int}.tr
0d20: 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 2e  anstype(A) ::= .
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
0d40: 3d 20 54 4b 5f 44 45 46 45 52 52 45 44 3b 7d 0a  = TK_DEFERRED;}.
0d50: 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d  transtype(A) ::=
0d60: 20 44 45 46 45 52 52 45 44 28 58 29 2e 20 20 7b   DEFERRED(X).  {
0d70: 41 20 3d 20 40 58 3b 7d 0a 74 72 61 6e 73 74 79  A = @X;}.transty
0d80: 70 65 28 41 29 20 3a 3a 3d 20 49 4d 4d 45 44 49  pe(A) ::= IMMEDI
0d90: 41 54 45 28 58 29 2e 20 7b 41 20 3d 20 40 58 3b  ATE(X). {A = @X;
0da0: 7d 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a  }.transtype(A) :
0db0: 3a 3d 20 45 58 43 4c 55 53 49 56 45 28 58 29 2e  := EXCLUSIVE(X).
0dc0: 20 7b 41 20 3d 20 40 58 3b 7d 0a 63 6d 64 20 3a   {A = @X;}.cmd :
0dd0: 3a 3d 20 43 4f 4d 4d 49 54 20 74 72 61 6e 73 5f  := COMMIT trans_
0de0: 6f 70 74 2e 20 20 20 20 20 20 7b 73 71 6c 69 74  opt.      {sqlit
0df0: 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
0e00: 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d  ion(pParse);}.cm
0e10: 64 20 3a 3a 3d 20 45 4e 44 20 74 72 61 6e 73 5f  d ::= END trans_
0e20: 6f 70 74 2e 20 20 20 20 20 20 20 20 20 7b 73 71  opt.         {sq
0e30: 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
0e40: 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d  action(pParse);}
0e50: 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43  .cmd ::= ROLLBAC
0e60: 4b 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20  K trans_opt.    
0e70: 7b 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b  {sqlite3Rollback
0e80: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72  Transaction(pPar
0e90: 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  se);}../////////
0ea0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
0eb0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
0ec0: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
0ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ee0: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
0ef0: 63 72 65 61 74 65 5f 74 61 62 6c 65 20 63 72 65  create_table cre
0f00: 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 2e 0a  ate_table_args..
0f10: 63 72 65 61 74 65 5f 74 61 62 6c 65 20 3a 3a 3d  create_table ::=
0f20: 20 43 52 45 41 54 45 20 74 65 6d 70 28 54 29 20   CREATE temp(T) 
0f30: 54 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 73 74  TABLE ifnotexist
0f40: 73 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28  s(E) nm(Y) dbnm(
0f50: 5a 29 2e 20 7b 0a 20 20 20 73 71 6c 69 74 65 33  Z). {.   sqlite3
0f60: 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73  StartTable(pPars
0f70: 65 2c 26 59 2c 26 5a 2c 54 2c 30 2c 30 2c 45 29  e,&Y,&Z,T,0,0,E)
0f80: 3b 0a 7d 0a 25 74 79 70 65 20 69 66 6e 6f 74 65  ;.}.%type ifnote
0f90: 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66 6e 6f  xists {int}.ifno
0fa0: 74 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 2e  texists(A) ::= .
0fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
0fc0: 20 3d 20 30 3b 7d 0a 69 66 6e 6f 74 65 78 69 73   = 0;}.ifnotexis
0fd0: 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 4e 4f 54  ts(A) ::= IF NOT
0fe0: 20 45 58 49 53 54 53 2e 20 7b 41 20 3d 20 31 3b   EXISTS. {A = 1;
0ff0: 7d 0a 25 74 79 70 65 20 74 65 6d 70 20 7b 69 6e  }.%type temp {in
1000: 74 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  t}.%ifndef SQLIT
1010: 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 74 65  E_OMIT_TEMPDB.te
1020: 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20  mp(A) ::= TEMP. 
1030: 20 7b 41 20 3d 20 31 3b 7d 0a 25 65 6e 64 69 66   {A = 1;}.%endif
1040: 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45    SQLITE_OMIT_TE
1050: 4d 50 44 42 0a 74 65 6d 70 28 41 29 20 3a 3a 3d  MPDB.temp(A) ::=
1060: 20 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d   .      {A = 0;}
1070: 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72  .create_table_ar
1080: 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e  gs ::= LP column
1090: 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74 5f 6f 70  list conslist_op
10a0: 74 28 58 29 20 52 50 28 59 29 2e 20 7b 0a 20 20  t(X) RP(Y). {.  
10b0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
10c0: 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b  pParse,&X,&Y,0);
10d0: 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f  .}.create_table_
10e0: 61 72 67 73 20 3a 3a 3d 20 41 53 20 73 65 6c 65  args ::= AS sele
10f0: 63 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74  ct(S). {.  sqlit
1100: 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
1110: 65 2c 30 2c 30 2c 53 29 3b 0a 20 20 73 71 6c 69  e,0,0,S);.  sqli
1120: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
1130: 53 29 3b 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69 73 74  S);.}.columnlist
1140: 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73 74 20   ::= columnlist 
1150: 43 4f 4d 4d 41 20 63 6f 6c 75 6d 6e 2e 0a 63 6f  COMMA column..co
1160: 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c  lumnlist ::= col
1170: 75 6d 6e 2e 0a 0a 2f 2f 20 41 20 22 63 6f 6c 75  umn...// A "colu
1180: 6d 6e 22 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  mn" is a complet
1190: 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  e description of
11a0: 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e   a single column
11b0: 20 69 6e 20 61 0a 2f 2f 20 43 52 45 41 54 45 20   in a.// CREATE 
11c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
11d0: 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20    This includes 
11e0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c  the column name,
11f0: 20 69 74 73 0a 2f 2f 20 64 61 74 61 74 79 70 65   its.// datatype
1200: 2c 20 61 6e 64 20 6f 74 68 65 72 20 6b 65 79 77  , and other keyw
1210: 6f 72 64 73 20 73 75 63 68 20 61 73 20 50 52 49  ords such as PRI
1220: 4d 41 52 59 20 4b 45 59 2c 20 55 4e 49 51 55 45  MARY KEY, UNIQUE
1230: 2c 20 52 45 46 45 52 45 4e 43 45 53 2c 0a 2f 2f  , REFERENCES,.//
1240: 20 4e 4f 54 20 4e 55 4c 4c 20 61 6e 64 20 73 6f   NOT NULL and so
1250: 20 66 6f 72 74 68 2e 0a 2f 2f 0a 63 6f 6c 75 6d   forth..//.colum
1260: 6e 28 41 29 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 69  n(A) ::= columni
1270: 64 28 58 29 20 74 79 70 65 20 63 61 72 67 6c 69  d(X) type cargli
1280: 73 74 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e  st. {.  A.z = X.
1290: 7a 3b 0a 20 20 41 2e 6e 20 3d 20 28 70 50 61 72  z;.  A.n = (pPar
12a0: 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a  se->sLastToken.z
12b0: 2d 58 2e 7a 29 20 2b 20 70 50 61 72 73 65 2d 3e  -X.z) + pParse->
12c0: 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 7d 0a  sLastToken.n;.}.
12d0: 63 6f 6c 75 6d 6e 69 64 28 41 29 20 3a 3a 3d 20  columnid(A) ::= 
12e0: 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74  nm(X). {.  sqlit
12f0: 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72  e3AddColumn(pPar
1300: 73 65 2c 26 58 29 3b 0a 20 20 41 20 3d 20 58 3b  se,&X);.  A = X;
1310: 0a 7d 0a 0a 0a 2f 2f 20 41 6e 20 49 44 45 4e 54  .}...// An IDENT
1320: 49 46 49 45 52 20 63 61 6e 20 62 65 20 61 20 67  IFIER can be a g
1330: 65 6e 65 72 69 63 20 69 64 65 6e 74 69 66 69 65  eneric identifie
1340: 72 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 73 65 76  r, or one of sev
1350: 65 72 61 6c 0a 2f 2f 20 6b 65 79 77 6f 72 64 73  eral.// keywords
1360: 2e 20 20 41 6e 79 20 6e 6f 6e 2d 73 74 61 6e 64  .  Any non-stand
1370: 61 72 64 20 6b 65 79 77 6f 72 64 20 63 61 6e 20  ard keyword can 
1380: 61 6c 73 6f 20 62 65 20 61 6e 20 69 64 65 6e 74  also be an ident
1390: 69 66 69 65 72 2e 0a 2f 2f 0a 25 74 79 70 65 20  ifier..//.%type 
13a0: 69 64 20 7b 54 6f 6b 65 6e 7d 0a 69 64 28 41 29  id {Token}.id(A)
13b0: 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20 20 20 20   ::= ID(X).     
13c0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f      {A = X;}..//
13d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
13e0: 69 72 65 63 74 69 76 65 20 63 61 75 73 65 73 20  irective causes 
13f0: 74 6f 6b 65 6e 73 20 41 42 4f 52 54 2c 20 41 46  tokens ABORT, AF
1400: 54 45 52 2c 20 41 53 43 2c 20 65 74 63 2e 20 74  TER, ASC, etc. t
1410: 6f 0a 2f 2f 20 66 61 6c 6c 62 61 63 6b 20 74 6f  o.// fallback to
1420: 20 49 44 20 69 66 20 74 68 65 79 20 77 69 6c 6c   ID if they will
1430: 20 6e 6f 74 20 70 61 72 73 65 20 61 73 20 74 68   not parse as th
1440: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  eir original val
1450: 75 65 2e 0a 2f 2f 20 54 68 69 73 20 6f 62 76 69  ue..// This obvi
1460: 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 66 6f  ates the need fo
1470: 72 20 74 68 65 20 22 69 64 22 20 6e 6f 6e 74 65  r the "id" nonte
1480: 72 6d 69 6e 61 6c 2e 0a 2f 2f 0a 25 66 61 6c 6c  rminal..//.%fall
1490: 62 61 63 6b 20 49 44 0a 20 20 41 42 4f 52 54 20  back ID.  ABORT 
14a0: 41 46 54 45 52 20 41 4e 41 4c 59 5a 45 20 41 53  AFTER ANALYZE AS
14b0: 43 20 41 54 54 41 43 48 20 42 45 46 4f 52 45 20  C ATTACH BEFORE 
14c0: 42 45 47 49 4e 20 43 41 53 43 41 44 45 20 43 41  BEGIN CASCADE CA
14d0: 53 54 20 43 4f 4e 46 4c 49 43 54 0a 20 20 44 41  ST CONFLICT.  DA
14e0: 54 41 42 41 53 45 20 44 45 46 45 52 52 45 44 20  TABASE DEFERRED 
14f0: 44 45 53 43 20 44 45 54 41 43 48 20 45 41 43 48  DESC DETACH EACH
1500: 20 45 4e 44 20 45 58 43 4c 55 53 49 56 45 20 45   END EXCLUSIVE E
1510: 58 50 4c 41 49 4e 20 46 41 49 4c 20 46 4f 52 0a  XPLAIN FAIL FOR.
1520: 20 20 49 47 4e 4f 52 45 20 49 4d 4d 45 44 49 41    IGNORE IMMEDIA
1530: 54 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4e 53  TE INITIALLY INS
1540: 54 45 41 44 20 4c 49 4b 45 5f 4b 57 20 4d 41 54  TEAD LIKE_KW MAT
1550: 43 48 20 50 4c 41 4e 0a 20 20 51 55 45 52 59 20  CH PLAN.  QUERY 
1560: 4b 45 59 20 4f 46 20 4f 46 46 53 45 54 20 50 52  KEY OF OFFSET PR
1570: 41 47 4d 41 20 52 41 49 53 45 20 52 45 50 4c 41  AGMA RAISE REPLA
1580: 43 45 20 52 45 53 54 52 49 43 54 20 52 4f 57 0a  CE RESTRICT ROW.
1590: 20 20 54 45 4d 50 20 54 52 49 47 47 45 52 20 56    TEMP TRIGGER V
15a0: 41 43 55 55 4d 20 56 49 45 57 20 56 49 52 54 55  ACUUM VIEW VIRTU
15b0: 41 4c 0a 25 69 66 64 65 66 20 53 51 4c 49 54 45  AL.%ifdef SQLITE
15c0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
15d0: 45 4c 45 43 54 0a 20 20 45 58 43 45 50 54 20 49  ELECT.  EXCEPT I
15e0: 4e 54 45 52 53 45 43 54 20 55 4e 49 4f 4e 0a 25  NTERSECT UNION.%
15f0: 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  endif SQLITE_OMI
1600: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
1610: 54 0a 20 20 52 45 49 4e 44 45 58 20 52 45 4e 41  T.  REINDEX RENA
1620: 4d 45 20 43 54 49 4d 45 5f 4b 57 20 49 46 0a 20  ME CTIME_KW IF. 
1630: 20 2e 0a 25 77 69 6c 64 63 61 72 64 20 41 4e 59   ..%wildcard ANY
1640: 2e 0a 0a 2f 2f 20 44 65 66 69 6e 65 20 6f 70 65  ...// Define ope
1650: 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e 63 65  rator precedence
1660: 20 65 61 72 6c 79 20 73 6f 20 74 68 61 74 20 74   early so that t
1670: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1680: 20 6f 63 63 75 72 61 6e 63 65 0a 2f 2f 20 6f 66   occurance.// of
1690: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f   the operator to
16a0: 6b 65 6e 73 20 69 6e 20 74 68 65 20 67 72 61 6d  kens in the gram
16b0: 6d 65 72 2e 20 20 4b 65 65 70 69 6e 67 20 74 68  mer.  Keeping th
16c0: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 67 65  e operators toge
16d0: 74 68 65 72 0a 2f 2f 20 63 61 75 73 65 73 20 74  ther.// causes t
16e0: 68 65 6d 20 74 6f 20 62 65 20 61 73 73 69 67 6e  hem to be assign
16f0: 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  ed integer value
1700: 73 20 74 68 61 74 20 61 72 65 20 63 6c 6f 73 65  s that are close
1710: 20 74 6f 67 65 74 68 65 72 2c 0a 2f 2f 20 77 68   together,.// wh
1720: 69 63 68 20 6b 65 65 70 73 20 70 61 72 73 65 72  ich keeps parser
1730: 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e   tables smaller.
1740: 0a 2f 2f 0a 2f 2f 20 54 68 65 20 74 6f 6b 65 6e  .//.// The token
1750: 20 76 61 6c 75 65 73 20 61 73 73 69 67 6e 65 64   values assigned
1760: 20 74 6f 20 74 68 65 73 65 20 73 79 6d 62 6f 6c   to these symbol
1770: 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  s is determined 
1780: 62 79 20 74 68 65 20 6f 72 64 65 72 0a 2f 2f 20  by the order.// 
1790: 69 6e 20 77 68 69 63 68 20 6c 65 6d 6f 6e 20 66  in which lemon f
17a0: 69 72 73 74 20 73 65 65 73 20 74 68 65 6d 2e 20  irst sees them. 
17b0: 20 49 74 20 6d 75 73 74 20 62 65 20 74 68 65 20   It must be the 
17c0: 63 61 73 65 20 74 68 61 74 20 49 53 4e 55 4c 4c  case that ISNULL
17d0: 2f 4e 4f 54 4e 55 4c 4c 2c 0a 2f 2f 20 4e 45 2f  /NOTNULL,.// NE/
17e0: 45 51 2c 20 47 54 2f 4c 45 2c 20 61 6e 64 20 47  EQ, GT/LE, and G
17f0: 45 2f 4c 54 20 61 72 65 20 73 65 70 61 72 61 74  E/LT are separat
1800: 65 64 20 62 79 20 6f 6e 6c 79 20 61 20 73 69 6e  ed by only a sin
1810: 67 6c 65 20 76 61 6c 75 65 2e 20 20 53 65 65 0a  gle value.  See.
1820: 2f 2f 20 74 68 65 20 73 71 6c 69 74 65 33 45 78  // the sqlite3Ex
1830: 70 72 49 66 46 61 6c 73 65 28 29 20 72 6f 75 74  prIfFalse() rout
1840: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
1850: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  al information o
1860: 6e 20 74 68 69 73 0a 2f 2f 20 63 6f 6e 73 74 72  n this.// constr
1870: 61 69 6e 74 2e 0a 2f 2f 0a 25 6c 65 66 74 20 4f  aint..//.%left O
1880: 52 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a 25 72  R..%left AND..%r
1890: 69 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66 74 20  ight NOT..%left 
18a0: 49 53 20 4d 41 54 43 48 20 4c 49 4b 45 5f 4b 57  IS MATCH LIKE_KW
18b0: 20 42 45 54 57 45 45 4e 20 49 4e 20 49 53 4e 55   BETWEEN IN ISNU
18c0: 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 4e 45 20 45 51  LL NOTNULL NE EQ
18d0: 2e 0a 25 6c 65 66 74 20 47 54 20 4c 45 20 4c 54  ..%left GT LE LT
18e0: 20 47 45 2e 0a 25 72 69 67 68 74 20 45 53 43 41   GE..%right ESCA
18f0: 50 45 2e 0a 25 6c 65 66 74 20 42 49 54 41 4e 44  PE..%left BITAND
1900: 20 42 49 54 4f 52 20 4c 53 48 49 46 54 20 52 53   BITOR LSHIFT RS
1910: 48 49 46 54 2e 0a 25 6c 65 66 74 20 50 4c 55 53  HIFT..%left PLUS
1920: 20 4d 49 4e 55 53 2e 0a 25 6c 65 66 74 20 53 54   MINUS..%left ST
1930: 41 52 20 53 4c 41 53 48 20 52 45 4d 2e 0a 25 6c  AR SLASH REM..%l
1940: 65 66 74 20 43 4f 4e 43 41 54 2e 0a 25 6c 65 66  eft CONCAT..%lef
1950: 74 20 43 4f 4c 4c 41 54 45 2e 0a 25 72 69 67 68  t COLLATE..%righ
1960: 74 20 55 4d 49 4e 55 53 20 55 50 4c 55 53 20 42  t UMINUS UPLUS B
1970: 49 54 4e 4f 54 2e 0a 0a 2f 2f 20 41 6e 64 20 22  ITNOT...// And "
1980: 69 64 73 22 20 69 73 20 61 6e 20 69 64 65 6e 74  ids" is an ident
1990: 69 66 65 72 2d 6f 72 2d 73 74 72 69 6e 67 2e 0a  ifer-or-string..
19a0: 2f 2f 0a 25 74 79 70 65 20 69 64 73 20 7b 54 6f  //.%type ids {To
19b0: 6b 65 6e 7d 0a 69 64 73 28 41 29 20 3a 3a 3d 20  ken}.ids(A) ::= 
19c0: 49 44 7c 53 54 52 49 4e 47 28 58 29 2e 20 20 20  ID|STRING(X).   
19d0: 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65  {A = X;}..// The
19e0: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
19f0: 6e 20 6f 72 20 74 61 62 6c 65 20 63 61 6e 20 62  n or table can b
1a00: 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
1a10: 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a 25 74 79 70 65  lowing:.//.%type
1a20: 20 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e 6d 28 41   nm {Token}.nm(A
1a30: 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20 20 20  ) ::= ID(X).    
1a40: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d       {A = X;}.nm
1a50: 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58  (A) ::= STRING(X
1a60: 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a  ).     {A = X;}.
1a70: 6e 6d 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b  nm(A) ::= JOIN_K
1a80: 57 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b  W(X).    {A = X;
1a90: 7d 0a 0a 2f 2f 20 41 20 74 79 70 65 74 6f 6b 65  }..// A typetoke
1aa0: 6e 20 69 73 20 72 65 61 6c 6c 79 20 6f 6e 65 20  n is really one 
1ab0: 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e 73 20 74  or more tokens t
1ac0: 68 61 74 20 66 6f 72 6d 20 61 20 74 79 70 65 20  hat form a type 
1ad0: 6e 61 6d 65 20 73 75 63 68 0a 2f 2f 20 61 73 20  name such.// as 
1ae0: 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 61 66 74  can be found aft
1af0: 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  er the column na
1b00: 6d 65 20 69 6e 20 61 20 43 52 45 41 54 45 20 54  me in a CREATE T
1b10: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
1b20: 2f 2f 20 4d 75 6c 74 69 70 6c 65 20 74 6f 6b 65  // Multiple toke
1b30: 6e 73 20 61 72 65 20 63 6f 6e 63 61 74 65 6e 61  ns are concatena
1b40: 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 20  ted to form the 
1b50: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74 79 70  value of the typ
1b60: 65 74 6f 6b 65 6e 2e 0a 2f 2f 0a 25 74 79 70 65  etoken..//.%type
1b70: 20 74 79 70 65 74 6f 6b 65 6e 20 7b 54 6f 6b 65   typetoken {Toke
1b80: 6e 7d 0a 74 79 70 65 20 3a 3a 3d 20 2e 0a 74 79  n}.type ::= ..ty
1b90: 70 65 20 3a 3a 3d 20 74 79 70 65 74 6f 6b 65 6e  pe ::= typetoken
1ba0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
1bb0: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41         {sqlite3A
1bc0: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61  ddColumnType(pPa
1bd0: 72 73 65 2c 26 58 29 3b 7d 0a 74 79 70 65 74 6f  rse,&X);}.typeto
1be0: 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e  ken(A) ::= typen
1bf0: 61 6d 65 28 58 29 2e 20 20 20 7b 41 20 3d 20 58  ame(X).   {A = X
1c00: 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20  ;}.typetoken(A) 
1c10: 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 20  ::= typename(X) 
1c20: 4c 50 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e  LP signed RP(Y).
1c30: 20 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e 7a 3b 0a   {.  A.z = X.z;.
1c40: 20 20 41 2e 6e 20 3d 20 26 59 2e 7a 5b 59 2e 6e    A.n = &Y.z[Y.n
1c50: 5d 20 2d 20 58 2e 7a 3b 0a 7d 0a 74 79 70 65 74  ] - X.z;.}.typet
1c60: 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79 70 65  oken(A) ::= type
1c70: 6e 61 6d 65 28 58 29 20 4c 50 20 73 69 67 6e 65  name(X) LP signe
1c80: 64 20 43 4f 4d 4d 41 20 73 69 67 6e 65 64 20 52  d COMMA signed R
1c90: 50 28 59 29 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20  P(Y). {.  A.z = 
1ca0: 58 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20 26 59 2e  X.z;.  A.n = &Y.
1cb0: 7a 5b 59 2e 6e 5d 20 2d 20 58 2e 7a 3b 0a 7d 0a  z[Y.n] - X.z;.}.
1cc0: 25 74 79 70 65 20 74 79 70 65 6e 61 6d 65 20 7b  %type typename {
1cd0: 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61 6d 65 28  Token}.typename(
1ce0: 41 29 20 3a 3a 3d 20 69 64 73 28 58 29 2e 20 20  A) ::= ids(X).  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
1d00: 58 3b 7d 0a 74 79 70 65 6e 61 6d 65 28 41 29 20  X;}.typename(A) 
1d10: 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 20  ::= typename(X) 
1d20: 69 64 73 28 59 29 2e 20 7b 41 2e 7a 3d 58 2e 7a  ids(Y). {A.z=X.z
1d30: 3b 20 41 2e 6e 3d 59 2e 6e 2b 28 59 2e 7a 2d 58  ; A.n=Y.n+(Y.z-X
1d40: 2e 7a 29 3b 7d 0a 73 69 67 6e 65 64 20 3a 3a 3d  .z);}.signed ::=
1d50: 20 70 6c 75 73 5f 6e 75 6d 2e 0a 73 69 67 6e 65   plus_num..signe
1d60: 64 20 3a 3a 3d 20 6d 69 6e 75 73 5f 6e 75 6d 2e  d ::= minus_num.
1d70: 0a 0a 2f 2f 20 22 63 61 72 67 6c 69 73 74 22 20  ..// "carglist" 
1d80: 69 73 20 61 20 6c 69 73 74 20 6f 66 20 61 64 64  is a list of add
1d90: 69 74 69 6f 6e 61 6c 20 63 6f 6e 73 74 72 61 69  itional constrai
1da0: 6e 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66  nts that come af
1db0: 74 65 72 20 74 68 65 0a 2f 2f 20 63 6f 6c 75 6d  ter the.// colum
1dc0: 6e 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  n name and colum
1dd0: 6e 20 74 79 70 65 20 69 6e 20 61 20 43 52 45 41  n type in a CREA
1de0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
1df0: 6e 74 2e 0a 2f 2f 0a 63 61 72 67 6c 69 73 74 20  nt..//.carglist 
1e00: 3a 3a 3d 20 63 61 72 67 6c 69 73 74 20 63 61 72  ::= carglist car
1e10: 67 2e 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20  g..carglist ::= 
1e20: 2e 0a 63 61 72 67 20 3a 3a 3d 20 43 4f 4e 53 54  ..carg ::= CONST
1e30: 52 41 49 4e 54 20 6e 6d 20 63 63 6f 6e 73 2e 0a  RAINT nm ccons..
1e40: 63 61 72 67 20 3a 3a 3d 20 63 63 6f 6e 73 2e 0a  carg ::= ccons..
1e50: 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c  ccons ::= DEFAUL
1e60: 54 20 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20  T term(X).      
1e70: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
1e80: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
1e90: 61 72 73 65 2c 58 29 3b 7d 0a 63 63 6f 6e 73 20  arse,X);}.ccons 
1ea0: 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4c 50 20 65  ::= DEFAULT LP e
1eb0: 78 70 72 28 58 29 20 52 50 2e 20 20 20 20 20 20  xpr(X) RP.      
1ec0: 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75  {sqlite3AddDefau
1ed0: 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 58  ltValue(pParse,X
1ee0: 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45  );}.ccons ::= DE
1ef0: 46 41 55 4c 54 20 50 4c 55 53 20 74 65 72 6d 28  FAULT PLUS term(
1f00: 58 29 2e 20 20 20 20 20 20 20 7b 73 71 6c 69 74  X).       {sqlit
1f10: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
1f20: 65 28 70 50 61 72 73 65 2c 58 29 3b 7d 0a 63 63  e(pParse,X);}.cc
1f30: 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  ons ::= DEFAULT 
1f40: 4d 49 4e 55 53 20 74 65 72 6d 28 58 29 2e 20 20  MINUS term(X).  
1f50: 20 20 20 20 7b 0a 20 20 45 78 70 72 20 2a 70 20      {.  Expr *p 
1f60: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
1f70: 50 61 72 73 65 2c 20 54 4b 5f 55 4d 49 4e 55 53  Parse, TK_UMINUS
1f80: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
1f90: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
1fa0: 61 6c 75 65 28 70 50 61 72 73 65 2c 70 29 3b 0a  alue(pParse,p);.
1fb0: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41  }.ccons ::= DEFA
1fc0: 55 4c 54 20 69 64 28 58 29 2e 20 20 20 20 20 20  ULT id(X).      
1fd0: 20 20 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72          {.  Expr
1fe0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 50 45 78   *p = sqlite3PEx
1ff0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 54  pr(pParse, TK_ST
2000: 52 49 4e 47 2c 20 30 2c 20 30 2c 20 26 58 29 3b  RING, 0, 0, &X);
2010: 0a 20 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  .  sqlite3AddDef
2020: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
2030: 2c 70 29 3b 0a 7d 0a 0a 2f 2f 20 49 6e 20 61 64  ,p);.}..// In ad
2040: 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 79  dition to the ty
2050: 70 65 20 6e 61 6d 65 2c 20 77 65 20 61 6c 73 6f  pe name, we also
2060: 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
2070: 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 0a  primary key and.
2080: 2f 2f 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  // UNIQUE constr
2090: 61 69 6e 74 73 2e 0a 2f 2f 0a 63 63 6f 6e 73 20  aints..//.ccons 
20a0: 3a 3a 3d 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 2e  ::= NULL onconf.
20b0: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 4f 54 20 4e  .ccons ::= NOT N
20c0: 55 4c 4c 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20  ULL onconf(R).  
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
20e0: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
20f0: 70 50 61 72 73 65 2c 20 52 29 3b 7d 0a 63 63 6f  pParse, R);}.cco
2100: 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b  ns ::= PRIMARY K
2110: 45 59 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 20  EY sortorder(Z) 
2120: 6f 6e 63 6f 6e 66 28 52 29 20 61 75 74 6f 69 6e  onconf(R) autoin
2130: 63 28 49 29 2e 0a 20 20 20 20 20 20 20 20 20 20  c(I)..          
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
2160: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
2170: 28 70 50 61 72 73 65 2c 30 2c 52 2c 49 2c 5a 29  (pParse,0,R,I,Z)
2180: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49  ;}.ccons ::= UNI
2190: 51 55 45 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20  QUE onconf(R).  
21a0: 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74 65    {sqlite3Create
21b0: 49 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30  Index(pParse,0,0
21c0: 2c 30 2c 30 2c 52 2c 30 2c 30 2c 30 2c 30 29 3b  ,0,0,R,0,0,0,0);
21d0: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43  }.ccons ::= CHEC
21e0: 4b 20 4c 50 20 65 78 70 72 28 58 29 20 52 50 2e  K LP expr(X) RP.
21f0: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41         {sqlite3A
2200: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
2210: 74 28 70 50 61 72 73 65 2c 58 29 3b 7d 0a 63 63  t(pParse,X);}.cc
2220: 6f 6e 73 20 3a 3a 3d 20 52 45 46 45 52 45 4e 43  ons ::= REFERENC
2230: 45 53 20 6e 6d 28 54 29 20 69 64 78 6c 69 73 74  ES nm(T) idxlist
2240: 5f 6f 70 74 28 54 41 29 20 72 65 66 61 72 67 73  _opt(TA) refargs
2250: 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (R)..           
2260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2270: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65       {sqlite3Cre
2280: 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 70 50  ateForeignKey(pP
2290: 61 72 73 65 2c 30 2c 26 54 2c 54 41 2c 52 29 3b  arse,0,&T,TA,R);
22a0: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 64 65 66 65  }.ccons ::= defe
22b0: 72 5f 73 75 62 63 6c 61 75 73 65 28 44 29 2e 20  r_subclause(D). 
22c0: 20 20 7b 73 71 6c 69 74 65 33 44 65 66 65 72 46    {sqlite3DeferF
22d0: 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65  oreignKey(pParse
22e0: 2c 44 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,D);}.ccons ::= 
22f0: 43 4f 4c 4c 41 54 45 20 69 64 28 43 29 2e 20 20  COLLATE id(C).  
2300: 7b 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61  {sqlite3AddColla
2310: 74 65 54 79 70 65 28 70 50 61 72 73 65 2c 20 28  teType(pParse, (
2320: 63 68 61 72 2a 29 43 2e 7a 2c 20 43 2e 6e 29 3b  char*)C.z, C.n);
2330: 7d 0a 0a 2f 2f 20 54 68 65 20 6f 70 74 69 6f 6e  }..// The option
2340: 61 6c 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  al AUTOINCREMENT
2350: 20 6b 65 79 77 6f 72 64 0a 25 74 79 70 65 20 61   keyword.%type a
2360: 75 74 6f 69 6e 63 20 7b 69 6e 74 7d 0a 61 75 74  utoinc {int}.aut
2370: 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 2e 20 20 20  oinc(X) ::= .   
2380: 20 20 20 20 20 20 20 7b 58 20 3d 20 30 3b 7d 0a         {X = 0;}.
2390: 61 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 41  autoinc(X) ::= A
23a0: 55 54 4f 49 4e 43 52 2e 20 20 7b 58 20 3d 20 31  UTOINCR.  {X = 1
23b0: 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e 65 78 74 20  ;}..// The next 
23c0: 67 72 6f 75 70 20 6f 66 20 72 75 6c 65 73 20 70  group of rules p
23d0: 61 72 73 65 73 20 74 68 65 20 61 72 67 75 6d 65  arses the argume
23e0: 6e 74 73 20 74 6f 20 61 20 52 45 46 45 52 45 4e  nts to a REFEREN
23f0: 43 45 53 20 63 6c 61 75 73 65 0a 2f 2f 20 74 68  CES clause.// th
2400: 61 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  at determine if 
2410: 74 68 65 20 72 65 66 65 72 65 6e 74 69 61 6c 20  the referential 
2420: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69  integrity checki
2430: 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 20 6f  ng is deferred o
2440: 72 0a 2f 2f 20 6f 72 20 69 6d 6d 65 64 69 61 74  r.// or immediat
2450: 65 20 61 6e 64 20 77 68 69 63 68 20 64 65 74 65  e and which dete
2460: 72 6d 69 6e 65 20 77 68 61 74 20 61 63 74 69 6f  rmine what actio
2470: 6e 20 74 6f 20 74 61 6b 65 20 69 66 20 61 20 72  n to take if a r
2480: 65 66 2d 69 6e 74 65 67 0a 2f 2f 20 63 68 65 63  ef-integ.// chec
2490: 6b 20 66 61 69 6c 73 2e 0a 2f 2f 0a 25 74 79 70  k fails..//.%typ
24a0: 65 20 72 65 66 61 72 67 73 20 7b 69 6e 74 7d 0a  e refargs {int}.
24b0: 72 65 66 61 72 67 73 28 41 29 20 3a 3a 3d 20 2e  refargs(A) ::= .
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65       { A = OE_Re
24e0: 73 74 72 69 63 74 20 2a 20 30 78 30 31 30 31 30  strict * 0x01010
24f0: 31 3b 20 7d 0a 72 65 66 61 72 67 73 28 41 29 20  1; }.refargs(A) 
2500: 3a 3a 3d 20 72 65 66 61 72 67 73 28 58 29 20 72  ::= refargs(X) r
2510: 65 66 61 72 67 28 59 29 2e 20 7b 20 41 20 3d 20  efarg(Y). { A = 
2520: 28 58 20 26 20 59 2e 6d 61 73 6b 29 20 7c 20 59  (X & Y.mask) | Y
2530: 2e 76 61 6c 75 65 3b 20 7d 0a 25 74 79 70 65 20  .value; }.%type 
2540: 72 65 66 61 72 67 20 7b 73 74 72 75 63 74 20 7b  refarg {struct {
2550: 69 6e 74 20 76 61 6c 75 65 3b 20 69 6e 74 20 6d  int value; int m
2560: 61 73 6b 3b 7d 7d 0a 72 65 66 61 72 67 28 41 29  ask;}}.refarg(A)
2570: 20 3a 3a 3d 20 4d 41 54 43 48 20 6e 6d 2e 20 20   ::= MATCH nm.  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 2e              { A.
2590: 76 61 6c 75 65 20 3d 20 30 3b 20 20 20 20 20 41  value = 0;     A
25a0: 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 30 30  .mask = 0x000000
25b0: 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a  ; }.refarg(A) ::
25c0: 3d 20 4f 4e 20 44 45 4c 45 54 45 20 72 65 66 61  = ON DELETE refa
25d0: 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c  ct(X).   { A.val
25e0: 75 65 20 3d 20 58 3b 20 20 20 20 20 41 2e 6d 61  ue = X;     A.ma
25f0: 73 6b 20 3d 20 30 78 30 30 30 30 66 66 3b 20 7d  sk = 0x0000ff; }
2600: 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f  .refarg(A) ::= O
2610: 4e 20 55 50 44 41 54 45 20 72 65 66 61 63 74 28  N UPDATE refact(
2620: 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20  X).   { A.value 
2630: 3d 20 58 3c 3c 38 3b 20 20 41 2e 6d 61 73 6b 20  = X<<8;  A.mask 
2640: 3d 20 30 78 30 30 66 66 30 30 3b 20 7d 0a 72 65  = 0x00ff00; }.re
2650: 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 49  farg(A) ::= ON I
2660: 4e 53 45 52 54 20 72 65 66 61 63 74 28 58 29 2e  NSERT refact(X).
2670: 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58     { A.value = X
2680: 3c 3c 31 36 3b 20 41 2e 6d 61 73 6b 20 3d 20 30  <<16; A.mask = 0
2690: 78 66 66 30 30 30 30 3b 20 7d 0a 25 74 79 70 65  xff0000; }.%type
26a0: 20 72 65 66 61 63 74 20 7b 69 6e 74 7d 0a 72 65   refact {int}.re
26b0: 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45 54 20  fact(A) ::= SET 
26c0: 4e 55 4c 4c 2e 20 20 20 20 20 20 20 20 20 20 20  NULL.           
26d0: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74 4e     { A = OE_SetN
26e0: 75 6c 6c 3b 20 7d 0a 72 65 66 61 63 74 28 41 29  ull; }.refact(A)
26f0: 20 3a 3a 3d 20 53 45 54 20 44 45 46 41 55 4c 54   ::= SET DEFAULT
2700: 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20  .           { A 
2710: 3d 20 4f 45 5f 53 65 74 44 66 6c 74 3b 20 7d 0a  = OE_SetDflt; }.
2720: 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 43 41  refact(A) ::= CA
2730: 53 43 41 44 45 2e 20 20 20 20 20 20 20 20 20 20  SCADE.          
2740: 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 43 61       { A = OE_Ca
2750: 73 63 61 64 65 3b 20 7d 0a 72 65 66 61 63 74 28  scade; }.refact(
2760: 41 29 20 3a 3a 3d 20 52 45 53 54 52 49 43 54 2e  A) ::= RESTRICT.
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
2780: 41 20 3d 20 4f 45 5f 52 65 73 74 72 69 63 74 3b  A = OE_Restrict;
2790: 20 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f 73   }.%type defer_s
27a0: 75 62 63 6c 61 75 73 65 20 7b 69 6e 74 7d 0a 64  ubclause {int}.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 4e 4f 54 20 44 45 46 45 52 52  ) ::= NOT DEFERR
27d0: 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72 72  ABLE init_deferr
27e0: 65 64 5f 70 72 65 64 5f 6f 70 74 28 58 29 2e 20  ed_pred_opt(X). 
27f0: 20 7b 41 20 3d 20 58 3b 7d 0a 64 65 66 65 72 5f   {A = X;}.defer_
2800: 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d  subclause(A) ::=
2810: 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e 69 74   DEFERRABLE init
2820: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f  _deferred_pred_o
2830: 70 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d  pt(X).      {A =
2840: 20 58 3b 7d 0a 25 74 79 70 65 20 69 6e 69 74 5f   X;}.%type init_
2850: 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70  deferred_pred_op
2860: 74 20 7b 69 6e 74 7d 0a 69 6e 69 74 5f 64 65 66  t {int}.init_def
2870: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41  erred_pred_opt(A
2880: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
28a0: 20 3d 20 30 3b 7d 0a 69 6e 69 74 5f 64 65 66 65   = 0;}.init_defe
28b0: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29  rred_pred_opt(A)
28c0: 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 44   ::= INITIALLY D
28d0: 45 46 45 52 52 45 44 2e 20 20 20 20 20 7b 41 20  EFERRED.     {A 
28e0: 3d 20 31 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 72  = 1;}.init_defer
28f0: 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 20  red_pred_opt(A) 
2900: 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  ::= INITIALLY IM
2910: 4d 45 44 49 41 54 45 2e 20 20 20 20 7b 41 20 3d  MEDIATE.    {A =
2920: 20 30 3b 7d 0a 0a 2f 2f 20 46 6f 72 20 74 68 65   0;}..// For the
2930: 20 74 69 6d 65 20 62 65 69 6e 67 2c 20 74 68 65   time being, the
2940: 20 6f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74   only constraint
2950: 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 69   we care about i
2960: 73 20 74 68 65 20 70 72 69 6d 61 72 79 0a 2f 2f  s the primary.//
2970: 20 6b 65 79 20 61 6e 64 20 55 4e 49 51 55 45 2e   key and UNIQUE.
2980: 20 20 42 6f 74 68 20 63 72 65 61 74 65 20 69 6e    Both create in
2990: 64 69 63 65 73 2e 0a 2f 2f 0a 63 6f 6e 73 6c 69  dices..//.consli
29a0: 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  st_opt(A) ::= . 
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 7b 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20    {A.n = 0; A.z 
29d0: 3d 20 30 3b 7d 0a 63 6f 6e 73 6c 69 73 74 5f 6f  = 0;}.conslist_o
29e0: 70 74 28 41 29 20 3a 3a 3d 20 43 4f 4d 4d 41 28  pt(A) ::= COMMA(
29f0: 58 29 20 63 6f 6e 73 6c 69 73 74 2e 20 20 7b 41  X) conslist.  {A
2a00: 20 3d 20 58 3b 7d 0a 63 6f 6e 73 6c 69 73 74 20   = X;}.conslist 
2a10: 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 43 4f 4d  ::= conslist COM
2a20: 4d 41 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69  MA tcons..consli
2a30: 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20  st ::= conslist 
2a40: 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20  tcons..conslist 
2a50: 3a 3a 3d 20 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73  ::= tcons..tcons
2a60: 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20   ::= CONSTRAINT 
2a70: 6e 6d 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50 52  nm..tcons ::= PR
2a80: 49 4d 41 52 59 20 4b 45 59 20 4c 50 20 69 64 78  IMARY KEY LP idx
2a90: 6c 69 73 74 28 58 29 20 61 75 74 6f 69 6e 63 28  list(X) autoinc(
2aa0: 49 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e  I) RP onconf(R).
2ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
2ae0: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
2af0: 70 50 61 72 73 65 2c 58 2c 52 2c 49 2c 30 29 3b  pParse,X,R,I,0);
2b00: 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51  }.tcons ::= UNIQ
2b10: 55 45 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29  UE LP idxlist(X)
2b20: 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20   RP onconf(R).. 
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b50: 7b 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e  {sqlite3CreateIn
2b60: 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  dex(pParse,0,0,0
2b70: 2c 58 2c 52 2c 30 2c 30 2c 30 2c 30 29 3b 7d 0a  ,X,R,0,0,0,0);}.
2b80: 74 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20  tcons ::= CHECK 
2b90: 4c 50 20 65 78 70 72 28 45 29 20 52 50 20 6f 6e  LP expr(E) RP on
2ba0: 63 6f 6e 66 2e 20 7b 73 71 6c 69 74 65 33 41 64  conf. {sqlite3Ad
2bb0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
2bc0: 28 70 50 61 72 73 65 2c 45 29 3b 7d 0a 74 63 6f  (pParse,E);}.tco
2bd0: 6e 73 20 3a 3a 3d 20 46 4f 52 45 49 47 4e 20 4b  ns ::= FOREIGN K
2be0: 45 59 20 4c 50 20 69 64 78 6c 69 73 74 28 46 41  EY LP idxlist(FA
2bf0: 29 20 52 50 0a 20 20 20 20 20 20 20 20 20 20 52  ) RP.          R
2c00: 45 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29 20  EFERENCES nm(T) 
2c10: 69 64 78 6c 69 73 74 5f 6f 70 74 28 54 41 29 20  idxlist_opt(TA) 
2c20: 72 65 66 61 72 67 73 28 52 29 20 64 65 66 65 72  refargs(R) defer
2c30: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 44  _subclause_opt(D
2c40: 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ). {.    sqlite3
2c50: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
2c60: 28 70 50 61 72 73 65 2c 20 46 41 2c 20 26 54 2c  (pParse, FA, &T,
2c70: 20 54 41 2c 20 52 29 3b 0a 20 20 20 20 73 71 6c   TA, R);.    sql
2c80: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
2c90: 4b 65 79 28 70 50 61 72 73 65 2c 20 44 29 3b 0a  Key(pParse, D);.
2ca0: 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f 73 75  }.%type defer_su
2cb0: 62 63 6c 61 75 73 65 5f 6f 70 74 20 7b 69 6e 74  bclause_opt {int
2cc0: 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  }.defer_subclaus
2cd0: 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  e_opt(A) ::= .  
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72    {A = 0;}.defer
2d00: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 41  _subclause_opt(A
2d10: 29 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62 63  ) ::= defer_subc
2d20: 6c 61 75 73 65 28 58 29 2e 20 20 7b 41 20 3d 20  lause(X).  {A = 
2d30: 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c  X;}..// The foll
2d40: 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73  owing is a non-s
2d50: 74 61 6e 64 61 72 64 20 65 78 74 65 6e 73 69 6f  tandard extensio
2d60: 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73  n that allows us
2d70: 20 74 6f 20 64 65 63 6c 61 72 65 20 74 68 65 0a   to declare the.
2d80: 2f 2f 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  // default behav
2d90: 69 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20 69  ior when there i
2da0: 73 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  s a constraint c
2db0: 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70  onflict..//.%typ
2dc0: 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25  e onconf {int}.%
2dd0: 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74  type orconf {int
2de0: 7d 0a 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74  }.%type resolvet
2df0: 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66  ype {int}.onconf
2e00: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44         {A = OE_D
2e30: 65 66 61 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28  efault;}.onconf(
2e40: 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49  A) ::= ON CONFLI
2e50: 43 54 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58  CT resolvetype(X
2e60: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f  ).    {A = X;}.o
2e70: 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20  rconf(A) ::= .  
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
2ea0: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72   OE_Default;}.or
2eb0: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72  conf(A) ::= OR r
2ec0: 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20  esolvetype(X).  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2ee0: 58 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28  X;}.resolvetype(
2ef0: 41 29 20 3a 3a 3d 20 72 61 69 73 65 74 79 70 65  A) ::= raisetype
2f00: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
2f10: 20 7b 41 20 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76   {A = X;}.resolv
2f20: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 49 47 4e  etype(A) ::= IGN
2f30: 4f 52 45 2e 20 20 20 20 20 20 20 20 20 20 20 20  ORE.            
2f40: 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 49         {A = OE_I
2f50: 67 6e 6f 72 65 3b 7d 0a 72 65 73 6f 6c 76 65 74  gnore;}.resolvet
2f60: 79 70 65 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41  ype(A) ::= REPLA
2f70: 43 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  CE.             
2f80: 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 52 65 70       {A = OE_Rep
2f90: 6c 61 63 65 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  lace;}..////////
2fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2fb0: 2f 2f 20 54 68 65 20 44 52 4f 50 20 54 41 42 4c  // The DROP TABL
2fc0: 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  E //////////////
2fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2fe0: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
2ff0: 3a 3d 20 44 52 4f 50 20 54 41 42 4c 45 20 69 66  := DROP TABLE if
3000: 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61  exists(E) fullna
3010: 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74  me(X). {.  sqlit
3020: 65 33 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  e3DropTable(pPar
3030: 73 65 2c 20 58 2c 20 30 2c 20 45 29 3b 0a 7d 0a  se, X, 0, E);.}.
3040: 25 74 79 70 65 20 69 66 65 78 69 73 74 73 20 7b  %type ifexists {
3050: 69 6e 74 7d 0a 69 66 65 78 69 73 74 73 28 41 29  int}.ifexists(A)
3060: 20 3a 3a 3d 20 49 46 20 45 58 49 53 54 53 2e 20   ::= IF EXISTS. 
3070: 20 20 7b 41 20 3d 20 31 3b 7d 0a 69 66 65 78 69    {A = 1;}.ifexi
3080: 73 74 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  sts(A) ::= .    
3090: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
30a0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
30b0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41  /////// The CREA
30c0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
30d0: 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  t //////////////
30e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
30f0: 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  //.%ifndef SQLIT
3100: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 63 6d 64 20  E_OMIT_VIEW.cmd 
3110: 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 20 74 65  ::= CREATE(X) te
3120: 6d 70 28 54 29 20 56 49 45 57 20 69 66 6e 6f 74  mp(T) VIEW ifnot
3130: 65 78 69 73 74 73 28 45 29 20 6e 6d 28 59 29 20  exists(E) nm(Y) 
3140: 64 62 6e 6d 28 5a 29 20 41 53 20 73 65 6c 65 63  dbnm(Z) AS selec
3150: 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  t(S). {.  sqlite
3160: 33 43 72 65 61 74 65 56 69 65 77 28 70 50 61 72  3CreateView(pPar
3170: 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a 2c 20  se, &X, &Y, &Z, 
3180: 53 2c 20 54 2c 20 45 29 3b 0a 7d 0a 63 6d 64 20  S, T, E);.}.cmd 
3190: 3a 3a 3d 20 44 52 4f 50 20 56 49 45 57 20 69 66  ::= DROP VIEW if
31a0: 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61  exists(E) fullna
31b0: 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74  me(X). {.  sqlit
31c0: 65 33 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  e3DropTable(pPar
31d0: 73 65 2c 20 58 2c 20 31 2c 20 45 29 3b 0a 7d 0a  se, X, 1, E);.}.
31e0: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
31f0: 4d 49 54 5f 56 49 45 57 0a 0a 2f 2f 2f 2f 2f 2f  MIT_VIEW..//////
3200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3210: 2f 2f 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  // The SELECT st
3220: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
3230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
3250: 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20   ::= select(X). 
3260: 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   {.  sqlite3Sele
3270: 63 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53 52  ct(pParse, X, SR
3280: 54 5f 43 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30  T_Callback, 0, 0
3290: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
32a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
32b0: 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  e(X);.}..%type s
32c0: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
32d0: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
32e0: 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  ct {sqlite3Selec
32f0: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
3300: 79 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53  ype oneselect {S
3310: 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63  elect*}.%destruc
3320: 74 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73  tor oneselect {s
3330: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3340: 74 65 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74  te($$);}..select
3350: 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63  (A) ::= oneselec
3360: 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  t(X).           
3370: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3380: 58 3b 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  X;}.%ifndef SQLI
3390: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
33a0: 5f 53 45 4c 45 43 54 0a 73 65 6c 65 63 74 28 41  _SELECT.select(A
33b0: 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 20  ) ::= select(X) 
33c0: 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 59  multiselect_op(Y
33d0: 29 20 6f 6e 65 73 65 6c 65 63 74 28 5a 29 2e 20  ) oneselect(Z). 
33e0: 20 7b 0a 20 20 69 66 28 20 5a 20 29 7b 0a 20 20   {.  if( Z ){.  
33f0: 20 20 5a 2d 3e 6f 70 20 3d 20 59 3b 0a 20 20 20    Z->op = Y;.   
3400: 20 5a 2d 3e 70 50 72 69 6f 72 20 3d 20 58 3b 0a   Z->pPrior = X;.
3410: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
3420: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
3430: 28 58 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 5a  (X);.  }.  A = Z
3440: 3b 0a 7d 0a 25 74 79 70 65 20 6d 75 6c 74 69 73  ;.}.%type multis
3450: 65 6c 65 63 74 5f 6f 70 20 7b 69 6e 74 7d 0a 6d  elect_op {int}.m
3460: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29  ultiselect_op(A)
3470: 20 3a 3a 3d 20 55 4e 49 4f 4e 28 4f 50 29 2e 20   ::= UNION(OP). 
3480: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3490: 20 40 4f 50 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65   @OP;}.multisele
34a0: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49  ct_op(A) ::= UNI
34b0: 4f 4e 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 20  ON ALL.         
34c0: 20 20 20 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b      {A = TK_ALL;
34d0: 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70  }.multiselect_op
34e0: 28 41 29 20 3a 3a 3d 20 45 58 43 45 50 54 7c 49  (A) ::= EXCEPT|I
34f0: 4e 54 45 52 53 45 43 54 28 4f 50 29 2e 20 20 7b  NTERSECT(OP).  {
3500: 41 20 3d 20 40 4f 50 3b 7d 0a 25 65 6e 64 69 66  A = @OP;}.%endif
3510: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
3520: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 6f 6e 65  POUND_SELECT.one
3530: 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 53 45  select(A) ::= SE
3540: 4c 45 43 54 20 64 69 73 74 69 6e 63 74 28 44 29  LECT distinct(D)
3550: 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57 29 20 66   selcollist(W) f
3560: 72 6f 6d 28 58 29 20 77 68 65 72 65 5f 6f 70 74  rom(X) where_opt
3570: 28 59 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (Y).            
3580: 20 20 20 20 20 67 72 6f 75 70 62 79 5f 6f 70 74       groupby_opt
3590: 28 50 29 20 68 61 76 69 6e 67 5f 6f 70 74 28 51  (P) having_opt(Q
35a0: 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 5a 29  ) orderby_opt(Z)
35b0: 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b   limit_opt(L). {
35c0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 65  .  A = sqlite3Se
35d0: 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c 57  lectNew(pParse,W
35e0: 2c 58 2c 59 2c 50 2c 51 2c 5a 2c 44 2c 4c 2e 70  ,X,Y,P,Q,Z,D,L.p
35f0: 4c 69 6d 69 74 2c 4c 2e 70 4f 66 66 73 65 74 29  Limit,L.pOffset)
3600: 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20 22 64 69 73  ;.}..// The "dis
3610: 74 69 6e 63 74 22 20 6e 6f 6e 74 65 72 6d 69 6e  tinct" nontermin
3620: 61 6c 20 69 73 20 74 72 75 65 20 28 31 29 20 69  al is true (1) i
3630: 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b  f the DISTINCT k
3640: 65 79 77 6f 72 64 20 69 73 0a 2f 2f 20 70 72 65  eyword is.// pre
3650: 73 65 6e 74 20 61 6e 64 20 66 61 6c 73 65 20 28  sent and false (
3660: 30 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e  0) if it is not.
3670: 0a 2f 2f 0a 25 74 79 70 65 20 64 69 73 74 69 6e  .//.%type distin
3680: 63 74 20 7b 69 6e 74 7d 0a 64 69 73 74 69 6e 63  ct {int}.distinc
3690: 74 28 41 29 20 3a 3a 3d 20 44 49 53 54 49 4e 43  t(A) ::= DISTINC
36a0: 54 2e 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 64 69  T.   {A = 1;}.di
36b0: 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 41 4c  stinct(A) ::= AL
36c0: 4c 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30  L.        {A = 0
36d0: 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a  ;}.distinct(A) :
36e0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 7b  := .           {
36f0: 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73 65 6c 63  A = 0;}..// selc
3700: 6f 6c 6c 69 73 74 20 69 73 20 61 20 6c 69 73 74  ollist is a list
3710: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
3720: 74 68 61 74 20 61 72 65 20 74 6f 20 62 65 63 6f  that are to beco
3730: 6d 65 20 74 68 65 20 72 65 74 75 72 6e 0a 2f 2f  me the return.//
3740: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 53   values of the S
3750: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
3760: 20 20 54 68 65 20 22 2a 22 20 69 6e 20 73 74 61    The "*" in sta
3770: 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 2f 2f 20  tements like.// 
3780: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e  "SELECT * FROM .
3790: 2e 2e 22 20 69 73 20 65 6e 63 6f 64 65 64 20 61  .." is encoded a
37a0: 73 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  s a special expr
37b0: 65 73 73 69 6f 6e 20 77 69 74 68 20 61 6e 0a 2f  ession with an./
37c0: 2f 20 6f 70 63 6f 64 65 20 6f 66 20 54 4b 5f 41  / opcode of TK_A
37d0: 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 65 6c  LL..//.%type sel
37e0: 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  collist {ExprLis
37f0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3800: 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69  selcollist {sqli
3810: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3820: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 63  e($$);}.%type sc
3830: 6c 70 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  lp {ExprList*}.%
3840: 64 65 73 74 72 75 63 74 6f 72 20 73 63 6c 70 20  destructor sclp 
3850: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
3860: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 73 63 6c  Delete($$);}.scl
3870: 70 28 41 29 20 3a 3a 3d 20 73 65 6c 63 6f 6c 6c  p(A) ::= selcoll
3880: 69 73 74 28 58 29 20 43 4f 4d 4d 41 2e 20 20 20  ist(X) COMMA.   
3890: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
38a0: 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20 2e  ;}.sclp(A) ::= .
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38d0: 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c  {A = 0;}.selcoll
38e0: 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28  ist(A) ::= sclp(
38f0: 50 29 20 65 78 70 72 28 58 29 20 61 73 28 59 29  P) expr(X) as(Y)
3900: 2e 20 20 20 20 20 7b 0a 20 20 20 41 20 3d 20 73  .     {.   A = s
3910: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
3920: 70 65 6e 64 28 70 50 61 72 73 65 2c 50 2c 58 2c  pend(pParse,P,X,
3930: 59 2e 6e 3f 26 59 3a 30 29 3b 0a 7d 0a 73 65 6c  Y.n?&Y:0);.}.sel
3940: 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  collist(A) ::= s
3950: 63 6c 70 28 50 29 20 53 54 41 52 2e 20 7b 0a 20  clp(P) STAR. {. 
3960: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3970: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
3980: 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 29  TK_ALL, 0, 0, 0)
3990: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
39a0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
39b0: 61 72 73 65 2c 20 50 2c 20 70 2c 20 30 29 3b 0a  arse, P, p, 0);.
39c0: 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20  }.selcollist(A) 
39d0: 3a 3a 3d 20 73 63 6c 70 28 50 29 20 6e 6d 28 58  ::= sclp(P) nm(X
39e0: 29 20 44 4f 54 20 53 54 41 52 2e 20 7b 0a 20 20  ) DOT STAR. {.  
39f0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73  Expr *pRight = s
3a00: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
3a10: 73 65 2c 20 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30  se, TK_ALL, 0, 0
3a20: 2c 20 30 29 3b 0a 20 20 45 78 70 72 20 2a 70 4c  , 0);.  Expr *pL
3a30: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  eft = sqlite3PEx
3a40: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
3a50: 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45  , 0, 0, &X);.  E
3a60: 78 70 72 20 2a 70 44 6f 74 20 3d 20 73 71 6c 69  xpr *pDot = sqli
3a70: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
3a80: 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20   TK_DOT, pLeft, 
3a90: 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 41 20  pRight, 0);.  A 
3aa0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
3ab0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 50  tAppend(pParse,P
3ac0: 2c 20 70 44 6f 74 2c 20 30 29 3b 0a 7d 0a 0a 2f  , pDot, 0);.}../
3ad0: 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20  / An option "AS 
3ae0: 3c 69 64 3e 22 20 70 68 72 61 73 65 20 74 68 61  <id>" phrase tha
3af0: 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65  t can follow one
3b00: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
3b10: 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64 65 66 69  ons that.// defi
3b20: 6e 65 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ne the result se
3b30: 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  t, or one of the
3b40: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
3b50: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25  ROM clause..//.%
3b60: 74 79 70 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a  type as {Token}.
3b70: 61 73 28 58 29 20 3a 3a 3d 20 41 53 20 6e 6d 28  as(X) ::= AS nm(
3b80: 59 29 2e 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a  Y).    {X = Y;}.
3b90: 61 73 28 58 29 20 3a 3a 3d 20 69 64 73 28 59 29  as(X) ::= ids(Y)
3ba0: 2e 20 20 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a  .      {X = Y;}.
3bb0: 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20  as(X) ::= .     
3bc0: 20 20 20 20 20 20 20 7b 58 2e 6e 20 3d 20 30 3b         {X.n = 0;
3bd0: 7d 0a 0a 0a 25 74 79 70 65 20 73 65 6c 74 61 62  }...%type seltab
3be0: 6c 69 73 74 20 7b 53 72 63 4c 69 73 74 2a 7d 0a  list {SrcList*}.
3bf0: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 74  %destructor selt
3c00: 61 62 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 53  ablist {sqlite3S
3c10: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  rcListDelete($$)
3c20: 3b 7d 0a 25 74 79 70 65 20 73 74 6c 5f 70 72 65  ;}.%type stl_pre
3c30: 66 69 78 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25  fix {SrcList*}.%
3c40: 64 65 73 74 72 75 63 74 6f 72 20 73 74 6c 5f 70  destructor stl_p
3c50: 72 65 66 69 78 20 7b 73 71 6c 69 74 65 33 53 72  refix {sqlite3Sr
3c60: 63 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  cListDelete($$);
3c70: 7d 0a 25 74 79 70 65 20 66 72 6f 6d 20 7b 53 72  }.%type from {Sr
3c80: 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  cList*}.%destruc
3c90: 74 6f 72 20 66 72 6f 6d 20 7b 73 71 6c 69 74 65  tor from {sqlite
3ca0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24  3SrcListDelete($
3cb0: 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f 6d 70 6c  $);}..// A compl
3cc0: 65 74 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ete FROM clause.
3cd0: 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20  .//.from(A) ::= 
3ce0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3cf0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 44 62 4d   {A = sqlite3DbM
3d00: 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65  allocZero(pParse
3d10: 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 41 29  ->db, sizeof(*A)
3d20: 29 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20  );}.from(A) ::= 
3d30: 46 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73 74 28  FROM seltablist(
3d40: 58 29 2e 20 20 7b 0a 20 20 41 20 3d 20 58 3b 0a  X).  {.  A = X;.
3d50: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
3d60: 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 41 29  ShiftJoinType(A)
3d70: 3b 0a 7d 0a 0a 2f 2f 20 22 73 65 6c 74 61 62 6c  ;.}..// "seltabl
3d80: 69 73 74 22 20 69 73 20 61 20 22 53 65 6c 65 63  ist" is a "Selec
3d90: 74 20 54 61 62 6c 65 20 4c 69 73 74 22 20 2d 20  t Table List" - 
3da0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
3db0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2f  he FROM clause./
3dc0: 2f 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74  / in a SELECT st
3dd0: 61 74 65 6d 65 6e 74 2e 20 20 22 73 74 6c 5f 70  atement.  "stl_p
3de0: 72 65 66 69 78 22 20 69 73 20 61 20 70 72 65 66  refix" is a pref
3df0: 69 78 20 6f 66 20 74 68 69 73 20 6c 69 73 74 2e  ix of this list.
3e00: 0a 2f 2f 0a 73 74 6c 5f 70 72 65 66 69 78 28 41  .//.stl_prefix(A
3e10: 29 20 3a 3a 3d 20 73 65 6c 74 61 62 6c 69 73 74  ) ::= seltablist
3e20: 28 58 29 20 6a 6f 69 6e 6f 70 28 59 29 2e 20 20  (X) joinop(Y).  
3e30: 20 20 7b 0a 20 20 20 41 20 3d 20 58 3b 0a 20 20    {.   A = X;.  
3e40: 20 69 66 28 20 41 20 26 26 20 41 2d 3e 6e 53 72   if( A && A->nSr
3e50: 63 3e 30 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 53  c>0 ) A->a[A->nS
3e60: 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  rc-1].jointype =
3e70: 20 59 3b 0a 7d 0a 73 74 6c 5f 70 72 65 66 69 78   Y;.}.stl_prefix
3e80: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c      {A = 0;}.sel
3eb0: 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  tablist(A) ::= s
3ec0: 74 6c 5f 70 72 65 66 69 78 28 58 29 20 6e 6d 28  tl_prefix(X) nm(
3ed0: 59 29 20 64 62 6e 6d 28 44 29 20 61 73 28 5a 29  Y) dbnm(D) as(Z)
3ee0: 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67   on_opt(N) using
3ef0: 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 41 20 3d  _opt(U). {.  A =
3f00: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
3f10: 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50  ppendFromTerm(pP
3f20: 61 72 73 65 2c 58 2c 26 59 2c 26 44 2c 26 5a 2c  arse,X,&Y,&D,&Z,
3f30: 30 2c 4e 2c 55 29 3b 0a 7d 0a 25 69 66 6e 64 65  0,N,U);.}.%ifnde
3f40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
3f50: 42 51 55 45 52 59 0a 20 20 73 65 6c 74 61 62 6c  BQUERY.  seltabl
3f60: 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70  ist(A) ::= stl_p
3f70: 72 65 66 69 78 28 58 29 20 4c 50 20 73 65 6c 74  refix(X) LP selt
3f80: 61 62 6c 69 73 74 5f 70 61 72 65 6e 28 53 29 20  ablist_paren(S) 
3f90: 52 50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RP.             
3fa0: 20 20 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f         as(Z) on_
3fb0: 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74  opt(N) using_opt
3fc0: 28 55 29 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73  (U). {.    A = s
3fd0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
3fe0: 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
3ff0: 73 65 2c 58 2c 30 2c 30 2c 26 5a 2c 53 2c 4e 2c  se,X,0,0,&Z,S,N,
4000: 55 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2f 20  U);.  }.  .  // 
4010: 41 20 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72  A seltablist_par
4020: 65 6e 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 72  en nonterminal r
4030: 65 70 72 65 73 65 6e 74 73 20 61 6e 79 74 68 69  epresents anythi
4040: 6e 67 20 69 6e 20 61 20 46 52 4f 4d 20 74 68 61  ng in a FROM tha
4050: 74 0a 20 20 2f 2f 20 69 73 20 63 6f 6e 74 61 69  t.  // is contai
4060: 6e 65 64 20 69 6e 73 69 64 65 20 70 61 72 65 6e  ned inside paren
4070: 74 68 65 73 65 73 2e 20 20 54 68 69 73 20 63 61  theses.  This ca
4080: 6e 20 62 65 20 65 69 74 68 65 72 20 61 20 73 75  n be either a su
4090: 62 71 75 65 72 79 20 6f 72 0a 20 20 2f 2f 20 61  bquery or.  // a
40a0: 20 67 72 6f 75 70 69 6e 67 20 6f 66 20 74 61 62   grouping of tab
40b0: 6c 65 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  le and subquerie
40c0: 73 2e 0a 20 20 2f 2f 0a 20 20 25 74 79 70 65 20  s..  //.  %type 
40d0: 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e  seltablist_paren
40e0: 20 7b 53 65 6c 65 63 74 2a 7d 0a 20 20 25 64 65   {Select*}.  %de
40f0: 73 74 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c  structor seltabl
4100: 69 73 74 5f 70 61 72 65 6e 20 7b 73 71 6c 69 74  ist_paren {sqlit
4110: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 24  e3SelectDelete($
4120: 24 29 3b 7d 0a 20 20 73 65 6c 74 61 62 6c 69 73  $);}.  seltablis
4130: 74 5f 70 61 72 65 6e 28 41 29 20 3a 3a 3d 20 73  t_paren(A) ::= s
4140: 65 6c 65 63 74 28 53 29 2e 20 20 20 20 20 20 7b  elect(S).      {
4150: 41 20 3d 20 53 3b 7d 0a 20 20 73 65 6c 74 61 62  A = S;}.  seltab
4160: 6c 69 73 74 5f 70 61 72 65 6e 28 41 29 20 3a 3a  list_paren(A) ::
4170: 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 46 29 2e  = seltablist(F).
4180: 20 20 7b 0a 20 20 20 20 20 73 71 6c 69 74 65 33    {.     sqlite3
4190: 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e  SrcListShiftJoin
41a0: 54 79 70 65 28 46 29 3b 0a 20 20 20 20 20 41 20  Type(F);.     A 
41b0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
41c0: 65 77 28 70 50 61 72 73 65 2c 30 2c 46 2c 30 2c  ew(pParse,0,F,0,
41d0: 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  0,0,0,0,0,0);.  
41e0: 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  }.%endif  SQLITE
41f0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a  _OMIT_SUBQUERY..
4200: 25 74 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65  %type dbnm {Toke
4210: 6e 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e  n}.dbnm(A) ::= .
4220: 20 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30            {A.z=0
4230: 3b 20 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41  ; A.n=0;}.dbnm(A
4240: 29 20 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e  ) ::= DOT nm(X).
4250: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65   {A = X;}..%type
4260: 20 66 75 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69   fullname {SrcLi
4270: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
4280: 20 66 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74   fullname {sqlit
4290: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
42a0: 24 24 29 3b 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41  $$);}.fullname(A
42b0: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 64 62 6e 6d  ) ::= nm(X) dbnm
42c0: 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (Y).  {A = sqlit
42d0: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
42e0: 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 58 2c  pParse->db,0,&X,
42f0: 26 59 29 3b 7d 0a 0a 25 74 79 70 65 20 6a 6f 69  &Y);}..%type joi
4300: 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79 70 65 20  nop {int}.%type 
4310: 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d 0a 6a 6f  joinop2 {int}.jo
4320: 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d  inop(X) ::= COMM
4330: 41 7c 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20 20  A|JOIN.         
4340: 20 20 20 20 20 7b 20 58 20 3d 20 4a 54 5f 49 4e       { X = JT_IN
4350: 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29  NER; }.joinop(X)
4360: 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20   ::= JOIN_KW(A) 
4370: 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20 20 7b 20  JOIN.         { 
4380: 58 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54  X = sqlite3JoinT
4390: 79 70 65 28 70 50 61 72 73 65 2c 26 41 2c 30 2c  ype(pParse,&A,0,
43a0: 30 29 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20  0); }.joinop(X) 
43b0: 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e  ::= JOIN_KW(A) n
43c0: 6d 28 42 29 20 4a 4f 49 4e 2e 20 20 20 7b 20 58  m(B) JOIN.   { X
43d0: 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79   = sqlite3JoinTy
43e0: 70 65 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c  pe(pParse,&A,&B,
43f0: 30 29 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20  0); }.joinop(X) 
4400: 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e  ::= JOIN_KW(A) n
4410: 6d 28 42 29 20 6e 6d 28 43 29 20 4a 4f 49 4e 2e  m(B) nm(C) JOIN.
4420: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 73 71          { X = sq
4450: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50  lite3JoinType(pP
4460: 61 72 73 65 2c 26 41 2c 26 42 2c 26 43 29 3b 20  arse,&A,&B,&C); 
4470: 7d 0a 0a 25 74 79 70 65 20 6f 6e 5f 6f 70 74 20  }..%type on_opt 
4480: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
4490: 74 6f 72 20 6f 6e 5f 6f 70 74 20 7b 73 71 6c 69  tor on_opt {sqli
44a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
44b0: 29 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a  );}.on_opt(N) ::
44c0: 3d 20 4f 4e 20 65 78 70 72 28 45 29 2e 20 20 20  = ON expr(E).   
44d0: 7b 4e 20 3d 20 45 3b 7d 0a 6f 6e 5f 6f 70 74 28  {N = E;}.on_opt(
44e0: 4e 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  N) ::= .        
44f0: 20 20 20 20 20 7b 4e 20 3d 20 30 3b 7d 0a 0a 25       {N = 0;}..%
4500: 74 79 70 65 20 75 73 69 6e 67 5f 6f 70 74 20 7b  type using_opt {
4510: 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  IdList*}.%destru
4520: 63 74 6f 72 20 75 73 69 6e 67 5f 6f 70 74 20 7b  ctor using_opt {
4530: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
4540: 65 74 65 28 24 24 29 3b 7d 0a 75 73 69 6e 67 5f  ete($$);}.using_
4550: 6f 70 74 28 55 29 20 3a 3a 3d 20 55 53 49 4e 47  opt(U) ::= USING
4560: 20 4c 50 20 69 6e 73 63 6f 6c 6c 69 73 74 28 4c   LP inscollist(L
4570: 29 20 52 50 2e 20 20 7b 55 20 3d 20 4c 3b 7d 0a  ) RP.  {U = L;}.
4580: 75 73 69 6e 67 5f 6f 70 74 28 55 29 20 3a 3a 3d  using_opt(U) ::=
4590: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
45a0: 20 20 20 20 20 20 20 20 20 20 7b 55 20 3d 20 30            {U = 0
45b0: 3b 7d 0a 0a 0a 25 74 79 70 65 20 6f 72 64 65 72  ;}...%type order
45c0: 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74  by_opt {ExprList
45d0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f  *}.%destructor o
45e0: 72 64 65 72 62 79 5f 6f 70 74 20 7b 73 71 6c 69  rderby_opt {sqli
45f0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4600: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 6f  e($$);}.%type so
4610: 72 74 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  rtlist {ExprList
4620: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
4630: 6f 72 74 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  ortlist {sqlite3
4640: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24  ExprListDelete($
4650: 24 29 3b 7d 0a 25 74 79 70 65 20 73 6f 72 74 69  $);}.%type sorti
4660: 74 65 6d 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73  tem {Expr*}.%des
4670: 74 72 75 63 74 6f 72 20 73 6f 72 74 69 74 65 6d  tructor sortitem
4680: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
4690: 65 74 65 28 24 24 29 3b 7d 0a 0a 6f 72 64 65 72  ete($$);}..order
46a0: 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  by_opt(A) ::= . 
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46c0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
46d0: 7d 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28 41 29  }.orderby_opt(A)
46e0: 20 3a 3a 3d 20 4f 52 44 45 52 20 42 59 20 73 6f   ::= ORDER BY so
46f0: 72 74 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20  rtlist(X).      
4700: 7b 41 20 3d 20 58 3b 7d 0a 73 6f 72 74 6c 69 73  {A = X;}.sortlis
4710: 74 28 41 29 20 3a 3a 3d 20 73 6f 72 74 6c 69 73  t(A) ::= sortlis
4720: 74 28 58 29 20 43 4f 4d 4d 41 20 73 6f 72 74 69  t(X) COMMA sorti
4730: 74 65 6d 28 59 29 20 73 6f 72 74 6f 72 64 65 72  tem(Y) sortorder
4740: 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (Z). {.  A = sql
4750: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
4760: 6e 64 28 70 50 61 72 73 65 2c 58 2c 59 2c 30 29  nd(pParse,X,Y,0)
4770: 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61  ;.  if( A ) A->a
4780: 5b 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72  [A->nExpr-1].sor
4790: 74 4f 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a 73 6f  tOrder = Z;.}.so
47a0: 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f  rtlist(A) ::= so
47b0: 72 74 69 74 65 6d 28 59 29 20 73 6f 72 74 6f 72  rtitem(Y) sortor
47c0: 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20  der(Z). {.  A = 
47d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
47e0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 59  ppend(pParse,0,Y
47f0: 2c 30 29 3b 0a 20 20 69 66 28 20 41 20 26 26 20  ,0);.  if( A && 
4800: 41 2d 3e 61 20 29 20 41 2d 3e 61 5b 30 5d 2e 73  A->a ) A->a[0].s
4810: 6f 72 74 4f 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a  ortOrder = Z;.}.
4820: 73 6f 72 74 69 74 65 6d 28 41 29 20 3a 3a 3d 20  sortitem(A) ::= 
4830: 65 78 70 72 28 58 29 2e 20 20 20 7b 41 20 3d 20  expr(X).   {A = 
4840: 58 3b 7d 0a 0a 25 74 79 70 65 20 73 6f 72 74 6f  X;}..%type sorto
4850: 72 64 65 72 20 7b 69 6e 74 7d 0a 0a 73 6f 72 74  rder {int}..sort
4860: 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 41 53 43  order(A) ::= ASC
4870: 2e 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d  .           {A =
4880: 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 7d   SQLITE_SO_ASC;}
4890: 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a  .sortorder(A) ::
48a0: 3d 20 44 45 53 43 2e 20 20 20 20 20 20 20 20 20  = DESC.         
48b0: 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f   {A = SQLITE_SO_
48c0: 44 45 53 43 3b 7d 0a 73 6f 72 74 6f 72 64 65 72  DESC;}.sortorder
48d0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
48e0: 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49         {A = SQLI
48f0: 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 0a 25 74 79  TE_SO_ASC;}..%ty
4900: 70 65 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b  pe groupby_opt {
4910: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
4920: 72 75 63 74 6f 72 20 67 72 6f 75 70 62 79 5f 6f  ructor groupby_o
4930: 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  pt {sqlite3ExprL
4940: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
4950: 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a  groupby_opt(A) :
4960: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
4970: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
4980: 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41  ;}.groupby_opt(A
4990: 29 20 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 6e  ) ::= GROUP BY n
49a0: 65 78 70 72 6c 69 73 74 28 58 29 2e 20 7b 41 20  exprlist(X). {A 
49b0: 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76  = X;}..%type hav
49c0: 69 6e 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a  ing_opt {Expr*}.
49d0: 25 64 65 73 74 72 75 63 74 6f 72 20 68 61 76 69  %destructor havi
49e0: 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  ng_opt {sqlite3E
49f0: 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  xprDelete($$);}.
4a00: 68 61 76 69 6e 67 5f 6f 70 74 28 41 29 20 3a 3a  having_opt(A) ::
4a10: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4a20: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 68 61 76 69     {A = 0;}.havi
4a30: 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 48 41  ng_opt(A) ::= HA
4a40: 56 49 4e 47 20 65 78 70 72 28 58 29 2e 20 20 7b  VING expr(X).  {
4a50: 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 6c  A = X;}..%type l
4a60: 69 6d 69 74 5f 6f 70 74 20 7b 73 74 72 75 63 74  imit_opt {struct
4a70: 20 4c 69 6d 69 74 56 61 6c 7d 0a 0a 2f 2f 20 54   LimitVal}..// T
4a80: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
4a90: 72 20 6c 69 6d 69 74 5f 6f 70 74 20 77 69 6c 6c  r limit_opt will
4aa0: 20 6e 65 76 65 72 20 66 69 72 65 20 69 6e 20 74   never fire in t
4ab0: 68 65 20 63 75 72 72 65 6e 74 20 67 72 61 6d 6d  he current gramm
4ac0: 61 72 2e 0a 2f 2f 20 54 68 65 20 6c 69 6d 69 74  ar..// The limit
4ad0: 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  _opt non-termina
4ae0: 6c 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 61 74  l only occurs at
4af0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 73 69   the end of a si
4b00: 6e 67 6c 65 20 70 72 6f 64 75 63 74 69 6f 6e 0a  ngle production.
4b10: 2f 2f 20 72 75 6c 65 20 66 6f 72 20 53 45 4c 45  // rule for SELE
4b20: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  CT statements.  
4b30: 41 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20 72  As soon as the r
4b40: 75 6c 65 20 74 68 61 74 20 63 72 65 61 74 65 20  ule that create 
4b50: 74 68 65 20 0a 2f 2f 20 6c 69 6d 69 74 5f 6f 70  the .// limit_op
4b60: 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 72  t non-terminal r
4b70: 65 64 75 63 65 73 2c 20 74 68 65 20 53 45 4c 45  educes, the SELE
4b80: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 75 6c  CT statement rul
4b90: 65 20 77 69 6c 6c 20 61 6c 73 6f 0a 2f 2f 20 72  e will also.// r
4ba0: 65 64 75 63 65 2e 20 20 53 6f 20 74 68 65 72 65  educe.  So there
4bb0: 20 69 73 20 6e 65 76 65 72 20 61 20 6c 69 6d 69   is never a limi
4bc0: 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e  t_opt non-termin
4bd0: 61 6c 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  al on the stack 
4be0: 0a 2f 2f 20 65 78 63 65 70 74 20 61 73 20 61 20  .// except as a 
4bf0: 74 72 61 6e 73 69 65 6e 74 2e 20 20 53 6f 20 74  transient.  So t
4c00: 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
4c10: 79 74 68 69 6e 67 20 74 6f 20 64 65 73 74 72 6f  ything to destro
4c20: 79 2e 0a 2f 2f 0a 2f 2f 25 64 65 73 74 72 75 63  y..//.//%destruc
4c30: 74 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 0a  tor limit_opt {.
4c40: 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  //  sqlite3ExprD
4c50: 65 6c 65 74 65 28 24 24 2e 70 4c 69 6d 69 74 29  elete($$.pLimit)
4c60: 3b 0a 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70  ;.//  sqlite3Exp
4c70: 72 44 65 6c 65 74 65 28 24 24 2e 70 4f 66 66 73  rDelete($$.pOffs
4c80: 65 74 29 3b 0a 2f 2f 7d 0a 6c 69 6d 69 74 5f 6f  et);.//}.limit_o
4c90: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 7b 41 2e 70 4c 69 6d 69 74 20 3d 20 30 3b 20 41  {A.pLimit = 0; A
4cc0: 2e 70 4f 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c  .pOffset = 0;}.l
4cd0: 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  imit_opt(A) ::= 
4ce0: 4c 49 4d 49 54 20 65 78 70 72 28 58 29 2e 20 20  LIMIT expr(X).  
4cf0: 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d 69 74 20        {A.pLimit 
4d00: 3d 20 58 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d  = X; A.pOffset =
4d10: 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41   0;}.limit_opt(A
4d20: 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72  ) ::= LIMIT expr
4d30: 28 58 29 20 4f 46 46 53 45 54 20 65 78 70 72 28  (X) OFFSET expr(
4d40: 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20  Y). .           
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 70              {A.p
4d70: 4c 69 6d 69 74 20 3d 20 58 3b 20 41 2e 70 4f 66  Limit = X; A.pOf
4d80: 66 73 65 74 20 3d 20 59 3b 7d 0a 6c 69 6d 69 74  fset = Y;}.limit
4d90: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49  _opt(A) ::= LIMI
4da0: 54 20 65 78 70 72 28 58 29 20 43 4f 4d 4d 41 20  T expr(X) COMMA 
4db0: 65 78 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20  expr(Y). .      
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 7b 41 2e 70 4f 66 66 73 65 74 20 3d 20 58 3b   {A.pOffset = X;
4df0: 20 41 2e 70 4c 69 6d 69 74 20 3d 20 59 3b 7d 0a   A.pLimit = Y;}.
4e00: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
4e10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
4e20: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
4e30: 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  t //////////////
4e40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
4e50: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 45 4c 45 54  //.cmd ::= DELET
4e60: 45 20 46 52 4f 4d 20 66 75 6c 6c 6e 61 6d 65 28  E FROM fullname(
4e70: 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29 2e  X) where_opt(Y).
4e80: 20 7b 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46   {sqlite3DeleteF
4e90: 72 6f 6d 28 70 50 61 72 73 65 2c 58 2c 59 29 3b  rom(pParse,X,Y);
4ea0: 7d 0a 0a 25 74 79 70 65 20 77 68 65 72 65 5f 6f  }..%type where_o
4eb0: 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pt {Expr*}.%dest
4ec0: 72 75 63 74 6f 72 20 77 68 65 72 65 5f 6f 70 74  ructor where_opt
4ed0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
4ee0: 65 74 65 28 24 24 29 3b 7d 0a 0a 77 68 65 72 65  ete($$);}..where
4ef0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 20 7b 41 20 3d 20 30 3b 7d 0a 77 68 65 72 65 5f   {A = 0;}.where_
4f20: 6f 70 74 28 41 29 20 3a 3a 3d 20 57 48 45 52 45  opt(A) ::= WHERE
4f30: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
4f40: 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  {A = X;}..//////
4f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f60: 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20  //// The UPDATE 
4f70: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
4f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f90: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
4fa0: 3a 3a 3d 20 55 50 44 41 54 45 20 6f 72 63 6f 6e  ::= UPDATE orcon
4fb0: 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29  f(R) fullname(X)
4fc0: 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 20   SET setlist(Y) 
4fd0: 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 20 20 7b  where_opt(Z).  {
4fe0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
4ff0: 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50  stCheckLength(pP
5000: 61 72 73 65 2c 59 2c 53 51 4c 49 54 45 5f 4d 41  arse,Y,SQLITE_MA
5010: 58 5f 43 4f 4c 55 4d 4e 2c 22 73 65 74 20 6c 69  X_COLUMN,"set li
5020: 73 74 22 29 3b 20 0a 20 20 73 71 6c 69 74 65 33  st"); .  sqlite3
5030: 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 58 2c  Update(pParse,X,
5040: 59 2c 5a 2c 52 29 3b 0a 7d 0a 0a 25 74 79 70 65  Y,Z,R);.}..%type
5050: 20 73 65 74 6c 69 73 74 20 7b 45 78 70 72 4c 69   setlist {ExprLi
5060: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
5070: 20 73 65 74 6c 69 73 74 20 7b 73 71 6c 69 74 65   setlist {sqlite
5080: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5090: 24 24 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41  $$);}..setlist(A
50a0: 29 20 3a 3a 3d 20 73 65 74 6c 69 73 74 28 5a 29  ) ::= setlist(Z)
50b0: 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20   COMMA nm(X) EQ 
50c0: 65 78 70 72 28 59 29 2e 0a 20 20 20 20 7b 41 20  expr(Y)..    {A 
50d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
50e0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 5a  tAppend(pParse,Z
50f0: 2c 59 2c 26 58 29 3b 7d 0a 73 65 74 6c 69 73 74  ,Y,&X);}.setlist
5100: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51  (A) ::= nm(X) EQ
5110: 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 7b 41   expr(Y)..    {A
5120: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
5130: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
5140: 30 2c 59 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f  0,Y,&X);}../////
5150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5160: 2f 2f 2f 2f 2f 20 54 68 65 20 49 4e 53 45 52 54  ///// The INSERT
5170: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
5180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
51a0: 64 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64  d ::= insert_cmd
51b0: 28 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d  (R) INTO fullnam
51c0: 65 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f  e(X) inscollist_
51d0: 6f 70 74 28 46 29 20 0a 20 20 20 20 20 20 20 20  opt(F) .        
51e0: 56 41 4c 55 45 53 20 4c 50 20 69 74 65 6d 6c 69  VALUES LP itemli
51f0: 73 74 28 59 29 20 52 50 2e 0a 20 20 20 20 20 20  st(Y) RP..      
5200: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 49 6e        {sqlite3In
5210: 73 65 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20  sert(pParse, X, 
5220: 59 2c 20 30 2c 20 46 2c 20 52 29 3b 7d 0a 63 6d  Y, 0, F, R);}.cm
5230: 64 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64  d ::= insert_cmd
5240: 28 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d  (R) INTO fullnam
5250: 65 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f  e(X) inscollist_
5260: 6f 70 74 28 46 29 20 73 65 6c 65 63 74 28 53 29  opt(F) select(S)
5270: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 73  ..            {s
5280: 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70 50 61  qlite3Insert(pPa
5290: 72 73 65 2c 20 58 2c 20 30 2c 20 53 2c 20 46 2c  rse, X, 0, S, F,
52a0: 20 52 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e   R);}.cmd ::= in
52b0: 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f  sert_cmd(R) INTO
52c0: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 73   fullname(X) ins
52d0: 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 44  collist_opt(F) D
52e0: 45 46 41 55 4c 54 20 56 41 4c 55 45 53 2e 0a 20  EFAULT VALUES.. 
52f0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
5300: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
5310: 2c 20 58 2c 20 30 2c 20 30 2c 20 46 2c 20 52 29  , X, 0, 0, F, R)
5320: 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 65 72 74  ;}..%type insert
5330: 5f 63 6d 64 20 7b 69 6e 74 7d 0a 69 6e 73 65 72  _cmd {int}.inser
5340: 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e 53  t_cmd(A) ::= INS
5350: 45 52 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20 20  ERT orconf(R).  
5360: 20 7b 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72 74   {A = R;}.insert
5370: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50 4c  _cmd(A) ::= REPL
5380: 41 43 45 2e 20 20 20 20 20 20 20 20 20 20 20 20  ACE.            
5390: 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  {A = OE_Replace;
53a0: 7d 0a 0a 0a 25 74 79 70 65 20 69 74 65 6d 6c 69  }...%type itemli
53b0: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
53c0: 64 65 73 74 72 75 63 74 6f 72 20 69 74 65 6d 6c  destructor iteml
53d0: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
53e0: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
53f0: 0a 0a 69 74 65 6d 6c 69 73 74 28 41 29 20 3a 3a  ..itemlist(A) ::
5400: 3d 20 69 74 65 6d 6c 69 73 74 28 58 29 20 43 4f  = itemlist(X) CO
5410: 4d 4d 41 20 65 78 70 72 28 59 29 2e 0a 20 20 20  MMA expr(Y)..   
5420: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
5430: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
5440: 73 65 2c 58 2c 59 2c 30 29 3b 7d 0a 69 74 65 6d  se,X,Y,0);}.item
5450: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72  list(A) ::= expr
5460: 28 58 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71  (X)..    {A = sq
5470: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
5480: 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 58 2c 30  end(pParse,0,X,0
5490: 29 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 63 6f  );}..%type insco
54a0: 6c 6c 69 73 74 5f 6f 70 74 20 7b 49 64 4c 69 73  llist_opt {IdLis
54b0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
54c0: 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b  inscollist_opt {
54d0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
54e0: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20  ete($$);}.%type 
54f0: 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 49 64 4c 69  inscollist {IdLi
5500: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
5510: 20 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 73 71 6c   inscollist {sql
5520: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
5530: 28 24 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c 6c 69  ($$);}..inscolli
5540: 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  st_opt(A) ::= . 
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69        {A = 0;}.i
5570: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29  nscollist_opt(A)
5580: 20 3a 3a 3d 20 4c 50 20 69 6e 73 63 6f 6c 6c 69   ::= LP inscolli
5590: 73 74 28 58 29 20 52 50 2e 20 20 20 20 7b 41 20  st(X) RP.    {A 
55a0: 3d 20 58 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74  = X;}.inscollist
55b0: 28 41 29 20 3a 3a 3d 20 69 6e 73 63 6f 6c 6c 69  (A) ::= inscolli
55c0: 73 74 28 58 29 20 43 4f 4d 4d 41 20 6e 6d 28 59  st(X) COMMA nm(Y
55d0: 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  )..    {A = sqli
55e0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
55f0: 70 50 61 72 73 65 2d 3e 64 62 2c 58 2c 26 59 29  pParse->db,X,&Y)
5600: 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28 41 29  ;}.inscollist(A)
5610: 20 3a 3a 3d 20 6e 6d 28 59 29 2e 0a 20 20 20 20   ::= nm(Y)..    
5620: 7b 41 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69  {A = sqlite3IdLi
5630: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d  stAppend(pParse-
5640: 3e 64 62 2c 30 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f  >db,0,&Y);}..///
5650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5660: 2f 2f 2f 2f 2f 2f 2f 2f 20 45 78 70 72 65 73 73  //////// Express
5670: 69 6f 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 2f  ion Processing /
5680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
56a0: 0a 25 74 79 70 65 20 65 78 70 72 20 7b 45 78 70  .%type expr {Exp
56b0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
56c0: 65 78 70 72 20 7b 73 71 6c 69 74 65 33 45 78 70  expr {sqlite3Exp
56d0: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  rDelete($$);}.%t
56e0: 79 70 65 20 74 65 72 6d 20 7b 45 78 70 72 2a 7d  ype term {Expr*}
56f0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 65 72  .%destructor ter
5700: 6d 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  m {sqlite3ExprDe
5710: 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72  lete($$);}..expr
5720: 28 41 29 20 3a 3a 3d 20 74 65 72 6d 28 58 29 2e  (A) ::= term(X).
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
5740: 3d 20 58 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  = X;}.expr(A) ::
5750: 3d 20 4c 50 28 42 29 20 65 78 70 72 28 58 29 20  = LP(B) expr(X) 
5760: 52 50 28 45 29 2e 20 7b 41 20 3d 20 58 3b 20 73  RP(E). {A = X; s
5770: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
5780: 2c 26 42 2c 26 45 29 3b 20 7d 0a 74 65 72 6d 28  ,&B,&E); }.term(
5790: 41 29 20 3a 3a 3d 20 4e 55 4c 4c 28 58 29 2e 20  A) ::= NULL(X). 
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
57b0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
57c0: 61 72 73 65 2c 20 40 58 2c 20 30 2c 20 30 2c 20  arse, @X, 0, 0, 
57d0: 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  &X);}.expr(A) ::
57e0: 3d 20 49 44 28 58 29 2e 20 20 20 20 20 20 20 20  = ID(X).        
57f0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
5800: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
5810: 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58   TK_ID, 0, 0, &X
5820: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
5830: 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20 20  JOIN_KW(X).     
5840: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5850: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
5860: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b  K_ID, 0, 0, &X);
5870: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d  }.expr(A) ::= nm
5880: 28 58 29 20 44 4f 54 20 6e 6d 28 59 29 2e 20 7b  (X) DOT nm(Y). {
5890: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d  .  Expr *temp1 =
58a0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
58b0: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
58c0: 30 2c 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a  0, &X);.  Expr *
58d0: 74 65 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 50  temp2 = sqlite3P
58e0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
58f0: 49 44 2c 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20  ID, 0, 0, &Y);. 
5900: 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70   A = sqlite3PExp
5910: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54  r(pParse, TK_DOT
5920: 2c 20 74 65 6d 70 31 2c 20 74 65 6d 70 32 2c 20  , temp1, temp2, 
5930: 30 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  0);.}.expr(A) ::
5940: 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59  = nm(X) DOT nm(Y
5950: 29 20 44 4f 54 20 6e 6d 28 5a 29 2e 20 7b 0a 20  ) DOT nm(Z). {. 
5960: 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73   Expr *temp1 = s
5970: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
5980: 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
5990: 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74 65   &X);.  Expr *te
59a0: 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mp2 = sqlite3PEx
59b0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
59c0: 2c 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 45  , 0, 0, &Y);.  E
59d0: 78 70 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c  xpr *temp3 = sql
59e0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
59f0: 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  , TK_ID, 0, 0, &
5a00: 5a 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70  Z);.  Expr *temp
5a10: 34 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  4 = sqlite3PExpr
5a20: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
5a30: 20 74 65 6d 70 32 2c 20 74 65 6d 70 33 2c 20 30   temp2, temp3, 0
5a40: 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33  );.  A = sqlite3
5a50: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
5a60: 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d  _DOT, temp1, tem
5a70: 70 34 2c 20 30 29 3b 0a 7d 0a 74 65 72 6d 28 41  p4, 0);.}.term(A
5a80: 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 7c 46 4c  ) ::= INTEGER|FL
5a90: 4f 41 54 7c 42 4c 4f 42 28 58 29 2e 20 20 20 20  OAT|BLOB(X).    
5aa0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45    {A = sqlite3PE
5ab0: 78 70 72 28 70 50 61 72 73 65 2c 20 40 58 2c 20  xpr(pParse, @X, 
5ac0: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 74 65 72 6d  0, 0, &X);}.term
5ad0: 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58  (A) ::= STRING(X
5ae0: 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71  ).       {A = sq
5af0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
5b00: 65 2c 20 40 58 2c 20 30 2c 20 30 2c 20 26 58 29  e, @X, 0, 0, &X)
5b10: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52  ;}.expr(A) ::= R
5b20: 45 47 49 53 54 45 52 28 58 29 2e 20 20 20 20 20  EGISTER(X).     
5b30: 7b 41 20 3d 20 73 71 6c 69 74 65 33 52 65 67 69  {A = sqlite3Regi
5b40: 73 74 65 72 45 78 70 72 28 70 50 61 72 73 65 2c  sterExpr(pParse,
5b50: 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a   &X);}.expr(A) :
5b60: 3a 3d 20 56 41 52 49 41 42 4c 45 28 58 29 2e 20  := VARIABLE(X). 
5b70: 20 20 20 20 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70      {.  Token *p
5b80: 54 6f 6b 65 6e 20 3d 20 26 58 3b 0a 20 20 45 78  Token = &X;.  Ex
5b90: 70 72 20 2a 70 45 78 70 72 20 3d 20 41 20 3d 20  pr *pExpr = A = 
5ba0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
5bb0: 72 73 65 2c 20 54 4b 5f 56 41 52 49 41 42 4c 45  rse, TK_VARIABLE
5bc0: 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b  , 0, 0, pToken);
5bd0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  .  sqlite3ExprAs
5be0: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 70 50  signVarNumber(pP
5bf0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 7d 0a  arse, pExpr);.}.
5c00: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
5c10: 28 45 29 20 43 4f 4c 4c 41 54 45 20 69 64 28 43  (E) COLLATE id(C
5c20: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
5c30: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 70 50  e3ExprSetColl(pP
5c40: 61 72 73 65 2c 20 45 2c 20 26 43 29 3b 0a 7d 0a  arse, E, &C);.}.
5c50: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
5c60: 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28 41 29  MIT_CAST.expr(A)
5c70: 20 3a 3a 3d 20 43 41 53 54 28 58 29 20 4c 50 20   ::= CAST(X) LP 
5c80: 65 78 70 72 28 45 29 20 41 53 20 74 79 70 65 74  expr(E) AS typet
5c90: 6f 6b 65 6e 28 54 29 20 52 50 28 59 29 2e 20 7b  oken(T) RP(Y). {
5ca0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45  .  A = sqlite3PE
5cb0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43  xpr(pParse, TK_C
5cc0: 41 53 54 2c 20 45 2c 20 30 2c 20 26 54 29 3b 0a  AST, E, 0, &T);.
5cd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
5ce0: 6e 28 41 2c 26 58 2c 26 59 29 3b 0a 7d 0a 25 65  n(A,&X,&Y);.}.%e
5cf0: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
5d00: 54 5f 43 41 53 54 0a 65 78 70 72 28 41 29 20 3a  T_CAST.expr(A) :
5d10: 3a 3d 20 49 44 28 58 29 20 4c 50 20 64 69 73 74  := ID(X) LP dist
5d20: 69 6e 63 74 28 44 29 20 65 78 70 72 6c 69 73 74  inct(D) exprlist
5d30: 28 59 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 69  (Y) RP(E). {.  i
5d40: 66 28 20 59 20 26 26 20 59 2d 3e 6e 45 78 70 72  f( Y && Y->nExpr
5d50: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  >SQLITE_MAX_FUNC
5d60: 54 49 4f 4e 5f 41 52 47 20 29 7b 0a 20 20 20 20  TION_ARG ){.    
5d70: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5d80: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
5d90: 79 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66  y arguments on f
5da0: 75 6e 63 74 69 6f 6e 20 25 54 22 2c 20 26 58 29  unction %T", &X)
5db0: 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c 69  ;.  }.  A = sqli
5dc0: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
5dd0: 70 50 61 72 73 65 2c 20 59 2c 20 26 58 29 3b 0a  pParse, Y, &X);.
5de0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
5df0: 6e 28 41 2c 26 58 2c 26 45 29 3b 0a 20 20 69 66  n(A,&X,&E);.  if
5e00: 28 20 44 20 26 26 20 41 20 29 7b 0a 20 20 20 20  ( D && A ){.    
5e10: 41 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44  A->flags |= EP_D
5e20: 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 7d 0a 65  istinct;.  }.}.e
5e30: 78 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  xpr(A) ::= ID(X)
5e40: 20 4c 50 20 53 54 41 52 20 52 50 28 45 29 2e 20   LP STAR RP(E). 
5e50: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
5e60: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  xprFunction(pPar
5e70: 73 65 2c 20 30 2c 20 26 58 29 3b 0a 20 20 73 71  se, 0, &X);.  sq
5e80: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
5e90: 26 58 2c 26 45 29 3b 0a 7d 0a 74 65 72 6d 28 41  &X,&E);.}.term(A
5ea0: 29 20 3a 3a 3d 20 43 54 49 4d 45 5f 4b 57 28 4f  ) ::= CTIME_KW(O
5eb0: 50 29 2e 20 7b 0a 20 20 2f 2a 20 54 68 65 20 43  P). {.  /* The C
5ec0: 55 52 52 45 4e 54 5f 54 49 4d 45 2c 20 43 55 52  URRENT_TIME, CUR
5ed0: 52 45 4e 54 5f 44 41 54 45 2c 20 61 6e 64 20 43  RENT_DATE, and C
5ee0: 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50  URRENT_TIMESTAMP
5ef0: 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a   values are.  **
5f00: 20 74 72 65 61 74 65 64 20 61 73 20 66 75 6e 63   treated as func
5f10: 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
5f20: 6e 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  n constants */. 
5f30: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
5f40: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
5f50: 20 30 2c 26 4f 50 29 3b 0a 20 20 69 66 28 20 41   0,&OP);.  if( A
5f60: 20 29 7b 0a 20 20 20 20 41 2d 3e 6f 70 20 3d 20   ){.    A->op = 
5f70: 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3b 20 20  TK_CONST_FUNC;  
5f80: 0a 20 20 20 20 41 2d 3e 73 70 61 6e 20 3d 20 4f  .    A->span = O
5f90: 50 3b 0a 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29  P;.  }.}.expr(A)
5fa0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 41 4e 44   ::= expr(X) AND
5fb0: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20  (OP) expr(Y).   
5fc0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
5fd0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50  PExpr(pParse,@OP
5fe0: 2c 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 28 41  ,X,Y,0);}.expr(A
5ff0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4f 52  ) ::= expr(X) OR
6000: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20  (OP) expr(Y).   
6010: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
6020: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f  3PExpr(pParse,@O
6030: 50 2c 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 28  P,X,Y,0);}.expr(
6040: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c  A) ::= expr(X) L
6050: 54 7c 47 54 7c 47 45 7c 4c 45 28 4f 50 29 20 65  T|GT|GE|LE(OP) e
6060: 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20  xpr(Y)..        
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6090: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50     {A = sqlite3P
60a0: 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c  Expr(pParse,@OP,
60b0: 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 28 41 29  X,Y,0);}.expr(A)
60c0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 45 51 7c   ::= expr(X) EQ|
60d0: 4e 45 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20  NE(OP) expr(Y). 
60e0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
60f0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50  PExpr(pParse,@OP
6100: 2c 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 28 41  ,X,Y,0);}.expr(A
6110: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 42 49  ) ::= expr(X) BI
6120: 54 41 4e 44 7c 42 49 54 4f 52 7c 4c 53 48 49 46  TAND|BITOR|LSHIF
6130: 54 7c 52 53 48 49 46 54 28 4f 50 29 20 65 78 70  T|RSHIFT(OP) exp
6140: 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20  r(Y)..          
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6170: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78   {A = sqlite3PEx
6180: 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 58 2c  pr(pParse,@OP,X,
6190: 59 2c 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  Y,0);}.expr(A) :
61a0: 3a 3d 20 65 78 70 72 28 58 29 20 50 4c 55 53 7c  := expr(X) PLUS|
61b0: 4d 49 4e 55 53 28 4f 50 29 20 65 78 70 72 28 59  MINUS(OP) expr(Y
61c0: 29 2e 7b 41 20 3d 20 73 71 6c 69 74 65 33 50 45  ).{A = sqlite3PE
61d0: 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 58  xpr(pParse,@OP,X
61e0: 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  ,Y,0);}.expr(A) 
61f0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 53 54 41 52  ::= expr(X) STAR
6200: 7c 53 4c 41 53 48 7c 52 45 4d 28 4f 50 29 20 65  |SLASH|REM(OP) e
6210: 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20  xpr(Y)..        
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 50     {A = sqlite3P
6250: 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c  Expr(pParse,@OP,
6260: 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 28 41 29  X,Y,0);}.expr(A)
6270: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 43 4f 4e   ::= expr(X) CON
6280: 43 41 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e  CAT(OP) expr(Y).
6290: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
62a0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f 50  PExpr(pParse,@OP
62b0: 2c 58 2c 59 2c 30 29 3b 7d 0a 25 74 79 70 65 20  ,X,Y,0);}.%type 
62c0: 6c 69 6b 65 6f 70 20 7b 73 74 72 75 63 74 20 4c  likeop {struct L
62d0: 69 6b 65 4f 70 7d 0a 6c 69 6b 65 6f 70 28 41 29  ikeOp}.likeop(A)
62e0: 20 3a 3a 3d 20 4c 49 4b 45 5f 4b 57 28 58 29 2e   ::= LIKE_KW(X).
62f0: 20 20 20 20 20 7b 41 2e 65 4f 70 65 72 61 74 6f       {A.eOperato
6300: 72 20 3d 20 58 3b 20 41 2e 6e 6f 74 20 3d 20 30  r = X; A.not = 0
6310: 3b 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d  ;}.likeop(A) ::=
6320: 20 4e 4f 54 20 4c 49 4b 45 5f 4b 57 28 58 29 2e   NOT LIKE_KW(X).
6330: 20 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20   {A.eOperator = 
6340: 58 3b 20 41 2e 6e 6f 74 20 3d 20 31 3b 7d 0a 6c  X; A.not = 1;}.l
6350: 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4d 41 54  ikeop(A) ::= MAT
6360: 43 48 28 58 29 2e 20 20 20 20 20 20 20 7b 41 2e  CH(X).       {A.
6370: 65 4f 70 65 72 61 74 6f 72 20 3d 20 58 3b 20 41  eOperator = X; A
6380: 2e 6e 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b 65 6f  .not = 0;}.likeo
6390: 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4d 41 54  p(A) ::= NOT MAT
63a0: 43 48 28 58 29 2e 20 20 20 7b 41 2e 65 4f 70 65  CH(X).   {A.eOpe
63b0: 72 61 74 6f 72 20 3d 20 58 3b 20 41 2e 6e 6f 74  rator = X; A.not
63c0: 20 3d 20 31 3b 7d 0a 25 74 79 70 65 20 65 73 63   = 1;}.%type esc
63d0: 61 70 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73  ape {Expr*}.%des
63e0: 74 72 75 63 74 6f 72 20 65 73 63 61 70 65 20 7b  tructor escape {
63f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
6400: 65 28 24 24 29 3b 7d 0a 65 73 63 61 70 65 28 58  e($$);}.escape(X
6410: 29 20 3a 3a 3d 20 45 53 43 41 50 45 20 65 78 70  ) ::= ESCAPE exp
6420: 72 28 41 29 2e 20 5b 45 53 43 41 50 45 5d 20 7b  r(A). [ESCAPE] {
6430: 58 20 3d 20 41 3b 7d 0a 65 73 63 61 70 65 28 58  X = A;}.escape(X
6440: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
6450: 20 20 20 20 20 20 5b 45 53 43 41 50 45 5d 20 7b        [ESCAPE] {
6460: 58 20 3d 20 30 3b 7d 0a 65 78 70 72 28 41 29 20  X = 0;}.expr(A) 
6470: 3a 3a 3d 20 65 78 70 72 28 58 29 20 6c 69 6b 65  ::= expr(X) like
6480: 6f 70 28 4f 50 29 20 65 78 70 72 28 59 29 20 65  op(OP) expr(Y) e
6490: 73 63 61 70 65 28 45 29 2e 20 20 5b 4c 49 4b 45  scape(E).  [LIKE
64a0: 5f 4b 57 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69  _KW]  {.  ExprLi
64b0: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  st *pList;.  pLi
64c0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
64d0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
64e0: 65 2c 30 2c 20 59 2c 20 30 29 3b 0a 20 20 70 4c  e,0, Y, 0);.  pL
64f0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
6500: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
6510: 73 65 2c 70 4c 69 73 74 2c 20 58 2c 20 30 29 3b  se,pList, X, 0);
6520: 0a 20 20 69 66 28 20 45 20 29 7b 0a 20 20 20 20  .  if( E ){.    
6530: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
6540: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
6550: 61 72 73 65 2c 70 4c 69 73 74 2c 20 45 2c 20 30  arse,pList, E, 0
6560: 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c  );.  }.  A = sql
6570: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
6580: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20  (pParse, pList, 
6590: 26 4f 50 2e 65 4f 70 65 72 61 74 6f 72 29 3b 0a  &OP.eOperator);.
65a0: 20 20 69 66 28 20 4f 50 2e 6e 6f 74 20 29 20 41    if( OP.not ) A
65b0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
65c0: 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20  pParse, TK_NOT, 
65d0: 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  A, 0, 0);.  sqli
65e0: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26  te3ExprSpan(A, &
65f0: 58 2d 3e 73 70 61 6e 2c 20 26 59 2d 3e 73 70 61  X->span, &Y->spa
6600: 6e 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d  n);.  if( A ) A-
6610: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 66  >flags |= EP_Inf
6620: 69 78 46 75 6e 63 3b 0a 7d 0a 0a 65 78 70 72 28  ixFunc;.}..expr(
6630: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49  A) ::= expr(X) I
6640: 53 4e 55 4c 4c 7c 4e 4f 54 4e 55 4c 4c 28 45 29  SNULL|NOTNULL(E)
6650: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
6660: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 40  3PExpr(pParse, @
6670: 45 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73  E, X, 0, 0);.  s
6680: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
6690: 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d  ,&X->span,&E);.}
66a0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
66b0: 72 28 58 29 20 49 53 20 4e 55 4c 4c 28 45 29 2e  r(X) IS NULL(E).
66c0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
66d0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
66e0: 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30  _ISNULL, X, 0, 0
66f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
6700: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
6710: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
6720: 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20 4e  := expr(X) NOT N
6730: 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20  ULL(E). {.  A = 
6740: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
6750: 72 73 65 2c 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c  rse, TK_NOTNULL,
6760: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   X, 0, 0);.  sql
6770: 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26  ite3ExprSpan(A,&
6780: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
6790: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
67a0: 58 29 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 28 45  X) IS NOT NULL(E
67b0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
67c0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
67d0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30  TK_NOTNULL, X, 0
67e0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  , 0);.  sqlite3E
67f0: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
6800: 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41  an,&E);.}.expr(A
6810: 29 20 3a 3a 3d 20 4e 4f 54 7c 42 49 54 4e 4f 54  ) ::= NOT|BITNOT
6820: 28 42 29 20 65 78 70 72 28 58 29 2e 20 7b 0a 20  (B) expr(X). {. 
6830: 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70   A = sqlite3PExp
6840: 72 28 70 50 61 72 73 65 2c 20 40 42 2c 20 58 2c  r(pParse, @B, X,
6850: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
6860: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26  3ExprSpan(A,&B,&
6870: 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72  X->span);.}.expr
6880: 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 28 42 29  (A) ::= MINUS(B)
6890: 20 65 78 70 72 28 58 29 2e 20 5b 55 4d 49 4e 55   expr(X). [UMINU
68a0: 53 5d 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  S] {.  A = sqlit
68b0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
68c0: 54 4b 5f 55 4d 49 4e 55 53 2c 20 58 2c 20 30 2c  TK_UMINUS, X, 0,
68d0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78   0);.  sqlite3Ex
68e0: 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e  prSpan(A,&B,&X->
68f0: 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29  span);.}.expr(A)
6900: 20 3a 3a 3d 20 50 4c 55 53 28 42 29 20 65 78 70   ::= PLUS(B) exp
6910: 72 28 58 29 2e 20 5b 55 50 4c 55 53 5d 20 7b 0a  r(X). [UPLUS] {.
6920: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78    A = sqlite3PEx
6930: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 50  pr(pParse, TK_UP
6940: 4c 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20  LUS, X, 0, 0);. 
6950: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
6960: 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b  (A,&B,&X->span);
6970: 0a 7d 0a 25 74 79 70 65 20 62 65 74 77 65 65 6e  .}.%type between
6980: 5f 6f 70 20 7b 69 6e 74 7d 0a 62 65 74 77 65 65  _op {int}.betwee
6990: 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 42 45 54 57  n_op(A) ::= BETW
69a0: 45 45 4e 2e 20 20 20 20 20 7b 41 20 3d 20 30 3b  EEN.     {A = 0;
69b0: 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20  }.between_op(A) 
69c0: 3a 3a 3d 20 4e 4f 54 20 42 45 54 57 45 45 4e 2e  ::= NOT BETWEEN.
69d0: 20 7b 41 20 3d 20 31 3b 7d 0a 65 78 70 72 28 41   {A = 1;}.expr(A
69e0: 29 20 3a 3a 3d 20 65 78 70 72 28 57 29 20 62 65  ) ::= expr(W) be
69f0: 74 77 65 65 6e 5f 6f 70 28 4e 29 20 65 78 70 72  tween_op(N) expr
6a00: 28 58 29 20 41 4e 44 20 65 78 70 72 28 59 29 2e  (X) AND expr(Y).
6a10: 20 5b 42 45 54 57 45 45 4e 5d 20 7b 0a 20 20 45   [BETWEEN] {.  E
6a20: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
6a30: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6a40: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c  Append(pParse,0,
6a50: 20 58 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74 20   X, 0);.  pList 
6a60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
6a70: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 70  tAppend(pParse,p
6a80: 4c 69 73 74 2c 20 59 2c 20 30 29 3b 0a 20 20 41  List, Y, 0);.  A
6a90: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
6aa0: 70 50 61 72 73 65 2c 20 54 4b 5f 42 45 54 57 45  pParse, TK_BETWE
6ab0: 45 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a 20 20  EN, W, 0, 0);.  
6ac0: 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e  if( A ){.    A->
6ad0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
6ae0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
6af0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
6b00: 65 28 70 4c 69 73 74 29 3b 0a 20 20 7d 20 0a 20  e(pList);.  } . 
6b10: 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73 71 6c   if( N ) A = sql
6b20: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
6b30: 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20  , TK_NOT, A, 0, 
6b40: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  0);.  sqlite3Exp
6b50: 72 53 70 61 6e 28 41 2c 26 57 2d 3e 73 70 61 6e  rSpan(A,&W->span
6b60: 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 25 69  ,&Y->span);.}.%i
6b70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6b80: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 25 74 79  T_SUBQUERY.  %ty
6b90: 70 65 20 69 6e 5f 6f 70 20 7b 69 6e 74 7d 0a 20  pe in_op {int}. 
6ba0: 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 49 4e   in_op(A) ::= IN
6bb0: 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a  .      {A = 0;}.
6bc0: 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e    in_op(A) ::= N
6bd0: 4f 54 20 49 4e 2e 20 20 7b 41 20 3d 20 31 3b 7d  OT IN.  {A = 1;}
6be0: 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .  expr(A) ::= e
6bf0: 78 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29 20  xpr(X) in_op(N) 
6c00: 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52  LP exprlist(Y) R
6c10: 50 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20 20  P(E). [IN] {.   
6c20: 20 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70   A = sqlite3PExp
6c30: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
6c40: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   X, 0, 0);.    i
6c50: 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20 41 2d  f( A ){.      A-
6c60: 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 20 20  >pList = Y;.    
6c70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
6c80: 48 65 69 67 68 74 28 41 29 3b 0a 20 20 20 20 7d  Height(A);.    }
6c90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
6ca0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
6cb0: 65 28 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e(Y);.    }.    
6cc0: 69 66 28 20 4e 20 29 20 41 20 3d 20 73 71 6c 69  if( N ) A = sqli
6cd0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
6ce0: 20 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30   TK_NOT, A, 0, 0
6cf0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
6d00: 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61  prSpan(A,&X->spa
6d10: 6e 2c 26 45 29 3b 0a 20 20 7d 0a 20 20 65 78 70  n,&E);.  }.  exp
6d20: 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 73  r(A) ::= LP(B) s
6d30: 65 6c 65 63 74 28 58 29 20 52 50 28 45 29 2e 20  elect(X) RP(E). 
6d40: 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65  {.    A = sqlite
6d50: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
6d60: 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20  K_SELECT, 0, 0, 
6d70: 30 29 3b 0a 20 20 20 20 69 66 28 20 41 20 29 7b  0);.    if( A ){
6d80: 0a 20 20 20 20 20 20 41 2d 3e 70 53 65 6c 65 63  .      A->pSelec
6d90: 74 20 3d 20 58 3b 0a 20 20 20 20 20 20 73 71 6c  t = X;.      sql
6da0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
6db0: 74 28 41 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(A);.    }else{
6dc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
6dd0: 6c 65 63 74 44 65 6c 65 74 65 28 58 29 3b 0a 20  lectDelete(X);. 
6de0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6df0: 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45  ExprSpan(A,&B,&E
6e00: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29  );.  }.  expr(A)
6e10: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f   ::= expr(X) in_
6e20: 6f 70 28 4e 29 20 4c 50 20 73 65 6c 65 63 74 28  op(N) LP select(
6e30: 59 29 20 52 50 28 45 29 2e 20 20 5b 49 4e 5d 20  Y) RP(E).  [IN] 
6e40: 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65  {.    A = sqlite
6e50: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
6e60: 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  K_IN, X, 0, 0);.
6e70: 20 20 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20      if( A ){.   
6e80: 20 20 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20     A->pSelect = 
6e90: 59 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  Y;.      sqlite3
6ea0: 45 78 70 72 53 65 74 48 65 69 67 68 74 28 41 29  ExprSetHeight(A)
6eb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6ec0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
6ed0: 44 65 6c 65 74 65 28 59 29 3b 0a 20 20 20 20 7d  Delete(Y);.    }
6ee0: 0a 20 20 20 20 69 66 28 20 4e 20 29 20 41 20 3d  .    if( N ) A =
6ef0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
6f00: 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2c  arse, TK_NOT, A,
6f10: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6f20: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58  te3ExprSpan(A,&X
6f30: 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 20 20 7d 0a  ->span,&E);.  }.
6f40: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78    expr(A) ::= ex
6f50: 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29 20 6e  pr(X) in_op(N) n
6f60: 6d 28 59 29 20 64 62 6e 6d 28 5a 29 2e 20 5b 49  m(Y) dbnm(Z). [I
6f70: 4e 5d 20 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  N] {.    SrcList
6f80: 20 2a 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33   *pSrc = sqlite3
6f90: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50  SrcListAppend(pP
6fa0: 61 72 73 65 2d 3e 64 62 2c 20 30 2c 26 59 2c 26  arse->db, 0,&Y,&
6fb0: 5a 29 3b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69  Z);.    A = sqli
6fc0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
6fd0: 20 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29   TK_IN, X, 0, 0)
6fe0: 3b 0a 20 20 20 20 69 66 28 20 41 20 29 7b 0a 20  ;.    if( A ){. 
6ff0: 20 20 20 20 20 41 2d 3e 70 53 65 6c 65 63 74 20       A->pSelect 
7000: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
7010: 65 77 28 70 50 61 72 73 65 2c 20 30 2c 70 53 72  ew(pParse, 0,pSr
7020: 63 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29  c,0,0,0,0,0,0,0)
7030: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
7040: 78 70 72 53 65 74 48 65 69 67 68 74 28 41 29 3b  xprSetHeight(A);
7050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7060: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
7070: 44 65 6c 65 74 65 28 70 53 72 63 29 3b 0a 20 20  Delete(pSrc);.  
7080: 20 20 7d 0a 20 20 20 20 69 66 28 20 4e 20 29 20    }.    if( N ) 
7090: 41 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  A = sqlite3PExpr
70a0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c  (pParse, TK_NOT,
70b0: 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   A, 0, 0);.    s
70c0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
70d0: 2c 26 58 2d 3e 73 70 61 6e 2c 5a 2e 7a 3f 26 5a  ,&X->span,Z.z?&Z
70e0: 3a 26 59 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72  :&Y);.  }.  expr
70f0: 28 41 29 20 3a 3a 3d 20 45 58 49 53 54 53 28 42  (A) ::= EXISTS(B
7100: 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52  ) LP select(Y) R
7110: 50 28 45 29 2e 20 7b 0a 20 20 20 20 45 78 70 72  P(E). {.    Expr
7120: 20 2a 70 20 3d 20 41 20 3d 20 73 71 6c 69 74 65   *p = A = sqlite
7130: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7140: 4b 5f 45 58 49 53 54 53 2c 20 30 2c 20 30 2c 20  K_EXISTS, 0, 0, 
7150: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  0);.    if( p ){
7160: 0a 20 20 20 20 20 20 70 2d 3e 70 53 65 6c 65 63  .      p->pSelec
7170: 74 20 3d 20 59 3b 0a 20 20 20 20 20 20 73 71 6c  t = Y;.      sql
7180: 69 74 65 33 45 78 70 72 53 70 61 6e 28 70 2c 26  ite3ExprSpan(p,&
7190: 42 2c 26 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  B,&E);.      sql
71a0: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
71b0: 74 28 41 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(A);.    }else{
71c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
71d0: 6c 65 63 74 44 65 6c 65 74 65 28 59 29 3b 0a 20  lectDelete(Y);. 
71e0: 20 20 20 7d 0a 20 20 7d 0a 25 65 6e 64 69 66 20     }.  }.%endif 
71f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
7200: 55 45 52 59 0a 0a 2f 2a 20 43 41 53 45 20 65 78  UERY../* CASE ex
7210: 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 65 78 70  pressions */.exp
7220: 72 28 41 29 20 3a 3a 3d 20 43 41 53 45 28 43 29  r(A) ::= CASE(C)
7230: 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 58 29   case_operand(X)
7240: 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 59   case_exprlist(Y
7250: 29 20 63 61 73 65 5f 65 6c 73 65 28 5a 29 20 45  ) case_else(Z) E
7260: 4e 44 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  ND(E). {.  A = s
7270: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
7280: 73 65 2c 20 54 4b 5f 43 41 53 45 2c 20 58 2c 20  se, TK_CASE, X, 
7290: 5a 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  Z, 0);.  if( A )
72a0: 7b 0a 20 20 20 20 41 2d 3e 70 4c 69 73 74 20 3d  {.    A->pList =
72b0: 20 59 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   Y;.    sqlite3E
72c0: 78 70 72 53 65 74 48 65 69 67 68 74 28 41 29 3b  xprSetHeight(A);
72d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
72e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
72f0: 65 74 65 28 59 29 3b 0a 20 20 7d 0a 20 20 73 71  ete(Y);.  }.  sq
7300: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
7310: 20 26 43 2c 20 26 45 29 3b 0a 7d 0a 25 74 79 70   &C, &E);.}.%typ
7320: 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20  e case_exprlist 
7330: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
7340: 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70  tructor case_exp
7350: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
7360: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
7370: 3b 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74  ;}.case_exprlist
7380: 28 41 29 20 3a 3a 3d 20 63 61 73 65 5f 65 78 70  (A) ::= case_exp
7390: 72 6c 69 73 74 28 58 29 20 57 48 45 4e 20 65 78  rlist(X) WHEN ex
73a0: 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28  pr(Y) THEN expr(
73b0: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
73c0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
73d0: 64 28 70 50 61 72 73 65 2c 58 2c 20 59 2c 20 30  d(pParse,X, Y, 0
73e0: 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33  );.  A = sqlite3
73f0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
7400: 50 61 72 73 65 2c 41 2c 20 5a 2c 20 30 29 3b 0a  Parse,A, Z, 0);.
7410: 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28  }.case_exprlist(
7420: 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72  A) ::= WHEN expr
7430: 28 59 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29  (Y) THEN expr(Z)
7440: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
7450: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
7460: 70 50 61 72 73 65 2c 30 2c 20 59 2c 20 30 29 3b  pParse,0, Y, 0);
7470: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
7480: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
7490: 72 73 65 2c 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a  rse,A, Z, 0);.}.
74a0: 25 74 79 70 65 20 63 61 73 65 5f 65 6c 73 65 20  %type case_else 
74b0: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
74c0: 74 6f 72 20 63 61 73 65 5f 65 6c 73 65 20 7b 73  tor case_else {s
74d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
74e0: 28 24 24 29 3b 7d 0a 63 61 73 65 5f 65 6c 73 65  ($$);}.case_else
74f0: 28 41 29 20 3a 3a 3d 20 20 45 4c 53 45 20 65 78  (A) ::=  ELSE ex
7500: 70 72 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b  pr(X).         {
7510: 41 20 3d 20 58 3b 7d 0a 63 61 73 65 5f 65 6c 73  A = X;}.case_els
7520: 65 28 41 29 20 3a 3a 3d 20 20 2e 20 20 20 20 20  e(A) ::=  .     
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 7b 41 20 3d 20 30 3b 7d 20 0a 25 74 79 70 65 20  {A = 0;} .%type 
7550: 63 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b 45 78  case_operand {Ex
7560: 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pr*}.%destructor
7570: 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b 73   case_operand {s
7580: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7590: 28 24 24 29 3b 7d 0a 63 61 73 65 5f 6f 70 65 72  ($$);}.case_oper
75a0: 61 6e 64 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  and(A) ::= expr(
75b0: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b  X).            {
75c0: 41 20 3d 20 58 3b 7d 20 0a 63 61 73 65 5f 6f 70  A = X;} .case_op
75d0: 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 2e 20 20  erand(A) ::= .  
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25 74 79 70   {A = 0;} ..%typ
7600: 65 20 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72  e exprlist {Expr
7610: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
7620: 6f 72 20 65 78 70 72 6c 69 73 74 20 7b 73 71 6c  or exprlist {sql
7630: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
7640: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 6e  te($$);}.%type n
7650: 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69  exprlist {ExprLi
7660: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
7670: 20 6e 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69   nexprlist {sqli
7680: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
7690: 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72 6c 69 73  e($$);}..exprlis
76a0: 74 28 41 29 20 3a 3a 3d 20 6e 65 78 70 72 6c 69  t(A) ::= nexprli
76b0: 73 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  st(X).          
76c0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 65        {A = X;}.e
76d0: 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e  xprlist(A) ::= .
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
7700: 20 30 3b 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41   0;}.nexprlist(A
7710: 29 20 3a 3a 3d 20 6e 65 78 70 72 6c 69 73 74 28  ) ::= nexprlist(
7720: 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29  X) COMMA expr(Y)
7730: 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  ..    {A = sqlit
7740: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
7750: 28 70 50 61 72 73 65 2c 58 2c 59 2c 30 29 3b 7d  (pParse,X,Y,0);}
7760: 0a 6e 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a  .nexprlist(A) ::
7770: 3d 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 7b  = expr(Y)..    {
7780: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
7790: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
77a0: 2c 30 2c 59 2c 30 29 3b 7d 0a 0a 0a 2f 2f 2f 2f  ,0,Y,0);}...////
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 2f 20 54 68 65 20 43 52  ///////// The CR
77d0: 45 41 54 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61  EATE INDEX comma
77e0: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
77f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
7800: 64 20 3a 3a 3d 20 43 52 45 41 54 45 28 53 29 20  d ::= CREATE(S) 
7810: 75 6e 69 71 75 65 66 6c 61 67 28 55 29 20 49 4e  uniqueflag(U) IN
7820: 44 45 58 20 69 66 6e 6f 74 65 78 69 73 74 73 28  DEX ifnotexists(
7830: 4e 45 29 20 6e 6d 28 58 29 20 64 62 6e 6d 28 44  NE) nm(X) dbnm(D
7840: 29 0a 20 20 20 20 20 20 20 20 4f 4e 20 6e 6d 28  ).        ON nm(
7850: 59 29 20 4c 50 20 69 64 78 6c 69 73 74 28 5a 29  Y) LP idxlist(Z)
7860: 20 52 50 28 45 29 2e 20 7b 0a 20 20 73 71 6c 69   RP(E). {.  sqli
7870: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
7880: 50 61 72 73 65 2c 20 26 58 2c 20 26 44 2c 20 0a  Parse, &X, &D, .
7890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78a0: 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
78b0: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
78c0: 2d 3e 64 62 2c 30 2c 26 59 2c 30 29 2c 20 5a 2c  ->db,0,&Y,0), Z,
78d0: 20 55 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   U,.            
78e0: 20 20 20 20 20 20 20 20 20 20 26 53 2c 20 26 45            &S, &E
78f0: 2c 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 2c  , SQLITE_SO_ASC,
7900: 20 4e 45 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 75   NE);.}..%type u
7910: 6e 69 71 75 65 66 6c 61 67 20 7b 69 6e 74 7d 0a  niqueflag {int}.
7920: 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a 3a  uniqueflag(A) ::
7930: 3d 20 55 4e 49 51 55 45 2e 20 20 7b 41 20 3d 20  = UNIQUE.  {A = 
7940: 4f 45 5f 41 62 6f 72 74 3b 7d 0a 75 6e 69 71 75  OE_Abort;}.uniqu
7950: 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 2e 20 20  eflag(A) ::= .  
7960: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 4e 6f        {A = OE_No
7970: 6e 65 3b 7d 0a 0a 25 74 79 70 65 20 69 64 78 6c  ne;}..%type idxl
7980: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
7990: 25 64 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c  %destructor idxl
79a0: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
79b0: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
79c0: 0a 25 74 79 70 65 20 69 64 78 6c 69 73 74 5f 6f  .%type idxlist_o
79d0: 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  pt {ExprList*}.%
79e0: 64 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c 69  destructor idxli
79f0: 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  st_opt {sqlite3E
7a00: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24  xprListDelete($$
7a10: 29 3b 7d 0a 25 74 79 70 65 20 69 64 78 69 74 65  );}.%type idxite
7a20: 6d 20 7b 54 6f 6b 65 6e 7d 0a 0a 69 64 78 6c 69  m {Token}..idxli
7a30: 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  st_opt(A) ::= . 
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
7a60: 0a 69 64 78 6c 69 73 74 5f 6f 70 74 28 41 29 20  .idxlist_opt(A) 
7a70: 3a 3a 3d 20 4c 50 20 69 64 78 6c 69 73 74 28 58  ::= LP idxlist(X
7a80: 29 20 52 50 2e 20 20 20 20 20 20 20 20 20 7b 41  ) RP.         {A
7a90: 20 3d 20 58 3b 7d 0a 69 64 78 6c 69 73 74 28 41   = X;}.idxlist(A
7aa0: 29 20 3a 3a 3d 20 69 64 78 6c 69 73 74 28 58 29  ) ::= idxlist(X)
7ab0: 20 43 4f 4d 4d 41 20 69 64 78 69 74 65 6d 28 59   COMMA idxitem(Y
7ac0: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
7ad0: 74 6f 72 64 65 72 28 5a 29 2e 20 20 7b 0a 20 20  torder(Z).  {.  
7ae0: 45 78 70 72 20 2a 70 20 3d 20 30 3b 0a 20 20 69  Expr *p = 0;.  i
7af0: 66 28 20 43 2e 6e 3e 30 20 29 7b 0a 20 20 20 20  f( C.n>0 ){.    
7b00: 70 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  p = sqlite3PExpr
7b10: 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55  (pParse, TK_COLU
7b20: 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  MN, 0, 0, 0);.  
7b30: 20 20 69 66 28 20 70 20 29 20 70 2d 3e 70 43 6f    if( p ) p->pCo
7b40: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ll = sqlite3Loca
7b50: 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
7b60: 2c 20 28 63 68 61 72 2a 29 43 2e 7a 2c 20 43 2e  , (char*)C.z, C.
7b70: 6e 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71  n);.  }.  A = sq
7b80: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
7b90: 65 6e 64 28 70 50 61 72 73 65 2c 58 2c 20 70 2c  end(pParse,X, p,
7ba0: 20 26 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 45   &Y);.  sqlite3E
7bb0: 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67  xprListCheckLeng
7bc0: 74 68 28 70 50 61 72 73 65 2c 20 41 2c 20 53 51  th(pParse, A, SQ
7bd0: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
7be0: 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 69 66 28   "index");.  if(
7bf0: 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78   A ) A->a[A->nEx
7c00: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20  pr-1].sortOrder 
7c10: 3d 20 5a 3b 0a 7d 0a 69 64 78 6c 69 73 74 28 41  = Z;.}.idxlist(A
7c20: 29 20 3a 3a 3d 20 69 64 78 69 74 65 6d 28 59 29  ) ::= idxitem(Y)
7c30: 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74   collate(C) sort
7c40: 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 45 78  order(Z). {.  Ex
7c50: 70 72 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66 28  pr *p = 0;.  if(
7c60: 20 43 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 70 20   C.n>0 ){.    p 
7c70: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
7c80: 50 61 72 73 65 2c 20 54 4b 5f 43 4f 4c 55 4d 4e  Parse, TK_COLUMN
7c90: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
7ca0: 69 66 28 20 70 20 29 20 70 2d 3e 70 43 6f 6c 6c  if( p ) p->pColl
7cb0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
7cc0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
7cd0: 28 63 68 61 72 2a 29 43 2e 7a 2c 20 43 2e 6e 29  (char*)C.z, C.n)
7ce0: 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c 69  ;.  }.  A = sqli
7cf0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
7d00: 64 28 70 50 61 72 73 65 2c 30 2c 20 70 2c 20 26  d(pParse,0, p, &
7d10: 59 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  Y);.  sqlite3Exp
7d20: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
7d30: 28 70 50 61 72 73 65 2c 20 41 2c 20 53 51 4c 49  (pParse, A, SQLI
7d40: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 20 22  TE_MAX_COLUMN, "
7d50: 69 6e 64 65 78 22 29 3b 0a 20 20 69 66 28 20 41  index");.  if( A
7d60: 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70 72   ) A->a[A->nExpr
7d70: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  -1].sortOrder = 
7d80: 5a 3b 0a 7d 0a 69 64 78 69 74 65 6d 28 41 29 20  Z;.}.idxitem(A) 
7d90: 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20 20 20 20 20  ::= nm(X).      
7da0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
7db0: 0a 0a 25 74 79 70 65 20 63 6f 6c 6c 61 74 65 20  ..%type collate 
7dc0: 7b 54 6f 6b 65 6e 7d 0a 63 6f 6c 6c 61 74 65 28  {Token}.collate(
7dd0: 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  C) ::= .        
7de0: 20 20 20 20 20 20 20 20 7b 43 2e 7a 20 3d 20 30          {C.z = 0
7df0: 3b 20 43 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c 6c  ; C.n = 0;}.coll
7e00: 61 74 65 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41  ate(C) ::= COLLA
7e10: 54 45 20 69 64 28 58 29 2e 20 20 20 7b 43 20 3d  TE id(X).   {C =
7e20: 20 58 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f   X;}.../////////
7e30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7e40: 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20 49 4e  //// The DROP IN
7e50: 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  DEX command ////
7e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7e70: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
7e80: 20 44 52 4f 50 20 49 4e 44 45 58 20 69 66 65 78   DROP INDEX ifex
7e90: 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65  ists(E) fullname
7ea0: 28 58 29 2e 20 20 20 7b 73 71 6c 69 74 65 33 44  (X).   {sqlite3D
7eb0: 72 6f 70 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ropIndex(pParse,
7ec0: 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f   X, E);}..//////
7ed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ee0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56 41 43 55  /////// The VACU
7ef0: 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  UM command /////
7f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7f10: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e  ////////.//.%ifn
7f20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7f30: 56 41 43 55 55 4d 0a 25 69 66 6e 64 65 66 20 53  VACUUM.%ifndef S
7f40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43  QLITE_OMIT_ATTAC
7f50: 48 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d  H.cmd ::= VACUUM
7f60: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7f70: 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75 6d 28   {sqlite3Vacuum(
7f80: 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a  pParse);}.cmd ::
7f90: 3d 20 56 41 43 55 55 4d 20 6e 6d 2e 20 20 20 20  = VACUUM nm.    
7fa0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
7fb0: 33 56 61 63 75 75 6d 28 70 50 61 72 73 65 29 3b  3Vacuum(pParse);
7fc0: 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  }.%endif  SQLITE
7fd0: 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 25 65 6e  _OMIT_ATTACH.%en
7fe0: 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54  dif  SQLITE_OMIT
7ff0: 5f 56 41 43 55 55 4d 0a 0a 2f 2f 2f 2f 2f 2f 2f  _VACUUM..///////
8000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8010: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d  ////// The PRAGM
8020: 41 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  A command //////
8030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8040: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64  ///////.//.%ifnd
8050: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
8060: 52 41 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52  RAGMA.cmd ::= PR
8070: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
8080: 5a 29 20 45 51 20 6e 6d 6e 75 6d 28 59 29 2e 20  Z) EQ nmnum(Y). 
8090: 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28   {sqlite3Pragma(
80a0: 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c  pParse,&X,&Z,&Y,
80b0: 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  0);}.cmd ::= PRA
80c0: 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a  GMA nm(X) dbnm(Z
80d0: 29 20 45 51 20 4f 4e 28 59 29 2e 20 20 7b 73 71  ) EQ ON(Y).  {sq
80e0: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
80f0: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d  se,&X,&Z,&Y,0);}
8100: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
8110: 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51  nm(X) dbnm(Z) EQ
8120: 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29 2e 20 7b   minus_num(Y). {
8130: 0a 20 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61  .  sqlite3Pragma
8140: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59  (pParse,&X,&Z,&Y
8150: 2c 31 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 50  ,1);.}.cmd ::= P
8160: 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d  RAGMA nm(X) dbnm
8170: 28 5a 29 20 4c 50 20 6e 6d 6e 75 6d 28 59 29 20  (Z) LP nmnum(Y) 
8180: 52 50 2e 20 7b 73 71 6c 69 74 65 33 50 72 61 67  RP. {sqlite3Prag
8190: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
81a0: 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  &Y,0);}.cmd ::= 
81b0: 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e  PRAGMA nm(X) dbn
81c0: 6d 28 5a 29 2e 20 20 20 20 20 20 20 20 20 20 20  m(Z).           
81d0: 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61    {sqlite3Pragma
81e0: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 30 2c  (pParse,&X,&Z,0,
81f0: 30 29 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a  0);}.nmnum(A) ::
8200: 3d 20 70 6c 75 73 5f 6e 75 6d 28 58 29 2e 20 20  = plus_num(X).  
8210: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
8220: 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d  X;}.nmnum(A) ::=
8230: 20 6e 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20   nm(X).         
8240: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
8250: 3b 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45  ;}.%endif SQLITE
8260: 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 70 6c 75  _OMIT_PRAGMA.plu
8270: 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75  s_num(A) ::= plu
8280: 73 5f 6f 70 74 20 6e 75 6d 62 65 72 28 58 29 2e  s_opt number(X).
8290: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75     {A = X;}.minu
82a0: 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e  s_num(A) ::= MIN
82b0: 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20  US number(X).   
82c0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65    {A = X;}.numbe
82d0: 72 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52  r(A) ::= INTEGER
82e0: 7c 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 20  |FLOAT(X).      
82f0: 20 7b 41 20 3d 20 58 3b 7d 0a 70 6c 75 73 5f 6f   {A = X;}.plus_o
8300: 70 74 20 3a 3a 3d 20 50 4c 55 53 2e 0a 70 6c 75  pt ::= PLUS..plu
8310: 73 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f  s_opt ::= ...///
8320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52  ///////// The CR
8340: 45 41 54 45 20 54 52 49 47 47 45 52 20 63 6f 6d  EATE TRIGGER com
8350: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
8360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e  //////////..%ifn
8370: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8380: 54 52 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d  TRIGGER..cmd ::=
8390: 20 43 52 45 41 54 45 20 74 72 69 67 67 65 72 5f   CREATE trigger_
83a0: 64 65 63 6c 28 41 29 20 42 45 47 49 4e 20 74 72  decl(A) BEGIN tr
83b0: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53  igger_cmd_list(S
83c0: 29 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f  ) END(Z). {.  To
83d0: 6b 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a  ken all;.  all.z
83e0: 20 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20   = A.z;.  all.n 
83f0: 3d 20 28 5a 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20  = (Z.z - A.z) + 
8400: 5a 2e 6e 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  Z.n;.  sqlite3Fi
8410: 6e 69 73 68 54 72 69 67 67 65 72 28 70 50 61 72  nishTrigger(pPar
8420: 73 65 2c 20 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a  se, S, &all);.}.
8430: 0a 74 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29  .trigger_decl(A)
8440: 20 3a 3a 3d 20 74 65 6d 70 28 54 29 20 54 52 49   ::= temp(T) TRI
8450: 47 47 45 52 20 69 66 6e 6f 74 65 78 69 73 74 73  GGER ifnotexists
8460: 28 4e 4f 45 52 52 29 20 6e 6d 28 42 29 20 64 62  (NOERR) nm(B) db
8470: 6e 6d 28 5a 29 20 0a 20 20 20 20 20 20 20 20 20  nm(Z) .         
8480: 20 20 20 20 20 20 20 20 20 20 20 74 72 69 67 67             trigg
8490: 65 72 5f 74 69 6d 65 28 43 29 20 74 72 69 67 67  er_time(C) trigg
84a0: 65 72 5f 65 76 65 6e 74 28 44 29 0a 20 20 20 20  er_event(D).    
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84c0: 4f 4e 20 66 75 6c 6c 6e 61 6d 65 28 45 29 20 66  ON fullname(E) f
84d0: 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 20 77 68  oreach_clause wh
84e0: 65 6e 5f 63 6c 61 75 73 65 28 47 29 2e 20 7b 0a  en_clause(G). {.
84f0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72    sqlite3BeginTr
8500: 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 26 42  igger(pParse, &B
8510: 2c 20 26 5a 2c 20 43 2c 20 44 2e 61 2c 20 44 2e  , &Z, C, D.a, D.
8520: 62 2c 20 45 2c 20 47 2c 20 54 2c 20 4e 4f 45 52  b, E, G, T, NOER
8530: 52 29 3b 0a 20 20 41 20 3d 20 28 5a 2e 6e 3d 3d  R);.  A = (Z.n==
8540: 30 3f 42 3a 5a 29 3b 0a 7d 0a 0a 25 74 79 70 65  0?B:Z);.}..%type
8550: 20 74 72 69 67 67 65 72 5f 74 69 6d 65 20 20 7b   trigger_time  {
8560: 69 6e 74 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d  int}.trigger_tim
8570: 65 28 41 29 20 3a 3a 3d 20 42 45 46 4f 52 45 2e  e(A) ::= BEFORE.
8580: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42        { A = TK_B
8590: 45 46 4f 52 45 3b 20 7d 0a 74 72 69 67 67 65 72  EFORE; }.trigger
85a0: 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 41 46 54  _time(A) ::= AFT
85b0: 45 52 2e 20 20 20 20 20 20 20 7b 20 41 20 3d 20  ER.       { A = 
85c0: 54 4b 5f 41 46 54 45 52 3b 20 20 7d 0a 74 72 69  TK_AFTER;  }.tri
85d0: 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d  gger_time(A) ::=
85e0: 20 49 4e 53 54 45 41 44 20 4f 46 2e 20 20 7b 20   INSTEAD OF.  { 
85f0: 41 20 3d 20 54 4b 5f 49 4e 53 54 45 41 44 3b 7d  A = TK_INSTEAD;}
8600: 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29  .trigger_time(A)
8610: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
8620: 20 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46 4f 52    { A = TK_BEFOR
8630: 45 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67  E; }..%type trig
8640: 67 65 72 5f 65 76 65 6e 74 20 7b 73 74 72 75 63  ger_event {struc
8650: 74 20 54 72 69 67 45 76 65 6e 74 7d 0a 25 64 65  t TrigEvent}.%de
8660: 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72  structor trigger
8670: 5f 65 76 65 6e 74 20 7b 73 71 6c 69 74 65 33 49  _event {sqlite3I
8680: 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24 2e 62  dListDelete($$.b
8690: 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e  );}.trigger_even
86a0: 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 7c  t(A) ::= DELETE|
86b0: 49 4e 53 45 52 54 28 4f 50 29 2e 20 20 20 20 20  INSERT(OP).     
86c0: 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b 20 41 2e    {A.a = @OP; A.
86d0: 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f  b = 0;}.trigger_
86e0: 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44  event(A) ::= UPD
86f0: 41 54 45 28 4f 50 29 2e 20 20 20 20 20 20 20 20  ATE(OP).        
8700: 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50        {A.a = @OP
8710: 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67  ; A.b = 0;}.trig
8720: 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d  ger_event(A) ::=
8730: 20 55 50 44 41 54 45 20 4f 46 20 69 6e 73 63 6f   UPDATE OF insco
8740: 6c 6c 69 73 74 28 58 29 2e 20 7b 41 2e 61 20 3d  llist(X). {A.a =
8750: 20 54 4b 5f 55 50 44 41 54 45 3b 20 41 2e 62 20   TK_UPDATE; A.b 
8760: 3d 20 58 3b 7d 0a 0a 66 6f 72 65 61 63 68 5f 63  = X;}..foreach_c
8770: 6c 61 75 73 65 20 3a 3a 3d 20 2e 0a 66 6f 72 65  lause ::= ..fore
8780: 61 63 68 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 46  ach_clause ::= F
8790: 4f 52 20 45 41 43 48 20 52 4f 57 2e 0a 0a 25 74  OR EACH ROW...%t
87a0: 79 70 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 20  ype when_clause 
87b0: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
87c0: 74 6f 72 20 77 68 65 6e 5f 63 6c 61 75 73 65 20  tor when_clause 
87d0: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
87e0: 74 65 28 24 24 29 3b 7d 0a 77 68 65 6e 5f 63 6c  te($$);}.when_cl
87f0: 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20  ause(A) ::= .   
8800: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
8810: 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65  0; }.when_clause
8820: 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70  (A) ::= WHEN exp
8830: 72 28 58 29 2e 20 7b 20 41 20 3d 20 58 3b 20 7d  r(X). { A = X; }
8840: 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f  ..%type trigger_
8850: 63 6d 64 5f 6c 69 73 74 20 7b 54 72 69 67 67 65  cmd_list {Trigge
8860: 72 53 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63  rStep*}.%destruc
8870: 74 6f 72 20 74 72 69 67 67 65 72 5f 63 6d 64 5f  tor trigger_cmd_
8880: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 44 65 6c  list {sqlite3Del
8890: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 24  eteTriggerStep($
88a0: 24 29 3b 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64  $);}.trigger_cmd
88b0: 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72 69  _list(A) ::= tri
88c0: 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 59 29  gger_cmd_list(Y)
88d0: 20 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29 20   trigger_cmd(X) 
88e0: 53 45 4d 49 2e 20 7b 0a 20 20 69 66 28 20 59 20  SEMI. {.  if( Y 
88f0: 29 7b 0a 20 20 20 20 59 2d 3e 70 4c 61 73 74 2d  ){.    Y->pLast-
8900: 3e 70 4e 65 78 74 20 3d 20 58 3b 0a 20 20 7d 65  >pNext = X;.  }e
8910: 6c 73 65 7b 0a 20 20 20 20 59 20 3d 20 58 3b 0a  lse{.    Y = X;.
8920: 20 20 7d 0a 20 20 59 2d 3e 70 4c 61 73 74 20 3d    }.  Y->pLast =
8930: 20 58 3b 0a 20 20 41 20 3d 20 59 3b 0a 7d 0a 74   X;.  A = Y;.}.t
8940: 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28  rigger_cmd_list(
8950: 41 29 20 3a 3a 3d 20 2e 20 7b 20 41 20 3d 20 30  A) ::= . { A = 0
8960: 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  ; }..%type trigg
8970: 65 72 5f 63 6d 64 20 7b 54 72 69 67 67 65 72 53  er_cmd {TriggerS
8980: 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  tep*}.%destructo
8990: 72 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 73  r trigger_cmd {s
89a0: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67  qlite3DeleteTrig
89b0: 67 65 72 53 74 65 70 28 24 24 29 3b 7d 0a 2f 2f  gerStep($$);}.//
89c0: 20 55 50 44 41 54 45 20 0a 74 72 69 67 67 65 72   UPDATE .trigger
89d0: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 55 50 44 41  _cmd(A) ::= UPDA
89e0: 54 45 20 6f 72 63 6f 6e 66 28 52 29 20 6e 6d 28  TE orconf(R) nm(
89f0: 58 29 20 53 45 54 20 73 65 74 6c 69 73 74 28 59  X) SET setlist(Y
8a00: 29 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 20  ) where_opt(Z). 
8a10: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
8a20: 20 7b 20 41 20 3d 20 73 71 6c 69 74 65 33 54 72   { A = sqlite3Tr
8a30: 69 67 67 65 72 55 70 64 61 74 65 53 74 65 70 28  iggerUpdateStep(
8a40: 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58 2c 20  pParse->db, &X, 
8a50: 59 2c 20 5a 2c 20 52 29 3b 20 7d 0a 0a 2f 2f 20  Y, Z, R); }..// 
8a60: 49 4e 53 45 52 54 0a 74 72 69 67 67 65 72 5f 63  INSERT.trigger_c
8a70: 6d 64 28 41 29 20 3a 3a 3d 20 69 6e 73 65 72 74  md(A) ::= insert
8a80: 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 6e 6d 28  _cmd(R) INTO nm(
8a90: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
8aa0: 74 28 46 29 20 0a 20 20 20 20 20 20 20 20 20 20  t(F) .          
8ab0: 20 20 20 20 20 20 20 20 20 56 41 4c 55 45 53 20           VALUES 
8ac0: 4c 50 20 69 74 65 6d 6c 69 73 74 28 59 29 20 52  LP itemlist(Y) R
8ad0: 50 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  P.  .           
8ae0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
8af0: 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65  TriggerInsertSte
8b00: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58  p(pParse->db, &X
8b10: 2c 20 46 2c 20 59 2c 20 30 2c 20 52 29 3b 7d 0a  , F, Y, 0, R);}.
8b20: 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20  .trigger_cmd(A) 
8b30: 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52  ::= insert_cmd(R
8b40: 29 20 49 4e 54 4f 20 6e 6d 28 58 29 20 69 6e 73  ) INTO nm(X) ins
8b50: 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 73  collist_opt(F) s
8b60: 65 6c 65 63 74 28 53 29 2e 0a 20 20 20 20 20 20  elect(S)..      
8b70: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
8b80: 6c 69 74 65 33 54 72 69 67 67 65 72 49 6e 73 65  lite3TriggerInse
8b90: 72 74 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64  rtStep(pParse->d
8ba0: 62 2c 20 26 58 2c 20 46 2c 20 30 2c 20 53 2c 20  b, &X, F, 0, S, 
8bb0: 52 29 3b 7d 0a 0a 2f 2f 20 44 45 4c 45 54 45 0a  R);}..// DELETE.
8bc0: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a  trigger_cmd(A) :
8bd0: 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6e  := DELETE FROM n
8be0: 6d 28 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59  m(X) where_opt(Y
8bf0: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
8c00: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72    {A = sqlite3Tr
8c10: 69 67 67 65 72 44 65 6c 65 74 65 53 74 65 70 28  iggerDeleteStep(
8c20: 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58 2c 20  pParse->db, &X, 
8c30: 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a  Y);}..// SELECT.
8c40: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a  trigger_cmd(A) :
8c50: 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b  := select(X).  {
8c60: 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  A = sqlite3Trigg
8c70: 65 72 53 65 6c 65 63 74 53 74 65 70 28 70 50 61  erSelectStep(pPa
8c80: 72 73 65 2d 3e 64 62 2c 20 58 29 3b 20 7d 0a 0a  rse->db, X); }..
8c90: 2f 2f 20 54 68 65 20 73 70 65 63 69 61 6c 20 52  // The special R
8ca0: 41 49 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20  AISE expression 
8cb0: 74 68 61 74 20 6d 61 79 20 6f 63 63 75 72 20 69  that may occur i
8cc0: 6e 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  n trigger progra
8cd0: 6d 73 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52  ms.expr(A) ::= R
8ce0: 41 49 53 45 28 58 29 20 4c 50 20 49 47 4e 4f 52  AISE(X) LP IGNOR
8cf0: 45 20 52 50 28 59 29 2e 20 20 7b 0a 20 20 41 20  E RP(Y).  {.  A 
8d00: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
8d10: 50 61 72 73 65 2c 20 54 4b 5f 52 41 49 53 45 2c  Parse, TK_RAISE,
8d20: 20 30 2c 20 30 2c 20 30 29 3b 20 0a 20 20 69 66   0, 0, 0); .  if
8d30: 28 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e 69 43  ( A ){.    A->iC
8d40: 6f 6c 75 6d 6e 20 3d 20 4f 45 5f 49 67 6e 6f 72  olumn = OE_Ignor
8d50: 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e;.    sqlite3Ex
8d60: 70 72 53 70 61 6e 28 41 2c 20 26 58 2c 20 26 59  prSpan(A, &X, &Y
8d70: 29 3b 0a 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29  );.  }.}.expr(A)
8d80: 20 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50   ::= RAISE(X) LP
8d90: 20 72 61 69 73 65 74 79 70 65 28 54 29 20 43 4f   raisetype(T) CO
8da0: 4d 4d 41 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e  MMA nm(Z) RP(Y).
8db0: 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65    {.  A = sqlite
8dc0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
8dd0: 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30 2c 20 26  K_RAISE, 0, 0, &
8de0: 5a 29 3b 20 0a 20 20 69 66 28 20 41 20 29 20 7b  Z); .  if( A ) {
8df0: 0a 20 20 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20  .    A->iColumn 
8e00: 3d 20 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = T;.    sqlite3
8e10: 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58 2c 20  ExprSpan(A, &X, 
8e20: 26 59 29 3b 0a 20 20 7d 0a 7d 0a 25 65 6e 64 69  &Y);.  }.}.%endi
8e30: 66 20 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  f  !SQLITE_OMIT_
8e40: 54 52 49 47 47 45 52 0a 0a 25 74 79 70 65 20 72  TRIGGER..%type r
8e50: 61 69 73 65 74 79 70 65 20 7b 69 6e 74 7d 0a 72  aisetype {int}.r
8e60: 61 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20  aisetype(A) ::= 
8e70: 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b 41 20 3d 20  ROLLBACK.  {A = 
8e80: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b 7d 0a 72 61  OE_Rollback;}.ra
8e90: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 41  isetype(A) ::= A
8ea0: 42 4f 52 54 2e 20 20 20 20 20 7b 41 20 3d 20 4f  BORT.     {A = O
8eb0: 45 5f 41 62 6f 72 74 3b 7d 0a 72 61 69 73 65 74  E_Abort;}.raiset
8ec0: 79 70 65 28 41 29 20 3a 3a 3d 20 46 41 49 4c 2e  ype(A) ::= FAIL.
8ed0: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 46 61        {A = OE_Fa
8ee0: 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  il;}.../////////
8ef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
8f00: 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 73 74   DROP TRIGGER st
8f10: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
8f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8f30: 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53  //////.%ifndef S
8f40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
8f50: 45 52 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20  ER.cmd ::= DROP 
8f60: 54 52 49 47 47 45 52 20 69 66 65 78 69 73 74 73  TRIGGER ifexists
8f70: 28 4e 4f 45 52 52 29 20 66 75 6c 6c 6e 61 6d 65  (NOERR) fullname
8f80: 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (X). {.  sqlite3
8f90: 44 72 6f 70 54 72 69 67 67 65 72 28 70 50 61 72  DropTrigger(pPar
8fa0: 73 65 2c 58 2c 4e 4f 45 52 52 29 3b 0a 7d 0a 25  se,X,NOERR);.}.%
8fb0: 65 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f  endif  !SQLITE_O
8fc0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2f 2f  MIT_TRIGGER..///
8fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8fe0: 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 20 44 41 54  ///// ATTACH DAT
8ff0: 41 42 41 53 45 20 66 69 6c 65 20 41 53 20 6e 61  ABASE file AS na
9000: 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  me /////////////
9010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66  ////////////.%if
9020: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9030: 5f 41 54 54 41 43 48 0a 63 6d 64 20 3a 3a 3d 20  _ATTACH.cmd ::= 
9040: 41 54 54 41 43 48 20 64 61 74 61 62 61 73 65 5f  ATTACH database_
9050: 6b 77 5f 6f 70 74 20 65 78 70 72 28 46 29 20 41  kw_opt expr(F) A
9060: 53 20 65 78 70 72 28 44 29 20 6b 65 79 5f 6f 70  S expr(D) key_op
9070: 74 28 4b 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  t(K). {.  sqlite
9080: 33 41 74 74 61 63 68 28 70 50 61 72 73 65 2c 20  3Attach(pParse, 
9090: 46 2c 20 44 2c 20 4b 29 3b 0a 7d 0a 63 6d 64 20  F, D, K);.}.cmd 
90a0: 3a 3a 3d 20 44 45 54 41 43 48 20 64 61 74 61 62  ::= DETACH datab
90b0: 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28  ase_kw_opt expr(
90c0: 44 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44  D). {.  sqlite3D
90d0: 65 74 61 63 68 28 70 50 61 72 73 65 2c 20 44 29  etach(pParse, D)
90e0: 3b 0a 7d 0a 0a 25 74 79 70 65 20 6b 65 79 5f 6f  ;.}..%type key_o
90f0: 70 74 20 7b 45 78 70 72 20 2a 7d 0a 25 64 65 73  pt {Expr *}.%des
9100: 74 72 75 63 74 6f 72 20 6b 65 79 5f 6f 70 74 20  tructor key_opt 
9110: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
9120: 74 65 28 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70 74  te($$);}.key_opt
9130: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
9150: 41 20 3d 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74  A = 0; }.key_opt
9160: 28 41 29 20 3a 3a 3d 20 4b 45 59 20 65 78 70 72  (A) ::= KEY expr
9170: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 20  (X).          { 
9180: 41 20 3d 20 58 3b 20 7d 0a 0a 64 61 74 61 62 61  A = X; }..databa
9190: 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 44 41  se_kw_opt ::= DA
91a0: 54 41 42 41 53 45 2e 0a 64 61 74 61 62 61 73 65  TABASE..database
91b0: 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 25 65  _kw_opt ::= ..%e
91c0: 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndif SQLITE_OMIT
91d0: 5f 41 54 54 41 43 48 0a 0a 2f 2f 2f 2f 2f 2f 2f  _ATTACH..///////
91e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
91f0: 2f 2f 2f 20 52 45 49 4e 44 45 58 20 63 6f 6c 6c  /// REINDEX coll
9200: 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ation //////////
9210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9220: 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66  ////////.%ifndef
9230: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
9240: 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d 20 52 45 49  NDEX.cmd ::= REI
9250: 4e 44 45 58 2e 20 20 20 20 20 20 20 20 20 20 20  NDEX.           
9260: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 52 65 69       {sqlite3Rei
9270: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20  ndex(pParse, 0, 
9280: 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45 49  0);}.cmd ::= REI
9290: 4e 44 45 58 20 6e 6d 28 58 29 20 64 62 6e 6d 28  NDEX nm(X) dbnm(
92a0: 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 52 65 69  Y).  {sqlite3Rei
92b0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 58 2c  ndex(pParse, &X,
92c0: 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66 20 20 53   &Y);}.%endif  S
92d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
92e0: 45 58 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  EX..////////////
92f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9300: 2f 2f 2f 2f 2f 2f 2f 20 41 4e 41 4c 59 5a 45 20  /////// ANALYZE 
9310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9330: 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  ///.%ifndef SQLI
9340: 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a  TE_OMIT_ANALYZE.
9350: 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 2e  cmd ::= ANALYZE.
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9370: 7b 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28  {sqlite3Analyze(
9380: 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 7d 0a  pParse, 0, 0);}.
9390: 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45 20  cmd ::= ANALYZE 
93a0: 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e 20 20  nm(X) dbnm(Y).  
93b0: 7b 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65 28  {sqlite3Analyze(
93c0: 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59 29 3b  pParse, &X, &Y);
93d0: 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f  }.%endif..//////
93e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
93f0: 2f 2f 20 41 4c 54 45 52 20 54 41 42 4c 45 20 74  // ALTER TABLE t
9400: 61 62 6c 65 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f  able ... ///////
9410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65  /////////.%ifnde
9430: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c  f SQLITE_OMIT_AL
9440: 54 45 52 54 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d  TERTABLE.cmd ::=
9450: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 66 75 6c   ALTER TABLE ful
9460: 6c 6e 61 6d 65 28 58 29 20 52 45 4e 41 4d 45 20  lname(X) RENAME 
9470: 54 4f 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 73 71  TO nm(Z). {.  sq
9480: 6c 69 74 65 33 41 6c 74 65 72 52 65 6e 61 6d 65  lite3AlterRename
9490: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 58 2c 26  Table(pParse,X,&
94a0: 5a 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4c  Z);.}.cmd ::= AL
94b0: 54 45 52 20 54 41 42 4c 45 20 61 64 64 5f 63 6f  TER TABLE add_co
94c0: 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 41 44  lumn_fullname AD
94d0: 44 20 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63  D kwcolumn_opt c
94e0: 6f 6c 75 6d 6e 28 59 29 2e 20 7b 0a 20 20 73 71  olumn(Y). {.  sq
94f0: 6c 69 74 65 33 41 6c 74 65 72 46 69 6e 69 73 68  lite3AlterFinish
9500: 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65  AddColumn(pParse
9510: 2c 20 26 59 29 3b 0a 7d 0a 61 64 64 5f 63 6f 6c  , &Y);.}.add_col
9520: 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 3a 3a 3d  umn_fullname ::=
9530: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a   fullname(X). {.
9540: 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 42 65    sqlite3AlterBe
9550: 67 69 6e 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61  ginAddColumn(pPa
9560: 72 73 65 2c 20 58 29 3b 0a 7d 0a 6b 77 63 6f 6c  rse, X);.}.kwcol
9570: 75 6d 6e 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 6b 77  umn_opt ::= ..kw
9580: 63 6f 6c 75 6d 6e 5f 6f 70 74 20 3a 3a 3d 20 43  column_opt ::= C
9590: 4f 4c 55 4d 4e 4b 57 2e 0a 25 65 6e 64 69 66 20  OLUMNKW..%endif 
95a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54   SQLITE_OMIT_ALT
95b0: 45 52 54 41 42 4c 45 0a 0a 2f 2f 2f 2f 2f 2f 2f  ERTABLE..///////
95c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
95d0: 2f 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  / CREATE VIRTUAL
95e0: 20 54 41 42 4c 45 20 2e 2e 2e 20 2f 2f 2f 2f 2f   TABLE ... /////
95f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9600: 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66  ////////.%ifndef
9610: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
9620: 54 55 41 4c 54 41 42 4c 45 0a 63 6d 64 20 3a 3a  TUALTABLE.cmd ::
9630: 3d 20 63 72 65 61 74 65 5f 76 74 61 62 2e 20 20  = create_vtab.  
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9650: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61       {sqlite3Vta
9660: 62 46 69 6e 69 73 68 50 61 72 73 65 28 70 50 61  bFinishParse(pPa
9670: 72 73 65 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  rse,0);}.cmd ::=
9680: 20 63 72 65 61 74 65 5f 76 74 61 62 20 4c 50 20   create_vtab LP 
9690: 76 74 61 62 61 72 67 6c 69 73 74 20 52 50 28 58  vtabarglist RP(X
96a0: 29 2e 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62  ).  {sqlite3Vtab
96b0: 46 69 6e 69 73 68 50 61 72 73 65 28 70 50 61 72  FinishParse(pPar
96c0: 73 65 2c 26 58 29 3b 7d 0a 63 72 65 61 74 65 5f  se,&X);}.create_
96d0: 76 74 61 62 20 3a 3a 3d 20 43 52 45 41 54 45 20  vtab ::= CREATE 
96e0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 6e 6d  VIRTUAL TABLE nm
96f0: 28 58 29 20 64 62 6e 6d 28 59 29 20 55 53 49 4e  (X) dbnm(Y) USIN
9700: 47 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 20 20 73  G nm(Z). {.    s
9710: 71 6c 69 74 65 33 56 74 61 62 42 65 67 69 6e 50  qlite3VtabBeginP
9720: 61 72 73 65 28 70 50 61 72 73 65 2c 20 26 58 2c  arse(pParse, &X,
9730: 20 26 59 2c 20 26 5a 29 3b 0a 7d 0a 76 74 61 62   &Y, &Z);.}.vtab
9740: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 76 74 61 62  arglist ::= vtab
9750: 61 72 67 2e 0a 76 74 61 62 61 72 67 6c 69 73 74  arg..vtabarglist
9760: 20 3a 3a 3d 20 76 74 61 62 61 72 67 6c 69 73 74   ::= vtabarglist
9770: 20 43 4f 4d 4d 41 20 76 74 61 62 61 72 67 2e 0a   COMMA vtabarg..
9780: 76 74 61 62 61 72 67 20 3a 3a 3d 20 2e 20 20 20  vtabarg ::= .   
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97a0: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62      {sqlite3Vtab
97b0: 41 72 67 49 6e 69 74 28 70 50 61 72 73 65 29 3b  ArgInit(pParse);
97c0: 7d 0a 76 74 61 62 61 72 67 20 3a 3a 3d 20 76 74  }.vtabarg ::= vt
97d0: 61 62 61 72 67 20 76 74 61 62 61 72 67 74 6f 6b  abarg vtabargtok
97e0: 65 6e 2e 0a 76 74 61 62 61 72 67 74 6f 6b 65 6e  en..vtabargtoken
97f0: 20 3a 3a 3d 20 41 4e 59 28 58 29 2e 20 20 20 20   ::= ANY(X).    
9800: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
9810: 56 74 61 62 41 72 67 45 78 74 65 6e 64 28 70 50  VtabArgExtend(pP
9820: 61 72 73 65 2c 26 58 29 3b 7d 0a 76 74 61 62 61  arse,&X);}.vtaba
9830: 72 67 74 6f 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61  rgtoken ::= lp a
9840: 6e 79 6c 69 73 74 20 52 50 28 58 29 2e 20 20 7b  nylist RP(X).  {
9850: 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 45 78  sqlite3VtabArgEx
9860: 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58 29 3b  tend(pParse,&X);
9870: 7d 0a 6c 70 20 3a 3a 3d 20 4c 50 28 58 29 2e 20  }.lp ::= LP(X). 
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74        {sqlite3Vt
98a0: 61 62 41 72 67 45 78 74 65 6e 64 28 70 50 61 72  abArgExtend(pPar
98b0: 73 65 2c 26 58 29 3b 7d 0a 61 6e 79 6c 69 73 74  se,&X);}.anylist
98c0: 20 3a 3a 3d 20 2e 0a 61 6e 79 6c 69 73 74 20 3a   ::= ..anylist :
98d0: 3a 3d 20 61 6e 79 6c 69 73 74 20 41 4e 59 28 58  := anylist ANY(X
98e0: 29 2e 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69  ).         {sqli
98f0: 74 65 33 56 74 61 62 41 72 67 45 78 74 65 6e 64  te3VtabArgExtend
9900: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 25 65  (pParse,&X);}.%e
9910: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
9920: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a     T_VIRTUALTABLE.