/ Hex Artifact Content
Login

Artifact aea0819c07ec9c81b810039df9be9d5705b1e497:


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 38 39 20 32 30 30 33 2f 30 31 2f 32 38 20 32  .89 2003/01/28 2
0290: 33 3a 31 33 3a 31 32 20 64 72 68 20 45 78 70 20  3:13:12 drh Exp 
02a0: 24 0a 2a 2f 0a 25 74 6f 6b 65 6e 5f 70 72 65 66  $.*/.%token_pref
02b0: 69 78 20 54 4b 5f 0a 25 74 6f 6b 65 6e 5f 74 79  ix TK_.%token_ty
02c0: 70 65 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66 61  pe {Token}.%defa
02d0: 75 6c 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e 7d  ult_type {Token}
02e0: 0a 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  .%extra_argument
02f0: 20 7b 50 61 72 73 65 20 2a 70 50 61 72 73 65 7d   {Parse *pParse}
0300: 0a 25 73 79 6e 74 61 78 5f 65 72 72 6f 72 20 7b  .%syntax_error {
0310: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 7a  .  if( pParse->z
0320: 45 72 72 4d 73 67 3d 3d 30 20 29 7b 0a 20 20 20  ErrMsg==0 ){.   
0330: 20 69 66 28 20 54 4f 4b 45 4e 2e 7a 5b 30 5d 20   if( TOKEN.z[0] 
0340: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
0350: 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73  etNString(&pPars
0360: 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 0a 20 20 20  e->zErrMsg, .   
0370: 20 20 20 20 20 20 20 22 6e 65 61 72 20 5c 22 22         "near \""
0380: 2c 20 2d 31 2c 20 54 4f 4b 45 4e 2e 7a 2c 20 54  , -1, TOKEN.z, T
0390: 4f 4b 45 4e 2e 6e 2c 20 22 5c 22 3a 20 73 79 6e  OKEN.n, "\": syn
03a0: 74 61 78 20 65 72 72 6f 72 22 2c 20 2d 31 2c 20  tax error", -1, 
03b0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
03c0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74       sqliteSetSt
03d0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
03e0: 72 72 4d 73 67 2c 20 22 69 6e 63 6f 6d 70 6c 65  rrMsg, "incomple
03f0: 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  te SQL statement
0400: 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", 0);.    }.  }
0410: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b  .  pParse->nErr+
0420: 2b 3b 0a 7d 0a 25 6e 61 6d 65 20 73 71 6c 69 74  +;.}.%name sqlit
0430: 65 50 61 72 73 65 72 0a 25 69 6e 63 6c 75 64 65  eParser.%include
0440: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c   {.#include "sql
0450: 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75  iteInt.h".#inclu
0460: 64 65 20 22 70 61 72 73 65 2e 68 22 0a 0a 2f 2a  de "parse.h"../*
0470: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
0480: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
0490: 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61 74  e holds informat
04a0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 0a 2a 2a  ion about the.**
04b0: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f 66   LIMIT clause of
04c0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
04d0: 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 4c  ent..*/.struct L
04e0: 69 6d 69 74 56 61 6c 20 7b 0a 20 20 69 6e 74 20  imitVal {.  int 
04f0: 6c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 54 68 65  limit;    /* The
0500: 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20 2d   LIMIT value.  -
0510: 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  1 if there is no
0520: 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20   limit */.  int 
0530: 6f 66 66 73 65 74 3b 20 20 20 2f 2a 20 54 68 65  offset;   /* The
0540: 20 4f 46 46 53 45 54 2e 20 20 30 20 69 66 20 74   OFFSET.  0 if t
0550: 68 65 72 65 20 69 73 20 6e 6f 6e 65 20 2a 2f 0a  here is none */.
0560: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
0570: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
0580: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
0590: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65   describes the e
05a0: 76 65 6e 74 20 6f 66 20 61 0a 2a 2a 20 54 52 49  vent of a.** TRI
05b0: 47 47 45 52 2e 20 20 22 61 22 20 69 73 20 74 68  GGER.  "a" is th
05c0: 65 20 65 76 65 6e 74 20 74 79 70 65 2c 20 6f 6e  e event type, on
05d0: 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c 20  e of TK_UPDATE, 
05e0: 54 4b 5f 49 4e 53 45 52 54 2c 0a 2a 2a 20 54 4b  TK_INSERT,.** TK
05f0: 5f 44 45 4c 45 54 45 2c 20 6f 72 20 54 4b 5f 49  _DELETE, or TK_I
0600: 4e 53 54 45 41 44 2e 20 20 49 66 20 74 68 65 20  NSTEAD.  If the 
0610: 65 76 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20  event is of the 
0620: 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  form.**.**      
0630: 55 50 44 41 54 45 20 4f 4e 20 28 61 2c 62 2c 63  UPDATE ON (a,b,c
0640: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ).**.** Then the
0650: 20 22 62 22 20 49 64 4c 69 73 74 20 72 65 63 6f   "b" IdList reco
0660: 72 64 73 20 74 68 65 20 6c 69 73 74 20 22 61 2c  rds the list "a,
0670: 62 2c 63 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  b,c"..*/.struct 
0680: 54 72 69 67 45 76 65 6e 74 20 7b 20 69 6e 74 20  TrigEvent { int 
0690: 61 3b 20 49 64 4c 69 73 74 20 2a 20 62 3b 20 7d  a; IdList * b; }
06a0: 3b 0a 0a 7d 20 2f 2f 20 65 6e 64 20 25 69 6e 63  ;..} // end %inc
06b0: 6c 75 64 65 0a 0a 2f 2f 20 54 68 65 73 65 20 61  lude..// These a
06c0: 72 65 20 65 78 74 72 61 20 74 6f 6b 65 6e 73 20  re extra tokens 
06d0: 75 73 65 64 20 62 79 20 74 68 65 20 6c 65 78 65  used by the lexe
06e0: 72 20 62 75 74 20 6e 65 76 65 72 20 73 65 65 6e  r but never seen
06f0: 20 62 79 20 74 68 65 0a 2f 2f 20 70 61 72 73 65   by the.// parse
0700: 72 2e 20 20 57 65 20 70 75 74 20 74 68 65 6d 20  r.  We put them 
0710: 69 6e 20 61 20 72 75 6c 65 20 73 6f 20 74 68 61  in a rule so tha
0720: 74 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e  t the parser gen
0730: 65 72 61 74 6f 72 20 77 69 6c 6c 0a 2f 2f 20 61  erator will.// a
0740: 64 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 70  dd them to the p
0750: 61 72 73 65 2e 68 20 6f 75 74 70 75 74 20 66 69  arse.h output fi
0760: 6c 65 2e 0a 2f 2f 0a 25 6e 6f 6e 61 73 73 6f 63  le..//.%nonassoc
0770: 20 45 4e 44 5f 4f 46 5f 46 49 4c 45 20 49 4c 4c   END_OF_FILE ILL
0780: 45 47 41 4c 20 53 50 41 43 45 20 55 4e 43 4c 4f  EGAL SPACE UNCLO
0790: 53 45 44 5f 53 54 52 49 4e 47 20 43 4f 4d 4d 45  SED_STRING COMME
07a0: 4e 54 20 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20  NT FUNCTION.    
07b0: 20 20 20 20 20 20 43 4f 4c 55 4d 4e 20 41 47 47        COLUMN AGG
07c0: 5f 46 55 4e 43 54 49 4f 4e 2e 0a 0a 2f 2f 20 49  _FUNCTION...// I
07d0: 6e 70 75 74 20 69 73 20 7a 65 72 6f 20 6f 72 20  nput is zero or 
07e0: 6d 6f 72 65 20 63 6f 6d 6d 61 6e 64 73 2e 0a 69  more commands..i
07f0: 6e 70 75 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74  nput ::= cmdlist
0800: 2e 0a 0a 2f 2f 20 41 20 6c 69 73 74 20 6f 66 20  ...// A list of 
0810: 63 6f 6d 6d 61 6e 64 73 20 69 73 20 7a 65 72 6f  commands is zero
0820: 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 6d 61 6e 64   or more command
0830: 73 0a 2f 2f 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d  s.//.cmdlist ::=
0840: 20 65 63 6d 64 2e 0a 63 6d 64 6c 69 73 74 20 3a   ecmd..cmdlist :
0850: 3a 3d 20 63 6d 64 6c 69 73 74 20 65 63 6d 64 2e  := cmdlist ecmd.
0860: 0a 65 63 6d 64 20 3a 3a 3d 20 65 78 70 6c 61 69  .ecmd ::= explai
0870: 6e 20 63 6d 64 20 53 45 4d 49 2e 20 20 7b 73 71  n cmd SEMI.  {sq
0880: 6c 69 74 65 45 78 65 63 28 70 50 61 72 73 65 29  liteExec(pParse)
0890: 3b 7d 0a 65 63 6d 64 20 3a 3a 3d 20 53 45 4d 49  ;}.ecmd ::= SEMI
08a0: 2e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58  ..explain ::= EX
08b0: 50 4c 41 49 4e 2e 20 20 20 20 7b 20 73 71 6c 69  PLAIN.    { sqli
08c0: 74 65 42 65 67 69 6e 50 61 72 73 65 28 70 50 61  teBeginParse(pPa
08d0: 72 73 65 2c 20 31 29 3b 20 7d 0a 65 78 70 6c 61  rse, 1); }.expla
08e0: 69 6e 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  in ::= .        
08f0: 20 20 20 7b 20 73 71 6c 69 74 65 42 65 67 69 6e     { sqliteBegin
0900: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 30 29  Parse(pParse, 0)
0910: 3b 20 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ; }..///////////
0920: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69 6e  ////////// Begin
0930: 20 61 6e 64 20 65 6e 64 20 74 72 61 6e 73 61 63   and end transac
0940: 74 69 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tions. /////////
0950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0960: 2f 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20  ///.//..cmd ::= 
0970: 42 45 47 49 4e 20 74 72 61 6e 73 5f 6f 70 74 20  BEGIN trans_opt 
0980: 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 7b 73 71 6c  onconf(R).  {sql
0990: 69 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74  iteBeginTransact
09a0: 69 6f 6e 28 70 50 61 72 73 65 2c 52 29 3b 7d 0a  ion(pParse,R);}.
09b0: 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 2e 0a  trans_opt ::= ..
09c0: 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52  trans_opt ::= TR
09d0: 41 4e 53 41 43 54 49 4f 4e 2e 0a 74 72 61 6e 73  ANSACTION..trans
09e0: 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41 43  _opt ::= TRANSAC
09f0: 54 49 4f 4e 20 6e 6d 2e 0a 63 6d 64 20 3a 3a 3d  TION nm..cmd ::=
0a00: 20 43 4f 4d 4d 49 54 20 74 72 61 6e 73 5f 6f 70   COMMIT trans_op
0a10: 74 2e 20 20 20 20 20 20 7b 73 71 6c 69 74 65 43  t.      {sqliteC
0a20: 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
0a30: 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a  (pParse);}.cmd :
0a40: 3a 3d 20 45 4e 44 20 74 72 61 6e 73 5f 6f 70 74  := END trans_opt
0a50: 2e 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74  .         {sqlit
0a60: 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  eCommitTransacti
0a70: 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64  on(pParse);}.cmd
0a80: 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 20 74 72   ::= ROLLBACK tr
0a90: 61 6e 73 5f 6f 70 74 2e 20 20 20 20 7b 73 71 6c  ans_opt.    {sql
0aa0: 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  iteRollbackTrans
0ab0: 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d  action(pParse);}
0ac0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
0ad0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41  /////// The CREA
0ae0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
0af0: 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nt /////////////
0b00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
0b10: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74  //.cmd ::= creat
0b20: 65 5f 74 61 62 6c 65 20 63 72 65 61 74 65 5f 74  e_table create_t
0b30: 61 62 6c 65 5f 61 72 67 73 2e 0a 63 72 65 61 74  able_args..creat
0b40: 65 5f 74 61 62 6c 65 20 3a 3a 3d 20 43 52 45 41  e_table ::= CREA
0b50: 54 45 28 58 29 20 74 65 6d 70 28 54 29 20 54 41  TE(X) temp(T) TA
0b60: 42 4c 45 20 6e 6d 28 59 29 2e 20 7b 0a 20 20 20  BLE nm(Y). {.   
0b70: 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c 65  sqliteStartTable
0b80: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 54 2c  (pParse,&X,&Y,T,
0b90: 30 29 3b 0a 7d 0a 25 74 79 70 65 20 74 65 6d 70  0);.}.%type temp
0ba0: 20 7b 69 6e 74 7d 0a 74 65 6d 70 28 41 29 20 3a   {int}.temp(A) :
0bb0: 3a 3d 20 54 45 4d 50 2e 20 20 7b 41 20 3d 20 70  := TEMP.  {A = p
0bc0: 50 61 72 73 65 2d 3e 69 73 54 65 6d 70 20 7c 7c  Parse->isTemp ||
0bd0: 20 21 70 50 61 72 73 65 2d 3e 69 6e 69 74 46 6c   !pParse->initFl
0be0: 61 67 3b 7d 0a 74 65 6d 70 28 41 29 20 3a 3a 3d  ag;}.temp(A) ::=
0bf0: 20 2e 20 20 20 20 20 20 7b 41 20 3d 20 70 50 61   .      {A = pPa
0c00: 72 73 65 2d 3e 69 73 54 65 6d 70 3b 7d 0a 63 72  rse->isTemp;}.cr
0c10: 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 20  eate_table_args 
0c20: 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e 6c 69 73  ::= LP columnlis
0c30: 74 20 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 52  t conslist_opt R
0c40: 50 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  P(X). {.  sqlite
0c50: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
0c60: 26 58 2c 30 29 3b 0a 7d 0a 63 72 65 61 74 65 5f  &X,0);.}.create_
0c70: 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 41  table_args ::= A
0c80: 53 20 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20  S select(S). {. 
0c90: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
0ca0: 70 50 61 72 73 65 2c 30 2c 53 29 3b 0a 20 20 73  pParse,0,S);.  s
0cb0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
0cc0: 65 28 53 29 3b 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69  e(S);.}.columnli
0cd0: 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73  st ::= columnlis
0ce0: 74 20 43 4f 4d 4d 41 20 63 6f 6c 75 6d 6e 2e 0a  t COMMA column..
0cf0: 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63  columnlist ::= c
0d00: 6f 6c 75 6d 6e 2e 0a 0a 2f 2f 20 41 62 6f 75 74  olumn...// About
0d10: 20 74 68 65 20 6f 6e 6c 79 20 69 6e 66 6f 72 6d   the only inform
0d20: 61 74 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 61  ation used for a
0d30: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 6e   column is the n
0d40: 61 6d 65 20 6f 66 20 74 68 65 0a 2f 2f 20 63 6f  ame of the.// co
0d50: 6c 75 6d 6e 2e 20 20 54 68 65 20 74 79 70 65 20  lumn.  The type 
0d60: 69 73 20 61 6c 77 61 79 73 20 6a 75 73 74 20 22  is always just "
0d70: 74 65 78 74 22 2e 20 20 42 75 74 20 74 68 65 20  text".  But the 
0d80: 63 6f 64 65 20 77 69 6c 6c 20 61 63 63 65 70 74  code will accept
0d90: 0a 2f 2f 20 61 6e 20 65 6c 61 62 6f 72 61 74 65  .// an elaborate
0da0: 20 74 79 70 65 6e 61 6d 65 2e 20 20 50 65 72 68   typename.  Perh
0db0: 61 70 73 20 73 6f 6d 65 64 61 79 20 77 65 27 6c  aps someday we'l
0dc0: 6c 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  l do something w
0dd0: 69 74 68 20 69 74 2e 0a 2f 2f 0a 63 6f 6c 75 6d  ith it..//.colum
0de0: 6e 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 69 64 20 74  n ::= columnid t
0df0: 79 70 65 20 63 61 72 67 6c 69 73 74 2e 20 0a 63  ype carglist. .c
0e00: 6f 6c 75 6d 6e 69 64 20 3a 3a 3d 20 6e 6d 28 58  olumnid ::= nm(X
0e10: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
0e20: 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f 6c 75    {sqliteAddColu
0e30: 6d 6e 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a  mn(pParse,&X);}.
0e40: 0a 2f 2f 20 41 6e 20 49 44 45 4e 54 49 46 49 45  .// An IDENTIFIE
0e50: 52 20 63 61 6e 20 62 65 20 61 20 67 65 6e 65 72  R can be a gener
0e60: 69 63 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6f  ic identifier, o
0e70: 72 20 6f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  r one of several
0e80: 0a 2f 2f 20 6b 65 79 77 6f 72 64 73 2e 20 20 41  .// keywords.  A
0e90: 6e 79 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20  ny non-standard 
0ea0: 6b 65 79 77 6f 72 64 20 63 61 6e 20 61 6c 73 6f  keyword can also
0eb0: 20 62 65 20 61 6e 20 69 64 65 6e 74 69 66 69 65   be an identifie
0ec0: 72 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64 20 7b  r..//.%type id {
0ed0: 54 6f 6b 65 6e 7d 0a 69 64 28 41 29 20 3a 3a 3d  Token}.id(A) ::=
0ee0: 20 49 44 28 58 29 2e 20 20 20 20 20 20 20 20 20   ID(X).         
0ef0: 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65  {A = X;}..// The
0f00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 72 65 63   following direc
0f10: 74 69 76 65 20 63 61 75 73 65 73 20 74 6f 6b 65  tive causes toke
0f20: 6e 73 20 41 42 4f 52 54 2c 20 41 46 54 45 52 2c  ns ABORT, AFTER,
0f30: 20 41 53 43 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f   ASC, etc. to.//
0f40: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 49 44 20   fallback to ID 
0f50: 69 66 20 74 68 65 79 20 77 69 6c 6c 20 6e 6f 74  if they will not
0f60: 20 70 61 72 73 65 20 61 73 20 74 68 65 69 72 20   parse as their 
0f70: 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 2e 0a  original value..
0f80: 2f 2f 20 54 68 69 73 20 6f 62 76 69 61 74 65 73  // This obviates
0f90: 20 74 68 65 20 6e 65 65 64 20 66 6f 72 20 74 68   the need for th
0fa0: 65 20 22 69 64 22 20 6e 6f 6e 74 65 72 6d 69 6e  e "id" nontermin
0fb0: 61 6c 2e 0a 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b  al..//.%fallback
0fc0: 20 49 44 20 0a 20 20 41 42 4f 52 54 20 41 46 54   ID .  ABORT AFT
0fd0: 45 52 20 41 53 43 20 42 45 46 4f 52 45 20 42 45  ER ASC 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 43  TER CONFLICT.  C
1000: 4f 50 59 20 44 45 46 45 52 52 45 44 20 44 45 4c  OPY DEFERRED DEL
1010: 49 4d 49 54 45 52 53 20 44 45 53 43 20 45 41 43  IMITERS DESC 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 49 47 4e 4f 52 45 20  IL FOR.  IGNORE 
1040: 49 4d 4d 45 44 49 41 54 45 20 49 4e 49 54 49 41  IMMEDIATE INITIA
1050: 4c 4c 59 20 49 4e 53 54 45 41 44 20 4d 41 54 43  LLY INSTEAD MATC
1060: 48 20 4b 45 59 0a 20 20 4f 46 20 4f 46 46 53 45  H KEY.  OF OFFSE
1070: 54 20 50 52 41 47 4d 41 20 52 41 49 53 45 20 52  T PRAGMA RAISE R
1080: 45 50 4c 41 43 45 20 52 45 53 54 52 49 43 54 20  EPLACE RESTRICT 
1090: 52 4f 57 20 53 54 41 54 45 4d 45 4e 54 0a 20 20  ROW STATEMENT.  
10a0: 54 45 4d 50 20 54 52 49 47 47 45 52 20 56 41 43  TEMP TRIGGER VAC
10b0: 55 55 4d 20 56 49 45 57 2e 0a 0a 2f 2f 20 41 6e  UUM VIEW...// An
10c0: 64 20 22 69 64 73 22 20 69 73 20 61 6e 20 69 64  d "ids" is an id
10d0: 65 6e 74 69 66 65 72 2d 6f 72 2d 73 74 72 69 6e  entifer-or-strin
10e0: 67 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64 73 20  g..//.%type ids 
10f0: 7b 54 6f 6b 65 6e 7d 0a 69 64 73 28 41 29 20 3a  {Token}.ids(A) :
1100: 3a 3d 20 49 44 28 58 29 2e 20 20 20 20 20 20 20  := ID(X).       
1110: 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 73 28 41 29   {A = X;}.ids(A)
1120: 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20   ::= STRING(X). 
1130: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20     {A = X;}..// 
1140: 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  The name of a co
1150: 6c 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20 63 61  lumn or table ca
1160: 6e 20 62 65 20 61 6e 79 20 6f 66 20 74 68 65 20  n be any of the 
1170: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a 25 74  following:.//.%t
1180: 79 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e  ype nm {Token}.n
1190: 6d 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20  m(A) ::= ID(X). 
11a0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
11b0: 0a 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e  .nm(A) ::= STRIN
11c0: 47 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58  G(X).     {A = X
11d0: 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a 4f 49  ;}.nm(A) ::= JOI
11e0: 4e 5f 4b 57 28 58 29 2e 20 20 20 20 7b 41 20 3d  N_KW(X).    {A =
11f0: 20 58 3b 7d 0a 0a 74 79 70 65 20 3a 3a 3d 20 2e   X;}..type ::= .
1200: 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61  .type ::= typena
1210: 6d 65 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  me(X).          
1220: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
1230: 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70  eAddColumnType(p
1240: 50 61 72 73 65 2c 26 58 2c 26 58 29 3b 7d 0a 74  Parse,&X,&X);}.t
1250: 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65  ype ::= typename
1260: 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20 52 50  (X) LP signed RP
1270: 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74 65 41  (Y).    {sqliteA
1280: 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70 50 61  ddColumnType(pPa
1290: 72 73 65 2c 26 58 2c 26 59 29 3b 7d 0a 74 79 70  rse,&X,&Y);}.typ
12a0: 65 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58  e ::= typename(X
12b0: 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d 4d  ) LP signed COMM
12c0: 41 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e 0a  A signed RP(Y)..
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1300: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70 50  AddColumnType(pP
1310: 61 72 73 65 2c 26 58 2c 26 59 29 3b 7d 0a 25 74  arse,&X,&Y);}.%t
1320: 79 70 65 20 74 79 70 65 6e 61 6d 65 20 7b 54 6f  ype typename {To
1330: 6b 65 6e 7d 0a 74 79 70 65 6e 61 6d 65 28 41 29  ken}.typename(A)
1340: 20 3a 3a 3d 20 69 64 73 28 58 29 2e 20 20 20 20   ::= ids(X).    
1350: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
1360: 74 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20  typename(A) ::= 
1370: 74 79 70 65 6e 61 6d 65 28 58 29 20 69 64 73 2e  typename(X) ids.
1380: 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 69 67 6e 65    {A = X;}.signe
1390: 64 20 3a 3a 3d 20 49 4e 54 45 47 45 52 2e 0a 73  d ::= INTEGER..s
13a0: 69 67 6e 65 64 20 3a 3a 3d 20 50 4c 55 53 20 49  igned ::= PLUS I
13b0: 4e 54 45 47 45 52 2e 0a 73 69 67 6e 65 64 20 3a  NTEGER..signed :
13c0: 3a 3d 20 4d 49 4e 55 53 20 49 4e 54 45 47 45 52  := MINUS INTEGER
13d0: 2e 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20 63  ..carglist ::= c
13e0: 61 72 67 6c 69 73 74 20 63 61 72 67 2e 0a 63 61  arglist carg..ca
13f0: 72 67 6c 69 73 74 20 3a 3a 3d 20 2e 0a 63 61 72  rglist ::= ..car
1400: 67 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54  g ::= CONSTRAINT
1410: 20 6e 6d 20 63 63 6f 6e 73 2e 0a 63 61 72 67 20   nm ccons..carg 
1420: 3a 3a 3d 20 63 63 6f 6e 73 2e 0a 63 61 72 67 20  ::= ccons..carg 
1430: 3a 3a 3d 20 44 45 46 41 55 4c 54 20 53 54 52 49  ::= DEFAULT STRI
1440: 4e 47 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  NG(X).          
1450: 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c  {sqliteAddDefaul
1460: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58  tValue(pParse,&X
1470: 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44  ,0);}.carg ::= D
1480: 45 46 41 55 4c 54 20 49 44 28 58 29 2e 20 20 20  EFAULT ID(X).   
1490: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
14a0: 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  teAddDefaultValu
14b0: 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d  e(pParse,&X,0);}
14c0: 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c  .carg ::= DEFAUL
14d0: 54 20 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20  T INTEGER(X).   
14e0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64        {sqliteAdd
14f0: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61  DefaultValue(pPa
1500: 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67  rse,&X,0);}.carg
1510: 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50 4c 55   ::= DEFAULT PLU
1520: 53 20 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20  S INTEGER(X).   
1530: 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61 75   {sqliteAddDefau
1540: 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26  ltValue(pParse,&
1550: 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20  X,0);}.carg ::= 
1560: 44 45 46 41 55 4c 54 20 4d 49 4e 55 53 20 49 4e  DEFAULT MINUS IN
1570: 54 45 47 45 52 28 58 29 2e 20 20 20 7b 73 71 6c  TEGER(X).   {sql
1580: 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c  iteAddDefaultVal
1590: 75 65 28 70 50 61 72 73 65 2c 26 58 2c 31 29 3b  ue(pParse,&X,1);
15a0: 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55  }.carg ::= DEFAU
15b0: 4c 54 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20  LT FLOAT(X).    
15c0: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 41 64         {sqliteAd
15d0: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50  dDefaultValue(pP
15e0: 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72  arse,&X,0);}.car
15f0: 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50 4c  g ::= DEFAULT PL
1600: 55 53 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20  US FLOAT(X).    
1610: 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61    {sqliteAddDefa
1620: 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  ultValue(pParse,
1630: 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d  &X,0);}.carg ::=
1640: 20 44 45 46 41 55 4c 54 20 4d 49 4e 55 53 20 46   DEFAULT MINUS F
1650: 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 7b 73 71  LOAT(X).     {sq
1660: 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61  liteAddDefaultVa
1670: 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c 31 29  lue(pParse,&X,1)
1680: 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41  ;}.carg ::= DEFA
1690: 55 4c 54 20 4e 55 4c 4c 2e 20 0a 0a 2f 2f 20 49  ULT NULL. ..// I
16a0: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 74 68  n addition to th
16b0: 65 20 74 79 70 65 20 6e 61 6d 65 2c 20 77 65 20  e type name, we 
16c0: 61 6c 73 6f 20 63 61 72 65 20 61 62 6f 75 74 20  also care about 
16d0: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
16e0: 61 6e 64 0a 2f 2f 20 55 4e 49 51 55 45 20 63 6f  and.// UNIQUE co
16f0: 6e 73 74 72 61 69 6e 74 73 2e 0a 2f 2f 0a 63 63  nstraints..//.cc
1700: 6f 6e 73 20 3a 3a 3d 20 4e 55 4c 4c 20 6f 6e 63  ons ::= NULL onc
1710: 6f 6e 66 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e  onf..ccons ::= N
1720: 4f 54 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 28 52  OT NULL onconf(R
1730: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
1740: 20 7b 73 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75   {sqliteAddNotNu
1750: 6c 6c 28 70 50 61 72 73 65 2c 20 52 29 3b 7d 0a  ll(pParse, R);}.
1760: 63 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52  ccons ::= PRIMAR
1770: 59 20 4b 45 59 20 73 6f 72 74 6f 72 64 65 72 20  Y KEY sortorder 
1780: 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 7b 73 71 6c  onconf(R).  {sql
1790: 69 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79  iteAddPrimaryKey
17a0: 28 70 50 61 72 73 65 2c 30 2c 52 29 3b 7d 0a 63  (pParse,0,R);}.c
17b0: 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20  cons ::= UNIQUE 
17c0: 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20 20 20  onconf(R).      
17d0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 43 72 65        {sqliteCre
17e0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
17f0: 30 2c 30 2c 30 2c 52 2c 30 2c 30 29 3b 7d 0a 63  0,0,0,R,0,0);}.c
1800: 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20 4c  cons ::= CHECK L
1810: 50 20 65 78 70 72 20 52 50 20 6f 6e 63 6f 6e 66  P expr RP onconf
1820: 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 52 45 46 45  ..ccons ::= REFE
1830: 52 45 4e 43 45 53 20 6e 6d 28 54 29 20 69 64 78  RENCES nm(T) idx
1840: 6c 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66  list_opt(TA) ref
1850: 61 72 67 73 28 52 29 2e 0a 20 20 20 20 20 20 20  args(R)..       
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1880: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
1890: 28 70 50 61 72 73 65 2c 30 2c 26 54 2c 54 41 2c  (pParse,0,&T,TA,
18a0: 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 64  R);}.ccons ::= d
18b0: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 44  efer_subclause(D
18c0: 29 2e 20 20 20 7b 73 71 6c 69 74 65 44 65 66 65  ).   {sqliteDefe
18d0: 72 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72  rForeignKey(pPar
18e0: 73 65 2c 44 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  se,D);}.ccons ::
18f0: 3d 20 43 4f 4c 4c 41 54 45 20 69 64 28 43 29 2e  = COLLATE id(C).
1900: 20 20 7b 0a 20 20 20 73 71 6c 69 74 65 41 64 64    {.   sqliteAdd
1910: 43 6f 6c 6c 61 74 65 54 79 70 65 28 70 50 61 72  CollateType(pPar
1920: 73 65 2c 20 73 71 6c 69 74 65 43 6f 6c 6c 61 74  se, sqliteCollat
1930: 65 54 79 70 65 28 43 2e 7a 2c 20 43 2e 6e 29 29  eType(C.z, C.n))
1940: 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20 6e 65 78 74  ;.}..// The next
1950: 20 67 72 6f 75 70 20 6f 66 20 72 75 6c 65 73 20   group of rules 
1960: 70 61 72 73 65 73 20 74 68 65 20 61 72 67 75 6d  parses the argum
1970: 65 6e 74 73 20 74 6f 20 61 20 52 45 46 45 52 45  ents to a REFERE
1980: 4e 43 45 53 20 63 6c 61 75 73 65 0a 2f 2f 20 74  NCES clause.// t
1990: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hat determine if
19a0: 20 74 68 65 20 72 65 66 65 72 65 6e 74 69 61 6c   the referential
19b0: 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
19c0: 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 20  ing is deferred 
19d0: 6f 72 0a 2f 2f 20 6f 72 20 69 6d 6d 65 64 69 61  or.// or immedia
19e0: 74 65 20 61 6e 64 20 77 68 69 63 68 20 64 65 74  te and which det
19f0: 65 72 6d 69 6e 65 20 77 68 61 74 20 61 63 74 69  ermine what acti
1a00: 6f 6e 20 74 6f 20 74 61 6b 65 20 69 66 20 61 20  on to take if a 
1a10: 72 65 66 2d 69 6e 74 65 67 0a 2f 2f 20 63 68 65  ref-integ.// che
1a20: 63 6b 20 66 61 69 6c 73 2e 0a 2f 2f 0a 25 74 79  ck fails..//.%ty
1a30: 70 65 20 72 65 66 61 72 67 73 20 7b 69 6e 74 7d  pe refargs {int}
1a40: 0a 72 65 66 61 72 67 73 28 41 29 20 3a 3a 3d 20  .refargs(A) ::= 
1a50: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a60: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 52        { A = OE_R
1a70: 65 73 74 72 69 63 74 20 2a 20 30 78 30 31 30 31  estrict * 0x0101
1a80: 30 31 3b 20 7d 0a 72 65 66 61 72 67 73 28 41 29  01; }.refargs(A)
1a90: 20 3a 3a 3d 20 72 65 66 61 72 67 73 28 58 29 20   ::= refargs(X) 
1aa0: 72 65 66 61 72 67 28 59 29 2e 20 7b 20 41 20 3d  refarg(Y). { A =
1ab0: 20 28 58 20 26 20 59 2e 6d 61 73 6b 29 20 7c 20   (X & Y.mask) | 
1ac0: 59 2e 76 61 6c 75 65 3b 20 7d 0a 25 74 79 70 65  Y.value; }.%type
1ad0: 20 72 65 66 61 72 67 20 7b 73 74 72 75 63 74 20   refarg {struct 
1ae0: 7b 69 6e 74 20 76 61 6c 75 65 3b 20 69 6e 74 20  {int value; int 
1af0: 6d 61 73 6b 3b 7d 7d 0a 72 65 66 61 72 67 28 41  mask;}}.refarg(A
1b00: 29 20 3a 3a 3d 20 4d 41 54 43 48 20 6e 6d 2e 20  ) ::= MATCH nm. 
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
1b20: 2e 76 61 6c 75 65 20 3d 20 30 3b 20 20 20 20 20  .value = 0;     
1b30: 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 30  A.mask = 0x00000
1b40: 30 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a  0; }.refarg(A) :
1b50: 3a 3d 20 4f 4e 20 44 45 4c 45 54 45 20 72 65 66  := ON DELETE ref
1b60: 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e 76 61  act(X).   { A.va
1b70: 6c 75 65 20 3d 20 58 3b 20 20 20 20 20 41 2e 6d  lue = X;     A.m
1b80: 61 73 6b 20 3d 20 30 78 30 30 30 30 66 66 3b 20  ask = 0x0000ff; 
1b90: 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20  }.refarg(A) ::= 
1ba0: 4f 4e 20 55 50 44 41 54 45 20 72 65 66 61 63 74  ON UPDATE refact
1bb0: 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65  (X).   { A.value
1bc0: 20 3d 20 58 3c 3c 38 3b 20 20 41 2e 6d 61 73 6b   = X<<8;  A.mask
1bd0: 20 3d 20 30 78 30 30 66 66 30 30 3b 20 7d 0a 72   = 0x00ff00; }.r
1be0: 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20  efarg(A) ::= ON 
1bf0: 49 4e 53 45 52 54 20 72 65 66 61 63 74 28 58 29  INSERT refact(X)
1c00: 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20  .   { A.value = 
1c10: 58 3c 3c 31 36 3b 20 41 2e 6d 61 73 6b 20 3d 20  X<<16; A.mask = 
1c20: 30 78 66 66 30 30 30 30 3b 20 7d 0a 25 74 79 70  0xff0000; }.%typ
1c30: 65 20 72 65 66 61 63 74 20 7b 69 6e 74 7d 0a 72  e refact {int}.r
1c40: 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45 54  efact(A) ::= SET
1c50: 20 4e 55 4c 4c 2e 20 20 20 20 20 20 20 20 20 20   NULL.          
1c60: 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74      { A = OE_Set
1c70: 4e 75 6c 6c 3b 20 7d 0a 72 65 66 61 63 74 28 41  Null; }.refact(A
1c80: 29 20 3a 3a 3d 20 53 45 54 20 44 45 46 41 55 4c  ) ::= SET DEFAUL
1c90: 54 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20 41  T.           { A
1ca0: 20 3d 20 4f 45 5f 53 65 74 44 66 6c 74 3b 20 7d   = OE_SetDflt; }
1cb0: 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 43  .refact(A) ::= C
1cc0: 41 53 43 41 44 45 2e 20 20 20 20 20 20 20 20 20  ASCADE.         
1cd0: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 43        { A = OE_C
1ce0: 61 73 63 61 64 65 3b 20 7d 0a 72 65 66 61 63 74  ascade; }.refact
1cf0: 28 41 29 20 3a 3a 3d 20 52 45 53 54 52 49 43 54  (A) ::= RESTRICT
1d00: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
1d10: 20 41 20 3d 20 4f 45 5f 52 65 73 74 72 69 63 74   A = OE_Restrict
1d20: 3b 20 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f  ; }.%type defer_
1d30: 73 75 62 63 6c 61 75 73 65 20 7b 69 6e 74 7d 0a  subclause {int}.
1d40: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28  defer_subclause(
1d50: 41 29 20 3a 3a 3d 20 4e 4f 54 20 44 45 46 45 52  A) ::= NOT DEFER
1d60: 52 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72  RABLE init_defer
1d70: 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 58 29 2e  red_pred_opt(X).
1d80: 20 20 7b 41 20 3d 20 58 3b 7d 0a 64 65 66 65 72    {A = X;}.defer
1d90: 5f 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a  _subclause(A) ::
1da0: 3d 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e 69  = DEFERRABLE ini
1db0: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f  t_deferred_pred_
1dc0: 6f 70 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20  opt(X).      {A 
1dd0: 3d 20 58 3b 7d 0a 25 74 79 70 65 20 69 6e 69 74  = X;}.%type init
1de0: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f  _deferred_pred_o
1df0: 70 74 20 7b 69 6e 74 7d 0a 69 6e 69 74 5f 64 65  pt {int}.init_de
1e00: 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28  ferred_pred_opt(
1e10: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1e30: 41 20 3d 20 30 3b 7d 0a 69 6e 69 74 5f 64 65 66  A = 0;}.init_def
1e40: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41  erred_pred_opt(A
1e50: 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20  ) ::= INITIALLY 
1e60: 44 45 46 45 52 52 45 44 2e 20 20 20 20 20 7b 41  DEFERRED.     {A
1e70: 20 3d 20 31 3b 7d 0a 69 6e 69 74 5f 64 65 66 65   = 1;}.init_defe
1e80: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29  rred_pred_opt(A)
1e90: 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 49   ::= INITIALLY I
1ea0: 4d 4d 45 44 49 41 54 45 2e 20 20 20 20 7b 41 20  MMEDIATE.    {A 
1eb0: 3d 20 30 3b 7d 0a 0a 2f 2f 20 46 6f 72 20 74 68  = 0;}..// For th
1ec0: 65 20 74 69 6d 65 20 62 65 69 6e 67 2c 20 74 68  e time being, th
1ed0: 65 20 6f 6e 6c 79 20 63 6f 6e 73 74 72 61 69 6e  e only constrain
1ee0: 74 20 77 65 20 63 61 72 65 20 61 62 6f 75 74 20  t we care about 
1ef0: 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 0a 2f  is the primary./
1f00: 2f 20 6b 65 79 20 61 6e 64 20 55 4e 49 51 55 45  / key and UNIQUE
1f10: 2e 20 20 42 6f 74 68 20 63 72 65 61 74 65 20 69  .  Both create i
1f20: 6e 64 69 63 65 73 2e 0a 2f 2f 0a 63 6f 6e 73 6c  ndices..//.consl
1f30: 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 63 6f  ist_opt ::= ..co
1f40: 6e 73 6c 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 43  nslist_opt ::= C
1f50: 4f 4d 4d 41 20 63 6f 6e 73 6c 69 73 74 2e 0a 63  OMMA conslist..c
1f60: 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e 73  onslist ::= cons
1f70: 6c 69 73 74 20 43 4f 4d 4d 41 20 74 63 6f 6e 73  list COMMA tcons
1f80: 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 63  ..conslist ::= c
1f90: 6f 6e 73 6c 69 73 74 20 74 63 6f 6e 73 2e 0a 63  onslist tcons..c
1fa0: 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 74 63 6f 6e  onslist ::= tcon
1fb0: 73 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e  s..tcons ::= CON
1fc0: 53 54 52 41 49 4e 54 20 6e 6d 2e 0a 74 63 6f 6e  STRAINT nm..tcon
1fd0: 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45  s ::= PRIMARY KE
1fe0: 59 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20  Y LP idxlist(X) 
1ff0: 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20  RP onconf(R)..  
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
2030: 74 65 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  teAddPrimaryKey(
2040: 70 50 61 72 73 65 2c 58 2c 52 29 3b 7d 0a 74 63  pParse,X,R);}.tc
2050: 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 4c  ons ::= UNIQUE L
2060: 50 20 69 64 78 6c 69 73 74 28 58 29 20 52 50 20  P idxlist(X) RP 
2070: 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20  onconf(R)..     
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 7b 73 71 6c 69 74 65 43 72 65 61 74 65 49    {sqliteCreateI
20b0: 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c  ndex(pParse,0,0,
20c0: 58 2c 52 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e 73  X,R,0,0);}.tcons
20d0: 20 3a 3a 3d 20 43 48 45 43 4b 20 65 78 70 72 20   ::= CHECK expr 
20e0: 6f 6e 63 6f 6e 66 2e 0a 74 63 6f 6e 73 20 3a 3a  onconf..tcons ::
20f0: 3d 20 46 4f 52 45 49 47 4e 20 4b 45 59 20 4c 50  = FOREIGN KEY LP
2100: 20 69 64 78 6c 69 73 74 28 46 41 29 20 52 50 0a   idxlist(FA) RP.
2110: 20 20 20 20 20 20 20 20 20 20 52 45 46 45 52 45            REFERE
2120: 4e 43 45 53 20 6e 6d 28 54 29 20 69 64 78 6c 69  NCES nm(T) idxli
2130: 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66 61 72  st_opt(TA) refar
2140: 67 73 28 52 29 20 64 65 66 65 72 5f 73 75 62 63  gs(R) defer_subc
2150: 6c 61 75 73 65 5f 6f 70 74 28 44 29 2e 20 7b 0a  lause_opt(D). {.
2160: 20 20 20 20 73 71 6c 69 74 65 43 72 65 61 74 65      sqliteCreate
2170: 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73  ForeignKey(pPars
2180: 65 2c 20 46 41 2c 20 26 54 2c 20 54 41 2c 20 52  e, FA, &T, TA, R
2190: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 66  );.    sqliteDef
21a0: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61  erForeignKey(pPa
21b0: 72 73 65 2c 20 44 29 3b 0a 7d 0a 25 74 79 70 65  rse, D);.}.%type
21c0: 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65   defer_subclause
21d0: 5f 6f 70 74 20 7b 69 6e 74 7d 0a 64 65 66 65 72  _opt {int}.defer
21e0: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 41  _subclause_opt(A
21f0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
2200: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2210: 30 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61  0;}.defer_subcla
2220: 75 73 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 64  use_opt(A) ::= d
2230: 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 58  efer_subclause(X
2240: 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f  ).  {A = X;}..//
2250: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
2260: 73 20 61 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64  s a non-standard
2270: 20 65 78 74 65 6e 73 69 6f 6e 20 74 68 61 74 20   extension that 
2280: 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 64 65 63  allows us to dec
2290: 6c 61 72 65 20 74 68 65 0a 2f 2f 20 64 65 66 61  lare the.// defa
22a0: 75 6c 74 20 62 65 68 61 76 69 6f 72 20 77 68 65  ult behavior whe
22b0: 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e  n there is a con
22c0: 73 74 72 61 69 6e 74 20 63 6f 6e 66 6c 69 63 74  straint conflict
22d0: 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f 6e 63 6f 6e  ..//.%type oncon
22e0: 66 20 7b 69 6e 74 7d 0a 25 74 79 70 65 20 6f 72  f {int}.%type or
22f0: 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 70 65  conf {int}.%type
2300: 20 72 65 73 6f 6c 76 65 74 79 70 65 20 7b 69 6e   resolvetype {in
2310: 74 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20 3a 3a 3d  t}.onconf(A) ::=
2320: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 7b 20 41 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74  { A = OE_Default
2350: 3b 20 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20 3a 3a  ; }.onconf(A) ::
2360: 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 72 65  = ON CONFLICT re
2370: 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20 20  solvetype(X).   
2380: 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 6f 72 63 6f   { A = X; }.orco
2390: 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  nf(A) ::= .     
23a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b0: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f           { A = O
23c0: 45 5f 44 65 66 61 75 6c 74 3b 20 7d 0a 6f 72 63  E_Default; }.orc
23d0: 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72 65  onf(A) ::= OR re
23e0: 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20 20  solvetype(X).   
23f0: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
2400: 58 3b 20 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65  X; }.resolvetype
2410: 28 41 29 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b  (A) ::= ROLLBACK
2420: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2430: 20 20 7b 20 41 20 3d 20 4f 45 5f 52 6f 6c 6c 62    { A = OE_Rollb
2440: 61 63 6b 3b 20 7d 0a 72 65 73 6f 6c 76 65 74 79  ack; }.resolvety
2450: 70 65 28 41 29 20 3a 3a 3d 20 41 42 4f 52 54 2e  pe(A) ::= ABORT.
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2470: 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 41 62 6f      { A = OE_Abo
2480: 72 74 3b 20 7d 0a 72 65 73 6f 6c 76 65 74 79 70  rt; }.resolvetyp
2490: 65 28 41 29 20 3a 3a 3d 20 46 41 49 4c 2e 20 20  e(A) ::= FAIL.  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 46 61 69 6c     { A = OE_Fail
24c0: 3b 20 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28  ; }.resolvetype(
24d0: 41 29 20 3a 3a 3d 20 49 47 4e 4f 52 45 2e 20 20  A) ::= IGNORE.  
24e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f0: 20 7b 20 41 20 3d 20 4f 45 5f 49 67 6e 6f 72 65   { A = OE_Ignore
2500: 3b 20 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28  ; }.resolvetype(
2510: 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20  A) ::= REPLACE. 
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2530: 20 7b 20 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63   { A = OE_Replac
2540: 65 3b 20 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  e; }..//////////
2550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2560: 20 54 68 65 20 44 52 4f 50 20 54 41 42 4c 45 20   The DROP TABLE 
2570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2590: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
25a0: 20 44 52 4f 50 20 54 41 42 4c 45 20 6e 6d 28 58   DROP TABLE nm(X
25b0: 29 2e 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c  ).          {sql
25c0: 69 74 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61  iteDropTable(pPa
25d0: 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 0a 2f 2f 2f  rse,&X,0);}..///
25e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
25f0: 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 56 49  // The CREATE VI
2600: 45 57 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  EW statement ///
2610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
2630: 64 20 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 20  d ::= CREATE(X) 
2640: 74 65 6d 70 28 54 29 20 56 49 45 57 20 6e 6d 28  temp(T) VIEW nm(
2650: 59 29 20 41 53 20 73 65 6c 65 63 74 28 53 29 2e  Y) AS select(S).
2660: 20 7b 0a 20 20 73 71 6c 69 74 65 43 72 65 61 74   {.  sqliteCreat
2670: 65 56 69 65 77 28 70 50 61 72 73 65 2c 20 26 58  eView(pParse, &X
2680: 2c 20 26 59 2c 20 53 2c 20 54 29 3b 0a 7d 0a 63  , &Y, S, T);.}.c
2690: 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 56 49 45 57  md ::= DROP VIEW
26a0: 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69   nm(X). {.  sqli
26b0: 74 65 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72  teDropTable(pPar
26c0: 73 65 2c 20 26 58 2c 20 31 29 3b 0a 7d 0a 0a 2f  se, &X, 1);.}../
26d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
26e0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53 45 4c 45  /////// The SELE
26f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  CT statement ///
2700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
2720: 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c 65 63 74  /.cmd ::= select
2730: 28 58 29 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65  (X).  {.  sqlite
2740: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 58  Select(pParse, X
2750: 2c 20 53 52 54 5f 43 61 6c 6c 62 61 63 6b 2c 20  , SRT_Callback, 
2760: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  0, 0, 0, 0);.  s
2770: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
2780: 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  e(X);.}..%type s
2790: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
27a0: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
27b0: 63 74 20 7b 73 71 6c 69 74 65 53 65 6c 65 63 74  ct {sqliteSelect
27c0: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
27d0: 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65  pe oneselect {Se
27e0: 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  lect*}.%destruct
27f0: 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71  or oneselect {sq
2800: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
2810: 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74 28 41  ($$);}..select(A
2820: 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28  ) ::= oneselect(
2830: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
2840: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
2850: 7d 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20  }.select(A) ::= 
2860: 73 65 6c 65 63 74 28 58 29 20 6d 75 6c 74 69 73  select(X) multis
2870: 65 6c 65 63 74 5f 6f 70 28 59 29 20 6f 6e 65 73  elect_op(Y) ones
2880: 65 6c 65 63 74 28 5a 29 2e 20 20 7b 0a 20 20 69  elect(Z).  {.  i
2890: 66 28 20 5a 20 29 7b 0a 20 20 20 20 5a 2d 3e 6f  f( Z ){.    Z->o
28a0: 70 20 3d 20 59 3b 0a 20 20 20 20 5a 2d 3e 70 50  p = Y;.    Z->pP
28b0: 72 69 6f 72 20 3d 20 58 3b 0a 20 20 7d 0a 20 20  rior = X;.  }.  
28c0: 41 20 3d 20 5a 3b 0a 7d 0a 25 74 79 70 65 20 6d  A = Z;.}.%type m
28d0: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 20 7b 69  ultiselect_op {i
28e0: 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f  nt}.multiselect_
28f0: 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 2e  op(A) ::= UNION.
2900: 20 20 20 20 20 20 7b 41 20 3d 20 54 4b 5f 55 4e        {A = TK_UN
2910: 49 4f 4e 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65 63  ION;}.multiselec
2920: 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f  t_op(A) ::= UNIO
2930: 4e 20 41 4c 4c 2e 20 20 7b 41 20 3d 20 54 4b 5f  N ALL.  {A = TK_
2940: 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65 63  ALL;}.multiselec
2950: 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 49 4e 54 45  t_op(A) ::= INTE
2960: 52 53 45 43 54 2e 20 20 7b 41 20 3d 20 54 4b 5f  RSECT.  {A = TK_
2970: 49 4e 54 45 52 53 45 43 54 3b 7d 0a 6d 75 6c 74  INTERSECT;}.mult
2980: 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a  iselect_op(A) ::
2990: 3d 20 45 58 43 45 50 54 2e 20 20 20 20 20 7b 41  = EXCEPT.     {A
29a0: 20 3d 20 54 4b 5f 45 58 43 45 50 54 3b 7d 0a 6f   = TK_EXCEPT;}.o
29b0: 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20  neselect(A) ::= 
29c0: 53 45 4c 45 43 54 20 64 69 73 74 69 6e 63 74 28  SELECT distinct(
29d0: 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57 29  D) selcollist(W)
29e0: 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65 5f 6f   from(X) where_o
29f0: 70 74 28 59 29 0a 20 20 20 20 20 20 20 20 20 20  pt(Y).          
2a00: 20 20 20 20 20 20 20 67 72 6f 75 70 62 79 5f 6f         groupby_o
2a10: 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f 70 74  pt(P) having_opt
2a20: 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 28  (Q) orderby_opt(
2a30: 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e  Z) limit_opt(L).
2a40: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 53   {.  A = sqliteS
2a50: 65 6c 65 63 74 4e 65 77 28 57 2c 58 2c 59 2c 50  electNew(W,X,Y,P
2a60: 2c 51 2c 5a 2c 44 2c 4c 2e 6c 69 6d 69 74 2c 4c  ,Q,Z,D,L.limit,L
2a70: 2e 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2f 20  .offset);.}..// 
2a80: 54 68 65 20 22 64 69 73 74 69 6e 63 74 22 20 6e  The "distinct" n
2a90: 6f 6e 74 65 72 6d 69 6e 61 6c 20 69 73 20 74 72  onterminal is tr
2aa0: 75 65 20 28 31 29 20 69 66 20 74 68 65 20 44 49  ue (1) if the DI
2ab0: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
2ac0: 73 0a 2f 2f 20 70 72 65 73 65 6e 74 20 61 6e 64  s.// present and
2ad0: 20 66 61 6c 73 65 20 28 30 29 20 69 66 20 69 74   false (0) if it
2ae0: 20 69 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70   is not..//.%typ
2af0: 65 20 64 69 73 74 69 6e 63 74 20 7b 69 6e 74 7d  e distinct {int}
2b00: 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d  .distinct(A) ::=
2b10: 20 44 49 53 54 49 4e 43 54 2e 20 20 20 7b 41 20   DISTINCT.   {A 
2b20: 3d 20 31 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41  = 1;}.distinct(A
2b30: 29 20 3a 3a 3d 20 41 4c 4c 2e 20 20 20 20 20 20  ) ::= ALL.      
2b40: 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 69 73 74 69    {A = 0;}.disti
2b50: 6e 63 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  nct(A) ::= .    
2b60: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
2b70: 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69 73 74 20 69  .// selcollist i
2b80: 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
2b90: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
2ba0: 20 74 6f 20 62 65 63 6f 6d 65 20 74 68 65 20 72   to become the r
2bb0: 65 74 75 72 6e 0a 2f 2f 20 76 61 6c 75 65 73 20  eturn.// values 
2bc0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
2bd0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 22 2a  atement.  The "*
2be0: 22 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 73 20  " in statements 
2bf0: 6c 69 6b 65 0a 2f 2f 20 22 53 45 4c 45 43 54 20  like.// "SELECT 
2c00: 2a 20 46 52 4f 4d 20 2e 2e 2e 22 20 69 73 20 65  * FROM ..." is e
2c10: 6e 63 6f 64 65 64 20 61 73 20 61 20 73 70 65 63  ncoded as a spec
2c20: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ial expression w
2c30: 69 74 68 20 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65  ith an.// opcode
2c40: 20 6f 66 20 54 4b 5f 41 4c 4c 2e 0a 2f 2f 0a 25   of TK_ALL..//.%
2c50: 74 79 70 65 20 73 65 6c 63 6f 6c 6c 69 73 74 20  type selcollist 
2c60: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
2c70: 74 72 75 63 74 6f 72 20 73 65 6c 63 6f 6c 6c 69  tructor selcolli
2c80: 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69  st {sqliteExprLi
2c90: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25  stDelete($$);}.%
2ca0: 74 79 70 65 20 73 63 6c 70 20 7b 45 78 70 72 4c  type sclp {ExprL
2cb0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
2cc0: 72 20 73 63 6c 70 20 7b 73 71 6c 69 74 65 45 78  r sclp {sqliteEx
2cd0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
2ce0: 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20 73  ;}.sclp(A) ::= s
2cf0: 65 6c 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d  elcollist(X) COM
2d00: 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  MA.             
2d10: 7b 41 20 3d 20 58 3b 7d 0a 73 63 6c 70 28 41 29  {A = X;}.sclp(A)
2d20: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73        {A = 0;}.s
2d50: 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d  elcollist(A) ::=
2d60: 20 73 63 6c 70 28 50 29 20 65 78 70 72 28 58 29   sclp(P) expr(X)
2d70: 20 61 73 28 59 29 2e 20 20 20 20 20 7b 0a 20 20   as(Y).     {.  
2d80: 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c   A = sqliteExprL
2d90: 69 73 74 41 70 70 65 6e 64 28 50 2c 58 2c 59 2e  istAppend(P,X,Y.
2da0: 6e 3f 26 59 3a 30 29 3b 0a 7d 0a 73 65 6c 63 6f  n?&Y:0);.}.selco
2db0: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c  llist(A) ::= scl
2dc0: 70 28 50 29 20 53 54 41 52 2e 20 7b 0a 20 20 41  p(P) STAR. {.  A
2dd0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
2de0: 74 41 70 70 65 6e 64 28 50 2c 20 73 71 6c 69 74  tAppend(P, sqlit
2df0: 65 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c  eExpr(TK_ALL, 0,
2e00: 20 30 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 73 65   0, 0), 0);.}.se
2e10: 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20  lcollist(A) ::= 
2e20: 73 63 6c 70 28 50 29 20 6e 6d 28 58 29 20 44 4f  sclp(P) nm(X) DO
2e30: 54 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70 72  T STAR. {.  Expr
2e40: 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74   *pRight = sqlit
2e50: 65 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c  eExpr(TK_ALL, 0,
2e60: 20 30 2c 20 30 29 3b 0a 20 20 45 78 70 72 20 2a   0, 0);.  Expr *
2e70: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78  pLeft = sqliteEx
2e80: 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  pr(TK_ID, 0, 0, 
2e90: 26 58 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74  &X);.  A = sqlit
2ea0: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
2eb0: 50 2c 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b  P, sqliteExpr(TK
2ec0: 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69  _DOT, pLeft, pRi
2ed0: 67 68 74 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 0a  ght, 0), 0);.}..
2ee0: 2f 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22 41 53  // An option "AS
2ef0: 20 3c 69 64 3e 22 20 70 68 72 61 73 65 20 74 68   <id>" phrase th
2f00: 61 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e  at can follow on
2f10: 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  e of the express
2f20: 69 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64 65 66  ions that.// def
2f30: 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74 20 73  ine the result s
2f40: 65 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68  et, or one of th
2f50: 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  e tables in the 
2f60: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a  FROM clause..//.
2f70: 25 74 79 70 65 20 61 73 20 7b 54 6f 6b 65 6e 7d  %type as {Token}
2f80: 0a 61 73 28 58 29 20 3a 3a 3d 20 41 53 20 6e 6d  .as(X) ::= AS nm
2f90: 28 59 29 2e 20 20 20 20 7b 20 58 20 3d 20 59 3b  (Y).    { X = Y;
2fa0: 20 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 69 64 73   }.as(X) ::= ids
2fb0: 28 59 29 2e 20 20 20 20 20 20 7b 20 58 20 3d 20  (Y).      { X = 
2fc0: 59 3b 20 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 2e  Y; }.as(X) ::= .
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 58 2e              { X.
2fe0: 6e 20 3d 20 30 3b 20 7d 0a 0a 0a 25 74 79 70 65  n = 0; }...%type
2ff0: 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 53 72 63   seltablist {Src
3000: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
3010: 6f 72 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 73  or seltablist {s
3020: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
3030: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73  te($$);}.%type s
3040: 74 6c 5f 70 72 65 66 69 78 20 7b 53 72 63 4c 69  tl_prefix {SrcLi
3050: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
3060: 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 73 71 6c   stl_prefix {sql
3070: 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65  iteSrcListDelete
3080: 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 66 72 6f  ($$);}.%type fro
3090: 6d 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65  m {SrcList*}.%de
30a0: 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b 73  structor from {s
30b0: 71 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65  qliteSrcListDele
30c0: 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63  te($$);}..// A c
30d0: 6f 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63 6c 61  omplete FROM cla
30e0: 75 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20  use..//.from(A) 
30f0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
3120: 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a  eMalloc(sizeof(*
3130: 41 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a  A));}.from(A) ::
3140: 3d 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73  = FROM seltablis
3150: 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  t(X).           
3160: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f      {A = X;}..//
3170: 20 22 73 65 6c 74 61 62 6c 69 73 74 22 20 69 73   "seltablist" is
3180: 20 61 20 22 53 65 6c 65 63 74 20 54 61 62 6c 65   a "Select Table
3190: 20 4c 69 73 74 22 20 2d 20 74 68 65 20 63 6f 6e   List" - the con
31a0: 74 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d  tent of the FROM
31b0: 20 63 6c 61 75 73 65 0a 2f 2f 20 69 6e 20 61 20   clause.// in a 
31c0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
31d0: 2e 20 20 22 73 74 6c 5f 70 72 65 66 69 78 22 20  .  "stl_prefix" 
31e0: 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74  is a prefix of t
31f0: 68 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c  his list..//.stl
3200: 5f 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 73  _prefix(A) ::= s
3210: 65 6c 74 61 62 6c 69 73 74 28 58 29 20 6a 6f 69  eltablist(X) joi
3220: 6e 6f 70 28 59 29 2e 20 20 20 20 7b 0a 20 20 20  nop(Y).    {.   
3230: 41 20 3d 20 58 3b 0a 20 20 20 69 66 28 20 41 20  A = X;.   if( A 
3240: 26 26 20 41 2d 3e 6e 53 72 63 3e 30 20 29 20 41  && A->nSrc>0 ) A
3250: 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e 6a  ->a[A->nSrc-1].j
3260: 6f 69 6e 74 79 70 65 20 3d 20 59 3b 0a 7d 0a 73  ointype = Y;.}.s
3270: 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a 3d  tl_prefix(A) ::=
3280: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
32a0: 3d 20 30 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74  = 0;}.seltablist
32b0: 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66  (A) ::= stl_pref
32c0: 69 78 28 58 29 20 6e 6d 28 59 29 20 61 73 28 5a  ix(X) nm(Y) as(Z
32d0: 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e  ) on_opt(N) usin
32e0: 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 41 20  g_opt(U). {.  A 
32f0: 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  = sqliteSrcListA
3300: 70 70 65 6e 64 28 58 2c 26 59 29 3b 0a 20 20 69  ppend(X,&Y);.  i
3310: 66 28 20 5a 2e 6e 20 29 20 73 71 6c 69 74 65 53  f( Z.n ) sqliteS
3320: 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 41  rcListAddAlias(A
3330: 2c 26 5a 29 3b 0a 20 20 69 66 28 20 4e 20 29 7b  ,&Z);.  if( N ){
3340: 0a 20 20 20 20 69 66 28 20 41 20 26 26 20 41 2d  .    if( A && A-
3350: 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b  >nSrc>1 ){ A->a[
3360: 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d  A->nSrc-2].pOn =
3370: 20 4e 3b 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b   N; }.    else {
3380: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
3390: 65 28 4e 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  e(N); }.  }.  if
33a0: 28 20 55 20 29 7b 0a 20 20 20 20 69 66 28 20 41  ( U ){.    if( A
33b0: 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b   && A->nSrc>1 ){
33c0: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d   A->a[A->nSrc-2]
33d0: 2e 70 55 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20  .pUsing = U; }. 
33e0: 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65     else { sqlite
33f0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 55 29 3b  IdListDelete(U);
3400: 20 7d 0a 20 20 7d 0a 7d 0a 73 65 6c 74 61 62 6c   }.  }.}.seltabl
3410: 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70  ist(A) ::= stl_p
3420: 72 65 66 69 78 28 58 29 20 4c 50 20 73 65 6c 65  refix(X) LP sele
3430: 63 74 28 53 29 20 52 50 20 61 73 28 5a 29 20 6f  ct(S) RP as(Z) o
3440: 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f  n_opt(N) using_o
3450: 70 74 28 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pt(U). {.  A = s
3460: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65  qliteSrcListAppe
3470: 6e 64 28 58 2c 30 29 3b 0a 20 20 41 2d 3e 61 5b  nd(X,0);.  A->a[
3480: 41 2d 3e 6e 53 72 63 2d 31 5d 2e 70 53 65 6c 65  A->nSrc-1].pSele
3490: 63 74 20 3d 20 53 3b 0a 20 20 69 66 28 20 5a 2e  ct = S;.  if( Z.
34a0: 6e 20 29 20 73 71 6c 69 74 65 53 72 63 4c 69 73  n ) sqliteSrcLis
34b0: 74 41 64 64 41 6c 69 61 73 28 41 2c 26 5a 29 3b  tAddAlias(A,&Z);
34c0: 0a 20 20 69 66 28 20 4e 20 29 7b 0a 20 20 20 20  .  if( N ){.    
34d0: 69 66 28 20 41 20 26 26 20 41 2d 3e 6e 53 72 63  if( A && A->nSrc
34e0: 3e 31 20 29 7b 20 41 2d 3e 61 5b 41 2d 3e 6e 53  >1 ){ A->a[A->nS
34f0: 72 63 2d 32 5d 2e 70 4f 6e 20 3d 20 4e 3b 20 7d  rc-2].pOn = N; }
3500: 0a 20 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69  .    else { sqli
3510: 74 65 45 78 70 72 44 65 6c 65 74 65 28 4e 29 3b  teExprDelete(N);
3520: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 55 20 29   }.  }.  if( U )
3530: 7b 0a 20 20 20 20 69 66 28 20 41 20 26 26 20 41  {.    if( A && A
3540: 2d 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61  ->nSrc>1 ){ A->a
3550: 5b 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 55 73 69  [A->nSrc-2].pUsi
3560: 6e 67 20 3d 20 55 3b 20 7d 0a 20 20 20 20 65 6c  ng = U; }.    el
3570: 73 65 20 7b 20 73 71 6c 69 74 65 49 64 4c 69 73  se { sqliteIdLis
3580: 74 44 65 6c 65 74 65 28 55 29 3b 20 7d 0a 20 20  tDelete(U); }.  
3590: 7d 0a 7d 0a 0a 25 74 79 70 65 20 6a 6f 69 6e 6f  }.}..%type joino
35a0: 70 20 7b 69 6e 74 7d 0a 25 74 79 70 65 20 6a 6f  p {int}.%type jo
35b0: 69 6e 6f 70 32 20 7b 69 6e 74 7d 0a 6a 6f 69 6e  inop2 {int}.join
35c0: 6f 70 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 2e  op(X) ::= COMMA.
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e0: 20 20 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45     { X = JT_INNE
35f0: 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a  R; }.joinop(X) :
3600: 3a 3d 20 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20  := JOIN.        
3610: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 58 20              { X 
3620: 3d 20 4a 54 5f 49 4e 4e 45 52 3b 20 7d 0a 6a 6f  = JT_INNER; }.jo
3630: 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e  inop(X) ::= JOIN
3640: 5f 4b 57 28 41 29 20 4a 4f 49 4e 2e 20 20 20 20  _KW(A) JOIN.    
3650: 20 20 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74       { X = sqlit
3660: 65 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65  eJoinType(pParse
3670: 2c 26 41 2c 30 2c 30 29 3b 20 7d 0a 6a 6f 69 6e  ,&A,0,0); }.join
3680: 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b  op(X) ::= JOIN_K
3690: 57 28 41 29 20 6e 6d 28 42 29 20 4a 4f 49 4e 2e  W(A) nm(B) JOIN.
36a0: 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 4a     { X = sqliteJ
36b0: 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26  oinType(pParse,&
36c0: 41 2c 26 42 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f  A,&B,0); }.joino
36d0: 70 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57  p(X) ::= JOIN_KW
36e0: 28 41 29 20 6e 6d 28 42 29 20 6e 6d 28 43 29 20  (A) nm(B) nm(C) 
36f0: 4a 4f 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20  JOIN..          
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3710: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 58               { X
3720: 20 3d 20 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70   = sqliteJoinTyp
3730: 65 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c 26  e(pParse,&A,&B,&
3740: 43 29 3b 20 7d 0a 0a 25 74 79 70 65 20 6f 6e 5f  C); }..%type on_
3750: 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73  opt {Expr*}.%des
3760: 74 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74 20 7b  tructor on_opt {
3770: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
3780: 28 24 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29  ($$);}.on_opt(N)
3790: 20 3a 3a 3d 20 4f 4e 20 65 78 70 72 28 45 29 2e   ::= ON expr(E).
37a0: 20 20 20 7b 4e 20 3d 20 45 3b 7d 0a 6f 6e 5f 6f     {N = E;}.on_o
37b0: 70 74 28 4e 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(N) ::= .     
37c0: 20 20 20 20 20 20 20 20 7b 4e 20 3d 20 30 3b 7d          {N = 0;}
37d0: 0a 0a 25 74 79 70 65 20 75 73 69 6e 67 5f 6f 70  ..%type using_op
37e0: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73  t {IdList*}.%des
37f0: 74 72 75 63 74 6f 72 20 75 73 69 6e 67 5f 6f 70  tructor using_op
3800: 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44  t {sqliteIdListD
3810: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 75 73 69 6e  elete($$);}.usin
3820: 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 55 53 49  g_opt(U) ::= USI
3830: 4e 47 20 4c 50 20 69 64 78 6c 69 73 74 28 4c 29  NG LP idxlist(L)
3840: 20 52 50 2e 20 20 7b 55 20 3d 20 4c 3b 7d 0a 75   RP.  {U = L;}.u
3850: 73 69 6e 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20  sing_opt(U) ::= 
3860: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3870: 20 20 20 20 20 20 20 20 20 7b 55 20 3d 20 30 3b           {U = 0;
3880: 7d 0a 0a 0a 25 74 79 70 65 20 6f 72 64 65 72 62  }...%type orderb
3890: 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a  y_opt {ExprList*
38a0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f 72  }.%destructor or
38b0: 64 65 72 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74  derby_opt {sqlit
38c0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
38d0: 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 6f 72 74  $$);}.%type sort
38e0: 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d  list {ExprList*}
38f0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 6f 72  .%destructor sor
3900: 74 6c 69 73 74 20 7b 73 71 6c 69 74 65 45 78 70  tlist {sqliteExp
3910: 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  rListDelete($$);
3920: 7d 0a 25 74 79 70 65 20 73 6f 72 74 69 74 65 6d  }.%type sortitem
3930: 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75   {Expr*}.%destru
3940: 63 74 6f 72 20 73 6f 72 74 69 74 65 6d 20 7b 73  ctor sortitem {s
3950: 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28  qliteExprDelete(
3960: 24 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f  $$);}..orderby_o
3970: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72       {A = 0;}.or
39a0: 64 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d  derby_opt(A) ::=
39b0: 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69   ORDER BY sortli
39c0: 73 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d  st(X).      {A =
39d0: 20 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29   X;}.sortlist(A)
39e0: 20 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29   ::= sortlist(X)
39f0: 20 43 4f 4d 4d 41 20 73 6f 72 74 69 74 65 6d 28   COMMA sortitem(
3a00: 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f  Y) collate(C) so
3a10: 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20  rtorder(Z). {.  
3a20: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69  A = sqliteExprLi
3a30: 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b  stAppend(X,Y,0);
3a40: 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b  .  if( A ) A->a[
3a50: 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  A->nExpr-1].sort
3a60: 4f 72 64 65 72 20 3d 20 43 2b 5a 3b 0a 7d 0a 73  Order = C+Z;.}.s
3a70: 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  ortlist(A) ::= s
3a80: 6f 72 74 69 74 65 6d 28 59 29 20 63 6f 6c 6c 61  ortitem(Y) colla
3a90: 74 65 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28  te(C) sortorder(
3aa0: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
3ab0: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
3ac0: 28 30 2c 59 2c 30 29 3b 0a 20 20 69 66 28 20 41  (0,Y,0);.  if( A
3ad0: 20 29 20 41 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f   ) A->a[0].sortO
3ae0: 72 64 65 72 20 3d 20 43 2b 5a 3b 0a 7d 0a 73 6f  rder = C+Z;.}.so
3af0: 72 74 69 74 65 6d 28 41 29 20 3a 3a 3d 20 65 78  rtitem(A) ::= ex
3b00: 70 72 28 58 29 2e 20 20 20 7b 41 20 3d 20 58 3b  pr(X).   {A = X;
3b10: 7d 0a 0a 25 74 79 70 65 20 73 6f 72 74 6f 72 64  }..%type sortord
3b20: 65 72 20 7b 69 6e 74 7d 0a 25 74 79 70 65 20 63  er {int}.%type c
3b30: 6f 6c 6c 61 74 65 20 7b 69 6e 74 7d 0a 0a 73 6f  ollate {int}..so
3b40: 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 41  rtorder(A) ::= A
3b50: 53 43 2e 20 20 20 20 20 20 20 20 20 20 20 7b 41  SC.           {A
3b60: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43   = SQLITE_SO_ASC
3b70: 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20  ;}.sortorder(A) 
3b80: 3a 3a 3d 20 44 45 53 43 2e 20 20 20 20 20 20 20  ::= DESC.       
3b90: 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53     {A = SQLITE_S
3ba0: 4f 5f 44 45 53 43 3b 7d 0a 73 6f 72 74 6f 72 64  O_DESC;}.sortord
3bb0: 65 72 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  er(A) ::= .     
3bc0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51           {A = SQ
3bd0: 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 63 6f  LITE_SO_ASC;}.co
3be0: 6c 6c 61 74 65 28 43 29 20 3a 3a 3d 20 2e 20 20  llate(C) ::= .  
3bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 43                {C
3c00: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 55 4e 4b   = SQLITE_SO_UNK
3c10: 3b 7d 0a 63 6f 6c 6c 61 74 65 28 43 29 20 3a 3a  ;}.collate(C) ::
3c20: 3d 20 43 4f 4c 4c 41 54 45 20 69 64 28 58 29 2e  = COLLATE id(X).
3c30: 20 20 20 7b 43 20 3d 20 73 71 6c 69 74 65 43 6f     {C = sqliteCo
3c40: 6c 6c 61 74 65 54 79 70 65 28 58 2e 7a 2c 20 58  llateType(X.z, X
3c50: 2e 6e 29 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f  .n);}..%type gro
3c60: 75 70 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69  upby_opt {ExprLi
3c70: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
3c80: 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71   groupby_opt {sq
3c90: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
3ca0: 74 65 28 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79  te($$);}.groupby
3cb0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cd0: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75     {A = 0;}.grou
3ce0: 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47  pby_opt(A) ::= G
3cf0: 52 4f 55 50 20 42 59 20 65 78 70 72 6c 69 73 74  ROUP BY exprlist
3d00: 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  (X).  {A = X;}..
3d10: 25 74 79 70 65 20 68 61 76 69 6e 67 5f 6f 70 74  %type having_opt
3d20: 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75   {Expr*}.%destru
3d30: 63 74 6f 72 20 68 61 76 69 6e 67 5f 6f 70 74 20  ctor having_opt 
3d40: 7b 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74  {sqliteExprDelet
3d50: 65 28 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f  e($$);}.having_o
3d60: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
3d70: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3d80: 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41  0;}.having_opt(A
3d90: 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78 70  ) ::= HAVING exp
3da0: 72 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  r(X).  {A = X;}.
3db0: 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74  .%type limit_opt
3dc0: 20 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61   {struct LimitVa
3dd0: 6c 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  l}.limit_opt(A) 
3de0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
3df0: 20 20 20 20 20 20 20 7b 41 2e 6c 69 6d 69 74 20         {A.limit 
3e00: 3d 20 2d 31 3b 20 41 2e 6f 66 66 73 65 74 20 3d  = -1; A.offset =
3e10: 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41   0;}.limit_opt(A
3e20: 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 49 4e 54 45  ) ::= LIMIT INTE
3e30: 47 45 52 28 58 29 2e 20 20 7b 41 2e 6c 69 6d 69  GER(X).  {A.limi
3e40: 74 20 3d 20 61 74 6f 69 28 58 2e 7a 29 3b 20 41  t = atoi(X.z); A
3e50: 2e 6f 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69  .offset = 0;}.li
3e60: 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c  mit_opt(A) ::= L
3e70: 49 4d 49 54 20 49 4e 54 45 47 45 52 28 58 29 20  IMIT INTEGER(X) 
3e80: 6c 69 6d 69 74 5f 73 65 70 20 49 4e 54 45 47 45  limit_sep INTEGE
3e90: 52 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20  R(Y). .         
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 6c 69             {A.li
3ec0: 6d 69 74 20 3d 20 61 74 6f 69 28 58 2e 7a 29 3b  mit = atoi(X.z);
3ed0: 20 41 2e 6f 66 66 73 65 74 20 3d 20 61 74 6f 69   A.offset = atoi
3ee0: 28 59 2e 7a 29 3b 7d 0a 6c 69 6d 69 74 5f 73 65  (Y.z);}.limit_se
3ef0: 70 20 3a 3a 3d 20 4f 46 46 53 45 54 2e 0a 6c 69  p ::= OFFSET..li
3f00: 6d 69 74 5f 73 65 70 20 3a 3a 3d 20 43 4f 4d 4d  mit_sep ::= COMM
3f10: 41 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  A...////////////
3f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
3f30: 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 65  The DELETE state
3f40: 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ment ///////////
3f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3f60: 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 45  //.//.cmd ::= DE
3f70: 4c 45 54 45 20 46 52 4f 4d 20 6e 6d 28 58 29 20  LETE FROM nm(X) 
3f80: 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 0a 20 20  where_opt(Y)..  
3f90: 20 20 7b 73 71 6c 69 74 65 44 65 6c 65 74 65 46    {sqliteDeleteF
3fa0: 72 6f 6d 28 70 50 61 72 73 65 2c 20 26 58 2c 20  rom(pParse, &X, 
3fb0: 59 29 3b 7d 0a 0a 25 74 79 70 65 20 77 68 65 72  Y);}..%type wher
3fc0: 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64  e_opt {Expr*}.%d
3fd0: 65 73 74 72 75 63 74 6f 72 20 77 68 65 72 65 5f  estructor where_
3fe0: 6f 70 74 20 7b 73 71 6c 69 74 65 45 78 70 72 44  opt {sqliteExprD
3ff0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 77 68 65  elete($$);}..whe
4000: 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  re_opt(A) ::= . 
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4020: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 77 68 65 72     {A = 0;}.wher
4030: 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 57 48 45  e_opt(A) ::= WHE
4040: 52 45 20 65 78 70 72 28 58 29 2e 20 20 20 20 20  RE expr(X).     
4050: 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70    {A = X;}..%typ
4060: 65 20 73 65 74 6c 69 73 74 20 7b 45 78 70 72 4c  e setlist {ExprL
4070: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
4080: 72 20 73 65 74 6c 69 73 74 20 7b 73 71 6c 69 74  r setlist {sqlit
4090: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
40a0: 24 24 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  $$);}../////////
40b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
40c0: 2f 20 54 68 65 20 55 50 44 41 54 45 20 63 6f 6d  / The UPDATE com
40d0: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mand ///////////
40e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
40f0: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d  /////.//.cmd ::=
4100: 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52   UPDATE orconf(R
4110: 29 20 6e 6d 28 58 29 20 53 45 54 20 73 65 74 6c  ) nm(X) SET setl
4120: 69 73 74 28 59 29 20 77 68 65 72 65 5f 6f 70 74  ist(Y) where_opt
4130: 28 5a 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65  (Z)..    {sqlite
4140: 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 26 58  Update(pParse,&X
4150: 2c 59 2c 5a 2c 52 29 3b 7d 0a 0a 73 65 74 6c 69  ,Y,Z,R);}..setli
4160: 73 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c 69 73  st(A) ::= setlis
4170: 74 28 5a 29 20 43 4f 4d 4d 41 20 6e 6d 28 58 29  t(Z) COMMA nm(X)
4180: 20 45 51 20 65 78 70 72 28 59 29 2e 0a 20 20 20   EQ expr(Y)..   
4190: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
41a0: 4c 69 73 74 41 70 70 65 6e 64 28 5a 2c 59 2c 26  ListAppend(Z,Y,&
41b0: 58 29 3b 7d 0a 73 65 74 6c 69 73 74 28 41 29 20  X);}.setlist(A) 
41c0: 3a 3a 3d 20 6e 6d 28 58 29 20 45 51 20 65 78 70  ::= nm(X) EQ exp
41d0: 72 28 59 29 2e 20 20 20 7b 41 20 3d 20 73 71 6c  r(Y).   {A = sql
41e0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
41f0: 64 28 30 2c 59 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f  d(0,Y,&X);}..///
4200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4210: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 49 4e 53 45  /////// The INSE
4220: 52 54 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  RT command /////
4230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
4250: 63 6d 64 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63  cmd ::= insert_c
4260: 6d 64 28 52 29 20 49 4e 54 4f 20 6e 6d 28 58 29  md(R) INTO nm(X)
4270: 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28   inscollist_opt(
4280: 46 29 20 56 41 4c 55 45 53 20 4c 50 20 69 74 65  F) VALUES LP ite
4290: 6d 6c 69 73 74 28 59 29 20 52 50 2e 0a 20 20 20  mlist(Y) RP..   
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
42b0: 69 74 65 49 6e 73 65 72 74 28 70 50 61 72 73 65  iteInsert(pParse
42c0: 2c 20 26 58 2c 20 59 2c 20 30 2c 20 46 2c 20 52  , &X, Y, 0, F, R
42d0: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65  );}.cmd ::= inse
42e0: 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 6e  rt_cmd(R) INTO n
42f0: 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f  m(X) inscollist_
4300: 6f 70 74 28 46 29 20 73 65 6c 65 63 74 28 53 29  opt(F) select(S)
4310: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
4320: 20 7b 73 71 6c 69 74 65 49 6e 73 65 72 74 28 70   {sqliteInsert(p
4330: 50 61 72 73 65 2c 20 26 58 2c 20 30 2c 20 53 2c  Parse, &X, 0, S,
4340: 20 46 2c 20 52 29 3b 7d 0a 0a 25 74 79 70 65 20   F, R);}..%type 
4350: 69 6e 73 65 72 74 5f 63 6d 64 20 7b 69 6e 74 7d  insert_cmd {int}
4360: 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 20 3a  .insert_cmd(A) :
4370: 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63 6f 6e 66  := INSERT orconf
4380: 28 52 29 2e 20 20 20 7b 41 20 3d 20 52 3b 7d 0a  (R).   {A = R;}.
4390: 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 20 3a 3a  insert_cmd(A) ::
43a0: 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20 20 20  = REPLACE.      
43b0: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 52 65        {A = OE_Re
43c0: 70 6c 61 63 65 3b 7d 0a 0a 0a 25 74 79 70 65 20  place;}...%type 
43d0: 69 74 65 6d 6c 69 73 74 20 7b 45 78 70 72 4c 69  itemlist {ExprLi
43e0: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
43f0: 20 69 74 65 6d 6c 69 73 74 20 7b 73 71 6c 69 74   itemlist {sqlit
4400: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
4410: 24 24 29 3b 7d 0a 0a 69 74 65 6d 6c 69 73 74 28  $$);}..itemlist(
4420: 41 29 20 3a 3a 3d 20 69 74 65 6d 6c 69 73 74 28  A) ::= itemlist(
4430: 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29  X) COMMA expr(Y)
4440: 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78  .  {A = sqliteEx
4450: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 59  prListAppend(X,Y
4460: 2c 30 29 3b 7d 0a 69 74 65 6d 6c 69 73 74 28 41  ,0);}.itemlist(A
4470: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20  ) ::= expr(X).  
4480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4490: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70    {A = sqliteExp
44a0: 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 58 2c  rListAppend(0,X,
44b0: 30 29 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 63  0);}..%type insc
44c0: 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b 49 64 4c 69  ollist_opt {IdLi
44d0: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
44e0: 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20   inscollist_opt 
44f0: 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c  {sqliteIdListDel
4500: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20  ete($$);}.%type 
4510: 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 49 64 4c 69  inscollist {IdLi
4520: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
4530: 20 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 73 71 6c   inscollist {sql
4540: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
4550: 24 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c 6c 69 73  $$);}..inscollis
4560: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  t_opt(A) ::= .  
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e       {A = 0;}.in
4590: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20  scollist_opt(A) 
45a0: 3a 3a 3d 20 4c 50 20 69 6e 73 63 6f 6c 6c 69 73  ::= LP inscollis
45b0: 74 28 58 29 20 52 50 2e 20 20 20 20 7b 41 20 3d  t(X) RP.    {A =
45c0: 20 58 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28   X;}.inscollist(
45d0: 41 29 20 3a 3a 3d 20 69 6e 73 63 6f 6c 6c 69 73  A) ::= inscollis
45e0: 74 28 58 29 20 43 4f 4d 4d 41 20 6e 6d 28 59 29  t(X) COMMA nm(Y)
45f0: 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 49 64  .  {A = sqliteId
4600: 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59 29  ListAppend(X,&Y)
4610: 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28 41 29  ;}.inscollist(A)
4620: 20 3a 3a 3d 20 6e 6d 28 59 29 2e 20 20 20 20 20   ::= nm(Y).     
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 7b 41 20 3d 20 73 71 6c 69 74 65 49 64 4c 69   {A = sqliteIdLi
4650: 73 74 41 70 70 65 6e 64 28 30 2c 26 59 29 3b 7d  stAppend(0,&Y);}
4660: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
4670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 45 78  ///////////// Ex
4680: 70 72 65 73 73 69 6f 6e 20 50 72 6f 63 65 73 73  pression Process
4690: 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ing ////////////
46a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
46b0: 2f 0a 2f 2f 0a 25 6c 65 66 74 20 4f 52 2e 0a 25  /.//.%left OR..%
46c0: 6c 65 66 74 20 41 4e 44 2e 0a 25 72 69 67 68 74  left AND..%right
46d0: 20 4e 4f 54 2e 0a 25 6c 65 66 74 20 45 51 20 4e   NOT..%left EQ N
46e0: 45 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c 4c  E ISNULL NOTNULL
46f0: 20 49 53 20 4c 49 4b 45 20 47 4c 4f 42 20 42 45   IS LIKE GLOB BE
4700: 54 57 45 45 4e 20 49 4e 2e 0a 25 6c 65 66 74 20  TWEEN IN..%left 
4710: 47 54 20 47 45 20 4c 54 20 4c 45 2e 0a 25 6c 65  GT GE LT LE..%le
4720: 66 74 20 42 49 54 41 4e 44 20 42 49 54 4f 52 20  ft BITAND BITOR 
4730: 4c 53 48 49 46 54 20 52 53 48 49 46 54 2e 0a 25  LSHIFT RSHIFT..%
4740: 6c 65 66 74 20 50 4c 55 53 20 4d 49 4e 55 53 2e  left PLUS MINUS.
4750: 0a 25 6c 65 66 74 20 53 54 41 52 20 53 4c 41 53  .%left STAR SLAS
4760: 48 20 52 45 4d 2e 0a 25 6c 65 66 74 20 43 4f 4e  H REM..%left CON
4770: 43 41 54 2e 0a 25 72 69 67 68 74 20 55 4d 49 4e  CAT..%right UMIN
4780: 55 53 20 55 50 4c 55 53 20 42 49 54 4e 4f 54 2e  US UPLUS BITNOT.
4790: 0a 25 72 69 67 68 74 20 4f 52 41 43 4c 45 5f 4f  .%right ORACLE_O
47a0: 55 54 45 52 5f 4a 4f 49 4e 2e 0a 0a 25 74 79 70  UTER_JOIN...%typ
47b0: 65 20 65 78 70 72 20 7b 45 78 70 72 2a 7d 0a 25  e expr {Expr*}.%
47c0: 64 65 73 74 72 75 63 74 6f 72 20 65 78 70 72 20  destructor expr 
47d0: 7b 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74  {sqliteExprDelet
47e0: 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72 28 41 29  e($$);}..expr(A)
47f0: 20 3a 3a 3d 20 4c 50 28 42 29 20 65 78 70 72 28   ::= LP(B) expr(
4800: 58 29 20 52 50 28 45 29 2e 20 7b 41 20 3d 20 58  X) RP(E). {A = X
4810: 3b 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e  ; sqliteExprSpan
4820: 28 41 2c 26 42 2c 26 45 29 3b 20 7d 0a 65 78 70  (A,&B,&E); }.exp
4830: 72 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c 28 58 29  r(A) ::= NULL(X)
4840: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
4850: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
4860: 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 26 58 29  _NULL, 0, 0, &X)
4870: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49  ;}.expr(A) ::= I
4880: 44 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  D(X).           
4890: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45      {A = sqliteE
48a0: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
48b0: 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a   &X);}.expr(A) :
48c0: 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20 20  := JOIN_KW(X).  
48d0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
48e0: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
48f0: 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28  , 0, &X);}.expr(
4900: 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f 54  A) ::= nm(X) DOT
4910: 20 6e 6d 28 59 29 2e 20 7b 0a 20 20 45 78 70 72   nm(Y). {.  Expr
4920: 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65   *temp1 = sqlite
4930: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
4940: 2c 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74  , &X);.  Expr *t
4950: 65 6d 70 32 20 3d 20 73 71 6c 69 74 65 45 78 70  emp2 = sqliteExp
4960: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  r(TK_ID, 0, 0, &
4970: 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  Y);.  A = sqlite
4980: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d  Expr(TK_DOT, tem
4990: 70 31 2c 20 74 65 6d 70 32 2c 20 30 29 3b 0a 7d  p1, temp2, 0);.}
49a0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
49b0: 72 28 42 29 20 4f 52 41 43 4c 45 5f 4f 55 54 45  r(B) ORACLE_OUTE
49c0: 52 5f 4a 4f 49 4e 2e 20 0a 20 20 20 20 20 20 20  R_JOIN. .       
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 20 20 20 20 20 20 7b 41 20 3d 20 42 3b 20 45 78        {A = B; Ex
49f0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 41 2c  prSetProperty(A,
4a00: 45 50 5f 4f 72 61 63 6c 65 38 4a 6f 69 6e 29 3b  EP_Oracle8Join);
4a10: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 4e  }.expr(A) ::= IN
4a20: 54 45 47 45 52 28 58 29 2e 20 20 20 20 20 20 7b  TEGER(X).      {
4a30: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
4a40: 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c  K_INTEGER, 0, 0,
4a50: 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a   &X);}.expr(A) :
4a60: 3a 3d 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20  := FLOAT(X).    
4a70: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45      {A = sqliteE
4a80: 78 70 72 28 54 4b 5f 46 4c 4f 41 54 2c 20 30 2c  xpr(TK_FLOAT, 0,
4a90: 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41   0, &X);}.expr(A
4aa0: 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e  ) ::= STRING(X).
4ab0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
4ac0: 74 65 45 78 70 72 28 54 4b 5f 53 54 52 49 4e 47  teExpr(TK_STRING
4ad0: 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78  , 0, 0, &X);}.ex
4ae0: 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 20  pr(A) ::= ID(X) 
4af0: 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52  LP exprlist(Y) R
4b00: 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  P(E). {.  A = sq
4b10: 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e  liteExprFunction
4b20: 28 59 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74  (Y, &X);.  sqlit
4b30: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26  eExprSpan(A,&X,&
4b40: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
4b50: 3d 20 49 44 28 58 29 20 4c 50 20 53 54 41 52 20  = ID(X) LP STAR 
4b60: 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  RP(E). {.  A = s
4b70: 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f  qliteExprFunctio
4b80: 6e 28 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69  n(0, &X);.  sqli
4b90: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c  teExprSpan(A,&X,
4ba0: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
4bb0: 3a 3d 20 65 78 70 72 28 58 29 20 41 4e 44 20 65  := expr(X) AND e
4bc0: 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d 20 73  xpr(Y).   {A = s
4bd0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44  qliteExpr(TK_AND
4be0: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
4bf0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
4c00: 20 4f 52 20 65 78 70 72 28 59 29 2e 20 20 20 20   OR expr(Y).    
4c10: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
4c20: 54 4b 5f 4f 52 2c 20 58 2c 20 59 2c 20 30 29 3b  TK_OR, X, Y, 0);
4c30: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
4c40: 70 72 28 58 29 20 4c 54 20 65 78 70 72 28 59 29  pr(X) LT expr(Y)
4c50: 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  .    {A = sqlite
4c60: 45 78 70 72 28 54 4b 5f 4c 54 2c 20 58 2c 20 59  Expr(TK_LT, X, Y
4c70: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
4c80: 3a 3d 20 65 78 70 72 28 58 29 20 47 54 20 65 78  := expr(X) GT ex
4c90: 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20 73  pr(Y).    {A = s
4ca0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 47 54 2c  qliteExpr(TK_GT,
4cb0: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
4cc0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
4cd0: 4c 45 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b  LE expr(Y).    {
4ce0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
4cf0: 4b 5f 4c 45 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  K_LE, X, Y, 0);}
4d00: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
4d10: 72 28 58 29 20 47 45 20 65 78 70 72 28 59 29 2e  r(X) GE expr(Y).
4d20: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45      {A = sqliteE
4d30: 78 70 72 28 54 4b 5f 47 45 2c 20 58 2c 20 59 2c  xpr(TK_GE, X, Y,
4d40: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
4d50: 3d 20 65 78 70 72 28 58 29 20 4e 45 20 65 78 70  = expr(X) NE exp
4d60: 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71  r(Y).    {A = sq
4d70: 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 45 2c 20  liteExpr(TK_NE, 
4d80: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
4d90: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 45  A) ::= expr(X) E
4da0: 51 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41  Q expr(Y).    {A
4db0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
4dc0: 5f 45 51 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  _EQ, X, Y, 0);}.
4dd0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
4de0: 28 58 29 20 42 49 54 41 4e 44 20 65 78 70 72 28  (X) BITAND expr(
4df0: 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 45  Y). {A = sqliteE
4e00: 78 70 72 28 54 4b 5f 42 49 54 41 4e 44 2c 20 58  xpr(TK_BITAND, X
4e10: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
4e20: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 42 49  ) ::= expr(X) BI
4e30: 54 4f 52 20 65 78 70 72 28 59 29 2e 20 20 7b 41  TOR expr(Y).  {A
4e40: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
4e50: 5f 42 49 54 4f 52 2c 20 58 2c 20 59 2c 20 30 29  _BITOR, X, Y, 0)
4e60: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
4e70: 78 70 72 28 58 29 20 4c 53 48 49 46 54 20 65 78  xpr(X) LSHIFT ex
4e80: 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69  pr(Y). {A = sqli
4e90: 74 65 45 78 70 72 28 54 4b 5f 4c 53 48 49 46 54  teExpr(TK_LSHIFT
4ea0: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
4eb0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
4ec0: 20 52 53 48 49 46 54 20 65 78 70 72 28 59 29 2e   RSHIFT expr(Y).
4ed0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
4ee0: 28 54 4b 5f 52 53 48 49 46 54 2c 20 58 2c 20 59  (TK_RSHIFT, X, Y
4ef0: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
4f00: 3a 3d 20 65 78 70 72 28 58 29 20 6c 69 6b 65 6f  := expr(X) likeo
4f10: 70 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  p(OP) expr(Y).  
4f20: 5b 4c 49 4b 45 5d 20 20 7b 0a 20 20 45 78 70 72  [LIKE]  {.  Expr
4f30: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 73 71  List *pList = sq
4f40: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
4f50: 6e 64 28 30 2c 20 59 2c 20 30 29 3b 0a 20 20 70  nd(0, Y, 0);.  p
4f60: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70  List = sqliteExp
4f70: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73  rListAppend(pLis
4f80: 74 2c 20 58 2c 20 30 29 3b 0a 20 20 41 20 3d 20  t, X, 0);.  A = 
4f90: 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69  sqliteExprFuncti
4fa0: 6f 6e 28 70 4c 69 73 74 2c 20 30 29 3b 0a 20 20  on(pList, 0);.  
4fb0: 69 66 28 20 41 20 29 20 41 2d 3e 6f 70 20 3d 20  if( A ) A->op = 
4fc0: 4f 50 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  OP;.  sqliteExpr
4fd0: 53 70 61 6e 28 41 2c 20 26 58 2d 3e 73 70 61 6e  Span(A, &X->span
4fe0: 2c 20 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65  , &Y->span);.}.e
4ff0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
5000: 58 29 20 4e 4f 54 20 6c 69 6b 65 6f 70 28 4f 50  X) NOT likeop(OP
5010: 29 20 65 78 70 72 28 59 29 2e 20 5b 4c 49 4b 45  ) expr(Y). [LIKE
5020: 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ] {.  ExprList *
5030: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  pList = sqliteEx
5040: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20  prListAppend(0, 
5050: 59 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74 20 3d  Y, 0);.  pList =
5060: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
5070: 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 58 2c 20  ppend(pList, X, 
5080: 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  0);.  A = sqlite
5090: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 4c 69  ExprFunction(pLi
50a0: 73 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20  st, 0);.  if( A 
50b0: 29 20 41 2d 3e 6f 70 20 3d 20 4f 50 3b 0a 20 20  ) A->op = OP;.  
50c0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
50d0: 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b  K_NOT, A, 0, 0);
50e0: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  .  sqliteExprSpa
50f0: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 59 2d  n(A,&X->span,&Y-
5100: 3e 73 70 61 6e 29 3b 0a 7d 0a 25 74 79 70 65 20  >span);.}.%type 
5110: 6c 69 6b 65 6f 70 20 7b 69 6e 74 7d 0a 6c 69 6b  likeop {int}.lik
5120: 65 6f 70 28 41 29 20 3a 3a 3d 20 4c 49 4b 45 2e  eop(A) ::= LIKE.
5130: 20 7b 41 20 3d 20 54 4b 5f 4c 49 4b 45 3b 7d 0a   {A = TK_LIKE;}.
5140: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 47 4c  likeop(A) ::= GL
5150: 4f 42 2e 20 7b 41 20 3d 20 54 4b 5f 47 4c 4f 42  OB. {A = TK_GLOB
5160: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
5170: 78 70 72 28 58 29 20 50 4c 55 53 20 65 78 70 72  xpr(X) PLUS expr
5180: 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (Y).  {A = sqlit
5190: 65 45 78 70 72 28 54 4b 5f 50 4c 55 53 2c 20 58  eExpr(TK_PLUS, X
51a0: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
51b0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4d 49  ) ::= expr(X) MI
51c0: 4e 55 53 20 65 78 70 72 28 59 29 2e 20 7b 41 20  NUS expr(Y). {A 
51d0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
51e0: 4d 49 4e 55 53 2c 20 58 2c 20 59 2c 20 30 29 3b  MINUS, X, Y, 0);
51f0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5200: 70 72 28 58 29 20 53 54 41 52 20 65 78 70 72 28  pr(X) STAR expr(
5210: 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  Y).  {A = sqlite
5220: 45 78 70 72 28 54 4b 5f 53 54 41 52 2c 20 58 2c  Expr(TK_STAR, X,
5230: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
5240: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 53 4c 41   ::= expr(X) SLA
5250: 53 48 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d  SH expr(Y). {A =
5260: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 53   sqliteExpr(TK_S
5270: 4c 41 53 48 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  LASH, X, Y, 0);}
5280: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
5290: 72 28 58 29 20 52 45 4d 20 65 78 70 72 28 59 29  r(X) REM expr(Y)
52a0: 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45  .   {A = sqliteE
52b0: 78 70 72 28 54 4b 5f 52 45 4d 2c 20 58 2c 20 59  xpr(TK_REM, X, Y
52c0: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
52d0: 3a 3d 20 65 78 70 72 28 58 29 20 43 4f 4e 43 41  := expr(X) CONCA
52e0: 54 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20  T expr(Y). {A = 
52f0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 43 4f  sqliteExpr(TK_CO
5300: 4e 43 41 54 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  NCAT, X, Y, 0);}
5310: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
5320: 72 28 58 29 20 49 53 4e 55 4c 4c 28 45 29 2e 20  r(X) ISNULL(E). 
5330: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  {.  A = sqliteEx
5340: 70 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c  pr(TK_ISNULL, X,
5350: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
5360: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73  ExprSpan(A,&X->s
5370: 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28  pan,&E);.}.expr(
5380: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49  A) ::= expr(X) I
5390: 53 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41  S NULL(E). {.  A
53a0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
53b0: 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30  _ISNULL, X, 0, 0
53c0: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53  );.  sqliteExprS
53d0: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26  pan(A,&X->span,&
53e0: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
53f0: 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 4e 55 4c  = expr(X) NOTNUL
5400: 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  L(E). {.  A = sq
5410: 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 4e  liteExpr(TK_NOTN
5420: 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20  ULL, X, 0, 0);. 
5430: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
5440: 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a  A,&X->span,&E);.
5450: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5460: 70 72 28 58 29 20 4e 4f 54 20 4e 55 4c 4c 28 45  pr(X) NOT NULL(E
5470: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
5480: 65 45 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c  eExpr(TK_NOTNULL
5490: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
54a0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
54b0: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
54c0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
54d0: 58 29 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 28 45  X) IS NOT NULL(E
54e0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
54f0: 65 45 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c  eExpr(TK_NOTNULL
5500: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
5510: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
5520: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
5530: 78 70 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 28 42  xpr(A) ::= NOT(B
5540: 29 20 65 78 70 72 28 58 29 2e 20 7b 0a 20 20 41  ) expr(X). {.  A
5550: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
5560: 5f 4e 4f 54 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  _NOT, X, 0, 0);.
5570: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
5580: 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b  (A,&B,&X->span);
5590: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 42  .}.expr(A) ::= B
55a0: 49 54 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29  ITNOT(B) expr(X)
55b0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
55c0: 45 78 70 72 28 54 4b 5f 42 49 54 4e 4f 54 2c 20  Expr(TK_BITNOT, 
55d0: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
55e0: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c  teExprSpan(A,&B,
55f0: 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70  &X->span);.}.exp
5600: 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 28 42  r(A) ::= MINUS(B
5610: 29 20 65 78 70 72 28 58 29 2e 20 5b 55 4d 49 4e  ) expr(X). [UMIN
5620: 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  US] {.  A = sqli
5630: 74 65 45 78 70 72 28 54 4b 5f 55 4d 49 4e 55 53  teExpr(TK_UMINUS
5640: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
5650: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
5660: 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65  B,&X->span);.}.e
5670: 78 70 72 28 41 29 20 3a 3a 3d 20 50 4c 55 53 28  xpr(A) ::= PLUS(
5680: 42 29 20 65 78 70 72 28 58 29 2e 20 5b 55 50 4c  B) expr(X). [UPL
5690: 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  US] {.  A = sqli
56a0: 74 65 45 78 70 72 28 54 4b 5f 55 50 4c 55 53 2c  teExpr(TK_UPLUS,
56b0: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   X, 0, 0);.  sql
56c0: 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 42  iteExprSpan(A,&B
56d0: 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78  ,&X->span);.}.ex
56e0: 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20  pr(A) ::= LP(B) 
56f0: 73 65 6c 65 63 74 28 58 29 20 52 50 28 45 29 2e  select(X) RP(E).
5700: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45   {.  A = sqliteE
5710: 78 70 72 28 54 4b 5f 53 45 4c 45 43 54 2c 20 30  xpr(TK_SELECT, 0
5720: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  , 0, 0);.  if( A
5730: 20 29 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20   ) A->pSelect = 
5740: 58 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53  X;.  sqliteExprS
5750: 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b 0a 7d 0a  pan(A,&B,&E);.}.
5760: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
5770: 28 57 29 20 42 45 54 57 45 45 4e 20 65 78 70 72  (W) BETWEEN expr
5780: 28 58 29 20 41 4e 44 20 65 78 70 72 28 59 29 2e  (X) AND expr(Y).
5790: 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70   {.  ExprList *p
57a0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70  List = sqliteExp
57b0: 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 58  rListAppend(0, X
57c0: 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  , 0);.  pList = 
57d0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
57e0: 70 65 6e 64 28 70 4c 69 73 74 2c 20 59 2c 20 30  pend(pList, Y, 0
57f0: 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45  );.  A = sqliteE
5800: 78 70 72 28 54 4b 5f 42 45 54 57 45 45 4e 2c 20  xpr(TK_BETWEEN, 
5810: 57 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  W, 0, 0);.  if( 
5820: 41 20 29 20 41 2d 3e 70 4c 69 73 74 20 3d 20 70  A ) A->pList = p
5830: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 45 78  List;.  sqliteEx
5840: 70 72 53 70 61 6e 28 41 2c 26 57 2d 3e 73 70 61  prSpan(A,&W->spa
5850: 6e 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65  n,&Y->span);.}.e
5860: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
5870: 57 29 20 4e 4f 54 20 42 45 54 57 45 45 4e 20 65  W) NOT BETWEEN e
5880: 78 70 72 28 58 29 20 41 4e 44 20 65 78 70 72 28  xpr(X) AND expr(
5890: 59 29 2e 20 7b 0a 20 20 45 78 70 72 4c 69 73 74  Y). {.  ExprList
58a0: 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
58b0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
58c0: 2c 20 58 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74  , X, 0);.  pList
58d0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
58e0: 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 59  tAppend(pList, Y
58f0: 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  , 0);.  A = sqli
5900: 74 65 45 78 70 72 28 54 4b 5f 42 45 54 57 45 45  teExpr(TK_BETWEE
5910: 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a 20 20 69  N, W, 0, 0);.  i
5920: 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 20  f( A ) A->pList 
5930: 3d 20 70 4c 69 73 74 3b 0a 20 20 41 20 3d 20 73  = pList;.  A = s
5940: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54  qliteExpr(TK_NOT
5950: 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , A, 0, 0);.  sq
5960: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
5970: 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70 61 6e  W->span,&Y->span
5980: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
5990: 20 65 78 70 72 28 58 29 20 49 4e 20 4c 50 20 65   expr(X) IN LP e
59a0: 78 70 72 6c 69 73 74 28 59 29 20 52 50 28 45 29  xprlist(Y) RP(E)
59b0: 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  .  {.  A = sqlit
59c0: 65 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20  eExpr(TK_IN, X, 
59d0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  0, 0);.  if( A )
59e0: 20 41 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20   A->pList = Y;. 
59f0: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
5a00: 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a  A,&X->span,&E);.
5a10: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5a20: 70 72 28 58 29 20 49 4e 20 4c 50 20 73 65 6c 65  pr(X) IN LP sele
5a30: 63 74 28 59 29 20 52 50 28 45 29 2e 20 20 7b 0a  ct(Y) RP(E).  {.
5a40: 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72    A = sqliteExpr
5a50: 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29  (TK_IN, X, 0, 0)
5a60: 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70  ;.  if( A ) A->p
5a70: 53 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 73 71  Select = Y;.  sq
5a80: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
5a90: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
5aa0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
5ab0: 58 29 20 4e 4f 54 20 49 4e 20 4c 50 20 65 78 70  X) NOT IN LP exp
5ac0: 72 6c 69 73 74 28 59 29 20 52 50 28 45 29 2e 20  rlist(Y) RP(E). 
5ad0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45   {.  A = sqliteE
5ae0: 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c  xpr(TK_IN, X, 0,
5af0: 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41   0);.  if( A ) A
5b00: 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 41  ->pList = Y;.  A
5b10: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
5b20: 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a  _NOT, A, 0, 0);.
5b30: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
5b40: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b  (A,&X->span,&E);
5b50: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .}.expr(A) ::= e
5b60: 78 70 72 28 58 29 20 4e 4f 54 20 49 4e 20 4c 50  xpr(X) NOT IN LP
5b70: 20 73 65 6c 65 63 74 28 59 29 20 52 50 28 45 29   select(Y) RP(E)
5b80: 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  .  {.  A = sqlit
5b90: 65 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20  eExpr(TK_IN, X, 
5ba0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  0, 0);.  if( A )
5bb0: 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20 59 3b   A->pSelect = Y;
5bc0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70  .  A = sqliteExp
5bd0: 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20  r(TK_NOT, A, 0, 
5be0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  0);.  sqliteExpr
5bf0: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
5c00: 26 45 29 3b 0a 7d 0a 0a 2f 2a 20 43 41 53 45 20  &E);.}../* CASE 
5c10: 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 65  expressions */.e
5c20: 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53 45 28  xpr(A) ::= CASE(
5c30: 43 29 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 28  C) case_operand(
5c40: 58 29 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74  X) case_exprlist
5c50: 28 59 29 20 63 61 73 65 5f 65 6c 73 65 28 5a 29  (Y) case_else(Z)
5c60: 20 45 4e 44 28 45 29 2e 20 7b 0a 20 20 41 20 3d   END(E). {.  A =
5c70: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 43   sqliteExpr(TK_C
5c80: 41 53 45 2c 20 58 2c 20 5a 2c 20 30 29 3b 0a 20  ASE, X, Z, 0);. 
5c90: 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73   if( A ) A->pLis
5ca0: 74 20 3d 20 59 3b 0a 20 20 73 71 6c 69 74 65 45  t = Y;.  sqliteE
5cb0: 78 70 72 53 70 61 6e 28 41 2c 20 26 43 2c 20 26  xprSpan(A, &C, &
5cc0: 45 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73 65  E);.}.%type case
5cd0: 5f 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c  _exprlist {ExprL
5ce0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
5cf0: 72 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20  r case_exprlist 
5d00: 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44  {sqliteExprListD
5d10: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 63 61 73 65  elete($$);}.case
5d20: 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  _exprlist(A) ::=
5d30: 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 58   case_exprlist(X
5d40: 29 20 57 48 45 4e 20 65 78 70 72 28 59 29 20 54  ) WHEN expr(Y) T
5d50: 48 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20  HEN expr(Z). {. 
5d60: 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c   A = sqliteExprL
5d70: 69 73 74 41 70 70 65 6e 64 28 58 2c 20 59 2c 20  istAppend(X, Y, 
5d80: 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  0);.  A = sqlite
5d90: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 41  ExprListAppend(A
5da0: 2c 20 5a 2c 20 30 29 3b 0a 7d 0a 63 61 73 65 5f  , Z, 0);.}.case_
5db0: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20  exprlist(A) ::= 
5dc0: 57 48 45 4e 20 65 78 70 72 28 59 29 20 54 48 45  WHEN expr(Y) THE
5dd0: 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20 20 41  N expr(Z). {.  A
5de0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
5df0: 74 41 70 70 65 6e 64 28 30 2c 20 59 2c 20 30 29  tAppend(0, Y, 0)
5e00: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  ;.  A = sqliteEx
5e10: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 41 2c 20  prListAppend(A, 
5e20: 5a 2c 20 30 29 3b 0a 7d 0a 25 74 79 70 65 20 63  Z, 0);.}.%type c
5e30: 61 73 65 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d  ase_else {Expr*}
5e40: 0a 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a  .case_else(A) ::
5e50: 3d 20 20 45 4c 53 45 20 65 78 70 72 28 58 29 2e  =  ELSE expr(X).
5e60: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
5e70: 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a  }.case_else(A) :
5e80: 3a 3d 20 20 2e 20 20 20 20 20 20 20 20 20 20 20  :=  .           
5e90: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
5ea0: 3b 7d 20 0a 25 74 79 70 65 20 63 61 73 65 5f 6f  ;} .%type case_o
5eb0: 70 65 72 61 6e 64 20 7b 45 78 70 72 2a 7d 0a 63  perand {Expr*}.c
5ec0: 61 73 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a  ase_operand(A) :
5ed0: 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 20 20  := expr(X).     
5ee0: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 20         {A = X;} 
5ef0: 0a 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 41 29  .case_operand(A)
5f00: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
5f10: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
5f20: 7d 20 0a 0a 25 74 79 70 65 20 65 78 70 72 6c 69  } ..%type exprli
5f30: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
5f40: 64 65 73 74 72 75 63 74 6f 72 20 65 78 70 72 6c  destructor exprl
5f50: 69 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c  ist {sqliteExprL
5f60: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
5f70: 25 74 79 70 65 20 65 78 70 72 69 74 65 6d 20 7b  %type expritem {
5f80: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
5f90: 6f 72 20 65 78 70 72 69 74 65 6d 20 7b 73 71 6c  or expritem {sql
5fa0: 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 24 24  iteExprDelete($$
5fb0: 29 3b 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29  );}..exprlist(A)
5fc0: 20 3a 3a 3d 20 65 78 70 72 6c 69 73 74 28 58 29   ::= exprlist(X)
5fd0: 20 43 4f 4d 4d 41 20 65 78 70 72 69 74 65 6d 28   COMMA expritem(
5fe0: 59 29 2e 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c  Y). .   {A = sql
5ff0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
6000: 64 28 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 6c  d(X,Y,0);}.exprl
6010: 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 69  ist(A) ::= expri
6020: 74 65 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20  tem(X).         
6030: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
6040: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 58  prListAppend(0,X
6050: 2c 30 29 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41  ,0);}.expritem(A
6060: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20  ) ::= expr(X).  
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
6080: 20 3d 20 58 3b 7d 0a 65 78 70 72 69 74 65 6d 28   = X;}.expritem(
6090: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
60b0: 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  A = 0;}..///////
60c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60d0: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54  ////// The CREAT
60e0: 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20  E INDEX command 
60f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6100: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
6110: 3a 3d 20 43 52 45 41 54 45 28 53 29 20 75 6e 69  := CREATE(S) uni
6120: 71 75 65 66 6c 61 67 28 55 29 20 49 4e 44 45 58  queflag(U) INDEX
6130: 20 6e 6d 28 58 29 0a 20 20 20 20 20 20 20 20 4f   nm(X).        O
6140: 4e 20 6e 6d 28 59 29 20 4c 50 20 69 64 78 6c 69  N nm(Y) LP idxli
6150: 73 74 28 5a 29 20 52 50 28 45 29 20 6f 6e 63 6f  st(Z) RP(E) onco
6160: 6e 66 28 52 29 2e 20 7b 0a 20 20 69 66 28 20 55  nf(R). {.  if( U
6170: 21 3d 4f 45 5f 4e 6f 6e 65 20 29 20 55 20 3d 20  !=OE_None ) U = 
6180: 52 3b 0a 20 20 69 66 28 20 55 3d 3d 4f 45 5f 44  R;.  if( U==OE_D
6190: 65 66 61 75 6c 74 29 20 55 20 3d 20 4f 45 5f 41  efault) U = OE_A
61a0: 62 6f 72 74 3b 0a 20 20 73 71 6c 69 74 65 43 72  bort;.  sqliteCr
61b0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
61c0: 2c 20 26 58 2c 20 26 59 2c 20 5a 2c 20 55 2c 20  , &X, &Y, Z, U, 
61d0: 26 53 2c 20 26 45 29 3b 0a 7d 0a 0a 25 74 79 70  &S, &E);.}..%typ
61e0: 65 20 75 6e 69 71 75 65 66 6c 61 67 20 7b 69 6e  e uniqueflag {in
61f0: 74 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28 41 29  t}.uniqueflag(A)
6200: 20 3a 3a 3d 20 55 4e 49 51 55 45 2e 20 20 7b 20   ::= UNIQUE.  { 
6210: 41 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 20 7d 0a  A = OE_Abort; }.
6220: 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a 3a  uniqueflag(A) ::
6230: 3d 20 2e 20 20 20 20 20 20 20 20 7b 20 41 20 3d  = .        { A =
6240: 20 4f 45 5f 4e 6f 6e 65 3b 20 7d 0a 0a 25 74 79   OE_None; }..%ty
6250: 70 65 20 69 64 78 6c 69 73 74 20 7b 49 64 4c 69  pe idxlist {IdLi
6260: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
6270: 20 69 64 78 6c 69 73 74 20 7b 73 71 6c 69 74 65   idxlist {sqlite
6280: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  IdListDelete($$)
6290: 3b 7d 0a 25 74 79 70 65 20 69 64 78 6c 69 73 74  ;}.%type idxlist
62a0: 5f 6f 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25  _opt {IdList*}.%
62b0: 64 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c 69  destructor idxli
62c0: 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 49 64  st_opt {sqliteId
62d0: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
62e0: 0a 25 74 79 70 65 20 69 64 78 69 74 65 6d 20 7b  .%type idxitem {
62f0: 54 6f 6b 65 6e 7d 0a 0a 69 64 78 6c 69 73 74 5f  Token}..idxlist_
6300: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(A) ::= .    
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 64       {A = 0;}.id
6330: 78 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  xlist_opt(A) ::=
6340: 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52   LP idxlist(X) R
6350: 50 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20  P.         {A = 
6360: 58 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a  X;}.idxlist(A) :
6370: 3a 3d 20 69 64 78 6c 69 73 74 28 58 29 20 43 4f  := idxlist(X) CO
6380: 4d 4d 41 20 69 64 78 69 74 65 6d 28 59 29 2e 20  MMA idxitem(Y). 
6390: 20 7b 41 20 3d 20 73 71 6c 69 74 65 49 64 4c 69   {A = sqliteIdLi
63a0: 73 74 41 70 70 65 6e 64 28 58 2c 26 59 29 3b 7d  stAppend(X,&Y);}
63b0: 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20  .idxlist(A) ::= 
63c0: 69 64 78 69 74 65 6d 28 59 29 2e 20 20 20 20 20  idxitem(Y).     
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
63e0: 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41   = sqliteIdListA
63f0: 70 70 65 6e 64 28 30 2c 26 59 29 3b 7d 0a 69 64  ppend(0,&Y);}.id
6400: 78 69 74 65 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28  xitem(A) ::= nm(
6410: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
6420: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
6430: 58 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  X;}..///////////
6440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6450: 2f 2f 20 54 68 65 20 44 52 4f 50 20 49 4e 44 45  // The DROP INDE
6460: 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  X command //////
6470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6480: 2f 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20  ///.//..cmd ::= 
6490: 44 52 4f 50 20 49 4e 44 45 58 20 6e 6d 28 58 29  DROP INDEX nm(X)
64a0: 2e 20 20 20 20 20 20 7b 73 71 6c 69 74 65 44 72  .      {sqliteDr
64b0: 6f 70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  opIndex(pParse, 
64c0: 26 58 29 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  &X);}...////////
64d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
64e0: 2f 2f 2f 2f 2f 20 54 68 65 20 43 4f 50 59 20 63  ///// The COPY c
64f0: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
6500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6510: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
6520: 3d 20 43 4f 50 59 20 6f 72 63 6f 6e 66 28 52 29  = COPY orconf(R)
6530: 20 6e 6d 28 58 29 20 46 52 4f 4d 20 6e 6d 28 59   nm(X) FROM nm(Y
6540: 29 20 55 53 49 4e 47 20 44 45 4c 49 4d 49 54 45  ) USING DELIMITE
6550: 52 53 20 53 54 52 49 4e 47 28 5a 29 2e 0a 20 20  RS STRING(Z)..  
6560: 20 20 7b 73 71 6c 69 74 65 43 6f 70 79 28 70 50    {sqliteCopy(pP
6570: 61 72 73 65 2c 26 58 2c 26 59 2c 26 5a 2c 52 29  arse,&X,&Y,&Z,R)
6580: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 43 4f 50 59 20  ;}.cmd ::= COPY 
6590: 6f 72 63 6f 6e 66 28 52 29 20 6e 6d 28 58 29 20  orconf(R) nm(X) 
65a0: 46 52 4f 4d 20 6e 6d 28 59 29 2e 0a 20 20 20 20  FROM nm(Y)..    
65b0: 7b 73 71 6c 69 74 65 43 6f 70 79 28 70 50 61 72  {sqliteCopy(pPar
65c0: 73 65 2c 26 58 2c 26 59 2c 30 2c 52 29 3b 7d 0a  se,&X,&Y,0,R);}.
65d0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
65e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
65f0: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
6600: 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  d //////////////
6610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
6620: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55  //.cmd ::= VACUU
6630: 4d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M.              
6640: 20 20 7b 73 71 6c 69 74 65 56 61 63 75 75 6d 28    {sqliteVacuum(
6650: 70 50 61 72 73 65 2c 30 29 3b 7d 0a 63 6d 64 20  pParse,0);}.cmd 
6660: 3a 3a 3d 20 56 41 43 55 55 4d 20 6e 6d 28 58 29  ::= VACUUM nm(X)
6670: 2e 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74  .         {sqlit
6680: 65 56 61 63 75 75 6d 28 70 50 61 72 73 65 2c 26  eVacuum(pParse,&
6690: 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  X);}..//////////
66a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
66b0: 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d 41 20 63  /// The PRAGMA c
66c0: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
66d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
66e0: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
66f0: 50 52 41 47 4d 41 20 69 64 73 28 58 29 20 45 51  PRAGMA ids(X) EQ
6700: 20 6e 6d 28 59 29 2e 20 20 20 20 20 20 20 20 20   nm(Y).         
6710: 7b 73 71 6c 69 74 65 50 72 61 67 6d 61 28 70 50  {sqlitePragma(pP
6720: 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b 7d 0a  arse,&X,&Y,0);}.
6730: 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 69  cmd ::= PRAGMA i
6740: 64 73 28 58 29 20 45 51 20 4f 4e 28 59 29 2e 20  ds(X) EQ ON(Y). 
6750: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
6760: 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58  Pragma(pParse,&X
6770: 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  ,&Y,0);}.cmd ::=
6780: 20 50 52 41 47 4d 41 20 69 64 73 28 58 29 20 45   PRAGMA ids(X) E
6790: 51 20 70 6c 75 73 5f 6e 75 6d 28 59 29 2e 20 20  Q plus_num(Y).  
67a0: 20 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61 28    {sqlitePragma(
67b0: 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b  pParse,&X,&Y,0);
67c0: 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41  }.cmd ::= PRAGMA
67d0: 20 69 64 73 28 58 29 20 45 51 20 6d 69 6e 75 73   ids(X) EQ minus
67e0: 5f 6e 75 6d 28 59 29 2e 20 20 20 7b 73 71 6c 69  _num(Y).   {sqli
67f0: 74 65 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  tePragma(pParse,
6800: 26 58 2c 26 59 2c 31 29 3b 7d 0a 63 6d 64 20 3a  &X,&Y,1);}.cmd :
6810: 3a 3d 20 50 52 41 47 4d 41 20 69 64 73 28 58 29  := PRAGMA ids(X)
6820: 20 4c 50 20 6e 6d 28 59 29 20 52 50 2e 20 20 20   LP nm(Y) RP.   
6830: 20 20 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61     {sqlitePragma
6840: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29  (pParse,&X,&Y,0)
6850: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  ;}.cmd ::= PRAGM
6860: 41 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20  A ids(X).       
6870: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
6880: 69 74 65 50 72 61 67 6d 61 28 70 50 61 72 73 65  itePragma(pParse
6890: 2c 26 58 2c 26 58 2c 30 29 3b 7d 0a 70 6c 75 73  ,&X,&X,0);}.plus
68a0: 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73  _num(A) ::= plus
68b0: 5f 6f 70 74 20 6e 75 6d 62 65 72 28 58 29 2e 20  _opt number(X). 
68c0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75 73    {A = X;}.minus
68d0: 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e 55  _num(A) ::= MINU
68e0: 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20  S number(X).    
68f0: 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72   {A = X;}.number
6900: 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 28  (A) ::= INTEGER(
6910: 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75  X).  {A = X;}.nu
6920: 6d 62 65 72 28 41 29 20 3a 3a 3d 20 46 4c 4f 41  mber(A) ::= FLOA
6930: 54 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b  T(X).    {A = X;
6940: 7d 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d 20 50  }.plus_opt ::= P
6950: 4c 55 53 2e 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a  LUS..plus_opt ::
6960: 3d 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  = ...///////////
6970: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6980: 2f 20 54 68 65 20 43 52 45 41 54 45 20 54 52 49  / The CREATE TRI
6990: 47 47 45 52 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  GGER command ///
69a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
69b0: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54  //.cmd ::= CREAT
69c0: 45 28 41 29 20 54 52 49 47 47 45 52 20 6e 6d 28  E(A) TRIGGER nm(
69d0: 42 29 20 74 72 69 67 67 65 72 5f 74 69 6d 65 28  B) trigger_time(
69e0: 43 29 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74  C) trigger_event
69f0: 28 44 29 20 4f 4e 20 6e 6d 28 45 29 20 0a 20 20  (D) ON nm(E) .  
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28 46  foreach_clause(F
6a20: 29 20 77 68 65 6e 5f 63 6c 61 75 73 65 28 47 29  ) when_clause(G)
6a30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6a40: 20 20 20 42 45 47 49 4e 20 74 72 69 67 67 65 72     BEGIN trigger
6a50: 5f 63 6d 64 5f 6c 69 73 74 28 53 29 20 45 4e 44  _cmd_list(S) END
6a60: 28 5a 29 2e 20 7b 0a 20 20 54 6f 6b 65 6e 20 61  (Z). {.  Token a
6a70: 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a 20 3d 20 41 2e  ll;.  all.z = A.
6a80: 7a 3b 0a 20 20 61 6c 6c 2e 6e 20 3d 20 28 5a 2e  z;.  all.n = (Z.
6a90: 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a 2e 6e 3b 0a  z - A.z) + Z.n;.
6aa0: 20 20 73 71 6c 69 74 65 43 72 65 61 74 65 54 72    sqliteCreateTr
6ab0: 69 67 67 65 72 28 70 50 61 72 73 65 2c 20 26 42  igger(pParse, &B
6ac0: 2c 20 43 2c 20 44 2e 61 2c 20 44 2e 62 2c 20 26  , C, D.a, D.b, &
6ad0: 45 2c 20 46 2c 20 47 2c 20 53 2c 20 26 61 6c 6c  E, F, G, S, &all
6ae0: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 74 72 69 67  );.}..%type trig
6af0: 67 65 72 5f 74 69 6d 65 20 20 7b 69 6e 74 7d 0a  ger_time  {int}.
6b00: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20  trigger_time(A) 
6b10: 3a 3a 3d 20 42 45 46 4f 52 45 2e 20 20 20 20 20  ::= BEFORE.     
6b20: 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46 4f 52 45   { A = TK_BEFORE
6b30: 3b 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65  ; }.trigger_time
6b40: 28 41 29 20 3a 3a 3d 20 41 46 54 45 52 2e 20 20  (A) ::= AFTER.  
6b50: 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 41 46       { A = TK_AF
6b60: 54 45 52 3b 20 20 7d 0a 74 72 69 67 67 65 72 5f  TER;  }.trigger_
6b70: 74 69 6d 65 28 41 29 20 3a 3a 3d 20 49 4e 53 54  time(A) ::= INST
6b80: 45 41 44 20 4f 46 2e 20 20 7b 20 41 20 3d 20 54  EAD OF.  { A = T
6b90: 4b 5f 49 4e 53 54 45 41 44 3b 7d 0a 74 72 69 67  K_INSTEAD;}.trig
6ba0: 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20  ger_time(A) ::= 
6bb0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41  .            { A
6bc0: 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a   = TK_BEFORE; }.
6bd0: 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 65  .%type trigger_e
6be0: 76 65 6e 74 20 7b 73 74 72 75 63 74 20 54 72 69  vent {struct Tri
6bf0: 67 45 76 65 6e 74 7d 0a 25 64 65 73 74 72 75 63  gEvent}.%destruc
6c00: 74 6f 72 20 74 72 69 67 67 65 72 5f 65 76 65 6e  tor trigger_even
6c10: 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44  t {sqliteIdListD
6c20: 65 6c 65 74 65 28 24 24 2e 62 29 3b 7d 0a 74 72  elete($$.b);}.tr
6c30: 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a  igger_event(A) :
6c40: 3a 3d 20 44 45 4c 45 54 45 2e 20 7b 20 41 2e 61  := DELETE. { A.a
6c50: 20 3d 20 54 4b 5f 44 45 4c 45 54 45 3b 20 41 2e   = TK_DELETE; A.
6c60: 62 20 3d 20 30 3b 20 7d 0a 74 72 69 67 67 65 72  b = 0; }.trigger
6c70: 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 49 4e  _event(A) ::= IN
6c80: 53 45 52 54 2e 20 7b 20 41 2e 61 20 3d 20 54 4b  SERT. { A.a = TK
6c90: 5f 49 4e 53 45 52 54 3b 20 41 2e 62 20 3d 20 30  _INSERT; A.b = 0
6ca0: 3b 20 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e  ; }.trigger_even
6cb0: 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45 2e  t(A) ::= UPDATE.
6cc0: 20 7b 20 41 2e 61 20 3d 20 54 4b 5f 55 50 44 41   { A.a = TK_UPDA
6cd0: 54 45 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72  TE; A.b = 0;}.tr
6ce0: 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a  igger_event(A) :
6cf0: 3a 3d 20 55 50 44 41 54 45 20 4f 46 20 69 6e 73  := UPDATE OF ins
6d00: 63 6f 6c 6c 69 73 74 28 58 29 2e 20 7b 41 2e 61  collist(X). {A.a
6d10: 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b 20 41 2e   = TK_UPDATE; A.
6d20: 62 20 3d 20 58 3b 20 7d 0a 0a 25 74 79 70 65 20  b = X; }..%type 
6d30: 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 20 7b  foreach_clause {
6d40: 69 6e 74 7d 0a 66 6f 72 65 61 63 68 5f 63 6c 61  int}.foreach_cla
6d50: 75 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  use(A) ::= .    
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6d70: 20 41 20 3d 20 54 4b 5f 52 4f 57 3b 20 7d 0a 66   A = TK_ROW; }.f
6d80: 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28 41 29  oreach_clause(A)
6d90: 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 52 4f   ::= FOR EACH RO
6da0: 57 2e 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54  W.       { A = T
6db0: 4b 5f 52 4f 57 3b 20 7d 0a 66 6f 72 65 61 63 68  K_ROW; }.foreach
6dc0: 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 46  _clause(A) ::= F
6dd0: 4f 52 20 45 41 43 48 20 53 54 41 54 45 4d 45 4e  OR EACH STATEMEN
6de0: 54 2e 20 7b 20 41 20 3d 20 54 4b 5f 53 54 41 54  T. { A = TK_STAT
6df0: 45 4d 45 4e 54 3b 20 7d 0a 0a 25 74 79 70 65 20  EMENT; }..%type 
6e00: 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 45 78 70  when_clause {Exp
6e10: 72 20 2a 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65  r *}.when_clause
6e20: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
6e30: 20 20 20 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d        { A = 0; }
6e40: 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20  .when_clause(A) 
6e50: 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 58 29  ::= WHEN expr(X)
6e60: 2e 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 0a 25 74  . { A = X; }..%t
6e70: 79 70 65 20 74 72 69 67 67 65 72 5f 63 6d 64 5f  ype trigger_cmd_
6e80: 6c 69 73 74 20 7b 54 72 69 67 67 65 72 53 74 65  list {TriggerSte
6e90: 70 20 2a 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64  p *}.trigger_cmd
6ea0: 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72 69  _list(A) ::= tri
6eb0: 67 67 65 72 5f 63 6d 64 28 58 29 20 53 45 4d 49  gger_cmd(X) SEMI
6ec0: 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73   trigger_cmd_lis
6ed0: 74 28 59 29 2e 20 7b 0a 20 20 58 2d 3e 70 4e 65  t(Y). {.  X->pNe
6ee0: 78 74 20 3d 20 59 20 3b 20 41 20 3d 20 58 3b 20  xt = Y ; A = X; 
6ef0: 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  }.trigger_cmd_li
6f00: 73 74 28 41 29 20 3a 3a 3d 20 2e 20 7b 20 41 20  st(A) ::= . { A 
6f10: 3d 20 30 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72  = 0; }..%type tr
6f20: 69 67 67 65 72 5f 63 6d 64 20 7b 54 72 69 67 67  igger_cmd {Trigg
6f30: 65 72 53 74 65 70 20 2a 7d 0a 2f 2f 20 55 50 44  erStep *}.// UPD
6f40: 41 54 45 20 0a 74 72 69 67 67 65 72 5f 63 6d 64  ATE .trigger_cmd
6f50: 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45 20 6f  (A) ::= UPDATE o
6f60: 72 63 6f 6e 66 28 52 29 20 6e 6d 28 58 29 20 53  rconf(R) nm(X) S
6f70: 45 54 20 73 65 74 6c 69 73 74 28 59 29 20 77 68  ET setlist(Y) wh
6f80: 65 72 65 5f 6f 70 74 28 5a 29 2e 20 20 0a 20 20  ere_opt(Z).  .  
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
6fa0: 20 3d 20 73 71 6c 69 74 65 54 72 69 67 67 65 72   = sqliteTrigger
6fb0: 55 70 64 61 74 65 53 74 65 70 28 26 58 2c 20 59  UpdateStep(&X, Y
6fc0: 2c 20 5a 2c 20 52 29 3b 20 7d 0a 0a 2f 2f 20 49  , Z, R); }..// I
6fd0: 4e 53 45 52 54 0a 74 72 69 67 67 65 72 5f 63 6d  NSERT.trigger_cm
6fe0: 64 28 41 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20  d(A) ::= INSERT 
6ff0: 6f 72 63 6f 6e 66 28 52 29 20 49 4e 54 4f 20 6e  orconf(R) INTO n
7000: 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f  m(X) inscollist_
7010: 6f 70 74 28 46 29 20 0a 20 20 56 41 4c 55 45 53  opt(F) .  VALUES
7020: 20 4c 50 20 69 74 65 6d 6c 69 73 74 28 59 29 20   LP itemlist(Y) 
7030: 52 50 2e 20 20 0a 7b 41 20 3d 20 73 71 6c 69 74  RP.  .{A = sqlit
7040: 65 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74  eTriggerInsertSt
7050: 65 70 28 26 58 2c 20 46 2c 20 59 2c 20 30 2c 20  ep(&X, F, Y, 0, 
7060: 52 29 3b 7d 0a 0a 74 72 69 67 67 65 72 5f 63 6d  R);}..trigger_cm
7070: 64 28 41 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20  d(A) ::= INSERT 
7080: 6f 72 63 6f 6e 66 28 52 29 20 49 4e 54 4f 20 6e  orconf(R) INTO n
7090: 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f  m(X) inscollist_
70a0: 6f 70 74 28 46 29 20 73 65 6c 65 63 74 28 53 29  opt(F) select(S)
70b0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
70c0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 54 72 69 67   {A = sqliteTrig
70d0: 67 65 72 49 6e 73 65 72 74 53 74 65 70 28 26 58  gerInsertStep(&X
70e0: 2c 20 46 2c 20 30 2c 20 53 2c 20 52 29 3b 7d 0a  , F, 0, S, R);}.
70f0: 0a 2f 2f 20 44 45 4c 45 54 45 0a 74 72 69 67 67  .// DELETE.trigg
7100: 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45  er_cmd(A) ::= DE
7110: 4c 45 54 45 20 46 52 4f 4d 20 6e 6d 28 58 29 20  LETE FROM nm(X) 
7120: 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 0a 20 20  where_opt(Y)..  
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
7140: 3d 20 73 71 6c 69 74 65 54 72 69 67 67 65 72 44  = sqliteTriggerD
7150: 65 6c 65 74 65 53 74 65 70 28 26 58 2c 20 59 29  eleteStep(&X, Y)
7160: 3b 7d 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a 74 72  ;}..// SELECT.tr
7170: 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d  igger_cmd(A) ::=
7180: 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b 41 20   select(X).  {A 
7190: 3d 20 73 71 6c 69 74 65 54 72 69 67 67 65 72 53  = sqliteTriggerS
71a0: 65 6c 65 63 74 53 74 65 70 28 58 29 3b 20 7d 0a  electStep(X); }.
71b0: 0a 2f 2f 20 54 68 65 20 73 70 65 63 69 61 6c 20  .// The special 
71c0: 52 41 49 53 45 20 65 78 70 72 65 73 73 69 6f 6e  RAISE expression
71d0: 20 74 68 61 74 20 6d 61 79 20 6f 63 63 75 72 20   that may occur 
71e0: 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  in trigger progr
71f0: 61 6d 73 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ams.expr(A) ::= 
7200: 52 41 49 53 45 28 58 29 20 4c 50 20 49 47 4e 4f  RAISE(X) LP IGNO
7210: 52 45 20 52 50 28 59 29 2e 20 20 7b 0a 20 20 41  RE RP(Y).  {.  A
7220: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
7230: 5f 52 41 49 53 45 2c 20 30 2c 20 30 2c 20 30 29  _RAISE, 0, 0, 0)
7240: 3b 20 0a 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20  ; .  A->iColumn 
7250: 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 0a 20 20 73  = OE_Ignore;.  s
7260: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c  qliteExprSpan(A,
7270: 20 26 58 2c 20 26 59 29 3b 0a 7d 0a 65 78 70 72   &X, &Y);.}.expr
7280: 28 41 29 20 3a 3a 3d 20 52 41 49 53 45 28 58 29  (A) ::= RAISE(X)
7290: 20 4c 50 20 52 4f 4c 4c 42 41 43 4b 20 43 4f 4d   LP ROLLBACK COM
72a0: 4d 41 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20  MA nm(Z) RP(Y). 
72b0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45   {.  A = sqliteE
72c0: 78 70 72 28 54 4b 5f 52 41 49 53 45 2c 20 30 2c  xpr(TK_RAISE, 0,
72d0: 20 30 2c 20 26 5a 29 3b 20 0a 20 20 41 2d 3e 69   0, &Z); .  A->i
72e0: 43 6f 6c 75 6d 6e 20 3d 20 4f 45 5f 52 6f 6c 6c  Column = OE_Roll
72f0: 62 61 63 6b 3b 0a 20 20 73 71 6c 69 74 65 45 78  back;.  sqliteEx
7300: 70 72 53 70 61 6e 28 41 2c 20 26 58 2c 20 26 59  prSpan(A, &X, &Y
7310: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
7320: 20 52 41 49 53 45 28 58 29 20 4c 50 20 41 42 4f   RAISE(X) LP ABO
7330: 52 54 20 43 4f 4d 4d 41 20 6e 6d 28 5a 29 20 52  RT COMMA nm(Z) R
7340: 50 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73  P(Y).  {.  A = s
7350: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 52 41 49  qliteExpr(TK_RAI
7360: 53 45 2c 20 30 2c 20 30 2c 20 26 5a 29 3b 20 0a  SE, 0, 0, &Z); .
7370: 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 4f    A->iColumn = O
7380: 45 5f 41 62 6f 72 74 3b 0a 20 20 73 71 6c 69 74  E_Abort;.  sqlit
7390: 65 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58 2c  eExprSpan(A, &X,
73a0: 20 26 59 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20   &Y);.}.expr(A) 
73b0: 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20  ::= RAISE(X) LP 
73c0: 46 41 49 4c 20 43 4f 4d 4d 41 20 6e 6d 28 5a 29  FAIL COMMA nm(Z)
73d0: 20 52 50 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d   RP(Y).  {.  A =
73e0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 52   sqliteExpr(TK_R
73f0: 41 49 53 45 2c 20 30 2c 20 30 2c 20 26 5a 29 3b  AISE, 0, 0, &Z);
7400: 20 0a 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d   .  A->iColumn =
7410: 20 4f 45 5f 46 61 69 6c 3b 0a 20 20 73 71 6c 69   OE_Fail;.  sqli
7420: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58  teExprSpan(A, &X
7430: 2c 20 26 59 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f  , &Y);.}..//////
7440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7450: 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45 52  //  DROP TRIGGER
7460: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
7470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
7480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64 20 3a 3a  /////////.cmd ::
7490: 3d 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 6e  = DROP TRIGGER n
74a0: 6d 28 58 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69  m(X). {.    sqli
74b0: 74 65 44 72 6f 70 54 72 69 67 67 65 72 28 70 50  teDropTrigger(pP
74c0: 61 72 73 65 2c 26 58 2c 30 29 3b 0a 7d 0a        arse,&X,0);.}.