/ Hex Artifact Content
Login

Artifact 0bcc53bba498081a544e50c8845bf4857ebfccb9:


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 33 31 20 32 30 30 34 2f 30 37 2f 32 32 20  .131 2004/07/22 
0290: 31 35 3a 30 32 3a 32 35 20 64 72 68 20 45 78 70  15:02:25 drh Exp
02a0: 20 24 0a 2a 2f 0a 25 74 6f 6b 65 6e 5f 70 72 65   $.*/.%token_pre
02b0: 66 69 78 20 54 4b 5f 0a 25 74 6f 6b 65 6e 5f 74  fix TK_.%token_t
02c0: 79 70 65 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66  ype {Token}.%def
02d0: 61 75 6c 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e  ault_type {Token
02e0: 7d 0a 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e  }.%extra_argumen
02f0: 74 20 7b 50 61 72 73 65 20 2a 70 50 61 72 73 65  t {Parse *pParse
0300: 7d 0a 25 73 79 6e 74 61 78 5f 65 72 72 6f 72 20  }.%syntax_error 
0310: 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  {.  if( pParse->
0320: 7a 45 72 72 4d 73 67 3d 3d 30 20 29 7b 0a 20 20  zErrMsg==0 ){.  
0330: 20 20 69 66 28 20 54 4f 4b 45 4e 2e 7a 5b 30 5d    if( TOKEN.z[0]
0340: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
0350: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
0360: 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20  , "near \"%T\": 
0370: 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 26  syntax error", &
0380: 54 4f 4b 45 4e 29 3b 0a 20 20 20 20 7d 65 6c 73  TOKEN);.    }els
0390: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
03a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
03b0: 20 22 69 6e 63 6f 6d 70 6c 65 74 65 20 53 51 4c   "incomplete SQL
03c0: 20 73 74 61 74 65 6d 65 6e 74 22 29 3b 0a 20 20   statement");.  
03d0: 20 20 7d 0a 20 20 7d 0a 7d 0a 25 6e 61 6d 65 20    }.  }.}.%name 
03e0: 73 71 6c 69 74 65 33 50 61 72 73 65 72 0a 25 69  sqlite3Parser.%i
03f0: 6e 63 6c 75 64 65 20 7b 0a 23 69 6e 63 6c 75 64  nclude {.#includ
0400: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0410: 23 69 6e 63 6c 75 64 65 20 22 70 61 72 73 65 2e  #include "parse.
0420: 68 22 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  h"../*.** An ins
0430: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
0440: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e  ructure holds in
0450: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
0460: 74 68 65 0a 2a 2a 20 4c 49 4d 49 54 20 63 6c 61  the.** LIMIT cla
0470: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
0480: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
0490: 72 75 63 74 20 4c 69 6d 69 74 56 61 6c 20 7b 0a  ruct LimitVal {.
04a0: 20 20 69 6e 74 20 6c 69 6d 69 74 3b 20 20 20 20    int limit;    
04b0: 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 76 61 6c  /* The LIMIT val
04c0: 75 65 2e 20 20 2d 31 20 69 66 20 74 68 65 72 65  ue.  -1 if there
04d0: 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20 2a 2f 0a   is no limit */.
04e0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
04f0: 2f 2a 20 54 68 65 20 4f 46 46 53 45 54 2e 20 20  /* The OFFSET.  
0500: 30 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  0 if there is no
0510: 6e 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ne */.};../*.** 
0520: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0530: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
0540: 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65 73  ucture describes
0550: 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 0a   the event of a.
0560: 2a 2a 20 54 52 49 47 47 45 52 2e 20 20 22 61 22  ** TRIGGER.  "a"
0570: 20 69 73 20 74 68 65 20 65 76 65 6e 74 20 74 79   is the event ty
0580: 70 65 2c 20 6f 6e 65 20 6f 66 20 54 4b 5f 55 50  pe, one of TK_UP
0590: 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54 2c  DATE, TK_INSERT,
05a0: 0a 2a 2a 20 54 4b 5f 44 45 4c 45 54 45 2c 20 6f  .** TK_DELETE, o
05b0: 72 20 54 4b 5f 49 4e 53 54 45 41 44 2e 20 20 49  r TK_INSTEAD.  I
05c0: 66 20 74 68 65 20 65 76 65 6e 74 20 69 73 20 6f  f the event is o
05d0: 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a  f the form.**.**
05e0: 20 20 20 20 20 20 55 50 44 41 54 45 20 4f 4e 20        UPDATE ON 
05f0: 28 61 2c 62 2c 63 29 0a 2a 2a 0a 2a 2a 20 54 68  (a,b,c).**.** Th
0600: 65 6e 20 74 68 65 20 22 62 22 20 49 64 4c 69 73  en the "b" IdLis
0610: 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 6c 69  t records the li
0620: 73 74 20 22 61 2c 62 2c 63 22 2e 0a 2a 2f 0a 73  st "a,b,c"..*/.s
0630: 74 72 75 63 74 20 54 72 69 67 45 76 65 6e 74 20  truct TrigEvent 
0640: 7b 20 69 6e 74 20 61 3b 20 49 64 4c 69 73 74 20  { int a; IdList 
0650: 2a 20 62 3b 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  * b; };../*.** A
0660: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
0670: 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c  is structure hol
0680: 64 73 20 74 68 65 20 41 54 54 41 43 48 20 6b 65  ds the ATTACH ke
0690: 79 20 61 6e 64 20 74 68 65 20 6b 65 79 20 74 79  y and the key ty
06a0: 70 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 41 74  pe..*/.struct At
06b0: 74 61 63 68 4b 65 79 20 7b 20 69 6e 74 20 74 79  tachKey { int ty
06c0: 70 65 3b 20 20 54 6f 6b 65 6e 20 6b 65 79 3b 20  pe;  Token key; 
06d0: 7d 3b 0a 0a 7d 20 2f 2f 20 65 6e 64 20 25 69 6e  };..} // end %in
06e0: 63 6c 75 64 65 0a 0a 2f 2f 20 54 68 65 73 65 20  clude..// These 
06f0: 61 72 65 20 65 78 74 72 61 20 74 6f 6b 65 6e 73  are extra tokens
0700: 20 75 73 65 64 20 62 79 20 74 68 65 20 6c 65 78   used by the lex
0710: 65 72 20 62 75 74 20 6e 65 76 65 72 20 73 65 65  er but never see
0720: 6e 20 62 79 20 74 68 65 0a 2f 2f 20 70 61 72 73  n by the.// pars
0730: 65 72 2e 20 20 57 65 20 70 75 74 20 74 68 65 6d  er.  We put them
0740: 20 69 6e 20 61 20 72 75 6c 65 20 73 6f 20 74 68   in a rule so th
0750: 61 74 20 74 68 65 20 70 61 72 73 65 72 20 67 65  at the parser ge
0760: 6e 65 72 61 74 6f 72 20 77 69 6c 6c 0a 2f 2f 20  nerator will.// 
0770: 61 64 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20  add them to the 
0780: 70 61 72 73 65 2e 68 20 6f 75 74 70 75 74 20 66  parse.h output f
0790: 69 6c 65 2e 0a 2f 2f 0a 25 6e 6f 6e 61 73 73 6f  ile..//.%nonasso
07a0: 63 20 45 4e 44 5f 4f 46 5f 46 49 4c 45 20 49 4c  c END_OF_FILE IL
07b0: 4c 45 47 41 4c 20 53 50 41 43 45 20 55 4e 43 4c  LEGAL SPACE UNCL
07c0: 4f 53 45 44 5f 53 54 52 49 4e 47 20 43 4f 4d 4d  OSED_STRING COMM
07d0: 45 4e 54 20 46 55 4e 43 54 49 4f 4e 0a 20 20 20  ENT FUNCTION.   
07e0: 20 20 20 20 20 20 20 43 4f 4c 55 4d 4e 20 41 47         COLUMN AG
07f0: 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 0a 2f 2f 20  G_FUNCTION...// 
0800: 49 6e 70 75 74 20 69 73 20 61 20 73 69 6e 67 6c  Input is a singl
0810: 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 0a 69 6e  e SQL command.in
0820: 70 75 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74 2e  put ::= cmdlist.
0830: 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 63 6d 64  .cmdlist ::= cmd
0840: 6c 69 73 74 20 65 63 6d 64 2e 0a 63 6d 64 6c 69  list ecmd..cmdli
0850: 73 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a 65 63 6d  st ::= ecmd..ecm
0860: 64 20 3a 3a 3d 20 65 78 70 6c 61 69 6e 20 63 6d  d ::= explain cm
0870: 64 78 20 53 45 4d 49 2e 0a 65 63 6d 64 20 3a 3a  dx SEMI..ecmd ::
0880: 3d 20 53 45 4d 49 2e 0a 63 6d 64 78 20 3a 3a 3d  = SEMI..cmdx ::=
0890: 20 63 6d 64 2e 20 20 20 20 20 20 20 20 20 20 20   cmd.           
08a0: 7b 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  { sqlite3FinishC
08b0: 6f 64 69 6e 67 28 70 50 61 72 73 65 29 3b 20 7d  oding(pParse); }
08c0: 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50  .explain ::= EXP
08d0: 4c 41 49 4e 2e 20 20 20 20 7b 20 73 71 6c 69 74  LAIN.    { sqlit
08e0: 65 33 42 65 67 69 6e 50 61 72 73 65 28 70 50 61  e3BeginParse(pPa
08f0: 72 73 65 2c 20 31 29 3b 20 7d 0a 65 78 70 6c 61  rse, 1); }.expla
0900: 69 6e 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  in ::= .        
0910: 20 20 20 7b 20 73 71 6c 69 74 65 33 42 65 67 69     { sqlite3Begi
0920: 6e 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 30  nParse(pParse, 0
0930: 29 3b 20 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ); }..//////////
0940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69  /////////// Begi
0950: 6e 20 61 6e 64 20 65 6e 64 20 74 72 61 6e 73 61  n and end transa
0960: 63 74 69 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f  ctions. ////////
0970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0980: 2f 2f 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d  ////.//..cmd ::=
0990: 20 42 45 47 49 4e 20 74 72 61 6e 73 5f 6f 70 74   BEGIN trans_opt
09a0: 2e 20 20 7b 73 71 6c 69 74 65 33 42 65 67 69 6e  .  {sqlite3Begin
09b0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72  Transaction(pPar
09c0: 73 65 29 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74 20  se);}.trans_opt 
09d0: 3a 3a 3d 20 2e 0a 74 72 61 6e 73 5f 6f 70 74 20  ::= ..trans_opt 
09e0: 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e 2e  ::= TRANSACTION.
09f0: 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54  .trans_opt ::= T
0a00: 52 41 4e 53 41 43 54 49 4f 4e 20 6e 6d 2e 0a 63  RANSACTION nm..c
0a10: 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54 20 74 72  md ::= COMMIT tr
0a20: 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 7b 73  ans_opt.      {s
0a30: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72 61 6e  qlite3CommitTran
0a40: 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  saction(pParse);
0a50: 7d 0a 63 6d 64 20 3a 3a 3d 20 45 4e 44 20 74 72  }.cmd ::= END tr
0a60: 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 20 20  ans_opt.        
0a70: 20 7b 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54   {sqlite3CommitT
0a80: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73  ransaction(pPars
0a90: 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c  e);}.cmd ::= ROL
0aa0: 4c 42 41 43 4b 20 74 72 61 6e 73 5f 6f 70 74 2e  LBACK trans_opt.
0ab0: 20 20 20 20 7b 73 71 6c 69 74 65 33 52 6f 6c 6c      {sqlite3Roll
0ac0: 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
0ad0: 70 50 61 72 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f 2f  pParse);}../////
0ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0af0: 20 54 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   The CREATE TABL
0b00: 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  E statement ////
0b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0b20: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
0b30: 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61 62 6c 65  ::= create_table
0b40: 20 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72   create_table_ar
0b50: 67 73 2e 0a 63 72 65 61 74 65 5f 74 61 62 6c 65  gs..create_table
0b60: 20 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 20 74   ::= CREATE(X) t
0b70: 65 6d 70 28 54 29 20 54 41 42 4c 45 20 6e 6d 28  emp(T) TABLE nm(
0b80: 59 29 20 64 62 6e 6d 28 5a 29 2e 20 7b 0a 20 20  Y) dbnm(Z). {.  
0b90: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
0ba0: 6c 65 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c  le(pParse,&X,&Y,
0bb0: 26 5a 2c 54 2c 30 29 3b 0a 7d 0a 25 74 79 70 65  &Z,T,0);.}.%type
0bc0: 20 74 65 6d 70 20 7b 69 6e 74 7d 0a 74 65 6d 70   temp {int}.temp
0bd0: 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20 20 7b  (A) ::= TEMP.  {
0be0: 41 20 3d 20 31 3b 7d 0a 74 65 6d 70 28 41 29 20  A = 1;}.temp(A) 
0bf0: 3a 3a 3d 20 2e 20 20 20 20 20 20 7b 41 20 3d 20  ::= .      {A = 
0c00: 30 3b 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65  0;}.create_table
0c10: 5f 61 72 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c  _args ::= LP col
0c20: 75 6d 6e 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74  umnlist conslist
0c30: 5f 6f 70 74 20 52 50 28 58 29 2e 20 7b 0a 20 20  _opt RP(X). {.  
0c40: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
0c50: 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 0a 7d 0a  pParse,&X,0);.}.
0c60: 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67  create_table_arg
0c70: 73 20 3a 3a 3d 20 41 53 20 73 65 6c 65 63 74 28  s ::= AS select(
0c80: 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45  S). {.  sqlite3E
0c90: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  ndTable(pParse,0
0ca0: 2c 53 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ,S);.  sqlite3Se
0cb0: 6c 65 63 74 44 65 6c 65 74 65 28 53 29 3b 0a 7d  lectDelete(S);.}
0cc0: 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20  .columnlist ::= 
0cd0: 63 6f 6c 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41  columnlist COMMA
0ce0: 20 63 6f 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e 6c   column..columnl
0cf0: 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e 0a  ist ::= column..
0d00: 0a 2f 2f 20 41 62 6f 75 74 20 74 68 65 20 6f 6e  .// About the on
0d10: 6c 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75  ly information u
0d20: 73 65 64 20 66 6f 72 20 61 20 63 6f 6c 75 6d 6e  sed for a column
0d30: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
0d40: 74 68 65 0a 2f 2f 20 63 6f 6c 75 6d 6e 2e 20 20  the.// column.  
0d50: 54 68 65 20 74 79 70 65 20 69 73 20 61 6c 77 61  The type is alwa
0d60: 79 73 20 6a 75 73 74 20 22 74 65 78 74 22 2e 20  ys just "text". 
0d70: 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 77 69   But the code wi
0d80: 6c 6c 20 61 63 63 65 70 74 0a 2f 2f 20 61 6e 20  ll accept.// an 
0d90: 65 6c 61 62 6f 72 61 74 65 20 74 79 70 65 6e 61  elaborate typena
0da0: 6d 65 2e 20 20 50 65 72 68 61 70 73 20 73 6f 6d  me.  Perhaps som
0db0: 65 64 61 79 20 77 65 27 6c 6c 20 64 6f 20 73 6f  eday we'll do so
0dc0: 6d 65 74 68 69 6e 67 20 77 69 74 68 20 69 74 2e  mething with it.
0dd0: 0a 2f 2f 0a 63 6f 6c 75 6d 6e 20 3a 3a 3d 20 63  .//.column ::= c
0de0: 6f 6c 75 6d 6e 69 64 20 74 79 70 65 20 63 61 72  olumnid type car
0df0: 67 6c 69 73 74 2e 20 0a 63 6f 6c 75 6d 6e 69 64  glist. .columnid
0e00: 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20 20 20 20   ::= nm(X).     
0e10: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
0e20: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61  te3AddColumn(pPa
0e30: 72 73 65 2c 26 58 29 3b 7d 0a 0a 2f 2f 20 41 6e  rse,&X);}..// An
0e40: 20 49 44 45 4e 54 49 46 49 45 52 20 63 61 6e 20   IDENTIFIER can 
0e50: 62 65 20 61 20 67 65 6e 65 72 69 63 20 69 64 65  be a generic ide
0e60: 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20  ntifier, or one 
0e70: 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65  of several.// ke
0e80: 79 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e  ywords.  Any non
0e90: 2d 73 74 61 6e 64 61 72 64 20 6b 65 79 77 6f 72  -standard keywor
0ea0: 64 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e  d can also be an
0eb0: 20 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 0a   identifier..//.
0ec0: 25 74 79 70 65 20 69 64 20 7b 54 6f 6b 65 6e 7d  %type id {Token}
0ed0: 0a 69 64 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  .id(A) ::= ID(X)
0ee0: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
0ef0: 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f  ;}..// The follo
0f00: 77 69 6e 67 20 64 69 72 65 63 74 69 76 65 20 63  wing directive c
0f10: 61 75 73 65 73 20 74 6f 6b 65 6e 73 20 41 42 4f  auses tokens ABO
0f20: 52 54 2c 20 41 46 54 45 52 2c 20 41 53 43 2c 20  RT, AFTER, ASC, 
0f30: 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61 6c 6c 62  etc. to.// fallb
0f40: 61 63 6b 20 74 6f 20 49 44 20 69 66 20 74 68 65  ack to ID if the
0f50: 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61 72 73 65  y will not parse
0f60: 20 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e   as their origin
0f70: 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20 54 68 69  al value..// Thi
0f80: 73 20 6f 62 76 69 61 74 65 73 20 74 68 65 20 6e  s obviates the n
0f90: 65 65 64 20 66 6f 72 20 74 68 65 20 22 69 64 22  eed for the "id"
0fa0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2f 2f   nonterminal..//
0fb0: 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44 0a 20 20  .%fallback ID.  
0fc0: 41 42 4f 52 54 20 41 46 54 45 52 20 41 53 43 20  ABORT AFTER ASC 
0fd0: 41 54 54 41 43 48 20 42 45 46 4f 52 45 20 42 45  ATTACH BEFORE BE
0fe0: 47 49 4e 20 43 41 53 43 41 44 45 20 43 4c 55 53  GIN CASCADE CLUS
0ff0: 54 45 52 20 43 4f 4e 46 4c 49 43 54 0a 20 20 44  TER CONFLICT.  D
1000: 41 54 41 42 41 53 45 20 44 45 46 45 52 52 45 44  ATABASE DEFERRED
1010: 20 44 45 53 43 20 44 45 54 41 43 48 20 45 41 43   DESC DETACH EAC
1020: 48 20 45 4e 44 20 45 58 50 4c 41 49 4e 20 46 41  H END EXPLAIN FA
1030: 49 4c 20 46 4f 52 0a 20 20 47 4c 4f 42 20 49 47  IL FOR.  GLOB IG
1040: 4e 4f 52 45 20 49 4d 4d 45 44 49 41 54 45 20 49  NORE IMMEDIATE I
1050: 4e 49 54 49 41 4c 4c 59 20 49 4e 53 54 45 41 44  NITIALLY INSTEAD
1060: 20 4c 49 4b 45 20 4d 41 54 43 48 20 4b 45 59 0a   LIKE MATCH KEY.
1070: 20 20 4f 46 20 4f 46 46 53 45 54 20 50 52 41 47    OF OFFSET PRAG
1080: 4d 41 20 52 41 49 53 45 20 52 45 50 4c 41 43 45  MA RAISE REPLACE
1090: 20 52 45 53 54 52 49 43 54 20 52 4f 57 20 53 54   RESTRICT ROW ST
10a0: 41 54 45 4d 45 4e 54 0a 20 20 54 45 4d 50 20 54  ATEMENT.  TEMP T
10b0: 52 49 47 47 45 52 20 56 41 43 55 55 4d 20 56 49  RIGGER VACUUM VI
10c0: 45 57 2e 0a 0a 2f 2f 20 44 65 66 69 6e 65 20 6f  EW...// Define o
10d0: 70 65 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e  perator preceden
10e0: 63 65 20 65 61 72 6c 79 20 73 6f 20 74 68 61 74  ce early so that
10f0: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1100: 73 74 20 6f 63 63 75 72 61 6e 63 65 0a 2f 2f 20  st occurance.// 
1110: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  of the operator 
1120: 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 67 72  tokens in the gr
1130: 61 6d 6d 65 72 2e 20 20 4b 65 65 70 69 6e 67 20  ammer.  Keeping 
1140: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 6f  the operators to
1150: 67 65 74 68 65 72 0a 2f 2f 20 63 61 75 73 65 73  gether.// causes
1160: 20 74 68 65 6d 20 74 6f 20 62 65 20 61 73 73 69   them to be assi
1170: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
1180: 75 65 73 20 74 68 61 74 20 61 72 65 20 63 6c 6f  ues that are clo
1190: 73 65 20 74 6f 67 65 74 68 65 72 2c 0a 2f 2f 20  se together,.// 
11a0: 77 68 69 63 68 20 6b 65 65 70 73 20 70 61 72 73  which keeps pars
11b0: 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65  er tables smalle
11c0: 72 2e 0a 2f 2f 0a 25 6c 65 66 74 20 4f 52 2e 0a  r..//.%left OR..
11d0: 25 6c 65 66 74 20 41 4e 44 2e 0a 25 72 69 67 68  %left AND..%righ
11e0: 74 20 4e 4f 54 2e 0a 25 6c 65 66 74 20 45 51 20  t NOT..%left EQ 
11f0: 4e 45 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c  NE ISNULL NOTNUL
1200: 4c 20 49 53 20 4c 49 4b 45 20 47 4c 4f 42 20 42  L IS LIKE GLOB B
1210: 45 54 57 45 45 4e 20 49 4e 2e 0a 25 6c 65 66 74  ETWEEN IN..%left
1220: 20 47 54 20 47 45 20 4c 54 20 4c 45 2e 0a 25 6c   GT GE LT LE..%l
1230: 65 66 74 20 42 49 54 41 4e 44 20 42 49 54 4f 52  eft BITAND BITOR
1240: 20 4c 53 48 49 46 54 20 52 53 48 49 46 54 2e 0a   LSHIFT RSHIFT..
1250: 25 6c 65 66 74 20 50 4c 55 53 20 4d 49 4e 55 53  %left PLUS MINUS
1260: 2e 0a 25 6c 65 66 74 20 53 54 41 52 20 53 4c 41  ..%left STAR SLA
1270: 53 48 20 52 45 4d 2e 0a 25 6c 65 66 74 20 43 4f  SH REM..%left CO
1280: 4e 43 41 54 2e 0a 25 72 69 67 68 74 20 55 4d 49  NCAT..%right UMI
1290: 4e 55 53 20 55 50 4c 55 53 20 42 49 54 4e 4f 54  NUS UPLUS BITNOT
12a0: 2e 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73 22 20  ...// And "ids" 
12b0: 69 73 20 61 6e 20 69 64 65 6e 74 69 66 65 72 2d  is an identifer-
12c0: 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a 25 74  or-string..//.%t
12d0: 79 70 65 20 69 64 73 20 7b 54 6f 6b 65 6e 7d 0a  ype ids {Token}.
12e0: 69 64 73 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  ids(A) ::= ID(X)
12f0: 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b  .        {A = X;
1300: 7d 0a 69 64 73 28 41 29 20 3a 3a 3d 20 53 54 52  }.ids(A) ::= STR
1310: 49 4e 47 28 58 29 2e 20 20 20 20 7b 41 20 3d 20  ING(X).    {A = 
1320: 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e 61 6d 65  X;}..// The name
1330: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 72 20   of a column or 
1340: 74 61 62 6c 65 20 63 61 6e 20 62 65 20 61 6e 79  table can be any
1350: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1360: 67 3a 0a 2f 2f 0a 25 74 79 70 65 20 6e 6d 20 7b  g:.//.%type nm {
1370: 54 6f 6b 65 6e 7d 0a 6e 6d 28 41 29 20 3a 3a 3d  Token}.nm(A) ::=
1380: 20 49 44 28 58 29 2e 20 20 20 20 20 20 20 20 20   ID(X).         
1390: 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a  {A = X;}.nm(A) :
13a0: 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20 20  := STRING(X).   
13b0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 28 41 29    {A = X;}.nm(A)
13c0: 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e   ::= JOIN_KW(X).
13d0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 74 79      {A = X;}..ty
13e0: 70 65 20 3a 3a 3d 20 2e 0a 74 79 70 65 20 3a 3a  pe ::= ..type ::
13f0: 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 2e 20 20  = typename(X).  
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43 6f 6c    {sqlite3AddCol
1420: 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26  umnType(pParse,&
1430: 58 2c 26 58 29 3b 7d 0a 74 79 70 65 20 3a 3a 3d  X,&X);}.type ::=
1440: 20 74 79 70 65 6e 61 6d 65 28 58 29 20 4c 50 20   typename(X) LP 
1450: 73 69 67 6e 65 64 20 52 50 28 59 29 2e 20 20 20  signed RP(Y).   
1460: 20 7b 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75   {sqlite3AddColu
1470: 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 58  mnType(pParse,&X
1480: 2c 26 59 29 3b 7d 0a 74 79 70 65 20 3a 3a 3d 20  ,&Y);}.type ::= 
1490: 74 79 70 65 6e 61 6d 65 28 58 29 20 4c 50 20 73  typename(X) LP s
14a0: 69 67 6e 65 64 20 43 4f 4d 4d 41 20 73 69 67 6e  igned COMMA sign
14b0: 65 64 20 52 50 28 59 29 2e 0a 20 20 20 20 20 20  ed RP(Y)..      
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e0: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43 6f     {sqlite3AddCo
14f0: 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c  lumnType(pParse,
1500: 26 58 2c 26 59 29 3b 7d 0a 25 74 79 70 65 20 74  &X,&Y);}.%type t
1510: 79 70 65 6e 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a  ypename {Token}.
1520: 74 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20  typename(A) ::= 
1530: 69 64 73 28 58 29 2e 20 20 20 20 20 20 20 20 20  ids(X).         
1540: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 74 79 70      {A = X;}.typ
1550: 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 74 79 70  ename(A) ::= typ
1560: 65 6e 61 6d 65 28 58 29 20 69 64 73 28 59 29 2e  ename(X) ids(Y).
1570: 20 7b 41 2e 7a 3d 58 2e 7a 3b 20 41 2e 6e 3d 58   {A.z=X.z; A.n=X
1580: 2e 6e 2b 41 64 64 72 28 59 2e 7a 29 2d 41 64 64  .n+Addr(Y.z)-Add
1590: 72 28 58 2e 7a 29 3b 7d 0a 25 74 79 70 65 20 73  r(X.z);}.%type s
15a0: 69 67 6e 65 64 20 7b 69 6e 74 7d 0a 73 69 67 6e  igned {int}.sign
15b0: 65 64 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45  ed(A) ::= INTEGE
15c0: 52 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 20  R(X).         { 
15d0: 41 20 3d 20 61 74 6f 69 28 58 2e 7a 29 3b 20 7d  A = atoi(X.z); }
15e0: 0a 73 69 67 6e 65 64 28 41 29 20 3a 3a 3d 20 50  .signed(A) ::= P
15f0: 4c 55 53 20 49 4e 54 45 47 45 52 28 58 29 2e 20  LUS INTEGER(X). 
1600: 20 20 20 7b 20 41 20 3d 20 61 74 6f 69 28 58 2e     { A = atoi(X.
1610: 7a 29 3b 20 7d 0a 73 69 67 6e 65 64 28 41 29 20  z); }.signed(A) 
1620: 3a 3a 3d 20 4d 49 4e 55 53 20 49 4e 54 45 47 45  ::= MINUS INTEGE
1630: 52 28 58 29 2e 20 20 20 7b 20 41 20 3d 20 2d 61  R(X).   { A = -a
1640: 74 6f 69 28 58 2e 7a 29 3b 20 7d 0a 63 61 72 67  toi(X.z); }.carg
1650: 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c 69 73  list ::= carglis
1660: 74 20 63 61 72 67 2e 0a 63 61 72 67 6c 69 73 74  t carg..carglist
1670: 20 3a 3a 3d 20 2e 0a 63 61 72 67 20 3a 3a 3d 20   ::= ..carg ::= 
1680: 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 20 63 63  CONSTRAINT nm cc
1690: 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 63 63  ons..carg ::= cc
16a0: 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 44 45  ons..carg ::= DE
16b0: 46 41 55 4c 54 20 53 54 52 49 4e 47 28 58 29 2e  FAULT STRING(X).
16c0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
16d0: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
16e0: 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d  e(pParse,&X,0);}
16f0: 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c  .carg ::= DEFAUL
1700: 54 20 49 44 28 58 29 2e 20 20 20 20 20 20 20 20  T ID(X).        
1710: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
1720: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
1730: 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72  arse,&X,0);}.car
1740: 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 49 4e  g ::= DEFAULT IN
1750: 54 45 47 45 52 28 58 29 2e 20 20 20 20 20 20 20  TEGER(X).       
1760: 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66    {sqlite3AddDef
1770: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
1780: 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a  ,&X,0);}.carg ::
1790: 3d 20 44 45 46 41 55 4c 54 20 50 4c 55 53 20 49  = DEFAULT PLUS I
17a0: 4e 54 45 47 45 52 28 58 29 2e 20 20 20 20 7b 73  NTEGER(X).    {s
17b0: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
17c0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c  Value(pParse,&X,
17d0: 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45  0);}.carg ::= DE
17e0: 46 41 55 4c 54 20 4d 49 4e 55 53 20 49 4e 54 45  FAULT MINUS INTE
17f0: 47 45 52 28 58 29 2e 20 20 20 7b 73 71 6c 69 74  GER(X).   {sqlit
1800: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
1810: 65 28 70 50 61 72 73 65 2c 26 58 2c 31 29 3b 7d  e(pParse,&X,1);}
1820: 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c  .carg ::= DEFAUL
1830: 54 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20  T FLOAT(X).     
1840: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
1850: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
1860: 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72  arse,&X,0);}.car
1870: 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50 4c  g ::= DEFAULT PL
1880: 55 53 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20  US FLOAT(X).    
1890: 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66    {sqlite3AddDef
18a0: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
18b0: 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a  ,&X,0);}.carg ::
18c0: 3d 20 44 45 46 41 55 4c 54 20 4d 49 4e 55 53 20  = DEFAULT MINUS 
18d0: 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 7b 73  FLOAT(X).     {s
18e0: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
18f0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c  Value(pParse,&X,
1900: 31 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45  1);}.carg ::= DE
1910: 46 41 55 4c 54 20 4e 55 4c 4c 2e 20 0a 0a 2f 2f  FAULT NULL. ..//
1920: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
1930: 74 68 65 20 74 79 70 65 20 6e 61 6d 65 2c 20 77  the type name, w
1940: 65 20 61 6c 73 6f 20 63 61 72 65 20 61 62 6f 75  e also care abou
1950: 74 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  t the primary ke
1960: 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 55 45 20  y and.// UNIQUE 
1970: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2f 2f 0a  constraints..//.
1980: 63 63 6f 6e 73 20 3a 3a 3d 20 4e 55 4c 4c 20 6f  ccons ::= NULL o
1990: 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a 3a 3d  nconf..ccons ::=
19a0: 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66   NOT NULL onconf
19b0: 28 52 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (R).            
19c0: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 4e 6f     {sqlite3AddNo
19d0: 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 52 29  tNull(pParse, R)
19e0: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 50 52 49  ;}.ccons ::= PRI
19f0: 4d 41 52 59 20 4b 45 59 20 73 6f 72 74 6f 72 64  MARY KEY sortord
1a00: 65 72 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 7b  er onconf(R).  {
1a10: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
1a20: 79 4b 65 79 28 70 50 61 72 73 65 2c 30 2c 52 29  yKey(pParse,0,R)
1a30: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49  ;}.ccons ::= UNI
1a40: 51 55 45 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20  QUE onconf(R).  
1a50: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1a60: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
1a70: 72 73 65 2c 30 2c 30 2c 30 2c 30 2c 52 2c 30 2c  rse,0,0,0,0,R,0,
1a80: 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43  0);}.ccons ::= C
1a90: 48 45 43 4b 20 4c 50 20 65 78 70 72 20 52 50 20  HECK LP expr RP 
1aa0: 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a 3a  onconf..ccons ::
1ab0: 3d 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6d 28  = REFERENCES nm(
1ac0: 54 29 20 69 64 78 6c 69 73 74 5f 6f 70 74 28 54  T) idxlist_opt(T
1ad0: 41 29 20 72 65 66 61 72 67 73 28 52 29 2e 0a 20  A) refargs(R).. 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1b00: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
1b10: 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 30  eignKey(pParse,0
1b20: 2c 26 54 2c 54 41 2c 52 29 3b 7d 0a 63 63 6f 6e  ,&T,TA,R);}.ccon
1b30: 73 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62 63  s ::= defer_subc
1b40: 6c 61 75 73 65 28 44 29 2e 20 20 20 7b 73 71 6c  lause(D).   {sql
1b50: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
1b60: 4b 65 79 28 70 50 61 72 73 65 2c 44 29 3b 7d 0a  Key(pParse,D);}.
1b70: 63 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4c 4c 41 54  ccons ::= COLLAT
1b80: 45 20 69 64 28 43 29 2e 20 20 7b 73 71 6c 69 74  E id(C).  {sqlit
1b90: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
1ba0: 28 70 50 61 72 73 65 2c 20 43 2e 7a 2c 20 43 2e  (pParse, C.z, C.
1bb0: 6e 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e 65 78  n);}..// The nex
1bc0: 74 20 67 72 6f 75 70 20 6f 66 20 72 75 6c 65 73  t group of rules
1bd0: 20 70 61 72 73 65 73 20 74 68 65 20 61 72 67 75   parses the argu
1be0: 6d 65 6e 74 73 20 74 6f 20 61 20 52 45 46 45 52  ments to a REFER
1bf0: 45 4e 43 45 53 20 63 6c 61 75 73 65 0a 2f 2f 20  ENCES clause.// 
1c00: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 20 69  that determine i
1c10: 66 20 74 68 65 20 72 65 66 65 72 65 6e 74 69 61  f the referentia
1c20: 6c 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  l integrity chec
1c30: 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
1c40: 20 6f 72 0a 2f 2f 20 6f 72 20 69 6d 6d 65 64 69   or.// or immedi
1c50: 61 74 65 20 61 6e 64 20 77 68 69 63 68 20 64 65  ate and which de
1c60: 74 65 72 6d 69 6e 65 20 77 68 61 74 20 61 63 74  termine what act
1c70: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 66 20 61  ion to take if a
1c80: 20 72 65 66 2d 69 6e 74 65 67 0a 2f 2f 20 63 68   ref-integ.// ch
1c90: 65 63 6b 20 66 61 69 6c 73 2e 0a 2f 2f 0a 25 74  eck fails..//.%t
1ca0: 79 70 65 20 72 65 66 61 72 67 73 20 7b 69 6e 74  ype refargs {int
1cb0: 7d 0a 72 65 66 61 72 67 73 28 41 29 20 3a 3a 3d  }.refargs(A) ::=
1cc0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1cd0: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f         { A = OE_
1ce0: 52 65 73 74 72 69 63 74 20 2a 20 30 78 30 31 30  Restrict * 0x010
1cf0: 31 30 31 3b 20 7d 0a 72 65 66 61 72 67 73 28 41  101; }.refargs(A
1d00: 29 20 3a 3a 3d 20 72 65 66 61 72 67 73 28 58 29  ) ::= refargs(X)
1d10: 20 72 65 66 61 72 67 28 59 29 2e 20 7b 20 41 20   refarg(Y). { A 
1d20: 3d 20 28 58 20 26 20 59 2e 6d 61 73 6b 29 20 7c  = (X & Y.mask) |
1d30: 20 59 2e 76 61 6c 75 65 3b 20 7d 0a 25 74 79 70   Y.value; }.%typ
1d40: 65 20 72 65 66 61 72 67 20 7b 73 74 72 75 63 74  e refarg {struct
1d50: 20 7b 69 6e 74 20 76 61 6c 75 65 3b 20 69 6e 74   {int value; int
1d60: 20 6d 61 73 6b 3b 7d 7d 0a 72 65 66 61 72 67 28   mask;}}.refarg(
1d70: 41 29 20 3a 3a 3d 20 4d 41 54 43 48 20 6e 6d 2e  A) ::= MATCH nm.
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
1d90: 41 2e 76 61 6c 75 65 20 3d 20 30 3b 20 20 20 20  A.value = 0;    
1da0: 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30   A.mask = 0x0000
1db0: 30 30 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20  00; }.refarg(A) 
1dc0: 3a 3a 3d 20 4f 4e 20 44 45 4c 45 54 45 20 72 65  ::= ON DELETE re
1dd0: 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76  fact(X).   { A.v
1de0: 61 6c 75 65 20 3d 20 58 3b 20 20 20 20 20 41 2e  alue = X;     A.
1df0: 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 66 66 3b  mask = 0x0000ff;
1e00: 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d   }.refarg(A) ::=
1e10: 20 4f 4e 20 55 50 44 41 54 45 20 72 65 66 61 63   ON UPDATE refac
1e20: 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75  t(X).   { A.valu
1e30: 65 20 3d 20 58 3c 3c 38 3b 20 20 41 2e 6d 61 73  e = X<<8;  A.mas
1e40: 6b 20 3d 20 30 78 30 30 66 66 30 30 3b 20 7d 0a  k = 0x00ff00; }.
1e50: 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e  refarg(A) ::= ON
1e60: 20 49 4e 53 45 52 54 20 72 65 66 61 63 74 28 58   INSERT refact(X
1e70: 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d  ).   { A.value =
1e80: 20 58 3c 3c 31 36 3b 20 41 2e 6d 61 73 6b 20 3d   X<<16; A.mask =
1e90: 20 30 78 66 66 30 30 30 30 3b 20 7d 0a 25 74 79   0xff0000; }.%ty
1ea0: 70 65 20 72 65 66 61 63 74 20 7b 69 6e 74 7d 0a  pe refact {int}.
1eb0: 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45  refact(A) ::= SE
1ec0: 54 20 4e 55 4c 4c 2e 20 20 20 20 20 20 20 20 20  T NULL.         
1ed0: 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65       { A = OE_Se
1ee0: 74 4e 75 6c 6c 3b 20 7d 0a 72 65 66 61 63 74 28  tNull; }.refact(
1ef0: 41 29 20 3a 3a 3d 20 53 45 54 20 44 45 46 41 55  A) ::= SET DEFAU
1f00: 4c 54 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20  LT.           { 
1f10: 41 20 3d 20 4f 45 5f 53 65 74 44 66 6c 74 3b 20  A = OE_SetDflt; 
1f20: 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20  }.refact(A) ::= 
1f30: 43 41 53 43 41 44 45 2e 20 20 20 20 20 20 20 20  CASCADE.        
1f40: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f         { A = OE_
1f50: 43 61 73 63 61 64 65 3b 20 7d 0a 72 65 66 61 63  Cascade; }.refac
1f60: 74 28 41 29 20 3a 3a 3d 20 52 45 53 54 52 49 43  t(A) ::= RESTRIC
1f70: 54 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T.              
1f80: 7b 20 41 20 3d 20 4f 45 5f 52 65 73 74 72 69 63  { A = OE_Restric
1f90: 74 3b 20 7d 0a 25 74 79 70 65 20 64 65 66 65 72  t; }.%type defer
1fa0: 5f 73 75 62 63 6c 61 75 73 65 20 7b 69 6e 74 7d  _subclause {int}
1fb0: 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65  .defer_subclause
1fc0: 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 44 45 46 45  (A) ::= NOT DEFE
1fd0: 52 52 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65  RRABLE init_defe
1fe0: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 58 29  rred_pred_opt(X)
1ff0: 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 64 65 66 65  .  {A = X;}.defe
2000: 72 5f 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a  r_subclause(A) :
2010: 3a 3d 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e  := DEFERRABLE in
2020: 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64  it_deferred_pred
2030: 5f 6f 70 74 28 58 29 2e 20 20 20 20 20 20 7b 41  _opt(X).      {A
2040: 20 3d 20 58 3b 7d 0a 25 74 79 70 65 20 69 6e 69   = X;}.%type ini
2050: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f  t_deferred_pred_
2060: 6f 70 74 20 7b 69 6e 74 7d 0a 69 6e 69 74 5f 64  opt {int}.init_d
2070: 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74  eferred_pred_opt
2080: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 7b 41 20 3d 20 30 3b 7d 0a 69 6e 69 74 5f 64 65  {A = 0;}.init_de
20b0: 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28  ferred_pred_opt(
20c0: 41 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59  A) ::= INITIALLY
20d0: 20 44 45 46 45 52 52 45 44 2e 20 20 20 20 20 7b   DEFERRED.     {
20e0: 41 20 3d 20 31 3b 7d 0a 69 6e 69 74 5f 64 65 66  A = 1;}.init_def
20f0: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41  erred_pred_opt(A
2100: 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20  ) ::= INITIALLY 
2110: 49 4d 4d 45 44 49 41 54 45 2e 20 20 20 20 7b 41  IMMEDIATE.    {A
2120: 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 46 6f 72 20 74   = 0;}..// For t
2130: 68 65 20 74 69 6d 65 20 62 65 69 6e 67 2c 20 74  he time being, t
2140: 68 65 20 6f 6e 6c 79 20 63 6f 6e 73 74 72 61 69  he only constrai
2150: 6e 74 20 77 65 20 63 61 72 65 20 61 62 6f 75 74  nt we care about
2160: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 0a   is the primary.
2170: 2f 2f 20 6b 65 79 20 61 6e 64 20 55 4e 49 51 55  // key and UNIQU
2180: 45 2e 20 20 42 6f 74 68 20 63 72 65 61 74 65 20  E.  Both create 
2190: 69 6e 64 69 63 65 73 2e 0a 2f 2f 0a 63 6f 6e 73  indices..//.cons
21a0: 6c 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 63  list_opt ::= ..c
21b0: 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 3a 3a 3d 20  onslist_opt ::= 
21c0: 43 4f 4d 4d 41 20 63 6f 6e 73 6c 69 73 74 2e 0a  COMMA conslist..
21d0: 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e  conslist ::= con
21e0: 73 6c 69 73 74 20 43 4f 4d 4d 41 20 74 63 6f 6e  slist COMMA tcon
21f0: 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20  s..conslist ::= 
2200: 63 6f 6e 73 6c 69 73 74 20 74 63 6f 6e 73 2e 0a  conslist tcons..
2210: 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 74 63 6f  conslist ::= tco
2220: 6e 73 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 4f  ns..tcons ::= CO
2230: 4e 53 54 52 41 49 4e 54 20 6e 6d 2e 0a 74 63 6f  NSTRAINT nm..tco
2240: 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b  ns ::= PRIMARY K
2250: 45 59 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29  EY LP idxlist(X)
2260: 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20   RP onconf(R).. 
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
22a0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
22b0: 79 28 70 50 61 72 73 65 2c 58 2c 52 29 3b 7d 0a  y(pParse,X,R);}.
22c0: 74 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45  tcons ::= UNIQUE
22d0: 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52   LP idxlist(X) R
22e0: 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20  P onconf(R)..   
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61      {sqlite3Crea
2320: 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 30  teIndex(pParse,0
2330: 2c 30 2c 30 2c 58 2c 52 2c 30 2c 30 29 3b 7d 0a  ,0,0,X,R,0,0);}.
2340: 74 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20  tcons ::= CHECK 
2350: 65 78 70 72 20 6f 6e 63 6f 6e 66 2e 0a 74 63 6f  expr onconf..tco
2360: 6e 73 20 3a 3a 3d 20 46 4f 52 45 49 47 4e 20 4b  ns ::= FOREIGN K
2370: 45 59 20 4c 50 20 69 64 78 6c 69 73 74 28 46 41  EY LP idxlist(FA
2380: 29 20 52 50 0a 20 20 20 20 20 20 20 20 20 20 52  ) RP.          R
2390: 45 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29 20  EFERENCES nm(T) 
23a0: 69 64 78 6c 69 73 74 5f 6f 70 74 28 54 41 29 20  idxlist_opt(TA) 
23b0: 72 65 66 61 72 67 73 28 52 29 20 64 65 66 65 72  refargs(R) defer
23c0: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 44  _subclause_opt(D
23d0: 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ). {.    sqlite3
23e0: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
23f0: 28 70 50 61 72 73 65 2c 20 46 41 2c 20 26 54 2c  (pParse, FA, &T,
2400: 20 54 41 2c 20 52 29 3b 0a 20 20 20 20 73 71 6c   TA, R);.    sql
2410: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
2420: 4b 65 79 28 70 50 61 72 73 65 2c 20 44 29 3b 0a  Key(pParse, D);.
2430: 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f 73 75  }.%type defer_su
2440: 62 63 6c 61 75 73 65 5f 6f 70 74 20 7b 69 6e 74  bclause_opt {int
2450: 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  }.defer_subclaus
2460: 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  e_opt(A) ::= .  
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2480: 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72    {A = 0;}.defer
2490: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 41  _subclause_opt(A
24a0: 29 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62 63  ) ::= defer_subc
24b0: 6c 61 75 73 65 28 58 29 2e 20 20 7b 41 20 3d 20  lause(X).  {A = 
24c0: 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c  X;}..// The foll
24d0: 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73  owing is a non-s
24e0: 74 61 6e 64 61 72 64 20 65 78 74 65 6e 73 69 6f  tandard extensio
24f0: 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73  n that allows us
2500: 20 74 6f 20 64 65 63 6c 61 72 65 20 74 68 65 0a   to declare the.
2510: 2f 2f 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  // default behav
2520: 69 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20 69  ior when there i
2530: 73 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  s a constraint c
2540: 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70  onflict..//.%typ
2550: 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25  e onconf {int}.%
2560: 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74  type orconf {int
2570: 7d 0a 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74  }.%type resolvet
2580: 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66  ype {int}.onconf
2590: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b0: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f         { A = OE_
25c0: 44 65 66 61 75 6c 74 3b 20 7d 0a 6f 6e 63 6f 6e  Default; }.oncon
25d0: 66 28 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46  f(A) ::= ON CONF
25e0: 4c 49 43 54 20 72 65 73 6f 6c 76 65 74 79 70 65  LICT resolvetype
25f0: 28 58 29 2e 20 20 20 20 7b 20 41 20 3d 20 58 3b  (X).    { A = X;
2600: 20 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d   }.orconf(A) ::=
2610: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2630: 7b 20 41 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  { A = OE_Default
2640: 3b 20 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a  ; }.orconf(A) ::
2650: 3d 20 4f 52 20 72 65 73 6f 6c 76 65 74 79 70 65  = OR resolvetype
2660: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
2670: 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 72 65 73 6f   { A = X; }.reso
2680: 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52  lvetype(A) ::= R
2690: 4f 4c 4c 42 41 43 4b 2e 20 20 20 20 20 20 20 20  OLLBACK.        
26a0: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f           { A = O
26b0: 45 5f 52 6f 6c 6c 62 61 63 6b 3b 20 7d 0a 72 65  E_Rollback; }.re
26c0: 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d  solvetype(A) ::=
26d0: 20 41 42 4f 52 54 2e 20 20 20 20 20 20 20 20 20   ABORT.         
26e0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
26f0: 20 4f 45 5f 41 62 6f 72 74 3b 20 7d 0a 72 65 73   OE_Abort; }.res
2700: 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20  olvetype(A) ::= 
2710: 46 41 49 4c 2e 20 20 20 20 20 20 20 20 20 20 20  FAIL.           
2720: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
2730: 4f 45 5f 46 61 69 6c 3b 20 7d 0a 72 65 73 6f 6c  OE_Fail; }.resol
2740: 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 49 47  vetype(A) ::= IG
2750: 4e 4f 52 45 2e 20 20 20 20 20 20 20 20 20 20 20  NORE.           
2760: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
2770: 5f 49 67 6e 6f 72 65 3b 20 7d 0a 72 65 73 6f 6c  _Ignore; }.resol
2780: 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52 45  vetype(A) ::= RE
2790: 50 4c 41 43 45 2e 20 20 20 20 20 20 20 20 20 20  PLACE.          
27a0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
27b0: 5f 52 65 70 6c 61 63 65 3b 20 7d 0a 0a 2f 2f 2f  _Replace; }..///
27c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
27d0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50  /////// The DROP
27e0: 20 54 41 42 4c 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f   TABLE /////////
27f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2800: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
2810: 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 41 42  cmd ::= DROP TAB
2820: 4c 45 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29  LE nm(X) dbnm(Y)
2830: 2e 20 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 44  .   {.  sqlite3D
2840: 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ropTable(pParse,
2850: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
2860: 70 70 65 6e 64 28 30 2c 26 58 2c 26 59 29 2c 20  ppend(0,&X,&Y), 
2870: 30 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  0);.}../////////
2880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
2890: 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61   CREATE VIEW sta
28a0: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
28b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
28c0: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
28d0: 43 52 45 41 54 45 28 58 29 20 74 65 6d 70 28 54  CREATE(X) temp(T
28e0: 29 20 56 49 45 57 20 6e 6d 28 59 29 20 64 62 6e  ) VIEW nm(Y) dbn
28f0: 6d 28 5a 29 20 41 53 20 73 65 6c 65 63 74 28 53  m(Z) AS select(S
2900: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 43 72  ). {.  sqlite3Cr
2910: 65 61 74 65 56 69 65 77 28 70 50 61 72 73 65 2c  eateView(pParse,
2920: 20 26 58 2c 20 26 59 2c 20 26 5a 2c 20 53 2c 20   &X, &Y, &Z, S, 
2930: 54 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44 52  T);.}.cmd ::= DR
2940: 4f 50 20 56 49 45 57 20 6e 6d 28 58 29 20 64 62  OP VIEW nm(X) db
2950: 6e 6d 28 59 29 2e 20 7b 0a 20 20 73 71 6c 69 74  nm(Y). {.  sqlit
2960: 65 33 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  e3DropTable(pPar
2970: 73 65 2c 20 73 71 6c 69 74 65 33 53 72 63 4c 69  se, sqlite3SrcLi
2980: 73 74 41 70 70 65 6e 64 28 30 2c 26 58 2c 26 59  stAppend(0,&X,&Y
2990: 29 2c 20 31 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f  ), 1);.}..//////
29a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29b0: 2f 2f 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  // The SELECT st
29c0: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
29d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
29f0: 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20   ::= select(X). 
2a00: 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65   {.  sqlite3Sele
2a10: 63 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53 52  ct(pParse, X, SR
2a20: 54 5f 43 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30  T_Callback, 0, 0
2a30: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , 0, 0, 0);.  sq
2a40: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
2a50: 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  e(X);.}..%type s
2a60: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
2a70: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
2a80: 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  ct {sqlite3Selec
2a90: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
2aa0: 79 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53  ype oneselect {S
2ab0: 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63  elect*}.%destruc
2ac0: 74 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73  tor oneselect {s
2ad0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
2ae0: 74 65 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74  te($$);}..select
2af0: 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63  (A) ::= oneselec
2b00: 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  t(X).           
2b10: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2b20: 58 3b 7d 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a  X;}.select(A) ::
2b30: 3d 20 73 65 6c 65 63 74 28 58 29 20 6d 75 6c 74  = select(X) mult
2b40: 69 73 65 6c 65 63 74 5f 6f 70 28 59 29 20 6f 6e  iselect_op(Y) on
2b50: 65 73 65 6c 65 63 74 28 5a 29 2e 20 20 7b 0a 20  eselect(Z).  {. 
2b60: 20 69 66 28 20 5a 20 29 7b 0a 20 20 20 20 5a 2d   if( Z ){.    Z-
2b70: 3e 6f 70 20 3d 20 59 3b 0a 20 20 20 20 5a 2d 3e  >op = Y;.    Z->
2b80: 70 50 72 69 6f 72 20 3d 20 58 3b 0a 20 20 7d 0a  pPrior = X;.  }.
2b90: 20 20 41 20 3d 20 5a 3b 0a 7d 0a 25 74 79 70 65    A = Z;.}.%type
2ba0: 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 20   multiselect_op 
2bb0: 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65 63  {int}.multiselec
2bc0: 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f  t_op(A) ::= UNIO
2bd0: 4e 2e 20 20 20 20 20 20 7b 41 20 3d 20 54 4b 5f  N.      {A = TK_
2be0: 55 4e 49 4f 4e 3b 7d 0a 6d 75 6c 74 69 73 65 6c  UNION;}.multisel
2bf0: 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e  ect_op(A) ::= UN
2c00: 49 4f 4e 20 41 4c 4c 2e 20 20 7b 41 20 3d 20 54  ION ALL.  {A = T
2c10: 4b 5f 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73 65 6c  K_ALL;}.multisel
2c20: 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 49 4e  ect_op(A) ::= IN
2c30: 54 45 52 53 45 43 54 2e 20 20 7b 41 20 3d 20 54  TERSECT.  {A = T
2c40: 4b 5f 49 4e 54 45 52 53 45 43 54 3b 7d 0a 6d 75  K_INTERSECT;}.mu
2c50: 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20  ltiselect_op(A) 
2c60: 3a 3a 3d 20 45 58 43 45 50 54 2e 20 20 20 20 20  ::= EXCEPT.     
2c70: 7b 41 20 3d 20 54 4b 5f 45 58 43 45 50 54 3b 7d  {A = TK_EXCEPT;}
2c80: 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a  .oneselect(A) ::
2c90: 3d 20 53 45 4c 45 43 54 20 64 69 73 74 69 6e 63  = SELECT distinc
2ca0: 74 28 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28  t(D) selcollist(
2cb0: 57 29 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65  W) from(X) where
2cc0: 5f 6f 70 74 28 59 29 0a 20 20 20 20 20 20 20 20  _opt(Y).        
2cd0: 20 20 20 20 20 20 20 20 20 67 72 6f 75 70 62 79           groupby
2ce0: 5f 6f 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f  _opt(P) having_o
2cf0: 70 74 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70  pt(Q) orderby_op
2d00: 74 28 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c  t(Z) limit_opt(L
2d10: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
2d20: 65 33 53 65 6c 65 63 74 4e 65 77 28 57 2c 58 2c  e3SelectNew(W,X,
2d30: 59 2c 50 2c 51 2c 5a 2c 44 2c 4c 2e 6c 69 6d 69  Y,P,Q,Z,D,L.limi
2d40: 74 2c 4c 2e 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a  t,L.offset);.}..
2d50: 2f 2f 20 54 68 65 20 22 64 69 73 74 69 6e 63 74  // The "distinct
2d60: 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 69 73  " nonterminal is
2d70: 20 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65   true (1) if the
2d80: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
2d90: 64 20 69 73 0a 2f 2f 20 70 72 65 73 65 6e 74 20  d is.// present 
2da0: 61 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69 66  and false (0) if
2db0: 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2f 2f 0a 25   it is not..//.%
2dc0: 74 79 70 65 20 64 69 73 74 69 6e 63 74 20 7b 69  type distinct {i
2dd0: 6e 74 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20  nt}.distinct(A) 
2de0: 3a 3a 3d 20 44 49 53 54 49 4e 43 54 2e 20 20 20  ::= DISTINCT.   
2df0: 7b 41 20 3d 20 31 3b 7d 0a 64 69 73 74 69 6e 63  {A = 1;}.distinc
2e00: 74 28 41 29 20 3a 3a 3d 20 41 4c 4c 2e 20 20 20  t(A) ::= ALL.   
2e10: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 69       {A = 0;}.di
2e20: 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 2e 20  stinct(A) ::= . 
2e30: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
2e40: 3b 7d 0a 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69 73  ;}..// selcollis
2e50: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65  t is a list of e
2e60: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
2e70: 61 72 65 20 74 6f 20 62 65 63 6f 6d 65 20 74 68  are to become th
2e80: 65 20 72 65 74 75 72 6e 0a 2f 2f 20 76 61 6c 75  e return.// valu
2e90: 65 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  es of the SELECT
2ea0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
2eb0: 20 22 2a 22 20 69 6e 20 73 74 61 74 65 6d 65 6e   "*" in statemen
2ec0: 74 73 20 6c 69 6b 65 0a 2f 2f 20 22 53 45 4c 45  ts like.// "SELE
2ed0: 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 20 69  CT * FROM ..." i
2ee0: 73 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73  s encoded as a s
2ef0: 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
2f00: 6e 20 77 69 74 68 20 61 6e 0a 2f 2f 20 6f 70 63  n with an.// opc
2f10: 6f 64 65 20 6f 66 20 54 4b 5f 41 4c 4c 2e 0a 2f  ode of TK_ALL../
2f20: 2f 0a 25 74 79 70 65 20 73 65 6c 63 6f 6c 6c 69  /.%type selcolli
2f30: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
2f40: 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 63 6f  destructor selco
2f50: 6c 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  llist {sqlite3Ex
2f60: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
2f70: 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70 20 7b 45  ;}.%type sclp {E
2f80: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
2f90: 75 63 74 6f 72 20 73 63 6c 70 20 7b 73 71 6c 69  uctor sclp {sqli
2fa0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
2fb0: 65 28 24 24 29 3b 7d 0a 73 63 6c 70 28 41 29 20  e($$);}.sclp(A) 
2fc0: 3a 3a 3d 20 73 65 6c 63 6f 6c 6c 69 73 74 28 58  ::= selcollist(X
2fd0: 29 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20  ) COMMA.        
2fe0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 63       {A = X;}.sc
2ff0: 6c 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  lp(A) ::= .     
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3020: 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41  0;}.selcollist(A
3030: 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20 65 78  ) ::= sclp(P) ex
3040: 70 72 28 58 29 20 61 73 28 59 29 2e 20 20 20 20  pr(X) as(Y).    
3050: 20 7b 0a 20 20 20 41 20 3d 20 73 71 6c 69 74 65   {.   A = sqlite
3060: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
3070: 50 2c 58 2c 59 2e 6e 3f 26 59 3a 30 29 3b 0a 7d  P,X,Y.n?&Y:0);.}
3080: 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a  .selcollist(A) :
3090: 3a 3d 20 73 63 6c 70 28 50 29 20 53 54 41 52 2e  := sclp(P) STAR.
30a0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
30b0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 50  ExprListAppend(P
30c0: 2c 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  , sqlite3Expr(TK
30d0: 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 2c 20  _ALL, 0, 0, 0), 
30e0: 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74  0);.}.selcollist
30f0: 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20  (A) ::= sclp(P) 
3100: 6e 6d 28 58 29 20 44 4f 54 20 53 54 41 52 2e 20  nm(X) DOT STAR. 
3110: 7b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  {.  Expr *pRight
3120: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
3130: 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 30 29 3b  K_ALL, 0, 0, 0);
3140: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d  .  Expr *pLeft =
3150: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
3160: 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20  ID, 0, 0, &X);. 
3170: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
3180: 4c 69 73 74 41 70 70 65 6e 64 28 50 2c 20 73 71  ListAppend(P, sq
3190: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54  lite3Expr(TK_DOT
31a0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
31b0: 20 30 29 2c 20 30 29 3b 0a 7d 0a 0a 2f 2f 20 41   0), 0);.}..// A
31c0: 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20 3c 69 64  n option "AS <id
31d0: 3e 22 20 70 68 72 61 73 65 20 74 68 61 74 20 63  >" phrase that c
31e0: 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65 20 6f 66  an follow one of
31f0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
3200: 20 74 68 61 74 0a 2f 2f 20 64 65 66 69 6e 65 20   that.// define 
3210: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
3220: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  or one of the ta
3230: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
3240: 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25 74 79 70   clause..//.%typ
3250: 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a 61 73 28  e as {Token}.as(
3260: 58 29 20 3a 3a 3d 20 41 53 20 6e 6d 28 59 29 2e  X) ::= AS nm(Y).
3270: 20 20 20 20 7b 20 58 20 3d 20 59 3b 20 7d 0a 61      { X = Y; }.a
3280: 73 28 58 29 20 3a 3a 3d 20 69 64 73 28 59 29 2e  s(X) ::= ids(Y).
3290: 20 20 20 20 20 20 7b 20 58 20 3d 20 59 3b 20 7d        { X = Y; }
32a0: 0a 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20  .as(X) ::= .    
32b0: 20 20 20 20 20 20 20 20 7b 20 58 2e 6e 20 3d 20          { X.n = 
32c0: 30 3b 20 7d 0a 0a 0a 25 74 79 70 65 20 73 65 6c  0; }...%type sel
32d0: 74 61 62 6c 69 73 74 20 7b 53 72 63 4c 69 73 74  tablist {SrcList
32e0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
32f0: 65 6c 74 61 62 6c 69 73 74 20 7b 73 71 6c 69 74  eltablist {sqlit
3300: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
3310: 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 74 6c 5f  $$);}.%type stl_
3320: 70 72 65 66 69 78 20 7b 53 72 63 4c 69 73 74 2a  prefix {SrcList*
3330: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 74  }.%destructor st
3340: 6c 5f 70 72 65 66 69 78 20 7b 73 71 6c 69 74 65  l_prefix {sqlite
3350: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24  3SrcListDelete($
3360: 24 29 3b 7d 0a 25 74 79 70 65 20 66 72 6f 6d 20  $);}.%type from 
3370: 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74  {SrcList*}.%dest
3380: 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b 73 71 6c  ructor from {sql
3390: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
33a0: 65 28 24 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f  e($$);}..// A co
33b0: 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63 6c 61 75  mplete FROM clau
33c0: 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a  se..//.from(A) :
33d0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
3400: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 41  Malloc(sizeof(*A
3410: 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d  ));}.from(A) ::=
3420: 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73 74   FROM seltablist
3430: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
3440: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20     {A = X;}..// 
3450: 22 73 65 6c 74 61 62 6c 69 73 74 22 20 69 73 20  "seltablist" is 
3460: 61 20 22 53 65 6c 65 63 74 20 54 61 62 6c 65 20  a "Select Table 
3470: 4c 69 73 74 22 20 2d 20 74 68 65 20 63 6f 6e 74  List" - the cont
3480: 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
3490: 63 6c 61 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53  clause.// in a S
34a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
34b0: 20 20 22 73 74 6c 5f 70 72 65 66 69 78 22 20 69    "stl_prefix" i
34c0: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
34d0: 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f  is list..//.stl_
34e0: 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 73 65  prefix(A) ::= se
34f0: 6c 74 61 62 6c 69 73 74 28 58 29 20 6a 6f 69 6e  ltablist(X) join
3500: 6f 70 28 59 29 2e 20 20 20 20 7b 0a 20 20 20 41  op(Y).    {.   A
3510: 20 3d 20 58 3b 0a 20 20 20 69 66 28 20 41 20 26   = X;.   if( A &
3520: 26 20 41 2d 3e 6e 53 72 63 3e 30 20 29 20 41 2d  & A->nSrc>0 ) A-
3530: 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e 6a 6f  >a[A->nSrc-1].jo
3540: 69 6e 74 79 70 65 20 3d 20 59 3b 0a 7d 0a 73 74  intype = Y;.}.st
3550: 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20  l_prefix(A) ::= 
3560: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3570: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3580: 20 30 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28   0;}.seltablist(
3590: 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69  A) ::= stl_prefi
35a0: 78 28 58 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28  x(X) nm(Y) dbnm(
35b0: 44 29 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28  D) as(Z) on_opt(
35c0: 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e  N) using_opt(U).
35d0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
35e0: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  SrcListAppend(X,
35f0: 26 59 2c 26 44 29 3b 0a 20 20 69 66 28 20 5a 2e  &Y,&D);.  if( Z.
3600: 6e 20 29 20 73 71 6c 69 74 65 33 53 72 63 4c 69  n ) sqlite3SrcLi
3610: 73 74 41 64 64 41 6c 69 61 73 28 41 2c 26 5a 29  stAddAlias(A,&Z)
3620: 3b 0a 20 20 69 66 28 20 4e 20 29 7b 0a 20 20 20  ;.  if( N ){.   
3630: 20 69 66 28 20 41 20 26 26 20 41 2d 3e 6e 53 72   if( A && A->nSr
3640: 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41 2d 3e 6e  c>1 ){ A->a[A->n
3650: 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d 20 4e 3b 20  Src-2].pOn = N; 
3660: 7d 0a 20 20 20 20 65 6c 73 65 20 7b 20 73 71 6c  }.    else { sql
3670: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 4e  ite3ExprDelete(N
3680: 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 55  ); }.  }.  if( U
3690: 20 29 7b 0a 20 20 20 20 69 66 28 20 41 20 26 26   ){.    if( A &&
36a0: 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d   A->nSrc>1 ){ A-
36b0: 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 55  >a[A->nSrc-2].pU
36c0: 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20 20 20 20  sing = U; }.    
36d0: 65 6c 73 65 20 7b 20 73 71 6c 69 74 65 33 49 64  else { sqlite3Id
36e0: 4c 69 73 74 44 65 6c 65 74 65 28 55 29 3b 20 7d  ListDelete(U); }
36f0: 0a 20 20 7d 0a 7d 0a 73 65 6c 74 61 62 6c 69 73  .  }.}.seltablis
3700: 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65  t(A) ::= stl_pre
3710: 66 69 78 28 58 29 20 4c 50 20 73 65 6c 74 61 62  fix(X) LP seltab
3720: 6c 69 73 74 5f 70 61 72 65 6e 28 53 29 20 52 50  list_paren(S) RP
3730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3740: 20 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28     as(Z) on_opt(
3750: 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e  N) using_opt(U).
3760: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
3770: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  SrcListAppend(X,
3780: 30 2c 30 29 3b 0a 20 20 41 2d 3e 61 5b 41 2d 3e  0,0);.  A->a[A->
3790: 6e 53 72 63 2d 31 5d 2e 70 53 65 6c 65 63 74 20  nSrc-1].pSelect 
37a0: 3d 20 53 3b 0a 20 20 69 66 28 20 5a 2e 6e 20 29  = S;.  if( Z.n )
37b0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
37c0: 64 64 41 6c 69 61 73 28 41 2c 26 5a 29 3b 0a 20  ddAlias(A,&Z);. 
37d0: 20 69 66 28 20 4e 20 29 7b 0a 20 20 20 20 69 66   if( N ){.    if
37e0: 28 20 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31  ( A && A->nSrc>1
37f0: 20 29 7b 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63   ){ A->a[A->nSrc
3800: 2d 32 5d 2e 70 4f 6e 20 3d 20 4e 3b 20 7d 0a 20  -2].pOn = N; }. 
3810: 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65     else { sqlite
3820: 33 45 78 70 72 44 65 6c 65 74 65 28 4e 29 3b 20  3ExprDelete(N); 
3830: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 55 20 29 7b  }.  }.  if( U ){
3840: 0a 20 20 20 20 69 66 28 20 41 20 26 26 20 41 2d  .    if( A && A-
3850: 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b  >nSrc>1 ){ A->a[
3860: 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 55 73 69 6e  A->nSrc-2].pUsin
3870: 67 20 3d 20 55 3b 20 7d 0a 20 20 20 20 65 6c 73  g = U; }.    els
3880: 65 20 7b 20 73 71 6c 69 74 65 33 49 64 4c 69 73  e { sqlite3IdLis
3890: 74 44 65 6c 65 74 65 28 55 29 3b 20 7d 0a 20 20  tDelete(U); }.  
38a0: 7d 0a 7d 0a 0a 2f 2f 20 41 20 73 65 6c 74 61 62  }.}..// A seltab
38b0: 6c 69 73 74 5f 70 61 72 65 6e 20 6e 6f 6e 74 65  list_paren nonte
38c0: 72 6d 69 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  rminal represent
38d0: 73 20 61 6e 79 74 68 69 6e 67 20 69 6e 20 61 20  s anything in a 
38e0: 46 52 4f 4d 20 74 68 61 74 0a 2f 2f 20 69 73 20  FROM that.// is 
38f0: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 73 69 64 65  contained inside
3900: 20 70 61 72 65 6e 74 68 65 73 65 73 2e 20 20 54   parentheses.  T
3910: 68 69 73 20 63 61 6e 20 62 65 20 65 69 74 68 65  his can be eithe
3920: 72 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 0a  r a subquery or.
3930: 2f 2f 20 61 20 67 72 6f 75 70 69 6e 67 20 6f 66  // a grouping of
3940: 20 74 61 62 6c 65 20 61 6e 64 20 73 75 62 71 75   table and subqu
3950: 65 72 69 65 73 2e 0a 2f 2f 0a 25 74 79 70 65 20  eries..//.%type 
3960: 73 65 6c 74 61 62 6c 69 73 74 5f 70 61 72 65 6e  seltablist_paren
3970: 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74   {Select*}.%dest
3980: 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c 69 73  ructor seltablis
3990: 74 5f 70 61 72 65 6e 20 7b 73 71 6c 69 74 65 33  t_paren {sqlite3
39a0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 24 24 29  SelectDelete($$)
39b0: 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74 5f 70 61  ;}.seltablist_pa
39c0: 72 65 6e 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63  ren(A) ::= selec
39d0: 74 28 53 29 2e 20 20 20 20 20 20 7b 41 20 3d 20  t(S).      {A = 
39e0: 53 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74 5f 70  S;}.seltablist_p
39f0: 61 72 65 6e 28 41 29 20 3a 3a 3d 20 73 65 6c 74  aren(A) ::= selt
3a00: 61 62 6c 69 73 74 28 46 29 2e 20 20 7b 0a 20 20  ablist(F).  {.  
3a10: 20 41 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65   A = sqlite3Sele
3a20: 63 74 4e 65 77 28 30 2c 46 2c 30 2c 30 2c 30 2c  ctNew(0,F,0,0,0,
3a30: 30 2c 30 2c 2d 31 2c 30 29 3b 0a 7d 0a 0a 25 74  0,0,-1,0);.}..%t
3a40: 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65 6e 7d  ype dbnm {Token}
3a50: 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e 20 20  .dbnm(A) ::= .  
3a60: 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20          {A.z=0; 
3a70: 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41 29 20  A.n=0;}.dbnm(A) 
3a80: 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e 20 7b  ::= DOT nm(X). {
3a90: 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 6a  A = X;}..%type j
3aa0: 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79 70  oinop {int}.%typ
3ab0: 65 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d 0a  e joinop2 {int}.
3ac0: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43 4f  joinop(X) ::= CO
3ad0: 4d 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20 20  MMA.            
3ae0: 20 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54 5f         { X = JT_
3af0: 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28  INNER; }.joinop(
3b00: 58 29 20 3a 3a 3d 20 4a 4f 49 4e 2e 20 20 20 20  X) ::= JOIN.    
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b20: 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 20  { X = JT_INNER; 
3b30: 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20  }.joinop(X) ::= 
3b40: 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f 49 4e 2e  JOIN_KW(A) JOIN.
3b50: 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 73           { X = s
3b60: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70  qlite3JoinType(p
3b70: 50 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20 7d  Parse,&A,0,0); }
3b80: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
3b90: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
3ba0: 4a 4f 49 4e 2e 20 20 20 7b 20 58 20 3d 20 73 71  JOIN.   { X = sq
3bb0: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50  lite3JoinType(pP
3bc0: 61 72 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20 7d  arse,&A,&B,0); }
3bd0: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
3be0: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
3bf0: 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20  nm(C) JOIN..    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33     { X = sqlite3
3c30: 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c  JoinType(pParse,
3c40: 26 41 2c 26 42 2c 26 43 29 3b 20 7d 0a 0a 25 74  &A,&B,&C); }..%t
3c50: 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70 72  ype on_opt {Expr
3c60: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f  *}.%destructor o
3c70: 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  n_opt {sqlite3Ex
3c80: 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 6f  prDelete($$);}.o
3c90: 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 4f 4e 20  n_opt(N) ::= ON 
3ca0: 65 78 70 72 28 45 29 2e 20 20 20 7b 4e 20 3d 20  expr(E).   {N = 
3cb0: 45 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a  E;}.on_opt(N) ::
3cc0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
3cd0: 7b 4e 20 3d 20 30 3b 7d 0a 0a 25 74 79 70 65 20  {N = 0;}..%type 
3ce0: 75 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73  using_opt {IdLis
3cf0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3d00: 75 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74  using_opt {sqlit
3d10: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24  e3IdListDelete($
3d20: 24 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55  $);}.using_opt(U
3d30: 29 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20 69  ) ::= USING LP i
3d40: 6e 73 63 6f 6c 6c 69 73 74 28 4c 29 20 52 50 2e  nscollist(L) RP.
3d50: 20 20 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e 67    {U = L;}.using
3d60: 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20 20  _opt(U) ::= .   
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 20 20 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a 0a       {U = 0;}...
3d90: 25 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f 70  %type orderby_op
3da0: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
3db0: 65 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72 62  estructor orderb
3dc0: 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  y_opt {sqlite3Ex
3dd0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
3de0: 3b 7d 0a 25 74 79 70 65 20 73 6f 72 74 6c 69 73  ;}.%type sortlis
3df0: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
3e00: 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74 6c 69  estructor sortli
3e10: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
3e20: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
3e30: 25 74 79 70 65 20 73 6f 72 74 69 74 65 6d 20 7b  %type sortitem {
3e40: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
3e50: 6f 72 20 73 6f 72 74 69 74 65 6d 20 7b 73 71 6c  or sortitem {sql
3e60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24  ite3ExprDelete($
3e70: 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70  $);}..orderby_op
3e80: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64      {A = 0;}.ord
3eb0: 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  erby_opt(A) ::= 
3ec0: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73  ORDER BY sortlis
3ed0: 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20  t(X).      {A = 
3ee0: 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20  X;}.sortlist(A) 
3ef0: 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29 20  ::= sortlist(X) 
3f00: 43 4f 4d 4d 41 20 73 6f 72 74 69 74 65 6d 28 59  COMMA sortitem(Y
3f10: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
3f20: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
3f30: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
3f40: 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 43 2e 6e  stAppend(X,Y,C.n
3f50: 3e 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28 20  >0?&C:0);.  if( 
3f60: 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70  A ) A->a[A->nExp
3f70: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
3f80: 20 5a 3b 0a 7d 0a 73 6f 72 74 6c 69 73 74 28 41   Z;.}.sortlist(A
3f90: 29 20 3a 3a 3d 20 73 6f 72 74 69 74 65 6d 28 59  ) ::= sortitem(Y
3fa0: 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72  ) collate(C) sor
3fb0: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
3fc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
3fd0: 73 74 41 70 70 65 6e 64 28 30 2c 59 2c 43 2e 6e  stAppend(0,Y,C.n
3fe0: 3e 30 3f 26 43 3a 30 29 3b 0a 20 20 69 66 28 20  >0?&C:0);.  if( 
3ff0: 41 20 26 26 20 41 2d 3e 61 20 29 20 41 2d 3e 61  A && A->a ) A->a
4000: 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  [0].sortOrder = 
4010: 5a 3b 0a 7d 0a 73 6f 72 74 69 74 65 6d 28 41 29  Z;.}.sortitem(A)
4020: 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20   ::= expr(X).   
4030: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
4040: 73 6f 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d 0a  sortorder {int}.
4050: 25 74 79 70 65 20 63 6f 6c 6c 61 74 65 20 7b 54  %type collate {T
4060: 6f 6b 65 6e 7d 0a 0a 73 6f 72 74 6f 72 64 65 72  oken}..sortorder
4070: 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20  (A) ::= ASC.    
4080: 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49         {A = SQLI
4090: 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74  TE_SO_ASC;}.sort
40a0: 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 44 45 53  order(A) ::= DES
40b0: 43 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d  C.          {A =
40c0: 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b   SQLITE_SO_DESC;
40d0: 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a  }.sortorder(A) :
40e0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
40f0: 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f    {A = SQLITE_SO
4100: 5f 41 53 43 3b 7d 0a 63 6f 6c 6c 61 74 65 28 43  _ASC;}.collate(C
4110: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
4120: 20 20 20 20 20 20 20 7b 43 2e 7a 20 3d 20 30 3b         {C.z = 0;
4130: 20 43 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c 6c 61   C.n = 0;}.colla
4140: 74 65 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41 54  te(C) ::= COLLAT
4150: 45 20 69 64 28 58 29 2e 20 20 20 7b 43 20 3d 20  E id(X).   {C = 
4160: 58 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75 70  X;}..%type group
4170: 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74  by_opt {ExprList
4180: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 67  *}.%destructor g
4190: 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c 69  roupby_opt {sqli
41a0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
41b0: 65 28 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79 5f  e($$);}.groupby_
41c0: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41e0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75 70    {A = 0;}.group
41f0: 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47 52  by_opt(A) ::= GR
4200: 4f 55 50 20 42 59 20 65 78 70 72 6c 69 73 74 28  OUP BY exprlist(
4210: 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25  X).  {A = X;}..%
4220: 74 79 70 65 20 68 61 76 69 6e 67 5f 6f 70 74 20  type having_opt 
4230: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
4240: 74 6f 72 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b  tor having_opt {
4250: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4260: 65 28 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f  e($$);}.having_o
4270: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
4280: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
4290: 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41  0;}.having_opt(A
42a0: 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78 70  ) ::= HAVING exp
42b0: 72 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  r(X).  {A = X;}.
42c0: 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74  .%type limit_opt
42d0: 20 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61   {struct LimitVa
42e0: 6c 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  l}.limit_opt(A) 
42f0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
4300: 20 20 20 20 20 20 20 20 20 20 7b 41 2e 6c 69 6d            {A.lim
4310: 69 74 20 3d 20 2d 31 3b 20 41 2e 6f 66 66 73 65  it = -1; A.offse
4320: 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70  t = 0;}.limit_op
4330: 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 73  t(A) ::= LIMIT s
4340: 69 67 6e 65 64 28 58 29 2e 20 20 20 20 20 20 7b  igned(X).      {
4350: 41 2e 6c 69 6d 69 74 20 3d 20 58 3b 20 41 2e 6f  A.limit = X; A.o
4360: 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69  ffset = 0;}.limi
4370: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d  t_opt(A) ::= LIM
4380: 49 54 20 73 69 67 6e 65 64 28 58 29 20 4f 46 46  IT signed(X) OFF
4390: 53 45 54 20 73 69 67 6e 65 64 28 59 29 2e 20 0a  SET signed(Y). .
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 20 20 20 20 20 20 20 7b 41 2e 6c 69 6d 69 74 20         {A.limit 
43d0: 3d 20 58 3b 20 41 2e 6f 66 66 73 65 74 20 3d 20  = X; A.offset = 
43e0: 59 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  Y;}.limit_opt(A)
43f0: 20 3a 3a 3d 20 4c 49 4d 49 54 20 73 69 67 6e 65   ::= LIMIT signe
4400: 64 28 58 29 20 43 4f 4d 4d 41 20 73 69 67 6e 65  d(X) COMMA signe
4410: 64 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20  d(Y). .         
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
4440: 2e 6c 69 6d 69 74 20 3d 20 59 3b 20 41 2e 6f 66  .limit = Y; A.of
4450: 66 73 65 74 20 3d 20 58 3b 7d 0a 0a 2f 2f 2f 2f  fset = X;}..////
4460: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4470: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 45 4c 45  /////// The DELE
4480: 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  TE statement ///
4490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
44a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
44b0: 64 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f  d ::= DELETE FRO
44c0: 4d 20 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29 20  M nm(X) dbnm(D) 
44d0: 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 20 7b 0a  where_opt(Y). {.
44e0: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
44f0: 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 73 71 6c  From(pParse, sql
4500: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
4510: 64 28 30 2c 26 58 2c 26 44 29 2c 20 59 29 3b 0a  d(0,&X,&D), Y);.
4520: 7d 0a 0a 25 74 79 70 65 20 77 68 65 72 65 5f 6f  }..%type where_o
4530: 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pt {Expr*}.%dest
4540: 72 75 63 74 6f 72 20 77 68 65 72 65 5f 6f 70 74  ructor where_opt
4550: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
4560: 65 74 65 28 24 24 29 3b 7d 0a 0a 77 68 65 72 65  ete($$);}..where
4570: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 20 7b 41 20 3d 20 30 3b 7d 0a 77 68 65 72 65 5f   {A = 0;}.where_
45a0: 6f 70 74 28 41 29 20 3a 3a 3d 20 57 48 45 52 45  opt(A) ::= WHERE
45b0: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
45c0: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
45d0: 73 65 74 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  setlist {ExprLis
45e0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
45f0: 73 65 74 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  setlist {sqlite3
4600: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24  ExprListDelete($
4610: 24 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  $);}..//////////
4620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4630: 20 54 68 65 20 55 50 44 41 54 45 20 63 6f 6d 6d   The UPDATE comm
4640: 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  and ////////////
4650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4660: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
4670: 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29  UPDATE orconf(R)
4680: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29 20 53   nm(X) dbnm(D) S
4690: 45 54 20 73 65 74 6c 69 73 74 28 59 29 20 77 68  ET setlist(Y) wh
46a0: 65 72 65 5f 6f 70 74 28 5a 29 2e 0a 20 20 20 20  ere_opt(Z)..    
46b0: 7b 73 71 6c 69 74 65 33 55 70 64 61 74 65 28 70  {sqlite3Update(p
46c0: 50 61 72 73 65 2c 73 71 6c 69 74 65 33 53 72 63  Parse,sqlite3Src
46d0: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 58 2c  ListAppend(0,&X,
46e0: 26 44 29 2c 59 2c 5a 2c 52 29 3b 7d 0a 0a 73 65  &D),Y,Z,R);}..se
46f0: 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 65 74  tlist(A) ::= set
4700: 6c 69 73 74 28 5a 29 20 43 4f 4d 4d 41 20 6e 6d  list(Z) COMMA nm
4710: 28 58 29 20 45 51 20 65 78 70 72 28 59 29 2e 0a  (X) EQ expr(Y)..
4720: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
4730: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 5a  ExprListAppend(Z
4740: 2c 59 2c 26 58 29 3b 7d 0a 73 65 74 6c 69 73 74  ,Y,&X);}.setlist
4750: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51  (A) ::= nm(X) EQ
4760: 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d   expr(Y).   {A =
4770: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4780: 41 70 70 65 6e 64 28 30 2c 59 2c 26 58 29 3b 7d  Append(0,Y,&X);}
4790: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
47a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
47b0: 20 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20   INSERT command 
47c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
47e0: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73  /.//.cmd ::= ins
47f0: 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20  ert_cmd(R) INTO 
4800: 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29 20 69 6e  nm(X) dbnm(D) in
4810: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20  scollist_opt(F) 
4820: 0a 20 20 20 20 20 20 20 20 56 41 4c 55 45 53 20  .        VALUES 
4830: 4c 50 20 69 74 65 6d 6c 69 73 74 28 59 29 20 52  LP itemlist(Y) R
4840: 50 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  P..            {
4850: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70 50  sqlite3Insert(pP
4860: 61 72 73 65 2c 20 73 71 6c 69 74 65 33 53 72 63  arse, sqlite3Src
4870: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 58 2c  ListAppend(0,&X,
4880: 26 44 29 2c 20 59 2c 20 30 2c 20 46 2c 20 52 29  &D), Y, 0, F, R)
4890: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65 72  ;}.cmd ::= inser
48a0: 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 6e 6d  t_cmd(R) INTO nm
48b0: 28 58 29 20 64 62 6e 6d 28 44 29 20 69 6e 73 63  (X) dbnm(D) insc
48c0: 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65  ollist_opt(F) se
48d0: 6c 65 63 74 28 53 29 2e 0a 20 20 20 20 20 20 20  lect(S)..       
48e0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73       {sqlite3Ins
48f0: 65 72 74 28 70 50 61 72 73 65 2c 20 73 71 6c 69  ert(pParse, sqli
4900: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
4910: 28 30 2c 26 58 2c 26 44 29 2c 20 30 2c 20 53 2c  (0,&X,&D), 0, S,
4920: 20 46 2c 20 52 29 3b 7d 0a 0a 25 74 79 70 65 20   F, R);}..%type 
4930: 69 6e 73 65 72 74 5f 63 6d 64 20 7b 69 6e 74 7d  insert_cmd {int}
4940: 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 20 3a  .insert_cmd(A) :
4950: 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63 6f 6e 66  := INSERT orconf
4960: 28 52 29 2e 20 20 20 7b 41 20 3d 20 52 3b 7d 0a  (R).   {A = R;}.
4970: 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 20 3a 3a  insert_cmd(A) ::
4980: 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20 20 20  = REPLACE.      
4990: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 52 65        {A = OE_Re
49a0: 70 6c 61 63 65 3b 7d 0a 0a 0a 25 74 79 70 65 20  place;}...%type 
49b0: 69 74 65 6d 6c 69 73 74 20 7b 45 78 70 72 4c 69  itemlist {ExprLi
49c0: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
49d0: 20 69 74 65 6d 6c 69 73 74 20 7b 73 71 6c 69 74   itemlist {sqlit
49e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
49f0: 28 24 24 29 3b 7d 0a 0a 69 74 65 6d 6c 69 73 74  ($$);}..itemlist
4a00: 28 41 29 20 3a 3a 3d 20 69 74 65 6d 6c 69 73 74  (A) ::= itemlist
4a10: 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59  (X) COMMA expr(Y
4a20: 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33  ).  {A = sqlite3
4a30: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58  ExprListAppend(X
4a40: 2c 59 2c 30 29 3b 7d 0a 69 74 65 6d 6c 69 73 74  ,Y,0);}.itemlist
4a50: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e  (A) ::= expr(X).
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
4a80: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
4a90: 2c 58 2c 30 29 3b 7d 0a 0a 25 74 79 70 65 20 69  ,X,0);}..%type i
4aa0: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b 49  nscollist_opt {I
4ab0: 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  dList*}.%destruc
4ac0: 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f  tor inscollist_o
4ad0: 70 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73  pt {sqlite3IdLis
4ae0: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74  tDelete($$);}.%t
4af0: 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74 20 7b  ype inscollist {
4b00: 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  IdList*}.%destru
4b10: 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 74 20  ctor inscollist 
4b20: 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65  {sqlite3IdListDe
4b30: 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69 6e 73 63  lete($$);}..insc
4b40: 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a  ollist_opt(A) ::
4b50: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4b60: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
4b70: 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  ;}.inscollist_op
4b80: 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 6e 73 63  t(A) ::= LP insc
4b90: 6f 6c 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20  ollist(X) RP.   
4ba0: 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 73 63 6f 6c   {A = X;}.inscol
4bb0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 6e 73 63  list(A) ::= insc
4bc0: 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20  ollist(X) COMMA 
4bd0: 6e 6d 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c  nm(Y).  {A = sql
4be0: 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64  ite3IdListAppend
4bf0: 28 58 2c 26 59 29 3b 7d 0a 69 6e 73 63 6f 6c 6c  (X,&Y);}.inscoll
4c00: 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59 29  ist(A) ::= nm(Y)
4c10: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4c20: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
4c30: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
4c40: 30 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  0,&Y);}..///////
4c50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c60: 2f 2f 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20  //// Expression 
4c70: 50 72 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f  Processing /////
4c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c90: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79  ////////.//..%ty
4ca0: 70 65 20 65 78 70 72 20 7b 45 78 70 72 2a 7d 0a  pe expr {Expr*}.
4cb0: 25 64 65 73 74 72 75 63 74 6f 72 20 65 78 70 72  %destructor expr
4cc0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
4cd0: 65 74 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72 28  ete($$);}..expr(
4ce0: 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 65 78 70  A) ::= LP(B) exp
4cf0: 72 28 58 29 20 52 50 28 45 29 2e 20 7b 41 20 3d  r(X) RP(E). {A =
4d00: 20 58 3b 20 73 71 6c 69 74 65 33 45 78 70 72 53   X; sqlite3ExprS
4d10: 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b 20 7d 0a  pan(A,&B,&E); }.
4d20: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c  expr(A) ::= NULL
4d30: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
4d40: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
4d50: 72 28 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c  r(TK_NULL, 0, 0,
4d60: 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a   &X);}.expr(A) :
4d70: 3a 3d 20 49 44 28 58 29 2e 20 20 20 20 20 20 20  := ID(X).       
4d80: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
4d90: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c 20  ite3Expr(TK_ID, 
4da0: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72  0, 0, &X);}.expr
4db0: 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28  (A) ::= JOIN_KW(
4dc0: 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20  X).          {A 
4dd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
4de0: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d  _ID, 0, 0, &X);}
4df0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28  .expr(A) ::= nm(
4e00: 58 29 20 44 4f 54 20 6e 6d 28 59 29 2e 20 7b 0a  X) DOT nm(Y). {.
4e10: 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20    Expr *temp1 = 
4e20: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49  sqlite3Expr(TK_I
4e30: 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20  D, 0, 0, &X);.  
4e40: 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71  Expr *temp2 = sq
4e50: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44 2c  lite3Expr(TK_ID,
4e60: 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 41 20   0, 0, &Y);.  A 
4e70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
4e80: 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d  _DOT, temp1, tem
4e90: 70 32 2c 20 30 29 3b 0a 7d 0a 65 78 70 72 28 41  p2, 0);.}.expr(A
4ea0: 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f 54 20  ) ::= nm(X) DOT 
4eb0: 6e 6d 28 59 29 20 44 4f 54 20 6e 6d 28 5a 29 2e  nm(Y) DOT nm(Z).
4ec0: 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 31   {.  Expr *temp1
4ed0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
4ee0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b  K_ID, 0, 0, &X);
4ef0: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20 3d  .  Expr *temp2 =
4f00: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
4f10: 49 44 2c 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20  ID, 0, 0, &Y);. 
4f20: 20 45 78 70 72 20 2a 74 65 6d 70 33 20 3d 20 73   Expr *temp3 = s
4f30: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 44  qlite3Expr(TK_ID
4f40: 2c 20 30 2c 20 30 2c 20 26 5a 29 3b 0a 20 20 45  , 0, 0, &Z);.  E
4f50: 78 70 72 20 2a 74 65 6d 70 34 20 3d 20 73 71 6c  xpr *temp4 = sql
4f60: 69 74 65 33 45 78 70 72 28 54 4b 5f 44 4f 54 2c  ite3Expr(TK_DOT,
4f70: 20 74 65 6d 70 32 2c 20 74 65 6d 70 33 2c 20 30   temp2, temp3, 0
4f80: 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33  );.  A = sqlite3
4f90: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d  Expr(TK_DOT, tem
4fa0: 70 31 2c 20 74 65 6d 70 34 2c 20 30 29 3b 0a 7d  p1, temp4, 0);.}
4fb0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 4e 54  .expr(A) ::= INT
4fc0: 45 47 45 52 28 58 29 2e 20 20 20 20 20 20 7b 41  EGER(X).      {A
4fd0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
4fe0: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
4ff0: 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a   &X);}.expr(A) :
5000: 3a 3d 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20  := FLOAT(X).    
5010: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
5020: 45 78 70 72 28 54 4b 5f 46 4c 4f 41 54 2c 20 30  Expr(TK_FLOAT, 0
5030: 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28  , 0, &X);}.expr(
5040: 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29  A) ::= STRING(X)
5050: 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c  .       {A = sql
5060: 69 74 65 33 45 78 70 72 28 54 4b 5f 53 54 52 49  ite3Expr(TK_STRI
5070: 4e 47 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a  NG, 0, 0, &X);}.
5080: 65 78 70 72 28 41 29 20 3a 3a 3d 20 42 4c 4f 42  expr(A) ::= BLOB
5090: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
50a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
50b0: 5f 42 4c 4f 42 2c 20 30 2c 20 30 2c 20 26 58 29  _BLOB, 0, 0, &X)
50c0: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 56  ;}.expr(A) ::= V
50d0: 41 52 49 41 42 4c 45 28 58 29 2e 20 20 20 20 20  ARIABLE(X).     
50e0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
50f0: 78 70 72 28 54 4b 5f 56 41 52 49 41 42 4c 45 2c  xpr(TK_VARIABLE,
5100: 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 69 66   0, 0, &X);.  if
5110: 28 20 41 20 29 20 41 2d 3e 69 54 61 62 6c 65 20  ( A ) A->iTable 
5120: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72  = ++pParse->nVar
5130: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
5140: 49 44 28 58 29 20 4c 50 20 65 78 70 72 6c 69 73  ID(X) LP exprlis
5150: 74 28 59 29 20 52 50 28 45 29 2e 20 7b 0a 20 20  t(Y) RP(E). {.  
5160: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46  A = sqlite3ExprF
5170: 75 6e 63 74 69 6f 6e 28 59 2c 20 26 58 29 3b 0a  unction(Y, &X);.
5180: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
5190: 6e 28 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 65 78  n(A,&X,&E);.}.ex
51a0: 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 20  pr(A) ::= ID(X) 
51b0: 4c 50 20 53 54 41 52 20 52 50 28 45 29 2e 20 7b  LP STAR RP(E). {
51c0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
51d0: 70 72 46 75 6e 63 74 69 6f 6e 28 30 2c 20 26 58  prFunction(0, &X
51e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
51f0: 53 70 61 6e 28 41 2c 26 58 2c 26 45 29 3b 0a 7d  Span(A,&X,&E);.}
5200: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
5210: 72 28 58 29 20 41 4e 44 20 65 78 70 72 28 59 29  r(X) AND expr(Y)
5220: 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33  .   {A = sqlite3
5230: 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 58 2c 20  Expr(TK_AND, X, 
5240: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
5250: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4f 52 20 65  ::= expr(X) OR e
5260: 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20  xpr(Y).    {A = 
5270: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4f  sqlite3Expr(TK_O
5280: 52 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78  R, X, Y, 0);}.ex
5290: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
52a0: 29 20 4c 54 20 65 78 70 72 28 59 29 2e 20 20 20  ) LT expr(Y).   
52b0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
52c0: 72 28 54 4b 5f 4c 54 2c 20 58 2c 20 59 2c 20 30  r(TK_LT, X, Y, 0
52d0: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
52e0: 65 78 70 72 28 58 29 20 47 54 20 65 78 70 72 28  expr(X) GT expr(
52f0: 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  Y).    {A = sqli
5300: 74 65 33 45 78 70 72 28 54 4b 5f 47 54 2c 20 58  te3Expr(TK_GT, X
5310: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
5320: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c 45  ) ::= expr(X) LE
5330: 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20   expr(Y).    {A 
5340: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
5350: 5f 4c 45 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  _LE, X, Y, 0);}.
5360: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
5370: 28 58 29 20 47 45 20 65 78 70 72 28 59 29 2e 20  (X) GE expr(Y). 
5380: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45     {A = sqlite3E
5390: 78 70 72 28 54 4b 5f 47 45 2c 20 58 2c 20 59 2c  xpr(TK_GE, X, Y,
53a0: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
53b0: 3d 20 65 78 70 72 28 58 29 20 4e 45 20 65 78 70  = expr(X) NE exp
53c0: 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71  r(Y).    {A = sq
53d0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 45 2c  lite3Expr(TK_NE,
53e0: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
53f0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
5400: 45 51 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b  EQ expr(Y).    {
5410: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5420: 54 4b 5f 45 51 2c 20 58 2c 20 59 2c 20 30 29 3b  TK_EQ, X, Y, 0);
5430: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5440: 70 72 28 58 29 20 42 49 54 41 4e 44 20 65 78 70  pr(X) BITAND exp
5450: 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74  r(Y). {A = sqlit
5460: 65 33 45 78 70 72 28 54 4b 5f 42 49 54 41 4e 44  e3Expr(TK_BITAND
5470: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
5480: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
5490: 20 42 49 54 4f 52 20 65 78 70 72 28 59 29 2e 20   BITOR expr(Y). 
54a0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
54b0: 72 28 54 4b 5f 42 49 54 4f 52 2c 20 58 2c 20 59  r(TK_BITOR, X, Y
54c0: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
54d0: 3a 3d 20 65 78 70 72 28 58 29 20 4c 53 48 49 46  := expr(X) LSHIF
54e0: 54 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20  T expr(Y). {A = 
54f0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4c  sqlite3Expr(TK_L
5500: 53 48 49 46 54 2c 20 58 2c 20 59 2c 20 30 29 3b  SHIFT, X, Y, 0);
5510: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5520: 70 72 28 58 29 20 52 53 48 49 46 54 20 65 78 70  pr(X) RSHIFT exp
5530: 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74  r(Y). {A = sqlit
5540: 65 33 45 78 70 72 28 54 4b 5f 52 53 48 49 46 54  e3Expr(TK_RSHIFT
5550: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
5560: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
5570: 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65 78 70 72   likeop(OP) expr
5580: 28 59 29 2e 20 20 5b 4c 49 4b 45 5d 20 20 7b 0a  (Y).  [LIKE]  {.
5590: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
55a0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
55b0: 69 73 74 41 70 70 65 6e 64 28 30 2c 20 59 2c 20  istAppend(0, Y, 
55c0: 30 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  0);.  pList = sq
55d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
55e0: 65 6e 64 28 70 4c 69 73 74 2c 20 58 2c 20 30 29  end(pList, X, 0)
55f0: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
5600: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 4c 69 73  xprFunction(pLis
5610: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  t, 0);.  if( A )
5620: 20 41 2d 3e 6f 70 20 3d 20 4f 50 3b 0a 20 20 73   A->op = OP;.  s
5630: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
5640: 2c 20 26 58 2d 3e 73 70 61 6e 2c 20 26 59 2d 3e  , &X->span, &Y->
5650: 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29  span);.}.expr(A)
5660: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54   ::= expr(X) NOT
5670: 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65 78 70 72   likeop(OP) expr
5680: 28 59 29 2e 20 5b 4c 49 4b 45 5d 20 7b 0a 20 20  (Y). [LIKE] {.  
5690: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
56a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
56b0: 74 41 70 70 65 6e 64 28 30 2c 20 59 2c 20 30 29  tAppend(0, Y, 0)
56c0: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
56d0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
56e0: 64 28 70 4c 69 73 74 2c 20 58 2c 20 30 29 3b 0a  d(pList, X, 0);.
56f0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
5700: 72 46 75 6e 63 74 69 6f 6e 28 70 4c 69 73 74 2c  rFunction(pList,
5710: 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41   0);.  if( A ) A
5720: 2d 3e 6f 70 20 3d 20 4f 50 3b 0a 20 20 41 20 3d  ->op = OP;.  A =
5730: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
5740: 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20  NOT, A, 0, 0);. 
5750: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
5760: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 59 2d 3e  (A,&X->span,&Y->
5770: 73 70 61 6e 29 3b 0a 7d 0a 25 74 79 70 65 20 6c  span);.}.%type l
5780: 69 6b 65 6f 70 20 7b 69 6e 74 7d 0a 6c 69 6b 65  ikeop {int}.like
5790: 6f 70 28 41 29 20 3a 3a 3d 20 4c 49 4b 45 2e 20  op(A) ::= LIKE. 
57a0: 7b 41 20 3d 20 54 4b 5f 4c 49 4b 45 3b 7d 0a 6c  {A = TK_LIKE;}.l
57b0: 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 47 4c 4f  ikeop(A) ::= GLO
57c0: 42 2e 20 7b 41 20 3d 20 54 4b 5f 47 4c 4f 42 3b  B. {A = TK_GLOB;
57d0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
57e0: 70 72 28 58 29 20 50 4c 55 53 20 65 78 70 72 28  pr(X) PLUS expr(
57f0: 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  Y).  {A = sqlite
5800: 33 45 78 70 72 28 54 4b 5f 50 4c 55 53 2c 20 58  3Expr(TK_PLUS, X
5810: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
5820: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4d 49  ) ::= expr(X) MI
5830: 4e 55 53 20 65 78 70 72 28 59 29 2e 20 7b 41 20  NUS expr(Y). {A 
5840: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
5850: 5f 4d 49 4e 55 53 2c 20 58 2c 20 59 2c 20 30 29  _MINUS, X, Y, 0)
5860: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
5870: 78 70 72 28 58 29 20 53 54 41 52 20 65 78 70 72  xpr(X) STAR expr
5880: 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (Y).  {A = sqlit
5890: 65 33 45 78 70 72 28 54 4b 5f 53 54 41 52 2c 20  e3Expr(TK_STAR, 
58a0: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
58b0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 53  A) ::= expr(X) S
58c0: 4c 41 53 48 20 65 78 70 72 28 59 29 2e 20 7b 41  LASH expr(Y). {A
58d0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54   = sqlite3Expr(T
58e0: 4b 5f 53 4c 41 53 48 2c 20 58 2c 20 59 2c 20 30  K_SLASH, X, Y, 0
58f0: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
5900: 65 78 70 72 28 58 29 20 52 45 4d 20 65 78 70 72  expr(X) REM expr
5910: 28 59 29 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69  (Y).   {A = sqli
5920: 74 65 33 45 78 70 72 28 54 4b 5f 52 45 4d 2c 20  te3Expr(TK_REM, 
5930: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
5940: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 43  A) ::= expr(X) C
5950: 4f 4e 43 41 54 20 65 78 70 72 28 59 29 2e 20 7b  ONCAT expr(Y). {
5960: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5970: 54 4b 5f 43 4f 4e 43 41 54 2c 20 58 2c 20 59 2c  TK_CONCAT, X, Y,
5980: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
5990: 3d 20 65 78 70 72 28 58 29 20 49 53 4e 55 4c 4c  = expr(X) ISNULL
59a0: 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (E). {.  A = sql
59b0: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 53 4e 55  ite3Expr(TK_ISNU
59c0: 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  LL, X, 0, 0);.  
59d0: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
59e0: 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a  A,&X->span,&E);.
59f0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5a00: 70 72 28 58 29 20 49 53 20 4e 55 4c 4c 28 45 29  pr(X) IS NULL(E)
5a10: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
5a20: 33 45 78 70 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c  3Expr(TK_ISNULL,
5a30: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   X, 0, 0);.  sql
5a40: 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26  ite3ExprSpan(A,&
5a50: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
5a60: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
5a70: 58 29 20 4e 4f 54 4e 55 4c 4c 28 45 29 2e 20 7b  X) NOTNULL(E). {
5a80: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
5a90: 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58  pr(TK_NOTNULL, X
5aa0: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
5ab0: 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  e3ExprSpan(A,&X-
5ac0: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70  >span,&E);.}.exp
5ad0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
5ae0: 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a   NOT NULL(E). {.
5af0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
5b00: 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20 58 2c  r(TK_NOTNULL, X,
5b10: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
5b20: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  3ExprSpan(A,&X->
5b30: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72  span,&E);.}.expr
5b40: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
5b50: 49 53 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20  IS NOT NULL(E). 
5b60: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
5b70: 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20  xpr(TK_NOTNULL, 
5b80: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
5b90: 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58  te3ExprSpan(A,&X
5ba0: 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78  ->span,&E);.}.ex
5bb0: 70 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 28 42 29  pr(A) ::= NOT(B)
5bc0: 20 65 78 70 72 28 58 29 2e 20 7b 0a 20 20 41 20   expr(X). {.  A 
5bd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
5be0: 5f 4e 4f 54 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  _NOT, X, 0, 0);.
5bf0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
5c00: 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29  n(A,&B,&X->span)
5c10: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
5c20: 42 49 54 4e 4f 54 28 42 29 20 65 78 70 72 28 58  BITNOT(B) expr(X
5c30: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
5c40: 65 33 45 78 70 72 28 54 4b 5f 42 49 54 4e 4f 54  e3Expr(TK_BITNOT
5c50: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
5c60: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c  lite3ExprSpan(A,
5c70: 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a  &B,&X->span);.}.
5c80: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55  expr(A) ::= MINU
5c90: 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b 55  S(B) expr(X). [U
5ca0: 4d 49 4e 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73  MINUS] {.  A = s
5cb0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 55 4d  qlite3Expr(TK_UM
5cc0: 49 4e 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  INUS, X, 0, 0);.
5cd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
5ce0: 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29  n(A,&B,&X->span)
5cf0: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
5d00: 50 4c 55 53 28 42 29 20 65 78 70 72 28 58 29 2e  PLUS(B) expr(X).
5d10: 20 5b 55 50 4c 55 53 5d 20 7b 0a 20 20 41 20 3d   [UPLUS] {.  A =
5d20: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
5d30: 55 50 4c 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b  UPLUS, X, 0, 0);
5d40: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  .  sqlite3ExprSp
5d50: 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e  an(A,&B,&X->span
5d60: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
5d70: 20 4c 50 28 42 29 20 73 65 6c 65 63 74 28 58 29   LP(B) select(X)
5d80: 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20   RP(E). {.  A = 
5d90: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 53  sqlite3Expr(TK_S
5da0: 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
5db0: 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 53  .  if( A ) A->pS
5dc0: 65 6c 65 63 74 20 3d 20 58 3b 0a 20 20 73 71 6c  elect = X;.  sql
5dd0: 69 74 65 33 45 78 70 72 53 70 61 6e 28 41 2c 26  ite3ExprSpan(A,&
5de0: 42 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29  B,&E);.}.expr(A)
5df0: 20 3a 3a 3d 20 65 78 70 72 28 57 29 20 42 45 54   ::= expr(W) BET
5e00: 57 45 45 4e 20 65 78 70 72 28 58 29 20 41 4e 44  WEEN expr(X) AND
5e10: 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 45 78   expr(Y). {.  Ex
5e20: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
5e30: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5e40: 70 70 65 6e 64 28 30 2c 20 58 2c 20 30 29 3b 0a  ppend(0, X, 0);.
5e50: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
5e60: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
5e70: 70 4c 69 73 74 2c 20 59 2c 20 30 29 3b 0a 20 20  pList, Y, 0);.  
5e80: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
5e90: 54 4b 5f 42 45 54 57 45 45 4e 2c 20 57 2c 20 30  TK_BETWEEN, W, 0
5ea0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20  , 0);.  if( A ) 
5eb0: 41 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  A->pList = pList
5ec0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
5ed0: 70 61 6e 28 41 2c 26 57 2d 3e 73 70 61 6e 2c 26  pan(A,&W->span,&
5ee0: 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72  Y->span);.}.expr
5ef0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 57 29 20  (A) ::= expr(W) 
5f00: 4e 4f 54 20 42 45 54 57 45 45 4e 20 65 78 70 72  NOT BETWEEN expr
5f10: 28 58 29 20 41 4e 44 20 65 78 70 72 28 59 29 2e  (X) AND expr(Y).
5f20: 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70   {.  ExprList *p
5f30: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
5f40: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
5f50: 58 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74 20 3d  X, 0);.  pList =
5f60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5f70: 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 59 2c  Append(pList, Y,
5f80: 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74   0);.  A = sqlit
5f90: 65 33 45 78 70 72 28 54 4b 5f 42 45 54 57 45 45  e3Expr(TK_BETWEE
5fa0: 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a 20 20 69  N, W, 0, 0);.  i
5fb0: 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 20  f( A ) A->pList 
5fc0: 3d 20 70 4c 69 73 74 3b 0a 20 20 41 20 3d 20 73  = pList;.  A = s
5fd0: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 4e 4f  qlite3Expr(TK_NO
5fe0: 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73  T, A, 0, 0);.  s
5ff0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
6000: 2c 26 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70  ,&W->span,&Y->sp
6010: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  an);.}.expr(A) :
6020: 3a 3d 20 65 78 70 72 28 58 29 20 49 4e 20 4c 50  := expr(X) IN LP
6030: 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 28   exprlist(Y) RP(
6040: 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c  E).  {.  A = sql
6050: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20  ite3Expr(TK_IN, 
6060: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  X, 0, 0);.  if( 
6070: 41 20 29 20 41 2d 3e 70 4c 69 73 74 20 3d 20 59  A ) A->pList = Y
6080: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
6090: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26  pan(A,&X->span,&
60a0: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
60b0: 3d 20 65 78 70 72 28 58 29 20 49 4e 20 4c 50 20  = expr(X) IN LP 
60c0: 73 65 6c 65 63 74 28 59 29 20 52 50 28 45 29 2e  select(Y) RP(E).
60d0: 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65    {.  A = sqlite
60e0: 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20  3Expr(TK_IN, X, 
60f0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  0, 0);.  if( A )
6100: 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20 59 3b   A->pSelect = Y;
6110: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  .  sqlite3ExprSp
6120: 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45  an(A,&X->span,&E
6130: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
6140: 20 65 78 70 72 28 58 29 20 4e 4f 54 20 49 4e 20   expr(X) NOT IN 
6150: 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52  LP exprlist(Y) R
6160: 50 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73  P(E).  {.  A = s
6170: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e  qlite3Expr(TK_IN
6180: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , X, 0, 0);.  if
6190: 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 20 3d  ( A ) A->pList =
61a0: 20 59 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65   Y;.  A = sqlite
61b0: 33 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c  3Expr(TK_NOT, A,
61c0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
61d0: 33 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  3ExprSpan(A,&X->
61e0: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72  span,&E);.}.expr
61f0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
6200: 4e 4f 54 20 49 4e 20 4c 50 20 73 65 6c 65 63 74  NOT IN LP select
6210: 28 59 29 20 52 50 28 45 29 2e 20 20 7b 0a 20 20  (Y) RP(E).  {.  
6220: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
6230: 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b  TK_IN, X, 0, 0);
6240: 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 53  .  if( A ) A->pS
6250: 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 41 20 3d  elect = Y;.  A =
6260: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
6270: 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20  NOT, A, 0, 0);. 
6280: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
6290: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b  (A,&X->span,&E);
62a0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .}.expr(A) ::= e
62b0: 78 70 72 28 58 29 20 49 4e 20 6e 6d 28 59 29 20  xpr(X) IN nm(Y) 
62c0: 64 62 6e 6d 28 44 29 2e 20 7b 0a 20 20 53 72 63  dbnm(D). {.  Src
62d0: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 73 71 6c  List *pSrc = sql
62e0: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
62f0: 64 28 30 2c 20 26 59 2c 20 26 44 29 3b 0a 20 20  d(0, &Y, &D);.  
6300: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
6310: 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b  TK_IN, X, 0, 0);
6320: 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 53  .  if( A ) A->pS
6330: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
6340: 65 6c 65 63 74 4e 65 77 28 30 2c 70 53 72 63 2c  electNew(0,pSrc,
6350: 30 2c 30 2c 30 2c 30 2c 30 2c 2d 31 2c 30 29 3b  0,0,0,0,0,-1,0);
6360: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70  .  sqlite3ExprSp
6370: 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 44 2e  an(A,&X->span,D.
6380: 7a 3f 26 44 3a 26 59 29 3b 0a 7d 0a 65 78 70 72  z?&D:&Y);.}.expr
6390: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
63a0: 4e 4f 54 20 49 4e 20 6e 6d 28 59 29 20 64 62 6e  NOT IN nm(Y) dbn
63b0: 6d 28 44 29 2e 20 7b 0a 20 20 53 72 63 4c 69 73  m(D). {.  SrcLis
63c0: 74 20 2a 70 53 72 63 20 3d 20 73 71 6c 69 74 65  t *pSrc = sqlite
63d0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30  3SrcListAppend(0
63e0: 2c 20 26 59 2c 20 26 44 29 3b 0a 20 20 41 20 3d  , &Y, &D);.  A =
63f0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
6400: 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  IN, X, 0, 0);.  
6410: 69 66 28 20 41 20 29 20 41 2d 3e 70 53 65 6c 65  if( A ) A->pSele
6420: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
6430: 63 74 4e 65 77 28 30 2c 70 53 72 63 2c 30 2c 30  ctNew(0,pSrc,0,0
6440: 2c 30 2c 30 2c 30 2c 2d 31 2c 30 29 3b 0a 20 20  ,0,0,0,-1,0);.  
6450: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  A = sqlite3Expr(
6460: 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29  TK_NOT, A, 0, 0)
6470: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
6480: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 44  pan(A,&X->span,D
6490: 2e 7a 3f 26 44 3a 26 59 29 3b 0a 7d 0a 0a 0a 2f  .z?&D:&Y);.}.../
64a0: 2a 20 43 41 53 45 20 65 78 70 72 65 73 73 69 6f  * CASE expressio
64b0: 6e 73 20 2a 2f 0a 65 78 70 72 28 41 29 20 3a 3a  ns */.expr(A) ::
64c0: 3d 20 43 41 53 45 28 43 29 20 63 61 73 65 5f 6f  = CASE(C) case_o
64d0: 70 65 72 61 6e 64 28 58 29 20 63 61 73 65 5f 65  perand(X) case_e
64e0: 78 70 72 6c 69 73 74 28 59 29 20 63 61 73 65 5f  xprlist(Y) case_
64f0: 65 6c 73 65 28 5a 29 20 45 4e 44 28 45 29 2e 20  else(Z) END(E). 
6500: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
6510: 78 70 72 28 54 4b 5f 43 41 53 45 2c 20 58 2c 20  xpr(TK_CASE, X, 
6520: 5a 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  Z, 0);.  if( A )
6530: 20 41 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20   A->pList = Y;. 
6540: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
6550: 28 41 2c 20 26 43 2c 20 26 45 29 3b 0a 7d 0a 25  (A, &C, &E);.}.%
6560: 74 79 70 65 20 63 61 73 65 5f 65 78 70 72 6c 69  type case_exprli
6570: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
6580: 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f  destructor case_
6590: 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65  exprlist {sqlite
65a0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
65b0: 24 24 29 3b 7d 0a 63 61 73 65 5f 65 78 70 72 6c  $$);}.case_exprl
65c0: 69 73 74 28 41 29 20 3a 3a 3d 20 63 61 73 65 5f  ist(A) ::= case_
65d0: 65 78 70 72 6c 69 73 74 28 58 29 20 57 48 45 4e  exprlist(X) WHEN
65e0: 20 65 78 70 72 28 59 29 20 54 48 45 4e 20 65 78   expr(Y) THEN ex
65f0: 70 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Z). {.  A = s
6600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
6610: 70 65 6e 64 28 58 2c 20 59 2c 20 30 29 3b 0a 20  pend(X, Y, 0);. 
6620: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6630: 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 20 5a 2c  ListAppend(A, Z,
6640: 20 30 29 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72   0);.}.case_expr
6650: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e  list(A) ::= WHEN
6660: 20 65 78 70 72 28 59 29 20 54 48 45 4e 20 65 78   expr(Y) THEN ex
6670: 70 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Z). {.  A = s
6680: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
6690: 70 65 6e 64 28 30 2c 20 59 2c 20 30 29 3b 0a 20  pend(0, Y, 0);. 
66a0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
66b0: 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 20 5a 2c  ListAppend(A, Z,
66c0: 20 30 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73   0);.}.%type cas
66d0: 65 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a 63  e_else {Expr*}.c
66e0: 61 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20  ase_else(A) ::= 
66f0: 20 45 4c 53 45 20 65 78 70 72 28 58 29 2e 20 20   ELSE expr(X).  
6700: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
6710: 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d  case_else(A) ::=
6720: 20 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
6730: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
6740: 20 0a 25 74 79 70 65 20 63 61 73 65 5f 6f 70 65   .%type case_ope
6750: 72 61 6e 64 20 7b 45 78 70 72 2a 7d 0a 63 61 73  rand {Expr*}.cas
6760: 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d  e_operand(A) ::=
6770: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
6780: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 20 0a 63       {A = X;} .c
6790: 61 73 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a  ase_operand(A) :
67a0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
67b0: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20         {A = 0;} 
67c0: 0a 0a 25 74 79 70 65 20 65 78 70 72 6c 69 73 74  ..%type exprlist
67d0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
67e0: 73 74 72 75 63 74 6f 72 20 65 78 70 72 6c 69 73  structor exprlis
67f0: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t {sqlite3ExprLi
6800: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25  stDelete($$);}.%
6810: 74 79 70 65 20 65 78 70 72 69 74 65 6d 20 7b 45  type expritem {E
6820: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
6830: 72 20 65 78 70 72 69 74 65 6d 20 7b 73 71 6c 69  r expritem {sqli
6840: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 24 24  te3ExprDelete($$
6850: 29 3b 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29  );}..exprlist(A)
6860: 20 3a 3a 3d 20 65 78 70 72 6c 69 73 74 28 58 29   ::= exprlist(X)
6870: 20 43 4f 4d 4d 41 20 65 78 70 72 69 74 65 6d 28   COMMA expritem(
6880: 59 29 2e 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c  Y). .   {A = sql
6890: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
68a0: 6e 64 28 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72  nd(X,Y,0);}.expr
68b0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72  list(A) ::= expr
68c0: 69 74 65 6d 28 58 29 2e 20 20 20 20 20 20 20 20  item(X).        
68d0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
68e0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
68f0: 2c 58 2c 30 29 3b 7d 0a 65 78 70 72 69 74 65 6d  ,X,0);}.expritem
6900: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e  (A) ::= expr(X).
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6920: 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72 69 74 65  {A = X;}.exprite
6930: 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  m(A) ::= .      
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f   {A = 0;}../////
6960: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6970: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45  //////// The CRE
6980: 41 54 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  ATE INDEX comman
6990: 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  d //////////////
69a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
69b0: 20 3a 3a 3d 20 43 52 45 41 54 45 28 53 29 20 75   ::= CREATE(S) u
69c0: 6e 69 71 75 65 66 6c 61 67 28 55 29 20 49 4e 44  niqueflag(U) IND
69d0: 45 58 20 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29  EX nm(X) dbnm(D)
69e0: 0a 20 20 20 20 20 20 20 20 4f 4e 20 6e 6d 28 59  .        ON nm(Y
69f0: 29 20 64 62 6e 6d 28 43 29 20 4c 50 20 69 64 78  ) dbnm(C) LP idx
6a00: 6c 69 73 74 28 5a 29 20 52 50 28 45 29 20 6f 6e  list(Z) RP(E) on
6a10: 63 6f 6e 66 28 52 29 2e 20 7b 0a 20 20 69 66 28  conf(R). {.  if(
6a20: 20 55 21 3d 4f 45 5f 4e 6f 6e 65 20 29 20 55 20   U!=OE_None ) U 
6a30: 3d 20 52 3b 0a 20 20 69 66 28 20 55 3d 3d 4f 45  = R;.  if( U==OE
6a40: 5f 44 65 66 61 75 6c 74 29 20 55 20 3d 20 4f 45  _Default) U = OE
6a50: 5f 41 62 6f 72 74 3b 0a 20 20 73 71 6c 69 74 65  _Abort;.  sqlite
6a60: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
6a70: 72 73 65 2c 20 26 58 2c 20 26 44 2c 20 73 71 6c  rse, &X, &D, sql
6a80: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
6a90: 64 28 30 2c 26 59 2c 26 43 29 2c 0a 20 20 20 20  d(0,&Y,&C),.    
6aa0: 20 20 5a 2c 20 55 2c 20 26 53 2c 20 26 45 29 3b    Z, U, &S, &E);
6ab0: 0a 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71 75 65  .}..%type unique
6ac0: 66 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75  flag {int}.uniqu
6ad0: 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49  eflag(A) ::= UNI
6ae0: 51 55 45 2e 20 20 7b 20 41 20 3d 20 4f 45 5f 41  QUE.  { A = OE_A
6af0: 62 6f 72 74 3b 20 7d 0a 75 6e 69 71 75 65 66 6c  bort; }.uniquefl
6b00: 61 67 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  ag(A) ::= .     
6b10: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65     { A = OE_None
6b20: 3b 20 7d 0a 0a 25 74 79 70 65 20 69 64 78 6c 69  ; }..%type idxli
6b30: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
6b40: 64 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c 69  destructor idxli
6b50: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
6b60: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
6b70: 25 74 79 70 65 20 69 64 78 6c 69 73 74 5f 6f 70  %type idxlist_op
6b80: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
6b90: 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c 69 73  estructor idxlis
6ba0: 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  t_opt {sqlite3Ex
6bb0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
6bc0: 3b 7d 0a 25 74 79 70 65 20 69 64 78 69 74 65 6d  ;}.%type idxitem
6bd0: 20 7b 54 6f 6b 65 6e 7d 0a 0a 69 64 78 6c 69 73   {Token}..idxlis
6be0: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  t_opt(A) ::= .  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
6c10: 69 64 78 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  idxlist_opt(A) :
6c20: 3a 3d 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29  := LP idxlist(X)
6c30: 20 52 50 2e 20 20 20 20 20 20 20 20 20 7b 41 20   RP.         {A 
6c40: 3d 20 58 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29  = X;}.idxlist(A)
6c50: 20 3a 3a 3d 20 69 64 78 6c 69 73 74 28 58 29 20   ::= idxlist(X) 
6c60: 43 4f 4d 4d 41 20 69 64 78 69 74 65 6d 28 59 29  COMMA idxitem(Y)
6c70: 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74   collate(C) sort
6c80: 6f 72 64 65 72 2e 20 20 7b 0a 20 20 45 78 70 72  order.  {.  Expr
6c90: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 43   *p = 0;.  if( C
6ca0: 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 70 20 3d 20  .n>0 ){.    p = 
6cb0: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 43  sqlite3Expr(TK_C
6cc0: 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b  OLUMN, 0, 0, 0);
6cd0: 0a 20 20 20 20 69 66 28 20 70 20 29 20 70 2d 3e  .    if( p ) p->
6ce0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4c  pColl = sqlite3L
6cf0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
6d00: 72 73 65 2c 20 43 2e 7a 2c 20 43 2e 6e 29 3b 0a  rse, C.z, C.n);.
6d10: 20 20 7d 0a 20 20 41 20 3d 20 73 71 6c 69 74 65    }.  A = sqlite
6d20: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
6d30: 58 2c 20 70 2c 20 26 59 29 3b 0a 7d 0a 69 64 78  X, p, &Y);.}.idx
6d40: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 78 69  list(A) ::= idxi
6d50: 74 65 6d 28 59 29 20 63 6f 6c 6c 61 74 65 28 43  tem(Y) collate(C
6d60: 29 20 73 6f 72 74 6f 72 64 65 72 2e 20 7b 0a 20  ) sortorder. {. 
6d70: 20 45 78 70 72 20 2a 70 20 3d 20 30 3b 0a 20 20   Expr *p = 0;.  
6d80: 69 66 28 20 43 2e 6e 3e 30 20 29 7b 0a 20 20 20  if( C.n>0 ){.   
6d90: 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   p = sqlite3Expr
6da0: 28 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30  (TK_COLUMN, 0, 0
6db0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
6dc0: 29 20 70 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  ) p->pColl = sql
6dd0: 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65  ite3LocateCollSe
6de0: 71 28 70 50 61 72 73 65 2c 20 43 2e 7a 2c 20 43  q(pParse, C.z, C
6df0: 2e 6e 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 73  .n);.  }.  A = s
6e00: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
6e10: 70 65 6e 64 28 30 2c 20 70 2c 20 26 59 29 3b 0a  pend(0, p, &Y);.
6e20: 7d 0a 69 64 78 69 74 65 6d 28 41 29 20 3a 3a 3d  }.idxitem(A) ::=
6e30: 20 6e 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20   nm(X).         
6e40: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 0a       {A = X;}...
6e50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
6e70: 65 20 44 52 4f 50 20 49 4e 44 45 58 20 63 6f 6d  e DROP INDEX com
6e80: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
6e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
6ea0: 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20  /..cmd ::= DROP 
6eb0: 49 4e 44 45 58 20 6e 6d 28 58 29 20 64 62 6e 6d  INDEX nm(X) dbnm
6ec0: 28 59 29 2e 20 20 20 7b 0a 20 20 73 71 6c 69 74  (Y).   {.  sqlit
6ed0: 65 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72  e3DropIndex(pPar
6ee0: 73 65 2c 20 73 71 6c 69 74 65 33 53 72 63 4c 69  se, sqlite3SrcLi
6ef0: 73 74 41 70 70 65 6e 64 28 30 2c 26 58 2c 26 59  stAppend(0,&X,&Y
6f00: 29 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  ));.}../////////
6f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f20: 2f 2f 2f 2f 20 54 68 65 20 56 41 43 55 55 4d 20  //// The VACUUM 
6f30: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
6f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f50: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
6f60: 20 56 41 43 55 55 4d 2e 20 20 20 20 20 20 20 20   VACUUM.        
6f70: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
6f80: 56 61 63 75 75 6d 28 70 50 61 72 73 65 2c 30 29  Vacuum(pParse,0)
6f90: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55  ;}.cmd ::= VACUU
6fa0: 4d 20 6e 6d 28 58 29 2e 20 20 20 20 20 20 20 20  M nm(X).        
6fb0: 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75 6d 28   {sqlite3Vacuum(
6fc0: 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 0a 2f 2f  pParse,&X);}..//
6fd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6fe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
6ff0: 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 2f  PRAGMA command /
7000: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
7020: 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e  cmd ::= PRAGMA n
7030: 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20  m(X) dbnm(Z) EQ 
7040: 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33  nm(Y).  {sqlite3
7050: 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58  Pragma(pParse,&X
7060: 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20  ,&Z,&Y,0);}.cmd 
7070: 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29  ::= PRAGMA nm(X)
7080: 20 64 62 6e 6d 28 5a 29 20 45 51 20 4f 4e 28 59   dbnm(Z) EQ ON(Y
7090: 29 2e 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67  ).  {sqlite3Prag
70a0: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
70b0: 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  &Y,0);}.cmd ::= 
70c0: 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e  PRAGMA nm(X) dbn
70d0: 6d 28 5a 29 20 45 51 20 70 6c 75 73 5f 6e 75 6d  m(Z) EQ plus_num
70e0: 28 59 29 2e 20 7b 73 71 6c 69 74 65 33 50 72 61  (Y). {sqlite3Pra
70f0: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
7100: 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  ,&Y,0);}.cmd ::=
7110: 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62   PRAGMA nm(X) db
7120: 6e 6d 28 5a 29 20 45 51 20 6d 69 6e 75 73 5f 6e  nm(Z) EQ minus_n
7130: 75 6d 28 59 29 2e 20 7b 0a 20 20 73 71 6c 69 74  um(Y). {.  sqlit
7140: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  e3Pragma(pParse,
7150: 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 0a 7d 0a 63  &X,&Z,&Y,1);.}.c
7160: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d  md ::= PRAGMA nm
7170: 28 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20 6e  (X) dbnm(Z) LP n
7180: 6d 28 59 29 20 52 50 2e 20 7b 73 71 6c 69 74 65  m(Y) RP. {sqlite
7190: 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26  3Pragma(pParse,&
71a0: 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64  X,&Z,&Y,0);}.cmd
71b0: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58   ::= PRAGMA nm(X
71c0: 29 20 64 62 6e 6d 28 5a 29 2e 20 20 7b 73 71 6c  ) dbnm(Z).  {sql
71d0: 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73  ite3Pragma(pPars
71e0: 65 2c 26 58 2c 26 5a 2c 30 2c 30 29 3b 7d 0a 70  e,&X,&Z,0,0);}.p
71f0: 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 70  lus_num(A) ::= p
7200: 6c 75 73 5f 6f 70 74 20 6e 75 6d 62 65 72 28 58  lus_opt number(X
7210: 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69  ).   {A = X;}.mi
7220: 6e 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d  nus_num(A) ::= M
7230: 49 4e 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20  INUS number(X). 
7240: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d      {A = X;}.num
7250: 62 65 72 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47  ber(A) ::= INTEG
7260: 45 52 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d  ER(X).  {A = X;}
7270: 0a 6e 75 6d 62 65 72 28 41 29 20 3a 3a 3d 20 46  .number(A) ::= F
7280: 4c 4f 41 54 28 58 29 2e 20 20 20 20 7b 41 20 3d  LOAT(X).    {A =
7290: 20 58 3b 7d 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a   X;}.plus_opt ::
72a0: 3d 20 50 4c 55 53 2e 0a 70 6c 75 73 5f 6f 70 74  = PLUS..plus_opt
72b0: 20 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f   ::= ...////////
72c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
72d0: 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20  //// The CREATE 
72e0: 54 52 49 47 47 45 52 20 63 6f 6d 6d 61 6e 64 20  TRIGGER command 
72f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7300: 2f 2f 2f 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 43  /////..cmd ::= C
7310: 52 45 41 54 45 20 74 72 69 67 67 65 72 5f 64 65  REATE trigger_de
7320: 63 6c 28 41 29 20 42 45 47 49 4e 20 74 72 69 67  cl(A) BEGIN trig
7330: 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53 29 20  ger_cmd_list(S) 
7340: 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f 6b 65  END(Z). {.  Toke
7350: 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a 20 3d  n all;.  all.z =
7360: 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20 3d 20   A.z;.  all.n = 
7370: 28 5a 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a 2e  (Z.z - A.z) + Z.
7380: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6e 69  n;.  sqlite3Fini
7390: 73 68 54 72 69 67 67 65 72 28 70 50 61 72 73 65  shTrigger(pParse
73a0: 2c 20 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a 0a 74  , S, &all);.}..t
73b0: 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20 3a  rigger_decl(A) :
73c0: 3a 3d 20 74 65 6d 70 28 54 29 20 54 52 49 47 47  := temp(T) TRIGG
73d0: 45 52 20 6e 6d 28 42 29 20 64 62 6e 6d 28 5a 29  ER nm(B) dbnm(Z)
73e0: 20 74 72 69 67 67 65 72 5f 74 69 6d 65 28 43 29   trigger_time(C)
73f0: 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28 44   trigger_event(D
7400: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
7410: 20 20 20 4f 4e 20 6e 6d 28 45 29 20 64 62 6e 6d     ON nm(E) dbnm
7420: 28 44 42 29 20 66 6f 72 65 61 63 68 5f 63 6c 61  (DB) foreach_cla
7430: 75 73 65 28 46 29 20 77 68 65 6e 5f 63 6c 61 75  use(F) when_clau
7440: 73 65 28 47 29 2e 20 7b 0a 20 20 53 72 63 4c 69  se(G). {.  SrcLi
7450: 73 74 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  st *pTab = sqlit
7460: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
7470: 30 2c 20 26 45 2c 20 26 44 42 29 3b 0a 20 20 73  0, &E, &DB);.  s
7480: 71 6c 69 74 65 33 42 65 67 69 6e 54 72 69 67 67  qlite3BeginTrigg
7490: 65 72 28 70 50 61 72 73 65 2c 20 26 42 2c 20 26  er(pParse, &B, &
74a0: 5a 2c 20 43 2c 20 44 2e 61 2c 20 44 2e 62 2c 20  Z, C, D.a, D.b, 
74b0: 70 54 61 62 2c 20 46 2c 20 47 2c 20 54 29 3b 0a  pTab, F, G, T);.
74c0: 20 20 41 20 3d 20 28 5a 2e 6e 3d 3d 30 3f 42 3a    A = (Z.n==0?B:
74d0: 5a 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 74 72 69  Z);.}..%type tri
74e0: 67 67 65 72 5f 74 69 6d 65 20 20 7b 69 6e 74 7d  gger_time  {int}
74f0: 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29  .trigger_time(A)
7500: 20 3a 3a 3d 20 42 45 46 4f 52 45 2e 20 20 20 20   ::= BEFORE.    
7510: 20 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46 4f 52    { A = TK_BEFOR
7520: 45 3b 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d  E; }.trigger_tim
7530: 65 28 41 29 20 3a 3a 3d 20 41 46 54 45 52 2e 20  e(A) ::= AFTER. 
7540: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 41        { A = TK_A
7550: 46 54 45 52 3b 20 20 7d 0a 74 72 69 67 67 65 72  FTER;  }.trigger
7560: 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 49 4e 53  _time(A) ::= INS
7570: 54 45 41 44 20 4f 46 2e 20 20 7b 20 41 20 3d 20  TEAD OF.  { A = 
7580: 54 4b 5f 49 4e 53 54 45 41 44 3b 7d 0a 74 72 69  TK_INSTEAD;}.tri
7590: 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d  gger_time(A) ::=
75a0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 20   .            { 
75b0: 41 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d  A = TK_BEFORE; }
75c0: 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f  ..%type trigger_
75d0: 65 76 65 6e 74 20 7b 73 74 72 75 63 74 20 54 72  event {struct Tr
75e0: 69 67 45 76 65 6e 74 7d 0a 25 64 65 73 74 72 75  igEvent}.%destru
75f0: 63 74 6f 72 20 74 72 69 67 67 65 72 5f 65 76 65  ctor trigger_eve
7600: 6e 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73  nt {sqlite3IdLis
7610: 74 44 65 6c 65 74 65 28 24 24 2e 62 29 3b 7d 0a  tDelete($$.b);}.
7620: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29  trigger_event(A)
7630: 20 3a 3a 3d 20 44 45 4c 45 54 45 2e 20 7b 20 41   ::= DELETE. { A
7640: 2e 61 20 3d 20 54 4b 5f 44 45 4c 45 54 45 3b 20  .a = TK_DELETE; 
7650: 41 2e 62 20 3d 20 30 3b 20 7d 0a 74 72 69 67 67  A.b = 0; }.trigg
7660: 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20  er_event(A) ::= 
7670: 49 4e 53 45 52 54 2e 20 7b 20 41 2e 61 20 3d 20  INSERT. { A.a = 
7680: 54 4b 5f 49 4e 53 45 52 54 3b 20 41 2e 62 20 3d  TK_INSERT; A.b =
7690: 20 30 3b 20 7d 0a 74 72 69 67 67 65 72 5f 65 76   0; }.trigger_ev
76a0: 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54  ent(A) ::= UPDAT
76b0: 45 2e 20 7b 20 41 2e 61 20 3d 20 54 4b 5f 55 50  E. { A.a = TK_UP
76c0: 44 41 54 45 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a  DATE; A.b = 0;}.
76d0: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29  trigger_event(A)
76e0: 20 3a 3a 3d 20 55 50 44 41 54 45 20 4f 46 20 69   ::= UPDATE OF i
76f0: 6e 73 63 6f 6c 6c 69 73 74 28 58 29 2e 20 7b 41  nscollist(X). {A
7700: 2e 61 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b 20  .a = TK_UPDATE; 
7710: 41 2e 62 20 3d 20 58 3b 20 7d 0a 0a 25 74 79 70  A.b = X; }..%typ
7720: 65 20 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65  e foreach_clause
7730: 20 7b 69 6e 74 7d 0a 66 6f 72 65 61 63 68 5f 63   {int}.foreach_c
7740: 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20  lause(A) ::= .  
7750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7760: 20 7b 20 41 20 3d 20 54 4b 5f 52 4f 57 3b 20 7d   { A = TK_ROW; }
7770: 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28  .foreach_clause(
7780: 41 29 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20  A) ::= FOR EACH 
7790: 52 4f 57 2e 20 20 20 20 20 20 20 7b 20 41 20 3d  ROW.       { A =
77a0: 20 54 4b 5f 52 4f 57 3b 20 7d 0a 66 6f 72 65 61   TK_ROW; }.forea
77b0: 63 68 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d  ch_clause(A) ::=
77c0: 20 46 4f 52 20 45 41 43 48 20 53 54 41 54 45 4d   FOR EACH STATEM
77d0: 45 4e 54 2e 20 7b 20 41 20 3d 20 54 4b 5f 53 54  ENT. { A = TK_ST
77e0: 41 54 45 4d 45 4e 54 3b 20 7d 0a 0a 25 74 79 70  ATEMENT; }..%typ
77f0: 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 45  e when_clause {E
7800: 78 70 72 2a 7d 0a 77 68 65 6e 5f 63 6c 61 75 73  xpr*}.when_claus
7810: 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  e(A) ::= .      
7820: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 30 3b 20         { A = 0; 
7830: 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28 41 29  }.when_clause(A)
7840: 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 58   ::= WHEN expr(X
7850: 29 2e 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 25  ). { A = X; }..%
7860: 74 79 70 65 20 74 72 69 67 67 65 72 5f 63 6d 64  type trigger_cmd
7870: 5f 6c 69 73 74 20 7b 54 72 69 67 67 65 72 53 74  _list {TriggerSt
7880: 65 70 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  ep*}.%destructor
7890: 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73   trigger_cmd_lis
78a0: 74 20 7b 73 71 6c 69 74 65 33 44 65 6c 65 74 65  t {sqlite3Delete
78b0: 54 72 69 67 67 65 72 53 74 65 70 28 24 24 29 3b  TriggerStep($$);
78c0: 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  }.trigger_cmd_li
78d0: 73 74 28 41 29 20 3a 3a 3d 20 74 72 69 67 67 65  st(A) ::= trigge
78e0: 72 5f 63 6d 64 28 58 29 20 53 45 4d 49 20 74 72  r_cmd(X) SEMI tr
78f0: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 59  igger_cmd_list(Y
7900: 29 2e 20 7b 0a 20 20 58 2d 3e 70 4e 65 78 74 20  ). {.  X->pNext 
7910: 3d 20 59 3b 0a 20 20 41 20 3d 20 58 3b 0a 7d 0a  = Y;.  A = X;.}.
7920: 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74  trigger_cmd_list
7930: 28 41 29 20 3a 3a 3d 20 2e 20 7b 20 41 20 3d 20  (A) ::= . { A = 
7940: 30 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67  0; }..%type trig
7950: 67 65 72 5f 63 6d 64 20 7b 54 72 69 67 67 65 72  ger_cmd {Trigger
7960: 53 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63 74  Step*}.%destruct
7970: 6f 72 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b  or trigger_cmd {
7980: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69  sqlite3DeleteTri
7990: 67 67 65 72 53 74 65 70 28 24 24 29 3b 7d 0a 2f  ggerStep($$);}./
79a0: 2f 20 55 50 44 41 54 45 20 0a 74 72 69 67 67 65  / UPDATE .trigge
79b0: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 55 50 44  r_cmd(A) ::= UPD
79c0: 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20 6e 6d  ATE orconf(R) nm
79d0: 28 58 29 20 53 45 54 20 73 65 74 6c 69 73 74 28  (X) SET setlist(
79e0: 59 29 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e  Y) where_opt(Z).
79f0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
7a00: 20 20 7b 20 41 20 3d 20 73 71 6c 69 74 65 33 54    { A = sqlite3T
7a10: 72 69 67 67 65 72 55 70 64 61 74 65 53 74 65 70  riggerUpdateStep
7a20: 28 26 58 2c 20 59 2c 20 5a 2c 20 52 29 3b 20 7d  (&X, Y, Z, R); }
7a30: 0a 0a 2f 2f 20 49 4e 53 45 52 54 0a 74 72 69 67  ..// INSERT.trig
7a40: 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 69  ger_cmd(A) ::= i
7a50: 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54  nsert_cmd(R) INT
7a60: 4f 20 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69  O nm(X) inscolli
7a70: 73 74 5f 6f 70 74 28 46 29 20 0a 20 20 56 41 4c  st_opt(F) .  VAL
7a80: 55 45 53 20 4c 50 20 69 74 65 6d 6c 69 73 74 28  UES LP itemlist(
7a90: 59 29 20 52 50 2e 20 20 0a 7b 41 20 3d 20 73 71  Y) RP.  .{A = sq
7aa0: 6c 69 74 65 33 54 72 69 67 67 65 72 49 6e 73 65  lite3TriggerInse
7ab0: 72 74 53 74 65 70 28 26 58 2c 20 46 2c 20 59 2c  rtStep(&X, F, Y,
7ac0: 20 30 2c 20 52 29 3b 7d 0a 0a 74 72 69 67 67 65   0, R);}..trigge
7ad0: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 69 6e 73  r_cmd(A) ::= ins
7ae0: 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20  ert_cmd(R) INTO 
7af0: 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74  nm(X) inscollist
7b00: 5f 6f 70 74 28 46 29 20 73 65 6c 65 63 74 28 53  _opt(F) select(S
7b10: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
7b20: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72    {A = sqlite3Tr
7b30: 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 70 28  iggerInsertStep(
7b40: 26 58 2c 20 46 2c 20 30 2c 20 53 2c 20 52 29 3b  &X, F, 0, S, R);
7b50: 7d 0a 0a 2f 2f 20 44 45 4c 45 54 45 0a 74 72 69  }..// DELETE.tri
7b60: 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20  gger_cmd(A) ::= 
7b70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 6e 6d 28 58  DELETE FROM nm(X
7b80: 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 0a  ) where_opt(Y)..
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
7ba0: 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  A = sqlite3Trigg
7bb0: 65 72 44 65 6c 65 74 65 53 74 65 70 28 26 58 2c  erDeleteStep(&X,
7bc0: 20 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45 43 54   Y);}..// SELECT
7bd0: 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20  .trigger_cmd(A) 
7be0: 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20 20  ::= select(X).  
7bf0: 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  {A = sqlite3Trig
7c00: 67 65 72 53 65 6c 65 63 74 53 74 65 70 28 58 29  gerSelectStep(X)
7c10: 3b 20 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63  ; }..// The spec
7c20: 69 61 6c 20 52 41 49 53 45 20 65 78 70 72 65 73  ial RAISE expres
7c30: 73 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63  sion that may oc
7c40: 63 75 72 20 69 6e 20 74 72 69 67 67 65 72 20 70  cur in trigger p
7c50: 72 6f 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20  rograms.expr(A) 
7c60: 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20  ::= RAISE(X) LP 
7c70: 49 47 4e 4f 52 45 20 52 50 28 59 29 2e 20 20 7b  IGNORE RP(Y).  {
7c80: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
7c90: 70 72 28 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20  pr(TK_RAISE, 0, 
7ca0: 30 2c 20 30 29 3b 20 0a 20 20 41 2d 3e 69 43 6f  0, 0); .  A->iCo
7cb0: 6c 75 6d 6e 20 3d 20 4f 45 5f 49 67 6e 6f 72 65  lumn = OE_Ignore
7cc0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
7cd0: 70 61 6e 28 41 2c 20 26 58 2c 20 26 59 29 3b 0a  pan(A, &X, &Y);.
7ce0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52 41  }.expr(A) ::= RA
7cf0: 49 53 45 28 58 29 20 4c 50 20 52 4f 4c 4c 42 41  ISE(X) LP ROLLBA
7d00: 43 4b 20 43 4f 4d 4d 41 20 6e 6d 28 5a 29 20 52  CK COMMA nm(Z) R
7d10: 50 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73  P(Y).  {.  A = s
7d20: 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52 41  qlite3Expr(TK_RA
7d30: 49 53 45 2c 20 30 2c 20 30 2c 20 26 5a 29 3b 20  ISE, 0, 0, &Z); 
7d40: 0a 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  .  A->iColumn = 
7d50: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 73  OE_Rollback;.  s
7d60: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 41  qlite3ExprSpan(A
7d70: 2c 20 26 58 2c 20 26 59 29 3b 0a 7d 0a 65 78 70  , &X, &Y);.}.exp
7d80: 72 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 28 58  r(A) ::= RAISE(X
7d90: 29 20 4c 50 20 41 42 4f 52 54 20 43 4f 4d 4d 41  ) LP ABORT COMMA
7da0: 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20 20 7b   nm(Z) RP(Y).  {
7db0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
7dc0: 70 72 28 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20  pr(TK_RAISE, 0, 
7dd0: 30 2c 20 26 5a 29 3b 20 0a 20 20 41 2d 3e 69 43  0, &Z); .  A->iC
7de0: 6f 6c 75 6d 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  olumn = OE_Abort
7df0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 53  ;.  sqlite3ExprS
7e00: 70 61 6e 28 41 2c 20 26 58 2c 20 26 59 29 3b 0a  pan(A, &X, &Y);.
7e10: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52 41  }.expr(A) ::= RA
7e20: 49 53 45 28 58 29 20 4c 50 20 46 41 49 4c 20 43  ISE(X) LP FAIL C
7e30: 4f 4d 4d 41 20 6e 6d 28 5a 29 20 52 50 28 59 29  OMMA nm(Z) RP(Y)
7e40: 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  .  {.  A = sqlit
7e50: 65 33 45 78 70 72 28 54 4b 5f 52 41 49 53 45 2c  e3Expr(TK_RAISE,
7e60: 20 30 2c 20 30 2c 20 26 5a 29 3b 20 0a 20 20 41   0, 0, &Z); .  A
7e70: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 4f 45 5f 46  ->iColumn = OE_F
7e80: 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ail;.  sqlite3Ex
7e90: 70 72 53 70 61 6e 28 41 2c 20 26 58 2c 20 26 59  prSpan(A, &X, &Y
7ea0: 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );.}..//////////
7eb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 20  //////////////  
7ec0: 44 52 4f 50 20 54 52 49 47 47 45 52 20 73 74 61  DROP TRIGGER sta
7ed0: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
7ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7ef0: 2f 2f 2f 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52  /////.cmd ::= DR
7f00: 4f 50 20 54 52 49 47 47 45 52 20 6e 6d 28 58 29  OP TRIGGER nm(X)
7f10: 20 64 62 6e 6d 28 44 29 2e 20 7b 0a 20 20 73 71   dbnm(D). {.  sq
7f20: 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
7f30: 28 70 50 61 72 73 65 2c 73 71 6c 69 74 65 33 53  (pParse,sqlite3S
7f40: 72 63 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26  rcListAppend(0,&
7f50: 58 2c 26 44 29 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f  X,&D));.}../////
7f60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7f70: 2f 2f 2f 20 41 54 54 41 43 48 20 44 41 54 41 42  /// ATTACH DATAB
7f80: 41 53 45 20 66 69 6c 65 20 41 53 20 6e 61 6d 65  ASE file AS name
7f90: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
7fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64 20 3a  //////////.cmd :
7fb0: 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61 62 61  := ATTACH databa
7fc0: 73 65 5f 6b 77 5f 6f 70 74 20 69 64 73 28 46 29  se_kw_opt ids(F)
7fd0: 20 41 53 20 6e 6d 28 44 29 20 6b 65 79 5f 6f 70   AS nm(D) key_op
7fe0: 74 28 4b 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  t(K). {.  sqlite
7ff0: 33 41 74 74 61 63 68 28 70 50 61 72 73 65 2c 20  3Attach(pParse, 
8000: 26 46 2c 20 26 44 2c 20 4b 2e 74 79 70 65 2c 20  &F, &D, K.type, 
8010: 26 4b 2e 6b 65 79 29 3b 0a 7d 0a 25 74 79 70 65  &K.key);.}.%type
8020: 20 6b 65 79 5f 6f 70 74 20 7b 73 74 72 75 63 74   key_opt {struct
8030: 20 41 74 74 61 63 68 4b 65 79 7d 0a 6b 65 79 5f   AttachKey}.key_
8040: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 7b 20 41 2e 74 79 70 65 20 3d 20 30 3b 20 7d   { A.type = 0; }
8070: 0a 25 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .%ifdef SQLITE_H
8080: 41 53 5f 43 4f 44 45 43 0a 6b 65 79 5f 6f 70 74  AS_CODEC.key_opt
8090: 28 41 29 20 3a 3a 3d 20 4b 45 59 20 69 64 73 28  (A) ::= KEY ids(
80a0: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20  X).           { 
80b0: 41 2e 74 79 70 65 3d 31 3b 20 41 2e 6b 65 79 20  A.type=1; A.key 
80c0: 3d 20 58 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41  = X; }.key_opt(A
80d0: 29 20 3a 3a 3d 20 4b 45 59 20 42 4c 4f 42 28 58  ) ::= KEY BLOB(X
80e0: 29 2e 20 20 20 20 20 20 20 20 20 20 7b 20 41 2e  ).          { A.
80f0: 74 79 70 65 3d 32 3b 20 41 2e 4b 65 79 20 3d 20  type=2; A.Key = 
8100: 58 3b 20 7d 0a 25 65 6e 64 69 66 0a 0a 64 61 74  X; }.%endif..dat
8110: 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d  abase_kw_opt ::=
8120: 20 44 41 54 41 42 41 53 45 2e 0a 64 61 74 61 62   DATABASE..datab
8130: 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 2e  ase_kw_opt ::= .
8140: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
8150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 44 45 54 41 43  ////////// DETAC
8160: 48 20 44 41 54 41 42 41 53 45 20 6e 61 6d 65 20  H DATABASE name 
8170: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8180: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
8190: 2f 0a 63 6d 64 20 3a 3a 3d 20 44 45 54 41 43 48  /.cmd ::= DETACH
81a0: 20 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74   database_kw_opt
81b0: 20 6e 6d 28 44 29 2e 20 7b 0a 20 20 73 71 6c 69   nm(D). {.  sqli
81c0: 74 65 33 44 65 74 61 63 68 28 70 50 61 72 73 65  te3Detach(pParse
81d0: 2c 20 26 44 29 3b 0a 7d 0a                       , &D);.}.