/ Hex Artifact Content
Login

Artifact 073a8294e1826f1b1656e84806b77e4199f4bb57:


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 2f 0a 0a 2f 2f 20 41 6c 6c 20  ens..*/..// All 
0270: 74 6f 6b 65 6e 20 63 6f 64 65 73 20 61 72 65 20  token codes are 
0280: 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 77  small integers w
0290: 69 74 68 20 23 64 65 66 69 6e 65 73 20 74 68 61  ith #defines tha
02a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 54 4b  t begin with "TK
02b0: 5f 22 0a 25 74 6f 6b 65 6e 5f 70 72 65 66 69 78  _".%token_prefix
02c0: 20 54 4b 5f 0a 0a 2f 2f 20 54 68 65 20 74 79 70   TK_..// The typ
02d0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 74  e of the data at
02e0: 74 61 63 68 65 64 20 74 6f 20 65 61 63 68 20 74  tached to each t
02f0: 6f 6b 65 6e 20 69 73 20 54 6f 6b 65 6e 2e 20 20  oken is Token.  
0300: 54 68 69 73 20 69 73 20 61 6c 73 6f 20 74 68 65  This is also the
0310: 0a 2f 2f 20 64 65 66 61 75 6c 74 20 74 79 70 65  .// default type
0320: 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61   for non-termina
0330: 6c 73 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 74 79  ls..//.%token_ty
0340: 70 65 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66 61  pe {Token}.%defa
0350: 75 6c 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e 7d  ult_type {Token}
0360: 0a 0a 2f 2f 20 54 68 65 20 67 65 6e 65 72 61 74  ..// The generat
0370: 65 64 20 70 61 72 73 65 72 20 66 75 6e 63 74 69  ed parser functi
0380: 6f 6e 20 74 61 6b 65 73 20 61 20 34 74 68 20 61  on takes a 4th a
0390: 72 67 75 6d 65 6e 74 20 61 73 20 66 6f 6c 6c 6f  rgument as follo
03a0: 77 73 3a 0a 25 65 78 74 72 61 5f 61 72 67 75 6d  ws:.%extra_argum
03b0: 65 6e 74 20 7b 50 61 72 73 65 20 2a 70 50 61 72  ent {Parse *pPar
03c0: 73 65 7d 0a 0a 2f 2f 20 54 68 69 73 20 63 6f 64  se}..// This cod
03d0: 65 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20  e runs whenever 
03e0: 74 68 65 72 65 20 69 73 20 61 20 73 79 6e 74 61  there is a synta
03f0: 78 20 65 72 72 6f 72 0a 2f 2f 0a 25 73 79 6e 74  x error.//.%synt
0400: 61 78 5f 65 72 72 6f 72 20 7b 0a 20 20 55 4e 55  ax_error {.  UNU
0410: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 79 79  SED_PARAMETER(yy
0420: 6d 61 6a 6f 72 29 3b 20 20 2f 2a 20 53 69 6c 65  major);  /* Sile
0430: 6e 63 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65  nce some compile
0440: 72 20 77 61 72 6e 69 6e 67 73 20 2a 2f 0a 20 20  r warnings */.  
0450: 61 73 73 65 72 74 28 20 54 4f 4b 45 4e 2e 7a 5b  assert( TOKEN.z[
0460: 30 5d 20 29 3b 20 20 2f 2a 20 54 68 65 20 74 6f  0] );  /* The to
0470: 6b 65 6e 69 7a 65 72 20 61 6c 77 61 79 73 20 67  kenizer always g
0480: 69 76 65 73 20 75 73 20 61 20 74 6f 6b 65 6e 20  ives us a token 
0490: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  */.  sqlite3Erro
04a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65  rMsg(pParse, "ne
04b0: 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61  ar \"%T\": synta
04c0: 78 20 65 72 72 6f 72 22 2c 20 26 54 4f 4b 45 4e  x error", &TOKEN
04d0: 29 3b 0a 7d 0a 25 73 74 61 63 6b 5f 6f 76 65 72  );.}.%stack_over
04e0: 66 6c 6f 77 20 7b 0a 20 20 55 4e 55 53 45 44 5f  flow {.  UNUSED_
04f0: 50 41 52 41 4d 45 54 45 52 28 79 79 70 4d 69 6e  PARAMETER(yypMin
0500: 6f 72 29 3b 20 2f 2a 20 53 69 6c 65 6e 63 65 20  or); /* Silence 
0510: 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 72 20 77 61  some compiler wa
0520: 72 6e 69 6e 67 73 20 2a 2f 0a 20 20 73 71 6c 69  rnings */.  sqli
0530: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
0540: 73 65 2c 20 22 70 61 72 73 65 72 20 73 74 61 63  se, "parser stac
0550: 6b 20 6f 76 65 72 66 6c 6f 77 22 29 3b 0a 7d 0a  k overflow");.}.
0560: 0a 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 20  .// The name of 
0570: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 72  the generated pr
0580: 6f 63 65 64 75 72 65 20 74 68 61 74 20 69 6d 70  ocedure that imp
0590: 6c 65 6d 65 6e 74 73 20 74 68 65 20 70 61 72 73  lements the pars
05a0: 65 72 0a 2f 2f 20 69 73 20 61 73 20 66 6f 6c 6c  er.// is as foll
05b0: 6f 77 73 3a 0a 25 6e 61 6d 65 20 73 71 6c 69 74  ows:.%name sqlit
05c0: 65 33 50 61 72 73 65 72 0a 0a 2f 2f 20 54 68 65  e3Parser..// The
05d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 74 20   following text 
05e0: 69 73 20 69 6e 63 6c 75 64 65 64 20 6e 65 61 72  is included near
05f0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
0600: 66 20 74 68 65 20 43 20 73 6f 75 72 63 65 0a 2f  f the C source./
0610: 2f 20 63 6f 64 65 20 66 69 6c 65 20 74 68 61 74  / code file that
0620: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
0630: 70 61 72 73 65 72 2e 0a 2f 2f 0a 25 69 6e 63 6c  parser..//.%incl
0640: 75 64 65 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22  ude {.#include "
0650: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0660: 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20  .** Disable all 
0670: 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20 70  error recovery p
0680: 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 74 68 65  rocessing in the
0690: 20 70 61 72 73 65 72 20 70 75 73 68 2d 64 6f 77   parser push-dow
06a0: 6e 0a 2a 2a 20 61 75 74 6f 6d 61 74 6f 6e 2e 0a  n.** automaton..
06b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 59 59 4e 4f 45  */.#define YYNOE
06c0: 52 52 4f 52 52 45 43 4f 56 45 52 59 20 31 0a 0a  RRORRECOVERY 1..
06d0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 79 79 74 65 73  /*.** Make yytes
06e0: 74 63 61 73 65 28 29 20 74 68 65 20 73 61 6d 65  tcase() the same
06f0: 20 61 73 20 74 65 73 74 63 61 73 65 28 29 0a 2a   as testcase().*
0700: 2f 0a 23 64 65 66 69 6e 65 20 79 79 74 65 73 74  /.#define yytest
0710: 63 61 73 65 28 58 29 20 74 65 73 74 63 61 73 65  case(X) testcase
0720: 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  (X)../*.** An in
0730: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
0740: 74 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69  tructure holds i
0750: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
0760: 20 74 68 65 0a 2a 2a 20 4c 49 4d 49 54 20 63 6c   the.** LIMIT cl
0770: 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
0780: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
0790: 74 72 75 63 74 20 4c 69 6d 69 74 56 61 6c 20 7b  truct LimitVal {
07a0: 0a 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b  .  Expr *pLimit;
07b0: 20 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54      /* The LIMIT
07c0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4e 55   expression.  NU
07d0: 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  LL if there is n
07e0: 6f 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 45 78 70  o limit */.  Exp
07f0: 72 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 2f 2a  r *pOffset;   /*
0800: 20 54 68 65 20 4f 46 46 53 45 54 20 65 78 70 72   The OFFSET expr
0810: 65 73 73 69 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66  ession.  NULL if
0820: 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 20 2a   there is none *
0830: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0840: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0850: 73 74 72 75 63 74 75 72 65 20 69 73 20 75 73 65  structure is use
0860: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 4c  d to store the L
0870: 49 4b 45 2c 0a 2a 2a 20 47 4c 4f 42 2c 20 4e 4f  IKE,.** GLOB, NO
0880: 54 20 4c 49 4b 45 2c 20 61 6e 64 20 4e 4f 54 20  T LIKE, and NOT 
0890: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e 0a  GLOB operators..
08a0: 2a 2f 0a 73 74 72 75 63 74 20 4c 69 6b 65 4f 70  */.struct LikeOp
08b0: 20 7b 0a 20 20 54 6f 6b 65 6e 20 65 4f 70 65 72   {.  Token eOper
08c0: 61 74 6f 72 3b 20 20 2f 2a 20 22 6c 69 6b 65 22  ator;  /* "like"
08d0: 20 6f 72 20 22 67 6c 6f 62 22 20 6f 72 20 22 72   or "glob" or "r
08e0: 65 67 65 78 70 22 20 2a 2f 0a 20 20 69 6e 74 20  egexp" */.  int 
08f0: 62 4e 6f 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  bNot;         /*
0900: 20 54 72 75 65 20 69 66 20 74 68 65 20 4e 4f 54   True if the NOT
0910: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
0920: 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ent */.};../*.**
0930: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
0940: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0950: 72 75 63 74 75 72 65 20 64 65 73 63 72 69 62 65  ructure describe
0960: 73 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  s the event of a
0970: 0a 2a 2a 20 54 52 49 47 47 45 52 2e 20 20 22 61  .** TRIGGER.  "a
0980: 22 20 69 73 20 74 68 65 20 65 76 65 6e 74 20 74  " is the event t
0990: 79 70 65 2c 20 6f 6e 65 20 6f 66 20 54 4b 5f 55  ype, one of TK_U
09a0: 50 44 41 54 45 2c 20 54 4b 5f 49 4e 53 45 52 54  PDATE, TK_INSERT
09b0: 2c 0a 2a 2a 20 54 4b 5f 44 45 4c 45 54 45 2c 20  ,.** TK_DELETE, 
09c0: 6f 72 20 54 4b 5f 49 4e 53 54 45 41 44 2e 20 20  or TK_INSTEAD.  
09d0: 49 66 20 74 68 65 20 65 76 65 6e 74 20 69 73 20  If the event is 
09e0: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a  of the form.**.*
09f0: 2a 20 20 20 20 20 20 55 50 44 41 54 45 20 4f 4e  *      UPDATE ON
0a00: 20 28 61 2c 62 2c 63 29 0a 2a 2a 0a 2a 2a 20 54   (a,b,c).**.** T
0a10: 68 65 6e 20 74 68 65 20 22 62 22 20 49 64 4c 69  hen the "b" IdLi
0a20: 73 74 20 72 65 63 6f 72 64 73 20 74 68 65 20 6c  st records the l
0a30: 69 73 74 20 22 61 2c 62 2c 63 22 2e 0a 2a 2f 0a  ist "a,b,c"..*/.
0a40: 73 74 72 75 63 74 20 54 72 69 67 45 76 65 6e 74  struct TrigEvent
0a50: 20 7b 20 69 6e 74 20 61 3b 20 49 64 4c 69 73 74   { int a; IdList
0a60: 20 2a 20 62 3b 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20   * b; };../*.** 
0a70: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0a80: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 68 6f  his structure ho
0a90: 6c 64 73 20 74 68 65 20 41 54 54 41 43 48 20 6b  lds the ATTACH k
0aa0: 65 79 20 61 6e 64 20 74 68 65 20 6b 65 79 20 74  ey and the key t
0ab0: 79 70 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 41  ype..*/.struct A
0ac0: 74 74 61 63 68 4b 65 79 20 7b 20 69 6e 74 20 74  ttachKey { int t
0ad0: 79 70 65 3b 20 20 54 6f 6b 65 6e 20 6b 65 79 3b  ype;  Token key;
0ae0: 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f   };../*.** One o
0af0: 72 20 6d 6f 72 65 20 56 41 4c 55 45 53 20 63 6c  r more VALUES cl
0b00: 61 75 65 73 0a 2a 2f 0a 73 74 72 75 63 74 20 56  aues.*/.struct V
0b10: 61 6c 75 65 4c 69 73 74 20 7b 0a 20 20 45 78 70  alueList {.  Exp
0b20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20  rList *pList;.  
0b30: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 3b  Select *pSelect;
0b40: 0a 7d 3b 0a 0a 7d 20 2f 2f 20 65 6e 64 20 25 69  .};..} // end %i
0b50: 6e 63 6c 75 64 65 0a 0a 2f 2f 20 49 6e 70 75 74  nclude..// Input
0b60: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   is a single SQL
0b70: 20 63 6f 6d 6d 61 6e 64 0a 69 6e 70 75 74 20 3a   command.input :
0b80: 3a 3d 20 63 6d 64 6c 69 73 74 2e 0a 63 6d 64 6c  := cmdlist..cmdl
0b90: 69 73 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74 20  ist ::= cmdlist 
0ba0: 65 63 6d 64 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a  ecmd..cmdlist ::
0bb0: 3d 20 65 63 6d 64 2e 0a 65 63 6d 64 20 3a 3a 3d  = ecmd..ecmd ::=
0bc0: 20 53 45 4d 49 2e 0a 65 63 6d 64 20 3a 3a 3d 20   SEMI..ecmd ::= 
0bd0: 65 78 70 6c 61 69 6e 20 63 6d 64 78 20 53 45 4d  explain cmdx SEM
0be0: 49 2e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 2e  I..explain ::= .
0bf0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c             { sql
0c00: 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28 70  ite3BeginParse(p
0c10: 50 61 72 73 65 2c 20 30 29 3b 20 7d 0a 25 69 66  Parse, 0); }.%if
0c20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0c30: 5f 45 58 50 4c 41 49 4e 0a 65 78 70 6c 61 69 6e  _EXPLAIN.explain
0c40: 20 3a 3a 3d 20 45 58 50 4c 41 49 4e 2e 20 20 20   ::= EXPLAIN.   
0c50: 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c             { sql
0c60: 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28 70  ite3BeginParse(p
0c70: 50 61 72 73 65 2c 20 31 29 3b 20 7d 0a 65 78 70  Parse, 1); }.exp
0c80: 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c 41 49 4e  lain ::= EXPLAIN
0c90: 20 51 55 45 52 59 20 50 4c 41 4e 2e 20 20 20 7b   QUERY PLAN.   {
0ca0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72   sqlite3BeginPar
0cb0: 73 65 28 70 50 61 72 73 65 2c 20 32 29 3b 20 7d  se(pParse, 2); }
0cc0: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
0cd0: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 63 6d 64  OMIT_EXPLAIN.cmd
0ce0: 78 20 3a 3a 3d 20 63 6d 64 2e 20 20 20 20 20 20  x ::= cmd.      
0cf0: 20 20 20 20 20 7b 20 73 71 6c 69 74 65 33 46 69       { sqlite3Fi
0d00: 6e 69 73 68 43 6f 64 69 6e 67 28 70 50 61 72 73  nishCoding(pPars
0d10: 65 29 3b 20 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  e); }../////////
0d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67  //////////// Beg
0d30: 69 6e 20 61 6e 64 20 65 6e 64 20 74 72 61 6e 73  in and end trans
0d40: 61 63 74 69 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f  actions. ///////
0d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d60: 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a  /////.//..cmd ::
0d70: 3d 20 42 45 47 49 4e 20 74 72 61 6e 73 74 79 70  = BEGIN transtyp
0d80: 65 28 59 29 20 74 72 61 6e 73 5f 6f 70 74 2e 20  e(Y) trans_opt. 
0d90: 20 7b 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72   {sqlite3BeginTr
0da0: 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65  ansaction(pParse
0db0: 2c 20 59 29 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74  , Y);}.trans_opt
0dc0: 20 3a 3a 3d 20 2e 0a 74 72 61 6e 73 5f 6f 70 74   ::= ..trans_opt
0dd0: 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e   ::= TRANSACTION
0de0: 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20  ..trans_opt ::= 
0df0: 54 52 41 4e 53 41 43 54 49 4f 4e 20 6e 6d 2e 0a  TRANSACTION nm..
0e00: 25 74 79 70 65 20 74 72 61 6e 73 74 79 70 65 20  %type transtype 
0e10: 7b 69 6e 74 7d 0a 74 72 61 6e 73 74 79 70 65 28  {int}.transtype(
0e20: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
0e30: 20 20 20 20 20 7b 41 20 3d 20 54 4b 5f 44 45 46       {A = TK_DEF
0e40: 45 52 52 45 44 3b 7d 0a 74 72 61 6e 73 74 79 70  ERRED;}.transtyp
0e50: 65 28 41 29 20 3a 3a 3d 20 44 45 46 45 52 52 45  e(A) ::= DEFERRE
0e60: 44 28 58 29 2e 20 20 7b 41 20 3d 20 40 58 3b 7d  D(X).  {A = @X;}
0e70: 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a  .transtype(A) ::
0e80: 3d 20 49 4d 4d 45 44 49 41 54 45 28 58 29 2e 20  = IMMEDIATE(X). 
0e90: 7b 41 20 3d 20 40 58 3b 7d 0a 74 72 61 6e 73 74  {A = @X;}.transt
0ea0: 79 70 65 28 41 29 20 3a 3a 3d 20 45 58 43 4c 55  ype(A) ::= EXCLU
0eb0: 53 49 56 45 28 58 29 2e 20 7b 41 20 3d 20 40 58  SIVE(X). {A = @X
0ec0: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49  ;}.cmd ::= COMMI
0ed0: 54 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20  T trans_opt.    
0ee0: 20 20 7b 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74    {sqlite3Commit
0ef0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72  Transaction(pPar
0f00: 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 45 4e  se);}.cmd ::= EN
0f10: 44 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20  D trans_opt.    
0f20: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 6f 6d       {sqlite3Com
0f30: 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  mitTransaction(p
0f40: 50 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  Parse);}.cmd ::=
0f50: 20 52 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73 5f   ROLLBACK trans_
0f60: 6f 70 74 2e 20 20 20 20 7b 73 71 6c 69 74 65 33  opt.    {sqlite3
0f70: 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
0f80: 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a 0a 73  ion(pParse);}..s
0f90: 61 76 65 70 6f 69 6e 74 5f 6f 70 74 20 3a 3a 3d  avepoint_opt ::=
0fa0: 20 53 41 56 45 50 4f 49 4e 54 2e 0a 73 61 76 65   SAVEPOINT..save
0fb0: 70 6f 69 6e 74 5f 6f 70 74 20 3a 3a 3d 20 2e 0a  point_opt ::= ..
0fc0: 63 6d 64 20 3a 3a 3d 20 53 41 56 45 50 4f 49 4e  cmd ::= SAVEPOIN
0fd0: 54 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c  T nm(X). {.  sql
0fe0: 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 70 50  ite3Savepoint(pP
0ff0: 61 72 73 65 2c 20 53 41 56 45 50 4f 49 4e 54 5f  arse, SAVEPOINT_
1000: 42 45 47 49 4e 2c 20 26 58 29 3b 0a 7d 0a 63 6d  BEGIN, &X);.}.cm
1010: 64 20 3a 3a 3d 20 52 45 4c 45 41 53 45 20 73 61  d ::= RELEASE sa
1020: 76 65 70 6f 69 6e 74 5f 6f 70 74 20 6e 6d 28 58  vepoint_opt nm(X
1030: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 61  ). {.  sqlite3Sa
1040: 76 65 70 6f 69 6e 74 28 70 50 61 72 73 65 2c 20  vepoint(pParse, 
1050: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1060: 45 2c 20 26 58 29 3b 0a 7d 0a 63 6d 64 20 3a 3a  E, &X);.}.cmd ::
1070: 3d 20 52 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73  = ROLLBACK trans
1080: 5f 6f 70 74 20 54 4f 20 73 61 76 65 70 6f 69 6e  _opt TO savepoin
1090: 74 5f 6f 70 74 20 6e 6d 28 58 29 2e 20 7b 0a 20  t_opt nm(X). {. 
10a0: 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e   sqlite3Savepoin
10b0: 74 28 70 50 61 72 73 65 2c 20 53 41 56 45 50 4f  t(pParse, SAVEPO
10c0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 26 58  INT_ROLLBACK, &X
10d0: 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );.}..//////////
10e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
10f0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1100: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
1110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1120: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63  ///.//.cmd ::= c
1130: 72 65 61 74 65 5f 74 61 62 6c 65 20 63 72 65 61  reate_table crea
1140: 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 2e 0a 63  te_table_args..c
1150: 72 65 61 74 65 5f 74 61 62 6c 65 20 3a 3a 3d 20  reate_table ::= 
1160: 63 72 65 61 74 65 6b 77 20 74 65 6d 70 28 54 29  createkw temp(T)
1170: 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 73   TABLE ifnotexis
1180: 74 73 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d  ts(E) nm(Y) dbnm
1190: 28 5a 29 2e 20 7b 0a 20 20 20 73 71 6c 69 74 65  (Z). {.   sqlite
11a0: 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
11b0: 73 65 2c 26 59 2c 26 5a 2c 54 2c 30 2c 30 2c 45  se,&Y,&Z,T,0,0,E
11c0: 29 3b 0a 7d 0a 63 72 65 61 74 65 6b 77 28 41 29  );.}.createkw(A)
11d0: 20 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 2e 20   ::= CREATE(X). 
11e0: 20 7b 0a 20 20 70 50 61 72 73 65 2d 3e 64 62 2d   {.  pParse->db-
11f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
1200: 6c 65 64 20 3d 20 30 3b 0a 20 20 41 20 3d 20 58  led = 0;.  A = X
1210: 3b 0a 7d 0a 25 74 79 70 65 20 69 66 6e 6f 74 65  ;.}.%type ifnote
1220: 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66 6e 6f  xists {int}.ifno
1230: 74 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 2e  texists(A) ::= .
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
1250: 20 3d 20 30 3b 7d 0a 69 66 6e 6f 74 65 78 69 73   = 0;}.ifnotexis
1260: 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 4e 4f 54  ts(A) ::= IF NOT
1270: 20 45 58 49 53 54 53 2e 20 7b 41 20 3d 20 31 3b   EXISTS. {A = 1;
1280: 7d 0a 25 74 79 70 65 20 74 65 6d 70 20 7b 69 6e  }.%type temp {in
1290: 74 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  t}.%ifndef SQLIT
12a0: 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 74 65  E_OMIT_TEMPDB.te
12b0: 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20  mp(A) ::= TEMP. 
12c0: 20 7b 41 20 3d 20 31 3b 7d 0a 25 65 6e 64 69 66   {A = 1;}.%endif
12d0: 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45    SQLITE_OMIT_TE
12e0: 4d 50 44 42 0a 74 65 6d 70 28 41 29 20 3a 3a 3d  MPDB.temp(A) ::=
12f0: 20 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d   .      {A = 0;}
1300: 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72  .create_table_ar
1310: 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e  gs ::= LP column
1320: 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74 5f 6f 70  list conslist_op
1330: 74 28 58 29 20 52 50 28 45 29 20 74 61 62 6c 65  t(X) RP(E) table
1340: 5f 6f 70 74 69 6f 6e 73 28 46 29 2e 20 7b 0a 20  _options(F). {. 
1350: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
1360: 28 70 50 61 72 73 65 2c 26 58 2c 26 45 2c 46 2c  (pParse,&X,&E,F,
1370: 30 29 3b 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62  0);.}.create_tab
1380: 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 41 53 20 73  le_args ::= AS s
1390: 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71  elect(S). {.  sq
13a0: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
13b0: 61 72 73 65 2c 30 2c 30 2c 30 2c 53 29 3b 0a 20  arse,0,0,0,S);. 
13c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
13d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
13e0: 20 53 29 3b 0a 7d 0a 25 74 79 70 65 20 74 61 62   S);.}.%type tab
13f0: 6c 65 5f 6f 70 74 69 6f 6e 73 20 7b 75 38 7d 0a  le_options {u8}.
1400: 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73 28 41 29  table_options(A)
1410: 20 3a 3a 3d 20 2e 20 20 20 20 7b 41 20 3d 20 30   ::= .    {A = 0
1420: 3b 7d 0a 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73  ;}.table_options
1430: 28 41 29 20 3a 3a 3d 20 57 49 54 48 4f 55 54 20  (A) ::= WITHOUT 
1440: 6e 6d 28 58 29 2e 20 7b 0a 20 20 69 66 28 20 58  nm(X). {.  if( X
1450: 2e 6e 3d 3d 35 20 26 26 20 73 71 6c 69 74 65 33  .n==5 && sqlite3
1460: 5f 73 74 72 6e 69 63 6d 70 28 58 2e 7a 2c 22 72  _strnicmp(X.z,"r
1470: 6f 77 69 64 22 2c 35 29 3d 3d 30 20 29 7b 0a 20  owid",5)==0 ){. 
1480: 20 20 20 41 20 3d 20 54 46 5f 57 69 74 68 6f 75     A = TF_Withou
1490: 74 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  tRowid;.  }else{
14a0: 0a 20 20 20 20 41 20 3d 20 30 3b 0a 20 20 20 20  .    A = 0;.    
14b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14c0: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
14d0: 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 3a 20 25   table option: %
14e0: 2e 2a 73 22 2c 20 58 2e 6e 2c 20 58 2e 7a 29 3b  .*s", X.n, X.z);
14f0: 0a 20 20 7d 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69 73  .  }.}.columnlis
1500: 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73 74  t ::= columnlist
1510: 20 43 4f 4d 4d 41 20 63 6f 6c 75 6d 6e 2e 0a 63   COMMA column..c
1520: 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f  olumnlist ::= co
1530: 6c 75 6d 6e 2e 0a 0a 2f 2f 20 41 20 22 63 6f 6c  lumn...// A "col
1540: 75 6d 6e 22 20 69 73 20 61 20 63 6f 6d 70 6c 65  umn" is a comple
1550: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  te description o
1560: 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
1570: 6e 20 69 6e 20 61 0a 2f 2f 20 43 52 45 41 54 45  n in a.// CREATE
1580: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1590: 2e 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73  .  This includes
15a0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
15b0: 2c 20 69 74 73 0a 2f 2f 20 64 61 74 61 74 79 70  , its.// datatyp
15c0: 65 2c 20 61 6e 64 20 6f 74 68 65 72 20 6b 65 79  e, and other key
15d0: 77 6f 72 64 73 20 73 75 63 68 20 61 73 20 50 52  words such as PR
15e0: 49 4d 41 52 59 20 4b 45 59 2c 20 55 4e 49 51 55  IMARY KEY, UNIQU
15f0: 45 2c 20 52 45 46 45 52 45 4e 43 45 53 2c 0a 2f  E, REFERENCES,./
1600: 2f 20 4e 4f 54 20 4e 55 4c 4c 20 61 6e 64 20 73  / NOT NULL and s
1610: 6f 20 66 6f 72 74 68 2e 0a 2f 2f 0a 63 6f 6c 75  o forth..//.colu
1620: 6d 6e 28 41 29 20 3a 3a 3d 20 63 6f 6c 75 6d 6e  mn(A) ::= column
1630: 69 64 28 58 29 20 74 79 70 65 20 63 61 72 67 6c  id(X) type cargl
1640: 69 73 74 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58  ist. {.  A.z = X
1650: 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74  .z;.  A.n = (int
1660: 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  )(pParse->sLastT
1670: 6f 6b 65 6e 2e 7a 2d 58 2e 7a 29 20 2b 20 70 50  oken.z-X.z) + pP
1680: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1690: 2e 6e 3b 0a 7d 0a 63 6f 6c 75 6d 6e 69 64 28 41  .n;.}.columnid(A
16a0: 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 7b 0a 20  ) ::= nm(X). {. 
16b0: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
16c0: 6e 28 70 50 61 72 73 65 2c 26 58 29 3b 0a 20 20  n(pParse,&X);.  
16d0: 41 20 3d 20 58 3b 0a 20 20 70 50 61 72 73 65 2d  A = X;.  pParse-
16e0: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
16f0: 6e 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2f 20 41 6e  n = 0;.}...// An
1700: 20 49 44 45 4e 54 49 46 49 45 52 20 63 61 6e 20   IDENTIFIER can 
1710: 62 65 20 61 20 67 65 6e 65 72 69 63 20 69 64 65  be a generic ide
1720: 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20  ntifier, or one 
1730: 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65  of several.// ke
1740: 79 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e  ywords.  Any non
1750: 2d 73 74 61 6e 64 61 72 64 20 6b 65 79 77 6f 72  -standard keywor
1760: 64 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e  d can also be an
1770: 20 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 0a   identifier..//.
1780: 25 74 79 70 65 20 69 64 20 7b 54 6f 6b 65 6e 7d  %type id {Token}
1790: 0a 69 64 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  .id(A) ::= ID(X)
17a0: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
17b0: 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 49 4e 44  ;}.id(A) ::= IND
17c0: 45 58 45 44 28 58 29 2e 20 20 20 20 7b 41 20 3d  EXED(X).    {A =
17d0: 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c   X;}..// The fol
17e0: 6c 6f 77 69 6e 67 20 64 69 72 65 63 74 69 76 65  lowing directive
17f0: 20 63 61 75 73 65 73 20 74 6f 6b 65 6e 73 20 41   causes tokens A
1800: 42 4f 52 54 2c 20 41 46 54 45 52 2c 20 41 53 43  BORT, AFTER, ASC
1810: 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61 6c  , etc. to.// fal
1820: 6c 62 61 63 6b 20 74 6f 20 49 44 20 69 66 20 74  lback to ID if t
1830: 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61 72  hey will not par
1840: 73 65 20 61 73 20 74 68 65 69 72 20 6f 72 69 67  se as their orig
1850: 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20 54  inal value..// T
1860: 68 69 73 20 6f 62 76 69 61 74 65 73 20 74 68 65  his obviates the
1870: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 20 22 69   need for the "i
1880: 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  d" nonterminal..
1890: 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44 0a  //.%fallback ID.
18a0: 20 20 41 42 4f 52 54 20 41 43 54 49 4f 4e 20 41    ABORT ACTION A
18b0: 46 54 45 52 20 41 4e 41 4c 59 5a 45 20 41 53 43  FTER ANALYZE ASC
18c0: 20 41 54 54 41 43 48 20 42 45 46 4f 52 45 20 42   ATTACH BEFORE B
18d0: 45 47 49 4e 20 42 59 20 43 41 53 43 41 44 45 20  EGIN BY CASCADE 
18e0: 43 41 53 54 20 43 4f 4c 55 4d 4e 4b 57 0a 20 20  CAST COLUMNKW.  
18f0: 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42 41 53  CONFLICT DATABAS
1900: 45 20 44 45 46 45 52 52 45 44 20 44 45 53 43 20  E DEFERRED DESC 
1910: 44 45 54 41 43 48 20 45 41 43 48 20 45 4e 44 20  DETACH EACH END 
1920: 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49  EXCLUSIVE EXPLAI
1930: 4e 20 46 41 49 4c 20 46 4f 52 0a 20 20 49 47 4e  N FAIL FOR.  IGN
1940: 4f 52 45 20 49 4d 4d 45 44 49 41 54 45 20 49 4e  ORE IMMEDIATE IN
1950: 49 54 49 41 4c 4c 59 20 49 4e 53 54 45 41 44 20  ITIALLY INSTEAD 
1960: 4c 49 4b 45 5f 4b 57 20 4d 41 54 43 48 20 4e 4f  LIKE_KW MATCH NO
1970: 20 50 4c 41 4e 0a 20 20 51 55 45 52 59 20 4b 45   PLAN.  QUERY KE
1980: 59 20 4f 46 20 4f 46 46 53 45 54 20 50 52 41 47  Y OF OFFSET PRAG
1990: 4d 41 20 52 41 49 53 45 20 52 45 4c 45 41 53 45  MA RAISE RELEASE
19a0: 20 52 45 50 4c 41 43 45 20 52 45 53 54 52 49 43   REPLACE RESTRIC
19b0: 54 20 52 4f 57 20 52 4f 4c 4c 42 41 43 4b 0a 20  T ROW ROLLBACK. 
19c0: 20 53 41 56 45 50 4f 49 4e 54 20 54 45 4d 50 20   SAVEPOINT TEMP 
19d0: 54 52 49 47 47 45 52 20 56 41 43 55 55 4d 20 56  TRIGGER VACUUM V
19e0: 49 45 57 20 56 49 52 54 55 41 4c 20 57 49 54 48  IEW VIRTUAL WITH
19f0: 4f 55 54 0a 25 69 66 64 65 66 20 53 51 4c 49 54  OUT.%ifdef SQLIT
1a00: 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  E_OMIT_COMPOUND_
1a10: 53 45 4c 45 43 54 0a 20 20 45 58 43 45 50 54 20  SELECT.  EXCEPT 
1a20: 49 4e 54 45 52 53 45 43 54 20 55 4e 49 4f 4e 0a  INTERSECT UNION.
1a30: 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d  %endif SQLITE_OM
1a40: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
1a50: 43 54 0a 20 20 52 45 49 4e 44 45 58 20 52 45 4e  CT.  REINDEX REN
1a60: 41 4d 45 20 43 54 49 4d 45 5f 4b 57 20 49 46 0a  AME CTIME_KW IF.
1a70: 20 20 2e 0a 25 77 69 6c 64 63 61 72 64 20 41 4e    ..%wildcard AN
1a80: 59 2e 0a 0a 2f 2f 20 44 65 66 69 6e 65 20 6f 70  Y...// Define op
1a90: 65 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e 63  erator precedenc
1aa0: 65 20 65 61 72 6c 79 20 73 6f 20 74 68 61 74 20  e early so that 
1ab0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1ac0: 74 20 6f 63 63 75 72 72 65 6e 63 65 0a 2f 2f 20  t occurrence.// 
1ad0: 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  of the operator 
1ae0: 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 67 72  tokens in the gr
1af0: 61 6d 6d 65 72 2e 20 20 4b 65 65 70 69 6e 67 20  ammer.  Keeping 
1b00: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 6f  the operators to
1b10: 67 65 74 68 65 72 0a 2f 2f 20 63 61 75 73 65 73  gether.// causes
1b20: 20 74 68 65 6d 20 74 6f 20 62 65 20 61 73 73 69   them to be assi
1b30: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
1b40: 75 65 73 20 74 68 61 74 20 61 72 65 20 63 6c 6f  ues that are clo
1b50: 73 65 20 74 6f 67 65 74 68 65 72 2c 0a 2f 2f 20  se together,.// 
1b60: 77 68 69 63 68 20 6b 65 65 70 73 20 70 61 72 73  which keeps pars
1b70: 65 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65  er tables smalle
1b80: 72 2e 0a 2f 2f 0a 2f 2f 20 54 68 65 20 74 6f 6b  r..//.// The tok
1b90: 65 6e 20 76 61 6c 75 65 73 20 61 73 73 69 67 6e  en values assign
1ba0: 65 64 20 74 6f 20 74 68 65 73 65 20 73 79 6d 62  ed to these symb
1bb0: 6f 6c 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ols is determine
1bc0: 64 20 62 79 20 74 68 65 20 6f 72 64 65 72 0a 2f  d by the order./
1bd0: 2f 20 69 6e 20 77 68 69 63 68 20 6c 65 6d 6f 6e  / in which lemon
1be0: 20 66 69 72 73 74 20 73 65 65 73 20 74 68 65 6d   first sees them
1bf0: 2e 20 20 49 74 20 6d 75 73 74 20 62 65 20 74 68  .  It must be th
1c00: 65 20 63 61 73 65 20 74 68 61 74 20 49 53 4e 55  e case that ISNU
1c10: 4c 4c 2f 4e 4f 54 4e 55 4c 4c 2c 0a 2f 2f 20 4e  LL/NOTNULL,.// N
1c20: 45 2f 45 51 2c 20 47 54 2f 4c 45 2c 20 61 6e 64  E/EQ, GT/LE, and
1c30: 20 47 45 2f 4c 54 20 61 72 65 20 73 65 70 61 72   GE/LT are separ
1c40: 61 74 65 64 20 62 79 20 6f 6e 6c 79 20 61 20 73  ated by only a s
1c50: 69 6e 67 6c 65 20 76 61 6c 75 65 2e 20 20 53 65  ingle value.  Se
1c60: 65 0a 2f 2f 20 74 68 65 20 73 71 6c 69 74 65 33  e.// the sqlite3
1c70: 45 78 70 72 49 66 46 61 6c 73 65 28 29 20 72 6f  ExprIfFalse() ro
1c80: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
1c90: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
1ca0: 20 6f 6e 20 74 68 69 73 0a 2f 2f 20 63 6f 6e 73   on this.// cons
1cb0: 74 72 61 69 6e 74 2e 0a 2f 2f 0a 25 6c 65 66 74  traint..//.%left
1cc0: 20 4f 52 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a   OR..%left AND..
1cd0: 25 72 69 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66  %right NOT..%lef
1ce0: 74 20 49 53 20 4d 41 54 43 48 20 4c 49 4b 45 5f  t IS MATCH LIKE_
1cf0: 4b 57 20 42 45 54 57 45 45 4e 20 49 4e 20 49 53  KW BETWEEN IN IS
1d00: 4e 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 4e 45 20  NULL NOTNULL NE 
1d10: 45 51 2e 0a 25 6c 65 66 74 20 47 54 20 4c 45 20  EQ..%left GT LE 
1d20: 4c 54 20 47 45 2e 0a 25 72 69 67 68 74 20 45 53  LT GE..%right ES
1d30: 43 41 50 45 2e 0a 25 6c 65 66 74 20 42 49 54 41  CAPE..%left BITA
1d40: 4e 44 20 42 49 54 4f 52 20 4c 53 48 49 46 54 20  ND BITOR LSHIFT 
1d50: 52 53 48 49 46 54 2e 0a 25 6c 65 66 74 20 50 4c  RSHIFT..%left PL
1d60: 55 53 20 4d 49 4e 55 53 2e 0a 25 6c 65 66 74 20  US MINUS..%left 
1d70: 53 54 41 52 20 53 4c 41 53 48 20 52 45 4d 2e 0a  STAR SLASH REM..
1d80: 25 6c 65 66 74 20 43 4f 4e 43 41 54 2e 0a 25 6c  %left CONCAT..%l
1d90: 65 66 74 20 43 4f 4c 4c 41 54 45 2e 0a 25 72 69  eft COLLATE..%ri
1da0: 67 68 74 20 42 49 54 4e 4f 54 2e 0a 0a 2f 2f 20  ght BITNOT...// 
1db0: 41 6e 64 20 22 69 64 73 22 20 69 73 20 61 6e 20  And "ids" is an 
1dc0: 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d 73 74 72  identifer-or-str
1dd0: 69 6e 67 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64  ing..//.%type id
1de0: 73 20 7b 54 6f 6b 65 6e 7d 0a 69 64 73 28 41 29  s {Token}.ids(A)
1df0: 20 3a 3a 3d 20 49 44 7c 53 54 52 49 4e 47 28 58   ::= ID|STRING(X
1e00: 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f  ).   {A = X;}../
1e10: 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  / The name of a 
1e20: 63 6f 6c 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20  column or table 
1e30: 63 61 6e 20 62 65 20 61 6e 79 20 6f 66 20 74 68  can be any of th
1e40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a  e following:.//.
1e50: 25 74 79 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d  %type nm {Token}
1e60: 0a 6e 6d 28 41 29 20 3a 3a 3d 20 69 64 28 58 29  .nm(A) ::= id(X)
1e70: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
1e80: 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52  ;}.nm(A) ::= STR
1e90: 49 4e 47 28 58 29 2e 20 20 20 20 20 7b 41 20 3d  ING(X).     {A =
1ea0: 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a   X;}.nm(A) ::= J
1eb0: 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20 7b 41  OIN_KW(X).    {A
1ec0: 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 41 20 74 79 70   = X;}..// A typ
1ed0: 65 74 6f 6b 65 6e 20 69 73 20 72 65 61 6c 6c 79  etoken is really
1ee0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b   one or more tok
1ef0: 65 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 61 20  ens that form a 
1f00: 74 79 70 65 20 6e 61 6d 65 20 73 75 63 68 0a 2f  type name such./
1f10: 2f 20 61 73 20 63 61 6e 20 62 65 20 66 6f 75 6e  / as can be foun
1f20: 64 20 61 66 74 65 72 20 74 68 65 20 63 6f 6c 75  d after the colu
1f30: 6d 6e 20 6e 61 6d 65 20 69 6e 20 61 20 43 52 45  mn name in a CRE
1f40: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1f50: 65 6e 74 2e 0a 2f 2f 20 4d 75 6c 74 69 70 6c 65  ent..// Multiple
1f60: 20 74 6f 6b 65 6e 73 20 61 72 65 20 63 6f 6e 63   tokens are conc
1f70: 61 74 65 6e 61 74 65 64 20 74 6f 20 66 6f 72 6d  atenated to form
1f80: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1f90: 65 20 74 79 70 65 74 6f 6b 65 6e 2e 0a 2f 2f 0a  e typetoken..//.
1fa0: 25 74 79 70 65 20 74 79 70 65 74 6f 6b 65 6e 20  %type typetoken 
1fb0: 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 20 3a 3a 3d  {Token}.type ::=
1fc0: 20 2e 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65   ..type ::= type
1fd0: 74 6f 6b 65 6e 28 58 29 2e 20 20 20 20 20 20 20  token(X).       
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
1ff0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70  ite3AddColumnTyp
2000: 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 74  e(pParse,&X);}.t
2010: 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20  ypetoken(A) ::= 
2020: 74 79 70 65 6e 61 6d 65 28 58 29 2e 20 20 20 7b  typename(X).   {
2030: 41 20 3d 20 58 3b 7d 0a 74 79 70 65 74 6f 6b 65  A = X;}.typetoke
2040: 6e 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d  n(A) ::= typenam
2050: 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20 52  e(X) LP signed R
2060: 50 28 59 29 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20  P(Y). {.  A.z = 
2070: 58 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e  X.z;.  A.n = (in
2080: 74 29 28 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 58  t)(&Y.z[Y.n] - X
2090: 2e 7a 29 3b 0a 7d 0a 74 79 70 65 74 6f 6b 65 6e  .z);.}.typetoken
20a0: 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65  (A) ::= typename
20b0: 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f  (X) LP signed CO
20c0: 4d 4d 41 20 73 69 67 6e 65 64 20 52 50 28 59 29  MMA signed RP(Y)
20d0: 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e 7a 3b  . {.  A.z = X.z;
20e0: 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74 29 28 26  .  A.n = (int)(&
20f0: 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 58 2e 7a 29 3b  Y.z[Y.n] - X.z);
2100: 0a 7d 0a 25 74 79 70 65 20 74 79 70 65 6e 61 6d  .}.%type typenam
2110: 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61  e {Token}.typena
2120: 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73 28 58 29  me(A) ::= ids(X)
2130: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  .             {A
2140: 20 3d 20 58 3b 7d 0a 74 79 70 65 6e 61 6d 65 28   = X;}.typename(
2150: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
2160: 58 29 20 69 64 73 28 59 29 2e 20 7b 41 2e 7a 3d  X) ids(Y). {A.z=
2170: 58 2e 7a 3b 20 41 2e 6e 3d 59 2e 6e 2b 28 69 6e  X.z; A.n=Y.n+(in
2180: 74 29 28 59 2e 7a 2d 58 2e 7a 29 3b 7d 0a 73 69  t)(Y.z-X.z);}.si
2190: 67 6e 65 64 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75  gned ::= plus_nu
21a0: 6d 2e 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 6d 69  m..signed ::= mi
21b0: 6e 75 73 5f 6e 75 6d 2e 0a 0a 2f 2f 20 22 63 61  nus_num...// "ca
21c0: 72 67 6c 69 73 74 22 20 69 73 20 61 20 6c 69 73  rglist" is a lis
21d0: 74 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20  t of additional 
21e0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
21f0: 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 0a   come after the.
2200: 2f 2f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  // column name a
2210: 6e 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69  nd column type i
2220: 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  n a CREATE TABLE
2230: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 0a 63   statement..//.c
2240: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67  arglist ::= carg
2250: 6c 69 73 74 20 63 63 6f 6e 73 2e 0a 63 61 72 67  list ccons..carg
2260: 6c 69 73 74 20 3a 3a 3d 20 2e 0a 63 63 6f 6e 73  list ::= ..ccons
2270: 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20   ::= CONSTRAINT 
2280: 6e 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  nm(X).          
2290: 20 7b 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72   {pParse->constr
22a0: 61 69 6e 74 4e 61 6d 65 20 3d 20 58 3b 7d 0a 63  aintName = X;}.c
22b0: 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54  cons ::= DEFAULT
22c0: 20 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20   term(X).       
22d0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64       {sqlite3Add
22e0: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61  DefaultValue(pPa
22f0: 72 73 65 2c 26 58 29 3b 7d 0a 63 63 6f 6e 73 20  rse,&X);}.ccons 
2300: 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4c 50 20 65  ::= DEFAULT LP e
2310: 78 70 72 28 58 29 20 52 50 2e 20 20 20 20 20 20  xpr(X) RP.      
2320: 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75  {sqlite3AddDefau
2330: 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26  ltValue(pParse,&
2340: 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44  X);}.ccons ::= D
2350: 45 46 41 55 4c 54 20 50 4c 55 53 20 74 65 72 6d  EFAULT PLUS term
2360: 28 58 29 2e 20 20 20 20 20 20 20 7b 73 71 6c 69  (X).       {sqli
2370: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
2380: 75 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a  ue(pParse,&X);}.
2390: 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c  ccons ::= DEFAUL
23a0: 54 20 4d 49 4e 55 53 28 41 29 20 74 65 72 6d 28  T MINUS(A) term(
23b0: 58 29 2e 20 20 20 20 20 20 7b 0a 20 20 45 78 70  X).      {.  Exp
23c0: 72 53 70 61 6e 20 76 3b 0a 20 20 76 2e 70 45 78  rSpan v;.  v.pEx
23d0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
23e0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 4d 49  r(pParse, TK_UMI
23f0: 4e 55 53 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c  NUS, X.pExpr, 0,
2400: 20 30 29 3b 0a 20 20 76 2e 7a 53 74 61 72 74 20   0);.  v.zStart 
2410: 3d 20 41 2e 7a 3b 0a 20 20 76 2e 7a 45 6e 64 20  = A.z;.  v.zEnd 
2420: 3d 20 58 2e 7a 45 6e 64 3b 0a 20 20 73 71 6c 69  = X.zEnd;.  sqli
2430: 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c  te3AddDefaultVal
2440: 75 65 28 70 50 61 72 73 65 2c 26 76 29 3b 0a 7d  ue(pParse,&v);.}
2450: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55  .ccons ::= DEFAU
2460: 4c 54 20 69 64 28 58 29 2e 20 20 20 20 20 20 20  LT id(X).       
2470: 20 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72 53         {.  ExprS
2480: 70 61 6e 20 76 3b 0a 20 20 73 70 61 6e 45 78 70  pan v;.  spanExp
2490: 72 28 26 76 2c 20 70 50 61 72 73 65 2c 20 54 4b  r(&v, pParse, TK
24a0: 5f 53 54 52 49 4e 47 2c 20 26 58 29 3b 0a 20 20  _STRING, &X);.  
24b0: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c  sqlite3AddDefaul
24c0: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 76  tValue(pParse,&v
24d0: 29 3b 0a 7d 0a 0a 2f 2f 20 49 6e 20 61 64 64 69  );.}..// In addi
24e0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 79 70 65  tion to the type
24f0: 20 6e 61 6d 65 2c 20 77 65 20 61 6c 73 6f 20 63   name, we also c
2500: 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 70 72  are about the pr
2510: 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 0a 2f 2f  imary key and.//
2520: 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
2530: 6e 74 73 2e 0a 2f 2f 0a 63 63 6f 6e 73 20 3a 3a  nts..//.ccons ::
2540: 3d 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 2e 0a 63  = NULL onconf..c
2550: 63 6f 6e 73 20 3a 3a 3d 20 4e 4f 54 20 4e 55 4c  cons ::= NOT NUL
2560: 4c 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20  L onconf(R).    
2570: 7b 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75  {sqlite3AddNotNu
2580: 6c 6c 28 70 50 61 72 73 65 2c 20 52 29 3b 7d 0a  ll(pParse, R);}.
2590: 63 63 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52  ccons ::= PRIMAR
25a0: 59 20 4b 45 59 20 73 6f 72 74 6f 72 64 65 72 28  Y KEY sortorder(
25b0: 5a 29 20 6f 6e 63 6f 6e 66 28 52 29 20 61 75 74  Z) onconf(R) aut
25c0: 6f 69 6e 63 28 49 29 2e 0a 20 20 20 20 20 20 20  oinc(I)..       
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
25f0: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
2600: 70 50 61 72 73 65 2c 30 2c 52 2c 49 2c 5a 29 3b  pParse,0,R,I,Z);
2610: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51  }.ccons ::= UNIQ
2620: 55 45 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20  UE onconf(R).   
2630: 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74     {sqlite3Creat
2640: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c  eIndex(pParse,0,
2650: 30 2c 30 2c 30 2c 52 2c 30 2c 30 2c 30 2c 30 29  0,0,0,R,0,0,0,0)
2660: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 48 45  ;}.ccons ::= CHE
2670: 43 4b 20 4c 50 20 65 78 70 72 28 58 29 20 52 50  CK LP expr(X) RP
2680: 2e 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43  .   {sqlite3AddC
2690: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70  heckConstraint(p
26a0: 50 61 72 73 65 2c 58 2e 70 45 78 70 72 29 3b 7d  Parse,X.pExpr);}
26b0: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 52 45 46 45 52  .ccons ::= REFER
26c0: 45 4e 43 45 53 20 6e 6d 28 54 29 20 69 64 78 6c  ENCES nm(T) idxl
26d0: 69 73 74 5f 6f 70 74 28 54 41 29 20 72 65 66 61  ist_opt(TA) refa
26e0: 72 67 73 28 52 29 2e 0a 20 20 20 20 20 20 20 20  rgs(R)..        
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
2710: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
2720: 79 28 70 50 61 72 73 65 2c 30 2c 26 54 2c 54 41  y(pParse,0,&T,TA
2730: 2c 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,R);}.ccons ::= 
2740: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28  defer_subclause(
2750: 44 29 2e 20 20 20 20 7b 73 71 6c 69 74 65 33 44  D).    {sqlite3D
2760: 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 70  eferForeignKey(p
2770: 50 61 72 73 65 2c 44 29 3b 7d 0a 63 63 6f 6e 73  Parse,D);}.ccons
2780: 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20 69 64 73   ::= COLLATE ids
2790: 28 43 29 2e 20 20 20 20 20 20 20 20 7b 73 71 6c  (C).        {sql
27a0: 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79  ite3AddCollateTy
27b0: 70 65 28 70 50 61 72 73 65 2c 20 26 43 29 3b 7d  pe(pParse, &C);}
27c0: 0a 0a 2f 2f 20 54 68 65 20 6f 70 74 69 6f 6e 61  ..// The optiona
27d0: 6c 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20  l AUTOINCREMENT 
27e0: 6b 65 79 77 6f 72 64 0a 25 74 79 70 65 20 61 75  keyword.%type au
27f0: 74 6f 69 6e 63 20 7b 69 6e 74 7d 0a 61 75 74 6f  toinc {int}.auto
2800: 69 6e 63 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20  inc(X) ::= .    
2810: 20 20 20 20 20 20 7b 58 20 3d 20 30 3b 7d 0a 61        {X = 0;}.a
2820: 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 41 55  utoinc(X) ::= AU
2830: 54 4f 49 4e 43 52 2e 20 20 7b 58 20 3d 20 31 3b  TOINCR.  {X = 1;
2840: 7d 0a 0a 2f 2f 20 54 68 65 20 6e 65 78 74 20 67  }..// The next g
2850: 72 6f 75 70 20 6f 66 20 72 75 6c 65 73 20 70 61  roup of rules pa
2860: 72 73 65 73 20 74 68 65 20 61 72 67 75 6d 65 6e  rses the argumen
2870: 74 73 20 74 6f 20 61 20 52 45 46 45 52 45 4e 43  ts to a REFERENC
2880: 45 53 20 63 6c 61 75 73 65 0a 2f 2f 20 74 68 61  ES clause.// tha
2890: 74 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  t determine if t
28a0: 68 65 20 72 65 66 65 72 65 6e 74 69 61 6c 20 69  he referential i
28b0: 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e  ntegrity checkin
28c0: 67 20 69 73 20 64 65 66 65 72 72 65 64 20 6f 72  g is deferred or
28d0: 0a 2f 2f 20 6f 72 20 69 6d 6d 65 64 69 61 74 65  .// or immediate
28e0: 20 61 6e 64 20 77 68 69 63 68 20 64 65 74 65 72   and which deter
28f0: 6d 69 6e 65 20 77 68 61 74 20 61 63 74 69 6f 6e  mine what action
2900: 20 74 6f 20 74 61 6b 65 20 69 66 20 61 20 72 65   to take if a re
2910: 66 2d 69 6e 74 65 67 0a 2f 2f 20 63 68 65 63 6b  f-integ.// check
2920: 20 66 61 69 6c 73 2e 0a 2f 2f 0a 25 74 79 70 65   fails..//.%type
2930: 20 72 65 66 61 72 67 73 20 7b 69 6e 74 7d 0a 72   refargs {int}.r
2940: 65 66 61 72 67 73 28 41 29 20 3a 3a 3d 20 2e 20  efargs(A) ::= . 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65 2a 30   { A = OE_None*0
2970: 78 30 31 30 31 3b 20 2f 2a 20 45 56 3a 20 52 2d  x0101; /* EV: R-
2980: 31 39 38 30 33 2d 34 35 38 38 34 20 2a 2f 7d 0a  19803-45884 */}.
2990: 72 65 66 61 72 67 73 28 41 29 20 3a 3a 3d 20 72  refargs(A) ::= r
29a0: 65 66 61 72 67 73 28 58 29 20 72 65 66 61 72 67  efargs(X) refarg
29b0: 28 59 29 2e 20 7b 20 41 20 3d 20 28 58 20 26 20  (Y). { A = (X & 
29c0: 7e 59 2e 6d 61 73 6b 29 20 7c 20 59 2e 76 61 6c  ~Y.mask) | Y.val
29d0: 75 65 3b 20 7d 0a 25 74 79 70 65 20 72 65 66 61  ue; }.%type refa
29e0: 72 67 20 7b 73 74 72 75 63 74 20 7b 69 6e 74 20  rg {struct {int 
29f0: 76 61 6c 75 65 3b 20 69 6e 74 20 6d 61 73 6b 3b  value; int mask;
2a00: 7d 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d  }}.refarg(A) ::=
2a10: 20 4d 41 54 43 48 20 6e 6d 2e 20 20 20 20 20 20   MATCH nm.      
2a20: 20 20 20 20 20 20 20 20 7b 20 41 2e 76 61 6c 75          { A.valu
2a30: 65 20 3d 20 30 3b 20 20 20 20 20 41 2e 6d 61 73  e = 0;     A.mas
2a40: 6b 20 3d 20 30 78 30 30 30 30 30 30 3b 20 7d 0a  k = 0x000000; }.
2a50: 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e  refarg(A) ::= ON
2a60: 20 49 4e 53 45 52 54 20 72 65 66 61 63 74 2e 20   INSERT refact. 
2a70: 20 20 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d       { A.value =
2a80: 20 30 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d   0;     A.mask =
2a90: 20 30 78 30 30 30 30 30 30 3b 20 7d 0a 72 65 66   0x000000; }.ref
2aa0: 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 44 45  arg(A) ::= ON DE
2ab0: 4c 45 54 45 20 72 65 66 61 63 74 28 58 29 2e 20  LETE refact(X). 
2ac0: 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58 3b    { A.value = X;
2ad0: 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78       A.mask = 0x
2ae0: 30 30 30 30 66 66 3b 20 7d 0a 72 65 66 61 72 67  0000ff; }.refarg
2af0: 28 41 29 20 3a 3a 3d 20 4f 4e 20 55 50 44 41 54  (A) ::= ON UPDAT
2b00: 45 20 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b  E refact(X).   {
2b10: 20 41 2e 76 61 6c 75 65 20 3d 20 58 3c 3c 38 3b   A.value = X<<8;
2b20: 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 66    A.mask = 0x00f
2b30: 66 30 30 3b 20 7d 0a 25 74 79 70 65 20 72 65 66  f00; }.%type ref
2b40: 61 63 74 20 7b 69 6e 74 7d 0a 72 65 66 61 63 74  act {int}.refact
2b50: 28 41 29 20 3a 3a 3d 20 53 45 54 20 4e 55 4c 4c  (A) ::= SET NULL
2b60: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
2b70: 20 41 20 3d 20 4f 45 5f 53 65 74 4e 75 6c 6c 3b   A = OE_SetNull;
2b80: 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36    /* EV: R-33326
2b90: 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63  -45252 */}.refac
2ba0: 74 28 41 29 20 3a 3a 3d 20 53 45 54 20 44 45 46  t(A) ::= SET DEF
2bb0: 41 55 4c 54 2e 20 20 20 20 20 20 20 20 20 20 20  AULT.           
2bc0: 7b 20 41 20 3d 20 4f 45 5f 53 65 74 44 66 6c 74  { A = OE_SetDflt
2bd0: 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32  ;  /* EV: R-3332
2be0: 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61  6-45252 */}.refa
2bf0: 63 74 28 41 29 20 3a 3a 3d 20 43 41 53 43 41 44  ct(A) ::= CASCAD
2c00: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
2c10: 20 7b 20 41 20 3d 20 4f 45 5f 43 61 73 63 61 64   { A = OE_Cascad
2c20: 65 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33  e;  /* EV: R-333
2c30: 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66  26-45252 */}.ref
2c40: 61 63 74 28 41 29 20 3a 3a 3d 20 52 45 53 54 52  act(A) ::= RESTR
2c50: 49 43 54 2e 20 20 20 20 20 20 20 20 20 20 20 20  ICT.            
2c60: 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65 73 74 72    { A = OE_Restr
2c70: 69 63 74 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 33  ict; /* EV: R-33
2c80: 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65  326-45252 */}.re
2c90: 66 61 63 74 28 41 29 20 3a 3a 3d 20 4e 4f 20 41  fact(A) ::= NO A
2ca0: 43 54 49 4f 4e 2e 20 20 20 20 20 20 20 20 20 20  CTION.          
2cb0: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65     { A = OE_None
2cc0: 3b 20 20 20 20 20 2f 2a 20 45 56 3a 20 52 2d 33  ;     /* EV: R-3
2cd0: 33 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 25  3326-45252 */}.%
2ce0: 74 79 70 65 20 64 65 66 65 72 5f 73 75 62 63 6c  type defer_subcl
2cf0: 61 75 73 65 20 7b 69 6e 74 7d 0a 64 65 66 65 72  ause {int}.defer
2d00: 5f 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a  _subclause(A) ::
2d10: 3d 20 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45  = NOT DEFERRABLE
2d20: 20 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70   init_deferred_p
2d30: 72 65 64 5f 6f 70 74 2e 20 20 20 20 20 7b 41 20  red_opt.     {A 
2d40: 3d 20 30 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63  = 0;}.defer_subc
2d50: 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 44 45 46  lause(A) ::= DEF
2d60: 45 52 52 41 42 4c 45 20 69 6e 69 74 5f 64 65 66  ERRABLE init_def
2d70: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 58  erred_pred_opt(X
2d80: 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  ).      {A = X;}
2d90: 0a 25 74 79 70 65 20 69 6e 69 74 5f 64 65 66 65  .%type init_defe
2da0: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 20 7b 69  rred_pred_opt {i
2db0: 6e 74 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65  nt}.init_deferre
2dc0: 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a  d_pred_opt(A) ::
2dd0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
2de0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
2df0: 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64  ;}.init_deferred
2e00: 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d  _pred_opt(A) ::=
2e10: 20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52   INITIALLY DEFER
2e20: 52 45 44 2e 20 20 20 20 20 7b 41 20 3d 20 31 3b  RED.     {A = 1;
2e30: 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f  }.init_deferred_
2e40: 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  pred_opt(A) ::= 
2e50: 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49  INITIALLY IMMEDI
2e60: 41 54 45 2e 20 20 20 20 7b 41 20 3d 20 30 3b 7d  ATE.    {A = 0;}
2e70: 0a 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41  ..conslist_opt(A
2e80: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 7b 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20  {A.n = 0; A.z = 
2eb0: 30 3b 7d 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74  0;}.conslist_opt
2ec0: 28 41 29 20 3a 3a 3d 20 43 4f 4d 4d 41 28 58 29  (A) ::= COMMA(X)
2ed0: 20 63 6f 6e 73 6c 69 73 74 2e 20 20 20 20 20 20   conslist.      
2ee0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 63 6f 6e 73 6c    {A = X;}.consl
2ef0: 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74  ist ::= conslist
2f00: 20 74 63 6f 6e 73 63 6f 6d 6d 61 20 74 63 6f 6e   tconscomma tcon
2f10: 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20  s..conslist ::= 
2f20: 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73 63 6f 6d 6d  tcons..tconscomm
2f30: 61 20 3a 3a 3d 20 43 4f 4d 4d 41 2e 20 20 20 20  a ::= COMMA.    
2f40: 20 20 20 20 20 20 20 20 7b 70 50 61 72 73 65 2d          {pParse-
2f50: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
2f60: 6e 20 3d 20 30 3b 7d 0a 74 63 6f 6e 73 63 6f 6d  n = 0;}.tconscom
2f70: 6d 61 20 3a 3a 3d 20 2e 0a 74 63 6f 6e 73 20 3a  ma ::= ..tcons :
2f80: 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d  := CONSTRAINT nm
2f90: 28 58 29 2e 20 20 20 20 20 20 7b 70 50 61 72 73  (X).      {pPars
2fa0: 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d  e->constraintNam
2fb0: 65 20 3d 20 58 3b 7d 0a 74 63 6f 6e 73 20 3a 3a  e = X;}.tcons ::
2fc0: 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4c 50  = PRIMARY KEY LP
2fd0: 20 69 64 78 6c 69 73 74 28 58 29 20 61 75 74 6f   idxlist(X) auto
2fe0: 69 6e 63 28 49 29 20 52 50 20 6f 6e 63 6f 6e 66  inc(I) RP onconf
2ff0: 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (R)..           
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
3020: 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72  dPrimaryKey(pPar
3030: 73 65 2c 58 2c 52 2c 49 2c 30 29 3b 7d 0a 74 63  se,X,R,I,0);}.tc
3040: 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 4c  ons ::= UNIQUE L
3050: 50 20 69 64 78 6c 69 73 74 28 58 29 20 52 50 20  P idxlist(X) RP 
3060: 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20  onconf(R)..     
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
3090: 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28  ite3CreateIndex(
30a0: 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 58 2c 52  pParse,0,0,0,X,R
30b0: 2c 30 2c 30 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e  ,0,0,0,0);}.tcon
30c0: 73 20 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65  s ::= CHECK LP e
30d0: 78 70 72 28 45 29 20 52 50 20 6f 6e 63 6f 6e 66  xpr(E) RP onconf
30e0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3100: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43 68     {sqlite3AddCh
3110: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  eckConstraint(pP
3120: 61 72 73 65 2c 45 2e 70 45 78 70 72 29 3b 7d 0a  arse,E.pExpr);}.
3130: 74 63 6f 6e 73 20 3a 3a 3d 20 46 4f 52 45 49 47  tcons ::= FOREIG
3140: 4e 20 4b 45 59 20 4c 50 20 69 64 78 6c 69 73 74  N KEY LP idxlist
3150: 28 46 41 29 20 52 50 0a 20 20 20 20 20 20 20 20  (FA) RP.        
3160: 20 20 52 45 46 45 52 45 4e 43 45 53 20 6e 6d 28    REFERENCES nm(
3170: 54 29 20 69 64 78 6c 69 73 74 5f 6f 70 74 28 54  T) idxlist_opt(T
3180: 41 29 20 72 65 66 61 72 67 73 28 52 29 20 64 65  A) refargs(R) de
3190: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70  fer_subclause_op
31a0: 74 28 44 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69  t(D). {.    sqli
31b0: 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
31c0: 4b 65 79 28 70 50 61 72 73 65 2c 20 46 41 2c 20  Key(pParse, FA, 
31d0: 26 54 2c 20 54 41 2c 20 52 29 3b 0a 20 20 20 20  &T, TA, R);.    
31e0: 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
31f0: 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 20 44  ignKey(pParse, D
3200: 29 3b 0a 7d 0a 25 74 79 70 65 20 64 65 66 65 72  );.}.%type defer
3210: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 20 7b  _subclause_opt {
3220: 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c  int}.defer_subcl
3230: 61 75 73 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  ause_opt(A) ::= 
3240: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3250: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 65       {A = 0;}.de
3260: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70  fer_subclause_op
3270: 74 28 41 29 20 3a 3a 3d 20 64 65 66 65 72 5f 73  t(A) ::= defer_s
3280: 75 62 63 6c 61 75 73 65 28 58 29 2e 20 20 7b 41  ubclause(X).  {A
3290: 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66   = X;}..// The f
32a0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f  ollowing is a no
32b0: 6e 2d 73 74 61 6e 64 61 72 64 20 65 78 74 65 6e  n-standard exten
32c0: 73 69 6f 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73  sion that allows
32d0: 20 75 73 20 74 6f 20 64 65 63 6c 61 72 65 20 74   us to declare t
32e0: 68 65 0a 2f 2f 20 64 65 66 61 75 6c 74 20 62 65  he.// default be
32f0: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 72  havior when ther
3300: 65 20 69 73 20 61 20 63 6f 6e 73 74 72 61 69 6e  e is a constrain
3310: 74 20 63 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25  t conflict..//.%
3320: 74 79 70 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74  type onconf {int
3330: 7d 0a 25 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b  }.%type orconf {
3340: 75 38 7d 0a 25 74 79 70 65 20 72 65 73 6f 6c 76  u8}.%type resolv
3350: 65 74 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f  etype {int}.onco
3360: 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  nf(A) ::= .     
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
3390: 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e  _Default;}.oncon
33a0: 66 28 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46  f(A) ::= ON CONF
33b0: 4c 49 43 54 20 72 65 73 6f 6c 76 65 74 79 70 65  LICT resolvetype
33c0: 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d  (X).    {A = X;}
33d0: 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e  .orconf(A) ::= .
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
3400: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a   = OE_Default;}.
3410: 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 52  orconf(A) ::= OR
3420: 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e   resolvetype(X).
3430: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
3440: 3d 20 28 75 38 29 58 3b 7d 0a 72 65 73 6f 6c 76  = (u8)X;}.resolv
3450: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 72 61 69  etype(A) ::= rai
3460: 73 65 74 79 70 65 28 58 29 2e 20 20 20 20 20 20  setype(X).      
3470: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
3480: 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a  resolvetype(A) :
3490: 3a 3d 20 49 47 4e 4f 52 45 2e 20 20 20 20 20 20  := IGNORE.      
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
34b0: 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 7d 0a 72 65  = OE_Ignore;}.re
34c0: 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d  solvetype(A) ::=
34d0: 20 52 45 50 4c 41 43 45 2e 20 20 20 20 20 20 20   REPLACE.       
34e0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
34f0: 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 2f 2f  OE_Replace;}..//
3500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3510: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f  //////// The DRO
3520: 50 20 54 41 42 4c 45 20 2f 2f 2f 2f 2f 2f 2f 2f  P TABLE ////////
3530: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
3550: 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 41  .cmd ::= DROP TA
3560: 42 4c 45 20 69 66 65 78 69 73 74 73 28 45 29 20  BLE ifexists(E) 
3570: 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20  fullname(X). {. 
3580: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
3590: 65 28 70 50 61 72 73 65 2c 20 58 2c 20 30 2c 20  e(pParse, X, 0, 
35a0: 45 29 3b 0a 7d 0a 25 74 79 70 65 20 69 66 65 78  E);.}.%type ifex
35b0: 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66 65 78 69  ists {int}.ifexi
35c0: 73 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 45 58  sts(A) ::= IF EX
35d0: 49 53 54 53 2e 20 20 20 7b 41 20 3d 20 31 3b 7d  ISTS.   {A = 1;}
35e0: 0a 69 66 65 78 69 73 74 73 28 41 29 20 3a 3a 3d  .ifexists(A) ::=
35f0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 41   .            {A
3600: 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f   = 0;}..////////
3610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
3620: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
3630: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
3640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3650: 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66  /////.//.%ifndef
3660: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
3670: 57 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65  W.cmd ::= create
3680: 6b 77 28 58 29 20 74 65 6d 70 28 54 29 20 56 49  kw(X) temp(T) VI
3690: 45 57 20 69 66 6e 6f 74 65 78 69 73 74 73 28 45  EW ifnotexists(E
36a0: 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 20  ) nm(Y) dbnm(Z) 
36b0: 41 53 20 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a  AS select(S). {.
36c0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56    sqlite3CreateV
36d0: 69 65 77 28 70 50 61 72 73 65 2c 20 26 58 2c 20  iew(pParse, &X, 
36e0: 26 59 2c 20 26 5a 2c 20 53 2c 20 54 2c 20 45 29  &Y, &Z, S, T, E)
36f0: 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50  ;.}.cmd ::= DROP
3700: 20 56 49 45 57 20 69 66 65 78 69 73 74 73 28 45   VIEW ifexists(E
3710: 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b  ) fullname(X). {
3720: 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61  .  sqlite3DropTa
3730: 62 6c 65 28 70 50 61 72 73 65 2c 20 58 2c 20 31  ble(pParse, X, 1
3740: 2c 20 45 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20  , E);.}.%endif  
3750: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
3760: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
3770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53  ////////// The S
3780: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
37a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
37b0: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c  /.//.cmd ::= sel
37c0: 65 63 74 28 58 29 2e 20 20 7b 0a 20 20 53 65 6c  ect(X).  {.  Sel
37d0: 65 63 74 44 65 73 74 20 64 65 73 74 20 3d 20 7b  ectDest dest = {
37e0: 53 52 54 5f 4f 75 74 70 75 74 2c 20 30 2c 20 30  SRT_Output, 0, 0
37f0: 2c 20 30 2c 20 30 7d 3b 0a 20 20 73 71 6c 69 74  , 0, 0};.  sqlit
3800: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
3810: 20 58 2c 20 26 64 65 73 74 29 3b 0a 20 20 73 71   X, &dest);.  sq
3820: 6c 69 74 65 33 45 78 70 6c 61 69 6e 42 65 67 69  lite3ExplainBegi
3830: 6e 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29  n(pParse->pVdbe)
3840: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61  ;.  sqlite3Expla
3850: 69 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65 2d  inSelect(pParse-
3860: 3e 70 56 64 62 65 2c 20 58 29 3b 0a 20 20 73 71  >pVdbe, X);.  sq
3870: 6c 69 74 65 33 45 78 70 6c 61 69 6e 46 69 6e 69  lite3ExplainFini
3880: 73 68 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65  sh(pParse->pVdbe
3890: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
38a0: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
38b0: 3e 64 62 2c 20 58 29 3b 0a 7d 0a 0a 25 74 79 70  >db, X);.}..%typ
38c0: 65 20 73 65 6c 65 63 74 20 7b 53 65 6c 65 63 74  e select {Select
38d0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
38e0: 65 6c 65 63 74 20 7b 73 71 6c 69 74 65 33 53 65  elect {sqlite3Se
38f0: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
3900: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79  e->db, $$);}.%ty
3910: 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65  pe oneselect {Se
3920: 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  lect*}.%destruct
3930: 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71  or oneselect {sq
3940: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3950: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
3960: 29 3b 7d 0a 0a 73 65 6c 65 63 74 28 41 29 20 3a  );}..select(A) :
3970: 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28 58 29 2e  := oneselect(X).
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 25        {A = X;}.%
39a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
39b0: 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  IT_COMPOUND_SELE
39c0: 43 54 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d  CT.select(A) ::=
39d0: 20 73 65 6c 65 63 74 28 58 29 20 6d 75 6c 74 69   select(X) multi
39e0: 73 65 6c 65 63 74 5f 6f 70 28 59 29 20 6f 6e 65  select_op(Y) one
39f0: 73 65 6c 65 63 74 28 5a 29 2e 20 20 7b 0a 20 20  select(Z).  {.  
3a00: 69 66 28 20 5a 20 29 7b 0a 20 20 20 20 5a 2d 3e  if( Z ){.    Z->
3a10: 6f 70 20 3d 20 28 75 38 29 59 3b 0a 20 20 20 20  op = (u8)Y;.    
3a20: 5a 2d 3e 70 50 72 69 6f 72 20 3d 20 58 3b 0a 20  Z->pPrior = X;. 
3a30: 20 20 20 69 66 28 20 59 21 3d 54 4b 5f 41 4c 4c     if( Y!=TK_ALL
3a40: 20 29 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f   ) pParse->hasCo
3a50: 6d 70 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 7d 65  mpound = 1;.  }e
3a60: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
3a70: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61  SelectDelete(pPa
3a80: 72 73 65 2d 3e 64 62 2c 20 58 29 3b 0a 20 20 7d  rse->db, X);.  }
3a90: 0a 20 20 41 20 3d 20 5a 3b 0a 7d 0a 25 74 79 70  .  A = Z;.}.%typ
3aa0: 65 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70  e multiselect_op
3ab0: 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65   {int}.multisele
3ac0: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49  ct_op(A) ::= UNI
3ad0: 4f 4e 28 4f 50 29 2e 20 20 20 20 20 20 20 20 20  ON(OP).         
3ae0: 20 20 20 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a 6d      {A = @OP;}.m
3af0: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29  ultiselect_op(A)
3b00: 20 3a 3a 3d 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20   ::= UNION ALL. 
3b10: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3b20: 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73   TK_ALL;}.multis
3b30: 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20  elect_op(A) ::= 
3b40: 45 58 43 45 50 54 7c 49 4e 54 45 52 53 45 43 54  EXCEPT|INTERSECT
3b50: 28 4f 50 29 2e 20 20 7b 41 20 3d 20 40 4f 50 3b  (OP).  {A = @OP;
3b60: 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f  }.%endif SQLITE_
3b70: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
3b80: 4c 45 43 54 0a 6f 6e 65 73 65 6c 65 63 74 28 41  LECT.oneselect(A
3b90: 29 20 3a 3a 3d 20 53 45 4c 45 43 54 20 64 69 73  ) ::= SELECT dis
3ba0: 74 69 6e 63 74 28 44 29 20 73 65 6c 63 6f 6c 6c  tinct(D) selcoll
3bb0: 69 73 74 28 57 29 20 66 72 6f 6d 28 58 29 20 77  ist(W) from(X) w
3bc0: 68 65 72 65 5f 6f 70 74 28 59 29 0a 20 20 20 20  here_opt(Y).    
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 72 6f               gro
3be0: 75 70 62 79 5f 6f 70 74 28 50 29 20 68 61 76 69  upby_opt(P) havi
3bf0: 6e 67 5f 6f 70 74 28 51 29 20 6f 72 64 65 72 62  ng_opt(Q) orderb
3c00: 79 5f 6f 70 74 28 5a 29 20 6c 69 6d 69 74 5f 6f  y_opt(Z) limit_o
3c10: 70 74 28 4c 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pt(L). {.  A = s
3c20: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
3c30: 70 50 61 72 73 65 2c 57 2c 58 2c 59 2c 50 2c 51  pParse,W,X,Y,P,Q
3c40: 2c 5a 2c 44 2c 4c 2e 70 4c 69 6d 69 74 2c 4c 2e  ,Z,D,L.pLimit,L.
3c50: 70 4f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2f 20  pOffset);.}..// 
3c60: 54 68 65 20 22 64 69 73 74 69 6e 63 74 22 20 6e  The "distinct" n
3c70: 6f 6e 74 65 72 6d 69 6e 61 6c 20 69 73 20 74 72  onterminal is tr
3c80: 75 65 20 28 31 29 20 69 66 20 74 68 65 20 44 49  ue (1) if the DI
3c90: 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69  STINCT keyword i
3ca0: 73 0a 2f 2f 20 70 72 65 73 65 6e 74 20 61 6e 64  s.// present and
3cb0: 20 66 61 6c 73 65 20 28 30 29 20 69 66 20 69 74   false (0) if it
3cc0: 20 69 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70   is not..//.%typ
3cd0: 65 20 64 69 73 74 69 6e 63 74 20 7b 75 31 36 7d  e distinct {u16}
3ce0: 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d  .distinct(A) ::=
3cf0: 20 44 49 53 54 49 4e 43 54 2e 20 20 20 7b 41 20   DISTINCT.   {A 
3d00: 3d 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 7d 0a  = SF_Distinct;}.
3d10: 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20  distinct(A) ::= 
3d20: 41 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41 20 3d  ALL.        {A =
3d30: 20 30 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41 29   0;}.distinct(A)
3d40: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
3d50: 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73 65   {A = 0;}..// se
3d60: 6c 63 6f 6c 6c 69 73 74 20 69 73 20 61 20 6c 69  lcollist is a li
3d70: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
3d80: 73 20 74 68 61 74 20 61 72 65 20 74 6f 20 62 65  s that are to be
3d90: 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 0a  come the return.
3da0: 2f 2f 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65  // values of the
3db0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
3dc0: 74 2e 20 20 54 68 65 20 22 2a 22 20 69 6e 20 73  t.  The "*" in s
3dd0: 74 61 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 2f  tatements like./
3de0: 2f 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  / "SELECT * FROM
3df0: 20 2e 2e 2e 22 20 69 73 20 65 6e 63 6f 64 65 64   ..." is encoded
3e00: 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 65 78   as a special ex
3e10: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 20 61 6e  pression with an
3e20: 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f 66 20 54 4b  .// opcode of TK
3e30: 5f 41 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65 20 73  _ALL..//.%type s
3e40: 65 6c 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72 4c  elcollist {ExprL
3e50: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
3e60: 72 20 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73 71  r selcollist {sq
3e70: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
3e80: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
3e90: 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70  $$);}.%type sclp
3ea0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
3eb0: 73 74 72 75 63 74 6f 72 20 73 63 6c 70 20 7b 73  structor sclp {s
3ec0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
3ed0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
3ee0: 20 24 24 29 3b 7d 0a 73 63 6c 70 28 41 29 20 3a   $$);}.sclp(A) :
3ef0: 3a 3d 20 73 65 6c 63 6f 6c 6c 69 73 74 28 58 29  := selcollist(X)
3f00: 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20 20   COMMA.         
3f10: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 63 6c      {A = X;}.scl
3f20: 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  p(A) ::= .      
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
3f50: 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29  ;}.selcollist(A)
3f60: 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20 65 78 70   ::= sclp(P) exp
3f70: 72 28 58 29 20 61 73 28 59 29 2e 20 20 20 20 20  r(X) as(Y).     
3f80: 7b 0a 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33  {.   A = sqlite3
3f90: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
3fa0: 50 61 72 73 65 2c 20 50 2c 20 58 2e 70 45 78 70  Parse, P, X.pExp
3fb0: 72 29 3b 0a 20 20 20 69 66 28 20 59 2e 6e 3e 30  r);.   if( Y.n>0
3fc0: 20 29 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ) sqlite3ExprLi
3fd0: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
3fe0: 2c 20 41 2c 20 26 59 2c 20 31 29 3b 0a 20 20 20  , A, &Y, 1);.   
3ff0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
4000: 65 74 53 70 61 6e 28 70 50 61 72 73 65 2c 41 2c  etSpan(pParse,A,
4010: 26 58 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73  &X);.}.selcollis
4020: 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29  t(A) ::= sclp(P)
4030: 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70 72 20   STAR. {.  Expr 
4040: 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
4050: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f  (pParse->db, TK_
4060: 41 4c 4c 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73  ALL, 0);.  A = s
4070: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
4080: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 50 2c 20  pend(pParse, P, 
4090: 70 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74  p);.}.selcollist
40a0: 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20  (A) ::= sclp(P) 
40b0: 6e 6d 28 58 29 20 44 4f 54 20 53 54 41 52 28 59  nm(X) DOT STAR(Y
40c0: 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 70 52 69  ). {.  Expr *pRi
40d0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78  ght = sqlite3PEx
40e0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4c  pr(pParse, TK_AL
40f0: 4c 2c 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20  L, 0, 0, &Y);.  
4100: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71  Expr *pLeft = sq
4110: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
4120: 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  e, TK_ID, 0, 0, 
4130: 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 70 44 6f  &X);.  Expr *pDo
4140: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
4150: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
4160: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
4170: 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  0);.  A = sqlite
4180: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
4190: 70 50 61 72 73 65 2c 50 2c 20 70 44 6f 74 29 3b  pParse,P, pDot);
41a0: 0a 7d 0a 0a 2f 2f 20 41 6e 20 6f 70 74 69 6f 6e  .}..// An option
41b0: 20 22 41 53 20 3c 69 64 3e 22 20 70 68 72 61 73   "AS <id>" phras
41c0: 65 20 74 68 61 74 20 63 61 6e 20 66 6f 6c 6c 6f  e that can follo
41d0: 77 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 70  w one of the exp
41e0: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 0a 2f 2f  ressions that.//
41f0: 20 64 65 66 69 6e 65 20 74 68 65 20 72 65 73 75   define the resu
4200: 6c 74 20 73 65 74 2c 20 6f 72 20 6f 6e 65 20 6f  lt set, or one o
4210: 66 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20  f the tables in 
4220: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
4230: 0a 2f 2f 0a 25 74 79 70 65 20 61 73 20 7b 54 6f  .//.%type as {To
4240: 6b 65 6e 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 41  ken}.as(X) ::= A
4250: 53 20 6e 6d 28 59 29 2e 20 20 20 20 7b 58 20 3d  S nm(Y).    {X =
4260: 20 59 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 69   Y;}.as(X) ::= i
4270: 64 73 28 59 29 2e 20 20 20 20 20 20 7b 58 20 3d  ds(Y).      {X =
4280: 20 59 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 2e   Y;}.as(X) ::= .
4290: 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 2e 6e              {X.n
42a0: 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 73   = 0;}...%type s
42b0: 65 6c 74 61 62 6c 69 73 74 20 7b 53 72 63 4c 69  eltablist {SrcLi
42c0: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
42d0: 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 73 71 6c   seltablist {sql
42e0: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
42f0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
4300: 29 3b 7d 0a 25 74 79 70 65 20 73 74 6c 5f 70 72  );}.%type stl_pr
4310: 65 66 69 78 20 7b 53 72 63 4c 69 73 74 2a 7d 0a  efix {SrcList*}.
4320: 25 64 65 73 74 72 75 63 74 6f 72 20 73 74 6c 5f  %destructor stl_
4330: 70 72 65 66 69 78 20 7b 73 71 6c 69 74 65 33 53  prefix {sqlite3S
4340: 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  rcListDelete(pPa
4350: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
4360: 74 79 70 65 20 66 72 6f 6d 20 7b 53 72 63 4c 69  type from {SrcLi
4370: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
4380: 20 66 72 6f 6d 20 7b 73 71 6c 69 74 65 33 53 72   from {sqlite3Sr
4390: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  cListDelete(pPar
43a0: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 2f  se->db, $$);}../
43b0: 2f 20 41 20 63 6f 6d 70 6c 65 74 65 20 46 52 4f  / A complete FRO
43c0: 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 66 72 6f  M clause..//.fro
43d0: 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  m(A) ::= .      
43e0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73            {A = s
43f0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
4400: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
4410: 69 7a 65 6f 66 28 2a 41 29 29 3b 7d 0a 66 72 6f  izeof(*A));}.fro
4420: 6d 28 41 29 20 3a 3a 3d 20 46 52 4f 4d 20 73 65  m(A) ::= FROM se
4430: 6c 74 61 62 6c 69 73 74 28 58 29 2e 20 7b 0a 20  ltablist(X). {. 
4440: 20 41 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65   A = X;.  sqlite
4450: 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69  3SrcListShiftJoi
4460: 6e 54 79 70 65 28 41 29 3b 0a 7d 0a 0a 2f 2f 20  nType(A);.}..// 
4470: 22 73 65 6c 74 61 62 6c 69 73 74 22 20 69 73 20  "seltablist" is 
4480: 61 20 22 53 65 6c 65 63 74 20 54 61 62 6c 65 20  a "Select Table 
4490: 4c 69 73 74 22 20 2d 20 74 68 65 20 63 6f 6e 74  List" - the cont
44a0: 65 6e 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  ent of the FROM 
44b0: 63 6c 61 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53  clause.// in a S
44c0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
44d0: 20 20 22 73 74 6c 5f 70 72 65 66 69 78 22 20 69    "stl_prefix" i
44e0: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
44f0: 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f  is list..//.stl_
4500: 70 72 65 66 69 78 28 41 29 20 3a 3a 3d 20 73 65  prefix(A) ::= se
4510: 6c 74 61 62 6c 69 73 74 28 58 29 20 6a 6f 69 6e  ltablist(X) join
4520: 6f 70 28 59 29 2e 20 20 20 20 7b 0a 20 20 20 41  op(Y).    {.   A
4530: 20 3d 20 58 3b 0a 20 20 20 69 66 28 20 41 4c 57   = X;.   if( ALW
4540: 41 59 53 28 41 20 26 26 20 41 2d 3e 6e 53 72 63  AYS(A && A->nSrc
4550: 3e 30 29 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 53  >0) ) A->a[A->nS
4560: 72 63 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d  rc-1].jointype =
4570: 20 28 75 38 29 59 3b 0a 7d 0a 73 74 6c 5f 70 72   (u8)Y;.}.stl_pr
4580: 65 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20  efix(A) ::= .   
4590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45a0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
45b0: 0a 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a  .seltablist(A) :
45c0: 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29  := stl_prefix(X)
45d0: 20 6e 6d 28 59 29 20 64 62 6e 6d 28 44 29 20 61   nm(Y) dbnm(D) a
45e0: 73 28 5a 29 20 69 6e 64 65 78 65 64 5f 6f 70 74  s(Z) indexed_opt
45f0: 28 49 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (I).            
4600: 20 20 20 20 20 20 6f 6e 5f 6f 70 74 28 4e 29 20        on_opt(N) 
4610: 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a  using_opt(U). {.
4620: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63    A = sqlite3Src
4630: 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65  ListAppendFromTe
4640: 72 6d 28 70 50 61 72 73 65 2c 58 2c 26 59 2c 26  rm(pParse,X,&Y,&
4650: 44 2c 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20 73  D,&Z,0,N,U);.  s
4660: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
4670: 65 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 41  exedBy(pParse, A
4680: 2c 20 26 49 29 3b 0a 7d 0a 25 69 66 6e 64 65 66  , &I);.}.%ifndef
4690: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
46a0: 51 55 45 52 59 0a 20 20 73 65 6c 74 61 62 6c 69  QUERY.  seltabli
46b0: 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72  st(A) ::= stl_pr
46c0: 65 66 69 78 28 58 29 20 4c 50 20 73 65 6c 65 63  efix(X) LP selec
46d0: 74 28 53 29 20 52 50 0a 20 20 20 20 20 20 20 20  t(S) RP.        
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 28 5a              as(Z
46f0: 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e  ) on_opt(N) usin
4700: 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 20 20  g_opt(U). {.    
4710: 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  A = sqlite3SrcLi
4720: 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
4730: 28 70 50 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a  (pParse,X,0,0,&Z
4740: 2c 53 2c 4e 2c 55 29 3b 0a 20 20 7d 0a 20 20 73  ,S,N,U);.  }.  s
4750: 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d  eltablist(A) ::=
4760: 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20 4c   stl_prefix(X) L
4770: 50 20 73 65 6c 74 61 62 6c 69 73 74 28 46 29 20  P seltablist(F) 
4780: 52 50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RP.             
4790: 20 20 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f         as(Z) on_
47a0: 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74  opt(N) using_opt
47b0: 28 55 29 2e 20 7b 0a 20 20 20 20 69 66 28 20 58  (U). {.    if( X
47c0: 3d 3d 30 20 26 26 20 5a 2e 6e 3d 3d 30 20 26 26  ==0 && Z.n==0 &&
47d0: 20 4e 3d 3d 30 20 26 26 20 55 3d 3d 30 20 29 7b   N==0 && U==0 ){
47e0: 0a 20 20 20 20 20 20 41 20 3d 20 46 3b 0a 20 20  .      A = F;.  
47f0: 20 20 7d 65 6c 73 65 20 69 66 28 20 46 2d 3e 6e    }else if( F->n
4800: 53 72 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Src==1 ){.      
4810: 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  A = sqlite3SrcLi
4820: 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
4830: 28 70 50 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a  (pParse,X,0,0,&Z
4840: 2c 30 2c 4e 2c 55 29 3b 0a 20 20 20 20 20 20 69  ,0,N,U);.      i
4850: 66 28 20 41 20 29 7b 0a 20 20 20 20 20 20 20 20  f( A ){.        
4860: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4870: 74 65 6d 20 2a 70 4e 65 77 20 3d 20 26 41 2d 3e  tem *pNew = &A->
4880: 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[A->nSrc-1];.  
4890: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
48a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 20  List_item *pOld 
48b0: 3d 20 46 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20  = F->a;.        
48c0: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 70 4f  pNew->zName = pO
48d0: 6c 64 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ld->zName;.     
48e0: 20 20 20 70 4e 65 77 2d 3e 7a 44 61 74 61 62 61     pNew->zDataba
48f0: 73 65 20 3d 20 70 4f 6c 64 2d 3e 7a 44 61 74 61  se = pOld->zData
4900: 62 61 73 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  base;.        pN
4910: 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 4f  ew->pSelect = pO
4920: 6c 64 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20  ld->pSelect;.   
4930: 20 20 20 20 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65       pOld->zName
4940: 20 3d 20 70 4f 6c 64 2d 3e 7a 44 61 74 61 62 61   = pOld->zDataba
4950: 73 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  se = 0;.        
4960: 70 4f 6c 64 2d 3e 70 53 65 6c 65 63 74 20 3d 20  pOld->pSelect = 
4970: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
4980: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
4990: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
49a0: 2c 20 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , F);.    }else{
49b0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
49c0: 53 75 62 71 75 65 72 79 3b 0a 20 20 20 20 20 20  Subquery;.      
49d0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
49e0: 69 66 74 4a 6f 69 6e 54 79 70 65 28 46 29 3b 0a  iftJoinType(F);.
49f0: 20 20 20 20 20 20 70 53 75 62 71 75 65 72 79 20        pSubquery 
4a00: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
4a10: 65 77 28 70 50 61 72 73 65 2c 30 2c 46 2c 30 2c  ew(pParse,0,F,0,
4a20: 30 2c 30 2c 30 2c 53 46 5f 4e 65 73 74 65 64 46  0,0,0,SF_NestedF
4a30: 72 6f 6d 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20  rom,0,0);.      
4a40: 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  A = sqlite3SrcLi
4a50: 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
4a60: 28 70 50 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a  (pParse,X,0,0,&Z
4a70: 2c 70 53 75 62 71 75 65 72 79 2c 4e 2c 55 29 3b  ,pSubquery,N,U);
4a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 25 65 6e 64 69  .    }.  }.%endi
4a90: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  f  SQLITE_OMIT_S
4aa0: 55 42 51 55 45 52 59 0a 0a 25 74 79 70 65 20 64  UBQUERY..%type d
4ab0: 62 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 64 62 6e 6d  bnm {Token}.dbnm
4ac0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
4ad0: 20 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 30     {A.z=0; A.n=0
4ae0: 3b 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 44  ;}.dbnm(A) ::= D
4af0: 4f 54 20 6e 6d 28 58 29 2e 20 7b 41 20 3d 20 58  OT nm(X). {A = X
4b00: 3b 7d 0a 0a 25 74 79 70 65 20 66 75 6c 6c 6e 61  ;}..%type fullna
4b10: 6d 65 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  me {SrcList*}.%d
4b20: 65 73 74 72 75 63 74 6f 72 20 66 75 6c 6c 6e 61  estructor fullna
4b30: 6d 65 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69  me {sqlite3SrcLi
4b40: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
4b50: 3e 64 62 2c 20 24 24 29 3b 7d 0a 66 75 6c 6c 6e  >db, $$);}.fulln
4b60: 61 6d 65 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29  ame(A) ::= nm(X)
4b70: 20 64 62 6e 6d 28 59 29 2e 20 20 7b 41 20 3d 20   dbnm(Y).  {A = 
4b80: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
4b90: 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  pend(pParse->db,
4ba0: 30 2c 26 58 2c 26 59 29 3b 7d 0a 0a 25 74 79 70  0,&X,&Y);}..%typ
4bb0: 65 20 6a 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25  e joinop {int}.%
4bc0: 74 79 70 65 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e  type joinop2 {in
4bd0: 74 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d  t}.joinop(X) ::=
4be0: 20 43 4f 4d 4d 41 7c 4a 4f 49 4e 2e 20 20 20 20   COMMA|JOIN.    
4bf0: 20 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20            { X = 
4c00: 4a 54 5f 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e  JT_INNER; }.join
4c10: 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b  op(X) ::= JOIN_K
4c20: 57 28 41 29 20 4a 4f 49 4e 2e 20 20 20 20 20 20  W(A) JOIN.      
4c30: 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33     { X = sqlite3
4c40: 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c  JoinType(pParse,
4c50: 26 41 2c 30 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f  &A,0,0); }.joino
4c60: 70 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57  p(X) ::= JOIN_KW
4c70: 28 41 29 20 6e 6d 28 42 29 20 4a 4f 49 4e 2e 20  (A) nm(B) JOIN. 
4c80: 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33 4a    { X = sqlite3J
4c90: 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26  oinType(pParse,&
4ca0: 41 2c 26 42 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f  A,&B,0); }.joino
4cb0: 70 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57  p(X) ::= JOIN_KW
4cc0: 28 41 29 20 6e 6d 28 42 29 20 6e 6d 28 43 29 20  (A) nm(B) nm(C) 
4cd0: 4a 4f 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20  JOIN..          
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 58               { X
4d00: 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79   = sqlite3JoinTy
4d10: 70 65 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c  pe(pParse,&A,&B,
4d20: 26 43 29 3b 20 7d 0a 0a 25 74 79 70 65 20 6f 6e  &C); }..%type on
4d30: 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65  _opt {Expr*}.%de
4d40: 73 74 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74 20  structor on_opt 
4d50: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
4d60: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
4d70: 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a  $);}.on_opt(N) :
4d80: 3a 3d 20 4f 4e 20 65 78 70 72 28 45 29 2e 20 20  := ON expr(E).  
4d90: 20 7b 4e 20 3d 20 45 2e 70 45 78 70 72 3b 7d 0a   {N = E.pExpr;}.
4da0: 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 2e 20  on_opt(N) ::= . 
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 4e 20 3d              {N =
4dc0: 20 30 3b 7d 0a 0a 2f 2f 20 4e 6f 74 65 20 74 68   0;}..// Note th
4dd0: 61 74 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 62  at this block ab
4de0: 75 73 65 73 20 74 68 65 20 54 6f 6b 65 6e 20 74  uses the Token t
4df0: 79 70 65 20 6a 75 73 74 20 61 20 6c 69 74 74 6c  ype just a littl
4e00: 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a 2f  e. If there is./
4e10: 2f 20 6e 6f 20 22 49 4e 44 45 58 45 44 20 42 59  / no "INDEXED BY
4e20: 22 20 63 6c 61 75 73 65 2c 20 74 68 65 20 72 65  " clause, the re
4e30: 74 75 72 6e 65 64 20 74 6f 6b 65 6e 20 69 73 20  turned token is 
4e40: 65 6d 70 74 79 20 28 7a 3d 3d 30 20 26 26 20 6e  empty (z==0 && n
4e50: 3d 3d 30 29 2e 20 49 66 0a 2f 2f 20 74 68 65 72  ==0). If.// ther
4e60: 65 20 69 73 20 61 6e 20 49 4e 44 45 58 45 44 20  e is an INDEXED 
4e70: 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  BY clause, then 
4e80: 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 70 6f 70  the token is pop
4e90: 75 6c 61 74 65 64 20 61 73 20 70 65 72 20 6e 6f  ulated as per no
4ea0: 72 6d 61 6c 2c 0a 2f 2f 20 77 69 74 68 20 7a 20  rmal,.// with z 
4eb0: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
4ec0: 74 6f 6b 65 6e 20 64 61 74 61 20 61 6e 64 20 6e  token data and n
4ed0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
4ee0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a  number of bytes.
4ef0: 2f 2f 20 69 6e 20 74 68 65 20 74 6f 6b 65 6e 2e  // in the token.
4f00: 0a 2f 2f 0a 2f 2f 20 49 66 20 74 68 65 72 65 20  .//.// If there 
4f10: 69 73 20 61 20 22 4e 4f 54 20 49 4e 44 45 58 45  is a "NOT INDEXE
4f20: 44 22 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20  D" clause, then 
4f30: 28 7a 3d 3d 30 20 26 26 20 6e 3d 3d 31 29 2c 20  (z==0 && n==1), 
4f40: 77 68 69 63 68 20 69 73 20 0a 2f 2f 20 6e 6f 72  which is .// nor
4f50: 6d 61 6c 6c 79 20 69 6c 6c 65 67 61 6c 2e 20 54  mally illegal. T
4f60: 68 65 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  he sqlite3SrcLis
4f70: 74 49 6e 64 65 78 65 64 42 79 28 29 20 66 75 6e  tIndexedBy() fun
4f80: 63 74 69 6f 6e 20 0a 2f 2f 20 72 65 63 6f 67 6e  ction .// recogn
4f90: 69 7a 65 73 20 61 6e 64 20 69 6e 74 65 72 70 72  izes and interpr
4fa0: 65 74 73 20 74 68 69 73 20 61 73 20 61 20 73 70  ets this as a sp
4fb0: 65 63 69 61 6c 20 63 61 73 65 2e 0a 2f 2f 0a 25  ecial case..//.%
4fc0: 74 79 70 65 20 69 6e 64 65 78 65 64 5f 6f 70 74  type indexed_opt
4fd0: 20 7b 54 6f 6b 65 6e 7d 0a 69 6e 64 65 78 65 64   {Token}.indexed
4fe0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
5000: 2e 7a 3d 30 3b 20 41 2e 6e 3d 30 3b 7d 0a 69 6e  .z=0; A.n=0;}.in
5010: 64 65 78 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d  dexed_opt(A) ::=
5020: 20 49 4e 44 45 58 45 44 20 42 59 20 6e 6d 28 58   INDEXED BY nm(X
5030: 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 64 65  ). {A = X;}.inde
5040: 78 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4e  xed_opt(A) ::= N
5050: 4f 54 20 49 4e 44 45 58 45 44 2e 20 20 20 20 20  OT INDEXED.     
5060: 20 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 31 3b 7d   {A.z=0; A.n=1;}
5070: 0a 0a 25 74 79 70 65 20 75 73 69 6e 67 5f 6f 70  ..%type using_op
5080: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73  t {IdList*}.%des
5090: 74 72 75 63 74 6f 72 20 75 73 69 6e 67 5f 6f 70  tructor using_op
50a0: 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t {sqlite3IdList
50b0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
50c0: 62 2c 20 24 24 29 3b 7d 0a 75 73 69 6e 67 5f 6f  b, $$);}.using_o
50d0: 70 74 28 55 29 20 3a 3a 3d 20 55 53 49 4e 47 20  pt(U) ::= USING 
50e0: 4c 50 20 69 64 6c 69 73 74 28 4c 29 20 52 50 2e  LP idlist(L) RP.
50f0: 20 20 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e 67    {U = L;}.using
5100: 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20 20  _opt(U) ::= .   
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 20 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a 0a       {U = 0;}...
5130: 25 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f 70  %type orderby_op
5140: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
5150: 65 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72 62  estructor orderb
5160: 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  y_opt {sqlite3Ex
5170: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
5180: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
5190: 74 79 70 65 20 73 6f 72 74 6c 69 73 74 20 7b 45  type sortlist {E
51a0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
51b0: 75 63 74 6f 72 20 73 6f 72 74 6c 69 73 74 20 7b  uctor sortlist {
51c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
51d0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
51e0: 2c 20 24 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79  , $$);}..orderby
51f0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
5220: 6f 72 64 65 72 62 79 5f 6f 70 74 28 41 29 20 3a  orderby_opt(A) :
5230: 3a 3d 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74  := ORDER BY sort
5240: 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20 7b 41  list(X).      {A
5250: 20 3d 20 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28   = X;}.sortlist(
5260: 41 29 20 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28  A) ::= sortlist(
5270: 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29  X) COMMA expr(Y)
5280: 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b   sortorder(Z). {
5290: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
52a0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
52b0: 72 73 65 2c 58 2c 59 2e 70 45 78 70 72 29 3b 0a  rse,X,Y.pExpr);.
52c0: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41    if( A ) A->a[A
52d0: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
52e0: 72 64 65 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a  rder = (u8)Z;.}.
52f0: 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20  sortlist(A) ::= 
5300: 65 78 70 72 28 59 29 20 73 6f 72 74 6f 72 64 65  expr(Y) sortorde
5310: 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  r(Z). {.  A = sq
5320: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
5330: 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 59 2e 70  end(pParse,0,Y.p
5340: 45 78 70 72 29 3b 0a 20 20 69 66 28 20 41 20 26  Expr);.  if( A &
5350: 26 20 41 4c 57 41 59 53 28 41 2d 3e 61 29 20 29  & ALWAYS(A->a) )
5360: 20 41 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64   A->a[0].sortOrd
5370: 65 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 0a 25  er = (u8)Z;.}..%
5380: 74 79 70 65 20 73 6f 72 74 6f 72 64 65 72 20 7b  type sortorder {
5390: 69 6e 74 7d 0a 0a 73 6f 72 74 6f 72 64 65 72 28  int}..sortorder(
53a0: 41 29 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20 20  A) ::= ASC.     
53b0: 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54        {A = SQLIT
53c0: 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74 6f  E_SO_ASC;}.sorto
53d0: 72 64 65 72 28 41 29 20 3a 3a 3d 20 44 45 53 43  rder(A) ::= DESC
53e0: 2e 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20  .          {A = 
53f0: 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 7d  SQLITE_SO_DESC;}
5400: 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a  .sortorder(A) ::
5410: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
5420: 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f   {A = SQLITE_SO_
5430: 41 53 43 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f  ASC;}..%type gro
5440: 75 70 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69  upby_opt {ExprLi
5450: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
5460: 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71   groupby_opt {sq
5470: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
5480: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
5490: 24 24 29 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70  $$);}.groupby_op
54a0: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 7b 41 20 3d 20 30 3b 7d 0a 67 72 6f 75 70 62 79  {A = 0;}.groupby
54d0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 47 52 4f 55  _opt(A) ::= GROU
54e0: 50 20 42 59 20 6e 65 78 70 72 6c 69 73 74 28 58  P BY nexprlist(X
54f0: 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79  ). {A = X;}..%ty
5500: 70 65 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 45  pe having_opt {E
5510: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
5520: 72 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 73 71  r having_opt {sq
5530: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5540: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
5550: 7d 0a 68 61 76 69 6e 67 5f 6f 70 74 28 41 29 20  }.having_opt(A) 
5560: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
5570: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 68 61       {A = 0;}.ha
5580: 76 69 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  ving_opt(A) ::= 
5590: 48 41 56 49 4e 47 20 65 78 70 72 28 58 29 2e 20  HAVING expr(X). 
55a0: 20 7b 41 20 3d 20 58 2e 70 45 78 70 72 3b 7d 0a   {A = X.pExpr;}.
55b0: 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74  .%type limit_opt
55c0: 20 7b 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61   {struct LimitVa
55d0: 6c 7d 0a 0a 2f 2f 20 54 68 65 20 64 65 73 74 72  l}..// The destr
55e0: 75 63 74 6f 72 20 66 6f 72 20 6c 69 6d 69 74 5f  uctor for limit_
55f0: 6f 70 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 66  opt will never f
5600: 69 72 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  ire in the curre
5610: 6e 74 20 67 72 61 6d 6d 61 72 2e 0a 2f 2f 20 54  nt grammar..// T
5620: 68 65 20 6c 69 6d 69 74 5f 6f 70 74 20 6e 6f 6e  he limit_opt non
5630: 2d 74 65 72 6d 69 6e 61 6c 20 6f 6e 6c 79 20 6f  -terminal only o
5640: 63 63 75 72 73 20 61 74 20 74 68 65 20 65 6e 64  ccurs at the end
5650: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 72 6f   of a single pro
5660: 64 75 63 74 69 6f 6e 0a 2f 2f 20 72 75 6c 65 20  duction.// rule 
5670: 66 6f 72 20 53 45 4c 45 43 54 20 73 74 61 74 65  for SELECT state
5680: 6d 65 6e 74 73 2e 20 20 41 73 20 73 6f 6f 6e 20  ments.  As soon 
5690: 61 73 20 74 68 65 20 72 75 6c 65 20 74 68 61 74  as the rule that
56a0: 20 63 72 65 61 74 65 20 74 68 65 20 0a 2f 2f 20   create the .// 
56b0: 6c 69 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65  limit_opt non-te
56c0: 72 6d 69 6e 61 6c 20 72 65 64 75 63 65 73 2c 20  rminal reduces, 
56d0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
56e0: 6d 65 6e 74 20 72 75 6c 65 20 77 69 6c 6c 20 61  ment rule will a
56f0: 6c 73 6f 0a 2f 2f 20 72 65 64 75 63 65 2e 20 20  lso.// reduce.  
5700: 53 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  So there is neve
5710: 72 20 61 20 6c 69 6d 69 74 5f 6f 70 74 20 6e 6f  r a limit_opt no
5720: 6e 2d 74 65 72 6d 69 6e 61 6c 20 6f 6e 20 74 68  n-terminal on th
5730: 65 20 73 74 61 63 6b 20 0a 2f 2f 20 65 78 63 65  e stack .// exce
5740: 70 74 20 61 73 20 61 20 74 72 61 6e 73 69 65 6e  pt as a transien
5750: 74 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  t.  So there is 
5760: 6e 65 76 65 72 20 61 6e 79 74 68 69 6e 67 20 74  never anything t
5770: 6f 20 64 65 73 74 72 6f 79 2e 0a 2f 2f 0a 2f 2f  o destroy..//.//
5780: 25 64 65 73 74 72 75 63 74 6f 72 20 6c 69 6d 69  %destructor limi
5790: 74 5f 6f 70 74 20 7b 0a 2f 2f 20 20 73 71 6c 69  t_opt {.//  sqli
57a0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
57b0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e 70 4c 69  arse->db, $$.pLi
57c0: 6d 69 74 29 3b 0a 2f 2f 20 20 73 71 6c 69 74 65  mit);.//  sqlite
57d0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
57e0: 73 65 2d 3e 64 62 2c 20 24 24 2e 70 4f 66 66 73  se->db, $$.pOffs
57f0: 65 74 29 3b 0a 2f 2f 7d 0a 6c 69 6d 69 74 5f 6f  et);.//}.limit_o
5800: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
5810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5820: 41 2e 70 4c 69 6d 69 74 20 3d 20 30 3b 20 41 2e  A.pLimit = 0; A.
5830: 70 4f 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69  pOffset = 0;}.li
5840: 6d 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c  mit_opt(A) ::= L
5850: 49 4d 49 54 20 65 78 70 72 28 58 29 2e 20 20 20  IMIT expr(X).   
5860: 20 20 20 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20      {A.pLimit = 
5870: 58 2e 70 45 78 70 72 3b 20 41 2e 70 4f 66 66 73  X.pExpr; A.pOffs
5880: 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f  et = 0;}.limit_o
5890: 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20  pt(A) ::= LIMIT 
58a0: 65 78 70 72 28 58 29 20 4f 46 46 53 45 54 20 65  expr(X) OFFSET e
58b0: 78 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20  xpr(Y). .       
58c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
58e0: 41 2e 70 4c 69 6d 69 74 20 3d 20 58 2e 70 45 78  A.pLimit = X.pEx
58f0: 70 72 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20  pr; A.pOffset = 
5900: 59 2e 70 45 78 70 72 3b 7d 0a 6c 69 6d 69 74 5f  Y.pExpr;}.limit_
5910: 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54  opt(A) ::= LIMIT
5920: 20 65 78 70 72 28 58 29 20 43 4f 4d 4d 41 20 65   expr(X) COMMA e
5930: 78 70 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20  xpr(Y). .       
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5960: 41 2e 70 4f 66 66 73 65 74 20 3d 20 58 2e 70 45  A.pOffset = X.pE
5970: 78 70 72 3b 20 41 2e 70 4c 69 6d 69 74 20 3d 20  xpr; A.pLimit = 
5980: 59 2e 70 45 78 70 72 3b 7d 0a 0a 2f 2f 2f 2f 2f  Y.pExpr;}../////
5990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
59a0: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54  ////// The DELET
59b0: 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f  E statement ////
59c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
59d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66  /////////.//.%if
59e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
59f0: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
5a00: 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 44 45  LIMIT.cmd ::= DE
5a10: 4c 45 54 45 20 46 52 4f 4d 20 66 75 6c 6c 6e 61  LETE FROM fullna
5a20: 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f 6f 70  me(X) indexed_op
5a30: 74 28 49 29 20 77 68 65 72 65 5f 6f 70 74 28 57  t(I) where_opt(W
5a40: 29 20 0a 20 20 20 20 20 20 20 20 6f 72 64 65 72  ) .        order
5a50: 62 79 5f 6f 70 74 28 4f 29 20 6c 69 6d 69 74 5f  by_opt(O) limit_
5a60: 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 73 71 6c 69  opt(L). {.  sqli
5a70: 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
5a80: 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20 26  dBy(pParse, X, &
5a90: 49 29 3b 0a 20 20 57 20 3d 20 73 71 6c 69 74 65  I);.  W = sqlite
5aa0: 33 4c 69 6d 69 74 57 68 65 72 65 28 70 50 61 72  3LimitWhere(pPar
5ab0: 73 65 2c 20 58 2c 20 57 2c 20 4f 2c 20 4c 2e 70  se, X, W, O, L.p
5ac0: 4c 69 6d 69 74 2c 20 4c 2e 70 4f 66 66 73 65 74  Limit, L.pOffset
5ad0: 2c 20 22 44 45 4c 45 54 45 22 29 3b 0a 20 20 73  , "DELETE");.  s
5ae0: 71 6c 69 74 65 33 44 65 6c 65 74 65 46 72 6f 6d  qlite3DeleteFrom
5af0: 28 70 50 61 72 73 65 2c 58 2c 57 29 3b 0a 7d 0a  (pParse,X,W);.}.
5b00: 25 65 6e 64 69 66 0a 25 69 66 6e 64 65 66 20 53  %endif.%ifndef S
5b10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44  QLITE_ENABLE_UPD
5b20: 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54  ATE_DELETE_LIMIT
5b30: 0a 63 6d 64 20 3a 3a 3d 20 44 45 4c 45 54 45 20  .cmd ::= DELETE 
5b40: 46 52 4f 4d 20 66 75 6c 6c 6e 61 6d 65 28 58 29  FROM fullname(X)
5b50: 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 20   indexed_opt(I) 
5b60: 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b 0a  where_opt(W). {.
5b70: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
5b80: 49 6e 64 65 78 65 64 42 79 28 70 50 61 72 73 65  IndexedBy(pParse
5b90: 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69  , X, &I);.  sqli
5ba0: 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50  te3DeleteFrom(pP
5bb0: 61 72 73 65 2c 58 2c 57 29 3b 0a 7d 0a 25 65 6e  arse,X,W);.}.%en
5bc0: 64 69 66 0a 0a 25 74 79 70 65 20 77 68 65 72 65  dif..%type where
5bd0: 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65  _opt {Expr*}.%de
5be0: 73 74 72 75 63 74 6f 72 20 77 68 65 72 65 5f 6f  structor where_o
5bf0: 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44  pt {sqlite3ExprD
5c00: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
5c10: 2c 20 24 24 29 3b 7d 0a 0a 77 68 65 72 65 5f 6f  , $$);}..where_o
5c20: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5c40: 41 20 3d 20 30 3b 7d 0a 77 68 65 72 65 5f 6f 70  A = 0;}.where_op
5c50: 74 28 41 29 20 3a 3a 3d 20 57 48 45 52 45 20 65  t(A) ::= WHERE e
5c60: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 7b 41  xpr(X).       {A
5c70: 20 3d 20 58 2e 70 45 78 70 72 3b 7d 0a 0a 2f 2f   = X.pExpr;}..//
5c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c90: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 55 50 44  //////// The UPD
5ca0: 41 54 45 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  ATE command ////
5cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
5cd0: 25 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  %ifdef SQLITE_EN
5ce0: 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45  ABLE_UPDATE_DELE
5cf0: 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d  TE_LIMIT.cmd ::=
5d00: 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52   UPDATE orconf(R
5d10: 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e  ) fullname(X) in
5d20: 64 65 78 65 64 5f 6f 70 74 28 49 29 20 53 45 54  dexed_opt(I) SET
5d30: 20 73 65 74 6c 69 73 74 28 59 29 20 77 68 65 72   setlist(Y) wher
5d40: 65 5f 6f 70 74 28 57 29 0a 20 20 20 20 20 20 20  e_opt(W).       
5d50: 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 4f 29 20   orderby_opt(O) 
5d60: 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 20 7b  limit_opt(L).  {
5d70: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
5d80: 74 49 6e 64 65 78 65 64 42 79 28 70 50 61 72 73  tIndexedBy(pPars
5d90: 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c  e, X, &I);.  sql
5da0: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
5db0: 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 59  kLength(pParse,Y
5dc0: 2c 22 73 65 74 20 6c 69 73 74 22 29 3b 20 0a 20  ,"set list"); . 
5dd0: 20 57 20 3d 20 73 71 6c 69 74 65 33 4c 69 6d 69   W = sqlite3Limi
5de0: 74 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 58  tWhere(pParse, X
5df0: 2c 20 57 2c 20 4f 2c 20 4c 2e 70 4c 69 6d 69 74  , W, O, L.pLimit
5e00: 2c 20 4c 2e 70 4f 66 66 73 65 74 2c 20 22 55 50  , L.pOffset, "UP
5e10: 44 41 54 45 22 29 3b 0a 20 20 73 71 6c 69 74 65  DATE");.  sqlite
5e20: 33 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 58  3Update(pParse,X
5e30: 2c 59 2c 57 2c 52 29 3b 0a 7d 0a 25 65 6e 64 69  ,Y,W,R);.}.%endi
5e40: 66 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.%ifndef SQLITE
5e50: 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44  _ENABLE_UPDATE_D
5e60: 45 4c 45 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20  ELETE_LIMIT.cmd 
5e70: 3a 3a 3d 20 55 50 44 41 54 45 20 6f 72 63 6f 6e  ::= UPDATE orcon
5e80: 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29  f(R) fullname(X)
5e90: 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 20   indexed_opt(I) 
5ea0: 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 0a 20  SET setlist(Y). 
5eb0: 20 20 20 20 20 20 20 77 68 65 72 65 5f 6f 70 74         where_opt
5ec0: 28 57 29 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65  (W).  {.  sqlite
5ed0: 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42  3SrcListIndexedB
5ee0: 79 28 70 50 61 72 73 65 2c 20 58 2c 20 26 49 29  y(pParse, X, &I)
5ef0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
5f00: 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70  istCheckLength(p
5f10: 50 61 72 73 65 2c 59 2c 22 73 65 74 20 6c 69 73  Parse,Y,"set lis
5f20: 74 22 29 3b 20 0a 20 20 73 71 6c 69 74 65 33 55  t"); .  sqlite3U
5f30: 70 64 61 74 65 28 70 50 61 72 73 65 2c 58 2c 59  pdate(pParse,X,Y
5f40: 2c 57 2c 52 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a  ,W,R);.}.%endif.
5f50: 0a 25 74 79 70 65 20 73 65 74 6c 69 73 74 20 7b  .%type setlist {
5f60: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
5f70: 72 75 63 74 6f 72 20 73 65 74 6c 69 73 74 20 7b  ructor setlist {
5f80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5f90: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
5fa0: 2c 20 24 24 29 3b 7d 0a 0a 73 65 74 6c 69 73 74  , $$);}..setlist
5fb0: 28 41 29 20 3a 3a 3d 20 73 65 74 6c 69 73 74 28  (A) ::= setlist(
5fc0: 5a 29 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 45  Z) COMMA nm(X) E
5fd0: 51 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 41  Q expr(Y). {.  A
5fe0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
5ff0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
6000: 20 5a 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20   Z, Y.pExpr);.  
6010: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
6020: 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 41  etName(pParse, A
6030: 2c 20 26 58 2c 20 31 29 3b 0a 7d 0a 73 65 74 6c  , &X, 1);.}.setl
6040: 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29  ist(A) ::= nm(X)
6050: 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a 20   EQ expr(Y). {. 
6060: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6070: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
6080: 65 2c 20 30 2c 20 59 2e 70 45 78 70 72 29 3b 0a  e, 0, Y.pExpr);.
6090: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
60a0: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
60b0: 20 41 2c 20 26 58 2c 20 31 29 3b 0a 7d 0a 0a 2f   A, &X, 1);.}../
60c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
60d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 49 4e  ///////// The IN
60e0: 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  SERT command ///
60f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6100: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
6110: 2f 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65 72 74  /.cmd ::= insert
6120: 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75 6c  _cmd(R) INTO ful
6130: 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63 6f 6c 6c  lname(X) inscoll
6140: 69 73 74 5f 6f 70 74 28 46 29 20 76 61 6c 75 65  ist_opt(F) value
6150: 6c 69 73 74 28 59 29 2e 0a 20 20 20 20 20 20 20  list(Y)..       
6160: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73       {sqlite3Ins
6170: 65 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 59  ert(pParse, X, Y
6180: 2e 70 4c 69 73 74 2c 20 59 2e 70 53 65 6c 65 63  .pList, Y.pSelec
6190: 74 2c 20 46 2c 20 52 29 3b 7d 0a 63 6d 64 20 3a  t, F, R);}.cmd :
61a0: 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29  := insert_cmd(R)
61b0: 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28 58   INTO fullname(X
61c0: 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  ) inscollist_opt
61d0: 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e 0a 20  (F) select(S).. 
61e0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
61f0: 74 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65  te3Insert(pParse
6200: 2c 20 58 2c 20 30 2c 20 53 2c 20 46 2c 20 52 29  , X, 0, S, F, R)
6210: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73 65 72  ;}.cmd ::= inser
6220: 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75  t_cmd(R) INTO fu
6230: 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63 6f 6c  llname(X) inscol
6240: 6c 69 73 74 5f 6f 70 74 28 46 29 20 44 45 46 41  list_opt(F) DEFA
6250: 55 4c 54 20 56 41 4c 55 45 53 2e 0a 20 20 20 20  ULT VALUES..    
6260: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
6270: 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20 58  Insert(pParse, X
6280: 2c 20 30 2c 20 30 2c 20 46 2c 20 52 29 3b 7d 0a  , 0, 0, F, R);}.
6290: 0a 25 74 79 70 65 20 69 6e 73 65 72 74 5f 63 6d  .%type insert_cm
62a0: 64 20 7b 75 38 7d 0a 69 6e 73 65 72 74 5f 63 6d  d {u8}.insert_cm
62b0: 64 28 41 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20  d(A) ::= INSERT 
62c0: 6f 72 63 6f 6e 66 28 52 29 2e 20 20 20 7b 41 20  orconf(R).   {A 
62d0: 3d 20 52 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d 64  = R;}.insert_cmd
62e0: 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e  (A) ::= REPLACE.
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
6300: 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 2f   OE_Replace;}../
6310: 2f 20 41 20 56 61 6c 75 65 4c 69 73 74 20 69 73  / A ValueList is
6320: 20 65 69 74 68 65 72 20 61 20 73 69 6e 67 6c 65   either a single
6330: 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 20 6f   VALUES clause o
6340: 72 20 61 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61  r a comma-separa
6350: 74 65 64 20 6c 69 73 74 0a 2f 2f 20 6f 66 20 56  ted list.// of V
6360: 41 4c 55 45 53 20 63 6c 61 75 73 65 73 2e 20 20  ALUES clauses.  
6370: 49 66 20 69 74 20 69 73 20 61 20 73 69 6e 67 6c  If it is a singl
6380: 65 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65 20  e VALUES clause 
6390: 74 68 65 6e 20 74 68 65 0a 2f 2f 20 56 61 6c 75  then the.// Valu
63a0: 65 4c 69 73 74 2e 70 4c 69 73 74 20 66 69 65 6c  eList.pList fiel
63b0: 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  d points to the 
63c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
63d0: 6f 66 20 74 68 61 74 20 63 6c 61 75 73 65 2e 0a  of that clause..
63e0: 2f 2f 20 49 66 20 69 74 20 69 73 20 61 20 6c 69  // If it is a li
63f0: 73 74 20 6f 66 20 56 41 4c 55 45 53 20 63 6c 61  st of VALUES cla
6400: 75 73 65 73 2c 20 74 68 65 6e 20 74 68 6f 73 65  uses, then those
6410: 20 63 6c 61 75 73 65 73 20 61 72 65 20 74 72 61   clauses are tra
6420: 6e 73 66 6f 72 6d 65 64 0a 2f 2f 20 69 6e 74 6f  nsformed.// into
6430: 20 61 20 73 65 74 20 6f 66 20 53 45 4c 45 43 54   a set of SELECT
6440: 20 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68   statements with
6450: 6f 75 74 20 46 52 4f 4d 20 63 6c 61 75 73 65 73  out FROM clauses
6460: 20 61 6e 64 20 63 6f 6e 6e 65 63 74 65 64 20 62   and connected b
6470: 79 0a 2f 2f 20 55 4e 49 4f 4e 20 41 4c 4c 20 61  y.// UNION ALL a
6480: 6e 64 20 74 68 65 20 56 61 6c 75 65 4c 69 73 74  nd the ValueList
6490: 2e 70 53 65 6c 65 63 74 20 70 6f 69 6e 74 73 20  .pSelect points 
64a0: 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  to the right-mos
64b0: 74 20 53 45 4c 45 43 54 20 69 6e 0a 2f 2f 20 74  t SELECT in.// t
64c0: 68 61 74 20 63 6f 6d 70 6f 75 6e 64 2e 0a 25 74  hat compound..%t
64d0: 79 70 65 20 76 61 6c 75 65 6c 69 73 74 20 7b 73  ype valuelist {s
64e0: 74 72 75 63 74 20 56 61 6c 75 65 4c 69 73 74 7d  truct ValueList}
64f0: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 76 61 6c  .%destructor val
6500: 75 65 6c 69 73 74 20 7b 0a 20 20 73 71 6c 69 74  uelist {.  sqlit
6510: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
6520: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e  (pParse->db, $$.
6530: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
6540: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50  3SelectDelete(pP
6550: 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e 70 53 65  arse->db, $$.pSe
6560: 6c 65 63 74 29 3b 0a 7d 0a 76 61 6c 75 65 6c 69  lect);.}.valueli
6570: 73 74 28 41 29 20 3a 3a 3d 20 56 41 4c 55 45 53  st(A) ::= VALUES
6580: 20 4c 50 20 6e 65 78 70 72 6c 69 73 74 28 58 29   LP nexprlist(X)
6590: 20 52 50 2e 20 7b 0a 20 20 41 2e 70 4c 69 73 74   RP. {.  A.pList
65a0: 20 3d 20 58 3b 0a 20 20 41 2e 70 53 65 6c 65 63   = X;.  A.pSelec
65b0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2f 20 53 69 6e  t = 0;.}..// Sin
65c0: 63 65 20 61 20 6c 69 73 74 20 6f 66 20 56 41 4c  ce a list of VAL
65d0: 55 45 73 20 69 73 20 69 6e 70 6c 65 6d 65 6e 74  UEs is inplement
65e0: 65 64 20 61 73 20 61 20 63 6f 6d 70 6f 75 6e 64  ed as a compound
65f0: 20 53 45 4c 45 43 54 2c 20 77 65 20 68 61 76 65   SELECT, we have
6600: 0a 2f 2f 20 74 6f 20 64 69 73 61 62 6c 65 20 74  .// to disable t
6610: 68 65 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 70  he value list op
6620: 74 69 6f 6e 20 69 66 20 63 6f 6d 70 6f 75 6e 64  tion if compound
6630: 20 53 45 4c 45 43 54 73 20 61 72 65 20 64 69 73   SELECTs are dis
6640: 61 62 6c 65 64 2e 0a 25 69 66 6e 64 65 66 20 53  abled..%ifndef S
6650: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
6660: 55 4e 44 5f 53 45 4c 45 43 54 0a 76 61 6c 75 65  UND_SELECT.value
6670: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 76 61 6c 75  list(A) ::= valu
6680: 65 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 4c  elist(X) COMMA L
6690: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50  P exprlist(Y) RP
66a0: 2e 20 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52  . {.  Select *pR
66b0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 53 65  ight = sqlite3Se
66c0: 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c 20  lectNew(pParse, 
66d0: 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Y, 0, 0, 0, 0, 0
66e0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
66f0: 28 20 58 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20  ( X.pList ){.   
6700: 20 58 2e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c   X.pSelect = sql
6710: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50  ite3SelectNew(pP
6720: 61 72 73 65 2c 20 58 2e 70 4c 69 73 74 2c 20 30  arse, X.pList, 0
6730: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
6740: 20 30 2c 20 30 29 3b 0a 20 20 20 20 58 2e 70 4c   0, 0);.    X.pL
6750: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 41  ist = 0;.  }.  A
6760: 2e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 66  .pList = 0;.  if
6770: 28 20 58 2e 70 53 65 6c 65 63 74 3d 3d 30 20 7c  ( X.pSelect==0 |
6780: 7c 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20  | pRight==0 ){. 
6790: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
67a0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
67b0: 62 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  b, pRight);.    
67c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
67d0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
67e0: 58 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  X.pSelect);.    
67f0: 41 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20  A.pSelect = 0;. 
6800: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 52 69 67   }else{.    pRig
6810: 68 74 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b  ht->op = TK_ALL;
6820: 0a 20 20 20 20 70 52 69 67 68 74 2d 3e 70 50 72  .    pRight->pPr
6830: 69 6f 72 20 3d 20 58 2e 70 53 65 6c 65 63 74 3b  ior = X.pSelect;
6840: 0a 20 20 20 20 70 52 69 67 68 74 2d 3e 73 65 6c  .    pRight->sel
6850: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 56 61 6c 75  Flags |= SF_Valu
6860: 65 73 3b 0a 20 20 20 20 70 52 69 67 68 74 2d 3e  es;.    pRight->
6870: 70 50 72 69 6f 72 2d 3e 73 65 6c 46 6c 61 67 73  pPrior->selFlags
6880: 20 7c 3d 20 53 46 5f 56 61 6c 75 65 73 3b 0a 20   |= SF_Values;. 
6890: 20 20 20 41 2e 70 53 65 6c 65 63 74 20 3d 20 70     A.pSelect = p
68a0: 52 69 67 68 74 3b 0a 20 20 7d 0a 7d 0a 25 65 6e  Right;.  }.}.%en
68b0: 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  dif SQLITE_OMIT_
68c0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
68d0: 0a 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73  .%type inscollis
68e0: 74 5f 6f 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a  t_opt {IdList*}.
68f0: 25 64 65 73 74 72 75 63 74 6f 72 20 69 6e 73 63  %destructor insc
6900: 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69  ollist_opt {sqli
6910: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
6920: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
6930: 7d 0a 25 74 79 70 65 20 69 64 6c 69 73 74 20 7b  }.%type idlist {
6940: 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  IdList*}.%destru
6950: 63 74 6f 72 20 69 64 6c 69 73 74 20 7b 73 71 6c  ctor idlist {sql
6960: 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
6970: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
6980: 3b 7d 0a 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f  ;}..inscollist_o
6990: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 73 63 6f    {A = 0;}.insco
69c0: 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d  llist_opt(A) ::=
69d0: 20 4c 50 20 69 64 6c 69 73 74 28 58 29 20 52 50   LP idlist(X) RP
69e0: 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64  .    {A = X;}.id
69f0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 6c 69  list(A) ::= idli
6a00: 73 74 28 58 29 20 43 4f 4d 4d 41 20 6e 6d 28 59  st(X) COMMA nm(Y
6a10: 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  )..    {A = sqli
6a20: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28  te3IdListAppend(
6a30: 70 50 61 72 73 65 2d 3e 64 62 2c 58 2c 26 59 29  pParse->db,X,&Y)
6a40: 3b 7d 0a 69 64 6c 69 73 74 28 41 29 20 3a 3a 3d  ;}.idlist(A) ::=
6a50: 20 6e 6d 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d   nm(Y)..    {A =
6a60: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70   sqlite3IdListAp
6a70: 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  pend(pParse->db,
6a80: 30 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  0,&Y);}..///////
6a90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6aa0: 2f 2f 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20  //// Expression 
6ab0: 50 72 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f  Processing /////
6ac0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ad0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79  ////////.//..%ty
6ae0: 70 65 20 65 78 70 72 20 7b 45 78 70 72 53 70 61  pe expr {ExprSpa
6af0: 6e 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65  n}.%destructor e
6b00: 78 70 72 20 7b 73 71 6c 69 74 65 33 45 78 70 72  xpr {sqlite3Expr
6b10: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
6b20: 62 2c 20 24 24 2e 70 45 78 70 72 29 3b 7d 0a 25  b, $$.pExpr);}.%
6b30: 74 79 70 65 20 74 65 72 6d 20 7b 45 78 70 72 53  type term {ExprS
6b40: 70 61 6e 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pan}.%destructor
6b50: 20 74 65 72 6d 20 7b 73 71 6c 69 74 65 33 45 78   term {sqlite3Ex
6b60: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
6b70: 3e 64 62 2c 20 24 24 2e 70 45 78 70 72 29 3b 7d  >db, $$.pExpr);}
6b80: 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f  ..%include {.  /
6b90: 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
6ba0: 69 74 79 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ity routine used
6bb0: 20 74 6f 20 73 65 74 20 74 68 65 20 45 78 70 72   to set the Expr
6bc0: 53 70 61 6e 2e 7a 53 74 61 72 74 20 61 6e 64 0a  Span.zStart and.
6bd0: 20 20 2a 2a 20 45 78 70 72 53 70 61 6e 2e 7a 45    ** ExprSpan.zE
6be0: 6e 64 20 76 61 6c 75 65 73 20 6f 66 20 70 4f 75  nd values of pOu
6bf0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 70  t so that the sp
6c00: 61 6e 20 63 6f 76 65 72 73 20 74 68 65 20 63 6f  an covers the co
6c10: 6d 70 6c 65 74 65 0a 20 20 2a 2a 20 72 61 6e 67  mplete.  ** rang
6c20: 65 20 6f 66 20 74 65 78 74 20 62 65 67 69 6e 6e  e of text beginn
6c30: 69 6e 67 20 77 69 74 68 20 70 53 74 61 72 74 20  ing with pStart 
6c40: 61 6e 64 20 67 6f 69 6e 67 20 74 6f 20 74 68 65  and going to the
6c50: 20 65 6e 64 20 6f 66 20 70 45 6e 64 2e 0a 20 20   end of pEnd..  
6c60: 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
6c70: 20 73 70 61 6e 53 65 74 28 45 78 70 72 53 70 61   spanSet(ExprSpa
6c80: 6e 20 2a 70 4f 75 74 2c 20 54 6f 6b 65 6e 20 2a  n *pOut, Token *
6c90: 70 53 74 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70  pStart, Token *p
6ca0: 45 6e 64 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  End){.    pOut->
6cb0: 7a 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 2d  zStart = pStart-
6cc0: 3e 7a 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 45  >z;.    pOut->zE
6cd0: 6e 64 20 3d 20 26 70 45 6e 64 2d 3e 7a 5b 70 45  nd = &pEnd->z[pE
6ce0: 6e 64 2d 3e 6e 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  nd->n];.  }..  /
6cf0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65  * Construct a ne
6d00: 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20 66 72  w Expr object fr
6d10: 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e  om a single iden
6d20: 74 69 66 69 65 72 2e 20 20 55 73 65 20 74 68 65  tifier.  Use the
6d30: 0a 20 20 2a 2a 20 6e 65 77 20 45 78 70 72 20 74  .  ** new Expr t
6d40: 6f 20 70 6f 70 75 6c 61 74 65 20 70 4f 75 74 2e  o populate pOut.
6d50: 20 20 53 65 74 20 74 68 65 20 73 70 61 6e 20 6f    Set the span o
6d60: 66 20 70 4f 75 74 20 74 6f 20 62 65 20 74 68 65  f pOut to be the
6d70: 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a   identifier.  **
6d80: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
6d90: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20  e expression..  
6da0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
6db0: 20 73 70 61 6e 45 78 70 72 28 45 78 70 72 53 70   spanExpr(ExprSp
6dc0: 61 6e 20 2a 70 4f 75 74 2c 20 50 61 72 73 65 20  an *pOut, Parse 
6dd0: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c  *pParse, int op,
6de0: 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 75 65 29 7b   Token *pValue){
6df0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 45 78 70 72  .    pOut->pExpr
6e00: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
6e10: 70 50 61 72 73 65 2c 20 6f 70 2c 20 30 2c 20 30  pParse, op, 0, 0
6e20: 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 70  , pValue);.    p
6e30: 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d 20 70 56  Out->zStart = pV
6e40: 61 6c 75 65 2d 3e 7a 3b 0a 20 20 20 20 70 4f 75  alue->z;.    pOu
6e50: 74 2d 3e 7a 45 6e 64 20 3d 20 26 70 56 61 6c 75  t->zEnd = &pValu
6e60: 65 2d 3e 7a 5b 70 56 61 6c 75 65 2d 3e 6e 5d 3b  e->z[pValue->n];
6e70: 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20  .  }.}..expr(A) 
6e80: 3a 3a 3d 20 74 65 72 6d 28 58 29 2e 20 20 20 20  ::= term(X).    
6e90: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
6ea0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50  }.expr(A) ::= LP
6eb0: 28 42 29 20 65 78 70 72 28 58 29 20 52 50 28 45  (B) expr(X) RP(E
6ec0: 29 2e 20 7b 41 2e 70 45 78 70 72 20 3d 20 58 2e  ). {A.pExpr = X.
6ed0: 70 45 78 70 72 3b 20 73 70 61 6e 53 65 74 28 26  pExpr; spanSet(&
6ee0: 41 2c 26 42 2c 26 45 29 3b 7d 0a 74 65 72 6d 28  A,&B,&E);}.term(
6ef0: 41 29 20 3a 3a 3d 20 4e 55 4c 4c 28 58 29 2e 20  A) ::= NULL(X). 
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61              {spa
6f10: 6e 45 78 70 72 28 26 41 2c 20 70 50 61 72 73 65  nExpr(&A, pParse
6f20: 2c 20 40 58 2c 20 26 58 29 3b 7d 0a 65 78 70 72  , @X, &X);}.expr
6f30: 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 2e 20 20  (A) ::= id(X).  
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70               {sp
6f50: 61 6e 45 78 70 72 28 26 41 2c 20 70 50 61 72 73  anExpr(&A, pPars
6f60: 65 2c 20 54 4b 5f 49 44 2c 20 26 58 29 3b 7d 0a  e, TK_ID, &X);}.
6f70: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e  expr(A) ::= JOIN
6f80: 5f 4b 57 28 58 29 2e 20 20 20 20 20 20 20 20 20  _KW(X).         
6f90: 20 7b 73 70 61 6e 45 78 70 72 28 26 41 2c 20 70   {spanExpr(&A, p
6fa0: 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 26 58  Parse, TK_ID, &X
6fb0: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
6fc0: 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29 2e  nm(X) DOT nm(Y).
6fd0: 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 31   {.  Expr *temp1
6fe0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
6ff0: 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
7000: 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78 70 72  , 0, &X);.  Expr
7010: 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69 74 65   *temp2 = sqlite
7020: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7030: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 59 29 3b  K_ID, 0, 0, &Y);
7040: 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c  .  A.pExpr = sql
7050: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
7060: 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c  , TK_DOT, temp1,
7070: 20 74 65 6d 70 32 2c 20 30 29 3b 0a 20 20 73 70   temp2, 0);.  sp
7080: 61 6e 53 65 74 28 26 41 2c 26 58 2c 26 59 29 3b  anSet(&A,&X,&Y);
7090: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e  .}.expr(A) ::= n
70a0: 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29 20 44  m(X) DOT nm(Y) D
70b0: 4f 54 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 45 78  OT nm(Z). {.  Ex
70c0: 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69  pr *temp1 = sqli
70d0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
70e0: 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58   TK_ID, 0, 0, &X
70f0: 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32  );.  Expr *temp2
7100: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
7110: 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30  pParse, TK_ID, 0
7120: 2c 20 30 2c 20 26 59 29 3b 0a 20 20 45 78 70 72  , 0, &Y);.  Expr
7130: 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c 69 74 65   *temp3 = sqlite
7140: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7150: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 5a 29 3b  K_ID, 0, 0, &Z);
7160: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 34 20 3d  .  Expr *temp4 =
7170: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
7180: 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65  arse, TK_DOT, te
7190: 6d 70 32 2c 20 74 65 6d 70 33 2c 20 30 29 3b 0a  mp2, temp3, 0);.
71a0: 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69    A.pExpr = sqli
71b0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
71c0: 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20   TK_DOT, temp1, 
71d0: 74 65 6d 70 34 2c 20 30 29 3b 0a 20 20 73 70 61  temp4, 0);.  spa
71e0: 6e 53 65 74 28 26 41 2c 26 58 2c 26 5a 29 3b 0a  nSet(&A,&X,&Z);.
71f0: 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 49 4e  }.term(A) ::= IN
7200: 54 45 47 45 52 7c 46 4c 4f 41 54 7c 42 4c 4f 42  TEGER|FLOAT|BLOB
7210: 28 58 29 2e 20 20 7b 73 70 61 6e 45 78 70 72 28  (X).  {spanExpr(
7220: 26 41 2c 20 70 50 61 72 73 65 2c 20 40 58 2c 20  &A, pParse, @X, 
7230: 26 58 29 3b 7d 0a 74 65 72 6d 28 41 29 20 3a 3a  &X);}.term(A) ::
7240: 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20  = STRING(X).    
7250: 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 45            {spanE
7260: 78 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c 20  xpr(&A, pParse, 
7270: 40 58 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41  @X, &X);}.expr(A
7280: 29 20 3a 3a 3d 20 52 45 47 49 53 54 45 52 28 58  ) ::= REGISTER(X
7290: 29 2e 20 20 20 20 20 7b 0a 20 20 2f 2a 20 57 68  ).     {.  /* Wh
72a0: 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74 65  en doing a neste
72b0: 64 20 70 61 72 73 65 2c 20 6f 6e 65 20 63 61 6e  d parse, one can
72c0: 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20 69   include terms i
72d0: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  n an expression.
72e0: 20 20 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c    ** that look l
72f0: 69 6b 65 20 74 68 69 73 3a 20 20 20 23 31 20 23  ike this:   #1 #
7300: 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72  2 ...  These ter
7310: 6d 73 20 72 65 66 65 72 20 74 6f 20 72 65 67 69  ms refer to regi
7320: 73 74 65 72 73 0a 20 20 2a 2a 20 69 6e 20 74 68  sters.  ** in th
7330: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
7340: 65 2e 20 20 23 4e 20 69 73 20 74 68 65 20 4e 2d  e.  #N is the N-
7350: 74 68 20 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a  th register. */.
7360: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65    if( pParse->ne
7370: 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  sted==0 ){.    s
7380: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7390: 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22 25  Parse, "near \"%
73a0: 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f  T\": syntax erro
73b0: 72 22 2c 20 26 58 29 3b 0a 20 20 20 20 41 2e 70  r", &X);.    A.p
73c0: 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Expr = 0;.  }els
73d0: 65 7b 0a 20 20 20 20 41 2e 70 45 78 70 72 20 3d  e{.    A.pExpr =
73e0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
73f0: 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53 54 45  arse, TK_REGISTE
7400: 52 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20  R, 0, 0, &X);.  
7410: 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29 20    if( A.pExpr ) 
7420: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
7430: 26 58 2e 7a 5b 31 5d 2c 20 26 41 2e 70 45 78 70  &X.z[1], &A.pExp
7440: 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 7d 0a  r->iTable);.  }.
7450: 20 20 73 70 61 6e 53 65 74 28 26 41 2c 20 26 58    spanSet(&A, &X
7460: 2c 20 26 58 29 3b 0a 7d 0a 65 78 70 72 28 41 29  , &X);.}.expr(A)
7470: 20 3a 3a 3d 20 56 41 52 49 41 42 4c 45 28 58 29   ::= VARIABLE(X)
7480: 2e 20 20 20 20 20 7b 0a 20 20 73 70 61 6e 45 78  .     {.  spanEx
7490: 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c 20 54  pr(&A, pParse, T
74a0: 4b 5f 56 41 52 49 41 42 4c 45 2c 20 26 58 29 3b  K_VARIABLE, &X);
74b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  .  sqlite3ExprAs
74c0: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 70 50  signVarNumber(pP
74d0: 61 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a  arse, A.pExpr);.
74e0: 20 20 73 70 61 6e 53 65 74 28 26 41 2c 20 26 58    spanSet(&A, &X
74f0: 2c 20 26 58 29 3b 0a 7d 0a 65 78 70 72 28 41 29  , &X);.}.expr(A)
7500: 20 3a 3a 3d 20 65 78 70 72 28 45 29 20 43 4f 4c   ::= expr(E) COL
7510: 4c 41 54 45 20 69 64 73 28 43 29 2e 20 7b 0a 20  LATE ids(C). {. 
7520: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74   A.pExpr = sqlit
7530: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
7540: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 45 2e  Token(pParse, E.
7550: 70 45 78 70 72 2c 20 26 43 29 3b 0a 20 20 41 2e  pExpr, &C);.  A.
7560: 7a 53 74 61 72 74 20 3d 20 45 2e 7a 53 74 61 72  zStart = E.zStar
7570: 74 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26 43  t;.  A.zEnd = &C
7580: 2e 7a 5b 43 2e 6e 5d 3b 0a 7d 0a 25 69 66 6e 64  .z[C.n];.}.%ifnd
7590: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
75a0: 41 53 54 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  AST.expr(A) ::= 
75b0: 43 41 53 54 28 58 29 20 4c 50 20 65 78 70 72 28  CAST(X) LP expr(
75c0: 45 29 20 41 53 20 74 79 70 65 74 6f 6b 65 6e 28  E) AS typetoken(
75d0: 54 29 20 52 50 28 59 29 2e 20 7b 0a 20 20 41 2e  T) RP(Y). {.  A.
75e0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
75f0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
7600: 43 41 53 54 2c 20 45 2e 70 45 78 70 72 2c 20 30  CAST, E.pExpr, 0
7610: 2c 20 26 54 29 3b 0a 20 20 73 70 61 6e 53 65 74  , &T);.  spanSet
7620: 28 26 41 2c 26 58 2c 26 59 29 3b 0a 7d 0a 25 65  (&A,&X,&Y);.}.%e
7630: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
7640: 54 5f 43 41 53 54 0a 65 78 70 72 28 41 29 20 3a  T_CAST.expr(A) :
7650: 3a 3d 20 49 44 28 58 29 20 4c 50 20 64 69 73 74  := ID(X) LP dist
7660: 69 6e 63 74 28 44 29 20 65 78 70 72 6c 69 73 74  inct(D) exprlist
7670: 28 59 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 69  (Y) RP(E). {.  i
7680: 66 28 20 59 20 26 26 20 59 2d 3e 6e 45 78 70 72  f( Y && Y->nExpr
7690: 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69  >pParse->db->aLi
76a0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
76b0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 20 29  _FUNCTION_ARG] )
76c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
76d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
76e0: 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74  oo many argument
76f0: 73 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 25 54  s on function %T
7700: 22 2c 20 26 58 29 3b 0a 20 20 7d 0a 20 20 41 2e  ", &X);.  }.  A.
7710: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
7720: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  xprFunction(pPar
7730: 73 65 2c 20 59 2c 20 26 58 29 3b 0a 20 20 73 70  se, Y, &X);.  sp
7740: 61 6e 53 65 74 28 26 41 2c 26 58 2c 26 45 29 3b  anSet(&A,&X,&E);
7750: 0a 20 20 69 66 28 20 44 20 26 26 20 41 2e 70 45  .  if( D && A.pE
7760: 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70 45 78  xpr ){.    A.pEx
7770: 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  pr->flags |= EP_
7780: 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a 7d 0a  Distinct;.  }.}.
7790: 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58  expr(A) ::= ID(X
77a0: 29 20 4c 50 20 53 54 41 52 20 52 50 28 45 29 2e  ) LP STAR RP(E).
77b0: 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73   {.  A.pExpr = s
77c0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
77d0: 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 26 58  on(pParse, 0, &X
77e0: 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c  );.  spanSet(&A,
77f0: 26 58 2c 26 45 29 3b 0a 7d 0a 74 65 72 6d 28 41  &X,&E);.}.term(A
7800: 29 20 3a 3a 3d 20 43 54 49 4d 45 5f 4b 57 28 4f  ) ::= CTIME_KW(O
7810: 50 29 2e 20 7b 0a 20 20 2f 2a 20 54 68 65 20 43  P). {.  /* The C
7820: 55 52 52 45 4e 54 5f 54 49 4d 45 2c 20 43 55 52  URRENT_TIME, CUR
7830: 52 45 4e 54 5f 44 41 54 45 2c 20 61 6e 64 20 43  RENT_DATE, and C
7840: 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50  URRENT_TIMESTAMP
7850: 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a   values are.  **
7860: 20 74 72 65 61 74 65 64 20 61 73 20 66 75 6e 63   treated as func
7870: 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72  tions that retur
7880: 6e 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20  n constants */. 
7890: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74   A.pExpr = sqlit
78a0: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70  e3ExprFunction(p
78b0: 50 61 72 73 65 2c 20 30 2c 26 4f 50 29 3b 0a 20  Parse, 0,&OP);. 
78c0: 20 69 66 28 20 41 2e 70 45 78 70 72 20 29 7b 0a   if( A.pExpr ){.
78d0: 20 20 20 20 41 2e 70 45 78 70 72 2d 3e 6f 70 20      A.pExpr->op 
78e0: 3d 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3b  = TK_CONST_FUNC;
78f0: 20 20 0a 20 20 7d 0a 20 20 73 70 61 6e 53 65 74    .  }.  spanSet
7900: 28 26 41 2c 20 26 4f 50 2c 20 26 4f 50 29 3b 0a  (&A, &OP, &OP);.
7910: 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20  }..%include {.  
7920: 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  /* This routine 
7930: 63 6f 6e 73 74 72 75 63 74 73 20 61 20 62 69 6e  constructs a bin
7940: 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  ary expression n
7950: 6f 64 65 20 6f 75 74 20 6f 66 20 74 77 6f 20 45  ode out of two E
7960: 78 70 72 53 70 61 6e 0a 20 20 2a 2a 20 6f 62 6a  xprSpan.  ** obj
7970: 65 63 74 73 20 61 6e 64 20 75 73 65 73 20 74 68  ects and uses th
7980: 65 20 72 65 73 75 6c 74 20 74 6f 20 70 6f 70 75  e result to popu
7990: 6c 61 74 65 20 61 20 6e 65 77 20 45 78 70 72 53  late a new ExprS
79a0: 70 61 6e 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2f  pan object..  */
79b0: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73  .  static void s
79c0: 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 0a 20  panBinaryExpr(. 
79d0: 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70 4f 75     ExprSpan *pOu
79e0: 74 2c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  t,     /* Write 
79f0: 74 68 65 20 72 65 73 75 6c 74 20 68 65 72 65 20  the result here 
7a00: 2a 2f 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  */.    Parse *pP
7a10: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
7a20: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
7a30: 74 2e 20 20 45 72 72 6f 72 73 20 61 63 63 75 6d  t.  Errors accum
7a40: 75 6c 61 74 65 20 68 65 72 65 20 2a 2f 0a 20 20  ulate here */.  
7a50: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20    int op,       
7a60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
7a70: 61 72 79 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  ary operation */
7a80: 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70  .    ExprSpan *p
7a90: 4c 65 66 74 2c 20 20 20 20 2f 2a 20 54 68 65 20  Left,    /* The 
7aa0: 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  left operand */.
7ab0: 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70 52      ExprSpan *pR
7ac0: 69 67 68 74 20 20 20 20 2f 2a 20 54 68 65 20 72  ight    /* The r
7ad0: 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  ight operand */.
7ae0: 20 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 70    ){.    pOut->p
7af0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
7b00: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 2c 20  xpr(pParse, op, 
7b10: 70 4c 65 66 74 2d 3e 70 45 78 70 72 2c 20 70 52  pLeft->pExpr, pR
7b20: 69 67 68 74 2d 3e 70 45 78 70 72 2c 20 30 29 3b  ight->pExpr, 0);
7b30: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53 74 61 72  .    pOut->zStar
7b40: 74 20 3d 20 70 4c 65 66 74 2d 3e 7a 53 74 61 72  t = pLeft->zStar
7b50: 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e  t;.    pOut->zEn
7b60: 64 20 3d 20 70 52 69 67 68 74 2d 3e 7a 45 6e 64  d = pRight->zEnd
7b70: 3b 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29  ;.  }.}..expr(A)
7b80: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 41 4e 44   ::= expr(X) AND
7b90: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20  (OP) expr(Y).   
7ba0: 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72   {spanBinaryExpr
7bb0: 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26  (&A,pParse,@OP,&
7bc0: 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29 20  X,&Y);}.expr(A) 
7bd0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4f 52 28 4f  ::= expr(X) OR(O
7be0: 50 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 20  P) expr(Y).     
7bf0: 7b 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28  {spanBinaryExpr(
7c00: 26 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26 58  &A,pParse,@OP,&X
7c10: 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  ,&Y);}.expr(A) :
7c20: 3a 3d 20 65 78 70 72 28 58 29 20 4c 54 7c 47 54  := expr(X) LT|GT
7c30: 7c 47 45 7c 4c 45 28 4f 50 29 20 65 78 70 72 28  |GE|LE(OP) expr(
7c40: 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  Y)..            
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61              {spa
7c70: 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70  nBinaryExpr(&A,p
7c80: 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26 59 29  Parse,@OP,&X,&Y)
7c90: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  ;}.expr(A) ::= e
7ca0: 78 70 72 28 58 29 20 45 51 7c 4e 45 28 4f 50 29  xpr(X) EQ|NE(OP)
7cb0: 20 65 78 70 72 28 59 29 2e 20 20 7b 73 70 61 6e   expr(Y).  {span
7cc0: 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50  BinaryExpr(&A,pP
7cd0: 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b  arse,@OP,&X,&Y);
7ce0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
7cf0: 70 72 28 58 29 20 42 49 54 41 4e 44 7c 42 49 54  pr(X) BITAND|BIT
7d00: 4f 52 7c 4c 53 48 49 46 54 7c 52 53 48 49 46 54  OR|LSHIFT|RSHIFT
7d10: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20 20  (OP) expr(Y)..  
7d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d40: 20 20 20 20 20 20 7b 73 70 61 6e 42 69 6e 61 72        {spanBinar
7d50: 79 45 78 70 72 28 26 41 2c 70 50 61 72 73 65 2c  yExpr(&A,pParse,
7d60: 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 65 78 70  @OP,&X,&Y);}.exp
7d70: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
7d80: 20 50 4c 55 53 7c 4d 49 4e 55 53 28 4f 50 29 20   PLUS|MINUS(OP) 
7d90: 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20  expr(Y)..       
7da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72   {spanBinaryExpr
7dd0: 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26  (&A,pParse,@OP,&
7de0: 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29 20  X,&Y);}.expr(A) 
7df0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 53 54 41 52  ::= expr(X) STAR
7e00: 7c 53 4c 41 53 48 7c 52 45 4d 28 4f 50 29 20 65  |SLASH|REM(OP) e
7e10: 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20  xpr(Y)..        
7e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e40: 7b 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28  {spanBinaryExpr(
7e50: 26 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26 58  &A,pParse,@OP,&X
7e60: 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  ,&Y);}.expr(A) :
7e70: 3a 3d 20 65 78 70 72 28 58 29 20 43 4f 4e 43 41  := expr(X) CONCA
7e80: 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 7b  T(OP) expr(Y). {
7e90: 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26  spanBinaryExpr(&
7ea0: 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c  A,pParse,@OP,&X,
7eb0: 26 59 29 3b 7d 0a 25 74 79 70 65 20 6c 69 6b 65  &Y);}.%type like
7ec0: 6f 70 20 7b 73 74 72 75 63 74 20 4c 69 6b 65 4f  op {struct LikeO
7ed0: 70 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d  p}.likeop(A) ::=
7ee0: 20 4c 49 4b 45 5f 4b 57 28 58 29 2e 20 20 20 20   LIKE_KW(X).    
7ef0: 20 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20   {A.eOperator = 
7f00: 58 3b 20 41 2e 62 4e 6f 74 20 3d 20 30 3b 7d 0a  X; A.bNot = 0;}.
7f10: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f  likeop(A) ::= NO
7f20: 54 20 4c 49 4b 45 5f 4b 57 28 58 29 2e 20 7b 41  T LIKE_KW(X). {A
7f30: 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20 58 3b 20  .eOperator = X; 
7f40: 41 2e 62 4e 6f 74 20 3d 20 31 3b 7d 0a 6c 69 6b  A.bNot = 1;}.lik
7f50: 65 6f 70 28 41 29 20 3a 3a 3d 20 4d 41 54 43 48  eop(A) ::= MATCH
7f60: 28 58 29 2e 20 20 20 20 20 20 20 7b 41 2e 65 4f  (X).       {A.eO
7f70: 70 65 72 61 74 6f 72 20 3d 20 58 3b 20 41 2e 62  perator = X; A.b
7f80: 4e 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b 65 6f 70  Not = 0;}.likeop
7f90: 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4d 41 54 43  (A) ::= NOT MATC
7fa0: 48 28 58 29 2e 20 20 20 7b 41 2e 65 4f 70 65 72  H(X).   {A.eOper
7fb0: 61 74 6f 72 20 3d 20 58 3b 20 41 2e 62 4e 6f 74  ator = X; A.bNot
7fc0: 20 3d 20 31 3b 7d 0a 65 78 70 72 28 41 29 20 3a   = 1;}.expr(A) :
7fd0: 3a 3d 20 65 78 70 72 28 58 29 20 6c 69 6b 65 6f  := expr(X) likeo
7fe0: 70 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20  p(OP) expr(Y).  
7ff0: 5b 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20 20 45  [LIKE_KW]  {.  E
8000: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
8010: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
8020: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
8030: 70 50 61 72 73 65 2c 30 2c 20 59 2e 70 45 78 70  pParse,0, Y.pExp
8040: 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
8050: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
8060: 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74  end(pParse,pList
8070: 2c 20 58 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e  , X.pExpr);.  A.
8080: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
8090: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  xprFunction(pPar
80a0: 73 65 2c 20 70 4c 69 73 74 2c 20 26 4f 50 2e 65  se, pList, &OP.e
80b0: 4f 70 65 72 61 74 6f 72 29 3b 0a 20 20 69 66 28  Operator);.  if(
80c0: 20 4f 50 2e 62 4e 6f 74 20 29 20 41 2e 70 45 78   OP.bNot ) A.pEx
80d0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
80e0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54  r(pParse, TK_NOT
80f0: 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20 30 29  , A.pExpr, 0, 0)
8100: 3b 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58  ;.  A.zStart = X
8110: 2e 7a 53 74 61 72 74 3b 0a 20 20 41 2e 7a 45 6e  .zStart;.  A.zEn
8120: 64 20 3d 20 59 2e 7a 45 6e 64 3b 0a 20 20 69 66  d = Y.zEnd;.  if
8130: 28 20 41 2e 70 45 78 70 72 20 29 20 41 2e 70 45  ( A.pExpr ) A.pE
8140: 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
8150: 5f 49 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a 65 78  _InfixFunc;.}.ex
8160: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
8170: 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65 78 70  ) likeop(OP) exp
8180: 72 28 59 29 20 45 53 43 41 50 45 20 65 78 70 72  r(Y) ESCAPE expr
8190: 28 45 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57 5d 20  (E).  [LIKE_KW] 
81a0: 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70   {.  ExprList *p
81b0: 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20  List;.  pList = 
81c0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
81d0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 20  ppend(pParse,0, 
81e0: 59 2e 70 45 78 70 72 29 3b 0a 20 20 70 4c 69 73  Y.pExpr);.  pLis
81f0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8200: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
8210: 2c 70 4c 69 73 74 2c 20 58 2e 70 45 78 70 72 29  ,pList, X.pExpr)
8220: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
8230: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8240: 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20  d(pParse,pList, 
8250: 45 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70 45  E.pExpr);.  A.pE
8260: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
8270: 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  rFunction(pParse
8280: 2c 20 70 4c 69 73 74 2c 20 26 4f 50 2e 65 4f 70  , pList, &OP.eOp
8290: 65 72 61 74 6f 72 29 3b 0a 20 20 69 66 28 20 4f  erator);.  if( O
82a0: 50 2e 62 4e 6f 74 20 29 20 41 2e 70 45 78 70 72  P.bNot ) A.pExpr
82b0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
82c0: 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20  pParse, TK_NOT, 
82d0: 41 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  A.pExpr, 0, 0);.
82e0: 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a    A.zStart = X.z
82f0: 53 74 61 72 74 3b 0a 20 20 41 2e 7a 45 6e 64 20  Start;.  A.zEnd 
8300: 3d 20 45 2e 7a 45 6e 64 3b 0a 20 20 69 66 28 20  = E.zEnd;.  if( 
8310: 41 2e 70 45 78 70 72 20 29 20 41 2e 70 45 78 70  A.pExpr ) A.pExp
8320: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  r->flags |= EP_I
8330: 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a 0a 25 69 6e  nfixFunc;.}..%in
8340: 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 43 6f 6e  clude {.  /* Con
8350: 73 74 72 75 63 74 20 61 6e 20 65 78 70 72 65 73  struct an expres
8360: 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20  sion node for a 
8370: 75 6e 61 72 79 20 70 6f 73 74 66 69 78 20 6f 70  unary postfix op
8380: 65 72 61 74 6f 72 0a 20 20 2a 2f 0a 20 20 73 74  erator.  */.  st
8390: 61 74 69 63 20 76 6f 69 64 20 73 70 61 6e 55 6e  atic void spanUn
83a0: 61 72 79 50 6f 73 74 66 69 78 28 0a 20 20 20 20  aryPostfix(.    
83b0: 45 78 70 72 53 70 61 6e 20 2a 70 4f 75 74 2c 20  ExprSpan *pOut, 
83c0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
83d0: 74 68 65 20 6e 65 77 20 65 78 70 72 65 73 73 69  the new expressi
83e0: 6f 6e 20 6e 6f 64 65 20 68 65 72 65 20 2a 2f 0a  on node here */.
83f0: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
8400: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
8410: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f  rsing context to
8420: 20 72 65 63 6f 72 64 20 65 72 72 6f 72 73 20 2a   record errors *
8430: 2f 0a 20 20 20 20 69 6e 74 20 6f 70 2c 20 20 20  /.    int op,   
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8450: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  The operator */.
8460: 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70 4f      ExprSpan *pO
8470: 70 65 72 61 6e 64 2c 20 20 20 20 2f 2a 20 54 68  perand,    /* Th
8480: 65 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 20  e operand */.   
8490: 20 54 6f 6b 65 6e 20 2a 70 50 6f 73 74 4f 70 20   Token *pPostOp 
84a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
84b0: 70 65 72 61 6e 64 20 74 6f 6b 65 6e 20 66 6f 72  perand token for
84c0: 20 73 65 74 74 69 6e 67 20 74 68 65 20 73 70 61   setting the spa
84d0: 6e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20 70 4f  n */.  ){.    pO
84e0: 75 74 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69  ut->pExpr = sqli
84f0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
8500: 20 6f 70 2c 20 70 4f 70 65 72 61 6e 64 2d 3e 70   op, pOperand->p
8510: 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
8520: 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d 20   pOut->zStart = 
8530: 70 4f 70 65 72 61 6e 64 2d 3e 7a 53 74 61 72 74  pOperand->zStart
8540: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64  ;.    pOut->zEnd
8550: 20 3d 20 26 70 50 6f 73 74 4f 70 2d 3e 7a 5b 70   = &pPostOp->z[p
8560: 50 6f 73 74 4f 70 2d 3e 6e 5d 3b 0a 20 20 7d 20  PostOp->n];.  } 
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8580: 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a 65 78            .}..ex
8590: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
85a0: 29 20 49 53 4e 55 4c 4c 7c 4e 4f 54 4e 55 4c 4c  ) ISNULL|NOTNULL
85b0: 28 45 29 2e 20 20 20 7b 73 70 61 6e 55 6e 61 72  (E).   {spanUnar
85c0: 79 50 6f 73 74 66 69 78 28 26 41 2c 70 50 61 72  yPostfix(&A,pPar
85d0: 73 65 2c 40 45 2c 26 58 2c 26 45 29 3b 7d 0a 65  se,@E,&X,&E);}.e
85e0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
85f0: 58 29 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20  X) NOT NULL(E). 
8600: 7b 73 70 61 6e 55 6e 61 72 79 50 6f 73 74 66 69  {spanUnaryPostfi
8610: 78 28 26 41 2c 70 50 61 72 73 65 2c 54 4b 5f 4e  x(&A,pParse,TK_N
8620: 4f 54 4e 55 4c 4c 2c 26 58 2c 26 45 29 3b 7d 0a  OTNULL,&X,&E);}.
8630: 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a  .%include {.  /*
8640: 20 41 20 72 6f 75 74 69 6e 65 20 74 6f 20 63 6f   A routine to co
8650: 6e 76 65 72 74 20 61 20 62 69 6e 61 72 79 20 54  nvert a binary T
8660: 4b 5f 49 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54  K_IS or TK_ISNOT
8670: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f   expression into
8680: 20 61 0a 20 20 2a 2a 20 75 6e 61 72 79 20 54 4b   a.  ** unary TK
8690: 5f 49 53 4e 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f  _ISNULL or TK_NO
86a0: 54 4e 55 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e  TNULL expression
86b0: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f  . */.  static vo
86c0: 69 64 20 62 69 6e 61 72 79 54 6f 55 6e 61 72 79  id binaryToUnary
86d0: 49 66 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50  IfNull(Parse *pP
86e0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 59 2c 20  arse, Expr *pY, 
86f0: 45 78 70 72 20 2a 70 41 2c 20 69 6e 74 20 6f 70  Expr *pA, int op
8700: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
8710: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8720: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
8730: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26 26 20  locFailed==0 && 
8740: 70 59 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20  pY->op==TK_NULL 
8750: 29 7b 0a 20 20 20 20 20 20 70 41 2d 3e 6f 70 20  ){.      pA->op 
8760: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20  = (u8)op;.      
8770: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8780: 65 28 64 62 2c 20 70 41 2d 3e 70 52 69 67 68 74  e(db, pA->pRight
8790: 29 3b 0a 20 20 20 20 20 20 70 41 2d 3e 70 52 69  );.      pA->pRi
87a0: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ght = 0;.    }. 
87b0: 20 7d 0a 7d 0a 0a 2f 2f 20 20 20 20 65 78 70 72   }.}..//    expr
87c0: 31 20 49 53 20 65 78 70 72 32 0a 2f 2f 20 20 20  1 IS expr2.//   
87d0: 20 65 78 70 72 31 20 49 53 20 4e 4f 54 20 65 78   expr1 IS NOT ex
87e0: 70 72 32 0a 2f 2f 0a 2f 2f 20 49 66 20 65 78 70  pr2.//.// If exp
87f0: 72 32 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  r2 is NULL then 
8800: 63 6f 64 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c  code as TK_ISNUL
8810: 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2e  L or TK_NOTNULL.
8820: 20 20 49 66 20 65 78 70 72 32 0a 2f 2f 20 69 73    If expr2.// is
8830: 20 61 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   any other expre
8840: 73 73 69 6f 6e 2c 20 63 6f 64 65 20 61 73 20 54  ssion, code as T
8850: 4b 5f 49 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54  K_IS or TK_ISNOT
8860: 2e 0a 2f 2f 20 0a 65 78 70 72 28 41 29 20 3a 3a  ..// .expr(A) ::
8870: 3d 20 65 78 70 72 28 58 29 20 49 53 20 65 78 70  = expr(X) IS exp
8880: 72 28 59 29 2e 20 20 20 20 20 7b 0a 20 20 73 70  r(Y).     {.  sp
8890: 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c  anBinaryExpr(&A,
88a0: 70 50 61 72 73 65 2c 54 4b 5f 49 53 2c 26 58 2c  pParse,TK_IS,&X,
88b0: 26 59 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55  &Y);.  binaryToU
88c0: 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73  naryIfNull(pPars
88d0: 65 2c 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 45  e, Y.pExpr, A.pE
88e0: 78 70 72 2c 20 54 4b 5f 49 53 4e 55 4c 4c 29 3b  xpr, TK_ISNULL);
88f0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .}.expr(A) ::= e
8900: 78 70 72 28 58 29 20 49 53 20 4e 4f 54 20 65 78  xpr(X) IS NOT ex
8910: 70 72 28 59 29 2e 20 7b 0a 20 20 73 70 61 6e 42  pr(Y). {.  spanB
8920: 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50 61  inaryExpr(&A,pPa
8930: 72 73 65 2c 54 4b 5f 49 53 4e 4f 54 2c 26 58 2c  rse,TK_ISNOT,&X,
8940: 26 59 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55  &Y);.  binaryToU
8950: 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73  naryIfNull(pPars
8960: 65 2c 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 45  e, Y.pExpr, A.pE
8970: 78 70 72 2c 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29  xpr, TK_NOTNULL)
8980: 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a  ;.}..%include {.
8990: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
89a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  n expression nod
89b0: 65 20 66 6f 72 20 61 20 75 6e 61 72 79 20 70 72  e for a unary pr
89c0: 65 66 69 78 20 6f 70 65 72 61 74 6f 72 0a 20 20  efix operator.  
89d0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
89e0: 20 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78   spanUnaryPrefix
89f0: 28 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a  (.    ExprSpan *
8a00: 70 4f 75 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  pOut,        /* 
8a10: 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 65 78  Write the new ex
8a20: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 68 65  pression node he
8a30: 72 65 20 2a 2f 0a 20 20 20 20 50 61 72 73 65 20  re */.    Parse 
8a40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8a50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8a60: 65 78 74 20 74 6f 20 72 65 63 6f 72 64 20 65 72  ext to record er
8a70: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rors */.    int 
8a80: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
8a90: 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74     /* The operat
8aa0: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 70  or */.    ExprSp
8ab0: 61 6e 20 2a 70 4f 70 65 72 61 6e 64 2c 20 20 20  an *pOperand,   
8ac0: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 6e 64 20   /* The operand 
8ad0: 2a 2f 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50  */.    Token *pP
8ae0: 72 65 4f 70 20 20 20 20 20 20 20 20 20 2f 2a 20  reOp         /* 
8af0: 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65  The operand toke
8b00: 6e 20 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68  n for setting th
8b10: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20  e span */.  ){. 
8b20: 20 20 20 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d     pOut->pExpr =
8b30: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
8b40: 61 72 73 65 2c 20 6f 70 2c 20 70 4f 70 65 72 61  arse, op, pOpera
8b50: 6e 64 2d 3e 70 45 78 70 72 2c 20 30 2c 20 30 29  nd->pExpr, 0, 0)
8b60: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53 74 61  ;.    pOut->zSta
8b70: 72 74 20 3d 20 70 50 72 65 4f 70 2d 3e 7a 3b 0a  rt = pPreOp->z;.
8b80: 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64 20 3d      pOut->zEnd =
8b90: 20 70 4f 70 65 72 61 6e 64 2d 3e 7a 45 6e 64 3b   pOperand->zEnd;
8ba0: 0a 20 20 7d 0a 7d 0a 0a 0a 0a 65 78 70 72 28 41  .  }.}....expr(A
8bb0: 29 20 3a 3a 3d 20 4e 4f 54 28 42 29 20 65 78 70  ) ::= NOT(B) exp
8bc0: 72 28 58 29 2e 20 20 20 20 7b 73 70 61 6e 55 6e  r(X).    {spanUn
8bd0: 61 72 79 50 72 65 66 69 78 28 26 41 2c 70 50 61  aryPrefix(&A,pPa
8be0: 72 73 65 2c 40 42 2c 26 58 2c 26 42 29 3b 7d 0a  rse,@B,&X,&B);}.
8bf0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 42 49 54 4e  expr(A) ::= BITN
8c00: 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e 20 7b  OT(B) expr(X). {
8c10: 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28  spanUnaryPrefix(
8c20: 26 41 2c 70 50 61 72 73 65 2c 40 42 2c 26 58 2c  &A,pParse,@B,&X,
8c30: 26 42 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  &B);}.expr(A) ::
8c40: 3d 20 4d 49 4e 55 53 28 42 29 20 65 78 70 72 28  = MINUS(B) expr(
8c50: 58 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20  X). [BITNOT].   
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c70: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61              {spa
8c80: 6e 55 6e 61 72 79 50 72 65 66 69 78 28 26 41 2c  nUnaryPrefix(&A,
8c90: 70 50 61 72 73 65 2c 54 4b 5f 55 4d 49 4e 55 53  pParse,TK_UMINUS
8ca0: 2c 26 58 2c 26 42 29 3b 7d 0a 65 78 70 72 28 41  ,&X,&B);}.expr(A
8cb0: 29 20 3a 3a 3d 20 50 4c 55 53 28 42 29 20 65 78  ) ::= PLUS(B) ex
8cc0: 70 72 28 58 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a  pr(X). [BITNOT].
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8cf0: 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28  spanUnaryPrefix(
8d00: 26 41 2c 70 50 61 72 73 65 2c 54 4b 5f 55 50 4c  &A,pParse,TK_UPL
8d10: 55 53 2c 26 58 2c 26 42 29 3b 7d 0a 0a 25 74 79  US,&X,&B);}..%ty
8d20: 70 65 20 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69  pe between_op {i
8d30: 6e 74 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41  nt}.between_op(A
8d40: 29 20 3a 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20  ) ::= BETWEEN.  
8d50: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77     {A = 0;}.betw
8d60: 65 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f  een_op(A) ::= NO
8d70: 54 20 42 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20  T BETWEEN. {A = 
8d80: 31 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  1;}.expr(A) ::= 
8d90: 65 78 70 72 28 57 29 20 62 65 74 77 65 65 6e 5f  expr(W) between_
8da0: 6f 70 28 4e 29 20 65 78 70 72 28 58 29 20 41 4e  op(N) expr(X) AN
8db0: 44 20 65 78 70 72 28 59 29 2e 20 5b 42 45 54 57  D expr(Y). [BETW
8dc0: 45 45 4e 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73  EEN] {.  ExprLis
8dd0: 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  t *pList = sqlit
8de0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
8df0: 28 70 50 61 72 73 65 2c 30 2c 20 58 2e 70 45 78  (pParse,0, X.pEx
8e00: 70 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  pr);.  pList = s
8e10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
8e20: 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73  pend(pParse,pLis
8e30: 74 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 41  t, Y.pExpr);.  A
8e40: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
8e50: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
8e60: 5f 42 45 54 57 45 45 4e 2c 20 57 2e 70 45 78 70  _BETWEEN, W.pExp
8e70: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  r, 0, 0);.  if( 
8e80: 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 41  A.pExpr ){.    A
8e90: 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  .pExpr->x.pList 
8ea0: 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 65 6c 73 65  = pList;.  }else
8eb0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
8ec0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
8ed0: 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
8ee0: 20 20 7d 20 0a 20 20 69 66 28 20 4e 20 29 20 41    } .  if( N ) A
8ef0: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
8f00: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
8f10: 5f 4e 4f 54 2c 20 41 2e 70 45 78 70 72 2c 20 30  _NOT, A.pExpr, 0
8f20: 2c 20 30 29 3b 0a 20 20 41 2e 7a 53 74 61 72 74  , 0);.  A.zStart
8f30: 20 3d 20 57 2e 7a 53 74 61 72 74 3b 0a 20 20 41   = W.zStart;.  A
8f40: 2e 7a 45 6e 64 20 3d 20 59 2e 7a 45 6e 64 3b 0a  .zEnd = Y.zEnd;.
8f50: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
8f60: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
8f70: 20 25 74 79 70 65 20 69 6e 5f 6f 70 20 7b 69 6e   %type in_op {in
8f80: 74 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a  t}.  in_op(A) ::
8f90: 3d 20 49 4e 2e 20 20 20 20 20 20 7b 41 20 3d 20  = IN.      {A = 
8fa0: 30 3b 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a  0;}.  in_op(A) :
8fb0: 3a 3d 20 4e 4f 54 20 49 4e 2e 20 20 7b 41 20 3d  := NOT IN.  {A =
8fc0: 20 31 3b 7d 0a 20 20 65 78 70 72 28 41 29 20 3a   1;}.  expr(A) :
8fd0: 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70  := expr(X) in_op
8fe0: 28 4e 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28  (N) LP exprlist(
8ff0: 59 29 20 52 50 28 45 29 2e 20 5b 49 4e 5d 20 7b  Y) RP(E). [IN] {
9000: 0a 20 20 20 20 69 66 28 20 59 3d 3d 30 20 29 7b  .    if( Y==0 ){
9010: 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
9020: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
9030: 6d 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  m.      **.     
9040: 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31 20 49   **      expr1 I
9050: 4e 20 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  N ().      **   
9060: 20 20 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20     expr1 NOT IN 
9070: 28 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  ().      **.    
9080: 20 20 2a 2a 20 73 69 6d 70 6c 69 66 79 20 74 6f    ** simplify to
9090: 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 28 66 61   constants 0 (fa
90a0: 6c 73 65 29 20 61 6e 64 20 31 20 28 74 72 75 65  lse) and 1 (true
90b0: 29 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  ), respectively,
90c0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 61 72 64  .      ** regard
90d0: 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
90e0: 65 20 6f 66 20 65 78 70 72 31 2e 0a 20 20 20 20  e of expr1..    
90f0: 20 20 2a 2f 0a 20 20 20 20 20 20 41 2e 70 45 78    */.      A.pEx
9100: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9110: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54  r(pParse, TK_INT
9120: 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 73 71 6c  EGER, 0, 0, &sql
9130: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 4e 5d  ite3IntTokens[N]
9140: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9150: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
9160: 65 2d 3e 64 62 2c 20 58 2e 70 45 78 70 72 29 3b  e->db, X.pExpr);
9170: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9180: 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69    A.pExpr = sqli
9190: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
91a0: 20 54 4b 5f 49 4e 2c 20 58 2e 70 45 78 70 72 2c   TK_IN, X.pExpr,
91b0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
91c0: 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  ( A.pExpr ){.   
91d0: 20 20 20 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e       A.pExpr->x.
91e0: 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 20 20 20  pList = Y;.     
91f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
9200: 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  tHeight(pParse, 
9210: 41 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  A.pExpr);.      
9220: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
9230: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9240: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9250: 20 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   Y);.      }.   
9260: 20 20 20 69 66 28 20 4e 20 29 20 41 2e 70 45 78     if( N ) A.pEx
9270: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9280: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54  r(pParse, TK_NOT
9290: 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20 30 29  , A.pExpr, 0, 0)
92a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 2e 7a 53  ;.    }.    A.zS
92b0: 74 61 72 74 20 3d 20 58 2e 7a 53 74 61 72 74 3b  tart = X.zStart;
92c0: 0a 20 20 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45  .    A.zEnd = &E
92d0: 2e 7a 5b 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65  .z[E.n];.  }.  e
92e0: 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29  xpr(A) ::= LP(B)
92f0: 20 73 65 6c 65 63 74 28 58 29 20 52 50 28 45 29   select(X) RP(E)
9300: 2e 20 7b 0a 20 20 20 20 41 2e 70 45 78 70 72 20  . {.    A.pExpr 
9310: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9320: 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54  Parse, TK_SELECT
9330: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
9340: 69 66 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20  if( A.pExpr ){. 
9350: 20 20 20 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e       A.pExpr->x.
9360: 70 53 65 6c 65 63 74 20 3d 20 58 3b 0a 20 20 20  pSelect = X;.   
9370: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
9380: 74 79 28 41 2e 70 45 78 70 72 2c 20 45 50 5f 78  ty(A.pExpr, EP_x
9390: 49 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  IsSelect);.     
93a0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
93b0: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 41 2e  eight(pParse, A.
93c0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73  pExpr);.    }els
93d0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
93e0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61  SelectDelete(pPa
93f0: 72 73 65 2d 3e 64 62 2c 20 58 29 3b 0a 20 20 20  rse->db, X);.   
9400: 20 7d 0a 20 20 20 20 41 2e 7a 53 74 61 72 74 20   }.    A.zStart 
9410: 3d 20 42 2e 7a 3b 0a 20 20 20 20 41 2e 7a 45 6e  = B.z;.    A.zEn
9420: 64 20 3d 20 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a 20  d = &E.z[E.n];. 
9430: 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d   }.  expr(A) ::=
9440: 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e   expr(X) in_op(N
9450: 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52  ) LP select(Y) R
9460: 50 28 45 29 2e 20 20 5b 49 4e 5d 20 7b 0a 20 20  P(E).  [IN] {.  
9470: 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69    A.pExpr = sqli
9480: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
9490: 20 54 4b 5f 49 4e 2c 20 58 2e 70 45 78 70 72 2c   TK_IN, X.pExpr,
94a0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
94b0: 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20  A.pExpr ){.     
94c0: 20 41 2e 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c   A.pExpr->x.pSel
94d0: 65 63 74 20 3d 20 59 3b 0a 20 20 20 20 20 20 45  ect = Y;.      E
94e0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 41  xprSetProperty(A
94f0: 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  .pExpr, EP_xIsSe
9500: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  lect);.      sql
9510: 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68  ite3ExprSetHeigh
9520: 74 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78 70  t(pParse, A.pExp
9530: 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
9540: 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
9550: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
9560: 3e 64 62 2c 20 59 29 3b 0a 20 20 20 20 7d 0a 20  >db, Y);.    }. 
9570: 20 20 20 69 66 28 20 4e 20 29 20 41 2e 70 45 78     if( N ) A.pEx
9580: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9590: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54  r(pParse, TK_NOT
95a0: 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20 30 29  , A.pExpr, 0, 0)
95b0: 3b 0a 20 20 20 20 41 2e 7a 53 74 61 72 74 20 3d  ;.    A.zStart =
95c0: 20 58 2e 7a 53 74 61 72 74 3b 0a 20 20 20 20 41   X.zStart;.    A
95d0: 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b 45 2e 6e  .zEnd = &E.z[E.n
95e0: 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29  ];.  }.  expr(A)
95f0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f   ::= expr(X) in_
9600: 6f 70 28 4e 29 20 6e 6d 28 59 29 20 64 62 6e 6d  op(N) nm(Y) dbnm
9610: 28 5a 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20 20 20  (Z). [IN] {.    
9620: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20 3d 20  SrcList *pSrc = 
9630: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
9640: 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  pend(pParse->db,
9650: 20 30 2c 26 59 2c 26 5a 29 3b 0a 20 20 20 20 41   0,&Y,&Z);.    A
9660: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
9670: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
9680: 5f 49 4e 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c  _IN, X.pExpr, 0,
9690: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 41 2e 70   0);.    if( A.p
96a0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 41 2e  Expr ){.      A.
96b0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
96c0: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
96d0: 4e 65 77 28 70 50 61 72 73 65 2c 20 30 2c 70 53  New(pParse, 0,pS
96e0: 72 63 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  rc,0,0,0,0,0,0,0
96f0: 29 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74  );.      ExprSet
9700: 50 72 6f 70 65 72 74 79 28 41 2e 70 45 78 70 72  Property(A.pExpr
9710: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 3b  , EP_xIsSelect);
9720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9730: 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61 72  prSetHeight(pPar
9740: 73 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20  se, A.pExpr);.  
9750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
9760: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
9770: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
9780: 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pSrc);.    }.   
9790: 20 69 66 28 20 4e 20 29 20 41 2e 70 45 78 70 72   if( N ) A.pExpr
97a0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
97b0: 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20  pParse, TK_NOT, 
97c0: 41 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  A.pExpr, 0, 0);.
97d0: 20 20 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58      A.zStart = X
97e0: 2e 7a 53 74 61 72 74 3b 0a 20 20 20 20 41 2e 7a  .zStart;.    A.z
97f0: 45 6e 64 20 3d 20 5a 2e 7a 20 3f 20 26 5a 2e 7a  End = Z.z ? &Z.z
9800: 5b 5a 2e 6e 5d 20 3a 20 26 59 2e 7a 5b 59 2e 6e  [Z.n] : &Y.z[Y.n
9810: 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29  ];.  }.  expr(A)
9820: 20 3a 3a 3d 20 45 58 49 53 54 53 28 42 29 20 4c   ::= EXISTS(B) L
9830: 50 20 73 65 6c 65 63 74 28 59 29 20 52 50 28 45  P select(Y) RP(E
9840: 29 2e 20 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ). {.    Expr *p
9850: 20 3d 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c   = A.pExpr = sql
9860: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
9870: 2c 20 54 4b 5f 45 58 49 53 54 53 2c 20 30 2c 20  , TK_EXISTS, 0, 
9880: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  0, 0);.    if( p
9890: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 78 2e 70   ){.      p->x.p
98a0: 53 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 20 20  Select = Y;.    
98b0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
98c0: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
98d0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
98e0: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28 70  3ExprSetHeight(p
98f0: 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d  Parse, p);.    }
9900: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
9910: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
9920: 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29 3b 0a  pParse->db, Y);.
9930: 20 20 20 20 7d 0a 20 20 20 20 41 2e 7a 53 74 61      }.    A.zSta
9940: 72 74 20 3d 20 42 2e 7a 3b 0a 20 20 20 20 41 2e  rt = B.z;.    A.
9950: 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b 45 2e 6e 5d  zEnd = &E.z[E.n]
9960: 3b 0a 20 20 7d 0a 25 65 6e 64 69 66 20 53 51 4c  ;.  }.%endif SQL
9970: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9980: 59 0a 0a 2f 2a 20 43 41 53 45 20 65 78 70 72 65  Y../* CASE expre
9990: 73 73 69 6f 6e 73 20 2a 2f 0a 65 78 70 72 28 41  ssions */.expr(A
99a0: 29 20 3a 3a 3d 20 43 41 53 45 28 43 29 20 63 61  ) ::= CASE(C) ca
99b0: 73 65 5f 6f 70 65 72 61 6e 64 28 58 29 20 63 61  se_operand(X) ca
99c0: 73 65 5f 65 78 70 72 6c 69 73 74 28 59 29 20 63  se_exprlist(Y) c
99d0: 61 73 65 5f 65 6c 73 65 28 5a 29 20 45 4e 44 28  ase_else(Z) END(
99e0: 45 29 2e 20 7b 0a 20 20 41 2e 70 45 78 70 72 20  E). {.  A.pExpr 
99f0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9a00: 50 61 72 73 65 2c 20 54 4b 5f 43 41 53 45 2c 20  Parse, TK_CASE, 
9a10: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  X, 0, 0);.  if( 
9a20: 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 41  A.pExpr ){.    A
9a30: 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  .pExpr->x.pList 
9a40: 3d 20 5a 20 3f 20 73 71 6c 69 74 65 33 45 78 70  = Z ? sqlite3Exp
9a50: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
9a60: 73 65 2c 59 2c 5a 29 20 3a 20 59 3b 0a 20 20 20  se,Y,Z) : Y;.   
9a70: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
9a80: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 41 2e  eight(pParse, A.
9a90: 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  pExpr);.  }else{
9aa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
9ab0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
9ac0: 65 2d 3e 64 62 2c 20 59 29 3b 0a 20 20 20 20 73  e->db, Y);.    s
9ad0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9ae0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 5a 29 3b  (pParse->db, Z);
9af0: 0a 20 20 7d 0a 20 20 41 2e 7a 53 74 61 72 74 20  .  }.  A.zStart 
9b00: 3d 20 43 2e 7a 3b 0a 20 20 41 2e 7a 45 6e 64 20  = C.z;.  A.zEnd 
9b10: 3d 20 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a 7d 0a 25  = &E.z[E.n];.}.%
9b20: 74 79 70 65 20 63 61 73 65 5f 65 78 70 72 6c 69  type case_exprli
9b30: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
9b40: 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f  destructor case_
9b50: 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65  exprlist {sqlite
9b60: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9b70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
9b80: 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28  }.case_exprlist(
9b90: 41 29 20 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72  A) ::= case_expr
9ba0: 6c 69 73 74 28 58 29 20 57 48 45 4e 20 65 78 70  list(X) WHEN exp
9bb0: 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28 5a  r(Y) THEN expr(Z
9bc0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
9bd0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9be0: 28 70 50 61 72 73 65 2c 58 2c 20 59 2e 70 45 78  (pParse,X, Y.pEx
9bf0: 70 72 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74  pr);.  A = sqlit
9c00: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
9c10: 28 70 50 61 72 73 65 2c 41 2c 20 5a 2e 70 45 78  (pParse,A, Z.pEx
9c20: 70 72 29 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72  pr);.}.case_expr
9c30: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e  list(A) ::= WHEN
9c40: 20 65 78 70 72 28 59 29 20 54 48 45 4e 20 65 78   expr(Y) THEN ex
9c50: 70 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Z). {.  A = s
9c60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
9c70: 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 20 59  pend(pParse,0, Y
9c80: 2e 70 45 78 70 72 29 3b 0a 20 20 41 20 3d 20 73  .pExpr);.  A = s
9c90: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
9ca0: 70 65 6e 64 28 70 50 61 72 73 65 2c 41 2c 20 5a  pend(pParse,A, Z
9cb0: 2e 70 45 78 70 72 29 3b 0a 7d 0a 25 74 79 70 65  .pExpr);.}.%type
9cc0: 20 63 61 73 65 5f 65 6c 73 65 20 7b 45 78 70 72   case_else {Expr
9cd0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63  *}.%destructor c
9ce0: 61 73 65 5f 65 6c 73 65 20 7b 73 71 6c 69 74 65  ase_else {sqlite
9cf0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
9d00: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61  se->db, $$);}.ca
9d10: 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20  se_else(A) ::=  
9d20: 45 4c 53 45 20 65 78 70 72 28 58 29 2e 20 20 20  ELSE expr(X).   
9d30: 20 20 20 20 20 20 7b 41 20 3d 20 58 2e 70 45 78        {A = X.pEx
9d40: 70 72 3b 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41  pr;}.case_else(A
9d50: 29 20 3a 3a 3d 20 20 2e 20 20 20 20 20 20 20 20  ) ::=  .        
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
9d70: 3d 20 30 3b 7d 20 0a 25 74 79 70 65 20 63 61 73  = 0;} .%type cas
9d80: 65 5f 6f 70 65 72 61 6e 64 20 7b 45 78 70 72 2a  e_operand {Expr*
9d90: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63 61  }.%destructor ca
9da0: 73 65 5f 6f 70 65 72 61 6e 64 20 7b 73 71 6c 69  se_operand {sqli
9db0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
9dc0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
9dd0: 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 41 29 20  case_operand(A) 
9de0: 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 20  ::= expr(X).    
9df0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 2e 70          {A = X.p
9e00: 45 78 70 72 3b 7d 20 0a 63 61 73 65 5f 6f 70 65  Expr;} .case_ope
9e10: 72 61 6e 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20  rand(A) ::= .   
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e30: 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65  {A = 0;} ..%type
9e40: 20 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c   exprlist {ExprL
9e50: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
9e60: 72 20 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69  r exprlist {sqli
9e70: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
9e80: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
9e90: 29 3b 7d 0a 25 74 79 70 65 20 6e 65 78 70 72 6c  );}.%type nexprl
9ea0: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  ist {ExprList*}.
9eb0: 25 64 65 73 74 72 75 63 74 6f 72 20 6e 65 78 70  %destructor nexp
9ec0: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
9ed0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
9ee0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a  rse->db, $$);}..
9ef0: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20  exprlist(A) ::= 
9f00: 6e 65 78 70 72 6c 69 73 74 28 58 29 2e 20 20 20  nexprlist(X).   
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
9f20: 3d 20 58 3b 7d 0a 65 78 70 72 6c 69 73 74 28 41  = X;}.exprlist(A
9f30: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
9f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f50: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6e 65 78 70     {A = 0;}.nexp
9f60: 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 65 78  rlist(A) ::= nex
9f70: 70 72 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20  prlist(X) COMMA 
9f80: 65 78 70 72 28 59 29 2e 0a 20 20 20 20 7b 41 20  expr(Y)..    {A 
9f90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9fa0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 58  tAppend(pParse,X
9fb0: 2c 59 2e 70 45 78 70 72 29 3b 7d 0a 6e 65 78 70  ,Y.pExpr);}.nexp
9fc0: 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70  rlist(A) ::= exp
9fd0: 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  r(Y)..    {A = s
9fe0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
9ff0: 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 59 2e  pend(pParse,0,Y.
a000: 70 45 78 70 72 29 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f  pExpr);}.../////
a010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a020: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45  //////// The CRE
a030: 41 54 45 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  ATE INDEX comman
a040: 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  d //////////////
a050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64  /////////.//.cmd
a060: 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 28 53 29   ::= createkw(S)
a070: 20 75 6e 69 71 75 65 66 6c 61 67 28 55 29 20 49   uniqueflag(U) I
a080: 4e 44 45 58 20 69 66 6e 6f 74 65 78 69 73 74 73  NDEX ifnotexists
a090: 28 4e 45 29 20 6e 6d 28 58 29 20 64 62 6e 6d 28  (NE) nm(X) dbnm(
a0a0: 44 29 0a 20 20 20 20 20 20 20 20 4f 4e 20 6e 6d  D).        ON nm
a0b0: 28 59 29 20 4c 50 20 69 64 78 6c 69 73 74 28 5a  (Y) LP idxlist(Z
a0c0: 29 20 52 50 20 77 68 65 72 65 5f 6f 70 74 28 57  ) RP where_opt(W
a0d0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 43 72  ). {.  sqlite3Cr
a0e0: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
a0f0: 2c 20 26 58 2c 20 26 44 2c 20 0a 20 20 20 20 20  , &X, &D, .     
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a110: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
a120: 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c  pend(pParse->db,
a130: 30 2c 26 59 2c 30 29 2c 20 5a 2c 20 55 2c 0a 20  0,&Y,0), Z, U,. 
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a150: 20 20 20 20 20 26 53 2c 20 57 2c 20 53 51 4c 49       &S, W, SQLI
a160: 54 45 5f 53 4f 5f 41 53 43 2c 20 4e 45 29 3b 0a  TE_SO_ASC, NE);.
a170: 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71 75 65 66  }..%type uniquef
a180: 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75 65  lag {int}.unique
a190: 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49 51  flag(A) ::= UNIQ
a1a0: 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f 41 62 6f  UE.  {A = OE_Abo
a1b0: 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28  rt;}.uniqueflag(
a1c0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
a1d0: 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 7d 0a 0a  {A = OE_None;}..
a1e0: 25 74 79 70 65 20 69 64 78 6c 69 73 74 20 7b 45  %type idxlist {E
a1f0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
a200: 75 63 74 6f 72 20 69 64 78 6c 69 73 74 20 7b 73  uctor idxlist {s
a210: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
a220: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
a230: 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 69 64 78   $$);}.%type idx
a240: 6c 69 73 74 5f 6f 70 74 20 7b 45 78 70 72 4c 69  list_opt {ExprLi
a250: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
a260: 20 69 64 78 6c 69 73 74 5f 6f 70 74 20 7b 73 71   idxlist_opt {sq
a270: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
a280: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
a290: 24 24 29 3b 7d 0a 0a 69 64 78 6c 69 73 74 5f 6f  $$);}..idxlist_o
a2a0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2c0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 64 78      {A = 0;}.idx
a2d0: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  list_opt(A) ::= 
a2e0: 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 52 50  LP idxlist(X) RP
a2f0: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
a300: 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a  ;}.idxlist(A) ::
a310: 3d 20 69 64 78 6c 69 73 74 28 58 29 20 43 4f 4d  = idxlist(X) COM
a320: 4d 41 20 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65  MA nm(Y) collate
a330: 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29  (C) sortorder(Z)
a340: 2e 20 20 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  .  {.  Expr *p =
a350: 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43   sqlite3ExprAddC
a360: 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72  ollateToken(pPar
a370: 73 65 2c 20 30 2c 20 26 43 29 3b 0a 20 20 41 20  se, 0, &C);.  A 
a380: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
a390: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 58  tAppend(pParse,X
a3a0: 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  , p);.  sqlite3E
a3b0: 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70  xprListSetName(p
a3c0: 50 61 72 73 65 2c 41 2c 26 59 2c 31 29 3b 0a 20  Parse,A,&Y,1);. 
a3d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a3e0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
a3f0: 73 65 2c 20 41 2c 20 22 69 6e 64 65 78 22 29 3b  se, A, "index");
a400: 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b  .  if( A ) A->a[
a410: 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  A->nExpr-1].sort
a420: 4f 72 64 65 72 20 3d 20 28 75 38 29 5a 3b 0a 7d  Order = (u8)Z;.}
a430: 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20  .idxlist(A) ::= 
a440: 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65 28 43 29  nm(Y) collate(C)
a450: 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b   sortorder(Z). {
a460: 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c  .  Expr *p = sql
a470: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
a480: 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  teToken(pParse, 
a490: 30 2c 20 26 43 29 3b 0a 20 20 41 20 3d 20 73 71  0, &C);.  A = sq
a4a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
a4b0: 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 20 70 29  end(pParse,0, p)
a4c0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
a4d0: 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
a4e0: 65 2c 20 41 2c 20 26 59 2c 20 31 29 3b 0a 20 20  e, A, &Y, 1);.  
a4f0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43  sqlite3ExprListC
a500: 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73  heckLength(pPars
a510: 65 2c 20 41 2c 20 22 69 6e 64 65 78 22 29 3b 0a  e, A, "index");.
a520: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41    if( A ) A->a[A
a530: 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f  ->nExpr-1].sortO
a540: 72 64 65 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a  rder = (u8)Z;.}.
a550: 0a 25 74 79 70 65 20 63 6f 6c 6c 61 74 65 20 7b  .%type collate {
a560: 54 6f 6b 65 6e 7d 0a 63 6f 6c 6c 61 74 65 28 43  Token}.collate(C
a570: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
a580: 20 20 20 20 20 20 20 20 7b 43 2e 7a 20 3d 20 30          {C.z = 0
a590: 3b 20 43 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c 6c  ; C.n = 0;}.coll
a5a0: 61 74 65 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41  ate(C) ::= COLLA
a5b0: 54 45 20 69 64 73 28 58 29 2e 20 20 20 7b 43 20  TE ids(X).   {C 
a5c0: 3d 20 58 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  = X;}...////////
a5d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a5e0: 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20 49  ///// The DROP I
a5f0: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  NDEX command ///
a600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a610: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
a620: 3d 20 44 52 4f 50 20 49 4e 44 45 58 20 69 66 65  = DROP INDEX ife
a630: 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d  xists(E) fullnam
a640: 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74 65 33  e(X).   {sqlite3
a650: 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72 73 65  DropIndex(pParse
a660: 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f 2f 2f  , X, E);}../////
a670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a680: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56 41 43  //////// The VAC
a690: 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  UUM command ////
a6a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a6b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66  /////////.//.%if
a6c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a6d0: 5f 56 41 43 55 55 4d 0a 25 69 66 6e 64 65 66 20  _VACUUM.%ifndef 
a6e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41  SQLITE_OMIT_ATTA
a6f0: 43 48 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55  CH.cmd ::= VACUU
a700: 4d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M.              
a710: 20 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75 6d    {sqlite3Vacuum
a720: 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a  (pParse);}.cmd :
a730: 3a 3d 20 56 41 43 55 55 4d 20 6e 6d 2e 20 20 20  := VACUUM nm.   
a740: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
a750: 65 33 56 61 63 75 75 6d 28 70 50 61 72 73 65 29  e3Vacuum(pParse)
a760: 3b 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54  ;}.%endif  SQLIT
a770: 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 25 65  E_OMIT_ATTACH.%e
a780: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
a790: 54 5f 56 41 43 55 55 4d 0a 0a 2f 2f 2f 2f 2f 2f  T_VACUUM..//////
a7a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a7b0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 50 52 41 47  /////// The PRAG
a7c0: 4d 41 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  MA command /////
a7d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a7e0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e  ////////.//.%ifn
a7f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a800: 50 52 41 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50  PRAGMA.cmd ::= P
a810: 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d  RAGMA nm(X) dbnm
a820: 28 5a 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (Z).            
a830: 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67      {sqlite3Prag
a840: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
a850: 30 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50  0,0);}.cmd ::= P
a860: 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d  RAGMA nm(X) dbnm
a870: 28 5a 29 20 45 51 20 6e 6d 6e 75 6d 28 59 29 2e  (Z) EQ nmnum(Y).
a880: 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67      {sqlite3Prag
a890: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
a8a0: 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  &Y,0);}.cmd ::= 
a8b0: 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e  PRAGMA nm(X) dbn
a8c0: 6d 28 5a 29 20 4c 50 20 6e 6d 6e 75 6d 28 59 29  m(Z) LP nmnum(Y)
a8d0: 20 52 50 2e 20 7b 73 71 6c 69 74 65 33 50 72 61   RP. {sqlite3Pra
a8e0: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
a8f0: 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  ,&Y,0);}.cmd ::=
a900: 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62   PRAGMA nm(X) db
a910: 6e 6d 28 5a 29 20 45 51 20 6d 69 6e 75 73 5f 6e  nm(Z) EQ minus_n
a920: 75 6d 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20  um(Y). .        
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61       {sqlite3Pra
a960: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
a970: 2c 26 59 2c 31 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  ,&Y,1);}.cmd ::=
a980: 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62   PRAGMA nm(X) db
a990: 6e 6d 28 5a 29 20 4c 50 20 6d 69 6e 75 73 5f 6e  nm(Z) LP minus_n
a9a0: 75 6d 28 59 29 20 52 50 2e 0a 20 20 20 20 20 20  um(Y) RP..      
a9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 50         {sqlite3P
a9e0: 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c  ragma(pParse,&X,
a9f0: 26 5a 2c 26 59 2c 31 29 3b 7d 0a 0a 6e 6d 6e 75  &Z,&Y,1);}..nmnu
aa00: 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75  m(A) ::= plus_nu
aa10: 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  m(X).           
aa20: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d    {A = X;}.nmnum
aa30: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20  (A) ::= nm(X).  
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28   {A = X;}.nmnum(
aa60: 41 29 20 3a 3a 3d 20 4f 4e 28 58 29 2e 20 20 20  A) ::= ON(X).   
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41  {A = X;}.nmnum(A
aa90: 29 20 3a 3a 3d 20 44 45 4c 45 54 45 28 58 29 2e  ) ::= DELETE(X).
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
aab0: 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29  A = X;}.nmnum(A)
aac0: 20 3a 3a 3d 20 44 45 46 41 55 4c 54 28 58 29 2e   ::= DEFAULT(X).
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
aae0: 20 3d 20 58 3b 7d 0a 25 65 6e 64 69 66 20 53 51   = X;}.%endif SQ
aaf0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41  LITE_OMIT_PRAGMA
ab00: 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d  .plus_num(A) ::=
ab10: 20 50 4c 55 53 20 6e 75 6d 62 65 72 28 58 29 2e   PLUS number(X).
ab20: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
ab30: 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20  plus_num(A) ::= 
ab40: 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20 20  number(X).      
ab50: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d        {A = X;}.m
ab60: 69 6e 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20  inus_num(A) ::= 
ab70: 4d 49 4e 55 53 20 6e 75 6d 62 65 72 28 58 29 2e  MINUS number(X).
ab80: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75       {A = X;}.nu
ab90: 6d 62 65 72 28 41 29 20 3a 3a 3d 20 49 4e 54 45  mber(A) ::= INTE
aba0: 47 45 52 7c 46 4c 4f 41 54 28 58 29 2e 20 20 20  GER|FLOAT(X).   
abb0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f      {A = X;}..//
abc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
abd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43  ////////// The C
abe0: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 63 6f  REATE TRIGGER co
abf0: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
ac00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66  ///////////..%if
ac10: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ac20: 5f 54 52 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a  _TRIGGER..cmd ::
ac30: 3d 20 63 72 65 61 74 65 6b 77 20 74 72 69 67 67  = createkw trigg
ac40: 65 72 5f 64 65 63 6c 28 41 29 20 42 45 47 49 4e  er_decl(A) BEGIN
ac50: 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73   trigger_cmd_lis
ac60: 74 28 53 29 20 45 4e 44 28 5a 29 2e 20 7b 0a 20  t(S) END(Z). {. 
ac70: 20 54 6f 6b 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c   Token all;.  al
ac80: 6c 2e 7a 20 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c  l.z = A.z;.  all
ac90: 2e 6e 20 3d 20 28 69 6e 74 29 28 5a 2e 7a 20 2d  .n = (int)(Z.z -
aca0: 20 41 2e 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73   A.z) + Z.n;.  s
acb0: 71 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67  qlite3FinishTrig
acc0: 67 65 72 28 70 50 61 72 73 65 2c 20 53 2c 20 26  ger(pParse, S, &
acd0: 61 6c 6c 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72  all);.}..trigger
ace0: 5f 64 65 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d  _decl(A) ::= tem
acf0: 70 28 54 29 20 54 52 49 47 47 45 52 20 69 66 6e  p(T) TRIGGER ifn
ad00: 6f 74 65 78 69 73 74 73 28 4e 4f 45 52 52 29 20  otexists(NOERR) 
ad10: 6e 6d 28 42 29 20 64 62 6e 6d 28 5a 29 20 0a 20  nm(B) dbnm(Z) . 
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad30: 20 20 20 74 72 69 67 67 65 72 5f 74 69 6d 65 28     trigger_time(
ad40: 43 29 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74  C) trigger_event
ad50: 28 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (D).            
ad60: 20 20 20 20 20 20 20 20 4f 4e 20 66 75 6c 6c 6e          ON fulln
ad70: 61 6d 65 28 45 29 20 66 6f 72 65 61 63 68 5f 63  ame(E) foreach_c
ad80: 6c 61 75 73 65 20 77 68 65 6e 5f 63 6c 61 75 73  lause when_claus
ad90: 65 28 47 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  e(G). {.  sqlite
ada0: 33 42 65 67 69 6e 54 72 69 67 67 65 72 28 70 50  3BeginTrigger(pP
adb0: 61 72 73 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c  arse, &B, &Z, C,
adc0: 20 44 2e 61 2c 20 44 2e 62 2c 20 45 2c 20 47 2c   D.a, D.b, E, G,
add0: 20 54 2c 20 4e 4f 45 52 52 29 3b 0a 20 20 41 20   T, NOERR);.  A 
ade0: 3d 20 28 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29 3b 0a  = (Z.n==0?B:Z);.
adf0: 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72  }..%type trigger
ae00: 5f 74 69 6d 65 20 7b 69 6e 74 7d 0a 74 72 69 67  _time {int}.trig
ae10: 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20  ger_time(A) ::= 
ae20: 42 45 46 4f 52 45 2e 20 20 20 20 20 20 7b 20 41  BEFORE.      { A
ae30: 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a   = TK_BEFORE; }.
ae40: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20  trigger_time(A) 
ae50: 3a 3a 3d 20 41 46 54 45 52 2e 20 20 20 20 20 20  ::= AFTER.      
ae60: 20 7b 20 41 20 3d 20 54 4b 5f 41 46 54 45 52 3b   { A = TK_AFTER;
ae70: 20 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65    }.trigger_time
ae80: 28 41 29 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20  (A) ::= INSTEAD 
ae90: 4f 46 2e 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e  OF.  { A = TK_IN
aea0: 53 54 45 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f  STEAD;}.trigger_
aeb0: 74 69 6d 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20  time(A) ::= .   
aec0: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54           { A = T
aed0: 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79  K_BEFORE; }..%ty
aee0: 70 65 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74  pe trigger_event
aef0: 20 7b 73 74 72 75 63 74 20 54 72 69 67 45 76 65   {struct TrigEve
af00: 6e 74 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  nt}.%destructor 
af10: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73  trigger_event {s
af20: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
af30: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
af40: 24 2e 62 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65  $.b);}.trigger_e
af50: 76 65 6e 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45  vent(A) ::= DELE
af60: 54 45 7c 49 4e 53 45 52 54 28 4f 50 29 2e 20 20  TE|INSERT(OP).  
af70: 20 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b       {A.a = @OP;
af80: 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67   A.b = 0;}.trigg
af90: 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20  er_event(A) ::= 
afa0: 55 50 44 41 54 45 28 4f 50 29 2e 20 20 20 20 20  UPDATE(OP).     
afb0: 20 20 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20           {A.a = 
afc0: 40 4f 50 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74  @OP; A.b = 0;}.t
afd0: 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20  rigger_event(A) 
afe0: 3a 3a 3d 20 55 50 44 41 54 45 20 4f 46 20 69 64  ::= UPDATE OF id
aff0: 6c 69 73 74 28 58 29 2e 20 7b 41 2e 61 20 3d 20  list(X). {A.a = 
b000: 54 4b 5f 55 50 44 41 54 45 3b 20 41 2e 62 20 3d  TK_UPDATE; A.b =
b010: 20 58 3b 7d 0a 0a 66 6f 72 65 61 63 68 5f 63 6c   X;}..foreach_cl
b020: 61 75 73 65 20 3a 3a 3d 20 2e 0a 66 6f 72 65 61  ause ::= ..forea
b030: 63 68 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 46 4f  ch_clause ::= FO
b040: 52 20 45 41 43 48 20 52 4f 57 2e 0a 0a 25 74 79  R EACH ROW...%ty
b050: 70 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b  pe when_clause {
b060: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
b070: 6f 72 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b  or when_clause {
b080: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
b090: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
b0a0: 29 3b 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28  );}.when_clause(
b0b0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
b0c0: 20 20 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a       { A = 0; }.
b0d0: 77 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a  when_clause(A) :
b0e0: 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 58 29 2e  := WHEN expr(X).
b0f0: 20 7b 20 41 20 3d 20 58 2e 70 45 78 70 72 3b 20   { A = X.pExpr; 
b100: 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72  }..%type trigger
b110: 5f 63 6d 64 5f 6c 69 73 74 20 7b 54 72 69 67 67  _cmd_list {Trigg
b120: 65 72 53 74 65 70 2a 7d 0a 25 64 65 73 74 72 75  erStep*}.%destru
b130: 63 74 6f 72 20 74 72 69 67 67 65 72 5f 63 6d 64  ctor trigger_cmd
b140: 5f 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 44 65  _list {sqlite3De
b150: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
b160: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
b170: 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  }.trigger_cmd_li
b180: 73 74 28 41 29 20 3a 3a 3d 20 74 72 69 67 67 65  st(A) ::= trigge
b190: 72 5f 63 6d 64 5f 6c 69 73 74 28 59 29 20 74 72  r_cmd_list(Y) tr
b1a0: 69 67 67 65 72 5f 63 6d 64 28 58 29 20 53 45 4d  igger_cmd(X) SEM
b1b0: 49 2e 20 7b 0a 20 20 61 73 73 65 72 74 28 20 59  I. {.  assert( Y
b1c0: 21 3d 30 20 29 3b 0a 20 20 59 2d 3e 70 4c 61 73  !=0 );.  Y->pLas
b1d0: 74 2d 3e 70 4e 65 78 74 20 3d 20 58 3b 0a 20 20  t->pNext = X;.  
b1e0: 59 2d 3e 70 4c 61 73 74 20 3d 20 58 3b 0a 20 20  Y->pLast = X;.  
b1f0: 41 20 3d 20 59 3b 0a 7d 0a 74 72 69 67 67 65 72  A = Y;.}.trigger
b200: 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d  _cmd_list(A) ::=
b210: 20 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29 20   trigger_cmd(X) 
b220: 53 45 4d 49 2e 20 7b 20 0a 20 20 61 73 73 65 72  SEMI. { .  asser
b230: 74 28 20 58 21 3d 30 20 29 3b 0a 20 20 58 2d 3e  t( X!=0 );.  X->
b240: 70 4c 61 73 74 20 3d 20 58 3b 0a 20 20 41 20 3d  pLast = X;.  A =
b250: 20 58 3b 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c   X;.}..// Disall
b260: 6f 77 20 71 75 61 6c 69 66 69 65 64 20 74 61 62  ow qualified tab
b270: 6c 65 20 6e 61 6d 65 73 20 6f 6e 20 49 4e 53 45  le names on INSE
b280: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
b290: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
b2a0: 73 0a 2f 2f 20 77 69 74 68 69 6e 20 61 20 74 72  s.// within a tr
b2b0: 69 67 67 65 72 2e 20 20 54 68 65 20 74 61 62 6c  igger.  The tabl
b2c0: 65 20 74 6f 20 49 4e 53 45 52 54 2c 20 55 50 44  e to INSERT, UPD
b2d0: 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 45 20 69  ATE, or DELETE i
b2e0: 73 20 61 6c 77 61 79 73 20 69 6e 20 0a 2f 2f 20  s always in .// 
b2f0: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
b300: 65 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  e as the table t
b310: 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20  hat the trigger 
b320: 66 69 72 65 73 20 6f 6e 2e 0a 2f 2f 0a 25 74 79  fires on..//.%ty
b330: 70 65 20 74 72 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a  pe trnm {Token}.
b340: 74 72 6e 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 58  trnm(A) ::= nm(X
b350: 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 74 72  ).   {A = X;}.tr
b360: 6e 6d 28 41 29 20 3a 3a 3d 20 6e 6d 20 44 4f 54  nm(A) ::= nm DOT
b370: 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20   nm(X). {.  A = 
b380: 58 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  X;.  sqlite3Erro
b390: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
b3a0: 20 20 20 20 20 20 22 71 75 61 6c 69 66 69 65 64        "qualified
b3b0: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
b3c0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   not allowed on 
b3d0: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
b3e0: 61 6e 64 20 44 45 4c 45 54 45 20 22 0a 20 20 20  and DELETE ".   
b3f0: 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73       "statements
b400: 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
b410: 22 29 3b 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c  ");.}..// Disall
b420: 6f 77 20 74 68 65 20 49 4e 44 45 58 20 42 59 20  ow the INDEX BY 
b430: 61 6e 64 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  and NOT INDEXED 
b440: 63 6c 61 75 73 65 73 20 6f 6e 20 55 50 44 41 54  clauses on UPDAT
b450: 45 20 61 6e 64 20 44 45 4c 45 54 45 0a 2f 2f 20  E and DELETE.// 
b460: 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69  statements withi
b470: 6e 20 74 72 69 67 67 65 72 73 2e 20 20 57 65 20  n triggers.  We 
b480: 6d 61 6b 65 20 61 20 73 70 65 63 69 66 69 63 20  make a specific 
b490: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  error message fo
b4a0: 72 20 74 68 69 73 0a 2f 2f 20 73 69 6e 63 65 20  r this.// since 
b4b0: 69 74 20 69 73 20 61 6e 20 65 78 63 65 70 74 69  it is an excepti
b4c0: 6f 6e 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  on to the defaul
b4d0: 74 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 2e  t grammar rules.
b4e0: 0a 2f 2f 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20  .//.tridxby ::= 
b4f0: 2e 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20 49 4e  ..tridxby ::= IN
b500: 44 45 58 45 44 20 42 59 20 6e 6d 2e 20 7b 0a 20  DEXED BY nm. {. 
b510: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
b520: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
b530: 20 22 74 68 65 20 49 4e 44 45 58 45 44 20 42 59   "the INDEXED BY
b540: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
b550: 6c 6c 6f 77 65 64 20 6f 6e 20 55 50 44 41 54 45  llowed on UPDATE
b560: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
b570: 6d 65 6e 74 73 20 22 0a 20 20 20 20 20 20 20 20  ments ".        
b580: 22 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73  "within triggers
b590: 22 29 3b 0a 7d 0a 74 72 69 64 78 62 79 20 3a 3a  ");.}.tridxby ::
b5a0: 3d 20 4e 4f 54 20 49 4e 44 45 58 45 44 2e 20 7b  = NOT INDEXED. {
b5b0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
b5c0: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
b5d0: 20 20 20 22 74 68 65 20 4e 4f 54 20 49 4e 44 45     "the NOT INDE
b5e0: 58 45 44 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  XED clause is no
b5f0: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 55 50 44  t allowed on UPD
b600: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
b610: 61 74 65 6d 65 6e 74 73 20 22 0a 20 20 20 20 20  atements ".     
b620: 20 20 20 22 77 69 74 68 69 6e 20 74 72 69 67 67     "within trigg
b630: 65 72 73 22 29 3b 0a 7d 0a 0a 0a 0a 25 74 79 70  ers");.}....%typ
b640: 65 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 54  e trigger_cmd {T
b650: 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65  riggerStep*}.%de
b660: 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72  structor trigger
b670: 5f 63 6d 64 20 7b 73 71 6c 69 74 65 33 44 65 6c  _cmd {sqlite3Del
b680: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 70  eteTriggerStep(p
b690: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
b6a0: 0a 2f 2f 20 55 50 44 41 54 45 20 0a 74 72 69 67  .// UPDATE .trig
b6b0: 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 0a 20  ger_cmd(A) ::=. 
b6c0: 20 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28    UPDATE orconf(
b6d0: 52 29 20 74 72 6e 6d 28 58 29 20 74 72 69 64 78  R) trnm(X) tridx
b6e0: 62 79 20 53 45 54 20 73 65 74 6c 69 73 74 28 59  by SET setlist(Y
b6f0: 29 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 20  ) where_opt(Z). 
b700: 20 0a 20 20 20 7b 20 41 20 3d 20 73 71 6c 69 74   .   { A = sqlit
b710: 65 33 54 72 69 67 67 65 72 55 70 64 61 74 65 53  e3TriggerUpdateS
b720: 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  tep(pParse->db, 
b730: 26 58 2c 20 59 2c 20 5a 2c 20 52 29 3b 20 7d 0a  &X, Y, Z, R); }.
b740: 0a 2f 2f 20 49 4e 53 45 52 54 0a 74 72 69 67 67  .// INSERT.trigg
b750: 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 0a 20 20  er_cmd(A) ::=.  
b760: 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49   insert_cmd(R) I
b770: 4e 54 4f 20 74 72 6e 6d 28 58 29 20 69 6e 73 63  NTO trnm(X) insc
b780: 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 76 61  ollist_opt(F) va
b790: 6c 75 65 6c 69 73 74 28 59 29 2e 0a 20 20 20 7b  luelist(Y)..   {
b7a0: 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67  A = sqlite3Trigg
b7b0: 65 72 49 6e 73 65 72 74 53 74 65 70 28 70 50 61  erInsertStep(pPa
b7c0: 72 73 65 2d 3e 64 62 2c 20 26 58 2c 20 46 2c 20  rse->db, &X, F, 
b7d0: 59 2e 70 4c 69 73 74 2c 20 59 2e 70 53 65 6c 65  Y.pList, Y.pSele
b7e0: 63 74 2c 20 52 29 3b 7d 0a 0a 74 72 69 67 67 65  ct, R);}..trigge
b7f0: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 69 6e 73  r_cmd(A) ::= ins
b800: 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20  ert_cmd(R) INTO 
b810: 74 72 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69  trnm(X) inscolli
b820: 73 74 5f 6f 70 74 28 46 29 20 73 65 6c 65 63 74  st_opt(F) select
b830: 28 53 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (S)..           
b840: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
b850: 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65  TriggerInsertSte
b860: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58  p(pParse->db, &X
b870: 2c 20 46 2c 20 30 2c 20 53 2c 20 52 29 3b 7d 0a  , F, 0, S, R);}.
b880: 0a 2f 2f 20 44 45 4c 45 54 45 0a 74 72 69 67 67  .// DELETE.trigg
b890: 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45  er_cmd(A) ::= DE
b8a0: 4c 45 54 45 20 46 52 4f 4d 20 74 72 6e 6d 28 58  LETE FROM trnm(X
b8b0: 29 20 74 72 69 64 78 62 79 20 77 68 65 72 65 5f  ) tridxby where_
b8c0: 6f 70 74 28 59 29 2e 0a 20 20 20 20 20 20 20 20  opt(Y)..        
b8d0: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
b8e0: 74 65 33 54 72 69 67 67 65 72 44 65 6c 65 74 65  te3TriggerDelete
b8f0: 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  Step(pParse->db,
b900: 20 26 58 2c 20 59 29 3b 7d 0a 0a 2f 2f 20 53 45   &X, Y);}..// SE
b910: 4c 45 43 54 0a 74 72 69 67 67 65 72 5f 63 6d 64  LECT.trigger_cmd
b920: 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58  (A) ::= select(X
b930: 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33  ).  {A = sqlite3
b940: 54 72 69 67 67 65 72 53 65 6c 65 63 74 53 74 65  TriggerSelectSte
b950: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 58 29  p(pParse->db, X)
b960: 3b 20 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63  ; }..// The spec
b970: 69 61 6c 20 52 41 49 53 45 20 65 78 70 72 65 73  ial RAISE expres
b980: 73 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63  sion that may oc
b990: 63 75 72 20 69 6e 20 74 72 69 67 67 65 72 20 70  cur in trigger p
b9a0: 72 6f 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20  rograms.expr(A) 
b9b0: 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20  ::= RAISE(X) LP 
b9c0: 49 47 4e 4f 52 45 20 52 50 28 59 29 2e 20 20 7b  IGNORE RP(Y).  {
b9d0: 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c  .  A.pExpr = sql
b9e0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
b9f0: 2c 20 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30  , TK_RAISE, 0, 0
ba00: 2c 20 30 29 3b 20 0a 20 20 69 66 28 20 41 2e 70  , 0); .  if( A.p
ba10: 45 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70 45  Expr ){.    A.pE
ba20: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
ba30: 4f 45 5f 49 67 6e 6f 72 65 3b 0a 20 20 7d 0a 20  OE_Ignore;.  }. 
ba40: 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 3b   A.zStart = X.z;
ba50: 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26 59 2e 7a  .  A.zEnd = &Y.z
ba60: 5b 59 2e 6e 5d 3b 0a 7d 0a 65 78 70 72 28 41 29  [Y.n];.}.expr(A)
ba70: 20 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50   ::= RAISE(X) LP
ba80: 20 72 61 69 73 65 74 79 70 65 28 54 29 20 43 4f   raisetype(T) CO
ba90: 4d 4d 41 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e  MMA nm(Z) RP(Y).
baa0: 20 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20    {.  A.pExpr = 
bab0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
bac0: 72 73 65 2c 20 54 4b 5f 52 41 49 53 45 2c 20 30  rse, TK_RAISE, 0
bad0: 2c 20 30 2c 20 26 5a 29 3b 20 0a 20 20 69 66 28  , 0, &Z); .  if(
bae0: 20 41 2e 70 45 78 70 72 20 29 20 7b 0a 20 20 20   A.pExpr ) {.   
baf0: 20 41 2e 70 45 78 70 72 2d 3e 61 66 66 69 6e 69   A.pExpr->affini
bb00: 74 79 20 3d 20 28 63 68 61 72 29 54 3b 0a 20 20  ty = (char)T;.  
bb10: 7d 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58  }.  A.zStart = X
bb20: 2e 7a 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26  .z;.  A.zEnd = &
bb30: 59 2e 7a 5b 59 2e 6e 5d 3b 0a 7d 0a 25 65 6e 64  Y.z[Y.n];.}.%end
bb40: 69 66 20 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54  if  !SQLITE_OMIT
bb50: 5f 54 52 49 47 47 45 52 0a 0a 25 74 79 70 65 20  _TRIGGER..%type 
bb60: 72 61 69 73 65 74 79 70 65 20 7b 69 6e 74 7d 0a  raisetype {int}.
bb70: 72 61 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d  raisetype(A) ::=
bb80: 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b 41 20 3d   ROLLBACK.  {A =
bb90: 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b 7d 0a 72   OE_Rollback;}.r
bba0: 61 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20  aisetype(A) ::= 
bbb0: 41 42 4f 52 54 2e 20 20 20 20 20 7b 41 20 3d 20  ABORT.     {A = 
bbc0: 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61 69 73 65  OE_Abort;}.raise
bbd0: 74 79 70 65 28 41 29 20 3a 3a 3d 20 46 41 49 4c  type(A) ::= FAIL
bbe0: 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 46  .      {A = OE_F
bbf0: 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ail;}...////////
bc00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bc10: 20 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 73    DROP TRIGGER s
bc20: 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f  tatement ///////
bc30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bc40: 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20  ///////.%ifndef 
bc50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
bc60: 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50  GER.cmd ::= DROP
bc70: 20 54 52 49 47 47 45 52 20 69 66 65 78 69 73 74   TRIGGER ifexist
bc80: 73 28 4e 4f 45 52 52 29 20 66 75 6c 6c 6e 61 6d  s(NOERR) fullnam
bc90: 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  e(X). {.  sqlite
bca0: 33 44 72 6f 70 54 72 69 67 67 65 72 28 70 50 61  3DropTrigger(pPa
bcb0: 72 73 65 2c 58 2c 4e 4f 45 52 52 29 3b 0a 7d 0a  rse,X,NOERR);.}.
bcc0: 25 65 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f  %endif  !SQLITE_
bcd0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2f  OMIT_TRIGGER..//
bce0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bcf0: 2f 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 20 44 41  ////// ATTACH DA
bd00: 54 41 42 41 53 45 20 66 69 6c 65 20 41 53 20 6e  TABASE file AS n
bd10: 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ame ////////////
bd20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69  /////////////.%i
bd30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bd40: 54 5f 41 54 54 41 43 48 0a 63 6d 64 20 3a 3a 3d  T_ATTACH.cmd ::=
bd50: 20 41 54 54 41 43 48 20 64 61 74 61 62 61 73 65   ATTACH database
bd60: 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 46 29 20  _kw_opt expr(F) 
bd70: 41 53 20 65 78 70 72 28 44 29 20 6b 65 79 5f 6f  AS expr(D) key_o
bd80: 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71 6c 69 74  pt(K). {.  sqlit
bd90: 65 33 41 74 74 61 63 68 28 70 50 61 72 73 65 2c  e3Attach(pParse,
bda0: 20 46 2e 70 45 78 70 72 2c 20 44 2e 70 45 78 70   F.pExpr, D.pExp
bdb0: 72 2c 20 4b 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d  r, K);.}.cmd ::=
bdc0: 20 44 45 54 41 43 48 20 64 61 74 61 62 61 73 65   DETACH database
bdd0: 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 44 29 2e  _kw_opt expr(D).
bde0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 74 61   {.  sqlite3Deta
bdf0: 63 68 28 70 50 61 72 73 65 2c 20 44 2e 70 45 78  ch(pParse, D.pEx
be00: 70 72 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 6b 65  pr);.}..%type ke
be10: 79 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64  y_opt {Expr*}.%d
be20: 65 73 74 72 75 63 74 6f 72 20 6b 65 79 5f 6f 70  estructor key_op
be30: 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  t {sqlite3ExprDe
be40: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
be50: 20 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70 74 28 41   $$);}.key_opt(A
be60: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
be70: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
be80: 3d 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41  = 0; }.key_opt(A
be90: 29 20 3a 3a 3d 20 4b 45 59 20 65 78 70 72 28 58  ) ::= KEY expr(X
bea0: 29 2e 20 20 20 20 20 20 20 20 20 20 7b 20 41 20  ).          { A 
beb0: 3d 20 58 2e 70 45 78 70 72 3b 20 7d 0a 0a 64 61  = X.pExpr; }..da
bec0: 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a  tabase_kw_opt ::
bed0: 3d 20 44 41 54 41 42 41 53 45 2e 0a 64 61 74 61  = DATABASE..data
bee0: 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20  base_kw_opt ::= 
bef0: 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f  ..%endif SQLITE_
bf00: 4f 4d 49 54 5f 41 54 54 41 43 48 0a 0a 2f 2f 2f  OMIT_ATTACH..///
bf10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bf20: 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44 45 58 20  /////// REINDEX 
bf30: 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f  collation //////
bf40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bf50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66  ////////////.%if
bf60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bf70: 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d  _REINDEX.cmd ::=
bf80: 20 52 45 49 4e 44 45 58 2e 20 20 20 20 20 20 20   REINDEX.       
bf90: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
bfa0: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
bfb0: 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d   0, 0);}.cmd ::=
bfc0: 20 52 45 49 4e 44 45 58 20 6e 6d 28 58 29 20 64   REINDEX nm(X) d
bfd0: 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65  bnm(Y).  {sqlite
bfe0: 33 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c  3Reindex(pParse,
bff0: 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69   &X, &Y);}.%endi
c000: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  f  SQLITE_OMIT_R
c010: 45 49 4e 44 45 58 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  EINDEX..////////
c020: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c030: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4e 41 4c  /////////// ANAL
c040: 59 5a 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  YZE ////////////
c050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c060: 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20  ///////.%ifndef 
c070: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c  SQLITE_OMIT_ANAL
c080: 59 5a 45 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c  YZE.cmd ::= ANAL
c090: 59 5a 45 2e 20 20 20 20 20 20 20 20 20 20 20 20  YZE.            
c0a0: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c      {sqlite3Anal
c0b0: 79 7a 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  yze(pParse, 0, 0
c0c0: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c  );}.cmd ::= ANAL
c0d0: 59 5a 45 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59  YZE nm(X) dbnm(Y
c0e0: 29 2e 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c  ).  {sqlite3Anal
c0f0: 79 7a 65 28 70 50 61 72 73 65 2c 20 26 58 2c 20  yze(pParse, &X, 
c100: 26 59 29 3b 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f  &Y);}.%endif..//
c110: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c120: 2f 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20 54 41 42  ////// ALTER TAB
c130: 4c 45 20 74 61 62 6c 65 20 2e 2e 2e 20 2f 2f 2f  LE table ... ///
c140: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c150: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69  /////////////.%i
c160: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c170: 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 63 6d 64  T_ALTERTABLE.cmd
c180: 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45   ::= ALTER TABLE
c190: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 52 45 4e   fullname(X) REN
c1a0: 41 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e 20 7b 0a  AME TO nm(Z). {.
c1b0: 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 52 65    sqlite3AlterRe
c1c0: 6e 61 6d 65 54 61 62 6c 65 28 70 50 61 72 73 65  nameTable(pParse
c1d0: 2c 58 2c 26 5a 29 3b 0a 7d 0a 63 6d 64 20 3a 3a  ,X,&Z);.}.cmd ::
c1e0: 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20 61 64  = ALTER TABLE ad
c1f0: 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d  d_column_fullnam
c200: 65 20 41 44 44 20 6b 77 63 6f 6c 75 6d 6e 5f 6f  e ADD kwcolumn_o
c210: 70 74 20 63 6f 6c 75 6d 6e 28 59 29 2e 20 7b 0a  pt column(Y). {.
c220: 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46 69    sqlite3AlterFi
c230: 6e 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28 70 50  nishAddColumn(pP
c240: 61 72 73 65 2c 20 26 59 29 3b 0a 7d 0a 61 64 64  arse, &Y);.}.add
c250: 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65  _column_fullname
c260: 20 3a 3a 3d 20 66 75 6c 6c 6e 61 6d 65 28 58 29   ::= fullname(X)
c270: 2e 20 7b 0a 20 20 70 50 61 72 73 65 2d 3e 64 62  . {.  pParse->db
c280: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61  ->lookaside.bEna
c290: 62 6c 65 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69  bled = 0;.  sqli
c2a0: 74 65 33 41 6c 74 65 72 42 65 67 69 6e 41 64 64  te3AlterBeginAdd
c2b0: 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 58  Column(pParse, X
c2c0: 29 3b 0a 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70  );.}.kwcolumn_op
c2d0: 74 20 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e  t ::= ..kwcolumn
c2e0: 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b  _opt ::= COLUMNK
c2f0: 57 2e 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54  W..%endif  SQLIT
c300: 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c  E_OMIT_ALTERTABL
c310: 45 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  E../////////////
c320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52 45 41  /////////// CREA
c330: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
c340: 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ... ///////////
c350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c360: 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  //.%ifndef SQLIT
c370: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
c380: 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61  BLE.cmd ::= crea
c390: 74 65 5f 76 74 61 62 2e 20 20 20 20 20 20 20 20  te_vtab.        
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
c3b0: 73 71 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73  sqlite3VtabFinis
c3c0: 68 50 61 72 73 65 28 70 50 61 72 73 65 2c 30 29  hParse(pParse,0)
c3d0: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74  ;}.cmd ::= creat
c3e0: 65 5f 76 74 61 62 20 4c 50 20 76 74 61 62 61 72  e_vtab LP vtabar
c3f0: 67 6c 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73  glist RP(X).  {s
c400: 71 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68  qlite3VtabFinish
c410: 50 61 72 73 65 28 70 50 61 72 73 65 2c 26 58 29  Parse(pParse,&X)
c420: 3b 7d 0a 63 72 65 61 74 65 5f 76 74 61 62 20 3a  ;}.create_vtab :
c430: 3a 3d 20 63 72 65 61 74 65 6b 77 20 56 49 52 54  := createkw VIRT
c440: 55 41 4c 20 54 41 42 4c 45 20 69 66 6e 6f 74 65  UAL TABLE ifnote
c450: 78 69 73 74 73 28 45 29 0a 20 20 20 20 20 20 20  xists(E).       
c460: 20 20 20 20 20 20 20 20 20 6e 6d 28 58 29 20 64           nm(X) d
c470: 62 6e 6d 28 59 29 20 55 53 49 4e 47 20 6e 6d 28  bnm(Y) USING nm(
c480: 5a 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  Z). {.    sqlite
c490: 33 56 74 61 62 42 65 67 69 6e 50 61 72 73 65 28  3VtabBeginParse(
c4a0: 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20  pParse, &X, &Y, 
c4b0: 26 5a 2c 20 45 29 3b 0a 7d 0a 76 74 61 62 61 72  &Z, E);.}.vtabar
c4c0: 67 6c 69 73 74 20 3a 3a 3d 20 76 74 61 62 61 72  glist ::= vtabar
c4d0: 67 2e 0a 76 74 61 62 61 72 67 6c 69 73 74 20 3a  g..vtabarglist :
c4e0: 3a 3d 20 76 74 61 62 61 72 67 6c 69 73 74 20 43  := vtabarglist C
c4f0: 4f 4d 4d 41 20 76 74 61 62 61 72 67 2e 0a 76 74  OMMA vtabarg..vt
c500: 61 62 61 72 67 20 3a 3a 3d 20 2e 20 20 20 20 20  abarg ::= .     
c510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c520: 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72    {sqlite3VtabAr
c530: 67 49 6e 69 74 28 70 50 61 72 73 65 29 3b 7d 0a  gInit(pParse);}.
c540: 76 74 61 62 61 72 67 20 3a 3a 3d 20 76 74 61 62  vtabarg ::= vtab
c550: 61 72 67 20 76 74 61 62 61 72 67 74 6f 6b 65 6e  arg vtabargtoken
c560: 2e 0a 76 74 61 62 61 72 67 74 6f 6b 65 6e 20 3a  ..vtabargtoken :
c570: 3a 3d 20 41 4e 59 28 58 29 2e 20 20 20 20 20 20  := ANY(X).      
c580: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74        {sqlite3Vt
c590: 61 62 41 72 67 45 78 74 65 6e 64 28 70 50 61 72  abArgExtend(pPar
c5a0: 73 65 2c 26 58 29 3b 7d 0a 76 74 61 62 61 72 67  se,&X);}.vtabarg
c5b0: 74 6f 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61 6e 79  token ::= lp any
c5c0: 6c 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71  list RP(X).  {sq
c5d0: 6c 69 74 65 33 56 74 61 62 41 72 67 45 78 74 65  lite3VtabArgExte
c5e0: 6e 64 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a  nd(pParse,&X);}.
c5f0: 6c 70 20 3a 3a 3d 20 4c 50 28 58 29 2e 20 20 20  lp ::= LP(X).   
c600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c610: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62      {sqlite3Vtab
c620: 41 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65  ArgExtend(pParse
c630: 2c 26 58 29 3b 7d 0a 61 6e 79 6c 69 73 74 20 3a  ,&X);}.anylist :
c640: 3a 3d 20 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d  := ..anylist ::=
c650: 20 61 6e 79 6c 69 73 74 20 4c 50 20 61 6e 79 6c   anylist LP anyl
c660: 69 73 74 20 52 50 2e 0a 61 6e 79 6c 69 73 74 20  ist RP..anylist 
c670: 3a 3a 3d 20 61 6e 79 6c 69 73 74 20 41 4e 59 2e  ::= anylist ANY.
c680: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
c690: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
c6a0: 45 0a                                            E.