/ Hex Artifact Content
Login

Artifact 0b6135268a7a29db35335d5b71b5a8791e02f91e:


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 36 37 20 32 30 30 35 2f 30 33 2f 30 39 20  .167 2005/03/09 
0290: 31 32 3a 32 36 3a 35 31 20 64 61 6e 69 65 6c 6b  12:26:51 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 74  ype temp {int}.t
0dd0: 65 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e  emp(A) ::= TEMP.
0de0: 20 20 7b 41 20 3d 20 31 3b 7d 0a 74 65 6d 70 28    {A = 1;}.temp(
0df0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 7b 41  A) ::= .      {A
0e00: 20 3d 20 30 3b 7d 0a 63 72 65 61 74 65 5f 74 61   = 0;}.create_ta
0e10: 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 4c 50 20  ble_args ::= LP 
0e20: 63 6f 6c 75 6d 6e 6c 69 73 74 20 63 6f 6e 73 6c  columnlist consl
0e30: 69 73 74 5f 6f 70 74 20 52 50 28 58 29 2e 20 7b  ist_opt RP(X). {
0e40: 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  .  sqlite3EndTab
0e50: 6c 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b  le(pParse,&X,0);
0e60: 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f  .}.create_table_
0e70: 61 72 67 73 20 3a 3a 3d 20 41 53 20 73 65 6c 65  args ::= AS sele
0e80: 63 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74  ct(S). {.  sqlit
0e90: 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
0ea0: 65 2c 30 2c 53 29 3b 0a 20 20 73 71 6c 69 74 65  e,0,S);.  sqlite
0eb0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 53 29  3SelectDelete(S)
0ec0: 3b 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a  ;.}.columnlist :
0ed0: 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 43 4f  := columnlist CO
0ee0: 4d 4d 41 20 63 6f 6c 75 6d 6e 2e 0a 63 6f 6c 75  MMA column..colu
0ef0: 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d  mnlist ::= colum
0f00: 6e 2e 0a 0a 2f 2f 20 41 62 6f 75 74 20 74 68 65  n...// About the
0f10: 20 6f 6e 6c 79 20 69 6e 66 6f 72 6d 61 74 69 6f   only informatio
0f20: 6e 20 75 73 65 64 20 66 6f 72 20 61 20 63 6f 6c  n used for a col
0f30: 75 6d 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  umn is the name 
0f40: 6f 66 20 74 68 65 0a 2f 2f 20 63 6f 6c 75 6d 6e  of the.// column
0f50: 2e 20 20 54 68 65 20 74 79 70 65 20 69 73 20 61  .  The type is a
0f60: 6c 77 61 79 73 20 6a 75 73 74 20 22 74 65 78 74  lways just "text
0f70: 22 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65  ".  But the code
0f80: 20 77 69 6c 6c 20 61 63 63 65 70 74 0a 2f 2f 20   will accept.// 
0f90: 61 6e 20 65 6c 61 62 6f 72 61 74 65 20 74 79 70  an elaborate typ
0fa0: 65 6e 61 6d 65 2e 20 20 50 65 72 68 61 70 73 20  ename.  Perhaps 
0fb0: 73 6f 6d 65 64 61 79 20 77 65 27 6c 6c 20 64 6f  someday we'll do
0fc0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20   something with 
0fd0: 69 74 2e 0a 2f 2f 0a 63 6f 6c 75 6d 6e 20 3a 3a  it..//.column ::
0fe0: 3d 20 63 6f 6c 75 6d 6e 69 64 20 74 79 70 65 20  = columnid type 
0ff0: 63 61 72 67 6c 69 73 74 2e 20 0a 63 6f 6c 75 6d  carglist. .colum
1000: 6e 69 64 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20  nid ::= nm(X).  
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
1020: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28  qlite3AddColumn(
1030: 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 0a 2f 2f  pParse,&X);}..//
1040: 20 41 6e 20 49 44 45 4e 54 49 46 49 45 52 20 63   An IDENTIFIER c
1050: 61 6e 20 62 65 20 61 20 67 65 6e 65 72 69 63 20  an be a generic 
1060: 69 64 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f  identifier, or o
1070: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f  ne of several.//
1080: 20 6b 65 79 77 6f 72 64 73 2e 20 20 41 6e 79 20   keywords.  Any 
1090: 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 6b 65 79  non-standard key
10a0: 77 6f 72 64 20 63 61 6e 20 61 6c 73 6f 20 62 65  word can also be
10b0: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 2e 0a   an identifier..
10c0: 2f 2f 0a 25 74 79 70 65 20 69 64 20 7b 54 6f 6b  //.%type id {Tok
10d0: 65 6e 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 49 44  en}.id(A) ::= ID
10e0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
10f0: 3d 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f  = X;}..// The fo
1100: 6c 6c 6f 77 69 6e 67 20 64 69 72 65 63 74 69 76  llowing directiv
1110: 65 20 63 61 75 73 65 73 20 74 6f 6b 65 6e 73 20  e causes tokens 
1120: 41 42 4f 52 54 2c 20 41 46 54 45 52 2c 20 41 53  ABORT, AFTER, AS
1130: 43 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61  C, etc. to.// fa
1140: 6c 6c 62 61 63 6b 20 74 6f 20 49 44 20 69 66 20  llback to ID if 
1150: 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61  they will not pa
1160: 72 73 65 20 61 73 20 74 68 65 69 72 20 6f 72 69  rse as their ori
1170: 67 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20  ginal value..// 
1180: 54 68 69 73 20 6f 62 76 69 61 74 65 73 20 74 68  This obviates th
1190: 65 20 6e 65 65 64 20 66 6f 72 20 74 68 65 20 22  e need for the "
11a0: 69 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  id" nonterminal.
11b0: 0a 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44  .//.%fallback ID
11c0: 0a 20 20 41 42 4f 52 54 20 41 46 54 45 52 20 41  .  ABORT AFTER A
11d0: 53 43 20 41 54 54 41 43 48 20 42 45 46 4f 52 45  SC ATTACH BEFORE
11e0: 20 42 45 47 49 4e 20 43 41 53 43 41 44 45 20 43   BEGIN CASCADE C
11f0: 4f 4e 46 4c 49 43 54 0a 20 20 44 41 54 41 42 41  ONFLICT.  DATABA
1200: 53 45 20 44 45 46 45 52 52 45 44 20 44 45 53 43  SE DEFERRED DESC
1210: 20 44 45 54 41 43 48 20 45 41 43 48 20 45 4e 44   DETACH EACH END
1220: 20 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c 41   EXCLUSIVE EXPLA
1230: 49 4e 20 46 41 49 4c 20 46 4f 52 0a 20 20 47 4c  IN FAIL FOR.  GL
1240: 4f 42 20 49 47 4e 4f 52 45 20 49 4d 4d 45 44 49  OB IGNORE IMMEDI
1250: 41 54 45 20 49 4e 49 54 49 41 4c 4c 59 20 49 4e  ATE INITIALLY IN
1260: 53 54 45 41 44 20 4c 49 4b 45 20 4d 41 54 43 48  STEAD LIKE MATCH
1270: 20 4b 45 59 0a 20 20 4f 46 20 4f 46 46 53 45 54   KEY.  OF OFFSET
1280: 20 50 52 41 47 4d 41 20 52 41 49 53 45 20 52 45   PRAGMA RAISE RE
1290: 50 4c 41 43 45 20 52 45 53 54 52 49 43 54 20 52  PLACE RESTRICT R
12a0: 4f 57 20 53 54 41 54 45 4d 45 4e 54 0a 20 20 54  OW STATEMENT.  T
12b0: 45 4d 50 20 54 52 49 47 47 45 52 20 56 41 43 55  EMP TRIGGER VACU
12c0: 55 4d 20 56 49 45 57 0a 25 69 66 64 65 66 20 53  UM VIEW.%ifdef S
12d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
12e0: 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20 45 58 43  UND_SELECT.  EXC
12f0: 45 50 54 20 49 4e 54 45 52 53 45 43 54 20 55 4e  EPT INTERSECT UN
1300: 49 4f 4e 0a 25 65 6e 64 69 66 0a 20 20 52 45 49  ION.%endif.  REI
1310: 4e 44 45 58 20 52 45 4e 41 4d 45 20 43 44 41 54  NDEX RENAME CDAT
1320: 45 20 43 54 49 4d 45 20 43 54 49 4d 45 53 54 41  E CTIME CTIMESTA
1330: 4d 50 20 41 4c 54 45 52 0a 20 20 2e 0a 0a 2f 2f  MP ALTER.  ...//
1340: 20 44 65 66 69 6e 65 20 6f 70 65 72 61 74 6f 72   Define operator
1350: 20 70 72 65 63 65 64 65 6e 63 65 20 65 61 72 6c   precedence earl
1360: 79 20 73 6f 20 74 68 61 74 20 74 68 69 73 20 69  y so that this i
1370: 73 20 74 68 65 20 66 69 72 73 74 20 6f 63 63 75  s the first occu
1380: 72 61 6e 63 65 0a 2f 2f 20 6f 66 20 74 68 65 20  rance.// of the 
1390: 6f 70 65 72 61 74 6f 72 20 74 6f 6b 65 6e 73 20  operator tokens 
13a0: 69 6e 20 74 68 65 20 67 72 61 6d 6d 65 72 2e 20  in the grammer. 
13b0: 20 4b 65 65 70 69 6e 67 20 74 68 65 20 6f 70 65   Keeping the ope
13c0: 72 61 74 6f 72 73 20 74 6f 67 65 74 68 65 72 0a  rators together.
13d0: 2f 2f 20 63 61 75 73 65 73 20 74 68 65 6d 20 74  // causes them t
13e0: 6f 20 62 65 20 61 73 73 69 67 6e 65 64 20 69 6e  o be assigned in
13f0: 74 65 67 65 72 20 76 61 6c 75 65 73 20 74 68 61  teger values tha
1400: 74 20 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65  t are close toge
1410: 74 68 65 72 2c 0a 2f 2f 20 77 68 69 63 68 20 6b  ther,.// which k
1420: 65 65 70 73 20 70 61 72 73 65 72 20 74 61 62 6c  eeps parser tabl
1430: 65 73 20 73 6d 61 6c 6c 65 72 2e 0a 2f 2f 0a 2f  es smaller..//./
1440: 2f 20 54 68 65 20 74 6f 6b 65 6e 20 76 61 6c 75  / The token valu
1450: 65 73 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  es assigned to t
1460: 68 65 73 65 20 73 79 6d 62 6f 6c 73 20 69 73 20  hese symbols is 
1470: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
1480: 65 20 6f 72 64 65 72 0a 2f 2f 20 69 6e 20 77 68  e order.// in wh
1490: 69 63 68 20 6c 65 6d 6f 6e 20 66 69 72 73 74 20  ich lemon first 
14a0: 73 65 65 73 20 74 68 65 6d 2e 20 20 49 74 20 6d  sees them.  It m
14b0: 75 73 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ust be the case 
14c0: 74 68 61 74 20 49 53 4e 55 4c 4c 2f 4e 4f 54 4e  that ISNULL/NOTN
14d0: 55 4c 4c 2c 0a 2f 2f 20 4e 45 2f 45 51 2c 20 47  ULL,.// NE/EQ, G
14e0: 54 2f 4c 45 2c 20 61 6e 64 20 47 45 2f 4c 54 20  T/LE, and GE/LT 
14f0: 61 72 65 20 73 65 70 61 72 61 74 65 64 20 62 79  are separated by
1500: 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 76   only a single v
1510: 61 6c 75 65 2e 20 20 53 65 65 0a 2f 2f 20 74 68  alue.  See.// th
1520: 65 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  e sqlite3ExprIfF
1530: 61 6c 73 65 28 29 20 72 6f 75 74 69 6e 65 20 66  alse() routine f
1540: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
1550: 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 69  formation on thi
1560: 73 0a 2f 2f 20 63 6f 6e 73 74 72 61 69 6e 74 2e  s.// constraint.
1570: 0a 2f 2f 0a 25 6c 65 66 74 20 4f 52 2e 0a 25 6c  .//.%left OR..%l
1580: 65 66 74 20 41 4e 44 2e 0a 25 72 69 67 68 74 20  eft AND..%right 
1590: 4e 4f 54 2e 0a 25 6c 65 66 74 20 49 53 20 4c 49  NOT..%left IS LI
15a0: 4b 45 20 47 4c 4f 42 20 42 45 54 57 45 45 4e 20  KE GLOB BETWEEN 
15b0: 49 4e 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c  IN ISNULL NOTNUL
15c0: 4c 20 4e 45 20 45 51 2e 0a 25 6c 65 66 74 20 47  L NE EQ..%left G
15d0: 54 20 4c 45 20 4c 54 20 47 45 2e 0a 25 72 69 67  T LE LT GE..%rig
15e0: 68 74 20 45 53 43 41 50 45 2e 0a 25 6c 65 66 74  ht ESCAPE..%left
15f0: 20 42 49 54 41 4e 44 20 42 49 54 4f 52 20 4c 53   BITAND BITOR LS
1600: 48 49 46 54 20 52 53 48 49 46 54 2e 0a 25 6c 65  HIFT RSHIFT..%le
1610: 66 74 20 50 4c 55 53 20 4d 49 4e 55 53 2e 0a 25  ft PLUS MINUS..%
1620: 6c 65 66 74 20 53 54 41 52 20 53 4c 41 53 48 20  left STAR SLASH 
1630: 52 45 4d 2e 0a 25 6c 65 66 74 20 43 4f 4e 43 41  REM..%left CONCA
1640: 54 2e 0a 25 72 69 67 68 74 20 55 4d 49 4e 55 53  T..%right UMINUS
1650: 20 55 50 4c 55 53 20 42 49 54 4e 4f 54 2e 0a 0a   UPLUS BITNOT...
1660: 2f 2f 20 41 6e 64 20 22 69 64 73 22 20 69 73 20  // And "ids" is 
1670: 61 6e 20 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d  an identifer-or-
1680: 73 74 72 69 6e 67 2e 0a 2f 2f 0a 25 74 79 70 65  string..//.%type
1690: 20 69 64 73 20 7b 54 6f 6b 65 6e 7d 0a 69 64 73   ids {Token}.ids
16a0: 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20  (A) ::= ID(X).  
16b0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69        {A = X;}.i
16c0: 64 73 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47  ds(A) ::= STRING
16d0: 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d  (X).    {A = X;}
16e0: 0a 0a 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66  ..// The name of
16f0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 72 20 74 61 62   a column or tab
1700: 6c 65 20 63 61 6e 20 62 65 20 61 6e 79 20 6f 66  le can be any of
1710: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
1720: 2f 2f 0a 25 74 79 70 65 20 6e 6d 20 7b 54 6f 6b  //.%type nm {Tok
1730: 65 6e 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 49 44  en}.nm(A) ::= ID
1740: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
1750: 3d 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20  = X;}.nm(A) ::= 
1760: 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20 20 7b  STRING(X).     {
1770: 41 20 3d 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a 3a  A = X;}.nm(A) ::
1780: 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20  = JOIN_KW(X).   
1790: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 74 79 70 65 20   {A = X;}..type 
17a0: 3a 3a 3d 20 2e 0a 74 79 70 65 20 3a 3a 3d 20 74  ::= ..type ::= t
17b0: 79 70 65 6e 61 6d 65 28 58 29 2e 20 20 20 20 20  ypename(X).     
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
17d0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
17e0: 54 79 70 65 28 70 50 61 72 73 65 2c 26 58 2c 26  Type(pParse,&X,&
17f0: 58 29 3b 7d 0a 74 79 70 65 20 3a 3a 3d 20 74 79  X);}.type ::= ty
1800: 70 65 6e 61 6d 65 28 58 29 20 4c 50 20 73 69 67  pename(X) LP sig
1810: 6e 65 64 20 52 50 28 59 29 2e 20 20 20 20 7b 73  ned RP(Y).    {s
1820: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
1830: 79 70 65 28 70 50 61 72 73 65 2c 26 58 2c 26 59  ype(pParse,&X,&Y
1840: 29 3b 7d 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70  );}.type ::= typ
1850: 65 6e 61 6d 65 28 58 29 20 4c 50 20 73 69 67 6e  ename(X) LP sign
1860: 65 64 20 43 4f 4d 4d 41 20 73 69 67 6e 65 64 20  ed COMMA signed 
1870: 52 50 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20  RP(Y)..         
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 7b 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d  {sqlite3AddColum
18b0: 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 58 2c  nType(pParse,&X,
18c0: 26 59 29 3b 7d 0a 25 74 79 70 65 20 74 79 70 65  &Y);}.%type type
18d0: 6e 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70  name {Token}.typ
18e0: 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73  ename(A) ::= ids
18f0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
1900: 20 7b 41 20 3d 20 58 3b 7d 0a 74 79 70 65 6e 61   {A = X;}.typena
1910: 6d 65 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61  me(A) ::= typena
1920: 6d 65 28 58 29 20 69 64 73 28 59 29 2e 20 7b 41  me(X) ids(Y). {A
1930: 2e 7a 3d 58 2e 7a 3b 20 41 2e 6e 3d 59 2e 6e 2b  .z=X.z; A.n=Y.n+
1940: 28 59 2e 7a 2d 58 2e 7a 29 3b 7d 0a 25 74 79 70  (Y.z-X.z);}.%typ
1950: 65 20 73 69 67 6e 65 64 20 7b 69 6e 74 7d 0a 73  e signed {int}.s
1960: 69 67 6e 65 64 28 41 29 20 3a 3a 3d 20 70 6c 75  igned(A) ::= plu
1970: 73 5f 6e 75 6d 28 58 29 2e 20 20 20 20 7b 20 41  s_num(X).    { A
1980: 20 3d 20 61 74 6f 69 28 58 2e 7a 29 3b 20 7d 0a   = atoi(X.z); }.
1990: 73 69 67 6e 65 64 28 41 29 20 3a 3a 3d 20 6d 69  signed(A) ::= mi
19a0: 6e 75 73 5f 6e 75 6d 28 58 29 2e 20 20 20 7b 20  nus_num(X).   { 
19b0: 41 20 3d 20 2d 61 74 6f 69 28 58 2e 7a 29 3b 20  A = -atoi(X.z); 
19c0: 7d 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20 63  }.carglist ::= c
19d0: 61 72 67 6c 69 73 74 20 63 61 72 67 2e 0a 63 61  arglist carg..ca
19e0: 72 67 6c 69 73 74 20 3a 3a 3d 20 2e 0a 63 61 72  rglist ::= ..car
19f0: 67 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54  g ::= CONSTRAINT
1a00: 20 6e 6d 20 63 63 6f 6e 73 2e 0a 63 61 72 67 20   nm ccons..carg 
1a10: 3a 3a 3d 20 63 63 6f 6e 73 2e 0a 63 61 72 67 20  ::= ccons..carg 
1a20: 3a 3a 3d 20 44 45 46 41 55 4c 54 20 74 65 72 6d  ::= DEFAULT term
1a30: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
1a40: 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75  {sqlite3AddDefau
1a50: 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 58  ltValue(pParse,X
1a60: 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46  );}.carg ::= DEF
1a70: 41 55 4c 54 20 50 4c 55 53 20 74 65 72 6d 28 58  AULT PLUS term(X
1a80: 29 2e 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65  ).       {sqlite
1a90: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
1aa0: 28 70 50 61 72 73 65 2c 58 29 3b 7d 0a 63 61 72  (pParse,X);}.car
1ab0: 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4d 49  g ::= DEFAULT MI
1ac0: 4e 55 53 20 74 65 72 6d 28 58 29 2e 20 20 20 20  NUS term(X).    
1ad0: 20 20 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20    {.  Expr *p = 
1ae0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 55  sqlite3Expr(TK_U
1af0: 4d 49 4e 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b  MINUS, X, 0, 0);
1b00: 0a 20 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  .  sqlite3AddDef
1b10: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
1b20: 2c 70 29 3b 0a 7d 0a 63 61 72 67 20 3a 3a 3d 20  ,p);.}.carg ::= 
1b30: 44 45 46 41 55 4c 54 20 69 64 28 58 29 2e 20 20  DEFAULT id(X).  
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20              {.  
1b50: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
1b60: 33 45 78 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c  3Expr(TK_STRING,
1b70: 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 73 71   0, 0, &X);.  sq
1b80: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
1b90: 61 6c 75 65 28 70 50 61 72 73 65 2c 70 29 3b 0a  alue(pParse,p);.
1ba0: 7d 0a 0a 2f 2f 20 49 6e 20 61 64 64 69 74 69 6f  }..// In additio
1bb0: 6e 20 74 6f 20 74 68 65 20 74 79 70 65 20 6e 61  n to the type na
1bc0: 6d 65 2c 20 77 65 20 61 6c 73 6f 20 63 61 72 65  me, we also care
1bd0: 20 61 62 6f 75 74 20 74 68 65 20 70 72 69 6d 61   about the prima
1be0: 72 79 20 6b 65 79 20 61 6e 64 0a 2f 2f 20 55 4e  ry key and.// UN
1bf0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
1c00: 2e 0a 2f 2f 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e  ..//.ccons ::= N
1c10: 55 4c 4c 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e  ULL onconf..ccon
1c20: 73 20 3a 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 20 6f  s ::= NOT NULL o
1c30: 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20 20 20 20  nconf(R).       
1c40: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
1c50: 41 64 64 4e 6f 74 4e 75 6c 6c 28 70 50 61 72 73  AddNotNull(pPars
1c60: 65 2c 20 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  e, R);}.ccons ::
1c70: 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20 73 6f  = PRIMARY KEY so
1c80: 72 74 6f 72 64 65 72 20 6f 6e 63 6f 6e 66 28 52  rtorder onconf(R
1c90: 29 20 61 75 74 6f 69 6e 63 28 49 29 2e 0a 20 20  ) autoinc(I)..  
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 50 72     {sqlite3AddPr
1cd0: 69 6d 61 72 79 4b 65 79 28 70 50 61 72 73 65 2c  imaryKey(pParse,
1ce0: 30 2c 52 2c 49 29 3b 7d 0a 63 63 6f 6e 73 20 3a  0,R,I);}.ccons :
1cf0: 3a 3d 20 55 4e 49 51 55 45 20 6f 6e 63 6f 6e 66  := UNIQUE onconf
1d00: 28 52 29 2e 20 20 20 20 20 20 20 20 20 20 7b 73  (R).          {s
1d10: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
1d20: 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 30  x(pParse,0,0,0,0
1d30: 2c 52 2c 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20  ,R,0,0);}.ccons 
1d40: 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70  ::= CHECK LP exp
1d50: 72 20 52 50 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f  r RP onconf..cco
1d60: 6e 73 20 3a 3a 3d 20 52 45 46 45 52 45 4e 43 45  ns ::= REFERENCE
1d70: 53 20 6e 6d 28 54 29 20 69 64 78 6c 69 73 74 5f  S nm(T) idxlist_
1d80: 6f 70 74 28 54 41 29 20 72 65 66 61 72 67 73 28  opt(TA) refargs(
1d90: 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  R)..            
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61      {sqlite3Crea
1dc0: 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61  teForeignKey(pPa
1dd0: 72 73 65 2c 30 2c 26 54 2c 54 41 2c 52 29 3b 7d  rse,0,&T,TA,R);}
1de0: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 64 65 66 65 72  .ccons ::= defer
1df0: 5f 73 75 62 63 6c 61 75 73 65 28 44 29 2e 20 20  _subclause(D).  
1e00: 20 7b 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f   {sqlite3DeferFo
1e10: 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c  reignKey(pParse,
1e20: 44 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43  D);}.ccons ::= C
1e30: 4f 4c 4c 41 54 45 20 69 64 28 43 29 2e 20 20 7b  OLLATE id(C).  {
1e40: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
1e50: 65 54 79 70 65 28 70 50 61 72 73 65 2c 20 43 2e  eType(pParse, C.
1e60: 7a 2c 20 43 2e 6e 29 3b 7d 0a 0a 2f 2f 20 54 68  z, C.n);}..// Th
1e70: 65 20 6f 70 74 69 6f 6e 61 6c 20 41 55 54 4f 49  e optional AUTOI
1e80: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
1e90: 0a 25 74 79 70 65 20 61 75 74 6f 69 6e 63 20 7b  .%type autoinc {
1ea0: 69 6e 74 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20  int}.autoinc(X) 
1eb0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 7b  ::= .          {
1ec0: 58 20 3d 20 30 3b 7d 0a 61 75 74 6f 69 6e 63 28  X = 0;}.autoinc(
1ed0: 58 29 20 3a 3a 3d 20 41 55 54 4f 49 4e 43 52 2e  X) ::= AUTOINCR.
1ee0: 20 20 7b 58 20 3d 20 31 3b 7d 0a 0a 2f 2f 20 54    {X = 1;}..// T
1ef0: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
1f00: 20 72 75 6c 65 73 20 70 61 72 73 65 73 20 74 68   rules parses th
1f10: 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61  e arguments to a
1f20: 20 52 45 46 45 52 45 4e 43 45 53 20 63 6c 61 75   REFERENCES clau
1f30: 73 65 0a 2f 2f 20 74 68 61 74 20 64 65 74 65 72  se.// that deter
1f40: 6d 69 6e 65 20 69 66 20 74 68 65 20 72 65 66 65  mine if the refe
1f50: 72 65 6e 74 69 61 6c 20 69 6e 74 65 67 72 69 74  rential integrit
1f60: 79 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 65  y checking is de
1f70: 66 65 72 72 65 64 20 6f 72 0a 2f 2f 20 6f 72 20  ferred or.// or 
1f80: 69 6d 6d 65 64 69 61 74 65 20 61 6e 64 20 77 68  immediate and wh
1f90: 69 63 68 20 64 65 74 65 72 6d 69 6e 65 20 77 68  ich determine wh
1fa0: 61 74 20 61 63 74 69 6f 6e 20 74 6f 20 74 61 6b  at action to tak
1fb0: 65 20 69 66 20 61 20 72 65 66 2d 69 6e 74 65 67  e if a ref-integ
1fc0: 0a 2f 2f 20 63 68 65 63 6b 20 66 61 69 6c 73 2e  .// check fails.
1fd0: 0a 2f 2f 0a 25 74 79 70 65 20 72 65 66 61 72 67  .//.%type refarg
1fe0: 73 20 7b 69 6e 74 7d 0a 72 65 66 61 72 67 73 28  s {int}.refargs(
1ff0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
2010: 20 3d 20 4f 45 5f 52 65 73 74 72 69 63 74 20 2a   = OE_Restrict *
2020: 20 30 78 30 31 30 31 30 31 3b 20 7d 0a 72 65 66   0x010101; }.ref
2030: 61 72 67 73 28 41 29 20 3a 3a 3d 20 72 65 66 61  args(A) ::= refa
2040: 72 67 73 28 58 29 20 72 65 66 61 72 67 28 59 29  rgs(X) refarg(Y)
2050: 2e 20 7b 20 41 20 3d 20 28 58 20 26 20 59 2e 6d  . { A = (X & Y.m
2060: 61 73 6b 29 20 7c 20 59 2e 76 61 6c 75 65 3b 20  ask) | Y.value; 
2070: 7d 0a 25 74 79 70 65 20 72 65 66 61 72 67 20 7b  }.%type refarg {
2080: 73 74 72 75 63 74 20 7b 69 6e 74 20 76 61 6c 75  struct {int valu
2090: 65 3b 20 69 6e 74 20 6d 61 73 6b 3b 7d 7d 0a 72  e; int mask;}}.r
20a0: 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4d 41 54  efarg(A) ::= MAT
20b0: 43 48 20 6e 6d 2e 20 20 20 20 20 20 20 20 20 20  CH nm.          
20c0: 20 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20      { A.value = 
20d0: 30 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20  0;     A.mask = 
20e0: 30 78 30 30 30 30 30 30 3b 20 7d 0a 72 65 66 61  0x000000; }.refa
20f0: 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 44 45 4c  rg(A) ::= ON DEL
2100: 45 54 45 20 72 65 66 61 63 74 28 58 29 2e 20 20  ETE refact(X).  
2110: 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58 3b 20   { A.value = X; 
2120: 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30      A.mask = 0x0
2130: 30 30 30 66 66 3b 20 7d 0a 72 65 66 61 72 67 28  000ff; }.refarg(
2140: 41 29 20 3a 3a 3d 20 4f 4e 20 55 50 44 41 54 45  A) ::= ON UPDATE
2150: 20 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b 20   refact(X).   { 
2160: 41 2e 76 61 6c 75 65 20 3d 20 58 3c 3c 38 3b 20  A.value = X<<8; 
2170: 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 66 66   A.mask = 0x00ff
2180: 30 30 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20  00; }.refarg(A) 
2190: 3a 3a 3d 20 4f 4e 20 49 4e 53 45 52 54 20 72 65  ::= ON INSERT re
21a0: 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76  fact(X).   { A.v
21b0: 61 6c 75 65 20 3d 20 58 3c 3c 31 36 3b 20 41 2e  alue = X<<16; A.
21c0: 6d 61 73 6b 20 3d 20 30 78 66 66 30 30 30 30 3b  mask = 0xff0000;
21d0: 20 7d 0a 25 74 79 70 65 20 72 65 66 61 63 74 20   }.%type refact 
21e0: 7b 69 6e 74 7d 0a 72 65 66 61 63 74 28 41 29 20  {int}.refact(A) 
21f0: 3a 3a 3d 20 53 45 54 20 4e 55 4c 4c 2e 20 20 20  ::= SET NULL.   
2200: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
2210: 20 4f 45 5f 53 65 74 4e 75 6c 6c 3b 20 7d 0a 72   OE_SetNull; }.r
2220: 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45 54  efact(A) ::= SET
2230: 20 44 45 46 41 55 4c 54 2e 20 20 20 20 20 20 20   DEFAULT.       
2240: 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74      { A = OE_Set
2250: 44 66 6c 74 3b 20 7d 0a 72 65 66 61 63 74 28 41  Dflt; }.refact(A
2260: 29 20 3a 3a 3d 20 43 41 53 43 41 44 45 2e 20 20  ) ::= CASCADE.  
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
2280: 20 3d 20 4f 45 5f 43 61 73 63 61 64 65 3b 20 7d   = OE_Cascade; }
2290: 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 52  .refact(A) ::= R
22a0: 45 53 54 52 49 43 54 2e 20 20 20 20 20 20 20 20  ESTRICT.        
22b0: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 52        { A = OE_R
22c0: 65 73 74 72 69 63 74 3b 20 7d 0a 25 74 79 70 65  estrict; }.%type
22d0: 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65   defer_subclause
22e0: 20 7b 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75 62   {int}.defer_sub
22f0: 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 4e 4f  clause(A) ::= NO
2300: 54 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e 69  T DEFERRABLE ini
2310: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f  t_deferred_pred_
2320: 6f 70 74 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b  opt(X).  {A = X;
2330: 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  }.defer_subclaus
2340: 65 28 41 29 20 3a 3a 3d 20 44 45 46 45 52 52 41  e(A) ::= DEFERRA
2350: 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72 72 65  BLE init_deferre
2360: 64 5f 70 72 65 64 5f 6f 70 74 28 58 29 2e 20 20  d_pred_opt(X).  
2370: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 74 79      {A = X;}.%ty
2380: 70 65 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64  pe init_deferred
2390: 5f 70 72 65 64 5f 6f 70 74 20 7b 69 6e 74 7d 0a  _pred_opt {int}.
23a0: 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72  init_deferred_pr
23b0: 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  ed_opt(A) ::= . 
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69        {A = 0;}.i
23e0: 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65  nit_deferred_pre
23f0: 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49  d_opt(A) ::= INI
2400: 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44 2e  TIALLY DEFERRED.
2410: 20 20 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 69 6e       {A = 1;}.in
2420: 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64  it_deferred_pred
2430: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49 54  _opt(A) ::= INIT
2440: 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e  IALLY IMMEDIATE.
2450: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f      {A = 0;}..//
2460: 20 46 6f 72 20 74 68 65 20 74 69 6d 65 20 62 65   For the time be
2470: 69 6e 67 2c 20 74 68 65 20 6f 6e 6c 79 20 63 6f  ing, the only co
2480: 6e 73 74 72 61 69 6e 74 20 77 65 20 63 61 72 65  nstraint we care
2490: 20 61 62 6f 75 74 20 69 73 20 74 68 65 20 70 72   about is the pr
24a0: 69 6d 61 72 79 0a 2f 2f 20 6b 65 79 20 61 6e 64  imary.// key and
24b0: 20 55 4e 49 51 55 45 2e 20 20 42 6f 74 68 20 63   UNIQUE.  Both c
24c0: 72 65 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 2f  reate indices../
24d0: 2f 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 3a  /.conslist_opt :
24e0: 3a 3d 20 2e 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70  := ..conslist_op
24f0: 74 20 3a 3a 3d 20 43 4f 4d 4d 41 20 63 6f 6e 73  t ::= COMMA cons
2500: 6c 69 73 74 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a  list..conslist :
2510: 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 43 4f 4d 4d  := conslist COMM
2520: 41 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73  A tcons..conslis
2530: 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 74  t ::= conslist t
2540: 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a  cons..conslist :
2550: 3a 3d 20 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73 20  := tcons..tcons 
2560: 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e  ::= CONSTRAINT n
2570: 6d 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50 52 49  m..tcons ::= PRI
2580: 4d 41 52 59 20 4b 45 59 20 4c 50 20 69 64 78 6c  MARY KEY LP idxl
2590: 69 73 74 28 58 29 20 61 75 74 6f 69 6e 63 28 49  ist(X) autoinc(I
25a0: 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a  ) RP onconf(R)..
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
25e0: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 70  3AddPrimaryKey(p
25f0: 50 61 72 73 65 2c 58 2c 52 2c 49 29 3b 7d 0a 74  Parse,X,R,I);}.t
2600: 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20  cons ::= UNIQUE 
2610: 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52 50  LP idxlist(X) RP
2620: 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20   onconf(R)..    
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74     {sqlite3Creat
2660: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c  eIndex(pParse,0,
2670: 30 2c 30 2c 58 2c 52 2c 30 2c 30 29 3b 7d 0a 74  0,0,X,R,0,0);}.t
2680: 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20 65  cons ::= CHECK e
2690: 78 70 72 20 6f 6e 63 6f 6e 66 2e 0a 74 63 6f 6e  xpr onconf..tcon
26a0: 73 20 3a 3a 3d 20 46 4f 52 45 49 47 4e 20 4b 45  s ::= FOREIGN KE
26b0: 59 20 4c 50 20 69 64 78 6c 69 73 74 28 46 41 29  Y LP idxlist(FA)
26c0: 20 52 50 0a 20 20 20 20 20 20 20 20 20 20 52 45   RP.          RE
26d0: 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29 20 69  FERENCES nm(T) i
26e0: 64 78 6c 69 73 74 5f 6f 70 74 28 54 41 29 20 72  dxlist_opt(TA) r
26f0: 65 66 61 72 67 73 28 52 29 20 64 65 66 65 72 5f  efargs(R) defer_
2700: 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 44 29  subclause_opt(D)
2710: 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  . {.    sqlite3C
2720: 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
2730: 70 50 61 72 73 65 2c 20 46 41 2c 20 26 54 2c 20  pParse, FA, &T, 
2740: 54 41 2c 20 52 29 3b 0a 20 20 20 20 73 71 6c 69  TA, R);.    sqli
2750: 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
2760: 65 79 28 70 50 61 72 73 65 2c 20 44 29 3b 0a 7d  ey(pParse, D);.}
2770: 0a 25 74 79 70 65 20 64 65 66 65 72 5f 73 75 62  .%type defer_sub
2780: 63 6c 61 75 73 65 5f 6f 70 74 20 7b 69 6e 74 7d  clause_opt {int}
2790: 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65  .defer_subclause
27a0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 7b 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72 5f   {A = 0;}.defer_
27d0: 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 41 29  subclause_opt(A)
27e0: 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62 63 6c   ::= defer_subcl
27f0: 61 75 73 65 28 58 29 2e 20 20 7b 41 20 3d 20 58  ause(X).  {A = X
2800: 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f  ;}..// The follo
2810: 77 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74  wing is a non-st
2820: 61 6e 64 61 72 64 20 65 78 74 65 6e 73 69 6f 6e  andard extension
2830: 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 20   that allows us 
2840: 74 6f 20 64 65 63 6c 61 72 65 20 74 68 65 0a 2f  to declare the./
2850: 2f 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  / default behavi
2860: 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  or when there is
2870: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f   a constraint co
2880: 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65  nflict..//.%type
2890: 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74   onconf {int}.%t
28a0: 79 70 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74 7d  ype orconf {int}
28b0: 0a 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74 79  .%type resolvety
28c0: 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28  pe {int}.onconf(
28d0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44 65        {A = OE_De
2900: 66 61 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28 41  fault;}.onconf(A
2910: 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43  ) ::= ON CONFLIC
2920: 54 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29  T resolvetype(X)
2930: 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f 72  .    {A = X;}.or
2940: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20  conf(A) ::= .   
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2970: 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72 63  OE_Default;}.orc
2980: 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72 65  onf(A) ::= OR re
2990: 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20 20  solvetype(X).   
29a0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
29b0: 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41  ;}.resolvetype(A
29c0: 29 20 3a 3a 3d 20 72 61 69 73 65 74 79 70 65 28  ) ::= raisetype(
29d0: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
29e0: 7b 41 20 3d 20 58 3b 7d 0a 72 65 73 6f 6c 76 65  {A = X;}.resolve
29f0: 74 79 70 65 28 41 29 20 3a 3a 3d 20 49 47 4e 4f  type(A) ::= IGNO
2a00: 52 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  RE.             
2a10: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 49 67        {A = OE_Ig
2a20: 6e 6f 72 65 3b 7d 0a 72 65 73 6f 6c 76 65 74 79  nore;}.resolvety
2a30: 70 65 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43  pe(A) ::= REPLAC
2a40: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
2a50: 20 20 20 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c      {A = OE_Repl
2a60: 61 63 65 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  ace;}../////////
2a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2a80: 2f 20 54 68 65 20 44 52 4f 50 20 54 41 42 4c 45  / The DROP TABLE
2a90: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
2aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2ab0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
2ac0: 3d 20 44 52 4f 50 20 54 41 42 4c 45 20 66 75 6c  = DROP TABLE ful
2ad0: 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71  lname(X). {.  sq
2ae0: 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 70  lite3DropTable(p
2af0: 50 61 72 73 65 2c 20 58 2c 20 30 29 3b 0a 7d 0a  Parse, X, 0);.}.
2b00: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
2b10: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54  ////// The CREAT
2b20: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
2b30: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
2b40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
2b50: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
2b60: 5f 4f 4d 49 54 5f 56 49 45 57 0a 63 6d 64 20 3a  _OMIT_VIEW.cmd :
2b70: 3a 3d 20 43 52 45 41 54 45 28 58 29 20 74 65 6d  := CREATE(X) tem
2b80: 70 28 54 29 20 56 49 45 57 20 6e 6d 28 59 29 20  p(T) VIEW nm(Y) 
2b90: 64 62 6e 6d 28 5a 29 20 41 53 20 73 65 6c 65 63  dbnm(Z) AS selec
2ba0: 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  t(S). {.  sqlite
2bb0: 33 43 72 65 61 74 65 56 69 65 77 28 70 50 61 72  3CreateView(pPar
2bc0: 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a 2c 20  se, &X, &Y, &Z, 
2bd0: 53 2c 20 54 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d  S, T);.}.cmd ::=
2be0: 20 44 52 4f 50 20 56 49 45 57 20 66 75 6c 6c 6e   DROP VIEW fulln
2bf0: 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69  ame(X). {.  sqli
2c00: 74 65 33 44 72 6f 70 54 61 62 6c 65 28 70 50 61  te3DropTable(pPa
2c10: 72 73 65 2c 20 58 2c 20 31 29 3b 0a 7d 0a 25 65  rse, X, 1);.}.%e
2c20: 6e 64 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f  ndif // SQLITE_O
2c30: 4d 49 54 5f 56 49 45 57 0a 0a 2f 2f 2f 2f 2f 2f  MIT_VIEW..//////
2c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c50: 2f 2f 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  // The SELECT st
2c60: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
2c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
2c90: 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20   ::= select(X). 
2ca0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   {.  sqlite3Sele
2cb0: 63 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53 52  ct(pParse, X, SR
2cc0: 54 5f 43 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30  T_Callback, 0, 0
2cd0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
2ce0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2cf0: 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  e(X);.}..%type s
2d00: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
2d10: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
2d20: 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  ct {sqlite3Selec
2d30: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
2d40: 79 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53  ype oneselect {S
2d50: 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63  elect*}.%destruc
2d60: 74 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73  tor oneselect {s
2d70: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2d80: 74 65 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74  te($$);}..select
2d90: 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63  (A) ::= oneselec
2da0: 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  t(X).           
2db0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2dc0: 58 3b 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  X;}.%ifndef SQLI
2dd0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
2de0: 5f 53 45 4c 45 43 54 0a 73 65 6c 65 63 74 28 41  _SELECT.select(A
2df0: 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 20  ) ::= select(X) 
2e00: 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 59  multiselect_op(Y
2e10: 29 20 6f 6e 65 73 65 6c 65 63 74 28 5a 29 2e 20  ) oneselect(Z). 
2e20: 20 7b 0a 20 20 69 66 28 20 5a 20 29 7b 0a 20 20   {.  if( Z ){.  
2e30: 20 20 5a 2d 3e 6f 70 20 3d 20 59 3b 0a 20 20 20    Z->op = Y;.   
2e40: 20 5a 2d 3e 70 50 72 69 6f 72 20 3d 20 58 3b 0a   Z->pPrior = X;.
2e50: 20 20 7d 0a 20 20 41 20 3d 20 5a 3b 0a 7d 0a 25    }.  A = Z;.}.%
2e60: 74 79 70 65 20 6d 75 6c 74 69 73 65 6c 65 63 74  type multiselect
2e70: 5f 6f 70 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73  _op {int}.multis
2e80: 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20  elect_op(A) ::= 
2e90: 55 4e 49 4f 4e 28 4f 50 29 2e 20 20 20 20 20 20  UNION(OP).      
2ea0: 7b 41 20 3d 20 40 4f 50 3b 7d 0a 6d 75 6c 74 69  {A = @OP;}.multi
2eb0: 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d  select_op(A) ::=
2ec0: 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 20 20 20   UNION ALL.     
2ed0: 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d   {A = TK_ALL;}.m
2ee0: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29  ultiselect_op(A)
2ef0: 20 3a 3a 3d 20 49 4e 54 45 52 53 45 43 54 28 4f   ::= INTERSECT(O
2f00: 50 29 2e 20 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a  P).  {A = @OP;}.
2f10: 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41  multiselect_op(A
2f20: 29 20 3a 3a 3d 20 45 58 43 45 50 54 28 4f 50 29  ) ::= EXCEPT(OP)
2f30: 2e 20 20 20 20 20 7b 41 20 3d 20 40 4f 50 3b 7d  .     {A = @OP;}
2f40: 0a 25 65 6e 64 69 66 20 2f 2f 20 53 51 4c 49 54  .%endif // SQLIT
2f50: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
2f60: 53 45 4c 45 43 54 0a 6f 6e 65 73 65 6c 65 63 74  SELECT.oneselect
2f70: 28 41 29 20 3a 3a 3d 20 53 45 4c 45 43 54 20 64  (A) ::= SELECT d
2f80: 69 73 74 69 6e 63 74 28 44 29 20 73 65 6c 63 6f  istinct(D) selco
2f90: 6c 6c 69 73 74 28 57 29 20 66 72 6f 6d 28 58 29  llist(W) from(X)
2fa0: 20 77 68 65 72 65 5f 6f 70 74 28 59 29 0a 20 20   where_opt(Y).  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67                 g
2fc0: 72 6f 75 70 62 79 5f 6f 70 74 28 50 29 20 68 61  roupby_opt(P) ha
2fd0: 76 69 6e 67 5f 6f 70 74 28 51 29 20 6f 72 64 65  ving_opt(Q) orde
2fe0: 72 62 79 5f 6f 70 74 28 5a 29 20 6c 69 6d 69 74  rby_opt(Z) limit
2ff0: 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 41 20 3d  _opt(L). {.  A =
3000: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65   sqlite3SelectNe
3010: 77 28 57 2c 58 2c 59 2c 50 2c 51 2c 5a 2c 44 2c  w(W,X,Y,P,Q,Z,D,
3020: 4c 2e 70 4c 69 6d 69 74 2c 4c 2e 70 4f 66 66 73  L.pLimit,L.pOffs
3030: 65 74 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20 22  et);.}..// The "
3040: 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e 74 65 72  distinct" nonter
3050: 6d 69 6e 61 6c 20 69 73 20 74 72 75 65 20 28 31  minal is true (1
3060: 29 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  ) if the DISTINC
3070: 54 20 6b 65 79 77 6f 72 64 20 69 73 0a 2f 2f 20  T keyword is.// 
3080: 70 72 65 73 65 6e 74 20 61 6e 64 20 66 61 6c 73  present and fals
3090: 65 20 28 30 29 20 69 66 20 69 74 20 69 73 20 6e  e (0) if it is n
30a0: 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 64 69 73  ot..//.%type dis
30b0: 74 69 6e 63 74 20 7b 69 6e 74 7d 0a 64 69 73 74  tinct {int}.dist
30c0: 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44 49 53 54  inct(A) ::= DIST
30d0: 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20 31 3b 7d  INCT.   {A = 1;}
30e0: 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d  .distinct(A) ::=
30f0: 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41 20   ALL.        {A 
3100: 3d 20 30 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41  = 0;}.distinct(A
3110: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
3120: 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73    {A = 0;}..// s
3130: 65 6c 63 6f 6c 6c 69 73 74 20 69 73 20 61 20 6c  elcollist is a l
3140: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
3150: 6e 73 20 74 68 61 74 20 61 72 65 20 74 6f 20 62  ns that are to b
3160: 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
3170: 0a 2f 2f 20 76 61 6c 75 65 73 20 6f 66 20 74 68  .// values of th
3180: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3190: 6e 74 2e 20 20 54 68 65 20 22 2a 22 20 69 6e 20  nt.  The "*" in 
31a0: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
31b0: 2f 2f 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  // "SELECT * FRO
31c0: 4d 20 2e 2e 2e 22 20 69 73 20 65 6e 63 6f 64 65  M ..." is encode
31d0: 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 65  d as a special e
31e0: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61  xpression with a
31f0: 6e 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f 66 20 54  n.// opcode of T
3200: 4b 5f 41 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65 20  K_ALL..//.%type 
3210: 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72  selcollist {Expr
3220: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
3230: 6f 72 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73  or selcollist {s
3240: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
3250: 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65  lete($$);}.%type
3260: 20 73 63 6c 70 20 7b 45 78 70 72 4c 69 73 74 2a   sclp {ExprList*
3270: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 63  }.%destructor sc
3280: 6c 70 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  lp {sqlite3ExprL
3290: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
32a0: 73 63 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c 63  sclp(A) ::= selc
32b0: 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 2e  ollist(X) COMMA.
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
32d0: 3d 20 58 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a  = X;}.sclp(A) ::
32e0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63     {A = 0;}.selc
3310: 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63  ollist(A) ::= sc
3320: 6c 70 28 50 29 20 65 78 70 72 28 58 29 20 61 73  lp(P) expr(X) as
3330: 28 59 29 2e 20 20 20 20 20 7b 0a 20 20 20 41 20  (Y).     {.   A 
3340: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
3350: 74 41 70 70 65 6e 64 28 50 2c 58 2c 59 2e 6e 3f  tAppend(P,X,Y.n?
3360: 26 59 3a 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c  &Y:0);.}.selcoll
3370: 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28  ist(A) ::= sclp(
3380: 50 29 20 53 54 41 52 2e 20 7b 0a 20 20 41 20 3d  P) STAR. {.  A =
3390: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
33a0: 41 70 70 65 6e 64 28 50 2c 20 73 71 6c 69 74 65  Append(P, sqlite
33b0: 33 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c  3Expr(TK_ALL, 0,
33c0: 20 30 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 73 65   0, 0), 0);.}.se
33d0: 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20  lcollist(A) ::= 
33e0: 73 63 6c 70 28 50 29 20 6e 6d 28 58 29 20 44 4f  sclp(P) nm(X) DO
33f0: 54 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70 72  T STAR. {.  Expr
3400: 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74   *pRight = sqlit
3410: 65 33 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30  e3Expr(TK_ALL, 0
3420: 2c 20 30 2c 20 30 29 3b 0a 20 20 45 78 70 72 20  , 0, 0);.  Expr 
3430: 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33  *pLeft = sqlite3
3440: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
3450: 2c 20 26 58 29 3b 0a 20 20 41 20 3d 20 73 71 6c  , &X);.  A = sql
3460: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
3470: 6e 64 28 50 2c 20 73 71 6c 69 74 65 33 45 78 70  nd(P, sqlite3Exp
3480: 72 28 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  r(TK_DOT, pLeft,
3490: 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29 3b   pRight, 0), 0);
34a0: 0a 7d 0a 0a 2f 2f 20 41 6e 20 6f 70 74 69 6f 6e  .}..// An option
34b0: 20 22 41 53 20 3c 69 64 3e 22 20 70 68 72 61 73   "AS <id>" phras
34c0: 65 20 74 68 61 74 20 63 61 6e 20 66 6f 6c 6c 6f  e that can follo
34d0: 77 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 70  w one of the exp
34e0: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 0a 2f 2f  ressions that.//
34f0: 20 64 65 66 69 6e 65 20 74 68 65 20 72 65 73 75   define the resu
3500: 6c 74 20 73 65 74 2c 20 6f 72 20 6f 6e 65 20 6f  lt set, or one o
3510: 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
3520: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
3530: 0a 2f 2f 0a 25 74 79 70 65 20 61 73 20 7b 54 6f  .//.%type as {To
3540: 6b 65 6e 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 41  ken}.as(X) ::= A
3550: 53 20 6e 6d 28 59 29 2e 20 20 20 20 7b 58 20 3d  S nm(Y).    {X =
3560: 20 59 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 69   Y;}.as(X) ::= i
3570: 64 73 28 59 29 2e 20 20 20 20 20 20 7b 58 20 3d  ds(Y).      {X =
3580: 20 59 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 2e   Y;}.as(X) ::= .
3590: 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 2e 6e              {X.n
35a0: 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 73   = 0;}...%type s
35b0: 65 6c 74 61 62 6c 69 73 74 20 7b 53 72 63 4c 69  eltablist {SrcLi
35c0: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
35d0: 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 73 71 6c   seltablist {sql
35e0: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
35f0: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 74  e($$);}.%type st
3600: 6c 5f 70 72 65 66 69 78 20 7b 53 72 63 4c 69 73  l_prefix {SrcLis
3610: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3620: 73 74 6c 5f 70 72 65 66 69 78 20 7b 73 71 6c 69  stl_prefix {sqli
3630: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
3640: 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 66 72 6f  ($$);}.%type fro
3650: 6d 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65  m {SrcList*}.%de
3660: 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b 73  structor from {s
3670: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
3680: 65 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f 20 41 20  ete($$);}..// A 
3690: 63 6f 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63 6c  complete FROM cl
36a0: 61 75 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41 29  ause..//.from(A)
36b0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
36e0: 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  teMalloc(sizeof(
36f0: 2a 41 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a  *A));}.from(A) :
3700: 3a 3d 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c 69  := FROM seltabli
3710: 73 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  st(X).          
3720: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f       {A = X;}../
3730: 2f 20 22 73 65 6c 74 61 62 6c 69 73 74 22 20 69  / "seltablist" i
3740: 73 20 61 20 22 53 65 6c 65 63 74 20 54 61 62 6c  s a "Select Tabl
3750: 65 20 4c 69 73 74 22 20 2d 20 74 68 65 20 63 6f  e List" - the co
3760: 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f  ntent of the FRO
3770: 4d 20 63 6c 61 75 73 65 0a 2f 2f 20 69 6e 20 61  M clause.// in a
3780: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3790: 74 2e 20 20 22 73 74 6c 5f 70 72 65 66 69 78 22  t.  "stl_prefix"
37a0: 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
37b0: 74 68 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a 73 74  this list..//.st
37c0: 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20  l_prefix(A) ::= 
37d0: 73 65 6c 74 61 62 6c 69 73 74 28 58 29 20 6a 6f  seltablist(X) jo
37e0: 69 6e 6f 70 28 59 29 2e 20 20 20 20 7b 0a 20 20  inop(Y).    {.  
37f0: 20 41 20 3d 20 58 3b 0a 20 20 20 69 66 28 20 41   A = X;.   if( A
3800: 20 26 26 20 41 2d 3e 6e 53 72 63 3e 30 20 29 20   && A->nSrc>0 ) 
3810: 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e  A->a[A->nSrc-1].
3820: 6a 6f 69 6e 74 79 70 65 20 3d 20 59 3b 0a 7d 0a  jointype = Y;.}.
3830: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a  stl_prefix(A) ::
3840: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
3860: 20 3d 20 30 3b 7d 0a 73 65 6c 74 61 62 6c 69 73   = 0;}.seltablis
3870: 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65  t(A) ::= stl_pre
3880: 66 69 78 28 58 29 20 6e 6d 28 59 29 20 64 62 6e  fix(X) nm(Y) dbn
3890: 6d 28 44 29 20 61 73 28 5a 29 20 6f 6e 5f 6f 70  m(D) as(Z) on_op
38a0: 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55  t(N) using_opt(U
38b0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
38c0: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
38d0: 58 2c 26 59 2c 26 44 29 3b 0a 20 20 69 66 28 20  X,&Y,&D);.  if( 
38e0: 5a 2e 6e 20 29 20 73 71 6c 69 74 65 33 53 72 63  Z.n ) sqlite3Src
38f0: 4c 69 73 74 41 64 64 41 6c 69 61 73 28 41 2c 26  ListAddAlias(A,&
3900: 5a 29 3b 0a 20 20 69 66 28 20 4e 20 29 7b 0a 20  Z);.  if( N ){. 
3910: 20 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e 6e     if( A && A->n
3920: 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41 2d  Src>1 ){ A->a[A-
3930: 3e 6e 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d 20 4e  >nSrc-2].pOn = N
3940: 3b 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b 20 73  ; }.    else { s
3950: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3960: 28 4e 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  (N); }.  }.  if(
3970: 20 55 20 29 7b 0a 20 20 20 20 69 66 28 20 41 20   U ){.    if( A 
3980: 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b 20  && A->nSrc>1 ){ 
3990: 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d 2e  A->a[A->nSrc-2].
39a0: 70 55 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20 20  pUsing = U; }.  
39b0: 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65 33    else { sqlite3
39c0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 55 29 3b  IdListDelete(U);
39d0: 20 7d 0a 20 20 7d 0a 7d 0a 25 69 66 6e 64 65 66   }.  }.}.%ifndef
39e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
39f0: 51 55 45 52 59 0a 20 20 73 65 6c 74 61 62 6c 69  QUERY.  seltabli
3a00: 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72  st(A) ::= stl_pr
3a10: 65 66 69 78 28 58 29 20 4c 50 20 73 65 6c 74 61  efix(X) LP selta
3a20: 62 6c 69 73 74 5f 70 61 72 65 6e 28 53 29 20 52  blist_paren(S) R
3a30: 50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P.              
3a40: 20 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f 6f        as(Z) on_o
3a50: 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28  pt(N) using_opt(
3a60: 55 29 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73 71  U). {.    A = sq
3a70: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
3a80: 6e 64 28 58 2c 30 2c 30 29 3b 0a 20 20 20 20 41  nd(X,0,0);.    A
3a90: 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e 70  ->a[A->nSrc-1].p
3aa0: 53 65 6c 65 63 74 20 3d 20 53 3b 0a 20 20 20 20  Select = S;.    
3ab0: 69 66 28 20 5a 2e 6e 20 29 20 73 71 6c 69 74 65  if( Z.n ) sqlite
3ac0: 33 53 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73  3SrcListAddAlias
3ad0: 28 41 2c 26 5a 29 3b 0a 20 20 20 20 69 66 28 20  (A,&Z);.    if( 
3ae0: 4e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 41  N ){.      if( A
3af0: 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b   && A->nSrc>1 ){
3b00: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d   A->a[A->nSrc-2]
3b10: 2e 70 4f 6e 20 3d 20 4e 3b 20 7d 0a 20 20 20 20  .pOn = N; }.    
3b20: 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65 33    else { sqlite3
3b30: 45 78 70 72 44 65 6c 65 74 65 28 4e 29 3b 20 7d  ExprDelete(N); }
3b40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 55  .    }.    if( U
3b50: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 41 20   ){.      if( A 
3b60: 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b 20  && A->nSrc>1 ){ 
3b70: 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d 2e  A->a[A->nSrc-2].
3b80: 70 55 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20 20  pUsing = U; }.  
3b90: 20 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74      else { sqlit
3ba0: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 55  e3IdListDelete(U
3bb0: 29 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ); }.    }.  }. 
3bc0: 20 0a 20 2f 2f 20 41 20 73 65 6c 74 61 62 6c 69   . // A seltabli
3bd0: 73 74 5f 70 61 72 65 6e 20 6e 6f 6e 74 65 72 6d  st_paren nonterm
3be0: 69 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 73 20  inal represents 
3bf0: 61 6e 79 74 68 69 6e 67 20 69 6e 20 61 20 46 52  anything in a FR
3c00: 4f 4d 20 74 68 61 74 0a 20 20 2f 2f 20 69 73 20  OM that.  // is 
3c10: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 73 69 64 65  contained inside
3c20: 20 70 61 72 65 6e 74 68 65 73 65 73 2e 20 20 54   parentheses.  T
3c30: 68 69 73 20 63 61 6e 20 62 65 20 65 69 74 68 65  his can be eithe
3c40: 72 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 0a  r a subquery or.
3c50: 20 20 2f 2f 20 61 20 67 72 6f 75 70 69 6e 67 20    // a grouping 
3c60: 6f 66 20 74 61 62 6c 65 20 61 6e 64 20 73 75 62  of table and sub
3c70: 71 75 65 72 69 65 73 2e 0a 20 20 2f 2f 0a 20 20  queries..  //.  
3c80: 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69 73 74  %type seltablist
3c90: 5f 70 61 72 65 6e 20 7b 53 65 6c 65 63 74 2a 7d  _paren {Select*}
3ca0: 0a 20 20 25 64 65 73 74 72 75 63 74 6f 72 20 73  .  %destructor s
3cb0: 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e 20  eltablist_paren 
3cc0: 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65  {sqlite3SelectDe
3cd0: 6c 65 74 65 28 24 24 29 3b 7d 0a 20 20 73 65 6c  lete($$);}.  sel
3ce0: 74 61 62 6c 69 73 74 5f 70 61 72 65 6e 28 41 29  tablist_paren(A)
3cf0: 20 3a 3a 3d 20 73 65 6c 65 63 74 28 53 29 2e 20   ::= select(S). 
3d00: 20 20 20 20 20 7b 41 20 3d 20 53 3b 7d 0a 20 20       {A = S;}.  
3d10: 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e  seltablist_paren
3d20: 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61 62 6c 69  (A) ::= seltabli
3d30: 73 74 28 46 29 2e 20 20 7b 0a 20 20 20 20 20 41  st(F).  {.     A
3d40: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
3d50: 4e 65 77 28 30 2c 46 2c 30 2c 30 2c 30 2c 30 2c  New(0,F,0,0,0,0,
3d60: 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 25 65 6e 64  0,0,0);.  }.%end
3d70: 69 66 20 2f 2f 20 53 51 4c 49 54 45 5f 4f 4d 49  if // SQLITE_OMI
3d80: 54 5f 53 55 42 51 55 45 52 59 0a 0a 25 74 79 70  T_SUBQUERY..%typ
3d90: 65 20 64 62 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 64  e dbnm {Token}.d
3da0: 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  bnm(A) ::= .    
3db0: 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e        {A.z=0; A.
3dc0: 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a  n=0;}.dbnm(A) ::
3dd0: 3d 20 44 4f 54 20 6e 6d 28 58 29 2e 20 7b 41 20  = DOT nm(X). {A 
3de0: 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 66 75 6c  = X;}..%type ful
3df0: 6c 6e 61 6d 65 20 7b 53 72 63 4c 69 73 74 2a 7d  lname {SrcList*}
3e00: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 66 75 6c  .%destructor ful
3e10: 6c 6e 61 6d 65 20 7b 73 71 6c 69 74 65 33 53 72  lname {sqlite3Sr
3e20: 63 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  cListDelete($$);
3e30: 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a  }.fullname(A) ::
3e40: 3d 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e  = nm(X) dbnm(Y).
3e50: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 53 72    {A = sqlite3Sr
3e60: 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 58  cListAppend(0,&X
3e70: 2c 26 59 29 3b 7d 0a 0a 25 74 79 70 65 20 6a 6f  ,&Y);}..%type jo
3e80: 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79 70 65  inop {int}.%type
3e90: 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d 0a 6a   joinop2 {int}.j
3ea0: 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43 4f 4d  oinop(X) ::= COM
3eb0: 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  MA.             
3ec0: 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54 5f 49        { X = JT_I
3ed0: 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58  NNER; }.joinop(X
3ee0: 29 20 3a 3a 3d 20 4a 4f 49 4e 2e 20 20 20 20 20  ) ::= JOIN.     
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
3f00: 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 20 7d   X = JT_INNER; }
3f10: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
3f20: 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f 49 4e 2e 20  OIN_KW(A) JOIN. 
3f30: 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 73 71          { X = sq
3f40: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50  lite3JoinType(pP
3f50: 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20 7d 0a  arse,&A,0,0); }.
3f60: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f  joinop(X) ::= JO
3f70: 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 4a  IN_KW(A) nm(B) J
3f80: 4f 49 4e 2e 20 20 20 7b 20 58 20 3d 20 73 71 6c  OIN.   { X = sql
3f90: 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61  ite3JoinType(pPa
3fa0: 72 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20 7d 0a  rse,&A,&B,0); }.
3fb0: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f  joinop(X) ::= JO
3fc0: 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 6e  IN_KW(A) nm(B) n
3fd0: 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20 20  m(C) JOIN..     
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33 4a    { X = sqlite3J
4010: 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26  oinType(pParse,&
4020: 41 2c 26 42 2c 26 43 29 3b 20 7d 0a 0a 25 74 79  A,&B,&C); }..%ty
4030: 70 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70 72 2a  pe on_opt {Expr*
4040: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f 6e  }.%destructor on
4050: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70  _opt {sqlite3Exp
4060: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 6f 6e  rDelete($$);}.on
4070: 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 4f 4e 20 65  _opt(N) ::= ON e
4080: 78 70 72 28 45 29 2e 20 20 20 7b 4e 20 3d 20 45  xpr(E).   {N = E
4090: 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d  ;}.on_opt(N) ::=
40a0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b   .             {
40b0: 4e 20 3d 20 30 3b 7d 0a 0a 25 74 79 70 65 20 75  N = 0;}..%type u
40c0: 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73 74  sing_opt {IdList
40d0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 75  *}.%destructor u
40e0: 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65  sing_opt {sqlite
40f0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24  3IdListDelete($$
4100: 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29  );}.using_opt(U)
4110: 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20 69 6e   ::= USING LP in
4120: 73 63 6f 6c 6c 69 73 74 28 4c 29 20 52 50 2e 20  scollist(L) RP. 
4130: 20 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e 67 5f   {U = L;}.using_
4140: 6f 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(U) ::= .    
4150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4160: 20 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a 0a 25      {U = 0;}...%
4170: 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f 70 74  type orderby_opt
4180: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
4190: 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72 62 79  structor orderby
41a0: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70  _opt {sqlite3Exp
41b0: 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  rListDelete($$);
41c0: 7d 0a 25 74 79 70 65 20 73 6f 72 74 6c 69 73 74  }.%type sortlist
41d0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
41e0: 73 74 72 75 63 74 6f 72 20 73 6f 72 74 6c 69 73  structor sortlis
41f0: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
4200: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25  stDelete($$);}.%
4210: 74 79 70 65 20 73 6f 72 74 69 74 65 6d 20 7b 45  type sortitem {E
4220: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
4230: 72 20 73 6f 72 74 69 74 65 6d 20 7b 73 71 6c 69  r sortitem {sqli
4240: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
4250: 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70 74  );}..orderby_opt
4260: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64 65     {A = 0;}.orde
4290: 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4f  rby_opt(A) ::= O
42a0: 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73 74  RDER BY sortlist
42b0: 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58  (X).      {A = X
42c0: 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a  ;}.sortlist(A) :
42d0: 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29 20 43  := sortlist(X) C
42e0: 4f 4d 4d 41 20 73 6f 72 74 69 74 65 6d 28 59 29  OMMA sortitem(Y)
42f0: 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74   collate(C) sort
4300: 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20  order(Z). {.  A 
4310: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4320: 74 41 70 70 65 6e 64 28 58 2c 59 2c 43 2e 6e 3e  tAppend(X,Y,C.n>
4330: 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28 20 41  0?&C:0);.  if( A
4340: 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70 72   ) A->a[A->nExpr
4350: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  -1].sortOrder = 
4360: 5a 3b 0a 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29  Z;.}.sortlist(A)
4370: 20 3a 3a 3d 20 73 6f 72 74 69 74 65 6d 28 59 29   ::= sortitem(Y)
4380: 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74   collate(C) sort
4390: 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20  order(Z). {.  A 
43a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
43b0: 74 41 70 70 65 6e 64 28 30 2c 59 2c 43 2e 6e 3e  tAppend(0,Y,C.n>
43c0: 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28 20 41  0?&C:0);.  if( A
43d0: 20 26 26 20 41 2d 3e 61 20 29 20 41 2d 3e 61 5b   && A->a ) A->a[
43e0: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a  0].sortOrder = Z
43f0: 3b 0a 7d 0a 73 6f 72 74 69 74 65 6d 28 41 29 20  ;.}.sortitem(A) 
4400: 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 7b  ::= expr(X).   {
4410: 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 73  A = X;}..%type s
4420: 6f 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d 0a 25  ortorder {int}.%
4430: 74 79 70 65 20 63 6f 6c 6c 61 74 65 20 7b 54 6f  type collate {To
4440: 6b 65 6e 7d 0a 0a 73 6f 72 74 6f 72 64 65 72 28  ken}..sortorder(
4450: 41 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20 20  A) ::= ASC.     
4460: 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54        {A = SQLIT
4470: 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74 6f  E_SO_ASC;}.sorto
4480: 72 64 65 72 28 41 29 20 3a 3a 3d 20 44 45 53 43  rder(A) ::= DESC
4490: 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20  .          {A = 
44a0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 7d  SQLITE_SO_DESC;}
44b0: 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a  .sortorder(A) ::
44c0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
44d0: 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f   {A = SQLITE_SO_
44e0: 41 53 43 3b 7d 0a 63 6f 6c 6c 61 74 65 28 43 29  ASC;}.collate(C)
44f0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
4500: 20 20 20 20 20 20 7b 43 2e 7a 20 3d 20 30 3b 20        {C.z = 0; 
4510: 43 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c 6c 61 74  C.n = 0;}.collat
4520: 65 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45  e(C) ::= COLLATE
4530: 20 69 64 28 58 29 2e 20 20 20 7b 43 20 3d 20 58   id(X).   {C = X
4540: 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75 70 62  ;}..%type groupb
4550: 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a  y_opt {ExprList*
4560: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 67 72  }.%destructor gr
4570: 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74  oupby_opt {sqlit
4580: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4590: 28 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f  ($$);}.groupby_o
45a0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 20 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75 70 62   {A = 0;}.groupb
45d0: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47 52 4f  y_opt(A) ::= GRO
45e0: 55 50 20 42 59 20 65 78 70 72 6c 69 73 74 28 58  UP BY exprlist(X
45f0: 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74  ).  {A = X;}..%t
4600: 79 70 65 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b  ype having_opt {
4610: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
4620: 6f 72 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 73  or having_opt {s
4630: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4640: 28 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70  ($$);}.having_op
4650: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
4660: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
4670: 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41 29  ;}.having_opt(A)
4680: 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78 70 72   ::= HAVING expr
4690: 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  (X).  {A = X;}..
46a0: 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74 20  %type limit_opt 
46b0: 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61 6c  {struct LimitVal
46c0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6c 69  }.%destructor li
46d0: 6d 69 74 5f 6f 70 74 20 7b 0a 20 20 73 71 6c 69  mit_opt {.  sqli
46e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
46f0: 2e 70 4c 69 6d 69 74 29 3b 0a 20 20 73 71 6c 69  .pLimit);.  sqli
4700: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
4710: 2e 70 4f 66 66 73 65 74 29 3b 0a 7d 0a 6c 69 6d  .pOffset);.}.lim
4720: 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  it_opt(A) ::= . 
4730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4740: 20 20 20 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20      {A.pLimit = 
4750: 30 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 30  0; A.pOffset = 0
4760: 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  ;}.limit_opt(A) 
4770: 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58  ::= LIMIT expr(X
4780: 29 2e 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69  ).        {A.pLi
4790: 6d 69 74 20 3d 20 58 3b 20 41 2e 70 4f 66 66 73  mit = X; A.pOffs
47a0: 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f  et = 0;}.limit_o
47b0: 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20  pt(A) ::= LIMIT 
47c0: 65 78 70 72 28 58 29 20 4f 46 46 53 45 54 20 65  expr(X) OFFSET e
47d0: 78 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20  xpr(Y). .       
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 7b 41 2e 70 4c 69 6d 69 74 20 3d 20 58 3b 20 41  {A.pLimit = X; A
4810: 2e 70 4f 66 66 73 65 74 20 3d 20 59 3b 7d 0a 6c  .pOffset = Y;}.l
4820: 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  imit_opt(A) ::= 
4830: 4c 49 4d 49 54 20 65 78 70 72 28 58 29 20 43 4f  LIMIT expr(X) CO
4840: 4d 4d 41 20 65 78 70 72 28 59 29 2e 20 0a 20 20  MMA expr(Y). .  
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4870: 20 20 20 20 20 7b 41 2e 70 4f 66 66 73 65 74 20       {A.pOffset 
4880: 3d 20 58 3b 20 41 2e 70 4c 69 6d 69 74 20 3d 20  = X; A.pLimit = 
4890: 59 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  Y;}..///////////
48a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
48b0: 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   The DELETE stat
48c0: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
48d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
48e0: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44  ///.//.cmd ::= D
48f0: 45 4c 45 54 45 20 46 52 4f 4d 20 66 75 6c 6c 6e  ELETE FROM fulln
4900: 61 6d 65 28 58 29 20 77 68 65 72 65 5f 6f 70 74  ame(X) where_opt
4910: 28 59 29 2e 20 7b 73 71 6c 69 74 65 33 44 65 6c  (Y). {sqlite3Del
4920: 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 58  eteFrom(pParse,X
4930: 2c 59 29 3b 7d 0a 0a 25 74 79 70 65 20 77 68 65  ,Y);}..%type whe
4940: 72 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25  re_opt {Expr*}.%
4950: 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 72 65  destructor where
4960: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70  _opt {sqlite3Exp
4970: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 77  rDelete($$);}..w
4980: 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  here_opt(A) ::= 
4990: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
49a0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 77 68       {A = 0;}.wh
49b0: 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 57  ere_opt(A) ::= W
49c0: 48 45 52 45 20 65 78 70 72 28 58 29 2e 20 20 20  HERE expr(X).   
49d0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74      {A = X;}..%t
49e0: 79 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 70  ype setlist {Exp
49f0: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
4a00: 74 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 6c  tor setlist {sql
4a10: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4a20: 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  te($$);}..//////
4a30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4a40: 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20  //// The UPDATE 
4a50: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
4a60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4a70: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
4a80: 3a 3a 3d 20 55 50 44 41 54 45 20 6f 72 63 6f 6e  ::= UPDATE orcon
4a90: 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29  f(R) fullname(X)
4aa0: 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 20   SET setlist(Y) 
4ab0: 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 0a 20 20  where_opt(Z)..  
4ac0: 20 20 7b 73 71 6c 69 74 65 33 55 70 64 61 74 65    {sqlite3Update
4ad0: 28 70 50 61 72 73 65 2c 58 2c 59 2c 5a 2c 52 29  (pParse,X,Y,Z,R)
4ae0: 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20 3a  ;}..setlist(A) :
4af0: 3a 3d 20 73 65 74 6c 69 73 74 28 5a 29 20 43 4f  := setlist(Z) CO
4b00: 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65 78 70  MMA nm(X) EQ exp
4b10: 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  r(Y)..    {A = s
4b20: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
4b30: 70 65 6e 64 28 5a 2c 59 2c 26 58 29 3b 7d 0a 73  pend(Z,Y,&X);}.s
4b40: 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d  etlist(A) ::= nm
4b50: 28 58 29 20 45 51 20 65 78 70 72 28 59 29 2e 20  (X) EQ expr(Y). 
4b60: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
4b70: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 59  prListAppend(0,Y
4b80: 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ,&X);}..////////
4b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4ba0: 2f 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63 6f  // The INSERT co
4bb0: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
4bc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4bd0: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
4be0: 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29  := insert_cmd(R)
4bf0: 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28 58   INTO fullname(X
4c00: 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  ) inscollist_opt
4c10: 28 46 29 20 0a 20 20 20 20 20 20 20 20 56 41 4c  (F) .        VAL
4c20: 55 45 53 20 4c 50 20 69 74 65 6d 6c 69 73 74 28  UES LP itemlist(
4c30: 59 29 20 52 50 2e 0a 20 20 20 20 20 20 20 20 20  Y) RP..         
4c40: 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73 65 72     {sqlite3Inser
4c50: 74 28 70 50 61 72 73 65 2c 20 58 2c 20 59 2c 20  t(pParse, X, Y, 
4c60: 30 2c 20 46 2c 20 52 29 3b 7d 0a 63 6d 64 20 3a  0, F, R);}.cmd :
4c70: 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29  := insert_cmd(R)
4c80: 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28 58   INTO fullname(X
4c90: 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  ) inscollist_opt
4ca0: 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e 0a 20  (F) select(S).. 
4cb0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
4cc0: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
4cd0: 2c 20 58 2c 20 30 2c 20 53 2c 20 46 2c 20 52 29  , X, 0, S, F, R)
4ce0: 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 65 72 74  ;}..%type insert
4cf0: 5f 63 6d 64 20 7b 69 6e 74 7d 0a 69 6e 73 65 72  _cmd {int}.inser
4d00: 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e 53  t_cmd(A) ::= INS
4d10: 45 52 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20 20  ERT orconf(R).  
4d20: 20 7b 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72 74   {A = R;}.insert
4d30: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50 4c  _cmd(A) ::= REPL
4d40: 41 43 45 2e 20 20 20 20 20 20 20 20 20 20 20 20  ACE.            
4d50: 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  {A = OE_Replace;
4d60: 7d 0a 0a 0a 25 74 79 70 65 20 69 74 65 6d 6c 69  }...%type itemli
4d70: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
4d80: 64 65 73 74 72 75 63 74 6f 72 20 69 74 65 6d 6c  destructor iteml
4d90: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
4da0: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
4db0: 0a 0a 69 74 65 6d 6c 69 73 74 28 41 29 20 3a 3a  ..itemlist(A) ::
4dc0: 3d 20 69 74 65 6d 6c 69 73 74 28 58 29 20 43 4f  = itemlist(X) CO
4dd0: 4d 4d 41 20 65 78 70 72 28 59 29 2e 20 20 7b 41  MMA expr(Y).  {A
4de0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4df0: 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b  stAppend(X,Y,0);
4e00: 7d 0a 69 74 65 6d 6c 69 73 74 28 41 29 20 3a 3a  }.itemlist(A) ::
4e10: 3d 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  = expr(X).      
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
4e30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4e40: 73 74 41 70 70 65 6e 64 28 30 2c 58 2c 30 29 3b  stAppend(0,X,0);
4e50: 7d 0a 0a 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c  }..%type inscoll
4e60: 69 73 74 5f 6f 70 74 20 7b 49 64 4c 69 73 74 2a  ist_opt {IdList*
4e70: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69 6e  }.%destructor in
4e80: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b 73 71  scollist_opt {sq
4e90: 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74  lite3IdListDelet
4ea0: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 69 6e  e($$);}.%type in
4eb0: 73 63 6f 6c 6c 69 73 74 20 7b 49 64 4c 69 73 74  scollist {IdList
4ec0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69  *}.%destructor i
4ed0: 6e 73 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69 74  nscollist {sqlit
4ee0: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24  e3IdListDelete($
4ef0: 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c 6c 69 73 74  $);}..inscollist
4f00: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
4f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f20: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 73      {A = 0;}.ins
4f30: 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  collist_opt(A) :
4f40: 3a 3d 20 4c 50 20 69 6e 73 63 6f 6c 6c 69 73 74  := LP inscollist
4f50: 28 58 29 20 52 50 2e 20 20 20 20 7b 41 20 3d 20  (X) RP.    {A = 
4f60: 58 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28 41  X;}.inscollist(A
4f70: 29 20 3a 3a 3d 20 69 6e 73 63 6f 6c 6c 69 73 74  ) ::= inscollist
4f80: 28 58 29 20 43 4f 4d 4d 41 20 6e 6d 28 59 29 2e  (X) COMMA nm(Y).
4f90: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49 64    {A = sqlite3Id
4fa0: 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59 29  ListAppend(X,&Y)
4fb0: 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28 41 29  ;}.inscollist(A)
4fc0: 20 3a 3a 3d 20 6e 6d 28 59 29 2e 20 20 20 20 20   ::= nm(Y).     
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fe0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49 64 4c   {A = sqlite3IdL
4ff0: 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59 29 3b  istAppend(0,&Y);
5000: 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }../////////////
5010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 45  ////////////// E
5020: 78 70 72 65 73 73 69 6f 6e 20 50 72 6f 63 65 73  xpression Proces
5030: 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  sing ///////////
5040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5050: 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65 20 65 78 70  //.//..%type exp
5060: 72 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72  r {Expr*}.%destr
5070: 75 63 74 6f 72 20 65 78 70 72 20 7b 73 71 6c 69  uctor expr {sqli
5080: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
5090: 29 3b 7d 0a 25 74 79 70 65 20 74 65 72 6d 20 7b  );}.%type term {
50a0: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
50b0: 6f 72 20 74 65 72 6d 20 7b 73 71 6c 69 74 65 33  or term {sqlite3
50c0: 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d  ExprDelete($$);}
50d0: 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 74 65  ..expr(A) ::= te
50e0: 72 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  rm(X).          
50f0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72     {A = X;}.expr
5100: 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 65 78  (A) ::= LP(B) ex
5110: 70 72 28 58 29 20 52 50 28 45 29 2e 20 7b 41 20  pr(X) RP(E). {A 
5120: 3d 20 58 3b 20 73 71 6c 69 74 65 33 45 78 70 72  = X; sqlite3Expr
5130: 53 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b 20 7d  Span(A,&B,&E); }
5140: 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 4e 55 4c  .term(A) ::= NUL
5150: 4c 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  L(X).           
5160: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
5170: 70 72 28 40 58 2c 20 30 2c 20 30 2c 20 26 58 29  pr(@X, 0, 0, &X)
5180: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49  ;}.expr(A) ::= I
5190: 44 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  D(X).           
51a0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
51b0: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
51c0: 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20  , &X);}.expr(A) 
51d0: 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20  ::= JOIN_KW(X). 
51e0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
51f0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
5200: 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70   0, 0, &X);}.exp
5210: 72 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44  r(A) ::= nm(X) D
5220: 4f 54 20 6e 6d 28 59 29 2e 20 7b 0a 20 20 45 78  OT nm(Y). {.  Ex
5230: 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69  pr *temp1 = sqli
5240: 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  te3Expr(TK_ID, 0
5250: 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78 70 72  , 0, &X);.  Expr
5260: 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69 74 65   *temp2 = sqlite
5270: 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  3Expr(TK_ID, 0, 
5280: 30 2c 20 26 59 29 3b 0a 20 20 41 20 3d 20 73 71  0, &Y);.  A = sq
5290: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54  lite3Expr(TK_DOT
52a0: 2c 20 74 65 6d 70 31 2c 20 74 65 6d 70 32 2c 20  , temp1, temp2, 
52b0: 30 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  0);.}.expr(A) ::
52c0: 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59  = nm(X) DOT nm(Y
52d0: 29 20 44 4f 54 20 6e 6d 28 5a 29 2e 20 7b 0a 20  ) DOT nm(Z). {. 
52e0: 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73   Expr *temp1 = s
52f0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
5300: 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45  , 0, 0, &X);.  E
5310: 78 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c  xpr *temp2 = sql
5320: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
5330: 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 45 78 70  0, 0, &Y);.  Exp
5340: 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c 69 74  r *temp3 = sqlit
5350: 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c  e3Expr(TK_ID, 0,
5360: 20 30 2c 20 26 5a 29 3b 0a 20 20 45 78 70 72 20   0, &Z);.  Expr 
5370: 2a 74 65 6d 70 34 20 3d 20 73 71 6c 69 74 65 33  *temp4 = sqlite3
5380: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d  Expr(TK_DOT, tem
5390: 70 32 2c 20 74 65 6d 70 33 2c 20 30 29 3b 0a 20  p2, temp3, 0);. 
53a0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
53b0: 28 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20  (TK_DOT, temp1, 
53c0: 74 65 6d 70 34 2c 20 30 29 3b 0a 7d 0a 74 65 72  temp4, 0);.}.ter
53d0: 6d 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52  m(A) ::= INTEGER
53e0: 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 73  (X).      {A = s
53f0: 71 6c 69 74 65 33 45 78 70 72 28 40 58 2c 20 30  qlite3Expr(@X, 0
5400: 2c 20 30 2c 20 26 58 29 3b 7d 0a 74 65 72 6d 28  , 0, &X);}.term(
5410: 41 29 20 3a 3a 3d 20 46 4c 4f 41 54 28 58 29 2e  A) ::= FLOAT(X).
5420: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
5430: 69 74 65 33 45 78 70 72 28 40 58 2c 20 30 2c 20  ite3Expr(@X, 0, 
5440: 30 2c 20 26 58 29 3b 7d 0a 74 65 72 6d 28 41 29  0, &X);}.term(A)
5450: 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20   ::= STRING(X). 
5460: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
5470: 65 33 45 78 70 72 28 40 58 2c 20 30 2c 20 30 2c  e3Expr(@X, 0, 0,
5480: 20 26 58 29 3b 7d 0a 74 65 72 6d 28 41 29 20 3a   &X);}.term(A) :
5490: 3a 3d 20 42 4c 4f 42 28 58 29 2e 20 20 20 20 20  := BLOB(X).     
54a0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
54b0: 45 78 70 72 28 40 58 2c 20 30 2c 20 30 2c 20 26  Expr(@X, 0, 0, &
54c0: 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  X);}.expr(A) ::=
54d0: 20 52 45 47 49 53 54 45 52 28 58 29 2e 20 20 20   REGISTER(X).   
54e0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 52 65    {A = sqlite3Re
54f0: 67 69 73 74 65 72 45 78 70 72 28 70 50 61 72 73  gisterExpr(pPars
5500: 65 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  e, &X);}.expr(A)
5510: 20 3a 3a 3d 20 56 41 52 49 41 42 4c 45 28 58 29   ::= VARIABLE(X)
5520: 2e 20 20 20 20 20 7b 0a 20 20 54 6f 6b 65 6e 20  .     {.  Token 
5530: 2a 70 54 6f 6b 65 6e 20 3d 20 26 58 3b 0a 20 20  *pToken = &X;.  
5540: 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 41 20  Expr *pExpr = A 
5550: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
5560: 5f 56 41 52 49 41 42 4c 45 2c 20 30 2c 20 30 2c  _VARIABLE, 0, 0,
5570: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 73 71 6c 69   pToken);.  sqli
5580: 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72  te3ExprAssignVar
5590: 4e 75 6d 62 65 72 28 70 50 61 72 73 65 2c 20 70  Number(pParse, p
55a0: 45 78 70 72 29 3b 0a 7d 0a 65 78 70 72 28 41 29  Expr);.}.expr(A)
55b0: 20 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20 65 78   ::= ID(X) LP ex
55c0: 70 72 6c 69 73 74 28 59 29 20 52 50 28 45 29 2e  prlist(Y) RP(E).
55d0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
55e0: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 59 2c 20  ExprFunction(Y, 
55f0: 26 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  &X);.  sqlite3Ex
5600: 70 72 53 70 61 6e 28 41 2c 26 58 2c 26 45 29 3b  prSpan(A,&X,&E);
5610: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49  .}.expr(A) ::= I
5620: 44 28 58 29 20 4c 50 20 53 54 41 52 20 52 50 28  D(X) LP STAR RP(
5630: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  E). {.  A = sqli
5640: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
5650: 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74 65  0, &X);.  sqlite
5660: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26  3ExprSpan(A,&X,&
5670: 45 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a  E);.}.term(A) ::
5680: 3d 20 43 54 49 4d 45 28 4f 50 29 2e 20 20 20 20  = CTIME(OP).    
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
56a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40   = sqlite3Expr(@
56b0: 4f 50 2c 30 2c 30 2c 30 29 3b 7d 0a 74 65 72 6d  OP,0,0,0);}.term
56c0: 28 41 29 20 3a 3a 3d 20 43 44 41 54 45 28 4f 50  (A) ::= CDATE(OP
56d0: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
56e0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
56f0: 45 78 70 72 28 40 4f 50 2c 30 2c 30 2c 30 29 3b  Expr(@OP,0,0,0);
5700: 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 43 54  }.term(A) ::= CT
5710: 49 4d 45 53 54 41 4d 50 28 4f 50 29 2e 20 20 20  IMESTAMP(OP).   
5720: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
5730: 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 30  qlite3Expr(@OP,0
5740: 2c 30 2c 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  ,0,0);}.expr(A) 
5750: 3a 3a 3d 20 65 78 70 72 28 58 29 20 41 4e 44 28  ::= expr(X) AND(
5760: 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 20  OP) expr(Y).    
5770: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
5780: 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  (@OP, X, Y, 0);}
5790: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
57a0: 72 28 58 29 20 4f 52 28 4f 50 29 20 65 78 70 72  r(X) OR(OP) expr
57b0: 28 59 29 2e 20 20 20 20 20 7b 41 20 3d 20 73 71  (Y).     {A = sq
57c0: 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58  lite3Expr(@OP, X
57d0: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
57e0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c 54  ) ::= expr(X) LT
57f0: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20  (OP) expr(Y).   
5800: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78    {A = sqlite3Ex
5810: 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29  pr(@OP, X, Y, 0)
5820: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
5830: 78 70 72 28 58 29 20 47 54 28 4f 50 29 20 65 78  xpr(X) GT(OP) ex
5840: 70 72 28 59 29 2e 20 20 20 20 20 7b 41 20 3d 20  pr(Y).     {A = 
5850: 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c  sqlite3Expr(@OP,
5860: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
5870: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
5880: 4c 45 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20  LE(OP) expr(Y). 
5890: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
58a0: 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20  Expr(@OP, X, Y, 
58b0: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
58c0: 20 65 78 70 72 28 58 29 20 47 45 28 4f 50 29 20   expr(X) GE(OP) 
58d0: 65 78 70 72 28 59 29 2e 20 20 20 20 20 7b 41 20  expr(Y).     {A 
58e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f  = sqlite3Expr(@O
58f0: 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78  P, X, Y, 0);}.ex
5900: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
5910: 29 20 4e 45 28 4f 50 29 20 65 78 70 72 28 59 29  ) NE(OP) expr(Y)
5920: 2e 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  .     {A = sqlit
5930: 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59  e3Expr(@OP, X, Y
5940: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
5950: 3a 3d 20 65 78 70 72 28 58 29 20 45 51 28 4f 50  := expr(X) EQ(OP
5960: 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 20 7b  ) expr(Y).     {
5970: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5980: 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  @OP, X, Y, 0);}.
5990: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
59a0: 28 58 29 20 42 49 54 41 4e 44 28 4f 50 29 20 65  (X) BITAND(OP) e
59b0: 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c  xpr(Y). {A = sql
59c0: 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c  ite3Expr(@OP, X,
59d0: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
59e0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 42 49 54   ::= expr(X) BIT
59f0: 4f 52 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20  OR(OP) expr(Y). 
5a00: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
5a10: 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b  r(@OP, X, Y, 0);
5a20: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5a30: 70 72 28 58 29 20 4c 53 48 49 46 54 28 4f 50 29  pr(X) LSHIFT(OP)
5a40: 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73   expr(Y). {A = s
5a50: 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20  qlite3Expr(@OP, 
5a60: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
5a70: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 52  A) ::= expr(X) R
5a80: 53 48 49 46 54 28 4f 50 29 20 65 78 70 72 28 59  SHIFT(OP) expr(Y
5a90: 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45  ). {A = sqlite3E
5aa0: 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30  xpr(@OP, X, Y, 0
5ab0: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
5ac0: 65 78 70 72 28 58 29 20 50 4c 55 53 28 4f 50 29  expr(X) PLUS(OP)
5ad0: 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d   expr(Y).   {A =
5ae0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 40 4f 50   sqlite3Expr(@OP
5af0: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
5b00: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
5b10: 20 4d 49 4e 55 53 28 4f 50 29 20 65 78 70 72 28   MINUS(OP) expr(
5b20: 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  Y).  {A = sqlite
5b30: 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20 59 2c  3Expr(@OP, X, Y,
5b40: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
5b50: 3d 20 65 78 70 72 28 58 29 20 53 54 41 52 28 4f  = expr(X) STAR(O
5b60: 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41  P) expr(Y).   {A
5b70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 40   = sqlite3Expr(@
5b80: 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  OP, X, Y, 0);}.e
5b90: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
5ba0: 58 29 20 53 4c 41 53 48 28 4f 50 29 20 65 78 70  X) SLASH(OP) exp
5bb0: 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69  r(Y).  {A = sqli
5bc0: 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58 2c 20  te3Expr(@OP, X, 
5bd0: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
5be0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 52 45 4d 28  ::= expr(X) REM(
5bf0: 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 20  OP) expr(Y).    
5c00: 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  {A = sqlite3Expr
5c10: 28 40 4f 50 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  (@OP, X, Y, 0);}
5c20: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
5c30: 72 28 58 29 20 43 4f 4e 43 41 54 28 4f 50 29 20  r(X) CONCAT(OP) 
5c40: 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71  expr(Y). {A = sq
5c50: 6c 69 74 65 33 45 78 70 72 28 40 4f 50 2c 20 58  lite3Expr(@OP, X
5c60: 2c 20 59 2c 20 30 29 3b 7d 0a 25 74 79 70 65 20  , Y, 0);}.%type 
5c70: 6c 69 6b 65 6f 70 20 7b 73 74 72 75 63 74 20 4c  likeop {struct L
5c80: 69 6b 65 4f 70 7d 0a 6c 69 6b 65 6f 70 28 41 29  ikeOp}.likeop(A)
5c90: 20 3a 3a 3d 20 4c 49 4b 45 2e 20 20 20 20 20 7b   ::= LIKE.     {
5ca0: 41 2e 6f 70 63 6f 64 65 20 3d 20 54 4b 5f 4c 49  A.opcode = TK_LI
5cb0: 4b 45 3b 20 41 2e 6e 6f 74 20 3d 20 30 3b 7d 0a  KE; A.not = 0;}.
5cc0: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 47 4c  likeop(A) ::= GL
5cd0: 4f 42 2e 20 20 20 20 20 7b 41 2e 6f 70 63 6f 64  OB.     {A.opcod
5ce0: 65 20 3d 20 54 4b 5f 47 4c 4f 42 3b 20 41 2e 6e  e = TK_GLOB; A.n
5cf0: 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b 65 6f 70 28  ot = 0;}.likeop(
5d00: 41 29 20 3a 3a 3d 20 4e 4f 54 20 4c 49 4b 45 2e  A) ::= NOT LIKE.
5d10: 20 7b 41 2e 6f 70 63 6f 64 65 20 3d 20 54 4b 5f   {A.opcode = TK_
5d20: 4c 49 4b 45 3b 20 41 2e 6e 6f 74 20 3d 20 31 3b  LIKE; A.not = 1;
5d30: 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20  }.likeop(A) ::= 
5d40: 4e 4f 54 20 47 4c 4f 42 2e 20 7b 41 2e 6f 70 63  NOT GLOB. {A.opc
5d50: 6f 64 65 20 3d 20 54 4b 5f 47 4c 4f 42 3b 20 41  ode = TK_GLOB; A
5d60: 2e 6e 6f 74 20 3d 20 31 3b 7d 0a 25 74 79 70 65  .not = 1;}.%type
5d70: 20 65 73 63 61 70 65 20 7b 45 78 70 72 2a 7d 0a   escape {Expr*}.
5d80: 65 73 63 61 70 65 28 58 29 20 3a 3a 3d 20 45 53  escape(X) ::= ES
5d90: 43 41 50 45 20 65 78 70 72 28 41 29 2e 20 5b 45  CAPE expr(A). [E
5da0: 53 43 41 50 45 5d 20 7b 58 20 3d 20 41 3b 7d 0a  SCAPE] {X = A;}.
5db0: 65 73 63 61 70 65 28 58 29 20 3a 3a 3d 20 2e 20  escape(X) ::= . 
5dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 45                [E
5dd0: 53 43 41 50 45 5d 20 7b 58 20 3d 20 30 3b 7d 0a  SCAPE] {X = 0;}.
5de0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
5df0: 28 58 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65  (X) likeop(OP) e
5e00: 78 70 72 28 59 29 20 65 73 63 61 70 65 28 45 29  xpr(Y) escape(E)
5e10: 2e 20 20 5b 4c 49 4b 45 5d 20 20 7b 0a 20 20 45  .  [LIKE]  {.  E
5e20: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
5e30: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5e40: 41 70 70 65 6e 64 28 30 2c 20 59 2c 20 30 29 3b  Append(0, Y, 0);
5e50: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
5e60: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
5e70: 28 70 4c 69 73 74 2c 20 58 2c 20 30 29 3b 0a 20  (pList, X, 0);. 
5e80: 20 69 66 28 20 45 20 29 7b 0a 20 20 20 20 70 4c   if( E ){.    pL
5e90: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
5ea0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73  rListAppend(pLis
5eb0: 74 2c 20 45 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  t, E, 0);.  }.  
5ec0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  A = sqlite3ExprF
5ed0: 75 6e 63 74 69 6f 6e 28 70 4c 69 73 74 2c 20 30  unction(pList, 0
5ee0: 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e  );.  if( A ) A->
5ef0: 6f 70 20 3d 20 4f 50 2e 6f 70 63 6f 64 65 3b 0a  op = OP.opcode;.
5f00: 20 20 69 66 28 20 4f 50 2e 6e 6f 74 20 29 20 41    if( OP.not ) A
5f10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
5f20: 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b  K_NOT, A, 0, 0);
5f30: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  .  sqlite3ExprSp
5f40: 61 6e 28 41 2c 20 26 58 2d 3e 73 70 61 6e 2c 20  an(A, &X->span, 
5f50: 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 0a 65 78  &Y->span);.}..ex
5f60: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
5f70: 29 20 49 53 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20  ) ISNULL(E). {. 
5f80: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
5f90: 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 30  (TK_ISNULL, X, 0
5fa0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  , 0);.  sqlite3E
5fb0: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
5fc0: 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41  an,&E);.}.expr(A
5fd0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 53  ) ::= expr(X) IS
5fe0: 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20   NULL(E). {.  A 
5ff0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
6000: 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30  _ISNULL, X, 0, 0
6010: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
6020: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
6030: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
6040: 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 4e 55  := expr(X) NOTNU
6050: 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  LL(E). {.  A = s
6060: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f  qlite3Expr(TK_NO
6070: 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b  TNULL, X, 0, 0);
6080: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  .  sqlite3ExprSp
6090: 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45  an(A,&X->span,&E
60a0: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
60b0: 20 65 78 70 72 28 58 29 20 4e 4f 54 20 4e 55 4c   expr(X) NOT NUL
60c0: 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  L(E). {.  A = sq
60d0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f 54  lite3Expr(TK_NOT
60e0: 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  NULL, X, 0, 0);.
60f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
6100: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29  n(A,&X->span,&E)
6110: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
6120: 65 78 70 72 28 58 29 20 49 53 20 4e 4f 54 20 4e  expr(X) IS NOT N
6130: 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20  ULL(E). {.  A = 
6140: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e  sqlite3Expr(TK_N
6150: 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29  OTNULL, X, 0, 0)
6160: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
6170: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26  pan(A,&X->span,&
6180: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
6190: 3d 20 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29  = NOT(B) expr(X)
61a0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
61b0: 33 45 78 70 72 28 40 42 2c 20 58 2c 20 30 2c 20  3Expr(@B, X, 0, 
61c0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  0);.  sqlite3Exp
61d0: 72 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73  rSpan(A,&B,&X->s
61e0: 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  pan);.}.expr(A) 
61f0: 3a 3a 3d 20 42 49 54 4e 4f 54 28 42 29 20 65 78  ::= BITNOT(B) ex
6200: 70 72 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(X). {.  A = s
6210: 71 6c 69 74 65 33 45 78 70 72 28 40 42 2c 20 58  qlite3Expr(@B, X
6220: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
6230: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c  e3ExprSpan(A,&B,
6240: 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70  &X->span);.}.exp
6250: 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 28 42  r(A) ::= MINUS(B
6260: 29 20 65 78 70 72 28 58 29 2e 20 5b 55 4d 49 4e  ) expr(X). [UMIN
6270: 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  US] {.  A = sqli
6280: 74 65 33 45 78 70 72 28 54 4b 5f 55 4d 49 4e 55  te3Expr(TK_UMINU
6290: 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73  S, X, 0, 0);.  s
62a0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
62b0: 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d  ,&B,&X->span);.}
62c0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 50 4c 55  .expr(A) ::= PLU
62d0: 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b 55  S(B) expr(X). [U
62e0: 50 4c 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73 71  PLUS] {.  A = sq
62f0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 55 50 4c  lite3Expr(TK_UPL
6300: 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  US, X, 0, 0);.  
6310: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
6320: 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a  A,&B,&X->span);.
6330: 7d 0a 25 74 79 70 65 20 62 65 74 77 65 65 6e 5f  }.%type between_
6340: 6f 70 20 7b 69 6e 74 7d 0a 62 65 74 77 65 65 6e  op {int}.between
6350: 5f 6f 70 28 41 29 20 3a 3a 3d 20 42 45 54 57 45  _op(A) ::= BETWE
6360: 45 4e 2e 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d  EN.     {A = 0;}
6370: 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20 3a  .between_op(A) :
6380: 3a 3d 20 4e 4f 54 20 42 45 54 57 45 45 4e 2e 20  := NOT BETWEEN. 
6390: 7b 41 20 3d 20 31 3b 7d 0a 65 78 70 72 28 41 29  {A = 1;}.expr(A)
63a0: 20 3a 3a 3d 20 65 78 70 72 28 57 29 20 62 65 74   ::= expr(W) bet
63b0: 77 65 65 6e 5f 6f 70 28 4e 29 20 65 78 70 72 28  ween_op(N) expr(
63c0: 58 29 20 41 4e 44 20 65 78 70 72 28 59 29 2e 20  X) AND expr(Y). 
63d0: 5b 42 45 54 57 45 45 4e 5d 20 7b 0a 20 20 45 78  [BETWEEN] {.  Ex
63e0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
63f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6400: 70 70 65 6e 64 28 30 2c 20 58 2c 20 30 29 3b 0a  ppend(0, X, 0);.
6410: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
6420: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6430: 70 4c 69 73 74 2c 20 59 2c 20 30 29 3b 0a 20 20  pList, Y, 0);.  
6440: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
6450: 54 4b 5f 42 45 54 57 45 45 4e 2c 20 57 2c 20 30  TK_BETWEEN, W, 0
6460: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20  , 0);.  if( A ) 
6470: 41 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  A->pList = pList
6480: 3b 0a 20 20 69 66 28 20 4e 20 29 20 41 20 3d 20  ;.  if( N ) A = 
6490: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e  sqlite3Expr(TK_N
64a0: 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20  OT, A, 0, 0);.  
64b0: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
64c0: 41 2c 26 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73  A,&W->span,&Y->s
64d0: 70 61 6e 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20  pan);.}.%ifndef 
64e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
64f0: 55 45 52 59 0a 20 20 25 74 79 70 65 20 69 6e 5f  UERY.  %type in_
6500: 6f 70 20 7b 69 6e 74 7d 0a 20 20 69 6e 5f 6f 70  op {int}.  in_op
6510: 28 41 29 20 3a 3a 3d 20 49 4e 2e 20 20 20 20 20  (A) ::= IN.     
6520: 20 7b 41 20 3d 20 30 3b 7d 0a 20 20 69 6e 5f 6f   {A = 0;}.  in_o
6530: 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e 2e  p(A) ::= NOT IN.
6540: 20 20 7b 41 20 3d 20 31 3b 7d 0a 20 20 65 78 70    {A = 1;}.  exp
6550: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
6560: 20 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 65 78 70   in_op(N) LP exp
6570: 72 6c 69 73 74 28 59 29 20 52 50 28 45 29 2e 20  rlist(Y) RP(E). 
6580: 5b 49 4e 5d 20 7b 0a 20 20 20 20 41 20 3d 20 73  [IN] {.    A = s
6590: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
65a0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , X, 0, 0);.    
65b0: 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74  if( A ) A->pList
65c0: 20 3d 20 59 3b 0a 20 20 20 20 69 66 28 20 4e 20   = Y;.    if( N 
65d0: 29 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ) A = sqlite3Exp
65e0: 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20  r(TK_NOT, A, 0, 
65f0: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
6600: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
6610: 61 6e 2c 26 45 29 3b 0a 20 20 7d 0a 20 20 65 78  an,&E);.  }.  ex
6620: 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20  pr(A) ::= LP(B) 
6630: 73 65 6c 65 63 74 28 58 29 20 52 50 28 45 29 2e  select(X) RP(E).
6640: 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74   {.    A = sqlit
6650: 65 33 45 78 70 72 28 54 4b 5f 53 45 4c 45 43 54  e3Expr(TK_SELECT
6660: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
6670: 69 66 28 20 41 20 29 20 41 2d 3e 70 53 65 6c 65  if( A ) A->pSele
6680: 63 74 20 3d 20 58 3b 0a 20 20 20 20 73 71 6c 69  ct = X;.    sqli
6690: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 42  te3ExprSpan(A,&B
66a0: 2c 26 45 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72  ,&E);.  }.  expr
66b0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
66c0: 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 73 65 6c 65  in_op(N) LP sele
66d0: 63 74 28 59 29 20 52 50 28 45 29 2e 20 20 5b 49  ct(Y) RP(E).  [I
66e0: 4e 5d 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c  N] {.    A = sql
66f0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20  ite3Expr(TK_IN, 
6700: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  X, 0, 0);.    if
6710: 28 20 41 20 29 20 41 2d 3e 70 53 65 6c 65 63 74  ( A ) A->pSelect
6720: 20 3d 20 59 3b 0a 20 20 20 20 69 66 28 20 4e 20   = Y;.    if( N 
6730: 29 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ) A = sqlite3Exp
6740: 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20  r(TK_NOT, A, 0, 
6750: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  0);.    sqlite3E
6760: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
6770: 61 6e 2c 26 45 29 3b 0a 20 20 7d 0a 20 20 65 78  an,&E);.  }.  ex
6780: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
6790: 29 20 69 6e 5f 6f 70 28 4e 29 20 6e 6d 28 59 29  ) in_op(N) nm(Y)
67a0: 20 64 62 6e 6d 28 5a 29 2e 20 5b 49 4e 5d 20 7b   dbnm(Z). [IN] {
67b0: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
67c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
67d0: 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59 2c 26  istAppend(0,&Y,&
67e0: 5a 29 3b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69  Z);.    A = sqli
67f0: 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58  te3Expr(TK_IN, X
6800: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
6810: 20 41 20 29 20 41 2d 3e 70 53 65 6c 65 63 74 20   A ) A->pSelect 
6820: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
6830: 65 77 28 30 2c 70 53 72 63 2c 30 2c 30 2c 30 2c  ew(0,pSrc,0,0,0,
6840: 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 69 66  0,0,0,0);.    if
6850: 28 20 4e 20 29 20 41 20 3d 20 73 71 6c 69 74 65  ( N ) A = sqlite
6860: 33 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c  3Expr(TK_NOT, A,
6870: 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
6880: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58  te3ExprSpan(A,&X
6890: 2d 3e 73 70 61 6e 2c 5a 2e 7a 3f 26 5a 3a 26 59  ->span,Z.z?&Z:&Y
68a0: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29  );.  }.  expr(A)
68b0: 20 3a 3a 3d 20 45 58 49 53 54 53 28 42 29 20 4c   ::= EXISTS(B) L
68c0: 50 20 73 65 6c 65 63 74 28 59 29 20 52 50 28 45  P select(Y) RP(E
68d0: 29 2e 20 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ). {.    Expr *p
68e0: 20 3d 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78   = A = sqlite3Ex
68f0: 70 72 28 54 4b 5f 45 58 49 53 54 53 2c 20 30 2c  pr(TK_EXISTS, 0,
6900: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
6910: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 53  p ){.      p->pS
6920: 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 20 20 20  elect = Y;.     
6930: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
6940: 28 70 2c 26 42 2c 26 45 29 3b 0a 20 20 20 20 7d  (p,&B,&E);.    }
6950: 0a 20 20 7d 0a 25 65 6e 64 69 66 20 2f 2f 20 53  .  }.%endif // S
6960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
6970: 45 52 59 0a 0a 2f 2a 20 43 41 53 45 20 65 78 70  ERY../* CASE exp
6980: 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 65 78 70 72  ressions */.expr
6990: 28 41 29 20 3a 3a 3d 20 43 41 53 45 28 43 29 20  (A) ::= CASE(C) 
69a0: 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 58 29 20  case_operand(X) 
69b0: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 59 29  case_exprlist(Y)
69c0: 20 63 61 73 65 5f 65 6c 73 65 28 5a 29 20 45 4e   case_else(Z) EN
69d0: 44 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  D(E). {.  A = sq
69e0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 43 41 53  lite3Expr(TK_CAS
69f0: 45 2c 20 58 2c 20 5a 2c 20 30 29 3b 0a 20 20 69  E, X, Z, 0);.  i
6a00: 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 20  f( A ) A->pList 
6a10: 3d 20 59 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = Y;.  sqlite3Ex
6a20: 70 72 53 70 61 6e 28 41 2c 20 26 43 2c 20 26 45  prSpan(A, &C, &E
6a30: 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73 65 5f  );.}.%type case_
6a40: 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69  exprlist {ExprLi
6a50: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
6a60: 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20 7b   case_exprlist {
6a70: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
6a80: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 63 61 73 65  elete($$);}.case
6a90: 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  _exprlist(A) ::=
6aa0: 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 58   case_exprlist(X
6ab0: 29 20 57 48 45 4e 20 65 78 70 72 28 59 29 20 54  ) WHEN expr(Y) T
6ac0: 48 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20  HEN expr(Z). {. 
6ad0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6ae0: 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 20 59 2c  ListAppend(X, Y,
6af0: 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74   0);.  A = sqlit
6b00: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6b10: 28 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a 63 61 73  (A, Z, 0);.}.cas
6b20: 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a  e_exprlist(A) ::
6b30: 3d 20 57 48 45 4e 20 65 78 70 72 28 59 29 20 54  = WHEN expr(Y) T
6b40: 48 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20  HEN expr(Z). {. 
6b50: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6b60: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 59 2c  ListAppend(0, Y,
6b70: 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74   0);.  A = sqlit
6b80: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
6b90: 28 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a 25 74 79  (A, Z, 0);.}.%ty
6ba0: 70 65 20 63 61 73 65 5f 65 6c 73 65 20 7b 45 78  pe case_else {Ex
6bb0: 70 72 2a 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41  pr*}.case_else(A
6bc0: 29 20 3a 3a 3d 20 20 45 4c 53 45 20 65 78 70 72  ) ::=  ELSE expr
6bd0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
6be0: 3d 20 58 3b 7d 0a 63 61 73 65 5f 65 6c 73 65 28  = X;}.case_else(
6bf0: 41 29 20 3a 3a 3d 20 20 2e 20 20 20 20 20 20 20  A) ::=  .       
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
6c10: 20 3d 20 30 3b 7d 20 0a 25 74 79 70 65 20 63 61   = 0;} .%type ca
6c20: 73 65 5f 6f 70 65 72 61 6e 64 20 7b 45 78 70 72  se_operand {Expr
6c30: 2a 7d 0a 63 61 73 65 5f 6f 70 65 72 61 6e 64 28  *}.case_operand(
6c40: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20  A) ::= expr(X). 
6c50: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
6c60: 58 3b 7d 20 0a 63 61 73 65 5f 6f 70 65 72 61 6e  X;} .case_operan
6c70: 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  d(A) ::= .      
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
6c90: 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65 20 65 78  = 0;} ..%type ex
6ca0: 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  prlist {ExprList
6cb0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65  *}.%destructor e
6cc0: 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  xprlist {sqlite3
6cd0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24  ExprListDelete($
6ce0: 24 29 3b 7d 0a 25 74 79 70 65 20 65 78 70 72 69  $);}.%type expri
6cf0: 74 65 6d 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73  tem {Expr*}.%des
6d00: 74 72 75 63 74 6f 72 20 65 78 70 72 69 74 65 6d  tructor expritem
6d10: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
6d20: 65 74 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72 6c  ete($$);}..exprl
6d30: 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 6c  ist(A) ::= exprl
6d40: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  ist(X) COMMA exp
6d50: 72 69 74 65 6d 28 59 29 2e 20 0a 20 20 20 20 20  ritem(Y). .     
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d80: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
6d90: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  xprListAppend(X,
6da0: 59 2c 30 29 3b 7d 0a 65 78 70 72 6c 69 73 74 28  Y,0);}.exprlist(
6db0: 41 29 20 3a 3a 3d 20 65 78 70 72 69 74 65 6d 28  A) ::= expritem(
6dc0: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b  X).            {
6dd0: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
6de0: 69 73 74 41 70 70 65 6e 64 28 30 2c 58 2c 30 29  istAppend(0,X,0)
6df0: 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41 29 20 3a  ;}.expritem(A) :
6e00: 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 20 20  := expr(X).     
6e10: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
6e20: 58 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41 29 20  X;}.expritem(A) 
6e30: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
6e50: 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   0;}..//////////
6e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6e70: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 49  /// The CREATE I
6e80: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  NDEX command ///
6e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ea0: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
6eb0: 43 52 45 41 54 45 28 53 29 20 75 6e 69 71 75 65  CREATE(S) unique
6ec0: 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20 6e 6d  flag(U) INDEX nm
6ed0: 28 58 29 20 64 62 6e 6d 28 44 29 0a 20 20 20 20  (X) dbnm(D).    
6ee0: 20 20 20 20 4f 4e 20 6e 6d 28 59 29 20 4c 50 20      ON nm(Y) LP 
6ef0: 69 64 78 6c 69 73 74 28 5a 29 20 52 50 28 45 29  idxlist(Z) RP(E)
6f00: 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 7b 0a 20 20   onconf(R). {.  
6f10: 69 66 28 20 55 21 3d 4f 45 5f 4e 6f 6e 65 20 29  if( U!=OE_None )
6f20: 20 55 20 3d 20 52 3b 0a 20 20 69 66 28 20 55 3d   U = R;.  if( U=
6f30: 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 55 20 3d  =OE_Default) U =
6f40: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 73 71 6c   OE_Abort;.  sql
6f50: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
6f60: 70 50 61 72 73 65 2c 20 26 58 2c 20 26 44 2c 20  pParse, &X, &D, 
6f70: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
6f80: 70 65 6e 64 28 30 2c 26 59 2c 30 29 2c 5a 2c 55  pend(0,&Y,0),Z,U
6f90: 2c 20 26 53 2c 20 26 45 29 3b 0a 7d 0a 0a 25 74  , &S, &E);.}..%t
6fa0: 79 70 65 20 75 6e 69 71 75 65 66 6c 61 67 20 7b  ype uniqueflag {
6fb0: 69 6e 74 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28  int}.uniqueflag(
6fc0: 41 29 20 3a 3a 3d 20 55 4e 49 51 55 45 2e 20 20  A) ::= UNIQUE.  
6fd0: 7b 41 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a  {A = OE_Abort;}.
6fe0: 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a 3a  uniqueflag(A) ::
6ff0: 3d 20 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20  = .        {A = 
7000: 4f 45 5f 4e 6f 6e 65 3b 7d 0a 0a 25 74 79 70 65  OE_None;}..%type
7010: 20 69 64 78 6c 69 73 74 20 7b 45 78 70 72 4c 69   idxlist {ExprLi
7020: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
7030: 20 69 64 78 6c 69 73 74 20 7b 73 71 6c 69 74 65   idxlist {sqlite
7040: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7050: 24 24 29 3b 7d 0a 25 74 79 70 65 20 69 64 78 6c  $$);}.%type idxl
7060: 69 73 74 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73  ist_opt {ExprLis
7070: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
7080: 69 64 78 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c  idxlist_opt {sql
7090: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
70a0: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 69  te($$);}.%type i
70b0: 64 78 69 74 65 6d 20 7b 54 6f 6b 65 6e 7d 0a 0a  dxitem {Token}..
70c0: 69 64 78 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  idxlist_opt(A) :
70d0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
70f0: 3d 20 30 3b 7d 0a 69 64 78 6c 69 73 74 5f 6f 70  = 0;}.idxlist_op
7100: 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 64 78 6c  t(A) ::= LP idxl
7110: 69 73 74 28 58 29 20 52 50 2e 20 20 20 20 20 20  ist(X) RP.      
7120: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 78 6c     {A = X;}.idxl
7130: 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 78 6c 69  ist(A) ::= idxli
7140: 73 74 28 58 29 20 43 4f 4d 4d 41 20 69 64 78 69  st(X) COMMA idxi
7150: 74 65 6d 28 59 29 20 63 6f 6c 6c 61 74 65 28 43  tem(Y) collate(C
7160: 29 20 73 6f 72 74 6f 72 64 65 72 2e 20 20 7b 0a  ) sortorder.  {.
7170: 20 20 45 78 70 72 20 2a 70 20 3d 20 30 3b 0a 20    Expr *p = 0;. 
7180: 20 69 66 28 20 43 2e 6e 3e 30 20 29 7b 0a 20 20   if( C.n>0 ){.  
7190: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70    p = sqlite3Exp
71a0: 72 28 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20  r(TK_COLUMN, 0, 
71b0: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
71c0: 20 29 20 70 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71   ) p->pColl = sq
71d0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
71e0: 65 71 28 70 50 61 72 73 65 2c 20 43 2e 7a 2c 20  eq(pParse, C.z, 
71f0: 43 2e 6e 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20  C.n);.  }.  A = 
7200: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
7210: 70 70 65 6e 64 28 58 2c 20 70 2c 20 26 59 29 3b  ppend(X, p, &Y);
7220: 0a 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a  .}.idxlist(A) ::
7230: 3d 20 69 64 78 69 74 65 6d 28 59 29 20 63 6f 6c  = idxitem(Y) col
7240: 6c 61 74 65 28 43 29 20 73 6f 72 74 6f 72 64 65  late(C) sortorde
7250: 72 2e 20 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  r. {.  Expr *p =
7260: 20 30 3b 0a 20 20 69 66 28 20 43 2e 6e 3e 30 20   0;.  if( C.n>0 
7270: 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
7280: 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c 55 4d 4e  e3Expr(TK_COLUMN
7290: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
72a0: 69 66 28 20 70 20 29 20 70 2d 3e 70 43 6f 6c 6c  if( p ) p->pColl
72b0: 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
72c0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
72d0: 43 2e 7a 2c 20 43 2e 6e 29 3b 0a 20 20 7d 0a 20  C.z, C.n);.  }. 
72e0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
72f0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 70 2c  ListAppend(0, p,
7300: 20 26 59 29 3b 0a 7d 0a 69 64 78 69 74 65 6d 28   &Y);.}.idxitem(
7310: 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20 20  A) ::= nm(X).   
7320: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
7330: 58 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  X;}...//////////
7340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7350: 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20 49 4e 44  /// The DROP IND
7360: 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  EX command /////
7370: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7380: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
7390: 44 52 4f 50 20 49 4e 44 45 58 20 66 75 6c 6c 6e  DROP INDEX fulln
73a0: 61 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74  ame(X).   {sqlit
73b0: 65 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72  e3DropIndex(pPar
73c0: 73 65 2c 20 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  se, X);}..//////
73d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
73e0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56 41 43 55  /////// The VACU
73f0: 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  UM command /////
7400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7410: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
7420: 3a 3a 3d 20 56 41 43 55 55 4d 2e 20 20 20 20 20  ::= VACUUM.     
7430: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
7440: 74 65 33 56 61 63 75 75 6d 28 70 50 61 72 73 65  te3Vacuum(pParse
7450: 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41  ,0);}.cmd ::= VA
7460: 43 55 55 4d 20 6e 6d 2e 20 20 20 20 20 20 20 20  CUUM nm.        
7470: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63       {sqlite3Vac
7480: 75 75 6d 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a  uum(pParse,0);}.
7490: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
74a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
74b0: 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e  he PRAGMA comman
74c0: 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  d //////////////
74d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
74e0: 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  //.%ifndef SQLIT
74f0: 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 63 6d  E_OMIT_PRAGMA.cm
7500: 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28  d ::= PRAGMA nm(
7510: 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6e 6d  X) dbnm(Z) EQ nm
7520: 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 50 72  (Y).  {sqlite3Pr
7530: 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26  agma(pParse,&X,&
7540: 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a  Z,&Y,0);}.cmd ::
7550: 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64  = PRAGMA nm(X) d
7560: 62 6e 6d 28 5a 29 20 45 51 20 4f 4e 28 59 29 2e  bnm(Z) EQ ON(Y).
7570: 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61    {sqlite3Pragma
7580: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59  (pParse,&X,&Z,&Y
7590: 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52  ,0);}.cmd ::= PR
75a0: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
75b0: 5a 29 20 45 51 20 70 6c 75 73 5f 6e 75 6d 28 59  Z) EQ plus_num(Y
75c0: 29 2e 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d  ). {sqlite3Pragm
75d0: 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26  a(pParse,&X,&Z,&
75e0: 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50  Y,0);}.cmd ::= P
75f0: 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d  RAGMA nm(X) dbnm
7600: 28 5a 29 20 45 51 20 6d 69 6e 75 73 5f 6e 75 6d  (Z) EQ minus_num
7610: 28 59 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (Y). {.  sqlite3
7620: 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58  Pragma(pParse,&X
7630: 2c 26 5a 2c 26 59 2c 31 29 3b 0a 7d 0a 63 6d 64  ,&Z,&Y,1);.}.cmd
7640: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58   ::= PRAGMA nm(X
7650: 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20 6e 6d 28  ) dbnm(Z) LP nm(
7660: 59 29 20 52 50 2e 20 7b 73 71 6c 69 74 65 33 50  Y) RP. {sqlite3P
7670: 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c  ragma(pParse,&X,
7680: 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a  &Z,&Y,0);}.cmd :
7690: 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20  := PRAGMA nm(X) 
76a0: 64 62 6e 6d 28 5a 29 2e 20 20 20 20 20 20 20 20  dbnm(Z).        
76b0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61       {sqlite3Pra
76c0: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
76d0: 2c 30 2c 30 29 3b 7d 0a 25 65 6e 64 69 66 20 2f  ,0,0);}.%endif /
76e0: 2f 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52  / SQLITE_OMIT_PR
76f0: 41 47 4d 41 0a 70 6c 75 73 5f 6e 75 6d 28 41 29  AGMA.plus_num(A)
7700: 20 3a 3a 3d 20 70 6c 75 73 5f 6f 70 74 20 6e 75   ::= plus_opt nu
7710: 6d 62 65 72 28 58 29 2e 20 20 20 7b 41 20 3d 20  mber(X).   {A = 
7720: 58 3b 7d 0a 6d 69 6e 75 73 5f 6e 75 6d 28 41 29  X;}.minus_num(A)
7730: 20 3a 3a 3d 20 4d 49 4e 55 53 20 6e 75 6d 62 65   ::= MINUS numbe
7740: 72 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58  r(X).     {A = X
7750: 3b 7d 0a 6e 75 6d 62 65 72 28 41 29 20 3a 3a 3d  ;}.number(A) ::=
7760: 20 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20 20   INTEGER(X).    
7770: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
7780: 7d 0a 6e 75 6d 62 65 72 28 41 29 20 3a 3a 3d 20  }.number(A) ::= 
7790: 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20  FLOAT(X).       
77a0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
77b0: 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d 20 50 4c  .plus_opt ::= PL
77c0: 55 53 2e 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d  US..plus_opt ::=
77d0: 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ...////////////
77e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
77f0: 20 54 68 65 20 43 52 45 41 54 45 20 54 52 49 47   The CREATE TRIG
7800: 47 45 52 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  GER command ////
7810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7820: 2f 0a 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  /..%ifndef SQLIT
7830: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a  E_OMIT_TRIGGER..
7840: 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45 20 74  cmd ::= CREATE t
7850: 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20 42  rigger_decl(A) B
7860: 45 47 49 4e 20 74 72 69 67 67 65 72 5f 63 6d 64  EGIN trigger_cmd
7870: 5f 6c 69 73 74 28 53 29 20 45 4e 44 28 5a 29 2e  _list(S) END(Z).
7880: 20 7b 0a 20 20 54 6f 6b 65 6e 20 61 6c 6c 3b 0a   {.  Token all;.
7890: 20 20 61 6c 6c 2e 7a 20 3d 20 41 2e 7a 3b 0a 20    all.z = A.z;. 
78a0: 20 61 6c 6c 2e 6e 20 3d 20 28 5a 2e 7a 20 2d 20   all.n = (Z.z - 
78b0: 41 2e 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71  A.z) + Z.n;.  sq
78c0: 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67 67  lite3FinishTrigg
78d0: 65 72 28 70 50 61 72 73 65 2c 20 53 2c 20 26 61  er(pParse, S, &a
78e0: 6c 6c 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72 5f  ll);.}..trigger_
78f0: 64 65 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d 70  decl(A) ::= temp
7900: 28 54 29 20 54 52 49 47 47 45 52 20 6e 6d 28 42  (T) TRIGGER nm(B
7910: 29 20 64 62 6e 6d 28 5a 29 20 74 72 69 67 67 65  ) dbnm(Z) trigge
7920: 72 5f 74 69 6d 65 28 43 29 0a 20 20 20 20 20 20  r_time(C).      
7930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
7940: 69 67 67 65 72 5f 65 76 65 6e 74 28 44 29 0a 20  igger_event(D). 
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 20 4f 4e 20 66 75 6c 6c 6e 61 6d 65 28 45     ON fullname(E
7970: 29 20 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65  ) foreach_clause
7980: 28 46 29 20 77 68 65 6e 5f 63 6c 61 75 73 65 28  (F) when_clause(
7990: 47 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 42  G). {.  sqlite3B
79a0: 65 67 69 6e 54 72 69 67 67 65 72 28 70 50 61 72  eginTrigger(pPar
79b0: 73 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c 20 44  se, &B, &Z, C, D
79c0: 2e 61 2c 20 44 2e 62 2c 20 45 2c 20 46 2c 20 47  .a, D.b, E, F, G
79d0: 2c 20 54 29 3b 0a 20 20 41 20 3d 20 28 5a 2e 6e  , T);.  A = (Z.n
79e0: 3d 3d 30 3f 42 3a 5a 29 3b 0a 7d 0a 0a 25 74 79  ==0?B:Z);.}..%ty
79f0: 70 65 20 74 72 69 67 67 65 72 5f 74 69 6d 65 20  pe trigger_time 
7a00: 20 7b 69 6e 74 7d 0a 74 72 69 67 67 65 72 5f 74   {int}.trigger_t
7a10: 69 6d 65 28 41 29 20 3a 3a 3d 20 42 45 46 4f 52  ime(A) ::= BEFOR
7a20: 45 2e 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b  E.      { A = TK
7a30: 5f 42 45 46 4f 52 45 3b 20 7d 0a 74 72 69 67 67  _BEFORE; }.trigg
7a40: 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 41  er_time(A) ::= A
7a50: 46 54 45 52 2e 20 20 20 20 20 20 20 7b 20 41 20  FTER.       { A 
7a60: 3d 20 54 4b 5f 41 46 54 45 52 3b 20 20 7d 0a 74  = TK_AFTER;  }.t
7a70: 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a  rigger_time(A) :
7a80: 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46 2e 20 20  := INSTEAD OF.  
7a90: 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54 45 41 44  { A = TK_INSTEAD
7aa0: 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28  ;}.trigger_time(
7ab0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
7ac0: 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46      { A = TK_BEF
7ad0: 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72  ORE; }..%type tr
7ae0: 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 74 72  igger_event {str
7af0: 75 63 74 20 54 72 69 67 45 76 65 6e 74 7d 0a 25  uct TrigEvent}.%
7b00: 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67 67  destructor trigg
7b10: 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c 69 74 65  er_event {sqlite
7b20: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24  3IdListDelete($$
7b30: 2e 62 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76  .b);}.trigger_ev
7b40: 65 6e 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54  ent(A) ::= DELET
7b50: 45 28 4f 50 29 2e 20 20 20 20 20 20 20 20 20 20  E(OP).          
7b60: 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b 20      {A.a = @OP; 
7b70: 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65  A.b = 0;}.trigge
7b80: 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 49  r_event(A) ::= I
7b90: 4e 53 45 52 54 28 4f 50 29 2e 20 20 20 20 20 20  NSERT(OP).      
7ba0: 20 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 40          {A.a = @
7bb0: 4f 50 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72  OP; A.b = 0;}.tr
7bc0: 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a  igger_event(A) :
7bd0: 3a 3d 20 55 50 44 41 54 45 28 4f 50 29 2e 20 20  := UPDATE(OP).  
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 61              {A.a
7bf0: 20 3d 20 40 4f 50 3b 20 41 2e 62 20 3d 20 30 3b   = @OP; A.b = 0;
7c00: 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28  }.trigger_event(
7c10: 41 29 20 3a 3a 3d 20 55 50 44 41 54 45 20 4f 46  A) ::= UPDATE OF
7c20: 20 69 6e 73 63 6f 6c 6c 69 73 74 28 58 29 2e 20   inscollist(X). 
7c30: 7b 41 2e 61 20 3d 20 54 4b 5f 55 50 44 41 54 45  {A.a = TK_UPDATE
7c40: 3b 20 41 2e 62 20 3d 20 58 3b 7d 0a 0a 25 74 79  ; A.b = X;}..%ty
7c50: 70 65 20 66 6f 72 65 61 63 68 5f 63 6c 61 75 73  pe foreach_claus
7c60: 65 20 7b 69 6e 74 7d 0a 66 6f 72 65 61 63 68 5f  e {int}.foreach_
7c70: 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e 20  clause(A) ::= . 
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 7b 20 41 20 3d 20 54 4b 5f 52 4f 57 3b 20    { A = TK_ROW; 
7ca0: 7d 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65  }.foreach_clause
7cb0: 28 41 29 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48  (A) ::= FOR EACH
7cc0: 20 52 4f 57 2e 20 20 20 20 20 20 20 7b 20 41 20   ROW.       { A 
7cd0: 3d 20 54 4b 5f 52 4f 57 3b 20 7d 0a 66 6f 72 65  = TK_ROW; }.fore
7ce0: 61 63 68 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a  ach_clause(A) ::
7cf0: 3d 20 46 4f 52 20 45 41 43 48 20 53 54 41 54 45  = FOR EACH STATE
7d00: 4d 45 4e 54 2e 20 7b 20 41 20 3d 20 54 4b 5f 53  MENT. { A = TK_S
7d10: 54 41 54 45 4d 45 4e 54 3b 20 7d 0a 0a 25 74 79  TATEMENT; }..%ty
7d20: 70 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b  pe when_clause {
7d30: 45 78 70 72 2a 7d 0a 77 68 65 6e 5f 63 6c 61 75  Expr*}.when_clau
7d40: 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  se(A) ::= .     
7d50: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 30 3b          { A = 0;
7d60: 20 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28 41   }.when_clause(A
7d70: 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72 28  ) ::= WHEN expr(
7d80: 58 29 2e 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a  X). { A = X; }..
7d90: 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 63 6d  %type trigger_cm
7da0: 64 5f 6c 69 73 74 20 7b 54 72 69 67 67 65 72 53  d_list {TriggerS
7db0: 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  tep*}.%destructo
7dc0: 72 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  r trigger_cmd_li
7dd0: 73 74 20 7b 73 71 6c 69 74 65 33 44 65 6c 65 74  st {sqlite3Delet
7de0: 65 54 72 69 67 67 65 72 53 74 65 70 28 24 24 29  eTriggerStep($$)
7df0: 3b 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c  ;}.trigger_cmd_l
7e00: 69 73 74 28 41 29 20 3a 3a 3d 20 74 72 69 67 67  ist(A) ::= trigg
7e10: 65 72 5f 63 6d 64 28 58 29 20 53 45 4d 49 20 74  er_cmd(X) SEMI t
7e20: 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28  rigger_cmd_list(
7e30: 59 29 2e 20 7b 0a 20 20 58 2d 3e 70 4e 65 78 74  Y). {.  X->pNext
7e40: 20 3d 20 59 3b 0a 20 20 41 20 3d 20 58 3b 0a 7d   = Y;.  A = X;.}
7e50: 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73  .trigger_cmd_lis
7e60: 74 28 41 29 20 3a 3a 3d 20 2e 20 7b 20 41 20 3d  t(A) ::= . { A =
7e70: 20 30 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69   0; }..%type tri
7e80: 67 67 65 72 5f 63 6d 64 20 7b 54 72 69 67 67 65  gger_cmd {Trigge
7e90: 72 53 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63  rStep*}.%destruc
7ea0: 74 6f 72 20 74 72 69 67 67 65 72 5f 63 6d 64 20  tor trigger_cmd 
7eb0: 7b 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72  {sqlite3DeleteTr
7ec0: 69 67 67 65 72 53 74 65 70 28 24 24 29 3b 7d 0a  iggerStep($$);}.
7ed0: 2f 2f 20 55 50 44 41 54 45 20 0a 74 72 69 67 67  // UPDATE .trigg
7ee0: 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 55 50  er_cmd(A) ::= UP
7ef0: 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20 6e  DATE orconf(R) n
7f00: 6d 28 58 29 20 53 45 54 20 73 65 74 6c 69 73 74  m(X) SET setlist
7f10: 28 59 29 20 77 68 65 72 65 5f 6f 70 74 28 5a 29  (Y) where_opt(Z)
7f20: 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  .  .            
7f30: 20 20 20 7b 20 41 20 3d 20 73 71 6c 69 74 65 33     { A = sqlite3
7f40: 54 72 69 67 67 65 72 55 70 64 61 74 65 53 74 65  TriggerUpdateSte
7f50: 70 28 26 58 2c 20 59 2c 20 5a 2c 20 52 29 3b 20  p(&X, Y, Z, R); 
7f60: 7d 0a 0a 2f 2f 20 49 4e 53 45 52 54 0a 74 72 69  }..// INSERT.tri
7f70: 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20  gger_cmd(A) ::= 
7f80: 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e  insert_cmd(R) IN
7f90: 54 4f 20 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c  TO nm(X) inscoll
7fa0: 69 73 74 5f 6f 70 74 28 46 29 20 0a 20 20 20 20  ist_opt(F) .    
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
7fc0: 41 4c 55 45 53 20 4c 50 20 69 74 65 6d 6c 69 73  ALUES LP itemlis
7fd0: 74 28 59 29 20 52 50 2e 20 20 0a 20 20 20 20 20  t(Y) RP.  .     
7fe0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
7ff0: 71 6c 69 74 65 33 54 72 69 67 67 65 72 49 6e 73  qlite3TriggerIns
8000: 65 72 74 53 74 65 70 28 26 58 2c 20 46 2c 20 59  ertStep(&X, F, Y
8010: 2c 20 30 2c 20 52 29 3b 7d 0a 0a 74 72 69 67 67  , 0, R);}..trigg
8020: 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 69 6e  er_cmd(A) ::= in
8030: 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f  sert_cmd(R) INTO
8040: 20 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73   nm(X) inscollis
8050: 74 5f 6f 70 74 28 46 29 20 73 65 6c 65 63 74 28  t_opt(F) select(
8060: 53 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  S)..            
8070: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54     {A = sqlite3T
8080: 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 70  riggerInsertStep
8090: 28 26 58 2c 20 46 2c 20 30 2c 20 53 2c 20 52 29  (&X, F, 0, S, R)
80a0: 3b 7d 0a 0a 2f 2f 20 44 45 4c 45 54 45 0a 74 72  ;}..// DELETE.tr
80b0: 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d  igger_cmd(A) ::=
80c0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 6e 6d 28   DELETE FROM nm(
80d0: 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29 2e  X) where_opt(Y).
80e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
80f0: 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  {A = sqlite3Trig
8100: 67 65 72 44 65 6c 65 74 65 53 74 65 70 28 26 58  gerDeleteStep(&X
8110: 2c 20 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45 43  , Y);}..// SELEC
8120: 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  T.trigger_cmd(A)
8130: 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20   ::= select(X). 
8140: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69   {A = sqlite3Tri
8150: 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28 58  ggerSelectStep(X
8160: 29 3b 20 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65  ); }..// The spe
8170: 63 69 61 6c 20 52 41 49 53 45 20 65 78 70 72 65  cial RAISE expre
8180: 73 73 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f  ssion that may o
8190: 63 63 75 72 20 69 6e 20 74 72 69 67 67 65 72 20  ccur in trigger 
81a0: 70 72 6f 67 72 61 6d 73 0a 65 78 70 72 28 41 29  programs.expr(A)
81b0: 20 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50   ::= RAISE(X) LP
81c0: 20 49 47 4e 4f 52 45 20 52 50 28 59 29 2e 20 20   IGNORE RP(Y).  
81d0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
81e0: 78 70 72 28 54 4b 5f 52 41 49 53 45 2c 20 30 2c  xpr(TK_RAISE, 0,
81f0: 20 30 2c 20 30 29 3b 20 0a 20 20 41 2d 3e 69 43   0, 0); .  A->iC
8200: 6f 6c 75 6d 6e 20 3d 20 4f 45 5f 49 67 6e 6f 72  olumn = OE_Ignor
8210: 65 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  e;.  sqlite3Expr
8220: 53 70 61 6e 28 41 2c 20 26 58 2c 20 26 59 29 3b  Span(A, &X, &Y);
8230: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52  .}.expr(A) ::= R
8240: 41 49 53 45 28 58 29 20 4c 50 20 72 61 69 73 65  AISE(X) LP raise
8250: 74 79 70 65 28 54 29 20 43 4f 4d 4d 41 20 6e 6d  type(T) COMMA nm
8260: 28 5a 29 20 52 50 28 59 29 2e 20 20 7b 0a 20 20  (Z) RP(Y).  {.  
8270: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
8280: 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30 2c 20  TK_RAISE, 0, 0, 
8290: 26 5a 29 3b 20 0a 20 20 41 2d 3e 69 43 6f 6c 75  &Z); .  A->iColu
82a0: 6d 6e 20 3d 20 54 3b 0a 20 20 73 71 6c 69 74 65  mn = T;.  sqlite
82b0: 33 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58 2c  3ExprSpan(A, &X,
82c0: 20 26 59 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 2f   &Y);.}.%endif /
82d0: 2f 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  / !SQLITE_OMIT_T
82e0: 52 49 47 47 45 52 0a 0a 25 74 79 70 65 20 72 61  RIGGER..%type ra
82f0: 69 73 65 74 79 70 65 20 7b 69 6e 74 7d 0a 72 61  isetype {int}.ra
8300: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52  isetype(A) ::= R
8310: 4f 4c 4c 42 41 43 4b 2e 20 20 7b 41 20 3d 20 4f  OLLBACK.  {A = O
8320: 45 5f 52 6f 6c 6c 62 61 63 6b 3b 7d 0a 72 61 69  E_Rollback;}.rai
8330: 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 41 42  setype(A) ::= AB
8340: 4f 52 54 2e 20 20 20 20 20 7b 41 20 3d 20 4f 45  ORT.     {A = OE
8350: 5f 41 62 6f 72 74 3b 7d 0a 72 61 69 73 65 74 79  _Abort;}.raisety
8360: 70 65 28 41 29 20 3a 3a 3d 20 46 41 49 4c 2e 20  pe(A) ::= FAIL. 
8370: 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 46 61 69       {A = OE_Fai
8380: 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  l;}...//////////
8390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 20  //////////////  
83a0: 44 52 4f 50 20 54 52 49 47 47 45 52 20 73 74 61  DROP TRIGGER sta
83b0: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
83c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
83d0: 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51  /////.%ifndef SQ
83e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
83f0: 52 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54  R.cmd ::= DROP T
8400: 52 49 47 47 45 52 20 66 75 6c 6c 6e 61 6d 65 28  RIGGER fullname(
8410: 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44  X). {.  sqlite3D
8420: 72 6f 70 54 72 69 67 67 65 72 28 70 50 61 72 73  ropTrigger(pPars
8430: 65 2c 58 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 2f  e,X);.}.%endif /
8440: 2f 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  / !SQLITE_OMIT_T
8450: 52 49 47 47 45 52 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  RIGGER..////////
8460: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8470: 20 41 54 54 41 43 48 20 44 41 54 41 42 41 53 45   ATTACH DATABASE
8480: 20 66 69 6c 65 20 41 53 20 6e 61 6d 65 20 2f 2f   file AS name //
8490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
84a0: 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ///////.cmd ::= 
84b0: 41 54 54 41 43 48 20 64 61 74 61 62 61 73 65 5f  ATTACH database_
84c0: 6b 77 5f 6f 70 74 20 69 64 73 28 46 29 20 41 53  kw_opt ids(F) AS
84d0: 20 6e 6d 28 44 29 20 6b 65 79 5f 6f 70 74 28 4b   nm(D) key_opt(K
84e0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 41 74  ). {.  sqlite3At
84f0: 74 61 63 68 28 70 50 61 72 73 65 2c 20 26 46 2c  tach(pParse, &F,
8500: 20 26 44 2c 20 4b 2e 74 79 70 65 2c 20 26 4b 2e   &D, K.type, &K.
8510: 6b 65 79 29 3b 0a 7d 0a 25 74 79 70 65 20 6b 65  key);.}.%type ke
8520: 79 5f 6f 70 74 20 7b 73 74 72 75 63 74 20 41 74  y_opt {struct At
8530: 74 61 63 68 4b 65 79 7d 0a 6b 65 79 5f 6f 70 74  tachKey}.key_opt
8540: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
8560: 41 2e 74 79 70 65 20 3d 20 30 3b 20 7d 0a 6b 65  A.type = 0; }.ke
8570: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4b 45 59  y_opt(A) ::= KEY
8580: 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20 20   ids(X).        
8590: 20 20 20 7b 20 41 2e 74 79 70 65 3d 31 3b 20 41     { A.type=1; A
85a0: 2e 6b 65 79 20 3d 20 58 3b 20 7d 0a 6b 65 79 5f  .key = X; }.key_
85b0: 6f 70 74 28 41 29 20 3a 3a 3d 20 4b 45 59 20 42  opt(A) ::= KEY B
85c0: 4c 4f 42 28 58 29 2e 20 20 20 20 20 20 20 20 20  LOB(X).         
85d0: 20 7b 20 41 2e 74 79 70 65 3d 32 3b 20 41 2e 6b   { A.type=2; A.k
85e0: 65 79 20 3d 20 58 3b 20 7d 0a 0a 64 61 74 61 62  ey = X; }..datab
85f0: 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 44  ase_kw_opt ::= D
8600: 41 54 41 42 41 53 45 2e 0a 64 61 74 61 62 61 73  ATABASE..databas
8610: 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 0a  e_kw_opt ::= ...
8620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8630: 2f 2f 2f 2f 2f 2f 2f 2f 20 44 45 54 41 43 48 20  //////// DETACH 
8640: 44 41 54 41 42 41 53 45 20 6e 61 6d 65 20 2f 2f  DATABASE name //
8650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
8670: 63 6d 64 20 3a 3a 3d 20 44 45 54 41 43 48 20 64  cmd ::= DETACH d
8680: 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 6e  atabase_kw_opt n
8690: 6d 28 44 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  m(D). {.  sqlite
86a0: 33 44 65 74 61 63 68 28 70 50 61 72 73 65 2c 20  3Detach(pParse, 
86b0: 26 44 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  &D);.}..////////
86c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
86d0: 2f 2f 20 52 45 49 4e 44 45 58 20 63 6f 6c 6c 61  // REINDEX colla
86e0: 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  tion ///////////
86f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8700: 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20  ///////.%ifndef 
8710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
8720: 44 45 58 0a 63 6d 64 20 3a 3a 3d 20 52 45 49 4e  DEX.cmd ::= REIN
8730: 44 45 58 2e 20 20 20 20 20 20 20 20 20 20 20 20  DEX.            
8740: 20 20 20 20 7b 73 71 6c 69 74 65 33 52 65 69 6e      {sqlite3Rein
8750: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
8760: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45 49 4e  );}.cmd ::= REIN
8770: 44 45 58 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59  DEX nm(X) dbnm(Y
8780: 29 2e 20 20 7b 73 71 6c 69 74 65 33 52 65 69 6e  ).  {sqlite3Rein
8790: 64 65 78 28 70 50 61 72 73 65 2c 20 26 58 2c 20  dex(pParse, &X, 
87a0: 26 59 29 3b 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f  &Y);}.%endif..//
87b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87c0: 2f 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20 54 41 42  ////// ALTER TAB
87d0: 4c 45 20 74 61 62 6c 65 20 2e 2e 2e 20 2f 2f 2f  LE table ... ///
87e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
87f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69  /////////////.%i
8800: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8810: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 63 6d 64  T_ALTERTABLE.cmd
8820: 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45   ::= ALTER TABLE
8830: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 52 45 4e   fullname(X) REN
8840: 41 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e 20 7b 0a  AME TO nm(Z). {.
8850: 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 52 65    sqlite3AlterRe
8860: 6e 61 6d 65 54 61 62 6c 65 28 70 50 61 72 73 65  nameTable(pParse
8870: 2c 58 2c 26 5a 29 3b 0a 7d 0a 25 65 6e 64 69 66  ,X,&Z);.}.%endif
8880: 0a                                               .