/ Hex Artifact Content
Login

Artifact 909868a9a60caeaa94d439a8b321e5491f989111:


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 31 29 2e 20 7b 0a 20  t(X) RP(E1). {. 
1340: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
1350: 28 70 50 61 72 73 65 2c 26 58 2c 26 45 31 2c 26  (pParse,&X,&E1,&
1360: 45 31 2c 30 2c 30 29 3b 0a 7d 0a 63 72 65 61 74  E1,0,0);.}.creat
1370: 65 5f 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d  e_table_args ::=
1380: 20 4c 50 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 63   LP columnlist c
1390: 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 58 29 20 52  onslist_opt(X) R
13a0: 50 28 45 31 29 0a 20 20 20 20 20 20 20 20 20 20  P(E1).          
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 57 49 54 48              WITH
13c0: 20 4c 50 20 69 64 6c 69 73 74 28 5a 29 20 52 50   LP idlist(Z) RP
13d0: 28 45 32 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  (E2). {.  sqlite
13e0: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
13f0: 2c 26 58 2c 26 45 31 2c 26 45 32 2c 5a 2c 30 29  ,&X,&E1,&E2,Z,0)
1400: 3b 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65  ;.}.create_table
1410: 5f 61 72 67 73 20 3a 3a 3d 20 41 53 20 73 65 6c  _args ::= AS sel
1420: 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69  ect(S). {.  sqli
1430: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
1440: 73 65 2c 30 2c 30 2c 30 2c 30 2c 53 29 3b 0a 20  se,0,0,0,0,S);. 
1450: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1460: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
1470: 20 53 29 3b 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69 73   S);.}.columnlis
1480: 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73 74  t ::= columnlist
1490: 20 43 4f 4d 4d 41 20 63 6f 6c 75 6d 6e 2e 0a 63   COMMA column..c
14a0: 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f  olumnlist ::= co
14b0: 6c 75 6d 6e 2e 0a 0a 2f 2f 20 41 20 22 63 6f 6c  lumn...// A "col
14c0: 75 6d 6e 22 20 69 73 20 61 20 63 6f 6d 70 6c 65  umn" is a comple
14d0: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  te description o
14e0: 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
14f0: 6e 20 69 6e 20 61 0a 2f 2f 20 43 52 45 41 54 45  n in a.// CREATE
1500: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1510: 2e 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73  .  This includes
1520: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
1530: 2c 20 69 74 73 0a 2f 2f 20 64 61 74 61 74 79 70  , its.// datatyp
1540: 65 2c 20 61 6e 64 20 6f 74 68 65 72 20 6b 65 79  e, and other key
1550: 77 6f 72 64 73 20 73 75 63 68 20 61 73 20 50 52  words such as PR
1560: 49 4d 41 52 59 20 4b 45 59 2c 20 55 4e 49 51 55  IMARY KEY, UNIQU
1570: 45 2c 20 52 45 46 45 52 45 4e 43 45 53 2c 0a 2f  E, REFERENCES,./
1580: 2f 20 4e 4f 54 20 4e 55 4c 4c 20 61 6e 64 20 73  / NOT NULL and s
1590: 6f 20 66 6f 72 74 68 2e 0a 2f 2f 0a 63 6f 6c 75  o forth..//.colu
15a0: 6d 6e 28 41 29 20 3a 3a 3d 20 63 6f 6c 75 6d 6e  mn(A) ::= column
15b0: 69 64 28 58 29 20 74 79 70 65 20 63 61 72 67 6c  id(X) type cargl
15c0: 69 73 74 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58  ist. {.  A.z = X
15d0: 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74  .z;.  A.n = (int
15e0: 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  )(pParse->sLastT
15f0: 6f 6b 65 6e 2e 7a 2d 58 2e 7a 29 20 2b 20 70 50  oken.z-X.z) + pP
1600: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1610: 2e 6e 3b 0a 7d 0a 63 6f 6c 75 6d 6e 69 64 28 41  .n;.}.columnid(A
1620: 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 7b 0a 20  ) ::= nm(X). {. 
1630: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
1640: 6e 28 70 50 61 72 73 65 2c 26 58 29 3b 0a 20 20  n(pParse,&X);.  
1650: 41 20 3d 20 58 3b 0a 20 20 70 50 61 72 73 65 2d  A = X;.  pParse-
1660: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
1670: 6e 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2f 20 41 6e  n = 0;.}...// An
1680: 20 49 44 45 4e 54 49 46 49 45 52 20 63 61 6e 20   IDENTIFIER can 
1690: 62 65 20 61 20 67 65 6e 65 72 69 63 20 69 64 65  be a generic ide
16a0: 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20  ntifier, or one 
16b0: 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65  of several.// ke
16c0: 79 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e  ywords.  Any non
16d0: 2d 73 74 61 6e 64 61 72 64 20 6b 65 79 77 6f 72  -standard keywor
16e0: 64 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e  d can also be an
16f0: 20 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 0a   identifier..//.
1700: 25 74 79 70 65 20 69 64 20 7b 54 6f 6b 65 6e 7d  %type id {Token}
1710: 0a 69 64 28 41 29 20 3a 3a 3d 20 49 44 28 58 29  .id(A) ::= ID(X)
1720: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
1730: 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 49 4e 44  ;}.id(A) ::= IND
1740: 45 58 45 44 28 58 29 2e 20 20 20 20 7b 41 20 3d  EXED(X).    {A =
1750: 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c   X;}..// The fol
1760: 6c 6f 77 69 6e 67 20 64 69 72 65 63 74 69 76 65  lowing directive
1770: 20 63 61 75 73 65 73 20 74 6f 6b 65 6e 73 20 41   causes tokens A
1780: 42 4f 52 54 2c 20 41 46 54 45 52 2c 20 41 53 43  BORT, AFTER, ASC
1790: 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61 6c  , etc. to.// fal
17a0: 6c 62 61 63 6b 20 74 6f 20 49 44 20 69 66 20 74  lback to ID if t
17b0: 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61 72  hey will not par
17c0: 73 65 20 61 73 20 74 68 65 69 72 20 6f 72 69 67  se as their orig
17d0: 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20 54  inal value..// T
17e0: 68 69 73 20 6f 62 76 69 61 74 65 73 20 74 68 65  his obviates the
17f0: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 20 22 69   need for the "i
1800: 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  d" nonterminal..
1810: 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44 0a  //.%fallback ID.
1820: 20 20 41 42 4f 52 54 20 41 43 54 49 4f 4e 20 41    ABORT ACTION A
1830: 46 54 45 52 20 41 4e 41 4c 59 5a 45 20 41 53 43  FTER ANALYZE ASC
1840: 20 41 54 54 41 43 48 20 42 45 46 4f 52 45 20 42   ATTACH BEFORE B
1850: 45 47 49 4e 20 42 59 20 43 41 53 43 41 44 45 20  EGIN BY CASCADE 
1860: 43 41 53 54 20 43 4f 4c 55 4d 4e 4b 57 0a 20 20  CAST COLUMNKW.  
1870: 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42 41 53  CONFLICT DATABAS
1880: 45 20 44 45 46 45 52 52 45 44 20 44 45 53 43 20  E DEFERRED DESC 
1890: 44 45 54 41 43 48 20 45 41 43 48 20 45 4e 44 20  DETACH EACH END 
18a0: 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49  EXCLUSIVE EXPLAI
18b0: 4e 20 46 41 49 4c 20 46 4f 52 0a 20 20 49 47 4e  N FAIL FOR.  IGN
18c0: 4f 52 45 20 49 4d 4d 45 44 49 41 54 45 20 49 4e  ORE IMMEDIATE IN
18d0: 49 54 49 41 4c 4c 59 20 49 4e 53 54 45 41 44 20  ITIALLY INSTEAD 
18e0: 4c 49 4b 45 5f 4b 57 20 4d 41 54 43 48 20 4e 4f  LIKE_KW MATCH NO
18f0: 20 50 4c 41 4e 0a 20 20 51 55 45 52 59 20 4b 45   PLAN.  QUERY KE
1900: 59 20 4f 46 20 4f 46 46 53 45 54 20 50 52 41 47  Y OF OFFSET PRAG
1910: 4d 41 20 52 41 49 53 45 20 52 45 4c 45 41 53 45  MA RAISE RELEASE
1920: 20 52 45 50 4c 41 43 45 20 52 45 53 54 52 49 43   REPLACE RESTRIC
1930: 54 20 52 4f 57 20 52 4f 4c 4c 42 41 43 4b 0a 20  T ROW ROLLBACK. 
1940: 20 53 41 56 45 50 4f 49 4e 54 20 54 45 4d 50 20   SAVEPOINT TEMP 
1950: 54 52 49 47 47 45 52 20 56 41 43 55 55 4d 20 56  TRIGGER VACUUM V
1960: 49 45 57 20 56 49 52 54 55 41 4c 20 57 49 54 48  IEW VIRTUAL WITH
1970: 0a 25 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .%ifdef SQLITE_O
1980: 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
1990: 45 43 54 0a 20 20 45 58 43 45 50 54 20 49 4e 54  ECT.  EXCEPT INT
19a0: 45 52 53 45 43 54 20 55 4e 49 4f 4e 0a 25 65 6e  ERSECT UNION.%en
19b0: 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  dif SQLITE_OMIT_
19c0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
19d0: 20 20 52 45 49 4e 44 45 58 20 52 45 4e 41 4d 45    REINDEX RENAME
19e0: 20 43 54 49 4d 45 5f 4b 57 20 49 46 0a 20 20 2e   CTIME_KW IF.  .
19f0: 0a 25 77 69 6c 64 63 61 72 64 20 41 4e 59 2e 0a  .%wildcard ANY..
1a00: 0a 2f 2f 20 44 65 66 69 6e 65 20 6f 70 65 72 61  .// Define opera
1a10: 74 6f 72 20 70 72 65 63 65 64 65 6e 63 65 20 65  tor precedence e
1a20: 61 72 6c 79 20 73 6f 20 74 68 61 74 20 74 68 69  arly so that thi
1a30: 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
1a40: 63 63 75 72 72 65 6e 63 65 0a 2f 2f 20 6f 66 20  ccurrence.// of 
1a50: 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 6f 6b  the operator tok
1a60: 65 6e 73 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  ens in the gramm
1a70: 65 72 2e 20 20 4b 65 65 70 69 6e 67 20 74 68 65  er.  Keeping the
1a80: 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 67 65 74   operators toget
1a90: 68 65 72 0a 2f 2f 20 63 61 75 73 65 73 20 74 68  her.// causes th
1aa0: 65 6d 20 74 6f 20 62 65 20 61 73 73 69 67 6e 65  em to be assigne
1ab0: 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73  d integer values
1ac0: 20 74 68 61 74 20 61 72 65 20 63 6c 6f 73 65 20   that are close 
1ad0: 74 6f 67 65 74 68 65 72 2c 0a 2f 2f 20 77 68 69  together,.// whi
1ae0: 63 68 20 6b 65 65 70 73 20 70 61 72 73 65 72 20  ch keeps parser 
1af0: 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72 2e 0a  tables smaller..
1b00: 2f 2f 0a 2f 2f 20 54 68 65 20 74 6f 6b 65 6e 20  //.// The token 
1b10: 76 61 6c 75 65 73 20 61 73 73 69 67 6e 65 64 20  values assigned 
1b20: 74 6f 20 74 68 65 73 65 20 73 79 6d 62 6f 6c 73  to these symbols
1b30: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
1b40: 79 20 74 68 65 20 6f 72 64 65 72 0a 2f 2f 20 69  y the order.// i
1b50: 6e 20 77 68 69 63 68 20 6c 65 6d 6f 6e 20 66 69  n which lemon fi
1b60: 72 73 74 20 73 65 65 73 20 74 68 65 6d 2e 20 20  rst sees them.  
1b70: 49 74 20 6d 75 73 74 20 62 65 20 74 68 65 20 63  It must be the c
1b80: 61 73 65 20 74 68 61 74 20 49 53 4e 55 4c 4c 2f  ase that ISNULL/
1b90: 4e 4f 54 4e 55 4c 4c 2c 0a 2f 2f 20 4e 45 2f 45  NOTNULL,.// NE/E
1ba0: 51 2c 20 47 54 2f 4c 45 2c 20 61 6e 64 20 47 45  Q, GT/LE, and GE
1bb0: 2f 4c 54 20 61 72 65 20 73 65 70 61 72 61 74 65  /LT are separate
1bc0: 64 20 62 79 20 6f 6e 6c 79 20 61 20 73 69 6e 67  d by only a sing
1bd0: 6c 65 20 76 61 6c 75 65 2e 20 20 53 65 65 0a 2f  le value.  See./
1be0: 2f 20 74 68 65 20 73 71 6c 69 74 65 33 45 78 70  / the sqlite3Exp
1bf0: 72 49 66 46 61 6c 73 65 28 29 20 72 6f 75 74 69  rIfFalse() routi
1c00: 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
1c10: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  l information on
1c20: 20 74 68 69 73 0a 2f 2f 20 63 6f 6e 73 74 72 61   this.// constra
1c30: 69 6e 74 2e 0a 2f 2f 0a 25 6c 65 66 74 20 4f 52  int..//.%left OR
1c40: 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a 25 72 69  ..%left AND..%ri
1c50: 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66 74 20 49  ght NOT..%left I
1c60: 53 20 4d 41 54 43 48 20 4c 49 4b 45 5f 4b 57 20  S MATCH LIKE_KW 
1c70: 42 45 54 57 45 45 4e 20 49 4e 20 49 53 4e 55 4c  BETWEEN IN ISNUL
1c80: 4c 20 4e 4f 54 4e 55 4c 4c 20 4e 45 20 45 51 2e  L NOTNULL NE EQ.
1c90: 0a 25 6c 65 66 74 20 47 54 20 4c 45 20 4c 54 20  .%left GT LE LT 
1ca0: 47 45 2e 0a 25 72 69 67 68 74 20 45 53 43 41 50  GE..%right ESCAP
1cb0: 45 2e 0a 25 6c 65 66 74 20 42 49 54 41 4e 44 20  E..%left BITAND 
1cc0: 42 49 54 4f 52 20 4c 53 48 49 46 54 20 52 53 48  BITOR LSHIFT RSH
1cd0: 49 46 54 2e 0a 25 6c 65 66 74 20 50 4c 55 53 20  IFT..%left PLUS 
1ce0: 4d 49 4e 55 53 2e 0a 25 6c 65 66 74 20 53 54 41  MINUS..%left STA
1cf0: 52 20 53 4c 41 53 48 20 52 45 4d 2e 0a 25 6c 65  R SLASH REM..%le
1d00: 66 74 20 43 4f 4e 43 41 54 2e 0a 25 6c 65 66 74  ft CONCAT..%left
1d10: 20 43 4f 4c 4c 41 54 45 2e 0a 25 72 69 67 68 74   COLLATE..%right
1d20: 20 42 49 54 4e 4f 54 2e 0a 0a 2f 2f 20 41 6e 64   BITNOT...// And
1d30: 20 22 69 64 73 22 20 69 73 20 61 6e 20 69 64 65   "ids" is an ide
1d40: 6e 74 69 66 65 72 2d 6f 72 2d 73 74 72 69 6e 67  ntifer-or-string
1d50: 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64 73 20 7b  ..//.%type ids {
1d60: 54 6f 6b 65 6e 7d 0a 69 64 73 28 41 29 20 3a 3a  Token}.ids(A) ::
1d70: 3d 20 49 44 7c 53 54 52 49 4e 47 28 58 29 2e 20  = ID|STRING(X). 
1d80: 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 54    {A = X;}..// T
1d90: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
1da0: 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20 63 61 6e  umn or table can
1db0: 20 62 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66   be any of the f
1dc0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a 25 74 79  ollowing:.//.%ty
1dd0: 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e 6d  pe nm {Token}.nm
1de0: 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 2e 20 20  (A) ::= id(X).  
1df0: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
1e00: 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47  nm(A) ::= STRING
1e10: 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b  (X).     {A = X;
1e20: 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e  }.nm(A) ::= JOIN
1e30: 5f 4b 57 28 58 29 2e 20 20 20 20 7b 41 20 3d 20  _KW(X).    {A = 
1e40: 58 3b 7d 0a 0a 2f 2f 20 41 20 74 79 70 65 74 6f  X;}..// A typeto
1e50: 6b 65 6e 20 69 73 20 72 65 61 6c 6c 79 20 6f 6e  ken is really on
1e60: 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e 73  e or more tokens
1e70: 20 74 68 61 74 20 66 6f 72 6d 20 61 20 74 79 70   that form a typ
1e80: 65 20 6e 61 6d 65 20 73 75 63 68 0a 2f 2f 20 61  e name such.// a
1e90: 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 61  s can be found a
1ea0: 66 74 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  fter the column 
1eb0: 6e 61 6d 65 20 69 6e 20 61 20 43 52 45 41 54 45  name in a CREATE
1ec0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1ed0: 2e 0a 2f 2f 20 4d 75 6c 74 69 70 6c 65 20 74 6f  ..// Multiple to
1ee0: 6b 65 6e 73 20 61 72 65 20 63 6f 6e 63 61 74 65  kens are concate
1ef0: 6e 61 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68  nated to form th
1f00: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 74  e value of the t
1f10: 79 70 65 74 6f 6b 65 6e 2e 0a 2f 2f 0a 25 74 79  ypetoken..//.%ty
1f20: 70 65 20 74 79 70 65 74 6f 6b 65 6e 20 7b 54 6f  pe typetoken {To
1f30: 6b 65 6e 7d 0a 74 79 70 65 20 3a 3a 3d 20 2e 0a  ken}.type ::= ..
1f40: 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 74 6f 6b  type ::= typetok
1f50: 65 6e 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  en(X).          
1f60: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1f70: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70  3AddColumnType(p
1f80: 50 61 72 73 65 2c 26 58 29 3b 7d 0a 74 79 70 65  Parse,&X);}.type
1f90: 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79 70  token(A) ::= typ
1fa0: 65 6e 61 6d 65 28 58 29 2e 20 20 20 7b 41 20 3d  ename(X).   {A =
1fb0: 20 58 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41   X;}.typetoken(A
1fc0: 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58  ) ::= typename(X
1fd0: 29 20 4c 50 20 73 69 67 6e 65 64 20 52 50 28 59  ) LP signed RP(Y
1fe0: 29 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e 7a  ). {.  A.z = X.z
1ff0: 3b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74 29 28  ;.  A.n = (int)(
2000: 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 58 2e 7a 29  &Y.z[Y.n] - X.z)
2010: 3b 0a 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29  ;.}.typetoken(A)
2020: 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29   ::= typename(X)
2030: 20 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d 4d 41   LP signed COMMA
2040: 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e 20 7b   signed RP(Y). {
2050: 0a 20 20 41 2e 7a 20 3d 20 58 2e 7a 3b 0a 20 20  .  A.z = X.z;.  
2060: 41 2e 6e 20 3d 20 28 69 6e 74 29 28 26 59 2e 7a  A.n = (int)(&Y.z
2070: 5b 59 2e 6e 5d 20 2d 20 58 2e 7a 29 3b 0a 7d 0a  [Y.n] - X.z);.}.
2080: 25 74 79 70 65 20 74 79 70 65 6e 61 6d 65 20 7b  %type typename {
2090: 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61 6d 65 28  Token}.typename(
20a0: 41 29 20 3a 3a 3d 20 69 64 73 28 58 29 2e 20 20  A) ::= ids(X).  
20b0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
20c0: 58 3b 7d 0a 74 79 70 65 6e 61 6d 65 28 41 29 20  X;}.typename(A) 
20d0: 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 20  ::= typename(X) 
20e0: 69 64 73 28 59 29 2e 20 7b 41 2e 7a 3d 58 2e 7a  ids(Y). {A.z=X.z
20f0: 3b 20 41 2e 6e 3d 59 2e 6e 2b 28 69 6e 74 29 28  ; A.n=Y.n+(int)(
2100: 59 2e 7a 2d 58 2e 7a 29 3b 7d 0a 73 69 67 6e 65  Y.z-X.z);}.signe
2110: 64 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d 2e 0a  d ::= plus_num..
2120: 73 69 67 6e 65 64 20 3a 3a 3d 20 6d 69 6e 75 73  signed ::= minus
2130: 5f 6e 75 6d 2e 0a 0a 2f 2f 20 22 63 61 72 67 6c  _num...// "cargl
2140: 69 73 74 22 20 69 73 20 61 20 6c 69 73 74 20 6f  ist" is a list o
2150: 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e  f additional con
2160: 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f  straints that co
2170: 6d 65 20 61 66 74 65 72 20 74 68 65 0a 2f 2f 20  me after the.// 
2180: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20  column name and 
2190: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 20 61  column type in a
21a0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
21b0: 61 74 65 6d 65 6e 74 2e 0a 2f 2f 0a 63 61 72 67  atement..//.carg
21c0: 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c 69 73  list ::= carglis
21d0: 74 20 63 63 6f 6e 73 2e 0a 63 61 72 67 6c 69 73  t ccons..carglis
21e0: 74 20 3a 3a 3d 20 2e 0a 63 63 6f 6e 73 20 3a 3a  t ::= ..ccons ::
21f0: 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 28  = CONSTRAINT nm(
2200: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 7b 70  X).           {p
2210: 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e  Parse->constrain
2220: 74 4e 61 6d 65 20 3d 20 58 3b 7d 0a 63 63 6f 6e  tName = X;}.ccon
2230: 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 74 65  s ::= DEFAULT te
2240: 72 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  rm(X).          
2250: 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65 66    {sqlite3AddDef
2260: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
2270: 2c 26 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d  ,&X);}.ccons ::=
2280: 20 44 45 46 41 55 4c 54 20 4c 50 20 65 78 70 72   DEFAULT LP expr
2290: 28 58 29 20 52 50 2e 20 20 20 20 20 20 7b 73 71  (X) RP.      {sq
22a0: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
22b0: 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 29 3b  alue(pParse,&X);
22c0: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41  }.ccons ::= DEFA
22d0: 55 4c 54 20 50 4c 55 53 20 74 65 72 6d 28 58 29  ULT PLUS term(X)
22e0: 2e 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33  .       {sqlite3
22f0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
2300: 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63 63 6f  pParse,&X);}.cco
2310: 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4d  ns ::= DEFAULT M
2320: 49 4e 55 53 28 41 29 20 74 65 72 6d 28 58 29 2e  INUS(A) term(X).
2330: 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72 53 70        {.  ExprSp
2340: 61 6e 20 76 3b 0a 20 20 76 2e 70 45 78 70 72 20  an v;.  v.pExpr 
2350: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
2360: 50 61 72 73 65 2c 20 54 4b 5f 55 4d 49 4e 55 53  Parse, TK_UMINUS
2370: 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c 20 30 29  , X.pExpr, 0, 0)
2380: 3b 0a 20 20 76 2e 7a 53 74 61 72 74 20 3d 20 41  ;.  v.zStart = A
2390: 2e 7a 3b 0a 20 20 76 2e 7a 45 6e 64 20 3d 20 58  .z;.  v.zEnd = X
23a0: 2e 7a 45 6e 64 3b 0a 20 20 73 71 6c 69 74 65 33  .zEnd;.  sqlite3
23b0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
23c0: 70 50 61 72 73 65 2c 26 76 29 3b 0a 7d 0a 63 63  pParse,&v);.}.cc
23d0: 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  ons ::= DEFAULT 
23e0: 69 64 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  id(X).          
23f0: 20 20 20 20 7b 0a 20 20 45 78 70 72 53 70 61 6e      {.  ExprSpan
2400: 20 76 3b 0a 20 20 73 70 61 6e 45 78 70 72 28 26   v;.  spanExpr(&
2410: 76 2c 20 70 50 61 72 73 65 2c 20 54 4b 5f 53 54  v, pParse, TK_ST
2420: 52 49 4e 47 2c 20 26 58 29 3b 0a 20 20 73 71 6c  RING, &X);.  sql
2430: 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56 61  ite3AddDefaultVa
2440: 6c 75 65 28 70 50 61 72 73 65 2c 26 76 29 3b 0a  lue(pParse,&v);.
2450: 7d 0a 0a 2f 2f 20 49 6e 20 61 64 64 69 74 69 6f  }..// In additio
2460: 6e 20 74 6f 20 74 68 65 20 74 79 70 65 20 6e 61  n to the type na
2470: 6d 65 2c 20 77 65 20 61 6c 73 6f 20 63 61 72 65  me, we also care
2480: 20 61 62 6f 75 74 20 74 68 65 20 70 72 69 6d 61   about the prima
2490: 72 79 20 6b 65 79 20 61 6e 64 0a 2f 2f 20 55 4e  ry key and.// UN
24a0: 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73  IQUE constraints
24b0: 2e 0a 2f 2f 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e  ..//.ccons ::= N
24c0: 55 4c 4c 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e  ULL onconf..ccon
24d0: 73 20 3a 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 20 6f  s ::= NOT NULL o
24e0: 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20 7b 73 71  nconf(R).    {sq
24f0: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
2500: 70 50 61 72 73 65 2c 20 52 29 3b 7d 0a 63 63 6f  pParse, R);}.cco
2510: 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b  ns ::= PRIMARY K
2520: 45 59 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 20  EY sortorder(Z) 
2530: 6f 6e 63 6f 6e 66 28 52 29 20 61 75 74 6f 69 6e  onconf(R) autoin
2540: 63 28 49 29 2e 0a 20 20 20 20 20 20 20 20 20 20  c(I)..          
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41         {sqlite3A
2570: 64 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61  ddPrimaryKey(pPa
2580: 72 73 65 2c 30 2c 52 2c 49 2c 5a 29 3b 7d 0a 63  rse,0,R,I,Z);}.c
2590: 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20  cons ::= UNIQUE 
25a0: 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20 20 20  onconf(R).      
25b0: 7b 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e  {sqlite3CreateIn
25c0: 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  dex(pParse,0,0,0
25d0: 2c 30 2c 52 2c 30 2c 30 2c 30 2c 30 29 3b 7d 0a  ,0,R,0,0,0,0);}.
25e0: 63 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20  ccons ::= CHECK 
25f0: 4c 50 20 65 78 70 72 28 58 29 20 52 50 2e 20 20  LP expr(X) RP.  
2600: 20 7b 73 71 6c 69 74 65 33 41 64 64 43 68 65 63   {sqlite3AddChec
2610: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  kConstraint(pPar
2620: 73 65 2c 58 2e 70 45 78 70 72 29 3b 7d 0a 63 63  se,X.pExpr);}.cc
2630: 6f 6e 73 20 3a 3a 3d 20 52 45 46 45 52 45 4e 43  ons ::= REFERENC
2640: 45 53 20 6e 6d 28 54 29 20 69 64 78 6c 69 73 74  ES nm(T) idxlist
2650: 5f 6f 70 74 28 54 41 29 20 72 65 66 61 72 67 73  _opt(TA) refargs
2660: 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (R)..           
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72        {sqlite3Cr
2690: 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 70  eateForeignKey(p
26a0: 50 61 72 73 65 2c 30 2c 26 54 2c 54 41 2c 52 29  Parse,0,&T,TA,R)
26b0: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 64 65 66  ;}.ccons ::= def
26c0: 65 72 5f 73 75 62 63 6c 61 75 73 65 28 44 29 2e  er_subclause(D).
26d0: 20 20 20 20 7b 73 71 6c 69 74 65 33 44 65 66 65      {sqlite3Defe
26e0: 72 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72  rForeignKey(pPar
26f0: 73 65 2c 44 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  se,D);}.ccons ::
2700: 3d 20 43 4f 4c 4c 41 54 45 20 69 64 73 28 43 29  = COLLATE ids(C)
2710: 2e 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65  .        {sqlite
2720: 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28  3AddCollateType(
2730: 70 50 61 72 73 65 2c 20 26 43 29 3b 7d 0a 0a 2f  pParse, &C);}../
2740: 2f 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20 41  / The optional A
2750: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
2760: 77 6f 72 64 0a 25 74 79 70 65 20 61 75 74 6f 69  word.%type autoi
2770: 6e 63 20 7b 69 6e 74 7d 0a 61 75 74 6f 69 6e 63  nc {int}.autoinc
2780: 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (X) ::= .       
2790: 20 20 20 7b 58 20 3d 20 30 3b 7d 0a 61 75 74 6f     {X = 0;}.auto
27a0: 69 6e 63 28 58 29 20 3a 3a 3d 20 41 55 54 4f 49  inc(X) ::= AUTOI
27b0: 4e 43 52 2e 20 20 7b 58 20 3d 20 31 3b 7d 0a 0a  NCR.  {X = 1;}..
27c0: 2f 2f 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  // The next grou
27d0: 70 20 6f 66 20 72 75 6c 65 73 20 70 61 72 73 65  p of rules parse
27e0: 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
27f0: 74 6f 20 61 20 52 45 46 45 52 45 4e 43 45 53 20  to a REFERENCES 
2800: 63 6c 61 75 73 65 0a 2f 2f 20 74 68 61 74 20 64  clause.// that d
2810: 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20  etermine if the 
2820: 72 65 66 65 72 65 6e 74 69 61 6c 20 69 6e 74 65  referential inte
2830: 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  grity checking i
2840: 73 20 64 65 66 65 72 72 65 64 20 6f 72 0a 2f 2f  s deferred or.//
2850: 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 61 6e   or immediate an
2860: 64 20 77 68 69 63 68 20 64 65 74 65 72 6d 69 6e  d which determin
2870: 65 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74 6f  e what action to
2880: 20 74 61 6b 65 20 69 66 20 61 20 72 65 66 2d 69   take if a ref-i
2890: 6e 74 65 67 0a 2f 2f 20 63 68 65 63 6b 20 66 61  nteg.// check fa
28a0: 69 6c 73 2e 0a 2f 2f 0a 25 74 79 70 65 20 72 65  ils..//.%type re
28b0: 66 61 72 67 73 20 7b 69 6e 74 7d 0a 72 65 66 61  fargs {int}.refa
28c0: 72 67 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  rgs(A) ::= .    
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
28e0: 41 20 3d 20 4f 45 5f 4e 6f 6e 65 2a 30 78 30 31  A = OE_None*0x01
28f0: 30 31 3b 20 2f 2a 20 45 56 3a 20 52 2d 31 39 38  01; /* EV: R-198
2900: 30 33 2d 34 35 38 38 34 20 2a 2f 7d 0a 72 65 66  03-45884 */}.ref
2910: 61 72 67 73 28 41 29 20 3a 3a 3d 20 72 65 66 61  args(A) ::= refa
2920: 72 67 73 28 58 29 20 72 65 66 61 72 67 28 59 29  rgs(X) refarg(Y)
2930: 2e 20 7b 20 41 20 3d 20 28 58 20 26 20 7e 59 2e  . { A = (X & ~Y.
2940: 6d 61 73 6b 29 20 7c 20 59 2e 76 61 6c 75 65 3b  mask) | Y.value;
2950: 20 7d 0a 25 74 79 70 65 20 72 65 66 61 72 67 20   }.%type refarg 
2960: 7b 73 74 72 75 63 74 20 7b 69 6e 74 20 76 61 6c  {struct {int val
2970: 75 65 3b 20 69 6e 74 20 6d 61 73 6b 3b 7d 7d 0a  ue; int mask;}}.
2980: 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4d 41  refarg(A) ::= MA
2990: 54 43 48 20 6e 6d 2e 20 20 20 20 20 20 20 20 20  TCH nm.         
29a0: 20 20 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d       { A.value =
29b0: 20 30 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d   0;     A.mask =
29c0: 20 30 78 30 30 30 30 30 30 3b 20 7d 0a 72 65 66   0x000000; }.ref
29d0: 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 49 4e  arg(A) ::= ON IN
29e0: 53 45 52 54 20 72 65 66 61 63 74 2e 20 20 20 20  SERT refact.    
29f0: 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 30 3b    { A.value = 0;
2a00: 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78       A.mask = 0x
2a10: 30 30 30 30 30 30 3b 20 7d 0a 72 65 66 61 72 67  000000; }.refarg
2a20: 28 41 29 20 3a 3a 3d 20 4f 4e 20 44 45 4c 45 54  (A) ::= ON DELET
2a30: 45 20 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b  E refact(X).   {
2a40: 20 41 2e 76 61 6c 75 65 20 3d 20 58 3b 20 20 20   A.value = X;   
2a50: 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30    A.mask = 0x000
2a60: 30 66 66 3b 20 7d 0a 72 65 66 61 72 67 28 41 29  0ff; }.refarg(A)
2a70: 20 3a 3a 3d 20 4f 4e 20 55 50 44 41 54 45 20 72   ::= ON UPDATE r
2a80: 65 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41 2e  efact(X).   { A.
2a90: 76 61 6c 75 65 20 3d 20 58 3c 3c 38 3b 20 20 41  value = X<<8;  A
2aa0: 2e 6d 61 73 6b 20 3d 20 30 78 30 30 66 66 30 30  .mask = 0x00ff00
2ab0: 3b 20 7d 0a 25 74 79 70 65 20 72 65 66 61 63 74  ; }.%type refact
2ac0: 20 7b 69 6e 74 7d 0a 72 65 66 61 63 74 28 41 29   {int}.refact(A)
2ad0: 20 3a 3a 3d 20 53 45 54 20 4e 55 4c 4c 2e 20 20   ::= SET NULL.  
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20              { A 
2af0: 3d 20 4f 45 5f 53 65 74 4e 75 6c 6c 3b 20 20 2f  = OE_SetNull;  /
2b00: 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34 35  * EV: R-33326-45
2b10: 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28 41  252 */}.refact(A
2b20: 29 20 3a 3a 3d 20 53 45 54 20 44 45 46 41 55 4c  ) ::= SET DEFAUL
2b30: 54 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20 41  T.           { A
2b40: 20 3d 20 4f 45 5f 53 65 74 44 66 6c 74 3b 20 20   = OE_SetDflt;  
2b50: 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34  /* EV: R-33326-4
2b60: 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28  5252 */}.refact(
2b70: 41 29 20 3a 3a 3d 20 43 41 53 43 41 44 45 2e 20  A) ::= CASCADE. 
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
2b90: 41 20 3d 20 4f 45 5f 43 61 73 63 61 64 65 3b 20  A = OE_Cascade; 
2ba0: 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d   /* EV: R-33326-
2bb0: 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74  45252 */}.refact
2bc0: 28 41 29 20 3a 3a 3d 20 52 45 53 54 52 49 43 54  (A) ::= RESTRICT
2bd0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
2be0: 20 41 20 3d 20 4f 45 5f 52 65 73 74 72 69 63 74   A = OE_Restrict
2bf0: 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36  ; /* EV: R-33326
2c00: 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63  -45252 */}.refac
2c10: 74 28 41 29 20 3a 3a 3d 20 4e 4f 20 41 43 54 49  t(A) ::= NO ACTI
2c20: 4f 4e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
2c30: 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 20 20  { A = OE_None;  
2c40: 20 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32     /* EV: R-3332
2c50: 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 25 74 79 70  6-45252 */}.%typ
2c60: 65 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  e defer_subclaus
2c70: 65 20 7b 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75  e {int}.defer_su
2c80: 62 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 4e  bclause(A) ::= N
2c90: 4f 54 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e  OT DEFERRABLE in
2ca0: 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64  it_deferred_pred
2cb0: 5f 6f 70 74 2e 20 20 20 20 20 7b 41 20 3d 20 30  _opt.     {A = 0
2cc0: 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75  ;}.defer_subclau
2cd0: 73 65 28 41 29 20 3a 3a 3d 20 44 45 46 45 52 52  se(A) ::= DEFERR
2ce0: 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72 72  ABLE init_deferr
2cf0: 65 64 5f 70 72 65 64 5f 6f 70 74 28 58 29 2e 20  ed_pred_opt(X). 
2d00: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 74       {A = X;}.%t
2d10: 79 70 65 20 69 6e 69 74 5f 64 65 66 65 72 72 65  ype init_deferre
2d20: 64 5f 70 72 65 64 5f 6f 70 74 20 7b 69 6e 74 7d  d_pred_opt {int}
2d30: 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70  .init_deferred_p
2d40: 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  red_opt(A) ::= .
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d60: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
2d70: 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72  init_deferred_pr
2d80: 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e  ed_opt(A) ::= IN
2d90: 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
2da0: 2e 20 20 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 69  .     {A = 1;}.i
2db0: 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65  nit_deferred_pre
2dc0: 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e 49  d_opt(A) ::= INI
2dd0: 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
2de0: 2e 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 63  .    {A = 0;}..c
2df0: 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  onslist_opt(A) :
2e00: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e               {A.
2e20: 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20 30 3b 7d  n = 0; A.z = 0;}
2e30: 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41 29  .conslist_opt(A)
2e40: 20 3a 3a 3d 20 43 4f 4d 4d 41 28 58 29 20 63 6f   ::= COMMA(X) co
2e50: 6e 73 6c 69 73 74 2e 20 20 20 20 20 20 20 20 7b  nslist.        {
2e60: 41 20 3d 20 58 3b 7d 0a 63 6f 6e 73 6c 69 73 74  A = X;}.conslist
2e70: 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 74 63   ::= conslist tc
2e80: 6f 6e 73 63 6f 6d 6d 61 20 74 63 6f 6e 73 2e 0a  onscomma tcons..
2e90: 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 74 63 6f  conslist ::= tco
2ea0: 6e 73 2e 0a 74 63 6f 6e 73 63 6f 6d 6d 61 20 3a  ns..tconscomma :
2eb0: 3a 3d 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20  := COMMA.       
2ec0: 20 20 20 20 20 7b 70 50 61 72 73 65 2d 3e 63 6f       {pParse->co
2ed0: 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d  nstraintName.n =
2ee0: 20 30 3b 7d 0a 74 63 6f 6e 73 63 6f 6d 6d 61 20   0;}.tconscomma 
2ef0: 3a 3a 3d 20 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20  ::= ..tcons ::= 
2f00: 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 28 58 29  CONSTRAINT nm(X)
2f10: 2e 20 20 20 20 20 20 7b 70 50 61 72 73 65 2d 3e  .      {pParse->
2f20: 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 20 3d  constraintName =
2f30: 20 58 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50   X;}.tcons ::= P
2f40: 52 49 4d 41 52 59 20 4b 45 59 20 4c 50 20 69 64  RIMARY KEY LP id
2f50: 78 6c 69 73 74 28 58 29 20 61 75 74 6f 69 6e 63  xlist(X) autoinc
2f60: 28 49 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29  (I) RP onconf(R)
2f70: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 50 72     {sqlite3AddPr
2fa0: 69 6d 61 72 79 4b 65 79 28 70 50 61 72 73 65 2c  imaryKey(pParse,
2fb0: 58 2c 52 2c 49 2c 30 29 3b 7d 0a 74 63 6f 6e 73  X,R,I,0);}.tcons
2fc0: 20 3a 3a 3d 20 55 4e 49 51 55 45 20 4c 50 20 69   ::= UNIQUE LP i
2fd0: 64 78 6c 69 73 74 28 58 29 20 52 50 20 6f 6e 63  dxlist(X) RP onc
2fe0: 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20 20 20 20  onf(R)..        
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
3010: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
3020: 72 73 65 2c 30 2c 30 2c 30 2c 58 2c 52 2c 30 2c  rse,0,0,0,X,R,0,
3030: 30 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20 3a  0,0,0);}.tcons :
3040: 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70 72  := CHECK LP expr
3050: 28 45 29 20 52 50 20 6f 6e 63 6f 6e 66 2e 0a 20  (E) RP onconf.. 
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 7b 73 71 6c 69 74 65 33 41 64 64 43 68 65 63 6b  {sqlite3AddCheck
3090: 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
30a0: 65 2c 45 2e 70 45 78 70 72 29 3b 7d 0a 74 63 6f  e,E.pExpr);}.tco
30b0: 6e 73 20 3a 3a 3d 20 46 4f 52 45 49 47 4e 20 4b  ns ::= FOREIGN K
30c0: 45 59 20 4c 50 20 69 64 78 6c 69 73 74 28 46 41  EY LP idxlist(FA
30d0: 29 20 52 50 0a 20 20 20 20 20 20 20 20 20 20 52  ) RP.          R
30e0: 45 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29 20  EFERENCES nm(T) 
30f0: 69 64 78 6c 69 73 74 5f 6f 70 74 28 54 41 29 20  idxlist_opt(TA) 
3100: 72 65 66 61 72 67 73 28 52 29 20 64 65 66 65 72  refargs(R) defer
3110: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 44  _subclause_opt(D
3120: 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ). {.    sqlite3
3130: 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79  CreateForeignKey
3140: 28 70 50 61 72 73 65 2c 20 46 41 2c 20 26 54 2c  (pParse, FA, &T,
3150: 20 54 41 2c 20 52 29 3b 0a 20 20 20 20 73 71 6c   TA, R);.    sql
3160: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
3170: 4b 65 79 28 70 50 61 72 73 65 2c 20 44 29 3b 0a  Key(pParse, D);.
3180: 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f 73 75  }.%type defer_su
3190: 62 63 6c 61 75 73 65 5f 6f 70 74 20 7b 69 6e 74  bclause_opt {int
31a0: 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73  }.defer_subclaus
31b0: 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  e_opt(A) ::= .  
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72    {A = 0;}.defer
31e0: 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 41  _subclause_opt(A
31f0: 29 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62 63  ) ::= defer_subc
3200: 6c 61 75 73 65 28 58 29 2e 20 20 7b 41 20 3d 20  lause(X).  {A = 
3210: 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c  X;}..// The foll
3220: 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73  owing is a non-s
3230: 74 61 6e 64 61 72 64 20 65 78 74 65 6e 73 69 6f  tandard extensio
3240: 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73  n that allows us
3250: 20 74 6f 20 64 65 63 6c 61 72 65 20 74 68 65 0a   to declare the.
3260: 2f 2f 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  // default behav
3270: 69 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20 69  ior when there i
3280: 73 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  s a constraint c
3290: 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70  onflict..//.%typ
32a0: 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25  e onconf {int}.%
32b0: 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b 75 38 7d  type orconf {u8}
32c0: 0a 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74 79  .%type resolvety
32d0: 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28  pe {int}.onconf(
32e0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44 65        {A = OE_De
3310: 66 61 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28 41  fault;}.onconf(A
3320: 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43  ) ::= ON CONFLIC
3330: 54 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29  T resolvetype(X)
3340: 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f 72  .    {A = X;}.or
3350: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20  conf(A) ::= .   
3360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3370: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3380: 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72 63  OE_Default;}.orc
3390: 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72 65  onf(A) ::= OR re
33a0: 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20 20  solvetype(X).   
33b0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 28            {A = (
33c0: 75 38 29 58 3b 7d 0a 72 65 73 6f 6c 76 65 74 79  u8)X;}.resolvety
33d0: 70 65 28 41 29 20 3a 3a 3d 20 72 61 69 73 65 74  pe(A) ::= raiset
33e0: 79 70 65 28 58 29 2e 20 20 20 20 20 20 20 20 20  ype(X).         
33f0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 72 65 73      {A = X;}.res
3400: 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20  olvetype(A) ::= 
3410: 49 47 4e 4f 52 45 2e 20 20 20 20 20 20 20 20 20  IGNORE.         
3420: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f            {A = O
3430: 45 5f 49 67 6e 6f 72 65 3b 7d 0a 72 65 73 6f 6c  E_Ignore;}.resol
3440: 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52 45  vetype(A) ::= RE
3450: 50 4c 41 43 45 2e 20 20 20 20 20 20 20 20 20 20  PLACE.          
3460: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f          {A = OE_
3470: 52 65 70 6c 61 63 65 3b 7d 0a 0a 2f 2f 2f 2f 2f  Replace;}../////
3480: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3490: 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20 54  ///// The DROP T
34a0: 41 42 4c 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ABLE ///////////
34b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
34c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d  //////////.//.cm
34d0: 64 20 3a 3a 3d 20 44 52 4f 50 20 54 41 42 4c 45  d ::= DROP TABLE
34e0: 20 69 66 65 78 69 73 74 73 28 45 29 20 66 75 6c   ifexists(E) ful
34f0: 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71  lname(X). {.  sq
3500: 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28 70  lite3DropTable(p
3510: 50 61 72 73 65 2c 20 58 2c 20 30 2c 20 45 29 3b  Parse, X, 0, E);
3520: 0a 7d 0a 25 74 79 70 65 20 69 66 65 78 69 73 74  .}.%type ifexist
3530: 73 20 7b 69 6e 74 7d 0a 69 66 65 78 69 73 74 73  s {int}.ifexists
3540: 28 41 29 20 3a 3a 3d 20 49 46 20 45 58 49 53 54  (A) ::= IF EXIST
3550: 53 2e 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 69 66  S.   {A = 1;}.if
3560: 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 2e 20  exists(A) ::= . 
3570: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3580: 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  0;}..///////////
3590: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43  ////////// The C
35a0: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
35b0: 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ment ///////////
35c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35d0: 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51  //.//.%ifndef SQ
35e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 63  LITE_OMIT_VIEW.c
35f0: 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 28  md ::= createkw(
3600: 58 29 20 74 65 6d 70 28 54 29 20 56 49 45 57 20  X) temp(T) VIEW 
3610: 69 66 6e 6f 74 65 78 69 73 74 73 28 45 29 20 6e  ifnotexists(E) n
3620: 6d 28 59 29 20 64 62 6e 6d 28 5a 29 20 41 53 20  m(Y) dbnm(Z) AS 
3630: 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73  select(S). {.  s
3640: 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77  qlite3CreateView
3650: 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59 2c  (pParse, &X, &Y,
3660: 20 26 5a 2c 20 53 2c 20 54 2c 20 45 29 3b 0a 7d   &Z, S, T, E);.}
3670: 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 56 49  .cmd ::= DROP VI
3680: 45 57 20 69 66 65 78 69 73 74 73 28 45 29 20 66  EW ifexists(E) f
3690: 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20  ullname(X). {.  
36a0: 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65  sqlite3DropTable
36b0: 28 70 50 61 72 73 65 2c 20 58 2c 20 31 2c 20 45  (pParse, X, 1, E
36c0: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  );.}.%endif  SQL
36d0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 0a 2f  ITE_OMIT_VIEW../
36e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
36f0: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53 45 4c 45  /////// The SELE
3700: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f  CT statement ///
3710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f  //////////////./
3730: 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c 65 63 74  /.cmd ::= select
3740: 28 58 29 2e 20 20 7b 0a 20 20 53 65 6c 65 63 74  (X).  {.  Select
3750: 44 65 73 74 20 64 65 73 74 20 3d 20 7b 53 52 54  Dest dest = {SRT
3760: 5f 4f 75 74 70 75 74 2c 20 30 2c 20 30 2c 20 30  _Output, 0, 0, 0
3770: 2c 20 30 7d 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 0};.  sqlite3S
3780: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 58 2c  elect(pParse, X,
3790: 20 26 64 65 73 74 29 3b 0a 20 20 73 71 6c 69 74   &dest);.  sqlit
37a0: 65 33 45 78 70 6c 61 69 6e 42 65 67 69 6e 28 70  e3ExplainBegin(p
37b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a 20  Parse->pVdbe);. 
37c0: 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53   sqlite3ExplainS
37d0: 65 6c 65 63 74 28 70 50 61 72 73 65 2d 3e 70 56  elect(pParse->pV
37e0: 64 62 65 2c 20 58 29 3b 0a 20 20 73 71 6c 69 74  dbe, X);.  sqlit
37f0: 65 33 45 78 70 6c 61 69 6e 46 69 6e 69 73 68 28  e3ExplainFinish(
3800: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 29 3b 0a  pParse->pVdbe);.
3810: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
3820: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
3830: 2c 20 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  , X);.}..%type s
3840: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
3850: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
3860: 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63  ct {sqlite3Selec
3870: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
3880: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
3890: 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65 6c 65 63  oneselect {Selec
38a0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
38b0: 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71 6c 69 74  oneselect {sqlit
38c0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
38d0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
38e0: 0a 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20  ..select(A) ::= 
38f0: 6f 6e 65 73 65 6c 65 63 74 28 58 29 2e 20 20 20  oneselect(X).   
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3910: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 25 69 66 6e     {A = X;}.%ifn
3920: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3930: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a  COMPOUND_SELECT.
3940: 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 73 65  select(A) ::= se
3950: 6c 65 63 74 28 58 29 20 6d 75 6c 74 69 73 65 6c  lect(X) multisel
3960: 65 63 74 5f 6f 70 28 59 29 20 6f 6e 65 73 65 6c  ect_op(Y) onesel
3970: 65 63 74 28 5a 29 2e 20 20 7b 0a 20 20 69 66 28  ect(Z).  {.  if(
3980: 20 5a 20 29 7b 0a 20 20 20 20 5a 2d 3e 6f 70 20   Z ){.    Z->op 
3990: 3d 20 28 75 38 29 59 3b 0a 20 20 20 20 5a 2d 3e  = (u8)Y;.    Z->
39a0: 70 50 72 69 6f 72 20 3d 20 58 3b 0a 20 20 20 20  pPrior = X;.    
39b0: 69 66 28 20 59 21 3d 54 4b 5f 41 4c 4c 20 29 20  if( Y!=TK_ALL ) 
39c0: 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
39d0: 75 6e 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  und = 1;.  }else
39e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
39f0: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
3a00: 2d 3e 64 62 2c 20 58 29 3b 0a 20 20 7d 0a 20 20  ->db, X);.  }.  
3a10: 41 20 3d 20 5a 3b 0a 7d 0a 25 74 79 70 65 20 6d  A = Z;.}.%type m
3a20: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 20 7b 69  ultiselect_op {i
3a30: 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f  nt}.multiselect_
3a40: 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 28  op(A) ::= UNION(
3a50: 4f 50 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  OP).            
3a60: 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a 6d 75 6c 74   {A = @OP;}.mult
3a70: 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a  iselect_op(A) ::
3a80: 3d 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20 20 20 20  = UNION ALL.    
3a90: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 54 4b           {A = TK
3aa0: 5f 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65  _ALL;}.multisele
3ab0: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 45 58 43  ct_op(A) ::= EXC
3ac0: 45 50 54 7c 49 4e 54 45 52 53 45 43 54 28 4f 50  EPT|INTERSECT(OP
3ad0: 29 2e 20 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a 25  ).  {A = @OP;}.%
3ae0: 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  endif SQLITE_OMI
3af0: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
3b00: 54 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29 20 3a  T.oneselect(A) :
3b10: 3a 3d 20 53 45 4c 45 43 54 20 64 69 73 74 69 6e  := SELECT distin
3b20: 63 74 28 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74  ct(D) selcollist
3b30: 28 57 29 20 66 72 6f 6d 28 58 29 20 77 68 65 72  (W) from(X) wher
3b40: 65 5f 6f 70 74 28 59 29 0a 20 20 20 20 20 20 20  e_opt(Y).       
3b50: 20 20 20 20 20 20 20 20 20 20 67 72 6f 75 70 62            groupb
3b60: 79 5f 6f 70 74 28 50 29 20 68 61 76 69 6e 67 5f  y_opt(P) having_
3b70: 6f 70 74 28 51 29 20 6f 72 64 65 72 62 79 5f 6f  opt(Q) orderby_o
3b80: 70 74 28 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28  pt(Z) limit_opt(
3b90: 4c 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  L). {.  A = sqli
3ba0: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61  te3SelectNew(pPa
3bb0: 72 73 65 2c 57 2c 58 2c 59 2c 50 2c 51 2c 5a 2c  rse,W,X,Y,P,Q,Z,
3bc0: 44 2c 4c 2e 70 4c 69 6d 69 74 2c 4c 2e 70 4f 66  D,L.pLimit,L.pOf
3bd0: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2f 20 54 68 65  fset);.}..// The
3be0: 20 22 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e 74   "distinct" nont
3bf0: 65 72 6d 69 6e 61 6c 20 69 73 20 74 72 75 65 20  erminal is true 
3c00: 28 31 29 20 69 66 20 74 68 65 20 44 49 53 54 49  (1) if the DISTI
3c10: 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 0a 2f  NCT keyword is./
3c20: 2f 20 70 72 65 73 65 6e 74 20 61 6e 64 20 66 61  / present and fa
3c30: 6c 73 65 20 28 30 29 20 69 66 20 69 74 20 69 73  lse (0) if it is
3c40: 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 64   not..//.%type d
3c50: 69 73 74 69 6e 63 74 20 7b 75 31 36 7d 0a 64 69  istinct {u16}.di
3c60: 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44 49  stinct(A) ::= DI
3c70: 53 54 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20 53  STINCT.   {A = S
3c80: 46 5f 44 69 73 74 69 6e 63 74 3b 7d 0a 64 69 73  F_Distinct;}.dis
3c90: 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 41 4c 4c  tinct(A) ::= ALL
3ca0: 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b  .        {A = 0;
3cb0: 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a  }.distinct(A) ::
3cc0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 7b 41  = .           {A
3cd0: 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73 65 6c 63 6f   = 0;}..// selco
3ce0: 6c 6c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  llist is a list 
3cf0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  of expressions t
3d00: 68 61 74 20 61 72 65 20 74 6f 20 62 65 63 6f 6d  hat are to becom
3d10: 65 20 74 68 65 20 72 65 74 75 72 6e 0a 2f 2f 20  e the return.// 
3d20: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 53 45  values of the SE
3d30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
3d40: 20 54 68 65 20 22 2a 22 20 69 6e 20 73 74 61 74   The "*" in stat
3d50: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 2f 2f 20 22  ements like.// "
3d60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e  SELECT * FROM ..
3d70: 2e 22 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73  ." is encoded as
3d80: 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
3d90: 73 73 69 6f 6e 20 77 69 74 68 20 61 6e 0a 2f 2f  ssion with an.//
3da0: 20 6f 70 63 6f 64 65 20 6f 66 20 54 4b 5f 41 4c   opcode of TK_AL
3db0: 4c 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 65 6c 63  L..//.%type selc
3dc0: 6f 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  ollist {ExprList
3dd0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
3de0: 65 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69 74  elcollist {sqlit
3df0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
3e00: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
3e10: 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70 20 7b 45  ;}.%type sclp {E
3e20: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
3e30: 75 63 74 6f 72 20 73 63 6c 70 20 7b 73 71 6c 69  uctor sclp {sqli
3e40: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
3e50: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
3e60: 29 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20  );}.sclp(A) ::= 
3e70: 73 65 6c 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f  selcollist(X) CO
3e80: 4d 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20 20  MMA.            
3e90: 20 7b 41 20 3d 20 58 3b 7d 0a 73 63 6c 70 28 41   {A = X;}.sclp(A
3ea0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ec0: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
3ed0: 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a  selcollist(A) ::
3ee0: 3d 20 73 63 6c 70 28 50 29 20 65 78 70 72 28 58  = sclp(P) expr(X
3ef0: 29 20 61 73 28 59 29 2e 20 20 20 20 20 7b 0a 20  ) as(Y).     {. 
3f00: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
3f10: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
3f20: 73 65 2c 20 50 2c 20 58 2e 70 45 78 70 72 29 3b  se, P, X.pExpr);
3f30: 0a 20 20 20 69 66 28 20 59 2e 6e 3e 30 20 29 20  .   if( Y.n>0 ) 
3f40: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53  sqlite3ExprListS
3f50: 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 41  etName(pParse, A
3f60: 2c 20 26 59 2c 20 31 29 3b 0a 20 20 20 73 71 6c  , &Y, 1);.   sql
3f70: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 53  ite3ExprListSetS
3f80: 70 61 6e 28 70 50 61 72 73 65 2c 41 2c 26 58 29  pan(pParse,A,&X)
3f90: 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41  ;.}.selcollist(A
3fa0: 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20 53 54  ) ::= sclp(P) ST
3fb0: 41 52 2e 20 7b 0a 20 20 45 78 70 72 20 2a 70 20  AR. {.  Expr *p 
3fc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 70 50  = sqlite3Expr(pP
3fd0: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 41 4c 4c  arse->db, TK_ALL
3fe0: 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  , 0);.  A = sqli
3ff0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
4000: 64 28 70 50 61 72 73 65 2c 20 50 2c 20 70 29 3b  d(pParse, P, p);
4010: 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29  .}.selcollist(A)
4020: 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20 6e 6d 28   ::= sclp(P) nm(
4030: 58 29 20 44 4f 54 20 53 54 41 52 28 59 29 2e 20  X) DOT STAR(Y). 
4040: 7b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  {.  Expr *pRight
4050: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
4060: 70 50 61 72 73 65 2c 20 54 4b 5f 41 4c 4c 2c 20  pParse, TK_ALL, 
4070: 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 45 78 70  0, 0, &Y);.  Exp
4080: 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69 74  r *pLeft = sqlit
4090: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
40a0: 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29  TK_ID, 0, 0, &X)
40b0: 3b 0a 20 20 45 78 70 72 20 2a 70 44 6f 74 20 3d  ;.  Expr *pDot =
40c0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
40d0: 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c  arse, TK_DOT, pL
40e0: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
40f0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
4100: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
4110: 72 73 65 2c 50 2c 20 70 44 6f 74 29 3b 0a 7d 0a  rse,P, pDot);.}.
4120: 0a 2f 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22 41  .// An option "A
4130: 53 20 3c 69 64 3e 22 20 70 68 72 61 73 65 20 74  S <id>" phrase t
4140: 68 61 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f  hat can follow o
4150: 6e 65 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ne of the expres
4160: 73 69 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64 65  sions that.// de
4170: 66 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74 20  fine the result 
4180: 73 65 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  set, or one of t
4190: 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
41a0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f   FROM clause..//
41b0: 0a 25 74 79 70 65 20 61 73 20 7b 54 6f 6b 65 6e  .%type as {Token
41c0: 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 41 53 20 6e  }.as(X) ::= AS n
41d0: 6d 28 59 29 2e 20 20 20 20 7b 58 20 3d 20 59 3b  m(Y).    {X = Y;
41e0: 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 69 64 73 28  }.as(X) ::= ids(
41f0: 59 29 2e 20 20 20 20 20 20 7b 58 20 3d 20 59 3b  Y).      {X = Y;
4200: 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20 20  }.as(X) ::= .   
4210: 20 20 20 20 20 20 20 20 20 7b 58 2e 6e 20 3d 20           {X.n = 
4220: 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 73 65 6c 74  0;}...%type selt
4230: 61 62 6c 69 73 74 20 7b 53 72 63 4c 69 73 74 2a  ablist {SrcList*
4240: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 65  }.%destructor se
4250: 6c 74 61 62 6c 69 73 74 20 7b 73 71 6c 69 74 65  ltablist {sqlite
4260: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
4270: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
4280: 0a 25 74 79 70 65 20 73 74 6c 5f 70 72 65 66 69  .%type stl_prefi
4290: 78 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65  x {SrcList*}.%de
42a0: 73 74 72 75 63 74 6f 72 20 73 74 6c 5f 70 72 65  structor stl_pre
42b0: 66 69 78 20 7b 73 71 6c 69 74 65 33 53 72 63 4c  fix {sqlite3SrcL
42c0: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
42d0: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70  ->db, $$);}.%typ
42e0: 65 20 66 72 6f 6d 20 7b 53 72 63 4c 69 73 74 2a  e from {SrcList*
42f0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 66 72  }.%destructor fr
4300: 6f 6d 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69  om {sqlite3SrcLi
4310: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
4320: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 2f 2f 20 41  >db, $$);}..// A
4330: 20 63 6f 6d 70 6c 65 74 65 20 46 52 4f 4d 20 63   complete FROM c
4340: 6c 61 75 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41  lause..//.from(A
4350: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
4360: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69         {A = sqli
4370: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
4380: 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a 65  pParse->db, size
4390: 6f 66 28 2a 41 29 29 3b 7d 0a 66 72 6f 6d 28 41  of(*A));}.from(A
43a0: 29 20 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74 61  ) ::= FROM selta
43b0: 62 6c 69 73 74 28 58 29 2e 20 7b 0a 20 20 41 20  blist(X). {.  A 
43c0: 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65 33 53 72  = X;.  sqlite3Sr
43d0: 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79  cListShiftJoinTy
43e0: 70 65 28 41 29 3b 0a 7d 0a 0a 2f 2f 20 22 73 65  pe(A);.}..// "se
43f0: 6c 74 61 62 6c 69 73 74 22 20 69 73 20 61 20 22  ltablist" is a "
4400: 53 65 6c 65 63 74 20 54 61 62 6c 65 20 4c 69 73  Select Table Lis
4410: 74 22 20 2d 20 74 68 65 20 63 6f 6e 74 65 6e 74  t" - the content
4420: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
4430: 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53 45 4c 45  use.// in a SELE
4440: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 22  CT statement.  "
4450: 73 74 6c 5f 70 72 65 66 69 78 22 20 69 73 20 61  stl_prefix" is a
4460: 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20   prefix of this 
4470: 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f 70 72 65  list..//.stl_pre
4480: 66 69 78 28 41 29 20 3a 3a 3d 20 73 65 6c 74 61  fix(A) ::= selta
4490: 62 6c 69 73 74 28 58 29 20 6a 6f 69 6e 6f 70 28  blist(X) joinop(
44a0: 59 29 2e 20 20 20 20 7b 0a 20 20 20 41 20 3d 20  Y).    {.   A = 
44b0: 58 3b 0a 20 20 20 69 66 28 20 41 4c 57 41 59 53  X;.   if( ALWAYS
44c0: 28 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 30 29  (A && A->nSrc>0)
44d0: 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d   ) A->a[A->nSrc-
44e0: 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 28 75  1].jointype = (u
44f0: 38 29 59 3b 0a 7d 0a 73 74 6c 5f 70 72 65 66 69  8)Y;.}.stl_prefi
4500: 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  x(A) ::= .      
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4520: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65       {A = 0;}.se
4530: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ltablist(A) ::= 
4540: 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20 6e 6d  stl_prefix(X) nm
4550: 28 59 29 20 64 62 6e 6d 28 44 29 20 61 73 28 5a  (Y) dbnm(D) as(Z
4560: 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29  ) indexed_opt(I)
4570: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4580: 20 20 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69     on_opt(N) usi
4590: 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 41  ng_opt(U). {.  A
45a0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
45b0: 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28  tAppendFromTerm(
45c0: 70 50 61 72 73 65 2c 58 2c 26 59 2c 26 44 2c 26  pParse,X,&Y,&D,&
45d0: 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20 73 71 6c 69  Z,0,N,U);.  sqli
45e0: 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
45f0: 64 42 79 28 70 50 61 72 73 65 2c 20 41 2c 20 26  dBy(pParse, A, &
4600: 49 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53 51  I);.}.%ifndef SQ
4610: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
4620: 52 59 0a 20 20 73 65 6c 74 61 62 6c 69 73 74 28  RY.  seltablist(
4630: 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69  A) ::= stl_prefi
4640: 78 28 58 29 20 4c 50 20 73 65 6c 65 63 74 28 53  x(X) LP select(S
4650: 29 20 52 50 0a 20 20 20 20 20 20 20 20 20 20 20  ) RP.           
4660: 20 20 20 20 20 20 20 20 20 61 73 28 5a 29 20 6f           as(Z) o
4670: 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f  n_opt(N) using_o
4680: 70 74 28 55 29 2e 20 7b 0a 20 20 20 20 41 20 3d  pt(U). {.    A =
4690: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
46a0: 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50  ppendFromTerm(pP
46b0: 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a 2c 53 2c  arse,X,0,0,&Z,S,
46c0: 4e 2c 55 29 3b 0a 20 20 7d 0a 20 20 73 65 6c 74  N,U);.  }.  selt
46d0: 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 74  ablist(A) ::= st
46e0: 6c 5f 70 72 65 66 69 78 28 58 29 20 4c 50 20 73  l_prefix(X) LP s
46f0: 65 6c 74 61 62 6c 69 73 74 28 46 29 20 52 50 0a  eltablist(F) RP.
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74      as(Z) on_opt
4720: 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29  (N) using_opt(U)
4730: 2e 20 7b 0a 20 20 20 20 69 66 28 20 58 3d 3d 30  . {.    if( X==0
4740: 20 26 26 20 5a 2e 6e 3d 3d 30 20 26 26 20 4e 3d   && Z.n==0 && N=
4750: 3d 30 20 26 26 20 55 3d 3d 30 20 29 7b 0a 20 20  =0 && U==0 ){.  
4760: 20 20 20 20 41 20 3d 20 46 3b 0a 20 20 20 20 7d      A = F;.    }
4770: 65 6c 73 65 20 69 66 28 20 46 2d 3e 6e 53 72 63  else if( F->nSrc
4780: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 41 20 3d  ==1 ){.      A =
4790: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
47a0: 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50  ppendFromTerm(pP
47b0: 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a 2c 30 2c  arse,X,0,0,&Z,0,
47c0: 4e 2c 55 29 3b 0a 20 20 20 20 20 20 69 66 28 20  N,U);.      if( 
47d0: 41 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  A ){.        str
47e0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
47f0: 20 2a 70 4e 65 77 20 3d 20 26 41 2d 3e 61 5b 41   *pNew = &A->a[A
4800: 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 20  ->nSrc-1];.     
4810: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
4820: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 20 3d 20 46  t_item *pOld = F
4830: 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  ->a;.        pNe
4840: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c 64 2d  w->zName = pOld-
4850: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
4860: 70 4e 65 77 2d 3e 7a 44 61 74 61 62 61 73 65 20  pNew->zDatabase 
4870: 3d 20 70 4f 6c 64 2d 3e 7a 44 61 74 61 62 61 73  = pOld->zDatabas
4880: 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  e;.        pNew-
4890: 3e 70 53 65 6c 65 63 74 20 3d 20 70 4f 6c 64 2d  >pSelect = pOld-
48a0: 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  >pSelect;.      
48b0: 20 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 20 3d 20    pOld->zName = 
48c0: 70 4f 6c 64 2d 3e 7a 44 61 74 61 62 61 73 65 20  pOld->zDatabase 
48d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c  = 0;.        pOl
48e0: 64 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b 0a  d->pSelect = 0;.
48f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4900: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
4910: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 46  te(pParse->db, F
4920: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
4930: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62      Select *pSub
4940: 71 75 65 72 79 3b 0a 20 20 20 20 20 20 73 71 6c  query;.      sql
4950: 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74  ite3SrcListShift
4960: 4a 6f 69 6e 54 79 70 65 28 46 29 3b 0a 20 20 20  JoinType(F);.   
4970: 20 20 20 70 53 75 62 71 75 65 72 79 20 3d 20 73     pSubquery = s
4980: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
4990: 70 50 61 72 73 65 2c 30 2c 46 2c 30 2c 30 2c 30  pParse,0,F,0,0,0
49a0: 2c 30 2c 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d  ,0,SF_NestedFrom
49b0: 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 41 20 3d  ,0,0);.      A =
49c0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
49d0: 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50  ppendFromTerm(pP
49e0: 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a 2c 70 53  arse,X,0,0,&Z,pS
49f0: 75 62 71 75 65 72 79 2c 4e 2c 55 29 3b 0a 20 20  ubquery,N,U);.  
4a00: 20 20 7d 0a 20 20 7d 0a 25 65 6e 64 69 66 20 20    }.  }.%endif  
4a10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
4a20: 55 45 52 59 0a 0a 25 74 79 70 65 20 64 62 6e 6d  UERY..%type dbnm
4a30: 20 7b 54 6f 6b 65 6e 7d 0a 64 62 6e 6d 28 41 29   {Token}.dbnm(A)
4a40: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
4a50: 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 30 3b 7d 0a  {A.z=0; A.n=0;}.
4a60: 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 44 4f 54 20  dbnm(A) ::= DOT 
4a70: 6e 6d 28 58 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a  nm(X). {A = X;}.
4a80: 0a 25 74 79 70 65 20 66 75 6c 6c 6e 61 6d 65 20  .%type fullname 
4a90: 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74  {SrcList*}.%dest
4aa0: 72 75 63 74 6f 72 20 66 75 6c 6c 6e 61 6d 65 20  ructor fullname 
4ab0: 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  {sqlite3SrcListD
4ac0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
4ad0: 2c 20 24 24 29 3b 7d 0a 66 75 6c 6c 6e 61 6d 65  , $$);}.fullname
4ae0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 64 62  (A) ::= nm(X) db
4af0: 6e 6d 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c  nm(Y).  {A = sql
4b00: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
4b10: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26  d(pParse->db,0,&
4b20: 58 2c 26 59 29 3b 7d 0a 0a 25 74 79 70 65 20 6a  X,&Y);}..%type j
4b30: 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79 70  oinop {int}.%typ
4b40: 65 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d 0a  e joinop2 {int}.
4b50: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43 4f  joinop(X) ::= CO
4b60: 4d 4d 41 7c 4a 4f 49 4e 2e 20 20 20 20 20 20 20  MMA|JOIN.       
4b70: 20 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54 5f         { X = JT_
4b80: 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28  INNER; }.joinop(
4b90: 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41  X) ::= JOIN_KW(A
4ba0: 29 20 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20 20  ) JOIN.         
4bb0: 7b 20 58 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69  { X = sqlite3Joi
4bc0: 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 41 2c  nType(pParse,&A,
4bd0: 30 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58  0,0); }.joinop(X
4be0: 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29  ) ::= JOIN_KW(A)
4bf0: 20 6e 6d 28 42 29 20 4a 4f 49 4e 2e 20 20 20 7b   nm(B) JOIN.   {
4c00: 20 58 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e   X = sqlite3Join
4c10: 54 79 70 65 28 70 50 61 72 73 65 2c 26 41 2c 26  Type(pParse,&A,&
4c20: 42 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58  B,0); }.joinop(X
4c30: 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29  ) ::= JOIN_KW(A)
4c40: 20 6e 6d 28 42 29 20 6e 6d 28 43 29 20 4a 4f 49   nm(B) nm(C) JOI
4c50: 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N..             
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20            { X = 
4c80: 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28  sqlite3JoinType(
4c90: 70 50 61 72 73 65 2c 26 41 2c 26 42 2c 26 43 29  pParse,&A,&B,&C)
4ca0: 3b 20 7d 0a 0a 25 74 79 70 65 20 6f 6e 5f 6f 70  ; }..%type on_op
4cb0: 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72  t {Expr*}.%destr
4cc0: 75 63 74 6f 72 20 6f 6e 5f 6f 70 74 20 7b 73 71  uctor on_opt {sq
4cd0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4ce0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
4cf0: 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20  }.on_opt(N) ::= 
4d00: 4f 4e 20 65 78 70 72 28 45 29 2e 20 20 20 7b 4e  ON expr(E).   {N
4d10: 20 3d 20 45 2e 70 45 78 70 72 3b 7d 0a 6f 6e 5f   = E.pExpr;}.on_
4d20: 6f 70 74 28 4e 29 20 3a 3a 3d 20 2e 20 20 20 20  opt(N) ::= .    
4d30: 20 20 20 20 20 20 20 20 20 7b 4e 20 3d 20 30 3b           {N = 0;
4d40: 7d 0a 0a 2f 2f 20 4e 6f 74 65 20 74 68 61 74 20  }..// Note that 
4d50: 74 68 69 73 20 62 6c 6f 63 6b 20 61 62 75 73 65  this block abuse
4d60: 73 20 74 68 65 20 54 6f 6b 65 6e 20 74 79 70 65  s the Token type
4d70: 20 6a 75 73 74 20 61 20 6c 69 74 74 6c 65 2e 20   just a little. 
4d80: 49 66 20 74 68 65 72 65 20 69 73 0a 2f 2f 20 6e  If there is.// n
4d90: 6f 20 22 49 4e 44 45 58 45 44 20 42 59 22 20 63  o "INDEXED BY" c
4da0: 6c 61 75 73 65 2c 20 74 68 65 20 72 65 74 75 72  lause, the retur
4db0: 6e 65 64 20 74 6f 6b 65 6e 20 69 73 20 65 6d 70  ned token is emp
4dc0: 74 79 20 28 7a 3d 3d 30 20 26 26 20 6e 3d 3d 30  ty (z==0 && n==0
4dd0: 29 2e 20 49 66 0a 2f 2f 20 74 68 65 72 65 20 69  ). If.// there i
4de0: 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
4df0: 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68 65  clause, then the
4e00: 20 74 6f 6b 65 6e 20 69 73 20 70 6f 70 75 6c 61   token is popula
4e10: 74 65 64 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ted as per norma
4e20: 6c 2c 0a 2f 2f 20 77 69 74 68 20 7a 20 70 6f 69  l,.// with z poi
4e30: 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 6f 6b  nting to the tok
4e40: 65 6e 20 64 61 74 61 20 61 6e 64 20 6e 20 63 6f  en data and n co
4e50: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 75 6d  ntaining the num
4e60: 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2f 2f 20  ber of bytes.// 
4e70: 69 6e 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2f 2f  in the token..//
4e80: 0a 2f 2f 20 49 66 20 74 68 65 72 65 20 69 73 20  .// If there is 
4e90: 61 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  a "NOT INDEXED" 
4ea0: 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 28 7a 3d  clause, then (z=
4eb0: 3d 30 20 26 26 20 6e 3d 3d 31 29 2c 20 77 68 69  =0 && n==1), whi
4ec0: 63 68 20 69 73 20 0a 2f 2f 20 6e 6f 72 6d 61 6c  ch is .// normal
4ed0: 6c 79 20 69 6c 6c 65 67 61 6c 2e 20 54 68 65 20  ly illegal. The 
4ee0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
4ef0: 64 65 78 65 64 42 79 28 29 20 66 75 6e 63 74 69  dexedBy() functi
4f00: 6f 6e 20 0a 2f 2f 20 72 65 63 6f 67 6e 69 7a 65  on .// recognize
4f10: 73 20 61 6e 64 20 69 6e 74 65 72 70 72 65 74 73  s and interprets
4f20: 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63 69   this as a speci
4f30: 61 6c 20 63 61 73 65 2e 0a 2f 2f 0a 25 74 79 70  al case..//.%typ
4f40: 65 20 69 6e 64 65 78 65 64 5f 6f 70 74 20 7b 54  e indexed_opt {T
4f50: 6f 6b 65 6e 7d 0a 69 6e 64 65 78 65 64 5f 6f 70  oken}.indexed_op
4f60: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
4f70: 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d             {A.z=
4f80: 30 3b 20 41 2e 6e 3d 30 3b 7d 0a 69 6e 64 65 78  0; A.n=0;}.index
4f90: 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e  ed_opt(A) ::= IN
4fa0: 44 45 58 45 44 20 42 59 20 6e 6d 28 58 29 2e 20  DEXED BY nm(X). 
4fb0: 7b 41 20 3d 20 58 3b 7d 0a 69 6e 64 65 78 65 64  {A = X;}.indexed
4fc0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4e 4f 54 20  _opt(A) ::= NOT 
4fd0: 49 4e 44 45 58 45 44 2e 20 20 20 20 20 20 7b 41  INDEXED.      {A
4fe0: 2e 7a 3d 30 3b 20 41 2e 6e 3d 31 3b 7d 0a 0a 25  .z=0; A.n=1;}..%
4ff0: 74 79 70 65 20 75 73 69 6e 67 5f 6f 70 74 20 7b  type using_opt {
5000: 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  IdList*}.%destru
5010: 63 74 6f 72 20 75 73 69 6e 67 5f 6f 70 74 20 7b  ctor using_opt {
5020: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
5030: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
5040: 24 24 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28  $$);}.using_opt(
5050: 55 29 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50 20  U) ::= USING LP 
5060: 69 64 6c 69 73 74 28 4c 29 20 52 50 2e 20 20 7b  idlist(L) RP.  {
5070: 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e 67 5f 6f 70  U = L;}.using_op
5080: 74 28 55 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(U) ::= .      
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79    {U = 0;}...%ty
50b0: 70 65 20 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b  pe orderby_opt {
50c0: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
50d0: 72 75 63 74 6f 72 20 6f 72 64 65 72 62 79 5f 6f  ructor orderby_o
50e0: 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  pt {sqlite3ExprL
50f0: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
5100: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70  ->db, $$);}.%typ
5110: 65 20 73 6f 72 74 6c 69 73 74 20 7b 45 78 70 72  e sortlist {Expr
5120: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
5130: 6f 72 20 73 6f 72 74 6c 69 73 74 20 7b 73 71 6c  or sortlist {sql
5140: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
5150: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
5160: 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70  $);}..orderby_op
5170: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64      {A = 0;}.ord
51a0: 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  erby_opt(A) ::= 
51b0: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73  ORDER BY sortlis
51c0: 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20  t(X).      {A = 
51d0: 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20  X;}.sortlist(A) 
51e0: 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29 20  ::= sortlist(X) 
51f0: 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 20 73 6f  COMMA expr(Y) so
5200: 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20  rtorder(Z). {.  
5210: 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  A = sqlite3ExprL
5220: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65  istAppend(pParse
5230: 2c 58 2c 59 2e 70 45 78 70 72 29 3b 0a 20 20 69  ,X,Y.pExpr);.  i
5240: 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e  f( A ) A->a[A->n
5250: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
5260: 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 73 6f 72  r = (u8)Z;.}.sor
5270: 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78 70  tlist(A) ::= exp
5280: 72 28 59 29 20 73 6f 72 74 6f 72 64 65 72 28 5a  r(Y) sortorder(Z
5290: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
52a0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
52b0: 28 70 50 61 72 73 65 2c 30 2c 59 2e 70 45 78 70  (pParse,0,Y.pExp
52c0: 72 29 3b 0a 20 20 69 66 28 20 41 20 26 26 20 41  r);.  if( A && A
52d0: 4c 57 41 59 53 28 41 2d 3e 61 29 20 29 20 41 2d  LWAYS(A->a) ) A-
52e0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
52f0: 3d 20 28 75 38 29 5a 3b 0a 7d 0a 0a 25 74 79 70  = (u8)Z;.}..%typ
5300: 65 20 73 6f 72 74 6f 72 64 65 72 20 7b 69 6e 74  e sortorder {int
5310: 7d 0a 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20  }..sortorder(A) 
5320: 3a 3a 3d 20 41 53 43 2e 20 20 20 20 20 20 20 20  ::= ASC.        
5330: 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53     {A = SQLITE_S
5340: 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74 6f 72 64 65  O_ASC;}.sortorde
5350: 72 28 41 29 20 3a 3a 3d 20 44 45 53 43 2e 20 20  r(A) ::= DESC.  
5360: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51 4c          {A = SQL
5370: 49 54 45 5f 53 4f 5f 44 45 53 43 3b 7d 0a 73 6f  ITE_SO_DESC;}.so
5380: 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 2e  rtorder(A) ::= .
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
53a0: 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43   = SQLITE_SO_ASC
53b0: 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75 70 62  ;}..%type groupb
53c0: 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a  y_opt {ExprList*
53d0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 67 72  }.%destructor gr
53e0: 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74  oupby_opt {sqlit
53f0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
5400: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
5410: 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41  ;}.groupby_opt(A
5420: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
5440: 3d 20 30 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70  = 0;}.groupby_op
5450: 74 28 41 29 20 3a 3a 3d 20 47 52 4f 55 50 20 42  t(A) ::= GROUP B
5460: 59 20 6e 65 78 70 72 6c 69 73 74 28 58 29 2e 20  Y nexprlist(X). 
5470: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
5480: 68 61 76 69 6e 67 5f 6f 70 74 20 7b 45 78 70 72  having_opt {Expr
5490: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 68  *}.%destructor h
54a0: 61 76 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74  aving_opt {sqlit
54b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
54c0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 68  rse->db, $$);}.h
54d0: 61 76 69 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d  aving_opt(A) ::=
54e0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
54f0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 68 61 76 69 6e    {A = 0;}.havin
5500: 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 48 41 56  g_opt(A) ::= HAV
5510: 49 4e 47 20 65 78 70 72 28 58 29 2e 20 20 7b 41  ING expr(X).  {A
5520: 20 3d 20 58 2e 70 45 78 70 72 3b 7d 0a 0a 25 74   = X.pExpr;}..%t
5530: 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 73  ype limit_opt {s
5540: 74 72 75 63 74 20 4c 69 6d 69 74 56 61 6c 7d 0a  truct LimitVal}.
5550: 0a 2f 2f 20 54 68 65 20 64 65 73 74 72 75 63 74  .// The destruct
5560: 6f 72 20 66 6f 72 20 6c 69 6d 69 74 5f 6f 70 74  or for limit_opt
5570: 20 77 69 6c 6c 20 6e 65 76 65 72 20 66 69 72 65   will never fire
5580: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
5590: 67 72 61 6d 6d 61 72 2e 0a 2f 2f 20 54 68 65 20  grammar..// The 
55a0: 6c 69 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65  limit_opt non-te
55b0: 72 6d 69 6e 61 6c 20 6f 6e 6c 79 20 6f 63 63 75  rminal only occu
55c0: 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
55d0: 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 64 75 63   a single produc
55e0: 74 69 6f 6e 0a 2f 2f 20 72 75 6c 65 20 66 6f 72  tion.// rule for
55f0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5600: 74 73 2e 20 20 41 73 20 73 6f 6f 6e 20 61 73 20  ts.  As soon as 
5610: 74 68 65 20 72 75 6c 65 20 74 68 61 74 20 63 72  the rule that cr
5620: 65 61 74 65 20 74 68 65 20 0a 2f 2f 20 6c 69 6d  eate the .// lim
5630: 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69  it_opt non-termi
5640: 6e 61 6c 20 72 65 64 75 63 65 73 2c 20 74 68 65  nal reduces, the
5650: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5660: 74 20 72 75 6c 65 20 77 69 6c 6c 20 61 6c 73 6f  t rule will also
5670: 0a 2f 2f 20 72 65 64 75 63 65 2e 20 20 53 6f 20  .// reduce.  So 
5680: 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
5690: 20 6c 69 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74   limit_opt non-t
56a0: 65 72 6d 69 6e 61 6c 20 6f 6e 20 74 68 65 20 73  erminal on the s
56b0: 74 61 63 6b 20 0a 2f 2f 20 65 78 63 65 70 74 20  tack .// except 
56c0: 61 73 20 61 20 74 72 61 6e 73 69 65 6e 74 2e 20  as a transient. 
56d0: 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76   So there is nev
56e0: 65 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 64  er anything to d
56f0: 65 73 74 72 6f 79 2e 0a 2f 2f 0a 2f 2f 25 64 65  estroy..//.//%de
5700: 73 74 72 75 63 74 6f 72 20 6c 69 6d 69 74 5f 6f  structor limit_o
5710: 70 74 20 7b 0a 2f 2f 20 20 73 71 6c 69 74 65 33  pt {.//  sqlite3
5720: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
5730: 65 2d 3e 64 62 2c 20 24 24 2e 70 4c 69 6d 69 74  e->db, $$.pLimit
5740: 29 3b 0a 2f 2f 20 20 73 71 6c 69 74 65 33 45 78  );.//  sqlite3Ex
5750: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
5760: 3e 64 62 2c 20 24 24 2e 70 4f 66 66 73 65 74 29  >db, $$.pOffset)
5770: 3b 0a 2f 2f 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28  ;.//}.limit_opt(
5780: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
5790: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 70              {A.p
57a0: 4c 69 6d 69 74 20 3d 20 30 3b 20 41 2e 70 4f 66  Limit = 0; A.pOf
57b0: 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74  fset = 0;}.limit
57c0: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49  _opt(A) ::= LIMI
57d0: 54 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  T expr(X).      
57e0: 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20 58 2e 70   {A.pLimit = X.p
57f0: 45 78 70 72 3b 20 41 2e 70 4f 66 66 73 65 74 20  Expr; A.pOffset 
5800: 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28  = 0;}.limit_opt(
5810: 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70  A) ::= LIMIT exp
5820: 72 28 58 29 20 4f 46 46 53 45 54 20 65 78 70 72  r(X) OFFSET expr
5830: 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20  (Y). .          
5840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5850: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 70              {A.p
5860: 4c 69 6d 69 74 20 3d 20 58 2e 70 45 78 70 72 3b  Limit = X.pExpr;
5870: 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 59 2e 70   A.pOffset = Y.p
5880: 45 78 70 72 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74  Expr;}.limit_opt
5890: 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78  (A) ::= LIMIT ex
58a0: 70 72 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72  pr(X) COMMA expr
58b0: 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20  (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 7b 41 2e 70              {A.p
58e0: 4f 66 66 73 65 74 20 3d 20 58 2e 70 45 78 70 72  Offset = X.pExpr
58f0: 3b 20 41 2e 70 4c 69 6d 69 74 20 3d 20 59 2e 70  ; A.pLimit = Y.p
5900: 45 78 70 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  Expr;}..////////
5910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5920: 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54 45 20 73  /// The DELETE s
5930: 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f  tatement ///////
5940: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5950: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65 66  //////.//.%ifdef
5960: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
5970: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
5980: 49 54 0a 63 6d 64 20 3a 3a 3d 20 44 45 4c 45 54  IT.cmd ::= DELET
5990: 45 20 46 52 4f 4d 20 66 75 6c 6c 6e 61 6d 65 28  E FROM fullname(
59a0: 58 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49  X) indexed_opt(I
59b0: 29 20 77 68 65 72 65 5f 6f 70 74 28 57 29 20 0a  ) where_opt(W) .
59c0: 20 20 20 20 20 20 20 20 6f 72 64 65 72 62 79 5f          orderby_
59d0: 6f 70 74 28 4f 29 20 6c 69 6d 69 74 5f 6f 70 74  opt(O) limit_opt
59e0: 28 4c 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (L). {.  sqlite3
59f0: 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
5a00: 28 70 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b  (pParse, X, &I);
5a10: 0a 20 20 57 20 3d 20 73 71 6c 69 74 65 33 4c 69  .  W = sqlite3Li
5a20: 6d 69 74 57 68 65 72 65 28 70 50 61 72 73 65 2c  mitWhere(pParse,
5a30: 20 58 2c 20 57 2c 20 4f 2c 20 4c 2e 70 4c 69 6d   X, W, O, L.pLim
5a40: 69 74 2c 20 4c 2e 70 4f 66 66 73 65 74 2c 20 22  it, L.pOffset, "
5a50: 44 45 4c 45 54 45 22 29 3b 0a 20 20 73 71 6c 69  DELETE");.  sqli
5a60: 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50  te3DeleteFrom(pP
5a70: 61 72 73 65 2c 58 2c 57 29 3b 0a 7d 0a 25 65 6e  arse,X,W);.}.%en
5a80: 64 69 66 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  dif.%ifndef SQLI
5a90: 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45  TE_ENABLE_UPDATE
5aa0: 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a 63 6d  _DELETE_LIMIT.cm
5ab0: 64 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f  d ::= DELETE FRO
5ac0: 4d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e  M fullname(X) in
5ad0: 64 65 78 65 64 5f 6f 70 74 28 49 29 20 77 68 65  dexed_opt(I) whe
5ae0: 72 65 5f 6f 70 74 28 57 29 2e 20 7b 0a 20 20 73  re_opt(W). {.  s
5af0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64  qlite3SrcListInd
5b00: 65 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 58  exedBy(pParse, X
5b10: 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69 74 65 33  , &I);.  sqlite3
5b20: 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73  DeleteFrom(pPars
5b30: 65 2c 58 2c 57 29 3b 0a 7d 0a 25 65 6e 64 69 66  e,X,W);.}.%endif
5b40: 0a 0a 25 74 79 70 65 20 77 68 65 72 65 5f 6f 70  ..%type where_op
5b50: 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72  t {Expr*}.%destr
5b60: 75 63 74 6f 72 20 77 68 65 72 65 5f 6f 70 74 20  uctor where_opt 
5b70: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
5b80: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
5b90: 24 29 3b 7d 0a 0a 77 68 65 72 65 5f 6f 70 74 28  $);}..where_opt(
5ba0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
5bb0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
5bc0: 20 30 3b 7d 0a 77 68 65 72 65 5f 6f 70 74 28 41   0;}.where_opt(A
5bd0: 29 20 3a 3a 3d 20 57 48 45 52 45 20 65 78 70 72  ) ::= WHERE expr
5be0: 28 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20  (X).       {A = 
5bf0: 58 2e 70 45 78 70 72 3b 7d 0a 0a 2f 2f 2f 2f 2f  X.pExpr;}../////
5c00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c10: 2f 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45  ///// The UPDATE
5c20: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
5c30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66  /////////.//.%if
5c50: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5c60: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
5c70: 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 55 50  LIMIT.cmd ::= UP
5c80: 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20 66  DATE orconf(R) f
5c90: 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65 78  ullname(X) index
5ca0: 65 64 5f 6f 70 74 28 49 29 20 53 45 54 20 73 65  ed_opt(I) SET se
5cb0: 74 6c 69 73 74 28 59 29 20 77 68 65 72 65 5f 6f  tlist(Y) where_o
5cc0: 70 74 28 57 29 0a 20 20 20 20 20 20 20 20 6f 72  pt(W).        or
5cd0: 64 65 72 62 79 5f 6f 70 74 28 4f 29 20 6c 69 6d  derby_opt(O) lim
5ce0: 69 74 5f 6f 70 74 28 4c 29 2e 20 20 7b 0a 20 20  it_opt(L).  {.  
5cf0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e  sqlite3SrcListIn
5d00: 64 65 78 65 64 42 79 28 70 50 61 72 73 65 2c 20  dexedBy(pParse, 
5d10: 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69 74 65  X, &I);.  sqlite
5d20: 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c 65  3ExprListCheckLe
5d30: 6e 67 74 68 28 70 50 61 72 73 65 2c 59 2c 22 73  ngth(pParse,Y,"s
5d40: 65 74 20 6c 69 73 74 22 29 3b 20 0a 20 20 57 20  et list"); .  W 
5d50: 3d 20 73 71 6c 69 74 65 33 4c 69 6d 69 74 57 68  = sqlite3LimitWh
5d60: 65 72 65 28 70 50 61 72 73 65 2c 20 58 2c 20 57  ere(pParse, X, W
5d70: 2c 20 4f 2c 20 4c 2e 70 4c 69 6d 69 74 2c 20 4c  , O, L.pLimit, L
5d80: 2e 70 4f 66 66 73 65 74 2c 20 22 55 50 44 41 54  .pOffset, "UPDAT
5d90: 45 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 55 70  E");.  sqlite3Up
5da0: 64 61 74 65 28 70 50 61 72 73 65 2c 58 2c 59 2c  date(pParse,X,Y,
5db0: 57 2c 52 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 25  W,R);.}.%endif.%
5dc0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
5dd0: 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45  ABLE_UPDATE_DELE
5de0: 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d  TE_LIMIT.cmd ::=
5df0: 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52   UPDATE orconf(R
5e00: 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e  ) fullname(X) in
5e10: 64 65 78 65 64 5f 6f 70 74 28 49 29 20 53 45 54  dexed_opt(I) SET
5e20: 20 73 65 74 6c 69 73 74 28 59 29 0a 20 20 20 20   setlist(Y).    
5e30: 20 20 20 20 77 68 65 72 65 5f 6f 70 74 28 57 29      where_opt(W)
5e40: 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 72  .  {.  sqlite3Sr
5e50: 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 70  cListIndexedBy(p
5e60: 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20  Parse, X, &I);. 
5e70: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5e80: 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
5e90: 73 65 2c 59 2c 22 73 65 74 20 6c 69 73 74 22 29  se,Y,"set list")
5ea0: 3b 20 0a 20 20 73 71 6c 69 74 65 33 55 70 64 61  ; .  sqlite3Upda
5eb0: 74 65 28 70 50 61 72 73 65 2c 58 2c 59 2c 57 2c  te(pParse,X,Y,W,
5ec0: 52 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25 74  R);.}.%endif..%t
5ed0: 79 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 70  ype setlist {Exp
5ee0: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
5ef0: 74 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 6c  tor setlist {sql
5f00: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
5f10: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
5f20: 24 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29  $);}..setlist(A)
5f30: 20 3a 3a 3d 20 73 65 74 6c 69 73 74 28 5a 29 20   ::= setlist(Z) 
5f40: 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65  COMMA nm(X) EQ e
5f50: 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20  xpr(Y). {.  A = 
5f60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5f70: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 5a 2c  ppend(pParse, Z,
5f80: 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 73 71 6c   Y.pExpr);.  sql
5f90: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
5fa0: 61 6d 65 28 70 50 61 72 73 65 2c 20 41 2c 20 26  ame(pParse, A, &
5fb0: 58 2c 20 31 29 3b 0a 7d 0a 73 65 74 6c 69 73 74  X, 1);.}.setlist
5fc0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51  (A) ::= nm(X) EQ
5fd0: 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20   expr(Y). {.  A 
5fe0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5ff0: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
6000: 30 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 73  0, Y.pExpr);.  s
6010: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
6020: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 41 2c  tName(pParse, A,
6030: 20 26 58 2c 20 31 29 3b 0a 7d 0a 0a 2f 2f 2f 2f   &X, 1);.}..////
6040: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6050: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 49 4e 53 45 52  ////// The INSER
6060: 54 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  T command //////
6070: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
6090: 6d 64 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d  md ::= insert_cm
60a0: 64 28 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61  d(R) INTO fullna
60b0: 6d 65 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74  me(X) inscollist
60c0: 5f 6f 70 74 28 46 29 20 76 61 6c 75 65 6c 69 73  _opt(F) valuelis
60d0: 74 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20  t(Y)..          
60e0: 20 20 7b 73 71 6c 69 74 65 33 49 6e 73 65 72 74    {sqlite3Insert
60f0: 28 70 50 61 72 73 65 2c 20 58 2c 20 59 2e 70 4c  (pParse, X, Y.pL
6100: 69 73 74 2c 20 59 2e 70 53 65 6c 65 63 74 2c 20  ist, Y.pSelect, 
6110: 46 2c 20 52 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  F, R);}.cmd ::= 
6120: 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e  insert_cmd(R) IN
6130: 54 4f 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69  TO fullname(X) i
6140: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29  nscollist_opt(F)
6150: 20 73 65 6c 65 63 74 28 53 29 2e 0a 20 20 20 20   select(S)..    
6160: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
6170: 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c 20 58  Insert(pParse, X
6180: 2c 20 30 2c 20 53 2c 20 46 2c 20 52 29 3b 7d 0a  , 0, S, F, R);}.
6190: 63 6d 64 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63  cmd ::= insert_c
61a0: 6d 64 28 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e  md(R) INTO fulln
61b0: 61 6d 65 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73  ame(X) inscollis
61c0: 74 5f 6f 70 74 28 46 29 20 44 45 46 41 55 4c 54  t_opt(F) DEFAULT
61d0: 20 56 41 4c 55 45 53 2e 0a 20 20 20 20 20 20 20   VALUES..       
61e0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73       {sqlite3Ins
61f0: 65 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 30  ert(pParse, X, 0
6200: 2c 20 30 2c 20 46 2c 20 52 29 3b 7d 0a 0a 25 74  , 0, F, R);}..%t
6210: 79 70 65 20 69 6e 73 65 72 74 5f 63 6d 64 20 7b  ype insert_cmd {
6220: 75 38 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41  u8}.insert_cmd(A
6230: 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63  ) ::= INSERT orc
6240: 6f 6e 66 28 52 29 2e 20 20 20 7b 41 20 3d 20 52  onf(R).   {A = R
6250: 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29  ;}.insert_cmd(A)
6260: 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20   ::= REPLACE.   
6270: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
6280: 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 2f 2f 20 41  _Replace;}..// A
6290: 20 56 61 6c 75 65 4c 69 73 74 20 69 73 20 65 69   ValueList is ei
62a0: 74 68 65 72 20 61 20 73 69 6e 67 6c 65 20 56 41  ther a single VA
62b0: 4c 55 45 53 20 63 6c 61 75 73 65 20 6f 72 20 61  LUES clause or a
62c0: 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64   comma-separated
62d0: 20 6c 69 73 74 0a 2f 2f 20 6f 66 20 56 41 4c 55   list.// of VALU
62e0: 45 53 20 63 6c 61 75 73 65 73 2e 20 20 49 66 20  ES clauses.  If 
62f0: 69 74 20 69 73 20 61 20 73 69 6e 67 6c 65 20 56  it is a single V
6300: 41 4c 55 45 53 20 63 6c 61 75 73 65 20 74 68 65  ALUES clause the
6310: 6e 20 74 68 65 0a 2f 2f 20 56 61 6c 75 65 4c 69  n the.// ValueLi
6320: 73 74 2e 70 4c 69 73 74 20 66 69 65 6c 64 20 70  st.pList field p
6330: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 65 78 70  oints to the exp
6340: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 66 20  ression list of 
6350: 74 68 61 74 20 63 6c 61 75 73 65 2e 0a 2f 2f 20  that clause..// 
6360: 49 66 20 69 74 20 69 73 20 61 20 6c 69 73 74 20  If it is a list 
6370: 6f 66 20 56 41 4c 55 45 53 20 63 6c 61 75 73 65  of VALUES clause
6380: 73 2c 20 74 68 65 6e 20 74 68 6f 73 65 20 63 6c  s, then those cl
6390: 61 75 73 65 73 20 61 72 65 20 74 72 61 6e 73 66  auses are transf
63a0: 6f 72 6d 65 64 0a 2f 2f 20 69 6e 74 6f 20 61 20  ormed.// into a 
63b0: 73 65 74 20 6f 66 20 53 45 4c 45 43 54 20 73 74  set of SELECT st
63c0: 61 74 65 6d 65 6e 74 73 20 77 69 74 68 6f 75 74  atements without
63d0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 73 20 61 6e   FROM clauses an
63e0: 64 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 0a 2f  d connected by./
63f0: 2f 20 55 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20  / UNION ALL and 
6400: 74 68 65 20 56 61 6c 75 65 4c 69 73 74 2e 70 53  the ValueList.pS
6410: 65 6c 65 63 74 20 70 6f 69 6e 74 73 20 74 6f 20  elect points to 
6420: 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 53  the right-most S
6430: 45 4c 45 43 54 20 69 6e 0a 2f 2f 20 74 68 61 74  ELECT in.// that
6440: 20 63 6f 6d 70 6f 75 6e 64 2e 0a 25 74 79 70 65   compound..%type
6450: 20 76 61 6c 75 65 6c 69 73 74 20 7b 73 74 72 75   valuelist {stru
6460: 63 74 20 56 61 6c 75 65 4c 69 73 74 7d 0a 25 64  ct ValueList}.%d
6470: 65 73 74 72 75 63 74 6f 72 20 76 61 6c 75 65 6c  estructor valuel
6480: 69 73 74 20 7b 0a 20 20 73 71 6c 69 74 65 33 45  ist {.  sqlite3E
6490: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
64a0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e 70 4c 69  arse->db, $$.pLi
64b0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
64c0: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
64d0: 65 2d 3e 64 62 2c 20 24 24 2e 70 53 65 6c 65 63  e->db, $$.pSelec
64e0: 74 29 3b 0a 7d 0a 76 61 6c 75 65 6c 69 73 74 28  t);.}.valuelist(
64f0: 41 29 20 3a 3a 3d 20 56 41 4c 55 45 53 20 4c 50  A) ::= VALUES LP
6500: 20 6e 65 78 70 72 6c 69 73 74 28 58 29 20 52 50   nexprlist(X) RP
6510: 2e 20 7b 0a 20 20 41 2e 70 4c 69 73 74 20 3d 20  . {.  A.pList = 
6520: 58 3b 0a 20 20 41 2e 70 53 65 6c 65 63 74 20 3d  X;.  A.pSelect =
6530: 20 30 3b 0a 7d 0a 0a 2f 2f 20 53 69 6e 63 65 20   0;.}..// Since 
6540: 61 20 6c 69 73 74 20 6f 66 20 56 41 4c 55 45 73  a list of VALUEs
6550: 20 69 73 20 69 6e 70 6c 65 6d 65 6e 74 65 64 20   is inplemented 
6560: 61 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  as a compound SE
6570: 4c 45 43 54 2c 20 77 65 20 68 61 76 65 0a 2f 2f  LECT, we have.//
6580: 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
6590: 76 61 6c 75 65 20 6c 69 73 74 20 6f 70 74 69 6f  value list optio
65a0: 6e 20 69 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45  n if compound SE
65b0: 4c 45 43 54 73 20 61 72 65 20 64 69 73 61 62 6c  LECTs are disabl
65c0: 65 64 2e 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  ed..%ifndef SQLI
65d0: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
65e0: 5f 53 45 4c 45 43 54 0a 76 61 6c 75 65 6c 69 73  _SELECT.valuelis
65f0: 74 28 41 29 20 3a 3a 3d 20 76 61 6c 75 65 6c 69  t(A) ::= valueli
6600: 73 74 28 58 29 20 43 4f 4d 4d 41 20 4c 50 20 65  st(X) COMMA LP e
6610: 78 70 72 6c 69 73 74 28 59 29 20 52 50 2e 20 7b  xprlist(Y) RP. {
6620: 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 69 67 68  .  Select *pRigh
6630: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
6640: 74 4e 65 77 28 70 50 61 72 73 65 2c 20 59 2c 20  tNew(pParse, Y, 
6650: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6660: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 58  , 0, 0);.  if( X
6670: 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 58 2e  .pList ){.    X.
6680: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
6690: 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73  3SelectNew(pPars
66a0: 65 2c 20 58 2e 70 4c 69 73 74 2c 20 30 2c 20 30  e, X.pList, 0, 0
66b0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
66c0: 20 30 29 3b 0a 20 20 20 20 58 2e 70 4c 69 73 74   0);.    X.pList
66d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 41 2e 70 4c   = 0;.  }.  A.pL
66e0: 69 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 58  ist = 0;.  if( X
66f0: 2e 70 53 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70  .pSelect==0 || p
6700: 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20  Right==0 ){.    
6710: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
6720: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
6730: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c  pRight);.    sql
6740: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
6750: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 58 2e 70  (pParse->db, X.p
6760: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 41 2e 70  Select);.    A.p
6770: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65  Select = 0;.  }e
6780: 6c 73 65 7b 0a 20 20 20 20 70 52 69 67 68 74 2d  lse{.    pRight-
6790: 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20  >op = TK_ALL;.  
67a0: 20 20 70 52 69 67 68 74 2d 3e 70 50 72 69 6f 72    pRight->pPrior
67b0: 20 3d 20 58 2e 70 53 65 6c 65 63 74 3b 0a 20 20   = X.pSelect;.  
67c0: 20 20 70 52 69 67 68 74 2d 3e 73 65 6c 46 6c 61    pRight->selFla
67d0: 67 73 20 7c 3d 20 53 46 5f 56 61 6c 75 65 73 3b  gs |= SF_Values;
67e0: 0a 20 20 20 20 70 52 69 67 68 74 2d 3e 70 50 72  .    pRight->pPr
67f0: 69 6f 72 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d  ior->selFlags |=
6800: 20 53 46 5f 56 61 6c 75 65 73 3b 0a 20 20 20 20   SF_Values;.    
6810: 41 2e 70 53 65 6c 65 63 74 20 3d 20 70 52 69 67  A.pSelect = pRig
6820: 68 74 3b 0a 20 20 7d 0a 7d 0a 25 65 6e 64 69 66  ht;.  }.}.%endif
6830: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d   SQLITE_OMIT_COM
6840: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 0a 25 74  POUND_SELECT..%t
6850: 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f  ype inscollist_o
6860: 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65  pt {IdList*}.%de
6870: 73 74 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c  structor inscoll
6880: 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33  ist_opt {sqlite3
6890: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  IdListDelete(pPa
68a0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
68b0: 74 79 70 65 20 69 64 6c 69 73 74 20 7b 49 64 4c  type idlist {IdL
68c0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
68d0: 72 20 69 64 6c 69 73 74 20 7b 73 71 6c 69 74 65  r idlist {sqlite
68e0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 50  3IdListDelete(pP
68f0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
6900: 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28  .inscollist_opt(
6910: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6930: 41 20 3d 20 30 3b 7d 0a 69 6e 73 63 6f 6c 6c 69  A = 0;}.inscolli
6940: 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50  st_opt(A) ::= LP
6950: 20 69 64 6c 69 73 74 28 58 29 20 52 50 2e 20 20   idlist(X) RP.  
6960: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 6c 69 73    {A = X;}.idlis
6970: 74 28 41 29 20 3a 3a 3d 20 69 64 6c 69 73 74 28  t(A) ::= idlist(
6980: 58 29 20 43 4f 4d 4d 41 20 6e 6d 28 59 29 2e 0a  X) COMMA nm(Y)..
6990: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
69a0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  IdListAppend(pPa
69b0: 72 73 65 2d 3e 64 62 2c 58 2c 26 59 29 3b 7d 0a  rse->db,X,&Y);}.
69c0: 69 64 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d  idlist(A) ::= nm
69d0: 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71  (Y)..    {A = sq
69e0: 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
69f0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26  d(pParse->db,0,&
6a00: 59 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  Y);}..//////////
6a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a20: 2f 20 45 78 70 72 65 73 73 69 6f 6e 20 50 72 6f  / Expression Pro
6a30: 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f 2f  cessing ////////
6a40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a50: 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65 20  /////.//..%type 
6a60: 65 78 70 72 20 7b 45 78 70 72 53 70 61 6e 7d 0a  expr {ExprSpan}.
6a70: 25 64 65 73 74 72 75 63 74 6f 72 20 65 78 70 72  %destructor expr
6a80: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
6a90: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
6aa0: 24 24 2e 70 45 78 70 72 29 3b 7d 0a 25 74 79 70  $$.pExpr);}.%typ
6ab0: 65 20 74 65 72 6d 20 7b 45 78 70 72 53 70 61 6e  e term {ExprSpan
6ac0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 65  }.%destructor te
6ad0: 72 6d 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44  rm {sqlite3ExprD
6ae0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
6af0: 2c 20 24 24 2e 70 45 78 70 72 29 3b 7d 0a 0a 25  , $$.pExpr);}..%
6b00: 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 54  include {.  /* T
6b10: 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
6b20: 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f   routine used to
6b30: 20 73 65 74 20 74 68 65 20 45 78 70 72 53 70 61   set the ExprSpa
6b40: 6e 2e 7a 53 74 61 72 74 20 61 6e 64 0a 20 20 2a  n.zStart and.  *
6b50: 2a 20 45 78 70 72 53 70 61 6e 2e 7a 45 6e 64 20  * ExprSpan.zEnd 
6b60: 76 61 6c 75 65 73 20 6f 66 20 70 4f 75 74 20 73  values of pOut s
6b70: 6f 20 74 68 61 74 20 74 68 65 20 73 70 61 6e 20  o that the span 
6b80: 63 6f 76 65 72 73 20 74 68 65 20 63 6f 6d 70 6c  covers the compl
6b90: 65 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 20 6f  ete.  ** range o
6ba0: 66 20 74 65 78 74 20 62 65 67 69 6e 6e 69 6e 67  f text beginning
6bb0: 20 77 69 74 68 20 70 53 74 61 72 74 20 61 6e 64   with pStart and
6bc0: 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 20 65 6e   going to the en
6bd0: 64 20 6f 66 20 70 45 6e 64 2e 0a 20 20 2a 2f 0a  d of pEnd..  */.
6be0: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73 70    static void sp
6bf0: 61 6e 53 65 74 28 45 78 70 72 53 70 61 6e 20 2a  anSet(ExprSpan *
6c00: 70 4f 75 74 2c 20 54 6f 6b 65 6e 20 2a 70 53 74  pOut, Token *pSt
6c10: 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  art, Token *pEnd
6c20: 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53 74  ){.    pOut->zSt
6c30: 61 72 74 20 3d 20 70 53 74 61 72 74 2d 3e 7a 3b  art = pStart->z;
6c40: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64 20  .    pOut->zEnd 
6c50: 3d 20 26 70 45 6e 64 2d 3e 7a 5b 70 45 6e 64 2d  = &pEnd->z[pEnd-
6c60: 3e 6e 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  >n];.  }..  /* C
6c70: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 45  onstruct a new E
6c80: 78 70 72 20 6f 62 6a 65 63 74 20 66 72 6f 6d 20  xpr object from 
6c90: 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
6ca0: 69 65 72 2e 20 20 55 73 65 20 74 68 65 0a 20 20  ier.  Use the.  
6cb0: 2a 2a 20 6e 65 77 20 45 78 70 72 20 74 6f 20 70  ** new Expr to p
6cc0: 6f 70 75 6c 61 74 65 20 70 4f 75 74 2e 20 20 53  opulate pOut.  S
6cd0: 65 74 20 74 68 65 20 73 70 61 6e 20 6f 66 20 70  et the span of p
6ce0: 4f 75 74 20 74 6f 20 62 65 20 74 68 65 20 69 64  Out to be the id
6cf0: 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 74 68  entifier.  ** th
6d00: 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20 65  at created the e
6d10: 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2f 0a  xpression..  */.
6d20: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73 70    static void sp
6d30: 61 6e 45 78 70 72 28 45 78 70 72 53 70 61 6e 20  anExpr(ExprSpan 
6d40: 2a 70 4f 75 74 2c 20 50 61 72 73 65 20 2a 70 50  *pOut, Parse *pP
6d50: 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f  arse, int op, To
6d60: 6b 65 6e 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20  ken *pValue){.  
6d70: 20 20 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20    pOut->pExpr = 
6d80: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
6d90: 72 73 65 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70  rse, op, 0, 0, p
6da0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 4f 75 74  Value);.    pOut
6db0: 2d 3e 7a 53 74 61 72 74 20 3d 20 70 56 61 6c 75  ->zStart = pValu
6dc0: 65 2d 3e 7a 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  e->z;.    pOut->
6dd0: 7a 45 6e 64 20 3d 20 26 70 56 61 6c 75 65 2d 3e  zEnd = &pValue->
6de0: 7a 5b 70 56 61 6c 75 65 2d 3e 6e 5d 3b 0a 20 20  z[pValue->n];.  
6df0: 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d  }.}..expr(A) ::=
6e00: 20 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20   term(X).       
6e10: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 65        {A = X;}.e
6e20: 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29  xpr(A) ::= LP(B)
6e30: 20 65 78 70 72 28 58 29 20 52 50 28 45 29 2e 20   expr(X) RP(E). 
6e40: 7b 41 2e 70 45 78 70 72 20 3d 20 58 2e 70 45 78  {A.pExpr = X.pEx
6e50: 70 72 3b 20 73 70 61 6e 53 65 74 28 26 41 2c 26  pr; spanSet(&A,&
6e60: 42 2c 26 45 29 3b 7d 0a 74 65 72 6d 28 41 29 20  B,&E);}.term(A) 
6e70: 3a 3a 3d 20 4e 55 4c 4c 28 58 29 2e 20 20 20 20  ::= NULL(X).    
6e80: 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 45 78           {spanEx
6e90: 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c 20 40  pr(&A, pParse, @
6ea0: 58 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29  X, &X);}.expr(A)
6eb0: 20 3a 3a 3d 20 69 64 28 58 29 2e 20 20 20 20 20   ::= id(X).     
6ec0: 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 45            {spanE
6ed0: 78 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c 20  xpr(&A, pParse, 
6ee0: 54 4b 5f 49 44 2c 20 26 58 29 3b 7d 0a 65 78 70  TK_ID, &X);}.exp
6ef0: 72 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57  r(A) ::= JOIN_KW
6f00: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 73  (X).          {s
6f10: 70 61 6e 45 78 70 72 28 26 41 2c 20 70 50 61 72  panExpr(&A, pPar
6f20: 73 65 2c 20 54 4b 5f 49 44 2c 20 26 58 29 3b 7d  se, TK_ID, &X);}
6f30: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28  .expr(A) ::= nm(
6f40: 58 29 20 44 4f 54 20 6e 6d 28 59 29 2e 20 7b 0a  X) DOT nm(Y). {.
6f50: 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20    Expr *temp1 = 
6f60: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
6f70: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
6f80: 2c 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74  , &X);.  Expr *t
6f90: 65 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 50 45  emp2 = sqlite3PE
6fa0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
6fb0: 44 2c 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20  D, 0, 0, &Y);.  
6fc0: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
6fd0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
6fe0: 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65  K_DOT, temp1, te
6ff0: 6d 70 32 2c 20 30 29 3b 0a 20 20 73 70 61 6e 53  mp2, 0);.  spanS
7000: 65 74 28 26 41 2c 26 58 2c 26 59 29 3b 0a 7d 0a  et(&A,&X,&Y);.}.
7010: 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28 58  expr(A) ::= nm(X
7020: 29 20 44 4f 54 20 6e 6d 28 59 29 20 44 4f 54 20  ) DOT nm(Y) DOT 
7030: 6e 6d 28 5a 29 2e 20 7b 0a 20 20 45 78 70 72 20  nm(Z). {.  Expr 
7040: 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 33  *temp1 = sqlite3
7050: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
7060: 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a  _ID, 0, 0, &X);.
7070: 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20    Expr *temp2 = 
7080: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7090: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30  rse, TK_ID, 0, 0
70a0: 2c 20 26 59 29 3b 0a 20 20 45 78 70 72 20 2a 74  , &Y);.  Expr *t
70b0: 65 6d 70 33 20 3d 20 73 71 6c 69 74 65 33 50 45  emp3 = sqlite3PE
70c0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
70d0: 44 2c 20 30 2c 20 30 2c 20 26 5a 29 3b 0a 20 20  D, 0, 0, &Z);.  
70e0: 45 78 70 72 20 2a 74 65 6d 70 34 20 3d 20 73 71  Expr *temp4 = sq
70f0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
7100: 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 32  e, TK_DOT, temp2
7110: 2c 20 74 65 6d 70 33 2c 20 30 29 3b 0a 20 20 41  , temp3, 0);.  A
7120: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
7130: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
7140: 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d  _DOT, temp1, tem
7150: 70 34 2c 20 30 29 3b 0a 20 20 73 70 61 6e 53 65  p4, 0);.  spanSe
7160: 74 28 26 41 2c 26 58 2c 26 5a 29 3b 0a 7d 0a 74  t(&A,&X,&Z);.}.t
7170: 65 72 6d 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47  erm(A) ::= INTEG
7180: 45 52 7c 46 4c 4f 41 54 7c 42 4c 4f 42 28 58 29  ER|FLOAT|BLOB(X)
7190: 2e 20 20 7b 73 70 61 6e 45 78 70 72 28 26 41 2c  .  {spanExpr(&A,
71a0: 20 70 50 61 72 73 65 2c 20 40 58 2c 20 26 58 29   pParse, @X, &X)
71b0: 3b 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 53  ;}.term(A) ::= S
71c0: 54 52 49 4e 47 28 58 29 2e 20 20 20 20 20 20 20  TRING(X).       
71d0: 20 20 20 20 20 20 20 7b 73 70 61 6e 45 78 70 72         {spanExpr
71e0: 28 26 41 2c 20 70 50 61 72 73 65 2c 20 40 58 2c  (&A, pParse, @X,
71f0: 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a   &X);}.expr(A) :
7200: 3a 3d 20 52 45 47 49 53 54 45 52 28 58 29 2e 20  := REGISTER(X). 
7210: 20 20 20 20 7b 0a 20 20 2f 2a 20 57 68 65 6e 20      {.  /* When 
7220: 64 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20 70  doing a nested p
7230: 61 72 73 65 2c 20 6f 6e 65 20 63 61 6e 20 69 6e  arse, one can in
7240: 63 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20 61  clude terms in a
7250: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  n expression.  *
7260: 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65  * that look like
7270: 20 74 68 69 73 3a 20 20 20 23 31 20 23 32 20 2e   this:   #1 #2 .
7280: 2e 2e 20 20 54 68 65 73 65 20 74 65 72 6d 73 20  ..  These terms 
7290: 72 65 66 65 72 20 74 6f 20 72 65 67 69 73 74 65  refer to registe
72a0: 72 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 76  rs.  ** in the v
72b0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
72c0: 20 23 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20   #N is the N-th 
72d0: 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 69  register. */.  i
72e0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  f( pParse->neste
72f0: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
7300: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7310: 73 65 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22  se, "near \"%T\"
7320: 3a 20 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c  : syntax error",
7330: 20 26 58 29 3b 0a 20 20 20 20 41 2e 70 45 78 70   &X);.    A.pExp
7340: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r = 0;.  }else{.
7350: 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71      A.pExpr = sq
7360: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
7370: 65 2c 20 54 4b 5f 52 45 47 49 53 54 45 52 2c 20  e, TK_REGISTER, 
7380: 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 20 20 69  0, 0, &X);.    i
7390: 66 28 20 41 2e 70 45 78 70 72 20 29 20 73 71 6c  f( A.pExpr ) sql
73a0: 69 74 65 33 47 65 74 49 6e 74 33 32 28 26 58 2e  ite3GetInt32(&X.
73b0: 7a 5b 31 5d 2c 20 26 41 2e 70 45 78 70 72 2d 3e  z[1], &A.pExpr->
73c0: 69 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 73  iTable);.  }.  s
73d0: 70 61 6e 53 65 74 28 26 41 2c 20 26 58 2c 20 26  panSet(&A, &X, &
73e0: 58 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  X);.}.expr(A) ::
73f0: 3d 20 56 41 52 49 41 42 4c 45 28 58 29 2e 20 20  = VARIABLE(X).  
7400: 20 20 20 7b 0a 20 20 73 70 61 6e 45 78 70 72 28     {.  spanExpr(
7410: 26 41 2c 20 70 50 61 72 73 65 2c 20 54 4b 5f 56  &A, pParse, TK_V
7420: 41 52 49 41 42 4c 45 2c 20 26 58 29 3b 0a 20 20  ARIABLE, &X);.  
7430: 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69 67  sqlite3ExprAssig
7440: 6e 56 61 72 4e 75 6d 62 65 72 28 70 50 61 72 73  nVarNumber(pPars
7450: 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20 73  e, A.pExpr);.  s
7460: 70 61 6e 53 65 74 28 26 41 2c 20 26 58 2c 20 26  panSet(&A, &X, &
7470: 58 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  X);.}.expr(A) ::
7480: 3d 20 65 78 70 72 28 45 29 20 43 4f 4c 4c 41 54  = expr(E) COLLAT
7490: 45 20 69 64 73 28 43 29 2e 20 7b 0a 20 20 41 2e  E ids(C). {.  A.
74a0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
74b0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
74c0: 65 6e 28 70 50 61 72 73 65 2c 20 45 2e 70 45 78  en(pParse, E.pEx
74d0: 70 72 2c 20 26 43 29 3b 0a 20 20 41 2e 7a 53 74  pr, &C);.  A.zSt
74e0: 61 72 74 20 3d 20 45 2e 7a 53 74 61 72 74 3b 0a  art = E.zStart;.
74f0: 20 20 41 2e 7a 45 6e 64 20 3d 20 26 43 2e 7a 5b    A.zEnd = &C.z[
7500: 43 2e 6e 5d 3b 0a 7d 0a 25 69 66 6e 64 65 66 20  C.n];.}.%ifndef 
7510: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54  SQLITE_OMIT_CAST
7520: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53  .expr(A) ::= CAS
7530: 54 28 58 29 20 4c 50 20 65 78 70 72 28 45 29 20  T(X) LP expr(E) 
7540: 41 53 20 74 79 70 65 74 6f 6b 65 6e 28 54 29 20  AS typetoken(T) 
7550: 52 50 28 59 29 2e 20 7b 0a 20 20 41 2e 70 45 78  RP(Y). {.  A.pEx
7560: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
7570: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 41 53  r(pParse, TK_CAS
7580: 54 2c 20 45 2e 70 45 78 70 72 2c 20 30 2c 20 26  T, E.pExpr, 0, &
7590: 54 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26 41  T);.  spanSet(&A
75a0: 2c 26 58 2c 26 59 29 3b 0a 7d 0a 25 65 6e 64 69  ,&X,&Y);.}.%endi
75b0: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  f  SQLITE_OMIT_C
75c0: 41 53 54 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  AST.expr(A) ::= 
75d0: 49 44 28 58 29 20 4c 50 20 64 69 73 74 69 6e 63  ID(X) LP distinc
75e0: 74 28 44 29 20 65 78 70 72 6c 69 73 74 28 59 29  t(D) exprlist(Y)
75f0: 20 52 50 28 45 29 2e 20 7b 0a 20 20 69 66 28 20   RP(E). {.  if( 
7600: 59 20 26 26 20 59 2d 3e 6e 45 78 70 72 3e 70 50  Y && Y->nExpr>pP
7610: 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74  arse->db->aLimit
7620: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55  [SQLITE_LIMIT_FU
7630: 4e 43 54 49 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20  NCTION_ARG] ){. 
7640: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7650: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
7660: 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 6f  many arguments o
7670: 6e 20 66 75 6e 63 74 69 6f 6e 20 25 54 22 2c 20  n function %T", 
7680: 26 58 29 3b 0a 20 20 7d 0a 20 20 41 2e 70 45 78  &X);.  }.  A.pEx
7690: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
76a0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
76b0: 20 59 2c 20 26 58 29 3b 0a 20 20 73 70 61 6e 53   Y, &X);.  spanS
76c0: 65 74 28 26 41 2c 26 58 2c 26 45 29 3b 0a 20 20  et(&A,&X,&E);.  
76d0: 69 66 28 20 44 20 26 26 20 41 2e 70 45 78 70 72  if( D && A.pExpr
76e0: 20 29 7b 0a 20 20 20 20 41 2e 70 45 78 70 72 2d   ){.    A.pExpr-
76f0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 69 73  >flags |= EP_Dis
7700: 74 69 6e 63 74 3b 0a 20 20 7d 0a 7d 0a 65 78 70  tinct;.  }.}.exp
7710: 72 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 20 4c  r(A) ::= ID(X) L
7720: 50 20 53 54 41 52 20 52 50 28 45 29 2e 20 7b 0a  P STAR RP(E). {.
7730: 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69    A.pExpr = sqli
7740: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
7750: 70 50 61 72 73 65 2c 20 30 2c 20 26 58 29 3b 0a  pParse, 0, &X);.
7760: 20 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c    spanSet(&A,&X,
7770: 26 45 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a  &E);.}.term(A) :
7780: 3a 3d 20 43 54 49 4d 45 5f 4b 57 28 4f 50 29 2e  := CTIME_KW(OP).
7790: 20 7b 0a 20 20 2f 2a 20 54 68 65 20 43 55 52 52   {.  /* The CURR
77a0: 45 4e 54 5f 54 49 4d 45 2c 20 43 55 52 52 45 4e  ENT_TIME, CURREN
77b0: 54 5f 44 41 54 45 2c 20 61 6e 64 20 43 55 52 52  T_DATE, and CURR
77c0: 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 20 76 61  ENT_TIMESTAMP va
77d0: 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 74 72  lues are.  ** tr
77e0: 65 61 74 65 64 20 61 73 20 66 75 6e 63 74 69 6f  eated as functio
77f0: 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 63  ns that return c
7800: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 41 2e  onstants */.  A.
7810: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
7820: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  xprFunction(pPar
7830: 73 65 2c 20 30 2c 26 4f 50 29 3b 0a 20 20 69 66  se, 0,&OP);.  if
7840: 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  ( A.pExpr ){.   
7850: 20 41 2e 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54   A.pExpr->op = T
7860: 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3b 20 20 0a  K_CONST_FUNC;  .
7870: 20 20 7d 0a 20 20 73 70 61 6e 53 65 74 28 26 41    }.  spanSet(&A
7880: 2c 20 26 4f 50 2c 20 26 4f 50 29 3b 0a 7d 0a 0a  , &OP, &OP);.}..
7890: 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20  %include {.  /* 
78a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e  This routine con
78b0: 73 74 72 75 63 74 73 20 61 20 62 69 6e 61 72 79  structs a binary
78c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
78d0: 20 6f 75 74 20 6f 66 20 74 77 6f 20 45 78 70 72   out of two Expr
78e0: 53 70 61 6e 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  Span.  ** object
78f0: 73 20 61 6e 64 20 75 73 65 73 20 74 68 65 20 72  s and uses the r
7900: 65 73 75 6c 74 20 74 6f 20 70 6f 70 75 6c 61 74  esult to populat
7910: 65 20 61 20 6e 65 77 20 45 78 70 72 53 70 61 6e  e a new ExprSpan
7920: 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2f 0a 20 20   object..  */.  
7930: 73 74 61 74 69 63 20 76 6f 69 64 20 73 70 61 6e  static void span
7940: 42 69 6e 61 72 79 45 78 70 72 28 0a 20 20 20 20  BinaryExpr(.    
7950: 45 78 70 72 53 70 61 6e 20 2a 70 4f 75 74 2c 20  ExprSpan *pOut, 
7960: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
7970: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
7980: 20 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73      Parse *pPars
7990: 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  e,      /* The p
79a0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
79b0: 20 45 72 72 6f 72 73 20 61 63 63 75 6d 75 6c 61   Errors accumula
79c0: 74 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 69  te here */.    i
79d0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
79e0: 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
79f0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
7a00: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 4c 65 66    ExprSpan *pLef
7a10: 74 2c 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66  t,    /* The lef
7a20: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 20  t operand */.   
7a30: 20 45 78 70 72 53 70 61 6e 20 2a 70 52 69 67 68   ExprSpan *pRigh
7a40: 74 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68  t    /* The righ
7a50: 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 29  t operand */.  )
7a60: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 45 78 70  {.    pOut->pExp
7a70: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
7a80: 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 70 4c 65  (pParse, op, pLe
7a90: 66 74 2d 3e 70 45 78 70 72 2c 20 70 52 69 67 68  ft->pExpr, pRigh
7aa0: 74 2d 3e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20  t->pExpr, 0);.  
7ab0: 20 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d    pOut->zStart =
7ac0: 20 70 4c 65 66 74 2d 3e 7a 53 74 61 72 74 3b 0a   pLeft->zStart;.
7ad0: 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64 20 3d      pOut->zEnd =
7ae0: 20 70 52 69 67 68 74 2d 3e 7a 45 6e 64 3b 0a 20   pRight->zEnd;. 
7af0: 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a   }.}..expr(A) ::
7b00: 3d 20 65 78 70 72 28 58 29 20 41 4e 44 28 4f 50  = expr(X) AND(OP
7b10: 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 73  ) expr(Y).    {s
7b20: 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41  panBinaryExpr(&A
7b30: 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26  ,pParse,@OP,&X,&
7b40: 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  Y);}.expr(A) ::=
7b50: 20 65 78 70 72 28 58 29 20 4f 52 28 4f 50 29 20   expr(X) OR(OP) 
7b60: 65 78 70 72 28 59 29 2e 20 20 20 20 20 7b 73 70  expr(Y).     {sp
7b70: 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c  anBinaryExpr(&A,
7b80: 70 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26 59  pParse,@OP,&X,&Y
7b90: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
7ba0: 65 78 70 72 28 58 29 20 4c 54 7c 47 54 7c 47 45  expr(X) LT|GT|GE
7bb0: 7c 4c 45 28 4f 50 29 20 65 78 70 72 28 59 29 2e  |LE(OP) expr(Y).
7bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7be0: 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 42 69           {spanBi
7bf0: 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50 61 72  naryExpr(&A,pPar
7c00: 73 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a  se,@OP,&X,&Y);}.
7c10: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
7c20: 28 58 29 20 45 51 7c 4e 45 28 4f 50 29 20 65 78  (X) EQ|NE(OP) ex
7c30: 70 72 28 59 29 2e 20 20 7b 73 70 61 6e 42 69 6e  pr(Y).  {spanBin
7c40: 61 72 79 45 78 70 72 28 26 41 2c 70 50 61 72 73  aryExpr(&A,pPars
7c50: 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 65  e,@OP,&X,&Y);}.e
7c60: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
7c70: 58 29 20 42 49 54 41 4e 44 7c 42 49 54 4f 52 7c  X) BITAND|BITOR|
7c80: 4c 53 48 49 46 54 7c 52 53 48 49 46 54 28 4f 50  LSHIFT|RSHIFT(OP
7c90: 29 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20  ) expr(Y)..     
7ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78     {spanBinaryEx
7cd0: 70 72 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50  pr(&A,pParse,@OP
7ce0: 2c 26 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41  ,&X,&Y);}.expr(A
7cf0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 50 4c  ) ::= expr(X) PL
7d00: 55 53 7c 4d 49 4e 55 53 28 4f 50 29 20 65 78 70  US|MINUS(OP) exp
7d10: 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20  r(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 7b 73                {s
7d40: 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41  panBinaryExpr(&A
7d50: 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26  ,pParse,@OP,&X,&
7d60: 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  Y);}.expr(A) ::=
7d70: 20 65 78 70 72 28 58 29 20 53 54 41 52 7c 53 4c   expr(X) STAR|SL
7d80: 41 53 48 7c 52 45 4d 28 4f 50 29 20 65 78 70 72  ASH|REM(OP) expr
7d90: 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (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 7b 73 70               {sp
7dc0: 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c  anBinaryExpr(&A,
7dd0: 70 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26 59  pParse,@OP,&X,&Y
7de0: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
7df0: 65 78 70 72 28 58 29 20 43 4f 4e 43 41 54 28 4f  expr(X) CONCAT(O
7e00: 50 29 20 65 78 70 72 28 59 29 2e 20 7b 73 70 61  P) expr(Y). {spa
7e10: 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70  nBinaryExpr(&A,p
7e20: 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26 59 29  Parse,@OP,&X,&Y)
7e30: 3b 7d 0a 25 74 79 70 65 20 6c 69 6b 65 6f 70 20  ;}.%type likeop 
7e40: 7b 73 74 72 75 63 74 20 4c 69 6b 65 4f 70 7d 0a  {struct LikeOp}.
7e50: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4c 49  likeop(A) ::= LI
7e60: 4b 45 5f 4b 57 28 58 29 2e 20 20 20 20 20 7b 41  KE_KW(X).     {A
7e70: 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20 58 3b 20  .eOperator = X; 
7e80: 41 2e 62 4e 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b  A.bNot = 0;}.lik
7e90: 65 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4c  eop(A) ::= NOT L
7ea0: 49 4b 45 5f 4b 57 28 58 29 2e 20 7b 41 2e 65 4f  IKE_KW(X). {A.eO
7eb0: 70 65 72 61 74 6f 72 20 3d 20 58 3b 20 41 2e 62  perator = X; A.b
7ec0: 4e 6f 74 20 3d 20 31 3b 7d 0a 6c 69 6b 65 6f 70  Not = 1;}.likeop
7ed0: 28 41 29 20 3a 3a 3d 20 4d 41 54 43 48 28 58 29  (A) ::= MATCH(X)
7ee0: 2e 20 20 20 20 20 20 20 7b 41 2e 65 4f 70 65 72  .       {A.eOper
7ef0: 61 74 6f 72 20 3d 20 58 3b 20 41 2e 62 4e 6f 74  ator = X; A.bNot
7f00: 20 3d 20 30 3b 7d 0a 6c 69 6b 65 6f 70 28 41 29   = 0;}.likeop(A)
7f10: 20 3a 3a 3d 20 4e 4f 54 20 4d 41 54 43 48 28 58   ::= NOT MATCH(X
7f20: 29 2e 20 20 20 7b 41 2e 65 4f 70 65 72 61 74 6f  ).   {A.eOperato
7f30: 72 20 3d 20 58 3b 20 41 2e 62 4e 6f 74 20 3d 20  r = X; A.bNot = 
7f40: 31 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  1;}.expr(A) ::= 
7f50: 65 78 70 72 28 58 29 20 6c 69 6b 65 6f 70 28 4f  expr(X) likeop(O
7f60: 50 29 20 65 78 70 72 28 59 29 2e 20 20 5b 4c 49  P) expr(Y).  [LI
7f70: 4b 45 5f 4b 57 5d 20 20 7b 0a 20 20 45 78 70 72  KE_KW]  {.  Expr
7f80: 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 70  List *pList;.  p
7f90: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
7fa0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
7fb0: 72 73 65 2c 30 2c 20 59 2e 70 45 78 70 72 29 3b  rse,0, Y.pExpr);
7fc0: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
7fd0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
7fe0: 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 58  (pParse,pList, X
7ff0: 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70 45 78  .pExpr);.  A.pEx
8000: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
8010: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c  Function(pParse,
8020: 20 70 4c 69 73 74 2c 20 26 4f 50 2e 65 4f 70 65   pList, &OP.eOpe
8030: 72 61 74 6f 72 29 3b 0a 20 20 69 66 28 20 4f 50  rator);.  if( OP
8040: 2e 62 4e 6f 74 20 29 20 41 2e 70 45 78 70 72 20  .bNot ) A.pExpr 
8050: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
8060: 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41  Parse, TK_NOT, A
8070: 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20  .pExpr, 0, 0);. 
8080: 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 53   A.zStart = X.zS
8090: 74 61 72 74 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d  tart;.  A.zEnd =
80a0: 20 59 2e 7a 45 6e 64 3b 0a 20 20 69 66 28 20 41   Y.zEnd;.  if( A
80b0: 2e 70 45 78 70 72 20 29 20 41 2e 70 45 78 70 72  .pExpr ) A.pExpr
80c0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e  ->flags |= EP_In
80d0: 66 69 78 46 75 6e 63 3b 0a 7d 0a 65 78 70 72 28  fixFunc;.}.expr(
80e0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 6c  A) ::= expr(X) l
80f0: 69 6b 65 6f 70 28 4f 50 29 20 65 78 70 72 28 59  ikeop(OP) expr(Y
8100: 29 20 45 53 43 41 50 45 20 65 78 70 72 28 45 29  ) ESCAPE expr(E)
8110: 2e 20 20 5b 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a  .  [LIKE_KW]  {.
8120: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8130: 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  t;.  pList = sql
8140: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
8150: 6e 64 28 70 50 61 72 73 65 2c 30 2c 20 59 2e 70  nd(pParse,0, Y.p
8160: 45 78 70 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d  Expr);.  pList =
8170: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8180: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c  Append(pParse,pL
8190: 69 73 74 2c 20 58 2e 70 45 78 70 72 29 3b 0a 20  ist, X.pExpr);. 
81a0: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
81b0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
81c0: 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 45 2e 70  Parse,pList, E.p
81d0: 45 78 70 72 29 3b 0a 20 20 41 2e 70 45 78 70 72  Expr);.  A.pExpr
81e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75   = sqlite3ExprFu
81f0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
8200: 4c 69 73 74 2c 20 26 4f 50 2e 65 4f 70 65 72 61  List, &OP.eOpera
8210: 74 6f 72 29 3b 0a 20 20 69 66 28 20 4f 50 2e 62  tor);.  if( OP.b
8220: 4e 6f 74 20 29 20 41 2e 70 45 78 70 72 20 3d 20  Not ) A.pExpr = 
8230: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
8240: 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2e 70  rse, TK_NOT, A.p
8250: 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 41  Expr, 0, 0);.  A
8260: 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 53 74 61  .zStart = X.zSta
8270: 72 74 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 45  rt;.  A.zEnd = E
8280: 2e 7a 45 6e 64 3b 0a 20 20 69 66 28 20 41 2e 70  .zEnd;.  if( A.p
8290: 45 78 70 72 20 29 20 41 2e 70 45 78 70 72 2d 3e  Expr ) A.pExpr->
82a0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 66 69  flags |= EP_Infi
82b0: 78 46 75 6e 63 3b 0a 7d 0a 0a 25 69 6e 63 6c 75  xFunc;.}..%inclu
82c0: 64 65 20 7b 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  de {.  /* Constr
82d0: 75 63 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  uct an expressio
82e0: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 75 6e 61  n node for a una
82f0: 72 79 20 70 6f 73 74 66 69 78 20 6f 70 65 72 61  ry postfix opera
8300: 74 6f 72 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69  tor.  */.  stati
8310: 63 20 76 6f 69 64 20 73 70 61 6e 55 6e 61 72 79  c void spanUnary
8320: 50 6f 73 74 66 69 78 28 0a 20 20 20 20 45 78 70  Postfix(.    Exp
8330: 72 53 70 61 6e 20 2a 70 4f 75 74 2c 20 20 20 20  rSpan *pOut,    
8340: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
8350: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
8360: 6e 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 20  node here */.   
8370: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8380: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
8390: 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 72 65  ng context to re
83a0: 63 6f 72 64 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cord errors */. 
83b0: 20 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20     int op,      
83c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
83d0: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
83e0: 20 45 78 70 72 53 70 61 6e 20 2a 70 4f 70 65 72   ExprSpan *pOper
83f0: 61 6e 64 2c 20 20 20 20 2f 2a 20 54 68 65 20 6f  and,    /* The o
8400: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 20 20 54 6f  perand */.    To
8410: 6b 65 6e 20 2a 70 50 6f 73 74 4f 70 20 20 20 20  ken *pPostOp    
8420: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72       /* The oper
8430: 61 6e 64 20 74 6f 6b 65 6e 20 66 6f 72 20 73 65  and token for se
8440: 74 74 69 6e 67 20 74 68 65 20 73 70 61 6e 20 2a  tting the span *
8450: 2f 0a 20 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d  /.  ){.    pOut-
8460: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
8470: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
8480: 2c 20 70 4f 70 65 72 61 6e 64 2d 3e 70 45 78 70  , pOperand->pExp
8490: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4f  r, 0, 0);.    pO
84a0: 75 74 2d 3e 7a 53 74 61 72 74 20 3d 20 70 4f 70  ut->zStart = pOp
84b0: 65 72 61 6e 64 2d 3e 7a 53 74 61 72 74 3b 0a 20  erand->zStart;. 
84c0: 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20     pOut->zEnd = 
84d0: 26 70 50 6f 73 74 4f 70 2d 3e 7a 5b 70 50 6f 73  &pPostOp->z[pPos
84e0: 74 4f 70 2d 3e 6e 5d 3b 0a 20 20 7d 20 20 20 20  tOp->n];.  }    
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8500: 20 20 20 20 20 20 20 0a 7d 0a 0a 65 78 70 72 28         .}..expr(
8510: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49  A) ::= expr(X) I
8520: 53 4e 55 4c 4c 7c 4e 4f 54 4e 55 4c 4c 28 45 29  SNULL|NOTNULL(E)
8530: 2e 20 20 20 7b 73 70 61 6e 55 6e 61 72 79 50 6f  .   {spanUnaryPo
8540: 73 74 66 69 78 28 26 41 2c 70 50 61 72 73 65 2c  stfix(&A,pParse,
8550: 40 45 2c 26 58 2c 26 45 29 3b 7d 0a 65 78 70 72  @E,&X,&E);}.expr
8560: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
8570: 4e 4f 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 73 70  NOT NULL(E). {sp
8580: 61 6e 55 6e 61 72 79 50 6f 73 74 66 69 78 28 26  anUnaryPostfix(&
8590: 41 2c 70 50 61 72 73 65 2c 54 4b 5f 4e 4f 54 4e  A,pParse,TK_NOTN
85a0: 55 4c 4c 2c 26 58 2c 26 45 29 3b 7d 0a 0a 25 69  ULL,&X,&E);}..%i
85b0: 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 41 20  nclude {.  /* A 
85c0: 72 6f 75 74 69 6e 65 20 74 6f 20 63 6f 6e 76 65  routine to conve
85d0: 72 74 20 61 20 62 69 6e 61 72 79 20 54 4b 5f 49  rt a binary TK_I
85e0: 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54 20 65 78  S or TK_ISNOT ex
85f0: 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 0a  pression into a.
8600: 20 20 2a 2a 20 75 6e 61 72 79 20 54 4b 5f 49 53    ** unary TK_IS
8610: 4e 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e 55  NULL or TK_NOTNU
8620: 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a  LL expression. *
8630: 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
8640: 62 69 6e 61 72 79 54 6f 55 6e 61 72 79 49 66 4e  binaryToUnaryIfN
8650: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
8660: 65 2c 20 45 78 70 72 20 2a 70 59 2c 20 45 78 70  e, Expr *pY, Exp
8670: 72 20 2a 70 41 2c 20 69 6e 74 20 6f 70 29 7b 0a  r *pA, int op){.
8680: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
8690: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
86a0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
86b0: 46 61 69 6c 65 64 3d 3d 30 20 26 26 20 70 59 2d  Failed==0 && pY-
86c0: 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b 0a  >op==TK_NULL ){.
86d0: 20 20 20 20 20 20 70 41 2d 3e 6f 70 20 3d 20 28        pA->op = (
86e0: 75 38 29 6f 70 3b 0a 20 20 20 20 20 20 73 71 6c  u8)op;.      sql
86f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8700: 62 2c 20 70 41 2d 3e 70 52 69 67 68 74 29 3b 0a  b, pA->pRight);.
8710: 20 20 20 20 20 20 70 41 2d 3e 70 52 69 67 68 74        pA->pRight
8720: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
8730: 7d 0a 0a 2f 2f 20 20 20 20 65 78 70 72 31 20 49  }..//    expr1 I
8740: 53 20 65 78 70 72 32 0a 2f 2f 20 20 20 20 65 78  S expr2.//    ex
8750: 70 72 31 20 49 53 20 4e 4f 54 20 65 78 70 72 32  pr1 IS NOT expr2
8760: 0a 2f 2f 0a 2f 2f 20 49 66 20 65 78 70 72 32 20  .//.// If expr2 
8770: 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 63 6f 64  is NULL then cod
8780: 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 20 6f  e as TK_ISNULL o
8790: 72 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2e 20 20 49  r TK_NOTNULL.  I
87a0: 66 20 65 78 70 72 32 0a 2f 2f 20 69 73 20 61 6e  f expr2.// is an
87b0: 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  y other expressi
87c0: 6f 6e 2c 20 63 6f 64 65 20 61 73 20 54 4b 5f 49  on, code as TK_I
87d0: 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54 2e 0a 2f  S or TK_ISNOT../
87e0: 2f 20 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  / .expr(A) ::= e
87f0: 78 70 72 28 58 29 20 49 53 20 65 78 70 72 28 59  xpr(X) IS expr(Y
8800: 29 2e 20 20 20 20 20 7b 0a 20 20 73 70 61 6e 42  ).     {.  spanB
8810: 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50 61  inaryExpr(&A,pPa
8820: 72 73 65 2c 54 4b 5f 49 53 2c 26 58 2c 26 59 29  rse,TK_IS,&X,&Y)
8830: 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55 6e 61 72  ;.  binaryToUnar
8840: 79 49 66 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  yIfNull(pParse, 
8850: 59 2e 70 45 78 70 72 2c 20 41 2e 70 45 78 70 72  Y.pExpr, A.pExpr
8860: 2c 20 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 7d 0a  , TK_ISNULL);.}.
8870: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
8880: 28 58 29 20 49 53 20 4e 4f 54 20 65 78 70 72 28  (X) IS NOT expr(
8890: 59 29 2e 20 7b 0a 20 20 73 70 61 6e 42 69 6e 61  Y). {.  spanBina
88a0: 72 79 45 78 70 72 28 26 41 2c 70 50 61 72 73 65  ryExpr(&A,pParse
88b0: 2c 54 4b 5f 49 53 4e 4f 54 2c 26 58 2c 26 59 29  ,TK_ISNOT,&X,&Y)
88c0: 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55 6e 61 72  ;.  binaryToUnar
88d0: 79 49 66 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20  yIfNull(pParse, 
88e0: 59 2e 70 45 78 70 72 2c 20 41 2e 70 45 78 70 72  Y.pExpr, A.pExpr
88f0: 2c 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 7d  , TK_NOTNULL);.}
8900: 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f  ..%include {.  /
8910: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6e 20 65  * Construct an e
8920: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
8930: 6f 72 20 61 20 75 6e 61 72 79 20 70 72 65 66 69  or a unary prefi
8940: 78 20 6f 70 65 72 61 74 6f 72 0a 20 20 2a 2f 0a  x operator.  */.
8950: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73 70    static void sp
8960: 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28 0a 20  anUnaryPrefix(. 
8970: 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70 4f 75     ExprSpan *pOu
8980: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  t,        /* Wri
8990: 74 65 20 74 68 65 20 6e 65 77 20 65 78 70 72 65  te the new expre
89a0: 73 73 69 6f 6e 20 6e 6f 64 65 20 68 65 72 65 20  ssion node here 
89b0: 2a 2f 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50  */.    Parse *pP
89c0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
89d0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
89e0: 20 74 6f 20 72 65 63 6f 72 64 20 65 72 72 6f 72   to record error
89f0: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 2c  s */.    int op,
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  /* The operator 
8a20: 2a 2f 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20  */.    ExprSpan 
8a30: 2a 70 4f 70 65 72 61 6e 64 2c 20 20 20 20 2f 2a  *pOperand,    /*
8a40: 20 54 68 65 20 6f 70 65 72 61 6e 64 20 2a 2f 0a   The operand */.
8a50: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50 72 65 4f      Token *pPreO
8a60: 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p         /* The
8a70: 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65 6e 20 66   operand token f
8a80: 6f 72 20 73 65 74 74 69 6e 67 20 74 68 65 20 73  or setting the s
8a90: 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  pan */.  ){.    
8aa0: 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20 73 71  pOut->pExpr = sq
8ab0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
8ac0: 65 2c 20 6f 70 2c 20 70 4f 70 65 72 61 6e 64 2d  e, op, pOperand-
8ad0: 3e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20  >pExpr, 0, 0);. 
8ae0: 20 20 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20     pOut->zStart 
8af0: 3d 20 70 50 72 65 4f 70 2d 3e 7a 3b 0a 20 20 20  = pPreOp->z;.   
8b00: 20 70 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 70 4f   pOut->zEnd = pO
8b10: 70 65 72 61 6e 64 2d 3e 7a 45 6e 64 3b 0a 20 20  perand->zEnd;.  
8b20: 7d 0a 7d 0a 0a 0a 0a 65 78 70 72 28 41 29 20 3a  }.}....expr(A) :
8b30: 3a 3d 20 4e 4f 54 28 42 29 20 65 78 70 72 28 58  := NOT(B) expr(X
8b40: 29 2e 20 20 20 20 7b 73 70 61 6e 55 6e 61 72 79  ).    {spanUnary
8b50: 50 72 65 66 69 78 28 26 41 2c 70 50 61 72 73 65  Prefix(&A,pParse
8b60: 2c 40 42 2c 26 58 2c 26 42 29 3b 7d 0a 65 78 70  ,@B,&X,&B);}.exp
8b70: 72 28 41 29 20 3a 3a 3d 20 42 49 54 4e 4f 54 28  r(A) ::= BITNOT(
8b80: 42 29 20 65 78 70 72 28 58 29 2e 20 7b 73 70 61  B) expr(X). {spa
8b90: 6e 55 6e 61 72 79 50 72 65 66 69 78 28 26 41 2c  nUnaryPrefix(&A,
8ba0: 70 50 61 72 73 65 2c 40 42 2c 26 58 2c 26 42 29  pParse,@B,&X,&B)
8bb0: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d  ;}.expr(A) ::= M
8bc0: 49 4e 55 53 28 42 29 20 65 78 70 72 28 58 29 2e  INUS(B) expr(X).
8bd0: 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20 20 20 20   [BITNOT].      
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bf0: 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 55 6e           {spanUn
8c00: 61 72 79 50 72 65 66 69 78 28 26 41 2c 70 50 61  aryPrefix(&A,pPa
8c10: 72 73 65 2c 54 4b 5f 55 4d 49 4e 55 53 2c 26 58  rse,TK_UMINUS,&X
8c20: 2c 26 42 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  ,&B);}.expr(A) :
8c30: 3a 3d 20 50 4c 55 53 28 42 29 20 65 78 70 72 28  := PLUS(B) expr(
8c40: 58 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20  X). [BITNOT].   
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c60: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61              {spa
8c70: 6e 55 6e 61 72 79 50 72 65 66 69 78 28 26 41 2c  nUnaryPrefix(&A,
8c80: 70 50 61 72 73 65 2c 54 4b 5f 55 50 4c 55 53 2c  pParse,TK_UPLUS,
8c90: 26 58 2c 26 42 29 3b 7d 0a 0a 25 74 79 70 65 20  &X,&B);}..%type 
8ca0: 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69 6e 74 7d  between_op {int}
8cb0: 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20 3a  .between_op(A) :
8cc0: 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20 20 20 20  := BETWEEN.     
8cd0: 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77 65 65 6e  {A = 0;}.between
8ce0: 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 42  _op(A) ::= NOT B
8cf0: 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20 31 3b 7d  ETWEEN. {A = 1;}
8d00: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
8d10: 72 28 57 29 20 62 65 74 77 65 65 6e 5f 6f 70 28  r(W) between_op(
8d20: 4e 29 20 65 78 70 72 28 58 29 20 41 4e 44 20 65  N) expr(X) AND e
8d30: 78 70 72 28 59 29 2e 20 5b 42 45 54 57 45 45 4e  xpr(Y). [BETWEEN
8d40: 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  ] {.  ExprList *
8d50: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
8d60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
8d70: 61 72 73 65 2c 30 2c 20 58 2e 70 45 78 70 72 29  arse,0, X.pExpr)
8d80: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
8d90: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
8da0: 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20  d(pParse,pList, 
8db0: 59 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70 45  Y.pExpr);.  A.pE
8dc0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
8dd0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 42 45  pr(pParse, TK_BE
8de0: 54 57 45 45 4e 2c 20 57 2e 70 45 78 70 72 2c 20  TWEEN, W.pExpr, 
8df0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 2e 70  0, 0);.  if( A.p
8e00: 45 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70 45  Expr ){.    A.pE
8e10: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70  xpr->x.pList = p
8e20: 4c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  List;.  }else{. 
8e30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
8e40: 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
8e50: 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
8e60: 20 0a 20 20 69 66 28 20 4e 20 29 20 41 2e 70 45   .  if( N ) A.pE
8e70: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
8e80: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f  pr(pParse, TK_NO
8e90: 54 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20 30  T, A.pExpr, 0, 0
8ea0: 29 3b 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20  );.  A.zStart = 
8eb0: 57 2e 7a 53 74 61 72 74 3b 0a 20 20 41 2e 7a 45  W.zStart;.  A.zE
8ec0: 6e 64 20 3d 20 59 2e 7a 45 6e 64 3b 0a 7d 0a 25  nd = Y.zEnd;.}.%
8ed0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
8ee0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 25 74  IT_SUBQUERY.  %t
8ef0: 79 70 65 20 69 6e 5f 6f 70 20 7b 69 6e 74 7d 0a  ype in_op {int}.
8f00: 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 49    in_op(A) ::= I
8f10: 4e 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d  N.      {A = 0;}
8f20: 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20  .  in_op(A) ::= 
8f30: 4e 4f 54 20 49 4e 2e 20 20 7b 41 20 3d 20 31 3b  NOT IN.  {A = 1;
8f40: 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.  expr(A) ::= 
8f50: 65 78 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29  expr(X) in_op(N)
8f60: 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29 20   LP exprlist(Y) 
8f70: 52 50 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20  RP(E). [IN] {.  
8f80: 20 20 69 66 28 20 59 3d 3d 30 20 29 7b 0a 20 20    if( Y==0 ){.  
8f90: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
8fa0: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20  ns of the form. 
8fb0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
8fc0: 20 20 20 20 20 20 65 78 70 72 31 20 49 4e 20 28        expr1 IN (
8fd0: 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  ).      **      
8fe0: 65 78 70 72 31 20 4e 4f 54 20 49 4e 20 28 29 0a  expr1 NOT IN ().
8ff0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
9000: 2a 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 63 6f  * simplify to co
9010: 6e 73 74 61 6e 74 73 20 30 20 28 66 61 6c 73 65  nstants 0 (false
9020: 29 20 61 6e 64 20 31 20 28 74 72 75 65 29 2c 20  ) and 1 (true), 
9030: 72 65 73 70 65 63 74 69 76 65 6c 79 2c 0a 20 20  respectively,.  
9040: 20 20 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73      ** regardles
9050: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
9060: 66 20 65 78 70 72 31 2e 0a 20 20 20 20 20 20 2a  f expr1..      *
9070: 2f 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 20  /.      A.pExpr 
9080: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9090: 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47 45  Parse, TK_INTEGE
90a0: 52 2c 20 30 2c 20 30 2c 20 26 73 71 6c 69 74 65  R, 0, 0, &sqlite
90b0: 33 49 6e 74 54 6f 6b 65 6e 73 5b 4e 5d 29 3b 0a  3IntTokens[N]);.
90c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
90d0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
90e0: 64 62 2c 20 58 2e 70 45 78 70 72 29 3b 0a 20 20  db, X.pExpr);.  
90f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41    }else{.      A
9100: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
9110: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
9120: 5f 49 4e 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c  _IN, X.pExpr, 0,
9130: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41   0);.      if( A
9140: 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  .pExpr ){.      
9150: 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69    A.pExpr->x.pLi
9160: 73 74 20 3d 20 59 3b 0a 20 20 20 20 20 20 20 20  st = Y;.        
9170: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
9180: 69 67 68 74 28 70 50 61 72 73 65 2c 20 41 2e 70  ight(pParse, A.p
9190: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Expr);.      }el
91a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
91b0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
91c0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29  e(pParse->db, Y)
91d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
91e0: 69 66 28 20 4e 20 29 20 41 2e 70 45 78 70 72 20  if( N ) A.pExpr 
91f0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9200: 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41  Parse, TK_NOT, A
9210: 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20  .pExpr, 0, 0);. 
9220: 20 20 20 7d 0a 20 20 20 20 41 2e 7a 53 74 61 72     }.    A.zStar
9230: 74 20 3d 20 58 2e 7a 53 74 61 72 74 3b 0a 20 20  t = X.zStart;.  
9240: 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b    A.zEnd = &E.z[
9250: 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72  E.n];.  }.  expr
9260: 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 73 65  (A) ::= LP(B) se
9270: 6c 65 63 74 28 58 29 20 52 50 28 45 29 2e 20 7b  lect(X) RP(E). {
9280: 0a 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73  .    A.pExpr = s
9290: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
92a0: 73 65 2c 20 54 4b 5f 53 45 4c 45 43 54 2c 20 30  se, TK_SELECT, 0
92b0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
92c0: 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20   A.pExpr ){.    
92d0: 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e 70 53 65    A.pExpr->x.pSe
92e0: 6c 65 63 74 20 3d 20 58 3b 0a 20 20 20 20 20 20  lect = X;.      
92f0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
9300: 41 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  A.pExpr, EP_xIsS
9310: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71  elect);.      sq
9320: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
9330: 68 74 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78  ht(pParse, A.pEx
9340: 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pr);.    }else{.
9350: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
9360: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
9370: 2d 3e 64 62 2c 20 58 29 3b 0a 20 20 20 20 7d 0a  ->db, X);.    }.
9380: 20 20 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 42      A.zStart = B
9390: 2e 7a 3b 0a 20 20 20 20 41 2e 7a 45 6e 64 20 3d  .z;.    A.zEnd =
93a0: 20 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a 20 20 7d 0a   &E.z[E.n];.  }.
93b0: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78    expr(A) ::= ex
93c0: 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29 20 4c  pr(X) in_op(N) L
93d0: 50 20 73 65 6c 65 63 74 28 59 29 20 52 50 28 45  P select(Y) RP(E
93e0: 29 2e 20 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 41  ).  [IN] {.    A
93f0: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
9400: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
9410: 5f 49 4e 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c  _IN, X.pExpr, 0,
9420: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 41 2e 70   0);.    if( A.p
9430: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 41 2e  Expr ){.      A.
9440: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
9450: 20 3d 20 59 3b 0a 20 20 20 20 20 20 45 78 70 72   = Y;.      Expr
9460: 53 65 74 50 72 6f 70 65 72 74 79 28 41 2e 70 45  SetProperty(A.pE
9470: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
9480: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9490: 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28 70  3ExprSetHeight(p
94a0: 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b  Parse, A.pExpr);
94b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
94c0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
94d0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
94e0: 2c 20 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , Y);.    }.    
94f0: 69 66 28 20 4e 20 29 20 41 2e 70 45 78 70 72 20  if( N ) A.pExpr 
9500: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9510: 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41  Parse, TK_NOT, A
9520: 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20  .pExpr, 0, 0);. 
9530: 20 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e     A.zStart = X.
9540: 7a 53 74 61 72 74 3b 0a 20 20 20 20 41 2e 7a 45  zStart;.    A.zE
9550: 6e 64 20 3d 20 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a  nd = &E.z[E.n];.
9560: 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a    }.  expr(A) ::
9570: 3d 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70 28  = expr(X) in_op(
9580: 4e 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29  N) nm(Y) dbnm(Z)
9590: 2e 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 53 72 63  . [IN] {.    Src
95a0: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 73 71 6c  List *pSrc = sql
95b0: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
95c0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c  d(pParse->db, 0,
95d0: 26 59 2c 26 5a 29 3b 0a 20 20 20 20 41 2e 70 45  &Y,&Z);.    A.pE
95e0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
95f0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
9600: 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c 20 30 29  , X.pExpr, 0, 0)
9610: 3b 0a 20 20 20 20 69 66 28 20 41 2e 70 45 78 70  ;.    if( A.pExp
9620: 72 20 29 7b 0a 20 20 20 20 20 20 41 2e 70 45 78  r ){.      A.pEx
9630: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  pr->x.pSelect = 
9640: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
9650: 28 70 50 61 72 73 65 2c 20 30 2c 70 53 72 63 2c  (pParse, 0,pSrc,
9660: 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a  0,0,0,0,0,0,0);.
9670: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
9680: 70 65 72 74 79 28 41 2e 70 45 78 70 72 2c 20 45  perty(A.pExpr, E
9690: 50 5f 78 49 73 53 65 6c 65 63 74 29 3b 0a 20 20  P_xIsSelect);.  
96a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
96b0: 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  etHeight(pParse,
96c0: 20 41 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d   A.pExpr);.    }
96d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
96e0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
96f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 53 72  (pParse->db, pSr
9700: 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  c);.    }.    if
9710: 28 20 4e 20 29 20 41 2e 70 45 78 70 72 20 3d 20  ( N ) A.pExpr = 
9720: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
9730: 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2e 70  rse, TK_NOT, A.p
9740: 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
9750: 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 53   A.zStart = X.zS
9760: 74 61 72 74 3b 0a 20 20 20 20 41 2e 7a 45 6e 64  tart;.    A.zEnd
9770: 20 3d 20 5a 2e 7a 20 3f 20 26 5a 2e 7a 5b 5a 2e   = Z.z ? &Z.z[Z.
9780: 6e 5d 20 3a 20 26 59 2e 7a 5b 59 2e 6e 5d 3b 0a  n] : &Y.z[Y.n];.
9790: 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a    }.  expr(A) ::
97a0: 3d 20 45 58 49 53 54 53 28 42 29 20 4c 50 20 73  = EXISTS(B) LP s
97b0: 65 6c 65 63 74 28 59 29 20 52 50 28 45 29 2e 20  elect(Y) RP(E). 
97c0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  {.    Expr *p = 
97d0: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
97e0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
97f0: 4b 5f 45 58 49 53 54 53 2c 20 30 2c 20 30 2c 20  K_EXISTS, 0, 0, 
9800: 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  0);.    if( p ){
9810: 0a 20 20 20 20 20 20 70 2d 3e 78 2e 70 53 65 6c  .      p->x.pSel
9820: 65 63 74 20 3d 20 59 3b 0a 20 20 20 20 20 20 45  ect = Y;.      E
9830: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
9840: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 3b  , EP_xIsSelect);
9850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9860: 70 72 53 65 74 48 65 69 67 68 74 28 70 50 61 72  prSetHeight(pPar
9870: 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73  se, p);.    }els
9880: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
9890: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61  SelectDelete(pPa
98a0: 72 73 65 2d 3e 64 62 2c 20 59 29 3b 0a 20 20 20  rse->db, Y);.   
98b0: 20 7d 0a 20 20 20 20 41 2e 7a 53 74 61 72 74 20   }.    A.zStart 
98c0: 3d 20 42 2e 7a 3b 0a 20 20 20 20 41 2e 7a 45 6e  = B.z;.    A.zEn
98d0: 64 20 3d 20 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a 20  d = &E.z[E.n];. 
98e0: 20 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45   }.%endif SQLITE
98f0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a  _OMIT_SUBQUERY..
9900: 2f 2a 20 43 41 53 45 20 65 78 70 72 65 73 73 69  /* CASE expressi
9910: 6f 6e 73 20 2a 2f 0a 65 78 70 72 28 41 29 20 3a  ons */.expr(A) :
9920: 3a 3d 20 43 41 53 45 28 43 29 20 63 61 73 65 5f  := CASE(C) case_
9930: 6f 70 65 72 61 6e 64 28 58 29 20 63 61 73 65 5f  operand(X) case_
9940: 65 78 70 72 6c 69 73 74 28 59 29 20 63 61 73 65  exprlist(Y) case
9950: 5f 65 6c 73 65 28 5a 29 20 45 4e 44 28 45 29 2e  _else(Z) END(E).
9960: 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73   {.  A.pExpr = s
9970: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
9980: 73 65 2c 20 54 4b 5f 43 41 53 45 2c 20 58 2c 20  se, TK_CASE, X, 
9990: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 2e 70  0, 0);.  if( A.p
99a0: 45 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70 45  Expr ){.    A.pE
99b0: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 5a  xpr->x.pList = Z
99c0: 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   ? sqlite3ExprLi
99d0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
99e0: 59 2c 5a 29 20 3a 20 59 3b 0a 20 20 20 20 73 71  Y,Z) : Y;.    sq
99f0: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
9a00: 68 74 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78  ht(pParse, A.pEx
9a10: 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pr);.  }else{.  
9a20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9a30: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
9a40: 64 62 2c 20 59 29 3b 0a 20 20 20 20 73 71 6c 69  db, Y);.    sqli
9a50: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
9a60: 61 72 73 65 2d 3e 64 62 2c 20 5a 29 3b 0a 20 20  arse->db, Z);.  
9a70: 7d 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 43  }.  A.zStart = C
9a80: 2e 7a 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26  .z;.  A.zEnd = &
9a90: 45 2e 7a 5b 45 2e 6e 5d 3b 0a 7d 0a 25 74 79 70  E.z[E.n];.}.%typ
9aa0: 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20  e case_exprlist 
9ab0: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
9ac0: 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70  tructor case_exp
9ad0: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
9ae0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
9af0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63  rse->db, $$);}.c
9b00: 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20  ase_exprlist(A) 
9b10: 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c 69 73  ::= case_exprlis
9b20: 74 28 58 29 20 57 48 45 4e 20 65 78 70 72 28 59  t(X) WHEN expr(Y
9b30: 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20  ) THEN expr(Z). 
9b40: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
9b50: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
9b60: 61 72 73 65 2c 58 2c 20 59 2e 70 45 78 70 72 29  arse,X, Y.pExpr)
9b70: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
9b80: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
9b90: 61 72 73 65 2c 41 2c 20 5a 2e 70 45 78 70 72 29  arse,A, Z.pExpr)
9ba0: 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73  ;.}.case_exprlis
9bb0: 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78  t(A) ::= WHEN ex
9bc0: 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28  pr(Y) THEN expr(
9bd0: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
9be0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
9bf0: 64 28 70 50 61 72 73 65 2c 30 2c 20 59 2e 70 45  d(pParse,0, Y.pE
9c00: 78 70 72 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  xpr);.  A = sqli
9c10: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
9c20: 64 28 70 50 61 72 73 65 2c 41 2c 20 5a 2e 70 45  d(pParse,A, Z.pE
9c30: 78 70 72 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61  xpr);.}.%type ca
9c40: 73 65 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a  se_else {Expr*}.
9c50: 25 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65  %destructor case
9c60: 5f 65 6c 73 65 20 7b 73 71 6c 69 74 65 33 45 78  _else {sqlite3Ex
9c70: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
9c80: 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f  >db, $$);}.case_
9c90: 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53  else(A) ::=  ELS
9ca0: 45 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  E expr(X).      
9cb0: 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70 72 3b     {A = X.pExpr;
9cc0: 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a  }.case_else(A) :
9cd0: 3a 3d 20 20 2e 20 20 20 20 20 20 20 20 20 20 20  :=  .           
9ce0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
9cf0: 3b 7d 20 0a 25 74 79 70 65 20 63 61 73 65 5f 6f  ;} .%type case_o
9d00: 70 65 72 61 6e 64 20 7b 45 78 70 72 2a 7d 0a 25  perand {Expr*}.%
9d10: 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f  destructor case_
9d20: 6f 70 65 72 61 6e 64 20 7b 73 71 6c 69 74 65 33  operand {sqlite3
9d30: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
9d40: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73  e->db, $$);}.cas
9d50: 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d  e_operand(A) ::=
9d60: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
9d70: 20 20 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70       {A = X.pExp
9d80: 72 3b 7d 20 0a 63 61 73 65 5f 6f 70 65 72 61 6e  r;} .case_operan
9d90: 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  d(A) ::= .      
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
9db0: 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65 20 65 78  = 0;} ..%type ex
9dc0: 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  prlist {ExprList
9dd0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65  *}.%destructor e
9de0: 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  xprlist {sqlite3
9df0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
9e00: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
9e10: 0a 25 74 79 70 65 20 6e 65 78 70 72 6c 69 73 74  .%type nexprlist
9e20: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
9e30: 73 74 72 75 63 74 6f 72 20 6e 65 78 70 72 6c 69  structor nexprli
9e40: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
9e50: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
9e60: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 65 78 70  ->db, $$);}..exp
9e70: 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 65 78  rlist(A) ::= nex
9e80: 70 72 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20  prlist(X).      
9e90: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
9ea0: 3b 7d 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a  ;}.exprlist(A) :
9eb0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 7b 41 20 3d 20 30 3b 7d 0a 6e 65 78 70 72 6c 69  {A = 0;}.nexprli
9ee0: 73 74 28 41 29 20 3a 3a 3d 20 6e 65 78 70 72 6c  st(A) ::= nexprl
9ef0: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  ist(X) COMMA exp
9f00: 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  r(Y)..    {A = s
9f10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
9f20: 70 65 6e 64 28 70 50 61 72 73 65 2c 58 2c 59 2e  pend(pParse,X,Y.
9f30: 70 45 78 70 72 29 3b 7d 0a 6e 65 78 70 72 6c 69  pExpr);}.nexprli
9f40: 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 59  st(A) ::= expr(Y
9f50: 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  )..    {A = sqli
9f60: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
9f70: 64 28 70 50 61 72 73 65 2c 30 2c 59 2e 70 45 78  d(pParse,0,Y.pEx
9f80: 70 72 29 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  pr);}...////////
9f90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fa0: 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45  ///// The CREATE
9fb0: 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f   INDEX command /
9fc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9fd0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
9fe0: 3d 20 63 72 65 61 74 65 6b 77 28 53 29 20 75 6e  = createkw(S) un
9ff0: 69 71 75 65 66 6c 61 67 28 55 29 20 49 4e 44 45  iqueflag(U) INDE
a000: 58 20 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 45  X ifnotexists(NE
a010: 29 20 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29 0a  ) nm(X) dbnm(D).
a020: 20 20 20 20 20 20 20 20 4f 4e 20 6e 6d 28 59 29          ON nm(Y)
a030: 20 4c 50 20 69 64 78 6c 69 73 74 28 5a 29 20 52   LP idxlist(Z) R
a040: 50 20 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20  P where_opt(W). 
a050: 7b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74  {.  sqlite3Creat
a060: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  eIndex(pParse, &
a070: 58 2c 20 26 44 2c 20 0a 20 20 20 20 20 20 20 20  X, &D, .        
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a090: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
a0a0: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26  d(pParse->db,0,&
a0b0: 59 2c 30 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20  Y,0), Z, U,.    
a0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0d0: 20 20 26 53 2c 20 57 2c 20 53 51 4c 49 54 45 5f    &S, W, SQLITE_
a0e0: 53 4f 5f 41 53 43 2c 20 4e 45 29 3b 0a 7d 0a 0a  SO_ASC, NE);.}..
a0f0: 25 74 79 70 65 20 75 6e 69 71 75 65 66 6c 61 67  %type uniqueflag
a100: 20 7b 69 6e 74 7d 0a 75 6e 69 71 75 65 66 6c 61   {int}.uniquefla
a110: 67 28 41 29 20 3a 3a 3d 20 55 4e 49 51 55 45 2e  g(A) ::= UNIQUE.
a120: 20 20 7b 41 20 3d 20 4f 45 5f 41 62 6f 72 74 3b    {A = OE_Abort;
a130: 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20  }.uniqueflag(A) 
a140: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 7b 41 20  ::= .        {A 
a150: 3d 20 4f 45 5f 4e 6f 6e 65 3b 7d 0a 0a 25 74 79  = OE_None;}..%ty
a160: 70 65 20 69 64 78 6c 69 73 74 20 7b 45 78 70 72  pe idxlist {Expr
a170: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
a180: 6f 72 20 69 64 78 6c 69 73 74 20 7b 73 71 6c 69  or idxlist {sqli
a190: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
a1a0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
a1b0: 29 3b 7d 0a 25 74 79 70 65 20 69 64 78 6c 69 73  );}.%type idxlis
a1c0: 74 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a  t_opt {ExprList*
a1d0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69 64  }.%destructor id
a1e0: 78 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74  xlist_opt {sqlit
a1f0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
a200: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
a210: 3b 7d 0a 0a 69 64 78 6c 69 73 74 5f 6f 70 74 28  ;}..idxlist_opt(
a220: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
a230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a240: 20 7b 41 20 3d 20 30 3b 7d 0a 69 64 78 6c 69 73   {A = 0;}.idxlis
a250: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20  t_opt(A) ::= LP 
a260: 69 64 78 6c 69 73 74 28 58 29 20 52 50 2e 20 20  idxlist(X) RP.  
a270: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
a280: 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69  idxlist(A) ::= i
a290: 64 78 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20  dxlist(X) COMMA 
a2a0: 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65 28 43 29  nm(Y) collate(C)
a2b0: 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 20   sortorder(Z).  
a2c0: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
a2d0: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
a2e0: 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
a2f0: 20 30 2c 20 26 43 29 3b 0a 20 20 41 20 3d 20 73   0, &C);.  A = s
a300: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
a310: 70 65 6e 64 28 70 50 61 72 73 65 2c 58 2c 20 70  pend(pParse,X, p
a320: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
a330: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
a340: 73 65 2c 41 2c 26 59 2c 31 29 3b 0a 20 20 73 71  se,A,&Y,1);.  sq
a350: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
a360: 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c  ckLength(pParse,
a370: 20 41 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20   A, "index");.  
a380: 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e  if( A ) A->a[A->
a390: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
a3a0: 65 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 69 64  er = (u8)Z;.}.id
a3b0: 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28  xlist(A) ::= nm(
a3c0: 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f  Y) collate(C) so
a3d0: 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20  rtorder(Z). {.  
a3e0: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
a3f0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
a400: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  oken(pParse, 0, 
a410: 26 43 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74  &C);.  A = sqlit
a420: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
a430: 28 70 50 61 72 73 65 2c 30 2c 20 70 29 3b 0a 20  (pParse,0, p);. 
a440: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
a450: 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
a460: 41 2c 20 26 59 2c 20 31 29 3b 0a 20 20 73 71 6c  A, &Y, 1);.  sql
a470: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
a480: 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20  kLength(pParse, 
a490: 41 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 69  A, "index");.  i
a4a0: 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e  f( A ) A->a[A->n
a4b0: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
a4c0: 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 0a 25 74  r = (u8)Z;.}..%t
a4d0: 79 70 65 20 63 6f 6c 6c 61 74 65 20 7b 54 6f 6b  ype collate {Tok
a4e0: 65 6e 7d 0a 63 6f 6c 6c 61 74 65 28 43 29 20 3a  en}.collate(C) :
a4f0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
a500: 20 20 20 20 20 7b 43 2e 7a 20 3d 20 30 3b 20 43       {C.z = 0; C
a510: 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c 6c 61 74 65  .n = 0;}.collate
a520: 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20  (C) ::= COLLATE 
a530: 69 64 73 28 58 29 2e 20 20 20 7b 43 20 3d 20 58  ids(X).   {C = X
a540: 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}...///////////
a550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a560: 2f 2f 20 54 68 65 20 44 52 4f 50 20 49 4e 44 45  // The DROP INDE
a570: 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  X command //////
a580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a590: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44  ///.//.cmd ::= D
a5a0: 52 4f 50 20 49 4e 44 45 58 20 69 66 65 78 69 73  ROP INDEX ifexis
a5b0: 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58  ts(E) fullname(X
a5c0: 29 2e 20 20 20 7b 73 71 6c 69 74 65 33 44 72 6f  ).   {sqlite3Dro
a5d0: 70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 58  pIndex(pParse, X
a5e0: 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  , E);}..////////
a5f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a600: 2f 2f 2f 2f 2f 20 54 68 65 20 56 41 43 55 55 4d  ///// The VACUUM
a610: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
a620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a630: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65  //////.//.%ifnde
a640: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
a650: 43 55 55 4d 0a 25 69 66 6e 64 65 66 20 53 51 4c  CUUM.%ifndef SQL
a660: 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a  ITE_OMIT_ATTACH.
a670: 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d 2e 20  cmd ::= VACUUM. 
a680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
a690: 73 71 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50  sqlite3Vacuum(pP
a6a0: 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  arse);}.cmd ::= 
a6b0: 56 41 43 55 55 4d 20 6e 6d 2e 20 20 20 20 20 20  VACUUM nm.      
a6c0: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56         {sqlite3V
a6d0: 61 63 75 75 6d 28 70 50 61 72 73 65 29 3b 7d 0a  acuum(pParse);}.
a6e0: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
a6f0: 4d 49 54 5f 41 54 54 41 43 48 0a 25 65 6e 64 69  MIT_ATTACH.%endi
a700: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  f  SQLITE_OMIT_V
a710: 41 43 55 55 4d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  ACUUM../////////
a720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a730: 2f 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d 41 20  //// The PRAGMA 
a740: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
a750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a760: 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66  /////.//.%ifndef
a770: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41   SQLITE_OMIT_PRA
a780: 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  GMA.cmd ::= PRAG
a790: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
a7a0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a7b0: 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28   {sqlite3Pragma(
a7c0: 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 30 2c 30  pParse,&X,&Z,0,0
a7d0: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  );}.cmd ::= PRAG
a7e0: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
a7f0: 20 45 51 20 6e 6d 6e 75 6d 28 59 29 2e 20 20 20   EQ nmnum(Y).   
a800: 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28   {sqlite3Pragma(
a810: 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c  pParse,&X,&Z,&Y,
a820: 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  0);}.cmd ::= PRA
a830: 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a  GMA nm(X) dbnm(Z
a840: 29 20 4c 50 20 6e 6d 6e 75 6d 28 59 29 20 52 50  ) LP nmnum(Y) RP
a850: 2e 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61  . {sqlite3Pragma
a860: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59  (pParse,&X,&Z,&Y
a870: 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52  ,0);}.cmd ::= PR
a880: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
a890: 5a 29 20 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28  Z) EQ minus_num(
a8a0: 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20  Y). .           
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8d0: 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61    {sqlite3Pragma
a8e0: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59  (pParse,&X,&Z,&Y
a8f0: 2c 31 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52  ,1);}.cmd ::= PR
a900: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
a910: 5a 29 20 4c 50 20 6d 69 6e 75 73 5f 6e 75 6d 28  Z) LP minus_num(
a920: 59 29 20 52 50 2e 0a 20 20 20 20 20 20 20 20 20  Y) RP..         
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 7b 73 71 6c 69 74 65 33 50 72 61 67      {sqlite3Prag
a960: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
a970: 26 59 2c 31 29 3b 7d 0a 0a 6e 6d 6e 75 6d 28 41  &Y,1);}..nmnum(A
a980: 29 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d 28 58  ) ::= plus_num(X
a990: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ).             {
a9a0: 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29  A = X;}.nmnum(A)
a9b0: 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20 20 20 20   ::= nm(X).     
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
a9d0: 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20   = X;}.nmnum(A) 
a9e0: 3a 3a 3d 20 4f 4e 28 58 29 2e 20 20 20 20 20 20  ::= ON(X).      
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
aa00: 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a  = X;}.nmnum(A) :
aa10: 3a 3d 20 44 45 4c 45 54 45 28 58 29 2e 20 20 20  := DELETE(X).   
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
aa30: 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a   X;}.nmnum(A) ::
aa40: 3d 20 44 45 46 41 55 4c 54 28 58 29 2e 20 20 20  = DEFAULT(X).   
aa50: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
aa60: 58 3b 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54  X;}.%endif SQLIT
aa70: 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 70 6c  E_OMIT_PRAGMA.pl
aa80: 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 50 4c  us_num(A) ::= PL
aa90: 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20  US number(X).   
aaa0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 70 6c 75      {A = X;}.plu
aab0: 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 6e 75 6d  s_num(A) ::= num
aac0: 62 65 72 28 58 29 2e 20 20 20 20 20 20 20 20 20  ber(X).         
aad0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75     {A = X;}.minu
aae0: 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e  s_num(A) ::= MIN
aaf0: 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20  US number(X).   
ab00: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65    {A = X;}.numbe
ab10: 72 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52  r(A) ::= INTEGER
ab20: 7c 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 20  |FLOAT(X).      
ab30: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 2f 2f 2f   {A = X;}../////
ab40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ab50: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41  /////// The CREA
ab60: 54 45 20 54 52 49 47 47 45 52 20 63 6f 6d 6d 61  TE TRIGGER comma
ab70: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nd /////////////
ab80: 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64 65  ////////..%ifnde
ab90: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
aba0: 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20 63  IGGER..cmd ::= c
abb0: 72 65 61 74 65 6b 77 20 74 72 69 67 67 65 72 5f  reatekw trigger_
abc0: 64 65 63 6c 28 41 29 20 42 45 47 49 4e 20 74 72  decl(A) BEGIN tr
abd0: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53  igger_cmd_list(S
abe0: 29 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f  ) END(Z). {.  To
abf0: 6b 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a  ken all;.  all.z
ac00: 20 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20   = A.z;.  all.n 
ac10: 3d 20 28 69 6e 74 29 28 5a 2e 7a 20 2d 20 41 2e  = (int)(Z.z - A.
ac20: 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71 6c 69  z) + Z.n;.  sqli
ac30: 74 65 33 46 69 6e 69 73 68 54 72 69 67 67 65 72  te3FinishTrigger
ac40: 28 70 50 61 72 73 65 2c 20 53 2c 20 26 61 6c 6c  (pParse, S, &all
ac50: 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72 5f 64 65  );.}..trigger_de
ac60: 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d 70 28 54  cl(A) ::= temp(T
ac70: 29 20 54 52 49 47 47 45 52 20 69 66 6e 6f 74 65  ) TRIGGER ifnote
ac80: 78 69 73 74 73 28 4e 4f 45 52 52 29 20 6e 6d 28  xists(NOERR) nm(
ac90: 42 29 20 64 62 6e 6d 28 5a 29 20 0a 20 20 20 20  B) dbnm(Z) .    
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 43 29 20  trigger_time(C) 
acc0: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28 44 29  trigger_event(D)
acd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ace0: 20 20 20 20 20 4f 4e 20 66 75 6c 6c 6e 61 6d 65       ON fullname
acf0: 28 45 29 20 66 6f 72 65 61 63 68 5f 63 6c 61 75  (E) foreach_clau
ad00: 73 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 28 47  se when_clause(G
ad10: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 42 65  ). {.  sqlite3Be
ad20: 67 69 6e 54 72 69 67 67 65 72 28 70 50 61 72 73  ginTrigger(pPars
ad30: 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c 20 44 2e  e, &B, &Z, C, D.
ad40: 61 2c 20 44 2e 62 2c 20 45 2c 20 47 2c 20 54 2c  a, D.b, E, G, T,
ad50: 20 4e 4f 45 52 52 29 3b 0a 20 20 41 20 3d 20 28   NOERR);.  A = (
ad60: 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29 3b 0a 7d 0a 0a  Z.n==0?B:Z);.}..
ad70: 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 74 69  %type trigger_ti
ad80: 6d 65 20 7b 69 6e 74 7d 0a 74 72 69 67 67 65 72  me {int}.trigger
ad90: 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 42 45 46  _time(A) ::= BEF
ada0: 4f 52 45 2e 20 20 20 20 20 20 7b 20 41 20 3d 20  ORE.      { A = 
adb0: 54 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a 74 72 69  TK_BEFORE; }.tri
adc0: 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d  gger_time(A) ::=
add0: 20 41 46 54 45 52 2e 20 20 20 20 20 20 20 7b 20   AFTER.       { 
ade0: 41 20 3d 20 54 4b 5f 41 46 54 45 52 3b 20 20 7d  A = TK_AFTER;  }
adf0: 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29  .trigger_time(A)
ae00: 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46 2e   ::= INSTEAD OF.
ae10: 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54 45    { A = TK_INSTE
ae20: 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d  AD;}.trigger_tim
ae30: 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  e(A) ::= .      
ae40: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42        { A = TK_B
ae50: 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65 20  EFORE; }..%type 
ae60: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73  trigger_event {s
ae70: 74 72 75 63 74 20 54 72 69 67 45 76 65 6e 74 7d  truct TrigEvent}
ae80: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72 69  .%destructor tri
ae90: 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c 69  gger_event {sqli
aea0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
aeb0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e 62  pParse->db, $$.b
aec0: 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e  );}.trigger_even
aed0: 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 7c  t(A) ::= DELETE|
aee0: 49 4e 53 45 52 54 28 4f 50 29 2e 20 20 20 20 20  INSERT(OP).     
aef0: 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b 20 41 2e    {A.a = @OP; A.
af00: 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f  b = 0;}.trigger_
af10: 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44  event(A) ::= UPD
af20: 41 54 45 28 4f 50 29 2e 20 20 20 20 20 20 20 20  ATE(OP).        
af30: 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50        {A.a = @OP
af40: 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67  ; A.b = 0;}.trig
af50: 67 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d  ger_event(A) ::=
af60: 20 55 50 44 41 54 45 20 4f 46 20 69 64 6c 69 73   UPDATE OF idlis
af70: 74 28 58 29 2e 20 7b 41 2e 61 20 3d 20 54 4b 5f  t(X). {A.a = TK_
af80: 55 50 44 41 54 45 3b 20 41 2e 62 20 3d 20 58 3b  UPDATE; A.b = X;
af90: 7d 0a 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73  }..foreach_claus
afa0: 65 20 3a 3a 3d 20 2e 0a 66 6f 72 65 61 63 68 5f  e ::= ..foreach_
afb0: 63 6c 61 75 73 65 20 3a 3a 3d 20 46 4f 52 20 45  clause ::= FOR E
afc0: 41 43 48 20 52 4f 57 2e 0a 0a 25 74 79 70 65 20  ACH ROW...%type 
afd0: 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 45 78 70  when_clause {Exp
afe0: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
aff0: 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 73 71 6c  when_clause {sql
b000: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
b010: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
b020: 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20  .when_clause(A) 
b030: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
b040: 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 77 68 65    { A = 0; }.whe
b050: 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20  n_clause(A) ::= 
b060: 57 48 45 4e 20 65 78 70 72 28 58 29 2e 20 7b 20  WHEN expr(X). { 
b070: 41 20 3d 20 58 2e 70 45 78 70 72 3b 20 7d 0a 0a  A = X.pExpr; }..
b080: 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 63 6d  %type trigger_cm
b090: 64 5f 6c 69 73 74 20 7b 54 72 69 67 67 65 72 53  d_list {TriggerS
b0a0: 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  tep*}.%destructo
b0b0: 72 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  r trigger_cmd_li
b0c0: 73 74 20 7b 73 71 6c 69 74 65 33 44 65 6c 65 74  st {sqlite3Delet
b0d0: 65 54 72 69 67 67 65 72 53 74 65 70 28 70 50 61  eTriggerStep(pPa
b0e0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 74  rse->db, $$);}.t
b0f0: 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28  rigger_cmd_list(
b100: 41 29 20 3a 3a 3d 20 74 72 69 67 67 65 72 5f 63  A) ::= trigger_c
b110: 6d 64 5f 6c 69 73 74 28 59 29 20 74 72 69 67 67  md_list(Y) trigg
b120: 65 72 5f 63 6d 64 28 58 29 20 53 45 4d 49 2e 20  er_cmd(X) SEMI. 
b130: 7b 0a 20 20 61 73 73 65 72 74 28 20 59 21 3d 30  {.  assert( Y!=0
b140: 20 29 3b 0a 20 20 59 2d 3e 70 4c 61 73 74 2d 3e   );.  Y->pLast->
b150: 70 4e 65 78 74 20 3d 20 58 3b 0a 20 20 59 2d 3e  pNext = X;.  Y->
b160: 70 4c 61 73 74 20 3d 20 58 3b 0a 20 20 41 20 3d  pLast = X;.  A =
b170: 20 59 3b 0a 7d 0a 74 72 69 67 67 65 72 5f 63 6d   Y;.}.trigger_cm
b180: 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72  d_list(A) ::= tr
b190: 69 67 67 65 72 5f 63 6d 64 28 58 29 20 53 45 4d  igger_cmd(X) SEM
b1a0: 49 2e 20 7b 20 0a 20 20 61 73 73 65 72 74 28 20  I. { .  assert( 
b1b0: 58 21 3d 30 20 29 3b 0a 20 20 58 2d 3e 70 4c 61  X!=0 );.  X->pLa
b1c0: 73 74 20 3d 20 58 3b 0a 20 20 41 20 3d 20 58 3b  st = X;.  A = X;
b1d0: 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c 6f 77 20  .}..// Disallow 
b1e0: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
b1f0: 6e 61 6d 65 73 20 6f 6e 20 49 4e 53 45 52 54 2c  names on INSERT,
b200: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c   UPDATE, and DEL
b210: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 0a 2f  ETE statements./
b220: 2f 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  / within a trigg
b230: 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65 20 74  er.  The table t
b240: 6f 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  o INSERT, UPDATE
b250: 2c 20 6f 72 20 44 45 4c 45 54 45 20 69 73 20 61  , or DELETE is a
b260: 6c 77 61 79 73 20 69 6e 20 0a 2f 2f 20 74 68 65  lways in .// the
b270: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 61   same database a
b280: 73 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  s the table that
b290: 20 74 68 65 20 74 72 69 67 67 65 72 20 66 69 72   the trigger fir
b2a0: 65 73 20 6f 6e 2e 0a 2f 2f 0a 25 74 79 70 65 20  es on..//.%type 
b2b0: 74 72 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 74 72 6e  trnm {Token}.trn
b2c0: 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20  m(A) ::= nm(X). 
b2d0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 74 72 6e 6d 28    {A = X;}.trnm(
b2e0: 41 29 20 3a 3a 3d 20 6e 6d 20 44 4f 54 20 6e 6d  A) ::= nm DOT nm
b2f0: 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 58 3b 0a  (X). {.  A = X;.
b300: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b310: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
b320: 20 20 20 22 71 75 61 6c 69 66 69 65 64 20 74 61     "qualified ta
b330: 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20 6e 6f  ble names are no
b340: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 49 4e 53  t allowed on INS
b350: 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64  ERT, UPDATE, and
b360: 20 44 45 4c 45 54 45 20 22 0a 20 20 20 20 20 20   DELETE ".      
b370: 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20 77 69    "statements wi
b380: 74 68 69 6e 20 74 72 69 67 67 65 72 73 22 29 3b  thin triggers");
b390: 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c 6f 77 20  .}..// Disallow 
b3a0: 74 68 65 20 49 4e 44 45 58 20 42 59 20 61 6e 64  the INDEX BY and
b3b0: 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61   NOT INDEXED cla
b3c0: 75 73 65 73 20 6f 6e 20 55 50 44 41 54 45 20 61  uses on UPDATE a
b3d0: 6e 64 20 44 45 4c 45 54 45 0a 2f 2f 20 73 74 61  nd DELETE.// sta
b3e0: 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e 20 74  tements within t
b3f0: 72 69 67 67 65 72 73 2e 20 20 57 65 20 6d 61 6b  riggers.  We mak
b400: 65 20 61 20 73 70 65 63 69 66 69 63 20 65 72 72  e a specific err
b410: 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74  or message for t
b420: 68 69 73 0a 2f 2f 20 73 69 6e 63 65 20 69 74 20  his.// since it 
b430: 69 73 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  is an exception 
b440: 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74 20 67  to the default g
b450: 72 61 6d 6d 61 72 20 72 75 6c 65 73 2e 0a 2f 2f  rammar rules..//
b460: 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20 2e 0a 74  .tridxby ::= ..t
b470: 72 69 64 78 62 79 20 3a 3a 3d 20 49 4e 44 45 58  ridxby ::= INDEX
b480: 45 44 20 42 59 20 6e 6d 2e 20 7b 0a 20 20 73 71  ED BY nm. {.  sq
b490: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b4a0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 74  arse,.        "t
b4b0: 68 65 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  he INDEXED BY cl
b4c0: 61 75 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ause is not allo
b4d0: 77 65 64 20 6f 6e 20 55 50 44 41 54 45 20 6f 72  wed on UPDATE or
b4e0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
b4f0: 74 73 20 22 0a 20 20 20 20 20 20 20 20 22 77 69  ts ".        "wi
b500: 74 68 69 6e 20 74 72 69 67 67 65 72 73 22 29 3b  thin triggers");
b510: 0a 7d 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20 4e  .}.tridxby ::= N
b520: 4f 54 20 49 4e 44 45 58 45 44 2e 20 7b 0a 20 20  OT INDEXED. {.  
b530: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b540: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
b550: 22 74 68 65 20 4e 4f 54 20 49 4e 44 45 58 45 44  "the NOT INDEXED
b560: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
b570: 6c 6c 6f 77 65 64 20 6f 6e 20 55 50 44 41 54 45  llowed on UPDATE
b580: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
b590: 6d 65 6e 74 73 20 22 0a 20 20 20 20 20 20 20 20  ments ".        
b5a0: 22 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73  "within triggers
b5b0: 22 29 3b 0a 7d 0a 0a 0a 0a 25 74 79 70 65 20 74  ");.}....%type t
b5c0: 72 69 67 67 65 72 5f 63 6d 64 20 7b 54 72 69 67  rigger_cmd {Trig
b5d0: 67 65 72 53 74 65 70 2a 7d 0a 25 64 65 73 74 72  gerStep*}.%destr
b5e0: 75 63 74 6f 72 20 74 72 69 67 67 65 72 5f 63 6d  uctor trigger_cm
b5f0: 64 20 7b 73 71 6c 69 74 65 33 44 65 6c 65 74 65  d {sqlite3Delete
b600: 54 72 69 67 67 65 72 53 74 65 70 28 70 50 61 72  TriggerStep(pPar
b610: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 2f 2f  se->db, $$);}.//
b620: 20 55 50 44 41 54 45 20 0a 74 72 69 67 67 65 72   UPDATE .trigger
b630: 5f 63 6d 64 28 41 29 20 3a 3a 3d 0a 20 20 20 55  _cmd(A) ::=.   U
b640: 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20  PDATE orconf(R) 
b650: 74 72 6e 6d 28 58 29 20 74 72 69 64 78 62 79 20  trnm(X) tridxby 
b660: 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 20 77  SET setlist(Y) w
b670: 68 65 72 65 5f 6f 70 74 28 5a 29 2e 20 20 0a 20  here_opt(Z).  . 
b680: 20 20 7b 20 41 20 3d 20 73 71 6c 69 74 65 33 54    { A = sqlite3T
b690: 72 69 67 67 65 72 55 70 64 61 74 65 53 74 65 70  riggerUpdateStep
b6a0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58 2c  (pParse->db, &X,
b6b0: 20 59 2c 20 5a 2c 20 52 29 3b 20 7d 0a 0a 2f 2f   Y, Z, R); }..//
b6c0: 20 49 4e 53 45 52 54 0a 74 72 69 67 67 65 72 5f   INSERT.trigger_
b6d0: 63 6d 64 28 41 29 20 3a 3a 3d 0a 20 20 20 69 6e  cmd(A) ::=.   in
b6e0: 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f  sert_cmd(R) INTO
b6f0: 20 74 72 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c   trnm(X) inscoll
b700: 69 73 74 5f 6f 70 74 28 46 29 20 76 61 6c 75 65  ist_opt(F) value
b710: 6c 69 73 74 28 59 29 2e 0a 20 20 20 7b 41 20 3d  list(Y)..   {A =
b720: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 49   sqlite3TriggerI
b730: 6e 73 65 72 74 53 74 65 70 28 70 50 61 72 73 65  nsertStep(pParse
b740: 2d 3e 64 62 2c 20 26 58 2c 20 46 2c 20 59 2e 70  ->db, &X, F, Y.p
b750: 4c 69 73 74 2c 20 59 2e 70 53 65 6c 65 63 74 2c  List, Y.pSelect,
b760: 20 52 29 3b 7d 0a 0a 74 72 69 67 67 65 72 5f 63   R);}..trigger_c
b770: 6d 64 28 41 29 20 3a 3a 3d 20 69 6e 73 65 72 74  md(A) ::= insert
b780: 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 74 72 6e  _cmd(R) INTO trn
b790: 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f  m(X) inscollist_
b7a0: 6f 70 74 28 46 29 20 73 65 6c 65 63 74 28 53 29  opt(F) select(S)
b7b0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
b7c0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69   {A = sqlite3Tri
b7d0: 67 67 65 72 49 6e 73 65 72 74 53 74 65 70 28 70  ggerInsertStep(p
b7e0: 50 61 72 73 65 2d 3e 64 62 2c 20 26 58 2c 20 46  Parse->db, &X, F
b7f0: 2c 20 30 2c 20 53 2c 20 52 29 3b 7d 0a 0a 2f 2f  , 0, S, R);}..//
b800: 20 44 45 4c 45 54 45 0a 74 72 69 67 67 65 72 5f   DELETE.trigger_
b810: 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54  cmd(A) ::= DELET
b820: 45 20 46 52 4f 4d 20 74 72 6e 6d 28 58 29 20 74  E FROM trnm(X) t
b830: 72 69 64 78 62 79 20 77 68 65 72 65 5f 6f 70 74  ridxby where_opt
b840: 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (Y)..           
b850: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33      {A = sqlite3
b860: 54 72 69 67 67 65 72 44 65 6c 65 74 65 53 74 65  TriggerDeleteSte
b870: 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58  p(pParse->db, &X
b880: 2c 20 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45 43  , Y);}..// SELEC
b890: 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29  T.trigger_cmd(A)
b8a0: 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20   ::= select(X). 
b8b0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69   {A = sqlite3Tri
b8c0: 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28 70  ggerSelectStep(p
b8d0: 50 61 72 73 65 2d 3e 64 62 2c 20 58 29 3b 20 7d  Parse->db, X); }
b8e0: 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63 69 61 6c  ..// The special
b8f0: 20 52 41 49 53 45 20 65 78 70 72 65 73 73 69 6f   RAISE expressio
b900: 6e 20 74 68 61 74 20 6d 61 79 20 6f 63 63 75 72  n that may occur
b910: 20 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f 67   in trigger prog
b920: 72 61 6d 73 0a 65 78 70 72 28 41 29 20 3a 3a 3d  rams.expr(A) ::=
b930: 20 52 41 49 53 45 28 58 29 20 4c 50 20 49 47 4e   RAISE(X) LP IGN
b940: 4f 52 45 20 52 50 28 59 29 2e 20 20 7b 0a 20 20  ORE RP(Y).  {.  
b950: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
b960: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
b970: 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30 2c 20 30  K_RAISE, 0, 0, 0
b980: 29 3b 20 0a 20 20 69 66 28 20 41 2e 70 45 78 70  ); .  if( A.pExp
b990: 72 20 29 7b 0a 20 20 20 20 41 2e 70 45 78 70 72  r ){.    A.pExpr
b9a0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 4f 45 5f  ->affinity = OE_
b9b0: 49 67 6e 6f 72 65 3b 0a 20 20 7d 0a 20 20 41 2e  Ignore;.  }.  A.
b9c0: 7a 53 74 61 72 74 20 3d 20 58 2e 7a 3b 0a 20 20  zStart = X.z;.  
b9d0: 41 2e 7a 45 6e 64 20 3d 20 26 59 2e 7a 5b 59 2e  A.zEnd = &Y.z[Y.
b9e0: 6e 5d 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  n];.}.expr(A) ::
b9f0: 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 72 61  = RAISE(X) LP ra
ba00: 69 73 65 74 79 70 65 28 54 29 20 43 4f 4d 4d 41  isetype(T) COMMA
ba10: 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20 20 7b   nm(Z) RP(Y).  {
ba20: 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c  .  A.pExpr = sql
ba30: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
ba40: 2c 20 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30  , TK_RAISE, 0, 0
ba50: 2c 20 26 5a 29 3b 20 0a 20 20 69 66 28 20 41 2e  , &Z); .  if( A.
ba60: 70 45 78 70 72 20 29 20 7b 0a 20 20 20 20 41 2e  pExpr ) {.    A.
ba70: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
ba80: 3d 20 28 63 68 61 72 29 54 3b 0a 20 20 7d 0a 20  = (char)T;.  }. 
ba90: 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 3b   A.zStart = X.z;
baa0: 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26 59 2e 7a  .  A.zEnd = &Y.z
bab0: 5b 59 2e 6e 5d 3b 0a 7d 0a 25 65 6e 64 69 66 20  [Y.n];.}.%endif 
bac0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
bad0: 49 47 47 45 52 0a 0a 25 74 79 70 65 20 72 61 69  IGGER..%type rai
bae0: 73 65 74 79 70 65 20 7b 69 6e 74 7d 0a 72 61 69  setype {int}.rai
baf0: 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52 4f  setype(A) ::= RO
bb00: 4c 4c 42 41 43 4b 2e 20 20 7b 41 20 3d 20 4f 45  LLBACK.  {A = OE
bb10: 5f 52 6f 6c 6c 62 61 63 6b 3b 7d 0a 72 61 69 73  _Rollback;}.rais
bb20: 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 41 42 4f  etype(A) ::= ABO
bb30: 52 54 2e 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f  RT.     {A = OE_
bb40: 41 62 6f 72 74 3b 7d 0a 72 61 69 73 65 74 79 70  Abort;}.raisetyp
bb50: 65 28 41 29 20 3a 3a 3d 20 46 41 49 4c 2e 20 20  e(A) ::= FAIL.  
bb60: 20 20 20 20 7b 41 20 3d 20 4f 45 5f 46 61 69 6c      {A = OE_Fail
bb70: 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}...///////////
bb80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 20 44  /////////////  D
bb90: 52 4f 50 20 54 52 49 47 47 45 52 20 73 74 61 74  ROP TRIGGER stat
bba0: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
bbb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bbc0: 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c  ////.%ifndef SQL
bbd0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
bbe0: 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 52  .cmd ::= DROP TR
bbf0: 49 47 47 45 52 20 69 66 65 78 69 73 74 73 28 4e  IGGER ifexists(N
bc00: 4f 45 52 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58  OERR) fullname(X
bc10: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72  ). {.  sqlite3Dr
bc20: 6f 70 54 72 69 67 67 65 72 28 70 50 61 72 73 65  opTrigger(pParse
bc30: 2c 58 2c 4e 4f 45 52 52 29 3b 0a 7d 0a 25 65 6e  ,X,NOERR);.}.%en
bc40: 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f 4d 49  dif  !SQLITE_OMI
bc50: 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2f 2f 2f 2f  T_TRIGGER../////
bc60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bc70: 2f 2f 2f 20 41 54 54 41 43 48 20 44 41 54 41 42  /// ATTACH DATAB
bc80: 41 53 45 20 66 69 6c 65 20 41 53 20 6e 61 6d 65  ASE file AS name
bc90: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
bca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
bcb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
bcc0: 54 54 41 43 48 0a 63 6d 64 20 3a 3a 3d 20 41 54  TTACH.cmd ::= AT
bcd0: 54 41 43 48 20 64 61 74 61 62 61 73 65 5f 6b 77  TACH database_kw
bce0: 5f 6f 70 74 20 65 78 70 72 28 46 29 20 41 53 20  _opt expr(F) AS 
bcf0: 65 78 70 72 28 44 29 20 6b 65 79 5f 6f 70 74 28  expr(D) key_opt(
bd00: 4b 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 41  K). {.  sqlite3A
bd10: 74 74 61 63 68 28 70 50 61 72 73 65 2c 20 46 2e  ttach(pParse, F.
bd20: 70 45 78 70 72 2c 20 44 2e 70 45 78 70 72 2c 20  pExpr, D.pExpr, 
bd30: 4b 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44 45  K);.}.cmd ::= DE
bd40: 54 41 43 48 20 64 61 74 61 62 61 73 65 5f 6b 77  TACH database_kw
bd50: 5f 6f 70 74 20 65 78 70 72 28 44 29 2e 20 7b 0a  _opt expr(D). {.
bd60: 20 20 73 71 6c 69 74 65 33 44 65 74 61 63 68 28    sqlite3Detach(
bd70: 70 50 61 72 73 65 2c 20 44 2e 70 45 78 70 72 29  pParse, D.pExpr)
bd80: 3b 0a 7d 0a 0a 25 74 79 70 65 20 6b 65 79 5f 6f  ;.}..%type key_o
bd90: 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pt {Expr*}.%dest
bda0: 72 75 63 74 6f 72 20 6b 65 79 5f 6f 70 74 20 7b  ructor key_opt {
bdb0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
bdc0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
bdd0: 29 3b 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20 3a  );}.key_opt(A) :
bde0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
bdf0: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 30           { A = 0
be00: 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20 3a  ; }.key_opt(A) :
be10: 3a 3d 20 4b 45 59 20 65 78 70 72 28 58 29 2e 20  := KEY expr(X). 
be20: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 58           { A = X
be30: 2e 70 45 78 70 72 3b 20 7d 0a 0a 64 61 74 61 62  .pExpr; }..datab
be40: 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 44  ase_kw_opt ::= D
be50: 41 54 41 42 41 53 45 2e 0a 64 61 74 61 62 61 73  ATABASE..databas
be60: 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 25  e_kw_opt ::= ..%
be70: 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  endif SQLITE_OMI
be80: 54 5f 41 54 54 41 43 48 0a 0a 2f 2f 2f 2f 2f 2f  T_ATTACH..//////
be90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bea0: 2f 2f 2f 2f 20 52 45 49 4e 44 45 58 20 63 6f 6c  //// REINDEX col
beb0: 6c 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  lation /////////
bec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bed0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65  /////////.%ifnde
bee0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
bef0: 49 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d 20 52 45  INDEX.cmd ::= RE
bf00: 49 4e 44 45 58 2e 20 20 20 20 20 20 20 20 20 20  INDEX.          
bf10: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 52 65        {sqlite3Re
bf20: 69 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c  index(pParse, 0,
bf30: 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 45   0);}.cmd ::= RE
bf40: 49 4e 44 45 58 20 6e 6d 28 58 29 20 64 62 6e 6d  INDEX nm(X) dbnm
bf50: 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 52 65  (Y).  {sqlite3Re
bf60: 69 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 58  index(pParse, &X
bf70: 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66 20 20  , &Y);}.%endif  
bf80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
bf90: 44 45 58 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  DEX..///////////
bfa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bfb0: 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4e 41 4c 59 5a 45  //////// ANALYZE
bfc0: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
bfd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bfe0: 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c  ////.%ifndef SQL
bff0: 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45  ITE_OMIT_ANALYZE
c000: 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45  .cmd ::= ANALYZE
c010: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c020: 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65   {sqlite3Analyze
c030: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b 7d  (pParse, 0, 0);}
c040: 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a 45  .cmd ::= ANALYZE
c050: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e 20   nm(X) dbnm(Y). 
c060: 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a 65   {sqlite3Analyze
c070: 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59 29  (pParse, &X, &Y)
c080: 3b 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f 2f 2f 2f  ;}.%endif../////
c090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c0a0: 2f 2f 2f 20 41 4c 54 45 52 20 54 41 42 4c 45 20  /// ALTER TABLE 
c0b0: 74 61 62 6c 65 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f  table ... //////
c0c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c0d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
c0e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c0f0: 4c 54 45 52 54 41 42 4c 45 0a 63 6d 64 20 3a 3a  LTERTABLE.cmd ::
c100: 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20 66 75  = ALTER TABLE fu
c110: 6c 6c 6e 61 6d 65 28 58 29 20 52 45 4e 41 4d 45  llname(X) RENAME
c120: 20 54 4f 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 73   TO nm(Z). {.  s
c130: 71 6c 69 74 65 33 41 6c 74 65 72 52 65 6e 61 6d  qlite3AlterRenam
c140: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 58 2c  eTable(pParse,X,
c150: 26 5a 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 41  &Z);.}.cmd ::= A
c160: 4c 54 45 52 20 54 41 42 4c 45 20 61 64 64 5f 63  LTER TABLE add_c
c170: 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 41  olumn_fullname A
c180: 44 44 20 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20  DD kwcolumn_opt 
c190: 63 6f 6c 75 6d 6e 28 59 29 2e 20 7b 0a 20 20 73  column(Y). {.  s
c1a0: 71 6c 69 74 65 33 41 6c 74 65 72 46 69 6e 69 73  qlite3AlterFinis
c1b0: 68 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73  hAddColumn(pPars
c1c0: 65 2c 20 26 59 29 3b 0a 7d 0a 61 64 64 5f 63 6f  e, &Y);.}.add_co
c1d0: 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 3a 3a  lumn_fullname ::
c1e0: 3d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b  = fullname(X). {
c1f0: 0a 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6c  .  pParse->db->l
c200: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
c210: 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  d = 0;.  sqlite3
c220: 41 6c 74 65 72 42 65 67 69 6e 41 64 64 43 6f 6c  AlterBeginAddCol
c230: 75 6d 6e 28 70 50 61 72 73 65 2c 20 58 29 3b 0a  umn(pParse, X);.
c240: 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 3a  }.kwcolumn_opt :
c250: 3a 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70  := ..kwcolumn_op
c260: 74 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57 2e 0a  t ::= COLUMNKW..
c270: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
c280: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 0a  MIT_ALTERTABLE..
c290: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c2a0: 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54 45 20  //////// CREATE 
c2b0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 2e 2e  VIRTUAL TABLE ..
c2c0: 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  . //////////////
c2d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
c2e0: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
c2f0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
c300: 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f  .cmd ::= create_
c310: 76 74 61 62 2e 20 20 20 20 20 20 20 20 20 20 20  vtab.           
c320: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
c330: 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50 61  ite3VtabFinishPa
c340: 72 73 65 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a  rse(pParse,0);}.
c350: 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f 76  cmd ::= create_v
c360: 74 61 62 20 4c 50 20 76 74 61 62 61 72 67 6c 69  tab LP vtabargli
c370: 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c 69  st RP(X).  {sqli
c380: 74 65 33 56 74 61 62 46 69 6e 69 73 68 50 61 72  te3VtabFinishPar
c390: 73 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a  se(pParse,&X);}.
c3a0: 63 72 65 61 74 65 5f 76 74 61 62 20 3a 3a 3d 20  create_vtab ::= 
c3b0: 63 72 65 61 74 65 6b 77 20 56 49 52 54 55 41 4c  createkw VIRTUAL
c3c0: 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 73   TABLE ifnotexis
c3d0: 74 73 28 45 29 0a 20 20 20 20 20 20 20 20 20 20  ts(E).          
c3e0: 20 20 20 20 20 20 6e 6d 28 58 29 20 64 62 6e 6d        nm(X) dbnm
c3f0: 28 59 29 20 55 53 49 4e 47 20 6e 6d 28 5a 29 2e  (Y) USING nm(Z).
c400: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74   {.    sqlite3Vt
c410: 61 62 42 65 67 69 6e 50 61 72 73 65 28 70 50 61  abBeginParse(pPa
c420: 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a 2c  rse, &X, &Y, &Z,
c430: 20 45 29 3b 0a 7d 0a 76 74 61 62 61 72 67 6c 69   E);.}.vtabargli
c440: 73 74 20 3a 3a 3d 20 76 74 61 62 61 72 67 2e 0a  st ::= vtabarg..
c450: 76 74 61 62 61 72 67 6c 69 73 74 20 3a 3a 3d 20  vtabarglist ::= 
c460: 76 74 61 62 61 72 67 6c 69 73 74 20 43 4f 4d 4d  vtabarglist COMM
c470: 41 20 76 74 61 62 61 72 67 2e 0a 76 74 61 62 61  A vtabarg..vtaba
c480: 72 67 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  rg ::= .        
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
c4a0: 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 49 6e  sqlite3VtabArgIn
c4b0: 69 74 28 70 50 61 72 73 65 29 3b 7d 0a 76 74 61  it(pParse);}.vta
c4c0: 62 61 72 67 20 3a 3a 3d 20 76 74 61 62 61 72 67  barg ::= vtabarg
c4d0: 20 76 74 61 62 61 72 67 74 6f 6b 65 6e 2e 0a 76   vtabargtoken..v
c4e0: 74 61 62 61 72 67 74 6f 6b 65 6e 20 3a 3a 3d 20  tabargtoken ::= 
c4f0: 41 4e 59 28 58 29 2e 20 20 20 20 20 20 20 20 20  ANY(X).         
c500: 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41     {sqlite3VtabA
c510: 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c  rgExtend(pParse,
c520: 26 58 29 3b 7d 0a 76 74 61 62 61 72 67 74 6f 6b  &X);}.vtabargtok
c530: 65 6e 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c 69 73  en ::= lp anylis
c540: 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c 69 74  t RP(X).  {sqlit
c550: 65 33 56 74 61 62 41 72 67 45 78 74 65 6e 64 28  e3VtabArgExtend(
c560: 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 6c 70 20  pParse,&X);}.lp 
c570: 3a 3a 3d 20 4c 50 28 58 29 2e 20 20 20 20 20 20  ::= LP(X).      
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c590: 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67   {sqlite3VtabArg
c5a0: 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58  Extend(pParse,&X
c5b0: 29 3b 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20  );}.anylist ::= 
c5c0: 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61 6e  ..anylist ::= an
c5d0: 79 6c 69 73 74 20 4c 50 20 61 6e 79 6c 69 73 74  ylist LP anylist
c5e0: 20 52 50 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d   RP..anylist ::=
c5f0: 20 61 6e 79 6c 69 73 74 20 41 4e 59 2e 0a 25 65   anylist ANY..%e
c600: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
c610: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a     T_VIRTUALTABLE.