/ Hex Artifact Content
Login

Artifact 9acfcc83ddbf0cf82f0ed9582ccf0ad6c366ff37:


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 59 29 2e 20 7b 0a 20 20  t(X) RP(Y). {.  
1340: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
1350: 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b  pParse,&X,&Y,0);
1360: 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f  .}.create_table_
1370: 61 72 67 73 20 3a 3a 3d 20 41 53 20 73 65 6c 65  args ::= AS sele
1380: 63 74 28 53 29 2e 20 7b 0a 20 20 73 71 6c 69 74  ct(S). {.  sqlit
1390: 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73  e3EndTable(pPars
13a0: 65 2c 30 2c 30 2c 53 29 3b 0a 20 20 73 71 6c 69  e,0,0,S);.  sqli
13b0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
13c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 53 29 3b 0a  pParse->db, S);.
13d0: 7d 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d  }.columnlist ::=
13e0: 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d   columnlist COMM
13f0: 41 20 63 6f 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e  A column..column
1400: 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e  list ::= column.
1410: 0a 0a 2f 2f 20 41 20 22 63 6f 6c 75 6d 6e 22 20  ..// A "column" 
1420: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 64 65  is a complete de
1430: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 73  scription of a s
1440: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 69 6e 20  ingle column in 
1450: 61 0a 2f 2f 20 43 52 45 41 54 45 20 54 41 42 4c  a.// CREATE TABL
1460: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
1470: 69 73 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  is includes the 
1480: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 20 69 74 73  column name, its
1490: 0a 2f 2f 20 64 61 74 61 74 79 70 65 2c 20 61 6e  .// datatype, an
14a0: 64 20 6f 74 68 65 72 20 6b 65 79 77 6f 72 64 73  d other keywords
14b0: 20 73 75 63 68 20 61 73 20 50 52 49 4d 41 52 59   such as PRIMARY
14c0: 20 4b 45 59 2c 20 55 4e 49 51 55 45 2c 20 52 45   KEY, UNIQUE, RE
14d0: 46 45 52 45 4e 43 45 53 2c 0a 2f 2f 20 4e 4f 54  FERENCES,.// NOT
14e0: 20 4e 55 4c 4c 20 61 6e 64 20 73 6f 20 66 6f 72   NULL and so for
14f0: 74 68 2e 0a 2f 2f 0a 63 6f 6c 75 6d 6e 28 41 29  th..//.column(A)
1500: 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 69 64 28 58 29   ::= columnid(X)
1510: 20 74 79 70 65 20 63 61 72 67 6c 69 73 74 2e 20   type carglist. 
1520: 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e 7a 3b 0a 20  {.  A.z = X.z;. 
1530: 20 41 2e 6e 20 3d 20 28 69 6e 74 29 28 70 50 61   A.n = (int)(pPa
1540: 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e  rse->sLastToken.
1550: 7a 2d 58 2e 7a 29 20 2b 20 70 50 61 72 73 65 2d  z-X.z) + pParse-
1560: 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 7d  >sLastToken.n;.}
1570: 0a 63 6f 6c 75 6d 6e 69 64 28 41 29 20 3a 3a 3d  .columnid(A) ::=
1580: 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69   nm(X). {.  sqli
1590: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61  te3AddColumn(pPa
15a0: 72 73 65 2c 26 58 29 3b 0a 20 20 41 20 3d 20 58  rse,&X);.  A = X
15b0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6e 73  ;.  pParse->cons
15c0: 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20 3d 20 30  traintName.n = 0
15d0: 3b 0a 7d 0a 0a 0a 2f 2f 20 41 6e 20 49 44 45 4e  ;.}...// An IDEN
15e0: 54 49 46 49 45 52 20 63 61 6e 20 62 65 20 61 20  TIFIER can be a 
15f0: 67 65 6e 65 72 69 63 20 69 64 65 6e 74 69 66 69  generic identifi
1600: 65 72 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 73 65  er, or one of se
1610: 76 65 72 61 6c 0a 2f 2f 20 6b 65 79 77 6f 72 64  veral.// keyword
1620: 73 2e 20 20 41 6e 79 20 6e 6f 6e 2d 73 74 61 6e  s.  Any non-stan
1630: 64 61 72 64 20 6b 65 79 77 6f 72 64 20 63 61 6e  dard keyword can
1640: 20 61 6c 73 6f 20 62 65 20 61 6e 20 69 64 65 6e   also be an iden
1650: 74 69 66 69 65 72 2e 0a 2f 2f 0a 25 74 79 70 65  tifier..//.%type
1660: 20 69 64 20 7b 54 6f 6b 65 6e 7d 0a 69 64 28 41   id {Token}.id(A
1670: 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20 20 20 20  ) ::= ID(X).    
1680: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64       {A = X;}.id
1690: 28 41 29 20 3a 3a 3d 20 49 4e 44 45 58 45 44 28  (A) ::= INDEXED(
16a0: 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a  X).    {A = X;}.
16b0: 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .// The followin
16c0: 67 20 64 69 72 65 63 74 69 76 65 20 63 61 75 73  g directive caus
16d0: 65 73 20 74 6f 6b 65 6e 73 20 41 42 4f 52 54 2c  es tokens ABORT,
16e0: 20 41 46 54 45 52 2c 20 41 53 43 2c 20 65 74 63   AFTER, ASC, etc
16f0: 2e 20 74 6f 0a 2f 2f 20 66 61 6c 6c 62 61 63 6b  . to.// fallback
1700: 20 74 6f 20 49 44 20 69 66 20 74 68 65 79 20 77   to ID if they w
1710: 69 6c 6c 20 6e 6f 74 20 70 61 72 73 65 20 61 73  ill not parse as
1720: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
1730: 76 61 6c 75 65 2e 0a 2f 2f 20 54 68 69 73 20 6f  value..// This o
1740: 62 76 69 61 74 65 73 20 74 68 65 20 6e 65 65 64  bviates the need
1750: 20 66 6f 72 20 74 68 65 20 22 69 64 22 20 6e 6f   for the "id" no
1760: 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2f 2f 0a 25 66  nterminal..//.%f
1770: 61 6c 6c 62 61 63 6b 20 49 44 0a 20 20 41 42 4f  allback ID.  ABO
1780: 52 54 20 41 43 54 49 4f 4e 20 41 46 54 45 52 20  RT ACTION AFTER 
1790: 41 4e 41 4c 59 5a 45 20 41 53 43 20 41 54 54 41  ANALYZE ASC ATTA
17a0: 43 48 20 42 45 46 4f 52 45 20 42 45 47 49 4e 20  CH BEFORE BEGIN 
17b0: 42 59 20 43 41 53 43 41 44 45 20 43 41 53 54 20  BY CASCADE CAST 
17c0: 43 4f 4c 55 4d 4e 4b 57 0a 20 20 43 4f 4e 46 4c  COLUMNKW.  CONFL
17d0: 49 43 54 20 44 41 54 41 42 41 53 45 20 44 45 46  ICT DATABASE DEF
17e0: 45 52 52 45 44 20 44 45 53 43 20 44 45 54 41 43  ERRED DESC DETAC
17f0: 48 20 45 41 43 48 20 45 4e 44 20 45 58 43 4c 55  H EACH END EXCLU
1800: 53 49 56 45 20 45 58 50 4c 41 49 4e 20 46 41 49  SIVE EXPLAIN FAI
1810: 4c 20 46 4f 52 0a 20 20 49 47 4e 4f 52 45 20 49  L FOR.  IGNORE I
1820: 4d 4d 45 44 49 41 54 45 20 49 4e 49 54 49 41 4c  MMEDIATE INITIAL
1830: 4c 59 20 49 4e 53 54 45 41 44 20 4c 49 4b 45 5f  LY INSTEAD LIKE_
1840: 4b 57 20 4d 41 54 43 48 20 4e 4f 20 50 4c 41 4e  KW MATCH NO PLAN
1850: 0a 20 20 51 55 45 52 59 20 4b 45 59 20 4f 46 20  .  QUERY KEY OF 
1860: 4f 46 46 53 45 54 20 50 52 41 47 4d 41 20 52 41  OFFSET PRAGMA RA
1870: 49 53 45 20 52 45 4c 45 41 53 45 20 52 45 50 4c  ISE RELEASE REPL
1880: 41 43 45 20 52 45 53 54 52 49 43 54 20 52 4f 57  ACE RESTRICT ROW
1890: 20 52 4f 4c 4c 42 41 43 4b 0a 20 20 53 41 56 45   ROLLBACK.  SAVE
18a0: 50 4f 49 4e 54 20 54 45 4d 50 20 54 52 49 47 47  POINT TEMP TRIGG
18b0: 45 52 20 56 41 43 55 55 4d 20 56 49 45 57 20 56  ER VACUUM VIEW V
18c0: 49 52 54 55 41 4c 0a 25 69 66 64 65 66 20 53 51  IRTUAL.%ifdef SQ
18d0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
18e0: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 45 58 43 45  ND_SELECT.  EXCE
18f0: 50 54 20 49 4e 54 45 52 53 45 43 54 20 55 4e 49  PT INTERSECT UNI
1900: 4f 4e 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45  ON.%endif SQLITE
1910: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
1920: 45 4c 45 43 54 0a 20 20 52 45 49 4e 44 45 58 20  ELECT.  REINDEX 
1930: 52 45 4e 41 4d 45 20 43 54 49 4d 45 5f 4b 57 20  RENAME CTIME_KW 
1940: 49 46 0a 20 20 2e 0a 25 77 69 6c 64 63 61 72 64  IF.  ..%wildcard
1950: 20 41 4e 59 2e 0a 0a 2f 2f 20 44 65 66 69 6e 65   ANY...// Define
1960: 20 6f 70 65 72 61 74 6f 72 20 70 72 65 63 65 64   operator preced
1970: 65 6e 63 65 20 65 61 72 6c 79 20 73 6f 20 74 68  ence early so th
1980: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 66  at this is the f
1990: 69 72 73 74 20 6f 63 63 75 72 72 65 6e 63 65 0a  irst occurrence.
19a0: 2f 2f 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74  // of the operat
19b0: 6f 72 20 74 6f 6b 65 6e 73 20 69 6e 20 74 68 65  or tokens in the
19c0: 20 67 72 61 6d 6d 65 72 2e 20 20 4b 65 65 70 69   grammer.  Keepi
19d0: 6e 67 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73  ng the operators
19e0: 20 74 6f 67 65 74 68 65 72 0a 2f 2f 20 63 61 75   together.// cau
19f0: 73 65 73 20 74 68 65 6d 20 74 6f 20 62 65 20 61  ses them to be a
1a00: 73 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  ssigned integer 
1a10: 76 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20  values that are 
1a20: 63 6c 6f 73 65 20 74 6f 67 65 74 68 65 72 2c 0a  close together,.
1a30: 2f 2f 20 77 68 69 63 68 20 6b 65 65 70 73 20 70  // which keeps p
1a40: 61 72 73 65 72 20 74 61 62 6c 65 73 20 73 6d 61  arser tables sma
1a50: 6c 6c 65 72 2e 0a 2f 2f 0a 2f 2f 20 54 68 65 20  ller..//.// The 
1a60: 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 61 73 73  token values ass
1a70: 69 67 6e 65 64 20 74 6f 20 74 68 65 73 65 20 73  igned to these s
1a80: 79 6d 62 6f 6c 73 20 69 73 20 64 65 74 65 72 6d  ymbols is determ
1a90: 69 6e 65 64 20 62 79 20 74 68 65 20 6f 72 64 65  ined by the orde
1aa0: 72 0a 2f 2f 20 69 6e 20 77 68 69 63 68 20 6c 65  r.// in which le
1ab0: 6d 6f 6e 20 66 69 72 73 74 20 73 65 65 73 20 74  mon first sees t
1ac0: 68 65 6d 2e 20 20 49 74 20 6d 75 73 74 20 62 65  hem.  It must be
1ad0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 49   the case that I
1ae0: 53 4e 55 4c 4c 2f 4e 4f 54 4e 55 4c 4c 2c 0a 2f  SNULL/NOTNULL,./
1af0: 2f 20 4e 45 2f 45 51 2c 20 47 54 2f 4c 45 2c 20  / NE/EQ, GT/LE, 
1b00: 61 6e 64 20 47 45 2f 4c 54 20 61 72 65 20 73 65  and GE/LT are se
1b10: 70 61 72 61 74 65 64 20 62 79 20 6f 6e 6c 79 20  parated by only 
1b20: 61 20 73 69 6e 67 6c 65 20 76 61 6c 75 65 2e 20  a single value. 
1b30: 20 53 65 65 0a 2f 2f 20 74 68 65 20 73 71 6c 69   See.// the sqli
1b40: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 29  te3ExprIfFalse()
1b50: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
1b60: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1b70: 69 6f 6e 20 6f 6e 20 74 68 69 73 0a 2f 2f 20 63  ion on this.// c
1b80: 6f 6e 73 74 72 61 69 6e 74 2e 0a 2f 2f 0a 25 6c  onstraint..//.%l
1b90: 65 66 74 20 4f 52 2e 0a 25 6c 65 66 74 20 41 4e  eft OR..%left AN
1ba0: 44 2e 0a 25 72 69 67 68 74 20 4e 4f 54 2e 0a 25  D..%right NOT..%
1bb0: 6c 65 66 74 20 49 53 20 4d 41 54 43 48 20 4c 49  left IS MATCH LI
1bc0: 4b 45 5f 4b 57 20 42 45 54 57 45 45 4e 20 49 4e  KE_KW BETWEEN IN
1bd0: 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20   ISNULL NOTNULL 
1be0: 4e 45 20 45 51 2e 0a 25 6c 65 66 74 20 47 54 20  NE EQ..%left GT 
1bf0: 4c 45 20 4c 54 20 47 45 2e 0a 25 72 69 67 68 74  LE LT GE..%right
1c00: 20 45 53 43 41 50 45 2e 0a 25 6c 65 66 74 20 42   ESCAPE..%left B
1c10: 49 54 41 4e 44 20 42 49 54 4f 52 20 4c 53 48 49  ITAND BITOR LSHI
1c20: 46 54 20 52 53 48 49 46 54 2e 0a 25 6c 65 66 74  FT RSHIFT..%left
1c30: 20 50 4c 55 53 20 4d 49 4e 55 53 2e 0a 25 6c 65   PLUS MINUS..%le
1c40: 66 74 20 53 54 41 52 20 53 4c 41 53 48 20 52 45  ft STAR SLASH RE
1c50: 4d 2e 0a 25 6c 65 66 74 20 43 4f 4e 43 41 54 2e  M..%left CONCAT.
1c60: 0a 25 6c 65 66 74 20 43 4f 4c 4c 41 54 45 2e 0a  .%left COLLATE..
1c70: 25 72 69 67 68 74 20 42 49 54 4e 4f 54 2e 0a 0a  %right BITNOT...
1c80: 2f 2f 20 41 6e 64 20 22 69 64 73 22 20 69 73 20  // And "ids" is 
1c90: 61 6e 20 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d  an identifer-or-
1ca0: 73 74 72 69 6e 67 2e 0a 2f 2f 0a 25 74 79 70 65  string..//.%type
1cb0: 20 69 64 73 20 7b 54 6f 6b 65 6e 7d 0a 69 64 73   ids {Token}.ids
1cc0: 28 41 29 20 3a 3a 3d 20 49 44 7c 53 54 52 49 4e  (A) ::= ID|STRIN
1cd0: 47 28 58 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d  G(X).   {A = X;}
1ce0: 0a 0a 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f 66  ..// The name of
1cf0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 72 20 74 61 62   a column or tab
1d00: 6c 65 20 63 61 6e 20 62 65 20 61 6e 79 20 6f 66  le can be any of
1d10: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
1d20: 2f 2f 0a 25 74 79 70 65 20 6e 6d 20 7b 54 6f 6b  //.%type nm {Tok
1d30: 65 6e 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 69 64  en}.nm(A) ::= id
1d40: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
1d50: 3d 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20  = X;}.nm(A) ::= 
1d60: 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20 20 7b  STRING(X).     {
1d70: 41 20 3d 20 58 3b 7d 0a 6e 6d 28 41 29 20 3a 3a  A = X;}.nm(A) ::
1d80: 3d 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20  = JOIN_KW(X).   
1d90: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 41 20   {A = X;}..// A 
1da0: 74 79 70 65 74 6f 6b 65 6e 20 69 73 20 72 65 61  typetoken is rea
1db0: 6c 6c 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  lly one or more 
1dc0: 74 6f 6b 65 6e 73 20 74 68 61 74 20 66 6f 72 6d  tokens that form
1dd0: 20 61 20 74 79 70 65 20 6e 61 6d 65 20 73 75 63   a type name suc
1de0: 68 0a 2f 2f 20 61 73 20 63 61 6e 20 62 65 20 66  h.// as can be f
1df0: 6f 75 6e 64 20 61 66 74 65 72 20 74 68 65 20 63  ound after the c
1e00: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 6e 20 61 20  olumn name in a 
1e10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
1e20: 74 65 6d 65 6e 74 2e 0a 2f 2f 20 4d 75 6c 74 69  tement..// Multi
1e30: 70 6c 65 20 74 6f 6b 65 6e 73 20 61 72 65 20 63  ple tokens are c
1e40: 6f 6e 63 61 74 65 6e 61 74 65 64 20 74 6f 20 66  oncatenated to f
1e50: 6f 72 6d 20 74 68 65 20 76 61 6c 75 65 20 6f 66  orm the value of
1e60: 20 74 68 65 20 74 79 70 65 74 6f 6b 65 6e 2e 0a   the typetoken..
1e70: 2f 2f 0a 25 74 79 70 65 20 74 79 70 65 74 6f 6b  //.%type typetok
1e80: 65 6e 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 20  en {Token}.type 
1e90: 3a 3a 3d 20 2e 0a 74 79 70 65 20 3a 3a 3d 20 74  ::= ..type ::= t
1ea0: 79 70 65 74 6f 6b 65 6e 28 58 29 2e 20 20 20 20  ypetoken(X).    
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
1ec0: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
1ed0: 54 79 70 65 28 70 50 61 72 73 65 2c 26 58 29 3b  Type(pParse,&X);
1ee0: 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a  }.typetoken(A) :
1ef0: 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 2e 20  := typename(X). 
1f00: 20 20 7b 41 20 3d 20 58 3b 7d 0a 74 79 70 65 74    {A = X;}.typet
1f10: 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79 70 65  oken(A) ::= type
1f20: 6e 61 6d 65 28 58 29 20 4c 50 20 73 69 67 6e 65  name(X) LP signe
1f30: 64 20 52 50 28 59 29 2e 20 7b 0a 20 20 41 2e 7a  d RP(Y). {.  A.z
1f40: 20 3d 20 58 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20   = X.z;.  A.n = 
1f50: 28 69 6e 74 29 28 26 59 2e 7a 5b 59 2e 6e 5d 20  (int)(&Y.z[Y.n] 
1f60: 2d 20 58 2e 7a 29 3b 0a 7d 0a 74 79 70 65 74 6f  - X.z);.}.typeto
1f70: 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e  ken(A) ::= typen
1f80: 61 6d 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64  ame(X) LP signed
1f90: 20 43 4f 4d 4d 41 20 73 69 67 6e 65 64 20 52 50   COMMA signed RP
1fa0: 28 59 29 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58  (Y). {.  A.z = X
1fb0: 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74  .z;.  A.n = (int
1fc0: 29 28 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 58 2e  )(&Y.z[Y.n] - X.
1fd0: 7a 29 3b 0a 7d 0a 25 74 79 70 65 20 74 79 70 65  z);.}.%type type
1fe0: 6e 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a 74 79 70  name {Token}.typ
1ff0: 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 69 64 73  ename(A) ::= ids
2000: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
2010: 20 7b 41 20 3d 20 58 3b 7d 0a 74 79 70 65 6e 61   {A = X;}.typena
2020: 6d 65 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61  me(A) ::= typena
2030: 6d 65 28 58 29 20 69 64 73 28 59 29 2e 20 7b 41  me(X) ids(Y). {A
2040: 2e 7a 3d 58 2e 7a 3b 20 41 2e 6e 3d 59 2e 6e 2b  .z=X.z; A.n=Y.n+
2050: 28 69 6e 74 29 28 59 2e 7a 2d 58 2e 7a 29 3b 7d  (int)(Y.z-X.z);}
2060: 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 70 6c 75 73  .signed ::= plus
2070: 5f 6e 75 6d 2e 0a 73 69 67 6e 65 64 20 3a 3a 3d  _num..signed ::=
2080: 20 6d 69 6e 75 73 5f 6e 75 6d 2e 0a 0a 2f 2f 20   minus_num...// 
2090: 22 63 61 72 67 6c 69 73 74 22 20 69 73 20 61 20  "carglist" is a 
20a0: 6c 69 73 74 20 6f 66 20 61 64 64 69 74 69 6f 6e  list of addition
20b0: 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  al constraints t
20c0: 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
20d0: 68 65 0a 2f 2f 20 63 6f 6c 75 6d 6e 20 6e 61 6d  he.// column nam
20e0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 79 70  e and column typ
20f0: 65 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  e in a CREATE TA
2100: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2f  BLE statement../
2110: 2f 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20 63  /.carglist ::= c
2120: 61 72 67 6c 69 73 74 20 63 63 6f 6e 73 2e 0a 63  arglist ccons..c
2130: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 2e 0a 63 63  arglist ::= ..cc
2140: 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49  ons ::= CONSTRAI
2150: 4e 54 20 6e 6d 28 58 29 2e 20 20 20 20 20 20 20  NT nm(X).       
2160: 20 20 20 20 7b 70 50 61 72 73 65 2d 3e 63 6f 6e      {pParse->con
2170: 73 74 72 61 69 6e 74 4e 61 6d 65 20 3d 20 58 3b  straintName = X;
2180: 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41  }.ccons ::= DEFA
2190: 55 4c 54 20 74 65 72 6d 28 58 29 2e 20 20 20 20  ULT term(X).    
21a0: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
21b0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
21c0: 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63 63 6f  pParse,&X);}.cco
21d0: 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4c  ns ::= DEFAULT L
21e0: 50 20 65 78 70 72 28 58 29 20 52 50 2e 20 20 20  P expr(X) RP.   
21f0: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65     {sqlite3AddDe
2200: 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73  faultValue(pPars
2210: 65 2c 26 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  e,&X);}.ccons ::
2220: 3d 20 44 45 46 41 55 4c 54 20 50 4c 55 53 20 74  = DEFAULT PLUS t
2230: 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20 7b 73  erm(X).       {s
2240: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
2250: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 29  Value(pParse,&X)
2260: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46  ;}.ccons ::= DEF
2270: 41 55 4c 54 20 4d 49 4e 55 53 28 41 29 20 74 65  AULT MINUS(A) te
2280: 72 6d 28 58 29 2e 20 20 20 20 20 20 7b 0a 20 20  rm(X).      {.  
2290: 45 78 70 72 53 70 61 6e 20 76 3b 0a 20 20 76 2e  ExprSpan v;.  v.
22a0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
22b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
22c0: 55 4d 49 4e 55 53 2c 20 58 2e 70 45 78 70 72 2c  UMINUS, X.pExpr,
22d0: 20 30 2c 20 30 29 3b 0a 20 20 76 2e 7a 53 74 61   0, 0);.  v.zSta
22e0: 72 74 20 3d 20 41 2e 7a 3b 0a 20 20 76 2e 7a 45  rt = A.z;.  v.zE
22f0: 6e 64 20 3d 20 58 2e 7a 45 6e 64 3b 0a 20 20 73  nd = X.zEnd;.  s
2300: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
2310: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 76 29  Value(pParse,&v)
2320: 3b 0a 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45  ;.}.ccons ::= DE
2330: 46 41 55 4c 54 20 69 64 28 58 29 2e 20 20 20 20  FAULT id(X).    
2340: 20 20 20 20 20 20 20 20 20 20 7b 0a 20 20 45 78            {.  Ex
2350: 70 72 53 70 61 6e 20 76 3b 0a 20 20 73 70 61 6e  prSpan v;.  span
2360: 45 78 70 72 28 26 76 2c 20 70 50 61 72 73 65 2c  Expr(&v, pParse,
2370: 20 54 4b 5f 53 54 52 49 4e 47 2c 20 26 58 29 3b   TK_STRING, &X);
2380: 0a 20 20 73 71 6c 69 74 65 33 41 64 64 44 65 66  .  sqlite3AddDef
2390: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
23a0: 2c 26 76 29 3b 0a 7d 0a 0a 2f 2f 20 49 6e 20 61  ,&v);.}..// In a
23b0: 64 64 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74  ddition to the t
23c0: 79 70 65 20 6e 61 6d 65 2c 20 77 65 20 61 6c 73  ype name, we als
23d0: 6f 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  o care about the
23e0: 20 70 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64   primary key and
23f0: 0a 2f 2f 20 55 4e 49 51 55 45 20 63 6f 6e 73 74  .// UNIQUE const
2400: 72 61 69 6e 74 73 2e 0a 2f 2f 0a 63 63 6f 6e 73  raints..//.ccons
2410: 20 3a 3a 3d 20 4e 55 4c 4c 20 6f 6e 63 6f 6e 66   ::= NULL onconf
2420: 2e 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 4f 54 20  ..ccons ::= NOT 
2430: 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 28 52 29 2e 20  NULL onconf(R). 
2440: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 4e 6f     {sqlite3AddNo
2450: 74 4e 75 6c 6c 28 70 50 61 72 73 65 2c 20 52 29  tNull(pParse, R)
2460: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 50 52 49  ;}.ccons ::= PRI
2470: 4d 41 52 59 20 4b 45 59 20 73 6f 72 74 6f 72 64  MARY KEY sortord
2480: 65 72 28 5a 29 20 6f 6e 63 6f 6e 66 28 52 29 20  er(Z) onconf(R) 
2490: 61 75 74 6f 69 6e 63 28 49 29 2e 0a 20 20 20 20  autoinc(I)..    
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
24c0: 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
24d0: 65 79 28 70 50 61 72 73 65 2c 30 2c 52 2c 49 2c  ey(pParse,0,R,I,
24e0: 5a 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 55  Z);}.ccons ::= U
24f0: 4e 49 51 55 45 20 6f 6e 63 6f 6e 66 28 52 29 2e  NIQUE onconf(R).
2500: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 72        {sqlite3Cr
2510: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
2520: 2c 30 2c 30 2c 30 2c 30 2c 52 2c 30 2c 30 2c 30  ,0,0,0,0,R,0,0,0
2530: 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20  ,0);}.ccons ::= 
2540: 43 48 45 43 4b 20 4c 50 20 65 78 70 72 28 58 29  CHECK LP expr(X)
2550: 20 52 50 2e 20 20 20 7b 73 71 6c 69 74 65 33 41   RP.   {sqlite3A
2560: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
2570: 74 28 70 50 61 72 73 65 2c 58 2e 70 45 78 70 72  t(pParse,X.pExpr
2580: 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 52 45  );}.ccons ::= RE
2590: 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29 20 69  FERENCES nm(T) i
25a0: 64 78 6c 69 73 74 5f 6f 70 74 28 54 41 29 20 72  dxlist_opt(TA) r
25b0: 65 66 61 72 67 73 28 52 29 2e 0a 20 20 20 20 20  efargs(R)..     
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
25e0: 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
25f0: 6e 4b 65 79 28 70 50 61 72 73 65 2c 30 2c 26 54  nKey(pParse,0,&T
2600: 2c 54 41 2c 52 29 3b 7d 0a 63 63 6f 6e 73 20 3a  ,TA,R);}.ccons :
2610: 3a 3d 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75  := defer_subclau
2620: 73 65 28 44 29 2e 20 20 20 20 7b 73 71 6c 69 74  se(D).    {sqlit
2630: 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
2640: 79 28 70 50 61 72 73 65 2c 44 29 3b 7d 0a 63 63  y(pParse,D);}.cc
2650: 6f 6e 73 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20  ons ::= COLLATE 
2660: 69 64 73 28 43 29 2e 20 20 20 20 20 20 20 20 7b  ids(C).        {
2670: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
2680: 65 54 79 70 65 28 70 50 61 72 73 65 2c 20 26 43  eType(pParse, &C
2690: 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6f 70 74 69  );}..// The opti
26a0: 6f 6e 61 6c 20 41 55 54 4f 49 4e 43 52 45 4d 45  onal AUTOINCREME
26b0: 4e 54 20 6b 65 79 77 6f 72 64 0a 25 74 79 70 65  NT keyword.%type
26c0: 20 61 75 74 6f 69 6e 63 20 7b 69 6e 74 7d 0a 61   autoinc {int}.a
26d0: 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 2e 20  utoinc(X) ::= . 
26e0: 20 20 20 20 20 20 20 20 20 7b 58 20 3d 20 30 3b           {X = 0;
26f0: 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d  }.autoinc(X) ::=
2700: 20 41 55 54 4f 49 4e 43 52 2e 20 20 7b 58 20 3d   AUTOINCR.  {X =
2710: 20 31 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e 65 78   1;}..// The nex
2720: 74 20 67 72 6f 75 70 20 6f 66 20 72 75 6c 65 73  t group of rules
2730: 20 70 61 72 73 65 73 20 74 68 65 20 61 72 67 75   parses the argu
2740: 6d 65 6e 74 73 20 74 6f 20 61 20 52 45 46 45 52  ments to a REFER
2750: 45 4e 43 45 53 20 63 6c 61 75 73 65 0a 2f 2f 20  ENCES clause.// 
2760: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 20 69  that determine i
2770: 66 20 74 68 65 20 72 65 66 65 72 65 6e 74 69 61  f the referentia
2780: 6c 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63  l integrity chec
2790: 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64  king is deferred
27a0: 20 6f 72 0a 2f 2f 20 6f 72 20 69 6d 6d 65 64 69   or.// or immedi
27b0: 61 74 65 20 61 6e 64 20 77 68 69 63 68 20 64 65  ate and which de
27c0: 74 65 72 6d 69 6e 65 20 77 68 61 74 20 61 63 74  termine what act
27d0: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 66 20 61  ion to take if a
27e0: 20 72 65 66 2d 69 6e 74 65 67 0a 2f 2f 20 63 68   ref-integ.// ch
27f0: 65 63 6b 20 66 61 69 6c 73 2e 0a 2f 2f 0a 25 74  eck fails..//.%t
2800: 79 70 65 20 72 65 66 61 72 67 73 20 7b 69 6e 74  ype refargs {int
2810: 7d 0a 72 65 66 61 72 67 73 28 41 29 20 3a 3a 3d  }.refargs(A) ::=
2820: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2830: 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e      { A = OE_Non
2840: 65 2a 30 78 30 31 30 31 3b 20 2f 2a 20 45 56 3a  e*0x0101; /* EV:
2850: 20 52 2d 31 39 38 30 33 2d 34 35 38 38 34 20 2a   R-19803-45884 *
2860: 2f 7d 0a 72 65 66 61 72 67 73 28 41 29 20 3a 3a  /}.refargs(A) ::
2870: 3d 20 72 65 66 61 72 67 73 28 58 29 20 72 65 66  = refargs(X) ref
2880: 61 72 67 28 59 29 2e 20 7b 20 41 20 3d 20 28 58  arg(Y). { A = (X
2890: 20 26 20 7e 59 2e 6d 61 73 6b 29 20 7c 20 59 2e   & ~Y.mask) | Y.
28a0: 76 61 6c 75 65 3b 20 7d 0a 25 74 79 70 65 20 72  value; }.%type r
28b0: 65 66 61 72 67 20 7b 73 74 72 75 63 74 20 7b 69  efarg {struct {i
28c0: 6e 74 20 76 61 6c 75 65 3b 20 69 6e 74 20 6d 61  nt value; int ma
28d0: 73 6b 3b 7d 7d 0a 72 65 66 61 72 67 28 41 29 20  sk;}}.refarg(A) 
28e0: 3a 3a 3d 20 4d 41 54 43 48 20 6e 6d 2e 20 20 20  ::= MATCH nm.   
28f0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 2e 76             { A.v
2900: 61 6c 75 65 20 3d 20 30 3b 20 20 20 20 20 41 2e  alue = 0;     A.
2910: 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 30 30 3b  mask = 0x000000;
2920: 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d   }.refarg(A) ::=
2930: 20 4f 4e 20 49 4e 53 45 52 54 20 72 65 66 61 63   ON INSERT refac
2940: 74 2e 20 20 20 20 20 20 7b 20 41 2e 76 61 6c 75  t.      { A.valu
2950: 65 20 3d 20 30 3b 20 20 20 20 20 41 2e 6d 61 73  e = 0;     A.mas
2960: 6b 20 3d 20 30 78 30 30 30 30 30 30 3b 20 7d 0a  k = 0x000000; }.
2970: 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e  refarg(A) ::= ON
2980: 20 44 45 4c 45 54 45 20 72 65 66 61 63 74 28 58   DELETE refact(X
2990: 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d  ).   { A.value =
29a0: 20 58 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d   X;     A.mask =
29b0: 20 30 78 30 30 30 30 66 66 3b 20 7d 0a 72 65 66   0x0000ff; }.ref
29c0: 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 55 50  arg(A) ::= ON UP
29d0: 44 41 54 45 20 72 65 66 61 63 74 28 58 29 2e 20  DATE refact(X). 
29e0: 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58 3c    { A.value = X<
29f0: 3c 38 3b 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78  <8;  A.mask = 0x
2a00: 30 30 66 66 30 30 3b 20 7d 0a 25 74 79 70 65 20  00ff00; }.%type 
2a10: 72 65 66 61 63 74 20 7b 69 6e 74 7d 0a 72 65 66  refact {int}.ref
2a20: 61 63 74 28 41 29 20 3a 3a 3d 20 53 45 54 20 4e  act(A) ::= SET N
2a30: 55 4c 4c 2e 20 20 20 20 20 20 20 20 20 20 20 20  ULL.            
2a40: 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74 4e 75    { A = OE_SetNu
2a50: 6c 6c 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33  ll;  /* EV: R-33
2a60: 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65  326-45252 */}.re
2a70: 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45 54 20  fact(A) ::= SET 
2a80: 44 45 46 41 55 4c 54 2e 20 20 20 20 20 20 20 20  DEFAULT.        
2a90: 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74 44     { A = OE_SetD
2aa0: 66 6c 74 3b 20 20 2f 2a 20 45 56 3a 20 52 2d 33  flt;  /* EV: R-3
2ab0: 33 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 72  3326-45252 */}.r
2ac0: 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 43 41 53  efact(A) ::= CAS
2ad0: 43 41 44 45 2e 20 20 20 20 20 20 20 20 20 20 20  CADE.           
2ae0: 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 43 61 73      { A = OE_Cas
2af0: 63 61 64 65 3b 20 20 2f 2a 20 45 56 3a 20 52 2d  cade;  /* EV: R-
2b00: 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a  33326-45252 */}.
2b10: 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 52 45  refact(A) ::= RE
2b20: 53 54 52 49 43 54 2e 20 20 20 20 20 20 20 20 20  STRICT.         
2b30: 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 52 65       { A = OE_Re
2b40: 73 74 72 69 63 74 3b 20 2f 2a 20 45 56 3a 20 52  strict; /* EV: R
2b50: 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d  -33326-45252 */}
2b60: 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 4e  .refact(A) ::= N
2b70: 4f 20 41 43 54 49 4f 4e 2e 20 20 20 20 20 20 20  O ACTION.       
2b80: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 4e        { A = OE_N
2b90: 6f 6e 65 3b 20 20 20 20 20 2f 2a 20 45 56 3a 20  one;     /* EV: 
2ba0: 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f  R-33326-45252 */
2bb0: 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f 73 75  }.%type defer_su
2bc0: 62 63 6c 61 75 73 65 20 7b 69 6e 74 7d 0a 64 65  bclause {int}.de
2bd0: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 41 29  fer_subclause(A)
2be0: 20 3a 3a 3d 20 4e 4f 54 20 44 45 46 45 52 52 41   ::= NOT DEFERRA
2bf0: 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72 72 65  BLE init_deferre
2c00: 64 5f 70 72 65 64 5f 6f 70 74 2e 20 20 20 20 20  d_pred_opt.     
2c10: 7b 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72 5f 73  {A = 0;}.defer_s
2c20: 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20  ubclause(A) ::= 
2c30: 44 45 46 45 52 52 41 42 4c 45 20 69 6e 69 74 5f  DEFERRABLE init_
2c40: 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70  deferred_pred_op
2c50: 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20  t(X).      {A = 
2c60: 58 3b 7d 0a 25 74 79 70 65 20 69 6e 69 74 5f 64  X;}.%type init_d
2c70: 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74  eferred_pred_opt
2c80: 20 7b 69 6e 74 7d 0a 69 6e 69 74 5f 64 65 66 65   {int}.init_defe
2c90: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29  rred_pred_opt(A)
2ca0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
2cc0: 3d 20 30 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 72  = 0;}.init_defer
2cd0: 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 20  red_pred_opt(A) 
2ce0: 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 44 45  ::= INITIALLY DE
2cf0: 46 45 52 52 45 44 2e 20 20 20 20 20 7b 41 20 3d  FERRED.     {A =
2d00: 20 31 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72   1;}.init_deferr
2d10: 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 20 3a  ed_pred_opt(A) :
2d20: 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  := INITIALLY IMM
2d30: 45 44 49 41 54 45 2e 20 20 20 20 7b 41 20 3d 20  EDIATE.    {A = 
2d40: 30 3b 7d 0a 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70  0;}..conslist_op
2d50: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  t(A) ::= .      
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 7b 41 2e 6e 20 3d 20 30 3b 20 41 2e 7a     {A.n = 0; A.z
2d80: 20 3d 20 30 3b 7d 0a 63 6f 6e 73 6c 69 73 74 5f   = 0;}.conslist_
2d90: 6f 70 74 28 41 29 20 3a 3a 3d 20 43 4f 4d 4d 41  opt(A) ::= COMMA
2da0: 28 58 29 20 63 6f 6e 73 6c 69 73 74 2e 20 20 20  (X) conslist.   
2db0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 63 6f       {A = X;}.co
2dc0: 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c  nslist ::= consl
2dd0: 69 73 74 20 74 63 6f 6e 73 63 6f 6d 6d 61 20 74  ist tconscomma t
2de0: 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a  cons..conslist :
2df0: 3a 3d 20 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73 63  := tcons..tconsc
2e00: 6f 6d 6d 61 20 3a 3a 3d 20 43 4f 4d 4d 41 2e 20  omma ::= COMMA. 
2e10: 20 20 20 20 20 20 20 20 20 20 20 7b 70 50 61 72             {pPar
2e20: 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61  se->constraintNa
2e30: 6d 65 2e 6e 20 3d 20 30 3b 7d 0a 74 63 6f 6e 73  me.n = 0;}.tcons
2e40: 63 6f 6d 6d 61 20 3a 3a 3d 20 2e 0a 74 63 6f 6e  comma ::= ..tcon
2e50: 73 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54  s ::= CONSTRAINT
2e60: 20 6e 6d 28 58 29 2e 20 20 20 20 20 20 7b 70 50   nm(X).      {pP
2e70: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74  arse->constraint
2e80: 4e 61 6d 65 20 3d 20 58 3b 7d 0a 74 63 6f 6e 73  Name = X;}.tcons
2e90: 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59   ::= PRIMARY KEY
2ea0: 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20 61   LP idxlist(X) a
2eb0: 75 74 6f 69 6e 63 28 49 29 20 52 50 20 6f 6e 63  utoinc(I) RP onc
2ec0: 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20 20 20 20  onf(R)..        
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
2ef0: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 70  3AddPrimaryKey(p
2f00: 50 61 72 73 65 2c 58 2c 52 2c 49 2c 30 29 3b 7d  Parse,X,R,I,0);}
2f10: 0a 74 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55  .tcons ::= UNIQU
2f20: 45 20 4c 50 20 69 64 78 6c 69 73 74 28 58 29 20  E LP idxlist(X) 
2f30: 52 50 20 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20  RP onconf(R)..  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2f60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
2f70: 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c  ex(pParse,0,0,0,
2f80: 58 2c 52 2c 30 2c 30 2c 30 2c 30 29 3b 7d 0a 74  X,R,0,0,0,0);}.t
2f90: 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b 20 4c  cons ::= CHECK L
2fa0: 50 20 65 78 70 72 28 45 29 20 52 50 20 6f 6e 63  P expr(E) RP onc
2fb0: 6f 6e 66 2e 0a 20 20 20 20 20 20 20 20 20 20 20  onf..           
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64        {sqlite3Ad
2fe0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
2ff0: 28 70 50 61 72 73 65 2c 45 2e 70 45 78 70 72 29  (pParse,E.pExpr)
3000: 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 46 4f 52  ;}.tcons ::= FOR
3010: 45 49 47 4e 20 4b 45 59 20 4c 50 20 69 64 78 6c  EIGN KEY LP idxl
3020: 69 73 74 28 46 41 29 20 52 50 0a 20 20 20 20 20  ist(FA) RP.     
3030: 20 20 20 20 20 52 45 46 45 52 45 4e 43 45 53 20       REFERENCES 
3040: 6e 6d 28 54 29 20 69 64 78 6c 69 73 74 5f 6f 70  nm(T) idxlist_op
3050: 74 28 54 41 29 20 72 65 66 61 72 67 73 28 52 29  t(TA) refargs(R)
3060: 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65   defer_subclause
3070: 5f 6f 70 74 28 44 29 2e 20 7b 0a 20 20 20 20 73  _opt(D). {.    s
3080: 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65  qlite3CreateFore
3090: 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 20 46  ignKey(pParse, F
30a0: 41 2c 20 26 54 2c 20 54 41 2c 20 52 29 3b 0a 20  A, &T, TA, R);. 
30b0: 20 20 20 73 71 6c 69 74 65 33 44 65 66 65 72 46     sqlite3DeferF
30c0: 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65  oreignKey(pParse
30d0: 2c 20 44 29 3b 0a 7d 0a 25 74 79 70 65 20 64 65  , D);.}.%type de
30e0: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70  fer_subclause_op
30f0: 74 20 7b 69 6e 74 7d 0a 64 65 66 65 72 5f 73 75  t {int}.defer_su
3100: 62 63 6c 61 75 73 65 5f 6f 70 74 28 41 29 20 3a  bclause_opt(A) :
3110: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
3120: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
3130: 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65  .defer_subclause
3140: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 64 65 66 65  _opt(A) ::= defe
3150: 72 5f 73 75 62 63 6c 61 75 73 65 28 58 29 2e 20  r_subclause(X). 
3160: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 20 54 68   {A = X;}..// Th
3170: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61  e following is a
3180: 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 20 65 78   non-standard ex
3190: 74 65 6e 73 69 6f 6e 20 74 68 61 74 20 61 6c 6c  tension that all
31a0: 6f 77 73 20 75 73 20 74 6f 20 64 65 63 6c 61 72  ows us to declar
31b0: 65 20 74 68 65 0a 2f 2f 20 64 65 66 61 75 6c 74  e the.// default
31c0: 20 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74   behavior when t
31d0: 68 65 72 65 20 69 73 20 61 20 63 6f 6e 73 74 72  here is a constr
31e0: 61 69 6e 74 20 63 6f 6e 66 6c 69 63 74 2e 0a 2f  aint conflict../
31f0: 2f 0a 25 74 79 70 65 20 6f 6e 63 6f 6e 66 20 7b  /.%type onconf {
3200: 69 6e 74 7d 0a 25 74 79 70 65 20 6f 72 63 6f 6e  int}.%type orcon
3210: 66 20 7b 75 38 7d 0a 25 74 79 70 65 20 72 65 73  f {u8}.%type res
3220: 6f 6c 76 65 74 79 70 65 20 7b 69 6e 74 7d 0a 6f  olvetype {int}.o
3230: 6e 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20  nconf(A) ::= .  
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3250: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3260: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 6e   OE_Default;}.on
3270: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 4e 20 43  conf(A) ::= ON C
3280: 4f 4e 46 4c 49 43 54 20 72 65 73 6f 6c 76 65 74  ONFLICT resolvet
3290: 79 70 65 28 58 29 2e 20 20 20 20 7b 41 20 3d 20  ype(X).    {A = 
32a0: 58 3b 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a  X;}.orconf(A) ::
32b0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 7b 41 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74   {A = OE_Default
32e0: 3b 7d 0a 6f 72 63 6f 6e 66 28 41 29 20 3a 3a 3d  ;}.orconf(A) ::=
32f0: 20 4f 52 20 72 65 73 6f 6c 76 65 74 79 70 65 28   OR resolvetype(
3300: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
3310: 7b 41 20 3d 20 28 75 38 29 58 3b 7d 0a 72 65 73  {A = (u8)X;}.res
3320: 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20  olvetype(A) ::= 
3330: 72 61 69 73 65 74 79 70 65 28 58 29 2e 20 20 20  raisetype(X).   
3340: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
3350: 3b 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41  ;}.resolvetype(A
3360: 29 20 3a 3a 3d 20 49 47 4e 4f 52 45 2e 20 20 20  ) ::= IGNORE.   
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 7b 41 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 7d  {A = OE_Ignore;}
3390: 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20  .resolvetype(A) 
33a0: 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20  ::= REPLACE.    
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
33c0: 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a   = OE_Replace;}.
33d0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
33e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
33f0: 44 52 4f 50 20 54 41 42 4c 45 20 2f 2f 2f 2f 2f  DROP TABLE /////
3400: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3420: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50  .//.cmd ::= DROP
3430: 20 54 41 42 4c 45 20 69 66 65 78 69 73 74 73 28   TABLE ifexists(
3440: 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20  E) fullname(X). 
3450: 7b 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54  {.  sqlite3DropT
3460: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 58 2c 20  able(pParse, X, 
3470: 30 2c 20 45 29 3b 0a 7d 0a 25 74 79 70 65 20 69  0, E);.}.%type i
3480: 66 65 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66  fexists {int}.if
3490: 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 49 46  exists(A) ::= IF
34a0: 20 45 58 49 53 54 53 2e 20 20 20 7b 41 20 3d 20   EXISTS.   {A = 
34b0: 31 3b 7d 0a 69 66 65 78 69 73 74 73 28 41 29 20  1;}.ifexists(A) 
34c0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
34d0: 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f   {A = 0;}../////
34e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
34f0: 20 54 68 65 20 43 52 45 41 54 45 20 56 49 45 57   The CREATE VIEW
3500: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
3510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3520: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e  ////////.//.%ifn
3530: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3540: 56 49 45 57 0a 63 6d 64 20 3a 3a 3d 20 63 72 65  VIEW.cmd ::= cre
3550: 61 74 65 6b 77 28 58 29 20 74 65 6d 70 28 54 29  atekw(X) temp(T)
3560: 20 56 49 45 57 20 69 66 6e 6f 74 65 78 69 73 74   VIEW ifnotexist
3570: 73 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28  s(E) nm(Y) dbnm(
3580: 5a 29 20 41 53 20 73 65 6c 65 63 74 28 53 29 2e  Z) AS select(S).
3590: 20 7b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61   {.  sqlite3Crea
35a0: 74 65 56 69 65 77 28 70 50 61 72 73 65 2c 20 26  teView(pParse, &
35b0: 58 2c 20 26 59 2c 20 26 5a 2c 20 53 2c 20 54 2c  X, &Y, &Z, S, T,
35c0: 20 45 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44   E);.}.cmd ::= D
35d0: 52 4f 50 20 56 49 45 57 20 69 66 65 78 69 73 74  ROP VIEW ifexist
35e0: 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29  s(E) fullname(X)
35f0: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 72 6f  . {.  sqlite3Dro
3600: 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 58  pTable(pParse, X
3610: 2c 20 31 2c 20 45 29 3b 0a 7d 0a 25 65 6e 64 69  , 1, E);.}.%endi
3620: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  f  SQLITE_OMIT_V
3630: 49 45 57 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  IEW..///////////
3640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68  ///////////// Th
3650: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
3660: 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  nt /////////////
3670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3680: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
3690: 73 65 6c 65 63 74 28 58 29 2e 20 20 7b 0a 20 20  select(X).  {.  
36a0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 20  SelectDest dest 
36b0: 3d 20 7b 53 52 54 5f 4f 75 74 70 75 74 2c 20 30  = {SRT_Output, 0
36c0: 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 73 71  , 0, 0, 0};.  sq
36d0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
36e0: 73 65 2c 20 58 2c 20 26 64 65 73 74 29 3b 0a 20  se, X, &dest);. 
36f0: 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 42   sqlite3ExplainB
3700: 65 67 69 6e 28 70 50 61 72 73 65 2d 3e 70 56 64  egin(pParse->pVd
3710: 62 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  be);.  sqlite3Ex
3720: 70 6c 61 69 6e 53 65 6c 65 63 74 28 70 50 61 72  plainSelect(pPar
3730: 73 65 2d 3e 70 56 64 62 65 2c 20 58 29 3b 0a 20  se->pVdbe, X);. 
3740: 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 46   sqlite3ExplainF
3750: 69 6e 69 73 68 28 70 50 61 72 73 65 2d 3e 70 56  inish(pParse->pV
3760: 64 62 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  dbe);.  sqlite3S
3770: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72  electDelete(pPar
3780: 73 65 2d 3e 64 62 2c 20 58 29 3b 0a 7d 0a 0a 25  se->db, X);.}..%
3790: 74 79 70 65 20 73 65 6c 65 63 74 20 7b 53 65 6c  type select {Sel
37a0: 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ect*}.%destructo
37b0: 72 20 73 65 6c 65 63 74 20 7b 73 71 6c 69 74 65  r select {sqlite
37c0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50  3SelectDelete(pP
37d0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
37e0: 25 74 79 70 65 20 6f 6e 65 73 65 6c 65 63 74 20  %type oneselect 
37f0: 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72  {Select*}.%destr
3800: 75 63 74 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20  uctor oneselect 
3810: 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65  {sqlite3SelectDe
3820: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
3830: 20 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74 28 41   $$);}..select(A
3840: 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28  ) ::= oneselect(
3850: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
3860: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
3870: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
3880: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
3890: 45 4c 45 43 54 0a 73 65 6c 65 63 74 28 41 29 20  ELECT.select(A) 
38a0: 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 20 6d 75  ::= select(X) mu
38b0: 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 59 29 20  ltiselect_op(Y) 
38c0: 6f 6e 65 73 65 6c 65 63 74 28 5a 29 2e 20 20 7b  oneselect(Z).  {
38d0: 0a 20 20 69 66 28 20 5a 20 29 7b 0a 20 20 20 20  .  if( Z ){.    
38e0: 5a 2d 3e 6f 70 20 3d 20 28 75 38 29 59 3b 0a 20  Z->op = (u8)Y;. 
38f0: 20 20 20 5a 2d 3e 70 50 72 69 6f 72 20 3d 20 58     Z->pPrior = X
3900: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
3910: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3920: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 58  te(pParse->db, X
3930: 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 5a 3b 0a  );.  }.  A = Z;.
3940: 7d 0a 25 74 79 70 65 20 6d 75 6c 74 69 73 65 6c  }.%type multisel
3950: 65 63 74 5f 6f 70 20 7b 69 6e 74 7d 0a 6d 75 6c  ect_op {int}.mul
3960: 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a  tiselect_op(A) :
3970: 3a 3d 20 55 4e 49 4f 4e 28 4f 50 29 2e 20 20 20  := UNION(OP).   
3980: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 40            {A = @
3990: 4f 50 3b 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74  OP;}.multiselect
39a0: 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e  _op(A) ::= UNION
39b0: 20 41 4c 4c 2e 20 20 20 20 20 20 20 20 20 20 20   ALL.           
39c0: 20 20 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b 7d 0a    {A = TK_ALL;}.
39d0: 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41  multiselect_op(A
39e0: 29 20 3a 3a 3d 20 45 58 43 45 50 54 7c 49 4e 54  ) ::= EXCEPT|INT
39f0: 45 52 53 45 43 54 28 4f 50 29 2e 20 20 7b 41 20  ERSECT(OP).  {A 
3a00: 3d 20 40 4f 50 3b 7d 0a 25 65 6e 64 69 66 20 53  = @OP;}.%endif S
3a10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f  QLITE_OMIT_COMPO
3a20: 55 4e 44 5f 53 45 4c 45 43 54 0a 6f 6e 65 73 65  UND_SELECT.onese
3a30: 6c 65 63 74 28 41 29 20 3a 3a 3d 20 53 45 4c 45  lect(A) ::= SELE
3a40: 43 54 20 64 69 73 74 69 6e 63 74 28 44 29 20 73  CT distinct(D) s
3a50: 65 6c 63 6f 6c 6c 69 73 74 28 57 29 20 66 72 6f  elcollist(W) fro
3a60: 6d 28 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59  m(X) where_opt(Y
3a70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
3a80: 20 20 20 67 72 6f 75 70 62 79 5f 6f 70 74 28 50     groupby_opt(P
3a90: 29 20 68 61 76 69 6e 67 5f 6f 70 74 28 51 29 20  ) having_opt(Q) 
3aa0: 6f 72 64 65 72 62 79 5f 6f 70 74 28 5a 29 20 6c  orderby_opt(Z) l
3ab0: 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20  imit_opt(L). {. 
3ac0: 20 41 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65   A = sqlite3Sele
3ad0: 63 74 4e 65 77 28 70 50 61 72 73 65 2c 57 2c 58  ctNew(pParse,W,X
3ae0: 2c 59 2c 50 2c 51 2c 5a 2c 44 2c 4c 2e 70 4c 69  ,Y,P,Q,Z,D,L.pLi
3af0: 6d 69 74 2c 4c 2e 70 4f 66 66 73 65 74 29 3b 0a  mit,L.pOffset);.
3b00: 7d 0a 0a 2f 2f 20 54 68 65 20 22 64 69 73 74 69  }..// The "disti
3b10: 6e 63 74 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  nct" nonterminal
3b20: 20 69 73 20 74 72 75 65 20 28 31 29 20 69 66 20   is true (1) if 
3b30: 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65 79  the DISTINCT key
3b40: 77 6f 72 64 20 69 73 0a 2f 2f 20 70 72 65 73 65  word is.// prese
3b50: 6e 74 20 61 6e 64 20 66 61 6c 73 65 20 28 30 29  nt and false (0)
3b60: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 2f   if it is not../
3b70: 2f 0a 25 74 79 70 65 20 64 69 73 74 69 6e 63 74  /.%type distinct
3b80: 20 7b 75 31 36 7d 0a 64 69 73 74 69 6e 63 74 28   {u16}.distinct(
3b90: 41 29 20 3a 3a 3d 20 44 49 53 54 49 4e 43 54 2e  A) ::= DISTINCT.
3ba0: 20 20 20 7b 41 20 3d 20 53 46 5f 44 69 73 74 69     {A = SF_Disti
3bb0: 6e 63 74 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41  nct;}.distinct(A
3bc0: 29 20 3a 3a 3d 20 41 4c 4c 2e 20 20 20 20 20 20  ) ::= ALL.      
3bd0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 69 73 74 69    {A = 0;}.disti
3be0: 6e 63 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  nct(A) ::= .    
3bf0: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
3c00: 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69 73 74 20 69  .// selcollist i
3c10: 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
3c20: 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65  essions that are
3c30: 20 74 6f 20 62 65 63 6f 6d 65 20 74 68 65 20 72   to become the r
3c40: 65 74 75 72 6e 0a 2f 2f 20 76 61 6c 75 65 73 20  eturn.// values 
3c50: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
3c60: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 22 2a  atement.  The "*
3c70: 22 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 73 20  " in statements 
3c80: 6c 69 6b 65 0a 2f 2f 20 22 53 45 4c 45 43 54 20  like.// "SELECT 
3c90: 2a 20 46 52 4f 4d 20 2e 2e 2e 22 20 69 73 20 65  * FROM ..." is e
3ca0: 6e 63 6f 64 65 64 20 61 73 20 61 20 73 70 65 63  ncoded as a spec
3cb0: 69 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 77  ial expression w
3cc0: 69 74 68 20 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65  ith an.// opcode
3cd0: 20 6f 66 20 54 4b 5f 41 4c 4c 2e 0a 2f 2f 0a 25   of TK_ALL..//.%
3ce0: 74 79 70 65 20 73 65 6c 63 6f 6c 6c 69 73 74 20  type selcollist 
3cf0: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
3d00: 74 72 75 63 74 6f 72 20 73 65 6c 63 6f 6c 6c 69  tructor selcolli
3d10: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
3d20: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
3d30: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70  ->db, $$);}.%typ
3d40: 65 20 73 63 6c 70 20 7b 45 78 70 72 4c 69 73 74  e sclp {ExprList
3d50: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
3d60: 63 6c 70 20 7b 73 71 6c 69 74 65 33 45 78 70 72  clp {sqlite3Expr
3d70: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
3d80: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 73 63 6c  e->db, $$);}.scl
3d90: 70 28 41 29 20 3a 3a 3d 20 73 65 6c 63 6f 6c 6c  p(A) ::= selcoll
3da0: 69 73 74 28 58 29 20 43 4f 4d 4d 41 2e 20 20 20  ist(X) COMMA.   
3db0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
3dc0: 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20 2e  ;}.sclp(A) ::= .
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c  {A = 0;}.selcoll
3e00: 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28  ist(A) ::= sclp(
3e10: 50 29 20 65 78 70 72 28 58 29 20 61 73 28 59 29  P) expr(X) as(Y)
3e20: 2e 20 20 20 20 20 7b 0a 20 20 20 41 20 3d 20 73  .     {.   A = s
3e30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
3e40: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 50 2c 20  pend(pParse, P, 
3e50: 58 2e 70 45 78 70 72 29 3b 0a 20 20 20 69 66 28  X.pExpr);.   if(
3e60: 20 59 2e 6e 3e 30 20 29 20 73 71 6c 69 74 65 33   Y.n>0 ) sqlite3
3e70: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
3e80: 70 50 61 72 73 65 2c 20 41 2c 20 26 59 2c 20 31  pParse, A, &Y, 1
3e90: 29 3b 0a 20 20 20 73 71 6c 69 74 65 33 45 78 70  );.   sqlite3Exp
3ea0: 72 4c 69 73 74 53 65 74 53 70 61 6e 28 70 50 61  rListSetSpan(pPa
3eb0: 72 73 65 2c 41 2c 26 58 29 3b 0a 7d 0a 73 65 6c  rse,A,&X);.}.sel
3ec0: 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  collist(A) ::= s
3ed0: 63 6c 70 28 50 29 20 53 54 41 52 2e 20 7b 0a 20  clp(P) STAR. {. 
3ee0: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
3ef0: 65 33 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64  e3Expr(pParse->d
3f00: 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29 3b 0a 20  b, TK_ALL, 0);. 
3f10: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
3f20: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
3f30: 65 2c 20 50 2c 20 70 29 3b 0a 7d 0a 73 65 6c 63  e, P, p);.}.selc
3f40: 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63  ollist(A) ::= sc
3f50: 6c 70 28 50 29 20 6e 6d 28 58 29 20 44 4f 54 20  lp(P) nm(X) DOT 
3f60: 53 54 41 52 28 59 29 2e 20 7b 0a 20 20 45 78 70  STAR(Y). {.  Exp
3f70: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69  r *pRight = sqli
3f80: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
3f90: 20 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20 26   TK_ALL, 0, 0, &
3fa0: 59 29 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 66  Y);.  Expr *pLef
3fb0: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
3fc0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20  (pParse, TK_ID, 
3fd0: 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78 70  0, 0, &X);.  Exp
3fe0: 72 20 2a 70 44 6f 74 20 3d 20 73 71 6c 69 74 65  r *pDot = sqlite
3ff0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
4000: 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c 20 70 52  K_DOT, pLeft, pR
4010: 69 67 68 74 2c 20 30 29 3b 0a 20 20 41 20 3d 20  ight, 0);.  A = 
4020: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
4030: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 50 2c 20  ppend(pParse,P, 
4040: 70 44 6f 74 29 3b 0a 7d 0a 0a 2f 2f 20 41 6e 20  pDot);.}..// An 
4050: 6f 70 74 69 6f 6e 20 22 41 53 20 3c 69 64 3e 22  option "AS <id>"
4060: 20 70 68 72 61 73 65 20 74 68 61 74 20 63 61 6e   phrase that can
4070: 20 66 6f 6c 6c 6f 77 20 6f 6e 65 20 6f 66 20 74   follow one of t
4080: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  he expressions t
4090: 68 61 74 0a 2f 2f 20 64 65 66 69 6e 65 20 74 68  hat.// define th
40a0: 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20 6f 72  e result set, or
40b0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 61 62 6c   one of the tabl
40c0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
40d0: 6c 61 75 73 65 2e 0a 2f 2f 0a 25 74 79 70 65 20  lause..//.%type 
40e0: 61 73 20 7b 54 6f 6b 65 6e 7d 0a 61 73 28 58 29  as {Token}.as(X)
40f0: 20 3a 3a 3d 20 41 53 20 6e 6d 28 59 29 2e 20 20   ::= AS nm(Y).  
4100: 20 20 7b 58 20 3d 20 59 3b 7d 0a 61 73 28 58 29    {X = Y;}.as(X)
4110: 20 3a 3a 3d 20 69 64 73 28 59 29 2e 20 20 20 20   ::= ids(Y).    
4120: 20 20 7b 58 20 3d 20 59 3b 7d 0a 61 73 28 58 29    {X = Y;}.as(X)
4130: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
4140: 20 20 7b 58 2e 6e 20 3d 20 30 3b 7d 0a 0a 0a 25    {X.n = 0;}...%
4150: 74 79 70 65 20 73 65 6c 74 61 62 6c 69 73 74 20  type seltablist 
4160: 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74  {SrcList*}.%dest
4170: 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c 69 73  ructor seltablis
4180: 74 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t {sqlite3SrcLis
4190: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
41a0: 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20  db, $$);}.%type 
41b0: 73 74 6c 5f 70 72 65 66 69 78 20 7b 53 72 63 4c  stl_prefix {SrcL
41c0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
41d0: 72 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 73 71  r stl_prefix {sq
41e0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
41f0: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
4200: 24 29 3b 7d 0a 25 74 79 70 65 20 66 72 6f 6d 20  $);}.%type from 
4210: 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74  {SrcList*}.%dest
4220: 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b 73 71 6c  ructor from {sql
4230: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
4240: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
4250: 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f 6d 70 6c 65  );}..// A comple
4260: 74 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  te FROM clause..
4270: 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 2e  //.from(A) ::= .
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 7b 41 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  {A = sqlite3DbMa
42a0: 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
42b0: 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 41 29 29  >db, sizeof(*A))
42c0: 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 46  ;}.from(A) ::= F
42d0: 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73 74 28 58  ROM seltablist(X
42e0: 29 2e 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20 20  ). {.  A = X;.  
42f0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68  sqlite3SrcListSh
4300: 69 66 74 4a 6f 69 6e 54 79 70 65 28 41 29 3b 0a  iftJoinType(A);.
4310: 7d 0a 0a 2f 2f 20 22 73 65 6c 74 61 62 6c 69 73  }..// "seltablis
4320: 74 22 20 69 73 20 61 20 22 53 65 6c 65 63 74 20  t" is a "Select 
4330: 54 61 62 6c 65 20 4c 69 73 74 22 20 2d 20 74 68  Table List" - th
4340: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
4350: 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2f 2f 20   FROM clause.// 
4360: 69 6e 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  in a SELECT stat
4370: 65 6d 65 6e 74 2e 20 20 22 73 74 6c 5f 70 72 65  ement.  "stl_pre
4380: 66 69 78 22 20 69 73 20 61 20 70 72 65 66 69 78  fix" is a prefix
4390: 20 6f 66 20 74 68 69 73 20 6c 69 73 74 2e 0a 2f   of this list../
43a0: 2f 0a 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20  /.stl_prefix(A) 
43b0: 3a 3a 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 58  ::= seltablist(X
43c0: 29 20 6a 6f 69 6e 6f 70 28 59 29 2e 20 20 20 20  ) joinop(Y).    
43d0: 7b 0a 20 20 20 41 20 3d 20 58 3b 0a 20 20 20 69  {.   A = X;.   i
43e0: 66 28 20 41 4c 57 41 59 53 28 41 20 26 26 20 41  f( ALWAYS(A && A
43f0: 2d 3e 6e 53 72 63 3e 30 29 20 29 20 41 2d 3e 61  ->nSrc>0) ) A->a
4400: 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e 6a 6f 69 6e  [A->nSrc-1].join
4410: 74 79 70 65 20 3d 20 28 75 38 29 59 3b 0a 7d 0a  type = (u8)Y;.}.
4420: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a  stl_prefix(A) ::
4430: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
4450: 20 3d 20 30 3b 7d 0a 73 65 6c 74 61 62 6c 69 73   = 0;}.seltablis
4460: 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65  t(A) ::= stl_pre
4470: 66 69 78 28 58 29 20 6e 6d 28 59 29 20 64 62 6e  fix(X) nm(Y) dbn
4480: 6d 28 44 29 20 61 73 28 5a 29 20 69 6e 64 65 78  m(D) as(Z) index
4490: 65 64 5f 6f 70 74 28 49 29 0a 20 20 20 20 20 20  ed_opt(I).      
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 5f 6f              on_o
44b0: 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28  pt(N) using_opt(
44c0: 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  U). {.  A = sqli
44d0: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
44e0: 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
44f0: 58 2c 26 59 2c 26 44 2c 26 5a 2c 30 2c 4e 2c 55  X,&Y,&D,&Z,0,N,U
4500: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
4510: 69 73 74 49 6e 64 65 78 65 64 42 79 28 70 50 61  istIndexedBy(pPa
4520: 72 73 65 2c 20 41 2c 20 26 49 29 3b 0a 7d 0a 25  rse, A, &I);.}.%
4530: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4540: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 73 65  IT_SUBQUERY.  se
4550: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ltablist(A) ::= 
4560: 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20 4c 50  stl_prefix(X) LP
4570: 20 73 65 6c 65 63 74 28 53 29 20 52 50 0a 20 20   select(S) RP.  
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e    as(Z) on_opt(N
45a0: 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20  ) using_opt(U). 
45b0: 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65  {.    A = sqlite
45c0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
45d0: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 58 2c  omTerm(pParse,X,
45e0: 30 2c 30 2c 26 5a 2c 53 2c 4e 2c 55 29 3b 0a 20  0,0,&Z,S,N,U);. 
45f0: 20 7d 0a 20 20 73 65 6c 74 61 62 6c 69 73 74 28   }.  seltablist(
4600: 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69  A) ::= stl_prefi
4610: 78 28 58 29 20 4c 50 20 73 65 6c 74 61 62 6c 69  x(X) LP seltabli
4620: 73 74 28 46 29 20 52 50 0a 20 20 20 20 20 20 20  st(F) RP.       
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 28               as(
4640: 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69  Z) on_opt(N) usi
4650: 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 20  ng_opt(U). {.   
4660: 20 69 66 28 20 58 3d 3d 30 20 26 26 20 5a 2e 6e   if( X==0 && Z.n
4670: 3d 3d 30 20 26 26 20 4e 3d 3d 30 20 26 26 20 55  ==0 && N==0 && U
4680: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 41 20 3d  ==0 ){.      A =
4690: 20 46 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   F;.    }else if
46a0: 28 20 46 2d 3e 6e 53 72 63 3d 3d 31 20 29 7b 0a  ( F->nSrc==1 ){.
46b0: 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65        A = sqlite
46c0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
46d0: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 58 2c  omTerm(pParse,X,
46e0: 30 2c 30 2c 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20  0,0,&Z,0,N,U);. 
46f0: 20 20 20 20 20 69 66 28 20 41 20 29 7b 0a 20 20       if( A ){.  
4700: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
4710: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 20  List_item *pNew 
4720: 3d 20 26 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d  = &A->a[A->nSrc-
4730: 31 5d 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75  1];.        stru
4740: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
4750: 2a 70 4f 6c 64 20 3d 20 46 2d 3e 61 3b 0a 20 20  *pOld = F->a;.  
4760: 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d        pNew->zNam
4770: 65 20 3d 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 3b  e = pOld->zName;
4780: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a  .        pNew->z
4790: 44 61 74 61 62 61 73 65 20 3d 20 70 4f 6c 64 2d  Database = pOld-
47a0: 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20  >zDatabase;.    
47b0: 20 20 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63      pNew->pSelec
47c0: 74 20 3d 20 70 4f 6c 64 2d 3e 70 53 65 6c 65 63  t = pOld->pSelec
47d0: 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 2d  t;.        pOld-
47e0: 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c 64 2d 3e 7a  >zName = pOld->z
47f0: 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
4800: 20 20 20 20 20 20 70 4f 6c 64 2d 3e 70 53 65 6c        pOld->pSel
4810: 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ect = 0;.      }
4820: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72  .      sqlite3Sr
4830: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  cListDelete(pPar
4840: 73 65 2d 3e 64 62 2c 20 46 29 3b 0a 20 20 20 20  se->db, F);.    
4850: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 65 6c  }else{.      Sel
4860: 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 3b 0a  ect *pSubquery;.
4870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
4880: 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70  ListShiftJoinTyp
4890: 65 28 46 29 3b 0a 20 20 20 20 20 20 70 53 75 62  e(F);.      pSub
48a0: 71 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 53  query = sqlite3S
48b0: 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c  electNew(pParse,
48c0: 30 2c 46 2c 30 2c 30 2c 30 2c 30 2c 53 46 5f 4e  0,F,0,0,0,0,SF_N
48d0: 65 73 74 65 64 46 72 6f 6d 2c 30 2c 30 29 3b 0a  estedFrom,0,0);.
48e0: 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65        A = sqlite
48f0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
4900: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 58 2c  omTerm(pParse,X,
4910: 30 2c 30 2c 26 5a 2c 70 53 75 62 71 75 65 72 79  0,0,&Z,pSubquery
4920: 2c 4e 2c 55 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ,N,U);.    }.  }
4930: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
4940: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a 25  OMIT_SUBQUERY..%
4950: 74 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65 6e  type dbnm {Token
4960: 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e 20  }.dbnm(A) ::= . 
4970: 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b           {A.z=0;
4980: 20 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41 29   A.n=0;}.dbnm(A)
4990: 20 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e 20   ::= DOT nm(X). 
49a0: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20  {A = X;}..%type 
49b0: 66 75 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69 73  fullname {SrcLis
49c0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
49d0: 66 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74 65  fullname {sqlite
49e0: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
49f0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
4a00: 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a 3d  .fullname(A) ::=
4a10: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e 20   nm(X) dbnm(Y). 
4a20: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63   {A = sqlite3Src
4a30: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
4a40: 65 2d 3e 64 62 2c 30 2c 26 58 2c 26 59 29 3b 7d  e->db,0,&X,&Y);}
4a50: 0a 0a 25 74 79 70 65 20 6a 6f 69 6e 6f 70 20 7b  ..%type joinop {
4a60: 69 6e 74 7d 0a 25 74 79 70 65 20 6a 6f 69 6e 6f  int}.%type joino
4a70: 70 32 20 7b 69 6e 74 7d 0a 6a 6f 69 6e 6f 70 28  p2 {int}.joinop(
4a80: 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 7c 4a 4f 49  X) ::= COMMA|JOI
4a90: 4e 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
4aa0: 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 52 3b 20  { X = JT_INNER; 
4ab0: 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20  }.joinop(X) ::= 
4ac0: 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f 49 4e 2e  JOIN_KW(A) JOIN.
4ad0: 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 73           { X = s
4ae0: 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70  qlite3JoinType(p
4af0: 50 61 72 73 65 2c 26 41 2c 30 2c 30 29 3b 20 7d  Parse,&A,0,0); }
4b00: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
4b10: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
4b20: 4a 4f 49 4e 2e 20 20 20 7b 20 58 20 3d 20 73 71  JOIN.   { X = sq
4b30: 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50  lite3JoinType(pP
4b40: 61 72 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20 7d  arse,&A,&B,0); }
4b50: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a  .joinop(X) ::= J
4b60: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20  OIN_KW(A) nm(B) 
4b70: 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20  nm(C) JOIN..    
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33     { X = sqlite3
4bb0: 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c  JoinType(pParse,
4bc0: 26 41 2c 26 42 2c 26 43 29 3b 20 7d 0a 0a 25 74  &A,&B,&C); }..%t
4bd0: 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45 78 70 72  ype on_opt {Expr
4be0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f  *}.%destructor o
4bf0: 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  n_opt {sqlite3Ex
4c00: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
4c10: 3e 64 62 2c 20 24 24 29 3b 7d 0a 6f 6e 5f 6f 70  >db, $$);}.on_op
4c20: 74 28 4e 29 20 3a 3a 3d 20 4f 4e 20 65 78 70 72  t(N) ::= ON expr
4c30: 28 45 29 2e 20 20 20 7b 4e 20 3d 20 45 2e 70 45  (E).   {N = E.pE
4c40: 78 70 72 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20  xpr;}.on_opt(N) 
4c50: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
4c60: 20 20 7b 4e 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 4e    {N = 0;}..// N
4c70: 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 62 6c  ote that this bl
4c80: 6f 63 6b 20 61 62 75 73 65 73 20 74 68 65 20 54  ock abuses the T
4c90: 6f 6b 65 6e 20 74 79 70 65 20 6a 75 73 74 20 61  oken type just a
4ca0: 20 6c 69 74 74 6c 65 2e 20 49 66 20 74 68 65 72   little. If ther
4cb0: 65 20 69 73 0a 2f 2f 20 6e 6f 20 22 49 4e 44 45  e is.// no "INDE
4cc0: 58 45 44 20 42 59 22 20 63 6c 61 75 73 65 2c 20  XED BY" clause, 
4cd0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 74 6f 6b  the returned tok
4ce0: 65 6e 20 69 73 20 65 6d 70 74 79 20 28 7a 3d 3d  en is empty (z==
4cf0: 30 20 26 26 20 6e 3d 3d 30 29 2e 20 49 66 0a 2f  0 && n==0). If./
4d00: 2f 20 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e  / there is an IN
4d10: 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c  DEXED BY clause,
4d20: 20 74 68 65 6e 20 74 68 65 20 74 6f 6b 65 6e 20   then the token 
4d30: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 61 73 20  is populated as 
4d40: 70 65 72 20 6e 6f 72 6d 61 6c 2c 0a 2f 2f 20 77  per normal,.// w
4d50: 69 74 68 20 7a 20 70 6f 69 6e 74 69 6e 67 20 74  ith z pointing t
4d60: 6f 20 74 68 65 20 74 6f 6b 65 6e 20 64 61 74 61  o the token data
4d70: 20 61 6e 64 20 6e 20 63 6f 6e 74 61 69 6e 69 6e   and n containin
4d80: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
4d90: 62 79 74 65 73 0a 2f 2f 20 69 6e 20 74 68 65 20  bytes.// in the 
4da0: 74 6f 6b 65 6e 2e 0a 2f 2f 0a 2f 2f 20 49 66 20  token..//.// If 
4db0: 74 68 65 72 65 20 69 73 20 61 20 22 4e 4f 54 20  there is a "NOT 
4dc0: 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 2c  INDEXED" clause,
4dd0: 20 74 68 65 6e 20 28 7a 3d 3d 30 20 26 26 20 6e   then (z==0 && n
4de0: 3d 3d 31 29 2c 20 77 68 69 63 68 20 69 73 20 0a  ==1), which is .
4df0: 2f 2f 20 6e 6f 72 6d 61 6c 6c 79 20 69 6c 6c 65  // normally ille
4e00: 67 61 6c 2e 20 54 68 65 20 73 71 6c 69 74 65 33  gal. The sqlite3
4e10: 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
4e20: 28 29 20 66 75 6e 63 74 69 6f 6e 20 0a 2f 2f 20  () function .// 
4e30: 72 65 63 6f 67 6e 69 7a 65 73 20 61 6e 64 20 69  recognizes and i
4e40: 6e 74 65 72 70 72 65 74 73 20 74 68 69 73 20 61  nterprets this a
4e50: 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65  s a special case
4e60: 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 6e 64 65 78  ..//.%type index
4e70: 65 64 5f 6f 70 74 20 7b 54 6f 6b 65 6e 7d 0a 69  ed_opt {Token}.i
4e80: 6e 64 65 78 65 64 5f 6f 70 74 28 41 29 20 3a 3a  ndexed_opt(A) ::
4e90: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4ea0: 20 20 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d      {A.z=0; A.n=
4eb0: 30 3b 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28  0;}.indexed_opt(
4ec0: 41 29 20 3a 3a 3d 20 49 4e 44 45 58 45 44 20 42  A) ::= INDEXED B
4ed0: 59 20 6e 6d 28 58 29 2e 20 7b 41 20 3d 20 58 3b  Y nm(X). {A = X;
4ee0: 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28 41 29  }.indexed_opt(A)
4ef0: 20 3a 3a 3d 20 4e 4f 54 20 49 4e 44 45 58 45 44   ::= NOT INDEXED
4f00: 2e 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20 41  .      {A.z=0; A
4f10: 2e 6e 3d 31 3b 7d 0a 0a 25 74 79 70 65 20 75 73  .n=1;}..%type us
4f20: 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69 73 74 2a  ing_opt {IdList*
4f30: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 75 73  }.%destructor us
4f40: 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33  ing_opt {sqlite3
4f50: 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  IdListDelete(pPa
4f60: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 75  rse->db, $$);}.u
4f70: 73 69 6e 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20  sing_opt(U) ::= 
4f80: 55 53 49 4e 47 20 4c 50 20 69 6e 73 63 6f 6c 6c  USING LP inscoll
4f90: 69 73 74 28 4c 29 20 52 50 2e 20 20 7b 55 20 3d  ist(L) RP.  {U =
4fa0: 20 4c 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55   L;}.using_opt(U
4fb0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
4fd0: 55 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20  U = 0;}...%type 
4fe0: 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b 45 78 70  orderby_opt {Exp
4ff0: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
5000: 74 6f 72 20 6f 72 64 65 72 62 79 5f 6f 70 74 20  tor orderby_opt 
5010: 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  {sqlite3ExprList
5020: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
5030: 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73  b, $$);}.%type s
5040: 6f 72 74 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  ortlist {ExprLis
5050: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
5060: 73 6f 72 74 6c 69 73 74 20 7b 73 71 6c 69 74 65  sortlist {sqlite
5070: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5080: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
5090: 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28 41  }..orderby_opt(A
50a0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64 65 72 62   {A = 0;}.orderb
50d0: 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4f 52 44  y_opt(A) ::= ORD
50e0: 45 52 20 42 59 20 73 6f 72 74 6c 69 73 74 28 58  ER BY sortlist(X
50f0: 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d  ).      {A = X;}
5100: 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d  .sortlist(A) ::=
5110: 20 73 6f 72 74 6c 69 73 74 28 58 29 20 43 4f 4d   sortlist(X) COM
5120: 4d 41 20 65 78 70 72 28 59 29 20 73 6f 72 74 6f  MA expr(Y) sorto
5130: 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d  rder(Z). {.  A =
5140: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
5150: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 58 2c  Append(pParse,X,
5160: 59 2e 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  Y.pExpr);.  if( 
5170: 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70  A ) A->a[A->nExp
5180: 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d  r-1].sortOrder =
5190: 20 28 75 38 29 5a 3b 0a 7d 0a 73 6f 72 74 6c 69   (u8)Z;.}.sortli
51a0: 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 59  st(A) ::= expr(Y
51b0: 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20  ) sortorder(Z). 
51c0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
51d0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
51e0: 61 72 73 65 2c 30 2c 59 2e 70 45 78 70 72 29 3b  arse,0,Y.pExpr);
51f0: 0a 20 20 69 66 28 20 41 20 26 26 20 41 4c 57 41  .  if( A && ALWA
5200: 59 53 28 41 2d 3e 61 29 20 29 20 41 2d 3e 61 5b  YS(A->a) ) A->a[
5210: 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28  0].sortOrder = (
5220: 75 38 29 5a 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  u8)Z;.}..%type s
5230: 6f 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d 0a 0a  ortorder {int}..
5240: 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d  sortorder(A) ::=
5250: 20 41 53 43 2e 20 20 20 20 20 20 20 20 20 20 20   ASC.           
5260: 7b 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41  {A = SQLITE_SO_A
5270: 53 43 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41  SC;}.sortorder(A
5280: 29 20 3a 3a 3d 20 44 45 53 43 2e 20 20 20 20 20  ) ::= DESC.     
5290: 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45       {A = SQLITE
52a0: 5f 53 4f 5f 44 45 53 43 3b 7d 0a 73 6f 72 74 6f  _SO_DESC;}.sorto
52b0: 72 64 65 72 28 41 29 20 3a 3a 3d 20 2e 20 20 20  rder(A) ::= .   
52c0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
52d0: 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a  SQLITE_SO_ASC;}.
52e0: 0a 25 74 79 70 65 20 67 72 6f 75 70 62 79 5f 6f  .%type groupby_o
52f0: 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  pt {ExprList*}.%
5300: 64 65 73 74 72 75 63 74 6f 72 20 67 72 6f 75 70  destructor group
5310: 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  by_opt {sqlite3E
5320: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
5330: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
5340: 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a  groupby_opt(A) :
5350: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
5360: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
5370: 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41  ;}.groupby_opt(A
5380: 29 20 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 6e  ) ::= GROUP BY n
5390: 65 78 70 72 6c 69 73 74 28 58 29 2e 20 7b 41 20  exprlist(X). {A 
53a0: 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76  = X;}..%type hav
53b0: 69 6e 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a  ing_opt {Expr*}.
53c0: 25 64 65 73 74 72 75 63 74 6f 72 20 68 61 76 69  %destructor havi
53d0: 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45  ng_opt {sqlite3E
53e0: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
53f0: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 68 61 76 69  ->db, $$);}.havi
5400: 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  ng_opt(A) ::= . 
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
5420: 41 20 3d 20 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f  A = 0;}.having_o
5430: 70 74 28 41 29 20 3a 3a 3d 20 48 41 56 49 4e 47  pt(A) ::= HAVING
5440: 20 65 78 70 72 28 58 29 2e 20 20 7b 41 20 3d 20   expr(X).  {A = 
5450: 58 2e 70 45 78 70 72 3b 7d 0a 0a 25 74 79 70 65  X.pExpr;}..%type
5460: 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 73 74 72 75   limit_opt {stru
5470: 63 74 20 4c 69 6d 69 74 56 61 6c 7d 0a 0a 2f 2f  ct LimitVal}..//
5480: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
5490: 66 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 77 69  for limit_opt wi
54a0: 6c 6c 20 6e 65 76 65 72 20 66 69 72 65 20 69 6e  ll never fire in
54b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 67 72 61   the current gra
54c0: 6d 6d 61 72 2e 0a 2f 2f 20 54 68 65 20 6c 69 6d  mmar..// The lim
54d0: 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69  it_opt non-termi
54e0: 6e 61 6c 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20  nal only occurs 
54f0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
5500: 73 69 6e 67 6c 65 20 70 72 6f 64 75 63 74 69 6f  single productio
5510: 6e 0a 2f 2f 20 72 75 6c 65 20 66 6f 72 20 53 45  n.// rule for SE
5520: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
5530: 20 20 41 73 20 73 6f 6f 6e 20 61 73 20 74 68 65    As soon as the
5540: 20 72 75 6c 65 20 74 68 61 74 20 63 72 65 61 74   rule that creat
5550: 65 20 74 68 65 20 0a 2f 2f 20 6c 69 6d 69 74 5f  e the .// limit_
5560: 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  opt non-terminal
5570: 20 72 65 64 75 63 65 73 2c 20 74 68 65 20 53 45   reduces, the SE
5580: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72  LECT statement r
5590: 75 6c 65 20 77 69 6c 6c 20 61 6c 73 6f 0a 2f 2f  ule will also.//
55a0: 20 72 65 64 75 63 65 2e 20 20 53 6f 20 74 68 65   reduce.  So the
55b0: 72 65 20 69 73 20 6e 65 76 65 72 20 61 20 6c 69  re is never a li
55c0: 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d  mit_opt non-term
55d0: 69 6e 61 6c 20 6f 6e 20 74 68 65 20 73 74 61 63  inal on the stac
55e0: 6b 20 0a 2f 2f 20 65 78 63 65 70 74 20 61 73 20  k .// except as 
55f0: 61 20 74 72 61 6e 73 69 65 6e 74 2e 20 20 53 6f  a transient.  So
5600: 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
5610: 61 6e 79 74 68 69 6e 67 20 74 6f 20 64 65 73 74  anything to dest
5620: 72 6f 79 2e 0a 2f 2f 0a 2f 2f 25 64 65 73 74 72  roy..//.//%destr
5630: 75 63 74 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20  uctor limit_opt 
5640: 7b 0a 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70  {.//  sqlite3Exp
5650: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  rDelete(pParse->
5660: 64 62 2c 20 24 24 2e 70 4c 69 6d 69 74 29 3b 0a  db, $$.pLimit);.
5670: 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  //  sqlite3ExprD
5680: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
5690: 2c 20 24 24 2e 70 4f 66 66 73 65 74 29 3b 0a 2f  , $$.pOffset);./
56a0: 2f 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  /}.limit_opt(A) 
56b0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
56c0: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d           {A.pLim
56d0: 69 74 20 3d 20 30 3b 20 41 2e 70 4f 66 66 73 65  it = 0; A.pOffse
56e0: 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70  t = 0;}.limit_op
56f0: 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65  t(A) ::= LIMIT e
5700: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 7b 41  xpr(X).       {A
5710: 2e 70 4c 69 6d 69 74 20 3d 20 58 2e 70 45 78 70  .pLimit = X.pExp
5720: 72 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 30  r; A.pOffset = 0
5730: 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  ;}.limit_opt(A) 
5740: 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58  ::= LIMIT expr(X
5750: 29 20 4f 46 46 53 45 54 20 65 78 70 72 28 59 29  ) OFFSET expr(Y)
5760: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  . .             
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d           {A.pLim
5790: 69 74 20 3d 20 58 2e 70 45 78 70 72 3b 20 41 2e  it = X.pExpr; A.
57a0: 70 4f 66 66 73 65 74 20 3d 20 59 2e 70 45 78 70  pOffset = Y.pExp
57b0: 72 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  r;}.limit_opt(A)
57c0: 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28   ::= LIMIT expr(
57d0: 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29  X) COMMA expr(Y)
57e0: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  . .             
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5800: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4f 66 66           {A.pOff
5810: 73 65 74 20 3d 20 58 2e 70 45 78 70 72 3b 20 41  set = X.pExpr; A
5820: 2e 70 4c 69 6d 69 74 20 3d 20 59 2e 70 45 78 70  .pLimit = Y.pExp
5830: 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  r;}..///////////
5840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5850: 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74   The DELETE stat
5860: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
5870: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5880: 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65 66 20 53 51  ///.//.%ifdef SQ
5890: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
58a0: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a  TE_DELETE_LIMIT.
58b0: 63 6d 64 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46  cmd ::= DELETE F
58c0: 52 4f 4d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20  ROM fullname(X) 
58d0: 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 20 77  indexed_opt(I) w
58e0: 68 65 72 65 5f 6f 70 74 28 57 29 20 0a 20 20 20  here_opt(W) .   
58f0: 20 20 20 20 20 6f 72 64 65 72 62 79 5f 6f 70 74       orderby_opt
5900: 28 4f 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29  (O) limit_opt(L)
5910: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 72 63  . {.  sqlite3Src
5920: 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 70 50  ListIndexedBy(pP
5930: 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20  arse, X, &I);.  
5940: 57 20 3d 20 73 71 6c 69 74 65 33 4c 69 6d 69 74  W = sqlite3Limit
5950: 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 58 2c  Where(pParse, X,
5960: 20 57 2c 20 4f 2c 20 4c 2e 70 4c 69 6d 69 74 2c   W, O, L.pLimit,
5970: 20 4c 2e 70 4f 66 66 73 65 74 2c 20 22 44 45 4c   L.pOffset, "DEL
5980: 45 54 45 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  ETE");.  sqlite3
5990: 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73  DeleteFrom(pPars
59a0: 65 2c 58 2c 57 29 3b 0a 7d 0a 25 65 6e 64 69 66  e,X,W);.}.%endif
59b0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
59c0: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
59d0: 4c 45 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a  LETE_LIMIT.cmd :
59e0: 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 66  := DELETE FROM f
59f0: 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65 78  ullname(X) index
5a00: 65 64 5f 6f 70 74 28 49 29 20 77 68 65 72 65 5f  ed_opt(I) where_
5a10: 6f 70 74 28 57 29 2e 20 7b 0a 20 20 73 71 6c 69  opt(W). {.  sqli
5a20: 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
5a30: 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20 26  dBy(pParse, X, &
5a40: 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  I);.  sqlite3Del
5a50: 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 58  eteFrom(pParse,X
5a60: 2c 57 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25  ,W);.}.%endif..%
5a70: 74 79 70 65 20 77 68 65 72 65 5f 6f 70 74 20 7b  type where_opt {
5a80: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
5a90: 6f 72 20 77 68 65 72 65 5f 6f 70 74 20 7b 73 71  or where_opt {sq
5aa0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5ab0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
5ac0: 7d 0a 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 20  }..where_opt(A) 
5ad0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
5ae0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
5af0: 7d 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a  }.where_opt(A) :
5b00: 3a 3d 20 57 48 45 52 45 20 65 78 70 72 28 58 29  := WHERE expr(X)
5b10: 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58 2e 70  .       {A = X.p
5b20: 45 78 70 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  Expr;}..////////
5b30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b40: 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20 63 6f  // The UPDATE co
5b50: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
5b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5b70: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65 66  //////.//.%ifdef
5b80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
5b90: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
5ba0: 49 54 0a 63 6d 64 20 3a 3a 3d 20 55 50 44 41 54  IT.cmd ::= UPDAT
5bb0: 45 20 6f 72 63 6f 6e 66 28 52 29 20 66 75 6c 6c  E orconf(R) full
5bc0: 6e 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f  name(X) indexed_
5bd0: 6f 70 74 28 49 29 20 53 45 54 20 73 65 74 6c 69  opt(I) SET setli
5be0: 73 74 28 59 29 20 77 68 65 72 65 5f 6f 70 74 28  st(Y) where_opt(
5bf0: 57 29 0a 20 20 20 20 20 20 20 20 6f 72 64 65 72  W).        order
5c00: 62 79 5f 6f 70 74 28 4f 29 20 6c 69 6d 69 74 5f  by_opt(O) limit_
5c10: 6f 70 74 28 4c 29 2e 20 20 7b 0a 20 20 73 71 6c  opt(L).  {.  sql
5c20: 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
5c30: 65 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20  edBy(pParse, X, 
5c40: 26 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  &I);.  sqlite3Ex
5c50: 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
5c60: 68 28 70 50 61 72 73 65 2c 59 2c 22 73 65 74 20  h(pParse,Y,"set 
5c70: 6c 69 73 74 22 29 3b 20 0a 20 20 57 20 3d 20 73  list"); .  W = s
5c80: 71 6c 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65  qlite3LimitWhere
5c90: 28 70 50 61 72 73 65 2c 20 58 2c 20 57 2c 20 4f  (pParse, X, W, O
5ca0: 2c 20 4c 2e 70 4c 69 6d 69 74 2c 20 4c 2e 70 4f  , L.pLimit, L.pO
5cb0: 66 66 73 65 74 2c 20 22 55 50 44 41 54 45 22 29  ffset, "UPDATE")
5cc0: 3b 0a 20 20 73 71 6c 69 74 65 33 55 70 64 61 74  ;.  sqlite3Updat
5cd0: 65 28 70 50 61 72 73 65 2c 58 2c 59 2c 57 2c 52  e(pParse,X,Y,W,R
5ce0: 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 25 69 66 6e  );.}.%endif.%ifn
5cf0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5d00: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
5d10: 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 55 50  LIMIT.cmd ::= UP
5d20: 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29 20 66  DATE orconf(R) f
5d30: 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65 78  ullname(X) index
5d40: 65 64 5f 6f 70 74 28 49 29 20 53 45 54 20 73 65  ed_opt(I) SET se
5d50: 74 6c 69 73 74 28 59 29 0a 20 20 20 20 20 20 20  tlist(Y).       
5d60: 20 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 20   where_opt(W).  
5d70: 7b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  {.  sqlite3SrcLi
5d80: 73 74 49 6e 64 65 78 65 64 42 79 28 70 50 61 72  stIndexedBy(pPar
5d90: 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73 71  se, X, &I);.  sq
5da0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
5db0: 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c  ckLength(pParse,
5dc0: 59 2c 22 73 65 74 20 6c 69 73 74 22 29 3b 20 0a  Y,"set list"); .
5dd0: 20 20 73 71 6c 69 74 65 33 55 70 64 61 74 65 28    sqlite3Update(
5de0: 70 50 61 72 73 65 2c 58 2c 59 2c 57 2c 52 29 3b  pParse,X,Y,W,R);
5df0: 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25 74 79 70 65  .}.%endif..%type
5e00: 20 73 65 74 6c 69 73 74 20 7b 45 78 70 72 4c 69   setlist {ExprLi
5e10: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
5e20: 20 73 65 74 6c 69 73 74 20 7b 73 71 6c 69 74 65   setlist {sqlite
5e30: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
5e40: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
5e50: 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a  }..setlist(A) ::
5e60: 3d 20 73 65 74 6c 69 73 74 28 5a 29 20 43 4f 4d  = setlist(Z) COM
5e70: 4d 41 20 6e 6d 28 58 29 20 45 51 20 65 78 70 72  MA nm(X) EQ expr
5e80: 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (Y). {.  A = sql
5e90: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
5ea0: 6e 64 28 70 50 61 72 73 65 2c 20 5a 2c 20 59 2e  nd(pParse, Z, Y.
5eb0: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65  pExpr);.  sqlite
5ec0: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65  3ExprListSetName
5ed0: 28 70 50 61 72 73 65 2c 20 41 2c 20 26 58 2c 20  (pParse, A, &X, 
5ee0: 31 29 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41 29  1);.}.setlist(A)
5ef0: 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51 20 65 78   ::= nm(X) EQ ex
5f00: 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Y). {.  A = s
5f10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
5f20: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20  pend(pParse, 0, 
5f30: 59 2e 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69  Y.pExpr);.  sqli
5f40: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
5f50: 6d 65 28 70 50 61 72 73 65 2c 20 41 2c 20 26 58  me(pParse, A, &X
5f60: 2c 20 31 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  , 1);.}..///////
5f70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5f80: 2f 2f 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63  /// The INSERT c
5f90: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
5fa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
5fb0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
5fc0: 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52  ::= insert_cmd(R
5fd0: 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28  ) INTO fullname(
5fe0: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
5ff0: 74 28 46 29 20 76 61 6c 75 65 6c 69 73 74 28 59  t(F) valuelist(Y
6000: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b  )..            {
6010: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70 50  sqlite3Insert(pP
6020: 61 72 73 65 2c 20 58 2c 20 59 2e 70 4c 69 73 74  arse, X, Y.pList
6030: 2c 20 59 2e 70 53 65 6c 65 63 74 2c 20 46 2c 20  , Y.pSelect, F, 
6040: 52 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 69 6e 73  R);}.cmd ::= ins
6050: 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20  ert_cmd(R) INTO 
6060: 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63  fullname(X) insc
6070: 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65  ollist_opt(F) se
6080: 6c 65 63 74 28 53 29 2e 0a 20 20 20 20 20 20 20  lect(S)..       
6090: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 49 6e 73       {sqlite3Ins
60a0: 65 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 30  ert(pParse, X, 0
60b0: 2c 20 53 2c 20 46 2c 20 52 29 3b 7d 0a 63 6d 64  , S, F, R);}.cmd
60c0: 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28   ::= insert_cmd(
60d0: 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65  R) INTO fullname
60e0: 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f  (X) inscollist_o
60f0: 70 74 28 46 29 20 44 45 46 41 55 4c 54 20 56 41  pt(F) DEFAULT VA
6100: 4c 55 45 53 2e 0a 20 20 20 20 20 20 20 20 20 20  LUES..          
6110: 20 20 7b 73 71 6c 69 74 65 33 49 6e 73 65 72 74    {sqlite3Insert
6120: 28 70 50 61 72 73 65 2c 20 58 2c 20 30 2c 20 30  (pParse, X, 0, 0
6130: 2c 20 46 2c 20 52 29 3b 7d 0a 0a 25 74 79 70 65  , F, R);}..%type
6140: 20 69 6e 73 65 72 74 5f 63 6d 64 20 7b 75 38 7d   insert_cmd {u8}
6150: 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 20 3a  .insert_cmd(A) :
6160: 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63 6f 6e 66  := INSERT orconf
6170: 28 52 29 2e 20 20 20 7b 41 20 3d 20 52 3b 7d 0a  (R).   {A = R;}.
6180: 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 20 3a 3a  insert_cmd(A) ::
6190: 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20 20 20  = REPLACE.      
61a0: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 52 65        {A = OE_Re
61b0: 70 6c 61 63 65 3b 7d 0a 0a 2f 2f 20 41 20 56 61  place;}..// A Va
61c0: 6c 75 65 4c 69 73 74 20 69 73 20 65 69 74 68 65  lueList is eithe
61d0: 72 20 61 20 73 69 6e 67 6c 65 20 56 41 4c 55 45  r a single VALUE
61e0: 53 20 63 6c 61 75 73 65 20 6f 72 20 61 20 63 6f  S clause or a co
61f0: 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 6c 69  mma-separated li
6200: 73 74 0a 2f 2f 20 6f 66 20 56 41 4c 55 45 53 20  st.// of VALUES 
6210: 63 6c 61 75 73 65 73 2e 20 20 49 66 20 69 74 20  clauses.  If it 
6220: 69 73 20 61 20 73 69 6e 67 6c 65 20 56 41 4c 55  is a single VALU
6230: 45 53 20 63 6c 61 75 73 65 20 74 68 65 6e 20 74  ES clause then t
6240: 68 65 0a 2f 2f 20 56 61 6c 75 65 4c 69 73 74 2e  he.// ValueList.
6250: 70 4c 69 73 74 20 66 69 65 6c 64 20 70 6f 69 6e  pList field poin
6260: 74 73 20 74 6f 20 74 68 65 20 65 78 70 72 65 73  ts to the expres
6270: 73 69 6f 6e 20 6c 69 73 74 20 6f 66 20 74 68 61  sion list of tha
6280: 74 20 63 6c 61 75 73 65 2e 0a 2f 2f 20 49 66 20  t clause..// If 
6290: 69 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  it is a list of 
62a0: 56 41 4c 55 45 53 20 63 6c 61 75 73 65 73 2c 20  VALUES clauses, 
62b0: 74 68 65 6e 20 74 68 6f 73 65 20 63 6c 61 75 73  then those claus
62c0: 65 73 20 61 72 65 20 74 72 61 6e 73 66 6f 72 6d  es are transform
62d0: 65 64 0a 2f 2f 20 69 6e 74 6f 20 61 20 73 65 74  ed.// into a set
62e0: 20 6f 66 20 53 45 4c 45 43 54 20 73 74 61 74 65   of SELECT state
62f0: 6d 65 6e 74 73 20 77 69 74 68 6f 75 74 20 46 52  ments without FR
6300: 4f 4d 20 63 6c 61 75 73 65 73 20 61 6e 64 20 63  OM clauses and c
6310: 6f 6e 6e 65 63 74 65 64 20 62 79 0a 2f 2f 20 55  onnected by.// U
6320: 4e 49 4f 4e 20 41 4c 4c 20 61 6e 64 20 74 68 65  NION ALL and the
6330: 20 56 61 6c 75 65 4c 69 73 74 2e 70 53 65 6c 65   ValueList.pSele
6340: 63 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ct points to the
6350: 20 72 69 67 68 74 2d 6d 6f 73 74 20 53 45 4c 45   right-most SELE
6360: 43 54 20 69 6e 0a 2f 2f 20 74 68 61 74 20 63 6f  CT in.// that co
6370: 6d 70 6f 75 6e 64 2e 0a 25 74 79 70 65 20 76 61  mpound..%type va
6380: 6c 75 65 6c 69 73 74 20 7b 73 74 72 75 63 74 20  luelist {struct 
6390: 56 61 6c 75 65 4c 69 73 74 7d 0a 25 64 65 73 74  ValueList}.%dest
63a0: 72 75 63 74 6f 72 20 76 61 6c 75 65 6c 69 73 74  ructor valuelist
63b0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   {.  sqlite3Expr
63c0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
63d0: 65 2d 3e 64 62 2c 20 24 24 2e 70 4c 69 73 74 29  e->db, $$.pList)
63e0: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
63f0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
6400: 64 62 2c 20 24 24 2e 70 53 65 6c 65 63 74 29 3b  db, $$.pSelect);
6410: 0a 7d 0a 76 61 6c 75 65 6c 69 73 74 28 41 29 20  .}.valuelist(A) 
6420: 3a 3a 3d 20 56 41 4c 55 45 53 20 4c 50 20 6e 65  ::= VALUES LP ne
6430: 78 70 72 6c 69 73 74 28 58 29 20 52 50 2e 20 7b  xprlist(X) RP. {
6440: 0a 20 20 41 2e 70 4c 69 73 74 20 3d 20 58 3b 0a  .  A.pList = X;.
6450: 20 20 41 2e 70 53 65 6c 65 63 74 20 3d 20 30 3b    A.pSelect = 0;
6460: 0a 7d 0a 0a 2f 2f 20 53 69 6e 63 65 20 61 20 6c  .}..// Since a l
6470: 69 73 74 20 6f 66 20 56 41 4c 55 45 73 20 69 73  ist of VALUEs is
6480: 20 69 6e 70 6c 65 6d 65 6e 74 65 64 20 61 73 20   inplemented as 
6490: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
64a0: 54 2c 20 77 65 20 68 61 76 65 0a 2f 2f 20 74 6f  T, we have.// to
64b0: 20 64 69 73 61 62 6c 65 20 74 68 65 20 76 61 6c   disable the val
64c0: 75 65 20 6c 69 73 74 20 6f 70 74 69 6f 6e 20 69  ue list option i
64d0: 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  f compound SELEC
64e0: 54 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 2e  Ts are disabled.
64f0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
6500: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
6510: 4c 45 43 54 0a 76 61 6c 75 65 6c 69 73 74 28 41  LECT.valuelist(A
6520: 29 20 3a 3a 3d 20 76 61 6c 75 65 6c 69 73 74 28  ) ::= valuelist(
6530: 58 29 20 43 4f 4d 4d 41 20 4c 50 20 65 78 70 72  X) COMMA LP expr
6540: 6c 69 73 74 28 59 29 20 52 50 2e 20 7b 0a 20 20  list(Y) RP. {.  
6550: 53 65 6c 65 63 74 20 2a 70 52 69 67 68 74 20 3d  Select *pRight =
6560: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65   sqlite3SelectNe
6570: 77 28 70 50 61 72 73 65 2c 20 59 2c 20 30 2c 20  w(pParse, Y, 0, 
6580: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
6590: 2c 20 30 29 3b 0a 20 20 69 66 28 20 58 2e 70 4c  , 0);.  if( X.pL
65a0: 69 73 74 20 29 7b 0a 20 20 20 20 58 2e 70 53 65  ist ){.    X.pSe
65b0: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
65c0: 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c 20  lectNew(pParse, 
65d0: 58 2e 70 4c 69 73 74 2c 20 30 2c 20 30 2c 20 30  X.pList, 0, 0, 0
65e0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , 0, 0, 0, 0, 0)
65f0: 3b 0a 20 20 20 20 58 2e 70 4c 69 73 74 20 3d 20  ;.    X.pList = 
6600: 30 3b 0a 20 20 7d 0a 20 20 41 2e 70 4c 69 73 74  0;.  }.  A.pList
6610: 20 3d 20 30 3b 0a 20 20 69 66 28 20 58 2e 70 53   = 0;.  if( X.pS
6620: 65 6c 65 63 74 3d 3d 30 20 7c 7c 20 70 52 69 67  elect==0 || pRig
6630: 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ht==0 ){.    sql
6640: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
6650: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 52 69  (pParse->db, pRi
6660: 67 68 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ght);.    sqlite
6670: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50  3SelectDelete(pP
6680: 61 72 73 65 2d 3e 64 62 2c 20 58 2e 70 53 65 6c  arse->db, X.pSel
6690: 65 63 74 29 3b 0a 20 20 20 20 41 2e 70 53 65 6c  ect);.    A.pSel
66a0: 65 63 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ect = 0;.  }else
66b0: 7b 0a 20 20 20 20 70 52 69 67 68 74 2d 3e 6f 70  {.    pRight->op
66c0: 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70   = TK_ALL;.    p
66d0: 52 69 67 68 74 2d 3e 70 50 72 69 6f 72 20 3d 20  Right->pPrior = 
66e0: 58 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70  X.pSelect;.    p
66f0: 52 69 67 68 74 2d 3e 73 65 6c 46 6c 61 67 73 20  Right->selFlags 
6700: 7c 3d 20 53 46 5f 56 61 6c 75 65 73 3b 0a 20 20  |= SF_Values;.  
6710: 20 20 70 52 69 67 68 74 2d 3e 70 50 72 69 6f 72    pRight->pPrior
6720: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
6730: 5f 56 61 6c 75 65 73 3b 0a 20 20 20 20 41 2e 70  _Values;.    A.p
6740: 53 65 6c 65 63 74 20 3d 20 70 52 69 67 68 74 3b  Select = pRight;
6750: 0a 20 20 7d 0a 7d 0a 25 65 6e 64 69 66 20 53 51  .  }.}.%endif SQ
6760: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
6770: 4e 44 5f 53 45 4c 45 43 54 0a 0a 25 74 79 70 65  ND_SELECT..%type
6780: 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20   inscollist_opt 
6790: 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  {IdList*}.%destr
67a0: 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 74  uctor inscollist
67b0: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 49 64 4c  _opt {sqlite3IdL
67c0: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
67d0: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79 70  ->db, $$);}.%typ
67e0: 65 20 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 49 64  e inscollist {Id
67f0: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
6800: 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 73  or inscollist {s
6810: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
6820: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
6830: 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c 6c 69 73 74  $);}..inscollist
6840: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20  _opt(A) ::= .   
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6860: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e 73      {A = 0;}.ins
6870: 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a  collist_opt(A) :
6880: 3a 3d 20 4c 50 20 69 6e 73 63 6f 6c 6c 69 73 74  := LP inscollist
6890: 28 58 29 20 52 50 2e 20 20 20 20 7b 41 20 3d 20  (X) RP.    {A = 
68a0: 58 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28 41  X;}.inscollist(A
68b0: 29 20 3a 3a 3d 20 69 6e 73 63 6f 6c 6c 69 73 74  ) ::= inscollist
68c0: 28 58 29 20 43 4f 4d 4d 41 20 6e 6d 28 59 29 2e  (X) COMMA nm(Y).
68d0: 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  .    {A = sqlite
68e0: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 70 50  3IdListAppend(pP
68f0: 61 72 73 65 2d 3e 64 62 2c 58 2c 26 59 29 3b 7d  arse->db,X,&Y);}
6900: 0a 69 6e 73 63 6f 6c 6c 69 73 74 28 41 29 20 3a  .inscollist(A) :
6910: 3a 3d 20 6e 6d 28 59 29 2e 0a 20 20 20 20 7b 41  := nm(Y)..    {A
6920: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
6930: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64  Append(pParse->d
6940: 62 2c 30 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f 2f  b,0,&Y);}../////
6950: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6960: 2f 2f 2f 2f 2f 2f 20 45 78 70 72 65 73 73 69 6f  ////// Expressio
6970: 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 2f 2f 2f  n Processing ///
6980: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25  //////////.//..%
69a0: 74 79 70 65 20 65 78 70 72 20 7b 45 78 70 72 53  type expr {ExprS
69b0: 70 61 6e 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pan}.%destructor
69c0: 20 65 78 70 72 20 7b 73 71 6c 69 74 65 33 45 78   expr {sqlite3Ex
69d0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
69e0: 3e 64 62 2c 20 24 24 2e 70 45 78 70 72 29 3b 7d  >db, $$.pExpr);}
69f0: 0a 25 74 79 70 65 20 74 65 72 6d 20 7b 45 78 70  .%type term {Exp
6a00: 72 53 70 61 6e 7d 0a 25 64 65 73 74 72 75 63 74  rSpan}.%destruct
6a10: 6f 72 20 74 65 72 6d 20 7b 73 71 6c 69 74 65 33  or term {sqlite3
6a20: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
6a30: 65 2d 3e 64 62 2c 20 24 24 2e 70 45 78 70 72 29  e->db, $$.pExpr)
6a40: 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20  ;}..%include {. 
6a50: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 75 74   /* This is a ut
6a60: 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 75 73  ility routine us
6a70: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 45 78  ed to set the Ex
6a80: 70 72 53 70 61 6e 2e 7a 53 74 61 72 74 20 61 6e  prSpan.zStart an
6a90: 64 0a 20 20 2a 2a 20 45 78 70 72 53 70 61 6e 2e  d.  ** ExprSpan.
6aa0: 7a 45 6e 64 20 76 61 6c 75 65 73 20 6f 66 20 70  zEnd values of p
6ab0: 4f 75 74 20 73 6f 20 74 68 61 74 20 74 68 65 20  Out so that the 
6ac0: 73 70 61 6e 20 63 6f 76 65 72 73 20 74 68 65 20  span covers the 
6ad0: 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 20 72 61  complete.  ** ra
6ae0: 6e 67 65 20 6f 66 20 74 65 78 74 20 62 65 67 69  nge of text begi
6af0: 6e 6e 69 6e 67 20 77 69 74 68 20 70 53 74 61 72  nning with pStar
6b00: 74 20 61 6e 64 20 67 6f 69 6e 67 20 74 6f 20 74  t and going to t
6b10: 68 65 20 65 6e 64 20 6f 66 20 70 45 6e 64 2e 0a  he end of pEnd..
6b20: 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f    */.  static vo
6b30: 69 64 20 73 70 61 6e 53 65 74 28 45 78 70 72 53  id spanSet(ExprS
6b40: 70 61 6e 20 2a 70 4f 75 74 2c 20 54 6f 6b 65 6e  pan *pOut, Token
6b50: 20 2a 70 53 74 61 72 74 2c 20 54 6f 6b 65 6e 20   *pStart, Token 
6b60: 2a 70 45 6e 64 29 7b 0a 20 20 20 20 70 4f 75 74  *pEnd){.    pOut
6b70: 2d 3e 7a 53 74 61 72 74 20 3d 20 70 53 74 61 72  ->zStart = pStar
6b80: 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  t->z;.    pOut->
6b90: 7a 45 6e 64 20 3d 20 26 70 45 6e 64 2d 3e 7a 5b  zEnd = &pEnd->z[
6ba0: 70 45 6e 64 2d 3e 6e 5d 3b 0a 20 20 7d 0a 0a 20  pEnd->n];.  }.. 
6bb0: 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20   /* Construct a 
6bc0: 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74 20  new Expr object 
6bd0: 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64  from a single id
6be0: 65 6e 74 69 66 69 65 72 2e 20 20 55 73 65 20 74  entifier.  Use t
6bf0: 68 65 0a 20 20 2a 2a 20 6e 65 77 20 45 78 70 72  he.  ** new Expr
6c00: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 4f 75   to populate pOu
6c10: 74 2e 20 20 53 65 74 20 74 68 65 20 73 70 61 6e  t.  Set the span
6c20: 20 6f 66 20 70 4f 75 74 20 74 6f 20 62 65 20 74   of pOut to be t
6c30: 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
6c40: 2a 2a 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ** that created 
6c50: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  the expression..
6c60: 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f    */.  static vo
6c70: 69 64 20 73 70 61 6e 45 78 70 72 28 45 78 70 72  id spanExpr(Expr
6c80: 53 70 61 6e 20 2a 70 4f 75 74 2c 20 50 61 72 73  Span *pOut, Pars
6c90: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
6ca0: 70 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 75 65  p, Token *pValue
6cb0: 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 45 78  ){.    pOut->pEx
6cc0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
6cd0: 72 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 30 2c  r(pParse, op, 0,
6ce0: 20 30 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20   0, pValue);.   
6cf0: 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d 20   pOut->zStart = 
6d00: 70 56 61 6c 75 65 2d 3e 7a 3b 0a 20 20 20 20 70  pValue->z;.    p
6d10: 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 26 70 56 61  Out->zEnd = &pVa
6d20: 6c 75 65 2d 3e 7a 5b 70 56 61 6c 75 65 2d 3e 6e  lue->z[pValue->n
6d30: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28 41  ];.  }.}..expr(A
6d40: 29 20 3a 3a 3d 20 74 65 72 6d 28 58 29 2e 20 20  ) ::= term(X).  
6d50: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
6d60: 58 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  X;}.expr(A) ::= 
6d70: 4c 50 28 42 29 20 65 78 70 72 28 58 29 20 52 50  LP(B) expr(X) RP
6d80: 28 45 29 2e 20 7b 41 2e 70 45 78 70 72 20 3d 20  (E). {A.pExpr = 
6d90: 58 2e 70 45 78 70 72 3b 20 73 70 61 6e 53 65 74  X.pExpr; spanSet
6da0: 28 26 41 2c 26 42 2c 26 45 29 3b 7d 0a 74 65 72  (&A,&B,&E);}.ter
6db0: 6d 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c 28 58 29  m(A) ::= NULL(X)
6dc0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73  .             {s
6dd0: 70 61 6e 45 78 70 72 28 26 41 2c 20 70 50 61 72  panExpr(&A, pPar
6de0: 73 65 2c 20 40 58 2c 20 26 58 29 3b 7d 0a 65 78  se, @X, &X);}.ex
6df0: 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 2e  pr(A) ::= id(X).
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6e10: 73 70 61 6e 45 78 70 72 28 26 41 2c 20 70 50 61  spanExpr(&A, pPa
6e20: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 26 58 29 3b  rse, TK_ID, &X);
6e30: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4a 4f  }.expr(A) ::= JO
6e40: 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20 20 20 20  IN_KW(X).       
6e50: 20 20 20 7b 73 70 61 6e 45 78 70 72 28 26 41 2c     {spanExpr(&A,
6e60: 20 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20   pParse, TK_ID, 
6e70: 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  &X);}.expr(A) ::
6e80: 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59  = nm(X) DOT nm(Y
6e90: 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d  ). {.  Expr *tem
6ea0: 70 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  p1 = sqlite3PExp
6eb0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c  r(pParse, TK_ID,
6ec0: 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78   0, 0, &X);.  Ex
6ed0: 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69  pr *temp2 = sqli
6ee0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
6ef0: 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 59   TK_ID, 0, 0, &Y
6f00: 29 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73  );.  A.pExpr = s
6f10: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
6f20: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70  se, TK_DOT, temp
6f30: 31 2c 20 74 65 6d 70 32 2c 20 30 29 3b 0a 20 20  1, temp2, 0);.  
6f40: 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c 26 59  spanSet(&A,&X,&Y
6f50: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
6f60: 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29   nm(X) DOT nm(Y)
6f70: 20 44 4f 54 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20   DOT nm(Z). {.  
6f80: 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71  Expr *temp1 = sq
6f90: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
6fa0: 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20  e, TK_ID, 0, 0, 
6fb0: 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d  &X);.  Expr *tem
6fc0: 70 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  p2 = sqlite3PExp
6fd0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c  r(pParse, TK_ID,
6fe0: 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 45 78   0, 0, &Y);.  Ex
6ff0: 70 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c 69  pr *temp3 = sqli
7000: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
7010: 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 5a   TK_ID, 0, 0, &Z
7020: 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 34  );.  Expr *temp4
7030: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
7040: 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20  pParse, TK_DOT, 
7050: 74 65 6d 70 32 2c 20 74 65 6d 70 33 2c 20 30 29  temp2, temp3, 0)
7060: 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71  ;.  A.pExpr = sq
7070: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
7080: 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31  e, TK_DOT, temp1
7090: 2c 20 74 65 6d 70 34 2c 20 30 29 3b 0a 20 20 73  , temp4, 0);.  s
70a0: 70 61 6e 53 65 74 28 26 41 2c 26 58 2c 26 5a 29  panSet(&A,&X,&Z)
70b0: 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20  ;.}.term(A) ::= 
70c0: 49 4e 54 45 47 45 52 7c 46 4c 4f 41 54 7c 42 4c  INTEGER|FLOAT|BL
70d0: 4f 42 28 58 29 2e 20 20 7b 73 70 61 6e 45 78 70  OB(X).  {spanExp
70e0: 72 28 26 41 2c 20 70 50 61 72 73 65 2c 20 40 58  r(&A, pParse, @X
70f0: 2c 20 26 58 29 3b 7d 0a 74 65 72 6d 28 41 29 20  , &X);}.term(A) 
7100: 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20  ::= STRING(X).  
7110: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61              {spa
7120: 6e 45 78 70 72 28 26 41 2c 20 70 50 61 72 73 65  nExpr(&A, pParse
7130: 2c 20 40 58 2c 20 26 58 29 3b 7d 0a 65 78 70 72  , @X, &X);}.expr
7140: 28 41 29 20 3a 3a 3d 20 52 45 47 49 53 54 45 52  (A) ::= REGISTER
7150: 28 58 29 2e 20 20 20 20 20 7b 0a 20 20 2f 2a 20  (X).     {.  /* 
7160: 57 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73  When doing a nes
7170: 74 65 64 20 70 61 72 73 65 2c 20 6f 6e 65 20 63  ted parse, one c
7180: 61 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73  an include terms
7190: 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f   in an expressio
71a0: 6e 0a 20 20 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b  n.  ** that look
71b0: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23 31   like this:   #1
71c0: 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74   #2 ...  These t
71d0: 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20 72 65  erms refer to re
71e0: 67 69 73 74 65 72 73 0a 20 20 2a 2a 20 69 6e 20  gisters.  ** in 
71f0: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
7200: 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68 65 20  ine.  #N is the 
7210: 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e 20 2a  N-th register. *
7220: 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  /.  if( pParse->
7230: 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  nested==0 ){.   
7240: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7250: 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c  (pParse, "near \
7260: 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72  "%T\": syntax er
7270: 72 6f 72 22 2c 20 26 58 29 3b 0a 20 20 20 20 41  ror", &X);.    A
7280: 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d 65  .pExpr = 0;.  }e
7290: 6c 73 65 7b 0a 20 20 20 20 41 2e 70 45 78 70 72  lse{.    A.pExpr
72a0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
72b0: 70 50 61 72 73 65 2c 20 54 4b 5f 52 45 47 49 53  pParse, TK_REGIS
72c0: 54 45 52 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a  TER, 0, 0, &X);.
72d0: 20 20 20 20 69 66 28 20 41 2e 70 45 78 70 72 20      if( A.pExpr 
72e0: 29 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ) sqlite3GetInt3
72f0: 32 28 26 58 2e 7a 5b 31 5d 2c 20 26 41 2e 70 45  2(&X.z[1], &A.pE
7300: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
7310: 7d 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c 20  }.  spanSet(&A, 
7320: 26 58 2c 20 26 58 29 3b 0a 7d 0a 65 78 70 72 28  &X, &X);.}.expr(
7330: 41 29 20 3a 3a 3d 20 56 41 52 49 41 42 4c 45 28  A) ::= VARIABLE(
7340: 58 29 2e 20 20 20 20 20 7b 0a 20 20 73 70 61 6e  X).     {.  span
7350: 45 78 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c  Expr(&A, pParse,
7360: 20 54 4b 5f 56 41 52 49 41 42 4c 45 2c 20 26 58   TK_VARIABLE, &X
7370: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
7380: 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28  AssignVarNumber(
7390: 70 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 29  pParse, A.pExpr)
73a0: 3b 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c 20  ;.  spanSet(&A, 
73b0: 26 58 2c 20 26 58 29 3b 0a 7d 0a 65 78 70 72 28  &X, &X);.}.expr(
73c0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 45 29 20 43  A) ::= expr(E) C
73d0: 4f 4c 4c 41 54 45 20 69 64 73 28 43 29 2e 20 7b  OLLATE ids(C). {
73e0: 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c  .  A.pExpr = sql
73f0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
7400: 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20  teToken(pParse, 
7410: 45 2e 70 45 78 70 72 2c 20 26 43 29 3b 0a 20 20  E.pExpr, &C);.  
7420: 41 2e 7a 53 74 61 72 74 20 3d 20 45 2e 7a 53 74  A.zStart = E.zSt
7430: 61 72 74 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20  art;.  A.zEnd = 
7440: 26 43 2e 7a 5b 43 2e 6e 5d 3b 0a 7d 0a 25 69 66  &C.z[C.n];.}.%if
7450: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7460: 5f 43 41 53 54 0a 65 78 70 72 28 41 29 20 3a 3a  _CAST.expr(A) ::
7470: 3d 20 43 41 53 54 28 58 29 20 4c 50 20 65 78 70  = CAST(X) LP exp
7480: 72 28 45 29 20 41 53 20 74 79 70 65 74 6f 6b 65  r(E) AS typetoke
7490: 6e 28 54 29 20 52 50 28 59 29 2e 20 7b 0a 20 20  n(T) RP(Y). {.  
74a0: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
74b0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
74c0: 4b 5f 43 41 53 54 2c 20 45 2e 70 45 78 70 72 2c  K_CAST, E.pExpr,
74d0: 20 30 2c 20 26 54 29 3b 0a 20 20 73 70 61 6e 53   0, &T);.  spanS
74e0: 65 74 28 26 41 2c 26 58 2c 26 59 29 3b 0a 7d 0a  et(&A,&X,&Y);.}.
74f0: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
7500: 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28 41 29  MIT_CAST.expr(A)
7510: 20 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20 64 69   ::= ID(X) LP di
7520: 73 74 69 6e 63 74 28 44 29 20 65 78 70 72 6c 69  stinct(D) exprli
7530: 73 74 28 59 29 20 52 50 28 45 29 2e 20 7b 0a 20  st(Y) RP(E). {. 
7540: 20 69 66 28 20 59 20 26 26 20 59 2d 3e 6e 45 78   if( Y && Y->nEx
7550: 70 72 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61  pr>pParse->db->a
7560: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
7570: 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
7580: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
7590: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
75a0: 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65  "too many argume
75b0: 6e 74 73 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nts on function 
75c0: 25 54 22 2c 20 26 58 29 3b 0a 20 20 7d 0a 20 20  %T", &X);.  }.  
75d0: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
75e0: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50  3ExprFunction(pP
75f0: 61 72 73 65 2c 20 59 2c 20 26 58 29 3b 0a 20 20  arse, Y, &X);.  
7600: 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c 26 45  spanSet(&A,&X,&E
7610: 29 3b 0a 20 20 69 66 28 20 44 20 26 26 20 41 2e  );.  if( D && A.
7620: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70  pExpr ){.    A.p
7630: 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  Expr->flags |= E
7640: 50 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 7d 0a  P_Distinct;.  }.
7650: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 44  }.expr(A) ::= ID
7660: 28 58 29 20 4c 50 20 53 54 41 52 20 52 50 28 45  (X) LP STAR RP(E
7670: 29 2e 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d  ). {.  A.pExpr =
7680: 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63   sqlite3ExprFunc
7690: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
76a0: 26 58 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26  &X);.  spanSet(&
76b0: 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 74 65 72 6d  A,&X,&E);.}.term
76c0: 28 41 29 20 3a 3a 3d 20 43 54 49 4d 45 5f 4b 57  (A) ::= CTIME_KW
76d0: 28 4f 50 29 2e 20 7b 0a 20 20 2f 2a 20 54 68 65  (OP). {.  /* The
76e0: 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 2c 20 43   CURRENT_TIME, C
76f0: 55 52 52 45 4e 54 5f 44 41 54 45 2c 20 61 6e 64  URRENT_DATE, and
7700: 20 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41   CURRENT_TIMESTA
7710: 4d 50 20 76 61 6c 75 65 73 20 61 72 65 0a 20 20  MP values are.  
7720: 2a 2a 20 74 72 65 61 74 65 64 20 61 73 20 66 75  ** treated as fu
7730: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
7740: 75 72 6e 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  urn constants */
7750: 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c  .  A.pExpr = sql
7760: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
7770: 28 70 50 61 72 73 65 2c 20 30 2c 26 4f 50 29 3b  (pParse, 0,&OP);
7780: 0a 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29  .  if( A.pExpr )
7790: 7b 0a 20 20 20 20 41 2e 70 45 78 70 72 2d 3e 6f  {.    A.pExpr->o
77a0: 70 20 3d 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  p = TK_CONST_FUN
77b0: 43 3b 20 20 0a 20 20 7d 0a 20 20 73 70 61 6e 53  C;  .  }.  spanS
77c0: 65 74 28 26 41 2c 20 26 4f 50 2c 20 26 4f 50 29  et(&A, &OP, &OP)
77d0: 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a  ;.}..%include {.
77e0: 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
77f0: 65 20 63 6f 6e 73 74 72 75 63 74 73 20 61 20 62  e constructs a b
7800: 69 6e 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  inary expression
7810: 20 6e 6f 64 65 20 6f 75 74 20 6f 66 20 74 77 6f   node out of two
7820: 20 45 78 70 72 53 70 61 6e 0a 20 20 2a 2a 20 6f   ExprSpan.  ** o
7830: 62 6a 65 63 74 73 20 61 6e 64 20 75 73 65 73 20  bjects and uses 
7840: 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 70 6f  the result to po
7850: 70 75 6c 61 74 65 20 61 20 6e 65 77 20 45 78 70  pulate a new Exp
7860: 72 53 70 61 6e 20 6f 62 6a 65 63 74 2e 0a 20 20  rSpan object..  
7870: 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
7880: 20 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28   spanBinaryExpr(
7890: 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70  .    ExprSpan *p
78a0: 4f 75 74 2c 20 20 20 20 20 2f 2a 20 57 72 69 74  Out,     /* Writ
78b0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 68 65 72  e the result her
78c0: 65 20 2a 2f 0a 20 20 20 20 50 61 72 73 65 20 2a  e */.    Parse *
78d0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
78e0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
78f0: 65 78 74 2e 20 20 45 72 72 6f 72 73 20 61 63 63  ext.  Errors acc
7900: 75 6d 75 6c 61 74 65 20 68 65 72 65 20 2a 2f 0a  umulate here */.
7910: 20 20 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20      int op,     
7920: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
7930: 69 6e 61 72 79 20 6f 70 65 72 61 74 69 6f 6e 20  inary operation 
7940: 2a 2f 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20  */.    ExprSpan 
7950: 2a 70 4c 65 66 74 2c 20 20 20 20 2f 2a 20 54 68  *pLeft,    /* Th
7960: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  e left operand *
7970: 2f 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a  /.    ExprSpan *
7980: 70 52 69 67 68 74 20 20 20 20 2f 2a 20 54 68 65  pRight    /* The
7990: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 20 2a   right operand *
79a0: 2f 0a 20 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d  /.  ){.    pOut-
79b0: 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  >pExpr = sqlite3
79c0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70  PExpr(pParse, op
79d0: 2c 20 70 4c 65 66 74 2d 3e 70 45 78 70 72 2c 20  , pLeft->pExpr, 
79e0: 70 52 69 67 68 74 2d 3e 70 45 78 70 72 2c 20 30  pRight->pExpr, 0
79f0: 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53 74  );.    pOut->zSt
7a00: 61 72 74 20 3d 20 70 4c 65 66 74 2d 3e 7a 53 74  art = pLeft->zSt
7a10: 61 72 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a  art;.    pOut->z
7a20: 45 6e 64 20 3d 20 70 52 69 67 68 74 2d 3e 7a 45  End = pRight->zE
7a30: 6e 64 3b 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28  nd;.  }.}..expr(
7a40: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 41  A) ::= expr(X) A
7a50: 4e 44 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20  ND(OP) expr(Y). 
7a60: 20 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78     {spanBinaryEx
7a70: 70 72 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50  pr(&A,pParse,@OP
7a80: 2c 26 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41  ,&X,&Y);}.expr(A
7a90: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4f 52  ) ::= expr(X) OR
7aa0: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 20  (OP) expr(Y).   
7ab0: 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78 70    {spanBinaryExp
7ac0: 72 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c  r(&A,pParse,@OP,
7ad0: 26 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29  &X,&Y);}.expr(A)
7ae0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c 54 7c   ::= expr(X) LT|
7af0: 47 54 7c 47 45 7c 4c 45 28 4f 50 29 20 65 78 70  GT|GE|LE(OP) exp
7b00: 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20  r(Y)..          
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
7b30: 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41  panBinaryExpr(&A
7b40: 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26  ,pParse,@OP,&X,&
7b50: 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  Y);}.expr(A) ::=
7b60: 20 65 78 70 72 28 58 29 20 45 51 7c 4e 45 28 4f   expr(X) EQ|NE(O
7b70: 50 29 20 65 78 70 72 28 59 29 2e 20 20 7b 73 70  P) expr(Y).  {sp
7b80: 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c  anBinaryExpr(&A,
7b90: 70 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26 59  pParse,@OP,&X,&Y
7ba0: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
7bb0: 65 78 70 72 28 58 29 20 42 49 54 41 4e 44 7c 42  expr(X) BITAND|B
7bc0: 49 54 4f 52 7c 4c 53 48 49 46 54 7c 52 53 48 49  ITOR|LSHIFT|RSHI
7bd0: 46 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a  FT(OP) expr(Y)..
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 20 20 20 20 20 20 20 7b 73 70 61 6e 42 69 6e          {spanBin
7c10: 61 72 79 45 78 70 72 28 26 41 2c 70 50 61 72 73  aryExpr(&A,pPars
7c20: 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 65  e,@OP,&X,&Y);}.e
7c30: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
7c40: 58 29 20 50 4c 55 53 7c 4d 49 4e 55 53 28 4f 50  X) PLUS|MINUS(OP
7c50: 29 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20  ) expr(Y)..     
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c80: 20 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78     {spanBinaryEx
7c90: 70 72 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50  pr(&A,pParse,@OP
7ca0: 2c 26 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41  ,&X,&Y);}.expr(A
7cb0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 53 54  ) ::= expr(X) ST
7cc0: 41 52 7c 53 4c 41 53 48 7c 52 45 4d 28 4f 50 29  AR|SLASH|REM(OP)
7cd0: 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20 20   expr(Y)..      
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78 70    {spanBinaryExp
7d10: 72 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c  r(&A,pParse,@OP,
7d20: 26 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29  &X,&Y);}.expr(A)
7d30: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 43 4f 4e   ::= expr(X) CON
7d40: 43 41 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e  CAT(OP) expr(Y).
7d50: 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72   {spanBinaryExpr
7d60: 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26  (&A,pParse,@OP,&
7d70: 58 2c 26 59 29 3b 7d 0a 25 74 79 70 65 20 6c 69  X,&Y);}.%type li
7d80: 6b 65 6f 70 20 7b 73 74 72 75 63 74 20 4c 69 6b  keop {struct Lik
7d90: 65 4f 70 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a  eOp}.likeop(A) :
7da0: 3a 3d 20 4c 49 4b 45 5f 4b 57 28 58 29 2e 20 20  := LIKE_KW(X).  
7db0: 20 20 20 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20     {A.eOperator 
7dc0: 3d 20 58 3b 20 41 2e 62 4e 6f 74 20 3d 20 30 3b  = X; A.bNot = 0;
7dd0: 7d 0a 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20  }.likeop(A) ::= 
7de0: 4e 4f 54 20 4c 49 4b 45 5f 4b 57 28 58 29 2e 20  NOT LIKE_KW(X). 
7df0: 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20 58  {A.eOperator = X
7e00: 3b 20 41 2e 62 4e 6f 74 20 3d 20 31 3b 7d 0a 6c  ; A.bNot = 1;}.l
7e10: 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4d 41 54  ikeop(A) ::= MAT
7e20: 43 48 28 58 29 2e 20 20 20 20 20 20 20 7b 41 2e  CH(X).       {A.
7e30: 65 4f 70 65 72 61 74 6f 72 20 3d 20 58 3b 20 41  eOperator = X; A
7e40: 2e 62 4e 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b 65  .bNot = 0;}.like
7e50: 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4d 41  op(A) ::= NOT MA
7e60: 54 43 48 28 58 29 2e 20 20 20 7b 41 2e 65 4f 70  TCH(X).   {A.eOp
7e70: 65 72 61 74 6f 72 20 3d 20 58 3b 20 41 2e 62 4e  erator = X; A.bN
7e80: 6f 74 20 3d 20 31 3b 7d 0a 65 78 70 72 28 41 29  ot = 1;}.expr(A)
7e90: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 6c 69 6b   ::= expr(X) lik
7ea0: 65 6f 70 28 4f 50 29 20 65 78 70 72 28 59 29 2e  eop(OP) expr(Y).
7eb0: 20 20 5b 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20    [LIKE_KW]  {. 
7ec0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
7ed0: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  ;.  pList = sqli
7ee0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
7ef0: 64 28 70 50 61 72 73 65 2c 30 2c 20 59 2e 70 45  d(pParse,0, Y.pE
7f00: 78 70 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20  xpr);.  pList = 
7f10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
7f20: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69  ppend(pParse,pLi
7f30: 73 74 2c 20 58 2e 70 45 78 70 72 29 3b 0a 20 20  st, X.pExpr);.  
7f40: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
7f50: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50  3ExprFunction(pP
7f60: 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 26 4f 50  arse, pList, &OP
7f70: 2e 65 4f 70 65 72 61 74 6f 72 29 3b 0a 20 20 69  .eOperator);.  i
7f80: 66 28 20 4f 50 2e 62 4e 6f 74 20 29 20 41 2e 70  f( OP.bNot ) A.p
7f90: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
7fa0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
7fb0: 4f 54 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20  OT, A.pExpr, 0, 
7fc0: 30 29 3b 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d  0);.  A.zStart =
7fd0: 20 58 2e 7a 53 74 61 72 74 3b 0a 20 20 41 2e 7a   X.zStart;.  A.z
7fe0: 45 6e 64 20 3d 20 59 2e 7a 45 6e 64 3b 0a 20 20  End = Y.zEnd;.  
7ff0: 69 66 28 20 41 2e 70 45 78 70 72 20 29 20 41 2e  if( A.pExpr ) A.
8000: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pExpr->flags |= 
8010: 45 50 5f 49 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a  EP_InfixFunc;.}.
8020: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
8030: 28 58 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65  (X) likeop(OP) e
8040: 78 70 72 28 59 29 20 45 53 43 41 50 45 20 65 78  xpr(Y) ESCAPE ex
8050: 70 72 28 45 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57  pr(E).  [LIKE_KW
8060: 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  ]  {.  ExprList 
8070: 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20  *pList;.  pList 
8080: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
8090: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30  tAppend(pParse,0
80a0: 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 70 4c  , Y.pExpr);.  pL
80b0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
80c0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
80d0: 73 65 2c 70 4c 69 73 74 2c 20 58 2e 70 45 78 70  se,pList, X.pExp
80e0: 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71  r);.  pList = sq
80f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
8100: 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74  end(pParse,pList
8110: 2c 20 45 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e  , E.pExpr);.  A.
8120: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
8130: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  xprFunction(pPar
8140: 73 65 2c 20 70 4c 69 73 74 2c 20 26 4f 50 2e 65  se, pList, &OP.e
8150: 4f 70 65 72 61 74 6f 72 29 3b 0a 20 20 69 66 28  Operator);.  if(
8160: 20 4f 50 2e 62 4e 6f 74 20 29 20 41 2e 70 45 78   OP.bNot ) A.pEx
8170: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
8180: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54  r(pParse, TK_NOT
8190: 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20 30 29  , A.pExpr, 0, 0)
81a0: 3b 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58  ;.  A.zStart = X
81b0: 2e 7a 53 74 61 72 74 3b 0a 20 20 41 2e 7a 45 6e  .zStart;.  A.zEn
81c0: 64 20 3d 20 45 2e 7a 45 6e 64 3b 0a 20 20 69 66  d = E.zEnd;.  if
81d0: 28 20 41 2e 70 45 78 70 72 20 29 20 41 2e 70 45  ( A.pExpr ) A.pE
81e0: 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
81f0: 5f 49 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a 0a 25  _InfixFunc;.}..%
8200: 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 43  include {.  /* C
8210: 6f 6e 73 74 72 75 63 74 20 61 6e 20 65 78 70 72  onstruct an expr
8220: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
8230: 61 20 75 6e 61 72 79 20 70 6f 73 74 66 69 78 20  a unary postfix 
8240: 6f 70 65 72 61 74 6f 72 0a 20 20 2a 2f 0a 20 20  operator.  */.  
8250: 73 74 61 74 69 63 20 76 6f 69 64 20 73 70 61 6e  static void span
8260: 55 6e 61 72 79 50 6f 73 74 66 69 78 28 0a 20 20  UnaryPostfix(.  
8270: 20 20 45 78 70 72 53 70 61 6e 20 2a 70 4f 75 74    ExprSpan *pOut
8280: 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ,        /* Writ
8290: 65 20 74 68 65 20 6e 65 77 20 65 78 70 72 65 73  e the new expres
82a0: 73 69 6f 6e 20 6e 6f 64 65 20 68 65 72 65 20 2a  sion node here *
82b0: 2f 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 61  /.    Parse *pPa
82c0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
82d0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
82e0: 74 6f 20 72 65 63 6f 72 64 20 65 72 72 6f 72 73  to record errors
82f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 2c 20   */.    int op, 
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8310: 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 2a  * The operator *
8320: 2f 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a  /.    ExprSpan *
8330: 70 4f 70 65 72 61 6e 64 2c 20 20 20 20 2f 2a 20  pOperand,    /* 
8340: 54 68 65 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20  The operand */. 
8350: 20 20 20 54 6f 6b 65 6e 20 2a 70 50 6f 73 74 4f     Token *pPostO
8360: 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p         /* The
8370: 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65 6e 20 66   operand token f
8380: 6f 72 20 73 65 74 74 69 6e 67 20 74 68 65 20 73  or setting the s
8390: 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  pan */.  ){.    
83a0: 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20 73 71  pOut->pExpr = sq
83b0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
83c0: 65 2c 20 6f 70 2c 20 70 4f 70 65 72 61 6e 64 2d  e, op, pOperand-
83d0: 3e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20  >pExpr, 0, 0);. 
83e0: 20 20 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20     pOut->zStart 
83f0: 3d 20 70 4f 70 65 72 61 6e 64 2d 3e 7a 53 74 61  = pOperand->zSta
8400: 72 74 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 45  rt;.    pOut->zE
8410: 6e 64 20 3d 20 26 70 50 6f 73 74 4f 70 2d 3e 7a  nd = &pPostOp->z
8420: 5b 70 50 6f 73 74 4f 70 2d 3e 6e 5d 3b 0a 20 20  [pPostOp->n];.  
8430: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
8440: 20 20 20 20 20 20 20 20 20 20 20 20 0a 7d 0a 0a              .}..
8450: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
8460: 28 58 29 20 49 53 4e 55 4c 4c 7c 4e 4f 54 4e 55  (X) ISNULL|NOTNU
8470: 4c 4c 28 45 29 2e 20 20 20 7b 73 70 61 6e 55 6e  LL(E).   {spanUn
8480: 61 72 79 50 6f 73 74 66 69 78 28 26 41 2c 70 50  aryPostfix(&A,pP
8490: 61 72 73 65 2c 40 45 2c 26 58 2c 26 45 29 3b 7d  arse,@E,&X,&E);}
84a0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
84b0: 72 28 58 29 20 4e 4f 54 20 4e 55 4c 4c 28 45 29  r(X) NOT NULL(E)
84c0: 2e 20 7b 73 70 61 6e 55 6e 61 72 79 50 6f 73 74  . {spanUnaryPost
84d0: 66 69 78 28 26 41 2c 70 50 61 72 73 65 2c 54 4b  fix(&A,pParse,TK
84e0: 5f 4e 4f 54 4e 55 4c 4c 2c 26 58 2c 26 45 29 3b  _NOTNULL,&X,&E);
84f0: 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20  }..%include {.  
8500: 2f 2a 20 41 20 72 6f 75 74 69 6e 65 20 74 6f 20  /* A routine to 
8510: 63 6f 6e 76 65 72 74 20 61 20 62 69 6e 61 72 79  convert a binary
8520: 20 54 4b 5f 49 53 20 6f 72 20 54 4b 5f 49 53 4e   TK_IS or TK_ISN
8530: 4f 54 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  OT expression in
8540: 74 6f 20 61 0a 20 20 2a 2a 20 75 6e 61 72 79 20  to a.  ** unary 
8550: 54 4b 5f 49 53 4e 55 4c 4c 20 6f 72 20 54 4b 5f  TK_ISNULL or TK_
8560: 4e 4f 54 4e 55 4c 4c 20 65 78 70 72 65 73 73 69  NOTNULL expressi
8570: 6f 6e 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  on. */.  static 
8580: 76 6f 69 64 20 62 69 6e 61 72 79 54 6f 55 6e 61  void binaryToUna
8590: 72 79 49 66 4e 75 6c 6c 28 50 61 72 73 65 20 2a  ryIfNull(Parse *
85a0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 59  pParse, Expr *pY
85b0: 2c 20 45 78 70 72 20 2a 70 41 2c 20 69 6e 74 20  , Expr *pA, int 
85c0: 6f 70 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  op){.    sqlite3
85d0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
85e0: 62 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  b;.    if( db->m
85f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 26  allocFailed==0 &
8600: 26 20 70 59 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c  & pY->op==TK_NUL
8610: 4c 20 29 7b 0a 20 20 20 20 20 20 70 41 2d 3e 6f  L ){.      pA->o
8620: 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20  p = (u8)op;.    
8630: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8640: 65 74 65 28 64 62 2c 20 70 41 2d 3e 70 52 69 67  ete(db, pA->pRig
8650: 68 74 29 3b 0a 20 20 20 20 20 20 70 41 2d 3e 70  ht);.      pA->p
8660: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Right = 0;.    }
8670: 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 20 20 20 65 78  .  }.}..//    ex
8680: 70 72 31 20 49 53 20 65 78 70 72 32 0a 2f 2f 20  pr1 IS expr2.// 
8690: 20 20 20 65 78 70 72 31 20 49 53 20 4e 4f 54 20     expr1 IS NOT 
86a0: 65 78 70 72 32 0a 2f 2f 0a 2f 2f 20 49 66 20 65  expr2.//.// If e
86b0: 78 70 72 32 20 69 73 20 4e 55 4c 4c 20 74 68 65  xpr2 is NULL the
86c0: 6e 20 63 6f 64 65 20 61 73 20 54 4b 5f 49 53 4e  n code as TK_ISN
86d0: 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e 55 4c  ULL or TK_NOTNUL
86e0: 4c 2e 20 20 49 66 20 65 78 70 72 32 0a 2f 2f 20  L.  If expr2.// 
86f0: 69 73 20 61 6e 79 20 6f 74 68 65 72 20 65 78 70  is any other exp
8700: 72 65 73 73 69 6f 6e 2c 20 63 6f 64 65 20 61 73  ression, code as
8710: 20 54 4b 5f 49 53 20 6f 72 20 54 4b 5f 49 53 4e   TK_IS or TK_ISN
8720: 4f 54 2e 0a 2f 2f 20 0a 65 78 70 72 28 41 29 20  OT..// .expr(A) 
8730: 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 53 20 65  ::= expr(X) IS e
8740: 78 70 72 28 59 29 2e 20 20 20 20 20 7b 0a 20 20  xpr(Y).     {.  
8750: 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26  spanBinaryExpr(&
8760: 41 2c 70 50 61 72 73 65 2c 54 4b 5f 49 53 2c 26  A,pParse,TK_IS,&
8770: 58 2c 26 59 29 3b 0a 20 20 62 69 6e 61 72 79 54  X,&Y);.  binaryT
8780: 6f 55 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50 61  oUnaryIfNull(pPa
8790: 72 73 65 2c 20 59 2e 70 45 78 70 72 2c 20 41 2e  rse, Y.pExpr, A.
87a0: 70 45 78 70 72 2c 20 54 4b 5f 49 53 4e 55 4c 4c  pExpr, TK_ISNULL
87b0: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
87c0: 20 65 78 70 72 28 58 29 20 49 53 20 4e 4f 54 20   expr(X) IS NOT 
87d0: 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 73 70 61  expr(Y). {.  spa
87e0: 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70  nBinaryExpr(&A,p
87f0: 50 61 72 73 65 2c 54 4b 5f 49 53 4e 4f 54 2c 26  Parse,TK_ISNOT,&
8800: 58 2c 26 59 29 3b 0a 20 20 62 69 6e 61 72 79 54  X,&Y);.  binaryT
8810: 6f 55 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50 61  oUnaryIfNull(pPa
8820: 72 73 65 2c 20 59 2e 70 45 78 70 72 2c 20 41 2e  rse, Y.pExpr, A.
8830: 70 45 78 70 72 2c 20 54 4b 5f 4e 4f 54 4e 55 4c  pExpr, TK_NOTNUL
8840: 4c 29 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 64 65 20  L);.}..%include 
8850: 7b 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74  {.  /* Construct
8860: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e   an expression n
8870: 6f 64 65 20 66 6f 72 20 61 20 75 6e 61 72 79 20  ode for a unary 
8880: 70 72 65 66 69 78 20 6f 70 65 72 61 74 6f 72 0a  prefix operator.
8890: 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f    */.  static vo
88a0: 69 64 20 73 70 61 6e 55 6e 61 72 79 50 72 65 66  id spanUnaryPref
88b0: 69 78 28 0a 20 20 20 20 45 78 70 72 53 70 61 6e  ix(.    ExprSpan
88c0: 20 2a 70 4f 75 74 2c 20 20 20 20 20 20 20 20 2f   *pOut,        /
88d0: 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77 20  * Write the new 
88e0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
88f0: 68 65 72 65 20 2a 2f 0a 20 20 20 20 50 61 72 73  here */.    Pars
8900: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8910: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8920: 6e 74 65 78 74 20 74 6f 20 72 65 63 6f 72 64 20  ntext to record 
8930: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 69 6e  errors */.    in
8940: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
8950: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72       /* The oper
8960: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
8970: 53 70 61 6e 20 2a 70 4f 70 65 72 61 6e 64 2c 20  Span *pOperand, 
8980: 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 6e     /* The operan
8990: 64 20 2a 2f 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  d */.    Token *
89a0: 70 50 72 65 4f 70 20 20 20 20 20 20 20 20 20 2f  pPreOp         /
89b0: 2a 20 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f  * The operand to
89c0: 6b 65 6e 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ken for setting 
89d0: 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20 29 7b  the span */.  ){
89e0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 45 78 70 72  .    pOut->pExpr
89f0: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
8a00: 70 50 61 72 73 65 2c 20 6f 70 2c 20 70 4f 70 65  pParse, op, pOpe
8a10: 72 61 6e 64 2d 3e 70 45 78 70 72 2c 20 30 2c 20  rand->pExpr, 0, 
8a20: 30 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53  0);.    pOut->zS
8a30: 74 61 72 74 20 3d 20 70 50 72 65 4f 70 2d 3e 7a  tart = pPreOp->z
8a40: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64  ;.    pOut->zEnd
8a50: 20 3d 20 70 4f 70 65 72 61 6e 64 2d 3e 7a 45 6e   = pOperand->zEn
8a60: 64 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a 65 78 70 72  d;.  }.}....expr
8a70: 28 41 29 20 3a 3a 3d 20 4e 4f 54 28 42 29 20 65  (A) ::= NOT(B) e
8a80: 78 70 72 28 58 29 2e 20 20 20 20 7b 73 70 61 6e  xpr(X).    {span
8a90: 55 6e 61 72 79 50 72 65 66 69 78 28 26 41 2c 70  UnaryPrefix(&A,p
8aa0: 50 61 72 73 65 2c 40 42 2c 26 58 2c 26 42 29 3b  Parse,@B,&X,&B);
8ab0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 42 49  }.expr(A) ::= BI
8ac0: 54 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e  TNOT(B) expr(X).
8ad0: 20 7b 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69   {spanUnaryPrefi
8ae0: 78 28 26 41 2c 70 50 61 72 73 65 2c 40 42 2c 26  x(&A,pParse,@B,&
8af0: 58 2c 26 42 29 3b 7d 0a 65 78 70 72 28 41 29 20  X,&B);}.expr(A) 
8b00: 3a 3a 3d 20 4d 49 4e 55 53 28 42 29 20 65 78 70  ::= MINUS(B) exp
8b10: 72 28 58 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20  r(X). [BITNOT]. 
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
8b40: 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28 26  panUnaryPrefix(&
8b50: 41 2c 70 50 61 72 73 65 2c 54 4b 5f 55 4d 49 4e  A,pParse,TK_UMIN
8b60: 55 53 2c 26 58 2c 26 42 29 3b 7d 0a 65 78 70 72  US,&X,&B);}.expr
8b70: 28 41 29 20 3a 3a 3d 20 50 4c 55 53 28 42 29 20  (A) ::= PLUS(B) 
8b80: 65 78 70 72 28 58 29 2e 20 5b 42 49 54 4e 4f 54  expr(X). [BITNOT
8b90: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 7b 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69   {spanUnaryPrefi
8bc0: 78 28 26 41 2c 70 50 61 72 73 65 2c 54 4b 5f 55  x(&A,pParse,TK_U
8bd0: 50 4c 55 53 2c 26 58 2c 26 42 29 3b 7d 0a 0a 25  PLUS,&X,&B);}..%
8be0: 74 79 70 65 20 62 65 74 77 65 65 6e 5f 6f 70 20  type between_op 
8bf0: 7b 69 6e 74 7d 0a 62 65 74 77 65 65 6e 5f 6f 70  {int}.between_op
8c00: 28 41 29 20 3a 3a 3d 20 42 45 54 57 45 45 4e 2e  (A) ::= BETWEEN.
8c10: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 62 65       {A = 0;}.be
8c20: 74 77 65 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20  tween_op(A) ::= 
8c30: 4e 4f 54 20 42 45 54 57 45 45 4e 2e 20 7b 41 20  NOT BETWEEN. {A 
8c40: 3d 20 31 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  = 1;}.expr(A) ::
8c50: 3d 20 65 78 70 72 28 57 29 20 62 65 74 77 65 65  = expr(W) betwee
8c60: 6e 5f 6f 70 28 4e 29 20 65 78 70 72 28 58 29 20  n_op(N) expr(X) 
8c70: 41 4e 44 20 65 78 70 72 28 59 29 2e 20 5b 42 45  AND expr(Y). [BE
8c80: 54 57 45 45 4e 5d 20 7b 0a 20 20 45 78 70 72 4c  TWEEN] {.  ExprL
8c90: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c  ist *pList = sql
8ca0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
8cb0: 6e 64 28 70 50 61 72 73 65 2c 30 2c 20 58 2e 70  nd(pParse,0, X.p
8cc0: 45 78 70 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d  Expr);.  pList =
8cd0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
8ce0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c  Append(pParse,pL
8cf0: 69 73 74 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20  ist, Y.pExpr);. 
8d00: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74   A.pExpr = sqlit
8d10: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
8d20: 54 4b 5f 42 45 54 57 45 45 4e 2c 20 57 2e 70 45  TK_BETWEEN, W.pE
8d30: 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  xpr, 0, 0);.  if
8d40: 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  ( A.pExpr ){.   
8d50: 20 41 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   A.pExpr->x.pLis
8d60: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 65 6c  t = pList;.  }el
8d70: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
8d80: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
8d90: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
8da0: 3b 0a 20 20 7d 20 0a 20 20 69 66 28 20 4e 20 29  ;.  } .  if( N )
8db0: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74   A.pExpr = sqlit
8dc0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
8dd0: 54 4b 5f 4e 4f 54 2c 20 41 2e 70 45 78 70 72 2c  TK_NOT, A.pExpr,
8de0: 20 30 2c 20 30 29 3b 0a 20 20 41 2e 7a 53 74 61   0, 0);.  A.zSta
8df0: 72 74 20 3d 20 57 2e 7a 53 74 61 72 74 3b 0a 20  rt = W.zStart;. 
8e00: 20 41 2e 7a 45 6e 64 20 3d 20 59 2e 7a 45 6e 64   A.zEnd = Y.zEnd
8e10: 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.%ifndef SQLI
8e20: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8e30: 0a 20 20 25 74 79 70 65 20 69 6e 5f 6f 70 20 7b  .  %type in_op {
8e40: 69 6e 74 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20  int}.  in_op(A) 
8e50: 3a 3a 3d 20 49 4e 2e 20 20 20 20 20 20 7b 41 20  ::= IN.      {A 
8e60: 3d 20 30 3b 7d 0a 20 20 69 6e 5f 6f 70 28 41 29  = 0;}.  in_op(A)
8e70: 20 3a 3a 3d 20 4e 4f 54 20 49 4e 2e 20 20 7b 41   ::= NOT IN.  {A
8e80: 20 3d 20 31 3b 7d 0a 20 20 65 78 70 72 28 41 29   = 1;}.  expr(A)
8e90: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f   ::= expr(X) in_
8ea0: 6f 70 28 4e 29 20 4c 50 20 65 78 70 72 6c 69 73  op(N) LP exprlis
8eb0: 74 28 59 29 20 52 50 28 45 29 2e 20 5b 49 4e 5d  t(Y) RP(E). [IN]
8ec0: 20 7b 0a 20 20 20 20 69 66 28 20 59 3d 3d 30 20   {.    if( Y==0 
8ed0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72  ){.      /* Expr
8ee0: 65 73 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  essions of the f
8ef0: 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  orm.      **.   
8f00: 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31     **      expr1
8f10: 20 49 4e 20 28 29 0a 20 20 20 20 20 20 2a 2a 20   IN ().      ** 
8f20: 20 20 20 20 20 65 78 70 72 31 20 4e 4f 54 20 49       expr1 NOT I
8f30: 4e 20 28 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20  N ().      **.  
8f40: 20 20 20 20 2a 2a 20 73 69 6d 70 6c 69 66 79 20      ** simplify 
8f50: 74 6f 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 28  to constants 0 (
8f60: 66 61 6c 73 65 29 20 61 6e 64 20 31 20 28 74 72  false) and 1 (tr
8f70: 75 65 29 2c 20 72 65 73 70 65 63 74 69 76 65 6c  ue), respectivel
8f80: 79 2c 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 61  y,.      ** rega
8f90: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
8fa0: 6c 75 65 20 6f 66 20 65 78 70 72 31 2e 0a 20 20  lue of expr1..  
8fb0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 41 2e 70      */.      A.p
8fc0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
8fd0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
8fe0: 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 73  NTEGER, 0, 0, &s
8ff0: 71 6c 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b  qlite3IntTokens[
9000: 4e 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  N]);.      sqlit
9010: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61  e3ExprDelete(pPa
9020: 72 73 65 2d 3e 64 62 2c 20 58 2e 70 45 78 70 72  rse->db, X.pExpr
9030: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9040: 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71      A.pExpr = sq
9050: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
9060: 65 2c 20 54 4b 5f 49 4e 2c 20 58 2e 70 45 78 70  e, TK_IN, X.pExp
9070: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 0, 0);.      
9080: 69 66 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20  if( A.pExpr ){. 
9090: 20 20 20 20 20 20 20 41 2e 70 45 78 70 72 2d 3e         A.pExpr->
90a0: 78 2e 70 4c 69 73 74 20 3d 20 59 3b 0a 20 20 20  x.pList = Y;.   
90b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
90c0: 53 65 74 48 65 69 67 68 74 28 70 50 61 72 73 65  SetHeight(pParse
90d0: 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  , A.pExpr);.    
90e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
90f0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9100: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
9110: 62 2c 20 59 29 3b 0a 20 20 20 20 20 20 7d 0a 20  b, Y);.      }. 
9120: 20 20 20 20 20 69 66 28 20 4e 20 29 20 41 2e 70       if( N ) A.p
9130: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
9140: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
9150: 4f 54 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20  OT, A.pExpr, 0, 
9160: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 2e  0);.    }.    A.
9170: 7a 53 74 61 72 74 20 3d 20 58 2e 7a 53 74 61 72  zStart = X.zStar
9180: 74 3b 0a 20 20 20 20 41 2e 7a 45 6e 64 20 3d 20  t;.    A.zEnd = 
9190: 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a 20 20 7d 0a 20  &E.z[E.n];.  }. 
91a0: 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28   expr(A) ::= LP(
91b0: 42 29 20 73 65 6c 65 63 74 28 58 29 20 52 50 28  B) select(X) RP(
91c0: 45 29 2e 20 7b 0a 20 20 20 20 41 2e 70 45 78 70  E). {.    A.pExp
91d0: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
91e0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c 45  (pParse, TK_SELE
91f0: 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
9200: 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29 7b    if( A.pExpr ){
9210: 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 2d 3e  .      A.pExpr->
9220: 78 2e 70 53 65 6c 65 63 74 20 3d 20 58 3b 0a 20  x.pSelect = X;. 
9230: 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
9240: 65 72 74 79 28 41 2e 70 45 78 70 72 2c 20 45 50  erty(A.pExpr, EP
9250: 5f 78 49 73 53 65 6c 65 63 74 29 3b 0a 20 20 20  _xIsSelect);.   
9260: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65     sqlite3ExprSe
9270: 74 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  tHeight(pParse, 
9280: 41 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 65  A.pExpr);.    }e
9290: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
92a0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
92b0: 50 61 72 73 65 2d 3e 64 62 2c 20 58 29 3b 0a 20  Parse->db, X);. 
92c0: 20 20 20 7d 0a 20 20 20 20 41 2e 7a 53 74 61 72     }.    A.zStar
92d0: 74 20 3d 20 42 2e 7a 3b 0a 20 20 20 20 41 2e 7a  t = B.z;.    A.z
92e0: 45 6e 64 20 3d 20 26 45 2e 7a 5b 45 2e 6e 5d 3b  End = &E.z[E.n];
92f0: 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a  .  }.  expr(A) :
9300: 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70  := expr(X) in_op
9310: 28 4e 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29  (N) LP select(Y)
9320: 20 52 50 28 45 29 2e 20 20 5b 49 4e 5d 20 7b 0a   RP(E).  [IN] {.
9330: 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71      A.pExpr = sq
9340: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
9350: 65 2c 20 54 4b 5f 49 4e 2c 20 58 2e 70 45 78 70  e, TK_IN, X.pExp
9360: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  r, 0, 0);.    if
9370: 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  ( A.pExpr ){.   
9380: 20 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e 70 53     A.pExpr->x.pS
9390: 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 20 20 20  elect = Y;.     
93a0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
93b0: 28 41 2e 70 45 78 70 72 2c 20 45 50 5f 78 49 73  (A.pExpr, EP_xIs
93c0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 73  Select);.      s
93d0: 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69  qlite3ExprSetHei
93e0: 67 68 74 28 70 50 61 72 73 65 2c 20 41 2e 70 45  ght(pParse, A.pE
93f0: 78 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  xpr);.    }else{
9400: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
9410: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
9420: 65 2d 3e 64 62 2c 20 59 29 3b 0a 20 20 20 20 7d  e->db, Y);.    }
9430: 0a 20 20 20 20 69 66 28 20 4e 20 29 20 41 2e 70  .    if( N ) A.p
9440: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
9450: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
9460: 4f 54 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20  OT, A.pExpr, 0, 
9470: 30 29 3b 0a 20 20 20 20 41 2e 7a 53 74 61 72 74  0);.    A.zStart
9480: 20 3d 20 58 2e 7a 53 74 61 72 74 3b 0a 20 20 20   = X.zStart;.   
9490: 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b 45   A.zEnd = &E.z[E
94a0: 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28  .n];.  }.  expr(
94b0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 69  A) ::= expr(X) i
94c0: 6e 5f 6f 70 28 4e 29 20 6e 6d 28 59 29 20 64 62  n_op(N) nm(Y) db
94d0: 6e 6d 28 5a 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20  nm(Z). [IN] {.  
94e0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 20    SrcList *pSrc 
94f0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
9500: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e 64  Append(pParse->d
9510: 62 2c 20 30 2c 26 59 2c 26 5a 29 3b 0a 20 20 20  b, 0,&Y,&Z);.   
9520: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74   A.pExpr = sqlit
9530: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
9540: 54 4b 5f 49 4e 2c 20 58 2e 70 45 78 70 72 2c 20  TK_IN, X.pExpr, 
9550: 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 41  0, 0);.    if( A
9560: 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  .pExpr ){.      
9570: 41 2e 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65  A.pExpr->x.pSele
9580: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
9590: 63 74 4e 65 77 28 70 50 61 72 73 65 2c 20 30 2c  ctNew(pParse, 0,
95a0: 70 53 72 63 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30  pSrc,0,0,0,0,0,0
95b0: 2c 30 29 3b 0a 20 20 20 20 20 20 45 78 70 72 53  ,0);.      ExprS
95c0: 65 74 50 72 6f 70 65 72 74 79 28 41 2e 70 45 78  etProperty(A.pEx
95d0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
95e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
95f0: 45 78 70 72 53 65 74 48 65 69 67 68 74 28 70 50  ExprSetHeight(pP
9600: 61 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a  arse, A.pExpr);.
9610: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9620: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
9630: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
9640: 2c 20 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20  , pSrc);.    }. 
9650: 20 20 20 69 66 28 20 4e 20 29 20 41 2e 70 45 78     if( N ) A.pEx
9660: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9670: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54  r(pParse, TK_NOT
9680: 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20 30 29  , A.pExpr, 0, 0)
9690: 3b 0a 20 20 20 20 41 2e 7a 53 74 61 72 74 20 3d  ;.    A.zStart =
96a0: 20 58 2e 7a 53 74 61 72 74 3b 0a 20 20 20 20 41   X.zStart;.    A
96b0: 2e 7a 45 6e 64 20 3d 20 5a 2e 7a 20 3f 20 26 5a  .zEnd = Z.z ? &Z
96c0: 2e 7a 5b 5a 2e 6e 5d 20 3a 20 26 59 2e 7a 5b 59  .z[Z.n] : &Y.z[Y
96d0: 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28  .n];.  }.  expr(
96e0: 41 29 20 3a 3a 3d 20 45 58 49 53 54 53 28 42 29  A) ::= EXISTS(B)
96f0: 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52 50   LP select(Y) RP
9700: 28 45 29 2e 20 7b 0a 20 20 20 20 45 78 70 72 20  (E). {.    Expr 
9710: 2a 70 20 3d 20 41 2e 70 45 78 70 72 20 3d 20 73  *p = A.pExpr = s
9720: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
9730: 73 65 2c 20 54 4b 5f 45 58 49 53 54 53 2c 20 30  se, TK_EXISTS, 0
9740: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
9750: 20 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 78   p ){.      p->x
9760: 2e 70 53 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20  .pSelect = Y;.  
9770: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
9780: 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c  rty(p, EP_xIsSel
9790: 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
97a0: 74 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74  te3ExprSetHeight
97b0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
97c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
97d0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
97e0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29  e(pParse->db, Y)
97f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 2e 7a 53  ;.    }.    A.zS
9800: 74 61 72 74 20 3d 20 42 2e 7a 3b 0a 20 20 20 20  tart = B.z;.    
9810: 41 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b 45 2e  A.zEnd = &E.z[E.
9820: 6e 5d 3b 0a 20 20 7d 0a 25 65 6e 64 69 66 20 53  n];.  }.%endif S
9830: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
9840: 45 52 59 0a 0a 2f 2a 20 43 41 53 45 20 65 78 70  ERY../* CASE exp
9850: 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 65 78 70 72  ressions */.expr
9860: 28 41 29 20 3a 3a 3d 20 43 41 53 45 28 43 29 20  (A) ::= CASE(C) 
9870: 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 58 29 20  case_operand(X) 
9880: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 59 29  case_exprlist(Y)
9890: 20 63 61 73 65 5f 65 6c 73 65 28 5a 29 20 45 4e   case_else(Z) EN
98a0: 44 28 45 29 2e 20 7b 0a 20 20 41 2e 70 45 78 70  D(E). {.  A.pExp
98b0: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
98c0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 41 53 45  (pParse, TK_CASE
98d0: 2c 20 58 2c 20 5a 2c 20 30 29 3b 0a 20 20 69 66  , X, Z, 0);.  if
98e0: 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20  ( A.pExpr ){.   
98f0: 20 41 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   A.pExpr->x.pLis
9900: 74 20 3d 20 59 3b 0a 20 20 20 20 73 71 6c 69 74  t = Y;.    sqlit
9910: 65 33 45 78 70 72 53 65 74 48 65 69 67 68 74 28  e3ExprSetHeight(
9920: 70 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 29  pParse, A.pExpr)
9930: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
9940: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
9950: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9960: 20 59 29 3b 0a 20 20 7d 0a 20 20 41 2e 7a 53 74   Y);.  }.  A.zSt
9970: 61 72 74 20 3d 20 43 2e 7a 3b 0a 20 20 41 2e 7a  art = C.z;.  A.z
9980: 45 6e 64 20 3d 20 26 45 2e 7a 5b 45 2e 6e 5d 3b  End = &E.z[E.n];
9990: 0a 7d 0a 25 74 79 70 65 20 63 61 73 65 5f 65 78  .}.%type case_ex
99a0: 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  prlist {ExprList
99b0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 63  *}.%destructor c
99c0: 61 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 73 71  ase_exprlist {sq
99d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
99e0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
99f0: 24 24 29 3b 7d 0a 63 61 73 65 5f 65 78 70 72 6c  $$);}.case_exprl
9a00: 69 73 74 28 41 29 20 3a 3a 3d 20 63 61 73 65 5f  ist(A) ::= case_
9a10: 65 78 70 72 6c 69 73 74 28 58 29 20 57 48 45 4e  exprlist(X) WHEN
9a20: 20 65 78 70 72 28 59 29 20 54 48 45 4e 20 65 78   expr(Y) THEN ex
9a30: 70 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pr(Z). {.  A = s
9a40: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
9a50: 70 65 6e 64 28 70 50 61 72 73 65 2c 58 2c 20 59  pend(pParse,X, Y
9a60: 2e 70 45 78 70 72 29 3b 0a 20 20 41 20 3d 20 73  .pExpr);.  A = s
9a70: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
9a80: 70 65 6e 64 28 70 50 61 72 73 65 2c 41 2c 20 5a  pend(pParse,A, Z
9a90: 2e 70 45 78 70 72 29 3b 0a 7d 0a 63 61 73 65 5f  .pExpr);.}.case_
9aa0: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20  exprlist(A) ::= 
9ab0: 57 48 45 4e 20 65 78 70 72 28 59 29 20 54 48 45  WHEN expr(Y) THE
9ac0: 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a 20 20 41  N expr(Z). {.  A
9ad0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9ae0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
9af0: 30 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 41  0, Y.pExpr);.  A
9b00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9b10: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
9b20: 41 2c 20 5a 2e 70 45 78 70 72 29 3b 0a 7d 0a 25  A, Z.pExpr);.}.%
9b30: 74 79 70 65 20 63 61 73 65 5f 65 6c 73 65 20 7b  type case_else {
9b40: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
9b50: 6f 72 20 63 61 73 65 5f 65 6c 73 65 20 7b 73 71  or case_else {sq
9b60: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9b70: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
9b80: 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a  }.case_else(A) :
9b90: 3a 3d 20 20 45 4c 53 45 20 65 78 70 72 28 58 29  :=  ELSE expr(X)
9ba0: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58  .         {A = X
9bb0: 2e 70 45 78 70 72 3b 7d 0a 63 61 73 65 5f 65 6c  .pExpr;}.case_el
9bc0: 73 65 28 41 29 20 3a 3a 3d 20 20 2e 20 20 20 20  se(A) ::=  .    
9bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9be0: 20 7b 41 20 3d 20 30 3b 7d 20 0a 25 74 79 70 65   {A = 0;} .%type
9bf0: 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b 45   case_operand {E
9c00: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
9c10: 72 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 20 7b  r case_operand {
9c20: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9c30: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
9c40: 29 3b 7d 0a 63 61 73 65 5f 6f 70 65 72 61 6e 64  );}.case_operand
9c50: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e  (A) ::= expr(X).
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
9c70: 20 58 2e 70 45 78 70 72 3b 7d 20 0a 63 61 73 65   X.pExpr;} .case
9c80: 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20  _operand(A) ::= 
9c90: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9ca0: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25      {A = 0;} ..%
9cb0: 74 79 70 65 20 65 78 70 72 6c 69 73 74 20 7b 45  type exprlist {E
9cc0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
9cd0: 75 63 74 6f 72 20 65 78 70 72 6c 69 73 74 20 7b  uctor exprlist {
9ce0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9cf0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
9d00: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 6e 65  , $$);}.%type ne
9d10: 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  xprlist {ExprLis
9d20: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
9d30: 6e 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74  nexprlist {sqlit
9d40: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
9d50: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
9d60: 3b 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20  ;}..exprlist(A) 
9d70: 3a 3a 3d 20 6e 65 78 70 72 6c 69 73 74 28 58 29  ::= nexprlist(X)
9d80: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9d90: 20 7b 41 20 3d 20 58 3b 7d 0a 65 78 70 72 6c 69   {A = X;}.exprli
9da0: 73 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  st(A) ::= .     
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dc0: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
9dd0: 6e 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  nexprlist(A) ::=
9de0: 20 6e 65 78 70 72 6c 69 73 74 28 58 29 20 43 4f   nexprlist(X) CO
9df0: 4d 4d 41 20 65 78 70 72 28 59 29 2e 0a 20 20 20  MMA expr(Y)..   
9e00: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70   {A = sqlite3Exp
9e10: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
9e20: 73 65 2c 58 2c 59 2e 70 45 78 70 72 29 3b 7d 0a  se,X,Y.pExpr);}.
9e30: 6e 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  nexprlist(A) ::=
9e40: 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 7b 41   expr(Y)..    {A
9e50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
9e60: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
9e70: 30 2c 59 2e 70 45 78 70 72 29 3b 7d 0a 0a 0a 2f  0,Y.pExpr);}.../
9e80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
9e90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
9ea0: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 6f   CREATE INDEX co
9eb0: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
9ec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
9ed0: 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 6b  .cmd ::= createk
9ee0: 77 28 53 29 20 75 6e 69 71 75 65 66 6c 61 67 28  w(S) uniqueflag(
9ef0: 55 29 20 49 4e 44 45 58 20 69 66 6e 6f 74 65 78  U) INDEX ifnotex
9f00: 69 73 74 73 28 4e 45 29 20 6e 6d 28 58 29 20 64  ists(NE) nm(X) d
9f10: 62 6e 6d 28 44 29 0a 20 20 20 20 20 20 20 20 4f  bnm(D).        O
9f20: 4e 20 6e 6d 28 59 29 20 4c 50 20 69 64 78 6c 69  N nm(Y) LP idxli
9f30: 73 74 28 5a 29 20 52 50 28 45 29 2e 20 7b 0a 20  st(Z) RP(E). {. 
9f40: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
9f50: 64 65 78 28 70 50 61 72 73 65 2c 20 26 58 2c 20  dex(pParse, &X, 
9f60: 26 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  &D, .           
9f70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9f80: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70  3SrcListAppend(p
9f90: 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59 2c 30  Parse->db,0,&Y,0
9fa0: 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20 20 20 20  ), Z, U,.       
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
9fc0: 53 2c 20 26 45 2c 20 53 51 4c 49 54 45 5f 53 4f  S, &E, SQLITE_SO
9fd0: 5f 41 53 43 2c 20 4e 45 29 3b 0a 7d 0a 0a 25 74  _ASC, NE);.}..%t
9fe0: 79 70 65 20 75 6e 69 71 75 65 66 6c 61 67 20 7b  ype uniqueflag {
9ff0: 69 6e 74 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28  int}.uniqueflag(
a000: 41 29 20 3a 3a 3d 20 55 4e 49 51 55 45 2e 20 20  A) ::= UNIQUE.  
a010: 7b 41 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a  {A = OE_Abort;}.
a020: 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a 3a  uniqueflag(A) ::
a030: 3d 20 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20  = .        {A = 
a040: 4f 45 5f 4e 6f 6e 65 3b 7d 0a 0a 25 74 79 70 65  OE_None;}..%type
a050: 20 69 64 78 6c 69 73 74 20 7b 45 78 70 72 4c 69   idxlist {ExprLi
a060: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
a070: 20 69 64 78 6c 69 73 74 20 7b 73 71 6c 69 74 65   idxlist {sqlite
a080: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a090: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
a0a0: 7d 0a 25 74 79 70 65 20 69 64 78 6c 69 73 74 5f  }.%type idxlist_
a0b0: 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  opt {ExprList*}.
a0c0: 25 64 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c  %destructor idxl
a0d0: 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33  ist_opt {sqlite3
a0e0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
a0f0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
a100: 0a 0a 69 64 78 6c 69 73 74 5f 6f 70 74 28 41 29  ..idxlist_opt(A)
a110: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
a130: 41 20 3d 20 30 3b 7d 0a 69 64 78 6c 69 73 74 5f  A = 0;}.idxlist_
a140: 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 64  opt(A) ::= LP id
a150: 78 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20 20  xlist(X) RP.    
a160: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64       {A = X;}.id
a170: 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 78  xlist(A) ::= idx
a180: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 6e 6d  list(X) COMMA nm
a190: 28 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73  (Y) collate(C) s
a1a0: 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 20 7b 0a  ortorder(Z).  {.
a1b0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
a1c0: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
a1d0: 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 30  eToken(pParse, 0
a1e0: 2c 20 26 43 29 3b 0a 20 20 41 20 3d 20 73 71 6c  , &C);.  A = sql
a1f0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
a200: 6e 64 28 70 50 61 72 73 65 2c 58 2c 20 70 29 3b  nd(pParse,X, p);
a210: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
a220: 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65  stSetName(pParse
a230: 2c 41 2c 26 59 2c 31 29 3b 0a 20 20 73 71 6c 69  ,A,&Y,1);.  sqli
a240: 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b  te3ExprListCheck
a250: 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20 41  Length(pParse, A
a260: 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 69 66  , "index");.  if
a270: 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45  ( A ) A->a[A->nE
a280: 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72  xpr-1].sortOrder
a290: 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 69 64 78 6c   = (u8)Z;.}.idxl
a2a0: 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59 29  ist(A) ::= nm(Y)
a2b0: 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74   collate(C) sort
a2c0: 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 45 78  order(Z). {.  Ex
a2d0: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
a2e0: 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b  xprAddCollateTok
a2f0: 65 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 26 43  en(pParse, 0, &C
a300: 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33  );.  A = sqlite3
a310: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
a320: 50 61 72 73 65 2c 30 2c 20 70 29 3b 0a 20 20 73  Parse,0, p);.  s
a330: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
a340: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 41 2c  tName(pParse, A,
a350: 20 26 59 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74   &Y, 1);.  sqlit
a360: 65 33 45 78 70 72 4c 69 73 74 43 68 65 63 6b 4c  e3ExprListCheckL
a370: 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20 41 2c  ength(pParse, A,
a380: 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 69 66 28   "index");.  if(
a390: 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78   A ) A->a[A->nEx
a3a0: 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20  pr-1].sortOrder 
a3b0: 3d 20 28 75 38 29 5a 3b 0a 7d 0a 0a 25 74 79 70  = (u8)Z;.}..%typ
a3c0: 65 20 63 6f 6c 6c 61 74 65 20 7b 54 6f 6b 65 6e  e collate {Token
a3d0: 7d 0a 63 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d  }.collate(C) ::=
a3e0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a3f0: 20 20 20 7b 43 2e 7a 20 3d 20 30 3b 20 43 2e 6e     {C.z = 0; C.n
a400: 20 3d 20 30 3b 7d 0a 63 6f 6c 6c 61 74 65 28 43   = 0;}.collate(C
a410: 29 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20 69 64  ) ::= COLLATE id
a420: 73 28 58 29 2e 20 20 20 7b 43 20 3d 20 58 3b 7d  s(X).   {C = X;}
a430: 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .../////////////
a440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a450: 20 54 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20   The DROP INDEX 
a460: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
a470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a480: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f  /.//.cmd ::= DRO
a490: 50 20 49 4e 44 45 58 20 69 66 65 78 69 73 74 73  P INDEX ifexists
a4a0: 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e  (E) fullname(X).
a4b0: 20 20 20 7b 73 71 6c 69 74 65 33 44 72 6f 70 49     {sqlite3DropI
a4c0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 58 2c 20  ndex(pParse, X, 
a4d0: 45 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  E);}..//////////
a4e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a4f0: 2f 2f 2f 20 54 68 65 20 56 41 43 55 55 4d 20 63  /// The VACUUM c
a500: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
a510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a520: 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20  ////.//.%ifndef 
a530: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
a540: 55 4d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  UM.%ifndef SQLIT
a550: 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 63 6d  E_OMIT_ATTACH.cm
a560: 64 20 3a 3a 3d 20 56 41 43 55 55 4d 2e 20 20 20  d ::= VACUUM.   
a570: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
a580: 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50 61 72  lite3Vacuum(pPar
a590: 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41  se);}.cmd ::= VA
a5a0: 43 55 55 4d 20 6e 6d 2e 20 20 20 20 20 20 20 20  CUUM nm.        
a5b0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63       {sqlite3Vac
a5c0: 75 75 6d 28 70 50 61 72 73 65 29 3b 7d 0a 25 65  uum(pParse);}.%e
a5d0: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49  ndif  SQLITE_OMI
a5e0: 54 5f 41 54 54 41 43 48 0a 25 65 6e 64 69 66 20  T_ATTACH.%endif 
a5f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
a600: 55 55 4d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  UUM..///////////
a610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a620: 2f 2f 20 54 68 65 20 50 52 41 47 4d 41 20 63 6f  // The PRAGMA co
a630: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
a640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a650: 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20 53  ///.//.%ifndef S
a660: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
a670: 41 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41  A.cmd ::= PRAGMA
a680: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 2e 20   nm(X) dbnm(Z). 
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
a6a0: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50  sqlite3Pragma(pP
a6b0: 61 72 73 65 2c 26 58 2c 26 5a 2c 30 2c 30 29 3b  arse,&X,&Z,0,0);
a6c0: 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41  }.cmd ::= PRAGMA
a6d0: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20 45   nm(X) dbnm(Z) E
a6e0: 51 20 6e 6d 6e 75 6d 28 59 29 2e 20 20 20 20 7b  Q nmnum(Y).    {
a6f0: 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50  sqlite3Pragma(pP
a700: 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30 29  arse,&X,&Z,&Y,0)
a710: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  ;}.cmd ::= PRAGM
a720: 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29 20  A nm(X) dbnm(Z) 
a730: 4c 50 20 6e 6d 6e 75 6d 28 59 29 20 52 50 2e 20  LP nmnum(Y) RP. 
a740: 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70  {sqlite3Pragma(p
a750: 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 30  Parse,&X,&Z,&Y,0
a760: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  );}.cmd ::= PRAG
a770: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
a780: 20 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29   EQ minus_num(Y)
a790: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  . .             
a7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28 70  {sqlite3Pragma(p
a7d0: 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31  Parse,&X,&Z,&Y,1
a7e0: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  );}.cmd ::= PRAG
a7f0: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
a800: 20 4c 50 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29   LP minus_num(Y)
a810: 20 52 50 2e 0a 20 20 20 20 20 20 20 20 20 20 20   RP..           
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a840: 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61    {sqlite3Pragma
a850: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59  (pParse,&X,&Z,&Y
a860: 2c 31 29 3b 7d 0a 0a 6e 6d 6e 75 6d 28 41 29 20  ,1);}..nmnum(A) 
a870: 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d 28 58 29 2e  ::= plus_num(X).
a880: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
a890: 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a  = X;}.nmnum(A) :
a8a0: 3a 3d 20 6e 6d 28 58 29 2e 20 20 20 20 20 20 20  := nm(X).       
a8b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
a8c0: 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a   X;}.nmnum(A) ::
a8d0: 3d 20 4f 4e 28 58 29 2e 20 20 20 20 20 20 20 20  = ON(X).        
a8e0: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
a8f0: 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d  X;}.nmnum(A) ::=
a900: 20 44 45 4c 45 54 45 28 58 29 2e 20 20 20 20 20   DELETE(X).     
a910: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
a920: 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20  ;}.nmnum(A) ::= 
a930: 44 45 46 41 55 4c 54 28 58 29 2e 20 20 20 20 20  DEFAULT(X).     
a940: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
a950: 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f  }.%endif SQLITE_
a960: 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 70 6c 75 73  OMIT_PRAGMA.plus
a970: 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 50 4c 55 53  _num(A) ::= PLUS
a980: 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20   number(X).     
a990: 20 20 7b 41 20 3d 20 58 3b 7d 0a 70 6c 75 73 5f    {A = X;}.plus_
a9a0: 6e 75 6d 28 41 29 20 3a 3a 3d 20 6e 75 6d 62 65  num(A) ::= numbe
a9b0: 72 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  r(X).           
a9c0: 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75 73 5f   {A = X;}.minus_
a9d0: 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53  num(A) ::= MINUS
a9e0: 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20   number(X).     
a9f0: 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72 28  {A = X;}.number(
aa00: 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 7c 46  A) ::= INTEGER|F
aa10: 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20 7b  LOAT(X).       {
aa20: 41 20 3d 20 58 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  A = X;}..///////
aa30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aa40: 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45  ///// The CREATE
aa50: 20 54 52 49 47 47 45 52 20 63 6f 6d 6d 61 6e 64   TRIGGER command
aa60: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   ///////////////
aa70: 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64 65 66 20  //////..%ifndef 
aa80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
aa90: 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20 63 72 65  GER..cmd ::= cre
aaa0: 61 74 65 6b 77 20 74 72 69 67 67 65 72 5f 64 65  atekw trigger_de
aab0: 63 6c 28 41 29 20 42 45 47 49 4e 20 74 72 69 67  cl(A) BEGIN trig
aac0: 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53 29 20  ger_cmd_list(S) 
aad0: 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f 6b 65  END(Z). {.  Toke
aae0: 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a 20 3d  n all;.  all.z =
aaf0: 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20 3d 20   A.z;.  all.n = 
ab00: 28 69 6e 74 29 28 5a 2e 7a 20 2d 20 41 2e 7a 29  (int)(Z.z - A.z)
ab10: 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71 6c 69 74 65   + Z.n;.  sqlite
ab20: 33 46 69 6e 69 73 68 54 72 69 67 67 65 72 28 70  3FinishTrigger(p
ab30: 50 61 72 73 65 2c 20 53 2c 20 26 61 6c 6c 29 3b  Parse, S, &all);
ab40: 0a 7d 0a 0a 74 72 69 67 67 65 72 5f 64 65 63 6c  .}..trigger_decl
ab50: 28 41 29 20 3a 3a 3d 20 74 65 6d 70 28 54 29 20  (A) ::= temp(T) 
ab60: 54 52 49 47 47 45 52 20 69 66 6e 6f 74 65 78 69  TRIGGER ifnotexi
ab70: 73 74 73 28 4e 4f 45 52 52 29 20 6e 6d 28 42 29  sts(NOERR) nm(B)
ab80: 20 64 62 6e 6d 28 5a 29 20 0a 20 20 20 20 20 20   dbnm(Z) .      
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
aba0: 69 67 67 65 72 5f 74 69 6d 65 28 43 29 20 74 72  igger_time(C) tr
abb0: 69 67 67 65 72 5f 65 76 65 6e 74 28 44 29 0a 20  igger_event(D). 
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abd0: 20 20 20 4f 4e 20 66 75 6c 6c 6e 61 6d 65 28 45     ON fullname(E
abe0: 29 20 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65  ) foreach_clause
abf0: 20 77 68 65 6e 5f 63 6c 61 75 73 65 28 47 29 2e   when_clause(G).
ac00: 20 7b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69   {.  sqlite3Begi
ac10: 6e 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c  nTrigger(pParse,
ac20: 20 26 42 2c 20 26 5a 2c 20 43 2c 20 44 2e 61 2c   &B, &Z, C, D.a,
ac30: 20 44 2e 62 2c 20 45 2c 20 47 2c 20 54 2c 20 4e   D.b, E, G, T, N
ac40: 4f 45 52 52 29 3b 0a 20 20 41 20 3d 20 28 5a 2e  OERR);.  A = (Z.
ac50: 6e 3d 3d 30 3f 42 3a 5a 29 3b 0a 7d 0a 0a 25 74  n==0?B:Z);.}..%t
ac60: 79 70 65 20 74 72 69 67 67 65 72 5f 74 69 6d 65  ype trigger_time
ac70: 20 7b 69 6e 74 7d 0a 74 72 69 67 67 65 72 5f 74   {int}.trigger_t
ac80: 69 6d 65 28 41 29 20 3a 3a 3d 20 42 45 46 4f 52  ime(A) ::= BEFOR
ac90: 45 2e 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b  E.      { A = TK
aca0: 5f 42 45 46 4f 52 45 3b 20 7d 0a 74 72 69 67 67  _BEFORE; }.trigg
acb0: 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 41  er_time(A) ::= A
acc0: 46 54 45 52 2e 20 20 20 20 20 20 20 7b 20 41 20  FTER.       { A 
acd0: 3d 20 54 4b 5f 41 46 54 45 52 3b 20 20 7d 0a 74  = TK_AFTER;  }.t
ace0: 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20 3a  rigger_time(A) :
acf0: 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46 2e 20 20  := INSTEAD OF.  
ad00: 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54 45 41 44  { A = TK_INSTEAD
ad10: 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28  ;}.trigger_time(
ad20: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
ad30: 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46      { A = TK_BEF
ad40: 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72  ORE; }..%type tr
ad50: 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 74 72  igger_event {str
ad60: 75 63 74 20 54 72 69 67 45 76 65 6e 74 7d 0a 25  uct TrigEvent}.%
ad70: 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67 67  destructor trigg
ad80: 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c 69 74 65  er_event {sqlite
ad90: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 50  3IdListDelete(pP
ada0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e 62 29 3b  arse->db, $$.b);
adb0: 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28  }.trigger_event(
adc0: 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 7c 49 4e  A) ::= DELETE|IN
add0: 53 45 52 54 28 4f 50 29 2e 20 20 20 20 20 20 20  SERT(OP).       
ade0: 7b 41 2e 61 20 3d 20 40 4f 50 3b 20 41 2e 62 20  {A.a = @OP; A.b 
adf0: 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76  = 0;}.trigger_ev
ae00: 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54  ent(A) ::= UPDAT
ae10: 45 28 4f 50 29 2e 20 20 20 20 20 20 20 20 20 20  E(OP).          
ae20: 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b 20      {A.a = @OP; 
ae30: 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67 65  A.b = 0;}.trigge
ae40: 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20 55  r_event(A) ::= U
ae50: 50 44 41 54 45 20 4f 46 20 69 6e 73 63 6f 6c 6c  PDATE OF inscoll
ae60: 69 73 74 28 58 29 2e 20 7b 41 2e 61 20 3d 20 54  ist(X). {A.a = T
ae70: 4b 5f 55 50 44 41 54 45 3b 20 41 2e 62 20 3d 20  K_UPDATE; A.b = 
ae80: 58 3b 7d 0a 0a 66 6f 72 65 61 63 68 5f 63 6c 61  X;}..foreach_cla
ae90: 75 73 65 20 3a 3a 3d 20 2e 0a 66 6f 72 65 61 63  use ::= ..foreac
aea0: 68 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 46 4f 52  h_clause ::= FOR
aeb0: 20 45 41 43 48 20 52 4f 57 2e 0a 0a 25 74 79 70   EACH ROW...%typ
aec0: 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 45  e when_clause {E
aed0: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
aee0: 72 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b 73  r when_clause {s
aef0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
af00: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
af10: 3b 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28 41  ;}.when_clause(A
af20: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
af30: 20 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a 77      { A = 0; }.w
af40: 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a 3a  hen_clause(A) ::
af50: 3d 20 57 48 45 4e 20 65 78 70 72 28 58 29 2e 20  = WHEN expr(X). 
af60: 7b 20 41 20 3d 20 58 2e 70 45 78 70 72 3b 20 7d  { A = X.pExpr; }
af70: 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f  ..%type trigger_
af80: 63 6d 64 5f 6c 69 73 74 20 7b 54 72 69 67 67 65  cmd_list {Trigge
af90: 72 53 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63  rStep*}.%destruc
afa0: 74 6f 72 20 74 72 69 67 67 65 72 5f 63 6d 64 5f  tor trigger_cmd_
afb0: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 44 65 6c  list {sqlite3Del
afc0: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 70  eteTriggerStep(p
afd0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
afe0: 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73  .trigger_cmd_lis
aff0: 74 28 41 29 20 3a 3a 3d 20 74 72 69 67 67 65 72  t(A) ::= trigger
b000: 5f 63 6d 64 5f 6c 69 73 74 28 59 29 20 74 72 69  _cmd_list(Y) tri
b010: 67 67 65 72 5f 63 6d 64 28 58 29 20 53 45 4d 49  gger_cmd(X) SEMI
b020: 2e 20 7b 0a 20 20 61 73 73 65 72 74 28 20 59 21  . {.  assert( Y!
b030: 3d 30 20 29 3b 0a 20 20 59 2d 3e 70 4c 61 73 74  =0 );.  Y->pLast
b040: 2d 3e 70 4e 65 78 74 20 3d 20 58 3b 0a 20 20 59  ->pNext = X;.  Y
b050: 2d 3e 70 4c 61 73 74 20 3d 20 58 3b 0a 20 20 41  ->pLast = X;.  A
b060: 20 3d 20 59 3b 0a 7d 0a 74 72 69 67 67 65 72 5f   = Y;.}.trigger_
b070: 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20  cmd_list(A) ::= 
b080: 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29 20 53  trigger_cmd(X) S
b090: 45 4d 49 2e 20 7b 20 0a 20 20 61 73 73 65 72 74  EMI. { .  assert
b0a0: 28 20 58 21 3d 30 20 29 3b 0a 20 20 58 2d 3e 70  ( X!=0 );.  X->p
b0b0: 4c 61 73 74 20 3d 20 58 3b 0a 20 20 41 20 3d 20  Last = X;.  A = 
b0c0: 58 3b 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c 6f  X;.}..// Disallo
b0d0: 77 20 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  w qualified tabl
b0e0: 65 20 6e 61 6d 65 73 20 6f 6e 20 49 4e 53 45 52  e names on INSER
b0f0: 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44  T, UPDATE, and D
b100: 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73  ELETE statements
b110: 0a 2f 2f 20 77 69 74 68 69 6e 20 61 20 74 72 69  .// within a tri
b120: 67 67 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65  gger.  The table
b130: 20 74 6f 20 49 4e 53 45 52 54 2c 20 55 50 44 41   to INSERT, UPDA
b140: 54 45 2c 20 6f 72 20 44 45 4c 45 54 45 20 69 73  TE, or DELETE is
b150: 20 61 6c 77 61 79 73 20 69 6e 20 0a 2f 2f 20 74   always in .// t
b160: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
b170: 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 68   as the table th
b180: 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20 66  at the trigger f
b190: 69 72 65 73 20 6f 6e 2e 0a 2f 2f 0a 25 74 79 70  ires on..//.%typ
b1a0: 65 20 74 72 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 74  e trnm {Token}.t
b1b0: 72 6e 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29  rnm(A) ::= nm(X)
b1c0: 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 74 72 6e  .   {A = X;}.trn
b1d0: 6d 28 41 29 20 3a 3a 3d 20 6e 6d 20 44 4f 54 20  m(A) ::= nm DOT 
b1e0: 6e 6d 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 58  nm(X). {.  A = X
b1f0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ;.  sqlite3Error
b200: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
b210: 20 20 20 20 20 22 71 75 61 6c 69 66 69 65 64 20       "qualified 
b220: 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65 20  table names are 
b230: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 49  not allowed on I
b240: 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61  NSERT, UPDATE, a
b250: 6e 64 20 44 45 4c 45 54 45 20 22 0a 20 20 20 20  nd DELETE ".    
b260: 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73 20      "statements 
b270: 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 22  within triggers"
b280: 29 3b 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c 6f  );.}..// Disallo
b290: 77 20 74 68 65 20 49 4e 44 45 58 20 42 59 20 61  w the INDEX BY a
b2a0: 6e 64 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  nd NOT INDEXED c
b2b0: 6c 61 75 73 65 73 20 6f 6e 20 55 50 44 41 54 45  lauses on UPDATE
b2c0: 20 61 6e 64 20 44 45 4c 45 54 45 0a 2f 2f 20 73   and DELETE.// s
b2d0: 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e  tatements within
b2e0: 20 74 72 69 67 67 65 72 73 2e 20 20 57 65 20 6d   triggers.  We m
b2f0: 61 6b 65 20 61 20 73 70 65 63 69 66 69 63 20 65  ake a specific e
b300: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f 72  rror message for
b310: 20 74 68 69 73 0a 2f 2f 20 73 69 6e 63 65 20 69   this.// since i
b320: 74 20 69 73 20 61 6e 20 65 78 63 65 70 74 69 6f  t is an exceptio
b330: 6e 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c 74  n to the default
b340: 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 2e 0a   grammar rules..
b350: 2f 2f 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20 2e  //.tridxby ::= .
b360: 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20 49 4e 44  .tridxby ::= IND
b370: 45 58 45 44 20 42 59 20 6e 6d 2e 20 7b 0a 20 20  EXED BY nm. {.  
b380: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b390: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
b3a0: 22 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20  "the INDEXED BY 
b3b0: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61 6c  clause is not al
b3c0: 6c 6f 77 65 64 20 6f 6e 20 55 50 44 41 54 45 20  lowed on UPDATE 
b3d0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
b3e0: 65 6e 74 73 20 22 0a 20 20 20 20 20 20 20 20 22  ents ".        "
b3f0: 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 22  within triggers"
b400: 29 3b 0a 7d 0a 74 72 69 64 78 62 79 20 3a 3a 3d  );.}.tridxby ::=
b410: 20 4e 4f 54 20 49 4e 44 45 58 45 44 2e 20 7b 0a   NOT INDEXED. {.
b420: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b430: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
b440: 20 20 22 74 68 65 20 4e 4f 54 20 49 4e 44 45 58    "the NOT INDEX
b450: 45 44 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  ED clause is not
b460: 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 55 50 44 41   allowed on UPDA
b470: 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61  TE or DELETE sta
b480: 74 65 6d 65 6e 74 73 20 22 0a 20 20 20 20 20 20  tements ".      
b490: 20 20 22 77 69 74 68 69 6e 20 74 72 69 67 67 65    "within trigge
b4a0: 72 73 22 29 3b 0a 7d 0a 0a 0a 0a 25 74 79 70 65  rs");.}....%type
b4b0: 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 54 72   trigger_cmd {Tr
b4c0: 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65 73  iggerStep*}.%des
b4d0: 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72 5f  tructor trigger_
b4e0: 63 6d 64 20 7b 73 71 6c 69 74 65 33 44 65 6c 65  cmd {sqlite3Dele
b4f0: 74 65 54 72 69 67 67 65 72 53 74 65 70 28 70 50  teTriggerStep(pP
b500: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
b510: 2f 2f 20 55 50 44 41 54 45 20 0a 74 72 69 67 67  // UPDATE .trigg
b520: 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 0a 20 20  er_cmd(A) ::=.  
b530: 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52   UPDATE orconf(R
b540: 29 20 74 72 6e 6d 28 58 29 20 74 72 69 64 78 62  ) trnm(X) tridxb
b550: 79 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29  y SET setlist(Y)
b560: 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 20 20   where_opt(Z).  
b570: 0a 20 20 20 7b 20 41 20 3d 20 73 71 6c 69 74 65  .   { A = sqlite
b580: 33 54 72 69 67 67 65 72 55 70 64 61 74 65 53 74  3TriggerUpdateSt
b590: 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26  ep(pParse->db, &
b5a0: 58 2c 20 59 2c 20 5a 2c 20 52 29 3b 20 7d 0a 0a  X, Y, Z, R); }..
b5b0: 2f 2f 20 49 4e 53 45 52 54 0a 74 72 69 67 67 65  // INSERT.trigge
b5c0: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 0a 20 20 20  r_cmd(A) ::=.   
b5d0: 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e  insert_cmd(R) IN
b5e0: 54 4f 20 74 72 6e 6d 28 58 29 20 69 6e 73 63 6f  TO trnm(X) insco
b5f0: 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 76 61 6c  llist_opt(F) val
b600: 75 65 6c 69 73 74 28 59 29 2e 0a 20 20 20 7b 41  uelist(Y)..   {A
b610: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
b620: 72 49 6e 73 65 72 74 53 74 65 70 28 70 50 61 72  rInsertStep(pPar
b630: 73 65 2d 3e 64 62 2c 20 26 58 2c 20 46 2c 20 59  se->db, &X, F, Y
b640: 2e 70 4c 69 73 74 2c 20 59 2e 70 53 65 6c 65 63  .pList, Y.pSelec
b650: 74 2c 20 52 29 3b 7d 0a 0a 74 72 69 67 67 65 72  t, R);}..trigger
b660: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 69 6e 73 65  _cmd(A) ::= inse
b670: 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 74  rt_cmd(R) INTO t
b680: 72 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73  rnm(X) inscollis
b690: 74 5f 6f 70 74 28 46 29 20 73 65 6c 65 63 74 28  t_opt(F) select(
b6a0: 53 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  S)..            
b6b0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54     {A = sqlite3T
b6c0: 72 69 67 67 65 72 49 6e 73 65 72 74 53 74 65 70  riggerInsertStep
b6d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58 2c  (pParse->db, &X,
b6e0: 20 46 2c 20 30 2c 20 53 2c 20 52 29 3b 7d 0a 0a   F, 0, S, R);}..
b6f0: 2f 2f 20 44 45 4c 45 54 45 0a 74 72 69 67 67 65  // DELETE.trigge
b700: 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45 4c  r_cmd(A) ::= DEL
b710: 45 54 45 20 46 52 4f 4d 20 74 72 6e 6d 28 58 29  ETE FROM trnm(X)
b720: 20 74 72 69 64 78 62 79 20 77 68 65 72 65 5f 6f   tridxby where_o
b730: 70 74 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20  pt(Y)..         
b740: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74        {A = sqlit
b750: 65 33 54 72 69 67 67 65 72 44 65 6c 65 74 65 53  e3TriggerDeleteS
b760: 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  tep(pParse->db, 
b770: 26 58 2c 20 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c  &X, Y);}..// SEL
b780: 45 43 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28  ECT.trigger_cmd(
b790: 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29  A) ::= select(X)
b7a0: 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54  .  {A = sqlite3T
b7b0: 72 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70  riggerSelectStep
b7c0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 58 29 3b  (pParse->db, X);
b7d0: 20 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63 69   }..// The speci
b7e0: 61 6c 20 52 41 49 53 45 20 65 78 70 72 65 73 73  al RAISE express
b7f0: 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63 63  ion that may occ
b800: 75 72 20 69 6e 20 74 72 69 67 67 65 72 20 70 72  ur in trigger pr
b810: 6f 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20 3a  ograms.expr(A) :
b820: 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 49  := RAISE(X) LP I
b830: 47 4e 4f 52 45 20 52 50 28 59 29 2e 20 20 7b 0a  GNORE RP(Y).  {.
b840: 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69    A.pExpr = sqli
b850: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b860: 20 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30 2c   TK_RAISE, 0, 0,
b870: 20 30 29 3b 20 0a 20 20 69 66 28 20 41 2e 70 45   0); .  if( A.pE
b880: 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70 45 78  xpr ){.    A.pEx
b890: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 4f  pr->affinity = O
b8a0: 45 5f 49 67 6e 6f 72 65 3b 0a 20 20 7d 0a 20 20  E_Ignore;.  }.  
b8b0: 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 3b 0a  A.zStart = X.z;.
b8c0: 20 20 41 2e 7a 45 6e 64 20 3d 20 26 59 2e 7a 5b    A.zEnd = &Y.z[
b8d0: 59 2e 6e 5d 3b 0a 7d 0a 65 78 70 72 28 41 29 20  Y.n];.}.expr(A) 
b8e0: 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20  ::= RAISE(X) LP 
b8f0: 72 61 69 73 65 74 79 70 65 28 54 29 20 43 4f 4d  raisetype(T) COM
b900: 4d 41 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20  MA nm(Z) RP(Y). 
b910: 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73   {.  A.pExpr = s
b920: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
b930: 73 65 2c 20 54 4b 5f 52 41 49 53 45 2c 20 30 2c  se, TK_RAISE, 0,
b940: 20 30 2c 20 26 5a 29 3b 20 0a 20 20 69 66 28 20   0, &Z); .  if( 
b950: 41 2e 70 45 78 70 72 20 29 20 7b 0a 20 20 20 20  A.pExpr ) {.    
b960: 41 2e 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  A.pExpr->affinit
b970: 79 20 3d 20 28 63 68 61 72 29 54 3b 0a 20 20 7d  y = (char)T;.  }
b980: 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e  .  A.zStart = X.
b990: 7a 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26 59  z;.  A.zEnd = &Y
b9a0: 2e 7a 5b 59 2e 6e 5d 3b 0a 7d 0a 25 65 6e 64 69  .z[Y.n];.}.%endi
b9b0: 66 20 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  f  !SQLITE_OMIT_
b9c0: 54 52 49 47 47 45 52 0a 0a 25 74 79 70 65 20 72  TRIGGER..%type r
b9d0: 61 69 73 65 74 79 70 65 20 7b 69 6e 74 7d 0a 72  aisetype {int}.r
b9e0: 61 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20  aisetype(A) ::= 
b9f0: 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b 41 20 3d 20  ROLLBACK.  {A = 
ba00: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b 7d 0a 72 61  OE_Rollback;}.ra
ba10: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 41  isetype(A) ::= A
ba20: 42 4f 52 54 2e 20 20 20 20 20 7b 41 20 3d 20 4f  BORT.     {A = O
ba30: 45 5f 41 62 6f 72 74 3b 7d 0a 72 61 69 73 65 74  E_Abort;}.raiset
ba40: 79 70 65 28 41 29 20 3a 3a 3d 20 46 41 49 4c 2e  ype(A) ::= FAIL.
ba50: 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 46 61        {A = OE_Fa
ba60: 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  il;}.../////////
ba70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
ba80: 20 44 52 4f 50 20 54 52 49 47 47 45 52 20 73 74   DROP TRIGGER st
ba90: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
baa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bab0: 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53  //////.%ifndef S
bac0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
bad0: 45 52 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20  ER.cmd ::= DROP 
bae0: 54 52 49 47 47 45 52 20 69 66 65 78 69 73 74 73  TRIGGER ifexists
baf0: 28 4e 4f 45 52 52 29 20 66 75 6c 6c 6e 61 6d 65  (NOERR) fullname
bb00: 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (X). {.  sqlite3
bb10: 44 72 6f 70 54 72 69 67 67 65 72 28 70 50 61 72  DropTrigger(pPar
bb20: 73 65 2c 58 2c 4e 4f 45 52 52 29 3b 0a 7d 0a 25  se,X,NOERR);.}.%
bb30: 65 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f  endif  !SQLITE_O
bb40: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2f 2f  MIT_TRIGGER..///
bb50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bb60: 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 20 44 41 54  ///// ATTACH DAT
bb70: 41 42 41 53 45 20 66 69 6c 65 20 41 53 20 6e 61  ABASE file AS na
bb80: 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  me /////////////
bb90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66  ////////////.%if
bba0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bbb0: 5f 41 54 54 41 43 48 0a 63 6d 64 20 3a 3a 3d 20  _ATTACH.cmd ::= 
bbc0: 41 54 54 41 43 48 20 64 61 74 61 62 61 73 65 5f  ATTACH database_
bbd0: 6b 77 5f 6f 70 74 20 65 78 70 72 28 46 29 20 41  kw_opt expr(F) A
bbe0: 53 20 65 78 70 72 28 44 29 20 6b 65 79 5f 6f 70  S expr(D) key_op
bbf0: 74 28 4b 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  t(K). {.  sqlite
bc00: 33 41 74 74 61 63 68 28 70 50 61 72 73 65 2c 20  3Attach(pParse, 
bc10: 46 2e 70 45 78 70 72 2c 20 44 2e 70 45 78 70 72  F.pExpr, D.pExpr
bc20: 2c 20 4b 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20  , K);.}.cmd ::= 
bc30: 44 45 54 41 43 48 20 64 61 74 61 62 61 73 65 5f  DETACH database_
bc40: 6b 77 5f 6f 70 74 20 65 78 70 72 28 44 29 2e 20  kw_opt expr(D). 
bc50: 7b 0a 20 20 73 71 6c 69 74 65 33 44 65 74 61 63  {.  sqlite3Detac
bc60: 68 28 70 50 61 72 73 65 2c 20 44 2e 70 45 78 70  h(pParse, D.pExp
bc70: 72 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 6b 65 79  r);.}..%type key
bc80: 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65  _opt {Expr*}.%de
bc90: 73 74 72 75 63 74 6f 72 20 6b 65 79 5f 6f 70 74  structor key_opt
bca0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c   {sqlite3ExprDel
bcb0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
bcc0: 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70 74 28 41 29  $$);}.key_opt(A)
bcd0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
bce0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d             { A =
bcf0: 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41 29   0; }.key_opt(A)
bd00: 20 3a 3a 3d 20 4b 45 59 20 65 78 70 72 28 58 29   ::= KEY expr(X)
bd10: 2e 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d  .          { A =
bd20: 20 58 2e 70 45 78 70 72 3b 20 7d 0a 0a 64 61 74   X.pExpr; }..dat
bd30: 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d  abase_kw_opt ::=
bd40: 20 44 41 54 41 42 41 53 45 2e 0a 64 61 74 61 62   DATABASE..datab
bd50: 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 2e  ase_kw_opt ::= .
bd60: 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f  .%endif SQLITE_O
bd70: 4d 49 54 5f 41 54 54 41 43 48 0a 0a 2f 2f 2f 2f  MIT_ATTACH..////
bd80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bd90: 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44 45 58 20 63  ////// REINDEX c
bda0: 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f 2f  ollation ///////
bdb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bdc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e  ///////////.%ifn
bdd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bde0: 52 45 49 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d 20  REINDEX.cmd ::= 
bdf0: 52 45 49 4e 44 45 58 2e 20 20 20 20 20 20 20 20  REINDEX.        
be00: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
be10: 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c 20  Reindex(pParse, 
be20: 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  0, 0);}.cmd ::= 
be30: 52 45 49 4e 44 45 58 20 6e 6d 28 58 29 20 64 62  REINDEX nm(X) db
be40: 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33  nm(Y).  {sqlite3
be50: 52 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c 20  Reindex(pParse, 
be60: 26 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66  &X, &Y);}.%endif
be70: 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45    SQLITE_OMIT_RE
be80: 49 4e 44 45 58 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  INDEX../////////
be90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bea0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4e 41 4c 59  ////////// ANALY
beb0: 5a 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ZE /////////////
bec0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bed0: 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53  //////.%ifndef S
bee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59  QLITE_OMIT_ANALY
bef0: 5a 45 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59  ZE.cmd ::= ANALY
bf00: 5a 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  ZE.             
bf10: 20 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c 79     {sqlite3Analy
bf20: 7a 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29  ze(pParse, 0, 0)
bf30: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59  ;}.cmd ::= ANALY
bf40: 5a 45 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29  ZE nm(X) dbnm(Y)
bf50: 2e 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c 79  .  {sqlite3Analy
bf60: 7a 65 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26  ze(pParse, &X, &
bf70: 59 29 3b 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f 2f  Y);}.%endif..///
bf80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bf90: 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20 54 41 42 4c  ///// ALTER TABL
bfa0: 45 20 74 61 62 6c 65 20 2e 2e 2e 20 2f 2f 2f 2f  E table ... ////
bfb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
bfc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66  ////////////.%if
bfd0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bfe0: 5f 41 4c 54 45 52 54 41 42 4c 45 0a 63 6d 64 20  _ALTERTABLE.cmd 
bff0: 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20  ::= ALTER TABLE 
c000: 66 75 6c 6c 6e 61 6d 65 28 58 29 20 52 45 4e 41  fullname(X) RENA
c010: 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e 20 7b 0a 20  ME TO nm(Z). {. 
c020: 20 73 71 6c 69 74 65 33 41 6c 74 65 72 52 65 6e   sqlite3AlterRen
c030: 61 6d 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ameTable(pParse,
c040: 58 2c 26 5a 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d  X,&Z);.}.cmd ::=
c050: 20 41 4c 54 45 52 20 54 41 42 4c 45 20 61 64 64   ALTER TABLE add
c060: 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65  _column_fullname
c070: 20 41 44 44 20 6b 77 63 6f 6c 75 6d 6e 5f 6f 70   ADD kwcolumn_op
c080: 74 20 63 6f 6c 75 6d 6e 28 59 29 2e 20 7b 0a 20  t column(Y). {. 
c090: 20 73 71 6c 69 74 65 33 41 6c 74 65 72 46 69 6e   sqlite3AlterFin
c0a0: 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61  ishAddColumn(pPa
c0b0: 72 73 65 2c 20 26 59 29 3b 0a 7d 0a 61 64 64 5f  rse, &Y);.}.add_
c0c0: 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20  column_fullname 
c0d0: 3a 3a 3d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e  ::= fullname(X).
c0e0: 20 7b 0a 20 20 70 50 61 72 73 65 2d 3e 64 62 2d   {.  pParse->db-
c0f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
c100: 6c 65 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  led = 0;.  sqlit
c110: 65 33 41 6c 74 65 72 42 65 67 69 6e 41 64 64 43  e3AlterBeginAddC
c120: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 58 29  olumn(pParse, X)
c130: 3b 0a 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74  ;.}.kwcolumn_opt
c140: 20 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f   ::= ..kwcolumn_
c150: 6f 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57  opt ::= COLUMNKW
c160: 2e 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45  ..%endif  SQLITE
c170: 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
c180: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
c190: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54  ////////// CREAT
c1a0: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20  E VIRTUAL TABLE 
c1b0: 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ... ////////////
c1c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c1d0: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.%ifndef SQLITE
c1e0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
c1f0: 4c 45 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74  LE.cmd ::= creat
c200: 65 5f 76 74 61 62 2e 20 20 20 20 20 20 20 20 20  e_vtab.         
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73                {s
c220: 71 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68  qlite3VtabFinish
c230: 50 61 72 73 65 28 70 50 61 72 73 65 2c 30 29 3b  Parse(pParse,0);
c240: 7d 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65  }.cmd ::= create
c250: 5f 76 74 61 62 20 4c 50 20 76 74 61 62 61 72 67  _vtab LP vtabarg
c260: 6c 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71  list RP(X).  {sq
c270: 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50  lite3VtabFinishP
c280: 61 72 73 65 28 70 50 61 72 73 65 2c 26 58 29 3b  arse(pParse,&X);
c290: 7d 0a 63 72 65 61 74 65 5f 76 74 61 62 20 3a 3a  }.create_vtab ::
c2a0: 3d 20 63 72 65 61 74 65 6b 77 20 56 49 52 54 55  = createkw VIRTU
c2b0: 41 4c 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78  AL TABLE ifnotex
c2c0: 69 73 74 73 28 45 29 0a 20 20 20 20 20 20 20 20  ists(E).        
c2d0: 20 20 20 20 20 20 20 20 6e 6d 28 58 29 20 64 62          nm(X) db
c2e0: 6e 6d 28 59 29 20 55 53 49 4e 47 20 6e 6d 28 5a  nm(Y) USING nm(Z
c2f0: 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ). {.    sqlite3
c300: 56 74 61 62 42 65 67 69 6e 50 61 72 73 65 28 70  VtabBeginParse(p
c310: 50 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26  Parse, &X, &Y, &
c320: 5a 2c 20 45 29 3b 0a 7d 0a 76 74 61 62 61 72 67  Z, E);.}.vtabarg
c330: 6c 69 73 74 20 3a 3a 3d 20 76 74 61 62 61 72 67  list ::= vtabarg
c340: 2e 0a 76 74 61 62 61 72 67 6c 69 73 74 20 3a 3a  ..vtabarglist ::
c350: 3d 20 76 74 61 62 61 72 67 6c 69 73 74 20 43 4f  = vtabarglist CO
c360: 4d 4d 41 20 76 74 61 62 61 72 67 2e 0a 76 74 61  MMA vtabarg..vta
c370: 62 61 72 67 20 3a 3a 3d 20 2e 20 20 20 20 20 20  barg ::= .      
c380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c390: 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67   {sqlite3VtabArg
c3a0: 49 6e 69 74 28 70 50 61 72 73 65 29 3b 7d 0a 76  Init(pParse);}.v
c3b0: 74 61 62 61 72 67 20 3a 3a 3d 20 76 74 61 62 61  tabarg ::= vtaba
c3c0: 72 67 20 76 74 61 62 61 72 67 74 6f 6b 65 6e 2e  rg vtabargtoken.
c3d0: 0a 76 74 61 62 61 72 67 74 6f 6b 65 6e 20 3a 3a  .vtabargtoken ::
c3e0: 3d 20 41 4e 59 28 58 29 2e 20 20 20 20 20 20 20  = ANY(X).       
c3f0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61       {sqlite3Vta
c400: 62 41 72 67 45 78 74 65 6e 64 28 70 50 61 72 73  bArgExtend(pPars
c410: 65 2c 26 58 29 3b 7d 0a 76 74 61 62 61 72 67 74  e,&X);}.vtabargt
c420: 6f 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c  oken ::= lp anyl
c430: 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c  ist RP(X).  {sql
c440: 69 74 65 33 56 74 61 62 41 72 67 45 78 74 65 6e  ite3VtabArgExten
c450: 64 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 6c  d(pParse,&X);}.l
c460: 70 20 3a 3a 3d 20 4c 50 28 58 29 2e 20 20 20 20  p ::= LP(X).    
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c480: 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41     {sqlite3VtabA
c490: 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c  rgExtend(pParse,
c4a0: 26 58 29 3b 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a  &X);}.anylist ::
c4b0: 3d 20 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20  = ..anylist ::= 
c4c0: 61 6e 79 6c 69 73 74 20 4c 50 20 61 6e 79 6c 69  anylist LP anyli
c4d0: 73 74 20 52 50 2e 0a 61 6e 79 6c 69 73 74 20 3a  st RP..anylist :
c4e0: 3a 3d 20 61 6e 79 6c 69 73 74 20 41 4e 59 2e 0a  := anylist ANY..
c4f0: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
c500: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
c510: 0a                                               .