/ Hex Artifact Content
Login

Artifact 42920305d49666419358b469e4ec522ac867a39f:


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 37 33 20 32 30 30 32 2f 30 36 2f 31 31 20 30  .73 2002/06/11 0
0290: 32 3a 32 35 3a 34 32 20 64 61 6e 69 65 6c 6b 31  2:25:42 danielk1
02a0: 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 25 74 6f  977 Exp $.*/.%to
02b0: 6b 65 6e 5f 70 72 65 66 69 78 20 54 4b 5f 0a 25  ken_prefix TK_.%
02c0: 74 6f 6b 65 6e 5f 74 79 70 65 20 7b 54 6f 6b 65  token_type {Toke
02d0: 6e 7d 0a 25 64 65 66 61 75 6c 74 5f 74 79 70 65  n}.%default_type
02e0: 20 7b 54 6f 6b 65 6e 7d 0a 25 65 78 74 72 61 5f   {Token}.%extra_
02f0: 61 72 67 75 6d 65 6e 74 20 7b 50 61 72 73 65 20  argument {Parse 
0300: 2a 70 50 61 72 73 65 7d 0a 25 73 79 6e 74 61 78  *pParse}.%syntax
0310: 5f 65 72 72 6f 72 20 7b 0a 20 20 73 71 6c 69 74  _error {.  sqlit
0320: 65 53 65 74 53 74 72 69 6e 67 28 26 70 50 61 72  eSetString(&pPar
0330: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 22 73 79 6e  se->zErrMsg,"syn
0340: 74 61 78 20 65 72 72 6f 72 22 2c 30 29 3b 0a 20  tax error",0);. 
0350: 20 70 50 61 72 73 65 2d 3e 73 45 72 72 54 6f 6b   pParse->sErrTok
0360: 65 6e 20 3d 20 54 4f 4b 45 4e 3b 0a 7d 0a 25 6e  en = TOKEN;.}.%n
0370: 61 6d 65 20 73 71 6c 69 74 65 50 61 72 73 65 72  ame sqliteParser
0380: 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 23 69 6e 63  .%include {.#inc
0390: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
03a0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 72  h".#include "par
03b0: 73 65 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  se.h"../*.** An 
03c0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
03d0: 20 73 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73   structure holds
03e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
03f0: 75 74 20 74 68 65 0a 2a 2a 20 4c 49 4d 49 54 20  ut the.** LIMIT 
0400: 63 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45  clause of a SELE
0410: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  CT statement..*/
0420: 0a 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61 6c  .struct LimitVal
0430: 20 7b 0a 20 20 69 6e 74 20 6c 69 6d 69 74 3b 20   {.  int limit; 
0440: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20     /* The LIMIT 
0450: 76 61 6c 75 65 2e 20 20 2d 31 20 69 66 20 74 68  value.  -1 if th
0460: 65 72 65 20 69 73 20 6e 6f 20 6c 69 6d 69 74 20  ere is no limit 
0470: 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b  */.  int offset;
0480: 20 20 20 2f 2a 20 54 68 65 20 4f 46 46 53 45 54     /* The OFFSET
0490: 2e 20 20 30 20 69 66 20 74 68 65 72 65 20 69 73  .  0 if there is
04a0: 20 6e 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   none */.};../*.
04b0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
04c0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
04d0: 73 74 72 75 63 74 75 72 65 20 64 65 73 63 72 69  structure descri
04e0: 62 65 73 20 74 68 65 20 65 76 65 6e 74 20 6f 66  bes the event of
04f0: 20 61 0a 2a 2a 20 54 52 49 47 47 45 52 2e 20 20   a.** TRIGGER.  
0500: 22 61 22 20 69 73 20 74 68 65 20 65 76 65 6e 74  "a" is the event
0510: 20 74 79 70 65 2c 20 6f 6e 65 20 6f 66 20 54 4b   type, one of TK
0520: 5f 55 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45  _UPDATE, TK_INSE
0530: 52 54 2c 0a 2a 2a 20 54 4b 5f 44 45 4c 45 54 45  RT,.** TK_DELETE
0540: 2c 20 6f 72 20 54 4b 5f 49 4e 53 54 45 41 44 2e  , or TK_INSTEAD.
0550: 20 20 49 66 20 74 68 65 20 65 76 65 6e 74 20 69    If the event i
0560: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
0570: 0a 2a 2a 20 20 20 20 20 20 55 50 44 41 54 45 20  .**      UPDATE 
0580: 4f 4e 20 28 61 2c 62 2c 63 29 0a 2a 2a 0a 2a 2a  ON (a,b,c).**.**
0590: 20 54 68 65 6e 20 74 68 65 20 22 62 22 20 49 64   Then the "b" Id
05a0: 4c 69 73 74 20 72 65 63 6f 72 64 73 20 74 68 65  List records the
05b0: 20 6c 69 73 74 20 22 61 2c 62 2c 63 22 2e 0a 2a   list "a,b,c"..*
05c0: 2f 0a 73 74 72 75 63 74 20 54 72 69 67 45 76 65  /.struct TrigEve
05d0: 6e 74 20 7b 20 69 6e 74 20 61 3b 20 49 64 4c 69  nt { int a; IdLi
05e0: 73 74 20 2a 20 62 3b 20 7d 3b 0a 7d 0a 0a 2f 2f  st * b; };.}..//
05f0: 20 54 68 65 73 65 20 61 72 65 20 65 78 74 72 61   These are extra
0600: 20 74 6f 6b 65 6e 73 20 75 73 65 64 20 62 79 20   tokens used by 
0610: 74 68 65 20 6c 65 78 65 72 20 62 75 74 20 6e 65  the lexer but ne
0620: 76 65 72 20 73 65 65 6e 20 62 79 20 74 68 65 0a  ver seen by the.
0630: 2f 2f 20 70 61 72 73 65 72 2e 20 20 57 65 20 70  // parser.  We p
0640: 75 74 20 74 68 65 6d 20 69 6e 20 61 20 72 75 6c  ut them in a rul
0650: 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61  e so that the pa
0660: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 77  rser generator w
0670: 69 6c 6c 0a 2f 2f 20 61 64 64 20 74 68 65 6d 20  ill.// add them 
0680: 74 6f 20 74 68 65 20 70 61 72 73 65 2e 68 20 6f  to the parse.h o
0690: 75 74 70 75 74 20 66 69 6c 65 2e 0a 2f 2f 0a 25  utput file..//.%
06a0: 6e 6f 6e 61 73 73 6f 63 20 45 4e 44 5f 4f 46 5f  nonassoc END_OF_
06b0: 46 49 4c 45 20 49 4c 4c 45 47 41 4c 20 53 50 41  FILE ILLEGAL SPA
06c0: 43 45 20 55 4e 43 4c 4f 53 45 44 5f 53 54 52 49  CE UNCLOSED_STRI
06d0: 4e 47 20 43 4f 4d 4d 45 4e 54 20 46 55 4e 43 54  NG COMMENT FUNCT
06e0: 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 43 4f  ION.          CO
06f0: 4c 55 4d 4e 20 41 47 47 5f 46 55 4e 43 54 49 4f  LUMN AGG_FUNCTIO
0700: 4e 2e 0a 0a 2f 2f 20 49 6e 70 75 74 20 69 73 20  N...// Input is 
0710: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6d  zero or more com
0720: 6d 61 6e 64 73 2e 0a 69 6e 70 75 74 20 3a 3a 3d  mands..input ::=
0730: 20 63 6d 64 6c 69 73 74 2e 0a 0a 2f 2f 20 41 20   cmdlist...// A 
0740: 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73  list of commands
0750: 20 69 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   is zero or more
0760: 20 63 6f 6d 6d 61 6e 64 73 0a 2f 2f 0a 63 6d 64   commands.//.cmd
0770: 6c 69 73 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a 63  list ::= ecmd..c
0780: 6d 64 6c 69 73 74 20 3a 3a 3d 20 63 6d 64 6c 69  mdlist ::= cmdli
0790: 73 74 20 65 63 6d 64 2e 0a 65 63 6d 64 20 3a 3a  st ecmd..ecmd ::
07a0: 3d 20 65 78 70 6c 61 69 6e 20 63 6d 64 20 53 45  = explain cmd SE
07b0: 4d 49 2e 20 20 7b 73 71 6c 69 74 65 45 78 65 63  MI.  {sqliteExec
07c0: 28 70 50 61 72 73 65 29 3b 7d 0a 65 63 6d 64 20  (pParse);}.ecmd 
07d0: 3a 3a 3d 20 63 6d 64 20 53 45 4d 49 2e 20 20 20  ::= cmd SEMI.   
07e0: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 45 78         {sqliteEx
07f0: 65 63 28 70 50 61 72 73 65 29 3b 7d 0a 65 63 6d  ec(pParse);}.ecm
0800: 64 20 3a 3a 3d 20 53 45 4d 49 2e 0a 65 78 70 6c  d ::= SEMI..expl
0810: 61 69 6e 20 3a 3a 3d 20 45 58 50 4c 41 49 4e 2e  ain ::= EXPLAIN.
0820: 20 20 20 20 7b 70 50 61 72 73 65 2d 3e 65 78 70      {pParse->exp
0830: 6c 61 69 6e 20 3d 20 31 3b 7d 0a 0a 2f 2f 2f 2f  lain = 1;}..////
0840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0850: 2f 20 42 65 67 69 6e 20 61 6e 64 20 65 6e 64 20  / Begin and end 
0860: 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 2f 2f  transactions. //
0870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 63  //////////.//..c
0890: 6d 64 20 3a 3a 3d 20 42 45 47 49 4e 20 74 72 61  md ::= BEGIN tra
08a0: 6e 73 5f 6f 70 74 20 6f 6e 63 6f 6e 66 28 52 29  ns_opt onconf(R)
08b0: 2e 20 20 7b 73 71 6c 69 74 65 42 65 67 69 6e 54  .  {sqliteBeginT
08c0: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73  ransaction(pPars
08d0: 65 2c 52 29 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74  e,R);}.trans_opt
08e0: 20 3a 3a 3d 20 2e 0a 74 72 61 6e 73 5f 6f 70 74   ::= ..trans_opt
08f0: 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e   ::= TRANSACTION
0900: 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20  ..trans_opt ::= 
0910: 54 52 41 4e 53 41 43 54 49 4f 4e 20 69 64 73 2e  TRANSACTION ids.
0920: 0a 63 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54 20  .cmd ::= COMMIT 
0930: 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20  trans_opt.      
0940: 7b 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61  {sqliteCommitTra
0950: 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29  nsaction(pParse)
0960: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 45 4e 44 20 74  ;}.cmd ::= END t
0970: 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 20  rans_opt.       
0980: 20 20 7b 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54    {sqliteCommitT
0990: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73  ransaction(pPars
09a0: 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c  e);}.cmd ::= ROL
09b0: 4c 42 41 43 4b 20 74 72 61 6e 73 5f 6f 70 74 2e  LBACK trans_opt.
09c0: 20 20 20 20 7b 73 71 6c 69 74 65 52 6f 6c 6c 62      {sqliteRollb
09d0: 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  ackTransaction(p
09e0: 50 61 72 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f  Parse);}..//////
09f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
0a00: 54 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  The CREATE TABLE
0a10: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
0a20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0a30: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
0a40: 3a 3d 20 63 72 65 61 74 65 5f 74 61 62 6c 65 20  := create_table 
0a50: 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67  create_table_arg
0a60: 73 2e 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 20  s..create_table 
0a70: 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 20 74 65  ::= CREATE(X) te
0a80: 6d 70 28 54 29 20 54 41 42 4c 45 20 69 64 73 28  mp(T) TABLE ids(
0a90: 59 29 2e 20 7b 0a 20 20 20 73 71 6c 69 74 65 53  Y). {.   sqliteS
0aa0: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65  tartTable(pParse
0ab0: 2c 26 58 2c 26 59 2c 54 29 3b 0a 7d 0a 25 74 79  ,&X,&Y,T);.}.%ty
0ac0: 70 65 20 74 65 6d 70 20 7b 69 6e 74 7d 0a 74 65  pe temp {int}.te
0ad0: 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20  mp(A) ::= TEMP. 
0ae0: 20 7b 41 20 3d 20 31 3b 7d 0a 74 65 6d 70 28 41   {A = 1;}.temp(A
0af0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 7b 41 20  ) ::= .      {A 
0b00: 3d 20 30 3b 7d 0a 63 72 65 61 74 65 5f 74 61 62  = 0;}.create_tab
0b10: 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 4c 50 20 63  le_args ::= LP c
0b20: 6f 6c 75 6d 6e 6c 69 73 74 20 63 6f 6e 73 6c 69  olumnlist consli
0b30: 73 74 5f 6f 70 74 20 52 50 28 58 29 2e 20 7b 0a  st_opt RP(X). {.
0b40: 20 20 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65    sqliteEndTable
0b50: 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 0a 7d  (pParse,&X,0);.}
0b60: 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72  .create_table_ar
0b70: 67 73 20 3a 3a 3d 20 41 53 20 73 65 6c 65 63 74  gs ::= AS select
0b80: 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 45  (S). {.  sqliteE
0b90: 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30  ndTable(pParse,0
0ba0: 2c 53 29 3b 0a 20 20 73 71 6c 69 74 65 53 65 6c  ,S);.  sqliteSel
0bb0: 65 63 74 44 65 6c 65 74 65 28 53 29 3b 0a 7d 0a  ectDelete(S);.}.
0bc0: 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63  columnlist ::= c
0bd0: 6f 6c 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41 20  olumnlist COMMA 
0be0: 63 6f 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e 6c 69  column..columnli
0bf0: 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e 0a 0a  st ::= column...
0c00: 2f 2f 20 41 62 6f 75 74 20 74 68 65 20 6f 6e 6c  // About the onl
0c10: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73  y information us
0c20: 65 64 20 66 6f 72 20 61 20 63 6f 6c 75 6d 6e 20  ed for a column 
0c30: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
0c40: 68 65 0a 2f 2f 20 63 6f 6c 75 6d 6e 2e 20 20 54  he.// column.  T
0c50: 68 65 20 74 79 70 65 20 69 73 20 61 6c 77 61 79  he type is alway
0c60: 73 20 6a 75 73 74 20 22 74 65 78 74 22 2e 20 20  s just "text".  
0c70: 42 75 74 20 74 68 65 20 63 6f 64 65 20 77 69 6c  But the code wil
0c80: 6c 20 61 63 63 65 70 74 0a 2f 2f 20 61 6e 20 65  l accept.// an e
0c90: 6c 61 62 6f 72 61 74 65 20 74 79 70 65 6e 61 6d  laborate typenam
0ca0: 65 2e 20 20 50 65 72 68 61 70 73 20 73 6f 6d 65  e.  Perhaps some
0cb0: 64 61 79 20 77 65 27 6c 6c 20 64 6f 20 73 6f 6d  day we'll do som
0cc0: 65 74 68 69 6e 67 20 77 69 74 68 20 69 74 2e 0a  ething with it..
0cd0: 2f 2f 0a 63 6f 6c 75 6d 6e 20 3a 3a 3d 20 63 6f  //.column ::= co
0ce0: 6c 75 6d 6e 69 64 20 74 79 70 65 20 63 61 72 67  lumnid type carg
0cf0: 6c 69 73 74 2e 20 0a 63 6f 6c 75 6d 6e 69 64 20  list. .columnid 
0d00: 3a 3a 3d 20 69 64 73 28 58 29 2e 20 20 20 20 20  ::= ids(X).     
0d10: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
0d20: 74 65 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72  teAddColumn(pPar
0d30: 73 65 2c 26 58 29 3b 7d 0a 0a 2f 2f 20 41 6e 20  se,&X);}..// An 
0d40: 49 44 45 4e 54 49 46 49 45 52 20 63 61 6e 20 62  IDENTIFIER can b
0d50: 65 20 61 20 67 65 6e 65 72 69 63 20 69 64 65 6e  e a generic iden
0d60: 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20 6f  tifier, or one o
0d70: 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65 79  f several.// key
0d80: 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e 2d  words.  Any non-
0d90: 73 74 61 6e 64 61 72 64 20 6b 65 79 77 6f 72 64  standard keyword
0da0: 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e 20   can also be an 
0db0: 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 0a 25  identifier..//.%
0dc0: 74 79 70 65 20 69 64 20 7b 54 6f 6b 65 6e 7d 0a  type id {Token}.
0dd0: 69 64 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 2e  id(A) ::= ID(X).
0de0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
0df0: 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77  }..// The follow
0e00: 69 6e 67 20 64 69 72 65 63 74 69 76 65 20 63 61  ing directive ca
0e10: 75 73 65 73 20 74 6f 6b 65 6e 73 20 41 42 4f 52  uses tokens ABOR
0e20: 54 2c 20 41 46 54 45 52 2c 20 41 53 43 2c 20 65  T, AFTER, ASC, e
0e30: 74 63 2e 20 74 6f 0a 2f 2f 20 66 61 6c 6c 62 61  tc. to.// fallba
0e40: 63 6b 20 74 6f 20 49 44 20 69 66 20 74 68 65 79  ck to ID if they
0e50: 20 77 69 6c 6c 20 6e 6f 74 20 70 61 72 73 65 20   will not parse 
0e60: 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  as their origina
0e70: 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20 54 68 69 73  l value..// This
0e80: 20 6f 62 76 69 61 74 65 73 20 74 68 65 20 6e 65   obviates the ne
0e90: 65 64 20 66 6f 72 20 74 68 65 20 22 69 64 22 20  ed for the "id" 
0ea0: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2f 2f 0a  nonterminal..//.
0eb0: 25 66 61 6c 6c 62 61 63 6b 20 49 44 20 0a 20 20  %fallback ID .  
0ec0: 41 42 4f 52 54 20 41 46 54 45 52 20 41 53 43 20  ABORT AFTER ASC 
0ed0: 42 45 46 4f 52 45 20 42 45 47 49 4e 20 43 41 53  BEFORE BEGIN CAS
0ee0: 43 41 44 45 20 43 4c 55 53 54 45 52 20 43 4f 4e  CADE CLUSTER CON
0ef0: 46 4c 49 43 54 0a 20 20 43 4f 50 59 20 44 45 46  FLICT.  COPY DEF
0f00: 45 52 52 45 44 20 44 45 4c 49 4d 49 54 45 52 53  ERRED DELIMITERS
0f10: 20 44 45 53 43 20 45 41 43 48 20 45 4e 44 20 45   DESC EACH END E
0f20: 58 50 4c 41 49 4e 20 46 41 49 4c 20 46 4f 52 0a  XPLAIN FAIL FOR.
0f30: 20 20 46 55 4c 4c 20 49 47 4e 4f 52 45 20 49 4d    FULL IGNORE IM
0f40: 4d 45 44 49 41 54 45 20 49 4e 49 54 49 41 4c 4c  MEDIATE INITIALL
0f50: 59 20 49 4e 53 54 45 41 44 20 4d 41 54 43 48 20  Y INSTEAD MATCH 
0f60: 4a 4f 49 4e 20 4b 45 59 0a 20 20 4f 46 20 4f 46  JOIN KEY.  OF OF
0f70: 46 53 45 54 20 50 41 52 54 49 41 4c 20 50 52 41  FSET PARTIAL PRA
0f80: 47 4d 41 20 52 41 49 53 45 20 52 45 50 4c 41 43  GMA RAISE REPLAC
0f90: 45 20 52 45 53 54 52 49 43 54 20 52 4f 57 20 53  E RESTRICT ROW S
0fa0: 54 41 54 45 4d 45 4e 54 0a 20 20 54 45 4d 50 20  TATEMENT.  TEMP 
0fb0: 54 52 49 47 47 45 52 20 56 41 43 55 55 4d 20 56  TRIGGER VACUUM V
0fc0: 49 45 57 2e 0a 0a 2f 2f 20 41 6e 64 20 22 69 64  IEW...// And "id
0fd0: 73 22 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66  s" is an identif
0fe0: 65 72 2d 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f  er-or-string..//
0ff0: 0a 25 74 79 70 65 20 69 64 73 20 7b 54 6f 6b 65  .%type ids {Toke
1000: 6e 7d 0a 69 64 73 28 41 29 20 3a 3a 3d 20 69 64  n}.ids(A) ::= id
1010: 28 58 29 2e 20 20 20 20 20 20 20 20 7b 41 20 3d  (X).        {A =
1020: 20 58 3b 7d 0a 69 64 73 28 41 29 20 3a 3a 3d 20   X;}.ids(A) ::= 
1030: 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20 7b 41  STRING(X).    {A
1040: 20 3d 20 58 3b 7d 0a 0a 74 79 70 65 20 3a 3a 3d   = X;}..type ::=
1050: 20 2e 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65   ..type ::= type
1060: 6e 61 6d 65 28 58 29 2e 20 20 20 20 20 20 20 20  name(X).        
1070: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
1080: 69 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  iteAddColumnType
1090: 28 70 50 61 72 73 65 2c 26 58 2c 26 58 29 3b 7d  (pParse,&X,&X);}
10a0: 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61  .type ::= typena
10b0: 6d 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20  me(X) LP signed 
10c0: 52 50 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74  RP(Y).    {sqlit
10d0: 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70  eAddColumnType(p
10e0: 50 61 72 73 65 2c 26 58 2c 26 59 29 3b 7d 0a 74  Parse,&X,&Y);}.t
10f0: 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65  ype ::= typename
1100: 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f  (X) LP signed CO
1110: 4d 4d 41 20 73 69 67 6e 65 64 20 52 50 28 59 29  MMA signed RP(Y)
1120: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1140: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
1150: 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  teAddColumnType(
1160: 70 50 61 72 73 65 2c 26 58 2c 26 59 29 3b 7d 0a  pParse,&X,&Y);}.
1170: 25 74 79 70 65 20 74 79 70 65 6e 61 6d 65 20 7b  %type typename {
1180: 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61 6d 65 28  Token}.typename(
1190: 41 29 20 3a 3a 3d 20 69 64 73 28 58 29 2e 20 20  A) ::= ids(X).  
11a0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
11b0: 7d 0a 74 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a  }.typename(A) ::
11c0: 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 20 69 64  = typename(X) id
11d0: 73 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 69 67  s.  {A = X;}.sig
11e0: 6e 65 64 20 3a 3a 3d 20 49 4e 54 45 47 45 52 2e  ned ::= INTEGER.
11f0: 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 50 4c 55 53  .signed ::= PLUS
1200: 20 49 4e 54 45 47 45 52 2e 0a 73 69 67 6e 65 64   INTEGER..signed
1210: 20 3a 3a 3d 20 4d 49 4e 55 53 20 49 4e 54 45 47   ::= MINUS INTEG
1220: 45 52 2e 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d  ER..carglist ::=
1230: 20 63 61 72 67 6c 69 73 74 20 63 61 72 67 2e 0a   carglist carg..
1240: 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20 2e 0a 63  carglist ::= ..c
1250: 61 72 67 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49  arg ::= CONSTRAI
1260: 4e 54 20 69 64 73 20 63 63 6f 6e 73 2e 0a 63 61  NT ids ccons..ca
1270: 72 67 20 3a 3a 3d 20 63 63 6f 6e 73 2e 0a 63 61  rg ::= ccons..ca
1280: 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 53  rg ::= DEFAULT S
1290: 54 52 49 4e 47 28 58 29 2e 20 20 20 20 20 20 20  TRING(X).       
12a0: 20 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66     {sqliteAddDef
12b0: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
12c0: 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a  ,&X,0);}.carg ::
12d0: 3d 20 44 45 46 41 55 4c 54 20 49 44 28 58 29 2e  = DEFAULT ID(X).
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
12f0: 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56  qliteAddDefaultV
1300: 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c 30  alue(pParse,&X,0
1310: 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46  );}.carg ::= DEF
1320: 41 55 4c 54 20 49 4e 54 45 47 45 52 28 58 29 2e  AULT INTEGER(X).
1330: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1340: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
1350: 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63  pParse,&X,0);}.c
1360: 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  arg ::= DEFAULT 
1370: 50 4c 55 53 20 49 4e 54 45 47 45 52 28 58 29 2e  PLUS INTEGER(X).
1380: 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65      {sqliteAddDe
1390: 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73  faultValue(pPars
13a0: 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a  e,&X,0);}.carg :
13b0: 3a 3d 20 44 45 46 41 55 4c 54 20 4d 49 4e 55 53  := DEFAULT MINUS
13c0: 20 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20 7b   INTEGER(X).   {
13d0: 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74  sqliteAddDefault
13e0: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c  Value(pParse,&X,
13f0: 31 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45  1);}.carg ::= DE
1400: 46 41 55 4c 54 20 46 4c 4f 41 54 28 58 29 2e 20  FAULT FLOAT(X). 
1410: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
1420: 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  eAddDefaultValue
1430: 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a  (pParse,&X,0);}.
1440: 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54  carg ::= DEFAULT
1450: 20 50 4c 55 53 20 46 4c 4f 41 54 28 58 29 2e 20   PLUS FLOAT(X). 
1460: 20 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64 44       {sqliteAddD
1470: 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72  efaultValue(pPar
1480: 73 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20  se,&X,0);}.carg 
1490: 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4d 49 4e 55  ::= DEFAULT MINU
14a0: 53 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20  S FLOAT(X).     
14b0: 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c  {sqliteAddDefaul
14c0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58  tValue(pParse,&X
14d0: 2c 31 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44  ,1);}.carg ::= D
14e0: 45 46 41 55 4c 54 20 4e 55 4c 4c 2e 20 0a 0a 2f  EFAULT NULL. ../
14f0: 2f 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f  / In addition to
1500: 20 74 68 65 20 74 79 70 65 20 6e 61 6d 65 2c 20   the type name, 
1510: 77 65 20 61 6c 73 6f 20 63 61 72 65 20 61 62 6f  we also care abo
1520: 75 74 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  ut the primary k
1530: 65 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 55 45  ey and.// UNIQUE
1540: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2f 2f   constraints..//
1550: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 4f 54 20 4e  .ccons ::= NOT N
1560: 55 4c 4c 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20  ULL onconf(R).  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
1580: 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 70  liteAddNotNull(p
1590: 50 61 72 73 65 2c 20 52 29 3b 7d 0a 63 63 6f 6e  Parse, R);}.ccon
15a0: 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45  s ::= PRIMARY KE
15b0: 59 20 73 6f 72 74 6f 72 64 65 72 20 6f 6e 63 6f  Y sortorder onco
15c0: 6e 66 28 52 29 2e 20 20 7b 73 71 6c 69 74 65 41  nf(R).  {sqliteA
15d0: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61  ddPrimaryKey(pPa
15e0: 72 73 65 2c 30 2c 52 29 3b 7d 0a 63 63 6f 6e 73  rse,0,R);}.ccons
15f0: 20 3a 3a 3d 20 55 4e 49 51 55 45 20 6f 6e 63 6f   ::= UNIQUE onco
1600: 6e 66 28 52 29 2e 20 20 20 20 20 20 20 20 20 20  nf(R).          
1610: 20 20 7b 73 71 6c 69 74 65 43 72 65 61 74 65 49    {sqliteCreateI
1620: 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c  ndex(pParse,0,0,
1630: 30 2c 52 2c 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73  0,R,0,0);}.ccons
1640: 20 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65 78   ::= CHECK LP ex
1650: 70 72 20 52 50 20 6f 6e 63 6f 6e 66 2e 0a 63 63  pr RP onconf..cc
1660: 6f 6e 73 20 3a 3a 3d 20 72 65 66 65 72 65 6e 63  ons ::= referenc
1670: 65 73 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 64 65  es..ccons ::= de
1680: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 2e 0a 0a  fer_subclause...
1690: 2f 2f 20 41 20 52 45 46 45 52 45 4e 43 45 53 20  // A REFERENCES 
16a0: 63 6c 61 75 73 65 20 69 73 20 70 61 72 73 65 64  clause is parsed
16b0: 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74   but the current
16c0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
16d0: 64 6f 65 73 20 6e 6f 74 0a 2f 2f 20 64 6f 20 61  does not.// do a
16e0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 69 74 2e  nything with it.
16f0: 0a 2f 2f 0a 72 65 66 65 72 65 6e 63 65 73 20 3a  .//.references :
1700: 3a 3d 20 52 45 46 45 52 45 4e 43 45 53 20 69 64  := REFERENCES id
1710: 73 20 4c 50 20 69 64 78 6c 69 73 74 20 52 50 20  s LP idxlist RP 
1720: 72 65 66 61 72 67 73 2e 0a 72 65 66 65 72 65 6e  refargs..referen
1730: 63 65 73 20 3a 3a 3d 20 52 45 46 45 52 45 4e 43  ces ::= REFERENC
1740: 45 53 20 69 64 73 20 72 65 66 61 72 67 73 2e 0a  ES ids refargs..
1750: 72 65 66 61 72 67 73 20 3a 3a 3d 20 2e 0a 72 65  refargs ::= ..re
1760: 66 61 72 67 73 20 3a 3a 3d 20 72 65 66 61 72 67  fargs ::= refarg
1770: 73 20 72 65 66 61 72 67 2e 0a 72 65 66 61 72 67  s refarg..refarg
1780: 20 3a 3a 3d 20 4d 41 54 43 48 20 46 55 4c 4c 2e   ::= MATCH FULL.
1790: 0a 72 65 66 61 72 67 20 3a 3a 3d 20 4d 41 54 43  .refarg ::= MATC
17a0: 48 20 50 41 52 54 49 41 4c 2e 0a 72 65 66 61 72  H PARTIAL..refar
17b0: 67 20 3a 3a 3d 20 4f 4e 20 44 45 4c 45 54 45 20  g ::= ON DELETE 
17c0: 72 65 66 61 63 74 2e 0a 72 65 66 61 72 67 20 3a  refact..refarg :
17d0: 3a 3d 20 4f 4e 20 55 50 44 41 54 45 20 72 65 66  := ON UPDATE ref
17e0: 61 63 74 2e 0a 72 65 66 61 63 74 20 3a 3a 3d 20  act..refact ::= 
17f0: 53 45 54 20 4e 55 4c 4c 2e 0a 72 65 66 61 63 74  SET NULL..refact
1800: 20 3a 3a 3d 20 53 45 54 20 44 45 46 41 55 4c 54   ::= SET DEFAULT
1810: 2e 0a 72 65 66 61 63 74 20 3a 3a 3d 20 43 41 53  ..refact ::= CAS
1820: 43 41 44 45 2e 0a 72 65 66 61 63 74 20 3a 3a 3d  CADE..refact ::=
1830: 20 52 45 53 54 52 49 43 54 2e 0a 64 65 66 65 72   RESTRICT..defer
1840: 5f 73 75 62 63 6c 61 75 73 65 20 3a 3a 3d 20 4e  _subclause ::= N
1850: 4f 54 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e  OT DEFERRABLE in
1860: 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64  it_deferred_pred
1870: 5f 6f 70 74 2e 0a 64 65 66 65 72 5f 73 75 62 63  _opt..defer_subc
1880: 6c 61 75 73 65 20 3a 3a 3d 20 44 45 46 45 52 52  lause ::= DEFERR
1890: 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72 72  ABLE init_deferr
18a0: 65 64 5f 70 72 65 64 5f 6f 70 74 2e 0a 69 6e 69  ed_pred_opt..ini
18b0: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f  t_deferred_pred_
18c0: 6f 70 74 20 3a 3a 3d 20 2e 0a 69 6e 69 74 5f 64  opt ::= ..init_d
18d0: 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74  eferred_pred_opt
18e0: 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 44   ::= INITIALLY D
18f0: 45 46 45 52 52 45 44 2e 0a 69 6e 69 74 5f 64 65  EFERRED..init_de
1900: 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 20  ferred_pred_opt 
1910: 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d  ::= INITIALLY IM
1920: 4d 45 44 49 41 54 45 2e 0a 0a 2f 2f 20 46 6f 72  MEDIATE...// For
1930: 20 74 68 65 20 74 69 6d 65 20 62 65 69 6e 67 2c   the time being,
1940: 20 74 68 65 20 6f 6e 6c 79 20 63 6f 6e 73 74 72   the only constr
1950: 61 69 6e 74 20 77 65 20 63 61 72 65 20 61 62 6f  aint we care abo
1960: 75 74 20 69 73 20 74 68 65 20 70 72 69 6d 61 72  ut is the primar
1970: 79 0a 2f 2f 20 6b 65 79 20 61 6e 64 20 55 4e 49  y.// key and UNI
1980: 51 55 45 2e 20 20 42 6f 74 68 20 63 72 65 61 74  QUE.  Both creat
1990: 65 20 69 6e 64 69 63 65 73 2e 0a 2f 2f 0a 63 6f  e indices..//.co
19a0: 6e 73 6c 69 73 74 5f 6f 70 74 20 3a 3a 3d 20 2e  nslist_opt ::= .
19b0: 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 3a 3a  .conslist_opt ::
19c0: 3d 20 43 4f 4d 4d 41 20 63 6f 6e 73 6c 69 73 74  = COMMA conslist
19d0: 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 63  ..conslist ::= c
19e0: 6f 6e 73 6c 69 73 74 20 43 4f 4d 4d 41 20 74 63  onslist COMMA tc
19f0: 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a  ons..conslist ::
1a00: 3d 20 63 6f 6e 73 6c 69 73 74 20 74 63 6f 6e 73  = conslist tcons
1a10: 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 74  ..conslist ::= t
1a20: 63 6f 6e 73 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20  cons..tcons ::= 
1a30: 43 4f 4e 53 54 52 41 49 4e 54 20 69 64 73 2e 0a  CONSTRAINT ids..
1a40: 74 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52  tcons ::= PRIMAR
1a50: 59 20 4b 45 59 20 4c 50 20 69 64 78 6c 69 73 74  Y KEY LP idxlist
1a60: 28 58 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29  (X) RP onconf(R)
1a70: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1aa0: 73 71 6c 69 74 65 41 64 64 50 72 69 6d 61 72 79  sqliteAddPrimary
1ab0: 4b 65 79 28 70 50 61 72 73 65 2c 58 2c 52 29 3b  Key(pParse,X,R);
1ac0: 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51  }.tcons ::= UNIQ
1ad0: 55 45 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29  UE LP idxlist(X)
1ae0: 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20   RP onconf(R).. 
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 43 72 65        {sqliteCre
1b20: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
1b30: 30 2c 30 2c 58 2c 52 2c 30 2c 30 29 3b 7d 0a 74  0,0,X,R,0,0);}.t
1b40: 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20 65  cons ::= CHECK e
1b50: 78 70 72 20 6f 6e 63 6f 6e 66 2e 0a 74 63 6f 6e  xpr onconf..tcon
1b60: 73 20 3a 3a 3d 20 46 4f 52 45 49 47 4e 20 4b 45  s ::= FOREIGN KE
1b70: 59 20 4c 50 20 69 64 78 6c 69 73 74 20 52 50 20  Y LP idxlist RP 
1b80: 72 65 66 65 72 65 6e 63 65 73 20 64 65 66 65 72  references defer
1b90: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 2e 0a  _subclause_opt..
1ba0: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f  defer_subclause_
1bb0: 6f 70 74 20 3a 3a 3d 20 2e 0a 64 65 66 65 72 5f  opt ::= ..defer_
1bc0: 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 20 3a 3a  subclause_opt ::
1bd0: 3d 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  = defer_subclaus
1be0: 65 2e 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f  e...// The follo
1bf0: 77 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74  wing is a non-st
1c00: 61 6e 64 61 72 64 20 65 78 74 65 6e 73 69 6f 6e  andard extension
1c10: 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 20   that allows us 
1c20: 74 6f 20 64 65 63 6c 61 72 65 20 74 68 65 0a 2f  to declare the./
1c30: 2f 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  / default behavi
1c40: 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  or when there is
1c50: 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f   a constraint co
1c60: 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65  nflict..//.%type
1c70: 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74   onconf {int}.%t
1c80: 79 70 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74 7d  ype orconf {int}
1c90: 0a 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74 79  .%type resolvety
1ca0: 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28  pe {int}.onconf(
1cb0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 44        { A = OE_D
1ce0: 65 66 61 75 6c 74 3b 20 7d 0a 6f 6e 63 6f 6e 66  efault; }.onconf
1cf0: 28 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c  (A) ::= ON CONFL
1d00: 49 43 54 20 72 65 73 6f 6c 76 65 74 79 70 65 28  ICT resolvetype(
1d10: 58 29 2e 20 20 20 20 7b 20 41 20 3d 20 58 3b 20  X).    { A = X; 
1d20: 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20  }.orconf(A) ::= 
1d30: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1d50: 20 41 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b   A = OE_Default;
1d60: 20 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d   }.orconf(A) ::=
1d70: 20 4f 52 20 72 65 73 6f 6c 76 65 74 79 70 65 28   OR resolvetype(
1d80: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
1d90: 7b 20 41 20 3d 20 58 3b 20 7d 0a 72 65 73 6f 6c  { A = X; }.resol
1da0: 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52 4f  vetype(A) ::= RO
1db0: 4c 4c 42 41 43 4b 2e 20 20 20 20 20 20 20 20 20  LLBACK.         
1dc0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
1dd0: 5f 52 6f 6c 6c 62 61 63 6b 3b 20 7d 0a 72 65 73  _Rollback; }.res
1de0: 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20  olvetype(A) ::= 
1df0: 41 42 4f 52 54 2e 20 20 20 20 20 20 20 20 20 20  ABORT.          
1e00: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
1e10: 4f 45 5f 41 62 6f 72 74 3b 20 7d 0a 72 65 73 6f  OE_Abort; }.reso
1e20: 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46  lvetype(A) ::= F
1e30: 41 49 4c 2e 20 20 20 20 20 20 20 20 20 20 20 20  AIL.            
1e40: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f           { A = O
1e50: 45 5f 46 61 69 6c 3b 20 7d 0a 72 65 73 6f 6c 76  E_Fail; }.resolv
1e60: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 49 47 4e  etype(A) ::= IGN
1e70: 4f 52 45 2e 20 20 20 20 20 20 20 20 20 20 20 20  ORE.            
1e80: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f         { A = OE_
1e90: 49 67 6e 6f 72 65 3b 20 7d 0a 72 65 73 6f 6c 76  Ignore; }.resolv
1ea0: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52 45 50  etype(A) ::= REP
1eb0: 4c 41 43 45 2e 20 20 20 20 20 20 20 20 20 20 20  LACE.           
1ec0: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f         { A = OE_
1ed0: 52 65 70 6c 61 63 65 3b 20 7d 0a 0a 2f 2f 2f 2f  Replace; }..////
1ee0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1ef0: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20  ////// The DROP 
1f00: 54 41 42 4c 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  TABLE //////////
1f10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
1f30: 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 41 42 4c  md ::= DROP TABL
1f40: 45 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20  E ids(X).       
1f50: 20 20 20 7b 73 71 6c 69 74 65 44 72 6f 70 54 61     {sqliteDropTa
1f60: 62 6c 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29  ble(pParse,&X,0)
1f70: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
1f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52  ///////// The CR
1f90: 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d  EATE VIEW statem
1fa0: 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ent ////////////
1fb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1fc0: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 43 52 45  /.//.cmd ::= CRE
1fd0: 41 54 45 28 58 29 20 56 49 45 57 20 69 64 73 28  ATE(X) VIEW ids(
1fe0: 59 29 20 41 53 20 73 65 6c 65 63 74 28 53 29 2e  Y) AS select(S).
1ff0: 20 7b 0a 20 20 73 71 6c 69 74 65 43 72 65 61 74   {.  sqliteCreat
2000: 65 56 69 65 77 28 70 50 61 72 73 65 2c 20 26 58  eView(pParse, &X
2010: 2c 20 26 59 2c 20 53 29 3b 0a 7d 0a 63 6d 64 20  , &Y, S);.}.cmd 
2020: 3a 3a 3d 20 44 52 4f 50 20 56 49 45 57 20 69 64  ::= DROP VIEW id
2030: 73 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  s(X). {.  sqlite
2040: 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
2050: 2c 20 26 58 2c 20 31 29 3b 0a 7d 0a 0a 2f 2f 2f  , &X, 1);.}..///
2060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2070: 2f 2f 2f 2f 2f 20 54 68 65 20 53 45 4c 45 43 54  ///// The SELECT
2080: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
2090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
20a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
20b0: 63 6d 64 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58  cmd ::= select(X
20c0: 29 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65 53 65  ).  {.  sqliteSe
20d0: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 58 2c 20  lect(pParse, X, 
20e0: 53 52 54 5f 43 61 6c 6c 62 61 63 6b 2c 20 30 2c  SRT_Callback, 0,
20f0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   0, 0, 0);.  sql
2100: 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28  iteSelectDelete(
2110: 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73 65 6c  X);.}..%type sel
2120: 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64  ect {Select*}.%d
2130: 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65 63 74  estructor select
2140: 20 7b 73 71 6c 69 74 65 53 65 6c 65 63 74 44 65   {sqliteSelectDe
2150: 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65  lete($$);}.%type
2160: 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65 6c 65   oneselect {Sele
2170: 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  ct*}.%destructor
2180: 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71 6c 69   oneselect {sqli
2190: 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 28 24  teSelectDelete($
21a0: 24 29 3b 7d 0a 0a 73 65 6c 65 63 74 28 41 29 20  $);}..select(A) 
21b0: 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28 58 29  ::= oneselect(X)
21c0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21d0: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
21e0: 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 73 65  select(A) ::= se
21f0: 6c 65 63 74 28 58 29 20 6d 75 6c 74 69 73 65 6c  lect(X) multisel
2200: 65 63 74 5f 6f 70 28 59 29 20 6f 6e 65 73 65 6c  ect_op(Y) onesel
2210: 65 63 74 28 5a 29 2e 20 20 7b 0a 20 20 69 66 28  ect(Z).  {.  if(
2220: 20 5a 20 29 7b 0a 20 20 20 20 5a 2d 3e 6f 70 20   Z ){.    Z->op 
2230: 3d 20 59 3b 0a 20 20 20 20 5a 2d 3e 70 50 72 69  = Y;.    Z->pPri
2240: 6f 72 20 3d 20 58 3b 0a 20 20 7d 0a 20 20 41 20  or = X;.  }.  A 
2250: 3d 20 5a 3b 0a 7d 0a 25 74 79 70 65 20 6d 75 6c  = Z;.}.%type mul
2260: 74 69 73 65 6c 65 63 74 5f 6f 70 20 7b 69 6e 74  tiselect_op {int
2270: 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70  }.multiselect_op
2280: 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 2e 20 20  (A) ::= UNION.  
2290: 20 20 20 20 7b 41 20 3d 20 54 4b 5f 55 4e 49 4f      {A = TK_UNIO
22a0: 4e 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f  N;}.multiselect_
22b0: 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 20  op(A) ::= UNION 
22c0: 41 4c 4c 2e 20 20 7b 41 20 3d 20 54 4b 5f 41 4c  ALL.  {A = TK_AL
22d0: 4c 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f  L;}.multiselect_
22e0: 6f 70 28 41 29 20 3a 3a 3d 20 49 4e 54 45 52 53  op(A) ::= INTERS
22f0: 45 43 54 2e 20 20 7b 41 20 3d 20 54 4b 5f 49 4e  ECT.  {A = TK_IN
2300: 54 45 52 53 45 43 54 3b 7d 0a 6d 75 6c 74 69 73  TERSECT;}.multis
2310: 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20  elect_op(A) ::= 
2320: 45 58 43 45 50 54 2e 20 20 20 20 20 7b 41 20 3d  EXCEPT.     {A =
2330: 20 54 4b 5f 45 58 43 45 50 54 3b 7d 0a 6f 6e 65   TK_EXCEPT;}.one
2340: 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 53 45  select(A) ::= SE
2350: 4c 45 43 54 20 64 69 73 74 69 6e 63 74 28 44 29  LECT distinct(D)
2360: 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57 29 20 66   selcollist(W) f
2370: 72 6f 6d 28 58 29 20 77 68 65 72 65 5f 6f 70 74  rom(X) where_opt
2380: 28 59 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (Y).            
2390: 20 20 20 20 20 67 72 6f 75 70 62 79 5f 6f 70 74       groupby_opt
23a0: 28 50 29 20 68 61 76 69 6e 67 5f 6f 70 74 28 51  (P) having_opt(Q
23b0: 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 5a 29  ) orderby_opt(Z)
23c0: 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b   limit_opt(L). {
23d0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 53 65 6c  .  A = sqliteSel
23e0: 65 63 74 4e 65 77 28 57 2c 58 2c 59 2c 50 2c 51  ectNew(W,X,Y,P,Q
23f0: 2c 5a 2c 44 2c 4c 2e 6c 69 6d 69 74 2c 4c 2e 6f  ,Z,D,L.limit,L.o
2400: 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2f 20 54 68  ffset);.}..// Th
2410: 65 20 22 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e  e "distinct" non
2420: 74 65 72 6d 69 6e 61 6c 20 69 73 20 74 72 75 65  terminal is true
2430: 20 28 31 29 20 69 66 20 74 68 65 20 44 49 53 54   (1) if the DIST
2440: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 0a  INCT keyword is.
2450: 2f 2f 20 70 72 65 73 65 6e 74 20 61 6e 64 20 66  // present and f
2460: 61 6c 73 65 20 28 30 29 20 69 66 20 69 74 20 69  alse (0) if it i
2470: 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20  s not..//.%type 
2480: 64 69 73 74 69 6e 63 74 20 7b 69 6e 74 7d 0a 64  distinct {int}.d
2490: 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44  istinct(A) ::= D
24a0: 49 53 54 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20  ISTINCT.   {A = 
24b0: 31 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20  1;}.distinct(A) 
24c0: 3a 3a 3d 20 41 4c 4c 2e 20 20 20 20 20 20 20 20  ::= ALL.        
24d0: 7b 41 20 3d 20 30 3b 7d 0a 64 69 73 74 69 6e 63  {A = 0;}.distinc
24e0: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
24f0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f       {A = 0;}../
2500: 2f 20 73 65 6c 63 6f 6c 6c 69 73 74 20 69 73 20  / selcollist is 
2510: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
2520: 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 74  sions that are t
2530: 6f 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  o become the ret
2540: 75 72 6e 0a 2f 2f 20 76 61 6c 75 65 73 20 6f 66  urn.// values of
2550: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
2560: 65 6d 65 6e 74 2e 20 20 54 68 65 20 22 2a 22 20  ement.  The "*" 
2570: 69 6e 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69  in statements li
2580: 6b 65 0a 2f 2f 20 22 53 45 4c 45 43 54 20 2a 20  ke.// "SELECT * 
2590: 46 52 4f 4d 20 2e 2e 2e 22 20 69 73 20 65 6e 63  FROM ..." is enc
25a0: 6f 64 65 64 20 61 73 20 61 20 73 70 65 63 69 61  oded as a specia
25b0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  l expression wit
25c0: 68 20 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f  h an.// opcode o
25d0: 66 20 54 4b 5f 41 4c 4c 2e 0a 2f 2f 0a 25 74 79  f TK_ALL..//.%ty
25e0: 70 65 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 45  pe selcollist {E
25f0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
2600: 75 63 74 6f 72 20 73 65 6c 63 6f 6c 6c 69 73 74  uctor selcollist
2610: 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74   {sqliteExprList
2620: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
2630: 70 65 20 73 63 6c 70 20 7b 45 78 70 72 4c 69 73  pe sclp {ExprLis
2640: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
2650: 73 63 6c 70 20 7b 73 71 6c 69 74 65 45 78 70 72  sclp {sqliteExpr
2660: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d  ListDelete($$);}
2670: 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c  .sclp(A) ::= sel
2680: 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  collist(X) COMMA
2690: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
26a0: 20 3d 20 58 3b 7d 0a 73 63 6c 70 28 41 29 20 3a   = X;}.sclp(A) :
26b0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c      {A = 0;}.sel
26e0: 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  collist(A) ::= s
26f0: 63 6c 70 28 50 29 20 65 78 70 72 28 58 29 20 61  clp(P) expr(X) a
2700: 73 28 59 29 2e 20 20 20 20 20 7b 0a 20 20 20 41  s(Y).     {.   A
2710: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
2720: 74 41 70 70 65 6e 64 28 50 2c 58 2c 59 2e 6e 3f  tAppend(P,X,Y.n?
2730: 26 59 3a 30 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c  &Y:0);.}.selcoll
2740: 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28  ist(A) ::= sclp(
2750: 50 29 20 53 54 41 52 2e 20 7b 0a 20 20 41 20 3d  P) STAR. {.  A =
2760: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
2770: 70 70 65 6e 64 28 50 2c 20 73 71 6c 69 74 65 45  ppend(P, sqliteE
2780: 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30  xpr(TK_ALL, 0, 0
2790: 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 73 65 6c 63  , 0), 0);.}.selc
27a0: 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63  ollist(A) ::= sc
27b0: 6c 70 28 50 29 20 69 64 73 28 58 29 20 44 4f 54  lp(P) ids(X) DOT
27c0: 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70 72 20   STAR. {.  Expr 
27d0: 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  *pRight = sqlite
27e0: 45 78 70 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c 20  Expr(TK_ALL, 0, 
27f0: 30 2c 20 30 29 3b 0a 20 20 45 78 70 72 20 2a 70  0, 0);.  Expr *p
2800: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 45 78 70  Left = sqliteExp
2810: 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  r(TK_ID, 0, 0, &
2820: 58 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  X);.  A = sqlite
2830: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 50  ExprListAppend(P
2840: 2c 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  , sqliteExpr(TK_
2850: 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  DOT, pLeft, pRig
2860: 68 74 2c 20 30 29 2c 20 30 29 3b 0a 7d 0a 0a 2f  ht, 0), 0);.}../
2870: 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20  / An option "AS 
2880: 3c 69 64 3e 22 20 70 68 72 61 73 65 20 74 68 61  <id>" phrase tha
2890: 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65  t can follow one
28a0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
28b0: 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64 65 66 69  ons that.// defi
28c0: 6e 65 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ne the result se
28d0: 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  t, or one of the
28e0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
28f0: 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25  ROM clause..//.%
2900: 74 79 70 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a  type as {Token}.
2910: 61 73 28 58 29 20 3a 3a 3d 20 41 53 20 69 64 73  as(X) ::= AS ids
2920: 28 59 29 2e 20 20 20 20 7b 20 58 20 3d 20 59 3b  (Y).    { X = Y;
2930: 20 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20   }.as(X) ::= .  
2940: 20 20 20 20 20 20 20 20 20 20 20 7b 20 58 2e 6e             { X.n
2950: 20 3d 20 30 3b 20 7d 0a 0a 0a 25 74 79 70 65 20   = 0; }...%type 
2960: 73 65 6c 74 61 62 6c 69 73 74 20 7b 53 72 63 4c  seltablist {SrcL
2970: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
2980: 72 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 73 71  r seltablist {sq
2990: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
29a0: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 74  e($$);}.%type st
29b0: 6c 5f 70 72 65 66 69 78 20 7b 53 72 63 4c 69 73  l_prefix {SrcLis
29c0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
29d0: 73 74 6c 5f 70 72 65 66 69 78 20 7b 73 71 6c 69  stl_prefix {sqli
29e0: 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  teSrcListDelete(
29f0: 24 24 29 3b 7d 0a 25 74 79 70 65 20 66 72 6f 6d  $$);}.%type from
2a00: 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73   {SrcList*}.%des
2a10: 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b 73 71  tructor from {sq
2a20: 6c 69 74 65 53 72 63 4c 69 73 74 44 65 6c 65 74  liteSrcListDelet
2a30: 65 28 24 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f  e($$);}..// A co
2a40: 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63 6c 61 75  mplete FROM clau
2a50: 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a  se..//.from(A) :
2a60: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
2a90: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 41  Malloc(sizeof(*A
2aa0: 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d  ));}.from(A) ::=
2ab0: 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73 74   FROM seltablist
2ac0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
2ad0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20     {A = X;}..// 
2ae0: 22 73 65 6c 74 61 62 6c 69 73 74 22 20 69 73 20  "seltablist" is 
2af0: 61 20 22 53 65 6c 65 63 74 20 54 61 62 6c 65 20  a "Select Table 
2b00: 4c 69 73 74 22 20 2d 20 74 68 65 20 63 6f 6e 74  List" - the cont
2b10: 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
2b20: 63 6c 61 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53  clause.// in a S
2b30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
2b40: 20 20 22 73 74 6c 5f 70 72 65 66 69 78 22 20 69    "stl_prefix" i
2b50: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
2b60: 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f  is list..//.stl_
2b70: 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 73 65  prefix(A) ::= se
2b80: 6c 74 61 62 6c 69 73 74 28 58 29 20 6a 6f 69 6e  ltablist(X) join
2b90: 6f 70 28 59 29 2e 20 20 20 20 7b 0a 20 20 20 41  op(Y).    {.   A
2ba0: 20 3d 20 58 3b 0a 20 20 20 69 66 28 20 41 20 26   = X;.   if( A &
2bb0: 26 20 41 2d 3e 6e 53 72 63 3e 30 20 29 20 41 2d  & A->nSrc>0 ) A-
2bc0: 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e 6a 6f  >a[A->nSrc-1].jo
2bd0: 69 6e 74 79 70 65 20 3d 20 59 3b 0a 7d 0a 73 74  intype = Y;.}.st
2be0: 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20  l_prefix(A) ::= 
2bf0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
2c10: 20 30 3b 7d 0a 73 65 6c 74 61 62 6c 69 73 74 28   0;}.seltablist(
2c20: 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69  A) ::= stl_prefi
2c30: 78 28 58 29 20 69 64 73 28 59 29 20 61 73 28 5a  x(X) ids(Y) as(Z
2c40: 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e  ) on_opt(N) usin
2c50: 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 41 20  g_opt(U). {.  A 
2c60: 3d 20 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  = sqliteSrcListA
2c70: 70 70 65 6e 64 28 58 2c 26 59 29 3b 0a 20 20 69  ppend(X,&Y);.  i
2c80: 66 28 20 5a 2e 6e 20 29 20 73 71 6c 69 74 65 53  f( Z.n ) sqliteS
2c90: 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 41  rcListAddAlias(A
2ca0: 2c 26 5a 29 3b 0a 20 20 69 66 28 20 4e 20 29 7b  ,&Z);.  if( N ){
2cb0: 0a 20 20 20 20 69 66 28 20 41 20 26 26 20 41 2d  .    if( A && A-
2cc0: 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b  >nSrc>1 ){ A->a[
2cd0: 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d  A->nSrc-2].pOn =
2ce0: 20 4e 3b 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b   N; }.    else {
2cf0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
2d00: 65 28 4e 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  e(N); }.  }.  if
2d10: 28 20 55 20 29 7b 0a 20 20 20 20 69 66 28 20 41  ( U ){.    if( A
2d20: 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b   && A->nSrc>1 ){
2d30: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d   A->a[A->nSrc-2]
2d40: 2e 70 55 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20  .pUsing = U; }. 
2d50: 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65     else { sqlite
2d60: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 55 29 3b  IdListDelete(U);
2d70: 20 7d 0a 20 20 7d 0a 7d 0a 73 65 6c 74 61 62 6c   }.  }.}.seltabl
2d80: 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70  ist(A) ::= stl_p
2d90: 72 65 66 69 78 28 58 29 20 4c 50 20 73 65 6c 65  refix(X) LP sele
2da0: 63 74 28 53 29 20 52 50 20 61 73 28 5a 29 20 6f  ct(S) RP as(Z) o
2db0: 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f  n_opt(N) using_o
2dc0: 70 74 28 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pt(U). {.  A = s
2dd0: 71 6c 69 74 65 53 72 63 4c 69 73 74 41 70 70 65  qliteSrcListAppe
2de0: 6e 64 28 58 2c 30 29 3b 0a 20 20 41 2d 3e 61 5b  nd(X,0);.  A->a[
2df0: 41 2d 3e 6e 53 72 63 2d 31 5d 2e 70 53 65 6c 65  A->nSrc-1].pSele
2e00: 63 74 20 3d 20 53 3b 0a 20 20 69 66 28 20 53 2d  ct = S;.  if( S-
2e10: 3e 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  >pOrderBy ){.   
2e20: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44   sqliteExprListD
2e30: 65 6c 65 74 65 28 53 2d 3e 70 4f 72 64 65 72 42  elete(S->pOrderB
2e40: 79 29 3b 0a 20 20 20 20 53 2d 3e 70 4f 72 64 65  y);.    S->pOrde
2e50: 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  rBy = 0;.  }.  i
2e60: 66 28 20 5a 2e 6e 20 29 20 73 71 6c 69 74 65 53  f( Z.n ) sqliteS
2e70: 72 63 4c 69 73 74 41 64 64 41 6c 69 61 73 28 41  rcListAddAlias(A
2e80: 2c 26 5a 29 3b 0a 20 20 69 66 28 20 4e 20 29 7b  ,&Z);.  if( N ){
2e90: 0a 20 20 20 20 69 66 28 20 41 20 26 26 20 41 2d  .    if( A && A-
2ea0: 3e 6e 53 72 63 3e 31 20 29 7b 20 41 2d 3e 61 5b  >nSrc>1 ){ A->a[
2eb0: 41 2d 3e 6e 53 72 63 2d 32 5d 2e 70 4f 6e 20 3d  A->nSrc-2].pOn =
2ec0: 20 4e 3b 20 7d 0a 20 20 20 20 65 6c 73 65 20 7b   N; }.    else {
2ed0: 20 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74   sqliteExprDelet
2ee0: 65 28 4e 29 3b 20 7d 0a 20 20 7d 0a 20 20 69 66  e(N); }.  }.  if
2ef0: 28 20 55 20 29 7b 0a 20 20 20 20 69 66 28 20 41  ( U ){.    if( A
2f00: 20 26 26 20 41 2d 3e 6e 53 72 63 3e 31 20 29 7b   && A->nSrc>1 ){
2f10: 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 32 5d   A->a[A->nSrc-2]
2f20: 2e 70 55 73 69 6e 67 20 3d 20 55 3b 20 7d 0a 20  .pUsing = U; }. 
2f30: 20 20 20 65 6c 73 65 20 7b 20 73 71 6c 69 74 65     else { sqlite
2f40: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 55 29 3b  IdListDelete(U);
2f50: 20 7d 0a 20 20 7d 0a 7d 0a 0a 25 74 79 70 65 20   }.  }.}..%type 
2f60: 6a 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79  joinop {int}.%ty
2f70: 70 65 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d  pe joinop2 {int}
2f80: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43  .joinop(X) ::= C
2f90: 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20  OMMA.           
2fa0: 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54          { X = JT
2fb0: 5f 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70  _INNER; }.joinop
2fc0: 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 2e 20 20 20  (X) ::= JOIN.   
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b   { X = JT_INNER;
2ff0: 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d   }.joinop(X) ::=
3000: 20 49 44 28 41 29 20 4a 4f 49 4e 2e 20 20 20 20   ID(A) JOIN.    
3010: 20 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20            { X = 
3020: 73 71 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28 70  sqliteJoinType(p
3030: 50 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20 7d  Parse,&A,0,0); }
3040: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 49  .joinop(X) ::= I
3050: 44 28 41 29 20 49 44 28 42 29 20 4a 4f 49 4e 2e  D(A) ID(B) JOIN.
3060: 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 73 71          { X = sq
3070: 6c 69 74 65 4a 6f 69 6e 54 79 70 65 28 70 50 61  liteJoinType(pPa
3080: 72 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20 7d 0a  rse,&A,&B,0); }.
3090: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 49 44  joinop(X) ::= ID
30a0: 28 41 29 20 49 44 28 42 29 20 49 44 28 43 29 20  (A) ID(B) ID(C) 
30b0: 4a 4f 49 4e 2e 20 20 7b 20 58 20 3d 20 73 71 6c  JOIN.  { X = sql
30c0: 69 74 65 4a 6f 69 6e 54 79 70 65 28 70 50 61 72  iteJoinType(pPar
30d0: 73 65 2c 26 41 2c 26 42 2c 26 43 29 3b 20 7d 0a  se,&A,&B,&C); }.
30e0: 0a 25 74 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45  .%type on_opt {E
30f0: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
3100: 72 20 6f 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65  r on_opt {sqlite
3110: 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d  ExprDelete($$);}
3120: 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 4f  .on_opt(N) ::= O
3130: 4e 20 65 78 70 72 28 45 29 2e 20 20 20 7b 4e 20  N expr(E).   {N 
3140: 3d 20 45 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20  = E;}.on_opt(N) 
3150: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
3160: 20 20 7b 4e 20 3d 20 30 3b 7d 0a 0a 25 74 79 70    {N = 0;}..%typ
3170: 65 20 75 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c  e using_opt {IdL
3180: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
3190: 72 20 75 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c  r using_opt {sql
31a0: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
31b0: 24 24 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28  $$);}.using_opt(
31c0: 55 29 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20  U) ::= USING LP 
31d0: 69 64 78 6c 69 73 74 28 4c 29 20 52 50 2e 20 20  idxlist(L) RP.  
31e0: 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e 67 5f 6f  {U = L;}.using_o
31f0: 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(U) ::= .     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a 0a 25 74     {U = 0;}...%t
3220: 79 70 65 20 6f 72 64 65 72 62 79 5f 6f 70 74 20  ype orderby_opt 
3230: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
3240: 74 72 75 63 74 6f 72 20 6f 72 64 65 72 62 79 5f  tructor orderby_
3250: 6f 70 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c  opt {sqliteExprL
3260: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
3270: 25 74 79 70 65 20 73 6f 72 74 6c 69 73 74 20 7b  %type sortlist {
3280: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
3290: 72 75 63 74 6f 72 20 73 6f 72 74 6c 69 73 74 20  ructor sortlist 
32a0: 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44  {sqliteExprListD
32b0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70  elete($$);}.%typ
32c0: 65 20 73 6f 72 74 69 74 65 6d 20 7b 45 78 70 72  e sortitem {Expr
32d0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
32e0: 6f 72 74 69 74 65 6d 20 7b 73 71 6c 69 74 65 45  ortitem {sqliteE
32f0: 78 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  xprDelete($$);}.
3300: 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28 41 29 20  .orderby_opt(A) 
3310: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
3320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
3330: 41 20 3d 20 30 3b 7d 0a 6f 72 64 65 72 62 79 5f  A = 0;}.orderby_
3340: 6f 70 74 28 41 29 20 3a 3a 3d 20 4f 52 44 45 52  opt(A) ::= ORDER
3350: 20 42 59 20 73 6f 72 74 6c 69 73 74 28 58 29 2e   BY sortlist(X).
3360: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73        {A = X;}.s
3370: 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  ortlist(A) ::= s
3380: 6f 72 74 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  ortlist(X) COMMA
3390: 20 73 6f 72 74 69 74 65 6d 28 59 29 20 73 6f 72   sortitem(Y) sor
33a0: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41  torder(Z). {.  A
33b0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
33c0: 74 41 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b 0a  tAppend(X,Y,0);.
33d0: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41    if( A ) A->a[A
33e0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
33f0: 72 64 65 72 20 3d 20 5a 3b 20 20 2f 2a 20 30 3d  rder = Z;  /* 0=
3400: 61 73 63 65 6e 64 69 6e 67 2c 20 31 3d 64 65 63  ascending, 1=dec
3410: 65 6e 64 69 6e 67 20 2a 2f 0a 7d 0a 73 6f 72 74  ending */.}.sort
3420: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 6f 72 74  list(A) ::= sort
3430: 69 74 65 6d 28 59 29 20 73 6f 72 74 6f 72 64 65  item(Y) sortorde
3440: 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  r(Z). {.  A = sq
3450: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
3460: 6e 64 28 30 2c 59 2c 30 29 3b 0a 20 20 69 66 28  nd(0,Y,0);.  if(
3470: 20 41 20 29 20 41 2d 3e 61 5b 30 5d 2e 73 6f 72   A ) A->a[0].sor
3480: 74 4f 72 64 65 72 20 3d 20 5a 3b 0a 7d 0a 73 6f  tOrder = Z;.}.so
3490: 72 74 69 74 65 6d 28 41 29 20 3a 3a 3d 20 65 78  rtitem(A) ::= ex
34a0: 70 72 28 58 29 2e 20 20 20 7b 41 20 3d 20 58 3b  pr(X).   {A = X;
34b0: 7d 0a 0a 25 74 79 70 65 20 73 6f 72 74 6f 72 64  }..%type sortord
34c0: 65 72 20 7b 69 6e 74 7d 0a 0a 73 6f 72 74 6f 72  er {int}..sortor
34d0: 64 65 72 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20  der(A) ::= ASC. 
34e0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 6f       {A = 0;}.so
34f0: 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 44  rtorder(A) ::= D
3500: 45 53 43 2e 20 20 20 20 20 7b 41 20 3d 20 31 3b  ESC.     {A = 1;
3510: 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a  }.sortorder(A) :
3520: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 7b 41 20  := .         {A 
3530: 3d 20 30 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f  = 0;}..%type gro
3540: 75 70 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69  upby_opt {ExprLi
3550: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
3560: 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71   groupby_opt {sq
3570: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65  liteExprListDele
3580: 74 65 28 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79  te($$);}.groupby
3590: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75     {A = 0;}.grou
35c0: 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47  pby_opt(A) ::= G
35d0: 52 4f 55 50 20 42 59 20 65 78 70 72 6c 69 73 74  ROUP BY exprlist
35e0: 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a  (X).  {A = X;}..
35f0: 25 74 79 70 65 20 68 61 76 69 6e 67 5f 6f 70 74  %type having_opt
3600: 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75   {Expr*}.%destru
3610: 63 74 6f 72 20 68 61 76 69 6e 67 5f 6f 70 74 20  ctor having_opt 
3620: 7b 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74  {sqliteExprDelet
3630: 65 28 24 24 29 3b 7d 0a 68 61 76 69 6e 67 5f 6f  e($$);}.having_o
3640: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
3650: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3660: 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41  0;}.having_opt(A
3670: 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20 65 78 70  ) ::= HAVING exp
3680: 72 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  r(X).  {A = X;}.
3690: 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74  .%type limit_opt
36a0: 20 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61   {struct LimitVa
36b0: 6c 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  l}.limit_opt(A) 
36c0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
36d0: 20 20 20 20 20 20 20 7b 41 2e 6c 69 6d 69 74 20         {A.limit 
36e0: 3d 20 2d 31 3b 20 41 2e 6f 66 66 73 65 74 20 3d  = -1; A.offset =
36f0: 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41   0;}.limit_opt(A
3700: 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 49 4e 54 45  ) ::= LIMIT INTE
3710: 47 45 52 28 58 29 2e 20 20 7b 41 2e 6c 69 6d 69  GER(X).  {A.limi
3720: 74 20 3d 20 61 74 6f 69 28 58 2e 7a 29 3b 20 41  t = atoi(X.z); A
3730: 2e 6f 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69  .offset = 0;}.li
3740: 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c  mit_opt(A) ::= L
3750: 49 4d 49 54 20 49 4e 54 45 47 45 52 28 58 29 20  IMIT INTEGER(X) 
3760: 6c 69 6d 69 74 5f 73 65 70 20 49 4e 54 45 47 45  limit_sep INTEGE
3770: 52 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20  R(Y). .         
3780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3790: 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 6c 69             {A.li
37a0: 6d 69 74 20 3d 20 61 74 6f 69 28 58 2e 7a 29 3b  mit = atoi(X.z);
37b0: 20 41 2e 6f 66 66 73 65 74 20 3d 20 61 74 6f 69   A.offset = atoi
37c0: 28 59 2e 7a 29 3b 7d 0a 6c 69 6d 69 74 5f 73 65  (Y.z);}.limit_se
37d0: 70 20 3a 3a 3d 20 4f 46 46 53 45 54 2e 0a 6c 69  p ::= OFFSET..li
37e0: 6d 69 74 5f 73 65 70 20 3a 3a 3d 20 43 4f 4d 4d  mit_sep ::= COMM
37f0: 41 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  A...////////////
3800: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
3810: 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 65  The DELETE state
3820: 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ment ///////////
3830: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3840: 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 45  //.//.cmd ::= DE
3850: 4c 45 54 45 20 46 52 4f 4d 20 69 64 73 28 58 29  LETE FROM ids(X)
3860: 20 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 0a 20   where_opt(Y).. 
3870: 20 20 20 7b 73 71 6c 69 74 65 44 65 6c 65 74 65     {sqliteDelete
3880: 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 26 58 2c  From(pParse, &X,
3890: 20 59 29 3b 7d 0a 0a 25 74 79 70 65 20 77 68 65   Y);}..%type whe
38a0: 72 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25  re_opt {Expr*}.%
38b0: 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 72 65  destructor where
38c0: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 45 78 70 72  _opt {sqliteExpr
38d0: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 77 68  Delete($$);}..wh
38e0: 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  ere_opt(A) ::= .
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 77 68 65      {A = 0;}.whe
3910: 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 57 48  re_opt(A) ::= WH
3920: 45 52 45 20 65 78 70 72 28 58 29 2e 20 20 20 20  ERE expr(X).    
3930: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79     {A = X;}..%ty
3940: 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 70 72  pe setlist {Expr
3950: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
3960: 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 6c 69  or setlist {sqli
3970: 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  teExprListDelete
3980: 28 24 24 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ($$);}..////////
3990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
39a0: 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20 63 6f  // The UPDATE co
39b0: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
39c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
39d0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
39e0: 3d 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28  = UPDATE orconf(
39f0: 52 29 20 69 64 73 28 58 29 20 53 45 54 20 73 65  R) ids(X) SET se
3a00: 74 6c 69 73 74 28 59 29 20 77 68 65 72 65 5f 6f  tlist(Y) where_o
3a10: 70 74 28 5a 29 2e 0a 20 20 20 20 7b 73 71 6c 69  pt(Z)..    {sqli
3a20: 74 65 55 70 64 61 74 65 28 70 50 61 72 73 65 2c  teUpdate(pParse,
3a30: 26 58 2c 59 2c 5a 2c 52 29 3b 7d 0a 0a 73 65 74  &X,Y,Z,R);}..set
3a40: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c  list(A) ::= setl
3a50: 69 73 74 28 5a 29 20 43 4f 4d 4d 41 20 69 64 73  ist(Z) COMMA ids
3a60: 28 58 29 20 45 51 20 65 78 70 72 28 59 29 2e 0a  (X) EQ expr(Y)..
3a70: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45      {A = sqliteE
3a80: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 5a 2c  xprListAppend(Z,
3a90: 59 2c 26 58 29 3b 7d 0a 73 65 74 6c 69 73 74 28  Y,&X);}.setlist(
3aa0: 41 29 20 3a 3a 3d 20 69 64 73 28 58 29 20 45 51  A) ::= ids(X) EQ
3ab0: 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d   expr(Y).   {A =
3ac0: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
3ad0: 70 70 65 6e 64 28 30 2c 59 2c 26 58 29 3b 7d 0a  ppend(0,Y,&X);}.
3ae0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
3af0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
3b00: 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20 2f  INSERT command /
3b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3b30: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65  .//.cmd ::= inse
3b40: 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 69  rt_cmd(R) INTO i
3b50: 64 73 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74  ds(X) inscollist
3b60: 5f 6f 70 74 28 46 29 20 56 41 4c 55 45 53 20 4c  _opt(F) VALUES L
3b70: 50 20 69 74 65 6d 6c 69 73 74 28 59 29 20 52 50  P itemlist(Y) RP
3b80: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
3b90: 20 7b 73 71 6c 69 74 65 49 6e 73 65 72 74 28 70   {sqliteInsert(p
3ba0: 50 61 72 73 65 2c 20 26 58 2c 20 59 2c 20 30 2c  Parse, &X, Y, 0,
3bb0: 20 46 2c 20 52 29 3b 7d 0a 63 6d 64 20 3a 3a 3d   F, R);}.cmd ::=
3bc0: 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49   insert_cmd(R) I
3bd0: 4e 54 4f 20 69 64 73 28 58 29 20 69 6e 73 63 6f  NTO ids(X) insco
3be0: 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65 6c  llist_opt(F) sel
3bf0: 65 63 74 28 53 29 2e 0a 20 20 20 20 20 20 20 20  ect(S)..        
3c00: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 49 6e         {sqliteIn
3c10: 73 65 72 74 28 70 50 61 72 73 65 2c 20 26 58 2c  sert(pParse, &X,
3c20: 20 30 2c 20 53 2c 20 46 2c 20 52 29 3b 7d 0a 0a   0, S, F, R);}..
3c30: 25 74 79 70 65 20 69 6e 73 65 72 74 5f 63 6d 64  %type insert_cmd
3c40: 20 7b 69 6e 74 7d 0a 69 6e 73 65 72 74 5f 63 6d   {int}.insert_cm
3c50: 64 28 41 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20  d(A) ::= INSERT 
3c60: 6f 72 63 6f 6e 66 28 52 29 2e 20 20 20 7b 41 20  orconf(R).   {A 
3c70: 3d 20 52 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d 64  = R;}.insert_cmd
3c80: 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e  (A) ::= REPLACE.
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3ca0: 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 0a   OE_Replace;}...
3cb0: 25 74 79 70 65 20 69 74 65 6d 6c 69 73 74 20 7b  %type itemlist {
3cc0: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
3cd0: 72 75 63 74 6f 72 20 69 74 65 6d 6c 69 73 74 20  ructor itemlist 
3ce0: 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44  {sqliteExprListD
3cf0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69 74 65  elete($$);}..ite
3d00: 6d 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 74 65  mlist(A) ::= ite
3d10: 6d 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65  mlist(X) COMMA e
3d20: 78 70 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 71  xpr(Y).  {A = sq
3d30: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
3d40: 6e 64 28 58 2c 59 2c 30 29 3b 7d 0a 69 74 65 6d  nd(X,Y,0);}.item
3d50: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72  list(A) ::= expr
3d60: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
3d70: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
3d80: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
3d90: 64 28 30 2c 58 2c 30 29 3b 7d 0a 0a 25 74 79 70  d(0,X,0);}..%typ
3da0: 65 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  e inscollist_opt
3db0: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74   {IdList*}.%dest
3dc0: 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73  ructor inscollis
3dd0: 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 49 64 4c  t_opt {sqliteIdL
3de0: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
3df0: 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74  %type inscollist
3e00: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74   {IdList*}.%dest
3e10: 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73  ructor inscollis
3e20: 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44  t {sqliteIdListD
3e30: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69 6e 73  elete($$);}..ins
3e40: 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  collist_opt(A) :
3e50: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
3e60: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3e70: 30 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f  0;}.inscollist_o
3e80: 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 6e 73  pt(A) ::= LP ins
3e90: 63 6f 6c 6c 69 73 74 28 58 29 20 52 50 2e 20 20  collist(X) RP.  
3ea0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 73 63 6f    {A = X;}.insco
3eb0: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 6e 73  llist(A) ::= ins
3ec0: 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41  collist(X) COMMA
3ed0: 20 69 64 73 28 59 29 2e 20 7b 41 20 3d 20 73 71   ids(Y). {A = sq
3ee0: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64  liteIdListAppend
3ef0: 28 58 2c 26 59 29 3b 7d 0a 69 6e 73 63 6f 6c 6c  (X,&Y);}.inscoll
3f00: 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 73 28 59  ist(A) ::= ids(Y
3f10: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3f20: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
3f30: 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30  teIdListAppend(0
3f40: 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ,&Y);}..////////
3f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3f60: 2f 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20 50  /// Expression P
3f70: 72 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f  rocessing //////
3f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3f90: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 6c 65 66 74  ///////.//.%left
3fa0: 20 4f 52 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a   OR..%left AND..
3fb0: 25 72 69 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66  %right NOT..%lef
3fc0: 74 20 45 51 20 4e 45 20 49 53 4e 55 4c 4c 20 4e  t EQ NE ISNULL N
3fd0: 4f 54 4e 55 4c 4c 20 49 53 20 4c 49 4b 45 20 47  OTNULL IS LIKE G
3fe0: 4c 4f 42 20 42 45 54 57 45 45 4e 20 49 4e 2e 0a  LOB BETWEEN IN..
3ff0: 25 6c 65 66 74 20 47 54 20 47 45 20 4c 54 20 4c  %left GT GE LT L
4000: 45 2e 0a 25 6c 65 66 74 20 42 49 54 41 4e 44 20  E..%left BITAND 
4010: 42 49 54 4f 52 20 4c 53 48 49 46 54 20 52 53 48  BITOR LSHIFT RSH
4020: 49 46 54 2e 0a 25 6c 65 66 74 20 50 4c 55 53 20  IFT..%left PLUS 
4030: 4d 49 4e 55 53 2e 0a 25 6c 65 66 74 20 53 54 41  MINUS..%left STA
4040: 52 20 53 4c 41 53 48 20 52 45 4d 2e 0a 25 6c 65  R SLASH REM..%le
4050: 66 74 20 43 4f 4e 43 41 54 2e 0a 25 72 69 67 68  ft CONCAT..%righ
4060: 74 20 55 4d 49 4e 55 53 20 42 49 54 4e 4f 54 2e  t UMINUS BITNOT.
4070: 0a 0a 25 74 79 70 65 20 65 78 70 72 20 7b 45 78  ..%type expr {Ex
4080: 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pr*}.%destructor
4090: 20 65 78 70 72 20 7b 73 71 6c 69 74 65 45 78 70   expr {sqliteExp
40a0: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 65  rDelete($$);}..e
40b0: 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29  xpr(A) ::= LP(B)
40c0: 20 65 78 70 72 28 58 29 20 52 50 28 45 29 2e 20   expr(X) RP(E). 
40d0: 7b 41 20 3d 20 58 3b 20 73 71 6c 69 74 65 45 78  {A = X; sqliteEx
40e0: 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b  prSpan(A,&B,&E);
40f0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4e 55  }.expr(A) ::= NU
4100: 4c 4c 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  LL(X).          
4110: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
4120: 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  pr(TK_NULL, 0, 0
4130: 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20  , &X);}.expr(A) 
4140: 3a 3a 3d 20 69 64 28 58 29 2e 20 20 20 20 20 20  ::= id(X).      
4150: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
4160: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20  liteExpr(TK_ID, 
4170: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72  0, 0, &X);}.expr
4180: 28 41 29 20 3a 3a 3d 20 69 64 73 28 58 29 20 44  (A) ::= ids(X) D
4190: 4f 54 20 69 64 73 28 59 29 2e 20 7b 0a 20 20 45  OT ids(Y). {.  E
41a0: 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c  xpr *temp1 = sql
41b0: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30  iteExpr(TK_ID, 0
41c0: 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78 70 72  , 0, &X);.  Expr
41d0: 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69 74 65   *temp2 = sqlite
41e0: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
41f0: 2c 20 26 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c  , &Y);.  A = sql
4200: 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20  iteExpr(TK_DOT, 
4210: 74 65 6d 70 31 2c 20 74 65 6d 70 32 2c 20 30 29  temp1, temp2, 0)
4220: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
4230: 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20 20 20  INTEGER(X).     
4240: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
4250: 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20  (TK_INTEGER, 0, 
4260: 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  0, &X);}.expr(A)
4270: 20 3a 3a 3d 20 46 4c 4f 41 54 28 58 29 2e 20 20   ::= FLOAT(X).  
4280: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
4290: 65 45 78 70 72 28 54 4b 5f 46 4c 4f 41 54 2c 20  eExpr(TK_FLOAT, 
42a0: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72  0, 0, &X);}.expr
42b0: 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58  (A) ::= STRING(X
42c0: 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71  ).       {A = sq
42d0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 53 54 52 49  liteExpr(TK_STRI
42e0: 4e 47 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a  NG, 0, 0, &X);}.
42f0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58  expr(A) ::= ID(X
4300: 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29  ) LP exprlist(Y)
4310: 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20   RP(E). {.  A = 
4320: 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69  sqliteExprFuncti
4330: 6f 6e 28 59 2c 20 26 58 29 3b 0a 20 20 73 71 6c  on(Y, &X);.  sql
4340: 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58  iteExprSpan(A,&X
4350: 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  ,&E);.}.expr(A) 
4360: 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20 53 54 41  ::= ID(X) LP STA
4370: 52 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d  R RP(E). {.  A =
4380: 20 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74   sqliteExprFunct
4390: 69 6f 6e 28 30 2c 20 26 58 29 3b 0a 20 20 73 71  ion(0, &X);.  sq
43a0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
43b0: 58 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29  X,&E);.}.expr(A)
43c0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 41 4e 44   ::= expr(X) AND
43d0: 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d   expr(Y).   {A =
43e0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41   sqliteExpr(TK_A
43f0: 4e 44 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  ND, X, Y, 0);}.e
4400: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
4410: 58 29 20 4f 52 20 65 78 70 72 28 59 29 2e 20 20  X) OR expr(Y).  
4420: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70    {A = sqliteExp
4430: 72 28 54 4b 5f 4f 52 2c 20 58 2c 20 59 2c 20 30  r(TK_OR, X, Y, 0
4440: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
4450: 65 78 70 72 28 58 29 20 4c 54 20 65 78 70 72 28  expr(X) LT expr(
4460: 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  Y).    {A = sqli
4470: 74 65 45 78 70 72 28 54 4b 5f 4c 54 2c 20 58 2c  teExpr(TK_LT, X,
4480: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
4490: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 47 54 20   ::= expr(X) GT 
44a0: 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d  expr(Y).    {A =
44b0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 47   sqliteExpr(TK_G
44c0: 54 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78  T, X, Y, 0);}.ex
44d0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
44e0: 29 20 4c 45 20 65 78 70 72 28 59 29 2e 20 20 20  ) LE expr(Y).   
44f0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72   {A = sqliteExpr
4500: 28 54 4b 5f 4c 45 2c 20 58 2c 20 59 2c 20 30 29  (TK_LE, X, Y, 0)
4510: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
4520: 78 70 72 28 58 29 20 47 45 20 65 78 70 72 28 59  xpr(X) GE expr(Y
4530: 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74  ).    {A = sqlit
4540: 65 45 78 70 72 28 54 4b 5f 47 45 2c 20 58 2c 20  eExpr(TK_GE, X, 
4550: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
4560: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 45 20 65  ::= expr(X) NE e
4570: 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20  xpr(Y).    {A = 
4580: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 45  sqliteExpr(TK_NE
4590: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
45a0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
45b0: 20 45 51 20 65 78 70 72 28 59 29 2e 20 20 20 20   EQ expr(Y).    
45c0: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
45d0: 54 4b 5f 45 51 2c 20 58 2c 20 59 2c 20 30 29 3b  TK_EQ, X, Y, 0);
45e0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
45f0: 70 72 28 58 29 20 42 49 54 41 4e 44 20 65 78 70  pr(X) BITAND exp
4600: 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74  r(Y). {A = sqlit
4610: 65 45 78 70 72 28 54 4b 5f 42 49 54 41 4e 44 2c  eExpr(TK_BITAND,
4620: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72   X, Y, 0);}.expr
4630: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
4640: 42 49 54 4f 52 20 65 78 70 72 28 59 29 2e 20 20  BITOR expr(Y).  
4650: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
4660: 54 4b 5f 42 49 54 4f 52 2c 20 58 2c 20 59 2c 20  TK_BITOR, X, Y, 
4670: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
4680: 20 65 78 70 72 28 58 29 20 4c 53 48 49 46 54 20   expr(X) LSHIFT 
4690: 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71  expr(Y). {A = sq
46a0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 4c 53 48 49  liteExpr(TK_LSHI
46b0: 46 54 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  FT, X, Y, 0);}.e
46c0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
46d0: 58 29 20 52 53 48 49 46 54 20 65 78 70 72 28 59  X) RSHIFT expr(Y
46e0: 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78  ). {A = sqliteEx
46f0: 70 72 28 54 4b 5f 52 53 48 49 46 54 2c 20 58 2c  pr(TK_RSHIFT, X,
4700: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
4710: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 6c 69 6b   ::= expr(X) lik
4720: 65 6f 70 28 4f 50 29 20 65 78 70 72 28 59 29 2e  eop(OP) expr(Y).
4730: 20 20 5b 4c 49 4b 45 5d 20 20 7b 0a 20 20 45 78    [LIKE]  {.  Ex
4740: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
4750: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
4760: 70 65 6e 64 28 30 2c 20 59 2c 20 30 29 3b 0a 20  pend(0, Y, 0);. 
4770: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45   pList = sqliteE
4780: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c  xprListAppend(pL
4790: 69 73 74 2c 20 58 2c 20 30 29 3b 0a 20 20 41 20  ist, X, 0);.  A 
47a0: 3d 20 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63  = sqliteExprFunc
47b0: 74 69 6f 6e 28 70 4c 69 73 74 2c 20 26 4f 50 29  tion(pList, &OP)
47c0: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70  ;.  sqliteExprSp
47d0: 61 6e 28 41 2c 20 26 58 2d 3e 73 70 61 6e 2c 20  an(A, &X->span, 
47e0: 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70  &Y->span);.}.exp
47f0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
4800: 20 4e 4f 54 20 6c 69 6b 65 6f 70 28 4f 50 29 20   NOT likeop(OP) 
4810: 65 78 70 72 28 59 29 2e 20 5b 4c 49 4b 45 5d 20  expr(Y). [LIKE] 
4820: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
4830: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
4840: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 59 2c  ListAppend(0, Y,
4850: 20 30 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73   0);.  pList = s
4860: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
4870: 65 6e 64 28 70 4c 69 73 74 2c 20 58 2c 20 30 29  end(pList, X, 0)
4880: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  ;.  A = sqliteEx
4890: 70 72 46 75 6e 63 74 69 6f 6e 28 70 4c 69 73 74  prFunction(pList
48a0: 2c 20 26 4f 50 29 3b 0a 20 20 41 20 3d 20 73 71  , &OP);.  A = sq
48b0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 2c  liteExpr(TK_NOT,
48c0: 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   A, 0, 0);.  sql
48d0: 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58  iteExprSpan(A,&X
48e0: 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70 61 6e 29  ->span,&Y->span)
48f0: 3b 0a 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a  ;.}.likeop(A) ::
4900: 3d 20 4c 49 4b 45 28 58 29 2e 20 7b 41 20 3d 20  = LIKE(X). {A = 
4910: 58 3b 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a  X;}.likeop(A) ::
4920: 3d 20 47 4c 4f 42 28 58 29 2e 20 7b 41 20 3d 20  = GLOB(X). {A = 
4930: 58 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  X;}.expr(A) ::= 
4940: 65 78 70 72 28 58 29 20 50 4c 55 53 20 65 78 70  expr(X) PLUS exp
4950: 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69  r(Y).  {A = sqli
4960: 74 65 45 78 70 72 28 54 4b 5f 50 4c 55 53 2c 20  teExpr(TK_PLUS, 
4970: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
4980: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4d  A) ::= expr(X) M
4990: 49 4e 55 53 20 65 78 70 72 28 59 29 2e 20 7b 41  INUS expr(Y). {A
49a0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
49b0: 5f 4d 49 4e 55 53 2c 20 58 2c 20 59 2c 20 30 29  _MINUS, X, Y, 0)
49c0: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
49d0: 78 70 72 28 58 29 20 53 54 41 52 20 65 78 70 72  xpr(X) STAR expr
49e0: 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (Y).  {A = sqlit
49f0: 65 45 78 70 72 28 54 4b 5f 53 54 41 52 2c 20 58  eExpr(TK_STAR, X
4a00: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
4a10: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 53 4c  ) ::= expr(X) SL
4a20: 41 53 48 20 65 78 70 72 28 59 29 2e 20 7b 41 20  ASH expr(Y). {A 
4a30: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
4a40: 53 4c 41 53 48 2c 20 58 2c 20 59 2c 20 30 29 3b  SLASH, X, Y, 0);
4a50: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
4a60: 70 72 28 58 29 20 52 45 4d 20 65 78 70 72 28 59  pr(X) REM expr(Y
4a70: 29 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  ).   {A = sqlite
4a80: 45 78 70 72 28 54 4b 5f 52 45 4d 2c 20 58 2c 20  Expr(TK_REM, X, 
4a90: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
4aa0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 43 4f 4e 43  ::= expr(X) CONC
4ab0: 41 54 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d  AT expr(Y). {A =
4ac0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 43   sqliteExpr(TK_C
4ad0: 4f 4e 43 41 54 2c 20 58 2c 20 59 2c 20 30 29 3b  ONCAT, X, Y, 0);
4ae0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
4af0: 70 72 28 58 29 20 49 53 4e 55 4c 4c 28 45 29 2e  pr(X) ISNULL(E).
4b00: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45   {.  A = sqliteE
4b10: 78 70 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58  xpr(TK_ISNULL, X
4b20: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
4b30: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  eExprSpan(A,&X->
4b40: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72  span,&E);.}.expr
4b50: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
4b60: 49 53 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20  IS NULL(E). {.  
4b70: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
4b80: 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20  K_ISNULL, X, 0, 
4b90: 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72  0);.  sqliteExpr
4ba0: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
4bb0: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
4bc0: 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 4e 55  := expr(X) NOTNU
4bd0: 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  LL(E). {.  A = s
4be0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54  qliteExpr(TK_NOT
4bf0: 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  NULL, X, 0, 0);.
4c00: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
4c10: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b  (A,&X->span,&E);
4c20: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .}.expr(A) ::= e
4c30: 78 70 72 28 58 29 20 4e 4f 54 20 4e 55 4c 4c 28  xpr(X) NOT NULL(
4c40: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  E). {.  A = sqli
4c50: 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c  teExpr(TK_NOTNUL
4c60: 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73  L, X, 0, 0);.  s
4c70: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c  qliteExprSpan(A,
4c80: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a  &X->span,&E);.}.
4c90: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
4ca0: 28 58 29 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 28  (X) IS NOT NULL(
4cb0: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  E). {.  A = sqli
4cc0: 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c  teExpr(TK_NOTNUL
4cd0: 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73  L, X, 0, 0);.  s
4ce0: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c  qliteExprSpan(A,
4cf0: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a  &X->span,&E);.}.
4d00: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 28  expr(A) ::= NOT(
4d10: 42 29 20 65 78 70 72 28 58 29 2e 20 7b 0a 20 20  B) expr(X). {.  
4d20: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
4d30: 4b 5f 4e 4f 54 2c 20 58 2c 20 30 2c 20 30 29 3b  K_NOT, X, 0, 0);
4d40: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  .  sqliteExprSpa
4d50: 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29  n(A,&B,&X->span)
4d60: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
4d70: 42 49 54 4e 4f 54 28 42 29 20 65 78 70 72 28 58  BITNOT(B) expr(X
4d80: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
4d90: 65 45 78 70 72 28 54 4b 5f 42 49 54 4e 4f 54 2c  eExpr(TK_BITNOT,
4da0: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c   X, 0, 0);.  sql
4db0: 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 42  iteExprSpan(A,&B
4dc0: 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78  ,&X->span);.}.ex
4dd0: 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 28  pr(A) ::= MINUS(
4de0: 42 29 20 65 78 70 72 28 58 29 2e 20 5b 55 4d 49  B) expr(X). [UMI
4df0: 4e 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73 71 6c  NUS] {.  A = sql
4e00: 69 74 65 45 78 70 72 28 54 4b 5f 55 4d 49 4e 55  iteExpr(TK_UMINU
4e10: 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73  S, X, 0, 0);.  s
4e20: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c  qliteExprSpan(A,
4e30: 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a  &B,&X->span);.}.
4e40: 65 78 70 72 28 41 29 20 3a 3a 3d 20 50 4c 55 53  expr(A) ::= PLUS
4e50: 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b 55 4d  (B) expr(X). [UM
4e60: 49 4e 55 53 5d 20 7b 0a 20 20 41 20 3d 20 58 3b  INUS] {.  A = X;
4e70: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  .  sqliteExprSpa
4e80: 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29  n(A,&B,&X->span)
4e90: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
4ea0: 4c 50 28 42 29 20 73 65 6c 65 63 74 28 58 29 20  LP(B) select(X) 
4eb0: 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73  RP(E). {.  A = s
4ec0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 53 45 4c  qliteExpr(TK_SEL
4ed0: 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
4ee0: 20 69 66 28 20 41 20 29 20 41 2d 3e 70 53 65 6c   if( A ) A->pSel
4ef0: 65 63 74 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74  ect = X;.  sqlit
4f00: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26  eExprSpan(A,&B,&
4f10: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
4f20: 3d 20 65 78 70 72 28 57 29 20 42 45 54 57 45 45  = expr(W) BETWEE
4f30: 4e 20 65 78 70 72 28 58 29 20 41 4e 44 20 65 78  N expr(X) AND ex
4f40: 70 72 28 59 29 2e 20 7b 0a 20 20 45 78 70 72 4c  pr(Y). {.  ExprL
4f50: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  ist *pList = sql
4f60: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e  iteExprListAppen
4f70: 64 28 30 2c 20 58 2c 20 30 29 3b 0a 20 20 70 4c  d(0, X, 0);.  pL
4f80: 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72  ist = sqliteExpr
4f90: 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74  ListAppend(pList
4fa0: 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73  , Y, 0);.  A = s
4fb0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 42 45 54  qliteExpr(TK_BET
4fc0: 57 45 45 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a  WEEN, W, 0, 0);.
4fd0: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69    if( A ) A->pLi
4fe0: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 73 71  st = pList;.  sq
4ff0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
5000: 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70 61 6e  W->span,&Y->span
5010: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
5020: 20 65 78 70 72 28 57 29 20 4e 4f 54 20 42 45 54   expr(W) NOT BET
5030: 57 45 45 4e 20 65 78 70 72 28 58 29 20 41 4e 44  WEEN expr(X) AND
5040: 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 45 78   expr(Y). {.  Ex
5050: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
5060: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
5070: 70 65 6e 64 28 30 2c 20 58 2c 20 30 29 3b 0a 20  pend(0, X, 0);. 
5080: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45   pList = sqliteE
5090: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c  xprListAppend(pL
50a0: 69 73 74 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20  ist, Y, 0);.  A 
50b0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
50c0: 42 45 54 57 45 45 4e 2c 20 57 2c 20 30 2c 20 30  BETWEEN, W, 0, 0
50d0: 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e  );.  if( A ) A->
50e0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20  pList = pList;. 
50f0: 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28   A = sqliteExpr(
5100: 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29  TK_NOT, A, 0, 0)
5110: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70  ;.  sqliteExprSp
5120: 61 6e 28 41 2c 26 57 2d 3e 73 70 61 6e 2c 26 59  an(A,&W->span,&Y
5130: 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28  ->span);.}.expr(
5140: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49  A) ::= expr(X) I
5150: 4e 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29  N LP exprlist(Y)
5160: 20 52 50 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d   RP(E).  {.  A =
5170: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
5180: 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69  N, X, 0, 0);.  i
5190: 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 20  f( A ) A->pList 
51a0: 3d 20 59 3b 0a 20 20 73 71 6c 69 74 65 45 78 70  = Y;.  sqliteExp
51b0: 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e  rSpan(A,&X->span
51c0: 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  ,&E);.}.expr(A) 
51d0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 4e 20 4c  ::= expr(X) IN L
51e0: 50 20 73 65 6c 65 63 74 28 59 29 20 52 50 28 45  P select(Y) RP(E
51f0: 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  ).  {.  A = sqli
5200: 74 65 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c  teExpr(TK_IN, X,
5210: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20   0, 0);.  if( A 
5220: 29 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20 59  ) A->pSelect = Y
5230: 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70  ;.  sqliteExprSp
5240: 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45  an(A,&X->span,&E
5250: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
5260: 20 65 78 70 72 28 58 29 20 4e 4f 54 20 49 4e 20   expr(X) NOT IN 
5270: 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52  LP exprlist(Y) R
5280: 50 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73  P(E).  {.  A = s
5290: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e 2c  qliteExpr(TK_IN,
52a0: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   X, 0, 0);.  if(
52b0: 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 20 3d 20   A ) A->pList = 
52c0: 59 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45  Y;.  A = sqliteE
52d0: 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30  xpr(TK_NOT, A, 0
52e0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78  , 0);.  sqliteEx
52f0: 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61  prSpan(A,&X->spa
5300: 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29  n,&E);.}.expr(A)
5310: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54   ::= expr(X) NOT
5320: 20 49 4e 20 4c 50 20 73 65 6c 65 63 74 28 59 29   IN LP select(Y)
5330: 20 52 50 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d   RP(E).  {.  A =
5340: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49   sqliteExpr(TK_I
5350: 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69  N, X, 0, 0);.  i
5360: 66 28 20 41 20 29 20 41 2d 3e 70 53 65 6c 65 63  f( A ) A->pSelec
5370: 74 20 3d 20 59 3b 0a 20 20 41 20 3d 20 73 71 6c  t = Y;.  A = sql
5380: 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20  iteExpr(TK_NOT, 
5390: 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  A, 0, 0);.  sqli
53a0: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  teExprSpan(A,&X-
53b0: 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 0a 2f 2a  >span,&E);.}../*
53c0: 20 43 41 53 45 20 65 78 70 72 65 73 73 69 6f 6e   CASE expression
53d0: 73 20 2a 2f 0a 65 78 70 72 28 41 29 20 3a 3a 3d  s */.expr(A) ::=
53e0: 20 43 41 53 45 28 43 29 20 63 61 73 65 5f 6f 70   CASE(C) case_op
53f0: 65 72 61 6e 64 28 58 29 20 63 61 73 65 5f 65 78  erand(X) case_ex
5400: 70 72 6c 69 73 74 28 59 29 20 63 61 73 65 5f 65  prlist(Y) case_e
5410: 6c 73 65 28 5a 29 20 45 4e 44 28 45 29 2e 20 7b  lse(Z) END(E). {
5420: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70  .  A = sqliteExp
5430: 72 28 54 4b 5f 43 41 53 45 2c 20 58 2c 20 5a 2c  r(TK_CASE, X, Z,
5440: 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41   0);.  if( A ) A
5450: 2d 3e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 73  ->pList = Y;.  s
5460: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c  qliteExprSpan(A,
5470: 20 26 43 2c 20 26 45 29 3b 0a 7d 0a 25 74 79 70   &C, &E);.}.%typ
5480: 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20  e case_exprlist 
5490: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
54a0: 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70  tructor case_exp
54b0: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 45 78 70  rlist {sqliteExp
54c0: 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b  rListDelete($$);
54d0: 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28  }.case_exprlist(
54e0: 41 29 20 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72  A) ::= case_expr
54f0: 6c 69 73 74 28 58 29 20 57 48 45 4e 20 65 78 70  list(X) WHEN exp
5500: 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28 5a  r(Y) THEN expr(Z
5510: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
5520: 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  eExprListAppend(
5530: 58 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20  X, Y, 0);.  A = 
5540: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70  sqliteExprListAp
5550: 70 65 6e 64 28 41 2c 20 5a 2c 20 30 29 3b 0a 7d  pend(A, Z, 0);.}
5560: 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41  .case_exprlist(A
5570: 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72 28  ) ::= WHEN expr(
5580: 59 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e  Y) THEN expr(Z).
5590: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45   {.  A = sqliteE
55a0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
55b0: 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71   Y, 0);.  A = sq
55c0: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
55d0: 6e 64 28 41 2c 20 5a 2c 20 30 29 3b 0a 7d 0a 25  nd(A, Z, 0);.}.%
55e0: 74 79 70 65 20 63 61 73 65 5f 65 6c 73 65 20 7b  type case_else {
55f0: 45 78 70 72 2a 7d 0a 63 61 73 65 5f 65 6c 73 65  Expr*}.case_else
5600: 28 41 29 20 3a 3a 3d 20 20 45 4c 53 45 20 65 78  (A) ::=  ELSE ex
5610: 70 72 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b  pr(X).         {
5620: 41 20 3d 20 58 3b 7d 0a 63 61 73 65 5f 65 6c 73  A = X;}.case_els
5630: 65 28 41 29 20 3a 3a 3d 20 20 2e 20 20 20 20 20  e(A) ::=  .     
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 7b 41 20 3d 20 30 3b 7d 20 0a 25 74 79 70 65 20  {A = 0;} .%type 
5660: 63 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b 45 78  case_operand {Ex
5670: 70 72 2a 7d 0a 63 61 73 65 5f 6f 70 65 72 61 6e  pr*}.case_operan
5680: 64 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  d(A) ::= expr(X)
5690: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20  .            {A 
56a0: 3d 20 58 3b 7d 20 0a 63 61 73 65 5f 6f 70 65 72  = X;} .case_oper
56b0: 61 6e 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  and(A) ::= .    
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
56d0: 41 20 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65 20  A = 0;} ..%type 
56e0: 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69  exprlist {ExprLi
56f0: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
5700: 20 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74   exprlist {sqlit
5710: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
5720: 24 24 29 3b 7d 0a 25 74 79 70 65 20 65 78 70 72  $$);}.%type expr
5730: 69 74 65 6d 20 7b 45 78 70 72 2a 7d 0a 25 64 65  item {Expr*}.%de
5740: 73 74 72 75 63 74 6f 72 20 65 78 70 72 69 74 65  structor exprite
5750: 6d 20 7b 73 71 6c 69 74 65 45 78 70 72 44 65 6c  m {sqliteExprDel
5760: 65 74 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72 6c  ete($$);}..exprl
5770: 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 6c  ist(A) ::= exprl
5780: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  ist(X) COMMA exp
5790: 72 69 74 65 6d 28 59 29 2e 20 0a 20 20 20 7b 41  ritem(Y). .   {A
57a0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
57b0: 74 41 70 70 65 6e 64 28 58 2c 59 2c 30 29 3b 7d  tAppend(X,Y,0);}
57c0: 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  .exprlist(A) ::=
57d0: 20 65 78 70 72 69 74 65 6d 28 58 29 2e 20 20 20   expritem(X).   
57e0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
57f0: 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65  liteExprListAppe
5800: 6e 64 28 30 2c 58 2c 30 29 3b 7d 0a 65 78 70 72  nd(0,X,0);}.expr
5810: 69 74 65 6d 28 41 29 20 3a 3a 3d 20 65 78 70 72  item(A) ::= expr
5820: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
5830: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70      {A = X;}.exp
5840: 72 69 74 65 6d 28 41 29 20 3a 3a 3d 20 2e 20 20  ritem(A) ::= .  
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5860: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f       {A = 0;}../
5870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5880: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
5890: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 6f   CREATE INDEX co
58a0: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
58b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
58c0: 0a 63 6d 64 20 3a 3a 3d 20 43 52 45 41 54 45 28  .cmd ::= CREATE(
58d0: 53 29 20 75 6e 69 71 75 65 66 6c 61 67 28 55 29  S) uniqueflag(U)
58e0: 20 49 4e 44 45 58 20 69 64 73 28 58 29 0a 20 20   INDEX ids(X).  
58f0: 20 20 20 20 20 20 4f 4e 20 69 64 73 28 59 29 20        ON ids(Y) 
5900: 4c 50 20 69 64 78 6c 69 73 74 28 5a 29 20 52 50  LP idxlist(Z) RP
5910: 28 45 29 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 7b  (E) onconf(R). {
5920: 0a 20 20 69 66 28 20 55 21 3d 4f 45 5f 4e 6f 6e  .  if( U!=OE_Non
5930: 65 20 29 20 55 20 3d 20 52 3b 0a 20 20 69 66 28  e ) U = R;.  if(
5940: 20 55 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20   U==OE_Default) 
5950: 55 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  U = OE_Abort;.  
5960: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65  sqliteCreateInde
5970: 78 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59  x(pParse, &X, &Y
5980: 2c 20 5a 2c 20 55 2c 20 26 53 2c 20 26 45 29 3b  , Z, U, &S, &E);
5990: 0a 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71 75 65  .}..%type unique
59a0: 66 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75  flag {int}.uniqu
59b0: 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49  eflag(A) ::= UNI
59c0: 51 55 45 2e 20 20 7b 20 41 20 3d 20 4f 45 5f 41  QUE.  { A = OE_A
59d0: 62 6f 72 74 3b 20 7d 0a 75 6e 69 71 75 65 66 6c  bort; }.uniquefl
59e0: 61 67 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  ag(A) ::= .     
59f0: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65     { A = OE_None
5a00: 3b 20 7d 0a 0a 25 74 79 70 65 20 69 64 78 6c 69  ; }..%type idxli
5a10: 73 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65  st {IdList*}.%de
5a20: 73 74 72 75 63 74 6f 72 20 69 64 78 6c 69 73 74  structor idxlist
5a30: 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65   {sqliteIdListDe
5a40: 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65  lete($$);}.%type
5a50: 20 69 64 78 69 74 65 6d 20 7b 54 6f 6b 65 6e 7d   idxitem {Token}
5a60: 0a 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d  ..idxlist(A) ::=
5a70: 20 69 64 78 6c 69 73 74 28 58 29 20 43 4f 4d 4d   idxlist(X) COMM
5a80: 41 20 69 64 78 69 74 65 6d 28 59 29 2e 20 20 0a  A idxitem(Y).  .
5a90: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5aa0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26  IdListAppend(X,&
5ab0: 59 29 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29 20  Y);}.idxlist(A) 
5ac0: 3a 3a 3d 20 69 64 78 69 74 65 6d 28 59 29 2e 0a  ::= idxitem(Y)..
5ad0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
5ae0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26  IdListAppend(0,&
5af0: 59 29 3b 7d 0a 69 64 78 69 74 65 6d 28 41 29 20  Y);}.idxitem(A) 
5b00: 3a 3a 3d 20 69 64 73 28 58 29 2e 20 20 20 20 20  ::= ids(X).     
5b10: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f       {A = X;}../
5b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
5b40: 20 44 52 4f 50 20 49 4e 44 45 58 20 63 6f 6d 6d   DROP INDEX comm
5b50: 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  and ////////////
5b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
5b70: 0a 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 49  ..cmd ::= DROP I
5b80: 4e 44 45 58 20 69 64 73 28 58 29 2e 20 20 20 20  NDEX ids(X).    
5b90: 20 20 7b 73 71 6c 69 74 65 44 72 6f 70 49 6e 64    {sqliteDropInd
5ba0: 65 78 28 70 50 61 72 73 65 2c 20 26 58 29 3b 7d  ex(pParse, &X);}
5bb0: 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .../////////////
5bc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5bd0: 20 54 68 65 20 43 4f 50 59 20 63 6f 6d 6d 61 6e   The COPY comman
5be0: 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  d //////////////
5bf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c00: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 43 4f 50  /.//.cmd ::= COP
5c10: 59 20 6f 72 63 6f 6e 66 28 52 29 20 69 64 73 28  Y orconf(R) ids(
5c20: 58 29 20 46 52 4f 4d 20 69 64 73 28 59 29 20 55  X) FROM ids(Y) U
5c30: 53 49 4e 47 20 44 45 4c 49 4d 49 54 45 52 53 20  SING DELIMITERS 
5c40: 53 54 52 49 4e 47 28 5a 29 2e 0a 20 20 20 20 7b  STRING(Z)..    {
5c50: 73 71 6c 69 74 65 43 6f 70 79 28 70 50 61 72 73  sqliteCopy(pPars
5c60: 65 2c 26 58 2c 26 59 2c 26 5a 2c 52 29 3b 7d 0a  e,&X,&Y,&Z,R);}.
5c70: 63 6d 64 20 3a 3a 3d 20 43 4f 50 59 20 6f 72 63  cmd ::= COPY orc
5c80: 6f 6e 66 28 52 29 20 69 64 73 28 58 29 20 46 52  onf(R) ids(X) FR
5c90: 4f 4d 20 69 64 73 28 59 29 2e 0a 20 20 20 20 7b  OM ids(Y)..    {
5ca0: 73 71 6c 69 74 65 43 6f 70 79 28 70 50 61 72 73  sqliteCopy(pPars
5cb0: 65 2c 26 58 2c 26 59 2c 30 2c 52 29 3b 7d 0a 0a  e,&X,&Y,0,R);}..
5cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5cd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
5ce0: 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64  e VACUUM command
5cf0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
5d00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
5d10: 2f 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d  /.cmd ::= VACUUM
5d20: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5d30: 20 7b 73 71 6c 69 74 65 56 61 63 75 75 6d 28 70   {sqliteVacuum(p
5d40: 50 61 72 73 65 2c 30 29 3b 7d 0a 63 6d 64 20 3a  Parse,0);}.cmd :
5d50: 3a 3d 20 56 41 43 55 55 4d 20 69 64 73 28 58 29  := VACUUM ids(X)
5d60: 2e 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74  .         {sqlit
5d70: 65 56 61 63 75 75 6d 28 70 50 61 72 73 65 2c 26  eVacuum(pParse,&
5d80: 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  X);}..//////////
5d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5da0: 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d 41 20 63  /// The PRAGMA c
5db0: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
5dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5dd0: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
5de0: 50 52 41 47 4d 41 20 69 64 73 28 58 29 20 45 51  PRAGMA ids(X) EQ
5df0: 20 69 64 73 28 59 29 2e 20 20 20 20 20 20 20 20   ids(Y).        
5e00: 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61 28 70   {sqlitePragma(p
5e10: 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b 7d  Parse,&X,&Y,0);}
5e20: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
5e30: 69 64 73 28 58 29 20 45 51 20 4f 4e 28 59 29 2e  ids(X) EQ ON(Y).
5e40: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
5e50: 65 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26  ePragma(pParse,&
5e60: 58 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a  X,&Y,0);}.cmd ::
5e70: 3d 20 50 52 41 47 4d 41 20 69 64 73 28 58 29 20  = PRAGMA ids(X) 
5e80: 45 51 20 70 6c 75 73 5f 6e 75 6d 28 59 29 2e 20  EQ plus_num(Y). 
5e90: 20 20 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61     {sqlitePragma
5ea0: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29  (pParse,&X,&Y,0)
5eb0: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  ;}.cmd ::= PRAGM
5ec0: 41 20 69 64 73 28 58 29 20 45 51 20 6d 69 6e 75  A ids(X) EQ minu
5ed0: 73 5f 6e 75 6d 28 59 29 2e 20 20 20 7b 73 71 6c  s_num(Y).   {sql
5ee0: 69 74 65 50 72 61 67 6d 61 28 70 50 61 72 73 65  itePragma(pParse
5ef0: 2c 26 58 2c 26 59 2c 31 29 3b 7d 0a 63 6d 64 20  ,&X,&Y,1);}.cmd 
5f00: 3a 3a 3d 20 50 52 41 47 4d 41 20 69 64 73 28 58  ::= PRAGMA ids(X
5f10: 29 20 4c 50 20 69 64 73 28 59 29 20 52 50 2e 20  ) LP ids(Y) RP. 
5f20: 20 20 20 20 20 7b 73 71 6c 69 74 65 50 72 61 67       {sqlitePrag
5f30: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c  ma(pParse,&X,&Y,
5f40: 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  0);}.cmd ::= PRA
5f50: 47 4d 41 20 69 64 73 28 58 29 2e 20 20 20 20 20  GMA ids(X).     
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
5f70: 71 6c 69 74 65 50 72 61 67 6d 61 28 70 50 61 72  qlitePragma(pPar
5f80: 73 65 2c 26 58 2c 26 58 2c 30 29 3b 7d 0a 70 6c  se,&X,&X,0);}.pl
5f90: 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 6c  us_num(A) ::= pl
5fa0: 75 73 5f 6f 70 74 20 6e 75 6d 62 65 72 28 58 29  us_opt number(X)
5fb0: 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e  .   {A = X;}.min
5fc0: 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49  us_num(A) ::= MI
5fd0: 4e 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20  NUS number(X).  
5fe0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62     {A = X;}.numb
5ff0: 65 72 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45  er(A) ::= INTEGE
6000: 52 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  R(X).  {A = X;}.
6010: 6e 75 6d 62 65 72 28 41 29 20 3a 3a 3d 20 46 4c  number(A) ::= FL
6020: 4f 41 54 28 58 29 2e 20 20 20 20 7b 41 20 3d 20  OAT(X).    {A = 
6030: 58 3b 7d 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d  X;}.plus_opt ::=
6040: 20 50 4c 55 53 2e 0a 70 6c 75 73 5f 6f 70 74 20   PLUS..plus_opt 
6050: 3a 3a 3d 20 2e 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  ::= .../////////
6060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6070: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 54  /// The CREATE T
6080: 52 49 47 47 45 52 20 63 6f 6d 6d 61 6e 64 20 2f  RIGGER command /
6090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60a0: 2f 2f 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 43 52 45  ////.cmd ::= CRE
60b0: 41 54 45 28 41 29 20 54 52 49 47 47 45 52 20 69  ATE(A) TRIGGER i
60c0: 64 73 28 42 29 20 74 72 69 67 67 65 72 5f 74 69  ds(B) trigger_ti
60d0: 6d 65 28 43 29 20 74 72 69 67 67 65 72 5f 65 76  me(C) trigger_ev
60e0: 65 6e 74 28 44 29 20 4f 4e 20 69 64 73 28 45 29  ent(D) ON ids(E)
60f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6100: 20 20 20 20 66 6f 72 65 61 63 68 5f 63 6c 61 75      foreach_clau
6110: 73 65 28 46 29 20 77 68 65 6e 5f 63 6c 61 75 73  se(F) when_claus
6120: 65 28 47 29 0a 20 20 20 20 20 20 20 20 20 20 20  e(G).           
6130: 20 20 20 20 20 20 20 42 45 47 49 4e 20 74 72 69         BEGIN tri
6140: 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53 29  gger_cmd_list(S)
6150: 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 73 71 6c   END(Z). {.  sql
6160: 69 74 65 43 72 65 61 74 65 54 72 69 67 67 65 72  iteCreateTrigger
6170: 28 70 50 61 72 73 65 2c 20 26 42 2c 20 43 2c 20  (pParse, &B, C, 
6180: 44 2e 61 2c 20 44 2e 62 2c 20 26 45 2c 20 46 2c  D.a, D.b, &E, F,
6190: 20 47 2c 20 53 2c 20 0a 20 20 20 20 20 20 41 2e   G, S, .      A.
61a0: 7a 2c 20 28 69 6e 74 29 28 5a 2e 7a 20 2d 20 41  z, (int)(Z.z - A
61b0: 2e 7a 29 20 2b 20 5a 2e 6e 20 29 3b 0a 7d 0a 0a  .z) + Z.n );.}..
61c0: 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 74 69  %type trigger_ti
61d0: 6d 65 20 20 7b 69 6e 74 7d 0a 74 72 69 67 67 65  me  {int}.trigge
61e0: 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 42 45  r_time(A) ::= BE
61f0: 46 4f 52 45 2e 20 20 20 20 20 20 7b 20 41 20 3d  FORE.      { A =
6200: 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a 74 72   TK_BEFORE; }.tr
6210: 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a  igger_time(A) ::
6220: 3d 20 41 46 54 45 52 2e 20 20 20 20 20 20 20 7b  = AFTER.       {
6230: 20 41 20 3d 20 54 4b 5f 41 46 54 45 52 3b 20 20   A = TK_AFTER;  
6240: 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41  }.trigger_time(A
6250: 29 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46  ) ::= INSTEAD OF
6260: 2e 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54  .  { A = TK_INST
6270: 45 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69  EAD;}.trigger_ti
6280: 6d 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  me(A) ::= .     
6290: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f         { A = TK_
62a0: 42 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65  BEFORE; }..%type
62b0: 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b   trigger_event {
62c0: 73 74 72 75 63 74 20 54 72 69 67 45 76 65 6e 74  struct TrigEvent
62d0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72  }.%destructor tr
62e0: 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c  igger_event {sql
62f0: 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74 65 28  iteIdListDelete(
6300: 24 24 2e 62 29 3b 7d 0a 74 72 69 67 67 65 72 5f  $$.b);}.trigger_
6310: 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 44 45 4c  event(A) ::= DEL
6320: 45 54 45 2e 20 7b 20 41 2e 61 20 3d 20 54 4b 5f  ETE. { A.a = TK_
6330: 44 45 4c 45 54 45 3b 20 41 2e 62 20 3d 20 30 3b  DELETE; A.b = 0;
6340: 20 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e 74   }.trigger_event
6350: 28 41 29 20 3a 3a 3d 20 49 4e 53 45 52 54 2e 20  (A) ::= INSERT. 
6360: 7b 20 41 2e 61 20 3d 20 54 4b 5f 49 4e 53 45 52  { A.a = TK_INSER
6370: 54 3b 20 41 2e 62 20 3d 20 30 3b 20 7d 0a 74 72  T; A.b = 0; }.tr
6380: 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a  igger_event(A) :
6390: 3a 3d 20 55 50 44 41 54 45 2e 20 7b 20 41 2e 61  := UPDATE. { A.a
63a0: 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b 20 41 2e   = TK_UPDATE; A.
63b0: 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f  b = 0;}.trigger_
63c0: 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44  event(A) ::= UPD
63d0: 41 54 45 20 4f 46 20 69 6e 73 63 6f 6c 6c 69 73  ATE OF inscollis
63e0: 74 28 58 29 2e 20 7b 41 2e 61 20 3d 20 54 4b 5f  t(X). {A.a = TK_
63f0: 55 50 44 41 54 45 3b 20 41 2e 62 20 3d 20 58 3b  UPDATE; A.b = X;
6400: 20 7d 0a 0a 25 74 79 70 65 20 66 6f 72 65 61 63   }..%type foreac
6410: 68 5f 63 6c 61 75 73 65 20 7b 69 6e 74 7d 0a 66  h_clause {int}.f
6420: 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 28 41 29  oreach_clause(A)
6430: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
6440: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54           { A = T
6450: 4b 5f 52 4f 57 3b 20 7d 0a 66 6f 72 65 61 63 68  K_ROW; }.foreach
6460: 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 46  _clause(A) ::= F
6470: 4f 52 20 45 41 43 48 20 52 4f 57 2e 20 20 20 20  OR EACH ROW.    
6480: 20 20 20 7b 20 41 20 3d 20 54 4b 5f 52 4f 57 3b     { A = TK_ROW;
6490: 20 7d 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73   }.foreach_claus
64a0: 65 28 41 29 20 3a 3a 3d 20 46 4f 52 20 45 41 43  e(A) ::= FOR EAC
64b0: 48 20 53 54 41 54 45 4d 45 4e 54 2e 20 7b 20 41  H STATEMENT. { A
64c0: 20 3d 20 54 4b 5f 53 54 41 54 45 4d 45 4e 54 3b   = TK_STATEMENT;
64d0: 20 7d 0a 0a 25 74 79 70 65 20 77 68 65 6e 5f 63   }..%type when_c
64e0: 6c 61 75 73 65 20 7b 45 78 70 72 20 2a 7d 0a 77  lause {Expr *}.w
64f0: 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a  hen_clause(A) ::
6500: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
6510: 7b 20 41 20 3d 20 30 3b 20 7d 0a 77 68 65 6e 5f  { A = 0; }.when_
6520: 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 57 48  clause(A) ::= WH
6530: 45 4e 20 65 78 70 72 28 58 29 2e 20 7b 20 41 20  EN expr(X). { A 
6540: 3d 20 58 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72  = X; }..%type tr
6550: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b  igger_cmd_list {
6560: 54 72 69 67 67 65 72 53 74 65 70 20 2a 7d 0a 74  TriggerStep *}.t
6570: 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28  rigger_cmd_list(
6580: 41 29 20 3a 3a 3d 20 74 72 69 67 67 65 72 5f 63  A) ::= trigger_c
6590: 6d 64 28 58 29 20 53 45 4d 49 20 74 72 69 67 67  md(X) SEMI trigg
65a0: 65 72 5f 63 6d 64 5f 6c 69 73 74 28 59 29 2e 20  er_cmd_list(Y). 
65b0: 7b 0a 20 20 58 2d 3e 70 4e 65 78 74 20 3d 20 59  {.  X->pNext = Y
65c0: 20 3b 20 41 20 3d 20 58 3b 20 7d 0a 74 72 69 67   ; A = X; }.trig
65d0: 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20  ger_cmd_list(A) 
65e0: 3a 3a 3d 20 2e 20 7b 20 41 20 3d 20 30 3b 20 7d  ::= . { A = 0; }
65f0: 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f  ..%type trigger_
6600: 63 6d 64 20 7b 54 72 69 67 67 65 72 53 74 65 70  cmd {TriggerStep
6610: 20 2a 7d 0a 2f 2f 20 55 50 44 41 54 45 20 0a 74   *}.// UPDATE .t
6620: 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a  rigger_cmd(A) ::
6630: 3d 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28  = UPDATE orconf(
6640: 52 29 20 69 64 73 28 58 29 20 53 45 54 20 73 65  R) ids(X) SET se
6650: 74 6c 69 73 74 28 59 29 20 77 68 65 72 65 5f 6f  tlist(Y) where_o
6660: 70 74 28 5a 29 2e 20 20 0a 20 20 20 20 20 20 20  pt(Z).  .       
6670: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 73 71          { A = sq
6680: 6c 69 74 65 54 72 69 67 67 65 72 55 70 64 61 74  liteTriggerUpdat
6690: 65 53 74 65 70 28 26 58 2c 20 59 2c 20 5a 2c 20  eStep(&X, Y, Z, 
66a0: 52 29 3b 20 7d 0a 0a 2f 2f 20 49 4e 53 45 52 54  R); }..// INSERT
66b0: 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20  .trigger_cmd(A) 
66c0: 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63 6f 6e  ::= INSERT orcon
66d0: 66 28 52 29 20 49 4e 54 4f 20 69 64 73 28 58 29  f(R) INTO ids(X)
66e0: 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28   inscollist_opt(
66f0: 46 29 20 0a 20 20 56 41 4c 55 45 53 20 4c 50 20  F) .  VALUES LP 
6700: 69 74 65 6d 6c 69 73 74 28 59 29 20 52 50 2e 20  itemlist(Y) RP. 
6710: 20 0a 7b 41 20 3d 20 73 71 6c 69 74 65 54 72 69   .{A = sqliteTri
6720: 67 67 65 72 49 6e 73 65 72 74 53 74 65 70 28 26  ggerInsertStep(&
6730: 58 2c 20 46 2c 20 59 2c 20 30 2c 20 52 29 3b 7d  X, F, Y, 0, R);}
6740: 0a 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  ..trigger_cmd(A)
6750: 20 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63 6f   ::= INSERT orco
6760: 6e 66 28 52 29 20 49 4e 54 4f 20 69 64 73 28 58  nf(R) INTO ids(X
6770: 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  ) inscollist_opt
6780: 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e 0a 20  (F) select(S).. 
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
67a0: 20 3d 20 73 71 6c 69 74 65 54 72 69 67 67 65 72   = sqliteTrigger
67b0: 49 6e 73 65 72 74 53 74 65 70 28 26 58 2c 20 46  InsertStep(&X, F
67c0: 2c 20 30 2c 20 53 2c 20 52 29 3b 7d 0a 0a 2f 2f  , 0, S, R);}..//
67d0: 20 44 45 4c 45 54 45 0a 74 72 69 67 67 65 72 5f   DELETE.trigger_
67e0: 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54  cmd(A) ::= DELET
67f0: 45 20 46 52 4f 4d 20 69 64 73 28 58 29 20 77 68  E FROM ids(X) wh
6800: 65 72 65 5f 6f 70 74 28 59 29 2e 0a 20 20 20 20  ere_opt(Y)..    
6810: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
6820: 73 71 6c 69 74 65 54 72 69 67 67 65 72 44 65 6c  sqliteTriggerDel
6830: 65 74 65 53 74 65 70 28 26 58 2c 20 59 29 3b 7d  eteStep(&X, Y);}
6840: 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a 74 72 69 67  ..// SELECT.trig
6850: 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 73  ger_cmd(A) ::= s
6860: 65 6c 65 63 74 28 58 29 2e 20 20 7b 41 20 3d 20  elect(X).  {A = 
6870: 73 71 6c 69 74 65 54 72 69 67 67 65 72 53 65 6c  sqliteTriggerSel
6880: 65 63 74 53 74 65 70 28 58 29 3b 20 7d 0a 0a 2f  ectStep(X); }../
6890: 2f 20 54 68 65 20 73 70 65 63 69 61 6c 20 52 41  / The special RA
68a0: 49 53 45 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ISE expression t
68b0: 68 61 74 20 6d 61 79 20 6f 63 63 75 72 20 69 6e  hat may occur in
68c0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
68d0: 73 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52 41  s.expr(A) ::= RA
68e0: 49 53 45 28 58 29 20 4c 50 20 49 47 4e 4f 52 45  ISE(X) LP IGNORE
68f0: 20 52 50 28 59 29 2e 20 20 7b 20 41 20 3d 20 73   RP(Y).  { A = s
6900: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 52 41 49  qliteExpr(TK_RAI
6910: 53 45 2c 20 30 2c 20 30 2c 20 30 29 3b 20 0a 20  SE, 0, 0, 0); . 
6920: 20 20 20 41 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     A->iColumn = 
6930: 4f 45 5f 49 67 6e 6f 72 65 3b 20 73 71 6c 69 74  OE_Ignore; sqlit
6940: 65 45 78 70 72 53 70 61 6e 28 41 2c 20 26 58 2c  eExprSpan(A, &X,
6950: 20 26 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a   &Y);}.expr(A) :
6960: 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 52  := RAISE(X) LP R
6970: 4f 4c 4c 42 41 43 4b 20 43 4f 4d 4d 41 20 69 64  OLLBACK COMMA id
6980: 73 28 5a 29 20 52 50 28 59 29 2e 20 20 0a 7b 20  s(Z) RP(Y).  .{ 
6990: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
69a0: 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30 2c 20 26  K_RAISE, 0, 0, &
69b0: 5a 29 3b 20 0a 20 20 20 20 41 2d 3e 69 43 6f 6c  Z); .    A->iCol
69c0: 75 6d 6e 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63  umn = OE_Rollbac
69d0: 6b 3b 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  k; sqliteExprSpa
69e0: 6e 28 41 2c 20 26 58 2c 20 26 59 29 3b 7d 0a 65  n(A, &X, &Y);}.e
69f0: 78 70 72 28 41 29 20 3a 3a 3d 20 52 41 49 53 45  xpr(A) ::= RAISE
6a00: 28 58 29 20 4c 50 20 41 42 4f 52 54 20 43 4f 4d  (X) LP ABORT COM
6a10: 4d 41 20 69 64 73 28 5a 29 20 52 50 28 59 29 2e  MA ids(Z) RP(Y).
6a20: 20 20 0a 7b 20 41 20 3d 20 73 71 6c 69 74 65 45    .{ A = sqliteE
6a30: 78 70 72 28 54 4b 5f 52 41 49 53 45 2c 20 30 2c  xpr(TK_RAISE, 0,
6a40: 20 30 2c 20 26 5a 29 3b 20 0a 20 20 20 20 41 2d   0, &Z); .    A-
6a50: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 4f 45 5f 41 62  >iColumn = OE_Ab
6a60: 6f 72 74 3b 20 73 71 6c 69 74 65 45 78 70 72 53  ort; sqliteExprS
6a70: 70 61 6e 28 41 2c 20 26 58 2c 20 26 59 29 3b 7d  pan(A, &X, &Y);}
6a80: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 52 41 49  .expr(A) ::= RAI
6a90: 53 45 28 58 29 20 4c 50 20 46 41 49 4c 20 43 4f  SE(X) LP FAIL CO
6aa0: 4d 4d 41 20 69 64 73 28 5a 29 20 52 50 28 59 29  MMA ids(Z) RP(Y)
6ab0: 2e 20 20 0a 7b 20 41 20 3d 20 73 71 6c 69 74 65  .  .{ A = sqlite
6ac0: 45 78 70 72 28 54 4b 5f 52 41 49 53 45 2c 20 30  Expr(TK_RAISE, 0
6ad0: 2c 20 30 2c 20 26 5a 29 3b 20 0a 20 20 20 20 41  , 0, &Z); .    A
6ae0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 4f 45 5f 46  ->iColumn = OE_F
6af0: 61 69 6c 3b 20 73 71 6c 69 74 65 45 78 70 72 53  ail; sqliteExprS
6b00: 70 61 6e 28 41 2c 20 26 58 2c 20 26 59 29 3b 7d  pan(A, &X, &Y);}
6b10: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
6b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 20 44 52 4f 50  //////////  DROP
6b30: 20 54 52 49 47 47 45 52 20 73 74 61 74 65 6d 65   TRIGGER stateme
6b40: 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nt /////////////
6b50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6b60: 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54  /.cmd ::= DROP T
6b70: 52 49 47 47 45 52 20 69 64 73 28 58 29 2e 20 7b  RIGGER ids(X). {
6b80: 0a 20 20 20 20 73 71 6c 69 74 65 44 72 6f 70 54  .    sqliteDropT
6b90: 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 26 58  rigger(pParse,&X
6ba0: 2c 30 29 3b 0a 7d 0a                             ,0);.}.