/ Hex Artifact Content
Login

Artifact c681da701bf142967325b8791f22418e2d81552d:


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 36 39 20 32 30 30 32 2f 30 35 2f 32 34 20 31  .69 2002/05/24 1
0290: 36 3a 31 34 3a 31 35 20 64 72 68 20 45 78 70 20  6:14:15 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 73 71 6c 69 74 65 53 65 74 53 74 72 69  .  sqliteSetStri
0320: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
0330: 4d 73 67 2c 22 73 79 6e 74 61 78 20 65 72 72 6f  Msg,"syntax erro
0340: 72 22 2c 30 29 3b 0a 20 20 70 50 61 72 73 65 2d  r",0);.  pParse-
0350: 3e 73 45 72 72 54 6f 6b 65 6e 20 3d 20 54 4f 4b  >sErrToken = TOK
0360: 45 4e 3b 0a 7d 0a 25 6e 61 6d 65 20 73 71 6c 69  EN;.}.%name sqli
0370: 74 65 50 61 72 73 65 72 0a 25 69 6e 63 6c 75 64  teParser.%includ
0380: 65 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  e {.#include "sq
0390: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
03a0: 75 64 65 20 22 70 61 72 73 65 2e 68 22 0a 0a 2f  ude "parse.h"../
03b0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
03c0: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
03d0: 72 65 20 68 6f 6c 64 73 20 69 6e 66 6f 72 6d 61  re holds informa
03e0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 0a 2a  tion about the.*
03f0: 2a 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 20 6f  * LIMIT clause o
0400: 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
0410: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ment..*/.struct 
0420: 4c 69 6d 69 74 56 61 6c 20 7b 0a 20 20 69 6e 74  LimitVal {.  int
0430: 20 6c 69 6d 69 74 3b 20 20 20 20 2f 2a 20 54 68   limit;    /* Th
0440: 65 20 4c 49 4d 49 54 20 76 61 6c 75 65 2e 20 20  e LIMIT value.  
0450: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  -1 if there is n
0460: 6f 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 69 6e 74  o limit */.  int
0470: 20 6f 66 66 73 65 74 3b 20 20 20 2f 2a 20 54 68   offset;   /* Th
0480: 65 20 4f 46 46 53 45 54 2e 20 20 30 20 69 66 20  e OFFSET.  0 if 
0490: 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 20 2a 2f  there is none */
04a0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .};../*.** An in
04b0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
04c0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
04d0: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
04e0: 65 76 65 6e 74 20 6f 66 20 61 0a 2a 2a 20 54 52  event of a.** TR
04f0: 49 47 47 45 52 2e 20 20 22 61 22 20 69 73 20 74  IGGER.  "a" is t
0500: 68 65 20 65 76 65 6e 74 20 74 79 70 65 2c 20 6f  he event type, o
0510: 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c  ne of TK_UPDATE,
0520: 20 54 4b 5f 49 4e 53 45 52 54 2c 0a 2a 2a 20 54   TK_INSERT,.** T
0530: 4b 5f 44 45 4c 45 54 45 2c 20 6f 72 20 54 4b 5f  K_DELETE, or TK_
0540: 49 4e 53 54 45 41 44 2e 20 20 49 66 20 74 68 65  INSTEAD.  If the
0550: 20 65 76 65 6e 74 20 69 73 20 6f 66 20 74 68 65   event is of the
0560: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20   form.**.**     
0570: 20 55 50 44 41 54 45 20 4f 4e 20 28 61 2c 62 2c   UPDATE ON (a,b,
0580: 63 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68  c).**.** Then th
0590: 65 20 22 62 22 20 49 64 4c 69 73 74 20 72 65 63  e "b" IdList rec
05a0: 6f 72 64 73 20 74 68 65 20 6c 69 73 74 20 22 61  ords the list "a
05b0: 2c 62 2c 63 22 2e 0a 2a 2f 0a 73 74 72 75 63 74  ,b,c"..*/.struct
05c0: 20 54 72 69 67 45 76 65 6e 74 20 7b 20 69 6e 74   TrigEvent { int
05d0: 20 61 3b 20 49 64 4c 69 73 74 20 2a 20 62 3b 20   a; IdList * b; 
05e0: 7d 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 73 65 20 61  };.}..// These a
05f0: 72 65 20 65 78 74 72 61 20 74 6f 6b 65 6e 73 20  re extra tokens 
0600: 75 73 65 64 20 62 79 20 74 68 65 20 6c 65 78 65  used by the lexe
0610: 72 20 62 75 74 20 6e 65 76 65 72 20 73 65 65 6e  r but never seen
0620: 20 62 79 20 74 68 65 0a 2f 2f 20 70 61 72 73 65   by the.// parse
0630: 72 2e 20 20 57 65 20 70 75 74 20 74 68 65 6d 20  r.  We put them 
0640: 69 6e 20 61 20 72 75 6c 65 20 73 6f 20 74 68 61  in a rule so tha
0650: 74 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e  t the parser gen
0660: 65 72 61 74 6f 72 20 77 69 6c 6c 0a 2f 2f 20 61  erator will.// a
0670: 64 64 20 74 68 65 6d 20 74 6f 20 74 68 65 20 70  dd them to the p
0680: 61 72 73 65 2e 68 20 6f 75 74 70 75 74 20 66 69  arse.h output fi
0690: 6c 65 2e 0a 2f 2f 0a 25 6e 6f 6e 61 73 73 6f 63  le..//.%nonassoc
06a0: 20 45 4e 44 5f 4f 46 5f 46 49 4c 45 20 49 4c 4c   END_OF_FILE ILL
06b0: 45 47 41 4c 20 53 50 41 43 45 20 55 4e 43 4c 4f  EGAL SPACE UNCLO
06c0: 53 45 44 5f 53 54 52 49 4e 47 20 43 4f 4d 4d 45  SED_STRING COMME
06d0: 4e 54 20 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20  NT FUNCTION.    
06e0: 20 20 20 20 20 20 43 4f 4c 55 4d 4e 20 41 47 47        COLUMN AGG
06f0: 5f 46 55 4e 43 54 49 4f 4e 2e 0a 0a 2f 2f 20 49  _FUNCTION...// I
0700: 6e 70 75 74 20 69 73 20 7a 65 72 6f 20 6f 72 20  nput is zero or 
0710: 6d 6f 72 65 20 63 6f 6d 6d 61 6e 64 73 2e 0a 69  more commands..i
0720: 6e 70 75 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74  nput ::= cmdlist
0730: 2e 0a 0a 2f 2f 20 41 20 6c 69 73 74 20 6f 66 20  ...// A list of 
0740: 63 6f 6d 6d 61 6e 64 73 20 69 73 20 7a 65 72 6f  commands is zero
0750: 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 6d 61 6e 64   or more command
0760: 73 0a 2f 2f 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d  s.//.cmdlist ::=
0770: 20 65 63 6d 64 2e 0a 63 6d 64 6c 69 73 74 20 3a   ecmd..cmdlist :
0780: 3a 3d 20 63 6d 64 6c 69 73 74 20 65 63 6d 64 2e  := cmdlist ecmd.
0790: 0a 65 63 6d 64 20 3a 3a 3d 20 65 78 70 6c 61 69  .ecmd ::= explai
07a0: 6e 20 63 6d 64 20 53 45 4d 49 2e 20 20 7b 73 71  n cmd SEMI.  {sq
07b0: 6c 69 74 65 45 78 65 63 28 70 50 61 72 73 65 29  liteExec(pParse)
07c0: 3b 7d 0a 65 63 6d 64 20 3a 3a 3d 20 63 6d 64 20  ;}.ecmd ::= cmd 
07d0: 53 45 4d 49 2e 20 20 20 20 20 20 20 20 20 20 7b  SEMI.          {
07e0: 73 71 6c 69 74 65 45 78 65 63 28 70 50 61 72 73  sqliteExec(pPars
07f0: 65 29 3b 7d 0a 65 63 6d 64 20 3a 3a 3d 20 53 45  e);}.ecmd ::= SE
0800: 4d 49 2e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20  MI..explain ::= 
0810: 45 58 50 4c 41 49 4e 2e 20 20 20 20 7b 70 50 61  EXPLAIN.    {pPa
0820: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 31  rse->explain = 1
0830: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
0840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69 6e 20  ///////// Begin 
0850: 61 6e 64 20 65 6e 64 20 74 72 61 6e 73 61 63 74  and end transact
0860: 69 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ions. //////////
0870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0880: 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 42  //.//..cmd ::= B
0890: 45 47 49 4e 20 74 72 61 6e 73 5f 6f 70 74 20 6f  EGIN trans_opt o
08a0: 6e 63 6f 6e 66 28 52 29 2e 20 20 7b 73 71 6c 69  nconf(R).  {sqli
08b0: 74 65 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  teBeginTransacti
08c0: 6f 6e 28 70 50 61 72 73 65 2c 52 29 3b 7d 0a 74  on(pParse,R);}.t
08d0: 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 74  rans_opt ::= ..t
08e0: 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41  rans_opt ::= TRA
08f0: 4e 53 41 43 54 49 4f 4e 2e 0a 74 72 61 6e 73 5f  NSACTION..trans_
0900: 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54  opt ::= TRANSACT
0910: 49 4f 4e 20 69 64 73 2e 0a 63 6d 64 20 3a 3a 3d  ION ids..cmd ::=
0920: 20 43 4f 4d 4d 49 54 20 74 72 61 6e 73 5f 6f 70   COMMIT trans_op
0930: 74 2e 20 20 20 20 20 20 7b 73 71 6c 69 74 65 43  t.      {sqliteC
0940: 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
0950: 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a  (pParse);}.cmd :
0960: 3a 3d 20 45 4e 44 20 74 72 61 6e 73 5f 6f 70 74  := END trans_opt
0970: 2e 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74  .         {sqlit
0980: 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  eCommitTransacti
0990: 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64  on(pParse);}.cmd
09a0: 20 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 20 74 72   ::= ROLLBACK tr
09b0: 61 6e 73 5f 6f 70 74 2e 20 20 20 20 7b 73 71 6c  ans_opt.    {sql
09c0: 69 74 65 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  iteRollbackTrans
09d0: 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d  action(pParse);}
09e0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
09f0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41  /////// The CREA
0a00: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
0a10: 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nt /////////////
0a20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
0a30: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74  //.cmd ::= creat
0a40: 65 5f 74 61 62 6c 65 20 63 72 65 61 74 65 5f 74  e_table create_t
0a50: 61 62 6c 65 5f 61 72 67 73 2e 0a 63 72 65 61 74  able_args..creat
0a60: 65 5f 74 61 62 6c 65 20 3a 3a 3d 20 43 52 45 41  e_table ::= CREA
0a70: 54 45 28 58 29 20 74 65 6d 70 28 54 29 20 54 41  TE(X) temp(T) TA
0a80: 42 4c 45 20 69 64 73 28 59 29 2e 20 7b 0a 20 20  BLE ids(Y). {.  
0a90: 20 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 6c   sqliteStartTabl
0aa0: 65 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 54  e(pParse,&X,&Y,T
0ab0: 29 3b 0a 7d 0a 25 74 79 70 65 20 74 65 6d 70 20  );.}.%type temp 
0ac0: 7b 69 6e 74 7d 0a 74 65 6d 70 28 41 29 20 3a 3a  {int}.temp(A) ::
0ad0: 3d 20 54 45 4d 50 2e 20 20 7b 41 20 3d 20 31 3b  = TEMP.  {A = 1;
0ae0: 7d 0a 74 65 6d 70 28 41 29 20 3a 3a 3d 20 2e 20  }.temp(A) ::= . 
0af0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 63 72       {A = 0;}.cr
0b00: 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 20  eate_table_args 
0b10: 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e 6c 69 73  ::= LP columnlis
0b20: 74 20 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 52  t conslist_opt R
0b30: 50 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  P(X). {.  sqlite
0b40: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
0b50: 26 58 2c 30 29 3b 0a 7d 0a 63 72 65 61 74 65 5f  &X,0);.}.create_
0b60: 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 41  table_args ::= A
0b70: 53 20 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20  S select(S). {. 
0b80: 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 28   sqliteEndTable(
0b90: 70 50 61 72 73 65 2c 30 2c 53 29 3b 0a 20 20 73  pParse,0,S);.  s
0ba0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
0bb0: 65 28 53 29 3b 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69  e(S);.}.columnli
0bc0: 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73  st ::= columnlis
0bd0: 74 20 43 4f 4d 4d 41 20 63 6f 6c 75 6d 6e 2e 0a  t COMMA column..
0be0: 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63  columnlist ::= c
0bf0: 6f 6c 75 6d 6e 2e 0a 0a 2f 2f 20 41 62 6f 75 74  olumn...// About
0c00: 20 74 68 65 20 6f 6e 6c 79 20 69 6e 66 6f 72 6d   the only inform
0c10: 61 74 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 61  ation used for a
0c20: 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 6e   column is the n
0c30: 61 6d 65 20 6f 66 20 74 68 65 0a 2f 2f 20 63 6f  ame of the.// co
0c40: 6c 75 6d 6e 2e 20 20 54 68 65 20 74 79 70 65 20  lumn.  The type 
0c50: 69 73 20 61 6c 77 61 79 73 20 6a 75 73 74 20 22  is always just "
0c60: 74 65 78 74 22 2e 20 20 42 75 74 20 74 68 65 20  text".  But the 
0c70: 63 6f 64 65 20 77 69 6c 6c 20 61 63 63 65 70 74  code will accept
0c80: 0a 2f 2f 20 61 6e 20 65 6c 61 62 6f 72 61 74 65  .// an elaborate
0c90: 20 74 79 70 65 6e 61 6d 65 2e 20 20 50 65 72 68   typename.  Perh
0ca0: 61 70 73 20 73 6f 6d 65 64 61 79 20 77 65 27 6c  aps someday we'l
0cb0: 6c 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  l do something w
0cc0: 69 74 68 20 69 74 2e 0a 2f 2f 0a 63 6f 6c 75 6d  ith it..//.colum
0cd0: 6e 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 69 64 20 74  n ::= columnid t
0ce0: 79 70 65 20 63 61 72 67 6c 69 73 74 2e 20 0a 63  ype carglist. .c
0cf0: 6f 6c 75 6d 6e 69 64 20 3a 3a 3d 20 69 64 73 28  olumnid ::= ids(
0d00: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
0d10: 20 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f 6c     {sqliteAddCol
0d20: 75 6d 6e 28 70 50 61 72 73 65 2c 26 58 29 3b 7d  umn(pParse,&X);}
0d30: 0a 0a 2f 2f 20 41 6e 20 49 44 45 4e 54 49 46 49  ..// An IDENTIFI
0d40: 45 52 20 63 61 6e 20 62 65 20 61 20 67 65 6e 65  ER can be a gene
0d50: 72 69 63 20 69 64 65 6e 74 69 66 69 65 72 2c 20  ric identifier, 
0d60: 6f 72 20 6f 6e 65 20 6f 66 20 73 65 76 65 72 61  or one of severa
0d70: 6c 0a 2f 2f 20 6b 65 79 77 6f 72 64 73 2e 20 20  l.// keywords.  
0d80: 41 6e 79 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64  Any non-standard
0d90: 20 6b 65 79 77 6f 72 64 20 63 61 6e 20 61 6c 73   keyword can als
0da0: 6f 20 62 65 20 61 6e 20 69 64 65 6e 74 69 66 69  o be an identifi
0db0: 65 72 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64 20  er..//.%type id 
0dc0: 7b 54 6f 6b 65 6e 7d 0a 69 64 28 41 29 20 3a 3a  {Token}.id(A) ::
0dd0: 3d 20 41 42 4f 52 54 28 58 29 2e 20 20 20 20 20  = ABORT(X).     
0de0: 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20   {A = X;}.id(A) 
0df0: 3a 3a 3d 20 41 46 54 45 52 28 58 29 2e 20 20 20  ::= AFTER(X).   
0e00: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41     {A = X;}.id(A
0e10: 29 20 3a 3a 3d 20 41 53 43 28 58 29 2e 20 20 20  ) ::= ASC(X).   
0e20: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64       {A = X;}.id
0e30: 28 41 29 20 3a 3a 3d 20 42 45 46 4f 52 45 28 58  (A) ::= BEFORE(X
0e40: 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a  ).     {A = X;}.
0e50: 69 64 28 41 29 20 3a 3a 3d 20 42 45 47 49 4e 28  id(A) ::= BEGIN(
0e60: 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b  X).      {A = X;
0e70: 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 43 4c 55 53  }.id(A) ::= CLUS
0e80: 54 45 52 28 58 29 2e 20 20 20 20 7b 41 20 3d 20  TER(X).    {A = 
0e90: 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 43 4f  X;}.id(A) ::= CO
0ea0: 4e 46 4c 49 43 54 28 58 29 2e 20 20 20 7b 41 20  NFLICT(X).   {A 
0eb0: 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20  = X;}.id(A) ::= 
0ec0: 43 4f 50 59 28 58 29 2e 20 20 20 20 20 20 20 7b  COPY(X).       {
0ed0: 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a  A = X;}.id(A) ::
0ee0: 3d 20 44 45 4c 49 4d 49 54 45 52 53 28 58 29 2e  = DELIMITERS(X).
0ef0: 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20   {A = X;}.id(A) 
0f00: 3a 3a 3d 20 44 45 53 43 28 58 29 2e 20 20 20 20  ::= DESC(X).    
0f10: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41     {A = X;}.id(A
0f20: 29 20 3a 3a 3d 20 45 41 43 48 28 58 29 2e 20 20  ) ::= EACH(X).  
0f30: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64       {A = X;}.id
0f40: 28 41 29 20 3a 3a 3d 20 45 4e 44 28 58 29 2e 20  (A) ::= END(X). 
0f50: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
0f60: 69 64 28 41 29 20 3a 3a 3d 20 45 58 50 4c 41 49  id(A) ::= EXPLAI
0f70: 4e 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b  N(X).    {A = X;
0f80: 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 46 41 49 4c  }.id(A) ::= FAIL
0f90: 28 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20  (X).       {A = 
0fa0: 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 46 4f  X;}.id(A) ::= FO
0fb0: 52 28 58 29 2e 20 20 20 20 20 20 20 20 7b 41 20  R(X).        {A 
0fc0: 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20  = X;}.id(A) ::= 
0fd0: 49 44 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b  ID(X).         {
0fe0: 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a  A = X;}.id(A) ::
0ff0: 3d 20 49 47 4e 4f 52 45 28 58 29 2e 20 20 20 20  = IGNORE(X).    
1000: 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20   {A = X;}.id(A) 
1010: 3a 3a 3d 20 49 4e 53 54 45 41 44 28 58 29 2e 20  ::= INSTEAD(X). 
1020: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41     {A = X;}.id(A
1030: 29 20 3a 3a 3d 20 4a 4f 49 4e 28 58 29 2e 20 20  ) ::= JOIN(X).  
1040: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64       {A = X;}.id
1050: 28 41 29 20 3a 3a 3d 20 4b 45 59 28 58 29 2e 20  (A) ::= KEY(X). 
1060: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
1070: 69 64 28 41 29 20 3a 3a 3d 20 4f 46 28 58 29 2e  id(A) ::= OF(X).
1080: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
1090: 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 4f 46 46 53  }.id(A) ::= OFFS
10a0: 45 54 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20  ET(X).     {A = 
10b0: 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 50 52  X;}.id(A) ::= PR
10c0: 41 47 4d 41 28 58 29 2e 20 20 20 20 20 7b 41 20  AGMA(X).     {A 
10d0: 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20  = X;}.id(A) ::= 
10e0: 52 45 50 4c 41 43 45 28 58 29 2e 20 20 20 20 7b  REPLACE(X).    {
10f0: 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a  A = X;}.id(A) ::
1100: 3d 20 52 4f 57 28 58 29 2e 20 20 20 20 20 20 20  = ROW(X).       
1110: 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20   {A = X;}.id(A) 
1120: 3a 3a 3d 20 53 54 41 54 45 4d 45 4e 54 28 58 29  ::= STATEMENT(X)
1130: 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41  .  {A = X;}.id(A
1140: 29 20 3a 3a 3d 20 54 45 4d 50 28 58 29 2e 20 20  ) ::= TEMP(X).  
1150: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64       {A = X;}.id
1160: 28 41 29 20 3a 3a 3d 20 54 52 49 47 47 45 52 28  (A) ::= TRIGGER(
1170: 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a  X).    {A = X;}.
1180: 69 64 28 41 29 20 3a 3a 3d 20 56 41 43 55 55 4d  id(A) ::= VACUUM
1190: 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b  (X).     {A = X;
11a0: 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 56 49 45 57  }.id(A) ::= VIEW
11b0: 28 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20  (X).       {A = 
11c0: 58 3b 7d 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73  X;}..// And "ids
11d0: 22 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 65  " is an identife
11e0: 72 2d 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a  r-or-string..//.
11f0: 25 74 79 70 65 20 69 64 73 20 7b 54 6f 6b 65 6e  %type ids {Token
1200: 7d 0a 69 64 73 28 41 29 20 3a 3a 3d 20 69 64 28  }.ids(A) ::= id(
1210: 58 29 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20  X).        {A = 
1220: 58 3b 7d 0a 69 64 73 28 41 29 20 3a 3a 3d 20 53  X;}.ids(A) ::= S
1230: 54 52 49 4e 47 28 58 29 2e 20 20 20 20 7b 41 20  TRING(X).    {A 
1240: 3d 20 58 3b 7d 0a 0a 74 79 70 65 20 3a 3a 3d 20  = X;}..type ::= 
1250: 2e 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e  ..type ::= typen
1260: 61 6d 65 28 58 29 2e 20 20 20 20 20 20 20 20 20  ame(X).         
1270: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
1280: 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  teAddColumnType(
1290: 70 50 61 72 73 65 2c 26 58 2c 26 58 29 3b 7d 0a  pParse,&X,&X);}.
12a0: 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61 6d  type ::= typenam
12b0: 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20 52  e(X) LP signed R
12c0: 50 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74 65  P(Y).    {sqlite
12d0: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70 50  AddColumnType(pP
12e0: 61 72 73 65 2c 26 58 2c 26 59 29 3b 7d 0a 74 79  arse,&X,&Y);}.ty
12f0: 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  pe ::= typename(
1300: 58 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d  X) LP signed COM
1310: 4d 41 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e  MA signed RP(Y).
1320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
1350: 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70  eAddColumnType(p
1360: 50 61 72 73 65 2c 26 58 2c 26 59 29 3b 7d 0a 25  Parse,&X,&Y);}.%
1370: 74 79 70 65 20 74 79 70 65 6e 61 6d 65 20 7b 54  type typename {T
1380: 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61 6d 65 28 41  oken}.typename(A
1390: 29 20 3a 3a 3d 20 69 64 73 28 58 29 2e 20 20 20  ) ::= ids(X).   
13a0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
13b0: 0a 74 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d  .typename(A) ::=
13c0: 20 74 79 70 65 6e 61 6d 65 28 58 29 20 69 64 73   typename(X) ids
13d0: 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 69 67 6e  .  {A = X;}.sign
13e0: 65 64 20 3a 3a 3d 20 49 4e 54 45 47 45 52 2e 0a  ed ::= INTEGER..
13f0: 73 69 67 6e 65 64 20 3a 3a 3d 20 50 4c 55 53 20  signed ::= PLUS 
1400: 49 4e 54 45 47 45 52 2e 0a 73 69 67 6e 65 64 20  INTEGER..signed 
1410: 3a 3a 3d 20 4d 49 4e 55 53 20 49 4e 54 45 47 45  ::= MINUS INTEGE
1420: 52 2e 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20  R..carglist ::= 
1430: 63 61 72 67 6c 69 73 74 20 63 61 72 67 2e 0a 63  carglist carg..c
1440: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 2e 0a 63 61  arglist ::= ..ca
1450: 72 67 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e  rg ::= CONSTRAIN
1460: 54 20 69 64 73 20 63 63 6f 6e 73 2e 0a 63 61 72  T ids ccons..car
1470: 67 20 3a 3a 3d 20 63 63 6f 6e 73 2e 0a 63 61 72  g ::= ccons..car
1480: 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 53 54  g ::= DEFAULT ST
1490: 52 49 4e 47 28 58 29 2e 20 20 20 20 20 20 20 20  RING(X).        
14a0: 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61    {sqliteAddDefa
14b0: 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  ultValue(pParse,
14c0: 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d  &X,0);}.carg ::=
14d0: 20 44 45 46 41 55 4c 54 20 49 44 28 58 29 2e 20   DEFAULT ID(X). 
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
14f0: 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61  liteAddDefaultVa
1500: 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29  lue(pParse,&X,0)
1510: 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41  ;}.carg ::= DEFA
1520: 55 4c 54 20 49 4e 54 45 47 45 52 28 58 29 2e 20  ULT INTEGER(X). 
1530: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 41          {sqliteA
1540: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70  ddDefaultValue(p
1550: 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63 61  Parse,&X,0);}.ca
1560: 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50  rg ::= DEFAULT P
1570: 4c 55 53 20 49 4e 54 45 47 45 52 28 58 29 2e 20  LUS INTEGER(X). 
1580: 20 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66     {sqliteAddDef
1590: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
15a0: 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a  ,&X,0);}.carg ::
15b0: 3d 20 44 45 46 41 55 4c 54 20 4d 49 4e 55 53 20  = DEFAULT MINUS 
15c0: 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20 7b 73  INTEGER(X).   {s
15d0: 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56  qliteAddDefaultV
15e0: 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c 31  alue(pParse,&X,1
15f0: 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46  );}.carg ::= DEF
1600: 41 55 4c 54 20 46 4c 4f 41 54 28 58 29 2e 20 20  AULT FLOAT(X).  
1610: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1620: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
1630: 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63  pParse,&X,0);}.c
1640: 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  arg ::= DEFAULT 
1650: 50 4c 55 53 20 46 4c 4f 41 54 28 58 29 2e 20 20  PLUS FLOAT(X).  
1660: 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65      {sqliteAddDe
1670: 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73  faultValue(pPars
1680: 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a  e,&X,0);}.carg :
1690: 3a 3d 20 44 45 46 41 55 4c 54 20 4d 49 4e 55 53  := DEFAULT MINUS
16a0: 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 7b   FLOAT(X).     {
16b0: 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74  sqliteAddDefault
16c0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c  Value(pParse,&X,
16d0: 31 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45  1);}.carg ::= DE
16e0: 46 41 55 4c 54 20 4e 55 4c 4c 2e 20 0a 0a 2f 2f  FAULT NULL. ..//
16f0: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
1700: 74 68 65 20 74 79 70 65 20 6e 61 6d 65 2c 20 77  the type name, w
1710: 65 20 61 6c 73 6f 20 63 61 72 65 20 61 62 6f 75  e also care abou
1720: 74 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  t the primary ke
1730: 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 55 45 20  y and.// UNIQUE 
1740: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2f 2f 0a  constraints..//.
1750: 63 63 6f 6e 73 20 3a 3a 3d 20 4e 4f 54 20 4e 55  ccons ::= NOT NU
1760: 4c 4c 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20  LL onconf(R).   
1770: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
1780: 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 70 50  iteAddNotNull(pP
1790: 61 72 73 65 2c 20 52 29 3b 7d 0a 63 63 6f 6e 73  arse, R);}.ccons
17a0: 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59   ::= PRIMARY KEY
17b0: 20 73 6f 72 74 6f 72 64 65 72 20 6f 6e 63 6f 6e   sortorder oncon
17c0: 66 28 52 29 2e 20 20 7b 73 71 6c 69 74 65 41 64  f(R).  {sqliteAd
17d0: 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72  dPrimaryKey(pPar
17e0: 73 65 2c 30 2c 52 29 3b 7d 0a 63 63 6f 6e 73 20  se,0,R);}.ccons 
17f0: 3a 3a 3d 20 55 4e 49 51 55 45 20 6f 6e 63 6f 6e  ::= UNIQUE oncon
1800: 66 28 52 29 2e 20 20 20 20 20 20 20 20 20 20 20  f(R).           
1810: 20 7b 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e   {sqliteCreateIn
1820: 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  dex(pParse,0,0,0
1830: 2c 52 2c 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20  ,R,0,0);}.ccons 
1840: 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70  ::= CHECK LP exp
1850: 72 20 52 50 20 6f 6e 63 6f 6e 66 2e 0a 0a 2f 2f  r RP onconf...//
1860: 20 46 6f 72 20 74 68 65 20 74 69 6d 65 20 62 65   For the time be
1870: 69 6e 67 2c 20 74 68 65 20 6f 6e 6c 79 20 63 6f  ing, the only co
1880: 6e 73 74 72 61 69 6e 74 20 77 65 20 63 61 72 65  nstraint we care
1890: 20 61 62 6f 75 74 20 69 73 20 74 68 65 20 70 72   about is the pr
18a0: 69 6d 61 72 79 0a 2f 2f 20 6b 65 79 20 61 6e 64  imary.// key and
18b0: 20 55 4e 49 51 55 45 2e 20 20 42 6f 74 68 20 63   UNIQUE.  Both c
18c0: 72 65 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 2f  reate indices../
18d0: 2f 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 3a  /.conslist_opt :
18e0: 3a 3d 20 2e 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70  := ..conslist_op
18f0: 74 20 3a 3a 3d 20 43 4f 4d 4d 41 20 63 6f 6e 73  t ::= COMMA cons
1900: 6c 69 73 74 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a  list..conslist :
1910: 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 43 4f 4d 4d  := conslist COMM
1920: 41 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73  A tcons..conslis
1930: 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 74  t ::= conslist t
1940: 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a  cons..conslist :
1950: 3a 3d 20 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73 20  := tcons..tcons 
1960: 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 69  ::= CONSTRAINT i
1970: 64 73 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50 52  ds..tcons ::= PR
1980: 49 4d 41 52 59 20 4b 45 59 20 4c 50 20 69 64 78  IMARY KEY LP idx
1990: 6c 69 73 74 28 58 29 20 52 50 20 6f 6e 63 6f 6e  list(X) RP oncon
19a0: 66 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20  f(R)..          
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 7b 73 71 6c 69 74 65 41 64 64 50 72 69     {sqliteAddPri
19e0: 6d 61 72 79 4b 65 79 28 70 50 61 72 73 65 2c 58  maryKey(pParse,X
19f0: 2c 52 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20  ,R);}.tcons ::= 
1a00: 55 4e 49 51 55 45 20 4c 50 20 69 64 78 6c 69 73  UNIQUE LP idxlis
1a10: 74 28 58 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52  t(X) RP onconf(R
1a20: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
1a50: 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  eCreateIndex(pPa
1a60: 72 73 65 2c 30 2c 30 2c 58 2c 52 2c 30 2c 30 29  rse,0,0,X,R,0,0)
1a70: 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 48 45  ;}.tcons ::= CHE
1a80: 43 4b 20 65 78 70 72 20 6f 6e 63 6f 6e 66 2e 0a  CK expr onconf..
1a90: 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .// The followin
1aa0: 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74 61 6e 64  g is a non-stand
1ab0: 61 72 64 20 65 78 74 65 6e 73 69 6f 6e 20 74 68  ard extension th
1ac0: 61 74 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20  at allows us to 
1ad0: 64 65 63 6c 61 72 65 20 74 68 65 0a 2f 2f 20 64  declare the.// d
1ae0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20  efault behavior 
1af0: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  when there is a 
1b00: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e 66 6c  constraint confl
1b10: 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f 6e  ict..//.%type on
1b20: 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 70 65  conf {int}.%type
1b30: 20 6f 72 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74   orconf {int}.%t
1b40: 79 70 65 20 72 65 73 6f 6c 76 65 74 79 70 65 20  ype resolvetype 
1b50: 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28 41 29 20  {int}.onconf(A) 
1b60: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 44 65 66 61     { A = OE_Defa
1b90: 75 6c 74 3b 20 7d 0a 6f 6e 63 6f 6e 66 28 41 29  ult; }.onconf(A)
1ba0: 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   ::= ON CONFLICT
1bb0: 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e   resolvetype(X).
1bc0: 20 20 20 20 7b 20 41 20 3d 20 58 3b 20 7d 0a 6f      { A = X; }.o
1bd0: 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20  rconf(A) ::= .  
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
1c00: 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 20 7d 0a  = OE_Default; }.
1c10: 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 52  orconf(A) ::= OR
1c20: 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e   resolvetype(X).
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
1c40: 20 3d 20 58 3b 20 7d 0a 72 65 73 6f 6c 76 65 74   = X; }.resolvet
1c50: 79 70 65 28 41 29 20 3a 3a 3d 20 52 4f 4c 4c 42  ype(A) ::= ROLLB
1c60: 41 43 4b 2e 20 20 20 20 20 20 20 20 20 20 20 20  ACK.            
1c70: 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 52 6f       { A = OE_Ro
1c80: 6c 6c 62 61 63 6b 3b 20 7d 0a 72 65 73 6f 6c 76  llback; }.resolv
1c90: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 41 42 4f  etype(A) ::= ABO
1ca0: 52 54 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  RT.             
1cb0: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f         { A = OE_
1cc0: 41 62 6f 72 74 3b 20 7d 0a 72 65 73 6f 6c 76 65  Abort; }.resolve
1cd0: 74 79 70 65 28 41 29 20 3a 3a 3d 20 46 41 49 4c  type(A) ::= FAIL
1ce0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cf0: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 46        { A = OE_F
1d00: 61 69 6c 3b 20 7d 0a 72 65 73 6f 6c 76 65 74 79  ail; }.resolvety
1d10: 70 65 28 41 29 20 3a 3a 3d 20 49 47 4e 4f 52 45  pe(A) ::= IGNORE
1d20: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d30: 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 49 67 6e      { A = OE_Ign
1d40: 6f 72 65 3b 20 7d 0a 72 65 73 6f 6c 76 65 74 79  ore; }.resolvety
1d50: 70 65 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43  pe(A) ::= REPLAC
1d60: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
1d70: 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65 70      { A = OE_Rep
1d80: 6c 61 63 65 3b 20 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  lace; }..///////
1d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1da0: 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20 54 41 42  /// The DROP TAB
1db0: 4c 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  LE /////////////
1dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1dd0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
1de0: 3a 3a 3d 20 44 52 4f 50 20 54 41 42 4c 45 20 69  ::= DROP TABLE i
1df0: 64 73 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  ds(X).          
1e00: 7b 73 71 6c 69 74 65 44 72 6f 70 54 61 62 6c 65  {sqliteDropTable
1e10: 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a  (pParse,&X,0);}.
1e20: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
1e30: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54  ////// The CREAT
1e40: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
1e50: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
1e60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
1e70: 2f 0a 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45  /.cmd ::= CREATE
1e80: 28 58 29 20 56 49 45 57 20 69 64 73 28 59 29 20  (X) VIEW ids(Y) 
1e90: 41 53 20 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a  AS select(S). {.
1ea0: 20 20 73 71 6c 69 74 65 43 72 65 61 74 65 56 69    sqliteCreateVi
1eb0: 65 77 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26  ew(pParse, &X, &
1ec0: 59 2c 20 53 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d  Y, S);.}.cmd ::=
1ed0: 20 44 52 4f 50 20 56 49 45 57 20 69 64 73 28 58   DROP VIEW ids(X
1ee0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 44 72 6f  ). {.  sqliteDro
1ef0: 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 26  pTable(pParse, &
1f00: 58 2c 20 31 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f  X, 1);.}..//////
1f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f20: 2f 2f 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  // The SELECT st
1f30: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
1f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
1f60: 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20   ::= select(X). 
1f70: 20 7b 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63   {.  sqliteSelec
1f80: 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53 52 54  t(pParse, X, SRT
1f90: 5f 43 61 6c 6c 62 61 63 6b 2c 20 30 2c 20 30 2c  _Callback, 0, 0,
1fa0: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
1fb0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 58 29 3b  SelectDelete(X);
1fc0: 0a 7d 0a 0a 25 74 79 70 65 20 73 65 6c 65 63 74  .}..%type select
1fd0: 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74   {Select*}.%dest
1fe0: 72 75 63 74 6f 72 20 73 65 6c 65 63 74 20 7b 73  ructor select {s
1ff0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
2000: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 6f 6e  e($$);}.%type on
2010: 65 73 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a  eselect {Select*
2020: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f 6e  }.%destructor on
2030: 65 73 65 6c 65 63 74 20 7b 73 71 6c 69 74 65 53  eselect {sqliteS
2040: 65 6c 65 63 74 44 65 6c 65 74 65 28 24 24 29 3b  electDelete($$);
2050: 7d 0a 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d  }..select(A) ::=
2060: 20 6f 6e 65 73 65 6c 65 63 74 28 58 29 2e 20 20   oneselect(X).  
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 65 6c      {A = X;}.sel
2090: 65 63 74 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63  ect(A) ::= selec
20a0: 74 28 58 29 20 6d 75 6c 74 69 73 65 6c 65 63 74  t(X) multiselect
20b0: 5f 6f 70 28 59 29 20 6f 6e 65 73 65 6c 65 63 74  _op(Y) oneselect
20c0: 28 5a 29 2e 20 20 7b 0a 20 20 69 66 28 20 5a 20  (Z).  {.  if( Z 
20d0: 29 7b 0a 20 20 20 20 5a 2d 3e 6f 70 20 3d 20 59  ){.    Z->op = Y
20e0: 3b 0a 20 20 20 20 5a 2d 3e 70 50 72 69 6f 72 20  ;.    Z->pPrior 
20f0: 3d 20 58 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 5a  = X;.  }.  A = Z
2100: 3b 0a 7d 0a 25 74 79 70 65 20 6d 75 6c 74 69 73  ;.}.%type multis
2110: 65 6c 65 63 74 5f 6f 70 20 7b 69 6e 74 7d 0a 6d  elect_op {int}.m
2120: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29  ultiselect_op(A)
2130: 20 3a 3a 3d 20 55 4e 49 4f 4e 2e 20 20 20 20 20   ::= UNION.     
2140: 20 7b 41 20 3d 20 54 4b 5f 55 4e 49 4f 4e 3b 7d   {A = TK_UNION;}
2150: 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28  .multiselect_op(
2160: 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 20 41 4c 4c  A) ::= UNION ALL
2170: 2e 20 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b 7d  .  {A = TK_ALL;}
2180: 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28  .multiselect_op(
2190: 41 29 20 3a 3a 3d 20 49 4e 54 45 52 53 45 43 54  A) ::= INTERSECT
21a0: 2e 20 20 7b 41 20 3d 20 54 4b 5f 49 4e 54 45 52  .  {A = TK_INTER
21b0: 53 45 43 54 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65  SECT;}.multisele
21c0: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 45 58 43  ct_op(A) ::= EXC
21d0: 45 50 54 2e 20 20 20 20 20 7b 41 20 3d 20 54 4b  EPT.     {A = TK
21e0: 5f 45 58 43 45 50 54 3b 7d 0a 6f 6e 65 73 65 6c  _EXCEPT;}.onesel
21f0: 65 63 74 28 41 29 20 3a 3a 3d 20 53 45 4c 45 43  ect(A) ::= SELEC
2200: 54 20 64 69 73 74 69 6e 63 74 28 44 29 20 73 65  T distinct(D) se
2210: 6c 63 6f 6c 6c 69 73 74 28 57 29 20 66 72 6f 6d  lcollist(W) from
2220: 28 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29  (X) where_opt(Y)
2230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2240: 20 20 67 72 6f 75 70 62 79 5f 6f 70 74 28 50 29    groupby_opt(P)
2250: 20 68 61 76 69 6e 67 5f 6f 70 74 28 51 29 20 6f   having_opt(Q) o
2260: 72 64 65 72 62 79 5f 6f 70 74 28 5a 29 20 6c 69  rderby_opt(Z) li
2270: 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20  mit_opt(L). {.  
2280: 41 20 3d 20 73 71 6c 69 74 65 53 65 6c 65 63 74  A = sqliteSelect
2290: 4e 65 77 28 57 2c 58 2c 59 2c 50 2c 51 2c 5a 2c  New(W,X,Y,P,Q,Z,
22a0: 44 2c 4c 2e 6c 69 6d 69 74 2c 4c 2e 6f 66 66 73  D,L.limit,L.offs
22b0: 65 74 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65 20 22  et);.}..// The "
22c0: 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e 74 65 72  distinct" nonter
22d0: 6d 69 6e 61 6c 20 69 73 20 74 72 75 65 20 28 31  minal is true (1
22e0: 29 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  ) if the DISTINC
22f0: 54 20 6b 65 79 77 6f 72 64 20 69 73 0a 2f 2f 20  T keyword is.// 
2300: 70 72 65 73 65 6e 74 20 61 6e 64 20 66 61 6c 73  present and fals
2310: 65 20 28 30 29 20 69 66 20 69 74 20 69 73 20 6e  e (0) if it is n
2320: 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 64 69 73  ot..//.%type dis
2330: 74 69 6e 63 74 20 7b 69 6e 74 7d 0a 64 69 73 74  tinct {int}.dist
2340: 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44 49 53 54  inct(A) ::= DIST
2350: 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20 31 3b 7d  INCT.   {A = 1;}
2360: 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d  .distinct(A) ::=
2370: 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41 20   ALL.        {A 
2380: 3d 20 30 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41  = 0;}.distinct(A
2390: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
23a0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73    {A = 0;}..// s
23b0: 65 6c 63 6f 6c 6c 69 73 74 20 69 73 20 61 20 6c  elcollist is a l
23c0: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
23d0: 6e 73 20 74 68 61 74 20 61 72 65 20 74 6f 20 62  ns that are to b
23e0: 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e  ecome the return
23f0: 0a 2f 2f 20 76 61 6c 75 65 73 20 6f 66 20 74 68  .// values of th
2400: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2410: 6e 74 2e 20 20 54 68 65 20 22 2a 22 20 69 6e 20  nt.  The "*" in 
2420: 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a  statements like.
2430: 2f 2f 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  // "SELECT * FRO
2440: 4d 20 2e 2e 2e 22 20 69 73 20 65 6e 63 6f 64 65  M ..." is encode
2450: 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 65  d as a special e
2460: 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61  xpression with a
2470: 6e 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f 66 20 54  n.// opcode of T
2480: 4b 5f 41 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65 20  K_ALL..//.%type 
2490: 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72  selcollist {Expr
24a0: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
24b0: 6f 72 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73  or selcollist {s
24c0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
24d0: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20  ete($$);}.%type 
24e0: 73 63 6c 70 20 7b 45 78 70 72 4c 69 73 74 2a 7d  sclp {ExprList*}
24f0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 63 6c  .%destructor scl
2500: 70 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73  p {sqliteExprLis
2510: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 73 63  tDelete($$);}.sc
2520: 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c 63 6f 6c  lp(A) ::= selcol
2530: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 2e 20 20  list(X) COMMA.  
2540: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
2550: 58 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20  X;}.sclp(A) ::= 
2560: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63 6f 6c   {A = 0;}.selcol
2590: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70  list(A) ::= sclp
25a0: 28 50 29 20 65 78 70 72 28 58 29 20 61 73 28 59  (P) expr(X) as(Y
25b0: 29 2e 20 20 20 20 20 7b 0a 20 20 20 41 20 3d 20  ).     {.   A = 
25c0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
25d0: 70 65 6e 64 28 50 2c 58 2c 59 2e 6e 3f 26 59 3a  pend(P,X,Y.n?&Y:
25e0: 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74  0);.}.selcollist
25f0: 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20  (A) ::= sclp(P) 
2600: 53 54 41 52 2e 20 7b 0a 20 20 41 20 3d 20 73 71  STAR. {.  A = sq
2610: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
2620: 6e 64 28 50 2c 20 73 71 6c 69 74 65 45 78 70 72  nd(P, sqliteExpr
2630: 28 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 30  (TK_ALL, 0, 0, 0
2640: 29 2c 20 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c  ), 0);.}.selcoll
2650: 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28  ist(A) ::= sclp(
2660: 50 29 20 69 64 73 28 58 29 20 44 4f 54 20 53 54  P) ids(X) DOT ST
2670: 41 52 2e 20 7b 0a 20 20 45 78 70 72 20 2a 70 52  AR. {.  Expr *pR
2680: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 45 78 70  ight = sqliteExp
2690: 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20  r(TK_ALL, 0, 0, 
26a0: 30 29 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  0);.  Expr *pLef
26b0: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  t = sqliteExpr(T
26c0: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b  K_ID, 0, 0, &X);
26d0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70  .  A = sqliteExp
26e0: 72 4c 69 73 74 41 70 70 65 6e 64 28 50 2c 20 73  rListAppend(P, s
26f0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54  qliteExpr(TK_DOT
2700: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
2710: 20 30 29 2c 20 30 29 3b 0a 7d 0a 0a 2f 2f 20 41   0), 0);.}..// A
2720: 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20 3c 69 64  n option "AS <id
2730: 3e 22 20 70 68 72 61 73 65 20 74 68 61 74 20 63  >" phrase that c
2740: 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65 20 6f 66  an follow one of
2750: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
2760: 20 74 68 61 74 0a 2f 2f 20 64 65 66 69 6e 65 20   that.// define 
2770: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
2780: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61  or one of the ta
2790: 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
27a0: 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25 74 79 70   clause..//.%typ
27b0: 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a 61 73 28  e as {Token}.as(
27c0: 58 29 20 3a 3a 3d 20 41 53 20 69 64 73 28 59 29  X) ::= AS ids(Y)
27d0: 2e 20 20 20 20 7b 20 58 20 3d 20 59 3b 20 7d 0a  .    { X = Y; }.
27e0: 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20  as(X) ::= .     
27f0: 20 20 20 20 20 20 20 20 7b 20 58 2e 6e 20 3d 20          { X.n = 
2800: 30 3b 20 7d 0a 0a 0a 25 74 79 70 65 20 73 65 6c  0; }...%type sel
2810: 74 61 62 6c 69 73 74 20 7b 53 72 63 4c 69 73 74  tablist {SrcList
2820: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
2830: 65 6c 74 61 62 6c 69 73 74 20 7b 73 71 6c 69 74  eltablist {sqlit
2840: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24  eSrcListDelete($
2850: 24 29 3b 7d 0a 25 74 79 70 65 20 73 74 6c 5f 70  $);}.%type stl_p
2860: 72 65 66 69 78 20 7b 53 72 63 4c 69 73 74 2a 7d  refix {SrcList*}
2870: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 74 6c  .%destructor stl
2880: 5f 70 72 65 66 69 78 20 7b 73 71 6c 69 74 65 53  _prefix {sqliteS
2890: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  rcListDelete($$)
28a0: 3b 7d 0a 25 74 79 70 65 20 66 72 6f 6d 20 7b 53  ;}.%type from {S
28b0: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  rcList*}.%destru
28c0: 63 74 6f 72 20 66 72 6f 6d 20 7b 73 71 6c 69 74  ctor from {sqlit
28d0: 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 24  eSrcListDelete($
28e0: 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f 6d 70 6c  $);}..// A compl
28f0: 65 74 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  ete FROM clause.
2900: 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20  .//.from(A) ::= 
2910: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 4d 61 6c    {A = sqliteMal
2940: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 41 29 29 3b  loc(sizeof(*A));
2950: 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 46 52  }.from(A) ::= FR
2960: 4f 4d 20 73 65 6c 74 61 62 6c 69 73 74 28 58 29  OM seltablist(X)
2970: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2980: 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 22 73 65  {A = X;}..// "se
2990: 6c 74 61 62 6c 69 73 74 22 20 69 73 20 61 20 22  ltablist" is a "
29a0: 53 65 6c 65 63 74 20 54 61 62 6c 65 20 4c 69 73  Select Table Lis
29b0: 74 22 20 2d 20 74 68 65 20 63 6f 6e 74 65 6e 74  t" - the content
29c0: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
29d0: 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53 45 4c 45  use.// in a SELE
29e0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 22  CT statement.  "
29f0: 73 74 6c 5f 70 72 65 66 69 78 22 20 69 73 20 61  stl_prefix" is a
2a00: 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20   prefix of this 
2a10: 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f 70 72 65  list..//.stl_pre
2a20: 66 69 78 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61  fix(A) ::= selta
2a30: 62 6c 69 73 74 28 58 29 20 6a 6f 69 6e 6f 70 28  blist(X) joinop(
2a40: 59 29 2e 20 20 20 20 7b 0a 20 20 20 41 20 3d 20  Y).    {.   A = 
2a50: 58 3b 0a 20 20 20 69 66 28 20 41 20 26 26 20 41  X;.   if( A && A
2a60: 2d 3e 6e 53 72 63 3e 30 20 29 20 41 2d 3e 61 5b  ->nSrc>0 ) A->a[
2a70: 41 2d 3e 6e 53 72 63 2d 31 5d 2e 6a 6f 69 6e 74  A->nSrc-1].joint
2a80: 79 70 65 20 3d 20 59 3b 0a 7d 0a 73 74 6c 5f 70  ype = Y;.}.stl_p
2a90: 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20  refix(A) ::= .  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
2ac0: 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20  }.seltablist(A) 
2ad0: 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58  ::= stl_prefix(X
2ae0: 29 20 69 64 73 28 59 29 20 61 73 28 5a 29 20 6f  ) ids(Y) as(Z) o
2af0: 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f  n_opt(N) using_o
2b00: 70 74 28 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pt(U). {.  A = s
2b10: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65  qliteSrcListAppe
2b20: 6e 64 28 58 2c 26 59 29 3b 0a 20 20 69 66 28 20  nd(X,&Y);.  if( 
2b30: 5a 2e 6e 20 29 20 73 71 6c 69 74 65 53 72 63 4c  Z.n ) sqliteSrcL
2b40: 69 73 74 41 64 64 41 6c 69 61 73 28 41 2c 26 5a  istAddAlias(A,&Z
2b50: 29 3b 0a 20 20 69 66 28 20 4e 20 29 7b 0a 20 20  );.  if( N ){.  
2b60: 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e 6e 53    if( A && A->nS
2b70: 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41 2d 3e  rc>1 ){ A->a[A->
2b80: 6e 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d 20 4e 3b  nSrc-2].pOn = N;
2b90: 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b 20 73 71   }.    else { sq
2ba0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 4e  liteExprDelete(N
2bb0: 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 55  ); }.  }.  if( U
2bc0: 20 29 7b 0a 20 20 20 20 69 66 28 20 41 20 26 26   ){.    if( A &&
2bd0: 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d   A->nSrc>1 ){ A-
2be0: 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 55  >a[A->nSrc-2].pU
2bf0: 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20 20 20 20  sing = U; }.    
2c00: 65 6c 73 65 20 7b 20 73 71 6c 69 74 65 49 64 4c  else { sqliteIdL
2c10: 69 73 74 44 65 6c 65 74 65 28 55 29 3b 20 7d 0a  istDelete(U); }.
2c20: 20 20 7d 0a 7d 0a 73 65 6c 74 61 62 6c 69 73 74    }.}.seltablist
2c30: 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66  (A) ::= stl_pref
2c40: 69 78 28 58 29 20 4c 50 20 73 65 6c 65 63 74 28  ix(X) LP select(
2c50: 53 29 20 52 50 20 61 73 28 5a 29 20 6f 6e 5f 6f  S) RP as(Z) on_o
2c60: 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28  pt(N) using_opt(
2c70: 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  U). {.  A = sqli
2c80: 74 65 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  teSrcListAppend(
2c90: 58 2c 30 29 3b 0a 20 20 41 2d 3e 61 5b 41 2d 3e  X,0);.  A->a[A->
2ca0: 6e 53 72 63 2d 31 5d 2e 70 53 65 6c 65 63 74 20  nSrc-1].pSelect 
2cb0: 3d 20 53 3b 0a 20 20 69 66 28 20 53 2d 3e 70 4f  = S;.  if( S->pO
2cc0: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 73 71  rderBy ){.    sq
2cd0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
2ce0: 74 65 28 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b  te(S->pOrderBy);
2cf0: 0a 20 20 20 20 53 2d 3e 70 4f 72 64 65 72 42 79  .    S->pOrderBy
2d00: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
2d10: 5a 2e 6e 20 29 20 73 71 6c 69 74 65 53 72 63 4c  Z.n ) sqliteSrcL
2d20: 69 73 74 41 64 64 41 6c 69 61 73 28 41 2c 26 5a  istAddAlias(A,&Z
2d30: 29 3b 0a 20 20 69 66 28 20 4e 20 29 7b 0a 20 20  );.  if( N ){.  
2d40: 20 20 69 66 28 20 41 20 26 26 20 41 2d 3e 6e 53    if( A && A->nS
2d50: 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b 41 2d 3e  rc>1 ){ A->a[A->
2d60: 6e 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d 20 4e 3b  nSrc-2].pOn = N;
2d70: 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b 20 73 71   }.    else { sq
2d80: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 4e  liteExprDelete(N
2d90: 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 55  ); }.  }.  if( U
2da0: 20 29 7b 0a 20 20 20 20 69 66 28 20 41 20 26 26   ){.    if( A &&
2db0: 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d   A->nSrc>1 ){ A-
2dc0: 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 55  >a[A->nSrc-2].pU
2dd0: 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20 20 20 20  sing = U; }.    
2de0: 65 6c 73 65 20 7b 20 73 71 6c 69 74 65 49 64 4c  else { sqliteIdL
2df0: 69 73 74 44 65 6c 65 74 65 28 55 29 3b 20 7d 0a  istDelete(U); }.
2e00: 20 20 7d 0a 7d 0a 0a 25 74 79 70 65 20 6a 6f 69    }.}..%type joi
2e10: 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79 70 65 20  nop {int}.%type 
2e20: 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d 0a 6a 6f  joinop2 {int}.jo
2e30: 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d  inop(X) ::= COMM
2e40: 41 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  A.              
2e50: 20 20 20 20 20 7b 20 58 20 3d 20 4a 54 5f 49 4e       { X = JT_IN
2e60: 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29  NER; }.joinop(X)
2e70: 20 3a 3a 3d 20 4a 4f 49 4e 2e 20 20 20 20 20 20   ::= JOIN.      
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
2e90: 58 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 20 7d 0a  X = JT_INNER; }.
2ea0: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 49 44  joinop(X) ::= ID
2eb0: 28 41 29 20 4a 4f 49 4e 2e 20 20 20 20 20 20 20  (A) JOIN.       
2ec0: 20 20 20 20 20 20 20 7b 20 58 20 3d 20 73 71 6c         { X = sql
2ed0: 69 74 65 4a 6f 69 6e 54 79 70 65 28 70 50 61 72  iteJoinType(pPar
2ee0: 73 65 2c 26 41 2c 30 2c 30 29 3b 20 7d 0a 6a 6f  se,&A,0,0); }.jo
2ef0: 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 49 44 28 41  inop(X) ::= ID(A
2f00: 29 20 49 44 28 42 29 20 4a 4f 49 4e 2e 20 20 20  ) ID(B) JOIN.   
2f10: 20 20 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74       { X = sqlit
2f20: 65 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65  eJoinType(pParse
2f30: 2c 26 41 2c 26 42 2c 30 29 3b 20 7d 0a 6a 6f 69  ,&A,&B,0); }.joi
2f40: 6e 6f 70 28 58 29 20 3a 3a 3d 20 49 44 28 41 29  nop(X) ::= ID(A)
2f50: 20 49 44 28 42 29 20 49 44 28 43 29 20 4a 4f 49   ID(B) ID(C) JOI
2f60: 4e 2e 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65  N.  { X = sqlite
2f70: 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c  JoinType(pParse,
2f80: 26 41 2c 26 42 2c 26 43 29 3b 20 7d 0a 0a 25 74  &A,&B,&C); }..%t
2f90: 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70 72  ype on_opt {Expr
2fa0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f  *}.%destructor o
2fb0: 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65 45 78 70  n_opt {sqliteExp
2fc0: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 6f 6e  rDelete($$);}.on
2fd0: 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 4f 4e 20 65  _opt(N) ::= ON e
2fe0: 78 70 72 28 45 29 2e 20 20 20 7b 4e 20 3d 20 45  xpr(E).   {N = E
2ff0: 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d  ;}.on_opt(N) ::=
3000: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b   .             {
3010: 4e 20 3d 20 30 3b 7d 0a 0a 25 74 79 70 65 20 75  N = 0;}..%type u
3020: 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73 74  sing_opt {IdList
3030: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 75  *}.%destructor u
3040: 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65  sing_opt {sqlite
3050: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  IdListDelete($$)
3060: 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29 20  ;}.using_opt(U) 
3070: 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20 69 64 78  ::= USING LP idx
3080: 6c 69 73 74 28 4c 29 20 52 50 2e 20 20 7b 55 20  list(L) RP.  {U 
3090: 3d 20 4c 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28  = L;}.using_opt(
30a0: 55 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  U) ::= .        
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 7b 55 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65  {U = 0;}...%type
30d0: 20 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b 45 78   orderby_opt {Ex
30e0: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
30f0: 63 74 6f 72 20 6f 72 64 65 72 62 79 5f 6f 70 74  ctor orderby_opt
3100: 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74   {sqliteExprList
3110: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
3120: 70 65 20 73 6f 72 74 6c 69 73 74 20 7b 45 78 70  pe sortlist {Exp
3130: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
3140: 74 6f 72 20 73 6f 72 74 6c 69 73 74 20 7b 73 71  tor sortlist {sq
3150: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
3160: 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73  te($$);}.%type s
3170: 6f 72 74 69 74 65 6d 20 7b 45 78 70 72 2a 7d 0a  ortitem {Expr*}.
3180: 25 64 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74  %destructor sort
3190: 69 74 65 6d 20 7b 73 71 6c 69 74 65 45 78 70 72  item {sqliteExpr
31a0: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 6f 72  Delete($$);}..or
31b0: 64 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d  derby_opt(A) ::=
31c0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
31d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
31e0: 20 30 3b 7d 0a 6f 72 64 65 72 62 79 5f 6f 70 74   0;}.orderby_opt
31f0: 28 41 29 20 3a 3a 3d 20 4f 52 44 45 52 20 42 59  (A) ::= ORDER BY
3200: 20 73 6f 72 74 6c 69 73 74 28 58 29 2e 20 20 20   sortlist(X).   
3210: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 6f 72 74     {A = X;}.sort
3220: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f 72 74  list(A) ::= sort
3230: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 73 6f  list(X) COMMA so
3240: 72 74 69 74 65 6d 28 59 29 20 73 6f 72 74 6f 72  rtitem(Y) sortor
3250: 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20  der(Z). {.  A = 
3260: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
3270: 70 65 6e 64 28 58 2c 59 2c 30 29 3b 0a 20 20 69  pend(X,Y,0);.  i
3280: 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e  f( A ) A->a[A->n
3290: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
32a0: 72 20 3d 20 5a 3b 20 20 2f 2a 20 30 3d 61 73 63  r = Z;  /* 0=asc
32b0: 65 6e 64 69 6e 67 2c 20 31 3d 64 65 63 65 6e 64  ending, 1=decend
32c0: 69 6e 67 20 2a 2f 0a 7d 0a 73 6f 72 74 6c 69 73  ing */.}.sortlis
32d0: 74 28 41 29 20 3a 3a 3d 20 73 6f 72 74 69 74 65  t(A) ::= sortite
32e0: 6d 28 59 29 20 73 6f 72 74 6f 72 64 65 72 28 5a  m(Y) sortorder(Z
32f0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
3300: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
3310: 30 2c 59 2c 30 29 3b 0a 20 20 69 66 28 20 41 20  0,Y,0);.  if( A 
3320: 29 20 41 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ) A->a[0].sortOr
3330: 64 65 72 20 3d 20 5a 3b 0a 7d 0a 73 6f 72 74 69  der = Z;.}.sorti
3340: 74 65 6d 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  tem(A) ::= expr(
3350: 58 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  X).   {A = X;}..
3360: 25 74 79 70 65 20 73 6f 72 74 6f 72 64 65 72 20  %type sortorder 
3370: 7b 69 6e 74 7d 0a 0a 73 6f 72 74 6f 72 64 65 72  {int}..sortorder
3380: 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20  (A) ::= ASC.    
3390: 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 6f 72 74 6f    {A = 0;}.sorto
33a0: 72 64 65 72 28 41 29 20 3a 3a 3d 20 44 45 53 43  rder(A) ::= DESC
33b0: 2e 20 20 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 73  .     {A = 1;}.s
33c0: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20  ortorder(A) ::= 
33d0: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30  .         {A = 0
33e0: 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75 70 62  ;}..%type groupb
33f0: 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a  y_opt {ExprList*
3400: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 67 72  }.%destructor gr
3410: 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74  oupby_opt {sqlit
3420: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
3430: 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70  $$);}.groupby_op
3440: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
3450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3460: 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75 70 62 79  {A = 0;}.groupby
3470: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47 52 4f 55  _opt(A) ::= GROU
3480: 50 20 42 59 20 65 78 70 72 6c 69 73 74 28 58 29  P BY exprlist(X)
3490: 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79  .  {A = X;}..%ty
34a0: 70 65 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 45  pe having_opt {E
34b0: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
34c0: 72 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 73 71  r having_opt {sq
34d0: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 24  liteExprDelete($
34e0: 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28  $);}.having_opt(
34f0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
3500: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
3510: 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41 29 20 3a  .having_opt(A) :
3520: 3a 3d 20 48 41 56 49 4e 47 20 65 78 70 72 28 58  := HAVING expr(X
3530: 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74  ).  {A = X;}..%t
3540: 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 73  ype limit_opt {s
3550: 74 72 75 63 74 20 4c 69 6d 69 74 56 61 6c 7d 0a  truct LimitVal}.
3560: 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  limit_opt(A) ::=
3570: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
3580: 20 20 20 20 7b 41 2e 6c 69 6d 69 74 20 3d 20 2d      {A.limit = -
3590: 31 3b 20 41 2e 6f 66 66 73 65 74 20 3d 20 30 3b  1; A.offset = 0;
35a0: 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a  }.limit_opt(A) :
35b0: 3a 3d 20 4c 49 4d 49 54 20 49 4e 54 45 47 45 52  := LIMIT INTEGER
35c0: 28 58 29 2e 20 20 7b 41 2e 6c 69 6d 69 74 20 3d  (X).  {A.limit =
35d0: 20 61 74 6f 69 28 58 2e 7a 29 3b 20 41 2e 6f 66   atoi(X.z); A.of
35e0: 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74  fset = 0;}.limit
35f0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49  _opt(A) ::= LIMI
3600: 54 20 49 4e 54 45 47 45 52 28 58 29 20 6c 69 6d  T INTEGER(X) lim
3610: 69 74 5f 73 65 70 20 49 4e 54 45 47 45 52 28 59  it_sep INTEGER(Y
3620: 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ). .            
3630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3640: 20 20 20 20 20 20 20 20 7b 41 2e 6c 69 6d 69 74          {A.limit
3650: 20 3d 20 61 74 6f 69 28 58 2e 7a 29 3b 20 41 2e   = atoi(X.z); A.
3660: 6f 66 66 73 65 74 20 3d 20 61 74 6f 69 28 59 2e  offset = atoi(Y.
3670: 7a 29 3b 7d 0a 6c 69 6d 69 74 5f 73 65 70 20 3a  z);}.limit_sep :
3680: 3a 3d 20 4f 46 46 53 45 54 2e 0a 6c 69 6d 69 74  := OFFSET..limit
3690: 5f 73 65 70 20 3a 3a 3d 20 43 4f 4d 4d 41 2e 0a  _sep ::= COMMA..
36a0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
36b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
36c0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
36d0: 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  t //////////////
36e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
36f0: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 45 4c 45 54  //.cmd ::= DELET
3700: 45 20 46 52 4f 4d 20 69 64 73 28 58 29 20 77 68  E FROM ids(X) wh
3710: 65 72 65 5f 6f 70 74 28 59 29 2e 0a 20 20 20 20  ere_opt(Y)..    
3720: 7b 73 71 6c 69 74 65 44 65 6c 65 74 65 46 72 6f  {sqliteDeleteFro
3730: 6d 28 70 50 61 72 73 65 2c 20 26 58 2c 20 59 29  m(pParse, &X, Y)
3740: 3b 7d 0a 0a 25 74 79 70 65 20 77 68 65 72 65 5f  ;}..%type where_
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 77 68 65 72 65 5f 6f 70  tructor where_op
3770: 74 20 7b 73 71 6c 69 74 65 45 78 70 72 44 65 6c  t {sqliteExprDel
3780: 65 74 65 28 24 24 29 3b 7d 0a 0a 77 68 65 72 65  ete($$);}..where
3790: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
37a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b0: 20 7b 41 20 3d 20 30 3b 7d 0a 77 68 65 72 65 5f   {A = 0;}.where_
37c0: 6f 70 74 28 41 29 20 3a 3a 3d 20 57 48 45 52 45  opt(A) ::= WHERE
37d0: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
37e0: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
37f0: 73 65 74 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  setlist {ExprLis
3800: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3810: 73 65 74 6c 69 73 74 20 7b 73 71 6c 69 74 65 45  setlist {sqliteE
3820: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24  xprListDelete($$
3830: 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );}..///////////
3840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
3850: 54 68 65 20 55 50 44 41 54 45 20 63 6f 6d 6d 61  The UPDATE comma
3860: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
3870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3880: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 55  ///.//.cmd ::= U
3890: 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20  PDATE orconf(R) 
38a0: 69 64 73 28 58 29 20 53 45 54 20 73 65 74 6c 69  ids(X) SET setli
38b0: 73 74 28 59 29 20 77 68 65 72 65 5f 6f 70 74 28  st(Y) where_opt(
38c0: 5a 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 55  Z)..    {sqliteU
38d0: 70 64 61 74 65 28 70 50 61 72 73 65 2c 26 58 2c  pdate(pParse,&X,
38e0: 59 2c 5a 2c 52 29 3b 7d 0a 0a 73 65 74 6c 69 73  Y,Z,R);}..setlis
38f0: 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c 69 73 74  t(A) ::= setlist
3900: 28 5a 29 20 43 4f 4d 4d 41 20 69 64 73 28 58 29  (Z) COMMA ids(X)
3910: 20 45 51 20 65 78 70 72 28 59 29 2e 0a 20 20 20   EQ expr(Y)..   
3920: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
3930: 4c 69 73 74 41 70 70 65 6e 64 28 5a 2c 59 2c 26  ListAppend(Z,Y,&
3940: 58 29 3b 7d 0a 73 65 74 6c 69 73 74 28 41 29 20  X);}.setlist(A) 
3950: 3a 3a 3d 20 69 64 73 28 58 29 20 45 51 20 65 78  ::= ids(X) EQ ex
3960: 70 72 28 59 29 2e 20 20 20 7b 41 20 3d 20 73 71  pr(Y).   {A = sq
3970: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
3980: 6e 64 28 30 2c 59 2c 26 58 29 3b 7d 0a 0a 2f 2f  nd(0,Y,&X);}..//
3990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
39a0: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 49 4e 53  //////// The INS
39b0: 45 52 54 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  ERT command ////
39c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
39d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
39e0: 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65 72 74 5f  .cmd ::= insert_
39f0: 63 6d 64 28 52 29 20 49 4e 54 4f 20 69 64 73 28  cmd(R) INTO ids(
3a00: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
3a10: 74 28 46 29 20 56 41 4c 55 45 53 20 4c 50 20 69  t(F) VALUES LP i
3a20: 74 65 6d 6c 69 73 74 28 59 29 20 52 50 2e 0a 20  temlist(Y) RP.. 
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
3a40: 71 6c 69 74 65 49 6e 73 65 72 74 28 70 50 61 72  qliteInsert(pPar
3a50: 73 65 2c 20 26 58 2c 20 59 2c 20 30 2c 20 46 2c  se, &X, Y, 0, F,
3a60: 20 52 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e   R);}.cmd ::= in
3a70: 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f  sert_cmd(R) INTO
3a80: 20 69 64 73 28 58 29 20 69 6e 73 63 6f 6c 6c 69   ids(X) inscolli
3a90: 73 74 5f 6f 70 74 28 46 29 20 73 65 6c 65 63 74  st_opt(F) select
3aa0: 28 53 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (S)..           
3ab0: 20 20 20 20 7b 73 71 6c 69 74 65 49 6e 73 65 72      {sqliteInser
3ac0: 74 28 70 50 61 72 73 65 2c 20 26 58 2c 20 30 2c  t(pParse, &X, 0,
3ad0: 20 53 2c 20 46 2c 20 52 29 3b 7d 0a 0a 25 74 79   S, F, R);}..%ty
3ae0: 70 65 20 69 6e 73 65 72 74 5f 63 6d 64 20 7b 69  pe insert_cmd {i
3af0: 6e 74 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41  nt}.insert_cmd(A
3b00: 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63  ) ::= INSERT orc
3b10: 6f 6e 66 28 52 29 2e 20 20 20 7b 41 20 3d 20 52  onf(R).   {A = R
3b20: 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29  ;}.insert_cmd(A)
3b30: 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20   ::= REPLACE.   
3b40: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
3b50: 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 0a 25 74 79  _Replace;}...%ty
3b60: 70 65 20 69 74 65 6d 6c 69 73 74 20 7b 45 78 70  pe itemlist {Exp
3b70: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
3b80: 74 6f 72 20 69 74 65 6d 6c 69 73 74 20 7b 73 71  tor itemlist {sq
3b90: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
3ba0: 74 65 28 24 24 29 3b 7d 0a 0a 69 74 65 6d 6c 69  te($$);}..itemli
3bb0: 73 74 28 41 29 20 3a 3a 3d 20 69 74 65 6d 6c 69  st(A) ::= itemli
3bc0: 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72  st(X) COMMA expr
3bd0: 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (Y).  {A = sqlit
3be0: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
3bf0: 58 2c 59 2c 30 29 3b 7d 0a 69 74 65 6d 6c 69 73  X,Y,0);}.itemlis
3c00: 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  t(A) ::= expr(X)
3c10: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3c20: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
3c30: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
3c40: 2c 58 2c 30 29 3b 7d 0a 0a 25 74 79 70 65 20 69  ,X,0);}..%type i
3c50: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b 49  nscollist_opt {I
3c60: 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  dList*}.%destruc
3c70: 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f  tor inscollist_o
3c80: 70 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 74  pt {sqliteIdList
3c90: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
3ca0: 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 49  pe inscollist {I
3cb0: 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  dList*}.%destruc
3cc0: 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 74 20 7b  tor inscollist {
3cd0: 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65  sqliteIdListDele
3ce0: 74 65 28 24 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c  te($$);}..inscol
3cf0: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
3d00: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d10: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
3d20: 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28  .inscollist_opt(
3d30: 41 29 20 3a 3a 3d 20 4c 50 20 69 6e 73 63 6f 6c  A) ::= LP inscol
3d40: 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20 20 7b  list(X) RP.    {
3d50: 41 20 3d 20 58 3b 7d 0a 69 6e 73 63 6f 6c 6c 69  A = X;}.inscolli
3d60: 73 74 28 41 29 20 3a 3a 3d 20 69 6e 73 63 6f 6c  st(A) ::= inscol
3d70: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 69 64  list(X) COMMA id
3d80: 73 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74  s(Y). {A = sqlit
3d90: 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  eIdListAppend(X,
3da0: 26 59 29 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74  &Y);}.inscollist
3db0: 28 41 29 20 3a 3a 3d 20 69 64 73 28 59 29 2e 20  (A) ::= ids(Y). 
3dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3dd0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 49      {A = sqliteI
3de0: 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59  dListAppend(0,&Y
3df0: 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );}..///////////
3e00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e10: 20 45 78 70 72 65 73 73 69 6f 6e 20 50 72 6f 63   Expression Proc
3e20: 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  essing /////////
3e30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3e40: 2f 2f 2f 2f 0a 2f 2f 0a 25 6c 65 66 74 20 4f 52  ////.//.%left OR
3e50: 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a 25 72 69  ..%left AND..%ri
3e60: 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66 74 20 45  ght NOT..%left E
3e70: 51 20 4e 45 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e  Q NE ISNULL NOTN
3e80: 55 4c 4c 20 49 53 20 4c 49 4b 45 20 47 4c 4f 42  ULL IS LIKE GLOB
3e90: 20 42 45 54 57 45 45 4e 20 49 4e 2e 0a 25 6c 65   BETWEEN IN..%le
3ea0: 66 74 20 47 54 20 47 45 20 4c 54 20 4c 45 2e 0a  ft GT GE LT LE..
3eb0: 25 6c 65 66 74 20 42 49 54 41 4e 44 20 42 49 54  %left BITAND BIT
3ec0: 4f 52 20 4c 53 48 49 46 54 20 52 53 48 49 46 54  OR LSHIFT RSHIFT
3ed0: 2e 0a 25 6c 65 66 74 20 50 4c 55 53 20 4d 49 4e  ..%left PLUS MIN
3ee0: 55 53 2e 0a 25 6c 65 66 74 20 53 54 41 52 20 53  US..%left STAR S
3ef0: 4c 41 53 48 20 52 45 4d 2e 0a 25 6c 65 66 74 20  LASH REM..%left 
3f00: 43 4f 4e 43 41 54 2e 0a 25 72 69 67 68 74 20 55  CONCAT..%right U
3f10: 4d 49 4e 55 53 20 42 49 54 4e 4f 54 2e 0a 0a 25  MINUS BITNOT...%
3f20: 74 79 70 65 20 65 78 70 72 20 7b 45 78 70 72 2a  type expr {Expr*
3f30: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78  }.%destructor ex
3f40: 70 72 20 7b 73 71 6c 69 74 65 45 78 70 72 44 65  pr {sqliteExprDe
3f50: 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72  lete($$);}..expr
3f60: 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 65 78  (A) ::= LP(B) ex
3f70: 70 72 28 58 29 20 52 50 28 45 29 2e 20 7b 41 20  pr(X) RP(E). {A 
3f80: 3d 20 58 3b 20 73 71 6c 69 74 65 45 78 70 72 53  = X; sqliteExprS
3f90: 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b 7d 0a 65  pan(A,&B,&E);}.e
3fa0: 78 70 72 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c 28  xpr(A) ::= NULL(
3fb0: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
3fc0: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
3fd0: 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 26  TK_NULL, 0, 0, &
3fe0: 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  X);}.expr(A) ::=
3ff0: 20 69 64 28 58 29 2e 20 20 20 20 20 20 20 20 20   id(X).         
4000: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
4010: 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20  eExpr(TK_ID, 0, 
4020: 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  0, &X);}.expr(A)
4030: 20 3a 3a 3d 20 69 64 73 28 58 29 20 44 4f 54 20   ::= ids(X) DOT 
4040: 69 64 73 28 59 29 2e 20 7b 0a 20 20 45 78 70 72  ids(Y). {.  Expr
4050: 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65   *temp1 = sqlite
4060: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
4070: 2c 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74  , &X);.  Expr *t
4080: 65 6d 70 32 20 3d 20 73 71 6c 69 74 65 45 78 70  emp2 = sqliteExp
4090: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  r(TK_ID, 0, 0, &
40a0: 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  Y);.  A = sqlite
40b0: 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d  Expr(TK_DOT, tem
40c0: 70 31 2c 20 74 65 6d 70 32 2c 20 30 29 3b 0a 7d  p1, temp2, 0);.}
40d0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 4e 54  .expr(A) ::= INT
40e0: 45 47 45 52 28 58 29 2e 20 20 20 20 20 20 7b 41  EGER(X).      {A
40f0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
4100: 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20  _INTEGER, 0, 0, 
4110: 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  &X);}.expr(A) ::
4120: 3d 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20  = FLOAT(X).     
4130: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
4140: 70 72 28 54 4b 5f 46 4c 4f 41 54 2c 20 30 2c 20  pr(TK_FLOAT, 0, 
4150: 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  0, &X);}.expr(A)
4160: 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20   ::= STRING(X). 
4170: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
4180: 65 45 78 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c  eExpr(TK_STRING,
4190: 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70   0, 0, &X);}.exp
41a0: 72 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 20 4c  r(A) ::= ID(X) L
41b0: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50  P exprlist(Y) RP
41c0: 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (E). {.  A = sql
41d0: 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  iteExprFunction(
41e0: 59 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74 65  Y, &X);.  sqlite
41f0: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26 45  ExprSpan(A,&X,&E
4200: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
4210: 20 49 44 28 58 29 20 4c 50 20 53 54 41 52 20 52   ID(X) LP STAR R
4220: 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  P(E). {.  A = sq
4230: 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e  liteExprFunction
4240: 28 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74  (0, &X);.  sqlit
4250: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26  eExprSpan(A,&X,&
4260: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
4270: 3d 20 65 78 70 72 28 58 29 20 41 4e 44 20 65 78  = expr(X) AND ex
4280: 70 72 28 59 29 2e 20 20 20 7b 41 20 3d 20 73 71  pr(Y).   {A = sq
4290: 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c  liteExpr(TK_AND,
42a0: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
42b0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
42c0: 4f 52 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b  OR expr(Y).    {
42d0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
42e0: 4b 5f 4f 52 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  K_OR, X, Y, 0);}
42f0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
4300: 72 28 58 29 20 4c 54 20 65 78 70 72 28 59 29 2e  r(X) LT expr(Y).
4310: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45      {A = sqliteE
4320: 78 70 72 28 54 4b 5f 4c 54 2c 20 58 2c 20 59 2c  xpr(TK_LT, X, Y,
4330: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
4340: 3d 20 65 78 70 72 28 58 29 20 47 54 20 65 78 70  = expr(X) GT exp
4350: 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71  r(Y).    {A = sq
4360: 6c 69 74 65 45 78 70 72 28 54 4b 5f 47 54 2c 20  liteExpr(TK_GT, 
4370: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
4380: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c  A) ::= expr(X) L
4390: 45 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41  E expr(Y).    {A
43a0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
43b0: 5f 4c 45 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  _LE, X, Y, 0);}.
43c0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
43d0: 28 58 29 20 47 45 20 65 78 70 72 28 59 29 2e 20  (X) GE expr(Y). 
43e0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
43f0: 70 72 28 54 4b 5f 47 45 2c 20 58 2c 20 59 2c 20  pr(TK_GE, X, Y, 
4400: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
4410: 20 65 78 70 72 28 58 29 20 4e 45 20 65 78 70 72   expr(X) NE expr
4420: 28 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c  (Y).    {A = sql
4430: 69 74 65 45 78 70 72 28 54 4b 5f 4e 45 2c 20 58  iteExpr(TK_NE, X
4440: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
4450: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 45 51  ) ::= expr(X) EQ
4460: 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20   expr(Y).    {A 
4470: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
4480: 45 51 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  EQ, X, Y, 0);}.e
4490: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
44a0: 58 29 20 42 49 54 41 4e 44 20 65 78 70 72 28 59  X) BITAND expr(Y
44b0: 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78  ). {A = sqliteEx
44c0: 70 72 28 54 4b 5f 42 49 54 41 4e 44 2c 20 58 2c  pr(TK_BITAND, X,
44d0: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
44e0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 42 49 54   ::= expr(X) BIT
44f0: 4f 52 20 65 78 70 72 28 59 29 2e 20 20 7b 41 20  OR expr(Y).  {A 
4500: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
4510: 42 49 54 4f 52 2c 20 58 2c 20 59 2c 20 30 29 3b  BITOR, X, Y, 0);
4520: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
4530: 70 72 28 58 29 20 4c 53 48 49 46 54 20 65 78 70  pr(X) LSHIFT exp
4540: 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74  r(Y). {A = sqlit
4550: 65 45 78 70 72 28 54 4b 5f 4c 53 48 49 46 54 2c  eExpr(TK_LSHIFT,
4560: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
4570: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
4580: 52 53 48 49 46 54 20 65 78 70 72 28 59 29 2e 20  RSHIFT expr(Y). 
4590: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
45a0: 54 4b 5f 52 53 48 49 46 54 2c 20 58 2c 20 59 2c  TK_RSHIFT, X, Y,
45b0: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a   0);}.expr(A) ::
45c0: 3d 20 65 78 70 72 28 58 29 20 6c 69 6b 65 6f 70  = expr(X) likeop
45d0: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 5b  (OP) expr(Y).  [
45e0: 4c 49 4b 45 5d 20 20 7b 0a 20 20 45 78 70 72 4c  LIKE]  {.  ExprL
45f0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  ist *pList = sql
4600: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
4610: 64 28 30 2c 20 59 2c 20 30 29 3b 0a 20 20 70 4c  d(0, Y, 0);.  pL
4620: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
4630: 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74  ListAppend(pList
4640: 2c 20 58 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73  , X, 0);.  A = s
4650: 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f  qliteExprFunctio
4660: 6e 28 70 4c 69 73 74 2c 20 26 4f 50 29 3b 0a 20  n(pList, &OP);. 
4670: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
4680: 41 2c 20 26 58 2d 3e 73 70 61 6e 2c 20 26 59 2d  A, &X->span, &Y-
4690: 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41  >span);.}.expr(A
46a0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f  ) ::= expr(X) NO
46b0: 54 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65 78 70  T likeop(OP) exp
46c0: 72 28 59 29 2e 20 5b 4c 49 4b 45 5d 20 7b 0a 20  r(Y). [LIKE] {. 
46d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
46e0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
46f0: 74 41 70 70 65 6e 64 28 30 2c 20 59 2c 20 30 29  tAppend(0, Y, 0)
4700: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
4710: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
4720: 28 70 4c 69 73 74 2c 20 58 2c 20 30 29 3b 0a 20  (pList, X, 0);. 
4730: 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 46   A = sqliteExprF
4740: 75 6e 63 74 69 6f 6e 28 70 4c 69 73 74 2c 20 26  unction(pList, &
4750: 4f 50 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74  OP);.  A = sqlit
4760: 65 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c  eExpr(TK_NOT, A,
4770: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
4780: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73  ExprSpan(A,&X->s
4790: 70 61 6e 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d  pan,&Y->span);.}
47a0: 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4c  .likeop(A) ::= L
47b0: 49 4b 45 28 58 29 2e 20 7b 41 20 3d 20 58 3b 7d  IKE(X). {A = X;}
47c0: 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 47  .likeop(A) ::= G
47d0: 4c 4f 42 28 58 29 2e 20 7b 41 20 3d 20 58 3b 7d  LOB(X). {A = X;}
47e0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
47f0: 72 28 58 29 20 50 4c 55 53 20 65 78 70 72 28 59  r(X) PLUS expr(Y
4800: 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45  ).  {A = sqliteE
4810: 78 70 72 28 54 4b 5f 50 4c 55 53 2c 20 58 2c 20  xpr(TK_PLUS, X, 
4820: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
4830: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4d 49 4e 55  ::= expr(X) MINU
4840: 53 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20  S expr(Y). {A = 
4850: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4d 49  sqliteExpr(TK_MI
4860: 4e 55 53 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  NUS, X, Y, 0);}.
4870: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
4880: 28 58 29 20 53 54 41 52 20 65 78 70 72 28 59 29  (X) STAR expr(Y)
4890: 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78  .  {A = sqliteEx
48a0: 70 72 28 54 4b 5f 53 54 41 52 2c 20 58 2c 20 59  pr(TK_STAR, X, Y
48b0: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
48c0: 3a 3d 20 65 78 70 72 28 58 29 20 53 4c 41 53 48  := expr(X) SLASH
48d0: 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73   expr(Y). {A = s
48e0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 53 4c 41  qliteExpr(TK_SLA
48f0: 53 48 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  SH, X, Y, 0);}.e
4900: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
4910: 58 29 20 52 45 4d 20 65 78 70 72 28 59 29 2e 20  X) REM expr(Y). 
4920: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70    {A = sqliteExp
4930: 72 28 54 4b 5f 52 45 4d 2c 20 58 2c 20 59 2c 20  r(TK_REM, X, Y, 
4940: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
4950: 20 65 78 70 72 28 58 29 20 43 4f 4e 43 41 54 20   expr(X) CONCAT 
4960: 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71  expr(Y). {A = sq
4970: 6c 69 74 65 45 78 70 72 28 54 4b 5f 43 4f 4e 43  liteExpr(TK_CONC
4980: 41 54 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  AT, X, Y, 0);}.e
4990: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
49a0: 58 29 20 49 53 4e 55 4c 4c 28 45 29 2e 20 7b 0a  X) ISNULL(E). {.
49b0: 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72    A = sqliteExpr
49c0: 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 30  (TK_ISNULL, X, 0
49d0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78  , 0);.  sqliteEx
49e0: 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61  prSpan(A,&X->spa
49f0: 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29  n,&E);.}.expr(A)
4a00: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 53 20   ::= expr(X) IS 
4a10: 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d  NULL(E). {.  A =
4a20: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
4a30: 53 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b  SNULL, X, 0, 0);
4a40: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  .  sqliteExprSpa
4a50: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29  n(A,&X->span,&E)
4a60: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
4a70: 65 78 70 72 28 58 29 20 4e 4f 54 4e 55 4c 4c 28  expr(X) NOTNULL(
4a80: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  E). {.  A = sqli
4a90: 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c  teExpr(TK_NOTNUL
4aa0: 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73  L, X, 0, 0);.  s
4ab0: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c  qliteExprSpan(A,
4ac0: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a  &X->span,&E);.}.
4ad0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
4ae0: 28 58 29 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e  (X) NOT NULL(E).
4af0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45   {.  A = sqliteE
4b00: 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20  xpr(TK_NOTNULL, 
4b10: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
4b20: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  teExprSpan(A,&X-
4b30: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70  >span,&E);.}.exp
4b40: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
4b50: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e   IS NOT NULL(E).
4b60: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45   {.  A = sqliteE
4b70: 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c 20  xpr(TK_NOTNULL, 
4b80: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
4b90: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  teExprSpan(A,&X-
4ba0: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70  >span,&E);.}.exp
4bb0: 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 28 42 29 20  r(A) ::= NOT(B) 
4bc0: 65 78 70 72 28 58 29 2e 20 7b 0a 20 20 41 20 3d  expr(X). {.  A =
4bd0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e   sqliteExpr(TK_N
4be0: 4f 54 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20  OT, X, 0, 0);.  
4bf0: 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41  sqliteExprSpan(A
4c00: 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d  ,&B,&X->span);.}
4c10: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 42 49 54  .expr(A) ::= BIT
4c20: 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e 20  NOT(B) expr(X). 
4c30: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  {.  A = sqliteEx
4c40: 70 72 28 54 4b 5f 42 49 54 4e 4f 54 2c 20 58 2c  pr(TK_BITNOT, X,
4c50: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
4c60: 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 58  ExprSpan(A,&B,&X
4c70: 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28  ->span);.}.expr(
4c80: 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 28 42 29 20  A) ::= MINUS(B) 
4c90: 65 78 70 72 28 58 29 2e 20 5b 55 4d 49 4e 55 53  expr(X). [UMINUS
4ca0: 5d 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  ] {.  A = sqlite
4cb0: 45 78 70 72 28 54 4b 5f 55 4d 49 4e 55 53 2c 20  Expr(TK_UMINUS, 
4cc0: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
4cd0: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c  teExprSpan(A,&B,
4ce0: 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70  &X->span);.}.exp
4cf0: 72 28 41 29 20 3a 3a 3d 20 50 4c 55 53 28 42 29  r(A) ::= PLUS(B)
4d00: 20 65 78 70 72 28 58 29 2e 20 5b 55 4d 49 4e 55   expr(X). [UMINU
4d10: 53 5d 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20 20  S] {.  A = X;.  
4d20: 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41  sqliteExprSpan(A
4d30: 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d  ,&B,&X->span);.}
4d40: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28  .expr(A) ::= LP(
4d50: 42 29 20 73 65 6c 65 63 74 28 58 29 20 52 50 28  B) select(X) RP(
4d60: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  E). {.  A = sqli
4d70: 74 65 45 78 70 72 28 54 4b 5f 53 45 4c 45 43 54  teExpr(TK_SELECT
4d80: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
4d90: 28 20 41 20 29 20 41 2d 3e 70 53 65 6c 65 63 74  ( A ) A->pSelect
4da0: 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65 45 78   = X;.  sqliteEx
4db0: 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b  prSpan(A,&B,&E);
4dc0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .}.expr(A) ::= e
4dd0: 78 70 72 28 57 29 20 42 45 54 57 45 45 4e 20 65  xpr(W) BETWEEN e
4de0: 78 70 72 28 58 29 20 41 4e 44 20 65 78 70 72 28  xpr(X) AND expr(
4df0: 59 29 2e 20 7b 0a 20 20 45 78 70 72 4c 69 73 74  Y). {.  ExprList
4e00: 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65   *pList = sqlite
4e10: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
4e20: 2c 20 58 2c 20 30 29 3b 0a 20 20 70 4c 69 73 74  , X, 0);.  pList
4e30: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
4e40: 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 59  tAppend(pList, Y
4e50: 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  , 0);.  A = sqli
4e60: 74 65 45 78 70 72 28 54 4b 5f 42 45 54 57 45 45  teExpr(TK_BETWEE
4e70: 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a 20 20 69  N, W, 0, 0);.  i
4e80: 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 20  f( A ) A->pList 
4e90: 3d 20 70 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  = pList;.  sqlit
4ea0: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 57 2d 3e  eExprSpan(A,&W->
4eb0: 73 70 61 6e 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a  span,&Y->span);.
4ec0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
4ed0: 70 72 28 57 29 20 4e 4f 54 20 42 45 54 57 45 45  pr(W) NOT BETWEE
4ee0: 4e 20 65 78 70 72 28 58 29 20 41 4e 44 20 65 78  N expr(X) AND ex
4ef0: 70 72 28 59 29 2e 20 7b 0a 20 20 45 78 70 72 4c  pr(Y). {.  ExprL
4f00: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  ist *pList = sql
4f10: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
4f20: 64 28 30 2c 20 58 2c 20 30 29 3b 0a 20 20 70 4c  d(0, X, 0);.  pL
4f30: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
4f40: 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74  ListAppend(pList
4f50: 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73  , Y, 0);.  A = s
4f60: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 42 45 54  qliteExpr(TK_BET
4f70: 57 45 45 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a  WEEN, W, 0, 0);.
4f80: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69    if( A ) A->pLi
4f90: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 41 20  st = pList;.  A 
4fa0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
4fb0: 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20  NOT, A, 0, 0);. 
4fc0: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
4fd0: 41 2c 26 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73  A,&W->span,&Y->s
4fe0: 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  pan);.}.expr(A) 
4ff0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 4e 20 4c  ::= expr(X) IN L
5000: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50  P exprlist(Y) RP
5010: 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71  (E).  {.  A = sq
5020: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e 2c 20  liteExpr(TK_IN, 
5030: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  X, 0, 0);.  if( 
5040: 41 20 29 20 41 2d 3e 70 4c 69 73 74 20 3d 20 59  A ) A->pList = Y
5050: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70  ;.  sqliteExprSp
5060: 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45  an(A,&X->span,&E
5070: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
5080: 20 65 78 70 72 28 58 29 20 49 4e 20 4c 50 20 73   expr(X) IN LP s
5090: 65 6c 65 63 74 28 59 29 20 52 50 28 45 29 2e 20  elect(Y) RP(E). 
50a0: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45   {.  A = sqliteE
50b0: 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20 30 2c  xpr(TK_IN, X, 0,
50c0: 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41   0);.  if( A ) A
50d0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 59 3b 0a 20  ->pSelect = Y;. 
50e0: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
50f0: 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a  A,&X->span,&E);.
5100: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
5110: 70 72 28 58 29 20 4e 4f 54 20 49 4e 20 4c 50 20  pr(X) NOT IN LP 
5120: 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 28 45  exprlist(Y) RP(E
5130: 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  ).  {.  A = sqli
5140: 74 65 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c  teExpr(TK_IN, X,
5150: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20   0, 0);.  if( A 
5160: 29 20 41 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a  ) A->pList = Y;.
5170: 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72    A = sqliteExpr
5180: 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30  (TK_NOT, A, 0, 0
5190: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53  );.  sqliteExprS
51a0: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26  pan(A,&X->span,&
51b0: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
51c0: 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20 49 4e  = expr(X) NOT IN
51d0: 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52 50   LP select(Y) RP
51e0: 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71  (E).  {.  A = sq
51f0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e 2c 20  liteExpr(TK_IN, 
5200: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  X, 0, 0);.  if( 
5210: 41 20 29 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d  A ) A->pSelect =
5220: 20 59 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65   Y;.  A = sqlite
5230: 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20  Expr(TK_NOT, A, 
5240: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45  0, 0);.  sqliteE
5250: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70  xprSpan(A,&X->sp
5260: 61 6e 2c 26 45 29 3b 0a 7d 0a 0a 2f 2a 20 43 41  an,&E);.}../* CA
5270: 53 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  SE expressions *
5280: 2f 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41  /.expr(A) ::= CA
5290: 53 45 28 43 29 20 63 61 73 65 5f 6f 70 65 72 61  SE(C) case_opera
52a0: 6e 64 28 58 29 20 63 61 73 65 5f 65 78 70 72 6c  nd(X) case_exprl
52b0: 69 73 74 28 59 29 20 63 61 73 65 5f 65 6c 73 65  ist(Y) case_else
52c0: 28 5a 29 20 45 4e 44 28 45 29 2e 20 7b 0a 20 20  (Z) END(E). {.  
52d0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
52e0: 4b 5f 43 41 53 45 2c 20 58 2c 20 5a 2c 20 30 29  K_CASE, X, Z, 0)
52f0: 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70  ;.  if( A ) A->p
5300: 4c 69 73 74 20 3d 20 59 3b 0a 20 20 73 71 6c 69  List = Y;.  sqli
5310: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 20 26 43  teExprSpan(A, &C
5320: 2c 20 26 45 29 3b 0a 7d 0a 25 74 79 70 65 20 63  , &E);.}.%type c
5330: 61 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 45 78  ase_exprlist {Ex
5340: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  prList*}.%destru
5350: 63 74 6f 72 20 63 61 73 65 5f 65 78 70 72 6c 69  ctor case_exprli
5360: 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69  st {sqliteExprLi
5370: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 63  stDelete($$);}.c
5380: 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20  ase_exprlist(A) 
5390: 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c 69 73  ::= case_exprlis
53a0: 74 28 58 29 20 57 48 45 4e 20 65 78 70 72 28 59  t(X) WHEN expr(Y
53b0: 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20  ) THEN expr(Z). 
53c0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  {.  A = sqliteEx
53d0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 20  prListAppend(X, 
53e0: 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c  Y, 0);.  A = sql
53f0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
5400: 64 28 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a 63 61  d(A, Z, 0);.}.ca
5410: 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a  se_exprlist(A) :
5420: 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 59 29 20  := WHEN expr(Y) 
5430: 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a  THEN expr(Z). {.
5440: 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72    A = sqliteExpr
5450: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 59 2c  ListAppend(0, Y,
5460: 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74   0);.  A = sqlit
5470: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
5480: 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a 25 74 79 70  A, Z, 0);.}.%typ
5490: 65 20 63 61 73 65 5f 65 6c 73 65 20 7b 45 78 70  e case_else {Exp
54a0: 72 2a 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29  r*}.case_else(A)
54b0: 20 3a 3a 3d 20 20 45 4c 53 45 20 65 78 70 72 28   ::=  ELSE expr(
54c0: 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d  X).         {A =
54d0: 20 58 3b 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41   X;}.case_else(A
54e0: 29 20 3a 3a 3d 20 20 2e 20 20 20 20 20 20 20 20  ) ::=  .        
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
5500: 3d 20 30 3b 7d 20 0a 25 74 79 70 65 20 63 61 73  = 0;} .%type cas
5510: 65 5f 6f 70 65 72 61 6e 64 20 7b 45 78 70 72 2a  e_operand {Expr*
5520: 7d 0a 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 41  }.case_operand(A
5530: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20  ) ::= expr(X).  
5540: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
5550: 3b 7d 20 0a 63 61 73 65 5f 6f 70 65 72 61 6e 64  ;} .case_operand
5560: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
5570: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
5580: 20 30 3b 7d 20 0a 0a 25 74 79 70 65 20 65 78 70   0;} ..%type exp
5590: 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a  rlist {ExprList*
55a0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78  }.%destructor ex
55b0: 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 45 78  prlist {sqliteEx
55c0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
55d0: 3b 7d 0a 25 74 79 70 65 20 65 78 70 72 69 74 65  ;}.%type exprite
55e0: 6d 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72  m {Expr*}.%destr
55f0: 75 63 74 6f 72 20 65 78 70 72 69 74 65 6d 20 7b  uctor expritem {
5600: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
5610: 28 24 24 29 3b 7d 0a 0a 65 78 70 72 6c 69 73 74  ($$);}..exprlist
5620: 28 41 29 20 3a 3a 3d 20 65 78 70 72 6c 69 73 74  (A) ::= exprlist
5630: 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 69 74  (X) COMMA exprit
5640: 65 6d 28 59 29 2e 20 0a 20 20 20 7b 41 20 3d 20  em(Y). .   {A = 
5650: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
5660: 70 65 6e 64 28 58 2c 59 2c 30 29 3b 7d 0a 65 78  pend(X,Y,0);}.ex
5670: 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78  prlist(A) ::= ex
5680: 70 72 69 74 65 6d 28 58 29 2e 20 20 20 20 20 20  pritem(X).      
5690: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
56a0: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
56b0: 30 2c 58 2c 30 29 3b 7d 0a 65 78 70 72 69 74 65  0,X,0);}.exprite
56c0: 6d 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  m(A) ::= expr(X)
56d0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
56e0: 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72 69 74   {A = X;}.exprit
56f0: 65 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  em(A) ::= .     
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f    {A = 0;}..////
5720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5730: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52  ///////// The CR
5740: 45 41 54 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61  EATE INDEX comma
5750: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
5760: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
5770: 64 20 3a 3a 3d 20 43 52 45 41 54 45 28 53 29 20  d ::= CREATE(S) 
5780: 75 6e 69 71 75 65 66 6c 61 67 28 55 29 20 49 4e  uniqueflag(U) IN
5790: 44 45 58 20 69 64 73 28 58 29 0a 20 20 20 20 20  DEX ids(X).     
57a0: 20 20 20 4f 4e 20 69 64 73 28 59 29 20 4c 50 20     ON ids(Y) LP 
57b0: 69 64 78 6c 69 73 74 28 5a 29 20 52 50 28 45 29  idxlist(Z) RP(E)
57c0: 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 7b 0a 20 20   onconf(R). {.  
57d0: 69 66 28 20 55 21 3d 4f 45 5f 4e 6f 6e 65 20 29  if( U!=OE_None )
57e0: 20 55 20 3d 20 52 3b 0a 20 20 69 66 28 20 55 3d   U = R;.  if( U=
57f0: 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 55 20 3d  =OE_Default) U =
5800: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 73 71 6c   OE_Abort;.  sql
5810: 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 70  iteCreateIndex(p
5820: 50 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 5a  Parse, &X, &Y, Z
5830: 2c 20 55 2c 20 26 53 2c 20 26 45 29 3b 0a 7d 0a  , U, &S, &E);.}.
5840: 0a 25 74 79 70 65 20 75 6e 69 71 75 65 66 6c 61  .%type uniquefla
5850: 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75 65 66 6c  g {int}.uniquefl
5860: 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49 51 55 45  ag(A) ::= UNIQUE
5870: 2e 20 20 7b 20 41 20 3d 20 4f 45 5f 41 62 6f 72  .  { A = OE_Abor
5880: 74 3b 20 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28  t; }.uniqueflag(
5890: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
58a0: 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 20 7d  { A = OE_None; }
58b0: 0a 0a 25 74 79 70 65 20 69 64 78 6c 69 73 74 20  ..%type idxlist 
58c0: 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  {IdList*}.%destr
58d0: 75 63 74 6f 72 20 69 64 78 6c 69 73 74 20 7b 73  uctor idxlist {s
58e0: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
58f0: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 69 64  e($$);}.%type id
5900: 78 69 74 65 6d 20 7b 54 6f 6b 65 6e 7d 0a 0a 69  xitem {Token}..i
5910: 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64  dxlist(A) ::= id
5920: 78 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 69  xlist(X) COMMA i
5930: 64 78 69 74 65 6d 28 59 29 2e 20 20 0a 20 20 20  dxitem(Y).  .   
5940: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 49 64 4c    {A = sqliteIdL
5950: 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59 29 3b  istAppend(X,&Y);
5960: 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d  }.idxlist(A) ::=
5970: 20 69 64 78 69 74 65 6d 28 59 29 2e 0a 20 20 20   idxitem(Y)..   
5980: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 49 64 4c    {A = sqliteIdL
5990: 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59 29 3b  istAppend(0,&Y);
59a0: 7d 0a 69 64 78 69 74 65 6d 28 41 29 20 3a 3a 3d  }.idxitem(A) ::=
59b0: 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20 20   ids(X).        
59c0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 2f 2f    {A = X;}..////
59d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
59e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52  ///////// The DR
59f0: 4f 50 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64  OP INDEX command
5a00: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
5a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 63  //////////.//..c
5a20: 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 49 4e 44 45  md ::= DROP INDE
5a30: 58 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 7b  X ids(X).      {
5a40: 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 78 28  sqliteDropIndex(
5a50: 70 50 61 72 73 65 2c 20 26 58 29 3b 7d 0a 0a 0a  pParse, &X);}...
5a60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
5a80: 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e 64 20 2f  e COPY command /
5a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5aa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
5ab0: 2f 0a 63 6d 64 20 3a 3a 3d 20 43 4f 50 59 20 6f  /.cmd ::= COPY o
5ac0: 72 63 6f 6e 66 28 52 29 20 69 64 73 28 58 29 20  rconf(R) ids(X) 
5ad0: 46 52 4f 4d 20 69 64 73 28 59 29 20 55 53 49 4e  FROM ids(Y) USIN
5ae0: 47 20 44 45 4c 49 4d 49 54 45 52 53 20 53 54 52  G DELIMITERS STR
5af0: 49 4e 47 28 5a 29 2e 0a 20 20 20 20 7b 73 71 6c  ING(Z)..    {sql
5b00: 69 74 65 43 6f 70 79 28 70 50 61 72 73 65 2c 26  iteCopy(pParse,&
5b10: 58 2c 26 59 2c 26 5a 2c 52 29 3b 7d 0a 63 6d 64  X,&Y,&Z,R);}.cmd
5b20: 20 3a 3a 3d 20 43 4f 50 59 20 6f 72 63 6f 6e 66   ::= COPY orconf
5b30: 28 52 29 20 69 64 73 28 58 29 20 46 52 4f 4d 20  (R) ids(X) FROM 
5b40: 69 64 73 28 59 29 2e 0a 20 20 20 20 7b 73 71 6c  ids(Y)..    {sql
5b50: 69 74 65 43 6f 70 79 28 70 50 61 72 73 65 2c 26  iteCopy(pParse,&
5b60: 58 2c 26 59 2c 30 2c 52 29 3b 7d 0a 0a 2f 2f 2f  X,&Y,0,R);}..///
5b70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56  ////////// The V
5b90: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f  ACUUM command //
5ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
5bc0: 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d 2e 20 20  md ::= VACUUM.  
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
5be0: 71 6c 69 74 65 56 61 63 75 75 6d 28 70 50 61 72  qliteVacuum(pPar
5bf0: 73 65 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  se,0);}.cmd ::= 
5c00: 56 41 43 55 55 4d 20 69 64 73 28 58 29 2e 20 20  VACUUM ids(X).  
5c10: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 56 61         {sqliteVa
5c20: 63 75 75 6d 28 70 50 61 72 73 65 2c 26 58 29 3b  cuum(pParse,&X);
5c30: 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }../////////////
5c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c50: 20 54 68 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d   The PRAGMA comm
5c60: 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  and ////////////
5c70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c80: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  /.//.cmd ::= PRA
5c90: 47 4d 41 20 69 64 73 28 58 29 20 45 51 20 69 64  GMA ids(X) EQ id
5ca0: 73 28 59 29 2e 20 20 20 20 20 20 20 20 20 7b 73  s(Y).         {s
5cb0: 71 6c 69 74 65 50 72 61 67 6d 61 28 70 50 61 72  qlitePragma(pPar
5cc0: 73 65 2c 26 58 2c 26 59 2c 30 29 3b 7d 0a 63 6d  se,&X,&Y,0);}.cm
5cd0: 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 69 64 73  d ::= PRAGMA ids
5ce0: 28 58 29 20 45 51 20 4f 4e 28 59 29 2e 20 20 20  (X) EQ ON(Y).   
5cf0: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 50 72         {sqlitePr
5d00: 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26  agma(pParse,&X,&
5d10: 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50  Y,0);}.cmd ::= P
5d20: 52 41 47 4d 41 20 69 64 73 28 58 29 20 45 51 20  RAGMA ids(X) EQ 
5d30: 70 6c 75 73 5f 6e 75 6d 28 59 29 2e 20 20 20 20  plus_num(Y).    
5d40: 7b 73 71 6c 69 74 65 50 72 61 67 6d 61 28 70 50  {sqlitePragma(pP
5d50: 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b 7d 0a  arse,&X,&Y,0);}.
5d60: 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 69  cmd ::= PRAGMA i
5d70: 64 73 28 58 29 20 45 51 20 6d 69 6e 75 73 5f 6e  ds(X) EQ minus_n
5d80: 75 6d 28 59 29 2e 20 20 20 7b 73 71 6c 69 74 65  um(Y).   {sqlite
5d90: 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58  Pragma(pParse,&X
5da0: 2c 26 59 2c 31 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  ,&Y,1);}.cmd ::=
5db0: 20 50 52 41 47 4d 41 20 69 64 73 28 58 29 20 4c   PRAGMA ids(X) L
5dc0: 50 20 69 64 73 28 59 29 20 52 50 2e 20 20 20 20  P ids(Y) RP.    
5dd0: 20 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61 28    {sqlitePragma(
5de0: 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b  pParse,&X,&Y,0);
5df0: 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41  }.cmd ::= PRAGMA
5e00: 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20 20   ids(X).        
5e10: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
5e20: 74 65 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c  tePragma(pParse,
5e30: 26 58 2c 26 58 2c 30 29 3b 7d 0a 70 6c 75 73 5f  &X,&X,0);}.plus_
5e40: 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f  num(A) ::= plus_
5e50: 6f 70 74 20 6e 75 6d 62 65 72 28 58 29 2e 20 20  opt number(X).  
5e60: 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75 73 5f   {A = X;}.minus_
5e70: 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53  num(A) ::= MINUS
5e80: 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20   number(X).     
5e90: 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72 28  {A = X;}.number(
5ea0: 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 28 58  A) ::= INTEGER(X
5eb0: 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d  ).  {A = X;}.num
5ec0: 62 65 72 28 41 29 20 3a 3a 3d 20 46 4c 4f 41 54  ber(A) ::= FLOAT
5ed0: 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d  (X).    {A = X;}
5ee0: 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d 20 50 4c  .plus_opt ::= PL
5ef0: 55 53 2e 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d  US..plus_opt ::=
5f00: 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ...////////////
5f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f20: 20 54 68 65 20 43 52 45 41 54 45 20 54 52 49 47   The CREATE TRIG
5f30: 47 45 52 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  GER command ////
5f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f50: 2f 0a 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45  /.cmd ::= CREATE
5f60: 28 41 29 20 54 52 49 47 47 45 52 20 69 64 73 28  (A) TRIGGER ids(
5f70: 42 29 20 74 72 69 67 67 65 72 5f 74 69 6d 65 28  B) trigger_time(
5f80: 43 29 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74  C) trigger_event
5f90: 28 44 29 20 4f 4e 20 69 64 73 28 45 29 20 0a 20  (D) ON ids(E) . 
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fb0: 20 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28   foreach_clause(
5fc0: 46 29 20 77 68 65 6e 5f 63 6c 61 75 73 65 28 47  F) when_clause(G
5fd0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
5fe0: 20 20 20 20 42 45 47 49 4e 20 74 72 69 67 67 65      BEGIN trigge
5ff0: 72 5f 63 6d 64 5f 6c 69 73 74 28 53 29 20 45 4e  r_cmd_list(S) EN
6000: 44 28 5a 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  D(Z). {.  sqlite
6010: 43 72 65 61 74 65 54 72 69 67 67 65 72 28 70 50  CreateTrigger(pP
6020: 61 72 73 65 2c 20 26 42 2c 20 43 2c 20 44 2e 61  arse, &B, C, D.a
6030: 2c 20 44 2e 62 2c 20 26 45 2c 20 46 2c 20 47 2c  , D.b, &E, F, G,
6040: 20 53 2c 20 0a 20 20 20 20 20 20 41 2e 7a 2c 20   S, .      A.z, 
6050: 28 69 6e 74 29 28 5a 2e 7a 20 2d 20 41 2e 7a 29  (int)(Z.z - A.z)
6060: 20 2b 20 5a 2e 6e 20 29 3b 0a 7d 0a 0a 25 74 79   + Z.n );.}..%ty
6070: 70 65 20 74 72 69 67 67 65 72 5f 74 69 6d 65 20  pe trigger_time 
6080: 20 7b 69 6e 74 7d 0a 74 72 69 67 67 65 72 5f 74   {int}.trigger_t
6090: 69 6d 65 28 41 29 20 3a 3a 3d 20 42 45 46 4f 52  ime(A) ::= BEFOR
60a0: 45 2e 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b  E.      { A = TK
60b0: 5f 42 45 46 4f 52 45 3b 20 7d 0a 74 72 69 67 67  _BEFORE; }.trigg
60c0: 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 41  er_time(A) ::= A
60d0: 46 54 45 52 2e 20 20 20 20 20 20 20 7b 20 41 20  FTER.       { A 
60e0: 3d 20 54 4b 5f 41 46 54 45 52 3b 20 20 7d 0a 74  = TK_AFTER;  }.t
60f0: 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a  rigger_time(A) :
6100: 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46 2e 20 20  := INSTEAD OF.  
6110: 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54 45 41 44  { A = TK_INSTEAD
6120: 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28  ;}.trigger_time(
6130: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
6140: 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46      { A = TK_BEF
6150: 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72  ORE; }..%type tr
6160: 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 74 72  igger_event {str
6170: 75 63 74 20 54 72 69 67 45 76 65 6e 74 7d 0a 25  uct TrigEvent}.%
6180: 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67 67  destructor trigg
6190: 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c 69 74 65  er_event {sqlite
61a0: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 24 24 2e  IdListDelete($$.
61b0: 62 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65  b);}.trigger_eve
61c0: 6e 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45  nt(A) ::= DELETE
61d0: 2e 20 7b 20 41 2e 61 20 3d 20 54 4b 5f 44 45 4c  . { A.a = TK_DEL
61e0: 45 54 45 3b 20 41 2e 62 20 3d 20 30 3b 20 7d 0a  ETE; A.b = 0; }.
61f0: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29  trigger_event(A)
6200: 20 3a 3a 3d 20 49 4e 53 45 52 54 2e 20 7b 20 41   ::= INSERT. { A
6210: 2e 61 20 3d 20 54 4b 5f 49 4e 53 45 52 54 3b 20  .a = TK_INSERT; 
6220: 41 2e 62 20 3d 20 30 3b 20 7d 0a 74 72 69 67 67  A.b = 0; }.trigg
6230: 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20  er_event(A) ::= 
6240: 55 50 44 41 54 45 2e 20 7b 20 41 2e 61 20 3d 20  UPDATE. { A.a = 
6250: 54 4b 5f 55 50 44 41 54 45 3b 20 41 2e 62 20 3d  TK_UPDATE; A.b =
6260: 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65   0;}.trigger_eve
6270: 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45  nt(A) ::= UPDATE
6280: 20 4f 46 20 69 6e 73 63 6f 6c 6c 69 73 74 28 58   OF inscollist(X
6290: 29 2e 20 7b 41 2e 61 20 3d 20 54 4b 5f 55 50 44  ). {A.a = TK_UPD
62a0: 41 54 45 3b 20 41 2e 62 20 3d 20 58 3b 20 7d 0a  ATE; A.b = X; }.
62b0: 0a 25 74 79 70 65 20 66 6f 72 65 61 63 68 5f 63  .%type foreach_c
62c0: 6c 61 75 73 65 20 7b 69 6e 74 7d 0a 66 6f 72 65  lause {int}.fore
62d0: 61 63 68 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a  ach_clause(A) ::
62e0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
62f0: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 52        { A = TK_R
6300: 4f 57 3b 20 7d 0a 66 6f 72 65 61 63 68 5f 63 6c  OW; }.foreach_cl
6310: 61 75 73 65 28 41 29 20 3a 3a 3d 20 46 4f 52 20  ause(A) ::= FOR 
6320: 45 41 43 48 20 52 4f 57 2e 20 20 20 20 20 20 20  EACH ROW.       
6330: 7b 20 41 20 3d 20 54 4b 5f 52 4f 57 3b 20 7d 0a  { A = TK_ROW; }.
6340: 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28 41  foreach_clause(A
6350: 29 20 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 53  ) ::= FOR EACH S
6360: 54 41 54 45 4d 45 4e 54 2e 20 7b 20 41 20 3d 20  TATEMENT. { A = 
6370: 54 4b 5f 53 54 41 54 45 4d 45 4e 54 3b 20 7d 0a  TK_STATEMENT; }.
6380: 0a 25 74 79 70 65 20 77 68 65 6e 5f 63 6c 61 75  .%type when_clau
6390: 73 65 20 7b 45 78 70 72 20 2a 7d 0a 77 68 65 6e  se {Expr *}.when
63a0: 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e  _clause(A) ::= .
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
63c0: 20 3d 20 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61   = 0; }.when_cla
63d0: 75 73 65 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20  use(A) ::= WHEN 
63e0: 65 78 70 72 28 58 29 2e 20 7b 20 41 20 3d 20 58  expr(X). { A = X
63f0: 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67  ; }..%type trigg
6400: 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 54 72 69  er_cmd_list {Tri
6410: 67 67 65 72 53 74 65 70 20 2a 7d 0a 74 72 69 67  ggerStep *}.trig
6420: 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20  ger_cmd_list(A) 
6430: 3a 3a 3d 20 74 72 69 67 67 65 72 5f 63 6d 64 28  ::= trigger_cmd(
6440: 58 29 20 53 45 4d 49 20 74 72 69 67 67 65 72 5f  X) SEMI trigger_
6450: 63 6d 64 5f 6c 69 73 74 28 59 29 2e 20 7b 0a 20  cmd_list(Y). {. 
6460: 20 58 2d 3e 70 4e 65 78 74 20 3d 20 59 20 3b 20   X->pNext = Y ; 
6470: 41 20 3d 20 58 3b 20 7d 0a 74 72 69 67 67 65 72  A = X; }.trigger
6480: 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d  _cmd_list(A) ::=
6490: 20 2e 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 0a 25   . { A = 0; }..%
64a0: 74 79 70 65 20 74 72 69 67 67 65 72 5f 63 6d 64  type trigger_cmd
64b0: 20 7b 54 72 69 67 67 65 72 53 74 65 70 20 2a 7d   {TriggerStep *}
64c0: 0a 2f 2f 20 55 50 44 41 54 45 20 0a 74 72 69 67  .// UPDATE .trig
64d0: 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 55  ger_cmd(A) ::= U
64e0: 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20  PDATE orconf(R) 
64f0: 69 64 73 28 58 29 20 53 45 54 20 73 65 74 6c 69  ids(X) SET setli
6500: 73 74 28 59 29 20 77 68 65 72 65 5f 6f 70 74 28  st(Y) where_opt(
6510: 5a 29 2e 20 20 0a 20 20 20 20 20 20 20 20 20 20  Z).  .          
6520: 20 20 20 20 20 7b 20 41 20 3d 20 73 71 6c 69 74       { A = sqlit
6530: 65 54 72 69 67 67 65 72 55 70 64 61 74 65 53 74  eTriggerUpdateSt
6540: 65 70 28 26 58 2c 20 59 2c 20 5a 2c 20 52 29 3b  ep(&X, Y, Z, R);
6550: 20 7d 0a 0a 2f 2f 20 49 4e 53 45 52 54 0a 74 72   }..// INSERT.tr
6560: 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d  igger_cmd(A) ::=
6570: 20 49 4e 53 45 52 54 20 6f 72 63 6f 6e 66 28 52   INSERT orconf(R
6580: 29 20 49 4e 54 4f 20 69 64 73 28 58 29 20 69 6e  ) INTO ids(X) in
6590: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20  scollist_opt(F) 
65a0: 0a 20 20 56 41 4c 55 45 53 20 4c 50 20 69 74 65  .  VALUES LP ite
65b0: 6d 6c 69 73 74 28 59 29 20 52 50 2e 20 20 0a 7b  mlist(Y) RP.  .{
65c0: 41 20 3d 20 73 71 6c 69 74 65 54 72 69 67 67 65  A = sqliteTrigge
65d0: 72 49 6e 73 65 72 74 53 74 65 70 28 26 58 2c 20  rInsertStep(&X, 
65e0: 46 2c 20 59 2c 20 30 2c 20 52 29 3b 7d 0a 0a 74  F, Y, 0, R);}..t
65f0: 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a  rigger_cmd(A) ::
6600: 3d 20 49 4e 53 45 52 54 20 6f 72 63 6f 6e 66 28  = INSERT orconf(
6610: 52 29 20 49 4e 54 4f 20 69 64 73 28 58 29 20 69  R) INTO ids(X) i
6620: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29  nscollist_opt(F)
6630: 20 73 65 6c 65 63 74 28 53 29 2e 0a 20 20 20 20   select(S)..    
6640: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
6650: 73 71 6c 69 74 65 54 72 69 67 67 65 72 49 6e 73  sqliteTriggerIns
6660: 65 72 74 53 74 65 70 28 26 58 2c 20 46 2c 20 30  ertStep(&X, F, 0
6670: 2c 20 53 2c 20 52 29 3b 7d 0a 0a 2f 2f 20 44 45  , S, R);}..// DE
6680: 4c 45 54 45 0a 74 72 69 67 67 65 72 5f 63 6d 64  LETE.trigger_cmd
6690: 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46  (A) ::= DELETE F
66a0: 52 4f 4d 20 69 64 73 28 58 29 20 77 68 65 72 65  ROM ids(X) where
66b0: 5f 6f 70 74 28 59 29 2e 0a 20 20 20 20 20 20 20  _opt(Y)..       
66c0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
66d0: 69 74 65 54 72 69 67 67 65 72 44 65 6c 65 74 65  iteTriggerDelete
66e0: 53 74 65 70 28 26 58 2c 20 59 29 3b 7d 0a 0a 2f  Step(&X, Y);}../
66f0: 2f 20 53 45 4c 45 43 54 0a 74 72 69 67 67 65 72  / SELECT.trigger
6700: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 73 65 6c 65  _cmd(A) ::= sele
6710: 63 74 28 58 29 2e 20 20 7b 41 20 3d 20 73 71 6c  ct(X).  {A = sql
6720: 69 74 65 54 72 69 67 67 65 72 53 65 6c 65 63 74  iteTriggerSelect
6730: 53 74 65 70 28 58 29 3b 20 7d 0a 0a 2f 2f 2f 2f  Step(X); }..////
6740: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6750: 2f 2f 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47  ////  DROP TRIGG
6760: 45 52 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  ER statement ///
6770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 63 6d 64 20  ///////////.cmd 
6790: 3a 3a 3d 20 44 52 4f 50 20 54 52 49 47 47 45 52  ::= DROP TRIGGER
67a0: 20 69 64 73 28 58 29 2e 20 7b 0a 20 20 20 20 73   ids(X). {.    s
67b0: 71 6c 69 74 65 44 72 6f 70 54 72 69 67 67 65 72  qliteDropTrigger
67c0: 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 0a 7d  (pParse,&X,0);.}
67d0: 0a                                               .