/ Hex Artifact Content
Login

Artifact bcfe366c1fd61cfc40e5344eb69a31997a821af0:


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 31 35 20 32 30 30 37 2f 30 32 2f 30 32 20  .215 2007/02/02 
0290: 31 32 3a 34 34 3a 33 37 20 64 72 68 20 45 78 70  12:44:37 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 23 69 6e  sqliteInt.h".#in
0690: 63 6c 75 64 65 20 22 70 61 72 73 65 2e 68 22 0a  clude "parse.h".
06a0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
06b0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
06c0: 74 75 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72  ture holds infor
06d0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
06e0: 0a 2a 2a 20 4c 49 4d 49 54 20 63 6c 61 75 73 65  .** LIMIT clause
06f0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61   of a SELECT sta
0700: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63  tement..*/.struc
0710: 74 20 4c 69 6d 69 74 56 61 6c 20 7b 0a 20 20 45  t LimitVal {.  E
0720: 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 20 20 20  xpr *pLimit;    
0730: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 65 78 70  /* The LIMIT exp
0740: 72 65 73 73 69 6f 6e 2e 20 20 4e 55 4c 4c 20 69  ression.  NULL i
0750: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6c 69  f there is no li
0760: 6d 69 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  mit */.  Expr *p
0770: 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 54 68 65  Offset;   /* The
0780: 20 4f 46 46 53 45 54 20 65 78 70 72 65 73 73 69   OFFSET expressi
0790: 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66 20 74 68 65  on.  NULL if the
07a0: 72 65 20 69 73 20 6e 6f 6e 65 20 2a 2f 0a 7d 3b  re is none */.};
07b0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
07c0: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
07d0: 63 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f  cture is used to
07e0: 20 73 74 6f 72 65 20 74 68 65 20 4c 49 4b 45 2c   store the LIKE,
07f0: 0a 2a 2a 20 47 4c 4f 42 2c 20 4e 4f 54 20 4c 49  .** GLOB, NOT LI
0800: 4b 45 2c 20 61 6e 64 20 4e 4f 54 20 47 4c 4f 42  KE, and NOT GLOB
0810: 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73   operators..*/.s
0820: 74 72 75 63 74 20 4c 69 6b 65 4f 70 20 7b 0a 20  truct LikeOp {. 
0830: 20 54 6f 6b 65 6e 20 65 4f 70 65 72 61 74 6f 72   Token eOperator
0840: 3b 20 20 2f 2a 20 22 6c 69 6b 65 22 20 6f 72 20  ;  /* "like" or 
0850: 22 67 6c 6f 62 22 20 6f 72 20 22 72 65 67 65 78  "glob" or "regex
0860: 70 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 74 3b  p" */.  int not;
0870: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0880: 20 69 66 20 74 68 65 20 4e 4f 54 20 6b 65 79 77   if the NOT keyw
0890: 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ord is present *
08a0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
08b0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
08c0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
08d0: 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  re describes the
08e0: 20 65 76 65 6e 74 20 6f 66 20 61 0a 2a 2a 20 54   event of a.** T
08f0: 52 49 47 47 45 52 2e 20 20 22 61 22 20 69 73 20  RIGGER.  "a" is 
0900: 74 68 65 20 65 76 65 6e 74 20 74 79 70 65 2c 20  the event type, 
0910: 6f 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45  one of TK_UPDATE
0920: 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 0a 2a 2a 20  , TK_INSERT,.** 
0930: 54 4b 5f 44 45 4c 45 54 45 2c 20 6f 72 20 54 4b  TK_DELETE, or TK
0940: 5f 49 4e 53 54 45 41 44 2e 20 20 49 66 20 74 68  _INSTEAD.  If th
0950: 65 20 65 76 65 6e 74 20 69 73 20 6f 66 20 74 68  e event is of th
0960: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
0970: 20 20 55 50 44 41 54 45 20 4f 4e 20 28 61 2c 62    UPDATE ON (a,b
0980: 2c 63 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74  ,c).**.** Then t
0990: 68 65 20 22 62 22 20 49 64 4c 69 73 74 20 72 65  he "b" IdList re
09a0: 63 6f 72 64 73 20 74 68 65 20 6c 69 73 74 20 22  cords the list "
09b0: 61 2c 62 2c 63 22 2e 0a 2a 2f 0a 73 74 72 75 63  a,b,c"..*/.struc
09c0: 74 20 54 72 69 67 45 76 65 6e 74 20 7b 20 69 6e  t TrigEvent { in
09d0: 74 20 61 3b 20 49 64 4c 69 73 74 20 2a 20 62 3b  t a; IdList * b;
09e0: 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e   };../*.** An in
09f0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
0a00: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 74  tructure holds t
0a10: 68 65 20 41 54 54 41 43 48 20 6b 65 79 20 61 6e  he ATTACH key an
0a20: 64 20 74 68 65 20 6b 65 79 20 74 79 70 65 2e 0a  d the key type..
0a30: 2a 2f 0a 73 74 72 75 63 74 20 41 74 74 61 63 68  */.struct Attach
0a40: 4b 65 79 20 7b 20 69 6e 74 20 74 79 70 65 3b 20  Key { int type; 
0a50: 20 54 6f 6b 65 6e 20 6b 65 79 3b 20 7d 3b 0a 0a   Token key; };..
0a60: 7d 20 2f 2f 20 65 6e 64 20 25 69 6e 63 6c 75 64  } // end %includ
0a70: 65 0a 0a 2f 2f 20 49 6e 70 75 74 20 69 73 20 61  e..// Input is a
0a80: 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d   single SQL comm
0a90: 61 6e 64 0a 69 6e 70 75 74 20 3a 3a 3d 20 63 6d  and.input ::= cm
0aa0: 64 6c 69 73 74 2e 0a 63 6d 64 6c 69 73 74 20 3a  dlist..cmdlist :
0ab0: 3a 3d 20 63 6d 64 6c 69 73 74 20 65 63 6d 64 2e  := cmdlist ecmd.
0ac0: 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 65 63 6d  .cmdlist ::= ecm
0ad0: 64 2e 0a 63 6d 64 78 20 3a 3a 3d 20 63 6d 64 2e  d..cmdx ::= cmd.
0ae0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c             { sql
0af0: 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
0b00: 28 70 50 61 72 73 65 29 3b 20 7d 0a 65 63 6d 64  (pParse); }.ecmd
0b10: 20 3a 3a 3d 20 53 45 4d 49 2e 0a 65 63 6d 64 20   ::= SEMI..ecmd 
0b20: 3a 3a 3d 20 65 78 70 6c 61 69 6e 20 63 6d 64 78  ::= explain cmdx
0b30: 20 53 45 4d 49 2e 0a 65 78 70 6c 61 69 6e 20 3a   SEMI..explain :
0b40: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 7b  := .           {
0b50: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72   sqlite3BeginPar
0b60: 73 65 28 70 50 61 72 73 65 2c 20 30 29 3b 20 7d  se(pParse, 0); }
0b70: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
0b80: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 65 78 70  OMIT_EXPLAIN.exp
0b90: 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c 41 49 4e  lain ::= EXPLAIN
0ba0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
0bb0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72   sqlite3BeginPar
0bc0: 73 65 28 70 50 61 72 73 65 2c 20 31 29 3b 20 7d  se(pParse, 1); }
0bd0: 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50  .explain ::= EXP
0be0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
0bf0: 20 20 20 7b 20 73 71 6c 69 74 65 33 42 65 67 69     { sqlite3Begi
0c00: 6e 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 32  nParse(pParse, 2
0c10: 29 3b 20 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  ); }.%endif  SQL
0c20: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
0c30: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
0c40: 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69 6e 20 61 6e  /////// Begin an
0c50: 64 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  d end transactio
0c60: 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ns. ////////////
0c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0c80: 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 42 45 47  .//..cmd ::= BEG
0c90: 49 4e 20 74 72 61 6e 73 74 79 70 65 28 59 29 20  IN transtype(Y) 
0ca0: 74 72 61 6e 73 5f 6f 70 74 2e 20 20 7b 73 71 6c  trans_opt.  {sql
0cb0: 69 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63  ite3BeginTransac
0cc0: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 59 29 3b  tion(pParse, Y);
0cd0: 7d 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20  }.trans_opt ::= 
0ce0: 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20  ..trans_opt ::= 
0cf0: 54 52 41 4e 53 41 43 54 49 4f 4e 2e 0a 74 72 61  TRANSACTION..tra
0d00: 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53  ns_opt ::= TRANS
0d10: 41 43 54 49 4f 4e 20 6e 6d 2e 0a 25 74 79 70 65  ACTION nm..%type
0d20: 20 74 72 61 6e 73 74 79 70 65 20 7b 69 6e 74 7d   transtype {int}
0d30: 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a  .transtype(A) ::
0d40: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
0d50: 7b 41 20 3d 20 54 4b 5f 44 45 46 45 52 52 45 44  {A = TK_DEFERRED
0d60: 3b 7d 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20  ;}.transtype(A) 
0d70: 3a 3a 3d 20 44 45 46 45 52 52 45 44 28 58 29 2e  ::= DEFERRED(X).
0d80: 20 20 7b 41 20 3d 20 40 58 3b 7d 0a 74 72 61 6e    {A = @X;}.tran
0d90: 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 49 4d 4d  stype(A) ::= IMM
0da0: 45 44 49 41 54 45 28 58 29 2e 20 7b 41 20 3d 20  EDIATE(X). {A = 
0db0: 40 58 3b 7d 0a 74 72 61 6e 73 74 79 70 65 28 41  @X;}.transtype(A
0dc0: 29 20 3a 3a 3d 20 45 58 43 4c 55 53 49 56 45 28  ) ::= EXCLUSIVE(
0dd0: 58 29 2e 20 7b 41 20 3d 20 40 58 3b 7d 0a 63 6d  X). {A = @X;}.cm
0de0: 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54 20 74 72 61  d ::= COMMIT tra
0df0: 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 7b 73 71  ns_opt.      {sq
0e00: 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73  lite3CommitTrans
0e10: 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d  action(pParse);}
0e20: 0a 63 6d 64 20 3a 3a 3d 20 45 4e 44 20 74 72 61  .cmd ::= END tra
0e30: 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 20 20 20  ns_opt.         
0e40: 7b 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72  {sqlite3CommitTr
0e50: 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65  ansaction(pParse
0e60: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c 4c  );}.cmd ::= ROLL
0e70: 42 41 43 4b 20 74 72 61 6e 73 5f 6f 70 74 2e 20  BACK trans_opt. 
0e80: 20 20 20 7b 73 71 6c 69 74 65 33 52 6f 6c 6c 62     {sqlite3Rollb
0e90: 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  ackTransaction(p
0ea0: 50 61 72 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  Parse);}..//////
0eb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
0ec0: 54 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  The CREATE TABLE
0ed0: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
0ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ef0: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
0f00: 3a 3d 20 63 72 65 61 74 65 5f 74 61 62 6c 65 20  := create_table 
0f10: 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67  create_table_arg
0f20: 73 2e 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 20  s..create_table 
0f30: 3a 3a 3d 20 43 52 45 41 54 45 20 74 65 6d 70 28  ::= CREATE temp(
0f40: 54 29 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78  T) TABLE ifnotex
0f50: 69 73 74 73 28 45 29 20 6e 6d 28 59 29 20 64 62  ists(E) nm(Y) db
0f60: 6e 6d 28 5a 29 2e 20 7b 0a 20 20 20 73 71 6c 69  nm(Z). {.   sqli
0f70: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
0f80: 61 72 73 65 2c 26 59 2c 26 5a 2c 54 2c 30 2c 30  arse,&Y,&Z,T,0,0
0f90: 2c 45 29 3b 0a 7d 0a 25 74 79 70 65 20 69 66 6e  ,E);.}.%type ifn
0fa0: 6f 74 65 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69  otexists {int}.i
0fb0: 66 6e 6f 74 65 78 69 73 74 73 28 41 29 20 3a 3a  fnotexists(A) ::
0fc0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
0fd0: 20 7b 41 20 3d 20 30 3b 7d 0a 69 66 6e 6f 74 65   {A = 0;}.ifnote
0fe0: 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 49 46 20  xists(A) ::= IF 
0ff0: 4e 4f 54 20 45 58 49 53 54 53 2e 20 7b 41 20 3d  NOT EXISTS. {A =
1000: 20 31 3b 7d 0a 25 74 79 70 65 20 74 65 6d 70 20   1;}.%type temp 
1010: 7b 69 6e 74 7d 0a 25 69 66 6e 64 65 66 20 53 51  {int}.%ifndef SQ
1020: 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42  LITE_OMIT_TEMPDB
1030: 0a 74 65 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d  .temp(A) ::= TEM
1040: 50 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a 25 65 6e  P.  {A = 1;}.%en
1050: 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54  dif  SQLITE_OMIT
1060: 5f 54 45 4d 50 44 42 0a 74 65 6d 70 28 41 29 20  _TEMPDB.temp(A) 
1070: 3a 3a 3d 20 2e 20 20 20 20 20 20 7b 41 20 3d 20  ::= .      {A = 
1080: 30 3b 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65  0;}.create_table
1090: 5f 61 72 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c  _args ::= LP col
10a0: 75 6d 6e 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74  umnlist conslist
10b0: 5f 6f 70 74 28 58 29 20 52 50 28 59 29 2e 20 7b  _opt(X) RP(Y). {
10c0: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
10d0: 6c 65 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c  le(pParse,&X,&Y,
10e0: 30 29 3b 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62  0);.}.create_tab
10f0: 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 41 53 20 73  le_args ::= AS s
1100: 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71  elect(S). {.  sq
1110: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
1120: 61 72 73 65 2c 30 2c 30 2c 53 29 3b 0a 20 20 73  arse,0,0,S);.  s
1130: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
1140: 74 65 28 53 29 3b 0a 7d 0a 63 6f 6c 75 6d 6e 6c  te(S);.}.columnl
1150: 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6c 69  ist ::= columnli
1160: 73 74 20 43 4f 4d 4d 41 20 63 6f 6c 75 6d 6e 2e  st COMMA column.
1170: 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20  .columnlist ::= 
1180: 63 6f 6c 75 6d 6e 2e 0a 0a 2f 2f 20 41 20 22 63  column...// A "c
1190: 6f 6c 75 6d 6e 22 20 69 73 20 61 20 63 6f 6d 70  olumn" is a comp
11a0: 6c 65 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e  lete description
11b0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   of a single col
11c0: 75 6d 6e 20 69 6e 20 61 0a 2f 2f 20 43 52 45 41  umn in a.// CREA
11d0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
11e0: 6e 74 2e 20 20 54 68 69 73 20 69 6e 63 6c 75 64  nt.  This includ
11f0: 65 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  es the column na
1200: 6d 65 2c 20 69 74 73 0a 2f 2f 20 64 61 74 61 74  me, its.// datat
1210: 79 70 65 2c 20 61 6e 64 20 6f 74 68 65 72 20 6b  ype, and other k
1220: 65 79 77 6f 72 64 73 20 73 75 63 68 20 61 73 20  eywords such as 
1230: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 55 4e 49  PRIMARY KEY, UNI
1240: 51 55 45 2c 20 52 45 46 45 52 45 4e 43 45 53 2c  QUE, REFERENCES,
1250: 0a 2f 2f 20 4e 4f 54 20 4e 55 4c 4c 20 61 6e 64  .// NOT NULL and
1260: 20 73 6f 20 66 6f 72 74 68 2e 0a 2f 2f 0a 63 6f   so forth..//.co
1270: 6c 75 6d 6e 28 41 29 20 3a 3a 3d 20 63 6f 6c 75  lumn(A) ::= colu
1280: 6d 6e 69 64 28 58 29 20 74 79 70 65 20 63 61 72  mnid(X) type car
1290: 67 6c 69 73 74 2e 20 7b 0a 20 20 41 2e 7a 20 3d  glist. {.  A.z =
12a0: 20 58 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20 28 70   X.z;.  A.n = (p
12b0: 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65  Parse->sLastToke
12c0: 6e 2e 7a 2d 58 2e 7a 29 20 2b 20 70 50 61 72 73  n.z-X.z) + pPars
12d0: 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b  e->sLastToken.n;
12e0: 0a 7d 0a 63 6f 6c 75 6d 6e 69 64 28 41 29 20 3a  .}.columnid(A) :
12f0: 3a 3d 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71  := nm(X). {.  sq
1300: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70  lite3AddColumn(p
1310: 50 61 72 73 65 2c 26 58 29 3b 0a 20 20 41 20 3d  Parse,&X);.  A =
1320: 20 58 3b 0a 7d 0a 0a 0a 2f 2f 20 41 6e 20 49 44   X;.}...// An ID
1330: 45 4e 54 49 46 49 45 52 20 63 61 6e 20 62 65 20  ENTIFIER can be 
1340: 61 20 67 65 6e 65 72 69 63 20 69 64 65 6e 74 69  a generic identi
1350: 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20 6f 66 20  fier, or one of 
1360: 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65 79 77 6f  several.// keywo
1370: 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e 2d 73 74  rds.  Any non-st
1380: 61 6e 64 61 72 64 20 6b 65 79 77 6f 72 64 20 63  andard keyword c
1390: 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e 20 69 64  an also be an id
13a0: 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 0a 25 74 79  entifier..//.%ty
13b0: 70 65 20 69 64 20 7b 54 6f 6b 65 6e 7d 0a 69 64  pe id {Token}.id
13c0: 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20  (A) ::= ID(X).  
13d0: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
13e0: 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .// The followin
13f0: 67 20 64 69 72 65 63 74 69 76 65 20 63 61 75 73  g directive caus
1400: 65 73 20 74 6f 6b 65 6e 73 20 41 42 4f 52 54 2c  es tokens ABORT,
1410: 20 41 46 54 45 52 2c 20 41 53 43 2c 20 65 74 63   AFTER, ASC, etc
1420: 2e 20 74 6f 0a 2f 2f 20 66 61 6c 6c 62 61 63 6b  . to.// fallback
1430: 20 74 6f 20 49 44 20 69 66 20 74 68 65 79 20 77   to ID if they w
1440: 69 6c 6c 20 6e 6f 74 20 70 61 72 73 65 20 61 73  ill not parse as
1450: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
1460: 76 61 6c 75 65 2e 0a 2f 2f 20 54 68 69 73 20 6f  value..// This o
1470: 62 76 69 61 74 65 73 20 74 68 65 20 6e 65 65 64  bviates the need
1480: 20 66 6f 72 20 74 68 65 20 22 69 64 22 20 6e 6f   for the "id" no
1490: 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2f 2f 0a 25 66  nterminal..//.%f
14a0: 61 6c 6c 62 61 63 6b 20 49 44 0a 20 20 41 42 4f  allback ID.  ABO
14b0: 52 54 20 41 46 54 45 52 20 41 4e 41 4c 59 5a 45  RT AFTER ANALYZE
14c0: 20 41 53 43 20 41 54 54 41 43 48 20 42 45 46 4f   ASC ATTACH BEFO
14d0: 52 45 20 42 45 47 49 4e 20 43 41 53 43 41 44 45  RE BEGIN CASCADE
14e0: 20 43 41 53 54 20 43 4f 4e 46 4c 49 43 54 0a 20   CAST CONFLICT. 
14f0: 20 44 41 54 41 42 41 53 45 20 44 45 46 45 52 52   DATABASE DEFERR
1500: 45 44 20 44 45 53 43 20 44 45 54 41 43 48 20 45  ED DESC DETACH E
1510: 41 43 48 20 45 4e 44 20 45 58 43 4c 55 53 49 56  ACH END EXCLUSIV
1520: 45 20 45 58 50 4c 41 49 4e 20 46 41 49 4c 20 46  E EXPLAIN FAIL F
1530: 4f 52 0a 20 20 49 47 4e 4f 52 45 20 49 4d 4d 45  OR.  IGNORE IMME
1540: 44 49 41 54 45 20 49 4e 49 54 49 41 4c 4c 59 20  DIATE INITIALLY 
1550: 49 4e 53 54 45 41 44 20 4c 49 4b 45 5f 4b 57 20  INSTEAD LIKE_KW 
1560: 4d 41 54 43 48 20 50 4c 41 4e 20 51 55 45 52 59  MATCH PLAN QUERY
1570: 20 4b 45 59 0a 20 20 4f 46 20 4f 46 46 53 45 54   KEY.  OF OFFSET
1580: 20 50 52 41 47 4d 41 20 52 41 49 53 45 20 52 45   PRAGMA RAISE RE
1590: 50 4c 41 43 45 20 52 45 53 54 52 49 43 54 20 52  PLACE RESTRICT R
15a0: 4f 57 20 53 54 41 54 45 4d 45 4e 54 0a 20 20 54  OW STATEMENT.  T
15b0: 45 4d 50 20 54 52 49 47 47 45 52 20 56 41 43 55  EMP TRIGGER VACU
15c0: 55 4d 20 56 49 45 57 20 56 49 52 54 55 41 4c 0a  UM VIEW VIRTUAL.
15d0: 25 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  %ifdef SQLITE_OM
15e0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
15f0: 43 54 0a 20 20 45 58 43 45 50 54 20 49 4e 54 45  CT.  EXCEPT INTE
1600: 52 53 45 43 54 20 55 4e 49 4f 4e 0a 25 65 6e 64  RSECT UNION.%end
1610: 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  if SQLITE_OMIT_C
1620: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20  OMPOUND_SELECT. 
1630: 20 52 45 49 4e 44 45 58 20 52 45 4e 41 4d 45 20   REINDEX RENAME 
1640: 43 54 49 4d 45 5f 4b 57 20 49 46 0a 20 20 2e 0a  CTIME_KW IF.  ..
1650: 25 77 69 6c 64 63 61 72 64 20 41 4e 59 2e 0a 0a  %wildcard ANY...
1660: 2f 2f 20 44 65 66 69 6e 65 20 6f 70 65 72 61 74  // Define operat
1670: 6f 72 20 70 72 65 63 65 64 65 6e 63 65 20 65 61  or precedence ea
1680: 72 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69 73  rly so that this
1690: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 63   is the first oc
16a0: 63 75 72 61 6e 63 65 0a 2f 2f 20 6f 66 20 74 68  curance.// of th
16b0: 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 6b 65 6e  e operator token
16c0: 73 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 65 72  s in the grammer
16d0: 2e 20 20 4b 65 65 70 69 6e 67 20 74 68 65 20 6f  .  Keeping the o
16e0: 70 65 72 61 74 6f 72 73 20 74 6f 67 65 74 68 65  perators togethe
16f0: 72 0a 2f 2f 20 63 61 75 73 65 73 20 74 68 65 6d  r.// causes them
1700: 20 74 6f 20 62 65 20 61 73 73 69 67 6e 65 64 20   to be assigned 
1710: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20 74  integer values t
1720: 68 61 74 20 61 72 65 20 63 6c 6f 73 65 20 74 6f  hat are close to
1730: 67 65 74 68 65 72 2c 0a 2f 2f 20 77 68 69 63 68  gether,.// which
1740: 20 6b 65 65 70 73 20 70 61 72 73 65 72 20 74 61   keeps parser ta
1750: 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e 0a 2f 2f  bles smaller..//
1760: 0a 2f 2f 20 54 68 65 20 74 6f 6b 65 6e 20 76 61  .// The token va
1770: 6c 75 65 73 20 61 73 73 69 67 6e 65 64 20 74 6f  lues assigned to
1780: 20 74 68 65 73 65 20 73 79 6d 62 6f 6c 73 20 69   these symbols i
1790: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
17a0: 74 68 65 20 6f 72 64 65 72 0a 2f 2f 20 69 6e 20  the order.// in 
17b0: 77 68 69 63 68 20 6c 65 6d 6f 6e 20 66 69 72 73  which lemon firs
17c0: 74 20 73 65 65 73 20 74 68 65 6d 2e 20 20 49 74  t sees them.  It
17d0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 63 61 73   must be the cas
17e0: 65 20 74 68 61 74 20 49 53 4e 55 4c 4c 2f 4e 4f  e that ISNULL/NO
17f0: 54 4e 55 4c 4c 2c 0a 2f 2f 20 4e 45 2f 45 51 2c  TNULL,.// NE/EQ,
1800: 20 47 54 2f 4c 45 2c 20 61 6e 64 20 47 45 2f 4c   GT/LE, and GE/L
1810: 54 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  T are separated 
1820: 62 79 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  by only a single
1830: 20 76 61 6c 75 65 2e 20 20 53 65 65 0a 2f 2f 20   value.  See.// 
1840: 74 68 65 20 73 71 6c 69 74 65 33 45 78 70 72 49  the sqlite3ExprI
1850: 66 46 61 6c 73 65 28 29 20 72 6f 75 74 69 6e 65  fFalse() routine
1860: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
1870: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74  information on t
1880: 68 69 73 0a 2f 2f 20 63 6f 6e 73 74 72 61 69 6e  his.// constrain
1890: 74 2e 0a 2f 2f 0a 25 6c 65 66 74 20 4f 52 2e 0a  t..//.%left OR..
18a0: 25 6c 65 66 74 20 41 4e 44 2e 0a 25 72 69 67 68  %left AND..%righ
18b0: 74 20 4e 4f 54 2e 0a 25 6c 65 66 74 20 49 53 20  t NOT..%left IS 
18c0: 4d 41 54 43 48 20 4c 49 4b 45 5f 4b 57 20 42 45  MATCH LIKE_KW BE
18d0: 54 57 45 45 4e 20 49 4e 20 49 53 4e 55 4c 4c 20  TWEEN IN ISNULL 
18e0: 4e 4f 54 4e 55 4c 4c 20 4e 45 20 45 51 2e 0a 25  NOTNULL NE EQ..%
18f0: 6c 65 66 74 20 47 54 20 4c 45 20 4c 54 20 47 45  left GT LE LT GE
1900: 2e 0a 25 72 69 67 68 74 20 45 53 43 41 50 45 2e  ..%right ESCAPE.
1910: 0a 25 6c 65 66 74 20 42 49 54 41 4e 44 20 42 49  .%left BITAND BI
1920: 54 4f 52 20 4c 53 48 49 46 54 20 52 53 48 49 46  TOR LSHIFT RSHIF
1930: 54 2e 0a 25 6c 65 66 74 20 50 4c 55 53 20 4d 49  T..%left PLUS MI
1940: 4e 55 53 2e 0a 25 6c 65 66 74 20 53 54 41 52 20  NUS..%left STAR 
1950: 53 4c 41 53 48 20 52 45 4d 2e 0a 25 6c 65 66 74  SLASH REM..%left
1960: 20 43 4f 4e 43 41 54 2e 0a 25 6c 65 66 74 20 43   CONCAT..%left C
1970: 4f 4c 4c 41 54 45 2e 0a 25 72 69 67 68 74 20 55  OLLATE..%right U
1980: 4d 49 4e 55 53 20 55 50 4c 55 53 20 42 49 54 4e  MINUS UPLUS BITN
1990: 4f 54 2e 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73  OT...// And "ids
19a0: 22 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 65  " is an identife
19b0: 72 2d 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a  r-or-string..//.
19c0: 25 74 79 70 65 20 69 64 73 20 7b 54 6f 6b 65 6e  %type ids {Token
19d0: 7d 0a 69 64 73 28 41 29 20 3a 3a 3d 20 49 44 7c  }.ids(A) ::= ID|
19e0: 53 54 52 49 4e 47 28 58 29 2e 20 20 20 7b 41 20  STRING(X).   {A 
19f0: 3d 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e 61  = X;}..// The na
1a00: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f  me of a column o
1a10: 72 20 74 61 62 6c 65 20 63 61 6e 20 62 65 20 61  r table can be a
1a20: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
1a30: 69 6e 67 3a 0a 2f 2f 0a 25 74 79 70 65 20 6e 6d  ing:.//.%type nm
1a40: 20 7b 54 6f 6b 65 6e 7d 0a 6e 6d 28 41 29 20 3a   {Token}.nm(A) :
1a50: 3a 3d 20 49 44 28 58 29 2e 20 20 20 20 20 20 20  := ID(X).       
1a60: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 28 41 29    {A = X;}.nm(A)
1a70: 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20   ::= STRING(X). 
1a80: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 28      {A = X;}.nm(
1a90: 41 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 58  A) ::= JOIN_KW(X
1aa0: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  ).    {A = X;}..
1ab0: 2f 2f 20 41 20 74 79 70 65 74 6f 6b 65 6e 20 69  // A typetoken i
1ac0: 73 20 72 65 61 6c 6c 79 20 6f 6e 65 20 6f 72 20  s really one or 
1ad0: 6d 6f 72 65 20 74 6f 6b 65 6e 73 20 74 68 61 74  more tokens that
1ae0: 20 66 6f 72 6d 20 61 20 74 79 70 65 20 6e 61 6d   form a type nam
1af0: 65 20 73 75 63 68 0a 2f 2f 20 61 73 20 63 61 6e  e such.// as can
1b00: 20 62 65 20 66 6f 75 6e 64 20 61 66 74 65 72 20   be found after 
1b10: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
1b20: 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
1b30: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 20  E statement..// 
1b40: 4d 75 6c 74 69 70 6c 65 20 74 6f 6b 65 6e 73 20  Multiple tokens 
1b50: 61 72 65 20 63 6f 6e 63 61 74 65 6e 61 74 65 64  are concatenated
1b60: 20 74 6f 20 66 6f 72 6d 20 74 68 65 20 76 61 6c   to form the val
1b70: 75 65 20 6f 66 20 74 68 65 20 74 79 70 65 74 6f  ue of the typeto
1b80: 6b 65 6e 2e 0a 2f 2f 0a 25 74 79 70 65 20 74 79  ken..//.%type ty
1b90: 70 65 74 6f 6b 65 6e 20 7b 54 6f 6b 65 6e 7d 0a  petoken {Token}.
1ba0: 74 79 70 65 20 3a 3a 3d 20 2e 0a 74 79 70 65 20  type ::= ..type 
1bb0: 3a 3a 3d 20 74 79 70 65 74 6f 6b 65 6e 28 58 29  ::= typetoken(X)
1bc0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bd0: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43      {sqlite3AddC
1be0: 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65  olumnType(pParse
1bf0: 2c 26 58 29 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e  ,&X);}.typetoken
1c00: 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65  (A) ::= typename
1c10: 28 58 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a  (X).   {A = X;}.
1c20: 74 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d  typetoken(A) ::=
1c30: 20 74 79 70 65 6e 61 6d 65 28 58 29 20 4c 50 20   typename(X) LP 
1c40: 73 69 67 6e 65 64 20 52 50 28 59 29 2e 20 7b 0a  signed RP(Y). {.
1c50: 20 20 41 2e 7a 20 3d 20 58 2e 7a 3b 0a 20 20 41    A.z = X.z;.  A
1c60: 2e 6e 20 3d 20 26 59 2e 7a 5b 59 2e 6e 5d 20 2d  .n = &Y.z[Y.n] -
1c70: 20 58 2e 7a 3b 0a 7d 0a 74 79 70 65 74 6f 6b 65   X.z;.}.typetoke
1c80: 6e 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d  n(A) ::= typenam
1c90: 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20 43  e(X) LP signed C
1ca0: 4f 4d 4d 41 20 73 69 67 6e 65 64 20 52 50 28 59  OMMA signed RP(Y
1cb0: 29 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e 7a  ). {.  A.z = X.z
1cc0: 3b 0a 20 20 41 2e 6e 20 3d 20 26 59 2e 7a 5b 59  ;.  A.n = &Y.z[Y
1cd0: 2e 6e 5d 20 2d 20 58 2e 7a 3b 0a 7d 0a 25 74 79  .n] - X.z;.}.%ty
1ce0: 70 65 20 74 79 70 65 6e 61 6d 65 20 7b 54 6f 6b  pe typename {Tok
1cf0: 65 6e 7d 0a 74 79 70 65 6e 61 6d 65 28 41 29 20  en}.typename(A) 
1d00: 3a 3a 3d 20 69 64 73 28 58 29 2e 20 20 20 20 20  ::= ids(X).     
1d10: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
1d20: 0a 74 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d  .typename(A) ::=
1d30: 20 74 79 70 65 6e 61 6d 65 28 58 29 20 69 64 73   typename(X) ids
1d40: 28 59 29 2e 20 7b 41 2e 7a 3d 58 2e 7a 3b 20 41  (Y). {A.z=X.z; A
1d50: 2e 6e 3d 59 2e 6e 2b 28 59 2e 7a 2d 58 2e 7a 29  .n=Y.n+(Y.z-X.z)
1d60: 3b 7d 0a 25 74 79 70 65 20 73 69 67 6e 65 64 20  ;}.%type signed 
1d70: 7b 69 6e 74 7d 0a 73 69 67 6e 65 64 28 41 29 20  {int}.signed(A) 
1d80: 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d 28 58 29 2e  ::= plus_num(X).
1d90: 20 20 20 20 7b 20 41 20 3d 20 61 74 6f 69 28 28      { A = atoi((
1da0: 63 68 61 72 2a 29 58 2e 7a 29 3b 20 7d 0a 73 69  char*)X.z); }.si
1db0: 67 6e 65 64 28 41 29 20 3a 3a 3d 20 6d 69 6e 75  gned(A) ::= minu
1dc0: 73 5f 6e 75 6d 28 58 29 2e 20 20 20 7b 20 41 20  s_num(X).   { A 
1dd0: 3d 20 2d 61 74 6f 69 28 28 63 68 61 72 2a 29 58  = -atoi((char*)X
1de0: 2e 7a 29 3b 20 7d 0a 0a 2f 2f 20 22 63 61 72 67  .z); }..// "carg
1df0: 6c 69 73 74 22 20 69 73 20 61 20 6c 69 73 74 20  list" is a list 
1e00: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
1e10: 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 63  nstraints that c
1e20: 6f 6d 65 20 61 66 74 65 72 20 74 68 65 0a 2f 2f  ome after the.//
1e30: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64   column name and
1e40: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 20   column type in 
1e50: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
1e60: 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 0a 63 61 72  tatement..//.car
1e70: 67 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c 69  glist ::= cargli
1e80: 73 74 20 63 61 72 67 2e 0a 63 61 72 67 6c 69 73  st carg..carglis
1e90: 74 20 3a 3a 3d 20 2e 0a 63 61 72 67 20 3a 3a 3d  t ::= ..carg ::=
1ea0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 20 63   CONSTRAINT nm c
1eb0: 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 63  cons..carg ::= c
1ec0: 63 6f 6e 73 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20  cons..ccons ::= 
1ed0: 44 45 46 41 55 4c 54 20 74 65 72 6d 28 58 29 2e  DEFAULT term(X).
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
1ef0: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
1f00: 6c 75 65 28 70 50 61 72 73 65 2c 58 29 3b 7d 0a  lue(pParse,X);}.
1f10: 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c  ccons ::= DEFAUL
1f20: 54 20 4c 50 20 65 78 70 72 28 58 29 20 52 50 2e  T LP expr(X) RP.
1f30: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
1f40: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
1f50: 61 72 73 65 2c 58 29 3b 7d 0a 63 63 6f 6e 73 20  arse,X);}.ccons 
1f60: 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50 4c 55 53  ::= DEFAULT PLUS
1f70: 20 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20   term(X).       
1f80: 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75  {sqlite3AddDefau
1f90: 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 58  ltValue(pParse,X
1fa0: 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45  );}.ccons ::= DE
1fb0: 46 41 55 4c 54 20 4d 49 4e 55 53 20 74 65 72 6d  FAULT MINUS term
1fc0: 28 58 29 2e 20 20 20 20 20 20 7b 0a 20 20 45 78  (X).      {.  Ex
1fd0: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
1fe0: 78 70 72 28 54 4b 5f 55 4d 49 4e 55 53 2c 20 58  xpr(TK_UMINUS, X
1ff0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
2000: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
2010: 65 28 70 50 61 72 73 65 2c 70 29 3b 0a 7d 0a 63  e(pParse,p);.}.c
2020: 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54  cons ::= DEFAULT
2030: 20 69 64 28 58 29 2e 20 20 20 20 20 20 20 20 20   id(X).         
2040: 20 20 20 20 20 7b 0a 20 20 45 78 70 72 20 2a 70       {.  Expr *p
2050: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
2060: 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20  K_STRING, 0, 0, 
2070: 26 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 41 64  &X);.  sqlite3Ad
2080: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
2090: 61 72 73 65 2c 70 29 3b 0a 7d 0a 0a 2f 2f 20 49  arse,p);.}..// I
20a0: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
20b0: 65 20 74 79 70 65 20 6e 61 6d 65 2c 20 77 65 20  e type name, we 
20c0: 61 6c 73 6f 20 63 61 72 65 20 61 62 6f 75 74 20  also care about 
20d0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
20e0: 61 6e 64 0a 2f 2f 20 55 4e 49 51 55 45 20 63 6f  and.// UNIQUE co
20f0: 6e 73 74 72 61 69 6e 74 73 2e 0a 2f 2f 0a 63 63  nstraints..//.cc
2100: 6f 6e 73 20 3a 3a 3d 20 4e 55 4c 4c 20 6f 6e 63  ons ::= NULL onc
2110: 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e  onf..ccons ::= N
2120: 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 28 52  OT NULL onconf(R
2130: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
2140: 20 7b 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e   {sqlite3AddNotN
2150: 75 6c 6c 28 70 50 61 72 73 65 2c 20 52 29 3b 7d  ull(pParse, R);}
2160: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41  .ccons ::= PRIMA
2170: 52 59 20 4b 45 59 20 73 6f 72 74 6f 72 64 65 72  RY KEY sortorder
2180: 28 5a 29 20 6f 6e 63 6f 6e 66 28 52 29 20 61 75  (Z) onconf(R) au
2190: 74 6f 69 6e 63 28 49 29 2e 0a 20 20 20 20 20 20  toinc(I)..      
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
21c0: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
21d0: 79 4b 65 79 28 70 50 61 72 73 65 2c 30 2c 52 2c  yKey(pParse,0,R,
21e0: 49 2c 5a 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d  I,Z);}.ccons ::=
21f0: 20 55 4e 49 51 55 45 20 6f 6e 63 6f 6e 66 28 52   UNIQUE onconf(R
2200: 29 2e 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72  ).    {sqlite3Cr
2210: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
2220: 2c 30 2c 30 2c 30 2c 30 2c 52 2c 30 2c 30 2c 30  ,0,0,0,0,R,0,0,0
2230: 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,0);}.ccons ::= 
2240: 43 48 45 43 4b 20 4c 50 20 65 78 70 72 28 58 29  CHECK LP expr(X)
2250: 20 52 50 2e 20 20 20 20 20 20 20 7b 73 71 6c 69   RP.       {sqli
2260: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
2270: 72 61 69 6e 74 28 70 50 61 72 73 65 2c 58 29 3b  raint(pParse,X);
2280: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 52 45 46 45  }.ccons ::= REFE
2290: 52 45 4e 43 45 53 20 6e 6d 28 54 29 20 69 64 78  RENCES nm(T) idx
22a0: 6c 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66  list_opt(TA) ref
22b0: 61 72 67 73 28 52 29 2e 0a 20 20 20 20 20 20 20  args(R)..       
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
22e0: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
22f0: 79 28 70 50 61 72 73 65 2c 30 2c 26 54 2c 54 41  y(pParse,0,&T,TA
2300: 2c 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,R);}.ccons ::= 
2310: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28  defer_subclause(
2320: 44 29 2e 20 20 20 7b 73 71 6c 69 74 65 33 44 65  D).   {sqlite3De
2330: 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 70 50  ferForeignKey(pP
2340: 61 72 73 65 2c 44 29 3b 7d 0a 63 63 6f 6e 73 20  arse,D);}.ccons 
2350: 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20 69 64 28 43  ::= COLLATE id(C
2360: 29 2e 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43  ).  {sqlite3AddC
2370: 6f 6c 6c 61 74 65 54 79 70 65 28 70 50 61 72 73  ollateType(pPars
2380: 65 2c 20 28 63 68 61 72 2a 29 43 2e 7a 2c 20 43  e, (char*)C.z, C
2390: 2e 6e 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6f 70  .n);}..// The op
23a0: 74 69 6f 6e 61 6c 20 41 55 54 4f 49 4e 43 52 45  tional AUTOINCRE
23b0: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 0a 25 74 79  MENT keyword.%ty
23c0: 70 65 20 61 75 74 6f 69 6e 63 20 7b 69 6e 74 7d  pe autoinc {int}
23d0: 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d 20  .autoinc(X) ::= 
23e0: 2e 20 20 20 20 20 20 20 20 20 20 7b 58 20 3d 20  .          {X = 
23f0: 30 3b 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a  0;}.autoinc(X) :
2400: 3a 3d 20 41 55 54 4f 49 4e 43 52 2e 20 20 7b 58  := AUTOINCR.  {X
2410: 20 3d 20 31 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e   = 1;}..// The n
2420: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 75 6c  ext group of rul
2430: 65 73 20 70 61 72 73 65 73 20 74 68 65 20 61 72  es parses the ar
2440: 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 52 45 46  guments to a REF
2450: 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65 0a 2f  ERENCES clause./
2460: 2f 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  / that determine
2470: 20 69 66 20 74 68 65 20 72 65 66 65 72 65 6e 74   if the referent
2480: 69 61 6c 20 69 6e 74 65 67 72 69 74 79 20 63 68  ial integrity ch
2490: 65 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72  ecking is deferr
24a0: 65 64 20 6f 72 0a 2f 2f 20 6f 72 20 69 6d 6d 65  ed or.// or imme
24b0: 64 69 61 74 65 20 61 6e 64 20 77 68 69 63 68 20  diate and which 
24c0: 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20 61  determine what a
24d0: 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 66  ction to take if
24e0: 20 61 20 72 65 66 2d 69 6e 74 65 67 0a 2f 2f 20   a ref-integ.// 
24f0: 63 68 65 63 6b 20 66 61 69 6c 73 2e 0a 2f 2f 0a  check fails..//.
2500: 25 74 79 70 65 20 72 65 66 61 72 67 73 20 7b 69  %type refargs {i
2510: 6e 74 7d 0a 72 65 66 61 72 67 73 28 41 29 20 3a  nt}.refargs(A) :
2520: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
2530: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f           { A = O
2540: 45 5f 52 65 73 74 72 69 63 74 20 2a 20 30 78 30  E_Restrict * 0x0
2550: 31 30 31 30 31 3b 20 7d 0a 72 65 66 61 72 67 73  10101; }.refargs
2560: 28 41 29 20 3a 3a 3d 20 72 65 66 61 72 67 73 28  (A) ::= refargs(
2570: 58 29 20 72 65 66 61 72 67 28 59 29 2e 20 7b 20  X) refarg(Y). { 
2580: 41 20 3d 20 28 58 20 26 20 59 2e 6d 61 73 6b 29  A = (X & Y.mask)
2590: 20 7c 20 59 2e 76 61 6c 75 65 3b 20 7d 0a 25 74   | Y.value; }.%t
25a0: 79 70 65 20 72 65 66 61 72 67 20 7b 73 74 72 75  ype refarg {stru
25b0: 63 74 20 7b 69 6e 74 20 76 61 6c 75 65 3b 20 69  ct {int value; i
25c0: 6e 74 20 6d 61 73 6b 3b 7d 7d 0a 72 65 66 61 72  nt mask;}}.refar
25d0: 67 28 41 29 20 3a 3a 3d 20 4d 41 54 43 48 20 6e  g(A) ::= MATCH n
25e0: 6d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
25f0: 7b 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b 20 20  { A.value = 0;  
2600: 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30     A.mask = 0x00
2610: 30 30 30 30 3b 20 7d 0a 72 65 66 61 72 67 28 41  0000; }.refarg(A
2620: 29 20 3a 3a 3d 20 4f 4e 20 44 45 4c 45 54 45 20  ) ::= ON DELETE 
2630: 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41  refact(X).   { A
2640: 2e 76 61 6c 75 65 20 3d 20 58 3b 20 20 20 20 20  .value = X;     
2650: 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 66  A.mask = 0x0000f
2660: 66 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a  f; }.refarg(A) :
2670: 3a 3d 20 4f 4e 20 55 50 44 41 54 45 20 72 65 66  := ON UPDATE ref
2680: 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61  act(X).   { A.va
2690: 6c 75 65 20 3d 20 58 3c 3c 38 3b 20 20 41 2e 6d  lue = X<<8;  A.m
26a0: 61 73 6b 20 3d 20 30 78 30 30 66 66 30 30 3b 20  ask = 0x00ff00; 
26b0: 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20  }.refarg(A) ::= 
26c0: 4f 4e 20 49 4e 53 45 52 54 20 72 65 66 61 63 74  ON INSERT refact
26d0: 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65  (X).   { A.value
26e0: 20 3d 20 58 3c 3c 31 36 3b 20 41 2e 6d 61 73 6b   = X<<16; A.mask
26f0: 20 3d 20 30 78 66 66 30 30 30 30 3b 20 7d 0a 25   = 0xff0000; }.%
2700: 74 79 70 65 20 72 65 66 61 63 74 20 7b 69 6e 74  type refact {int
2710: 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20  }.refact(A) ::= 
2720: 53 45 54 20 4e 55 4c 4c 2e 20 20 20 20 20 20 20  SET NULL.       
2730: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f         { A = OE_
2740: 53 65 74 4e 75 6c 6c 3b 20 7d 0a 72 65 66 61 63  SetNull; }.refac
2750: 74 28 41 29 20 3a 3a 3d 20 53 45 54 20 44 45 46  t(A) ::= SET DEF
2760: 41 55 4c 54 2e 20 20 20 20 20 20 20 20 20 20 20  AULT.           
2770: 7b 20 41 20 3d 20 4f 45 5f 53 65 74 44 66 6c 74  { A = OE_SetDflt
2780: 3b 20 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a  ; }.refact(A) ::
2790: 3d 20 43 41 53 43 41 44 45 2e 20 20 20 20 20 20  = CASCADE.      
27a0: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f           { A = O
27b0: 45 5f 43 61 73 63 61 64 65 3b 20 7d 0a 72 65 66  E_Cascade; }.ref
27c0: 61 63 74 28 41 29 20 3a 3a 3d 20 52 45 53 54 52  act(A) ::= RESTR
27d0: 49 43 54 2e 20 20 20 20 20 20 20 20 20 20 20 20  ICT.            
27e0: 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65 73 74 72    { A = OE_Restr
27f0: 69 63 74 3b 20 7d 0a 25 74 79 70 65 20 64 65 66  ict; }.%type def
2800: 65 72 5f 73 75 62 63 6c 61 75 73 65 20 7b 69 6e  er_subclause {in
2810: 74 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75  t}.defer_subclau
2820: 73 65 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 44 45  se(A) ::= NOT DE
2830: 46 45 52 52 41 42 4c 45 20 69 6e 69 74 5f 64 65  FERRABLE init_de
2840: 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28  ferred_pred_opt(
2850: 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 64 65  X).  {A = X;}.de
2860: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 41 29  fer_subclause(A)
2870: 20 3a 3a 3d 20 44 45 46 45 52 52 41 42 4c 45 20   ::= DEFERRABLE 
2880: 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72  init_deferred_pr
2890: 65 64 5f 6f 70 74 28 58 29 2e 20 20 20 20 20 20  ed_opt(X).      
28a0: 7b 41 20 3d 20 58 3b 7d 0a 25 74 79 70 65 20 69  {A = X;}.%type i
28b0: 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65  nit_deferred_pre
28c0: 64 5f 6f 70 74 20 7b 69 6e 74 7d 0a 69 6e 69 74  d_opt {int}.init
28d0: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f  _deferred_pred_o
28e0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 69 74 5f    {A = 0;}.init_
2910: 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70  deferred_pred_op
2920: 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c  t(A) ::= INITIAL
2930: 4c 59 20 44 45 46 45 52 52 45 44 2e 20 20 20 20  LY DEFERRED.    
2940: 20 7b 41 20 3d 20 31 3b 7d 0a 69 6e 69 74 5f 64   {A = 1;}.init_d
2950: 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74  eferred_pred_opt
2960: 28 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c  (A) ::= INITIALL
2970: 59 20 49 4d 4d 45 44 49 41 54 45 2e 20 20 20 20  Y IMMEDIATE.    
2980: 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 46 6f 72  {A = 0;}..// For
2990: 20 74 68 65 20 74 69 6d 65 20 62 65 69 6e 67 2c   the time being,
29a0: 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6e 73 74 72   the only constr
29b0: 61 69 6e 74 20 77 65 20 63 61 72 65 20 61 62 6f  aint we care abo
29c0: 75 74 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  ut is the primar
29d0: 79 0a 2f 2f 20 6b 65 79 20 61 6e 64 20 55 4e 49  y.// key and UNI
29e0: 51 55 45 2e 20 20 42 6f 74 68 20 63 72 65 61 74  QUE.  Both creat
29f0: 65 20 69 6e 64 69 63 65 73 2e 0a 2f 2f 0a 63 6f  e indices..//.co
2a00: 6e 73 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a  nslist_opt(A) ::
2a10: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
2a20: 20 20 20 20 20 20 7b 41 2e 6e 20 3d 20 30 3b 20        {A.n = 0; 
2a30: 41 2e 7a 20 3d 20 30 3b 7d 0a 63 6f 6e 73 6c 69  A.z = 0;}.consli
2a40: 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 43 4f  st_opt(A) ::= CO
2a50: 4d 4d 41 28 58 29 20 63 6f 6e 73 6c 69 73 74 2e  MMA(X) conslist.
2a60: 20 20 7b 41 20 3d 20 58 3b 7d 0a 63 6f 6e 73 6c    {A = X;}.consl
2a70: 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74  ist ::= conslist
2a80: 20 43 4f 4d 4d 41 20 74 63 6f 6e 73 2e 0a 63 6f   COMMA tcons..co
2a90: 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c  nslist ::= consl
2aa0: 69 73 74 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c  ist tcons..consl
2ab0: 69 73 74 20 3a 3a 3d 20 74 63 6f 6e 73 2e 0a 74  ist ::= tcons..t
2ac0: 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54 52 41  cons ::= CONSTRA
2ad0: 49 4e 54 20 6e 6d 2e 0a 74 63 6f 6e 73 20 3a 3a  INT nm..tcons ::
2ae0: 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4c 50  = PRIMARY KEY LP
2af0: 20 69 64 78 6c 69 73 74 28 58 29 20 61 75 74 6f   idxlist(X) auto
2b00: 69 6e 63 28 49 29 20 52 50 20 6f 6e 63 6f 6e 66  inc(I) RP onconf
2b10: 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (R)..           
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
2b40: 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79  qlite3AddPrimary
2b50: 4b 65 79 28 70 50 61 72 73 65 2c 58 2c 52 2c 49  Key(pParse,X,R,I
2b60: 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20  ,0);}.tcons ::= 
2b70: 55 4e 49 51 55 45 20 4c 50 20 69 64 78 6c 69 73  UNIQUE LP idxlis
2b80: 74 28 58 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52  t(X) RP onconf(R
2b90: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61      {sqlite3Crea
2bc0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 30  teIndex(pParse,0
2bd0: 2c 30 2c 30 2c 58 2c 52 2c 30 2c 30 2c 30 2c 30  ,0,0,X,R,0,0,0,0
2be0: 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 48  );}.tcons ::= CH
2bf0: 45 43 4b 20 4c 50 20 65 78 70 72 28 45 29 20 52  ECK LP expr(E) R
2c00: 50 20 6f 6e 63 6f 6e 66 2e 20 7b 73 71 6c 69 74  P onconf. {sqlit
2c10: 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72  e3AddCheckConstr
2c20: 61 69 6e 74 28 70 50 61 72 73 65 2c 45 29 3b 7d  aint(pParse,E);}
2c30: 0a 74 63 6f 6e 73 20 3a 3a 3d 20 46 4f 52 45 49  .tcons ::= FOREI
2c40: 47 4e 20 4b 45 59 20 4c 50 20 69 64 78 6c 69 73  GN KEY LP idxlis
2c50: 74 28 46 41 29 20 52 50 0a 20 20 20 20 20 20 20  t(FA) RP.       
2c60: 20 20 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6d     REFERENCES nm
2c70: 28 54 29 20 69 64 78 6c 69 73 74 5f 6f 70 74 28  (T) idxlist_opt(
2c80: 54 41 29 20 72 65 66 61 72 67 73 28 52 29 20 64  TA) refargs(R) d
2c90: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f  efer_subclause_o
2ca0: 70 74 28 44 29 2e 20 7b 0a 20 20 20 20 73 71 6c  pt(D). {.    sql
2cb0: 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
2cc0: 6e 4b 65 79 28 70 50 61 72 73 65 2c 20 46 41 2c  nKey(pParse, FA,
2cd0: 20 26 54 2c 20 54 41 2c 20 52 29 3b 0a 20 20 20   &T, TA, R);.   
2ce0: 20 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72   sqlite3DeferFor
2cf0: 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 20  eignKey(pParse, 
2d00: 44 29 3b 0a 7d 0a 25 74 79 70 65 20 64 65 66 65  D);.}.%type defe
2d10: 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 20  r_subclause_opt 
2d20: 7b 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75 62 63  {int}.defer_subc
2d30: 6c 61 75 73 65 5f 6f 70 74 28 41 29 20 3a 3a 3d  lause_opt(A) ::=
2d40: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2d50: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64        {A = 0;}.d
2d60: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f  efer_subclause_o
2d70: 70 74 28 41 29 20 3a 3a 3d 20 64 65 66 65 72 5f  pt(A) ::= defer_
2d80: 73 75 62 63 6c 61 75 73 65 28 58 29 2e 20 20 7b  subclause(X).  {
2d90: 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20  A = X;}..// The 
2da0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e  following is a n
2db0: 6f 6e 2d 73 74 61 6e 64 61 72 64 20 65 78 74 65  on-standard exte
2dc0: 6e 73 69 6f 6e 20 74 68 61 74 20 61 6c 6c 6f 77  nsion that allow
2dd0: 73 20 75 73 20 74 6f 20 64 65 63 6c 61 72 65 20  s us to declare 
2de0: 74 68 65 0a 2f 2f 20 64 65 66 61 75 6c 74 20 62  the.// default b
2df0: 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65  ehavior when the
2e00: 72 65 20 69 73 20 61 20 63 6f 6e 73 74 72 61 69  re is a constrai
2e10: 6e 74 20 63 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a  nt conflict..//.
2e20: 25 74 79 70 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e  %type onconf {in
2e30: 74 7d 0a 25 74 79 70 65 20 6f 72 63 6f 6e 66 20  t}.%type orconf 
2e40: 7b 69 6e 74 7d 0a 25 74 79 70 65 20 72 65 73 6f  {int}.%type reso
2e50: 6c 76 65 74 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e  lvetype {int}.on
2e60: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20  conf(A) ::= .   
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2e90: 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 6e 63  OE_Default;}.onc
2ea0: 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f  onf(A) ::= ON CO
2eb0: 4e 46 4c 49 43 54 20 72 65 73 6f 6c 76 65 74 79  NFLICT resolvety
2ec0: 70 65 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58  pe(X).    {A = X
2ed0: 3b 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d  ;}.orconf(A) ::=
2ee0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 7b 41 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b  {A = OE_Default;
2f10: 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20  }.orconf(A) ::= 
2f20: 4f 52 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58  OR resolvetype(X
2f30: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ).             {
2f40: 41 20 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76 65 74  A = X;}.resolvet
2f50: 79 70 65 28 41 29 20 3a 3a 3d 20 72 61 69 73 65  ype(A) ::= raise
2f60: 74 79 70 65 28 58 29 2e 20 20 20 20 20 20 20 20  type(X).        
2f70: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 72 65       {A = X;}.re
2f80: 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d  solvetype(A) ::=
2f90: 20 49 47 4e 4f 52 45 2e 20 20 20 20 20 20 20 20   IGNORE.        
2fa0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2fb0: 4f 45 5f 49 67 6e 6f 72 65 3b 7d 0a 72 65 73 6f  OE_Ignore;}.reso
2fc0: 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52  lvetype(A) ::= R
2fd0: 45 50 4c 41 43 45 2e 20 20 20 20 20 20 20 20 20  EPLACE.         
2fe0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
2ff0: 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 2f 2f 2f 2f  _Replace;}..////
3000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3010: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20  ////// The DROP 
3020: 54 41 42 4c 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  TABLE //////////
3030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
3050: 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 41 42 4c  md ::= DROP TABL
3060: 45 20 69 66 65 78 69 73 74 73 28 45 29 20 66 75  E ifexists(E) fu
3070: 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73  llname(X). {.  s
3080: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
3090: 70 50 61 72 73 65 2c 20 58 2c 20 30 2c 20 45 29  pParse, X, 0, E)
30a0: 3b 0a 7d 0a 25 74 79 70 65 20 69 66 65 78 69 73  ;.}.%type ifexis
30b0: 74 73 20 7b 69 6e 74 7d 0a 69 66 65 78 69 73 74  ts {int}.ifexist
30c0: 73 28 41 29 20 3a 3a 3d 20 49 46 20 45 58 49 53  s(A) ::= IF EXIS
30d0: 54 53 2e 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 69  TS.   {A = 1;}.i
30e0: 66 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 2e  fexists(A) ::= .
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3100: 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   0;}..//////////
3110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
3120: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
3130: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
3140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3150: 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20 53  ///.//.%ifndef S
3160: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
3170: 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45 28 58  cmd ::= CREATE(X
3180: 29 20 74 65 6d 70 28 54 29 20 56 49 45 57 20 69  ) temp(T) VIEW i
3190: 66 6e 6f 74 65 78 69 73 74 73 28 45 29 20 6e 6d  fnotexists(E) nm
31a0: 28 59 29 20 64 62 6e 6d 28 5a 29 20 41 53 20 73  (Y) dbnm(Z) AS s
31b0: 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71  elect(S). {.  sq
31c0: 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
31d0: 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20  pParse, &X, &Y, 
31e0: 26 5a 2c 20 53 2c 20 54 2c 20 45 29 3b 0a 7d 0a  &Z, S, T, E);.}.
31f0: 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 56 49 45  cmd ::= DROP VIE
3200: 57 20 69 66 65 78 69 73 74 73 28 45 29 20 66 75  W ifexists(E) fu
3210: 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73  llname(X). {.  s
3220: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
3230: 70 50 61 72 73 65 2c 20 58 2c 20 31 2c 20 45 29  pParse, X, 1, E)
3240: 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49  ;.}.%endif  SQLI
3250: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 0a 2f 2f  TE_OMIT_VIEW..//
3260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3270: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53 45 4c 45 43  ////// The SELEC
3280: 54 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  T statement ////
3290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
32a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
32b0: 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c 65 63 74 28  .cmd ::= select(
32c0: 58 29 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65 33  X).  {.  sqlite3
32d0: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 58  Select(pParse, X
32e0: 2c 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 2c 20  , SRT_Callback, 
32f0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  0, 0, 0, 0, 0);.
3300: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3310: 65 6c 65 74 65 28 58 29 3b 0a 7d 0a 0a 25 74 79  elete(X);.}..%ty
3320: 70 65 20 73 65 6c 65 63 74 20 7b 53 65 6c 65 63  pe select {Selec
3330: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3340: 73 65 6c 65 63 74 20 7b 73 71 6c 69 74 65 33 53  select {sqlite3S
3350: 65 6c 65 63 74 44 65 6c 65 74 65 28 24 24 29 3b  electDelete($$);
3360: 7d 0a 25 74 79 70 65 20 6f 6e 65 73 65 6c 65 63  }.%type oneselec
3370: 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73  t {Select*}.%des
3380: 74 72 75 63 74 6f 72 20 6f 6e 65 73 65 6c 65 63  tructor oneselec
3390: 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t {sqlite3Select
33a0: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 73 65  Delete($$);}..se
33b0: 6c 65 63 74 28 41 29 20 3a 3a 3d 20 6f 6e 65 73  lect(A) ::= ones
33c0: 65 6c 65 63 74 28 58 29 2e 20 20 20 20 20 20 20  elect(X).       
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
33e0: 41 20 3d 20 58 3b 7d 0a 25 69 66 6e 64 65 66 20  A = X;}.%ifndef 
33f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
3400: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 73 65 6c 65  OUND_SELECT.sele
3410: 63 74 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74  ct(A) ::= select
3420: 28 58 29 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f  (X) multiselect_
3430: 6f 70 28 59 29 20 6f 6e 65 73 65 6c 65 63 74 28  op(Y) oneselect(
3440: 5a 29 2e 20 20 7b 0a 20 20 69 66 28 20 5a 20 29  Z).  {.  if( Z )
3450: 7b 0a 20 20 20 20 5a 2d 3e 6f 70 20 3d 20 59 3b  {.    Z->op = Y;
3460: 0a 20 20 20 20 5a 2d 3e 70 50 72 69 6f 72 20 3d  .    Z->pPrior =
3470: 20 58 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 5a 3b   X;.  }.  A = Z;
3480: 0a 7d 0a 25 74 79 70 65 20 6d 75 6c 74 69 73 65  .}.%type multise
3490: 6c 65 63 74 5f 6f 70 20 7b 69 6e 74 7d 0a 6d 75  lect_op {int}.mu
34a0: 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20  ltiselect_op(A) 
34b0: 3a 3a 3d 20 55 4e 49 4f 4e 28 4f 50 29 2e 20 20  ::= UNION(OP).  
34c0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
34d0: 40 4f 50 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65 63  @OP;}.multiselec
34e0: 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f  t_op(A) ::= UNIO
34f0: 4e 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 20 20  N ALL.          
3500: 20 20 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b 7d     {A = TK_ALL;}
3510: 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28  .multiselect_op(
3520: 41 29 20 3a 3a 3d 20 45 58 43 45 50 54 7c 49 4e  A) ::= EXCEPT|IN
3530: 54 45 52 53 45 43 54 28 4f 50 29 2e 20 20 7b 41  TERSECT(OP).  {A
3540: 20 3d 20 40 4f 50 3b 7d 0a 25 65 6e 64 69 66 20   = @OP;}.%endif 
3550: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50  SQLITE_OMIT_COMP
3560: 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 6f 6e 65 73  OUND_SELECT.ones
3570: 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 53 45 4c  elect(A) ::= SEL
3580: 45 43 54 20 64 69 73 74 69 6e 63 74 28 44 29 20  ECT distinct(D) 
3590: 73 65 6c 63 6f 6c 6c 69 73 74 28 57 29 20 66 72  selcollist(W) fr
35a0: 6f 6d 28 58 29 20 77 68 65 72 65 5f 6f 70 74 28  om(X) where_opt(
35b0: 59 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y).             
35c0: 20 20 20 20 67 72 6f 75 70 62 79 5f 6f 70 74 28      groupby_opt(
35d0: 50 29 20 68 61 76 69 6e 67 5f 6f 70 74 28 51 29  P) having_opt(Q)
35e0: 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 5a 29 20   orderby_opt(Z) 
35f0: 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a  limit_opt(L). {.
3600: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 65 6c    A = sqlite3Sel
3610: 65 63 74 4e 65 77 28 57 2c 58 2c 59 2c 50 2c 51  ectNew(W,X,Y,P,Q
3620: 2c 5a 2c 44 2c 4c 2e 70 4c 69 6d 69 74 2c 4c 2e  ,Z,D,L.pLimit,L.
3630: 70 4f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2f 20  pOffset);.}..// 
3640: 54 68 65 20 22 64 69 73 74 69 6e 63 74 22 20 6e  The "distinct" n
3650: 6f 6e 74 65 72 6d 69 6e 61 6c 20 69 73 20 74 72  onterminal is tr
3660: 75 65 20 28 31 29 20 69 66 20 74 68 65 20 44 49  ue (1) if the DI
3670: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
3680: 73 0a 2f 2f 20 70 72 65 73 65 6e 74 20 61 6e 64  s.// present and
3690: 20 66 61 6c 73 65 20 28 30 29 20 69 66 20 69 74   false (0) if it
36a0: 20 69 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70   is not..//.%typ
36b0: 65 20 64 69 73 74 69 6e 63 74 20 7b 69 6e 74 7d  e distinct {int}
36c0: 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d  .distinct(A) ::=
36d0: 20 44 49 53 54 49 4e 43 54 2e 20 20 20 7b 41 20   DISTINCT.   {A 
36e0: 3d 20 31 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41  = 1;}.distinct(A
36f0: 29 20 3a 3a 3d 20 41 4c 4c 2e 20 20 20 20 20 20  ) ::= ALL.      
3700: 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 69 73 74 69    {A = 0;}.disti
3710: 6e 63 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  nct(A) ::= .    
3720: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
3730: 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69 73 74 20 69  .// selcollist i
3740: 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
3750: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
3760: 20 74 6f 20 62 65 63 6f 6d 65 20 74 68 65 20 72   to become the r
3770: 65 74 75 72 6e 0a 2f 2f 20 76 61 6c 75 65 73 20  eturn.// values 
3780: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
3790: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 22 2a  atement.  The "*
37a0: 22 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 73 20  " in statements 
37b0: 6c 69 6b 65 0a 2f 2f 20 22 53 45 4c 45 43 54 20  like.// "SELECT 
37c0: 2a 20 46 52 4f 4d 20 2e 2e 2e 22 20 69 73 20 65  * FROM ..." is e
37d0: 6e 63 6f 64 65 64 20 61 73 20 61 20 73 70 65 63  ncoded as a spec
37e0: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ial expression w
37f0: 69 74 68 20 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65  ith an.// opcode
3800: 20 6f 66 20 54 4b 5f 41 4c 4c 2e 0a 2f 2f 0a 25   of TK_ALL..//.%
3810: 74 79 70 65 20 73 65 6c 63 6f 6c 6c 69 73 74 20  type selcollist 
3820: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
3830: 74 72 75 63 74 6f 72 20 73 65 6c 63 6f 6c 6c 69  tructor selcolli
3840: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
3850: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
3860: 25 74 79 70 65 20 73 63 6c 70 20 7b 45 78 70 72  %type sclp {Expr
3870: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
3880: 6f 72 20 73 63 6c 70 20 7b 73 71 6c 69 74 65 33  or sclp {sqlite3
3890: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24  ExprListDelete($
38a0: 24 29 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d  $);}.sclp(A) ::=
38b0: 20 73 65 6c 63 6f 6c 6c 69 73 74 28 58 29 20 43   selcollist(X) C
38c0: 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20  OMMA.           
38d0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 63 6c 70 28    {A = X;}.sclp(
38e0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
3910: 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a  .selcollist(A) :
3920: 3a 3d 20 73 63 6c 70 28 50 29 20 65 78 70 72 28  := sclp(P) expr(
3930: 58 29 20 61 73 28 59 29 2e 20 20 20 20 20 7b 0a  X) as(Y).     {.
3940: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78     A = sqlite3Ex
3950: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 50 2c 58  prListAppend(P,X
3960: 2c 59 2e 6e 3f 26 59 3a 30 29 3b 0a 7d 0a 73 65  ,Y.n?&Y:0);.}.se
3970: 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20  lcollist(A) ::= 
3980: 73 63 6c 70 28 50 29 20 53 54 41 52 2e 20 7b 0a  sclp(P) STAR. {.
3990: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
39a0: 72 4c 69 73 74 41 70 70 65 6e 64 28 50 2c 20 73  rListAppend(P, s
39b0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4c  qlite3Expr(TK_AL
39c0: 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20 30 29 3b  L, 0, 0, 0), 0);
39d0: 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29  .}.selcollist(A)
39e0: 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20 6e 6d 28   ::= sclp(P) nm(
39f0: 58 29 20 44 4f 54 20 53 54 41 52 2e 20 7b 0a 20  X) DOT STAR. {. 
3a00: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
3a10: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41  sqlite3Expr(TK_A
3a20: 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  LL, 0, 0, 0);.  
3a30: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
3a40: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
3a50: 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 41 20   0, 0, &X);.  A 
3a60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
3a70: 74 41 70 70 65 6e 64 28 50 2c 20 73 71 6c 69 74  tAppend(P, sqlit
3a80: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 70  e3Expr(TK_DOT, p
3a90: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
3aa0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2f 20 41 6e 20 6f  , 0);.}..// An o
3ab0: 70 74 69 6f 6e 20 22 41 53 20 3c 69 64 3e 22 20  ption "AS <id>" 
3ac0: 70 68 72 61 73 65 20 74 68 61 74 20 63 61 6e 20  phrase that can 
3ad0: 66 6f 6c 6c 6f 77 20 6f 6e 65 20 6f 66 20 74 68  follow one of th
3ae0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  e expressions th
3af0: 61 74 0a 2f 2f 20 64 65 66 69 6e 65 20 74 68 65  at.// define the
3b00: 20 72 65 73 75 6c 74 20 73 65 74 2c 20 6f 72 20   result set, or 
3b10: 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  one of the table
3b20: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
3b30: 61 75 73 65 2e 0a 2f 2f 0a 25 74 79 70 65 20 61  ause..//.%type a
3b40: 73 20 7b 54 6f 6b 65 6e 7d 0a 61 73 28 58 29 20  s {Token}.as(X) 
3b50: 3a 3a 3d 20 41 53 20 6e 6d 28 59 29 2e 20 20 20  ::= AS nm(Y).   
3b60: 20 7b 58 20 3d 20 59 3b 7d 0a 61 73 28 58 29 20   {X = Y;}.as(X) 
3b70: 3a 3a 3d 20 69 64 73 28 59 29 2e 20 20 20 20 20  ::= ids(Y).     
3b80: 20 7b 58 20 3d 20 59 3b 7d 0a 61 73 28 58 29 20   {X = Y;}.as(X) 
3b90: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
3ba0: 20 7b 58 2e 6e 20 3d 20 30 3b 7d 0a 0a 0a 25 74   {X.n = 0;}...%t
3bb0: 79 70 65 20 73 65 6c 74 61 62 6c 69 73 74 20 7b  ype seltablist {
3bc0: 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  SrcList*}.%destr
3bd0: 75 63 74 6f 72 20 73 65 6c 74 61 62 6c 69 73 74  uctor seltablist
3be0: 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   {sqlite3SrcList
3bf0: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
3c00: 70 65 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 53  pe stl_prefix {S
3c10: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  rcList*}.%destru
3c20: 63 74 6f 72 20 73 74 6c 5f 70 72 65 66 69 78 20  ctor stl_prefix 
3c30: 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  {sqlite3SrcListD
3c40: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70  elete($$);}.%typ
3c50: 65 20 66 72 6f 6d 20 7b 53 72 63 4c 69 73 74 2a  e from {SrcList*
3c60: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 66 72  }.%destructor fr
3c70: 6f 6d 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69  om {sqlite3SrcLi
3c80: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a  stDelete($$);}..
3c90: 2f 2f 20 41 20 63 6f 6d 70 6c 65 74 65 20 46 52  // A complete FR
3ca0: 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 66 72  OM clause..//.fr
3cb0: 6f 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  om(A) ::= .     
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3ce0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
3cf0: 7a 65 6f 66 28 2a 41 29 29 3b 7d 0a 66 72 6f 6d  zeof(*A));}.from
3d00: 28 41 29 20 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c  (A) ::= FROM sel
3d10: 74 61 62 6c 69 73 74 28 58 29 2e 20 20 20 20 20  tablist(X).     
3d20: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 41 20            {.  A 
3d30: 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  = X;.  sqlite3Sr
3d40: 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
3d50: 70 65 28 41 29 3b 0a 7d 0a 0a 2f 2f 20 22 73 65  pe(A);.}..// "se
3d60: 6c 74 61 62 6c 69 73 74 22 20 69 73 20 61 20 22  ltablist" is a "
3d70: 53 65 6c 65 63 74 20 54 61 62 6c 65 20 4c 69 73  Select Table Lis
3d80: 74 22 20 2d 20 74 68 65 20 63 6f 6e 74 65 6e 74  t" - the content
3d90: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
3da0: 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53 45 4c 45  use.// in a SELE
3db0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 22  CT statement.  "
3dc0: 73 74 6c 5f 70 72 65 66 69 78 22 20 69 73 20 61  stl_prefix" is a
3dd0: 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20   prefix of this 
3de0: 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f 70 72 65  list..//.stl_pre
3df0: 66 69 78 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61  fix(A) ::= selta
3e00: 62 6c 69 73 74 28 58 29 20 6a 6f 69 6e 6f 70 28  blist(X) joinop(
3e10: 59 29 2e 20 20 20 20 7b 0a 20 20 20 41 20 3d 20  Y).    {.   A = 
3e20: 58 3b 0a 20 20 20 69 66 28 20 41 20 26 26 20 41  X;.   if( A && A
3e30: 2d 3e 6e 53 72 63 3e 30 20 29 20 41 2d 3e 61 5b  ->nSrc>0 ) A->a[
3e40: 41 2d 3e 6e 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74  A->nSrc-1].joint
3e50: 79 70 65 20 3d 20 59 3b 0a 7d 0a 73 74 6c 5f 70  ype = Y;.}.stl_p
3e60: 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20  refix(A) ::= .  
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e80: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
3e90: 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20  }.seltablist(A) 
3ea0: 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58  ::= stl_prefix(X
3eb0: 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 44 29 20  ) nm(Y) dbnm(D) 
3ec0: 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20  as(Z) on_opt(N) 
3ed0: 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a  using_opt(U). {.
3ee0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63    A = sqlite3Src
3ef0: 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
3f00: 72 6d 28 58 2c 26 59 2c 26 44 2c 26 5a 2c 30 2c  rm(X,&Y,&D,&Z,0,
3f10: 4e 2c 55 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20  N,U);.}.%ifndef 
3f20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
3f30: 55 45 52 59 0a 20 20 73 65 6c 74 61 62 6c 69 73  UERY.  seltablis
3f40: 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65  t(A) ::= stl_pre
3f50: 66 69 78 28 58 29 20 4c 50 20 73 65 6c 74 61 62  fix(X) LP seltab
3f60: 6c 69 73 74 5f 70 61 72 65 6e 28 53 29 20 52 50  list_paren(S) RP
3f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3f80: 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70       as(Z) on_op
3f90: 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55  t(N) using_opt(U
3fa0: 29 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c  ). {.    A = sql
3fb0: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
3fc0: 64 46 72 6f 6d 54 65 72 6d 28 58 2c 30 2c 30 2c  dFromTerm(X,0,0,
3fd0: 26 5a 2c 53 2c 4e 2c 55 29 3b 0a 20 20 7d 0a 20  &Z,S,N,U);.  }. 
3fe0: 20 0a 20 20 2f 2f 20 41 20 73 65 6c 74 61 62 6c   .  // A seltabl
3ff0: 69 73 74 5f 70 61 72 65 6e 20 6e 6f 6e 74 65 72  ist_paren nonter
4000: 6d 69 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 73  minal represents
4010: 20 61 6e 79 74 68 69 6e 67 20 69 6e 20 61 20 46   anything in a F
4020: 52 4f 4d 20 74 68 61 74 0a 20 20 2f 2f 20 69 73  ROM that.  // is
4030: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 73 69 64   contained insid
4040: 65 20 70 61 72 65 6e 74 68 65 73 65 73 2e 20 20  e parentheses.  
4050: 54 68 69 73 20 63 61 6e 20 62 65 20 65 69 74 68  This can be eith
4060: 65 72 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  er a subquery or
4070: 0a 20 20 2f 2f 20 61 20 67 72 6f 75 70 69 6e 67  .  // a grouping
4080: 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20 73 75   of table and su
4090: 62 71 75 65 72 69 65 73 2e 0a 20 20 2f 2f 0a 20  bqueries..  //. 
40a0: 20 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69 73   %type seltablis
40b0: 74 5f 70 61 72 65 6e 20 7b 53 65 6c 65 63 74 2a  t_paren {Select*
40c0: 7d 0a 20 20 25 64 65 73 74 72 75 63 74 6f 72 20  }.  %destructor 
40d0: 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e  seltablist_paren
40e0: 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   {sqlite3SelectD
40f0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 20 20 73 65  elete($$);}.  se
4100: 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e 28 41  ltablist_paren(A
4110: 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 53 29 2e  ) ::= select(S).
4120: 20 20 20 20 20 20 7b 41 20 3d 20 53 3b 7d 0a 20        {A = S;}. 
4130: 20 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65   seltablist_pare
4140: 6e 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61 62 6c  n(A) ::= seltabl
4150: 69 73 74 28 46 29 2e 20 20 7b 0a 20 20 20 20 20  ist(F).  {.     
4160: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
4170: 69 66 74 4a 6f 69 6e 54 79 70 65 28 46 29 3b 0a  iftJoinType(F);.
4180: 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33       A = sqlite3
4190: 53 65 6c 65 63 74 4e 65 77 28 30 2c 46 2c 30 2c  SelectNew(0,F,0,
41a0: 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  0,0,0,0,0,0);.  
41b0: 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  }.%endif  SQLITE
41c0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a  _OMIT_SUBQUERY..
41d0: 25 74 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65  %type dbnm {Toke
41e0: 6e 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e  n}.dbnm(A) ::= .
41f0: 20 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30            {A.z=0
4200: 3b 20 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41  ; A.n=0;}.dbnm(A
4210: 29 20 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e  ) ::= DOT nm(X).
4220: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65   {A = X;}..%type
4230: 20 66 75 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69   fullname {SrcLi
4240: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
4250: 20 66 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74   fullname {sqlit
4260: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
4270: 24 24 29 3b 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41  $$);}.fullname(A
4280: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 64 62 6e 6d  ) ::= nm(X) dbnm
4290: 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (Y).  {A = sqlit
42a0: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
42b0: 30 2c 26 58 2c 26 59 29 3b 7d 0a 0a 25 74 79 70  0,&X,&Y);}..%typ
42c0: 65 20 6a 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25  e joinop {int}.%
42d0: 74 79 70 65 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e  type joinop2 {in
42e0: 74 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d  t}.joinop(X) ::=
42f0: 20 43 4f 4d 4d 41 7c 4a 4f 49 4e 2e 20 20 20 20   COMMA|JOIN.    
4300: 20 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20            { X = 
4310: 4a 54 5f 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e  JT_INNER; }.join
4320: 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b  op(X) ::= JOIN_K
4330: 57 28 41 29 20 4a 4f 49 4e 2e 20 20 20 20 20 20  W(A) JOIN.      
4340: 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33     { X = sqlite3
4350: 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c  JoinType(pParse,
4360: 26 41 2c 30 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f  &A,0,0); }.joino
4370: 70 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57  p(X) ::= JOIN_KW
4380: 28 41 29 20 6e 6d 28 42 29 20 4a 4f 49 4e 2e 20  (A) nm(B) JOIN. 
4390: 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33 4a    { X = sqlite3J
43a0: 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26  oinType(pParse,&
43b0: 41 2c 26 42 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f  A,&B,0); }.joino
43c0: 70 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57  p(X) ::= JOIN_KW
43d0: 28 41 29 20 6e 6d 28 42 29 20 6e 6d 28 43 29 20  (A) nm(B) nm(C) 
43e0: 4a 4f 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20  JOIN..          
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 58               { X
4410: 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79   = sqlite3JoinTy
4420: 70 65 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c  pe(pParse,&A,&B,
4430: 26 43 29 3b 20 7d 0a 0a 25 74 79 70 65 20 6f 6e  &C); }..%type on
4440: 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65  _opt {Expr*}.%de
4450: 73 74 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74 20  structor on_opt 
4460: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
4470: 74 65 28 24 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28  te($$);}.on_opt(
4480: 4e 29 20 3a 3a 3d 20 4f 4e 20 65 78 70 72 28 45  N) ::= ON expr(E
4490: 29 2e 20 20 20 7b 4e 20 3d 20 45 3b 7d 0a 6f 6e  ).   {N = E;}.on
44a0: 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 2e 20 20 20  _opt(N) ::= .   
44b0: 20 20 20 20 20 20 20 20 20 20 7b 4e 20 3d 20 30            {N = 0
44c0: 3b 7d 0a 0a 25 74 79 70 65 20 75 73 69 6e 67 5f  ;}..%type using_
44d0: 6f 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64  opt {IdList*}.%d
44e0: 65 73 74 72 75 63 74 6f 72 20 75 73 69 6e 67 5f  estructor using_
44f0: 6f 70 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69  opt {sqlite3IdLi
4500: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 75  stDelete($$);}.u
4510: 73 69 6e 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20  sing_opt(U) ::= 
4520: 55 53 49 4e 47 20 4c 50 20 69 6e 73 63 6f 6c 6c  USING LP inscoll
4530: 69 73 74 28 4c 29 20 52 50 2e 20 20 7b 55 20 3d  ist(L) RP.  {U =
4540: 20 4c 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55   L;}.using_opt(U
4550: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
4560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
4570: 55 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20  U = 0;}...%type 
4580: 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b 45 78 70  orderby_opt {Exp
4590: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
45a0: 74 6f 72 20 6f 72 64 65 72 62 79 5f 6f 70 74 20  tor orderby_opt 
45b0: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
45c0: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
45d0: 70 65 20 73 6f 72 74 6c 69 73 74 20 7b 45 78 70  pe sortlist {Exp
45e0: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
45f0: 74 6f 72 20 73 6f 72 74 6c 69 73 74 20 7b 73 71  tor sortlist {sq
4600: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
4610: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20  ete($$);}.%type 
4620: 73 6f 72 74 69 74 65 6d 20 7b 45 78 70 72 2a 7d  sortitem {Expr*}
4630: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 6f 72  .%destructor sor
4640: 74 69 74 65 6d 20 7b 73 71 6c 69 74 65 33 45 78  titem {sqlite3Ex
4650: 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a  prDelete($$);}..
4660: 6f 72 64 65 72 62 79 5f 6f 70 74 28 41 29 20 3a  orderby_opt(A) :
4670: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
4690: 20 3d 20 30 3b 7d 0a 6f 72 64 65 72 62 79 5f 6f   = 0;}.orderby_o
46a0: 70 74 28 41 29 20 3a 3a 3d 20 4f 52 44 45 52 20  pt(A) ::= ORDER 
46b0: 42 59 20 73 6f 72 74 6c 69 73 74 28 58 29 2e 20  BY sortlist(X). 
46c0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 6f       {A = X;}.so
46d0: 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f  rtlist(A) ::= so
46e0: 72 74 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20  rtlist(X) COMMA 
46f0: 73 6f 72 74 69 74 65 6d 28 59 29 20 73 6f 72 74  sortitem(Y) sort
4700: 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20  order(Z). {.  A 
4710: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4720: 74 41 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b 0a  tAppend(X,Y,0);.
4730: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41    if( A ) A->a[A
4740: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
4750: 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a 73 6f 72 74  rder = Z;.}.sort
4760: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f 72 74  list(A) ::= sort
4770: 69 74 65 6d 28 59 29 20 73 6f 72 74 6f 72 64 65  item(Y) sortorde
4780: 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  r(Z). {.  A = sq
4790: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
47a0: 65 6e 64 28 30 2c 59 2c 30 29 3b 0a 20 20 69 66  end(0,Y,0);.  if
47b0: 28 20 41 20 26 26 20 41 2d 3e 61 20 29 20 41 2d  ( A && A->a ) A-
47c0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
47d0: 3d 20 5a 3b 0a 7d 0a 73 6f 72 74 69 74 65 6d 28  = Z;.}.sortitem(
47e0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20  A) ::= expr(X). 
47f0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70    {A = X;}..%typ
4800: 65 20 73 6f 72 74 6f 72 64 65 72 20 7b 69 6e 74  e sortorder {int
4810: 7d 0a 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20  }..sortorder(A) 
4820: 3a 3a 3d 20 41 53 43 2e 20 20 20 20 20 20 20 20  ::= ASC.        
4830: 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53     {A = SQLITE_S
4840: 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74 6f 72 64 65  O_ASC;}.sortorde
4850: 72 28 41 29 20 3a 3a 3d 20 44 45 53 43 2e 20 20  r(A) ::= DESC.  
4860: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c          {A = SQL
4870: 49 54 45 5f 53 4f 5f 44 45 53 43 3b 7d 0a 73 6f  ITE_SO_DESC;}.so
4880: 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 2e  rtorder(A) ::= .
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
48a0: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43   = SQLITE_SO_ASC
48b0: 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75 70 62  ;}..%type groupb
48c0: 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a  y_opt {ExprList*
48d0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 67 72  }.%destructor gr
48e0: 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74  oupby_opt {sqlit
48f0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4900: 28 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f  ($$);}.groupby_o
4910: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4930: 20 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75 70 62   {A = 0;}.groupb
4940: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47 52 4f  y_opt(A) ::= GRO
4950: 55 50 20 42 59 20 65 78 70 72 6c 69 73 74 28 58  UP BY exprlist(X
4960: 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74  ).  {A = X;}..%t
4970: 79 70 65 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b  ype having_opt {
4980: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
4990: 6f 72 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 73  or having_opt {s
49a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
49b0: 28 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70  ($$);}.having_op
49c0: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
49d0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
49e0: 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41 29  ;}.having_opt(A)
49f0: 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78 70 72   ::= HAVING expr
4a00: 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  (X).  {A = X;}..
4a10: 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74 20  %type limit_opt 
4a20: 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61 6c  {struct LimitVal
4a30: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6c 69  }.%destructor li
4a40: 6d 69 74 5f 6f 70 74 20 7b 0a 20 20 73 71 6c 69  mit_opt {.  sqli
4a50: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
4a60: 2e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69  .pLimit);.  sqli
4a70: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
4a80: 2e 70 4f 66 66 73 65 74 29 3b 0a 7d 0a 6c 69 6d  .pOffset);.}.lim
4a90: 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  it_opt(A) ::= . 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20      {A.pLimit = 
4ac0: 30 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 30  0; A.pOffset = 0
4ad0: 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  ;}.limit_opt(A) 
4ae0: 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58  ::= LIMIT expr(X
4af0: 29 2e 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69  ).        {A.pLi
4b00: 6d 69 74 20 3d 20 58 3b 20 41 2e 70 4f 66 66 73  mit = X; A.pOffs
4b10: 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f  et = 0;}.limit_o
4b20: 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20  pt(A) ::= LIMIT 
4b30: 65 78 70 72 28 58 29 20 4f 46 46 53 45 54 20 65  expr(X) OFFSET e
4b40: 78 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20  xpr(Y). .       
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 7b 41 2e 70 4c 69 6d 69 74 20 3d 20 58 3b 20 41  {A.pLimit = X; A
4b80: 2e 70 4f 66 66 73 65 74 20 3d 20 59 3b 7d 0a 6c  .pOffset = Y;}.l
4b90: 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  imit_opt(A) ::= 
4ba0: 4c 49 4d 49 54 20 65 78 70 72 28 58 29 20 43 4f  LIMIT expr(X) CO
4bb0: 4d 4d 41 20 65 78 70 72 28 59 29 2e 20 0a 20 20  MMA expr(Y). .  
4bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 20 20 20 20 7b 41 2e 70 4f 66 66 73 65 74 20       {A.pOffset 
4bf0: 3d 20 58 3b 20 41 2e 70 4c 69 6d 69 74 20 3d 20  = X; A.pLimit = 
4c00: 59 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  Y;}..///////////
4c10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c20: 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   The DELETE stat
4c30: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
4c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c50: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44  ///.//.cmd ::= D
4c60: 45 4c 45 54 45 20 46 52 4f 4d 20 66 75 6c 6c 6e  ELETE FROM fulln
4c70: 61 6d 65 28 58 29 20 77 68 65 72 65 5f 6f 70 74  ame(X) where_opt
4c80: 28 59 29 2e 20 7b 73 71 6c 69 74 65 33 44 65 6c  (Y). {sqlite3Del
4c90: 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 58  eteFrom(pParse,X
4ca0: 2c 59 29 3b 7d 0a 0a 25 74 79 70 65 20 77 68 65  ,Y);}..%type whe
4cb0: 72 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25  re_opt {Expr*}.%
4cc0: 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 72 65  destructor where
4cd0: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70  _opt {sqlite3Exp
4ce0: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 77  rDelete($$);}..w
4cf0: 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  here_opt(A) ::= 
4d00: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4d10: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 77 68       {A = 0;}.wh
4d20: 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 57  ere_opt(A) ::= W
4d30: 48 45 52 45 20 65 78 70 72 28 58 29 2e 20 20 20  HERE expr(X).   
4d40: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f      {A = X;}..//
4d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4d60: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 55 50 44  //////// The UPD
4d70: 41 54 45 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  ATE command ////
4d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
4da0: 63 6d 64 20 3a 3a 3d 20 55 50 44 41 54 45 20 6f  cmd ::= UPDATE o
4db0: 72 63 6f 6e 66 28 52 29 20 66 75 6c 6c 6e 61 6d  rconf(R) fullnam
4dc0: 65 28 58 29 20 53 45 54 20 73 65 74 6c 69 73 74  e(X) SET setlist
4dd0: 28 59 29 20 77 68 65 72 65 5f 6f 70 74 28 5a 29  (Y) where_opt(Z)
4de0: 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 33 55 70  ..    {sqlite3Up
4df0: 64 61 74 65 28 70 50 61 72 73 65 2c 58 2c 59 2c  date(pParse,X,Y,
4e00: 5a 2c 52 29 3b 7d 0a 0a 25 74 79 70 65 20 73 65  Z,R);}..%type se
4e10: 74 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a  tlist {ExprList*
4e20: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 65  }.%destructor se
4e30: 74 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  tlist {sqlite3Ex
4e40: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
4e50: 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20 3a  ;}..setlist(A) :
4e60: 3a 3d 20 73 65 74 6c 69 73 74 28 5a 29 20 43 4f  := setlist(Z) CO
4e70: 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65 78 70  MMA nm(X) EQ exp
4e80: 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  r(Y)..    {A = s
4e90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
4ea0: 70 65 6e 64 28 5a 2c 59 2c 26 58 29 3b 7d 0a 73  pend(Z,Y,&X);}.s
4eb0: 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d  etlist(A) ::= nm
4ec0: 28 58 29 20 45 51 20 65 78 70 72 28 59 29 2e 20  (X) EQ expr(Y). 
4ed0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
4ee0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 59  prListAppend(0,Y
4ef0: 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ,&X);}..////////
4f00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f10: 2f 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63 6f  // The INSERT co
4f20: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
4f30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4f40: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
4f50: 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29  := insert_cmd(R)
4f60: 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28 58   INTO fullname(X
4f70: 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  ) inscollist_opt
4f80: 28 46 29 20 0a 20 20 20 20 20 20 20 20 56 41 4c  (F) .        VAL
4f90: 55 45 53 20 4c 50 20 69 74 65 6d 6c 69 73 74 28  UES LP itemlist(
4fa0: 59 29 20 52 50 2e 0a 20 20 20 20 20 20 20 20 20  Y) RP..         
4fb0: 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73 65 72     {sqlite3Inser
4fc0: 74 28 70 50 61 72 73 65 2c 20 58 2c 20 59 2c 20  t(pParse, X, Y, 
4fd0: 30 2c 20 46 2c 20 52 29 3b 7d 0a 63 6d 64 20 3a  0, F, R);}.cmd :
4fe0: 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29  := insert_cmd(R)
4ff0: 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28 58   INTO fullname(X
5000: 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  ) inscollist_opt
5010: 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e 0a 20  (F) select(S).. 
5020: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
5030: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
5040: 2c 20 58 2c 20 30 2c 20 53 2c 20 46 2c 20 52 29  , X, 0, S, F, R)
5050: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65 72  ;}.cmd ::= inser
5060: 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75  t_cmd(R) INTO fu
5070: 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63 6f 6c  llname(X) inscol
5080: 6c 69 73 74 5f 6f 70 74 28 46 29 20 44 45 46 41  list_opt(F) DEFA
5090: 55 4c 54 20 56 41 4c 55 45 53 2e 0a 20 20 20 20  ULT VALUES..    
50a0: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
50b0: 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20 58  Insert(pParse, X
50c0: 2c 20 30 2c 20 30 2c 20 46 2c 20 52 29 3b 7d 0a  , 0, 0, F, R);}.
50d0: 0a 25 74 79 70 65 20 69 6e 73 65 72 74 5f 63 6d  .%type insert_cm
50e0: 64 20 7b 69 6e 74 7d 0a 69 6e 73 65 72 74 5f 63  d {int}.insert_c
50f0: 6d 64 28 41 29 20 3a 3a 3d 20 49 4e 53 45 52 54  md(A) ::= INSERT
5100: 20 6f 72 63 6f 6e 66 28 52 29 2e 20 20 20 7b 41   orconf(R).   {A
5110: 20 3d 20 52 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d   = R;}.insert_cm
5120: 64 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45  d(A) ::= REPLACE
5130: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20  .            {A 
5140: 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a  = OE_Replace;}..
5150: 0a 25 74 79 70 65 20 69 74 65 6d 6c 69 73 74 20  .%type itemlist 
5160: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
5170: 74 72 75 63 74 6f 72 20 69 74 65 6d 6c 69 73 74  tructor itemlist
5180: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   {sqlite3ExprLis
5190: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69  tDelete($$);}..i
51a0: 74 65 6d 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69  temlist(A) ::= i
51b0: 74 65 6d 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  temlist(X) COMMA
51c0: 20 65 78 70 72 28 59 29 2e 20 20 7b 41 20 3d 20   expr(Y).  {A = 
51d0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
51e0: 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b 7d 0a 69  ppend(X,Y,0);}.i
51f0: 74 65 6d 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65  temlist(A) ::= e
5200: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20 20  xpr(X).         
5210: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
5220: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5230: 70 70 65 6e 64 28 30 2c 58 2c 30 29 3b 7d 0a 0a  ppend(0,X,0);}..
5240: 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74  %type inscollist
5250: 5f 6f 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25  _opt {IdList*}.%
5260: 64 65 73 74 72 75 63 74 6f 72 20 69 6e 73 63 6f  destructor insco
5270: 6c 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74  llist_opt {sqlit
5280: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24  e3IdListDelete($
5290: 24 29 3b 7d 0a 25 74 79 70 65 20 69 6e 73 63 6f  $);}.%type insco
52a0: 6c 6c 69 73 74 20 7b 49 64 4c 69 73 74 2a 7d 0a  llist {IdList*}.
52b0: 25 64 65 73 74 72 75 63 74 6f 72 20 69 6e 73 63  %destructor insc
52c0: 6f 6c 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 49  ollist {sqlite3I
52d0: 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  dListDelete($$);
52e0: 7d 0a 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  }..inscollist_op
52f0: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
5300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5310: 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 73 63 6f 6c   {A = 0;}.inscol
5320: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
5330: 4c 50 20 69 6e 73 63 6f 6c 6c 69 73 74 28 58 29  LP inscollist(X)
5340: 20 52 50 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d   RP.    {A = X;}
5350: 0a 69 6e 73 63 6f 6c 6c 69 73 74 28 41 29 20 3a  .inscollist(A) :
5360: 3a 3d 20 69 6e 73 63 6f 6c 6c 69 73 74 28 58 29  := inscollist(X)
5370: 20 43 4f 4d 4d 41 20 6e 6d 28 59 29 2e 20 20 7b   COMMA nm(Y).  {
5380: 41 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  A = sqlite3IdLis
5390: 74 41 70 70 65 6e 64 28 58 2c 26 59 29 3b 7d 0a  tAppend(X,&Y);}.
53a0: 69 6e 73 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a  inscollist(A) ::
53b0: 3d 20 6e 6d 28 59 29 2e 20 20 20 20 20 20 20 20  = nm(Y).        
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
53d0: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
53e0: 41 70 70 65 6e 64 28 30 2c 26 59 29 3b 7d 0a 0a  Append(0,&Y);}..
53f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 45 78 70 72  /////////// Expr
5410: 65 73 73 69 6f 6e 20 50 72 6f 63 65 73 73 69 6e  ession Processin
5420: 67 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  g //////////////
5430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
5440: 2f 2f 0a 0a 25 74 79 70 65 20 65 78 70 72 20 7b  //..%type expr {
5450: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
5460: 6f 72 20 65 78 70 72 20 7b 73 71 6c 69 74 65 33  or expr {sqlite3
5470: 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d  ExprDelete($$);}
5480: 0a 25 74 79 70 65 20 74 65 72 6d 20 7b 45 78 70  .%type term {Exp
5490: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
54a0: 74 65 72 6d 20 7b 73 71 6c 69 74 65 33 45 78 70  term {sqlite3Exp
54b0: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 65  rDelete($$);}..e
54c0: 78 70 72 28 41 29 20 3a 3a 3d 20 74 65 72 6d 28  xpr(A) ::= term(
54d0: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
54e0: 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72 28 41 29  {A = X;}.expr(A)
54f0: 20 3a 3a 3d 20 4c 50 28 42 29 20 65 78 70 72 28   ::= LP(B) expr(
5500: 58 29 20 52 50 28 45 29 2e 20 7b 41 20 3d 20 58  X) RP(E). {A = X
5510: 3b 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61  ; sqlite3ExprSpa
5520: 6e 28 41 2c 26 42 2c 26 45 29 3b 20 7d 0a 74 65  n(A,&B,&E); }.te
5530: 72 6d 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c 28 58  rm(A) ::= NULL(X
5540: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ).             {
5550: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5560: 40 58 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a  @X, 0, 0, &X);}.
5570: 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58  expr(A) ::= ID(X
5580: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
5590: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
55a0: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  r(TK_ID, 0, 0, &
55b0: 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  X);}.expr(A) ::=
55c0: 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20   JOIN_KW(X).    
55d0: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
55e0: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
55f0: 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41   0, &X);}.expr(A
5600: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f 54 20  ) ::= nm(X) DOT 
5610: 6e 6d 28 59 29 2e 20 7b 0a 20 20 45 78 70 72 20  nm(Y). {.  Expr 
5620: 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 33  *temp1 = sqlite3
5630: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
5640: 2c 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74  , &X);.  Expr *t
5650: 65 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 45 78  emp2 = sqlite3Ex
5660: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
5670: 26 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74  &Y);.  A = sqlit
5680: 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 74  e3Expr(TK_DOT, t
5690: 65 6d 70 31 2c 20 74 65 6d 70 32 2c 20 30 29 3b  emp1, temp2, 0);
56a0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e  .}.expr(A) ::= n
56b0: 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29 20 44  m(X) DOT nm(Y) D
56c0: 4f 54 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 45 78  OT nm(Z). {.  Ex
56d0: 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69  pr *temp1 = sqli
56e0: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
56f0: 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78 70 72  , 0, &X);.  Expr
5700: 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69 74 65   *temp2 = sqlite
5710: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
5720: 30 2c 20 26 59 29 3b 0a 20 20 45 78 70 72 20 2a  0, &Y);.  Expr *
5730: 74 65 6d 70 33 20 3d 20 73 71 6c 69 74 65 33 45  temp3 = sqlite3E
5740: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
5750: 20 26 5a 29 3b 0a 20 20 45 78 70 72 20 2a 74 65   &Z);.  Expr *te
5760: 6d 70 34 20 3d 20 73 71 6c 69 74 65 33 45 78 70  mp4 = sqlite3Exp
5770: 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 32 2c  r(TK_DOT, temp2,
5780: 20 74 65 6d 70 33 2c 20 30 29 3b 0a 20 20 41 20   temp3, 0);.  A 
5790: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
57a0: 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d  _DOT, temp1, tem
57b0: 70 34 2c 20 30 29 3b 0a 7d 0a 74 65 72 6d 28 41  p4, 0);.}.term(A
57c0: 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 7c 46 4c  ) ::= INTEGER|FL
57d0: 4f 41 54 7c 42 4c 4f 42 28 58 29 2e 20 20 20 20  OAT|BLOB(X).    
57e0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
57f0: 70 72 28 40 58 2c 20 30 2c 20 30 2c 20 26 58 29  pr(@X, 0, 0, &X)
5800: 3b 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 53  ;}.term(A) ::= S
5810: 54 52 49 4e 47 28 58 29 2e 20 20 20 20 20 20 20  TRING(X).       
5820: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
5830: 28 40 58 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d  (@X, 0, 0, &X);}
5840: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52 45 47  .expr(A) ::= REG
5850: 49 53 54 45 52 28 58 29 2e 20 20 20 20 20 7b 41  ISTER(X).     {A
5860: 20 3d 20 73 71 6c 69 74 65 33 52 65 67 69 73 74   = sqlite3Regist
5870: 65 72 45 78 70 72 28 70 50 61 72 73 65 2c 20 26  erExpr(pParse, &
5880: 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  X);}.expr(A) ::=
5890: 20 56 41 52 49 41 42 4c 45 28 58 29 2e 20 20 20   VARIABLE(X).   
58a0: 20 20 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f    {.  Token *pTo
58b0: 6b 65 6e 20 3d 20 26 58 3b 0a 20 20 45 78 70 72  ken = &X;.  Expr
58c0: 20 2a 70 45 78 70 72 20 3d 20 41 20 3d 20 73 71   *pExpr = A = sq
58d0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 56 41 52  lite3Expr(TK_VAR
58e0: 49 41 42 4c 45 2c 20 30 2c 20 30 2c 20 70 54 6f  IABLE, 0, 0, pTo
58f0: 6b 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ken);.  sqlite3E
5900: 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62  xprAssignVarNumb
5910: 65 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  er(pParse, pExpr
5920: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
5930: 20 65 78 70 72 28 45 29 20 43 4f 4c 4c 41 54 45   expr(E) COLLATE
5940: 20 69 64 28 43 29 2e 20 7b 0a 20 20 41 20 3d 20   id(C). {.  A = 
5950: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
5960: 6c 6c 28 70 50 61 72 73 65 2c 20 45 2c 20 26 43  ll(pParse, E, &C
5970: 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c  );.}.%ifndef SQL
5980: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78  ITE_OMIT_CAST.ex
5990: 70 72 28 41 29 20 3a 3a 3d 20 43 41 53 54 28 58  pr(A) ::= CAST(X
59a0: 29 20 4c 50 20 65 78 70 72 28 45 29 20 41 53 20  ) LP expr(E) AS 
59b0: 74 79 70 65 74 6f 6b 65 6e 28 54 29 20 52 50 28  typetoken(T) RP(
59c0: 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Y). {.  A = sqli
59d0: 74 65 33 45 78 70 72 28 54 4b 5f 43 41 53 54 2c  te3Expr(TK_CAST,
59e0: 20 45 2c 20 30 2c 20 26 54 29 3b 0a 20 20 73 71   E, 0, &T);.  sq
59f0: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
5a00: 26 58 2c 26 59 29 3b 0a 7d 0a 25 65 6e 64 69 66  &X,&Y);.}.%endif
5a10: 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41    SQLITE_OMIT_CA
5a20: 53 54 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49  ST.expr(A) ::= I
5a30: 44 28 58 29 20 4c 50 20 64 69 73 74 69 6e 63 74  D(X) LP distinct
5a40: 28 44 29 20 65 78 70 72 6c 69 73 74 28 59 29 20  (D) exprlist(Y) 
5a50: 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  RP(E). {.  A = s
5a60: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
5a70: 6f 6e 28 59 2c 20 26 58 29 3b 0a 20 20 73 71 6c  on(Y, &X);.  sql
5a80: 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26  ite3ExprSpan(A,&
5a90: 58 2c 26 45 29 3b 0a 20 20 69 66 28 20 44 20 26  X,&E);.  if( D &
5aa0: 26 20 41 20 29 7b 0a 20 20 20 20 41 2d 3e 66 6c  & A ){.    A->fl
5ab0: 61 67 73 20 7c 3d 20 45 50 5f 44 69 73 74 69 6e  ags |= EP_Distin
5ac0: 63 74 3b 0a 20 20 7d 0a 7d 0a 65 78 70 72 28 41  ct;.  }.}.expr(A
5ad0: 29 20 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20 53  ) ::= ID(X) LP S
5ae0: 54 41 52 20 52 50 28 45 29 2e 20 7b 0a 20 20 41  TAR RP(E). {.  A
5af0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75   = sqlite3ExprFu
5b00: 6e 63 74 69 6f 6e 28 30 2c 20 26 58 29 3b 0a 20  nction(0, &X);. 
5b10: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
5b20: 28 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 74 65 72  (A,&X,&E);.}.ter
5b30: 6d 28 41 29 20 3a 3a 3d 20 43 54 49 4d 45 5f 4b  m(A) ::= CTIME_K
5b40: 57 28 4f 50 29 2e 20 7b 0a 20 20 2f 2a 20 54 68  W(OP). {.  /* Th
5b50: 65 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 2c 20  e CURRENT_TIME, 
5b60: 43 55 52 52 45 4e 54 5f 44 41 54 45 2c 20 61 6e  CURRENT_DATE, an
5b70: 64 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54  d CURRENT_TIMEST
5b80: 41 4d 50 20 76 61 6c 75 65 73 20 61 72 65 0a 20  AMP values are. 
5b90: 20 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 66   ** treated as f
5ba0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65  unctions that re
5bb0: 74 75 72 6e 20 63 6f 6e 73 74 61 6e 74 73 20 2a  turn constants *
5bc0: 2f 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  /.  A = sqlite3E
5bd0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 30 2c 26 4f  xprFunction(0,&O
5be0: 50 29 3b 0a 20 20 69 66 28 20 41 20 29 7b 0a 20  P);.  if( A ){. 
5bf0: 20 20 20 41 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f     A->op = TK_CO
5c00: 4e 53 54 5f 46 55 4e 43 3b 20 20 0a 20 20 20 20  NST_FUNC;  .    
5c10: 41 2d 3e 73 70 61 6e 20 3d 20 4f 50 3b 0a 20 20  A->span = OP;.  
5c20: 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.}.expr(A) ::= 
5c30: 65 78 70 72 28 58 29 20 41 4e 44 28 4f 50 29 20  expr(X) AND(OP) 
5c40: 65 78 70 72 28 59 29 2e 20 20 20 20 20 20 20 20  expr(Y).        
5c50: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
5c60: 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20  Expr(@OP, X, Y, 
5c70: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
5c80: 20 65 78 70 72 28 58 29 20 4f 52 28 4f 50 29 20   expr(X) OR(OP) 
5c90: 65 78 70 72 28 59 29 2e 20 20 20 20 20 20 20 20  expr(Y).        
5ca0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5cb0: 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c  3Expr(@OP, X, Y,
5cc0: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
5cd0: 3d 20 65 78 70 72 28 58 29 20 4c 54 7c 47 54 7c  = expr(X) LT|GT|
5ce0: 47 45 7c 4c 45 28 4f 50 29 20 65 78 70 72 28 59  GE|LE(OP) expr(Y
5cf0: 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  ).    {A = sqlit
5d00: 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59  e3Expr(@OP, X, Y
5d10: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
5d20: 3a 3d 20 65 78 70 72 28 58 29 20 45 51 7c 4e 45  := expr(X) EQ|NE
5d30: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20  (OP) expr(Y).   
5d40: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
5d50: 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20  te3Expr(@OP, X, 
5d60: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
5d70: 3a 3a 3d 20 65 78 70 72 28 58 29 20 42 49 54 41  ::= expr(X) BITA
5d80: 4e 44 7c 42 49 54 4f 52 7c 4c 53 48 49 46 54 7c  ND|BITOR|LSHIFT|
5d90: 52 53 48 49 46 54 28 4f 50 29 20 65 78 70 72 28  RSHIFT(OP) expr(
5da0: 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y)..            
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dd0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
5de0: 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20  Expr(@OP, X, Y, 
5df0: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
5e00: 20 65 78 70 72 28 58 29 20 50 4c 55 53 7c 4d 49   expr(X) PLUS|MI
5e10: 4e 55 53 28 4f 50 29 20 65 78 70 72 28 59 29 2e  NUS(OP) expr(Y).
5e20: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5e30: 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c  3Expr(@OP, X, Y,
5e40: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
5e50: 3d 20 65 78 70 72 28 58 29 20 53 54 41 52 7c 53  = expr(X) STAR|S
5e60: 4c 41 53 48 7c 52 45 4d 28 4f 50 29 20 65 78 70  LASH|REM(OP) exp
5e70: 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74  r(Y). {A = sqlit
5e80: 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59  e3Expr(@OP, X, Y
5e90: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
5ea0: 3a 3d 20 65 78 70 72 28 58 29 20 43 4f 4e 43 41  := expr(X) CONCA
5eb0: 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  T(OP) expr(Y).  
5ec0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
5ed0: 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20  te3Expr(@OP, X, 
5ee0: 59 2c 20 30 29 3b 7d 0a 25 74 79 70 65 20 6c 69  Y, 0);}.%type li
5ef0: 6b 65 6f 70 20 7b 73 74 72 75 63 74 20 4c 69 6b  keop {struct Lik
5f00: 65 4f 70 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a  eOp}.likeop(A) :
5f10: 3a 3d 20 4c 49 4b 45 5f 4b 57 28 58 29 2e 20 20  := LIKE_KW(X).  
5f20: 20 20 20 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20     {A.eOperator 
5f30: 3d 20 58 3b 20 41 2e 6e 6f 74 20 3d 20 30 3b 7d  = X; A.not = 0;}
5f40: 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4e  .likeop(A) ::= N
5f50: 4f 54 20 4c 49 4b 45 5f 4b 57 28 58 29 2e 20 7b  OT LIKE_KW(X). {
5f60: 41 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20 58 3b  A.eOperator = X;
5f70: 20 41 2e 6e 6f 74 20 3d 20 31 3b 7d 0a 6c 69 6b   A.not = 1;}.lik
5f80: 65 6f 70 28 41 29 20 3a 3a 3d 20 4d 41 54 43 48  eop(A) ::= MATCH
5f90: 28 58 29 2e 20 20 20 20 20 20 20 7b 41 2e 65 4f  (X).       {A.eO
5fa0: 70 65 72 61 74 6f 72 20 3d 20 58 3b 20 41 2e 6e  perator = X; A.n
5fb0: 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b 65 6f 70 28  ot = 0;}.likeop(
5fc0: 41 29 20 3a 3a 3d 20 4e 4f 54 20 4d 41 54 43 48  A) ::= NOT MATCH
5fd0: 28 58 29 2e 20 20 20 7b 41 2e 65 4f 70 65 72 61  (X).   {A.eOpera
5fe0: 74 6f 72 20 3d 20 58 3b 20 41 2e 6e 6f 74 20 3d  tor = X; A.not =
5ff0: 20 31 3b 7d 0a 25 74 79 70 65 20 65 73 63 61 70   1;}.%type escap
6000: 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72  e {Expr*}.%destr
6010: 75 63 74 6f 72 20 65 73 63 61 70 65 20 7b 73 71  uctor escape {sq
6020: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6030: 24 24 29 3b 7d 0a 65 73 63 61 70 65 28 58 29 20  $$);}.escape(X) 
6040: 3a 3a 3d 20 45 53 43 41 50 45 20 65 78 70 72 28  ::= ESCAPE expr(
6050: 41 29 2e 20 5b 45 53 43 41 50 45 5d 20 7b 58 20  A). [ESCAPE] {X 
6060: 3d 20 41 3b 7d 0a 65 73 63 61 70 65 28 58 29 20  = A;}.escape(X) 
6070: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
6080: 20 20 20 20 5b 45 53 43 41 50 45 5d 20 7b 58 20      [ESCAPE] {X 
6090: 3d 20 30 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  = 0;}.expr(A) ::
60a0: 3d 20 65 78 70 72 28 58 29 20 6c 69 6b 65 6f 70  = expr(X) likeop
60b0: 28 4f 50 29 20 65 78 70 72 28 59 29 20 65 73 63  (OP) expr(Y) esc
60c0: 61 70 65 28 45 29 2e 20 20 5b 4c 49 4b 45 5f 4b  ape(E).  [LIKE_K
60d0: 57 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74  W]  {.  ExprList
60e0: 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
60f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6100: 73 74 41 70 70 65 6e 64 28 30 2c 20 59 2c 20 30  stAppend(0, Y, 0
6110: 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
6120: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6130: 6e 64 28 70 4c 69 73 74 2c 20 58 2c 20 30 29 3b  nd(pList, X, 0);
6140: 0a 20 20 69 66 28 20 45 20 29 7b 0a 20 20 20 20  .  if( E ){.    
6150: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
6160: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c  xprListAppend(pL
6170: 69 73 74 2c 20 45 2c 20 30 29 3b 0a 20 20 7d 0a  ist, E, 0);.  }.
6180: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
6190: 72 46 75 6e 63 74 69 6f 6e 28 70 4c 69 73 74 2c  rFunction(pList,
61a0: 20 26 4f 50 2e 65 4f 70 65 72 61 74 6f 72 29 3b   &OP.eOperator);
61b0: 0a 20 20 69 66 28 20 4f 50 2e 6e 6f 74 20 29 20  .  if( OP.not ) 
61c0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
61d0: 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29  TK_NOT, A, 0, 0)
61e0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
61f0: 70 61 6e 28 41 2c 20 26 58 2d 3e 73 70 61 6e 2c  pan(A, &X->span,
6200: 20 26 59 2d 3e 73 70 61 6e 29 3b 0a 20 20 69 66   &Y->span);.  if
6210: 28 20 41 20 29 20 41 2d 3e 66 6c 61 67 73 20 7c  ( A ) A->flags |
6220: 3d 20 45 50 5f 49 6e 66 69 78 46 75 6e 63 3b 0a  = EP_InfixFunc;.
6230: 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  }..expr(A) ::= e
6240: 78 70 72 28 58 29 20 49 53 4e 55 4c 4c 7c 4e 4f  xpr(X) ISNULL|NO
6250: 54 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20  TNULL(E). {.  A 
6260: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 45  = sqlite3Expr(@E
6270: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
6280: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
6290: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a  &X->span,&E);.}.
62a0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
62b0: 28 58 29 20 49 53 20 4e 55 4c 4c 28 45 29 2e 20  (X) IS NULL(E). 
62c0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
62d0: 78 70 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58  xpr(TK_ISNULL, X
62e0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
62f0: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  e3ExprSpan(A,&X-
6300: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70  >span,&E);.}.exp
6310: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
6320: 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a   NOT NULL(E). {.
6330: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
6340: 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c  r(TK_NOTNULL, X,
6350: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
6360: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  3ExprSpan(A,&X->
6370: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72  span,&E);.}.expr
6380: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
6390: 49 53 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20  IS NOT NULL(E). 
63a0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
63b0: 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20  xpr(TK_NOTNULL, 
63c0: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
63d0: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58  te3ExprSpan(A,&X
63e0: 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78  ->span,&E);.}.ex
63f0: 70 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 7c 42 49  pr(A) ::= NOT|BI
6400: 54 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e  TNOT(B) expr(X).
6410: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
6420: 45 78 70 72 28 40 42 2c 20 58 2c 20 30 2c 20 30  Expr(@B, X, 0, 0
6430: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
6440: 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70  Span(A,&B,&X->sp
6450: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  an);.}.expr(A) :
6460: 3a 3d 20 4d 49 4e 55 53 28 42 29 20 65 78 70 72  := MINUS(B) expr
6470: 28 58 29 2e 20 5b 55 4d 49 4e 55 53 5d 20 7b 0a  (X). [UMINUS] {.
6480: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
6490: 72 28 54 4b 5f 55 4d 49 4e 55 53 2c 20 58 2c 20  r(TK_UMINUS, X, 
64a0: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
64b0: 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 58  ExprSpan(A,&B,&X
64c0: 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28  ->span);.}.expr(
64d0: 41 29 20 3a 3a 3d 20 50 4c 55 53 28 42 29 20 65  A) ::= PLUS(B) e
64e0: 78 70 72 28 58 29 2e 20 5b 55 50 4c 55 53 5d 20  xpr(X). [UPLUS] 
64f0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
6500: 78 70 72 28 54 4b 5f 55 50 4c 55 53 2c 20 58 2c  xpr(TK_UPLUS, X,
6510: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
6520: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26  3ExprSpan(A,&B,&
6530: 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 25 74 79 70  X->span);.}.%typ
6540: 65 20 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69 6e  e between_op {in
6550: 74 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41 29  t}.between_op(A)
6560: 20 3a 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20 20   ::= BETWEEN.   
6570: 20 20 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77 65    {A = 0;}.betwe
6580: 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54  en_op(A) ::= NOT
6590: 20 42 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20 31   BETWEEN. {A = 1
65a0: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
65b0: 78 70 72 28 57 29 20 62 65 74 77 65 65 6e 5f 6f  xpr(W) between_o
65c0: 70 28 4e 29 20 65 78 70 72 28 58 29 20 41 4e 44  p(N) expr(X) AND
65d0: 20 65 78 70 72 28 59 29 2e 20 5b 42 45 54 57 45   expr(Y). [BETWE
65e0: 45 4e 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73 74  EN] {.  ExprList
65f0: 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
6600: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6610: 30 2c 20 58 2c 20 30 29 3b 0a 20 20 70 4c 69 73  0, X, 0);.  pLis
6620: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
6630: 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c  istAppend(pList,
6640: 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71   Y, 0);.  A = sq
6650: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 42 45 54  lite3Expr(TK_BET
6660: 57 45 45 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a  WEEN, W, 0, 0);.
6670: 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41    if( A ){.    A
6680: 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b  ->pList = pList;
6690: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
66a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
66b0: 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 7d 20  ete(pList);.  } 
66c0: 0a 20 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73  .  if( N ) A = s
66d0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f  qlite3Expr(TK_NO
66e0: 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73  T, A, 0, 0);.  s
66f0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
6700: 2c 26 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70  ,&W->span,&Y->sp
6710: 61 6e 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53  an);.}.%ifndef S
6720: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6730: 45 52 59 0a 20 20 25 74 79 70 65 20 69 6e 5f 6f  ERY.  %type in_o
6740: 70 20 7b 69 6e 74 7d 0a 20 20 69 6e 5f 6f 70 28  p {int}.  in_op(
6750: 41 29 20 3a 3a 3d 20 49 4e 2e 20 20 20 20 20 20  A) ::= IN.      
6760: 7b 41 20 3d 20 30 3b 7d 0a 20 20 69 6e 5f 6f 70  {A = 0;}.  in_op
6770: 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e 2e 20  (A) ::= NOT IN. 
6780: 20 7b 41 20 3d 20 31 3b 7d 0a 20 20 65 78 70 72   {A = 1;}.  expr
6790: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
67a0: 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 65 78 70 72  in_op(N) LP expr
67b0: 6c 69 73 74 28 59 29 20 52 50 28 45 29 2e 20 5b  list(Y) RP(E). [
67c0: 49 4e 5d 20 7b 0a 20 20 20 20 41 20 3d 20 73 71  IN] {.    A = sq
67d0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c  lite3Expr(TK_IN,
67e0: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   X, 0, 0);.    i
67f0: 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20 41 2d  f( A ){.      A-
6800: 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 20 20  >pList = Y;.    
6810: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
6820: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
6830: 74 65 28 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20  te(Y);.    }.   
6840: 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73 71 6c   if( N ) A = sql
6850: 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f 54 2c  ite3Expr(TK_NOT,
6860: 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   A, 0, 0);.    s
6870: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
6880: 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 20  ,&X->span,&E);. 
6890: 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d   }.  expr(A) ::=
68a0: 20 4c 50 28 42 29 20 73 65 6c 65 63 74 28 58 29   LP(B) select(X)
68b0: 20 52 50 28 45 29 2e 20 7b 0a 20 20 20 20 41 20   RP(E). {.    A 
68c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
68d0: 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30  _SELECT, 0, 0, 0
68e0: 29 3b 0a 20 20 20 20 69 66 28 20 41 20 29 7b 0a  );.    if( A ){.
68f0: 20 20 20 20 20 20 41 2d 3e 70 53 65 6c 65 63 74        A->pSelect
6900: 20 3d 20 58 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = X;.    }else{
6910: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
6920: 6c 65 63 74 44 65 6c 65 74 65 28 58 29 3b 0a 20  lectDelete(X);. 
6930: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6940: 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45  ExprSpan(A,&B,&E
6950: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29  );.  }.  expr(A)
6960: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f   ::= expr(X) in_
6970: 6f 70 28 4e 29 20 4c 50 20 73 65 6c 65 63 74 28  op(N) LP select(
6980: 59 29 20 52 50 28 45 29 2e 20 20 5b 49 4e 5d 20  Y) RP(E).  [IN] 
6990: 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65  {.    A = sqlite
69a0: 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20  3Expr(TK_IN, X, 
69b0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 41  0, 0);.    if( A
69c0: 20 29 7b 0a 20 20 20 20 20 20 41 2d 3e 70 53 65   ){.      A->pSe
69d0: 6c 65 63 74 20 3d 20 59 3b 0a 20 20 20 20 7d 65  lect = Y;.    }e
69e0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
69f0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 59  e3SelectDelete(Y
6a00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
6a10: 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33   N ) A = sqlite3
6a20: 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20  Expr(TK_NOT, A, 
6a30: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
6a40: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  e3ExprSpan(A,&X-
6a50: 3e 73 70 61 6e 2c 26 45 29 3b 0a 20 20 7d 0a 20  >span,&E);.  }. 
6a60: 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70   expr(A) ::= exp
6a70: 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29 20 6e 6d  r(X) in_op(N) nm
6a80: 28 59 29 20 64 62 6e 6d 28 5a 29 2e 20 5b 49 4e  (Y) dbnm(Z). [IN
6a90: 5d 20 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  ] {.    SrcList 
6aa0: 2a 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  *pSrc = sqlite3S
6ab0: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26  rcListAppend(0,&
6ac0: 59 2c 26 5a 29 3b 0a 20 20 20 20 41 20 3d 20 73  Y,&Z);.    A = s
6ad0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
6ae0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , X, 0, 0);.    
6af0: 69 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20 41  if( A ){.      A
6b00: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
6b10: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 30 2c 70  te3SelectNew(0,p
6b20: 53 72 63 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c  Src,0,0,0,0,0,0,
6b30: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
6b40: 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
6b50: 69 73 74 44 65 6c 65 74 65 28 70 53 72 63 29 3b  istDelete(pSrc);
6b60: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 4e  .    }.    if( N
6b70: 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78   ) A = sqlite3Ex
6b80: 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c  pr(TK_NOT, A, 0,
6b90: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
6ba0: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73  ExprSpan(A,&X->s
6bb0: 70 61 6e 2c 5a 2e 7a 3f 26 5a 3a 26 59 29 3b 0a  pan,Z.z?&Z:&Y);.
6bc0: 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a    }.  expr(A) ::
6bd0: 3d 20 45 58 49 53 54 53 28 42 29 20 4c 50 20 73  = EXISTS(B) LP s
6be0: 65 6c 65 63 74 28 59 29 20 52 50 28 45 29 2e 20  elect(Y) RP(E). 
6bf0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
6c00: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
6c10: 54 4b 5f 45 58 49 53 54 53 2c 20 30 2c 20 30 2c  TK_EXISTS, 0, 0,
6c20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29   0);.    if( p )
6c30: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53 65 6c 65  {.      p->pSele
6c40: 63 74 20 3d 20 59 3b 0a 20 20 20 20 20 20 73 71  ct = Y;.      sq
6c50: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 70 2c  lite3ExprSpan(p,
6c60: 26 42 2c 26 45 29 3b 0a 20 20 20 20 7d 65 6c 73  &B,&E);.    }els
6c70: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
6c80: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 59 29 3b  SelectDelete(Y);
6c90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 25 65 6e 64 69  .    }.  }.%endi
6ca0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
6cb0: 42 51 55 45 52 59 0a 0a 2f 2a 20 43 41 53 45 20  BQUERY../* CASE 
6cc0: 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 65  expressions */.e
6cd0: 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53 45 28  xpr(A) ::= CASE(
6ce0: 43 29 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 28  C) case_operand(
6cf0: 58 29 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74  X) case_exprlist
6d00: 28 59 29 20 63 61 73 65 5f 65 6c 73 65 28 5a 29  (Y) case_else(Z)
6d10: 20 45 4e 44 28 45 29 2e 20 7b 0a 20 20 41 20 3d   END(E). {.  A =
6d20: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
6d30: 43 41 53 45 2c 20 58 2c 20 5a 2c 20 30 29 3b 0a  CASE, X, Z, 0);.
6d40: 20 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 41    if( A ){.    A
6d50: 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 7d  ->pList = Y;.  }
6d60: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
6d70: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
6d80: 59 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  Y);.  }.  sqlite
6d90: 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26 43 2c  3ExprSpan(A, &C,
6da0: 20 26 45 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61   &E);.}.%type ca
6db0: 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 45 78 70  se_exprlist {Exp
6dc0: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
6dd0: 74 6f 72 20 63 61 73 65 5f 65 78 70 72 6c 69 73  tor case_exprlis
6de0: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
6df0: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 63  stDelete($$);}.c
6e00: 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20  ase_exprlist(A) 
6e10: 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c 69 73  ::= case_exprlis
6e20: 74 28 58 29 20 57 48 45 4e 20 65 78 70 72 28 59  t(X) WHEN expr(Y
6e30: 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20  ) THEN expr(Z). 
6e40: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
6e50: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  xprListAppend(X,
6e60: 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71   Y, 0);.  A = sq
6e70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
6e80: 65 6e 64 28 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a  end(A, Z, 0);.}.
6e90: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29  case_exprlist(A)
6ea0: 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 59   ::= WHEN expr(Y
6eb0: 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20  ) THEN expr(Z). 
6ec0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
6ed0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
6ee0: 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71   Y, 0);.  A = sq
6ef0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
6f00: 65 6e 64 28 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a  end(A, Z, 0);.}.
6f10: 25 74 79 70 65 20 63 61 73 65 5f 65 6c 73 65 20  %type case_else 
6f20: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
6f30: 74 6f 72 20 63 61 73 65 5f 65 6c 73 65 20 7b 73  tor case_else {s
6f40: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6f50: 28 24 24 29 3b 7d 0a 63 61 73 65 5f 65 6c 73 65  ($$);}.case_else
6f60: 28 41 29 20 3a 3a 3d 20 20 45 4c 53 45 20 65 78  (A) ::=  ELSE ex
6f70: 70 72 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b  pr(X).         {
6f80: 41 20 3d 20 58 3b 7d 0a 63 61 73 65 5f 65 6c 73  A = X;}.case_els
6f90: 65 28 41 29 20 3a 3a 3d 20 20 2e 20 20 20 20 20  e(A) ::=  .     
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fb0: 7b 41 20 3d 20 30 3b 7d 20 0a 25 74 79 70 65 20  {A = 0;} .%type 
6fc0: 63 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b 45 78  case_operand {Ex
6fd0: 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pr*}.%destructor
6fe0: 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b 73   case_operand {s
6ff0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7000: 28 24 24 29 3b 7d 0a 63 61 73 65 5f 6f 70 65 72  ($$);}.case_oper
7010: 61 6e 64 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  and(A) ::= expr(
7020: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b  X).            {
7030: 41 20 3d 20 58 3b 7d 20 0a 63 61 73 65 5f 6f 70  A = X;} .case_op
7040: 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 2e 20 20  erand(A) ::= .  
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25 74 79 70   {A = 0;} ..%typ
7070: 65 20 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72  e exprlist {Expr
7080: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
7090: 6f 72 20 65 78 70 72 6c 69 73 74 20 7b 73 71 6c  or exprlist {sql
70a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
70b0: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 65  te($$);}.%type e
70c0: 78 70 72 69 74 65 6d 20 7b 45 78 70 72 2a 7d 0a  xpritem {Expr*}.
70d0: 25 64 65 73 74 72 75 63 74 6f 72 20 65 78 70 72  %destructor expr
70e0: 69 74 65 6d 20 7b 73 71 6c 69 74 65 33 45 78 70  item {sqlite3Exp
70f0: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 65  rDelete($$);}..e
7100: 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65  xprlist(A) ::= e
7110: 78 70 72 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  xprlist(X) COMMA
7120: 20 65 78 70 72 69 74 65 6d 28 59 29 2e 20 0a 20   expritem(Y). . 
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
7160: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
7170: 64 28 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 6c  d(X,Y,0);}.exprl
7180: 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 69  ist(A) ::= expri
7190: 74 65 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20  tem(X).         
71a0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
71b0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
71c0: 58 2c 30 29 3b 7d 0a 65 78 70 72 69 74 65 6d 28  X,0);}.expritem(
71d0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20  A) ::= expr(X). 
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
71f0: 41 20 3d 20 58 3b 7d 0a 65 78 70 72 69 74 65 6d  A = X;}.expritem
7200: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  {A = 0;}..//////
7230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7240: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41  /////// The CREA
7250: 54 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64  TE INDEX command
7260: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
7270: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
7280: 3a 3a 3d 20 43 52 45 41 54 45 28 53 29 20 75 6e  ::= CREATE(S) un
7290: 69 71 75 65 66 6c 61 67 28 55 29 20 49 4e 44 45  iqueflag(U) INDE
72a0: 58 20 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 45  X ifnotexists(NE
72b0: 29 20 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29 0a  ) nm(X) dbnm(D).
72c0: 20 20 20 20 20 20 20 20 4f 4e 20 6e 6d 28 59 29          ON nm(Y)
72d0: 20 4c 50 20 69 64 78 6c 69 73 74 28 5a 29 20 52   LP idxlist(Z) R
72e0: 50 28 45 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  P(E). {.  sqlite
72f0: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
7300: 72 73 65 2c 20 26 58 2c 20 26 44 2c 20 73 71 6c  rse, &X, &D, sql
7310: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
7320: 64 28 30 2c 26 59 2c 30 29 2c 20 5a 2c 20 55 2c  d(0,&Y,0), Z, U,
7330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7340: 20 20 20 20 20 20 20 26 53 2c 20 26 45 2c 20 53         &S, &E, S
7350: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 2c 20 4e 45  QLITE_SO_ASC, NE
7360: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71  );.}..%type uniq
7370: 75 65 66 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69  ueflag {int}.uni
7380: 71 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55  queflag(A) ::= U
7390: 4e 49 51 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f  NIQUE.  {A = OE_
73a0: 41 62 6f 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c  Abort;}.uniquefl
73b0: 61 67 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  ag(A) ::= .     
73c0: 20 20 20 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b     {A = OE_None;
73d0: 7d 0a 0a 25 74 79 70 65 20 69 64 78 6c 69 73 74  }..%type idxlist
73e0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
73f0: 73 74 72 75 63 74 6f 72 20 69 64 78 6c 69 73 74  structor idxlist
7400: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   {sqlite3ExprLis
7410: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
7420: 79 70 65 20 69 64 78 6c 69 73 74 5f 6f 70 74 20  ype idxlist_opt 
7430: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
7440: 74 72 75 63 74 6f 72 20 69 64 78 6c 69 73 74 5f  tructor idxlist_
7450: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
7460: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
7470: 0a 25 74 79 70 65 20 69 64 78 69 74 65 6d 20 7b  .%type idxitem {
7480: 54 6f 6b 65 6e 7d 0a 0a 69 64 78 6c 69 73 74 5f  Token}..idxlist_
7490: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
74a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74b0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 64       {A = 0;}.id
74c0: 78 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  xlist_opt(A) ::=
74d0: 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52   LP idxlist(X) R
74e0: 50 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20  P.         {A = 
74f0: 58 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a  X;}.idxlist(A) :
7500: 3a 3d 20 69 64 78 6c 69 73 74 28 58 29 20 43 4f  := idxlist(X) CO
7510: 4d 4d 41 20 69 64 78 69 74 65 6d 28 59 29 20 63  MMA idxitem(Y) c
7520: 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74 6f 72  ollate(C) sortor
7530: 64 65 72 28 5a 29 2e 20 20 7b 0a 20 20 45 78 70  der(Z).  {.  Exp
7540: 72 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66 28 20  r *p = 0;.  if( 
7550: 43 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 70 20 3d  C.n>0 ){.    p =
7560: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
7570: 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29  COLUMN, 0, 0, 0)
7580: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 70 2d  ;.    if( p ) p-
7590: 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  >pColl = sqlite3
75a0: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
75b0: 61 72 73 65 2c 20 28 63 68 61 72 2a 29 43 2e 7a  arse, (char*)C.z
75c0: 2c 20 43 2e 6e 29 3b 0a 20 20 7d 0a 20 20 41 20  , C.n);.  }.  A 
75d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
75e0: 74 41 70 70 65 6e 64 28 58 2c 20 70 2c 20 26 59  tAppend(X, p, &Y
75f0: 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e  );.  if( A ) A->
7600: 61 5b 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[A->nExpr-1].so
7610: 72 74 4f 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a 69  rtOrder = Z;.}.i
7620: 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64  dxlist(A) ::= id
7630: 78 69 74 65 6d 28 59 29 20 63 6f 6c 6c 61 74 65  xitem(Y) collate
7640: 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29  (C) sortorder(Z)
7650: 2e 20 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20  . {.  Expr *p = 
7660: 30 3b 0a 20 20 69 66 28 20 43 2e 6e 3e 30 20 29  0;.  if( C.n>0 )
7670: 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65  {.    p = sqlite
7680: 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55 4d 4e 2c  3Expr(TK_COLUMN,
7690: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
76a0: 66 28 20 70 20 29 20 70 2d 3e 70 43 6f 6c 6c 20  f( p ) p->pColl 
76b0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  = sqlite3LocateC
76c0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 28  ollSeq(pParse, (
76d0: 63 68 61 72 2a 29 43 2e 7a 2c 20 43 2e 6e 29 3b  char*)C.z, C.n);
76e0: 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c 69 74  .  }.  A = sqlit
76f0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
7700: 28 30 2c 20 70 2c 20 26 59 29 3b 0a 20 20 69 66  (0, p, &Y);.  if
7710: 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45  ( A ) A->a[A->nE
7720: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
7730: 20 3d 20 5a 3b 0a 7d 0a 69 64 78 69 74 65 6d 28   = Z;.}.idxitem(
7740: 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20 20  A) ::= nm(X).   
7750: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
7760: 58 3b 7d 0a 0a 25 74 79 70 65 20 63 6f 6c 6c 61  X;}..%type colla
7770: 74 65 20 7b 54 6f 6b 65 6e 7d 0a 63 6f 6c 6c 61  te {Token}.colla
7780: 74 65 28 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20  te(C) ::= .     
7790: 20 20 20 20 20 20 20 20 20 20 20 7b 43 2e 7a 20             {C.z 
77a0: 3d 20 30 3b 20 43 2e 6e 20 3d 20 30 3b 7d 0a 63  = 0; C.n = 0;}.c
77b0: 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d 20 43 4f  ollate(C) ::= CO
77c0: 4c 4c 41 54 45 20 69 64 28 58 29 2e 20 20 20 7b  LLATE id(X).   {
77d0: 43 20 3d 20 58 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f  C = X;}...//////
77e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
77f0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50  /////// The DROP
7800: 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f   INDEX command /
7810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7820: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
7830: 3a 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20 69  ::= DROP INDEX i
7840: 66 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e  fexists(E) fulln
7850: 61 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74  ame(X).   {sqlit
7860: 65 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72  e3DropIndex(pPar
7870: 73 65 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f  se, X, E);}..///
7880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56  ////////// The V
78a0: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f  ACUUM command //
78b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
78c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25  ///////////.//.%
78d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
78e0: 49 54 5f 56 41 43 55 55 4d 0a 63 6d 64 20 3a 3a  IT_VACUUM.cmd ::
78f0: 3d 20 56 41 43 55 55 4d 2e 20 20 20 20 20 20 20  = VACUUM.       
7900: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
7910: 33 56 61 63 75 75 6d 28 70 50 61 72 73 65 29 3b  3Vacuum(pParse);
7920: 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d  }.cmd ::= VACUUM
7930: 20 6e 6d 2e 20 20 20 20 20 20 20 20 20 20 20 20   nm.            
7940: 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75 6d 28   {sqlite3Vacuum(
7950: 70 50 61 72 73 65 29 3b 7d 0a 25 65 6e 64 69 66  pParse);}.%endif
7960: 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41    SQLITE_OMIT_VA
7970: 43 55 55 4d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  CUUM..//////////
7980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7990: 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d 41 20 63  /// The PRAGMA c
79a0: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
79b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
79c0: 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20  ////.//.%ifndef 
79d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47  SQLITE_OMIT_PRAG
79e0: 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  MA.cmd ::= PRAGM
79f0: 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20  A nm(X) dbnm(Z) 
7a00: 45 51 20 6e 6d 6e 75 6d 28 59 29 2e 20 20 7b 73  EQ nmnum(Y).  {s
7a10: 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61  qlite3Pragma(pPa
7a20: 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b  rse,&X,&Z,&Y,0);
7a30: 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41  }.cmd ::= PRAGMA
7a40: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 45   nm(X) dbnm(Z) E
7a50: 51 20 4f 4e 28 59 29 2e 20 20 7b 73 71 6c 69 74  Q ON(Y).  {sqlit
7a60: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  e3Pragma(pParse,
7a70: 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d  &X,&Z,&Y,0);}.cm
7a80: 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28  d ::= PRAGMA nm(
7a90: 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6d 69  X) dbnm(Z) EQ mi
7aa0: 6e 75 73 5f 6e 75 6d 28 59 29 2e 20 7b 0a 20 20  nus_num(Y). {.  
7ab0: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50  sqlite3Pragma(pP
7ac0: 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29  arse,&X,&Z,&Y,1)
7ad0: 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  ;.}.cmd ::= PRAG
7ae0: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
7af0: 20 4c 50 20 6e 6d 6e 75 6d 28 59 29 20 52 50 2e   LP nmnum(Y) RP.
7b00: 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28   {sqlite3Pragma(
7b10: 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c  pParse,&X,&Z,&Y,
7b20: 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  0);}.cmd ::= PRA
7b30: 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a  GMA nm(X) dbnm(Z
7b40: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ).             {
7b50: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50  sqlite3Pragma(pP
7b60: 61 72 73 65 2c 26 58 2c 26 5a 2c 30 2c 30 29 3b  arse,&X,&Z,0,0);
7b70: 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 70  }.nmnum(A) ::= p
7b80: 6c 75 73 5f 6e 75 6d 28 58 29 2e 20 20 20 20 20  lus_num(X).     
7b90: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
7ba0: 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 6e 6d  .nmnum(A) ::= nm
7bb0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
7bc0: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
7bd0: 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d  %endif SQLITE_OM
7be0: 49 54 5f 50 52 41 47 4d 41 0a 70 6c 75 73 5f 6e  IT_PRAGMA.plus_n
7bf0: 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6f  um(A) ::= plus_o
7c00: 70 74 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20  pt number(X).   
7c10: 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75 73 5f 6e  {A = X;}.minus_n
7c20: 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 20  um(A) ::= MINUS 
7c30: 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20 7b  number(X).     {
7c40: 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72 28 41  A = X;}.number(A
7c50: 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 7c 46 4c  ) ::= INTEGER|FL
7c60: 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20 7b 41  OAT(X).       {A
7c70: 20 3d 20 58 3b 7d 0a 70 6c 75 73 5f 6f 70 74 20   = X;}.plus_opt 
7c80: 3a 3a 3d 20 50 4c 55 53 2e 0a 70 6c 75 73 5f 6f  ::= PLUS..plus_o
7c90: 70 74 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f 2f 2f  pt ::= ...//////
7ca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7cb0: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54  ////// The CREAT
7cc0: 45 20 54 52 49 47 47 45 52 20 63 6f 6d 6d 61 6e  E TRIGGER comman
7cd0: 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  d //////////////
7ce0: 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64 65 66  ///////..%ifndef
7cf0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
7d00: 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20 43 52  GGER..cmd ::= CR
7d10: 45 41 54 45 20 74 72 69 67 67 65 72 5f 64 65 63  EATE trigger_dec
7d20: 6c 28 41 29 20 42 45 47 49 4e 20 74 72 69 67 67  l(A) BEGIN trigg
7d30: 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53 29 20 45  er_cmd_list(S) E
7d40: 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f 6b 65 6e  ND(Z). {.  Token
7d50: 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a 20 3d 20   all;.  all.z = 
7d60: 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20 3d 20 28  A.z;.  all.n = (
7d70: 5a 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a 2e 6e  Z.z - A.z) + Z.n
7d80: 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6e 69 73  ;.  sqlite3Finis
7d90: 68 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  hTrigger(pParse,
7da0: 20 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a 0a 74 72   S, &all);.}..tr
7db0: 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20 3a 3a  igger_decl(A) ::
7dc0: 3d 20 74 65 6d 70 28 54 29 20 54 52 49 47 47 45  = temp(T) TRIGGE
7dd0: 52 20 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 4f  R ifnotexists(NO
7de0: 45 52 52 29 20 6e 6d 28 42 29 20 64 62 6e 6d 28  ERR) nm(B) dbnm(
7df0: 5a 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  Z) .            
7e00: 20 20 20 20 20 20 20 20 74 72 69 67 67 65 72 5f          trigger_
7e10: 74 69 6d 65 28 43 29 20 74 72 69 67 67 65 72 5f  time(C) trigger_
7e20: 65 76 65 6e 74 28 44 29 0a 20 20 20 20 20 20 20  event(D).       
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20               ON 
7e40: 66 75 6c 6c 6e 61 6d 65 28 45 29 20 66 6f 72 65  fullname(E) fore
7e50: 61 63 68 5f 63 6c 61 75 73 65 28 46 29 20 77 68  ach_clause(F) wh
7e60: 65 6e 5f 63 6c 61 75 73 65 28 47 29 2e 20 7b 0a  en_clause(G). {.
7e70: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72    sqlite3BeginTr
7e80: 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 26 42  igger(pParse, &B
7e90: 2c 20 26 5a 2c 20 43 2c 20 44 2e 61 2c 20 44 2e  , &Z, C, D.a, D.
7ea0: 62 2c 20 45 2c 20 46 2c 20 47 2c 20 54 2c 20 4e  b, E, F, G, T, N
7eb0: 4f 45 52 52 29 3b 0a 20 20 41 20 3d 20 28 5a 2e  OERR);.  A = (Z.
7ec0: 6e 3d 3d 30 3f 42 3a 5a 29 3b 0a 7d 0a 0a 25 74  n==0?B:Z);.}..%t
7ed0: 79 70 65 20 74 72 69 67 67 65 72 5f 74 69 6d 65  ype trigger_time
7ee0: 20 20 7b 69 6e 74 7d 0a 74 72 69 67 67 65 72 5f    {int}.trigger_
7ef0: 74 69 6d 65 28 41 29 20 3a 3a 3d 20 42 45 46 4f  time(A) ::= BEFO
7f00: 52 45 2e 20 20 20 20 20 20 7b 20 41 20 3d 20 54  RE.      { A = T
7f10: 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a 74 72 69 67  K_BEFORE; }.trig
7f20: 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20  ger_time(A) ::= 
7f30: 41 46 54 45 52 2e 20 20 20 20 20 20 20 7b 20 41  AFTER.       { A
7f40: 20 3d 20 54 4b 5f 41 46 54 45 52 3b 20 20 7d 0a   = TK_AFTER;  }.
7f50: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20  trigger_time(A) 
7f60: 3a 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46 2e 20  ::= INSTEAD OF. 
7f70: 20 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54 45 41   { A = TK_INSTEA
7f80: 44 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65  D;}.trigger_time
7f90: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
7fa0: 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42 45       { A = TK_BE
7fb0: 46 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65 20 74  FORE; }..%type t
7fc0: 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 74  rigger_event {st
7fd0: 72 75 63 74 20 54 72 69 67 45 76 65 6e 74 7d 0a  ruct TrigEvent}.
7fe0: 25 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67  %destructor trig
7ff0: 67 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c 69 74  ger_event {sqlit
8000: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24  e3IdListDelete($
8010: 24 2e 62 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65  $.b);}.trigger_e
8020: 76 65 6e 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45  vent(A) ::= DELE
8030: 54 45 7c 49 4e 53 45 52 54 28 4f 50 29 2e 20 20  TE|INSERT(OP).  
8040: 20 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b       {A.a = @OP;
8050: 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67   A.b = 0;}.trigg
8060: 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20  er_event(A) ::= 
8070: 55 50 44 41 54 45 28 4f 50 29 2e 20 20 20 20 20  UPDATE(OP).     
8080: 20 20 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20           {A.a = 
8090: 40 4f 50 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74  @OP; A.b = 0;}.t
80a0: 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20  rigger_event(A) 
80b0: 3a 3a 3d 20 55 50 44 41 54 45 20 4f 46 20 69 6e  ::= UPDATE OF in
80c0: 73 63 6f 6c 6c 69 73 74 28 58 29 2e 20 7b 41 2e  scollist(X). {A.
80d0: 61 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b 20 41  a = TK_UPDATE; A
80e0: 2e 62 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  .b = X;}..%type 
80f0: 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 20 7b  foreach_clause {
8100: 69 6e 74 7d 0a 66 6f 72 65 61 63 68 5f 63 6c 61  int}.foreach_cla
8110: 75 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  use(A) ::= .    
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8130: 20 41 20 3d 20 54 4b 5f 52 4f 57 3b 20 7d 0a 66   A = TK_ROW; }.f
8140: 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28 41 29  oreach_clause(A)
8150: 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 52 4f   ::= FOR EACH RO
8160: 57 2e 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54  W.       { A = T
8170: 4b 5f 52 4f 57 3b 20 7d 0a 66 6f 72 65 61 63 68  K_ROW; }.foreach
8180: 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 46  _clause(A) ::= F
8190: 4f 52 20 45 41 43 48 20 53 54 41 54 45 4d 45 4e  OR EACH STATEMEN
81a0: 54 2e 20 7b 20 41 20 3d 20 54 4b 5f 53 54 41 54  T. { A = TK_STAT
81b0: 45 4d 45 4e 54 3b 20 7d 0a 0a 25 74 79 70 65 20  EMENT; }..%type 
81c0: 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 45 78 70  when_clause {Exp
81d0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
81e0: 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 73 71 6c  when_clause {sql
81f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
8200: 24 29 3b 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65  $);}.when_clause
8210: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
8220: 20 20 20 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d        { A = 0; }
8230: 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20  .when_clause(A) 
8240: 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 58 29  ::= WHEN expr(X)
8250: 2e 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 25 74  . { A = X; }..%t
8260: 79 70 65 20 74 72 69 67 67 65 72 5f 63 6d 64 5f  ype trigger_cmd_
8270: 6c 69 73 74 20 7b 54 72 69 67 67 65 72 53 74 65  list {TriggerSte
8280: 70 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  p*}.%destructor 
8290: 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74  trigger_cmd_list
82a0: 20 7b 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54   {sqlite3DeleteT
82b0: 72 69 67 67 65 72 53 74 65 70 28 24 24 29 3b 7d  riggerStep($$);}
82c0: 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73  .trigger_cmd_lis
82d0: 74 28 41 29 20 3a 3a 3d 20 74 72 69 67 67 65 72  t(A) ::= trigger
82e0: 5f 63 6d 64 5f 6c 69 73 74 28 59 29 20 74 72 69  _cmd_list(Y) tri
82f0: 67 67 65 72 5f 63 6d 64 28 58 29 20 53 45 4d 49  gger_cmd(X) SEMI
8300: 2e 20 7b 0a 20 20 69 66 28 20 59 20 29 7b 0a 20  . {.  if( Y ){. 
8310: 20 20 20 59 2d 3e 70 4c 61 73 74 2d 3e 70 4e 65     Y->pLast->pNe
8320: 78 74 20 3d 20 58 3b 0a 20 20 7d 65 6c 73 65 7b  xt = X;.  }else{
8330: 0a 20 20 20 20 59 20 3d 20 58 3b 0a 20 20 7d 0a  .    Y = X;.  }.
8340: 20 20 59 2d 3e 70 4c 61 73 74 20 3d 20 58 3b 0a    Y->pLast = X;.
8350: 20 20 41 20 3d 20 59 3b 0a 7d 0a 74 72 69 67 67    A = Y;.}.trigg
8360: 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a  er_cmd_list(A) :
8370: 3a 3d 20 2e 20 7b 20 41 20 3d 20 30 3b 20 7d 0a  := . { A = 0; }.
8380: 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 63  .%type trigger_c
8390: 6d 64 20 7b 54 72 69 67 67 65 72 53 74 65 70 2a  md {TriggerStep*
83a0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72  }.%destructor tr
83b0: 69 67 67 65 72 5f 63 6d 64 20 7b 73 71 6c 69 74  igger_cmd {sqlit
83c0: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53  e3DeleteTriggerS
83d0: 74 65 70 28 24 24 29 3b 7d 0a 2f 2f 20 55 50 44  tep($$);}.// UPD
83e0: 41 54 45 20 0a 74 72 69 67 67 65 72 5f 63 6d 64  ATE .trigger_cmd
83f0: 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45 20 6f  (A) ::= UPDATE o
8400: 72 63 6f 6e 66 28 52 29 20 6e 6d 28 58 29 20 53  rconf(R) nm(X) S
8410: 45 54 20 73 65 74 6c 69 73 74 28 59 29 20 77 68  ET setlist(Y) wh
8420: 65 72 65 5f 6f 70 74 28 5a 29 2e 20 20 0a 20 20  ere_opt(Z).  .  
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
8440: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
8450: 72 55 70 64 61 74 65 53 74 65 70 28 26 58 2c 20  rUpdateStep(&X, 
8460: 59 2c 20 5a 2c 20 52 29 3b 20 7d 0a 0a 2f 2f 20  Y, Z, R); }..// 
8470: 49 4e 53 45 52 54 0a 74 72 69 67 67 65 72 5f 63  INSERT.trigger_c
8480: 6d 64 28 41 29 20 3a 3a 3d 20 69 6e 73 65 72 74  md(A) ::= insert
8490: 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 6e 6d 28  _cmd(R) INTO nm(
84a0: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
84b0: 74 28 46 29 20 0a 20 20 20 20 20 20 20 20 20 20  t(F) .          
84c0: 20 20 20 20 20 20 20 20 20 56 41 4c 55 45 53 20           VALUES 
84d0: 4c 50 20 69 74 65 6d 6c 69 73 74 28 59 29 20 52  LP itemlist(Y) R
84e0: 50 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  P.  .           
84f0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
8500: 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65  TriggerInsertSte
8510: 70 28 26 58 2c 20 46 2c 20 59 2c 20 30 2c 20 52  p(&X, F, Y, 0, R
8520: 29 3b 7d 0a 0a 74 72 69 67 67 65 72 5f 63 6d 64  );}..trigger_cmd
8530: 28 41 29 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63  (A) ::= insert_c
8540: 6d 64 28 52 29 20 49 4e 54 4f 20 6e 6d 28 58 29  md(R) INTO nm(X)
8550: 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28   inscollist_opt(
8560: 46 29 20 73 65 6c 65 63 74 28 53 29 2e 0a 20 20  F) select(S)..  
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
8580: 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
8590: 49 6e 73 65 72 74 53 74 65 70 28 26 58 2c 20 46  InsertStep(&X, F
85a0: 2c 20 30 2c 20 53 2c 20 52 29 3b 7d 0a 0a 2f 2f  , 0, S, R);}..//
85b0: 20 44 45 4c 45 54 45 0a 74 72 69 67 67 65 72 5f   DELETE.trigger_
85c0: 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54  cmd(A) ::= DELET
85d0: 45 20 46 52 4f 4d 20 6e 6d 28 58 29 20 77 68 65  E FROM nm(X) whe
85e0: 72 65 5f 6f 70 74 28 59 29 2e 0a 20 20 20 20 20  re_opt(Y)..     
85f0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
8600: 71 6c 69 74 65 33 54 72 69 67 67 65 72 44 65 6c  qlite3TriggerDel
8610: 65 74 65 53 74 65 70 28 26 58 2c 20 59 29 3b 7d  eteStep(&X, Y);}
8620: 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a 74 72 69 67  ..// SELECT.trig
8630: 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 73  ger_cmd(A) ::= s
8640: 65 6c 65 63 74 28 58 29 2e 20 20 7b 41 20 3d 20  elect(X).  {A = 
8650: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 53 65  sqlite3TriggerSe
8660: 6c 65 63 74 53 74 65 70 28 58 29 3b 20 7d 0a 0a  lectStep(X); }..
8670: 2f 2f 20 54 68 65 20 73 70 65 63 69 61 6c 20 52  // The special R
8680: 41 49 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20  AISE expression 
8690: 74 68 61 74 20 6d 61 79 20 6f 63 63 75 72 20 69  that may occur i
86a0: 6e 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61  n trigger progra
86b0: 6d 73 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52  ms.expr(A) ::= R
86c0: 41 49 53 45 28 58 29 20 4c 50 20 49 47 4e 4f 52  AISE(X) LP IGNOR
86d0: 45 20 52 50 28 59 29 2e 20 20 7b 0a 20 20 41 20  E RP(Y).  {.  A 
86e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
86f0: 5f 52 41 49 53 45 2c 20 30 2c 20 30 2c 20 30 29  _RAISE, 0, 0, 0)
8700: 3b 20 0a 20 20 69 66 28 20 41 20 29 7b 0a 20 20  ; .  if( A ){.  
8710: 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 4f    A->iColumn = O
8720: 45 5f 49 67 6e 6f 72 65 3b 0a 20 20 20 20 73 71  E_Ignore;.    sq
8730: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
8740: 20 26 58 2c 20 26 59 29 3b 0a 20 20 7d 0a 7d 0a   &X, &Y);.  }.}.
8750: 65 78 70 72 28 41 29 20 3a 3a 3d 20 52 41 49 53  expr(A) ::= RAIS
8760: 45 28 58 29 20 4c 50 20 72 61 69 73 65 74 79 70  E(X) LP raisetyp
8770: 65 28 54 29 20 43 4f 4d 4d 41 20 6e 6d 28 5a 29  e(T) COMMA nm(Z)
8780: 20 52 50 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d   RP(Y).  {.  A =
8790: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
87a0: 52 41 49 53 45 2c 20 30 2c 20 30 2c 20 26 5a 29  RAISE, 0, 0, &Z)
87b0: 3b 20 0a 20 20 69 66 28 20 41 20 29 20 7b 0a 20  ; .  if( A ) {. 
87c0: 20 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     A->iColumn = 
87d0: 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  T;.    sqlite3Ex
87e0: 70 72 53 70 61 6e 28 41 2c 20 26 58 2c 20 26 59  prSpan(A, &X, &Y
87f0: 29 3b 0a 20 20 7d 0a 7d 0a 25 65 6e 64 69 66 20  );.  }.}.%endif 
8800: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
8810: 49 47 47 45 52 0a 0a 25 74 79 70 65 20 72 61 69  IGGER..%type rai
8820: 73 65 74 79 70 65 20 7b 69 6e 74 7d 0a 72 61 69  setype {int}.rai
8830: 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52 4f  setype(A) ::= RO
8840: 4c 4c 42 41 43 4b 2e 20 20 7b 41 20 3d 20 4f 45  LLBACK.  {A = OE
8850: 5f 52 6f 6c 6c 62 61 63 6b 3b 7d 0a 72 61 69 73  _Rollback;}.rais
8860: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 41 42 4f  etype(A) ::= ABO
8870: 52 54 2e 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f  RT.     {A = OE_
8880: 41 62 6f 72 74 3b 7d 0a 72 61 69 73 65 74 79 70  Abort;}.raisetyp
8890: 65 28 41 29 20 3a 3a 3d 20 46 41 49 4c 2e 20 20  e(A) ::= FAIL.  
88a0: 20 20 20 20 7b 41 20 3d 20 4f 45 5f 46 61 69 6c      {A = OE_Fail
88b0: 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}...///////////
88c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 20 44  /////////////  D
88d0: 52 4f 50 20 54 52 49 47 47 45 52 20 73 74 61 74  ROP TRIGGER stat
88e0: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
88f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8900: 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c  ////.%ifndef SQL
8910: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
8920: 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 52  .cmd ::= DROP TR
8930: 49 47 47 45 52 20 69 66 65 78 69 73 74 73 28 4e  IGGER ifexists(N
8940: 4f 45 52 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58  OERR) fullname(X
8950: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72  ). {.  sqlite3Dr
8960: 6f 70 54 72 69 67 67 65 72 28 70 50 61 72 73 65  opTrigger(pParse
8970: 2c 58 2c 4e 4f 45 52 52 29 3b 0a 7d 0a 25 65 6e  ,X,NOERR);.}.%en
8980: 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f 4d 49  dif  !SQLITE_OMI
8990: 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2f 2f 2f 2f  T_TRIGGER../////
89a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
89b0: 2f 2f 2f 20 41 54 54 41 43 48 20 44 41 54 41 42  /// ATTACH DATAB
89c0: 41 53 45 20 66 69 6c 65 20 41 53 20 6e 61 6d 65  ASE file AS name
89d0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
89e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64 20 3a  //////////.cmd :
89f0: 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61 62 61  := ATTACH databa
8a00: 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 46  se_kw_opt expr(F
8a10: 29 20 41 53 20 65 78 70 72 28 44 29 20 6b 65 79  ) AS expr(D) key
8a20: 5f 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71 6c  _opt(K). {.  sql
8a30: 69 74 65 33 41 74 74 61 63 68 28 70 50 61 72 73  ite3Attach(pPars
8a40: 65 2c 20 46 2c 20 44 2c 20 4b 29 3b 0a 7d 0a 25  e, F, D, K);.}.%
8a50: 74 79 70 65 20 6b 65 79 5f 6f 70 74 20 7b 45 78  type key_opt {Ex
8a60: 70 72 20 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  pr *}.%destructo
8a70: 72 20 6b 65 79 5f 6f 70 74 20 7b 73 71 6c 69 74  r key_opt {sqlit
8a80: 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24 29  e3ExprDelete($$)
8a90: 3b 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20 3a 3a  ;}.key_opt(A) ::
8aa0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
8ab0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 30 3b          { A = 0;
8ac0: 20 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20 3a 3a   }.key_opt(A) ::
8ad0: 3d 20 4b 45 59 20 65 78 70 72 28 58 29 2e 20 20  = KEY expr(X).  
8ae0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 58 3b          { A = X;
8af0: 20 7d 0a 0a 64 61 74 61 62 61 73 65 5f 6b 77 5f   }..database_kw_
8b00: 6f 70 74 20 3a 3a 3d 20 44 41 54 41 42 41 53 45  opt ::= DATABASE
8b10: 2e 0a 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70  ..database_kw_op
8b20: 74 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f  t ::= ...///////
8b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8b40: 2f 20 44 45 54 41 43 48 20 44 41 54 41 42 41 53  / DETACH DATABAS
8b50: 45 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  E name /////////
8b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8b70: 2f 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64 20 3a 3a 3d  ////////.cmd ::=
8b80: 20 44 45 54 41 43 48 20 64 61 74 61 62 61 73 65   DETACH database
8b90: 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 44 29 2e  _kw_opt expr(D).
8ba0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 74 61   {.  sqlite3Deta
8bb0: 63 68 28 70 50 61 72 73 65 2c 20 44 29 3b 0a 7d  ch(pParse, D);.}
8bc0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
8bd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 52 45 49  //////////// REI
8be0: 4e 44 45 58 20 63 6f 6c 6c 61 74 69 6f 6e 20 2f  NDEX collation /
8bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8c10: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
8c20: 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 63 6d  _OMIT_REINDEX.cm
8c30: 64 20 3a 3a 3d 20 52 45 49 4e 44 45 58 2e 20 20  d ::= REINDEX.  
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
8c50: 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 70 50  qlite3Reindex(pP
8c60: 61 72 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63 6d  arse, 0, 0);}.cm
8c70: 64 20 3a 3a 3d 20 52 45 49 4e 44 45 58 20 6e 6d  d ::= REINDEX nm
8c80: 28 58 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b 73  (X) dbnm(Y).  {s
8c90: 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 70 50  qlite3Reindex(pP
8ca0: 61 72 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d 0a  arse, &X, &Y);}.
8cb0: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
8cc0: 4d 49 54 5f 52 45 49 4e 44 45 58 0a 0a 2f 2f 2f  MIT_REINDEX..///
8cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8cf0: 20 41 4e 41 4c 59 5a 45 20 2f 2f 2f 2f 2f 2f 2f   ANALYZE ///////
8d00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66  ////////////.%if
8d20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8d30: 5f 41 4e 41 4c 59 5a 45 0a 63 6d 64 20 3a 3a 3d  _ANALYZE.cmd ::=
8d40: 20 41 4e 41 4c 59 5a 45 2e 20 20 20 20 20 20 20   ANALYZE.       
8d50: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
8d60: 33 41 6e 61 6c 79 7a 65 28 70 50 61 72 73 65 2c  3Analyze(pParse,
8d70: 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d   0, 0);}.cmd ::=
8d80: 20 41 4e 41 4c 59 5a 45 20 6e 6d 28 58 29 20 64   ANALYZE nm(X) d
8d90: 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65  bnm(Y).  {sqlite
8da0: 33 41 6e 61 6c 79 7a 65 28 70 50 61 72 73 65 2c  3Analyze(pParse,
8db0: 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69   &X, &Y);}.%endi
8dc0: 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  f../////////////
8dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4c 54 45  /////////// ALTE
8de0: 52 20 54 41 42 4c 45 20 74 61 62 6c 65 20 2e 2e  R TABLE table ..
8df0: 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  . //////////////
8e00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8e10: 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  //.%ifndef SQLIT
8e20: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
8e30: 45 0a 63 6d 64 20 3a 3a 3d 20 41 4c 54 45 52 20  E.cmd ::= ALTER 
8e40: 54 41 42 4c 45 20 66 75 6c 6c 6e 61 6d 65 28 58  TABLE fullname(X
8e50: 29 20 52 45 4e 41 4d 45 20 54 4f 20 6e 6d 28 5a  ) RENAME TO nm(Z
8e60: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c  ). {.  sqlite3Al
8e70: 74 65 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 70  terRenameTable(p
8e80: 50 61 72 73 65 2c 58 2c 26 5a 29 3b 0a 7d 0a 63  Parse,X,&Z);.}.c
8e90: 6d 64 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42  md ::= ALTER TAB
8ea0: 4c 45 20 61 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75  LE add_column_fu
8eb0: 6c 6c 6e 61 6d 65 20 41 44 44 20 6b 77 63 6f 6c  llname ADD kwcol
8ec0: 75 6d 6e 5f 6f 70 74 20 63 6f 6c 75 6d 6e 28 59  umn_opt column(Y
8ed0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c  ). {.  sqlite3Al
8ee0: 74 65 72 46 69 6e 69 73 68 41 64 64 43 6f 6c 75  terFinishAddColu
8ef0: 6d 6e 28 70 50 61 72 73 65 2c 20 26 59 29 3b 0a  mn(pParse, &Y);.
8f00: 7d 0a 61 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c  }.add_column_ful
8f10: 6c 6e 61 6d 65 20 3a 3a 3d 20 66 75 6c 6c 6e 61  lname ::= fullna
8f20: 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74  me(X). {.  sqlit
8f30: 65 33 41 6c 74 65 72 42 65 67 69 6e 41 64 64 43  e3AlterBeginAddC
8f40: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 58 29  olumn(pParse, X)
8f50: 3b 0a 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74  ;.}.kwcolumn_opt
8f60: 20 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f   ::= ..kwcolumn_
8f70: 6f 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57  opt ::= COLUMNKW
8f80: 2e 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  ..%endif  SQLITE
8f90: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
8fa0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
8fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54  ////////// CREAT
8fc0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
8fd0: 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ... ////////////
8fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8ff0: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
9000: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
9010: 4c 45 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74  LE.cmd ::= creat
9020: 65 5f 76 74 61 62 2e 20 20 20 20 20 20 20 20 20  e_vtab.         
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
9040: 71 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68  qlite3VtabFinish
9050: 50 61 72 73 65 28 70 50 61 72 73 65 2c 30 29 3b  Parse(pParse,0);
9060: 7d 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65  }.cmd ::= create
9070: 5f 76 74 61 62 20 4c 50 20 76 74 61 62 61 72 67  _vtab LP vtabarg
9080: 6c 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71  list RP(X).  {sq
9090: 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50  lite3VtabFinishP
90a0: 61 72 73 65 28 70 50 61 72 73 65 2c 26 58 29 3b  arse(pParse,&X);
90b0: 7d 0a 63 72 65 61 74 65 5f 76 74 61 62 20 3a 3a  }.create_vtab ::
90c0: 3d 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c  = CREATE VIRTUAL
90d0: 20 54 41 42 4c 45 20 6e 6d 28 58 29 20 64 62 6e   TABLE nm(X) dbn
90e0: 6d 28 59 29 20 55 53 49 4e 47 20 6e 6d 28 5a 29  m(Y) USING nm(Z)
90f0: 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  . {.    sqlite3V
9100: 74 61 62 42 65 67 69 6e 50 61 72 73 65 28 70 50  tabBeginParse(pP
9110: 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a  arse, &X, &Y, &Z
9120: 29 3b 0a 7d 0a 76 74 61 62 61 72 67 6c 69 73 74  );.}.vtabarglist
9130: 20 3a 3a 3d 20 76 74 61 62 61 72 67 2e 0a 76 74   ::= vtabarg..vt
9140: 61 62 61 72 67 6c 69 73 74 20 3a 3a 3d 20 76 74  abarglist ::= vt
9150: 61 62 61 72 67 6c 69 73 74 20 43 4f 4d 4d 41 20  abarglist COMMA 
9160: 76 74 61 62 61 72 67 2e 0a 76 74 61 62 61 72 67  vtabarg..vtabarg
9170: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
9180: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
9190: 6c 69 74 65 33 56 74 61 62 41 72 67 49 6e 69 74  lite3VtabArgInit
91a0: 28 70 50 61 72 73 65 29 3b 7d 0a 76 74 61 62 61  (pParse);}.vtaba
91b0: 72 67 20 3a 3a 3d 20 76 74 61 62 61 72 67 20 76  rg ::= vtabarg v
91c0: 74 61 62 61 72 67 74 6f 6b 65 6e 2e 0a 76 74 61  tabargtoken..vta
91d0: 62 61 72 67 74 6f 6b 65 6e 20 3a 3a 3d 20 41 4e  bargtoken ::= AN
91e0: 59 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  Y(X).           
91f0: 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67   {sqlite3VtabArg
9200: 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58  Extend(pParse,&X
9210: 29 3b 7d 0a 76 74 61 62 61 72 67 74 6f 6b 65 6e  );}.vtabargtoken
9220: 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c 69 73 74 20   ::= lp anylist 
9230: 52 50 28 58 29 2e 20 20 7b 73 71 6c 69 74 65 33  RP(X).  {sqlite3
9240: 56 74 61 62 41 72 67 45 78 74 65 6e 64 28 70 50  VtabArgExtend(pP
9250: 61 72 73 65 2c 26 58 29 3b 7d 0a 6c 70 20 3a 3a  arse,&X);}.lp ::
9260: 3d 20 4c 50 28 58 29 2e 20 20 20 20 20 20 20 20  = LP(X).        
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
9280: 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 45 78  sqlite3VtabArgEx
9290: 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58 29 3b  tend(pParse,&X);
92a0: 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 2e 0a  }.anylist ::= ..
92b0: 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61 6e 79 6c  anylist ::= anyl
92c0: 69 73 74 20 41 4e 59 28 58 29 2e 20 20 20 20 20  ist ANY(X).     
92d0: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62      {sqlite3Vtab
92e0: 41 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65  ArgExtend(pParse
92f0: 2c 26 58 29 3b 7d 0a 25 65 6e 64 69 66 20 20 53  ,&X);}.%endif  S
9300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9310: 41 4c 54 41 42 4c 45 0a                          ALTABLE.