/ Hex Artifact Content
Login

Artifact 1770b8673c652756b2dd5bcec16f0bf741e5e879:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 53 51 4c  ile contains SQL
0190: 69 74 65 27 73 20 67 72 61 6d 6d 61 72 20 66 6f  ite's grammar fo
01a0: 72 20 53 51 4c 2e 20 20 50 72 6f 63 65 73 73 20  r SQL.  Process 
01b0: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 75 73 69  this file.** usi
01c0: 6e 67 20 74 68 65 20 6c 65 6d 6f 6e 20 70 61 72  ng the lemon par
01d0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 74 6f  ser generator to
01e0: 20 67 65 6e 65 72 61 74 65 20 43 20 63 6f 64 65   generate C code
01f0: 20 74 68 61 74 20 72 75 6e 73 0a 2a 2a 20 74 68   that runs.** th
0200: 65 20 70 61 72 73 65 72 2e 20 20 4c 65 6d 6f 6e  e parser.  Lemon
0210: 20 77 69 6c 6c 20 61 6c 73 6f 20 67 65 6e 65 72   will also gener
0220: 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69 6c  ate a header fil
0230: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20  e containing.** 
0240: 6e 75 6d 65 72 69 63 20 63 6f 64 65 73 20 66 6f  numeric codes fo
0250: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 6f 6b  r all of the tok
0260: 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20  ens..**.** @(#) 
0270: 24 49 64 3a 20 70 61 72 73 65 2e 79 2c 76 20 31  $Id: parse.y,v 1
0280: 2e 31 37 30 20 32 30 30 35 2f 30 33 2f 32 39 20  .170 2005/03/29 
0290: 30 33 3a 31 30 3a 35 39 20 64 61 6e 69 65 6c 6b  03:10:59 danielk
02a0: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 25 74  1977 Exp $.*/.%t
02b0: 6f 6b 65 6e 5f 70 72 65 66 69 78 20 54 4b 5f 0a  oken_prefix TK_.
02c0: 25 74 6f 6b 65 6e 5f 74 79 70 65 20 7b 54 6f 6b  %token_type {Tok
02d0: 65 6e 7d 0a 25 64 65 66 61 75 6c 74 5f 74 79 70  en}.%default_typ
02e0: 65 20 7b 54 6f 6b 65 6e 7d 0a 25 65 78 74 72 61  e {Token}.%extra
02f0: 5f 61 72 67 75 6d 65 6e 74 20 7b 50 61 72 73 65  _argument {Parse
0300: 20 2a 70 50 61 72 73 65 7d 0a 25 73 79 6e 74 61   *pParse}.%synta
0310: 78 5f 65 72 72 6f 72 20 7b 0a 20 20 69 66 28 20  x_error {.  if( 
0320: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 3d  pParse->zErrMsg=
0330: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 54 4f  =0 ){.    if( TO
0340: 4b 45 4e 2e 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  KEN.z[0] ){.    
0350: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
0360: 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20  g(pParse, "near 
0370: 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65  \"%T\": syntax e
0380: 72 72 6f 72 22 2c 20 26 54 4f 4b 45 4e 29 3b 0a  rror", &TOKEN);.
0390: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
03a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
03b0: 28 70 50 61 72 73 65 2c 20 22 69 6e 63 6f 6d 70  (pParse, "incomp
03c0: 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65  lete SQL stateme
03d0: 6e 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nt");.    }.  }.
03e0: 7d 0a 25 6e 61 6d 65 20 73 71 6c 69 74 65 33 50  }.%name sqlite3P
03f0: 61 72 73 65 72 0a 25 69 6e 63 6c 75 64 65 20 7b  arser.%include {
0400: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0410: 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65  eInt.h".#include
0420: 20 22 70 61 72 73 65 2e 68 22 0a 0a 2f 2a 0a 2a   "parse.h"../*.*
0430: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0440: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0450: 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  holds informatio
0460: 6e 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a 20 4c  n about the.** L
0470: 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 66 20 61  IMIT clause of a
0480: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
0490: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c 69 6d  t..*/.struct Lim
04a0: 69 74 56 61 6c 20 7b 0a 20 20 45 78 70 72 20 2a  itVal {.  Expr *
04b0: 70 4c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 54 68  pLimit;    /* Th
04c0: 65 20 4c 49 4d 49 54 20 65 78 70 72 65 73 73 69  e LIMIT expressi
04d0: 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66 20 74 68 65  on.  NULL if the
04e0: 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 2a  re is no limit *
04f0: 2f 0a 20 20 45 78 70 72 20 2a 70 4f 66 66 73 65  /.  Expr *pOffse
0500: 74 3b 20 20 20 2f 2a 20 54 68 65 20 4f 46 46 53  t;   /* The OFFS
0510: 45 54 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  ET expression.  
0520: 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
0530: 20 6e 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   none */.};../*.
0540: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
0550: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
0560: 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
0570: 65 20 74 68 65 20 4c 49 4b 45 2c 0a 2a 2a 20 47  e the LIKE,.** G
0580: 4c 4f 42 2c 20 4e 4f 54 20 4c 49 4b 45 2c 20 61  LOB, NOT LIKE, a
0590: 6e 64 20 4e 4f 54 20 47 4c 4f 42 20 6f 70 65 72  nd NOT GLOB oper
05a0: 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ators..*/.struct
05b0: 20 4c 69 6b 65 4f 70 20 7b 0a 20 20 69 6e 74 20   LikeOp {.  int 
05c0: 6f 70 63 6f 64 65 3b 20 20 20 2f 2a 20 45 69 74  opcode;   /* Eit
05d0: 68 65 72 20 54 4b 5f 47 4c 4f 42 20 6f 72 20 54  her TK_GLOB or T
05e0: 4b 5f 4c 49 4b 45 20 2a 2f 0a 20 20 69 6e 74 20  K_LIKE */.  int 
05f0: 6e 6f 74 3b 20 20 20 20 20 20 2f 2a 20 54 72 75  not;      /* Tru
0600: 65 20 69 66 20 74 68 65 20 4e 4f 54 20 6b 65 79  e if the NOT key
0610: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
0620: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
0630: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
0640: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
0650: 75 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ure describes th
0660: 65 20 65 76 65 6e 74 20 6f 66 20 61 0a 2a 2a 20  e event of a.** 
0670: 54 52 49 47 47 45 52 2e 20 20 22 61 22 20 69 73  TRIGGER.  "a" is
0680: 20 74 68 65 20 65 76 65 6e 74 20 74 79 70 65 2c   the event type,
0690: 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54   one of TK_UPDAT
06a0: 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c 0a 2a 2a  E, TK_INSERT,.**
06b0: 20 54 4b 5f 44 45 4c 45 54 45 2c 20 6f 72 20 54   TK_DELETE, or T
06c0: 4b 5f 49 4e 53 54 45 41 44 2e 20 20 49 66 20 74  K_INSTEAD.  If t
06d0: 68 65 20 65 76 65 6e 74 20 69 73 20 6f 66 20 74  he event is of t
06e0: 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20  he form.**.**   
06f0: 20 20 20 55 50 44 41 54 45 20 4f 4e 20 28 61 2c     UPDATE ON (a,
0700: 62 2c 63 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  b,c).**.** Then 
0710: 74 68 65 20 22 62 22 20 49 64 4c 69 73 74 20 72  the "b" IdList r
0720: 65 63 6f 72 64 73 20 74 68 65 20 6c 69 73 74 20  ecords the list 
0730: 22 61 2c 62 2c 63 22 2e 0a 2a 2f 0a 73 74 72 75  "a,b,c"..*/.stru
0740: 63 74 20 54 72 69 67 45 76 65 6e 74 20 7b 20 69  ct TrigEvent { i
0750: 6e 74 20 61 3b 20 49 64 4c 69 73 74 20 2a 20 62  nt a; IdList * b
0760: 3b 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ; };../*.** An i
0770: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0780: 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20  structure holds 
0790: 74 68 65 20 41 54 54 41 43 48 20 6b 65 79 20 61  the ATTACH key a
07a0: 6e 64 20 74 68 65 20 6b 65 79 20 74 79 70 65 2e  nd the key type.
07b0: 0a 2a 2f 0a 73 74 72 75 63 74 20 41 74 74 61 63  .*/.struct Attac
07c0: 68 4b 65 79 20 7b 20 69 6e 74 20 74 79 70 65 3b  hKey { int type;
07d0: 20 20 54 6f 6b 65 6e 20 6b 65 79 3b 20 7d 3b 0a    Token key; };.
07e0: 0a 7d 20 2f 2f 20 65 6e 64 20 25 69 6e 63 6c 75  .} // end %inclu
07f0: 64 65 0a 0a 2f 2f 20 54 68 65 73 65 20 61 72 65  de..// These are
0800: 20 65 78 74 72 61 20 74 6f 6b 65 6e 73 20 75 73   extra tokens us
0810: 65 64 20 62 79 20 74 68 65 20 6c 65 78 65 72 20  ed by the lexer 
0820: 62 75 74 20 6e 65 76 65 72 20 73 65 65 6e 20 62  but never seen b
0830: 79 20 74 68 65 0a 2f 2f 20 70 61 72 73 65 72 2e  y the.// parser.
0840: 20 20 57 65 20 70 75 74 20 74 68 65 6d 20 69 6e    We put them in
0850: 20 61 20 72 75 6c 65 20 73 6f 20 74 68 61 74 20   a rule so that 
0860: 74 68 65 20 70 61 72 73 65 72 20 67 65 6e 65 72  the parser gener
0870: 61 74 6f 72 20 77 69 6c 6c 0a 2f 2f 20 61 64 64  ator will.// add
0880: 20 74 68 65 6d 20 74 6f 20 74 68 65 20 70 61 72   them to the par
0890: 73 65 2e 68 20 6f 75 74 70 75 74 20 66 69 6c 65  se.h output file
08a0: 2e 0a 2f 2f 0a 25 6e 6f 6e 61 73 73 6f 63 20 45  ..//.%nonassoc E
08b0: 4e 44 5f 4f 46 5f 46 49 4c 45 20 49 4c 4c 45 47  ND_OF_FILE ILLEG
08c0: 41 4c 20 53 50 41 43 45 20 55 4e 43 4c 4f 53 45  AL SPACE UNCLOSE
08d0: 44 5f 53 54 52 49 4e 47 20 43 4f 4d 4d 45 4e 54  D_STRING COMMENT
08e0: 20 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20   FUNCTION.      
08f0: 20 20 20 20 43 4f 4c 55 4d 4e 20 41 47 47 5f 46      COLUMN AGG_F
0900: 55 4e 43 54 49 4f 4e 2e 0a 0a 2f 2f 20 49 6e 70  UNCTION...// Inp
0910: 75 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 53  ut is a single S
0920: 51 4c 20 63 6f 6d 6d 61 6e 64 0a 69 6e 70 75 74  QL command.input
0930: 20 3a 3a 3d 20 63 6d 64 6c 69 73 74 2e 0a 63 6d   ::= cmdlist..cm
0940: 64 6c 69 73 74 20 3a 3a 3d 20 63 6d 64 6c 69 73  dlist ::= cmdlis
0950: 74 20 65 63 6d 64 2e 0a 63 6d 64 6c 69 73 74 20  t ecmd..cmdlist 
0960: 3a 3a 3d 20 65 63 6d 64 2e 0a 63 6d 64 78 20 3a  ::= ecmd..cmdx :
0970: 3a 3d 20 63 6d 64 2e 20 20 20 20 20 20 20 20 20  := cmd.         
0980: 20 20 7b 20 73 71 6c 69 74 65 33 46 69 6e 69 73    { sqlite3Finis
0990: 68 43 6f 64 69 6e 67 28 70 50 61 72 73 65 29 3b  hCoding(pParse);
09a0: 20 7d 0a 65 63 6d 64 20 3a 3a 3d 20 53 45 4d 49   }.ecmd ::= SEMI
09b0: 2e 0a 65 63 6d 64 20 3a 3a 3d 20 65 78 70 6c 61  ..ecmd ::= expla
09c0: 69 6e 20 63 6d 64 78 20 53 45 4d 49 2e 0a 65 78  in cmdx SEMI..ex
09d0: 70 6c 61 69 6e 20 3a 3a 3d 20 2e 20 20 20 20 20  plain ::= .     
09e0: 20 20 20 20 20 20 7b 20 73 71 6c 69 74 65 33 42        { sqlite3B
09f0: 65 67 69 6e 50 61 72 73 65 28 70 50 61 72 73 65  eginParse(pParse
0a00: 2c 20 30 29 3b 20 7d 0a 25 69 66 6e 64 65 66 20  , 0); }.%ifndef 
0a10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
0a20: 41 49 4e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20  AIN.explain ::= 
0a30: 45 58 50 4c 41 49 4e 2e 20 20 20 20 7b 20 73 71  EXPLAIN.    { sq
0a40: 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28  lite3BeginParse(
0a50: 70 50 61 72 73 65 2c 20 31 29 3b 20 7d 0a 25 65  pParse, 1); }.%e
0a60: 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ndif..//////////
0a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69  /////////// Begi
0a80: 6e 20 61 6e 64 20 65 6e 64 20 74 72 61 6e 73 61  n and end transa
0a90: 63 74 69 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f  ctions. ////////
0aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0ab0: 2f 2f 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d  ////.//..cmd ::=
0ac0: 20 42 45 47 49 4e 20 74 72 61 6e 73 74 79 70 65   BEGIN transtype
0ad0: 28 59 29 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20  (Y) trans_opt.  
0ae0: 7b 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61  {sqlite3BeginTra
0af0: 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  nsaction(pParse,
0b00: 20 59 29 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74 20   Y);}.trans_opt 
0b10: 3a 3a 3d 20 2e 0a 74 72 61 6e 73 5f 6f 70 74 20  ::= ..trans_opt 
0b20: 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e 2e  ::= TRANSACTION.
0b30: 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54  .trans_opt ::= T
0b40: 52 41 4e 53 41 43 54 49 4f 4e 20 6e 6d 2e 0a 25  RANSACTION nm..%
0b50: 74 79 70 65 20 74 72 61 6e 73 74 79 70 65 20 7b  type transtype {
0b60: 69 6e 74 7d 0a 74 72 61 6e 73 74 79 70 65 28 41  int}.transtype(A
0b70: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
0b80: 20 20 20 20 7b 41 20 3d 20 54 4b 5f 44 45 46 45      {A = TK_DEFE
0b90: 52 52 45 44 3b 7d 0a 74 72 61 6e 73 74 79 70 65  RRED;}.transtype
0ba0: 28 41 29 20 3a 3a 3d 20 44 45 46 45 52 52 45 44  (A) ::= DEFERRED
0bb0: 28 58 29 2e 20 20 7b 41 20 3d 20 40 58 3b 7d 0a  (X).  {A = @X;}.
0bc0: 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d  transtype(A) ::=
0bd0: 20 49 4d 4d 45 44 49 41 54 45 28 58 29 2e 20 7b   IMMEDIATE(X). {
0be0: 41 20 3d 20 40 58 3b 7d 0a 74 72 61 6e 73 74 79  A = @X;}.transty
0bf0: 70 65 28 41 29 20 3a 3a 3d 20 45 58 43 4c 55 53  pe(A) ::= EXCLUS
0c00: 49 56 45 28 58 29 2e 20 7b 41 20 3d 20 40 58 3b  IVE(X). {A = @X;
0c10: 7d 0a 63 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54  }.cmd ::= COMMIT
0c20: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20   trans_opt.     
0c30: 20 7b 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54   {sqlite3CommitT
0c40: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73  ransaction(pPars
0c50: 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 45 4e 44  e);}.cmd ::= END
0c60: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20   trans_opt.     
0c70: 20 20 20 20 7b 73 71 6c 69 74 65 33 43 6f 6d 6d      {sqlite3Comm
0c80: 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  itTransaction(pP
0c90: 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  arse);}.cmd ::= 
0ca0: 52 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73 5f 6f  ROLLBACK trans_o
0cb0: 70 74 2e 20 20 20 20 7b 73 71 6c 69 74 65 33 52  pt.    {sqlite3R
0cc0: 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69  ollbackTransacti
0cd0: 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a 0a 2f 2f  on(pParse);}..//
0ce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0cf0: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 54  /// The CREATE T
0d00: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2f  ABLE statement /
0d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
0d30: 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61  md ::= create_ta
0d40: 62 6c 65 20 63 72 65 61 74 65 5f 74 61 62 6c 65  ble create_table
0d50: 5f 61 72 67 73 2e 0a 63 72 65 61 74 65 5f 74 61  _args..create_ta
0d60: 62 6c 65 20 3a 3a 3d 20 43 52 45 41 54 45 28 58  ble ::= CREATE(X
0d70: 29 20 74 65 6d 70 28 54 29 20 54 41 42 4c 45 20  ) temp(T) TABLE 
0d80: 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 2e 20 7b  nm(Y) dbnm(Z). {
0d90: 0a 20 20 20 73 71 6c 69 74 65 33 53 74 61 72 74  .   sqlite3Start
0da0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 26 58 2c  Table(pParse,&X,
0db0: 26 59 2c 26 5a 2c 54 2c 30 29 3b 0a 7d 0a 25 74  &Y,&Z,T,0);.}.%t
0dc0: 79 70 65 20 74 65 6d 70 20 7b 69 6e 74 7d 0a 25  ype temp {int}.%
0dd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0de0: 49 54 5f 54 45 4d 50 44 42 0a 74 65 6d 70 28 41  IT_TEMPDB.temp(A
0df0: 29 20 3a 3a 3d 20 54 45 4d 50 2e 20 20 7b 41 20  ) ::= TEMP.  {A 
0e00: 3d 20 31 3b 7d 0a 25 65 6e 64 69 66 0a 74 65 6d  = 1;}.%endif.tem
0e10: 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  p(A) ::= .      
0e20: 7b 41 20 3d 20 30 3b 7d 0a 63 72 65 61 74 65 5f  {A = 0;}.create_
0e30: 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 4c  table_args ::= L
0e40: 50 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 63 6f 6e  P columnlist con
0e50: 73 6c 69 73 74 5f 6f 70 74 28 58 29 20 52 50 28  slist_opt(X) RP(
0e60: 59 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45  Y). {.  sqlite3E
0e70: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 26  ndTable(pParse,&
0e80: 58 2c 26 59 2c 30 29 3b 0a 7d 0a 63 72 65 61 74  X,&Y,0);.}.creat
0e90: 65 5f 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d  e_table_args ::=
0ea0: 20 41 53 20 73 65 6c 65 63 74 28 53 29 2e 20 7b   AS select(S). {
0eb0: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
0ec0: 6c 65 28 70 50 61 72 73 65 2c 30 2c 30 2c 53 29  le(pParse,0,0,S)
0ed0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
0ee0: 74 44 65 6c 65 74 65 28 53 29 3b 0a 7d 0a 63 6f  tDelete(S);.}.co
0ef0: 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c  lumnlist ::= col
0f00: 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63 6f  umnlist COMMA co
0f10: 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e 6c 69 73 74  lumn..columnlist
0f20: 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e 0a 0a 2f 2f   ::= column...//
0f30: 20 41 62 6f 75 74 20 74 68 65 20 6f 6e 6c 79 20   About the only 
0f40: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64  information used
0f50: 20 66 6f 72 20 61 20 63 6f 6c 75 6d 6e 20 69 73   for a column is
0f60: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0f70: 0a 2f 2f 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  .// column.  The
0f80: 20 74 79 70 65 20 69 73 20 61 6c 77 61 79 73 20   type is always 
0f90: 6a 75 73 74 20 22 74 65 78 74 22 2e 20 20 42 75  just "text".  Bu
0fa0: 74 20 74 68 65 20 63 6f 64 65 20 77 69 6c 6c 20  t the code will 
0fb0: 61 63 63 65 70 74 0a 2f 2f 20 61 6e 20 65 6c 61  accept.// an ela
0fc0: 62 6f 72 61 74 65 20 74 79 70 65 6e 61 6d 65 2e  borate typename.
0fd0: 20 20 50 65 72 68 61 70 73 20 73 6f 6d 65 64 61    Perhaps someda
0fe0: 79 20 77 65 27 6c 6c 20 64 6f 20 73 6f 6d 65 74  y we'll do somet
0ff0: 68 69 6e 67 20 77 69 74 68 20 69 74 2e 0a 2f 2f  hing with it..//
1000: 0a 63 6f 6c 75 6d 6e 28 41 29 20 3a 3a 3d 20 63  .column(A) ::= c
1010: 6f 6c 75 6d 6e 69 64 28 58 29 20 74 79 70 65 20  olumnid(X) type 
1020: 63 61 72 67 6c 69 73 74 2e 20 7b 0a 20 20 41 2e  carglist. {.  A.
1030: 7a 20 3d 20 58 2e 7a 3b 0a 20 20 41 2e 6e 20 3d  z = X.z;.  A.n =
1040: 20 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54   (pParse->sLastT
1050: 6f 6b 65 6e 2e 7a 2d 58 2e 7a 29 20 2b 20 70 50  oken.z-X.z) + pP
1060: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1070: 2e 6e 3b 0a 7d 0a 63 6f 6c 75 6d 6e 69 64 28 41  .n;.}.columnid(A
1080: 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 7b 0a 20  ) ::= nm(X). {. 
1090: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
10a0: 6e 28 70 50 61 72 73 65 2c 26 58 29 3b 0a 20 20  n(pParse,&X);.  
10b0: 41 20 3d 20 58 3b 0a 7d 0a 0a 0a 2f 2f 20 41 6e  A = X;.}...// An
10c0: 20 49 44 45 4e 54 49 46 49 45 52 20 63 61 6e 20   IDENTIFIER can 
10d0: 62 65 20 61 20 67 65 6e 65 72 69 63 20 69 64 65  be a generic ide
10e0: 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20  ntifier, or one 
10f0: 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65  of several.// ke
1100: 79 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e  ywords.  Any non
1110: 2d 73 74 61 6e 64 61 72 64 20 6b 65 79 77 6f 72  -standard keywor
1120: 64 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e  d can also be an
1130: 20 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 0a   identifier..//.
1140: 25 74 79 70 65 20 69 64 20 7b 54 6f 6b 65 6e 7d  %type id {Token}
1150: 0a 69 64 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  .id(A) ::= ID(X)
1160: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
1170: 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f  ;}..// The follo
1180: 77 69 6e 67 20 64 69 72 65 63 74 69 76 65 20 63  wing directive c
1190: 61 75 73 65 73 20 74 6f 6b 65 6e 73 20 41 42 4f  auses tokens ABO
11a0: 52 54 2c 20 41 46 54 45 52 2c 20 41 53 43 2c 20  RT, AFTER, ASC, 
11b0: 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61 6c 6c 62  etc. to.// fallb
11c0: 61 63 6b 20 74 6f 20 49 44 20 69 66 20 74 68 65  ack to ID if the
11d0: 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61 72 73 65  y will not parse
11e0: 20 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e   as their origin
11f0: 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20 54 68 69  al value..// Thi
1200: 73 20 6f 62 76 69 61 74 65 73 20 74 68 65 20 6e  s obviates the n
1210: 65 65 64 20 66 6f 72 20 74 68 65 20 22 69 64 22  eed for the "id"
1220: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2f 2f   nonterminal..//
1230: 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44 0a 20 20  .%fallback ID.  
1240: 41 42 4f 52 54 20 41 46 54 45 52 20 41 53 43 20  ABORT AFTER ASC 
1250: 41 54 54 41 43 48 20 42 45 46 4f 52 45 20 42 45  ATTACH BEFORE BE
1260: 47 49 4e 20 43 41 53 43 41 44 45 20 43 4f 4e 46  GIN CASCADE CONF
1270: 4c 49 43 54 0a 20 20 44 41 54 41 42 41 53 45 20  LICT.  DATABASE 
1280: 44 45 46 45 52 52 45 44 20 44 45 53 43 20 44 45  DEFERRED DESC DE
1290: 54 41 43 48 20 45 41 43 48 20 45 4e 44 20 45 58  TACH EACH END EX
12a0: 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49 4e 20  CLUSIVE EXPLAIN 
12b0: 46 41 49 4c 20 46 4f 52 0a 20 20 47 4c 4f 42 20  FAIL FOR.  GLOB 
12c0: 49 47 4e 4f 52 45 20 49 4d 4d 45 44 49 41 54 45  IGNORE IMMEDIATE
12d0: 20 49 4e 49 54 49 41 4c 4c 59 20 49 4e 53 54 45   INITIALLY INSTE
12e0: 41 44 20 4c 49 4b 45 20 4d 41 54 43 48 20 4b 45  AD LIKE MATCH KE
12f0: 59 0a 20 20 4f 46 20 4f 46 46 53 45 54 20 50 52  Y.  OF OFFSET PR
1300: 41 47 4d 41 20 52 41 49 53 45 20 52 45 50 4c 41  AGMA RAISE REPLA
1310: 43 45 20 52 45 53 54 52 49 43 54 20 52 4f 57 20  CE RESTRICT ROW 
1320: 53 54 41 54 45 4d 45 4e 54 0a 20 20 54 45 4d 50  STATEMENT.  TEMP
1330: 20 54 52 49 47 47 45 52 20 56 41 43 55 55 4d 20   TRIGGER VACUUM 
1340: 56 49 45 57 0a 25 69 66 64 65 66 20 53 51 4c 49  VIEW.%ifdef SQLI
1350: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
1360: 5f 53 45 4c 45 43 54 0a 20 20 45 58 43 45 50 54  _SELECT.  EXCEPT
1370: 20 49 4e 54 45 52 53 45 43 54 20 55 4e 49 4f 4e   INTERSECT UNION
1380: 0a 25 65 6e 64 69 66 0a 20 20 52 45 49 4e 44 45  .%endif.  REINDE
1390: 58 20 52 45 4e 41 4d 45 20 43 44 41 54 45 20 43  X RENAME CDATE C
13a0: 54 49 4d 45 20 43 54 49 4d 45 53 54 41 4d 50 20  TIME CTIMESTAMP 
13b0: 41 4c 54 45 52 0a 20 20 2e 0a 0a 2f 2f 20 44 65  ALTER.  ...// De
13c0: 66 69 6e 65 20 6f 70 65 72 61 74 6f 72 20 70 72  fine operator pr
13d0: 65 63 65 64 65 6e 63 65 20 65 61 72 6c 79 20 73  ecedence early s
13e0: 6f 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74  o that this is t
13f0: 68 65 20 66 69 72 73 74 20 6f 63 63 75 72 61 6e  he first occuran
1400: 63 65 0a 2f 2f 20 6f 66 20 74 68 65 20 6f 70 65  ce.// of the ope
1410: 72 61 74 6f 72 20 74 6f 6b 65 6e 73 20 69 6e 20  rator tokens in 
1420: 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 4b 65  the grammer.  Ke
1430: 65 70 69 6e 67 20 74 68 65 20 6f 70 65 72 61 74  eping the operat
1440: 6f 72 73 20 74 6f 67 65 74 68 65 72 0a 2f 2f 20  ors together.// 
1450: 63 61 75 73 65 73 20 74 68 65 6d 20 74 6f 20 62  causes them to b
1460: 65 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65 67  e assigned integ
1470: 65 72 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  er values that a
1480: 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68 65  re close togethe
1490: 72 2c 0a 2f 2f 20 77 68 69 63 68 20 6b 65 65 70  r,.// which keep
14a0: 73 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20  s parser tables 
14b0: 73 6d 61 6c 6c 65 72 2e 0a 2f 2f 0a 2f 2f 20 54  smaller..//.// T
14c0: 68 65 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20  he token values 
14d0: 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 73  assigned to thes
14e0: 65 20 73 79 6d 62 6f 6c 73 20 69 73 20 64 65 74  e symbols is det
14f0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
1500: 72 64 65 72 0a 2f 2f 20 69 6e 20 77 68 69 63 68  rder.// in which
1510: 20 6c 65 6d 6f 6e 20 66 69 72 73 74 20 73 65 65   lemon first see
1520: 73 20 74 68 65 6d 2e 20 20 49 74 20 6d 75 73 74  s them.  It must
1530: 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
1540: 74 20 49 53 4e 55 4c 4c 2f 4e 4f 54 4e 55 4c 4c  t ISNULL/NOTNULL
1550: 2c 0a 2f 2f 20 4e 45 2f 45 51 2c 20 47 54 2f 4c  ,.// NE/EQ, GT/L
1560: 45 2c 20 61 6e 64 20 47 45 2f 4c 54 20 61 72 65  E, and GE/LT are
1570: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 6f 6e   separated by on
1580: 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75  ly a single valu
1590: 65 2e 20 20 53 65 65 0a 2f 2f 20 74 68 65 20 73  e.  See.// the s
15a0: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
15b0: 65 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  e() routine for 
15c0: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
15d0: 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 69 73 0a 2f  mation on this./
15e0: 2f 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2f 2f  / constraint..//
15f0: 0a 25 6c 65 66 74 20 4f 52 2e 0a 25 6c 65 66 74  .%left OR..%left
1600: 20 41 4e 44 2e 0a 25 72 69 67 68 74 20 4e 4f 54   AND..%right NOT
1610: 2e 0a 25 6c 65 66 74 20 49 53 20 4c 49 4b 45 20  ..%left IS LIKE 
1620: 47 4c 4f 42 20 42 45 54 57 45 45 4e 20 49 4e 20  GLOB BETWEEN IN 
1630: 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 4e  ISNULL NOTNULL N
1640: 45 20 45 51 2e 0a 25 6c 65 66 74 20 47 54 20 4c  E EQ..%left GT L
1650: 45 20 4c 54 20 47 45 2e 0a 25 72 69 67 68 74 20  E LT GE..%right 
1660: 45 53 43 41 50 45 2e 0a 25 6c 65 66 74 20 42 49  ESCAPE..%left BI
1670: 54 41 4e 44 20 42 49 54 4f 52 20 4c 53 48 49 46  TAND BITOR LSHIF
1680: 54 20 52 53 48 49 46 54 2e 0a 25 6c 65 66 74 20  T RSHIFT..%left 
1690: 50 4c 55 53 20 4d 49 4e 55 53 2e 0a 25 6c 65 66  PLUS MINUS..%lef
16a0: 74 20 53 54 41 52 20 53 4c 41 53 48 20 52 45 4d  t STAR SLASH REM
16b0: 2e 0a 25 6c 65 66 74 20 43 4f 4e 43 41 54 2e 0a  ..%left CONCAT..
16c0: 25 72 69 67 68 74 20 55 4d 49 4e 55 53 20 55 50  %right UMINUS UP
16d0: 4c 55 53 20 42 49 54 4e 4f 54 2e 0a 0a 2f 2f 20  LUS BITNOT...// 
16e0: 41 6e 64 20 22 69 64 73 22 20 69 73 20 61 6e 20  And "ids" is an 
16f0: 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d 73 74 72  identifer-or-str
1700: 69 6e 67 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64  ing..//.%type id
1710: 73 20 7b 54 6f 6b 65 6e 7d 0a 69 64 73 28 41 29  s {Token}.ids(A)
1720: 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20 20 20 20   ::= ID(X).     
1730: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 73 28     {A = X;}.ids(
1740: 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29  A) ::= STRING(X)
1750: 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f  .    {A = X;}../
1760: 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  / The name of a 
1770: 63 6f 6c 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20  column or table 
1780: 63 61 6e 20 62 65 20 61 6e 79 20 6f 66 20 74 68  can be any of th
1790: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a  e following:.//.
17a0: 25 74 79 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d  %type nm {Token}
17b0: 0a 6e 6d 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  .nm(A) ::= ID(X)
17c0: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
17d0: 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52  ;}.nm(A) ::= STR
17e0: 49 4e 47 28 58 29 2e 20 20 20 20 20 7b 41 20 3d  ING(X).     {A =
17f0: 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a   X;}.nm(A) ::= J
1800: 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20 7b 41  OIN_KW(X).    {A
1810: 20 3d 20 58 3b 7d 0a 0a 74 79 70 65 20 3a 3a 3d   = X;}..type ::=
1820: 20 2e 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65   ..type ::= type
1830: 6e 61 6d 65 28 58 29 2e 20 20 20 20 20 20 20 20  name(X).        
1840: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
1850: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
1860: 65 28 70 50 61 72 73 65 2c 26 58 2c 26 58 29 3b  e(pParse,&X,&X);
1870: 7d 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e  }.type ::= typen
1880: 61 6d 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64  ame(X) LP signed
1890: 20 52 50 28 59 29 2e 20 20 20 20 7b 73 71 6c 69   RP(Y).    {sqli
18a0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
18b0: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 29 3b 7d  (pParse,&X,&Y);}
18c0: 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61  .type ::= typena
18d0: 6d 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20  me(X) LP signed 
18e0: 43 4f 4d 4d 41 20 73 69 67 6e 65 64 20 52 50 28  COMMA signed RP(
18f0: 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y)..            
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
1920: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
1930: 70 65 28 70 50 61 72 73 65 2c 26 58 2c 26 59 29  pe(pParse,&X,&Y)
1940: 3b 7d 0a 25 74 79 70 65 20 74 79 70 65 6e 61 6d  ;}.%type typenam
1950: 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61  e {Token}.typena
1960: 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73 28 58 29  me(A) ::= ids(X)
1970: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
1980: 20 3d 20 58 3b 7d 0a 74 79 70 65 6e 61 6d 65 28   = X;}.typename(
1990: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
19a0: 58 29 20 69 64 73 28 59 29 2e 20 7b 41 2e 7a 3d  X) ids(Y). {A.z=
19b0: 58 2e 7a 3b 20 41 2e 6e 3d 59 2e 6e 2b 28 59 2e  X.z; A.n=Y.n+(Y.
19c0: 7a 2d 58 2e 7a 29 3b 7d 0a 25 74 79 70 65 20 73  z-X.z);}.%type s
19d0: 69 67 6e 65 64 20 7b 69 6e 74 7d 0a 73 69 67 6e  igned {int}.sign
19e0: 65 64 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6e  ed(A) ::= plus_n
19f0: 75 6d 28 58 29 2e 20 20 20 20 7b 20 41 20 3d 20  um(X).    { A = 
1a00: 61 74 6f 69 28 58 2e 7a 29 3b 20 7d 0a 73 69 67  atoi(X.z); }.sig
1a10: 6e 65 64 28 41 29 20 3a 3a 3d 20 6d 69 6e 75 73  ned(A) ::= minus
1a20: 5f 6e 75 6d 28 58 29 2e 20 20 20 7b 20 41 20 3d  _num(X).   { A =
1a30: 20 2d 61 74 6f 69 28 58 2e 7a 29 3b 20 7d 0a 63   -atoi(X.z); }.c
1a40: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67  arglist ::= carg
1a50: 6c 69 73 74 20 63 61 72 67 2e 0a 63 61 72 67 6c  list carg..cargl
1a60: 69 73 74 20 3a 3a 3d 20 2e 0a 63 61 72 67 20 3a  ist ::= ..carg :
1a70: 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d  := CONSTRAINT nm
1a80: 20 63 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d   ccons..carg ::=
1a90: 20 63 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d   ccons..carg ::=
1aa0: 20 44 45 46 41 55 4c 54 20 74 65 72 6d 28 58 29   DEFAULT term(X)
1ab0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71  .            {sq
1ac0: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
1ad0: 61 6c 75 65 28 70 50 61 72 73 65 2c 58 29 3b 7d  alue(pParse,X);}
1ae0: 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c  .carg ::= DEFAUL
1af0: 54 20 50 4c 55 53 20 74 65 72 6d 28 58 29 2e 20  T PLUS term(X). 
1b00: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
1b10: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
1b20: 61 72 73 65 2c 58 29 3b 7d 0a 63 61 72 67 20 3a  arse,X);}.carg :
1b30: 3a 3d 20 44 45 46 41 55 4c 54 20 4d 49 4e 55 53  := DEFAULT MINUS
1b40: 20 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20 7b   term(X).      {
1b50: 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c  .  Expr *p = sql
1b60: 69 74 65 33 45 78 70 72 28 54 4b 5f 55 4d 49 4e  ite3Expr(TK_UMIN
1b70: 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  US, X, 0, 0);.  
1b80: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
1b90: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 70 29  tValue(pParse,p)
1ba0: 3b 0a 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46  ;.}.carg ::= DEF
1bb0: 41 55 4c 54 20 69 64 28 58 29 2e 20 20 20 20 20  AULT id(X).     
1bc0: 20 20 20 20 20 20 20 20 20 7b 0a 20 20 45 78 70           {.  Exp
1bd0: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
1be0: 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c  pr(TK_STRING, 0,
1bf0: 20 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74   0, &X);.  sqlit
1c00: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
1c10: 65 28 70 50 61 72 73 65 2c 70 29 3b 0a 7d 0a 0a  e(pParse,p);.}..
1c20: 2f 2f 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  // In addition t
1c30: 6f 20 74 68 65 20 74 79 70 65 20 6e 61 6d 65 2c  o the type name,
1c40: 20 77 65 20 61 6c 73 6f 20 63 61 72 65 20 61 62   we also care ab
1c50: 6f 75 74 20 74 68 65 20 70 72 69 6d 61 72 79 20  out the primary 
1c60: 6b 65 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 55  key and.// UNIQU
1c70: 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2f  E constraints../
1c80: 2f 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 55 4c 4c  /.ccons ::= NULL
1c90: 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a   onconf..ccons :
1ca0: 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f  := NOT NULL onco
1cb0: 6e 66 28 52 29 2e 20 20 20 20 20 20 20 20 20 20  nf(R).          
1cc0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64       {sqlite3Add
1cd0: 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  NotNull(pParse, 
1ce0: 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 50  R);}.ccons ::= P
1cf0: 52 49 4d 41 52 59 20 4b 45 59 20 73 6f 72 74 6f  RIMARY KEY sorto
1d00: 72 64 65 72 20 6f 6e 63 6f 6e 66 28 52 29 20 61  rder onconf(R) a
1d10: 75 74 6f 69 6e 63 28 49 29 2e 0a 20 20 20 20 20  utoinc(I)..     
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 7b 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61  {sqlite3AddPrima
1d50: 72 79 4b 65 79 28 70 50 61 72 73 65 2c 30 2c 52  ryKey(pParse,0,R
1d60: 2c 49 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,I);}.ccons ::= 
1d70: 55 4e 49 51 55 45 20 6f 6e 63 6f 6e 66 28 52 29  UNIQUE onconf(R)
1d80: 2e 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69  .          {sqli
1d90: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
1da0: 50 61 72 73 65 2c 30 2c 30 2c 30 2c 30 2c 52 2c  Parse,0,0,0,0,R,
1db0: 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d  0,0);}.ccons ::=
1dc0: 20 43 48 45 43 4b 20 4c 50 20 65 78 70 72 28 58   CHECK LP expr(X
1dd0: 29 20 52 50 20 6f 6e 63 6f 6e 66 2e 20 7b 73 71  ) RP onconf. {sq
1de0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1df0: 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 52  X);}.ccons ::= R
1e00: 45 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29 20  EFERENCES nm(T) 
1e10: 69 64 78 6c 69 73 74 5f 6f 70 74 28 54 41 29 20  idxlist_opt(TA) 
1e20: 72 65 66 61 72 67 73 28 52 29 2e 0a 20 20 20 20  refargs(R)..    
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
1e50: 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
1e60: 6e 4b 65 79 28 70 50 61 72 73 65 2c 30 2c 26 54  nKey(pParse,0,&T
1e70: 2c 54 41 2c 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a  ,TA,R);}.ccons :
1e80: 3a 3d 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75  := defer_subclau
1e90: 73 65 28 44 29 2e 20 20 20 7b 73 71 6c 69 74 65  se(D).   {sqlite
1ea0: 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
1eb0: 28 70 50 61 72 73 65 2c 44 29 3b 7d 0a 63 63 6f  (pParse,D);}.cco
1ec0: 6e 73 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20 69  ns ::= COLLATE i
1ed0: 64 28 43 29 2e 20 20 7b 73 71 6c 69 74 65 33 41  d(C).  {sqlite3A
1ee0: 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 70 50  ddCollateType(pP
1ef0: 61 72 73 65 2c 20 43 2e 7a 2c 20 43 2e 6e 29 3b  arse, C.z, C.n);
1f00: 7d 0a 0a 2f 2f 20 54 68 65 20 6f 70 74 69 6f 6e  }..// The option
1f10: 61 6c 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  al AUTOINCREMENT
1f20: 20 6b 65 79 77 6f 72 64 0a 25 74 79 70 65 20 61   keyword.%type a
1f30: 75 74 6f 69 6e 63 20 7b 69 6e 74 7d 0a 61 75 74  utoinc {int}.aut
1f40: 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 2e 20 20 20  oinc(X) ::= .   
1f50: 20 20 20 20 20 20 20 7b 58 20 3d 20 30 3b 7d 0a         {X = 0;}.
1f60: 61 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 41  autoinc(X) ::= A
1f70: 55 54 4f 49 4e 43 52 2e 20 20 7b 58 20 3d 20 31  UTOINCR.  {X = 1
1f80: 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e 65 78 74 20  ;}..// The next 
1f90: 67 72 6f 75 70 20 6f 66 20 72 75 6c 65 73 20 70  group of rules p
1fa0: 61 72 73 65 73 20 74 68 65 20 61 72 67 75 6d 65  arses the argume
1fb0: 6e 74 73 20 74 6f 20 61 20 52 45 46 45 52 45 4e  nts to a REFEREN
1fc0: 43 45 53 20 63 6c 61 75 73 65 0a 2f 2f 20 74 68  CES clause.// th
1fd0: 61 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  at determine if 
1fe0: 74 68 65 20 72 65 66 65 72 65 6e 74 69 61 6c 20  the referential 
1ff0: 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69  integrity checki
2000: 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 20 6f  ng is deferred o
2010: 72 0a 2f 2f 20 6f 72 20 69 6d 6d 65 64 69 61 74  r.// or immediat
2020: 65 20 61 6e 64 20 77 68 69 63 68 20 64 65 74 65  e and which dete
2030: 72 6d 69 6e 65 20 77 68 61 74 20 61 63 74 69 6f  rmine what actio
2040: 6e 20 74 6f 20 74 61 6b 65 20 69 66 20 61 20 72  n to take if a r
2050: 65 66 2d 69 6e 74 65 67 0a 2f 2f 20 63 68 65 63  ef-integ.// chec
2060: 6b 20 66 61 69 6c 73 2e 0a 2f 2f 0a 25 74 79 70  k fails..//.%typ
2070: 65 20 72 65 66 61 72 67 73 20 7b 69 6e 74 7d 0a  e refargs {int}.
2080: 72 65 66 61 72 67 73 28 41 29 20 3a 3a 3d 20 2e  refargs(A) ::= .
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65       { A = OE_Re
20b0: 73 74 72 69 63 74 20 2a 20 30 78 30 31 30 31 30  strict * 0x01010
20c0: 31 3b 20 7d 0a 72 65 66 61 72 67 73 28 41 29 20  1; }.refargs(A) 
20d0: 3a 3a 3d 20 72 65 66 61 72 67 73 28 58 29 20 72  ::= refargs(X) r
20e0: 65 66 61 72 67 28 59 29 2e 20 7b 20 41 20 3d 20  efarg(Y). { A = 
20f0: 28 58 20 26 20 59 2e 6d 61 73 6b 29 20 7c 20 59  (X & Y.mask) | Y
2100: 2e 76 61 6c 75 65 3b 20 7d 0a 25 74 79 70 65 20  .value; }.%type 
2110: 72 65 66 61 72 67 20 7b 73 74 72 75 63 74 20 7b  refarg {struct {
2120: 69 6e 74 20 76 61 6c 75 65 3b 20 69 6e 74 20 6d  int value; int m
2130: 61 73 6b 3b 7d 7d 0a 72 65 66 61 72 67 28 41 29  ask;}}.refarg(A)
2140: 20 3a 3a 3d 20 4d 41 54 43 48 20 6e 6d 2e 20 20   ::= MATCH nm.  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 2e              { A.
2160: 76 61 6c 75 65 20 3d 20 30 3b 20 20 20 20 20 41  value = 0;     A
2170: 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 30 30  .mask = 0x000000
2180: 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a  ; }.refarg(A) ::
2190: 3d 20 4f 4e 20 44 45 4c 45 54 45 20 72 65 66 61  = ON DELETE refa
21a0: 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c  ct(X).   { A.val
21b0: 75 65 20 3d 20 58 3b 20 20 20 20 20 41 2e 6d 61  ue = X;     A.ma
21c0: 73 6b 20 3d 20 30 78 30 30 30 30 66 66 3b 20 7d  sk = 0x0000ff; }
21d0: 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f  .refarg(A) ::= O
21e0: 4e 20 55 50 44 41 54 45 20 72 65 66 61 63 74 28  N UPDATE refact(
21f0: 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20  X).   { A.value 
2200: 3d 20 58 3c 3c 38 3b 20 20 41 2e 6d 61 73 6b 20  = X<<8;  A.mask 
2210: 3d 20 30 78 30 30 66 66 30 30 3b 20 7d 0a 72 65  = 0x00ff00; }.re
2220: 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 49  farg(A) ::= ON I
2230: 4e 53 45 52 54 20 72 65 66 61 63 74 28 58 29 2e  NSERT refact(X).
2240: 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58     { A.value = X
2250: 3c 3c 31 36 3b 20 41 2e 6d 61 73 6b 20 3d 20 30  <<16; A.mask = 0
2260: 78 66 66 30 30 30 30 3b 20 7d 0a 25 74 79 70 65  xff0000; }.%type
2270: 20 72 65 66 61 63 74 20 7b 69 6e 74 7d 0a 72 65   refact {int}.re
2280: 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45 54 20  fact(A) ::= SET 
2290: 4e 55 4c 4c 2e 20 20 20 20 20 20 20 20 20 20 20  NULL.           
22a0: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74 4e     { A = OE_SetN
22b0: 75 6c 6c 3b 20 7d 0a 72 65 66 61 63 74 28 41 29  ull; }.refact(A)
22c0: 20 3a 3a 3d 20 53 45 54 20 44 45 46 41 55 4c 54   ::= SET DEFAULT
22d0: 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20  .           { A 
22e0: 3d 20 4f 45 5f 53 65 74 44 66 6c 74 3b 20 7d 0a  = OE_SetDflt; }.
22f0: 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 43 41  refact(A) ::= CA
2300: 53 43 41 44 45 2e 20 20 20 20 20 20 20 20 20 20  SCADE.          
2310: 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 43 61       { A = OE_Ca
2320: 73 63 61 64 65 3b 20 7d 0a 72 65 66 61 63 74 28  scade; }.refact(
2330: 41 29 20 3a 3a 3d 20 52 45 53 54 52 49 43 54 2e  A) ::= RESTRICT.
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
2350: 41 20 3d 20 4f 45 5f 52 65 73 74 72 69 63 74 3b  A = OE_Restrict;
2360: 20 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f 73   }.%type defer_s
2370: 75 62 63 6c 61 75 73 65 20 7b 69 6e 74 7d 0a 64  ubclause {int}.d
2380: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 41  efer_subclause(A
2390: 29 20 3a 3a 3d 20 4e 4f 54 20 44 45 46 45 52 52  ) ::= NOT DEFERR
23a0: 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72 72  ABLE init_deferr
23b0: 65 64 5f 70 72 65 64 5f 6f 70 74 28 58 29 2e 20  ed_pred_opt(X). 
23c0: 20 7b 41 20 3d 20 58 3b 7d 0a 64 65 66 65 72 5f   {A = X;}.defer_
23d0: 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d  subclause(A) ::=
23e0: 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e 69 74   DEFERRABLE init
23f0: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f  _deferred_pred_o
2400: 70 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d  pt(X).      {A =
2410: 20 58 3b 7d 0a 25 74 79 70 65 20 69 6e 69 74 5f   X;}.%type init_
2420: 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70  deferred_pred_op
2430: 74 20 7b 69 6e 74 7d 0a 69 6e 69 74 5f 64 65 66  t {int}.init_def
2440: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41  erred_pred_opt(A
2450: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
2470: 20 3d 20 30 3b 7d 0a 69 6e 69 74 5f 64 65 66 65   = 0;}.init_defe
2480: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29  rred_pred_opt(A)
2490: 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 44   ::= INITIALLY D
24a0: 45 46 45 52 52 45 44 2e 20 20 20 20 20 7b 41 20  EFERRED.     {A 
24b0: 3d 20 31 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 72  = 1;}.init_defer
24c0: 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 20  red_pred_opt(A) 
24d0: 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  ::= INITIALLY IM
24e0: 4d 45 44 49 41 54 45 2e 20 20 20 20 7b 41 20 3d  MEDIATE.    {A =
24f0: 20 30 3b 7d 0a 0a 2f 2f 20 46 6f 72 20 74 68 65   0;}..// For the
2500: 20 74 69 6d 65 20 62 65 69 6e 67 2c 20 74 68 65   time being, the
2510: 20 6f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74   only constraint
2520: 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20 69   we care about i
2530: 73 20 74 68 65 20 70 72 69 6d 61 72 79 0a 2f 2f  s the primary.//
2540: 20 6b 65 79 20 61 6e 64 20 55 4e 49 51 55 45 2e   key and UNIQUE.
2550: 20 20 42 6f 74 68 20 63 72 65 61 74 65 20 69 6e    Both create in
2560: 64 69 63 65 73 2e 0a 2f 2f 0a 63 6f 6e 73 6c 69  dices..//.consli
2570: 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  st_opt(A) ::= . 
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 7b 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20    {A.n = 0; A.z 
25a0: 3d 20 30 3b 7d 0a 63 6f 6e 73 6c 69 73 74 5f 6f  = 0;}.conslist_o
25b0: 70 74 28 41 29 20 3a 3a 3d 20 43 4f 4d 4d 41 28  pt(A) ::= COMMA(
25c0: 58 29 20 63 6f 6e 73 6c 69 73 74 2e 20 20 7b 41  X) conslist.  {A
25d0: 20 3d 20 58 3b 7d 0a 63 6f 6e 73 6c 69 73 74 20   = X;}.conslist 
25e0: 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 43 4f 4d  ::= conslist COM
25f0: 4d 41 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69  MA tcons..consli
2600: 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20  st ::= conslist 
2610: 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20  tcons..conslist 
2620: 3a 3a 3d 20 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73  ::= tcons..tcons
2630: 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20   ::= CONSTRAINT 
2640: 6e 6d 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50 52  nm..tcons ::= PR
2650: 49 4d 41 52 59 20 4b 45 59 20 4c 50 20 69 64 78  IMARY KEY LP idx
2660: 6c 69 73 74 28 58 29 20 61 75 74 6f 69 6e 63 28  list(X) autoinc(
2670: 49 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e  I) RP onconf(R).
2680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
26b0: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
26c0: 70 50 61 72 73 65 2c 58 2c 52 2c 49 29 3b 7d 0a  pParse,X,R,I);}.
26d0: 74 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45  tcons ::= UNIQUE
26e0: 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52   LP idxlist(X) R
26f0: 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20  P onconf(R)..   
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61      {sqlite3Crea
2730: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 30  teIndex(pParse,0
2740: 2c 30 2c 30 2c 58 2c 52 2c 30 2c 30 29 3b 7d 0a  ,0,0,X,R,0,0);}.
2750: 74 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20  tcons ::= CHECK 
2760: 65 78 70 72 20 6f 6e 63 6f 6e 66 2e 0a 74 63 6f  expr onconf..tco
2770: 6e 73 20 3a 3a 3d 20 46 4f 52 45 49 47 4e 20 4b  ns ::= FOREIGN K
2780: 45 59 20 4c 50 20 69 64 78 6c 69 73 74 28 46 41  EY LP idxlist(FA
2790: 29 20 52 50 0a 20 20 20 20 20 20 20 20 20 20 52  ) RP.          R
27a0: 45 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29 20  EFERENCES nm(T) 
27b0: 69 64 78 6c 69 73 74 5f 6f 70 74 28 54 41 29 20  idxlist_opt(TA) 
27c0: 72 65 66 61 72 67 73 28 52 29 20 64 65 66 65 72  refargs(R) defer
27d0: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 44  _subclause_opt(D
27e0: 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ). {.    sqlite3
27f0: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
2800: 28 70 50 61 72 73 65 2c 20 46 41 2c 20 26 54 2c  (pParse, FA, &T,
2810: 20 54 41 2c 20 52 29 3b 0a 20 20 20 20 73 71 6c   TA, R);.    sql
2820: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
2830: 4b 65 79 28 70 50 61 72 73 65 2c 20 44 29 3b 0a  Key(pParse, D);.
2840: 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f 73 75  }.%type defer_su
2850: 62 63 6c 61 75 73 65 5f 6f 70 74 20 7b 69 6e 74  bclause_opt {int
2860: 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  }.defer_subclaus
2870: 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  e_opt(A) ::= .  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72    {A = 0;}.defer
28a0: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 41  _subclause_opt(A
28b0: 29 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62 63  ) ::= defer_subc
28c0: 6c 61 75 73 65 28 58 29 2e 20 20 7b 41 20 3d 20  lause(X).  {A = 
28d0: 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c  X;}..// The foll
28e0: 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73  owing is a non-s
28f0: 74 61 6e 64 61 72 64 20 65 78 74 65 6e 73 69 6f  tandard extensio
2900: 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73  n that allows us
2910: 20 74 6f 20 64 65 63 6c 61 72 65 20 74 68 65 0a   to declare the.
2920: 2f 2f 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  // default behav
2930: 69 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20 69  ior when there i
2940: 73 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  s a constraint c
2950: 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70  onflict..//.%typ
2960: 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25  e onconf {int}.%
2970: 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74  type orconf {int
2980: 7d 0a 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74  }.%type resolvet
2990: 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66  ype {int}.onconf
29a0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44         {A = OE_D
29d0: 65 66 61 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28  efault;}.onconf(
29e0: 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49  A) ::= ON CONFLI
29f0: 43 54 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58  CT resolvetype(X
2a00: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f  ).    {A = X;}.o
2a10: 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20  rconf(A) ::= .  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
2a40: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72   OE_Default;}.or
2a50: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72  conf(A) ::= OR r
2a60: 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20  esolvetype(X).  
2a70: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2a80: 58 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28  X;}.resolvetype(
2a90: 41 29 20 3a 3a 3d 20 72 61 69 73 65 74 79 70 65  A) ::= raisetype
2aa0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
2ab0: 20 7b 41 20 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76   {A = X;}.resolv
2ac0: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 49 47 4e  etype(A) ::= IGN
2ad0: 4f 52 45 2e 20 20 20 20 20 20 20 20 20 20 20 20  ORE.            
2ae0: 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 49         {A = OE_I
2af0: 67 6e 6f 72 65 3b 7d 0a 72 65 73 6f 6c 76 65 74  gnore;}.resolvet
2b00: 79 70 65 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41  ype(A) ::= REPLA
2b10: 43 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  CE.             
2b20: 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 52 65 70       {A = OE_Rep
2b30: 6c 61 63 65 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  lace;}..////////
2b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b50: 2f 2f 20 54 68 65 20 44 52 4f 50 20 54 41 42 4c  // The DROP TABL
2b60: 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  E //////////////
2b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b80: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
2b90: 3a 3d 20 44 52 4f 50 20 54 41 42 4c 45 20 66 75  := DROP TABLE fu
2ba0: 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73  llname(X). {.  s
2bb0: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
2bc0: 70 50 61 72 73 65 2c 20 58 2c 20 30 29 3b 0a 7d  pParse, X, 0);.}
2bd0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
2be0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41  /////// The CREA
2bf0: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
2c00: 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  t //////////////
2c10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
2c20: 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  //.%ifndef SQLIT
2c30: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 63 6d 64 20  E_OMIT_VIEW.cmd 
2c40: 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 20 74 65  ::= CREATE(X) te
2c50: 6d 70 28 54 29 20 56 49 45 57 20 6e 6d 28 59 29  mp(T) VIEW nm(Y)
2c60: 20 64 62 6e 6d 28 5a 29 20 41 53 20 73 65 6c 65   dbnm(Z) AS sele
2c70: 63 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74  ct(S). {.  sqlit
2c80: 65 33 43 72 65 61 74 65 56 69 65 77 28 70 50 61  e3CreateView(pPa
2c90: 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a 2c  rse, &X, &Y, &Z,
2ca0: 20 53 2c 20 54 29 3b 0a 7d 0a 63 6d 64 20 3a 3a   S, T);.}.cmd ::
2cb0: 3d 20 44 52 4f 50 20 56 49 45 57 20 66 75 6c 6c  = DROP VIEW full
2cc0: 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c  name(X). {.  sql
2cd0: 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 70 50  ite3DropTable(pP
2ce0: 61 72 73 65 2c 20 58 2c 20 31 29 3b 0a 7d 0a 25  arse, X, 1);.}.%
2cf0: 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f  endif // SQLITE_
2d00: 4f 4d 49 54 5f 56 49 45 57 0a 0a 2f 2f 2f 2f 2f  OMIT_VIEW../////
2d10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d20: 2f 2f 2f 20 54 68 65 20 53 45 4c 45 43 54 20 73  /// The SELECT s
2d30: 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f  tatement ///////
2d40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
2d60: 64 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e  d ::= select(X).
2d70: 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c    {.  sqlite3Sel
2d80: 65 63 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53  ect(pParse, X, S
2d90: 52 54 5f 43 61 6c 6c 62 61 63 6b 2c 20 30 2c 20  RT_Callback, 0, 
2da0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  0, 0, 0, 0);.  s
2db0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2dc0: 74 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20  te(X);.}..%type 
2dd0: 73 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d  select {Select*}
2de0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c  .%destructor sel
2df0: 65 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65  ect {sqlite3Sele
2e00: 63 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25  ctDelete($$);}.%
2e10: 74 79 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b  type oneselect {
2e20: 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75  Select*}.%destru
2e30: 63 74 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b  ctor oneselect {
2e40: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
2e50: 65 74 65 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63  ete($$);}..selec
2e60: 74 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65  t(A) ::= onesele
2e70: 63 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  ct(X).          
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
2e90: 20 58 3b 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c   X;}.%ifndef SQL
2ea0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
2eb0: 44 5f 53 45 4c 45 43 54 0a 73 65 6c 65 63 74 28  D_SELECT.select(
2ec0: 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29  A) ::= select(X)
2ed0: 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28   multiselect_op(
2ee0: 59 29 20 6f 6e 65 73 65 6c 65 63 74 28 5a 29 2e  Y) oneselect(Z).
2ef0: 20 20 7b 0a 20 20 69 66 28 20 5a 20 29 7b 0a 20    {.  if( Z ){. 
2f00: 20 20 20 5a 2d 3e 6f 70 20 3d 20 59 3b 0a 20 20     Z->op = Y;.  
2f10: 20 20 5a 2d 3e 70 50 72 69 6f 72 20 3d 20 58 3b    Z->pPrior = X;
2f20: 0a 20 20 7d 0a 20 20 41 20 3d 20 5a 3b 0a 7d 0a  .  }.  A = Z;.}.
2f30: 25 74 79 70 65 20 6d 75 6c 74 69 73 65 6c 65 63  %type multiselec
2f40: 74 5f 6f 70 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69  t_op {int}.multi
2f50: 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d  select_op(A) ::=
2f60: 20 55 4e 49 4f 4e 28 4f 50 29 2e 20 20 20 20 20   UNION(OP).     
2f70: 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a 6d 75 6c 74   {A = @OP;}.mult
2f80: 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a  iselect_op(A) ::
2f90: 3d 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 20 20  = UNION ALL.    
2fa0: 20 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b 7d 0a    {A = TK_ALL;}.
2fb0: 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41  multiselect_op(A
2fc0: 29 20 3a 3a 3d 20 49 4e 54 45 52 53 45 43 54 28  ) ::= INTERSECT(
2fd0: 4f 50 29 2e 20 20 7b 41 20 3d 20 40 4f 50 3b 7d  OP).  {A = @OP;}
2fe0: 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28  .multiselect_op(
2ff0: 41 29 20 3a 3a 3d 20 45 58 43 45 50 54 28 4f 50  A) ::= EXCEPT(OP
3000: 29 2e 20 20 20 20 20 7b 41 20 3d 20 40 4f 50 3b  ).     {A = @OP;
3010: 7d 0a 25 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49  }.%endif // SQLI
3020: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
3030: 5f 53 45 4c 45 43 54 0a 6f 6e 65 73 65 6c 65 63  _SELECT.oneselec
3040: 74 28 41 29 20 3a 3a 3d 20 53 45 4c 45 43 54 20  t(A) ::= SELECT 
3050: 64 69 73 74 69 6e 63 74 28 44 29 20 73 65 6c 63  distinct(D) selc
3060: 6f 6c 6c 69 73 74 28 57 29 20 66 72 6f 6d 28 58  ollist(W) from(X
3070: 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29 0a 20  ) where_opt(Y). 
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 67 72 6f 75 70 62 79 5f 6f 70 74 28 50 29 20 68  groupby_opt(P) h
30a0: 61 76 69 6e 67 5f 6f 70 74 28 51 29 20 6f 72 64  aving_opt(Q) ord
30b0: 65 72 62 79 5f 6f 70 74 28 5a 29 20 6c 69 6d 69  erby_opt(Z) limi
30c0: 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 41 20  t_opt(L). {.  A 
30d0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
30e0: 65 77 28 57 2c 58 2c 59 2c 50 2c 51 2c 5a 2c 44  ew(W,X,Y,P,Q,Z,D
30f0: 2c 4c 2e 70 4c 69 6d 69 74 2c 4c 2e 70 4f 66 66  ,L.pLimit,L.pOff
3100: 73 65 74 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20  set);.}..// The 
3110: 22 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e 74 65  "distinct" nonte
3120: 72 6d 69 6e 61 6c 20 69 73 20 74 72 75 65 20 28  rminal is true (
3130: 31 29 20 69 66 20 74 68 65 20 44 49 53 54 49 4e  1) if the DISTIN
3140: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 0a 2f 2f  CT keyword is.//
3150: 20 70 72 65 73 65 6e 74 20 61 6e 64 20 66 61 6c   present and fal
3160: 73 65 20 28 30 29 20 69 66 20 69 74 20 69 73 20  se (0) if it is 
3170: 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 64 69  not..//.%type di
3180: 73 74 69 6e 63 74 20 7b 69 6e 74 7d 0a 64 69 73  stinct {int}.dis
3190: 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44 49 53  tinct(A) ::= DIS
31a0: 54 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20 31 3b  TINCT.   {A = 1;
31b0: 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a  }.distinct(A) ::
31c0: 3d 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41  = ALL.        {A
31d0: 20 3d 20 30 3b 7d 0a 64 69 73 74 69 6e 63 74 28   = 0;}.distinct(
31e0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
31f0: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20     {A = 0;}..// 
3200: 73 65 6c 63 6f 6c 6c 69 73 74 20 69 73 20 61 20  selcollist is a 
3210: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
3220: 6f 6e 73 20 74 68 61 74 20 61 72 65 20 74 6f 20  ons that are to 
3230: 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
3240: 6e 0a 2f 2f 20 76 61 6c 75 65 73 20 6f 66 20 74  n.// values of t
3250: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
3260: 65 6e 74 2e 20 20 54 68 65 20 22 2a 22 20 69 6e  ent.  The "*" in
3270: 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65   statements like
3280: 0a 2f 2f 20 22 53 45 4c 45 43 54 20 2a 20 46 52  .// "SELECT * FR
3290: 4f 4d 20 2e 2e 2e 22 20 69 73 20 65 6e 63 6f 64  OM ..." is encod
32a0: 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20  ed as a special 
32b0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20  expression with 
32c0: 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f 66 20  an.// opcode of 
32d0: 54 4b 5f 41 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65  TK_ALL..//.%type
32e0: 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 45 78 70   selcollist {Exp
32f0: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
3300: 74 6f 72 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b  tor selcollist {
3310: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3320: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70  elete($$);}.%typ
3330: 65 20 73 63 6c 70 20 7b 45 78 70 72 4c 69 73 74  e sclp {ExprList
3340: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
3350: 63 6c 70 20 7b 73 71 6c 69 74 65 33 45 78 70 72  clp {sqlite3Expr
3360: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
3370: 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c  .sclp(A) ::= sel
3380: 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  collist(X) COMMA
3390: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
33a0: 20 3d 20 58 3b 7d 0a 73 63 6c 70 28 41 29 20 3a   = X;}.sclp(A) :
33b0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c      {A = 0;}.sel
33e0: 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  collist(A) ::= s
33f0: 63 6c 70 28 50 29 20 65 78 70 72 28 58 29 20 61  clp(P) expr(X) a
3400: 73 28 59 29 2e 20 20 20 20 20 7b 0a 20 20 20 41  s(Y).     {.   A
3410: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
3420: 73 74 41 70 70 65 6e 64 28 50 2c 58 2c 59 2e 6e  stAppend(P,X,Y.n
3430: 3f 26 59 3a 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c  ?&Y:0);.}.selcol
3440: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70  list(A) ::= sclp
3450: 28 50 29 20 53 54 41 52 2e 20 7b 0a 20 20 41 20  (P) STAR. {.  A 
3460: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
3470: 74 41 70 70 65 6e 64 28 50 2c 20 73 71 6c 69 74  tAppend(P, sqlit
3480: 65 33 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30  e3Expr(TK_ALL, 0
3490: 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 73  , 0, 0), 0);.}.s
34a0: 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d  elcollist(A) ::=
34b0: 20 73 63 6c 70 28 50 29 20 6e 6d 28 58 29 20 44   sclp(P) nm(X) D
34c0: 4f 54 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70  OT STAR. {.  Exp
34d0: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
34e0: 74 65 33 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20  te3Expr(TK_ALL, 
34f0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 45 78 70 72  0, 0, 0);.  Expr
3500: 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65   *pLeft = sqlite
3510: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
3520: 30 2c 20 26 58 29 3b 0a 20 20 41 20 3d 20 73 71  0, &X);.  A = sq
3530: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
3540: 65 6e 64 28 50 2c 20 73 71 6c 69 74 65 33 45 78  end(P, sqlite3Ex
3550: 70 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74  pr(TK_DOT, pLeft
3560: 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29  , pRight, 0), 0)
3570: 3b 0a 7d 0a 0a 2f 2f 20 41 6e 20 6f 70 74 69 6f  ;.}..// An optio
3580: 6e 20 22 41 53 20 3c 69 64 3e 22 20 70 68 72 61  n "AS <id>" phra
3590: 73 65 20 74 68 61 74 20 63 61 6e 20 66 6f 6c 6c  se that can foll
35a0: 6f 77 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 78  ow one of the ex
35b0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 0a 2f  pressions that./
35c0: 2f 20 64 65 66 69 6e 65 20 74 68 65 20 72 65 73  / define the res
35d0: 75 6c 74 20 73 65 74 2c 20 6f 72 20 6f 6e 65 20  ult set, or one 
35e0: 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  of the tables in
35f0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3600: 2e 0a 2f 2f 0a 25 74 79 70 65 20 61 73 20 7b 54  ..//.%type as {T
3610: 6f 6b 65 6e 7d 0a 61 73 28 58 29 20 3a 3a 3d 20  oken}.as(X) ::= 
3620: 41 53 20 6e 6d 28 59 29 2e 20 20 20 20 7b 58 20  AS nm(Y).    {X 
3630: 3d 20 59 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20  = Y;}.as(X) ::= 
3640: 69 64 73 28 59 29 2e 20 20 20 20 20 20 7b 58 20  ids(Y).      {X 
3650: 3d 20 59 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20  = Y;}.as(X) ::= 
3660: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 2e  .            {X.
3670: 6e 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20  n = 0;}...%type 
3680: 73 65 6c 74 61 62 6c 69 73 74 20 7b 53 72 63 4c  seltablist {SrcL
3690: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
36a0: 72 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 73 71  r seltablist {sq
36b0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
36c0: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73  te($$);}.%type s
36d0: 74 6c 5f 70 72 65 66 69 78 20 7b 53 72 63 4c 69  tl_prefix {SrcLi
36e0: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
36f0: 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 73 71 6c   stl_prefix {sql
3700: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
3710: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 66 72  e($$);}.%type fr
3720: 6f 6d 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  om {SrcList*}.%d
3730: 65 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b  estructor from {
3740: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
3750: 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f 20 41  lete($$);}..// A
3760: 20 63 6f 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63   complete FROM c
3770: 6c 61 75 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41  lause..//.from(A
3780: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
3790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
37b0: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
37c0: 28 2a 41 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20  (*A));}.from(A) 
37d0: 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c  ::= FROM seltabl
37e0: 69 73 74 28 58 29 2e 20 20 20 20 20 20 20 20 20  ist(X).         
37f0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a        {A = X;}..
3800: 2f 2f 20 22 73 65 6c 74 61 62 6c 69 73 74 22 20  // "seltablist" 
3810: 69 73 20 61 20 22 53 65 6c 65 63 74 20 54 61 62  is a "Select Tab
3820: 6c 65 20 4c 69 73 74 22 20 2d 20 74 68 65 20 63  le List" - the c
3830: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 46 52  ontent of the FR
3840: 4f 4d 20 63 6c 61 75 73 65 0a 2f 2f 20 69 6e 20  OM clause.// in 
3850: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
3860: 6e 74 2e 20 20 22 73 74 6c 5f 70 72 65 66 69 78  nt.  "stl_prefix
3870: 22 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  " is a prefix of
3880: 20 74 68 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a 73   this list..//.s
3890: 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a 3d  tl_prefix(A) ::=
38a0: 20 73 65 6c 74 61 62 6c 69 73 74 28 58 29 20 6a   seltablist(X) j
38b0: 6f 69 6e 6f 70 28 59 29 2e 20 20 20 20 7b 0a 20  oinop(Y).    {. 
38c0: 20 20 41 20 3d 20 58 3b 0a 20 20 20 69 66 28 20    A = X;.   if( 
38d0: 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 30 20 29  A && A->nSrc>0 )
38e0: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d   A->a[A->nSrc-1]
38f0: 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 59 3b 0a 7d  .jointype = Y;.}
3900: 0a 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a  .stl_prefix(A) :
3910: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
3920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
3930: 41 20 3d 20 30 3b 7d 0a 73 65 6c 74 61 62 6c 69  A = 0;}.seltabli
3940: 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72  st(A) ::= stl_pr
3950: 65 66 69 78 28 58 29 20 6e 6d 28 59 29 20 64 62  efix(X) nm(Y) db
3960: 6e 6d 28 44 29 20 61 73 28 5a 29 20 6f 6e 5f 6f  nm(D) as(Z) on_o
3970: 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28  pt(N) using_opt(
3980: 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  U). {.  A = sqli
3990: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
39a0: 28 58 2c 26 59 2c 26 44 29 3b 0a 20 20 69 66 28  (X,&Y,&D);.  if(
39b0: 20 5a 2e 6e 20 29 20 73 71 6c 69 74 65 33 53 72   Z.n ) sqlite3Sr
39c0: 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 41 2c  cListAddAlias(A,
39d0: 26 5a 29 3b 0a 20 20 69 66 28 20 4e 20 29 7b 0a  &Z);.  if( N ){.
39e0: 20 20 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e      if( A && A->
39f0: 6e 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41  nSrc>1 ){ A->a[A
3a00: 2d 3e 6e 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d 20  ->nSrc-2].pOn = 
3a10: 4e 3b 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b 20  N; }.    else { 
3a20: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3a30: 65 28 4e 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  e(N); }.  }.  if
3a40: 28 20 55 20 29 7b 0a 20 20 20 20 69 66 28 20 41  ( U ){.    if( A
3a50: 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b   && A->nSrc>1 ){
3a60: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d   A->a[A->nSrc-2]
3a70: 2e 70 55 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20  .pUsing = U; }. 
3a80: 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65     else { sqlite
3a90: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 55 29  3IdListDelete(U)
3aa0: 3b 20 7d 0a 20 20 7d 0a 7d 0a 25 69 66 6e 64 65  ; }.  }.}.%ifnde
3ab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
3ac0: 42 51 55 45 52 59 0a 20 20 73 65 6c 74 61 62 6c  BQUERY.  seltabl
3ad0: 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70  ist(A) ::= stl_p
3ae0: 72 65 66 69 78 28 58 29 20 4c 50 20 73 65 6c 74  refix(X) LP selt
3af0: 61 62 6c 69 73 74 5f 70 61 72 65 6e 28 53 29 20  ablist_paren(S) 
3b00: 52 50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RP.             
3b10: 20 20 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f         as(Z) on_
3b20: 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74  opt(N) using_opt
3b30: 28 55 29 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73  (U). {.    A = s
3b40: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
3b50: 65 6e 64 28 58 2c 30 2c 30 29 3b 0a 20 20 20 20  end(X,0,0);.    
3b60: 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e  A->a[A->nSrc-1].
3b70: 70 53 65 6c 65 63 74 20 3d 20 53 3b 0a 20 20 20  pSelect = S;.   
3b80: 20 69 66 28 20 5a 2e 6e 20 29 20 73 71 6c 69 74   if( Z.n ) sqlit
3b90: 65 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61  e3SrcListAddAlia
3ba0: 73 28 41 2c 26 5a 29 3b 0a 20 20 20 20 69 66 28  s(A,&Z);.    if(
3bb0: 20 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20   N ){.      if( 
3bc0: 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29  A && A->nSrc>1 )
3bd0: 7b 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32  { A->a[A->nSrc-2
3be0: 5d 2e 70 4f 6e 20 3d 20 4e 3b 20 7d 0a 20 20 20  ].pOn = N; }.   
3bf0: 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65     else { sqlite
3c00: 33 45 78 70 72 44 65 6c 65 74 65 28 4e 29 3b 20  3ExprDelete(N); 
3c10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
3c20: 55 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 41  U ){.      if( A
3c30: 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b   && A->nSrc>1 ){
3c40: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d   A->a[A->nSrc-2]
3c50: 2e 70 55 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20  .pUsing = U; }. 
3c60: 20 20 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69       else { sqli
3c70: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
3c80: 55 29 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a  U); }.    }.  }.
3c90: 20 20 0a 20 2f 2f 20 41 20 73 65 6c 74 61 62 6c    . // A seltabl
3ca0: 69 73 74 5f 70 61 72 65 6e 20 6e 6f 6e 74 65 72  ist_paren nonter
3cb0: 6d 69 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 73  minal represents
3cc0: 20 61 6e 79 74 68 69 6e 67 20 69 6e 20 61 20 46   anything in a F
3cd0: 52 4f 4d 20 74 68 61 74 0a 20 20 2f 2f 20 69 73  ROM that.  // is
3ce0: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 73 69 64   contained insid
3cf0: 65 20 70 61 72 65 6e 74 68 65 73 65 73 2e 20 20  e parentheses.  
3d00: 54 68 69 73 20 63 61 6e 20 62 65 20 65 69 74 68  This can be eith
3d10: 65 72 20 61 20 73 75 62 71 75 65 72 79 20 6f 72  er a subquery or
3d20: 0a 20 20 2f 2f 20 61 20 67 72 6f 75 70 69 6e 67  .  // a grouping
3d30: 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20 73 75   of table and su
3d40: 62 71 75 65 72 69 65 73 2e 0a 20 20 2f 2f 0a 20  bqueries..  //. 
3d50: 20 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69 73   %type seltablis
3d60: 74 5f 70 61 72 65 6e 20 7b 53 65 6c 65 63 74 2a  t_paren {Select*
3d70: 7d 0a 20 20 25 64 65 73 74 72 75 63 74 6f 72 20  }.  %destructor 
3d80: 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e  seltablist_paren
3d90: 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   {sqlite3SelectD
3da0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 20 20 73 65  elete($$);}.  se
3db0: 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e 28 41  ltablist_paren(A
3dc0: 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 53 29 2e  ) ::= select(S).
3dd0: 20 20 20 20 20 20 7b 41 20 3d 20 53 3b 7d 0a 20        {A = S;}. 
3de0: 20 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65   seltablist_pare
3df0: 6e 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61 62 6c  n(A) ::= seltabl
3e00: 69 73 74 28 46 29 2e 20 20 7b 0a 20 20 20 20 20  ist(F).  {.     
3e10: 41 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  A = sqlite3Selec
3e20: 74 4e 65 77 28 30 2c 46 2c 30 2c 30 2c 30 2c 30  tNew(0,F,0,0,0,0
3e30: 2c 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 25 65 6e  ,0,0,0);.  }.%en
3e40: 64 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d  dif // SQLITE_OM
3e50: 49 54 5f 53 55 42 51 55 45 52 59 0a 0a 25 74 79  IT_SUBQUERY..%ty
3e60: 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a  pe dbnm {Token}.
3e70: 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20  dbnm(A) ::= .   
3e80: 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20 41         {A.z=0; A
3e90: 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41 29 20 3a  .n=0;}.dbnm(A) :
3ea0: 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e 20 7b 41  := DOT nm(X). {A
3eb0: 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 66 75   = X;}..%type fu
3ec0: 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69 73 74 2a  llname {SrcList*
3ed0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 66 75  }.%destructor fu
3ee0: 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74 65 33 53  llname {sqlite3S
3ef0: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  rcListDelete($$)
3f00: 3b 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a  ;}.fullname(A) :
3f10: 3a 3d 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29  := nm(X) dbnm(Y)
3f20: 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 53  .  {A = sqlite3S
3f30: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26  rcListAppend(0,&
3f40: 58 2c 26 59 29 3b 7d 0a 0a 25 74 79 70 65 20 6a  X,&Y);}..%type j
3f50: 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79 70  oinop {int}.%typ
3f60: 65 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d 0a  e joinop2 {int}.
3f70: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43 4f  joinop(X) ::= CO
3f80: 4d 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20 20  MMA.            
3f90: 20 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54 5f         { X = JT_
3fa0: 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28  INNER; }.joinop(
3fb0: 58 29 20 3a 3a 3d 20 4a 4f 49 4e 2e 20 20 20 20  X) ::= JOIN.    
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 20  { X = JT_INNER; 
3fe0: 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20  }.joinop(X) ::= 
3ff0: 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f 49 4e 2e  JOIN_KW(A) JOIN.
4000: 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 73           { X = s
4010: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70  qlite3JoinType(p
4020: 50 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20 7d  Parse,&A,0,0); }
4030: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
4040: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
4050: 4a 4f 49 4e 2e 20 20 20 7b 20 58 20 3d 20 73 71  JOIN.   { X = sq
4060: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50  lite3JoinType(pP
4070: 61 72 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20 7d  arse,&A,&B,0); }
4080: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
4090: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
40a0: 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20  nm(C) JOIN..    
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40d0: 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33     { X = sqlite3
40e0: 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c  JoinType(pParse,
40f0: 26 41 2c 26 42 2c 26 43 29 3b 20 7d 0a 0a 25 74  &A,&B,&C); }..%t
4100: 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70 72  ype on_opt {Expr
4110: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f  *}.%destructor o
4120: 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  n_opt {sqlite3Ex
4130: 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 6f  prDelete($$);}.o
4140: 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 4f 4e 20  n_opt(N) ::= ON 
4150: 65 78 70 72 28 45 29 2e 20 20 20 7b 4e 20 3d 20  expr(E).   {N = 
4160: 45 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a  E;}.on_opt(N) ::
4170: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4180: 7b 4e 20 3d 20 30 3b 7d 0a 0a 25 74 79 70 65 20  {N = 0;}..%type 
4190: 75 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73  using_opt {IdLis
41a0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
41b0: 75 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74  using_opt {sqlit
41c0: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24  e3IdListDelete($
41d0: 24 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55  $);}.using_opt(U
41e0: 29 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20 69  ) ::= USING LP i
41f0: 6e 73 63 6f 6c 6c 69 73 74 28 4c 29 20 52 50 2e  nscollist(L) RP.
4200: 20 20 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e 67    {U = L;}.using
4210: 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20 20  _opt(U) ::= .   
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4230: 20 20 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a 0a       {U = 0;}...
4240: 25 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f 70  %type orderby_op
4250: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
4260: 65 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72 62  estructor orderb
4270: 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  y_opt {sqlite3Ex
4280: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
4290: 3b 7d 0a 25 74 79 70 65 20 73 6f 72 74 6c 69 73  ;}.%type sortlis
42a0: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
42b0: 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74 6c 69  estructor sortli
42c0: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
42d0: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
42e0: 25 74 79 70 65 20 73 6f 72 74 69 74 65 6d 20 7b  %type sortitem {
42f0: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
4300: 6f 72 20 73 6f 72 74 69 74 65 6d 20 7b 73 71 6c  or sortitem {sql
4310: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
4320: 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70  $);}..orderby_op
4330: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64      {A = 0;}.ord
4360: 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  erby_opt(A) ::= 
4370: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73  ORDER BY sortlis
4380: 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20  t(X).      {A = 
4390: 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20  X;}.sortlist(A) 
43a0: 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29 20  ::= sortlist(X) 
43b0: 43 4f 4d 4d 41 20 73 6f 72 74 69 74 65 6d 28 59  COMMA sortitem(Y
43c0: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
43d0: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
43e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
43f0: 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 43 2e 6e  stAppend(X,Y,C.n
4400: 3e 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28 20  >0?&C:0);.  if( 
4410: 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70  A ) A->a[A->nExp
4420: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
4430: 20 5a 3b 0a 7d 0a 73 6f 72 74 6c 69 73 74 28 41   Z;.}.sortlist(A
4440: 29 20 3a 3a 3d 20 73 6f 72 74 69 74 65 6d 28 59  ) ::= sortitem(Y
4450: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
4460: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
4470: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4480: 73 74 41 70 70 65 6e 64 28 30 2c 59 2c 43 2e 6e  stAppend(0,Y,C.n
4490: 3e 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28 20  >0?&C:0);.  if( 
44a0: 41 20 26 26 20 41 2d 3e 61 20 29 20 41 2d 3e 61  A && A->a ) A->a
44b0: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
44c0: 5a 3b 0a 7d 0a 73 6f 72 74 69 74 65 6d 28 41 29  Z;.}.sortitem(A)
44d0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20   ::= expr(X).   
44e0: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
44f0: 73 6f 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d 0a  sortorder {int}.
4500: 25 74 79 70 65 20 63 6f 6c 6c 61 74 65 20 7b 54  %type collate {T
4510: 6f 6b 65 6e 7d 0a 0a 73 6f 72 74 6f 72 64 65 72  oken}..sortorder
4520: 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20  (A) ::= ASC.    
4530: 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49         {A = SQLI
4540: 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74  TE_SO_ASC;}.sort
4550: 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 44 45 53  order(A) ::= DES
4560: 43 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d  C.          {A =
4570: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b   SQLITE_SO_DESC;
4580: 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a  }.sortorder(A) :
4590: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
45a0: 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f    {A = SQLITE_SO
45b0: 5f 41 53 43 3b 7d 0a 63 6f 6c 6c 61 74 65 28 43  _ASC;}.collate(C
45c0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
45d0: 20 20 20 20 20 20 20 7b 43 2e 7a 20 3d 20 30 3b         {C.z = 0;
45e0: 20 43 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c 6c 61   C.n = 0;}.colla
45f0: 74 65 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41 54  te(C) ::= COLLAT
4600: 45 20 69 64 28 58 29 2e 20 20 20 7b 43 20 3d 20  E id(X).   {C = 
4610: 58 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75 70  X;}..%type group
4620: 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74  by_opt {ExprList
4630: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 67  *}.%destructor g
4640: 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c 69  roupby_opt {sqli
4650: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
4660: 65 28 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79 5f  e($$);}.groupby_
4670: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
4680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4690: 20 20 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75 70    {A = 0;}.group
46a0: 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47 52  by_opt(A) ::= GR
46b0: 4f 55 50 20 42 59 20 65 78 70 72 6c 69 73 74 28  OUP BY exprlist(
46c0: 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25  X).  {A = X;}..%
46d0: 74 79 70 65 20 68 61 76 69 6e 67 5f 6f 70 74 20  type having_opt 
46e0: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
46f0: 74 6f 72 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b  tor having_opt {
4700: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4710: 65 28 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f  e($$);}.having_o
4720: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
4730: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
4740: 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41  0;}.having_opt(A
4750: 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78 70  ) ::= HAVING exp
4760: 72 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  r(X).  {A = X;}.
4770: 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74  .%type limit_opt
4780: 20 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61   {struct LimitVa
4790: 6c 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6c  l}.%destructor l
47a0: 69 6d 69 74 5f 6f 70 74 20 7b 0a 20 20 73 71 6c  imit_opt {.  sql
47b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
47c0: 24 2e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71 6c  $.pLimit);.  sql
47d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
47e0: 24 2e 70 4f 66 66 73 65 74 29 3b 0a 7d 0a 6c 69  $.pOffset);.}.li
47f0: 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  mit_opt(A) ::= .
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4810: 20 20 20 20 20 7b 41 2e 70 4c 69 6d 69 74 20 3d       {A.pLimit =
4820: 20 30 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20   0; A.pOffset = 
4830: 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  0;}.limit_opt(A)
4840: 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28   ::= LIMIT expr(
4850: 58 29 2e 20 20 20 20 20 20 20 20 7b 41 2e 70 4c  X).        {A.pL
4860: 69 6d 69 74 20 3d 20 58 3b 20 41 2e 70 4f 66 66  imit = X; A.pOff
4870: 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f  set = 0;}.limit_
4880: 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54  opt(A) ::= LIMIT
4890: 20 65 78 70 72 28 58 29 20 4f 46 46 53 45 54 20   expr(X) OFFSET 
48a0: 65 78 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20  expr(Y). .      
48b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48d0: 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20 58 3b 20   {A.pLimit = X; 
48e0: 41 2e 70 4f 66 66 73 65 74 20 3d 20 59 3b 7d 0a  A.pOffset = Y;}.
48f0: 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  limit_opt(A) ::=
4900: 20 4c 49 4d 49 54 20 65 78 70 72 28 58 29 20 43   LIMIT expr(X) C
4910: 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e 20 0a 20  OMMA expr(Y). . 
4920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 20 20 20 20 20 7b 41 2e 70 4f 66 66 73 65 74        {A.pOffset
4950: 20 3d 20 58 3b 20 41 2e 70 4c 69 6d 69 74 20 3d   = X; A.pLimit =
4960: 20 59 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   Y;}..//////////
4970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4980: 2f 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61  / The DELETE sta
4990: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
49a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
49b0: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
49c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 66 75 6c 6c  DELETE FROM full
49d0: 6e 61 6d 65 28 58 29 20 77 68 65 72 65 5f 6f 70  name(X) where_op
49e0: 74 28 59 29 2e 20 7b 73 71 6c 69 74 65 33 44 65  t(Y). {sqlite3De
49f0: 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c  leteFrom(pParse,
4a00: 58 2c 59 29 3b 7d 0a 0a 25 74 79 70 65 20 77 68  X,Y);}..%type wh
4a10: 65 72 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a  ere_opt {Expr*}.
4a20: 25 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 72  %destructor wher
4a30: 65 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  e_opt {sqlite3Ex
4a40: 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a  prDelete($$);}..
4a50: 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d  where_opt(A) ::=
4a60: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
4a70: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 77        {A = 0;}.w
4a80: 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  here_opt(A) ::= 
4a90: 57 48 45 52 45 20 65 78 70 72 28 58 29 2e 20 20  WHERE expr(X).  
4aa0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25       {A = X;}..%
4ab0: 74 79 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78  type setlist {Ex
4ac0: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
4ad0: 63 74 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71  ctor setlist {sq
4ae0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
4af0: 65 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f 2f 2f 2f  ete($$);}../////
4b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b10: 2f 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45  ///// The UPDATE
4b20: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
4b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
4b50: 20 3a 3a 3d 20 55 50 44 41 54 45 20 6f 72 63 6f   ::= UPDATE orco
4b60: 6e 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58  nf(R) fullname(X
4b70: 29 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29  ) SET setlist(Y)
4b80: 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 0a 20   where_opt(Z).. 
4b90: 20 20 20 7b 73 71 6c 69 74 65 33 55 70 64 61 74     {sqlite3Updat
4ba0: 65 28 70 50 61 72 73 65 2c 58 2c 59 2c 5a 2c 52  e(pParse,X,Y,Z,R
4bb0: 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20  );}..setlist(A) 
4bc0: 3a 3a 3d 20 73 65 74 6c 69 73 74 28 5a 29 20 43  ::= setlist(Z) C
4bd0: 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65 78  OMMA nm(X) EQ ex
4be0: 70 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20  pr(Y)..    {A = 
4bf0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
4c00: 70 70 65 6e 64 28 5a 2c 59 2c 26 58 29 3b 7d 0a  ppend(Z,Y,&X);}.
4c10: 73 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e  setlist(A) ::= n
4c20: 6d 28 58 29 20 45 51 20 65 78 70 72 28 59 29 2e  m(X) EQ expr(Y).
4c30: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
4c40: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
4c50: 59 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  Y,&X);}..///////
4c60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c70: 2f 2f 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63  /// The INSERT c
4c80: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
4c90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ca0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
4cb0: 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52  ::= insert_cmd(R
4cc0: 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28  ) INTO fullname(
4cd0: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
4ce0: 74 28 46 29 20 0a 20 20 20 20 20 20 20 20 56 41  t(F) .        VA
4cf0: 4c 55 45 53 20 4c 50 20 69 74 65 6d 6c 69 73 74  LUES LP itemlist
4d00: 28 59 29 20 52 50 2e 0a 20 20 20 20 20 20 20 20  (Y) RP..        
4d10: 20 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73 65      {sqlite3Inse
4d20: 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 59 2c  rt(pParse, X, Y,
4d30: 20 30 2c 20 46 2c 20 52 29 3b 7d 0a 63 6d 64 20   0, F, R);}.cmd 
4d40: 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52  ::= insert_cmd(R
4d50: 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28  ) INTO fullname(
4d60: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
4d70: 74 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e 0a  t(F) select(S)..
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
4d90: 69 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73  ite3Insert(pPars
4da0: 65 2c 20 58 2c 20 30 2c 20 53 2c 20 46 2c 20 52  e, X, 0, S, F, R
4db0: 29 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 65 72  );}..%type inser
4dc0: 74 5f 63 6d 64 20 7b 69 6e 74 7d 0a 69 6e 73 65  t_cmd {int}.inse
4dd0: 72 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e  rt_cmd(A) ::= IN
4de0: 53 45 52 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20  SERT orconf(R). 
4df0: 20 20 7b 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72    {A = R;}.inser
4e00: 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50  t_cmd(A) ::= REP
4e10: 4c 41 43 45 2e 20 20 20 20 20 20 20 20 20 20 20  LACE.           
4e20: 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65   {A = OE_Replace
4e30: 3b 7d 0a 0a 0a 25 74 79 70 65 20 69 74 65 6d 6c  ;}...%type iteml
4e40: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
4e50: 25 64 65 73 74 72 75 63 74 6f 72 20 69 74 65 6d  %destructor item
4e60: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70  list {sqlite3Exp
4e70: 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  rListDelete($$);
4e80: 7d 0a 0a 69 74 65 6d 6c 69 73 74 28 41 29 20 3a  }..itemlist(A) :
4e90: 3a 3d 20 69 74 65 6d 6c 69 73 74 28 58 29 20 43  := itemlist(X) C
4ea0: 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e 20 20 7b  OMMA expr(Y).  {
4eb0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
4ec0: 69 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 30 29  istAppend(X,Y,0)
4ed0: 3b 7d 0a 69 74 65 6d 6c 69 73 74 28 41 29 20 3a  ;}.itemlist(A) :
4ee0: 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 20 20  := expr(X).     
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
4f00: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
4f10: 69 73 74 41 70 70 65 6e 64 28 30 2c 58 2c 30 29  istAppend(0,X,0)
4f20: 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 63 6f 6c  ;}..%type inscol
4f30: 6c 69 73 74 5f 6f 70 74 20 7b 49 64 4c 69 73 74  list_opt {IdList
4f40: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69  *}.%destructor i
4f50: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b 73  nscollist_opt {s
4f60: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
4f70: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 69  te($$);}.%type i
4f80: 6e 73 63 6f 6c 6c 69 73 74 20 7b 49 64 4c 69 73  nscollist {IdLis
4f90: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
4fa0: 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69  inscollist {sqli
4fb0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
4fc0: 24 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c 6c 69 73  $$);}..inscollis
4fd0: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  t_opt(A) ::= .  
4fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ff0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e       {A = 0;}.in
5000: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20  scollist_opt(A) 
5010: 3a 3a 3d 20 4c 50 20 69 6e 73 63 6f 6c 6c 69 73  ::= LP inscollis
5020: 74 28 58 29 20 52 50 2e 20 20 20 20 7b 41 20 3d  t(X) RP.    {A =
5030: 20 58 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28   X;}.inscollist(
5040: 41 29 20 3a 3a 3d 20 69 6e 73 63 6f 6c 6c 69 73  A) ::= inscollis
5050: 74 28 58 29 20 43 4f 4d 4d 41 20 6e 6d 28 59 29  t(X) COMMA nm(Y)
5060: 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49  .  {A = sqlite3I
5070: 64 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59  dListAppend(X,&Y
5080: 29 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28 41  );}.inscollist(A
5090: 29 20 3a 3a 3d 20 6e 6d 28 59 29 2e 20 20 20 20  ) ::= nm(Y).    
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49 64    {A = sqlite3Id
50c0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59 29  ListAppend(0,&Y)
50d0: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
50e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
50f0: 45 78 70 72 65 73 73 69 6f 6e 20 50 72 6f 63 65  Expression Proce
5100: 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ssing //////////
5110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5120: 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65 20 65 78  ///.//..%type ex
5130: 70 72 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pr {Expr*}.%dest
5140: 72 75 63 74 6f 72 20 65 78 70 72 20 7b 73 71 6c  ructor expr {sql
5150: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
5160: 24 29 3b 7d 0a 25 74 79 70 65 20 74 65 72 6d 20  $);}.%type term 
5170: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
5180: 74 6f 72 20 74 65 72 6d 20 7b 73 71 6c 69 74 65  tor term {sqlite
5190: 33 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b  3ExprDelete($$);
51a0: 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 74  }..expr(A) ::= t
51b0: 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20  erm(X).         
51c0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70      {A = X;}.exp
51d0: 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 65  r(A) ::= LP(B) e
51e0: 78 70 72 28 58 29 20 52 50 28 45 29 2e 20 7b 41  xpr(X) RP(E). {A
51f0: 20 3d 20 58 3b 20 73 71 6c 69 74 65 33 45 78 70   = X; sqlite3Exp
5200: 72 53 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b 20  rSpan(A,&B,&E); 
5210: 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 4e 55  }.term(A) ::= NU
5220: 4c 4c 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  LL(X).          
5230: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
5240: 78 70 72 28 40 58 2c 20 30 2c 20 30 2c 20 26 58  xpr(@X, 0, 0, &X
5250: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
5260: 49 44 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  ID(X).          
5270: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5280: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
5290: 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  0, &X);}.expr(A)
52a0: 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e   ::= JOIN_KW(X).
52b0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
52c0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
52d0: 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78  , 0, 0, &X);}.ex
52e0: 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20  pr(A) ::= nm(X) 
52f0: 44 4f 54 20 6e 6d 28 59 29 2e 20 7b 0a 20 20 45  DOT nm(Y). {.  E
5300: 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c  xpr *temp1 = sql
5310: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
5320: 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78 70  0, 0, &X);.  Exp
5330: 72 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69 74  r *temp2 = sqlit
5340: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
5350: 20 30 2c 20 26 59 29 3b 0a 20 20 41 20 3d 20 73   0, &Y);.  A = s
5360: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f  qlite3Expr(TK_DO
5370: 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d 70 32 2c  T, temp1, temp2,
5380: 20 30 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a   0);.}.expr(A) :
5390: 3a 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28  := nm(X) DOT nm(
53a0: 59 29 20 44 4f 54 20 6e 6d 28 5a 29 2e 20 7b 0a  Y) DOT nm(Z). {.
53b0: 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20    Expr *temp1 = 
53c0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
53d0: 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20  D, 0, 0, &X);.  
53e0: 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71  Expr *temp2 = sq
53f0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
5400: 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 45 78   0, 0, &Y);.  Ex
5410: 70 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c 69  pr *temp3 = sqli
5420: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
5430: 2c 20 30 2c 20 26 5a 29 3b 0a 20 20 45 78 70 72  , 0, &Z);.  Expr
5440: 20 2a 74 65 6d 70 34 20 3d 20 73 71 6c 69 74 65   *temp4 = sqlite
5450: 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 74 65  3Expr(TK_DOT, te
5460: 6d 70 32 2c 20 74 65 6d 70 33 2c 20 30 29 3b 0a  mp2, temp3, 0);.
5470: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
5480: 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c  r(TK_DOT, temp1,
5490: 20 74 65 6d 70 34 2c 20 30 29 3b 0a 7d 0a 74 65   temp4, 0);.}.te
54a0: 72 6d 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45  rm(A) ::= INTEGE
54b0: 52 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20  R(X).      {A = 
54c0: 73 71 6c 69 74 65 33 45 78 70 72 28 40 58 2c 20  sqlite3Expr(@X, 
54d0: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 74 65 72 6d  0, 0, &X);}.term
54e0: 28 41 29 20 3a 3a 3d 20 46 4c 4f 41 54 28 58 29  (A) ::= FLOAT(X)
54f0: 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71  .        {A = sq
5500: 6c 69 74 65 33 45 78 70 72 28 40 58 2c 20 30 2c  lite3Expr(@X, 0,
5510: 20 30 2c 20 26 58 29 3b 7d 0a 74 65 72 6d 28 41   0, &X);}.term(A
5520: 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e  ) ::= STRING(X).
5530: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
5540: 74 65 33 45 78 70 72 28 40 58 2c 20 30 2c 20 30  te3Expr(@X, 0, 0
5550: 2c 20 26 58 29 3b 7d 0a 74 65 72 6d 28 41 29 20  , &X);}.term(A) 
5560: 3a 3a 3d 20 42 4c 4f 42 28 58 29 2e 20 20 20 20  ::= BLOB(X).    
5570: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5580: 33 45 78 70 72 28 40 58 2c 20 30 2c 20 30 2c 20  3Expr(@X, 0, 0, 
5590: 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  &X);}.expr(A) ::
55a0: 3d 20 52 45 47 49 53 54 45 52 28 58 29 2e 20 20  = REGISTER(X).  
55b0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 52     {A = sqlite3R
55c0: 65 67 69 73 74 65 72 45 78 70 72 28 70 50 61 72  egisterExpr(pPar
55d0: 73 65 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41  se, &X);}.expr(A
55e0: 29 20 3a 3a 3d 20 56 41 52 49 41 42 4c 45 28 58  ) ::= VARIABLE(X
55f0: 29 2e 20 20 20 20 20 7b 0a 20 20 54 6f 6b 65 6e  ).     {.  Token
5600: 20 2a 70 54 6f 6b 65 6e 20 3d 20 26 58 3b 0a 20   *pToken = &X;. 
5610: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 41   Expr *pExpr = A
5620: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
5630: 4b 5f 56 41 52 49 41 42 4c 45 2c 20 30 2c 20 30  K_VARIABLE, 0, 0
5640: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 73 71 6c  , pToken);.  sql
5650: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
5660: 72 4e 75 6d 62 65 72 28 70 50 61 72 73 65 2c 20  rNumber(pParse, 
5670: 70 45 78 70 72 29 3b 0a 7d 0a 65 78 70 72 28 41  pExpr);.}.expr(A
5680: 29 20 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20 65  ) ::= ID(X) LP e
5690: 78 70 72 6c 69 73 74 28 59 29 20 52 50 28 45 29  xprlist(Y) RP(E)
56a0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
56b0: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 59 2c  3ExprFunction(Y,
56c0: 20 26 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 45   &X);.  sqlite3E
56d0: 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26 45 29  xprSpan(A,&X,&E)
56e0: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
56f0: 49 44 28 58 29 20 4c 50 20 53 54 41 52 20 52 50  ID(X) LP STAR RP
5700: 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (E). {.  A = sql
5710: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
5720: 28 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74  (0, &X);.  sqlit
5730: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c  e3ExprSpan(A,&X,
5740: 26 45 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a  &E);.}.term(A) :
5750: 3a 3d 20 43 54 49 4d 45 28 4f 50 29 2e 20 20 20  := CTIME(OP).   
5760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5770: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5780: 40 4f 50 2c 30 2c 30 2c 30 29 3b 7d 0a 74 65 72  @OP,0,0,0);}.ter
5790: 6d 28 41 29 20 3a 3a 3d 20 43 44 41 54 45 28 4f  m(A) ::= CDATE(O
57a0: 50 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  P).             
57b0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
57c0: 33 45 78 70 72 28 40 4f 50 2c 30 2c 30 2c 30 29  3Expr(@OP,0,0,0)
57d0: 3b 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 43  ;}.term(A) ::= C
57e0: 54 49 4d 45 53 54 41 4d 50 28 4f 50 29 2e 20 20  TIMESTAMP(OP).  
57f0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
5800: 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c  sqlite3Expr(@OP,
5810: 30 2c 30 2c 30 29 3b 7d 0a 65 78 70 72 28 41 29  0,0,0);}.expr(A)
5820: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 41 4e 44   ::= expr(X) AND
5830: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20  (OP) expr(Y).   
5840: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
5850: 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b  r(@OP, X, Y, 0);
5860: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5870: 70 72 28 58 29 20 4f 52 28 4f 50 29 20 65 78 70  pr(X) OR(OP) exp
5880: 72 28 59 29 2e 20 20 20 20 20 7b 41 20 3d 20 73  r(Y).     {A = s
5890: 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20  qlite3Expr(@OP, 
58a0: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
58b0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c  A) ::= expr(X) L
58c0: 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  T(OP) expr(Y).  
58d0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
58e0: 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30  xpr(@OP, X, Y, 0
58f0: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
5900: 65 78 70 72 28 58 29 20 47 54 28 4f 50 29 20 65  expr(X) GT(OP) e
5910: 78 70 72 28 59 29 2e 20 20 20 20 20 7b 41 20 3d  xpr(Y).     {A =
5920: 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50   sqlite3Expr(@OP
5930: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
5940: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
5950: 20 4c 45 28 4f 50 29 20 65 78 70 72 28 59 29 2e   LE(OP) expr(Y).
5960: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5970: 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c  3Expr(@OP, X, Y,
5980: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
5990: 3d 20 65 78 70 72 28 58 29 20 47 45 28 4f 50 29  = expr(X) GE(OP)
59a0: 20 65 78 70 72 28 59 29 2e 20 20 20 20 20 7b 41   expr(Y).     {A
59b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40   = sqlite3Expr(@
59c0: 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  OP, X, Y, 0);}.e
59d0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
59e0: 58 29 20 4e 45 28 4f 50 29 20 65 78 70 72 28 59  X) NE(OP) expr(Y
59f0: 29 2e 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  ).     {A = sqli
5a00: 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20  te3Expr(@OP, X, 
5a10: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
5a20: 3a 3a 3d 20 65 78 70 72 28 58 29 20 45 51 28 4f  ::= expr(X) EQ(O
5a30: 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 20  P) expr(Y).     
5a40: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
5a50: 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  (@OP, X, Y, 0);}
5a60: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
5a70: 72 28 58 29 20 42 49 54 41 4e 44 28 4f 50 29 20  r(X) BITAND(OP) 
5a80: 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71  expr(Y). {A = sq
5a90: 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58  lite3Expr(@OP, X
5aa0: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
5ab0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 42 49  ) ::= expr(X) BI
5ac0: 54 4f 52 28 4f 50 29 20 65 78 70 72 28 59 29 2e  TOR(OP) expr(Y).
5ad0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
5ae0: 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29  pr(@OP, X, Y, 0)
5af0: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
5b00: 78 70 72 28 58 29 20 4c 53 48 49 46 54 28 4f 50  xpr(X) LSHIFT(OP
5b10: 29 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20  ) expr(Y). {A = 
5b20: 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c  sqlite3Expr(@OP,
5b30: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
5b40: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
5b50: 52 53 48 49 46 54 28 4f 50 29 20 65 78 70 72 28  RSHIFT(OP) expr(
5b60: 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 33  Y). {A = sqlite3
5b70: 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20  Expr(@OP, X, Y, 
5b80: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
5b90: 20 65 78 70 72 28 58 29 20 50 4c 55 53 28 4f 50   expr(X) PLUS(OP
5ba0: 29 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20  ) expr(Y).   {A 
5bb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f  = sqlite3Expr(@O
5bc0: 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78  P, X, Y, 0);}.ex
5bd0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
5be0: 29 20 4d 49 4e 55 53 28 4f 50 29 20 65 78 70 72  ) MINUS(OP) expr
5bf0: 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (Y).  {A = sqlit
5c00: 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59  e3Expr(@OP, X, Y
5c10: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
5c20: 3a 3d 20 65 78 70 72 28 58 29 20 53 54 41 52 28  := expr(X) STAR(
5c30: 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 7b  OP) expr(Y).   {
5c40: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5c50: 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  @OP, X, Y, 0);}.
5c60: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
5c70: 28 58 29 20 53 4c 41 53 48 28 4f 50 29 20 65 78  (X) SLASH(OP) ex
5c80: 70 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c  pr(Y).  {A = sql
5c90: 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c  ite3Expr(@OP, X,
5ca0: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
5cb0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 52 45 4d   ::= expr(X) REM
5cc0: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20  (OP) expr(Y).   
5cd0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
5ce0: 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b  r(@OP, X, Y, 0);
5cf0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5d00: 70 72 28 58 29 20 43 4f 4e 43 41 54 28 4f 50 29  pr(X) CONCAT(OP)
5d10: 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73   expr(Y). {A = s
5d20: 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20  qlite3Expr(@OP, 
5d30: 58 2c 20 59 2c 20 30 29 3b 7d 0a 25 74 79 70 65  X, Y, 0);}.%type
5d40: 20 6c 69 6b 65 6f 70 20 7b 73 74 72 75 63 74 20   likeop {struct 
5d50: 4c 69 6b 65 4f 70 7d 0a 6c 69 6b 65 6f 70 28 41  LikeOp}.likeop(A
5d60: 29 20 3a 3a 3d 20 4c 49 4b 45 2e 20 20 20 20 20  ) ::= LIKE.     
5d70: 7b 41 2e 6f 70 63 6f 64 65 20 3d 20 54 4b 5f 4c  {A.opcode = TK_L
5d80: 49 4b 45 3b 20 41 2e 6e 6f 74 20 3d 20 30 3b 7d  IKE; A.not = 0;}
5d90: 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 47  .likeop(A) ::= G
5da0: 4c 4f 42 2e 20 20 20 20 20 7b 41 2e 6f 70 63 6f  LOB.     {A.opco
5db0: 64 65 20 3d 20 54 4b 5f 47 4c 4f 42 3b 20 41 2e  de = TK_GLOB; A.
5dc0: 6e 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b 65 6f 70  not = 0;}.likeop
5dd0: 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4c 49 4b 45  (A) ::= NOT LIKE
5de0: 2e 20 7b 41 2e 6f 70 63 6f 64 65 20 3d 20 54 4b  . {A.opcode = TK
5df0: 5f 4c 49 4b 45 3b 20 41 2e 6e 6f 74 20 3d 20 31  _LIKE; A.not = 1
5e00: 3b 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d  ;}.likeop(A) ::=
5e10: 20 4e 4f 54 20 47 4c 4f 42 2e 20 7b 41 2e 6f 70   NOT GLOB. {A.op
5e20: 63 6f 64 65 20 3d 20 54 4b 5f 47 4c 4f 42 3b 20  code = TK_GLOB; 
5e30: 41 2e 6e 6f 74 20 3d 20 31 3b 7d 0a 25 74 79 70  A.not = 1;}.%typ
5e40: 65 20 65 73 63 61 70 65 20 7b 45 78 70 72 2a 7d  e escape {Expr*}
5e50: 0a 65 73 63 61 70 65 28 58 29 20 3a 3a 3d 20 45  .escape(X) ::= E
5e60: 53 43 41 50 45 20 65 78 70 72 28 41 29 2e 20 5b  SCAPE expr(A). [
5e70: 45 53 43 41 50 45 5d 20 7b 58 20 3d 20 41 3b 7d  ESCAPE] {X = A;}
5e80: 0a 65 73 63 61 70 65 28 58 29 20 3a 3a 3d 20 2e  .escape(X) ::= .
5e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
5ea0: 45 53 43 41 50 45 5d 20 7b 58 20 3d 20 30 3b 7d  ESCAPE] {X = 0;}
5eb0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
5ec0: 72 28 58 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20  r(X) likeop(OP) 
5ed0: 65 78 70 72 28 59 29 20 65 73 63 61 70 65 28 45  expr(Y) escape(E
5ee0: 29 2e 20 20 5b 4c 49 4b 45 5d 20 20 7b 0a 20 20  ).  [LIKE]  {.  
5ef0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
5f00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5f10: 74 41 70 70 65 6e 64 28 30 2c 20 59 2c 20 30 29  tAppend(0, Y, 0)
5f20: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
5f30: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
5f40: 64 28 70 4c 69 73 74 2c 20 58 2c 20 30 29 3b 0a  d(pList, X, 0);.
5f50: 20 20 69 66 28 20 45 20 29 7b 0a 20 20 20 20 70    if( E ){.    p
5f60: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
5f70: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69  prListAppend(pLi
5f80: 73 74 2c 20 45 2c 20 30 29 3b 0a 20 20 7d 0a 20  st, E, 0);.  }. 
5f90: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
5fa0: 46 75 6e 63 74 69 6f 6e 28 70 4c 69 73 74 2c 20  Function(pList, 
5fb0: 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d  0);.  if( A ) A-
5fc0: 3e 6f 70 20 3d 20 4f 50 2e 6f 70 63 6f 64 65 3b  >op = OP.opcode;
5fd0: 0a 20 20 69 66 28 20 4f 50 2e 6e 6f 74 20 29 20  .  if( OP.not ) 
5fe0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5ff0: 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29  TK_NOT, A, 0, 0)
6000: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
6010: 70 61 6e 28 41 2c 20 26 58 2d 3e 73 70 61 6e 2c  pan(A, &X->span,
6020: 20 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 0a 65   &Y->span);.}..e
6030: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
6040: 58 29 20 49 53 4e 55 4c 4c 28 45 29 2e 20 7b 0a  X) ISNULL(E). {.
6050: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
6060: 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20  r(TK_ISNULL, X, 
6070: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  0, 0);.  sqlite3
6080: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73  ExprSpan(A,&X->s
6090: 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28  pan,&E);.}.expr(
60a0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49  A) ::= expr(X) I
60b0: 53 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41  S NULL(E). {.  A
60c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
60d0: 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20  K_ISNULL, X, 0, 
60e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  0);.  sqlite3Exp
60f0: 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e  rSpan(A,&X->span
6100: 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  ,&E);.}.expr(A) 
6110: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 4e  ::= expr(X) NOTN
6120: 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20  ULL(E). {.  A = 
6130: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e  sqlite3Expr(TK_N
6140: 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29  OTNULL, X, 0, 0)
6150: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
6160: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26  pan(A,&X->span,&
6170: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
6180: 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20 4e 55  = expr(X) NOT NU
6190: 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  LL(E). {.  A = s
61a0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f  qlite3Expr(TK_NO
61b0: 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b  TNULL, X, 0, 0);
61c0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  .  sqlite3ExprSp
61d0: 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45  an(A,&X->span,&E
61e0: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
61f0: 20 65 78 70 72 28 58 29 20 49 53 20 4e 4f 54 20   expr(X) IS NOT 
6200: 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d  NULL(E). {.  A =
6210: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
6220: 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30  NOTNULL, X, 0, 0
6230: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
6240: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
6250: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
6260: 3a 3d 20 4e 4f 54 28 42 29 20 65 78 70 72 28 58  := NOT(B) expr(X
6270: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
6280: 65 33 45 78 70 72 28 40 42 2c 20 58 2c 20 30 2c  e3Expr(@B, X, 0,
6290: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78   0);.  sqlite3Ex
62a0: 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e  prSpan(A,&B,&X->
62b0: 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29  span);.}.expr(A)
62c0: 20 3a 3a 3d 20 42 49 54 4e 4f 54 28 42 29 20 65   ::= BITNOT(B) e
62d0: 78 70 72 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20  xpr(X). {.  A = 
62e0: 73 71 6c 69 74 65 33 45 78 70 72 28 40 42 2c 20  sqlite3Expr(@B, 
62f0: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
6300: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42  te3ExprSpan(A,&B
6310: 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78  ,&X->span);.}.ex
6320: 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 28  pr(A) ::= MINUS(
6330: 42 29 20 65 78 70 72 28 58 29 2e 20 5b 55 4d 49  B) expr(X). [UMI
6340: 4e 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73 71 6c  NUS] {.  A = sql
6350: 69 74 65 33 45 78 70 72 28 54 4b 5f 55 4d 49 4e  ite3Expr(TK_UMIN
6360: 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  US, X, 0, 0);.  
6370: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
6380: 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a  A,&B,&X->span);.
6390: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 50 4c  }.expr(A) ::= PL
63a0: 55 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b  US(B) expr(X). [
63b0: 55 50 4c 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73  UPLUS] {.  A = s
63c0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 55 50  qlite3Expr(TK_UP
63d0: 4c 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20  LUS, X, 0, 0);. 
63e0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
63f0: 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b  (A,&B,&X->span);
6400: 0a 7d 0a 25 74 79 70 65 20 62 65 74 77 65 65 6e  .}.%type between
6410: 5f 6f 70 20 7b 69 6e 74 7d 0a 62 65 74 77 65 65  _op {int}.betwee
6420: 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 42 45 54 57  n_op(A) ::= BETW
6430: 45 45 4e 2e 20 20 20 20 20 7b 41 20 3d 20 30 3b  EEN.     {A = 0;
6440: 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20  }.between_op(A) 
6450: 3a 3a 3d 20 4e 4f 54 20 42 45 54 57 45 45 4e 2e  ::= NOT BETWEEN.
6460: 20 7b 41 20 3d 20 31 3b 7d 0a 65 78 70 72 28 41   {A = 1;}.expr(A
6470: 29 20 3a 3a 3d 20 65 78 70 72 28 57 29 20 62 65  ) ::= expr(W) be
6480: 74 77 65 65 6e 5f 6f 70 28 4e 29 20 65 78 70 72  tween_op(N) expr
6490: 28 58 29 20 41 4e 44 20 65 78 70 72 28 59 29 2e  (X) AND expr(Y).
64a0: 20 5b 42 45 54 57 45 45 4e 5d 20 7b 0a 20 20 45   [BETWEEN] {.  E
64b0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
64c0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
64d0: 41 70 70 65 6e 64 28 30 2c 20 58 2c 20 30 29 3b  Append(0, X, 0);
64e0: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
64f0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6500: 28 70 4c 69 73 74 2c 20 59 2c 20 30 29 3b 0a 20  (pList, Y, 0);. 
6510: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6520: 28 54 4b 5f 42 45 54 57 45 45 4e 2c 20 57 2c 20  (TK_BETWEEN, W, 
6530: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  0, 0);.  if( A )
6540: 20 41 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73   A->pList = pLis
6550: 74 3b 0a 20 20 69 66 28 20 4e 20 29 20 41 20 3d  t;.  if( N ) A =
6560: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
6570: 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20  NOT, A, 0, 0);. 
6580: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
6590: 28 41 2c 26 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e  (A,&W->span,&Y->
65a0: 73 70 61 6e 29 3b 0a 7d 0a 25 69 66 6e 64 65 66  span);.}.%ifndef
65b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
65c0: 51 55 45 52 59 0a 20 20 25 74 79 70 65 20 69 6e  QUERY.  %type in
65d0: 5f 6f 70 20 7b 69 6e 74 7d 0a 20 20 69 6e 5f 6f  _op {int}.  in_o
65e0: 70 28 41 29 20 3a 3a 3d 20 49 4e 2e 20 20 20 20  p(A) ::= IN.    
65f0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 20 20 69 6e 5f    {A = 0;}.  in_
6600: 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e  op(A) ::= NOT IN
6610: 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a 20 20 65 78  .  {A = 1;}.  ex
6620: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
6630: 29 20 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 65 78  ) in_op(N) LP ex
6640: 70 72 6c 69 73 74 28 59 29 20 52 50 28 45 29 2e  prlist(Y) RP(E).
6650: 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 41 20 3d 20   [IN] {.    A = 
6660: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
6670: 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20  N, X, 0, 0);.   
6680: 20 69 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20   if( A ){.      
6690: 41 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20  A->pList = Y;.  
66a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
66b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
66c0: 6c 65 74 65 28 59 29 3b 0a 20 20 20 20 7d 0a 20  lete(Y);.    }. 
66d0: 20 20 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73     if( N ) A = s
66e0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f  qlite3Expr(TK_NO
66f0: 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 20  T, A, 0, 0);.   
6700: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
6710: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b  (A,&X->span,&E);
6720: 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a  .  }.  expr(A) :
6730: 3a 3d 20 4c 50 28 42 29 20 73 65 6c 65 63 74 28  := LP(B) select(
6740: 58 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 20 20  X) RP(E). {.    
6750: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
6760: 54 4b 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c  TK_SELECT, 0, 0,
6770: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 41 20 29   0);.    if( A )
6780: 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20 58 3b   A->pSelect = X;
6790: 0a 20 20 20 20 69 66 28 20 21 41 20 29 20 73 71  .    if( !A ) sq
67a0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
67b0: 65 28 58 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(X);.    sqlite
67c0: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26  3ExprSpan(A,&B,&
67d0: 45 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41  E);.  }.  expr(A
67e0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69 6e  ) ::= expr(X) in
67f0: 5f 6f 70 28 4e 29 20 4c 50 20 73 65 6c 65 63 74  _op(N) LP select
6800: 28 59 29 20 52 50 28 45 29 2e 20 20 5b 49 4e 5d  (Y) RP(E).  [IN]
6810: 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74   {.    A = sqlit
6820: 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c  e3Expr(TK_IN, X,
6830: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
6840: 41 20 29 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d  A ) A->pSelect =
6850: 20 59 3b 0a 20 20 20 20 69 66 28 20 21 41 20 29   Y;.    if( !A )
6860: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
6870: 6c 65 74 65 28 59 29 3b 0a 20 20 20 20 69 66 28  lete(Y);.    if(
6880: 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65 33   N ) A = sqlite3
6890: 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20  Expr(TK_NOT, A, 
68a0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
68b0: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  e3ExprSpan(A,&X-
68c0: 3e 73 70 61 6e 2c 26 45 29 3b 0a 20 20 7d 0a 20  >span,&E);.  }. 
68d0: 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70   expr(A) ::= exp
68e0: 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29 20 6e 6d  r(X) in_op(N) nm
68f0: 28 59 29 20 64 62 6e 6d 28 5a 29 2e 20 5b 49 4e  (Y) dbnm(Z). [IN
6900: 5d 20 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  ] {.    SrcList 
6910: 2a 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53  *pSrc = sqlite3S
6920: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26  rcListAppend(0,&
6930: 59 2c 26 5a 29 3b 0a 20 20 20 20 41 20 3d 20 73  Y,&Z);.    A = s
6940: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
6950: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , X, 0, 0);.    
6960: 69 66 28 20 41 20 29 20 41 2d 3e 70 53 65 6c 65  if( A ) A->pSele
6970: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
6980: 63 74 4e 65 77 28 30 2c 70 53 72 63 2c 30 2c 30  ctNew(0,pSrc,0,0
6990: 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20  ,0,0,0,0,0);.   
69a0: 20 69 66 28 20 4e 20 29 20 41 20 3d 20 73 71 6c   if( N ) A = sql
69b0: 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f 54 2c  ite3Expr(TK_NOT,
69c0: 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73   A, 0, 0);.    s
69d0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
69e0: 2c 26 58 2d 3e 73 70 61 6e 2c 5a 2e 7a 3f 26 5a  ,&X->span,Z.z?&Z
69f0: 3a 26 59 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72  :&Y);.  }.  expr
6a00: 28 41 29 20 3a 3a 3d 20 45 58 49 53 54 53 28 42  (A) ::= EXISTS(B
6a10: 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52  ) LP select(Y) R
6a20: 50 28 45 29 2e 20 7b 0a 20 20 20 20 45 78 70 72  P(E). {.    Expr
6a30: 20 2a 70 20 3d 20 41 20 3d 20 73 71 6c 69 74 65   *p = A = sqlite
6a40: 33 45 78 70 72 28 54 4b 5f 45 58 49 53 54 53 2c  3Expr(TK_EXISTS,
6a50: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
6a60: 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  f( p ){.      p-
6a70: 3e 70 53 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20  >pSelect = Y;.  
6a80: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
6a90: 70 61 6e 28 70 2c 26 42 2c 26 45 29 3b 0a 20 20  pan(p,&B,&E);.  
6aa0: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 20 29    }.    if( !p )
6ab0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
6ac0: 6c 65 74 65 28 59 29 3b 0a 20 20 7d 0a 25 65 6e  lete(Y);.  }.%en
6ad0: 64 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d  dif // SQLITE_OM
6ae0: 49 54 5f 53 55 42 51 55 45 52 59 0a 0a 2f 2a 20  IT_SUBQUERY../* 
6af0: 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e 73  CASE expressions
6b00: 20 2a 2f 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20   */.expr(A) ::= 
6b10: 43 41 53 45 28 43 29 20 63 61 73 65 5f 6f 70 65  CASE(C) case_ope
6b20: 72 61 6e 64 28 58 29 20 63 61 73 65 5f 65 78 70  rand(X) case_exp
6b30: 72 6c 69 73 74 28 59 29 20 63 61 73 65 5f 65 6c  rlist(Y) case_el
6b40: 73 65 28 5a 29 20 45 4e 44 28 45 29 2e 20 7b 0a  se(Z) END(E). {.
6b50: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
6b60: 72 28 54 4b 5f 43 41 53 45 2c 20 58 2c 20 5a 2c  r(TK_CASE, X, Z,
6b70: 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41   0);.  if( A ) A
6b80: 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 73  ->pList = Y;.  s
6b90: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
6ba0: 2c 20 26 43 2c 20 26 45 29 3b 0a 7d 0a 25 74 79  , &C, &E);.}.%ty
6bb0: 70 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74  pe case_exprlist
6bc0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
6bd0: 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78  structor case_ex
6be0: 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45  prlist {sqlite3E
6bf0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24  xprListDelete($$
6c00: 29 3b 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73  );}.case_exprlis
6c10: 74 28 41 29 20 3a 3a 3d 20 63 61 73 65 5f 65 78  t(A) ::= case_ex
6c20: 70 72 6c 69 73 74 28 58 29 20 57 48 45 4e 20 65  prlist(X) WHEN e
6c30: 78 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72  xpr(Y) THEN expr
6c40: 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (Z). {.  A = sql
6c50: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6c60: 6e 64 28 58 2c 20 59 2c 20 30 29 3b 0a 20 20 41  nd(X, Y, 0);.  A
6c70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6c80: 73 74 41 70 70 65 6e 64 28 41 2c 20 5a 2c 20 30  stAppend(A, Z, 0
6c90: 29 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69  );.}.case_exprli
6ca0: 73 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65  st(A) ::= WHEN e
6cb0: 78 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72  xpr(Y) THEN expr
6cc0: 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (Z). {.  A = sql
6cd0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
6ce0: 6e 64 28 30 2c 20 59 2c 20 30 29 3b 0a 20 20 41  nd(0, Y, 0);.  A
6cf0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
6d00: 73 74 41 70 70 65 6e 64 28 41 2c 20 5a 2c 20 30  stAppend(A, Z, 0
6d10: 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73 65 5f  );.}.%type case_
6d20: 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a 63 61 73  else {Expr*}.cas
6d30: 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45  e_else(A) ::=  E
6d40: 4c 53 45 20 65 78 70 72 28 58 29 2e 20 20 20 20  LSE expr(X).    
6d50: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 63 61       {A = X;}.ca
6d60: 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20  se_else(A) ::=  
6d70: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d80: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a        {A = 0;} .
6d90: 25 74 79 70 65 20 63 61 73 65 5f 6f 70 65 72 61  %type case_opera
6da0: 6e 64 20 7b 45 78 70 72 2a 7d 0a 63 61 73 65 5f  nd {Expr*}.case_
6db0: 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 65  operand(A) ::= e
6dc0: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20 20  xpr(X).         
6dd0: 20 20 20 7b 41 20 3d 20 58 3b 7d 20 0a 63 61 73     {A = X;} .cas
6de0: 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d  e_operand(A) ::=
6df0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6e00: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a       {A = 0;} ..
6e10: 25 74 79 70 65 20 65 78 70 72 6c 69 73 74 20 7b  %type exprlist {
6e20: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
6e30: 72 75 63 74 6f 72 20 65 78 70 72 6c 69 73 74 20  ructor exprlist 
6e40: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
6e50: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
6e60: 70 65 20 65 78 70 72 69 74 65 6d 20 7b 45 78 70  pe expritem {Exp
6e70: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
6e80: 65 78 70 72 69 74 65 6d 20 7b 73 71 6c 69 74 65  expritem {sqlite
6e90: 33 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b  3ExprDelete($$);
6ea0: 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a  }..exprlist(A) :
6eb0: 3a 3d 20 65 78 70 72 6c 69 73 74 28 58 29 20 43  := exprlist(X) C
6ec0: 4f 4d 4d 41 20 65 78 70 72 69 74 65 6d 28 59 29  OMMA expritem(Y)
6ed0: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  . .             
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ef0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
6f00: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6f10: 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b 7d 0a 65  ppend(X,Y,0);}.e
6f20: 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65  xprlist(A) ::= e
6f30: 78 70 72 69 74 65 6d 28 58 29 2e 20 20 20 20 20  xpritem(X).     
6f40: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
6f50: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
6f60: 64 28 30 2c 58 2c 30 29 3b 7d 0a 65 78 70 72 69  d(0,X,0);}.expri
6f70: 74 65 6d 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  tem(A) ::= expr(
6f80: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
6f90: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72     {A = X;}.expr
6fa0: 69 74 65 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20  item(A) ::= .   
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fc0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f      {A = 0;}..//
6fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
6ff0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 6f 6d  CREATE INDEX com
7000: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
7010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
7020: 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45 28 53  cmd ::= CREATE(S
7030: 29 20 75 6e 69 71 75 65 66 6c 61 67 28 55 29 20  ) uniqueflag(U) 
7040: 49 4e 44 45 58 20 6e 6d 28 58 29 20 64 62 6e 6d  INDEX nm(X) dbnm
7050: 28 44 29 0a 20 20 20 20 20 20 20 20 4f 4e 20 6e  (D).        ON n
7060: 6d 28 59 29 20 4c 50 20 69 64 78 6c 69 73 74 28  m(Y) LP idxlist(
7070: 5a 29 20 52 50 28 45 29 20 6f 6e 63 6f 6e 66 28  Z) RP(E) onconf(
7080: 52 29 2e 20 7b 0a 20 20 69 66 28 20 55 21 3d 4f  R). {.  if( U!=O
7090: 45 5f 4e 6f 6e 65 20 29 20 55 20 3d 20 52 3b 0a  E_None ) U = R;.
70a0: 20 20 69 66 28 20 55 3d 3d 4f 45 5f 44 65 66 61    if( U==OE_Defa
70b0: 75 6c 74 29 20 55 20 3d 20 4f 45 5f 41 62 6f 72  ult) U = OE_Abor
70c0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61  t;.  sqlite3Crea
70d0: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  teIndex(pParse, 
70e0: 26 58 2c 20 26 44 2c 20 73 71 6c 69 74 65 33 53  &X, &D, sqlite3S
70f0: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26  rcListAppend(0,&
7100: 59 2c 30 29 2c 5a 2c 55 2c 20 26 53 2c 20 26 45  Y,0),Z,U, &S, &E
7110: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71  );.}..%type uniq
7120: 75 65 66 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69  ueflag {int}.uni
7130: 71 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55  queflag(A) ::= U
7140: 4e 49 51 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f  NIQUE.  {A = OE_
7150: 41 62 6f 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c  Abort;}.uniquefl
7160: 61 67 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  ag(A) ::= .     
7170: 20 20 20 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b     {A = OE_None;
7180: 7d 0a 0a 25 74 79 70 65 20 69 64 78 6c 69 73 74  }..%type idxlist
7190: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
71a0: 73 74 72 75 63 74 6f 72 20 69 64 78 6c 69 73 74  structor idxlist
71b0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   {sqlite3ExprLis
71c0: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
71d0: 79 70 65 20 69 64 78 6c 69 73 74 5f 6f 70 74 20  ype idxlist_opt 
71e0: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
71f0: 74 72 75 63 74 6f 72 20 69 64 78 6c 69 73 74 5f  tructor idxlist_
7200: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
7210: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
7220: 0a 25 74 79 70 65 20 69 64 78 69 74 65 6d 20 7b  .%type idxitem {
7230: 54 6f 6b 65 6e 7d 0a 0a 69 64 78 6c 69 73 74 5f  Token}..idxlist_
7240: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7260: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 64       {A = 0;}.id
7270: 78 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  xlist_opt(A) ::=
7280: 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52   LP idxlist(X) R
7290: 50 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20  P.         {A = 
72a0: 58 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a  X;}.idxlist(A) :
72b0: 3a 3d 20 69 64 78 6c 69 73 74 28 58 29 20 43 4f  := idxlist(X) CO
72c0: 4d 4d 41 20 69 64 78 69 74 65 6d 28 59 29 20 63  MMA idxitem(Y) c
72d0: 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74 6f 72  ollate(C) sortor
72e0: 64 65 72 2e 20 20 7b 0a 20 20 45 78 70 72 20 2a  der.  {.  Expr *
72f0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 2e 6e  p = 0;.  if( C.n
7300: 3e 30 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  >0 ){.    p = sq
7310: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c  lite3Expr(TK_COL
7320: 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  UMN, 0, 0, 0);. 
7330: 20 20 20 69 66 28 20 70 20 29 20 70 2d 3e 70 43     if( p ) p->pC
7340: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  oll = sqlite3Loc
7350: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
7360: 65 2c 20 43 2e 7a 2c 20 43 2e 6e 29 3b 0a 20 20  e, C.z, C.n);.  
7370: 7d 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  }.  A = sqlite3E
7380: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  xprListAppend(X,
7390: 20 70 2c 20 26 59 29 3b 0a 7d 0a 69 64 78 6c 69   p, &Y);.}.idxli
73a0: 73 74 28 41 29 20 3a 3a 3d 20 69 64 78 69 74 65  st(A) ::= idxite
73b0: 6d 28 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20  m(Y) collate(C) 
73c0: 73 6f 72 74 6f 72 64 65 72 2e 20 7b 0a 20 20 45  sortorder. {.  E
73d0: 78 70 72 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66  xpr *p = 0;.  if
73e0: 28 20 43 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 70  ( C.n>0 ){.    p
73f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
7400: 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20  K_COLUMN, 0, 0, 
7410: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  0);.    if( p ) 
7420: 70 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  p->pColl = sqlit
7430: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
7440: 70 50 61 72 73 65 2c 20 43 2e 7a 2c 20 43 2e 6e  pParse, C.z, C.n
7450: 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c  );.  }.  A = sql
7460: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
7470: 6e 64 28 30 2c 20 70 2c 20 26 59 29 3b 0a 7d 0a  nd(0, p, &Y);.}.
7480: 69 64 78 69 74 65 6d 28 41 29 20 3a 3a 3d 20 6e  idxitem(A) ::= n
7490: 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  m(X).           
74a0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 0a 2f 2f     {A = X;}...//
74b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
74c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
74d0: 44 52 4f 50 20 49 4e 44 45 58 20 63 6f 6d 6d 61  DROP INDEX comma
74e0: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
74f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
7500: 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 49 4e 44  cmd ::= DROP IND
7510: 45 58 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20  EX fullname(X). 
7520: 20 20 7b 73 71 6c 69 74 65 33 44 72 6f 70 49 6e    {sqlite3DropIn
7530: 64 65 78 28 70 50 61 72 73 65 2c 20 58 29 3b 7d  dex(pParse, X);}
7540: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
7550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
7560: 54 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  The VACUUM comma
7570: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
7580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7590: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55  .//.cmd ::= VACU
75a0: 55 4d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  UM.             
75b0: 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75     {sqlite3Vacuu
75c0: 6d 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a 63 6d  m(pParse,0);}.cm
75d0: 64 20 3a 3a 3d 20 56 41 43 55 55 4d 20 6e 6d 2e  d ::= VACUUM nm.
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
75f0: 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50 61 72  lite3Vacuum(pPar
7600: 73 65 2c 30 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  se,0);}..///////
7610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7620: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d  ////// The PRAGM
7630: 41 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  A command //////
7640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7650: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64  ///////.//.%ifnd
7660: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
7670: 52 41 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52  RAGMA.cmd ::= PR
7680: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
7690: 5a 29 20 45 51 20 6e 6d 28 59 29 2e 20 20 7b 73  Z) EQ nm(Y).  {s
76a0: 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61  qlite3Pragma(pPa
76b0: 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b  rse,&X,&Z,&Y,0);
76c0: 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41  }.cmd ::= PRAGMA
76d0: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 45   nm(X) dbnm(Z) E
76e0: 51 20 4f 4e 28 59 29 2e 20 20 7b 73 71 6c 69 74  Q ON(Y).  {sqlit
76f0: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  e3Pragma(pParse,
7700: 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d  &X,&Z,&Y,0);}.cm
7710: 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28  d ::= PRAGMA nm(
7720: 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 70 6c  X) dbnm(Z) EQ pl
7730: 75 73 5f 6e 75 6d 28 59 29 2e 20 7b 73 71 6c 69  us_num(Y). {sqli
7740: 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65  te3Pragma(pParse
7750: 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63  ,&X,&Z,&Y,0);}.c
7760: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
7770: 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6d  (X) dbnm(Z) EQ m
7780: 69 6e 75 73 5f 6e 75 6d 28 59 29 2e 20 7b 0a 20  inus_num(Y). {. 
7790: 20 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70   sqlite3Pragma(p
77a0: 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31  Parse,&X,&Z,&Y,1
77b0: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  );.}.cmd ::= PRA
77c0: 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a  GMA nm(X) dbnm(Z
77d0: 29 20 4c 50 20 6e 6d 28 59 29 20 52 50 2e 20 7b  ) LP nm(Y) RP. {
77e0: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50  sqlite3Pragma(pP
77f0: 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29  arse,&X,&Z,&Y,0)
7800: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  ;}.cmd ::= PRAGM
7810: 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 2e  A nm(X) dbnm(Z).
7820: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
7830: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72  lite3Pragma(pPar
7840: 73 65 2c 26 58 2c 26 5a 2c 30 2c 30 29 3b 7d 0a  se,&X,&Z,0,0);}.
7850: 25 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49 54 45  %endif // SQLITE
7860: 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 70 6c 75  _OMIT_PRAGMA.plu
7870: 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75  s_num(A) ::= plu
7880: 73 5f 6f 70 74 20 6e 75 6d 62 65 72 28 58 29 2e  s_opt number(X).
7890: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75     {A = X;}.minu
78a0: 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e  s_num(A) ::= MIN
78b0: 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20  US number(X).   
78c0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65    {A = X;}.numbe
78d0: 72 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52  r(A) ::= INTEGER
78e0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
78f0: 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72   {A = X;}.number
7900: 28 41 29 20 3a 3a 3d 20 46 4c 4f 41 54 28 58 29  (A) ::= FLOAT(X)
7910: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7920: 7b 41 20 3d 20 58 3b 7d 0a 70 6c 75 73 5f 6f 70  {A = X;}.plus_op
7930: 74 20 3a 3a 3d 20 50 4c 55 53 2e 0a 70 6c 75 73  t ::= PLUS..plus
7940: 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f  _opt ::= ...////
7950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7960: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45  //////// The CRE
7970: 41 54 45 20 54 52 49 47 47 45 52 20 63 6f 6d 6d  ATE TRIGGER comm
7980: 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  and ////////////
7990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64  /////////..%ifnd
79a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
79b0: 52 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20  RIGGER..cmd ::= 
79c0: 43 52 45 41 54 45 20 74 72 69 67 67 65 72 5f 64  CREATE trigger_d
79d0: 65 63 6c 28 41 29 20 42 45 47 49 4e 20 74 72 69  ecl(A) BEGIN tri
79e0: 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53 29  gger_cmd_list(S)
79f0: 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f 6b   END(Z). {.  Tok
7a00: 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a 20  en all;.  all.z 
7a10: 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20 3d  = A.z;.  all.n =
7a20: 20 28 5a 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a   (Z.z - A.z) + Z
7a30: 2e 6e 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6e  .n;.  sqlite3Fin
7a40: 69 73 68 54 72 69 67 67 65 72 28 70 50 61 72 73  ishTrigger(pPars
7a50: 65 2c 20 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a 0a  e, S, &all);.}..
7a60: 74 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20  trigger_decl(A) 
7a70: 3a 3a 3d 20 74 65 6d 70 28 54 29 20 54 52 49 47  ::= temp(T) TRIG
7a80: 47 45 52 20 6e 6d 28 42 29 20 64 62 6e 6d 28 5a  GER nm(B) dbnm(Z
7a90: 29 20 74 72 69 67 67 65 72 5f 74 69 6d 65 28 43  ) trigger_time(C
7aa0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
7ab0: 20 20 20 20 20 20 74 72 69 67 67 65 72 5f 65 76        trigger_ev
7ac0: 65 6e 74 28 44 29 0a 20 20 20 20 20 20 20 20 20  ent(D).         
7ad0: 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20 66 75             ON fu
7ae0: 6c 6c 6e 61 6d 65 28 45 29 20 66 6f 72 65 61 63  llname(E) foreac
7af0: 68 5f 63 6c 61 75 73 65 28 46 29 20 77 68 65 6e  h_clause(F) when
7b00: 5f 63 6c 61 75 73 65 28 47 29 2e 20 7b 0a 20 20  _clause(G). {.  
7b10: 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69 67  sqlite3BeginTrig
7b20: 67 65 72 28 70 50 61 72 73 65 2c 20 26 42 2c 20  ger(pParse, &B, 
7b30: 26 5a 2c 20 43 2c 20 44 2e 61 2c 20 44 2e 62 2c  &Z, C, D.a, D.b,
7b40: 20 45 2c 20 46 2c 20 47 2c 20 54 29 3b 0a 20 20   E, F, G, T);.  
7b50: 41 20 3d 20 28 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29  A = (Z.n==0?B:Z)
7b60: 3b 0a 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  ;.}..%type trigg
7b70: 65 72 5f 74 69 6d 65 20 20 7b 69 6e 74 7d 0a 74  er_time  {int}.t
7b80: 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a  rigger_time(A) :
7b90: 3a 3d 20 42 45 46 4f 52 45 2e 20 20 20 20 20 20  := BEFORE.      
7ba0: 7b 20 41 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b  { A = TK_BEFORE;
7bb0: 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28   }.trigger_time(
7bc0: 41 29 20 3a 3a 3d 20 41 46 54 45 52 2e 20 20 20  A) ::= AFTER.   
7bd0: 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 41 46 54      { A = TK_AFT
7be0: 45 52 3b 20 20 7d 0a 74 72 69 67 67 65 72 5f 74  ER;  }.trigger_t
7bf0: 69 6d 65 28 41 29 20 3a 3a 3d 20 49 4e 53 54 45  ime(A) ::= INSTE
7c00: 41 44 20 4f 46 2e 20 20 7b 20 41 20 3d 20 54 4b  AD OF.  { A = TK
7c10: 5f 49 4e 53 54 45 41 44 3b 7d 0a 74 72 69 67 67  _INSTEAD;}.trigg
7c20: 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 2e  er_time(A) ::= .
7c30: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
7c40: 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a 0a  = TK_BEFORE; }..
7c50: 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 65 76  %type trigger_ev
7c60: 65 6e 74 20 7b 73 74 72 75 63 74 20 54 72 69 67  ent {struct Trig
7c70: 45 76 65 6e 74 7d 0a 25 64 65 73 74 72 75 63 74  Event}.%destruct
7c80: 6f 72 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74  or trigger_event
7c90: 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   {sqlite3IdListD
7ca0: 65 6c 65 74 65 28 24 24 2e 62 29 3b 7d 0a 74 72  elete($$.b);}.tr
7cb0: 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a  igger_event(A) :
7cc0: 3a 3d 20 44 45 4c 45 54 45 28 4f 50 29 2e 20 20  := DELETE(OP).  
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 61              {A.a
7ce0: 20 3d 20 40 4f 50 3b 20 41 2e 62 20 3d 20 30 3b   = @OP; A.b = 0;
7cf0: 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28  }.trigger_event(
7d00: 41 29 20 3a 3a 3d 20 49 4e 53 45 52 54 28 4f 50  A) ::= INSERT(OP
7d10: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
7d20: 7b 41 2e 61 20 3d 20 40 4f 50 3b 20 41 2e 62 20  {A.a = @OP; A.b 
7d30: 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76  = 0;}.trigger_ev
7d40: 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54  ent(A) ::= UPDAT
7d50: 45 28 4f 50 29 2e 20 20 20 20 20 20 20 20 20 20  E(OP).          
7d60: 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b 20      {A.a = @OP; 
7d70: 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65  A.b = 0;}.trigge
7d80: 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55  r_event(A) ::= U
7d90: 50 44 41 54 45 20 4f 46 20 69 6e 73 63 6f 6c 6c  PDATE OF inscoll
7da0: 69 73 74 28 58 29 2e 20 7b 41 2e 61 20 3d 20 54  ist(X). {A.a = T
7db0: 4b 5f 55 50 44 41 54 45 3b 20 41 2e 62 20 3d 20  K_UPDATE; A.b = 
7dc0: 58 3b 7d 0a 0a 25 74 79 70 65 20 66 6f 72 65 61  X;}..%type forea
7dd0: 63 68 5f 63 6c 61 75 73 65 20 7b 69 6e 74 7d 0a  ch_clause {int}.
7de0: 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28 41  foreach_clause(A
7df0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
7e00: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
7e10: 54 4b 5f 52 4f 57 3b 20 7d 0a 66 6f 72 65 61 63  TK_ROW; }.foreac
7e20: 68 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20  h_clause(A) ::= 
7e30: 46 4f 52 20 45 41 43 48 20 52 4f 57 2e 20 20 20  FOR EACH ROW.   
7e40: 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 52 4f 57      { A = TK_ROW
7e50: 3b 20 7d 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75  ; }.foreach_clau
7e60: 73 65 28 41 29 20 3a 3a 3d 20 46 4f 52 20 45 41  se(A) ::= FOR EA
7e70: 43 48 20 53 54 41 54 45 4d 45 4e 54 2e 20 7b 20  CH STATEMENT. { 
7e80: 41 20 3d 20 54 4b 5f 53 54 41 54 45 4d 45 4e 54  A = TK_STATEMENT
7e90: 3b 20 7d 0a 0a 25 74 79 70 65 20 77 68 65 6e 5f  ; }..%type when_
7ea0: 63 6c 61 75 73 65 20 7b 45 78 70 72 2a 7d 0a 77  clause {Expr*}.w
7eb0: 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a  hen_clause(A) ::
7ec0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
7ed0: 7b 20 41 20 3d 20 30 3b 20 7d 0a 77 68 65 6e 5f  { A = 0; }.when_
7ee0: 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 57 48  clause(A) ::= WH
7ef0: 45 4e 20 65 78 70 72 28 58 29 2e 20 7b 20 41 20  EN expr(X). { A 
7f00: 3d 20 58 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72  = X; }..%type tr
7f10: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b  igger_cmd_list {
7f20: 54 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 64  TriggerStep*}.%d
7f30: 65 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 65  estructor trigge
7f40: 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 73 71 6c 69  r_cmd_list {sqli
7f50: 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72  te3DeleteTrigger
7f60: 53 74 65 70 28 24 24 29 3b 7d 0a 74 72 69 67 67  Step($$);}.trigg
7f70: 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a  er_cmd_list(A) :
7f80: 3a 3d 20 74 72 69 67 67 65 72 5f 63 6d 64 28 58  := trigger_cmd(X
7f90: 29 20 53 45 4d 49 20 74 72 69 67 67 65 72 5f 63  ) SEMI trigger_c
7fa0: 6d 64 5f 6c 69 73 74 28 59 29 2e 20 7b 0a 20 20  md_list(Y). {.  
7fb0: 58 2d 3e 70 4e 65 78 74 20 3d 20 59 3b 0a 20 20  X->pNext = Y;.  
7fc0: 41 20 3d 20 58 3b 0a 7d 0a 74 72 69 67 67 65 72  A = X;.}.trigger
7fd0: 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d  _cmd_list(A) ::=
7fe0: 20 2e 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 0a 25   . { A = 0; }..%
7ff0: 74 79 70 65 20 74 72 69 67 67 65 72 5f 63 6d 64  type trigger_cmd
8000: 20 7b 54 72 69 67 67 65 72 53 74 65 70 2a 7d 0a   {TriggerStep*}.
8010: 25 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67  %destructor trig
8020: 67 65 72 5f 63 6d 64 20 7b 73 71 6c 69 74 65 33  ger_cmd {sqlite3
8030: 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74 65  DeleteTriggerSte
8040: 70 28 24 24 29 3b 7d 0a 2f 2f 20 55 50 44 41 54  p($$);}.// UPDAT
8050: 45 20 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  E .trigger_cmd(A
8060: 29 20 3a 3a 3d 20 55 50 44 41 54 45 20 6f 72 63  ) ::= UPDATE orc
8070: 6f 6e 66 28 52 29 20 6e 6d 28 58 29 20 53 45 54  onf(R) nm(X) SET
8080: 20 73 65 74 6c 69 73 74 28 59 29 20 77 68 65 72   setlist(Y) wher
8090: 65 5f 6f 70 74 28 5a 29 2e 20 20 0a 20 20 20 20  e_opt(Z).  .    
80a0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
80b0: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 55   sqlite3TriggerU
80c0: 70 64 61 74 65 53 74 65 70 28 26 58 2c 20 59 2c  pdateStep(&X, Y,
80d0: 20 5a 2c 20 52 29 3b 20 7d 0a 0a 2f 2f 20 49 4e   Z, R); }..// IN
80e0: 53 45 52 54 0a 74 72 69 67 67 65 72 5f 63 6d 64  SERT.trigger_cmd
80f0: 28 41 29 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63  (A) ::= insert_c
8100: 6d 64 28 52 29 20 49 4e 54 4f 20 6e 6d 28 58 29  md(R) INTO nm(X)
8110: 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28   inscollist_opt(
8120: 46 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  F) .            
8130: 20 20 20 20 20 20 20 56 41 4c 55 45 53 20 4c 50         VALUES LP
8140: 20 69 74 65 6d 6c 69 73 74 28 59 29 20 52 50 2e   itemlist(Y) RP.
8150: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
8160: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72    {A = sqlite3Tr
8170: 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 70 28  iggerInsertStep(
8180: 26 58 2c 20 46 2c 20 59 2c 20 30 2c 20 52 29 3b  &X, F, Y, 0, R);
8190: 7d 0a 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  }..trigger_cmd(A
81a0: 29 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64  ) ::= insert_cmd
81b0: 28 52 29 20 49 4e 54 4f 20 6e 6d 28 58 29 20 69  (R) INTO nm(X) i
81c0: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29  nscollist_opt(F)
81d0: 20 73 65 6c 65 63 74 28 53 29 2e 0a 20 20 20 20   select(S)..    
81e0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
81f0: 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 49 6e  sqlite3TriggerIn
8200: 73 65 72 74 53 74 65 70 28 26 58 2c 20 46 2c 20  sertStep(&X, F, 
8210: 30 2c 20 53 2c 20 52 29 3b 7d 0a 0a 2f 2f 20 44  0, S, R);}..// D
8220: 45 4c 45 54 45 0a 74 72 69 67 67 65 72 5f 63 6d  ELETE.trigger_cm
8230: 64 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 20  d(A) ::= DELETE 
8240: 46 52 4f 4d 20 6e 6d 28 58 29 20 77 68 65 72 65  FROM nm(X) where
8250: 5f 6f 70 74 28 59 29 2e 0a 20 20 20 20 20 20 20  _opt(Y)..       
8260: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
8270: 69 74 65 33 54 72 69 67 67 65 72 44 65 6c 65 74  ite3TriggerDelet
8280: 65 53 74 65 70 28 26 58 2c 20 59 29 3b 7d 0a 0a  eStep(&X, Y);}..
8290: 2f 2f 20 53 45 4c 45 43 54 0a 74 72 69 67 67 65  // SELECT.trigge
82a0: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 73 65 6c  r_cmd(A) ::= sel
82b0: 65 63 74 28 58 29 2e 20 20 7b 41 20 3d 20 73 71  ect(X).  {A = sq
82c0: 6c 69 74 65 33 54 72 69 67 67 65 72 53 65 6c 65  lite3TriggerSele
82d0: 63 74 53 74 65 70 28 58 29 3b 20 7d 0a 0a 2f 2f  ctStep(X); }..//
82e0: 20 54 68 65 20 73 70 65 63 69 61 6c 20 52 41 49   The special RAI
82f0: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  SE expression th
8300: 61 74 20 6d 61 79 20 6f 63 63 75 72 20 69 6e 20  at may occur in 
8310: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73  trigger programs
8320: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52 41 49  .expr(A) ::= RAI
8330: 53 45 28 58 29 20 4c 50 20 49 47 4e 4f 52 45 20  SE(X) LP IGNORE 
8340: 52 50 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20  RP(Y).  {.  A = 
8350: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52  sqlite3Expr(TK_R
8360: 41 49 53 45 2c 20 30 2c 20 30 2c 20 30 29 3b 20  AISE, 0, 0, 0); 
8370: 0a 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  .  A->iColumn = 
8380: 4f 45 5f 49 67 6e 6f 72 65 3b 0a 20 20 73 71 6c  OE_Ignore;.  sql
8390: 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 20  ite3ExprSpan(A, 
83a0: 26 58 2c 20 26 59 29 3b 0a 7d 0a 65 78 70 72 28  &X, &Y);.}.expr(
83b0: 41 29 20 3a 3a 3d 20 52 41 49 53 45 28 58 29 20  A) ::= RAISE(X) 
83c0: 4c 50 20 72 61 69 73 65 74 79 70 65 28 54 29 20  LP raisetype(T) 
83d0: 43 4f 4d 4d 41 20 6e 6d 28 5a 29 20 52 50 28 59  COMMA nm(Z) RP(Y
83e0: 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  ).  {.  A = sqli
83f0: 74 65 33 45 78 70 72 28 54 4b 5f 52 41 49 53 45  te3Expr(TK_RAISE
8400: 2c 20 30 2c 20 30 2c 20 26 5a 29 3b 20 0a 20 20  , 0, 0, &Z); .  
8410: 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 54 3b 0a  A->iColumn = T;.
8420: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
8430: 6e 28 41 2c 20 26 58 2c 20 26 59 29 3b 0a 7d 0a  n(A, &X, &Y);.}.
8440: 25 65 6e 64 69 66 20 2f 2f 20 21 53 51 4c 49 54  %endif // !SQLIT
8450: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a  E_OMIT_TRIGGER..
8460: 25 74 79 70 65 20 72 61 69 73 65 74 79 70 65 20  %type raisetype 
8470: 7b 69 6e 74 7d 0a 72 61 69 73 65 74 79 70 65 28  {int}.raisetype(
8480: 41 29 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 2e  A) ::= ROLLBACK.
8490: 20 20 7b 41 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61    {A = OE_Rollba
84a0: 63 6b 3b 7d 0a 72 61 69 73 65 74 79 70 65 28 41  ck;}.raisetype(A
84b0: 29 20 3a 3a 3d 20 41 42 4f 52 54 2e 20 20 20 20  ) ::= ABORT.    
84c0: 20 7b 41 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d   {A = OE_Abort;}
84d0: 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a 3a  .raisetype(A) ::
84e0: 3d 20 46 41 49 4c 2e 20 20 20 20 20 20 7b 41 20  = FAIL.      {A 
84f0: 3d 20 4f 45 5f 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f  = OE_Fail;}...//
8500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8510: 2f 2f 2f 2f 2f 2f 20 20 44 52 4f 50 20 54 52 49  //////  DROP TRI
8520: 47 47 45 52 20 73 74 61 74 65 6d 65 6e 74 20 2f  GGER statement /
8530: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69  /////////////.%i
8550: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8560: 54 5f 54 52 49 47 47 45 52 0a 63 6d 64 20 3a 3a  T_TRIGGER.cmd ::
8570: 3d 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 66  = DROP TRIGGER f
8580: 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20  ullname(X). {.  
8590: 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67  sqlite3DropTrigg
85a0: 65 72 28 70 50 61 72 73 65 2c 58 29 3b 0a 7d 0a  er(pParse,X);.}.
85b0: 25 65 6e 64 69 66 20 2f 2f 20 21 53 51 4c 49 54  %endif // !SQLIT
85c0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a  E_OMIT_TRIGGER..
85d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
85e0: 2f 2f 2f 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 20  //////// ATTACH 
85f0: 44 41 54 41 42 41 53 45 20 66 69 6c 65 20 41 53  DATABASE file AS
8600: 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   name //////////
8610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
8620: 63 6d 64 20 3a 3a 3d 20 41 54 54 41 43 48 20 64  cmd ::= ATTACH d
8630: 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 69  atabase_kw_opt i
8640: 64 73 28 46 29 20 41 53 20 6e 6d 28 44 29 20 6b  ds(F) AS nm(D) k
8650: 65 79 5f 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73  ey_opt(K). {.  s
8660: 71 6c 69 74 65 33 41 74 74 61 63 68 28 70 50 61  qlite3Attach(pPa
8670: 72 73 65 2c 20 26 46 2c 20 26 44 2c 20 4b 2e 74  rse, &F, &D, K.t
8680: 79 70 65 2c 20 26 4b 2e 6b 65 79 29 3b 0a 7d 0a  ype, &K.key);.}.
8690: 25 74 79 70 65 20 6b 65 79 5f 6f 70 74 20 7b 73  %type key_opt {s
86a0: 74 72 75 63 74 20 41 74 74 61 63 68 4b 65 79 7d  truct AttachKey}
86b0: 0a 6b 65 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  .key_opt(A) ::= 
86c0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
86d0: 20 20 20 20 20 20 7b 20 41 2e 74 79 70 65 20 3d        { A.type =
86e0: 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41 29   0; }.key_opt(A)
86f0: 20 3a 3a 3d 20 4b 45 59 20 69 64 73 28 58 29 2e   ::= KEY ids(X).
8700: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 2e 74             { A.t
8710: 79 70 65 3d 31 3b 20 41 2e 6b 65 79 20 3d 20 58  ype=1; A.key = X
8720: 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20 3a  ; }.key_opt(A) :
8730: 3a 3d 20 4b 45 59 20 42 4c 4f 42 28 58 29 2e 20  := KEY BLOB(X). 
8740: 20 20 20 20 20 20 20 20 20 7b 20 41 2e 74 79 70           { A.typ
8750: 65 3d 32 3b 20 41 2e 6b 65 79 20 3d 20 58 3b 20  e=2; A.key = X; 
8760: 7d 0a 0a 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f  }..database_kw_o
8770: 70 74 20 3a 3a 3d 20 44 41 54 41 42 41 53 45 2e  pt ::= DATABASE.
8780: 0a 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74  .database_kw_opt
8790: 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f   ::= ...////////
87a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87b0: 20 44 45 54 41 43 48 20 44 41 54 41 42 41 53 45   DETACH DATABASE
87c0: 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   name //////////
87d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87e0: 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ///////.cmd ::= 
87f0: 44 45 54 41 43 48 20 64 61 74 61 62 61 73 65 5f  DETACH database_
8800: 6b 77 5f 6f 70 74 20 6e 6d 28 44 29 2e 20 7b 0a  kw_opt nm(D). {.
8810: 20 20 73 71 6c 69 74 65 33 44 65 74 61 63 68 28    sqlite3Detach(
8820: 70 50 61 72 73 65 2c 20 26 44 29 3b 0a 7d 0a 0a  pParse, &D);.}..
8830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44  ////////// REIND
8850: 45 58 20 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f  EX collation ///
8860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
8880: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
8890: 4d 49 54 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20  MIT_REINDEX.cmd 
88a0: 3a 3a 3d 20 52 45 49 4e 44 45 58 2e 20 20 20 20  ::= REINDEX.    
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
88c0: 69 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72  ite3Reindex(pPar
88d0: 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20  se, 0, 0);}.cmd 
88e0: 3a 3a 3d 20 52 45 49 4e 44 45 58 20 6e 6d 28 58  ::= REINDEX nm(X
88f0: 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c  ) dbnm(Y).  {sql
8900: 69 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72  ite3Reindex(pPar
8910: 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65  se, &X, &Y);}.%e
8920: 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ndif..//////////
8930: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41  ////////////// A
8940: 4c 54 45 52 20 54 41 42 4c 45 20 74 61 62 6c 65  LTER TABLE table
8950: 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ... ///////////
8960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8970: 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51  /////.%ifndef SQ
8980: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
8990: 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20 41 4c 54  ABLE.cmd ::= ALT
89a0: 45 52 20 54 41 42 4c 45 20 66 75 6c 6c 6e 61 6d  ER TABLE fullnam
89b0: 65 28 58 29 20 52 45 4e 41 4d 45 20 54 4f 20 6e  e(X) RENAME TO n
89c0: 6d 28 5a 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  m(Z). {.  sqlite
89d0: 33 41 6c 74 65 72 52 65 6e 61 6d 65 54 61 62 6c  3AlterRenameTabl
89e0: 65 28 70 50 61 72 73 65 2c 58 2c 26 5a 29 3b 0a  e(pParse,X,&Z);.
89f0: 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4c 54 45 52 20  }.cmd ::= ALTER 
8a00: 54 41 42 4c 45 20 61 64 64 5f 63 6f 6c 75 6d 6e  TABLE add_column
8a10: 5f 66 75 6c 6c 6e 61 6d 65 20 41 44 44 20 6b 77  _fullname ADD kw
8a20: 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63 6f 6c 75 6d  column_opt colum
8a30: 6e 28 59 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  n(Y). {.  sqlite
8a40: 33 41 6c 74 65 72 46 69 6e 69 73 68 41 64 64 43  3AlterFinishAddC
8a50: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 26 59  olumn(pParse, &Y
8a60: 29 3b 0a 7d 0a 61 64 64 5f 63 6f 6c 75 6d 6e 5f  );.}.add_column_
8a70: 66 75 6c 6c 6e 61 6d 65 20 3a 3a 3d 20 66 75 6c  fullname ::= ful
8a80: 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71  lname(X). {.  sq
8a90: 6c 69 74 65 33 41 6c 74 65 72 42 65 67 69 6e 41  lite3AlterBeginA
8aa0: 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ddColumn(pParse,
8ab0: 20 58 29 3b 0a 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f   X);.}.kwcolumn_
8ac0: 6f 70 74 20 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75  opt ::= ..kwcolu
8ad0: 6d 6e 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d  mn_opt ::= COLUM
8ae0: 4e 4b 57 2e 0a 25 65 6e 64 69 66 0a              NKW..%endif.