/ Hex Artifact Content
Login

Artifact 0f8e7d60f0ab3cb53d270adef69259ac307d83a8:


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 7d 20 2f 2f 20 65 6e 64 20 25 69   };..} // end %i
0af0: 6e 63 6c 75 64 65 0a 0a 2f 2f 20 49 6e 70 75 74  nclude..// Input
0b00: 20 69 73 20 61 20 73 69 6e 67 6c 65 20 53 51 4c   is a single SQL
0b10: 20 63 6f 6d 6d 61 6e 64 0a 69 6e 70 75 74 20 3a   command.input :
0b20: 3a 3d 20 63 6d 64 6c 69 73 74 2e 0a 63 6d 64 6c  := cmdlist..cmdl
0b30: 69 73 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74 20  ist ::= cmdlist 
0b40: 65 63 6d 64 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a  ecmd..cmdlist ::
0b50: 3d 20 65 63 6d 64 2e 0a 65 63 6d 64 20 3a 3a 3d  = ecmd..ecmd ::=
0b60: 20 53 45 4d 49 2e 0a 65 63 6d 64 20 3a 3a 3d 20   SEMI..ecmd ::= 
0b70: 65 78 70 6c 61 69 6e 20 63 6d 64 78 20 53 45 4d  explain cmdx SEM
0b80: 49 2e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 2e  I..explain ::= .
0b90: 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 71 6c             { sql
0ba0: 69 74 65 33 42 65 67 69 6e 50 61 72 73 65 28 70  ite3BeginParse(p
0bb0: 50 61 72 73 65 2c 20 30 29 3b 20 7d 0a 25 69 66  Parse, 0); }.%if
0bc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0bd0: 5f 45 58 50 4c 41 49 4e 0a 65 78 70 6c 61 69 6e  _EXPLAIN.explain
0be0: 20 3a 3a 3d 20 45 58 50 4c 41 49 4e 2e 20 20 20   ::= 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 31 29 3b 20 7d 0a 65 78 70  Parse, 1); }.exp
0c20: 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c 41 49 4e  lain ::= EXPLAIN
0c30: 20 51 55 45 52 59 20 50 4c 41 4e 2e 20 20 20 7b   QUERY PLAN.   {
0c40: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72   sqlite3BeginPar
0c50: 73 65 28 70 50 61 72 73 65 2c 20 32 29 3b 20 7d  se(pParse, 2); }
0c60: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
0c70: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 63 6d 64  OMIT_EXPLAIN.cmd
0c80: 78 20 3a 3a 3d 20 63 6d 64 2e 20 20 20 20 20 20  x ::= cmd.      
0c90: 20 20 20 20 20 7b 20 73 71 6c 69 74 65 33 46 69       { sqlite3Fi
0ca0: 6e 69 73 68 43 6f 64 69 6e 67 28 70 50 61 72 73  nishCoding(pPars
0cb0: 65 29 3b 20 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  e); }../////////
0cc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67  //////////// Beg
0cd0: 69 6e 20 61 6e 64 20 65 6e 64 20 74 72 61 6e 73  in and end trans
0ce0: 61 63 74 69 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f  actions. ///////
0cf0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0d00: 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a  /////.//..cmd ::
0d10: 3d 20 42 45 47 49 4e 20 74 72 61 6e 73 74 79 70  = BEGIN transtyp
0d20: 65 28 59 29 20 74 72 61 6e 73 5f 6f 70 74 2e 20  e(Y) trans_opt. 
0d30: 20 7b 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72   {sqlite3BeginTr
0d40: 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65  ansaction(pParse
0d50: 2c 20 59 29 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74  , Y);}.trans_opt
0d60: 20 3a 3a 3d 20 2e 0a 74 72 61 6e 73 5f 6f 70 74   ::= ..trans_opt
0d70: 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e   ::= TRANSACTION
0d80: 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20  ..trans_opt ::= 
0d90: 54 52 41 4e 53 41 43 54 49 4f 4e 20 6e 6d 2e 0a  TRANSACTION nm..
0da0: 25 74 79 70 65 20 74 72 61 6e 73 74 79 70 65 20  %type transtype 
0db0: 7b 69 6e 74 7d 0a 74 72 61 6e 73 74 79 70 65 28  {int}.transtype(
0dc0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
0dd0: 20 20 20 20 20 7b 41 20 3d 20 54 4b 5f 44 45 46       {A = TK_DEF
0de0: 45 52 52 45 44 3b 7d 0a 74 72 61 6e 73 74 79 70  ERRED;}.transtyp
0df0: 65 28 41 29 20 3a 3a 3d 20 44 45 46 45 52 52 45  e(A) ::= DEFERRE
0e00: 44 28 58 29 2e 20 20 7b 41 20 3d 20 40 58 3b 7d  D(X).  {A = @X;}
0e10: 0a 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a  .transtype(A) ::
0e20: 3d 20 49 4d 4d 45 44 49 41 54 45 28 58 29 2e 20  = IMMEDIATE(X). 
0e30: 7b 41 20 3d 20 40 58 3b 7d 0a 74 72 61 6e 73 74  {A = @X;}.transt
0e40: 79 70 65 28 41 29 20 3a 3a 3d 20 45 58 43 4c 55  ype(A) ::= EXCLU
0e50: 53 49 56 45 28 58 29 2e 20 7b 41 20 3d 20 40 58  SIVE(X). {A = @X
0e60: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49  ;}.cmd ::= COMMI
0e70: 54 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20  T trans_opt.    
0e80: 20 20 7b 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74    {sqlite3Commit
0e90: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72  Transaction(pPar
0ea0: 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 45 4e  se);}.cmd ::= EN
0eb0: 44 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20  D trans_opt.    
0ec0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43 6f 6d       {sqlite3Com
0ed0: 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  mitTransaction(p
0ee0: 50 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  Parse);}.cmd ::=
0ef0: 20 52 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73 5f   ROLLBACK trans_
0f00: 6f 70 74 2e 20 20 20 20 7b 73 71 6c 69 74 65 33  opt.    {sqlite3
0f10: 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
0f20: 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a 0a 73  ion(pParse);}..s
0f30: 61 76 65 70 6f 69 6e 74 5f 6f 70 74 20 3a 3a 3d  avepoint_opt ::=
0f40: 20 53 41 56 45 50 4f 49 4e 54 2e 0a 73 61 76 65   SAVEPOINT..save
0f50: 70 6f 69 6e 74 5f 6f 70 74 20 3a 3a 3d 20 2e 0a  point_opt ::= ..
0f60: 63 6d 64 20 3a 3a 3d 20 53 41 56 45 50 4f 49 4e  cmd ::= SAVEPOIN
0f70: 54 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c  T nm(X). {.  sql
0f80: 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 70 50  ite3Savepoint(pP
0f90: 61 72 73 65 2c 20 53 41 56 45 50 4f 49 4e 54 5f  arse, SAVEPOINT_
0fa0: 42 45 47 49 4e 2c 20 26 58 29 3b 0a 7d 0a 63 6d  BEGIN, &X);.}.cm
0fb0: 64 20 3a 3a 3d 20 52 45 4c 45 41 53 45 20 73 61  d ::= RELEASE sa
0fc0: 76 65 70 6f 69 6e 74 5f 6f 70 74 20 6e 6d 28 58  vepoint_opt nm(X
0fd0: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 61  ). {.  sqlite3Sa
0fe0: 76 65 70 6f 69 6e 74 28 70 50 61 72 73 65 2c 20  vepoint(pParse, 
0ff0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
1000: 45 2c 20 26 58 29 3b 0a 7d 0a 63 6d 64 20 3a 3a  E, &X);.}.cmd ::
1010: 3d 20 52 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73  = ROLLBACK trans
1020: 5f 6f 70 74 20 54 4f 20 73 61 76 65 70 6f 69 6e  _opt TO savepoin
1030: 74 5f 6f 70 74 20 6e 6d 28 58 29 2e 20 7b 0a 20  t_opt nm(X). {. 
1040: 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e   sqlite3Savepoin
1050: 74 28 70 50 61 72 73 65 2c 20 53 41 56 45 50 4f  t(pParse, SAVEPO
1060: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 26 58  INT_ROLLBACK, &X
1070: 29 3b 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );.}..//////////
1080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
1090: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
10a0: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
10b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
10c0: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63  ///.//.cmd ::= c
10d0: 72 65 61 74 65 5f 74 61 62 6c 65 20 63 72 65 61  reate_table crea
10e0: 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 2e 0a 63  te_table_args..c
10f0: 72 65 61 74 65 5f 74 61 62 6c 65 20 3a 3a 3d 20  reate_table ::= 
1100: 63 72 65 61 74 65 6b 77 20 74 65 6d 70 28 54 29  createkw temp(T)
1110: 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 73   TABLE ifnotexis
1120: 74 73 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d  ts(E) nm(Y) dbnm
1130: 28 5a 29 2e 20 7b 0a 20 20 20 73 71 6c 69 74 65  (Z). {.   sqlite
1140: 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61 72  3StartTable(pPar
1150: 73 65 2c 26 59 2c 26 5a 2c 54 2c 30 2c 30 2c 45  se,&Y,&Z,T,0,0,E
1160: 29 3b 0a 7d 0a 63 72 65 61 74 65 6b 77 28 41 29  );.}.createkw(A)
1170: 20 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 2e 20   ::= CREATE(X). 
1180: 20 7b 0a 20 20 70 50 61 72 73 65 2d 3e 64 62 2d   {.  pParse->db-
1190: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
11a0: 6c 65 64 20 3d 20 30 3b 0a 20 20 41 20 3d 20 58  led = 0;.  A = X
11b0: 3b 0a 7d 0a 25 74 79 70 65 20 69 66 6e 6f 74 65  ;.}.%type ifnote
11c0: 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66 6e 6f  xists {int}.ifno
11d0: 74 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 2e  texists(A) ::= .
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
11f0: 20 3d 20 30 3b 7d 0a 69 66 6e 6f 74 65 78 69 73   = 0;}.ifnotexis
1200: 74 73 28 41 29 20 3a 3a 3d 20 49 46 20 4e 4f 54  ts(A) ::= IF NOT
1210: 20 45 58 49 53 54 53 2e 20 7b 41 20 3d 20 31 3b   EXISTS. {A = 1;
1220: 7d 0a 25 74 79 70 65 20 74 65 6d 70 20 7b 69 6e  }.%type temp {in
1230: 74 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  t}.%ifndef SQLIT
1240: 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 74 65  E_OMIT_TEMPDB.te
1250: 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d 50 2e 20  mp(A) ::= TEMP. 
1260: 20 7b 41 20 3d 20 31 3b 7d 0a 25 65 6e 64 69 66   {A = 1;}.%endif
1270: 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45    SQLITE_OMIT_TE
1280: 4d 50 44 42 0a 74 65 6d 70 28 41 29 20 3a 3a 3d  MPDB.temp(A) ::=
1290: 20 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d   .      {A = 0;}
12a0: 0a 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 72  .create_table_ar
12b0: 67 73 20 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e  gs ::= LP column
12c0: 6c 69 73 74 20 63 6f 6e 73 6c 69 73 74 5f 6f 70  list conslist_op
12d0: 74 28 58 29 20 52 50 28 45 29 20 74 61 62 6c 65  t(X) RP(E) table
12e0: 5f 6f 70 74 69 6f 6e 73 28 46 29 2e 20 7b 0a 20  _options(F). {. 
12f0: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
1300: 28 70 50 61 72 73 65 2c 26 58 2c 26 45 2c 46 2c  (pParse,&X,&E,F,
1310: 30 29 3b 0a 7d 0a 63 72 65 61 74 65 5f 74 61 62  0);.}.create_tab
1320: 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 41 53 20 73  le_args ::= AS s
1330: 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71  elect(S). {.  sq
1340: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
1350: 61 72 73 65 2c 30 2c 30 2c 30 2c 53 29 3b 0a 20  arse,0,0,0,S);. 
1360: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1370: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
1380: 20 53 29 3b 0a 7d 0a 25 74 79 70 65 20 74 61 62   S);.}.%type tab
1390: 6c 65 5f 6f 70 74 69 6f 6e 73 20 7b 75 38 7d 0a  le_options {u8}.
13a0: 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73 28 41 29  table_options(A)
13b0: 20 3a 3a 3d 20 2e 20 20 20 20 7b 41 20 3d 20 30   ::= .    {A = 0
13c0: 3b 7d 0a 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73  ;}.table_options
13d0: 28 41 29 20 3a 3a 3d 20 57 49 54 48 4f 55 54 20  (A) ::= WITHOUT 
13e0: 6e 6d 28 58 29 2e 20 7b 0a 20 20 69 66 28 20 58  nm(X). {.  if( X
13f0: 2e 6e 3d 3d 35 20 26 26 20 73 71 6c 69 74 65 33  .n==5 && sqlite3
1400: 5f 73 74 72 6e 69 63 6d 70 28 58 2e 7a 2c 22 72  _strnicmp(X.z,"r
1410: 6f 77 69 64 22 2c 35 29 3d 3d 30 20 29 7b 0a 20  owid",5)==0 ){. 
1420: 20 20 20 41 20 3d 20 54 46 5f 57 69 74 68 6f 75     A = TF_Withou
1430: 74 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b  tRowid;.  }else{
1440: 0a 20 20 20 20 41 20 3d 20 30 3b 0a 20 20 20 20  .    A = 0;.    
1450: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1460: 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e  pParse, "unknown
1470: 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e 3a 20 25   table option: %
1480: 2e 2a 73 22 2c 20 58 2e 6e 2c 20 58 2e 7a 29 3b  .*s", X.n, X.z);
1490: 0a 20 20 7d 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69 73  .  }.}.columnlis
14a0: 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73 74  t ::= columnlist
14b0: 20 43 4f 4d 4d 41 20 63 6f 6c 75 6d 6e 2e 0a 63   COMMA column..c
14c0: 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f  olumnlist ::= co
14d0: 6c 75 6d 6e 2e 0a 0a 2f 2f 20 41 20 22 63 6f 6c  lumn...// A "col
14e0: 75 6d 6e 22 20 69 73 20 61 20 63 6f 6d 70 6c 65  umn" is a comple
14f0: 74 65 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f  te description o
1500: 66 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75 6d  f a single colum
1510: 6e 20 69 6e 20 61 0a 2f 2f 20 43 52 45 41 54 45  n in a.// CREATE
1520: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1530: 2e 20 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73  .  This includes
1540: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
1550: 2c 20 69 74 73 0a 2f 2f 20 64 61 74 61 74 79 70  , its.// datatyp
1560: 65 2c 20 61 6e 64 20 6f 74 68 65 72 20 6b 65 79  e, and other key
1570: 77 6f 72 64 73 20 73 75 63 68 20 61 73 20 50 52  words such as PR
1580: 49 4d 41 52 59 20 4b 45 59 2c 20 55 4e 49 51 55  IMARY KEY, UNIQU
1590: 45 2c 20 52 45 46 45 52 45 4e 43 45 53 2c 0a 2f  E, REFERENCES,./
15a0: 2f 20 4e 4f 54 20 4e 55 4c 4c 20 61 6e 64 20 73  / NOT NULL and s
15b0: 6f 20 66 6f 72 74 68 2e 0a 2f 2f 0a 63 6f 6c 75  o forth..//.colu
15c0: 6d 6e 28 41 29 20 3a 3a 3d 20 63 6f 6c 75 6d 6e  mn(A) ::= column
15d0: 69 64 28 58 29 20 74 79 70 65 20 63 61 72 67 6c  id(X) type cargl
15e0: 69 73 74 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58  ist. {.  A.z = X
15f0: 2e 7a 3b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74  .z;.  A.n = (int
1600: 29 28 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54  )(pParse->sLastT
1610: 6f 6b 65 6e 2e 7a 2d 58 2e 7a 29 20 2b 20 70 50  oken.z-X.z) + pP
1620: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
1630: 2e 6e 3b 0a 7d 0a 63 6f 6c 75 6d 6e 69 64 28 41  .n;.}.columnid(A
1640: 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 7b 0a 20  ) ::= nm(X). {. 
1650: 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d   sqlite3AddColum
1660: 6e 28 70 50 61 72 73 65 2c 26 58 29 3b 0a 20 20  n(pParse,&X);.  
1670: 41 20 3d 20 58 3b 0a 20 20 70 50 61 72 73 65 2d  A = X;.  pParse-
1680: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e  >constraintName.
1690: 6e 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2f 20 41 6e  n = 0;.}...// An
16a0: 20 49 44 45 4e 54 49 46 49 45 52 20 63 61 6e 20   IDENTIFIER can 
16b0: 62 65 20 61 20 67 65 6e 65 72 69 63 20 69 64 65  be a generic ide
16c0: 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20  ntifier, or one 
16d0: 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65  of several.// ke
16e0: 79 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e  ywords.  Any non
16f0: 2d 73 74 61 6e 64 61 72 64 20 6b 65 79 77 6f 72  -standard keywor
1700: 64 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e  d can also be an
1710: 20 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 0a   identifier..//.
1720: 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 69 64 20  %token_class id 
1730: 20 49 44 7c 49 4e 44 45 58 45 44 2e 0a 0a 2f 2f   ID|INDEXED...//
1740: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
1750: 69 72 65 63 74 69 76 65 20 63 61 75 73 65 73 20  irective causes 
1760: 74 6f 6b 65 6e 73 20 41 42 4f 52 54 2c 20 41 46  tokens ABORT, AF
1770: 54 45 52 2c 20 41 53 43 2c 20 65 74 63 2e 20 74  TER, ASC, etc. t
1780: 6f 0a 2f 2f 20 66 61 6c 6c 62 61 63 6b 20 74 6f  o.// fallback to
1790: 20 49 44 20 69 66 20 74 68 65 79 20 77 69 6c 6c   ID if they will
17a0: 20 6e 6f 74 20 70 61 72 73 65 20 61 73 20 74 68   not parse as th
17b0: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  eir original val
17c0: 75 65 2e 0a 2f 2f 20 54 68 69 73 20 6f 62 76 69  ue..// This obvi
17d0: 61 74 65 73 20 74 68 65 20 6e 65 65 64 20 66 6f  ates the need fo
17e0: 72 20 74 68 65 20 22 69 64 22 20 6e 6f 6e 74 65  r the "id" nonte
17f0: 72 6d 69 6e 61 6c 2e 0a 2f 2f 0a 25 66 61 6c 6c  rminal..//.%fall
1800: 62 61 63 6b 20 49 44 0a 20 20 41 42 4f 52 54 20  back ID.  ABORT 
1810: 41 43 54 49 4f 4e 20 41 46 54 45 52 20 41 4e 41  ACTION AFTER ANA
1820: 4c 59 5a 45 20 41 53 43 20 41 54 54 41 43 48 20  LYZE ASC ATTACH 
1830: 42 45 46 4f 52 45 20 42 45 47 49 4e 20 42 59 20  BEFORE BEGIN BY 
1840: 43 41 53 43 41 44 45 20 43 41 53 54 20 43 4f 4c  CASCADE CAST COL
1850: 55 4d 4e 4b 57 0a 20 20 43 4f 4e 46 4c 49 43 54  UMNKW.  CONFLICT
1860: 20 44 41 54 41 42 41 53 45 20 44 45 46 45 52 52   DATABASE DEFERR
1870: 45 44 20 44 45 53 43 20 44 45 54 41 43 48 20 45  ED DESC DETACH E
1880: 41 43 48 20 45 4e 44 20 45 58 43 4c 55 53 49 56  ACH END EXCLUSIV
1890: 45 20 45 58 50 4c 41 49 4e 20 46 41 49 4c 20 46  E EXPLAIN FAIL F
18a0: 4f 52 0a 20 20 49 47 4e 4f 52 45 20 49 4d 4d 45  OR.  IGNORE IMME
18b0: 44 49 41 54 45 20 49 4e 49 54 49 41 4c 4c 59 20  DIATE INITIALLY 
18c0: 49 4e 53 54 45 41 44 20 4c 49 4b 45 5f 4b 57 20  INSTEAD LIKE_KW 
18d0: 4d 41 54 43 48 20 4e 4f 20 50 4c 41 4e 0a 20 20  MATCH NO PLAN.  
18e0: 51 55 45 52 59 20 4b 45 59 20 4f 46 20 4f 46 46  QUERY KEY OF OFF
18f0: 53 45 54 20 50 52 41 47 4d 41 20 52 41 49 53 45  SET PRAGMA RAISE
1900: 20 52 45 43 55 52 53 49 56 45 20 52 45 4c 45 41   RECURSIVE RELEA
1910: 53 45 20 52 45 50 4c 41 43 45 20 52 45 53 54 52  SE REPLACE RESTR
1920: 49 43 54 20 52 4f 57 0a 20 20 52 4f 4c 4c 42 41  ICT ROW.  ROLLBA
1930: 43 4b 20 53 41 56 45 50 4f 49 4e 54 20 54 45 4d  CK SAVEPOINT TEM
1940: 50 20 54 52 49 47 47 45 52 20 56 41 43 55 55 4d  P TRIGGER VACUUM
1950: 20 56 49 45 57 20 56 49 52 54 55 41 4c 20 57 49   VIEW VIRTUAL WI
1960: 54 48 20 57 49 54 48 4f 55 54 0a 25 69 66 64 65  TH WITHOUT.%ifde
1970: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  f SQLITE_OMIT_CO
1980: 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 20 20  MPOUND_SELECT.  
1990: 45 58 43 45 50 54 20 49 4e 54 45 52 53 45 43 54  EXCEPT INTERSECT
19a0: 20 55 4e 49 4f 4e 0a 25 65 6e 64 69 66 20 53 51   UNION.%endif SQ
19b0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55  LITE_OMIT_COMPOU
19c0: 4e 44 5f 53 45 4c 45 43 54 0a 20 20 52 45 49 4e  ND_SELECT.  REIN
19d0: 44 45 58 20 52 45 4e 41 4d 45 20 43 54 49 4d 45  DEX RENAME CTIME
19e0: 5f 4b 57 20 49 46 0a 20 20 2e 0a 25 77 69 6c 64  _KW IF.  ..%wild
19f0: 63 61 72 64 20 41 4e 59 2e 0a 0a 2f 2f 20 44 65  card ANY...// De
1a00: 66 69 6e 65 20 6f 70 65 72 61 74 6f 72 20 70 72  fine operator pr
1a10: 65 63 65 64 65 6e 63 65 20 65 61 72 6c 79 20 73  ecedence early s
1a20: 6f 20 74 68 61 74 20 74 68 69 73 20 69 73 20 74  o that this is t
1a30: 68 65 20 66 69 72 73 74 20 6f 63 63 75 72 72 65  he first occurre
1a40: 6e 63 65 0a 2f 2f 20 6f 66 20 74 68 65 20 6f 70  nce.// of the op
1a50: 65 72 61 74 6f 72 20 74 6f 6b 65 6e 73 20 69 6e  erator tokens in
1a60: 20 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20 4b   the grammer.  K
1a70: 65 65 70 69 6e 67 20 74 68 65 20 6f 70 65 72 61  eeping the opera
1a80: 74 6f 72 73 20 74 6f 67 65 74 68 65 72 0a 2f 2f  tors together.//
1a90: 20 63 61 75 73 65 73 20 74 68 65 6d 20 74 6f 20   causes them to 
1aa0: 62 65 20 61 73 73 69 67 6e 65 64 20 69 6e 74 65  be assigned inte
1ab0: 67 65 72 20 76 61 6c 75 65 73 20 74 68 61 74 20  ger values that 
1ac0: 61 72 65 20 63 6c 6f 73 65 20 74 6f 67 65 74 68  are close togeth
1ad0: 65 72 2c 0a 2f 2f 20 77 68 69 63 68 20 6b 65 65  er,.// which kee
1ae0: 70 73 20 70 61 72 73 65 72 20 74 61 62 6c 65 73  ps parser tables
1af0: 20 73 6d 61 6c 6c 65 72 2e 0a 2f 2f 0a 2f 2f 20   smaller..//.// 
1b00: 54 68 65 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  The token values
1b10: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
1b20: 73 65 20 73 79 6d 62 6f 6c 73 20 69 73 20 64 65  se symbols is de
1b30: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
1b40: 6f 72 64 65 72 0a 2f 2f 20 69 6e 20 77 68 69 63  order.// in whic
1b50: 68 20 6c 65 6d 6f 6e 20 66 69 72 73 74 20 73 65  h lemon first se
1b60: 65 73 20 74 68 65 6d 2e 20 20 49 74 20 6d 75 73  es them.  It mus
1b70: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
1b80: 61 74 20 49 53 4e 55 4c 4c 2f 4e 4f 54 4e 55 4c  at ISNULL/NOTNUL
1b90: 4c 2c 0a 2f 2f 20 4e 45 2f 45 51 2c 20 47 54 2f  L,.// NE/EQ, GT/
1ba0: 4c 45 2c 20 61 6e 64 20 47 45 2f 4c 54 20 61 72  LE, and GE/LT ar
1bb0: 65 20 73 65 70 61 72 61 74 65 64 20 62 79 20 6f  e separated by o
1bc0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c  nly a single val
1bd0: 75 65 2e 20 20 53 65 65 0a 2f 2f 20 74 68 65 20  ue.  See.// the 
1be0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
1bf0: 73 65 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  se() routine for
1c00: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1c10: 72 6d 61 74 69 6f 6e 20 6f 6e 20 74 68 69 73 0a  rmation on this.
1c20: 2f 2f 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2f  // constraint../
1c30: 2f 0a 25 6c 65 66 74 20 4f 52 2e 0a 25 6c 65 66  /.%left OR..%lef
1c40: 74 20 41 4e 44 2e 0a 25 72 69 67 68 74 20 4e 4f  t AND..%right NO
1c50: 54 2e 0a 25 6c 65 66 74 20 49 53 20 4d 41 54 43  T..%left IS MATC
1c60: 48 20 4c 49 4b 45 5f 4b 57 20 42 45 54 57 45 45  H LIKE_KW BETWEE
1c70: 4e 20 49 4e 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e  N IN ISNULL NOTN
1c80: 55 4c 4c 20 4e 45 20 45 51 2e 0a 25 6c 65 66 74  ULL NE EQ..%left
1c90: 20 47 54 20 4c 45 20 4c 54 20 47 45 2e 0a 25 72   GT LE LT GE..%r
1ca0: 69 67 68 74 20 45 53 43 41 50 45 2e 0a 25 6c 65  ight ESCAPE..%le
1cb0: 66 74 20 42 49 54 41 4e 44 20 42 49 54 4f 52 20  ft BITAND BITOR 
1cc0: 4c 53 48 49 46 54 20 52 53 48 49 46 54 2e 0a 25  LSHIFT RSHIFT..%
1cd0: 6c 65 66 74 20 50 4c 55 53 20 4d 49 4e 55 53 2e  left PLUS MINUS.
1ce0: 0a 25 6c 65 66 74 20 53 54 41 52 20 53 4c 41 53  .%left STAR SLAS
1cf0: 48 20 52 45 4d 2e 0a 25 6c 65 66 74 20 43 4f 4e  H REM..%left CON
1d00: 43 41 54 2e 0a 25 6c 65 66 74 20 43 4f 4c 4c 41  CAT..%left COLLA
1d10: 54 45 2e 0a 25 72 69 67 68 74 20 42 49 54 4e 4f  TE..%right BITNO
1d20: 54 2e 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73 22  T...// And "ids"
1d30: 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 65 72   is an identifer
1d40: 2d 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a 25  -or-string..//.%
1d50: 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 69 64 73 20  token_class ids 
1d60: 20 49 44 7c 53 54 52 49 4e 47 2e 0a 0a 2f 2f 20   ID|STRING...// 
1d70: 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  The name of a co
1d80: 6c 75 6d 6e 20 6f 72 20 74 61 62 6c 65 20 63 61  lumn or table ca
1d90: 6e 20 62 65 20 61 6e 79 20 6f 66 20 74 68 65 20  n be any of the 
1da0: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2f 2f 0a 25 74  following:.//.%t
1db0: 79 70 65 20 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e  ype nm {Token}.n
1dc0: 6d 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 2e 20  m(A) ::= id(X). 
1dd0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
1de0: 0a 6e 6d 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e  .nm(A) ::= STRIN
1df0: 47 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58  G(X).     {A = X
1e00: 3b 7d 0a 6e 6d 28 41 29 20 3a 3a 3d 20 4a 4f 49  ;}.nm(A) ::= JOI
1e10: 4e 5f 4b 57 28 58 29 2e 20 20 20 20 7b 41 20 3d  N_KW(X).    {A =
1e20: 20 58 3b 7d 0a 0a 2f 2f 20 41 20 74 79 70 65 74   X;}..// A typet
1e30: 6f 6b 65 6e 20 69 73 20 72 65 61 6c 6c 79 20 6f  oken is really o
1e40: 6e 65 20 6f 72 20 6d 6f 72 65 20 74 6f 6b 65 6e  ne or more token
1e50: 73 20 74 68 61 74 20 66 6f 72 6d 20 61 20 74 79  s that form a ty
1e60: 70 65 20 6e 61 6d 65 20 73 75 63 68 0a 2f 2f 20  pe name such.// 
1e70: 61 73 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20  as can be found 
1e80: 61 66 74 65 72 20 74 68 65 20 63 6f 6c 75 6d 6e  after the column
1e90: 20 6e 61 6d 65 20 69 6e 20 61 20 43 52 45 41 54   name in a CREAT
1ea0: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
1eb0: 74 2e 0a 2f 2f 20 4d 75 6c 74 69 70 6c 65 20 74  t..// Multiple t
1ec0: 6f 6b 65 6e 73 20 61 72 65 20 63 6f 6e 63 61 74  okens are concat
1ed0: 65 6e 61 74 65 64 20 74 6f 20 66 6f 72 6d 20 74  enated to form t
1ee0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1ef0: 74 79 70 65 74 6f 6b 65 6e 2e 0a 2f 2f 0a 25 74  typetoken..//.%t
1f00: 79 70 65 20 74 79 70 65 74 6f 6b 65 6e 20 7b 54  ype typetoken {T
1f10: 6f 6b 65 6e 7d 0a 74 79 70 65 20 3a 3a 3d 20 2e  oken}.type ::= .
1f20: 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 74 6f  .type ::= typeto
1f30: 6b 65 6e 28 58 29 2e 20 20 20 20 20 20 20 20 20  ken(X).         
1f40: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
1f50: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
1f60: 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 74 79 70  pParse,&X);}.typ
1f70: 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 74 79  etoken(A) ::= ty
1f80: 70 65 6e 61 6d 65 28 58 29 2e 20 20 20 7b 41 20  pename(X).   {A 
1f90: 3d 20 58 3b 7d 0a 74 79 70 65 74 6f 6b 65 6e 28  = X;}.typetoken(
1fa0: 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  A) ::= typename(
1fb0: 58 29 20 4c 50 20 73 69 67 6e 65 64 20 52 50 28  X) LP signed RP(
1fc0: 59 29 2e 20 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e  Y). {.  A.z = X.
1fd0: 7a 3b 0a 20 20 41 2e 6e 20 3d 20 28 69 6e 74 29  z;.  A.n = (int)
1fe0: 28 26 59 2e 7a 5b 59 2e 6e 5d 20 2d 20 58 2e 7a  (&Y.z[Y.n] - X.z
1ff0: 29 3b 0a 7d 0a 74 79 70 65 74 6f 6b 65 6e 28 41  );.}.typetoken(A
2000: 29 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58  ) ::= typename(X
2010: 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d 4d  ) LP signed COMM
2020: 41 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e 20  A signed RP(Y). 
2030: 7b 0a 20 20 41 2e 7a 20 3d 20 58 2e 7a 3b 0a 20  {.  A.z = X.z;. 
2040: 20 41 2e 6e 20 3d 20 28 69 6e 74 29 28 26 59 2e   A.n = (int)(&Y.
2050: 7a 5b 59 2e 6e 5d 20 2d 20 58 2e 7a 29 3b 0a 7d  z[Y.n] - X.z);.}
2060: 0a 25 74 79 70 65 20 74 79 70 65 6e 61 6d 65 20  .%type typename 
2070: 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61 6d 65  {Token}.typename
2080: 28 41 29 20 3a 3a 3d 20 69 64 73 28 58 29 2e 20  (A) ::= ids(X). 
2090: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
20a0: 20 58 3b 7d 0a 74 79 70 65 6e 61 6d 65 28 41 29   X;}.typename(A)
20b0: 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29   ::= typename(X)
20c0: 20 69 64 73 28 59 29 2e 20 7b 41 2e 7a 3d 58 2e   ids(Y). {A.z=X.
20d0: 7a 3b 20 41 2e 6e 3d 59 2e 6e 2b 28 69 6e 74 29  z; A.n=Y.n+(int)
20e0: 28 59 2e 7a 2d 58 2e 7a 29 3b 7d 0a 73 69 67 6e  (Y.z-X.z);}.sign
20f0: 65 64 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d 2e  ed ::= plus_num.
2100: 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 6d 69 6e 75  .signed ::= minu
2110: 73 5f 6e 75 6d 2e 0a 0a 2f 2f 20 22 63 61 72 67  s_num...// "carg
2120: 6c 69 73 74 22 20 69 73 20 61 20 6c 69 73 74 20  list" is a list 
2130: 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
2140: 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 63  nstraints that c
2150: 6f 6d 65 20 61 66 74 65 72 20 74 68 65 0a 2f 2f  ome after the.//
2160: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64   column name and
2170: 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e 20   column type in 
2180: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
2190: 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 0a 63 61 72  tatement..//.car
21a0: 67 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c 69  glist ::= cargli
21b0: 73 74 20 63 63 6f 6e 73 2e 0a 63 61 72 67 6c 69  st ccons..cargli
21c0: 73 74 20 3a 3a 3d 20 2e 0a 63 63 6f 6e 73 20 3a  st ::= ..ccons :
21d0: 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d  := CONSTRAINT nm
21e0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 7b  (X).           {
21f0: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69  pParse->constrai
2200: 6e 74 4e 61 6d 65 20 3d 20 58 3b 7d 0a 63 63 6f  ntName = X;}.cco
2210: 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 74  ns ::= DEFAULT t
2220: 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20  erm(X).         
2230: 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 65     {sqlite3AddDe
2240: 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73  faultValue(pPars
2250: 65 2c 26 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a  e,&X);}.ccons ::
2260: 3d 20 44 45 46 41 55 4c 54 20 4c 50 20 65 78 70  = DEFAULT LP exp
2270: 72 28 58 29 20 52 50 2e 20 20 20 20 20 20 7b 73  r(X) RP.      {s
2280: 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74  qlite3AddDefault
2290: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 29  Value(pParse,&X)
22a0: 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 46  ;}.ccons ::= DEF
22b0: 41 55 4c 54 20 50 4c 55 53 20 74 65 72 6d 28 58  AULT PLUS term(X
22c0: 29 2e 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65  ).       {sqlite
22d0: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
22e0: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63 63  (pParse,&X);}.cc
22f0: 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  ons ::= DEFAULT 
2300: 4d 49 4e 55 53 28 41 29 20 74 65 72 6d 28 58 29  MINUS(A) term(X)
2310: 2e 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72 53  .      {.  ExprS
2320: 70 61 6e 20 76 3b 0a 20 20 76 2e 70 45 78 70 72  pan v;.  v.pExpr
2330: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
2340: 70 50 61 72 73 65 2c 20 54 4b 5f 55 4d 49 4e 55  pParse, TK_UMINU
2350: 53 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c 20 30  S, X.pExpr, 0, 0
2360: 29 3b 0a 20 20 76 2e 7a 53 74 61 72 74 20 3d 20  );.  v.zStart = 
2370: 41 2e 7a 3b 0a 20 20 76 2e 7a 45 6e 64 20 3d 20  A.z;.  v.zEnd = 
2380: 58 2e 7a 45 6e 64 3b 0a 20 20 73 71 6c 69 74 65  X.zEnd;.  sqlite
2390: 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65  3AddDefaultValue
23a0: 28 70 50 61 72 73 65 2c 26 76 29 3b 0a 7d 0a 63  (pParse,&v);.}.c
23b0: 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54  cons ::= DEFAULT
23c0: 20 69 64 28 58 29 2e 20 20 20 20 20 20 20 20 20   id(X).         
23d0: 20 20 20 20 20 7b 0a 20 20 45 78 70 72 53 70 61       {.  ExprSpa
23e0: 6e 20 76 3b 0a 20 20 73 70 61 6e 45 78 70 72 28  n v;.  spanExpr(
23f0: 26 76 2c 20 70 50 61 72 73 65 2c 20 54 4b 5f 53  &v, pParse, TK_S
2400: 54 52 49 4e 47 2c 20 26 58 29 3b 0a 20 20 73 71  TRING, &X);.  sq
2410: 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c 74 56  lite3AddDefaultV
2420: 61 6c 75 65 28 70 50 61 72 73 65 2c 26 76 29 3b  alue(pParse,&v);
2430: 0a 7d 0a 0a 2f 2f 20 49 6e 20 61 64 64 69 74 69  .}..// In additi
2440: 6f 6e 20 74 6f 20 74 68 65 20 74 79 70 65 20 6e  on to the type n
2450: 61 6d 65 2c 20 77 65 20 61 6c 73 6f 20 63 61 72  ame, we also car
2460: 65 20 61 62 6f 75 74 20 74 68 65 20 70 72 69 6d  e about the prim
2470: 61 72 79 20 6b 65 79 20 61 6e 64 0a 2f 2f 20 55  ary key and.// U
2480: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
2490: 73 2e 0a 2f 2f 0a 63 63 6f 6e 73 20 3a 3a 3d 20  s..//.ccons ::= 
24a0: 4e 55 4c 4c 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f  NULL onconf..cco
24b0: 6e 73 20 3a 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 20  ns ::= NOT NULL 
24c0: 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20 7b 73  onconf(R).    {s
24d0: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
24e0: 28 70 50 61 72 73 65 2c 20 52 29 3b 7d 0a 63 63  (pParse, R);}.cc
24f0: 6f 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20  ons ::= PRIMARY 
2500: 4b 45 59 20 73 6f 72 74 6f 72 64 65 72 28 5a 29  KEY sortorder(Z)
2510: 20 6f 6e 63 6f 6e 66 28 52 29 20 61 75 74 6f 69   onconf(R) autoi
2520: 6e 63 28 49 29 2e 0a 20 20 20 20 20 20 20 20 20  nc(I)..         
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2540: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
2550: 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50  AddPrimaryKey(pP
2560: 61 72 73 65 2c 30 2c 52 2c 49 2c 5a 29 3b 7d 0a  arse,0,R,I,Z);}.
2570: 63 63 6f 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45  ccons ::= UNIQUE
2580: 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20 20 20   onconf(R).     
2590: 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74 65 49   {sqlite3CreateI
25a0: 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c  ndex(pParse,0,0,
25b0: 30 2c 30 2c 52 2c 30 2c 30 2c 30 2c 30 29 3b 7d  0,0,R,0,0,0,0);}
25c0: 0a 63 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b  .ccons ::= CHECK
25d0: 20 4c 50 20 65 78 70 72 28 58 29 20 52 50 2e 20   LP expr(X) RP. 
25e0: 20 20 7b 73 71 6c 69 74 65 33 41 64 64 43 68 65    {sqlite3AddChe
25f0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ckConstraint(pPa
2600: 72 73 65 2c 58 2e 70 45 78 70 72 29 3b 7d 0a 63  rse,X.pExpr);}.c
2610: 63 6f 6e 73 20 3a 3a 3d 20 52 45 46 45 52 45 4e  cons ::= REFEREN
2620: 43 45 53 20 6e 6d 28 54 29 20 69 64 78 6c 69 73  CES nm(T) idxlis
2630: 74 5f 6f 70 74 28 54 41 29 20 72 65 66 61 72 67  t_opt(TA) refarg
2640: 73 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20  s(R)..          
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 43         {sqlite3C
2670: 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28  reateForeignKey(
2680: 70 50 61 72 73 65 2c 30 2c 26 54 2c 54 41 2c 52  pParse,0,&T,TA,R
2690: 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 64 65  );}.ccons ::= de
26a0: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 44 29  fer_subclause(D)
26b0: 2e 20 20 20 20 7b 73 71 6c 69 74 65 33 44 65 66  .    {sqlite3Def
26c0: 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61  erForeignKey(pPa
26d0: 72 73 65 2c 44 29 3b 7d 0a 63 63 6f 6e 73 20 3a  rse,D);}.ccons :
26e0: 3a 3d 20 43 4f 4c 4c 41 54 45 20 69 64 73 28 43  := COLLATE ids(C
26f0: 29 2e 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74  ).        {sqlit
2700: 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65  e3AddCollateType
2710: 28 70 50 61 72 73 65 2c 20 26 43 29 3b 7d 0a 0a  (pParse, &C);}..
2720: 2f 2f 20 54 68 65 20 6f 70 74 69 6f 6e 61 6c 20  // The optional 
2730: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65  AUTOINCREMENT ke
2740: 79 77 6f 72 64 0a 25 74 79 70 65 20 61 75 74 6f  yword.%type auto
2750: 69 6e 63 20 7b 69 6e 74 7d 0a 61 75 74 6f 69 6e  inc {int}.autoin
2760: 63 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  c(X) ::= .      
2770: 20 20 20 20 7b 58 20 3d 20 30 3b 7d 0a 61 75 74      {X = 0;}.aut
2780: 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 41 55 54 4f  oinc(X) ::= AUTO
2790: 49 4e 43 52 2e 20 20 7b 58 20 3d 20 31 3b 7d 0a  INCR.  {X = 1;}.
27a0: 0a 2f 2f 20 54 68 65 20 6e 65 78 74 20 67 72 6f  .// The next gro
27b0: 75 70 20 6f 66 20 72 75 6c 65 73 20 70 61 72 73  up of rules pars
27c0: 65 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  es the arguments
27d0: 20 74 6f 20 61 20 52 45 46 45 52 45 4e 43 45 53   to a REFERENCES
27e0: 20 63 6c 61 75 73 65 0a 2f 2f 20 74 68 61 74 20   clause.// that 
27f0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
2800: 20 72 65 66 65 72 65 6e 74 69 61 6c 20 69 6e 74   referential int
2810: 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
2820: 69 73 20 64 65 66 65 72 72 65 64 20 6f 72 0a 2f  is deferred or./
2830: 2f 20 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 61  / or immediate a
2840: 6e 64 20 77 68 69 63 68 20 64 65 74 65 72 6d 69  nd which determi
2850: 6e 65 20 77 68 61 74 20 61 63 74 69 6f 6e 20 74  ne what action t
2860: 6f 20 74 61 6b 65 20 69 66 20 61 20 72 65 66 2d  o take if a ref-
2870: 69 6e 74 65 67 0a 2f 2f 20 63 68 65 63 6b 20 66  integ.// check f
2880: 61 69 6c 73 2e 0a 2f 2f 0a 25 74 79 70 65 20 72  ails..//.%type r
2890: 65 66 61 72 67 73 20 7b 69 6e 74 7d 0a 72 65 66  efargs {int}.ref
28a0: 61 72 67 73 28 41 29 20 3a 3a 3d 20 2e 20 20 20  args(A) ::= .   
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
28c0: 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65 2a 30 78 30   A = OE_None*0x0
28d0: 31 30 31 3b 20 2f 2a 20 45 56 3a 20 52 2d 31 39  101; /* EV: R-19
28e0: 38 30 33 2d 34 35 38 38 34 20 2a 2f 7d 0a 72 65  803-45884 */}.re
28f0: 66 61 72 67 73 28 41 29 20 3a 3a 3d 20 72 65 66  fargs(A) ::= ref
2900: 61 72 67 73 28 58 29 20 72 65 66 61 72 67 28 59  args(X) refarg(Y
2910: 29 2e 20 7b 20 41 20 3d 20 28 58 20 26 20 7e 59  ). { A = (X & ~Y
2920: 2e 6d 61 73 6b 29 20 7c 20 59 2e 76 61 6c 75 65  .mask) | Y.value
2930: 3b 20 7d 0a 25 74 79 70 65 20 72 65 66 61 72 67  ; }.%type refarg
2940: 20 7b 73 74 72 75 63 74 20 7b 69 6e 74 20 76 61   {struct {int va
2950: 6c 75 65 3b 20 69 6e 74 20 6d 61 73 6b 3b 7d 7d  lue; int mask;}}
2960: 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4d  .refarg(A) ::= M
2970: 41 54 43 48 20 6e 6d 2e 20 20 20 20 20 20 20 20  ATCH nm.        
2980: 20 20 20 20 20 20 7b 20 41 2e 76 61 6c 75 65 20        { A.value 
2990: 3d 20 30 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20  = 0;     A.mask 
29a0: 3d 20 30 78 30 30 30 30 30 30 3b 20 7d 0a 72 65  = 0x000000; }.re
29b0: 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 49  farg(A) ::= ON I
29c0: 4e 53 45 52 54 20 72 65 66 61 63 74 2e 20 20 20  NSERT refact.   
29d0: 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 30     { A.value = 0
29e0: 3b 20 20 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30  ;     A.mask = 0
29f0: 78 30 30 30 30 30 30 3b 20 7d 0a 72 65 66 61 72  x000000; }.refar
2a00: 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 44 45 4c 45  g(A) ::= ON DELE
2a10: 54 45 20 72 65 66 61 63 74 28 58 29 2e 20 20 20  TE refact(X).   
2a20: 7b 20 41 2e 76 61 6c 75 65 20 3d 20 58 3b 20 20  { A.value = X;  
2a30: 20 20 20 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30     A.mask = 0x00
2a40: 30 30 66 66 3b 20 7d 0a 72 65 66 61 72 67 28 41  00ff; }.refarg(A
2a50: 29 20 3a 3a 3d 20 4f 4e 20 55 50 44 41 54 45 20  ) ::= ON UPDATE 
2a60: 72 65 66 61 63 74 28 58 29 2e 20 20 20 7b 20 41  refact(X).   { A
2a70: 2e 76 61 6c 75 65 20 3d 20 58 3c 3c 38 3b 20 20  .value = X<<8;  
2a80: 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 66 66 30  A.mask = 0x00ff0
2a90: 30 3b 20 7d 0a 25 74 79 70 65 20 72 65 66 61 63  0; }.%type refac
2aa0: 74 20 7b 69 6e 74 7d 0a 72 65 66 61 63 74 28 41  t {int}.refact(A
2ab0: 29 20 3a 3a 3d 20 53 45 54 20 4e 55 4c 4c 2e 20  ) ::= SET NULL. 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
2ad0: 20 3d 20 4f 45 5f 53 65 74 4e 75 6c 6c 3b 20 20   = OE_SetNull;  
2ae0: 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d 34  /* EV: R-33326-4
2af0: 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74 28  5252 */}.refact(
2b00: 41 29 20 3a 3a 3d 20 53 45 54 20 44 45 46 41 55  A) ::= SET DEFAU
2b10: 4c 54 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20  LT.           { 
2b20: 41 20 3d 20 4f 45 5f 53 65 74 44 66 6c 74 3b 20  A = OE_SetDflt; 
2b30: 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36 2d   /* EV: R-33326-
2b40: 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63 74  45252 */}.refact
2b50: 28 41 29 20 3a 3a 3d 20 43 41 53 43 41 44 45 2e  (A) ::= CASCADE.
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
2b70: 20 41 20 3d 20 4f 45 5f 43 61 73 63 61 64 65 3b   A = OE_Cascade;
2b80: 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32 36    /* EV: R-33326
2b90: 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61 63  -45252 */}.refac
2ba0: 74 28 41 29 20 3a 3a 3d 20 52 45 53 54 52 49 43  t(A) ::= RESTRIC
2bb0: 54 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T.              
2bc0: 7b 20 41 20 3d 20 4f 45 5f 52 65 73 74 72 69 63  { A = OE_Restric
2bd0: 74 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33 32  t; /* EV: R-3332
2be0: 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 72 65 66 61  6-45252 */}.refa
2bf0: 63 74 28 41 29 20 3a 3a 3d 20 4e 4f 20 41 43 54  ct(A) ::= NO ACT
2c00: 49 4f 4e 2e 20 20 20 20 20 20 20 20 20 20 20 20  ION.            
2c10: 20 7b 20 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 20   { A = OE_None; 
2c20: 20 20 20 20 2f 2a 20 45 56 3a 20 52 2d 33 33 33      /* EV: R-333
2c30: 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 25 74 79  26-45252 */}.%ty
2c40: 70 65 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75  pe defer_subclau
2c50: 73 65 20 7b 69 6e 74 7d 0a 64 65 66 65 72 5f 73  se {int}.defer_s
2c60: 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20  ubclause(A) ::= 
2c70: 4e 4f 54 20 44 45 46 45 52 52 41 42 4c 45 20 69  NOT DEFERRABLE i
2c80: 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65  nit_deferred_pre
2c90: 64 5f 6f 70 74 2e 20 20 20 20 20 7b 41 20 3d 20  d_opt.     {A = 
2ca0: 30 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61  0;}.defer_subcla
2cb0: 75 73 65 28 41 29 20 3a 3a 3d 20 44 45 46 45 52  use(A) ::= DEFER
2cc0: 52 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72  RABLE init_defer
2cd0: 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 58 29 2e  red_pred_opt(X).
2ce0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 25        {A = X;}.%
2cf0: 74 79 70 65 20 69 6e 69 74 5f 64 65 66 65 72 72  type init_deferr
2d00: 65 64 5f 70 72 65 64 5f 6f 70 74 20 7b 69 6e 74  ed_pred_opt {int
2d10: 7d 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f  }.init_deferred_
2d20: 70 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20  pred_opt(A) ::= 
2d30: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d40: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
2d50: 0a 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70  .init_deferred_p
2d60: 72 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49  red_opt(A) ::= I
2d70: 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45  NITIALLY DEFERRE
2d80: 44 2e 20 20 20 20 20 7b 41 20 3d 20 31 3b 7d 0a  D.     {A = 1;}.
2d90: 69 6e 69 74 5f 64 65 66 65 72 72 65 64 5f 70 72  init_deferred_pr
2da0: 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49 4e  ed_opt(A) ::= IN
2db0: 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54  ITIALLY IMMEDIAT
2dc0: 45 2e 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a  E.    {A = 0;}..
2dd0: 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41 29 20  conslist_opt(A) 
2de0: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
2e00: 2e 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20 30 3b  .n = 0; A.z = 0;
2e10: 7d 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 28 41  }.conslist_opt(A
2e20: 29 20 3a 3a 3d 20 43 4f 4d 4d 41 28 58 29 20 63  ) ::= COMMA(X) c
2e30: 6f 6e 73 6c 69 73 74 2e 20 20 20 20 20 20 20 20  onslist.        
2e40: 7b 41 20 3d 20 58 3b 7d 0a 63 6f 6e 73 6c 69 73  {A = X;}.conslis
2e50: 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 74  t ::= conslist t
2e60: 63 6f 6e 73 63 6f 6d 6d 61 20 74 63 6f 6e 73 2e  conscomma tcons.
2e70: 0a 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 74 63  .conslist ::= tc
2e80: 6f 6e 73 2e 0a 74 63 6f 6e 73 63 6f 6d 6d 61 20  ons..tconscomma 
2e90: 3a 3a 3d 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20  ::= COMMA.      
2ea0: 20 20 20 20 20 20 7b 70 50 61 72 73 65 2d 3e 63        {pParse->c
2eb0: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20  onstraintName.n 
2ec0: 3d 20 30 3b 7d 0a 74 63 6f 6e 73 63 6f 6d 6d 61  = 0;}.tconscomma
2ed0: 20 3a 3a 3d 20 2e 0a 74 63 6f 6e 73 20 3a 3a 3d   ::= ..tcons ::=
2ee0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e 6d 28 58   CONSTRAINT nm(X
2ef0: 29 2e 20 20 20 20 20 20 7b 70 50 61 72 73 65 2d  ).      {pParse-
2f00: 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 20  >constraintName 
2f10: 3d 20 58 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20  = X;}.tcons ::= 
2f20: 50 52 49 4d 41 52 59 20 4b 45 59 20 4c 50 20 69  PRIMARY KEY LP i
2f30: 64 78 6c 69 73 74 28 58 29 20 61 75 74 6f 69 6e  dxlist(X) autoin
2f40: 63 28 49 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52  c(I) RP onconf(R
2f50: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 50      {sqlite3AddP
2f80: 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72 73 65  rimaryKey(pParse
2f90: 2c 58 2c 52 2c 49 2c 30 29 3b 7d 0a 74 63 6f 6e  ,X,R,I,0);}.tcon
2fa0: 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 4c 50 20  s ::= UNIQUE LP 
2fb0: 69 64 78 6c 69 73 74 28 58 29 20 52 50 20 6f 6e  idxlist(X) RP on
2fc0: 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20 20 20  conf(R)..       
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
2ff0: 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50  e3CreateIndex(pP
3000: 61 72 73 65 2c 30 2c 30 2c 30 2c 58 2c 52 2c 30  arse,0,0,0,X,R,0
3010: 2c 30 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20  ,0,0,0);}.tcons 
3020: 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70  ::= CHECK LP exp
3030: 72 28 45 29 20 52 50 20 6f 6e 63 6f 6e 66 2e 0a  r(E) RP onconf..
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 7b 73 71 6c 69 74 65 33 41 64 64 43 68 65 63   {sqlite3AddChec
3070: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  kConstraint(pPar
3080: 73 65 2c 45 2e 70 45 78 70 72 29 3b 7d 0a 74 63  se,E.pExpr);}.tc
3090: 6f 6e 73 20 3a 3a 3d 20 46 4f 52 45 49 47 4e 20  ons ::= FOREIGN 
30a0: 4b 45 59 20 4c 50 20 69 64 78 6c 69 73 74 28 46  KEY LP idxlist(F
30b0: 41 29 20 52 50 0a 20 20 20 20 20 20 20 20 20 20  A) RP.          
30c0: 52 45 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29  REFERENCES nm(T)
30d0: 20 69 64 78 6c 69 73 74 5f 6f 70 74 28 54 41 29   idxlist_opt(TA)
30e0: 20 72 65 66 61 72 67 73 28 52 29 20 64 65 66 65   refargs(R) defe
30f0: 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28  r_subclause_opt(
3100: 44 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  D). {.    sqlite
3110: 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
3120: 79 28 70 50 61 72 73 65 2c 20 46 41 2c 20 26 54  y(pParse, FA, &T
3130: 2c 20 54 41 2c 20 52 29 3b 0a 20 20 20 20 73 71  , TA, R);.    sq
3140: 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67  lite3DeferForeig
3150: 6e 4b 65 79 28 70 50 61 72 73 65 2c 20 44 29 3b  nKey(pParse, D);
3160: 0a 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f 73  .}.%type defer_s
3170: 75 62 63 6c 61 75 73 65 5f 6f 70 74 20 7b 69 6e  ubclause_opt {in
3180: 74 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75  t}.defer_subclau
3190: 73 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20  se_opt(A) ::= . 
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b0: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 65 66 65     {A = 0;}.defe
31c0: 72 5f 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28  r_subclause_opt(
31d0: 41 29 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62  A) ::= defer_sub
31e0: 63 6c 61 75 73 65 28 58 29 2e 20 20 7b 41 20 3d  clause(X).  {A =
31f0: 20 58 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c   X;}..// The fol
3200: 6c 6f 77 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d  lowing is a non-
3210: 73 74 61 6e 64 61 72 64 20 65 78 74 65 6e 73 69  standard extensi
3220: 6f 6e 20 74 68 61 74 20 61 6c 6c 6f 77 73 20 75  on that allows u
3230: 73 20 74 6f 20 64 65 63 6c 61 72 65 20 74 68 65  s to declare the
3240: 0a 2f 2f 20 64 65 66 61 75 6c 74 20 62 65 68 61  .// default beha
3250: 76 69 6f 72 20 77 68 65 6e 20 74 68 65 72 65 20  vior when there 
3260: 69 73 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  is a constraint 
3270: 63 6f 6e 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79  conflict..//.%ty
3280: 70 65 20 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a  pe onconf {int}.
3290: 25 74 79 70 65 20 6f 72 63 6f 6e 66 20 7b 75 38  %type orconf {u8
32a0: 7d 0a 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74  }.%type resolvet
32b0: 79 70 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66  ype {int}.onconf
32c0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44         {A = OE_D
32f0: 65 66 61 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28  efault;}.onconf(
3300: 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49  A) ::= ON CONFLI
3310: 43 54 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58  CT resolvetype(X
3320: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f  ).    {A = X;}.o
3330: 72 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20  rconf(A) ::= .  
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3350: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3360: 20 4f 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72   OE_Default;}.or
3370: 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72  conf(A) ::= OR r
3380: 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20  esolvetype(X).  
3390: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
33a0: 28 75 38 29 58 3b 7d 0a 72 65 73 6f 6c 76 65 74  (u8)X;}.resolvet
33b0: 79 70 65 28 41 29 20 3a 3a 3d 20 72 61 69 73 65  ype(A) ::= raise
33c0: 74 79 70 65 28 58 29 2e 20 20 20 20 20 20 20 20  type(X).        
33d0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 72 65       {A = X;}.re
33e0: 73 6f 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d  solvetype(A) ::=
33f0: 20 49 47 4e 4f 52 45 2e 20 20 20 20 20 20 20 20   IGNORE.        
3400: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3410: 4f 45 5f 49 67 6e 6f 72 65 3b 7d 0a 72 65 73 6f  OE_Ignore;}.reso
3420: 6c 76 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52  lvetype(A) ::= R
3430: 45 50 4c 41 43 45 2e 20 20 20 20 20 20 20 20 20  EPLACE.         
3440: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45           {A = OE
3450: 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 2f 2f 2f 2f  _Replace;}..////
3460: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3470: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20  ////// The DROP 
3480: 54 41 42 4c 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  TABLE //////////
3490: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
34a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
34b0: 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54 41 42 4c  md ::= DROP TABL
34c0: 45 20 69 66 65 78 69 73 74 73 28 45 29 20 66 75  E ifexists(E) fu
34d0: 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73  llname(X). {.  s
34e0: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
34f0: 70 50 61 72 73 65 2c 20 58 2c 20 30 2c 20 45 29  pParse, X, 0, E)
3500: 3b 0a 7d 0a 25 74 79 70 65 20 69 66 65 78 69 73  ;.}.%type ifexis
3510: 74 73 20 7b 69 6e 74 7d 0a 69 66 65 78 69 73 74  ts {int}.ifexist
3520: 73 28 41 29 20 3a 3a 3d 20 49 46 20 45 58 49 53  s(A) ::= IF EXIS
3530: 54 53 2e 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 69  TS.   {A = 1;}.i
3540: 66 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 2e  fexists(A) ::= .
3550: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3560: 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   0;}..//////////
3570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
3580: 43 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74  CREATE VIEW stat
3590: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
35a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
35b0: 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66 20 53  ///.//.%ifndef S
35c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
35d0: 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77  cmd ::= createkw
35e0: 28 58 29 20 74 65 6d 70 28 54 29 20 56 49 45 57  (X) temp(T) VIEW
35f0: 20 69 66 6e 6f 74 65 78 69 73 74 73 28 45 29 20   ifnotexists(E) 
3600: 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 20 41 53  nm(Y) dbnm(Z) AS
3610: 20 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20   select(S). {.  
3620: 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69 65  sqlite3CreateVie
3630: 77 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59  w(pParse, &X, &Y
3640: 2c 20 26 5a 2c 20 53 2c 20 54 2c 20 45 29 3b 0a  , &Z, S, T, E);.
3650: 7d 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 56  }.cmd ::= DROP V
3660: 49 45 57 20 69 66 65 78 69 73 74 73 28 45 29 20  IEW ifexists(E) 
3670: 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20  fullname(X). {. 
3680: 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c   sqlite3DropTabl
3690: 65 28 70 50 61 72 73 65 2c 20 58 2c 20 31 2c 20  e(pParse, X, 1, 
36a0: 45 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51  E);.}.%endif  SQ
36b0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 0a  LITE_OMIT_VIEW..
36c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
36d0: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53 45 4c  //////// The SEL
36e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f  ECT statement //
36f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
3710: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c 65 63  //.cmd ::= selec
3720: 74 28 58 29 2e 20 20 7b 0a 20 20 53 65 6c 65 63  t(X).  {.  Selec
3730: 74 44 65 73 74 20 64 65 73 74 20 3d 20 7b 53 52  tDest dest = {SR
3740: 54 5f 4f 75 74 70 75 74 2c 20 30 2c 20 30 2c 20  T_Output, 0, 0, 
3750: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 73 71 6c 69  0, 0, 0};.  sqli
3760: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
3770: 2c 20 58 2c 20 26 64 65 73 74 29 3b 0a 20 20 73  , X, &dest);.  s
3780: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
3790: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 58  te(pParse->db, X
37a0: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73 65 6c 65  );.}..%type sele
37b0: 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 65  ct {Select*}.%de
37c0: 73 74 72 75 63 74 6f 72 20 73 65 6c 65 63 74 20  structor select 
37d0: 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65  {sqlite3SelectDe
37e0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
37f0: 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 65 6c   $$);}.%type sel
3800: 65 63 74 6e 6f 77 69 74 68 20 7b 53 65 6c 65 63  ectnowith {Selec
3810: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
3820: 73 65 6c 65 63 74 6e 6f 77 69 74 68 20 7b 73 71  selectnowith {sq
3830: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
3840: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
3850: 29 3b 7d 0a 25 74 79 70 65 20 6f 6e 65 73 65 6c  );}.%type onesel
3860: 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64  ect {Select*}.%d
3870: 65 73 74 72 75 63 74 6f 72 20 6f 6e 65 73 65 6c  estructor onesel
3880: 65 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c 65  ect {sqlite3Sele
3890: 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  ctDelete(pParse-
38a0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 73 65 6c 65  >db, $$);}..sele
38b0: 63 74 28 41 29 20 3a 3a 3d 20 77 69 74 68 28 57  ct(A) ::= with(W
38c0: 29 20 73 65 6c 65 63 74 6e 6f 77 69 74 68 28 58  ) selectnowith(X
38d0: 29 2e 20 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70  ). {.  Select *p
38e0: 20 3d 20 58 2c 20 2a 70 4e 65 78 74 2c 20 2a 70   = X, *pNext, *p
38f0: 4c 6f 6f 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  Loop;.  if( p ){
3900: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
3910: 2c 20 6d 78 53 65 6c 65 63 74 3b 0a 20 20 20 20  , mxSelect;.    
3920: 70 2d 3e 70 57 69 74 68 20 3d 20 57 3b 0a 20 20  p->pWith = W;.  
3930: 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72 20    if( p->pPrior 
3940: 29 7b 0a 20 20 20 20 20 20 75 31 36 20 61 6c 6c  ){.      u16 all
3950: 56 61 6c 75 65 73 20 3d 20 53 46 5f 56 61 6c 75  Values = SF_Valu
3960: 65 73 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20  es;.      pNext 
3970: 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  = 0;.      for(p
3980: 4c 6f 6f 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70  Loop=p; pLoop; p
3990: 4e 65 78 74 3d 70 4c 6f 6f 70 2c 20 70 4c 6f 6f  Next=pLoop, pLoo
39a0: 70 3d 70 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c  p=pLoop->pPrior,
39b0: 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20   cnt++){.       
39c0: 20 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20   pLoop->pNext = 
39d0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  pNext;.        p
39e0: 4c 6f 6f 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c  Loop->selFlags |
39f0: 3d 20 53 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20  = SF_Compound;. 
3a00: 20 20 20 20 20 20 20 61 6c 6c 56 61 6c 75 65 73         allValues
3a10: 20 26 3d 20 70 4c 6f 6f 70 2d 3e 73 65 6c 46 6c   &= pLoop->selFl
3a20: 61 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ags;.      }.   
3a30: 20 20 20 69 66 28 20 61 6c 6c 56 61 6c 75 65 73     if( allValues
3a40: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73   ){.        p->s
3a50: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 6c  elFlags |= SF_Al
3a60: 6c 56 61 6c 75 65 73 3b 0a 20 20 20 20 20 20 7d  lValues;.      }
3a70: 65 6c 73 65 20 69 66 28 0a 20 20 20 20 20 20 20  else if(.       
3a80: 20 28 6d 78 53 65 6c 65 63 74 20 3d 20 70 50 61   (mxSelect = pPa
3a90: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
3aa0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
3ab0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 29 3e 30  POUND_SELECT])>0
3ac0: 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 3e  .        && cnt>
3ad0: 6d 78 53 65 6c 65 63 74 0a 20 20 20 20 20 20 29  mxSelect.      )
3ae0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3af0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3b00: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d  , "too many term
3b10: 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 53 45  s in compound SE
3b20: 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20 7d 0a  LECT");.      }.
3b30: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
3b40: 20 20 20 73 71 6c 69 74 65 33 57 69 74 68 44 65     sqlite3WithDe
3b50: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
3b60: 20 57 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 70   W);.  }.  A = p
3b70: 3b 0a 7d 0a 0a 73 65 6c 65 63 74 6e 6f 77 69 74  ;.}..selectnowit
3b80: 68 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65  h(A) ::= onesele
3b90: 63 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  ct(X).          
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3bb0: 20 58 3b 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c   X;}.%ifndef SQL
3bc0: 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e  ITE_OMIT_COMPOUN
3bd0: 44 5f 53 45 4c 45 43 54 0a 73 65 6c 65 63 74 6e  D_SELECT.selectn
3be0: 6f 77 69 74 68 28 41 29 20 3a 3a 3d 20 73 65 6c  owith(A) ::= sel
3bf0: 65 63 74 6e 6f 77 69 74 68 28 58 29 20 6d 75 6c  ectnowith(X) mul
3c00: 74 69 73 65 6c 65 63 74 5f 6f 70 28 59 29 20 6f  tiselect_op(Y) o
3c10: 6e 65 73 65 6c 65 63 74 28 5a 29 2e 20 20 7b 0a  neselect(Z).  {.
3c20: 20 20 53 65 6c 65 63 74 20 2a 70 52 68 73 20 3d    Select *pRhs =
3c30: 20 5a 3b 0a 20 20 69 66 28 20 70 52 68 73 20 26   Z;.  if( pRhs &
3c40: 26 20 70 52 68 73 2d 3e 70 50 72 69 6f 72 20 29  & pRhs->pPrior )
3c50: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
3c60: 46 72 6f 6d 3b 0a 20 20 20 20 54 6f 6b 65 6e 20  From;.    Token 
3c70: 78 3b 0a 20 20 20 20 78 2e 6e 20 3d 20 30 3b 0a  x;.    x.n = 0;.
3c80: 20 20 20 20 70 46 72 6f 6d 20 3d 20 73 71 6c 69      pFrom = sqli
3c90: 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
3ca0: 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c  FromTerm(pParse,
3cb0: 30 2c 30 2c 30 2c 26 78 2c 70 52 68 73 2c 30 2c  0,0,0,&x,pRhs,0,
3cc0: 30 29 3b 0a 20 20 20 20 70 52 68 73 20 3d 20 73  0);.    pRhs = s
3cd0: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
3ce0: 70 50 61 72 73 65 2c 30 2c 70 46 72 6f 6d 2c 30  pParse,0,pFrom,0
3cf0: 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20  ,0,0,0,0,0,0);. 
3d00: 20 7d 0a 20 20 69 66 28 20 70 52 68 73 20 29 7b   }.  if( pRhs ){
3d10: 0a 20 20 20 20 70 52 68 73 2d 3e 6f 70 20 3d 20  .    pRhs->op = 
3d20: 28 75 38 29 59 3b 0a 20 20 20 20 70 52 68 73 2d  (u8)Y;.    pRhs-
3d30: 3e 70 50 72 69 6f 72 20 3d 20 58 3b 0a 20 20 20  >pPrior = X;.   
3d40: 20 69 66 28 20 59 21 3d 54 4b 5f 41 4c 4c 20 29   if( Y!=TK_ALL )
3d50: 20 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70   pParse->hasComp
3d60: 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ound = 1;.  }els
3d70: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  e{.    sqlite3Se
3d80: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
3d90: 65 2d 3e 64 62 2c 20 58 29 3b 0a 20 20 7d 0a 20  e->db, X);.  }. 
3da0: 20 41 20 3d 20 70 52 68 73 3b 0a 7d 0a 25 74 79   A = pRhs;.}.%ty
3db0: 70 65 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f  pe multiselect_o
3dc0: 70 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c  p {int}.multisel
3dd0: 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e  ect_op(A) ::= UN
3de0: 49 4f 4e 28 4f 50 29 2e 20 20 20 20 20 20 20 20  ION(OP).        
3df0: 20 20 20 20 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a       {A = @OP;}.
3e00: 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41  multiselect_op(A
3e10: 29 20 3a 3a 3d 20 55 4e 49 4f 4e 20 41 4c 4c 2e  ) ::= UNION ALL.
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
3e30: 3d 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d 75 6c 74 69  = TK_ALL;}.multi
3e40: 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d  select_op(A) ::=
3e50: 20 45 58 43 45 50 54 7c 49 4e 54 45 52 53 45 43   EXCEPT|INTERSEC
3e60: 54 28 4f 50 29 2e 20 20 7b 41 20 3d 20 40 4f 50  T(OP).  {A = @OP
3e70: 3b 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45  ;}.%endif SQLITE
3e80: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  _OMIT_COMPOUND_S
3e90: 45 4c 45 43 54 0a 6f 6e 65 73 65 6c 65 63 74 28  ELECT.oneselect(
3ea0: 41 29 20 3a 3a 3d 20 53 45 4c 45 43 54 28 53 29  A) ::= SELECT(S)
3eb0: 20 64 69 73 74 69 6e 63 74 28 44 29 20 73 65 6c   distinct(D) sel
3ec0: 63 6f 6c 6c 69 73 74 28 57 29 20 66 72 6f 6d 28  collist(W) from(
3ed0: 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29 0a  X) where_opt(Y).
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 67 72 6f 75 70 62 79 5f 6f 70 74 28 50 29 20   groupby_opt(P) 
3f00: 68 61 76 69 6e 67 5f 6f 70 74 28 51 29 20 6f 72  having_opt(Q) or
3f10: 64 65 72 62 79 5f 6f 70 74 28 5a 29 20 6c 69 6d  derby_opt(Z) lim
3f20: 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 41  it_opt(L). {.  A
3f30: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
3f40: 4e 65 77 28 70 50 61 72 73 65 2c 57 2c 58 2c 59  New(pParse,W,X,Y
3f50: 2c 50 2c 51 2c 5a 2c 44 2c 4c 2e 70 4c 69 6d 69  ,P,Q,Z,D,L.pLimi
3f60: 74 2c 4c 2e 70 4f 66 66 73 65 74 29 3b 0a 23 69  t,L.pOffset);.#i
3f70: 66 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e  f SELECTTRACE_EN
3f80: 41 42 4c 45 44 0a 20 20 2f 2a 20 50 6f 70 75 6c  ABLED.  /* Popul
3f90: 61 74 65 20 74 68 65 20 53 65 6c 65 63 74 2e 7a  ate the Select.z
3fa0: 53 65 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  SelName[] string
3fb0: 20 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f   that is used to
3fc0: 20 68 65 6c 70 20 77 69 74 68 0a 20 20 2a 2a 20   help with.  ** 
3fd0: 71 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 64 65  query planner de
3fe0: 62 75 67 67 69 6e 67 2c 20 74 6f 20 64 69 66 66  bugging, to diff
3ff0: 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
4000: 6e 20 6d 75 6c 74 69 70 6c 65 20 53 65 6c 65 63  n multiple Selec
4010: 74 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 69  t.  ** objects i
4020: 6e 20 61 20 63 6f 6d 70 6c 65 78 20 71 75 65 72  n a complex quer
4030: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  y..  **.  ** If 
4040: 74 68 65 20 53 45 4c 45 43 54 20 6b 65 79 77 6f  the SELECT keywo
4050: 72 64 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c  rd is immediatel
4060: 79 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  y followed by a 
4070: 43 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 0a  C-style comment.
4080: 20 20 2a 2a 20 74 68 65 6e 20 65 78 74 72 61 63    ** then extrac
4090: 74 20 74 68 65 20 66 69 72 73 74 20 66 65 77 20  t the first few 
40a0: 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61  alphanumeric cha
40b0: 72 61 63 74 65 72 73 20 66 72 6f 6d 20 77 69 74  racters from wit
40c0: 68 69 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f  hin that.  ** co
40d0: 6d 6d 65 6e 74 20 74 6f 20 62 65 20 74 68 65 20  mment to be the 
40e0: 7a 53 65 6c 4e 61 6d 65 20 76 61 6c 75 65 2e 20  zSelName value. 
40f0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
4100: 6c 61 62 65 6c 20 69 73 20 23 4e 20 77 68 65 72  label is #N wher
4110: 65 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74  e.  ** is an int
4120: 65 67 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  eger that is inc
4130: 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
4140: 63 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ch SELECT statem
4150: 65 6e 74 20 73 65 65 6e 2e 0a 20 20 2a 2f 0a 20  ent seen..  */. 
4160: 20 69 66 28 20 41 21 3d 30 20 29 7b 0a 20 20 20   if( A!=0 ){.   
4170: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
4180: 20 53 2e 7a 2b 36 3b 0a 20 20 20 20 69 6e 74 20   S.z+6;.    int 
4190: 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  i;.    sqlite3_s
41a0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 41  nprintf(sizeof(A
41b0: 2d 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 41 2d 3e  ->zSelName), A->
41c0: 7a 53 65 6c 4e 61 6d 65 2c 20 22 23 25 64 22 2c  zSelName, "#%d",
41d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
41e0: 20 20 20 20 20 20 2b 2b 70 50 61 72 73 65 2d 3e        ++pParse->
41f0: 6e 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 77 68  nSelect);.    wh
4200: 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29  ile( z[0]==' ' )
4210: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b   z++;.    if( z[
4220: 30 5d 3d 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d  0]=='/' && z[1]=
4230: 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 7a 20  ='*' ){.      z 
4240: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  += 2;.      whil
4250: 65 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a  e( z[0]==' ' ) z
4260: 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ++;.      for(i=
4270: 30 3b 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  0; sqlite3Isalnu
4280: 6d 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  m(z[i]); i++){}.
4290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
42a0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 41 2d  printf(sizeof(A-
42b0: 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 41 2d 3e 7a  >zSelName), A->z
42c0: 53 65 6c 4e 61 6d 65 2c 20 22 25 2e 2a 73 22 2c  SelName, "%.*s",
42d0: 20 69 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20   i, z);.    }.  
42e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 45 4c 45  }.#endif /* SELE
42f0: 43 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2a  CTRACE_ENABLED *
4300: 2f 0a 7d 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29  /.}.oneselect(A)
4310: 20 3a 3a 3d 20 76 61 6c 75 65 73 28 58 29 2e 20   ::= values(X). 
4320: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79     {A = X;}..%ty
4330: 70 65 20 76 61 6c 75 65 73 20 7b 53 65 6c 65 63  pe values {Selec
4340: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
4350: 76 61 6c 75 65 73 20 7b 73 71 6c 69 74 65 33 53  values {sqlite3S
4360: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72  electDelete(pPar
4370: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 76 61  se->db, $$);}.va
4380: 6c 75 65 73 28 41 29 20 3a 3a 3d 20 56 41 4c 55  lues(A) ::= VALU
4390: 45 53 20 4c 50 20 6e 65 78 70 72 6c 69 73 74 28  ES LP nexprlist(
43a0: 58 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73  X) RP. {.  A = s
43b0: 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28  qlite3SelectNew(
43c0: 70 50 61 72 73 65 2c 58 2c 30 2c 30 2c 30 2c 30  pParse,X,0,0,0,0
43d0: 2c 30 2c 53 46 5f 56 61 6c 75 65 73 2c 30 2c 30  ,0,SF_Values,0,0
43e0: 29 3b 0a 7d 0a 76 61 6c 75 65 73 28 41 29 20 3a  );.}.values(A) :
43f0: 3a 3d 20 76 61 6c 75 65 73 28 58 29 20 43 4f 4d  := values(X) COM
4400: 4d 41 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59  MA LP exprlist(Y
4410: 29 20 52 50 2e 20 7b 0a 20 20 53 65 6c 65 63 74  ) RP. {.  Select
4420: 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74   *pRight = sqlit
4430: 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72  e3SelectNew(pPar
4440: 73 65 2c 59 2c 30 2c 30 2c 30 2c 30 2c 30 2c 53  se,Y,0,0,0,0,0,S
4450: 46 5f 56 61 6c 75 65 73 2c 30 2c 30 29 3b 0a 20  F_Values,0,0);. 
4460: 20 69 66 28 20 70 52 69 67 68 74 20 29 7b 0a 20   if( pRight ){. 
4470: 20 20 20 70 52 69 67 68 74 2d 3e 6f 70 20 3d 20     pRight->op = 
4480: 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20 70 52 69 67  TK_ALL;.    pRig
4490: 68 74 2d 3e 70 50 72 69 6f 72 20 3d 20 58 3b 0a  ht->pPrior = X;.
44a0: 20 20 20 20 41 20 3d 20 70 52 69 67 68 74 3b 0a      A = pRight;.
44b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 41 20 3d    }else{.    A =
44c0: 20 58 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 54 68   X;.  }.}..// Th
44d0: 65 20 22 64 69 73 74 69 6e 63 74 22 20 6e 6f 6e  e "distinct" non
44e0: 74 65 72 6d 69 6e 61 6c 20 69 73 20 74 72 75 65  terminal is true
44f0: 20 28 31 29 20 69 66 20 74 68 65 20 44 49 53 54   (1) if the DIST
4500: 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 0a  INCT keyword is.
4510: 2f 2f 20 70 72 65 73 65 6e 74 20 61 6e 64 20 66  // present and f
4520: 61 6c 73 65 20 28 30 29 20 69 66 20 69 74 20 69  alse (0) if it i
4530: 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 20  s not..//.%type 
4540: 64 69 73 74 69 6e 63 74 20 7b 75 31 36 7d 0a 64  distinct {u16}.d
4550: 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 44  istinct(A) ::= D
4560: 49 53 54 49 4e 43 54 2e 20 20 20 7b 41 20 3d 20  ISTINCT.   {A = 
4570: 53 46 5f 44 69 73 74 69 6e 63 74 3b 7d 0a 64 69  SF_Distinct;}.di
4580: 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 41 4c  stinct(A) ::= AL
4590: 4c 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30  L.        {A = 0
45a0: 3b 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a  ;}.distinct(A) :
45b0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 7b  := .           {
45c0: 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73 65 6c 63  A = 0;}..// selc
45d0: 6f 6c 6c 69 73 74 20 69 73 20 61 20 6c 69 73 74  ollist is a list
45e0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
45f0: 74 68 61 74 20 61 72 65 20 74 6f 20 62 65 63 6f  that are to beco
4600: 6d 65 20 74 68 65 20 72 65 74 75 72 6e 0a 2f 2f  me the return.//
4610: 20 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 53   values of the S
4620: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
4630: 20 20 54 68 65 20 22 2a 22 20 69 6e 20 73 74 61    The "*" in sta
4640: 74 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 2f 2f 20  tements like.// 
4650: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e  "SELECT * FROM .
4660: 2e 2e 22 20 69 73 20 65 6e 63 6f 64 65 64 20 61  .." is encoded a
4670: 73 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72  s a special expr
4680: 65 73 73 69 6f 6e 20 77 69 74 68 20 61 6e 0a 2f  ession with an./
4690: 2f 20 6f 70 63 6f 64 65 20 6f 66 20 54 4b 5f 41  / opcode of TK_A
46a0: 4c 4c 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 65 6c  LL..//.%type sel
46b0: 63 6f 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69 73  collist {ExprLis
46c0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  t*}.%destructor 
46d0: 73 65 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69  selcollist {sqli
46e0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
46f0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
4700: 29 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70 20 7b  );}.%type sclp {
4710: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
4720: 72 75 63 74 6f 72 20 73 63 6c 70 20 7b 73 71 6c  ructor sclp {sql
4730: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4740: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
4750: 24 29 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a 3d  $);}.sclp(A) ::=
4760: 20 73 65 6c 63 6f 6c 6c 69 73 74 28 58 29 20 43   selcollist(X) C
4770: 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20 20 20 20  OMMA.           
4780: 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 63 6c 70 28    {A = X;}.sclp(
4790: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47b0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
47c0: 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a  .selcollist(A) :
47d0: 3a 3d 20 73 63 6c 70 28 50 29 20 65 78 70 72 28  := sclp(P) expr(
47e0: 58 29 20 61 73 28 59 29 2e 20 20 20 20 20 7b 0a  X) as(Y).     {.
47f0: 20 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78     A = sqlite3Ex
4800: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
4810: 72 73 65 2c 20 50 2c 20 58 2e 70 45 78 70 72 29  rse, P, X.pExpr)
4820: 3b 0a 20 20 20 69 66 28 20 59 2e 6e 3e 30 20 29  ;.   if( Y.n>0 )
4830: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4840: 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
4850: 41 2c 20 26 59 2c 20 31 29 3b 0a 20 20 20 73 71  A, &Y, 1);.   sq
4860: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74  lite3ExprListSet
4870: 53 70 61 6e 28 70 50 61 72 73 65 2c 41 2c 26 58  Span(pParse,A,&X
4880: 29 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28  );.}.selcollist(
4890: 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20 53  A) ::= sclp(P) S
48a0: 54 41 52 2e 20 7b 0a 20 20 45 78 70 72 20 2a 70  TAR. {.  Expr *p
48b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 70   = sqlite3Expr(p
48c0: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 41 4c  Parse->db, TK_AL
48d0: 4c 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c  L, 0);.  A = sql
48e0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
48f0: 6e 64 28 70 50 61 72 73 65 2c 20 50 2c 20 70 29  nd(pParse, P, p)
4900: 3b 0a 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 41  ;.}.selcollist(A
4910: 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20 6e 6d  ) ::= sclp(P) nm
4920: 28 58 29 20 44 4f 54 20 53 54 41 52 28 59 29 2e  (X) DOT STAR(Y).
4930: 20 7b 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68   {.  Expr *pRigh
4940: 74 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  t = sqlite3PExpr
4950: 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 4c 4c 2c  (pParse, TK_ALL,
4960: 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 45 78   0, 0, &Y);.  Ex
4970: 70 72 20 2a 70 4c 65 66 74 20 3d 20 73 71 6c 69  pr *pLeft = sqli
4980: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
4990: 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58   TK_ID, 0, 0, &X
49a0: 29 3b 0a 20 20 45 78 70 72 20 2a 70 44 6f 74 20  );.  Expr *pDot 
49b0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
49c0: 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70  Parse, TK_DOT, p
49d0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29  Left, pRight, 0)
49e0: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
49f0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
4a00: 61 72 73 65 2c 50 2c 20 70 44 6f 74 29 3b 0a 7d  arse,P, pDot);.}
4a10: 0a 0a 2f 2f 20 41 6e 20 6f 70 74 69 6f 6e 20 22  ..// An option "
4a20: 41 53 20 3c 69 64 3e 22 20 70 68 72 61 73 65 20  AS <id>" phrase 
4a30: 74 68 61 74 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  that can follow 
4a40: 6f 6e 65 20 6f 66 20 74 68 65 20 65 78 70 72 65  one of the expre
4a50: 73 73 69 6f 6e 73 20 74 68 61 74 0a 2f 2f 20 64  ssions that.// d
4a60: 65 66 69 6e 65 20 74 68 65 20 72 65 73 75 6c 74  efine the result
4a70: 20 73 65 74 2c 20 6f 72 20 6f 6e 65 20 6f 66 20   set, or one of 
4a80: 74 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  the tables in th
4a90: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f  e FROM clause../
4aa0: 2f 0a 25 74 79 70 65 20 61 73 20 7b 54 6f 6b 65  /.%type as {Toke
4ab0: 6e 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 41 53 20  n}.as(X) ::= AS 
4ac0: 6e 6d 28 59 29 2e 20 20 20 20 7b 58 20 3d 20 59  nm(Y).    {X = Y
4ad0: 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 69 64 73  ;}.as(X) ::= ids
4ae0: 28 59 29 2e 20 20 20 20 20 20 7b 58 20 3d 20 59  (Y).      {X = Y
4af0: 3b 7d 0a 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20  ;}.as(X) ::= .  
4b00: 20 20 20 20 20 20 20 20 20 20 7b 58 2e 6e 20 3d            {X.n =
4b10: 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 73 65 6c   0;}...%type sel
4b20: 74 61 62 6c 69 73 74 20 7b 53 72 63 4c 69 73 74  tablist {SrcList
4b30: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
4b40: 65 6c 74 61 62 6c 69 73 74 20 7b 73 71 6c 69 74  eltablist {sqlit
4b50: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
4b60: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
4b70: 7d 0a 25 74 79 70 65 20 73 74 6c 5f 70 72 65 66  }.%type stl_pref
4b80: 69 78 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  ix {SrcList*}.%d
4b90: 65 73 74 72 75 63 74 6f 72 20 73 74 6c 5f 70 72  estructor stl_pr
4ba0: 65 66 69 78 20 7b 73 71 6c 69 74 65 33 53 72 63  efix {sqlite3Src
4bb0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
4bc0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79  e->db, $$);}.%ty
4bd0: 70 65 20 66 72 6f 6d 20 7b 53 72 63 4c 69 73 74  pe from {SrcList
4be0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 66  *}.%destructor f
4bf0: 72 6f 6d 20 7b 73 71 6c 69 74 65 33 53 72 63 4c  rom {sqlite3SrcL
4c00: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
4c10: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 2f 2f 20  ->db, $$);}..// 
4c20: 41 20 63 6f 6d 70 6c 65 74 65 20 46 52 4f 4d 20  A complete FROM 
4c30: 63 6c 61 75 73 65 2e 0a 2f 2f 0a 66 72 6f 6d 28  clause..//.from(
4c40: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
4c50: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c          {A = sql
4c60: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
4c70: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69 7a  (pParse->db, siz
4c80: 65 6f 66 28 2a 41 29 29 3b 7d 0a 66 72 6f 6d 28  eof(*A));}.from(
4c90: 41 29 20 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74  A) ::= FROM selt
4ca0: 61 62 6c 69 73 74 28 58 29 2e 20 7b 0a 20 20 41  ablist(X). {.  A
4cb0: 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65 33 53   = X;.  sqlite3S
4cc0: 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
4cd0: 79 70 65 28 41 29 3b 0a 7d 0a 0a 2f 2f 20 22 73  ype(A);.}..// "s
4ce0: 65 6c 74 61 62 6c 69 73 74 22 20 69 73 20 61 20  eltablist" is a 
4cf0: 22 53 65 6c 65 63 74 20 54 61 62 6c 65 20 4c 69  "Select Table Li
4d00: 73 74 22 20 2d 20 74 68 65 20 63 6f 6e 74 65 6e  st" - the conten
4d10: 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  t of the FROM cl
4d20: 61 75 73 65 0a 2f 2f 20 69 6e 20 61 20 53 45 4c  ause.// in a SEL
4d30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
4d40: 22 73 74 6c 5f 70 72 65 66 69 78 22 20 69 73 20  "stl_prefix" is 
4d50: 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73  a prefix of this
4d60: 20 6c 69 73 74 2e 0a 2f 2f 0a 73 74 6c 5f 70 72   list..//.stl_pr
4d70: 65 66 69 78 28 41 29 20 3a 3a 3d 20 73 65 6c 74  efix(A) ::= selt
4d80: 61 62 6c 69 73 74 28 58 29 20 6a 6f 69 6e 6f 70  ablist(X) joinop
4d90: 28 59 29 2e 20 20 20 20 7b 0a 20 20 20 41 20 3d  (Y).    {.   A =
4da0: 20 58 3b 0a 20 20 20 69 66 28 20 41 4c 57 41 59   X;.   if( ALWAY
4db0: 53 28 41 20 26 26 20 41 2d 3e 6e 53 72 63 3e 30  S(A && A->nSrc>0
4dc0: 29 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63  ) ) A->a[A->nSrc
4dd0: 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 28  -1].jointype = (
4de0: 75 38 29 59 3b 0a 7d 0a 73 74 6c 5f 70 72 65 66  u8)Y;.}.stl_pref
4df0: 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  ix(A) ::= .     
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73        {A = 0;}.s
4e20: 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d  eltablist(A) ::=
4e30: 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20 6e   stl_prefix(X) n
4e40: 6d 28 59 29 20 64 62 6e 6d 28 44 29 20 61 73 28  m(Y) dbnm(D) as(
4e50: 5a 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49  Z) indexed_opt(I
4e60: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4e70: 20 20 20 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73      on_opt(N) us
4e80: 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20  ing_opt(U). {.  
4e90: 41 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  A = sqlite3SrcLi
4ea0: 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
4eb0: 28 70 50 61 72 73 65 2c 58 2c 26 59 2c 26 44 2c  (pParse,X,&Y,&D,
4ec0: 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20 73 71 6c  &Z,0,N,U);.  sql
4ed0: 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
4ee0: 65 64 42 79 28 70 50 61 72 73 65 2c 20 41 2c 20  edBy(pParse, A, 
4ef0: 26 49 29 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53  &I);.}.%ifndef S
4f00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4f10: 45 52 59 0a 20 20 73 65 6c 74 61 62 6c 69 73 74  ERY.  seltablist
4f20: 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66  (A) ::= stl_pref
4f30: 69 78 28 58 29 20 4c 50 20 73 65 6c 65 63 74 28  ix(X) LP select(
4f40: 53 29 20 52 50 0a 20 20 20 20 20 20 20 20 20 20  S) RP.          
4f50: 20 20 20 20 20 20 20 20 20 20 61 73 28 5a 29 20            as(Z) 
4f60: 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f  on_opt(N) using_
4f70: 6f 70 74 28 55 29 2e 20 7b 0a 20 20 20 20 41 20  opt(U). {.    A 
4f80: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
4f90: 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
4fa0: 50 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a 2c 53  Parse,X,0,0,&Z,S
4fb0: 2c 4e 2c 55 29 3b 0a 20 20 7d 0a 20 20 73 65 6c  ,N,U);.  }.  sel
4fc0: 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  tablist(A) ::= s
4fd0: 74 6c 5f 70 72 65 66 69 78 28 58 29 20 4c 50 20  tl_prefix(X) LP 
4fe0: 73 65 6c 74 61 62 6c 69 73 74 28 46 29 20 52 50  seltablist(F) RP
4ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5000: 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70       as(Z) on_op
5010: 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55  t(N) using_opt(U
5020: 29 2e 20 7b 0a 20 20 20 20 69 66 28 20 58 3d 3d  ). {.    if( X==
5030: 30 20 26 26 20 5a 2e 6e 3d 3d 30 20 26 26 20 4e  0 && Z.n==0 && N
5040: 3d 3d 30 20 26 26 20 55 3d 3d 30 20 29 7b 0a 20  ==0 && U==0 ){. 
5050: 20 20 20 20 20 41 20 3d 20 46 3b 0a 20 20 20 20       A = F;.    
5060: 7d 65 6c 73 65 20 69 66 28 20 46 2d 3e 6e 53 72  }else if( F->nSr
5070: 63 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 41 20  c==1 ){.      A 
5080: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
5090: 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
50a0: 50 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a 2c 30  Parse,X,0,0,&Z,0
50b0: 2c 4e 2c 55 29 3b 0a 20 20 20 20 20 20 69 66 28  ,N,U);.      if(
50c0: 20 41 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74   A ){.        st
50d0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
50e0: 6d 20 2a 70 4e 65 77 20 3d 20 26 41 2d 3e 61 5b  m *pNew = &A->a[
50f0: 41 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  A->nSrc-1];.    
5100: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
5110: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 20 3d 20  st_item *pOld = 
5120: 46 2d 3e 61 3b 0a 20 20 20 20 20 20 20 20 70 4e  F->a;.        pN
5130: 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c 64  ew->zName = pOld
5140: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
5150: 20 70 4e 65 77 2d 3e 7a 44 61 74 61 62 61 73 65   pNew->zDatabase
5160: 20 3d 20 70 4f 6c 64 2d 3e 7a 44 61 74 61 62 61   = pOld->zDataba
5170: 73 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se;.        pNew
5180: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 4f 6c 64  ->pSelect = pOld
5190: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  ->pSelect;.     
51a0: 20 20 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 20 3d     pOld->zName =
51b0: 20 70 4f 6c 64 2d 3e 7a 44 61 74 61 62 61 73 65   pOld->zDatabase
51c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 4f   = 0;.        pO
51d0: 6c 64 2d 3e 70 53 65 6c 65 63 74 20 3d 20 30 3b  ld->pSelect = 0;
51e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
51f0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
5200: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
5210: 46 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  F);.    }else{. 
5220: 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75       Select *pSu
5230: 62 71 75 65 72 79 3b 0a 20 20 20 20 20 20 73 71  bquery;.      sq
5240: 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
5250: 74 4a 6f 69 6e 54 79 70 65 28 46 29 3b 0a 20 20  tJoinType(F);.  
5260: 20 20 20 20 70 53 75 62 71 75 65 72 79 20 3d 20      pSubquery = 
5270: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
5280: 28 70 50 61 72 73 65 2c 30 2c 46 2c 30 2c 30 2c  (pParse,0,F,0,0,
5290: 30 2c 30 2c 53 46 5f 4e 65 73 74 65 64 46 72 6f  0,0,SF_NestedFro
52a0: 6d 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 41 20  m,0,0);.      A 
52b0: 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
52c0: 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70  AppendFromTerm(p
52d0: 50 61 72 73 65 2c 58 2c 30 2c 30 2c 26 5a 2c 70  Parse,X,0,0,&Z,p
52e0: 53 75 62 71 75 65 72 79 2c 4e 2c 55 29 3b 0a 20  Subquery,N,U);. 
52f0: 20 20 20 7d 0a 20 20 7d 0a 25 65 6e 64 69 66 20     }.  }.%endif 
5300: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
5310: 51 55 45 52 59 0a 0a 25 74 79 70 65 20 64 62 6e  QUERY..%type dbn
5320: 6d 20 7b 54 6f 6b 65 6e 7d 0a 64 62 6e 6d 28 41  m {Token}.dbnm(A
5330: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
5340: 20 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 30 3b 7d   {A.z=0; A.n=0;}
5350: 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 44 4f 54  .dbnm(A) ::= DOT
5360: 20 6e 6d 28 58 29 2e 20 7b 41 20 3d 20 58 3b 7d   nm(X). {A = X;}
5370: 0a 0a 25 74 79 70 65 20 66 75 6c 6c 6e 61 6d 65  ..%type fullname
5380: 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73   {SrcList*}.%des
5390: 74 72 75 63 74 6f 72 20 66 75 6c 6c 6e 61 6d 65  tructor fullname
53a0: 20 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   {sqlite3SrcList
53b0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
53c0: 62 2c 20 24 24 29 3b 7d 0a 66 75 6c 6c 6e 61 6d  b, $$);}.fullnam
53d0: 65 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 64  e(A) ::= nm(X) d
53e0: 62 6e 6d 28 59 29 2e 20 20 7b 41 20 3d 20 73 71  bnm(Y).  {A = sq
53f0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
5400: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c  nd(pParse->db,0,
5410: 26 58 2c 26 59 29 3b 7d 0a 0a 25 74 79 70 65 20  &X,&Y);}..%type 
5420: 6a 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 25 74 79  joinop {int}.%ty
5430: 70 65 20 6a 6f 69 6e 6f 70 32 20 7b 69 6e 74 7d  pe joinop2 {int}
5440: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 43  .joinop(X) ::= C
5450: 4f 4d 4d 41 7c 4a 4f 49 4e 2e 20 20 20 20 20 20  OMMA|JOIN.      
5460: 20 20 20 20 20 20 20 20 7b 20 58 20 3d 20 4a 54          { X = JT
5470: 5f 49 4e 4e 45 52 3b 20 7d 0a 6a 6f 69 6e 6f 70  _INNER; }.joinop
5480: 28 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28  (X) ::= JOIN_KW(
5490: 41 29 20 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20  A) JOIN.        
54a0: 20 7b 20 58 20 3d 20 73 71 6c 69 74 65 33 4a 6f   { X = sqlite3Jo
54b0: 69 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 41  inType(pParse,&A
54c0: 2c 30 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f 70 28  ,0,0); }.joinop(
54d0: 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41  X) ::= JOIN_KW(A
54e0: 29 20 6e 6d 28 42 29 20 4a 4f 49 4e 2e 20 20 20  ) nm(B) JOIN.   
54f0: 7b 20 58 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69  { X = sqlite3Joi
5500: 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 41 2c  nType(pParse,&A,
5510: 26 42 2c 30 29 3b 20 7d 0a 6a 6f 69 6e 6f 70 28  &B,0); }.joinop(
5520: 58 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41  X) ::= JOIN_KW(A
5530: 29 20 6e 6d 28 42 29 20 6e 6d 28 43 29 20 4a 4f  ) nm(B) nm(C) JO
5540: 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  IN..            
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 20 20 20 20 20 20 20 20 20 7b 20 58 20 3d             { X =
5570: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
5580: 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c 26 43  (pParse,&A,&B,&C
5590: 29 3b 20 7d 0a 0a 25 74 79 70 65 20 6f 6e 5f 6f  ); }..%type on_o
55a0: 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  pt {Expr*}.%dest
55b0: 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74 20 7b 73  ructor on_opt {s
55c0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
55d0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
55e0: 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d  ;}.on_opt(N) ::=
55f0: 20 4f 4e 20 65 78 70 72 28 45 29 2e 20 20 20 7b   ON expr(E).   {
5600: 4e 20 3d 20 45 2e 70 45 78 70 72 3b 7d 0a 6f 6e  N = E.pExpr;}.on
5610: 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 2e 20 20 20  _opt(N) ::= .   
5620: 20 20 20 20 20 20 20 20 20 20 7b 4e 20 3d 20 30            {N = 0
5630: 3b 7d 0a 0a 2f 2f 20 4e 6f 74 65 20 74 68 61 74  ;}..// Note that
5640: 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 62 75 73   this block abus
5650: 65 73 20 74 68 65 20 54 6f 6b 65 6e 20 74 79 70  es the Token typ
5660: 65 20 6a 75 73 74 20 61 20 6c 69 74 74 6c 65 2e  e just a little.
5670: 20 49 66 20 74 68 65 72 65 20 69 73 0a 2f 2f 20   If there is.// 
5680: 6e 6f 20 22 49 4e 44 45 58 45 44 20 42 59 22 20  no "INDEXED BY" 
5690: 63 6c 61 75 73 65 2c 20 74 68 65 20 72 65 74 75  clause, the retu
56a0: 72 6e 65 64 20 74 6f 6b 65 6e 20 69 73 20 65 6d  rned token is em
56b0: 70 74 79 20 28 7a 3d 3d 30 20 26 26 20 6e 3d 3d  pty (z==0 && n==
56c0: 30 29 2e 20 49 66 0a 2f 2f 20 74 68 65 72 65 20  0). If.// there 
56d0: 69 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  is an INDEXED BY
56e0: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
56f0: 65 20 74 6f 6b 65 6e 20 69 73 20 70 6f 70 75 6c  e token is popul
5700: 61 74 65 64 20 61 73 20 70 65 72 20 6e 6f 72 6d  ated as per norm
5710: 61 6c 2c 0a 2f 2f 20 77 69 74 68 20 7a 20 70 6f  al,.// with z po
5720: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 74 6f  inting to the to
5730: 6b 65 6e 20 64 61 74 61 20 61 6e 64 20 6e 20 63  ken data and n c
5740: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 75  ontaining the nu
5750: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2f 2f  mber of bytes.//
5760: 20 69 6e 20 74 68 65 20 74 6f 6b 65 6e 2e 0a 2f   in the token../
5770: 2f 0a 2f 2f 20 49 66 20 74 68 65 72 65 20 69 73  /.// If there is
5780: 20 61 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22   a "NOT INDEXED"
5790: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 28 7a   clause, then (z
57a0: 3d 3d 30 20 26 26 20 6e 3d 3d 31 29 2c 20 77 68  ==0 && n==1), wh
57b0: 69 63 68 20 69 73 20 0a 2f 2f 20 6e 6f 72 6d 61  ich is .// norma
57c0: 6c 6c 79 20 69 6c 6c 65 67 61 6c 2e 20 54 68 65  lly illegal. The
57d0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49   sqlite3SrcListI
57e0: 6e 64 65 78 65 64 42 79 28 29 20 66 75 6e 63 74  ndexedBy() funct
57f0: 69 6f 6e 20 0a 2f 2f 20 72 65 63 6f 67 6e 69 7a  ion .// recogniz
5800: 65 73 20 61 6e 64 20 69 6e 74 65 72 70 72 65 74  es and interpret
5810: 73 20 74 68 69 73 20 61 73 20 61 20 73 70 65 63  s this as a spec
5820: 69 61 6c 20 63 61 73 65 2e 0a 2f 2f 0a 25 74 79  ial case..//.%ty
5830: 70 65 20 69 6e 64 65 78 65 64 5f 6f 70 74 20 7b  pe indexed_opt {
5840: 54 6f 6b 65 6e 7d 0a 69 6e 64 65 78 65 64 5f 6f  Token}.indexed_o
5850: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
5860: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e 7a              {A.z
5870: 3d 30 3b 20 41 2e 6e 3d 30 3b 7d 0a 69 6e 64 65  =0; A.n=0;}.inde
5880: 78 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 49  xed_opt(A) ::= I
5890: 4e 44 45 58 45 44 20 42 59 20 6e 6d 28 58 29 2e  NDEXED BY nm(X).
58a0: 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 64 65 78 65   {A = X;}.indexe
58b0: 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4e 4f 54  d_opt(A) ::= NOT
58c0: 20 49 4e 44 45 58 45 44 2e 20 20 20 20 20 20 7b   INDEXED.      {
58d0: 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 31 3b 7d 0a 0a  A.z=0; A.n=1;}..
58e0: 25 74 79 70 65 20 75 73 69 6e 67 5f 6f 70 74 20  %type using_opt 
58f0: 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  {IdList*}.%destr
5900: 75 63 74 6f 72 20 75 73 69 6e 67 5f 6f 70 74 20  uctor using_opt 
5910: 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65  {sqlite3IdListDe
5920: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
5930: 20 24 24 29 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74   $$);}.using_opt
5940: 28 55 29 20 3a 3a 3d 20 55 53 49 4e 47 20 4c 50  (U) ::= USING LP
5950: 20 69 64 6c 69 73 74 28 4c 29 20 52 50 2e 20 20   idlist(L) RP.  
5960: 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e 67 5f 6f  {U = L;}.using_o
5970: 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(U) ::= .     
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5990: 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a 0a 25 74     {U = 0;}...%t
59a0: 79 70 65 20 6f 72 64 65 72 62 79 5f 6f 70 74 20  ype orderby_opt 
59b0: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
59c0: 74 72 75 63 74 6f 72 20 6f 72 64 65 72 62 79 5f  tructor orderby_
59d0: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
59e0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
59f0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79  e->db, $$);}.%ty
5a00: 70 65 20 73 6f 72 74 6c 69 73 74 20 7b 45 78 70  pe sortlist {Exp
5a10: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
5a20: 74 6f 72 20 73 6f 72 74 6c 69 73 74 20 7b 73 71  tor sortlist {sq
5a30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
5a40: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
5a50: 24 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f  $$);}..orderby_o
5a60: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
5a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a80: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72       {A = 0;}.or
5a90: 64 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d  derby_opt(A) ::=
5aa0: 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69   ORDER BY sortli
5ab0: 73 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d  st(X).      {A =
5ac0: 20 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29   X;}.sortlist(A)
5ad0: 20 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29   ::= sortlist(X)
5ae0: 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 20 73   COMMA expr(Y) s
5af0: 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20  ortorder(Z). {. 
5b00: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
5b10: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
5b20: 65 2c 58 2c 59 2e 70 45 78 70 72 29 3b 0a 20 20  e,X,Y.pExpr);.  
5b30: 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e  if( A ) A->a[A->
5b40: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
5b50: 65 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 73 6f  er = (u8)Z;.}.so
5b60: 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 65 78  rtlist(A) ::= ex
5b70: 70 72 28 59 29 20 73 6f 72 74 6f 72 64 65 72 28  pr(Y) sortorder(
5b80: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
5b90: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
5ba0: 64 28 70 50 61 72 73 65 2c 30 2c 59 2e 70 45 78  d(pParse,0,Y.pEx
5bb0: 70 72 29 3b 0a 20 20 69 66 28 20 41 20 26 26 20  pr);.  if( A && 
5bc0: 41 4c 57 41 59 53 28 41 2d 3e 61 29 20 29 20 41  ALWAYS(A->a) ) A
5bd0: 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[0].sortOrder
5be0: 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 0a 25 74 79   = (u8)Z;.}..%ty
5bf0: 70 65 20 73 6f 72 74 6f 72 64 65 72 20 7b 69 6e  pe sortorder {in
5c00: 74 7d 0a 0a 73 6f 72 74 6f 72 64 65 72 28 41 29  t}..sortorder(A)
5c10: 20 3a 3a 3d 20 41 53 43 2e 20 20 20 20 20 20 20   ::= ASC.       
5c20: 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f      {A = SQLITE_
5c30: 53 4f 5f 41 53 43 3b 7d 0a 73 6f 72 74 6f 72 64  SO_ASC;}.sortord
5c40: 65 72 28 41 29 20 3a 3a 3d 20 44 45 53 43 2e 20  er(A) ::= DESC. 
5c50: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53 51           {A = SQ
5c60: 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 7d 0a 73  LITE_SO_DESC;}.s
5c70: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20  ortorder(A) ::= 
5c80: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
5c90: 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  A = SQLITE_SO_AS
5ca0: 43 3b 7d 0a 0a 25 74 79 70 65 20 67 72 6f 75 70  C;}..%type group
5cb0: 62 79 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74  by_opt {ExprList
5cc0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 67  *}.%destructor g
5cd0: 72 6f 75 70 62 79 5f 6f 70 74 20 7b 73 71 6c 69  roupby_opt {sqli
5ce0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
5cf0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
5d00: 29 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28  );}.groupby_opt(
5d10: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
5d30: 20 3d 20 30 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f   = 0;}.groupby_o
5d40: 70 74 28 41 29 20 3a 3a 3d 20 47 52 4f 55 50 20  pt(A) ::= GROUP 
5d50: 42 59 20 6e 65 78 70 72 6c 69 73 74 28 58 29 2e  BY nexprlist(X).
5d60: 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65   {A = X;}..%type
5d70: 20 68 61 76 69 6e 67 5f 6f 70 74 20 7b 45 78 70   having_opt {Exp
5d80: 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  r*}.%destructor 
5d90: 68 61 76 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69  having_opt {sqli
5da0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
5db0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
5dc0: 68 61 76 69 6e 67 5f 6f 70 74 28 41 29 20 3a 3a  having_opt(A) ::
5dd0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
5de0: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 68 61 76 69     {A = 0;}.havi
5df0: 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 48 41  ng_opt(A) ::= HA
5e00: 56 49 4e 47 20 65 78 70 72 28 58 29 2e 20 20 7b  VING expr(X).  {
5e10: 41 20 3d 20 58 2e 70 45 78 70 72 3b 7d 0a 0a 25  A = X.pExpr;}..%
5e20: 74 79 70 65 20 6c 69 6d 69 74 5f 6f 70 74 20 7b  type limit_opt {
5e30: 73 74 72 75 63 74 20 4c 69 6d 69 74 56 61 6c 7d  struct LimitVal}
5e40: 0a 0a 2f 2f 20 54 68 65 20 64 65 73 74 72 75 63  ..// The destruc
5e50: 74 6f 72 20 66 6f 72 20 6c 69 6d 69 74 5f 6f 70  tor for limit_op
5e60: 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 66 69 72  t will never fir
5e70: 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
5e80: 20 67 72 61 6d 6d 61 72 2e 0a 2f 2f 20 54 68 65   grammar..// The
5e90: 20 6c 69 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74   limit_opt non-t
5ea0: 65 72 6d 69 6e 61 6c 20 6f 6e 6c 79 20 6f 63 63  erminal only occ
5eb0: 75 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  urs at the end o
5ec0: 66 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 64 75  f a single produ
5ed0: 63 74 69 6f 6e 0a 2f 2f 20 72 75 6c 65 20 66 6f  ction.// rule fo
5ee0: 72 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  r SELECT stateme
5ef0: 6e 74 73 2e 20 20 41 73 20 73 6f 6f 6e 20 61 73  nts.  As soon as
5f00: 20 74 68 65 20 72 75 6c 65 20 74 68 61 74 20 63   the rule that c
5f10: 72 65 61 74 65 20 74 68 65 20 0a 2f 2f 20 6c 69  reate the .// li
5f20: 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d  mit_opt non-term
5f30: 69 6e 61 6c 20 72 65 64 75 63 65 73 2c 20 74 68  inal reduces, th
5f40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
5f50: 6e 74 20 72 75 6c 65 20 77 69 6c 6c 20 61 6c 73  nt rule will als
5f60: 6f 0a 2f 2f 20 72 65 64 75 63 65 2e 20 20 53 6f  o.// reduce.  So
5f70: 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20   there is never 
5f80: 61 20 6c 69 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d  a limit_opt non-
5f90: 74 65 72 6d 69 6e 61 6c 20 6f 6e 20 74 68 65 20  terminal on the 
5fa0: 73 74 61 63 6b 20 0a 2f 2f 20 65 78 63 65 70 74  stack .// except
5fb0: 20 61 73 20 61 20 74 72 61 6e 73 69 65 6e 74 2e   as a transient.
5fc0: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 65    So there is ne
5fd0: 76 65 72 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  ver anything to 
5fe0: 64 65 73 74 72 6f 79 2e 0a 2f 2f 0a 2f 2f 25 64  destroy..//.//%d
5ff0: 65 73 74 72 75 63 74 6f 72 20 6c 69 6d 69 74 5f  estructor limit_
6000: 6f 70 74 20 7b 0a 2f 2f 20 20 73 71 6c 69 74 65  opt {.//  sqlite
6010: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
6020: 73 65 2d 3e 64 62 2c 20 24 24 2e 70 4c 69 6d 69  se->db, $$.pLimi
6030: 74 29 3b 0a 2f 2f 20 20 73 71 6c 69 74 65 33 45  t);.//  sqlite3E
6040: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
6050: 2d 3e 64 62 2c 20 24 24 2e 70 4f 66 66 73 65 74  ->db, $$.pOffset
6060: 29 3b 0a 2f 2f 7d 0a 6c 69 6d 69 74 5f 6f 70 74  );.//}.limit_opt
6070: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e               {A.
6090: 70 4c 69 6d 69 74 20 3d 20 30 3b 20 41 2e 70 4f  pLimit = 0; A.pO
60a0: 66 66 73 65 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69  ffset = 0;}.limi
60b0: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49 4d  t_opt(A) ::= LIM
60c0: 49 54 20 65 78 70 72 28 58 29 2e 20 20 20 20 20  IT expr(X).     
60d0: 20 20 7b 41 2e 70 4c 69 6d 69 74 20 3d 20 58 2e    {A.pLimit = X.
60e0: 70 45 78 70 72 3b 20 41 2e 70 4f 66 66 73 65 74  pExpr; A.pOffset
60f0: 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74   = 0;}.limit_opt
6100: 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78  (A) ::= LIMIT ex
6110: 70 72 28 58 29 20 4f 46 46 53 45 54 20 65 78 70  pr(X) OFFSET exp
6120: 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20  r(Y). .         
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e               {A.
6150: 70 4c 69 6d 69 74 20 3d 20 58 2e 70 45 78 70 72  pLimit = X.pExpr
6160: 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 59 2e  ; A.pOffset = Y.
6170: 70 45 78 70 72 3b 7d 0a 6c 69 6d 69 74 5f 6f 70  pExpr;}.limit_op
6180: 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65  t(A) ::= LIMIT e
6190: 78 70 72 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  xpr(X) COMMA exp
61a0: 72 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20  r(Y). .         
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e               {A.
61d0: 70 4f 66 66 73 65 74 20 3d 20 58 2e 70 45 78 70  pOffset = X.pExp
61e0: 72 3b 20 41 2e 70 4c 69 6d 69 74 20 3d 20 59 2e  r; A.pLimit = Y.
61f0: 70 45 78 70 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  pExpr;}..///////
6200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6210: 2f 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54 45 20  //// The DELETE 
6220: 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f  statement //////
6230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6240: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65  ///////.//.%ifde
6250: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6260: 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49  UPDATE_DELETE_LI
6270: 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68  MIT.cmd ::= with
6280: 28 43 29 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  (C) DELETE FROM 
6290: 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65  fullname(X) inde
62a0: 78 65 64 5f 6f 70 74 28 49 29 20 77 68 65 72 65  xed_opt(I) where
62b0: 5f 6f 70 74 28 57 29 20 0a 20 20 20 20 20 20 20  _opt(W) .       
62c0: 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 4f 29 20   orderby_opt(O) 
62d0: 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a  limit_opt(L). {.
62e0: 20 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73    sqlite3WithPus
62f0: 68 28 70 50 61 72 73 65 2c 20 43 2c 20 31 29 3b  h(pParse, C, 1);
6300: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
6310: 74 49 6e 64 65 78 65 64 42 79 28 70 50 61 72 73  tIndexedBy(pPars
6320: 65 2c 20 58 2c 20 26 49 29 3b 0a 20 20 57 20 3d  e, X, &I);.  W =
6330: 20 73 71 6c 69 74 65 33 4c 69 6d 69 74 57 68 65   sqlite3LimitWhe
6340: 72 65 28 70 50 61 72 73 65 2c 20 58 2c 20 57 2c  re(pParse, X, W,
6350: 20 4f 2c 20 4c 2e 70 4c 69 6d 69 74 2c 20 4c 2e   O, L.pLimit, L.
6360: 70 4f 66 66 73 65 74 2c 20 22 44 45 4c 45 54 45  pOffset, "DELETE
6370: 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  ");.  sqlite3Del
6380: 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 58  eteFrom(pParse,X
6390: 2c 57 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 25 69  ,W);.}.%endif.%i
63a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
63b0: 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54  BLE_UPDATE_DELET
63c0: 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20  E_LIMIT.cmd ::= 
63d0: 77 69 74 68 28 43 29 20 44 45 4c 45 54 45 20 46  with(C) DELETE F
63e0: 52 4f 4d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20  ROM fullname(X) 
63f0: 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 20 77  indexed_opt(I) w
6400: 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b 0a 20  here_opt(W). {. 
6410: 20 73 71 6c 69 74 65 33 57 69 74 68 50 75 73 68   sqlite3WithPush
6420: 28 70 50 61 72 73 65 2c 20 43 2c 20 31 29 3b 0a  (pParse, C, 1);.
6430: 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
6440: 49 6e 64 65 78 65 64 42 79 28 70 50 61 72 73 65  IndexedBy(pParse
6450: 2c 20 58 2c 20 26 49 29 3b 0a 20 20 73 71 6c 69  , X, &I);.  sqli
6460: 74 65 33 44 65 6c 65 74 65 46 72 6f 6d 28 70 50  te3DeleteFrom(pP
6470: 61 72 73 65 2c 58 2c 57 29 3b 0a 7d 0a 25 65 6e  arse,X,W);.}.%en
6480: 64 69 66 0a 0a 25 74 79 70 65 20 77 68 65 72 65  dif..%type where
6490: 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65  _opt {Expr*}.%de
64a0: 73 74 72 75 63 74 6f 72 20 77 68 65 72 65 5f 6f  structor where_o
64b0: 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44  pt {sqlite3ExprD
64c0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
64d0: 2c 20 24 24 29 3b 7d 0a 0a 77 68 65 72 65 5f 6f  , $$);}..where_o
64e0: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20  pt(A) ::= .     
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
6500: 41 20 3d 20 30 3b 7d 0a 77 68 65 72 65 5f 6f 70  A = 0;}.where_op
6510: 74 28 41 29 20 3a 3a 3d 20 57 48 45 52 45 20 65  t(A) ::= WHERE e
6520: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 7b 41  xpr(X).       {A
6530: 20 3d 20 58 2e 70 45 78 70 72 3b 7d 0a 0a 2f 2f   = X.pExpr;}..//
6540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6550: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 55 50 44  //////// The UPD
6560: 41 54 45 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  ATE command ////
6570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
6590: 25 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  %ifdef SQLITE_EN
65a0: 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45  ABLE_UPDATE_DELE
65b0: 54 45 5f 4c 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d  TE_LIMIT.cmd ::=
65c0: 20 77 69 74 68 28 43 29 20 55 50 44 41 54 45 20   with(C) UPDATE 
65d0: 6f 72 63 6f 6e 66 28 52 29 20 66 75 6c 6c 6e 61  orconf(R) fullna
65e0: 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f 6f 70  me(X) indexed_op
65f0: 74 28 49 29 20 53 45 54 20 73 65 74 6c 69 73 74  t(I) SET setlist
6600: 28 59 29 0a 20 20 20 20 20 20 20 20 77 68 65 72  (Y).        wher
6610: 65 5f 6f 70 74 28 57 29 20 6f 72 64 65 72 62 79  e_opt(W) orderby
6620: 5f 6f 70 74 28 4f 29 20 6c 69 6d 69 74 5f 6f 70  _opt(O) limit_op
6630: 74 28 4c 29 2e 20 20 7b 0a 20 20 73 71 6c 69 74  t(L).  {.  sqlit
6640: 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
6650: 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73 71 6c 69  e, C, 1);.  sqli
6660: 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
6670: 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20 26  dBy(pParse, X, &
6680: 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  I);.  sqlite3Exp
6690: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
66a0: 28 70 50 61 72 73 65 2c 59 2c 22 73 65 74 20 6c  (pParse,Y,"set l
66b0: 69 73 74 22 29 3b 20 0a 20 20 57 20 3d 20 73 71  ist"); .  W = sq
66c0: 6c 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65 28  lite3LimitWhere(
66d0: 70 50 61 72 73 65 2c 20 58 2c 20 57 2c 20 4f 2c  pParse, X, W, O,
66e0: 20 4c 2e 70 4c 69 6d 69 74 2c 20 4c 2e 70 4f 66   L.pLimit, L.pOf
66f0: 66 73 65 74 2c 20 22 55 50 44 41 54 45 22 29 3b  fset, "UPDATE");
6700: 0a 20 20 73 71 6c 69 74 65 33 55 70 64 61 74 65  .  sqlite3Update
6710: 28 70 50 61 72 73 65 2c 58 2c 59 2c 57 2c 52 29  (pParse,X,Y,W,R)
6720: 3b 0a 7d 0a 25 65 6e 64 69 66 0a 25 69 66 6e 64  ;.}.%endif.%ifnd
6730: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6740: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
6750: 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74  IMIT.cmd ::= wit
6760: 68 28 43 29 20 55 50 44 41 54 45 20 6f 72 63 6f  h(C) UPDATE orco
6770: 6e 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58  nf(R) fullname(X
6780: 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29  ) indexed_opt(I)
6790: 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 0a   SET setlist(Y).
67a0: 20 20 20 20 20 20 20 20 77 68 65 72 65 5f 6f 70          where_op
67b0: 74 28 57 29 2e 20 20 7b 0a 20 20 73 71 6c 69 74  t(W).  {.  sqlit
67c0: 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73  e3WithPush(pPars
67d0: 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73 71 6c 69  e, C, 1);.  sqli
67e0: 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
67f0: 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20 26  dBy(pParse, X, &
6800: 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  I);.  sqlite3Exp
6810: 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68  rListCheckLength
6820: 28 70 50 61 72 73 65 2c 59 2c 22 73 65 74 20 6c  (pParse,Y,"set l
6830: 69 73 74 22 29 3b 20 0a 20 20 73 71 6c 69 74 65  ist"); .  sqlite
6840: 33 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 58  3Update(pParse,X
6850: 2c 59 2c 57 2c 52 29 3b 0a 7d 0a 25 65 6e 64 69  ,Y,W,R);.}.%endi
6860: 66 0a 0a 25 74 79 70 65 20 73 65 74 6c 69 73 74  f..%type setlist
6870: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
6880: 73 74 72 75 63 74 6f 72 20 73 65 74 6c 69 73 74  structor setlist
6890: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   {sqlite3ExprLis
68a0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
68b0: 64 62 2c 20 24 24 29 3b 7d 0a 0a 73 65 74 6c 69  db, $$);}..setli
68c0: 73 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c 69 73  st(A) ::= setlis
68d0: 74 28 5a 29 20 43 4f 4d 4d 41 20 6e 6d 28 58 29  t(Z) COMMA nm(X)
68e0: 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b 0a 20   EQ expr(Y). {. 
68f0: 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   A = sqlite3Expr
6900: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
6910: 65 2c 20 5a 2c 20 59 2e 70 45 78 70 72 29 3b 0a  e, Z, Y.pExpr);.
6920: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
6930: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  tSetName(pParse,
6940: 20 41 2c 20 26 58 2c 20 31 29 3b 0a 7d 0a 73 65   A, &X, 1);.}.se
6950: 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28  tlist(A) ::= nm(
6960: 58 29 20 45 51 20 65 78 70 72 28 59 29 2e 20 7b  X) EQ expr(Y). {
6970: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
6980: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
6990: 72 73 65 2c 20 30 2c 20 59 2e 70 45 78 70 72 29  rse, 0, Y.pExpr)
69a0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
69b0: 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73  istSetName(pPars
69c0: 65 2c 20 41 2c 20 26 58 2c 20 31 29 3b 0a 7d 0a  e, A, &X, 1);.}.
69d0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
69e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20  /////////// The 
69f0: 49 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20 2f  INSERT command /
6a00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6a20: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68  .//.cmd ::= with
6a30: 28 57 29 20 69 6e 73 65 72 74 5f 63 6d 64 28 52  (W) insert_cmd(R
6a40: 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28  ) INTO fullname(
6a50: 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  X) inscollist_op
6a60: 74 28 46 29 20 73 65 6c 65 63 74 28 53 29 2e 20  t(F) select(S). 
6a70: 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 68 50  {.  sqlite3WithP
6a80: 75 73 68 28 70 50 61 72 73 65 2c 20 57 2c 20 31  ush(pParse, W, 1
6a90: 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 73 65  );.  sqlite3Inse
6aa0: 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 53 2c  rt(pParse, X, S,
6ab0: 20 46 2c 20 52 29 3b 0a 7d 0a 63 6d 64 20 3a 3a   F, R);.}.cmd ::
6ac0: 3d 20 77 69 74 68 28 57 29 20 69 6e 73 65 72 74  = with(W) insert
6ad0: 5f 63 6d 64 28 52 29 20 49 4e 54 4f 20 66 75 6c  _cmd(R) INTO ful
6ae0: 6c 6e 61 6d 65 28 58 29 20 69 6e 73 63 6f 6c 6c  lname(X) inscoll
6af0: 69 73 74 5f 6f 70 74 28 46 29 20 44 45 46 41 55  ist_opt(F) DEFAU
6b00: 4c 54 20 56 41 4c 55 45 53 2e 0a 7b 0a 20 20 73  LT VALUES..{.  s
6b10: 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
6b20: 50 61 72 73 65 2c 20 57 2c 20 31 29 3b 0a 20 20  Parse, W, 1);.  
6b30: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70 50  sqlite3Insert(pP
6b40: 61 72 73 65 2c 20 58 2c 20 30 2c 20 46 2c 20 52  arse, X, 0, F, R
6b50: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 69 6e 73 65  );.}..%type inse
6b60: 72 74 5f 63 6d 64 20 7b 75 38 7d 0a 69 6e 73 65  rt_cmd {u8}.inse
6b70: 72 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 49 4e  rt_cmd(A) ::= IN
6b80: 53 45 52 54 20 6f 72 63 6f 6e 66 28 52 29 2e 20  SERT orconf(R). 
6b90: 20 20 7b 41 20 3d 20 52 3b 7d 0a 69 6e 73 65 72    {A = R;}.inser
6ba0: 74 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 52 45 50  t_cmd(A) ::= REP
6bb0: 4c 41 43 45 2e 20 20 20 20 20 20 20 20 20 20 20  LACE.           
6bc0: 20 7b 41 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65   {A = OE_Replace
6bd0: 3b 7d 0a 0a 25 74 79 70 65 20 69 6e 73 63 6f 6c  ;}..%type inscol
6be0: 6c 69 73 74 5f 6f 70 74 20 7b 49 64 4c 69 73 74  list_opt {IdList
6bf0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69  *}.%destructor i
6c00: 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b 73  nscollist_opt {s
6c10: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
6c20: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
6c30: 24 29 3b 7d 0a 25 74 79 70 65 20 69 64 6c 69 73  $);}.%type idlis
6c40: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73  t {IdList*}.%des
6c50: 74 72 75 63 74 6f 72 20 69 64 6c 69 73 74 20 7b  tructor idlist {
6c60: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
6c70: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
6c80: 24 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c 6c 69 73  $$);}..inscollis
6c90: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  t_opt(A) ::= .  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cb0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 6e       {A = 0;}.in
6cc0: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20  scollist_opt(A) 
6cd0: 3a 3a 3d 20 4c 50 20 69 64 6c 69 73 74 28 58 29  ::= LP idlist(X)
6ce0: 20 52 50 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d   RP.    {A = X;}
6cf0: 0a 69 64 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69  .idlist(A) ::= i
6d00: 64 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 6e  dlist(X) COMMA n
6d10: 6d 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  m(Y)..    {A = s
6d20: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
6d30: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 58 2c  nd(pParse->db,X,
6d40: 26 59 29 3b 7d 0a 69 64 6c 69 73 74 28 41 29 20  &Y);}.idlist(A) 
6d50: 3a 3a 3d 20 6e 6d 28 59 29 2e 0a 20 20 20 20 7b  ::= nm(Y)..    {
6d60: 41 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  A = sqlite3IdLis
6d70: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2d 3e  tAppend(pParse->
6d80: 64 62 2c 30 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f  db,0,&Y);}..////
6d90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6da0: 2f 2f 2f 2f 2f 2f 2f 20 45 78 70 72 65 73 73 69  /////// Expressi
6db0: 6f 6e 20 50 72 6f 63 65 73 73 69 6e 67 20 2f 2f  on Processing //
6dc0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6dd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a  ///////////.//..
6de0: 25 74 79 70 65 20 65 78 70 72 20 7b 45 78 70 72  %type expr {Expr
6df0: 53 70 61 6e 7d 0a 25 64 65 73 74 72 75 63 74 6f  Span}.%destructo
6e00: 72 20 65 78 70 72 20 7b 73 71 6c 69 74 65 33 45  r expr {sqlite3E
6e10: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65  xprDelete(pParse
6e20: 2d 3e 64 62 2c 20 24 24 2e 70 45 78 70 72 29 3b  ->db, $$.pExpr);
6e30: 7d 0a 25 74 79 70 65 20 74 65 72 6d 20 7b 45 78  }.%type term {Ex
6e40: 70 72 53 70 61 6e 7d 0a 25 64 65 73 74 72 75 63  prSpan}.%destruc
6e50: 74 6f 72 20 74 65 72 6d 20 7b 73 71 6c 69 74 65  tor term {sqlite
6e60: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
6e70: 73 65 2d 3e 64 62 2c 20 24 24 2e 70 45 78 70 72  se->db, $$.pExpr
6e80: 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a  );}..%include {.
6e90: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 75    /* This is a u
6ea0: 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 20 75  tility routine u
6eb0: 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 45  sed to set the E
6ec0: 78 70 72 53 70 61 6e 2e 7a 53 74 61 72 74 20 61  xprSpan.zStart a
6ed0: 6e 64 0a 20 20 2a 2a 20 45 78 70 72 53 70 61 6e  nd.  ** ExprSpan
6ee0: 2e 7a 45 6e 64 20 76 61 6c 75 65 73 20 6f 66 20  .zEnd values of 
6ef0: 70 4f 75 74 20 73 6f 20 74 68 61 74 20 74 68 65  pOut so that the
6f00: 20 73 70 61 6e 20 63 6f 76 65 72 73 20 74 68 65   span covers the
6f10: 20 63 6f 6d 70 6c 65 74 65 0a 20 20 2a 2a 20 72   complete.  ** r
6f20: 61 6e 67 65 20 6f 66 20 74 65 78 74 20 62 65 67  ange of text beg
6f30: 69 6e 6e 69 6e 67 20 77 69 74 68 20 70 53 74 61  inning with pSta
6f40: 72 74 20 61 6e 64 20 67 6f 69 6e 67 20 74 6f 20  rt and going to 
6f50: 74 68 65 20 65 6e 64 20 6f 66 20 70 45 6e 64 2e  the end of pEnd.
6f60: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  .  */.  static v
6f70: 6f 69 64 20 73 70 61 6e 53 65 74 28 45 78 70 72  oid spanSet(Expr
6f80: 53 70 61 6e 20 2a 70 4f 75 74 2c 20 54 6f 6b 65  Span *pOut, Toke
6f90: 6e 20 2a 70 53 74 61 72 74 2c 20 54 6f 6b 65 6e  n *pStart, Token
6fa0: 20 2a 70 45 6e 64 29 7b 0a 20 20 20 20 70 4f 75   *pEnd){.    pOu
6fb0: 74 2d 3e 7a 53 74 61 72 74 20 3d 20 70 53 74 61  t->zStart = pSta
6fc0: 72 74 2d 3e 7a 3b 0a 20 20 20 20 70 4f 75 74 2d  rt->z;.    pOut-
6fd0: 3e 7a 45 6e 64 20 3d 20 26 70 45 6e 64 2d 3e 7a  >zEnd = &pEnd->z
6fe0: 5b 70 45 6e 64 2d 3e 6e 5d 3b 0a 20 20 7d 0a 0a  [pEnd->n];.  }..
6ff0: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
7000: 20 6e 65 77 20 45 78 70 72 20 6f 62 6a 65 63 74   new Expr object
7010: 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69   from a single i
7020: 64 65 6e 74 69 66 69 65 72 2e 20 20 55 73 65 20  dentifier.  Use 
7030: 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 45 78 70  the.  ** new Exp
7040: 72 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 4f  r to populate pO
7050: 75 74 2e 20 20 53 65 74 20 74 68 65 20 73 70 61  ut.  Set the spa
7060: 6e 20 6f 66 20 70 4f 75 74 20 74 6f 20 62 65 20  n of pOut to be 
7070: 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20  the identifier. 
7080: 20 2a 2a 20 74 68 61 74 20 63 72 65 61 74 65 64   ** that created
7090: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
70a0: 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  .  */.  static v
70b0: 6f 69 64 20 73 70 61 6e 45 78 70 72 28 45 78 70  oid spanExpr(Exp
70c0: 72 53 70 61 6e 20 2a 70 4f 75 74 2c 20 50 61 72  rSpan *pOut, Par
70d0: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
70e0: 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 56 61 6c 75  op, Token *pValu
70f0: 65 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 45  e){.    pOut->pE
7100: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
7110: 70 72 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 30  pr(pParse, op, 0
7120: 2c 20 30 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  , 0, pValue);.  
7130: 20 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d    pOut->zStart =
7140: 20 70 56 61 6c 75 65 2d 3e 7a 3b 0a 20 20 20 20   pValue->z;.    
7150: 70 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 26 70 56  pOut->zEnd = &pV
7160: 61 6c 75 65 2d 3e 7a 5b 70 56 61 6c 75 65 2d 3e  alue->z[pValue->
7170: 6e 5d 3b 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28  n];.  }.}..expr(
7180: 41 29 20 3a 3a 3d 20 74 65 72 6d 28 58 29 2e 20  A) ::= term(X). 
7190: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
71a0: 20 58 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d   X;}.expr(A) ::=
71b0: 20 4c 50 28 42 29 20 65 78 70 72 28 58 29 20 52   LP(B) expr(X) R
71c0: 50 28 45 29 2e 20 7b 41 2e 70 45 78 70 72 20 3d  P(E). {A.pExpr =
71d0: 20 58 2e 70 45 78 70 72 3b 20 73 70 61 6e 53 65   X.pExpr; spanSe
71e0: 74 28 26 41 2c 26 42 2c 26 45 29 3b 7d 0a 74 65  t(&A,&B,&E);}.te
71f0: 72 6d 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c 28 58  rm(A) ::= NULL(X
7200: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ).             {
7210: 73 70 61 6e 45 78 70 72 28 26 41 2c 20 70 50 61  spanExpr(&A, pPa
7220: 72 73 65 2c 20 40 58 2c 20 26 58 29 3b 7d 0a 65  rse, @X, &X);}.e
7230: 78 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29  xpr(A) ::= id(X)
7240: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7250: 7b 73 70 61 6e 45 78 70 72 28 26 41 2c 20 70 50  {spanExpr(&A, pP
7260: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 26 58 29  arse, TK_ID, &X)
7270: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4a  ;}.expr(A) ::= J
7280: 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20 20 20  OIN_KW(X).      
7290: 20 20 20 20 7b 73 70 61 6e 45 78 70 72 28 26 41      {spanExpr(&A
72a0: 2c 20 70 50 61 72 73 65 2c 20 54 4b 5f 49 44 2c  , pParse, TK_ID,
72b0: 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a   &X);}.expr(A) :
72c0: 3a 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28  := nm(X) DOT nm(
72d0: 59 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74 65  Y). {.  Expr *te
72e0: 6d 70 31 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mp1 = sqlite3PEx
72f0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
7300: 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45  , 0, 0, &X);.  E
7310: 78 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c  xpr *temp2 = sql
7320: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
7330: 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  , TK_ID, 0, 0, &
7340: 59 29 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20  Y);.  A.pExpr = 
7350: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7360: 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d  rse, TK_DOT, tem
7370: 70 31 2c 20 74 65 6d 70 32 2c 20 30 29 3b 0a 20  p1, temp2, 0);. 
7380: 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c 26   spanSet(&A,&X,&
7390: 59 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  Y);.}.expr(A) ::
73a0: 3d 20 6e 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59  = nm(X) DOT nm(Y
73b0: 29 20 44 4f 54 20 6e 6d 28 5a 29 2e 20 7b 0a 20  ) DOT nm(Z). {. 
73c0: 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73   Expr *temp1 = s
73d0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
73e0: 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  se, TK_ID, 0, 0,
73f0: 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74 65   &X);.  Expr *te
7400: 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 50 45 78  mp2 = sqlite3PEx
7410: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 44  pr(pParse, TK_ID
7420: 2c 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20 20 45  , 0, 0, &Y);.  E
7430: 78 70 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c  xpr *temp3 = sql
7440: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
7450: 2c 20 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26  , TK_ID, 0, 0, &
7460: 5a 29 3b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70  Z);.  Expr *temp
7470: 34 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  4 = sqlite3PExpr
7480: 28 70 50 61 72 73 65 2c 20 54 4b 5f 44 4f 54 2c  (pParse, TK_DOT,
7490: 20 74 65 6d 70 32 2c 20 74 65 6d 70 33 2c 20 30   temp2, temp3, 0
74a0: 29 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73  );.  A.pExpr = s
74b0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
74c0: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70  se, TK_DOT, temp
74d0: 31 2c 20 74 65 6d 70 34 2c 20 30 29 3b 0a 20 20  1, temp4, 0);.  
74e0: 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c 26 5a  spanSet(&A,&X,&Z
74f0: 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d  );.}.term(A) ::=
7500: 20 49 4e 54 45 47 45 52 7c 46 4c 4f 41 54 7c 42   INTEGER|FLOAT|B
7510: 4c 4f 42 28 58 29 2e 20 20 7b 73 70 61 6e 45 78  LOB(X).  {spanEx
7520: 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c 20 40  pr(&A, pParse, @
7530: 58 2c 20 26 58 29 3b 7d 0a 74 65 72 6d 28 41 29  X, &X);}.term(A)
7540: 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20   ::= STRING(X). 
7550: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70               {sp
7560: 61 6e 45 78 70 72 28 26 41 2c 20 70 50 61 72 73  anExpr(&A, pPars
7570: 65 2c 20 40 58 2c 20 26 58 29 3b 7d 0a 65 78 70  e, @X, &X);}.exp
7580: 72 28 41 29 20 3a 3a 3d 20 56 41 52 49 41 42 4c  r(A) ::= VARIABL
7590: 45 28 58 29 2e 20 20 20 20 20 7b 0a 20 20 69 66  E(X).     {.  if
75a0: 28 20 58 2e 6e 3e 3d 32 20 26 26 20 58 2e 7a 5b  ( X.n>=2 && X.z[
75b0: 30 5d 3d 3d 27 23 27 20 26 26 20 73 71 6c 69 74  0]=='#' && sqlit
75c0: 65 33 49 73 64 69 67 69 74 28 58 2e 7a 5b 31 5d  e3Isdigit(X.z[1]
75d0: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e  ) ){.    /* When
75e0: 20 64 6f 69 6e 67 20 61 20 6e 65 73 74 65 64 20   doing a nested 
75f0: 70 61 72 73 65 2c 20 6f 6e 65 20 63 61 6e 20 69  parse, one can i
7600: 6e 63 6c 75 64 65 20 74 65 72 6d 73 20 69 6e 20  nclude terms in 
7610: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  an expression.  
7620: 20 20 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c    ** that look l
7630: 69 6b 65 20 74 68 69 73 3a 20 20 20 23 31 20 23  ike this:   #1 #
7640: 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74 65 72  2 ...  These ter
7650: 6d 73 20 72 65 66 65 72 20 74 6f 20 72 65 67 69  ms refer to regi
7660: 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 69 6e 20  sters.    ** in 
7670: 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  the virtual mach
7680: 69 6e 65 2e 20 20 23 4e 20 69 73 20 74 68 65 20  ine.  #N is the 
7690: 4e 2d 74 68 20 72 65 67 69 73 74 65 72 2e 20 2a  N-th register. *
76a0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  /.    if( pParse
76b0: 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
76c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
76d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65  rMsg(pParse, "ne
76e0: 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61  ar \"%T\": synta
76f0: 78 20 65 72 72 6f 72 22 2c 20 26 58 29 3b 0a 20  x error", &X);. 
7700: 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 30       A.pExpr = 0
7710: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7720: 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c     A.pExpr = sql
7730: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
7740: 2c 20 54 4b 5f 52 45 47 49 53 54 45 52 2c 20 30  , TK_REGISTER, 0
7750: 2c 20 30 2c 20 26 58 29 3b 0a 20 20 20 20 20 20  , 0, &X);.      
7760: 69 66 28 20 41 2e 70 45 78 70 72 20 29 20 73 71  if( A.pExpr ) sq
7770: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 26 58  lite3GetInt32(&X
7780: 2e 7a 5b 31 5d 2c 20 26 41 2e 70 45 78 70 72 2d  .z[1], &A.pExpr-
7790: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a  >iTable);.    }.
77a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 61    }else{.    spa
77b0: 6e 45 78 70 72 28 26 41 2c 20 70 50 61 72 73 65  nExpr(&A, pParse
77c0: 2c 20 54 4b 5f 56 41 52 49 41 42 4c 45 2c 20 26  , TK_VARIABLE, &
77d0: 58 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  X);.    sqlite3E
77e0: 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62  xprAssignVarNumb
77f0: 65 72 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78  er(pParse, A.pEx
7800: 70 72 29 3b 0a 20 20 7d 0a 20 20 73 70 61 6e 53  pr);.  }.  spanS
7810: 65 74 28 26 41 2c 20 26 58 2c 20 26 58 29 3b 0a  et(&A, &X, &X);.
7820: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
7830: 70 72 28 45 29 20 43 4f 4c 4c 41 54 45 20 69 64  pr(E) COLLATE id
7840: 73 28 43 29 2e 20 7b 0a 20 20 41 2e 70 45 78 70  s(C). {.  A.pExp
7850: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
7860: 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e 28 70  ddCollateToken(p
7870: 50 61 72 73 65 2c 20 45 2e 70 45 78 70 72 2c 20  Parse, E.pExpr, 
7880: 26 43 29 3b 0a 20 20 41 2e 7a 53 74 61 72 74 20  &C);.  A.zStart 
7890: 3d 20 45 2e 7a 53 74 61 72 74 3b 0a 20 20 41 2e  = E.zStart;.  A.
78a0: 7a 45 6e 64 20 3d 20 26 43 2e 7a 5b 43 2e 6e 5d  zEnd = &C.z[C.n]
78b0: 3b 0a 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.%ifndef SQLI
78c0: 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78 70  TE_OMIT_CAST.exp
78d0: 72 28 41 29 20 3a 3a 3d 20 43 41 53 54 28 58 29  r(A) ::= CAST(X)
78e0: 20 4c 50 20 65 78 70 72 28 45 29 20 41 53 20 74   LP expr(E) AS t
78f0: 79 70 65 74 6f 6b 65 6e 28 54 29 20 52 50 28 59  ypetoken(T) RP(Y
7900: 29 2e 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d  ). {.  A.pExpr =
7910: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
7920: 61 72 73 65 2c 20 54 4b 5f 43 41 53 54 2c 20 45  arse, TK_CAST, E
7930: 2e 70 45 78 70 72 2c 20 30 2c 20 26 54 29 3b 0a  .pExpr, 0, &T);.
7940: 20 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c    spanSet(&A,&X,
7950: 26 59 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53  &Y);.}.%endif  S
7960: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a  QLITE_OMIT_CAST.
7970: 65 78 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58  expr(A) ::= id(X
7980: 29 20 4c 50 20 64 69 73 74 69 6e 63 74 28 44 29  ) LP distinct(D)
7990: 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 28   exprlist(Y) RP(
79a0: 45 29 2e 20 7b 0a 20 20 69 66 28 20 59 20 26 26  E). {.  if( Y &&
79b0: 20 59 2d 3e 6e 45 78 70 72 3e 70 50 61 72 73 65   Y->nExpr>pParse
79c0: 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  ->db->aLimit[SQL
79d0: 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
79e0: 4f 4e 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73  ON_ARG] ){.    s
79f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7a00: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
7a10: 20 61 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75   arguments on fu
7a20: 6e 63 74 69 6f 6e 20 25 54 22 2c 20 26 58 29 3b  nction %T", &X);
7a30: 0a 20 20 7d 0a 20 20 41 2e 70 45 78 70 72 20 3d  .  }.  A.pExpr =
7a40: 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63   sqlite3ExprFunc
7a50: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 59 2c 20  tion(pParse, Y, 
7a60: 26 58 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26  &X);.  spanSet(&
7a70: 41 2c 26 58 2c 26 45 29 3b 0a 20 20 69 66 28 20  A,&X,&E);.  if( 
7a80: 44 20 26 26 20 41 2e 70 45 78 70 72 20 29 7b 0a  D && A.pExpr ){.
7a90: 20 20 20 20 41 2e 70 45 78 70 72 2d 3e 66 6c 61      A.pExpr->fla
7aa0: 67 73 20 7c 3d 20 45 50 5f 44 69 73 74 69 6e 63  gs |= EP_Distinc
7ab0: 74 3b 0a 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29  t;.  }.}.expr(A)
7ac0: 20 3a 3a 3d 20 69 64 28 58 29 20 4c 50 20 53 54   ::= id(X) LP ST
7ad0: 41 52 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 2e  AR RP(E). {.  A.
7ae0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  pExpr = sqlite3E
7af0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  xprFunction(pPar
7b00: 73 65 2c 20 30 2c 20 26 58 29 3b 0a 20 20 73 70  se, 0, &X);.  sp
7b10: 61 6e 53 65 74 28 26 41 2c 26 58 2c 26 45 29 3b  anSet(&A,&X,&E);
7b20: 0a 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 43  .}.term(A) ::= C
7b30: 54 49 4d 45 5f 4b 57 28 4f 50 29 2e 20 7b 0a 20  TIME_KW(OP). {. 
7b40: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74   A.pExpr = sqlit
7b50: 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70  e3ExprFunction(p
7b60: 50 61 72 73 65 2c 20 30 2c 20 26 4f 50 29 3b 0a  Parse, 0, &OP);.
7b70: 20 20 73 70 61 6e 53 65 74 28 26 41 2c 20 26 4f    spanSet(&A, &O
7b80: 50 2c 20 26 4f 50 29 3b 0a 7d 0a 0a 25 69 6e 63  P, &OP);.}..%inc
7b90: 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 54 68 69 73  lude {.  /* This
7ba0: 20 72 6f 75 74 69 6e 65 20 63 6f 6e 73 74 72 75   routine constru
7bb0: 63 74 73 20 61 20 62 69 6e 61 72 79 20 65 78 70  cts a binary exp
7bc0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 6f 75 74  ression node out
7bd0: 20 6f 66 20 74 77 6f 20 45 78 70 72 53 70 61 6e   of two ExprSpan
7be0: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 61 6e  .  ** objects an
7bf0: 64 20 75 73 65 73 20 74 68 65 20 72 65 73 75 6c  d uses the resul
7c00: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 61 20  t to populate a 
7c10: 6e 65 77 20 45 78 70 72 53 70 61 6e 20 6f 62 6a  new ExprSpan obj
7c20: 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74  ect..  */.  stat
7c30: 69 63 20 76 6f 69 64 20 73 70 61 6e 42 69 6e 61  ic void spanBina
7c40: 72 79 45 78 70 72 28 0a 20 20 20 20 45 78 70 72  ryExpr(.    Expr
7c50: 53 70 61 6e 20 2a 70 4f 75 74 2c 20 20 20 20 20  Span *pOut,     
7c60: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 65 73  /* Write the res
7c70: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 20 20  ult here */.    
7c80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7c90: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
7ca0: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 45 72 72  ng context.  Err
7cb0: 6f 72 73 20 61 63 63 75 6d 75 6c 61 74 65 20 68  ors accumulate h
7cc0: 65 72 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ere */.    int o
7cd0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
7ce0: 2a 20 54 68 65 20 62 69 6e 61 72 79 20 6f 70 65  * The binary ope
7cf0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78  ration */.    Ex
7d00: 70 72 53 70 61 6e 20 2a 70 4c 65 66 74 2c 20 20  prSpan *pLeft,  
7d10: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
7d20: 65 72 61 6e 64 20 2a 2f 0a 20 20 20 20 45 78 70  erand */.    Exp
7d30: 72 53 70 61 6e 20 2a 70 52 69 67 68 74 20 20 20  rSpan *pRight   
7d40: 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70   /* The right op
7d50: 65 72 61 6e 64 20 2a 2f 0a 20 20 29 7b 0a 20 20  erand */.  ){.  
7d60: 20 20 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20    pOut->pExpr = 
7d70: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
7d80: 72 73 65 2c 20 6f 70 2c 20 70 4c 65 66 74 2d 3e  rse, op, pLeft->
7d90: 70 45 78 70 72 2c 20 70 52 69 67 68 74 2d 3e 70  pExpr, pRight->p
7da0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 70 4f  Expr, 0);.    pO
7db0: 75 74 2d 3e 7a 53 74 61 72 74 20 3d 20 70 4c 65  ut->zStart = pLe
7dc0: 66 74 2d 3e 7a 53 74 61 72 74 3b 0a 20 20 20 20  ft->zStart;.    
7dd0: 70 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 70 52 69  pOut->zEnd = pRi
7de0: 67 68 74 2d 3e 7a 45 6e 64 3b 0a 20 20 7d 0a 7d  ght->zEnd;.  }.}
7df0: 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  ..expr(A) ::= ex
7e00: 70 72 28 58 29 20 41 4e 44 28 4f 50 29 20 65 78  pr(X) AND(OP) ex
7e10: 70 72 28 59 29 2e 20 20 20 20 7b 73 70 61 6e 42  pr(Y).    {spanB
7e20: 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50 61  inaryExpr(&A,pPa
7e30: 72 73 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d  rse,@OP,&X,&Y);}
7e40: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
7e50: 72 28 58 29 20 4f 52 28 4f 50 29 20 65 78 70 72  r(X) OR(OP) expr
7e60: 28 59 29 2e 20 20 20 20 20 7b 73 70 61 6e 42 69  (Y).     {spanBi
7e70: 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50 61 72  naryExpr(&A,pPar
7e80: 73 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a  se,@OP,&X,&Y);}.
7e90: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
7ea0: 28 58 29 20 4c 54 7c 47 54 7c 47 45 7c 4c 45 28  (X) LT|GT|GE|LE(
7eb0: 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20 20 20  OP) expr(Y)..   
7ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ee0: 20 20 20 20 20 7b 73 70 61 6e 42 69 6e 61 72 79       {spanBinary
7ef0: 45 78 70 72 28 26 41 2c 70 50 61 72 73 65 2c 40  Expr(&A,pParse,@
7f00: 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 65 78 70 72  OP,&X,&Y);}.expr
7f10: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
7f20: 45 51 7c 4e 45 28 4f 50 29 20 65 78 70 72 28 59  EQ|NE(OP) expr(Y
7f30: 29 2e 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45  ).  {spanBinaryE
7f40: 78 70 72 28 26 41 2c 70 50 61 72 73 65 2c 40 4f  xpr(&A,pParse,@O
7f50: 50 2c 26 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28  P,&X,&Y);}.expr(
7f60: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 42  A) ::= expr(X) B
7f70: 49 54 41 4e 44 7c 42 49 54 4f 52 7c 4c 53 48 49  ITAND|BITOR|LSHI
7f80: 46 54 7c 52 53 48 49 46 54 28 4f 50 29 20 65 78  FT|RSHIFT(OP) ex
7f90: 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20  pr(Y)..         
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
7fc0: 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26  spanBinaryExpr(&
7fd0: 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c  A,pParse,@OP,&X,
7fe0: 26 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  &Y);}.expr(A) ::
7ff0: 3d 20 65 78 70 72 28 58 29 20 50 4c 55 53 7c 4d  = expr(X) PLUS|M
8000: 49 4e 55 53 28 4f 50 29 20 65 78 70 72 28 59 29  INUS(OP) expr(Y)
8010: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
8020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8030: 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 42            {spanB
8040: 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50 61  inaryExpr(&A,pPa
8050: 72 73 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d  rse,@OP,&X,&Y);}
8060: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
8070: 72 28 58 29 20 53 54 41 52 7c 53 4c 41 53 48 7c  r(X) STAR|SLASH|
8080: 52 45 4d 28 4f 50 29 20 65 78 70 72 28 59 29 2e  REM(OP) expr(Y).
8090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 42 69           {spanBi
80c0: 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50 61 72  naryExpr(&A,pPar
80d0: 73 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a  se,@OP,&X,&Y);}.
80e0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
80f0: 28 58 29 20 43 4f 4e 43 41 54 28 4f 50 29 20 65  (X) CONCAT(OP) e
8100: 78 70 72 28 59 29 2e 20 7b 73 70 61 6e 42 69 6e  xpr(Y). {spanBin
8110: 61 72 79 45 78 70 72 28 26 41 2c 70 50 61 72 73  aryExpr(&A,pPars
8120: 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 25  e,@OP,&X,&Y);}.%
8130: 74 79 70 65 20 6c 69 6b 65 6f 70 20 7b 73 74 72  type likeop {str
8140: 75 63 74 20 4c 69 6b 65 4f 70 7d 0a 6c 69 6b 65  uct LikeOp}.like
8150: 6f 70 28 41 29 20 3a 3a 3d 20 4c 49 4b 45 5f 4b  op(A) ::= LIKE_K
8160: 57 7c 4d 41 54 43 48 28 58 29 2e 20 20 20 20 20  W|MATCH(X).     
8170: 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20 58  {A.eOperator = X
8180: 3b 20 41 2e 62 4e 6f 74 20 3d 20 30 3b 7d 0a 6c  ; A.bNot = 0;}.l
8190: 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54  ikeop(A) ::= NOT
81a0: 20 4c 49 4b 45 5f 4b 57 7c 4d 41 54 43 48 28 58   LIKE_KW|MATCH(X
81b0: 29 2e 20 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20  ). {A.eOperator 
81c0: 3d 20 58 3b 20 41 2e 62 4e 6f 74 20 3d 20 31 3b  = X; A.bNot = 1;
81d0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
81e0: 70 72 28 58 29 20 6c 69 6b 65 6f 70 28 4f 50 29  pr(X) likeop(OP)
81f0: 20 65 78 70 72 28 59 29 2e 20 20 5b 4c 49 4b 45   expr(Y).  [LIKE
8200: 5f 4b 57 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69  _KW]  {.  ExprLi
8210: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69  st *pList;.  pLi
8220: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
8230: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
8240: 65 2c 30 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20  e,0, Y.pExpr);. 
8250: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
8260: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
8270: 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 58 2e 70  Parse,pList, X.p
8280: 45 78 70 72 29 3b 0a 20 20 41 2e 70 45 78 70 72  Expr);.  A.pExpr
8290: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75   = sqlite3ExprFu
82a0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  nction(pParse, p
82b0: 4c 69 73 74 2c 20 26 4f 50 2e 65 4f 70 65 72 61  List, &OP.eOpera
82c0: 74 6f 72 29 3b 0a 20 20 69 66 28 20 4f 50 2e 62  tor);.  if( OP.b
82d0: 4e 6f 74 20 29 20 41 2e 70 45 78 70 72 20 3d 20  Not ) A.pExpr = 
82e0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
82f0: 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2e 70  rse, TK_NOT, A.p
8300: 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 41  Expr, 0, 0);.  A
8310: 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 53 74 61  .zStart = X.zSta
8320: 72 74 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 59  rt;.  A.zEnd = Y
8330: 2e 7a 45 6e 64 3b 0a 20 20 69 66 28 20 41 2e 70  .zEnd;.  if( A.p
8340: 45 78 70 72 20 29 20 41 2e 70 45 78 70 72 2d 3e  Expr ) A.pExpr->
8350: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 66 69  flags |= EP_Infi
8360: 78 46 75 6e 63 3b 0a 7d 0a 65 78 70 72 28 41 29  xFunc;.}.expr(A)
8370: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 6c 69 6b   ::= expr(X) lik
8380: 65 6f 70 28 4f 50 29 20 65 78 70 72 28 59 29 20  eop(OP) expr(Y) 
8390: 45 53 43 41 50 45 20 65 78 70 72 28 45 29 2e 20  ESCAPE expr(E). 
83a0: 20 5b 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20 20   [LIKE_KW]  {.  
83b0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
83c0: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  .  pList = sqlit
83d0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
83e0: 28 70 50 61 72 73 65 2c 30 2c 20 59 2e 70 45 78  (pParse,0, Y.pEx
83f0: 70 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  pr);.  pList = s
8400: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
8410: 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73  pend(pParse,pLis
8420: 74 2c 20 58 2e 70 45 78 70 72 29 3b 0a 20 20 70  t, X.pExpr);.  p
8430: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
8440: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
8450: 72 73 65 2c 70 4c 69 73 74 2c 20 45 2e 70 45 78  rse,pList, E.pEx
8460: 70 72 29 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d  pr);.  A.pExpr =
8470: 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63   sqlite3ExprFunc
8480: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 4c 69  tion(pParse, pLi
8490: 73 74 2c 20 26 4f 50 2e 65 4f 70 65 72 61 74 6f  st, &OP.eOperato
84a0: 72 29 3b 0a 20 20 69 66 28 20 4f 50 2e 62 4e 6f  r);.  if( OP.bNo
84b0: 74 20 29 20 41 2e 70 45 78 70 72 20 3d 20 73 71  t ) A.pExpr = sq
84c0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
84d0: 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2e 70 45 78  e, TK_NOT, A.pEx
84e0: 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 41 2e 7a  pr, 0, 0);.  A.z
84f0: 53 74 61 72 74 20 3d 20 58 2e 7a 53 74 61 72 74  Start = X.zStart
8500: 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 45 2e 7a  ;.  A.zEnd = E.z
8510: 45 6e 64 3b 0a 20 20 69 66 28 20 41 2e 70 45 78  End;.  if( A.pEx
8520: 70 72 20 29 20 41 2e 70 45 78 70 72 2d 3e 66 6c  pr ) A.pExpr->fl
8530: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 66 69 78 46  ags |= EP_InfixF
8540: 75 6e 63 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 64 65  unc;.}..%include
8550: 20 7b 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63   {.  /* Construc
8560: 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  t an expression 
8570: 6e 6f 64 65 20 66 6f 72 20 61 20 75 6e 61 72 79  node for a unary
8580: 20 70 6f 73 74 66 69 78 20 6f 70 65 72 61 74 6f   postfix operato
8590: 72 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  r.  */.  static 
85a0: 76 6f 69 64 20 73 70 61 6e 55 6e 61 72 79 50 6f  void spanUnaryPo
85b0: 73 74 66 69 78 28 0a 20 20 20 20 45 78 70 72 53  stfix(.    ExprS
85c0: 70 61 6e 20 2a 70 4f 75 74 2c 20 20 20 20 20 20  pan *pOut,      
85d0: 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
85e0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
85f0: 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 50  de here */.    P
8600: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8610: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
8620: 20 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 63 6f   context to reco
8630: 72 64 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  rd errors */.   
8640: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
8650: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
8660: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
8670: 78 70 72 53 70 61 6e 20 2a 70 4f 70 65 72 61 6e  xprSpan *pOperan
8680: 64 2c 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65  d,    /* The ope
8690: 72 61 6e 64 20 2a 2f 0a 20 20 20 20 54 6f 6b 65  rand */.    Toke
86a0: 6e 20 2a 70 50 6f 73 74 4f 70 20 20 20 20 20 20  n *pPostOp      
86b0: 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 6e     /* The operan
86c0: 64 20 74 6f 6b 65 6e 20 66 6f 72 20 73 65 74 74  d token for sett
86d0: 69 6e 67 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a  ing the span */.
86e0: 20 20 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 70    ){.    pOut->p
86f0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
8700: 78 70 72 28 70 50 61 72 73 65 2c 20 6f 70 2c 20  xpr(pParse, op, 
8710: 70 4f 70 65 72 61 6e 64 2d 3e 70 45 78 70 72 2c  pOperand->pExpr,
8720: 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 4f 75 74   0, 0);.    pOut
8730: 2d 3e 7a 53 74 61 72 74 20 3d 20 70 4f 70 65 72  ->zStart = pOper
8740: 61 6e 64 2d 3e 7a 53 74 61 72 74 3b 0a 20 20 20  and->zStart;.   
8750: 20 70 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 26 70   pOut->zEnd = &p
8760: 50 6f 73 74 4f 70 2d 3e 7a 5b 70 50 6f 73 74 4f  PostOp->z[pPostO
8770: 70 2d 3e 6e 5d 3b 0a 20 20 7d 20 20 20 20 20 20  p->n];.  }      
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 20 20 0a 7d 0a 0a 65 78 70 72 28 41 29       .}..expr(A)
87a0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 53 4e   ::= expr(X) ISN
87b0: 55 4c 4c 7c 4e 4f 54 4e 55 4c 4c 28 45 29 2e 20  ULL|NOTNULL(E). 
87c0: 20 20 7b 73 70 61 6e 55 6e 61 72 79 50 6f 73 74    {spanUnaryPost
87d0: 66 69 78 28 26 41 2c 70 50 61 72 73 65 2c 40 45  fix(&A,pParse,@E
87e0: 2c 26 58 2c 26 45 29 3b 7d 0a 65 78 70 72 28 41  ,&X,&E);}.expr(A
87f0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f  ) ::= expr(X) NO
8800: 54 20 4e 55 4c 4c 28 45 29 2e 20 7b 73 70 61 6e  T NULL(E). {span
8810: 55 6e 61 72 79 50 6f 73 74 66 69 78 28 26 41 2c  UnaryPostfix(&A,
8820: 70 50 61 72 73 65 2c 54 4b 5f 4e 4f 54 4e 55 4c  pParse,TK_NOTNUL
8830: 4c 2c 26 58 2c 26 45 29 3b 7d 0a 0a 25 69 6e 63  L,&X,&E);}..%inc
8840: 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 41 20 72 6f  lude {.  /* A ro
8850: 75 74 69 6e 65 20 74 6f 20 63 6f 6e 76 65 72 74  utine to convert
8860: 20 61 20 62 69 6e 61 72 79 20 54 4b 5f 49 53 20   a binary TK_IS 
8870: 6f 72 20 54 4b 5f 49 53 4e 4f 54 20 65 78 70 72  or TK_ISNOT expr
8880: 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 0a 20 20  ession into a.  
8890: 2a 2a 20 75 6e 61 72 79 20 54 4b 5f 49 53 4e 55  ** unary TK_ISNU
88a0: 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e 55 4c 4c  LL or TK_NOTNULL
88b0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a   expression. */.
88c0: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 62 69    static void bi
88d0: 6e 61 72 79 54 6f 55 6e 61 72 79 49 66 4e 75 6c  naryToUnaryIfNul
88e0: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
88f0: 20 45 78 70 72 20 2a 70 59 2c 20 45 78 70 72 20   Expr *pY, Expr 
8900: 2a 70 41 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20  *pA, int op){.  
8910: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
8920: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
8930: 69 66 28 20 70 59 20 26 26 20 70 41 20 26 26 20  if( pY && pA && 
8940: 70 59 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20  pY->op==TK_NULL 
8950: 29 7b 0a 20 20 20 20 20 20 70 41 2d 3e 6f 70 20  ){.      pA->op 
8960: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20  = (u8)op;.      
8970: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8980: 65 28 64 62 2c 20 70 41 2d 3e 70 52 69 67 68 74  e(db, pA->pRight
8990: 29 3b 0a 20 20 20 20 20 20 70 41 2d 3e 70 52 69  );.      pA->pRi
89a0: 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ght = 0;.    }. 
89b0: 20 7d 0a 7d 0a 0a 2f 2f 20 20 20 20 65 78 70 72   }.}..//    expr
89c0: 31 20 49 53 20 65 78 70 72 32 0a 2f 2f 20 20 20  1 IS expr2.//   
89d0: 20 65 78 70 72 31 20 49 53 20 4e 4f 54 20 65 78   expr1 IS NOT ex
89e0: 70 72 32 0a 2f 2f 0a 2f 2f 20 49 66 20 65 78 70  pr2.//.// If exp
89f0: 72 32 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  r2 is NULL then 
8a00: 63 6f 64 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c  code as TK_ISNUL
8a10: 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2e  L or TK_NOTNULL.
8a20: 20 20 49 66 20 65 78 70 72 32 0a 2f 2f 20 69 73    If expr2.// is
8a30: 20 61 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65   any other expre
8a40: 73 73 69 6f 6e 2c 20 63 6f 64 65 20 61 73 20 54  ssion, code as T
8a50: 4b 5f 49 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54  K_IS or TK_ISNOT
8a60: 2e 0a 2f 2f 20 0a 65 78 70 72 28 41 29 20 3a 3a  ..// .expr(A) ::
8a70: 3d 20 65 78 70 72 28 58 29 20 49 53 20 65 78 70  = expr(X) IS exp
8a80: 72 28 59 29 2e 20 20 20 20 20 7b 0a 20 20 73 70  r(Y).     {.  sp
8a90: 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c  anBinaryExpr(&A,
8aa0: 70 50 61 72 73 65 2c 54 4b 5f 49 53 2c 26 58 2c  pParse,TK_IS,&X,
8ab0: 26 59 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55  &Y);.  binaryToU
8ac0: 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73  naryIfNull(pPars
8ad0: 65 2c 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 45  e, Y.pExpr, A.pE
8ae0: 78 70 72 2c 20 54 4b 5f 49 53 4e 55 4c 4c 29 3b  xpr, TK_ISNULL);
8af0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .}.expr(A) ::= e
8b00: 78 70 72 28 58 29 20 49 53 20 4e 4f 54 20 65 78  xpr(X) IS NOT ex
8b10: 70 72 28 59 29 2e 20 7b 0a 20 20 73 70 61 6e 42  pr(Y). {.  spanB
8b20: 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50 61  inaryExpr(&A,pPa
8b30: 72 73 65 2c 54 4b 5f 49 53 4e 4f 54 2c 26 58 2c  rse,TK_ISNOT,&X,
8b40: 26 59 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55  &Y);.  binaryToU
8b50: 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73  naryIfNull(pPars
8b60: 65 2c 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 45  e, Y.pExpr, A.pE
8b70: 78 70 72 2c 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29  xpr, TK_NOTNULL)
8b80: 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a  ;.}..%include {.
8b90: 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61    /* Construct a
8ba0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  n expression nod
8bb0: 65 20 66 6f 72 20 61 20 75 6e 61 72 79 20 70 72  e for a unary pr
8bc0: 65 66 69 78 20 6f 70 65 72 61 74 6f 72 0a 20 20  efix operator.  
8bd0: 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  */.  static void
8be0: 20 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78   spanUnaryPrefix
8bf0: 28 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a  (.    ExprSpan *
8c00: 70 4f 75 74 2c 20 20 20 20 20 20 20 20 2f 2a 20  pOut,        /* 
8c10: 57 72 69 74 65 20 74 68 65 20 6e 65 77 20 65 78  Write the new ex
8c20: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 68 65  pression node he
8c30: 72 65 20 2a 2f 0a 20 20 20 20 50 61 72 73 65 20  re */.    Parse 
8c40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8c50: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
8c60: 65 78 74 20 74 6f 20 72 65 63 6f 72 64 20 65 72  ext to record er
8c70: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rors */.    int 
8c80: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
8c90: 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74     /* The operat
8ca0: 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 70  or */.    ExprSp
8cb0: 61 6e 20 2a 70 4f 70 65 72 61 6e 64 2c 20 20 20  an *pOperand,   
8cc0: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 6e 64 20   /* The operand 
8cd0: 2a 2f 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50  */.    Token *pP
8ce0: 72 65 4f 70 20 20 20 20 20 20 20 20 20 2f 2a 20  reOp         /* 
8cf0: 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65  The operand toke
8d00: 6e 20 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68  n for setting th
8d10: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20  e span */.  ){. 
8d20: 20 20 20 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d     pOut->pExpr =
8d30: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
8d40: 61 72 73 65 2c 20 6f 70 2c 20 70 4f 70 65 72 61  arse, op, pOpera
8d50: 6e 64 2d 3e 70 45 78 70 72 2c 20 30 2c 20 30 29  nd->pExpr, 0, 0)
8d60: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53 74 61  ;.    pOut->zSta
8d70: 72 74 20 3d 20 70 50 72 65 4f 70 2d 3e 7a 3b 0a  rt = pPreOp->z;.
8d80: 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64 20 3d      pOut->zEnd =
8d90: 20 70 4f 70 65 72 61 6e 64 2d 3e 7a 45 6e 64 3b   pOperand->zEnd;
8da0: 0a 20 20 7d 0a 7d 0a 0a 0a 0a 65 78 70 72 28 41  .  }.}....expr(A
8db0: 29 20 3a 3a 3d 20 4e 4f 54 28 42 29 20 65 78 70  ) ::= NOT(B) exp
8dc0: 72 28 58 29 2e 20 20 20 20 7b 73 70 61 6e 55 6e  r(X).    {spanUn
8dd0: 61 72 79 50 72 65 66 69 78 28 26 41 2c 70 50 61  aryPrefix(&A,pPa
8de0: 72 73 65 2c 40 42 2c 26 58 2c 26 42 29 3b 7d 0a  rse,@B,&X,&B);}.
8df0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 42 49 54 4e  expr(A) ::= BITN
8e00: 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e 20 7b  OT(B) expr(X). {
8e10: 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28  spanUnaryPrefix(
8e20: 26 41 2c 70 50 61 72 73 65 2c 40 42 2c 26 58 2c  &A,pParse,@B,&X,
8e30: 26 42 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a  &B);}.expr(A) ::
8e40: 3d 20 4d 49 4e 55 53 28 42 29 20 65 78 70 72 28  = MINUS(B) expr(
8e50: 58 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20  X). [BITNOT].   
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e70: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61              {spa
8e80: 6e 55 6e 61 72 79 50 72 65 66 69 78 28 26 41 2c  nUnaryPrefix(&A,
8e90: 70 50 61 72 73 65 2c 54 4b 5f 55 4d 49 4e 55 53  pParse,TK_UMINUS
8ea0: 2c 26 58 2c 26 42 29 3b 7d 0a 65 78 70 72 28 41  ,&X,&B);}.expr(A
8eb0: 29 20 3a 3a 3d 20 50 4c 55 53 28 42 29 20 65 78  ) ::= PLUS(B) ex
8ec0: 70 72 28 58 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a  pr(X). [BITNOT].
8ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
8ef0: 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28  spanUnaryPrefix(
8f00: 26 41 2c 70 50 61 72 73 65 2c 54 4b 5f 55 50 4c  &A,pParse,TK_UPL
8f10: 55 53 2c 26 58 2c 26 42 29 3b 7d 0a 0a 25 74 79  US,&X,&B);}..%ty
8f20: 70 65 20 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69  pe between_op {i
8f30: 6e 74 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41  nt}.between_op(A
8f40: 29 20 3a 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20  ) ::= BETWEEN.  
8f50: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77     {A = 0;}.betw
8f60: 65 65 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f  een_op(A) ::= NO
8f70: 54 20 42 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20  T BETWEEN. {A = 
8f80: 31 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  1;}.expr(A) ::= 
8f90: 65 78 70 72 28 57 29 20 62 65 74 77 65 65 6e 5f  expr(W) between_
8fa0: 6f 70 28 4e 29 20 65 78 70 72 28 58 29 20 41 4e  op(N) expr(X) AN
8fb0: 44 20 65 78 70 72 28 59 29 2e 20 5b 42 45 54 57  D expr(Y). [BETW
8fc0: 45 45 4e 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73  EEN] {.  ExprLis
8fd0: 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  t *pList = sqlit
8fe0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
8ff0: 28 70 50 61 72 73 65 2c 30 2c 20 58 2e 70 45 78  (pParse,0, X.pEx
9000: 70 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  pr);.  pList = s
9010: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
9020: 70 65 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73  pend(pParse,pLis
9030: 74 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 41  t, Y.pExpr);.  A
9040: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
9050: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
9060: 5f 42 45 54 57 45 45 4e 2c 20 57 2e 70 45 78 70  _BETWEEN, W.pExp
9070: 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  r, 0, 0);.  if( 
9080: 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 41  A.pExpr ){.    A
9090: 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20  .pExpr->x.pList 
90a0: 3d 20 70 4c 69 73 74 3b 0a 20 20 7d 65 6c 73 65  = pList;.  }else
90b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
90c0: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72  rListDelete(pPar
90d0: 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a  se->db, pList);.
90e0: 20 20 7d 20 0a 20 20 69 66 28 20 4e 20 29 20 41    } .  if( N ) A
90f0: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
9100: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
9110: 5f 4e 4f 54 2c 20 41 2e 70 45 78 70 72 2c 20 30  _NOT, A.pExpr, 0
9120: 2c 20 30 29 3b 0a 20 20 41 2e 7a 53 74 61 72 74  , 0);.  A.zStart
9130: 20 3d 20 57 2e 7a 53 74 61 72 74 3b 0a 20 20 41   = W.zStart;.  A
9140: 2e 7a 45 6e 64 20 3d 20 59 2e 7a 45 6e 64 3b 0a  .zEnd = Y.zEnd;.
9150: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
9160: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
9170: 20 25 74 79 70 65 20 69 6e 5f 6f 70 20 7b 69 6e   %type in_op {in
9180: 74 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a  t}.  in_op(A) ::
9190: 3d 20 49 4e 2e 20 20 20 20 20 20 7b 41 20 3d 20  = IN.      {A = 
91a0: 30 3b 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a  0;}.  in_op(A) :
91b0: 3a 3d 20 4e 4f 54 20 49 4e 2e 20 20 7b 41 20 3d  := NOT IN.  {A =
91c0: 20 31 3b 7d 0a 20 20 65 78 70 72 28 41 29 20 3a   1;}.  expr(A) :
91d0: 3a 3d 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70  := expr(X) in_op
91e0: 28 4e 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28  (N) LP exprlist(
91f0: 59 29 20 52 50 28 45 29 2e 20 5b 49 4e 5d 20 7b  Y) RP(E). [IN] {
9200: 0a 20 20 20 20 69 66 28 20 59 3d 3d 30 20 29 7b  .    if( Y==0 ){
9210: 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
9220: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
9230: 6d 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  m.      **.     
9240: 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31 20 49   **      expr1 I
9250: 4e 20 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  N ().      **   
9260: 20 20 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20     expr1 NOT IN 
9270: 28 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  ().      **.    
9280: 20 20 2a 2a 20 73 69 6d 70 6c 69 66 79 20 74 6f    ** simplify to
9290: 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 28 66 61   constants 0 (fa
92a0: 6c 73 65 29 20 61 6e 64 20 31 20 28 74 72 75 65  lse) and 1 (true
92b0: 29 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c  ), respectively,
92c0: 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 61 72 64  .      ** regard
92d0: 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75  less of the valu
92e0: 65 20 6f 66 20 65 78 70 72 31 2e 0a 20 20 20 20  e of expr1..    
92f0: 20 20 2a 2f 0a 20 20 20 20 20 20 41 2e 70 45 78    */.      A.pEx
9300: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9310: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54  r(pParse, TK_INT
9320: 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 73 71 6c  EGER, 0, 0, &sql
9330: 69 74 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 4e 5d  ite3IntTokens[N]
9340: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9350: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
9360: 65 2d 3e 64 62 2c 20 58 2e 70 45 78 70 72 29 3b  e->db, X.pExpr);
9370: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 59  .    }else if( Y
9380: 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20  ->nExpr==1 ){.  
9390: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
93a0: 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  ns of the form:.
93b0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
93c0: 2a 20 20 20 20 20 20 65 78 70 72 31 20 49 4e 20  *      expr1 IN 
93d0: 28 3f 31 29 0a 20 20 20 20 20 20 2a 2a 20 20 20  (?1).      **   
93e0: 20 20 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20     expr1 NOT IN 
93f0: 28 3f 32 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20  (?2).      **.  
9400: 20 20 20 20 2a 2a 20 77 69 74 68 20 65 78 61 63      ** with exac
9410: 74 6c 79 20 6f 6e 65 20 76 61 6c 75 65 20 6f 6e  tly one value on
9420: 20 74 68 65 20 52 48 53 20 63 61 6e 20 62 65 20   the RHS can be 
9430: 73 69 6d 70 6c 69 66 69 65 64 20 74 6f 20 73 6f  simplified to so
9440: 6d 65 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a  mething.      **
9450: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
9460: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
9470: 20 20 20 65 78 70 72 31 20 3d 3d 20 3f 31 0a 20     expr1 == ?1. 
9480: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70       **      exp
9490: 72 31 20 3c 3e 20 3f 32 0a 20 20 20 20 20 20 2a  r1 <> ?2.      *
94a0: 2a 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 2c 20  *.      ** But, 
94b0: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 3d  the RHS of the =
94c0: 3d 20 6f 72 20 3c 3e 20 69 73 20 6d 61 72 6b 65  = or <> is marke
94d0: 64 20 77 69 74 68 20 74 68 65 20 45 50 5f 47 65  d with the EP_Ge
94e0: 6e 65 72 69 63 20 66 6c 61 67 0a 20 20 20 20 20  neric flag.     
94f0: 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d   ** so that it m
9500: 61 79 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  ay not contribut
9510: 65 20 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 61  e to the computa
9520: 74 69 6f 6e 20 6f 66 20 63 6f 6d 70 61 72 69 73  tion of comparis
9530: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 66 66 69  on.      ** affi
9540: 6e 69 74 79 20 6f 72 20 74 68 65 20 63 6f 6c 6c  nity or the coll
9550: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74  ating sequence t
9560: 6f 20 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72  o use for compar
9570: 69 73 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65  ison.  Otherwise
9580: 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  ,.      ** the s
9590: 65 6d 61 6e 74 69 63 73 20 77 6f 75 6c 64 20 62  emantics would b
95a0: 65 20 73 75 62 74 6c 79 20 64 69 66 66 65 72 65  e subtly differe
95b0: 6e 74 20 66 72 6f 6d 20 49 4e 20 6f 72 20 4e 4f  nt from IN or NO
95c0: 54 20 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  T IN..      */. 
95d0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 48 53 20       Expr *pRHS 
95e0: 3d 20 59 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  = Y->a[0].pExpr;
95f0: 0a 20 20 20 20 20 20 59 2d 3e 61 5b 30 5d 2e 70  .      Y->a[0].p
9600: 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  Expr = 0;.      
9610: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
9620: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
9630: 2c 20 59 29 3b 0a 20 20 20 20 20 20 2f 2a 20 70  , Y);.      /* p
9640: 52 48 53 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  RHS cannot be NU
9650: 4c 4c 20 62 65 63 61 75 73 65 20 61 20 6d 61 6c  LL because a mal
9660: 6c 6f 63 20 65 72 72 6f 72 20 77 6f 75 6c 64 20  loc error would 
9670: 68 61 76 65 20 62 65 65 6e 20 64 65 74 65 63 74  have been detect
9680: 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 65 66 6f  ed.      ** befo
9690: 72 65 20 6e 6f 77 20 61 6e 64 20 63 6f 6e 74 72  re now and contr
96a0: 6f 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 6e 65  ol would have ne
96b0: 76 65 72 20 72 65 61 63 68 65 64 20 74 68 69 73  ver reached this
96c0: 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
96d0: 69 66 28 20 41 4c 57 41 59 53 28 70 52 48 53 29  if( ALWAYS(pRHS)
96e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 52 48 53   ){.        pRHS
96f0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43  ->flags &= ~EP_C
9700: 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20  ollate;.        
9710: 70 52 48 53 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pRHS->flags |= E
9720: 50 5f 47 65 6e 65 72 69 63 3b 0a 20 20 20 20 20  P_Generic;.     
9730: 20 7d 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72   }.      A.pExpr
9740: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
9750: 70 50 61 72 73 65 2c 20 4e 20 3f 20 54 4b 5f 4e  pParse, N ? TK_N
9760: 45 20 3a 20 54 4b 5f 45 51 2c 20 58 2e 70 45 78  E : TK_EQ, X.pEx
9770: 70 72 2c 20 70 52 48 53 2c 20 30 29 3b 0a 20 20  pr, pRHS, 0);.  
9780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41    }else{.      A
9790: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
97a0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
97b0: 5f 49 4e 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c  _IN, X.pExpr, 0,
97c0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41   0);.      if( A
97d0: 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  .pExpr ){.      
97e0: 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69    A.pExpr->x.pLi
97f0: 73 74 20 3d 20 59 3b 0a 20 20 20 20 20 20 20 20  st = Y;.        
9800: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
9810: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
9820: 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20  rse, A.pExpr);. 
9830: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9840: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
9850: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
9860: 2d 3e 64 62 2c 20 59 29 3b 0a 20 20 20 20 20 20  ->db, Y);.      
9870: 7d 0a 20 20 20 20 20 20 69 66 28 20 4e 20 29 20  }.      if( N ) 
9880: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
9890: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
98a0: 4b 5f 4e 4f 54 2c 20 41 2e 70 45 78 70 72 2c 20  K_NOT, A.pExpr, 
98b0: 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
98c0: 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 53   A.zStart = X.zS
98d0: 74 61 72 74 3b 0a 20 20 20 20 41 2e 7a 45 6e 64  tart;.    A.zEnd
98e0: 20 3d 20 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a 20 20   = &E.z[E.n];.  
98f0: 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.  expr(A) ::= 
9900: 4c 50 28 42 29 20 73 65 6c 65 63 74 28 58 29 20  LP(B) select(X) 
9910: 52 50 28 45 29 2e 20 7b 0a 20 20 20 20 41 2e 70  RP(E). {.    A.p
9920: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
9930: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53  xpr(pParse, TK_S
9940: 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b  ELECT, 0, 0, 0);
9950: 0a 20 20 20 20 69 66 28 20 41 2e 70 45 78 70 72  .    if( A.pExpr
9960: 20 29 7b 0a 20 20 20 20 20 20 41 2e 70 45 78 70   ){.      A.pExp
9970: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 58  r->x.pSelect = X
9980: 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 50  ;.      ExprSetP
9990: 72 6f 70 65 72 74 79 28 41 2e 70 45 78 70 72 2c  roperty(A.pExpr,
99a0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50   EP_xIsSelect|EP
99b0: 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  _Subquery);.    
99c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
99d0: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70  HeightAndFlags(p
99e0: 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b  Parse, A.pExpr);
99f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9a00: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
9a10: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
9a20: 2c 20 58 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , X);.    }.    
9a30: 41 2e 7a 53 74 61 72 74 20 3d 20 42 2e 7a 3b 0a  A.zStart = B.z;.
9a40: 20 20 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e      A.zEnd = &E.
9a50: 7a 5b 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78  z[E.n];.  }.  ex
9a60: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
9a70: 29 20 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 73 65  ) in_op(N) LP se
9a80: 6c 65 63 74 28 59 29 20 52 50 28 45 29 2e 20 20  lect(Y) RP(E).  
9a90: 5b 49 4e 5d 20 7b 0a 20 20 20 20 41 2e 70 45 78  [IN] {.    A.pEx
9aa0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9ab0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c  r(pParse, TK_IN,
9ac0: 20 58 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b   X.pExpr, 0, 0);
9ad0: 0a 20 20 20 20 69 66 28 20 41 2e 70 45 78 70 72  .    if( A.pExpr
9ae0: 20 29 7b 0a 20 20 20 20 20 20 41 2e 70 45 78 70   ){.      A.pExp
9af0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 59  r->x.pSelect = Y
9b00: 3b 0a 20 20 20 20 20 20 45 78 70 72 53 65 74 50  ;.      ExprSetP
9b10: 72 6f 70 65 72 74 79 28 41 2e 70 45 78 70 72 2c  roperty(A.pExpr,
9b20: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50   EP_xIsSelect|EP
9b30: 5f 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  _Subquery);.    
9b40: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74    sqlite3ExprSet
9b50: 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70  HeightAndFlags(p
9b60: 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b  Parse, A.pExpr);
9b70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9b80: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
9b90: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
9ba0: 2c 20 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , Y);.    }.    
9bb0: 69 66 28 20 4e 20 29 20 41 2e 70 45 78 70 72 20  if( N ) A.pExpr 
9bc0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9bd0: 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41  Parse, TK_NOT, A
9be0: 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20  .pExpr, 0, 0);. 
9bf0: 20 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e     A.zStart = X.
9c00: 7a 53 74 61 72 74 3b 0a 20 20 20 20 41 2e 7a 45  zStart;.    A.zE
9c10: 6e 64 20 3d 20 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a  nd = &E.z[E.n];.
9c20: 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a    }.  expr(A) ::
9c30: 3d 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70 28  = expr(X) in_op(
9c40: 4e 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29  N) nm(Y) dbnm(Z)
9c50: 2e 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 53 72 63  . [IN] {.    Src
9c60: 4c 69 73 74 20 2a 70 53 72 63 20 3d 20 73 71 6c  List *pSrc = sql
9c70: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
9c80: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c  d(pParse->db, 0,
9c90: 26 59 2c 26 5a 29 3b 0a 20 20 20 20 41 2e 70 45  &Y,&Z);.    A.pE
9ca0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
9cb0: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
9cc0: 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c 20 30 29  , X.pExpr, 0, 0)
9cd0: 3b 0a 20 20 20 20 69 66 28 20 41 2e 70 45 78 70  ;.    if( A.pExp
9ce0: 72 20 29 7b 0a 20 20 20 20 20 20 41 2e 70 45 78  r ){.      A.pEx
9cf0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20  pr->x.pSelect = 
9d00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
9d10: 28 70 50 61 72 73 65 2c 20 30 2c 70 53 72 63 2c  (pParse, 0,pSrc,
9d20: 30 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a  0,0,0,0,0,0,0);.
9d30: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
9d40: 70 65 72 74 79 28 41 2e 70 45 78 70 72 2c 20 45  perty(A.pExpr, E
9d50: 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53  P_xIsSelect|EP_S
9d60: 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 20 20  ubquery);.      
9d70: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
9d80: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
9d90: 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20  rse, A.pExpr);. 
9da0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9db0: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
9dc0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9dd0: 20 70 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20   pSrc);.    }.  
9de0: 20 20 69 66 28 20 4e 20 29 20 41 2e 70 45 78 70    if( N ) A.pExp
9df0: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
9e00: 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c  (pParse, TK_NOT,
9e10: 20 41 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b   A.pExpr, 0, 0);
9e20: 0a 20 20 20 20 41 2e 7a 53 74 61 72 74 20 3d 20  .    A.zStart = 
9e30: 58 2e 7a 53 74 61 72 74 3b 0a 20 20 20 20 41 2e  X.zStart;.    A.
9e40: 7a 45 6e 64 20 3d 20 5a 2e 7a 20 3f 20 26 5a 2e  zEnd = Z.z ? &Z.
9e50: 7a 5b 5a 2e 6e 5d 20 3a 20 26 59 2e 7a 5b 59 2e  z[Z.n] : &Y.z[Y.
9e60: 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41  n];.  }.  expr(A
9e70: 29 20 3a 3a 3d 20 45 58 49 53 54 53 28 42 29 20  ) ::= EXISTS(B) 
9e80: 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52 50 28  LP select(Y) RP(
9e90: 45 29 2e 20 7b 0a 20 20 20 20 45 78 70 72 20 2a  E). {.    Expr *
9ea0: 70 20 3d 20 41 2e 70 45 78 70 72 20 3d 20 73 71  p = A.pExpr = sq
9eb0: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
9ec0: 65 2c 20 54 4b 5f 45 58 49 53 54 53 2c 20 30 2c  e, TK_EXISTS, 0,
9ed0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
9ee0: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 78 2e  p ){.      p->x.
9ef0: 70 53 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 20  pSelect = Y;.   
9f00: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
9f10: 74 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65  ty(p, EP_xIsSele
9f20: 63 74 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b  ct|EP_Subquery);
9f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9f40: 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c  prSetHeightAndFl
9f50: 61 67 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a  ags(pParse, p);.
9f60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9f70: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
9f80: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
9f90: 20 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41   Y);.    }.    A
9fa0: 2e 7a 53 74 61 72 74 20 3d 20 42 2e 7a 3b 0a 20  .zStart = B.z;. 
9fb0: 20 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a     A.zEnd = &E.z
9fc0: 5b 45 2e 6e 5d 3b 0a 20 20 7d 0a 25 65 6e 64 69  [E.n];.  }.%endi
9fd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
9fe0: 42 51 55 45 52 59 0a 0a 2f 2a 20 43 41 53 45 20  BQUERY../* CASE 
9ff0: 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 65  expressions */.e
a000: 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53 45 28  xpr(A) ::= CASE(
a010: 43 29 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 28  C) case_operand(
a020: 58 29 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74  X) case_exprlist
a030: 28 59 29 20 63 61 73 65 5f 65 6c 73 65 28 5a 29  (Y) case_else(Z)
a040: 20 45 4e 44 28 45 29 2e 20 7b 0a 20 20 41 2e 70   END(E). {.  A.p
a050: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
a060: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43  xpr(pParse, TK_C
a070: 41 53 45 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20  ASE, X, 0, 0);. 
a080: 20 69 66 28 20 41 2e 70 45 78 70 72 20 29 7b 0a   if( A.pExpr ){.
a090: 20 20 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e 70      A.pExpr->x.p
a0a0: 4c 69 73 74 20 3d 20 5a 20 3f 20 73 71 6c 69 74  List = Z ? sqlit
a0b0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
a0c0: 28 70 50 61 72 73 65 2c 59 2c 5a 29 20 3a 20 59  (pParse,Y,Z) : Y
a0d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
a0e0: 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61  rSetHeightAndFla
a0f0: 67 73 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78  gs(pParse, A.pEx
a100: 70 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  pr);.  }else{.  
a110: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
a120: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
a130: 64 62 2c 20 59 29 3b 0a 20 20 20 20 73 71 6c 69  db, Y);.    sqli
a140: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 50  te3ExprDelete(pP
a150: 61 72 73 65 2d 3e 64 62 2c 20 5a 29 3b 0a 20 20  arse->db, Z);.  
a160: 7d 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 43  }.  A.zStart = C
a170: 2e 7a 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26  .z;.  A.zEnd = &
a180: 45 2e 7a 5b 45 2e 6e 5d 3b 0a 7d 0a 25 74 79 70  E.z[E.n];.}.%typ
a190: 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20  e case_exprlist 
a1a0: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73  {ExprList*}.%des
a1b0: 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70  tructor case_exp
a1c0: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
a1d0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
a1e0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63  rse->db, $$);}.c
a1f0: 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20  ase_exprlist(A) 
a200: 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c 69 73  ::= case_exprlis
a210: 74 28 58 29 20 57 48 45 4e 20 65 78 70 72 28 59  t(X) WHEN expr(Y
a220: 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20  ) THEN expr(Z). 
a230: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  {.  A = sqlite3E
a240: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a250: 61 72 73 65 2c 58 2c 20 59 2e 70 45 78 70 72 29  arse,X, Y.pExpr)
a260: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
a270: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
a280: 61 72 73 65 2c 41 2c 20 5a 2e 70 45 78 70 72 29  arse,A, Z.pExpr)
a290: 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73  ;.}.case_exprlis
a2a0: 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78  t(A) ::= WHEN ex
a2b0: 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28  pr(Y) THEN expr(
a2c0: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  Z). {.  A = sqli
a2d0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
a2e0: 64 28 70 50 61 72 73 65 2c 30 2c 20 59 2e 70 45  d(pParse,0, Y.pE
a2f0: 78 70 72 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69  xpr);.  A = sqli
a300: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
a310: 64 28 70 50 61 72 73 65 2c 41 2c 20 5a 2e 70 45  d(pParse,A, Z.pE
a320: 78 70 72 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61  xpr);.}.%type ca
a330: 73 65 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a  se_else {Expr*}.
a340: 25 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65  %destructor case
a350: 5f 65 6c 73 65 20 7b 73 71 6c 69 74 65 33 45 78  _else {sqlite3Ex
a360: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
a370: 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f  >db, $$);}.case_
a380: 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53  else(A) ::=  ELS
a390: 45 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20  E expr(X).      
a3a0: 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70 72 3b     {A = X.pExpr;
a3b0: 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a  }.case_else(A) :
a3c0: 3a 3d 20 20 2e 20 20 20 20 20 20 20 20 20 20 20  :=  .           
a3d0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
a3e0: 3b 7d 20 0a 25 74 79 70 65 20 63 61 73 65 5f 6f  ;} .%type case_o
a3f0: 70 65 72 61 6e 64 20 7b 45 78 70 72 2a 7d 0a 25  perand {Expr*}.%
a400: 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f  destructor case_
a410: 6f 70 65 72 61 6e 64 20 7b 73 71 6c 69 74 65 33  operand {sqlite3
a420: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73  ExprDelete(pPars
a430: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73  e->db, $$);}.cas
a440: 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d  e_operand(A) ::=
a450: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
a460: 20 20 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70       {A = X.pExp
a470: 72 3b 7d 20 0a 63 61 73 65 5f 6f 70 65 72 61 6e  r;} .case_operan
a480: 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  d(A) ::= .      
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
a4a0: 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65 20 65 78  = 0;} ..%type ex
a4b0: 70 72 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  prlist {ExprList
a4c0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65  *}.%destructor e
a4d0: 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  xprlist {sqlite3
a4e0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
a4f0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
a500: 0a 25 74 79 70 65 20 6e 65 78 70 72 6c 69 73 74  .%type nexprlist
a510: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
a520: 73 74 72 75 63 74 6f 72 20 6e 65 78 70 72 6c 69  structor nexprli
a530: 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c  st {sqlite3ExprL
a540: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
a550: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 65 78 70  ->db, $$);}..exp
a560: 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 65 78  rlist(A) ::= nex
a570: 70 72 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20  prlist(X).      
a580: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
a590: 3b 7d 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a  ;}.exprlist(A) :
a5a0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5c0: 7b 41 20 3d 20 30 3b 7d 0a 6e 65 78 70 72 6c 69  {A = 0;}.nexprli
a5d0: 73 74 28 41 29 20 3a 3a 3d 20 6e 65 78 70 72 6c  st(A) ::= nexprl
a5e0: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70  ist(X) COMMA exp
a5f0: 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  r(Y)..    {A = s
a600: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
a610: 70 65 6e 64 28 70 50 61 72 73 65 2c 58 2c 59 2e  pend(pParse,X,Y.
a620: 70 45 78 70 72 29 3b 7d 0a 6e 65 78 70 72 6c 69  pExpr);}.nexprli
a630: 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 59  st(A) ::= expr(Y
a640: 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  )..    {A = sqli
a650: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
a660: 64 28 70 50 61 72 73 65 2c 30 2c 59 2e 70 45 78  d(pParse,0,Y.pEx
a670: 70 72 29 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  pr);}...////////
a680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a690: 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45  ///// The CREATE
a6a0: 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f   INDEX command /
a6b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a6c0: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
a6d0: 3d 20 63 72 65 61 74 65 6b 77 28 53 29 20 75 6e  = createkw(S) un
a6e0: 69 71 75 65 66 6c 61 67 28 55 29 20 49 4e 44 45  iqueflag(U) INDE
a6f0: 58 20 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 45  X ifnotexists(NE
a700: 29 20 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29 0a  ) nm(X) dbnm(D).
a710: 20 20 20 20 20 20 20 20 4f 4e 20 6e 6d 28 59 29          ON nm(Y)
a720: 20 4c 50 20 69 64 78 6c 69 73 74 28 5a 29 20 52   LP idxlist(Z) R
a730: 50 20 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20  P where_opt(W). 
a740: 7b 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74  {.  sqlite3Creat
a750: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  eIndex(pParse, &
a760: 58 2c 20 26 44 2c 20 0a 20 20 20 20 20 20 20 20  X, &D, .        
a770: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a780: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
a790: 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26  d(pParse->db,0,&
a7a0: 59 2c 30 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20  Y,0), Z, U,.    
a7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a7c0: 20 20 26 53 2c 20 57 2c 20 53 51 4c 49 54 45 5f    &S, W, SQLITE_
a7d0: 53 4f 5f 41 53 43 2c 20 4e 45 29 3b 0a 7d 0a 0a  SO_ASC, NE);.}..
a7e0: 25 74 79 70 65 20 75 6e 69 71 75 65 66 6c 61 67  %type uniqueflag
a7f0: 20 7b 69 6e 74 7d 0a 75 6e 69 71 75 65 66 6c 61   {int}.uniquefla
a800: 67 28 41 29 20 3a 3a 3d 20 55 4e 49 51 55 45 2e  g(A) ::= UNIQUE.
a810: 20 20 7b 41 20 3d 20 4f 45 5f 41 62 6f 72 74 3b    {A = OE_Abort;
a820: 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20  }.uniqueflag(A) 
a830: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 7b 41 20  ::= .        {A 
a840: 3d 20 4f 45 5f 4e 6f 6e 65 3b 7d 0a 0a 25 74 79  = OE_None;}..%ty
a850: 70 65 20 69 64 78 6c 69 73 74 20 7b 45 78 70 72  pe idxlist {Expr
a860: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
a870: 6f 72 20 69 64 78 6c 69 73 74 20 7b 73 71 6c 69  or idxlist {sqli
a880: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
a890: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
a8a0: 29 3b 7d 0a 25 74 79 70 65 20 69 64 78 6c 69 73  );}.%type idxlis
a8b0: 74 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a  t_opt {ExprList*
a8c0: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69 64  }.%destructor id
a8d0: 78 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74  xlist_opt {sqlit
a8e0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
a8f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
a900: 3b 7d 0a 0a 69 64 78 6c 69 73 74 5f 6f 70 74 28  ;}..idxlist_opt(
a910: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 7b 41 20 3d 20 30 3b 7d 0a 69 64 78 6c 69 73   {A = 0;}.idxlis
a940: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20  t_opt(A) ::= LP 
a950: 69 64 78 6c 69 73 74 28 58 29 20 52 50 2e 20 20  idxlist(X) RP.  
a960: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
a970: 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69  idxlist(A) ::= i
a980: 64 78 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20  dxlist(X) COMMA 
a990: 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65 28 43 29  nm(Y) collate(C)
a9a0: 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 20   sortorder(Z).  
a9b0: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
a9c0: 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c  lite3ExprAddColl
a9d0: 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c  ateToken(pParse,
a9e0: 20 30 2c 20 26 43 29 3b 0a 20 20 41 20 3d 20 73   0, &C);.  A = s
a9f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
aa00: 70 65 6e 64 28 70 50 61 72 73 65 2c 58 2c 20 70  pend(pParse,X, p
aa10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
aa20: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
aa30: 73 65 2c 41 2c 26 59 2c 31 29 3b 0a 20 20 73 71  se,A,&Y,1);.  sq
aa40: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65  lite3ExprListChe
aa50: 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c  ckLength(pParse,
aa60: 20 41 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20   A, "index");.  
aa70: 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e  if( A ) A->a[A->
aa80: 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64  nExpr-1].sortOrd
aa90: 65 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 69 64  er = (u8)Z;.}.id
aaa0: 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28  xlist(A) ::= nm(
aab0: 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f  Y) collate(C) so
aac0: 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20  rtorder(Z). {.  
aad0: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
aae0: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54  3ExprAddCollateT
aaf0: 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  oken(pParse, 0, 
ab00: 26 43 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74  &C);.  A = sqlit
ab10: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
ab20: 28 70 50 61 72 73 65 2c 30 2c 20 70 29 3b 0a 20  (pParse,0, p);. 
ab30: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ab40: 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  SetName(pParse, 
ab50: 41 2c 20 26 59 2c 20 31 29 3b 0a 20 20 73 71 6c  A, &Y, 1);.  sql
ab60: 69 74 65 33 45 78 70 72 4c 69 73 74 43 68 65 63  ite3ExprListChec
ab70: 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65 2c 20  kLength(pParse, 
ab80: 41 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 69  A, "index");.  i
ab90: 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e  f( A ) A->a[A->n
aba0: 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72 64 65  Expr-1].sortOrde
abb0: 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 0a 25 74  r = (u8)Z;.}..%t
abc0: 79 70 65 20 63 6f 6c 6c 61 74 65 20 7b 54 6f 6b  ype collate {Tok
abd0: 65 6e 7d 0a 63 6f 6c 6c 61 74 65 28 43 29 20 3a  en}.collate(C) :
abe0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
abf0: 20 20 20 20 20 7b 43 2e 7a 20 3d 20 30 3b 20 43       {C.z = 0; C
ac00: 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c 6c 61 74 65  .n = 0;}.collate
ac10: 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c 41 54 45 20  (C) ::= COLLATE 
ac20: 69 64 73 28 58 29 2e 20 20 20 7b 43 20 3d 20 58  ids(X).   {C = X
ac30: 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}...///////////
ac40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ac50: 2f 2f 20 54 68 65 20 44 52 4f 50 20 49 4e 44 45  // The DROP INDE
ac60: 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  X command //////
ac70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ac80: 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44  ///.//.cmd ::= D
ac90: 52 4f 50 20 49 4e 44 45 58 20 69 66 65 78 69 73  ROP INDEX ifexis
aca0: 74 73 28 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58  ts(E) fullname(X
acb0: 29 2e 20 20 20 7b 73 71 6c 69 74 65 33 44 72 6f  ).   {sqlite3Dro
acc0: 70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 58  pIndex(pParse, X
acd0: 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  , E);}..////////
ace0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
acf0: 2f 2f 2f 2f 2f 20 54 68 65 20 56 41 43 55 55 4d  ///// The VACUUM
ad00: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
ad10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ad20: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65  //////.//.%ifnde
ad30: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
ad40: 43 55 55 4d 0a 25 69 66 6e 64 65 66 20 53 51 4c  CUUM.%ifndef SQL
ad50: 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a  ITE_OMIT_ATTACH.
ad60: 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d 2e 20  cmd ::= VACUUM. 
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
ad80: 73 71 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50  sqlite3Vacuum(pP
ad90: 61 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  arse);}.cmd ::= 
ada0: 56 41 43 55 55 4d 20 6e 6d 2e 20 20 20 20 20 20  VACUUM nm.      
adb0: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56         {sqlite3V
adc0: 61 63 75 75 6d 28 70 50 61 72 73 65 29 3b 7d 0a  acuum(pParse);}.
add0: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
ade0: 4d 49 54 5f 41 54 54 41 43 48 0a 25 65 6e 64 69  MIT_ATTACH.%endi
adf0: 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  f  SQLITE_OMIT_V
ae00: 41 43 55 55 4d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  ACUUM../////////
ae10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae20: 2f 2f 2f 2f 20 54 68 65 20 50 52 41 47 4d 41 20  //// The PRAGMA 
ae30: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f  command ////////
ae40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae50: 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e 64 65 66  /////.//.%ifndef
ae60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41   SQLITE_OMIT_PRA
ae70: 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  GMA.cmd ::= PRAG
ae80: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
ae90: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aea0: 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28   {sqlite3Pragma(
aeb0: 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 30 2c 30  pParse,&X,&Z,0,0
aec0: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47  );}.cmd ::= PRAG
aed0: 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a 29  MA nm(X) dbnm(Z)
aee0: 20 45 51 20 6e 6d 6e 75 6d 28 59 29 2e 20 20 20   EQ nmnum(Y).   
aef0: 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61 28   {sqlite3Pragma(
af00: 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59 2c  pParse,&X,&Z,&Y,
af10: 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  0);}.cmd ::= PRA
af20: 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28 5a  GMA nm(X) dbnm(Z
af30: 29 20 4c 50 20 6e 6d 6e 75 6d 28 59 29 20 52 50  ) LP nmnum(Y) RP
af40: 2e 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61  . {sqlite3Pragma
af50: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59  (pParse,&X,&Z,&Y
af60: 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52  ,0);}.cmd ::= PR
af70: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
af80: 5a 29 20 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28  Z) EQ minus_num(
af90: 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20  Y). .           
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67 6d 61    {sqlite3Pragma
afd0: 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c 26 59  (pParse,&X,&Z,&Y
afe0: 2c 31 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52  ,1);}.cmd ::= PR
aff0: 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e 6d 28  AGMA nm(X) dbnm(
b000: 5a 29 20 4c 50 20 6d 69 6e 75 73 5f 6e 75 6d 28  Z) LP minus_num(
b010: 59 29 20 52 50 2e 0a 20 20 20 20 20 20 20 20 20  Y) RP..         
b020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b040: 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61 67      {sqlite3Prag
b050: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a 2c  ma(pParse,&X,&Z,
b060: 26 59 2c 31 29 3b 7d 0a 0a 6e 6d 6e 75 6d 28 41  &Y,1);}..nmnum(A
b070: 29 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d 28 58  ) ::= plus_num(X
b080: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ).             {
b090: 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29  A = X;}.nmnum(A)
b0a0: 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20 20 20 20 20   ::= nm(X).     
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
b0c0: 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20   = X;}.nmnum(A) 
b0d0: 3a 3a 3d 20 4f 4e 28 58 29 2e 20 20 20 20 20 20  ::= ON(X).      
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
b0f0: 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a  = X;}.nmnum(A) :
b100: 3a 3d 20 44 45 4c 45 54 45 28 58 29 2e 20 20 20  := DELETE(X).   
b110: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
b120: 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a   X;}.nmnum(A) ::
b130: 3d 20 44 45 46 41 55 4c 54 28 58 29 2e 20 20 20  = DEFAULT(X).   
b140: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
b150: 58 3b 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54  X;}.%endif SQLIT
b160: 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 25 74  E_OMIT_PRAGMA.%t
b170: 6f 6b 65 6e 5f 63 6c 61 73 73 20 6e 75 6d 62 65  oken_class numbe
b180: 72 20 49 4e 54 45 47 45 52 7c 46 4c 4f 41 54 2e  r INTEGER|FLOAT.
b190: 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d  .plus_num(A) ::=
b1a0: 20 50 4c 55 53 20 6e 75 6d 62 65 72 28 58 29 2e   PLUS number(X).
b1b0: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
b1c0: 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20  plus_num(A) ::= 
b1d0: 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 20 20  number(X).      
b1e0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d        {A = X;}.m
b1f0: 69 6e 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20  inus_num(A) ::= 
b200: 4d 49 4e 55 53 20 6e 75 6d 62 65 72 28 58 29 2e  MINUS number(X).
b210: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 2f 2f       {A = X;}.//
b220: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
b230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43  ////////// The C
b240: 52 45 41 54 45 20 54 52 49 47 47 45 52 20 63 6f  REATE TRIGGER co
b250: 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  mmand //////////
b260: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66  ///////////..%if
b270: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b280: 5f 54 52 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a  _TRIGGER..cmd ::
b290: 3d 20 63 72 65 61 74 65 6b 77 20 74 72 69 67 67  = createkw trigg
b2a0: 65 72 5f 64 65 63 6c 28 41 29 20 42 45 47 49 4e  er_decl(A) BEGIN
b2b0: 20 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73   trigger_cmd_lis
b2c0: 74 28 53 29 20 45 4e 44 28 5a 29 2e 20 7b 0a 20  t(S) END(Z). {. 
b2d0: 20 54 6f 6b 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c   Token all;.  al
b2e0: 6c 2e 7a 20 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c  l.z = A.z;.  all
b2f0: 2e 6e 20 3d 20 28 69 6e 74 29 28 5a 2e 7a 20 2d  .n = (int)(Z.z -
b300: 20 41 2e 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73   A.z) + Z.n;.  s
b310: 71 6c 69 74 65 33 46 69 6e 69 73 68 54 72 69 67  qlite3FinishTrig
b320: 67 65 72 28 70 50 61 72 73 65 2c 20 53 2c 20 26  ger(pParse, S, &
b330: 61 6c 6c 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72  all);.}..trigger
b340: 5f 64 65 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d  _decl(A) ::= tem
b350: 70 28 54 29 20 54 52 49 47 47 45 52 20 69 66 6e  p(T) TRIGGER ifn
b360: 6f 74 65 78 69 73 74 73 28 4e 4f 45 52 52 29 20  otexists(NOERR) 
b370: 6e 6d 28 42 29 20 64 62 6e 6d 28 5a 29 20 0a 20  nm(B) dbnm(Z) . 
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 20 20 20 74 72 69 67 67 65 72 5f 74 69 6d 65 28     trigger_time(
b3a0: 43 29 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74  C) trigger_event
b3b0: 28 44 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  (D).            
b3c0: 20 20 20 20 20 20 20 20 4f 4e 20 66 75 6c 6c 6e          ON fulln
b3d0: 61 6d 65 28 45 29 20 66 6f 72 65 61 63 68 5f 63  ame(E) foreach_c
b3e0: 6c 61 75 73 65 20 77 68 65 6e 5f 63 6c 61 75 73  lause when_claus
b3f0: 65 28 47 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65  e(G). {.  sqlite
b400: 33 42 65 67 69 6e 54 72 69 67 67 65 72 28 70 50  3BeginTrigger(pP
b410: 61 72 73 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c  arse, &B, &Z, C,
b420: 20 44 2e 61 2c 20 44 2e 62 2c 20 45 2c 20 47 2c   D.a, D.b, E, G,
b430: 20 54 2c 20 4e 4f 45 52 52 29 3b 0a 20 20 41 20   T, NOERR);.  A 
b440: 3d 20 28 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29 3b 0a  = (Z.n==0?B:Z);.
b450: 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72  }..%type trigger
b460: 5f 74 69 6d 65 20 7b 69 6e 74 7d 0a 74 72 69 67  _time {int}.trig
b470: 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20  ger_time(A) ::= 
b480: 42 45 46 4f 52 45 2e 20 20 20 20 20 20 7b 20 41  BEFORE.      { A
b490: 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a   = TK_BEFORE; }.
b4a0: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20  trigger_time(A) 
b4b0: 3a 3a 3d 20 41 46 54 45 52 2e 20 20 20 20 20 20  ::= AFTER.      
b4c0: 20 7b 20 41 20 3d 20 54 4b 5f 41 46 54 45 52 3b   { A = TK_AFTER;
b4d0: 20 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65    }.trigger_time
b4e0: 28 41 29 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20  (A) ::= INSTEAD 
b4f0: 4f 46 2e 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e  OF.  { A = TK_IN
b500: 53 54 45 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f  STEAD;}.trigger_
b510: 74 69 6d 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20  time(A) ::= .   
b520: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 54           { A = T
b530: 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79  K_BEFORE; }..%ty
b540: 70 65 20 74 72 69 67 67 65 72 5f 65 76 65 6e 74  pe trigger_event
b550: 20 7b 73 74 72 75 63 74 20 54 72 69 67 45 76 65   {struct TrigEve
b560: 6e 74 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20  nt}.%destructor 
b570: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73  trigger_event {s
b580: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
b590: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
b5a0: 24 2e 62 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65  $.b);}.trigger_e
b5b0: 76 65 6e 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45  vent(A) ::= DELE
b5c0: 54 45 7c 49 4e 53 45 52 54 28 4f 50 29 2e 20 20  TE|INSERT(OP).  
b5d0: 20 20 20 20 20 7b 41 2e 61 20 3d 20 40 4f 50 3b       {A.a = @OP;
b5e0: 20 41 2e 62 20 3d 20 30 3b 7d 0a 74 72 69 67 67   A.b = 0;}.trigg
b5f0: 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20  er_event(A) ::= 
b600: 55 50 44 41 54 45 28 4f 50 29 2e 20 20 20 20 20  UPDATE(OP).     
b610: 20 20 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20           {A.a = 
b620: 40 4f 50 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74  @OP; A.b = 0;}.t
b630: 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20  rigger_event(A) 
b640: 3a 3a 3d 20 55 50 44 41 54 45 20 4f 46 20 69 64  ::= UPDATE OF id
b650: 6c 69 73 74 28 58 29 2e 20 7b 41 2e 61 20 3d 20  list(X). {A.a = 
b660: 54 4b 5f 55 50 44 41 54 45 3b 20 41 2e 62 20 3d  TK_UPDATE; A.b =
b670: 20 58 3b 7d 0a 0a 66 6f 72 65 61 63 68 5f 63 6c   X;}..foreach_cl
b680: 61 75 73 65 20 3a 3a 3d 20 2e 0a 66 6f 72 65 61  ause ::= ..forea
b690: 63 68 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 46 4f  ch_clause ::= FO
b6a0: 52 20 45 41 43 48 20 52 4f 57 2e 0a 0a 25 74 79  R EACH ROW...%ty
b6b0: 70 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b  pe when_clause {
b6c0: 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74  Expr*}.%destruct
b6d0: 6f 72 20 77 68 65 6e 5f 63 6c 61 75 73 65 20 7b  or when_clause {
b6e0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
b6f0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
b700: 29 3b 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28  );}.when_clause(
b710: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
b720: 20 20 20 20 20 7b 20 41 20 3d 20 30 3b 20 7d 0a       { A = 0; }.
b730: 77 68 65 6e 5f 63 6c 61 75 73 65 28 41 29 20 3a  when_clause(A) :
b740: 3a 3d 20 57 48 45 4e 20 65 78 70 72 28 58 29 2e  := WHEN expr(X).
b750: 20 7b 20 41 20 3d 20 58 2e 70 45 78 70 72 3b 20   { A = X.pExpr; 
b760: 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72  }..%type trigger
b770: 5f 63 6d 64 5f 6c 69 73 74 20 7b 54 72 69 67 67  _cmd_list {Trigg
b780: 65 72 53 74 65 70 2a 7d 0a 25 64 65 73 74 72 75  erStep*}.%destru
b790: 63 74 6f 72 20 74 72 69 67 67 65 72 5f 63 6d 64  ctor trigger_cmd
b7a0: 5f 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 44 65  _list {sqlite3De
b7b0: 6c 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28  leteTriggerStep(
b7c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
b7d0: 7d 0a 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69  }.trigger_cmd_li
b7e0: 73 74 28 41 29 20 3a 3a 3d 20 74 72 69 67 67 65  st(A) ::= trigge
b7f0: 72 5f 63 6d 64 5f 6c 69 73 74 28 59 29 20 74 72  r_cmd_list(Y) tr
b800: 69 67 67 65 72 5f 63 6d 64 28 58 29 20 53 45 4d  igger_cmd(X) SEM
b810: 49 2e 20 7b 0a 20 20 61 73 73 65 72 74 28 20 59  I. {.  assert( Y
b820: 21 3d 30 20 29 3b 0a 20 20 59 2d 3e 70 4c 61 73  !=0 );.  Y->pLas
b830: 74 2d 3e 70 4e 65 78 74 20 3d 20 58 3b 0a 20 20  t->pNext = X;.  
b840: 59 2d 3e 70 4c 61 73 74 20 3d 20 58 3b 0a 20 20  Y->pLast = X;.  
b850: 41 20 3d 20 59 3b 0a 7d 0a 74 72 69 67 67 65 72  A = Y;.}.trigger
b860: 5f 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d  _cmd_list(A) ::=
b870: 20 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29 20   trigger_cmd(X) 
b880: 53 45 4d 49 2e 20 7b 20 0a 20 20 61 73 73 65 72  SEMI. { .  asser
b890: 74 28 20 58 21 3d 30 20 29 3b 0a 20 20 58 2d 3e  t( X!=0 );.  X->
b8a0: 70 4c 61 73 74 20 3d 20 58 3b 0a 20 20 41 20 3d  pLast = X;.  A =
b8b0: 20 58 3b 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c   X;.}..// Disall
b8c0: 6f 77 20 71 75 61 6c 69 66 69 65 64 20 74 61 62  ow qualified tab
b8d0: 6c 65 20 6e 61 6d 65 73 20 6f 6e 20 49 4e 53 45  le names on INSE
b8e0: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
b8f0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
b900: 73 0a 2f 2f 20 77 69 74 68 69 6e 20 61 20 74 72  s.// within a tr
b910: 69 67 67 65 72 2e 20 20 54 68 65 20 74 61 62 6c  igger.  The tabl
b920: 65 20 74 6f 20 49 4e 53 45 52 54 2c 20 55 50 44  e to INSERT, UPD
b930: 41 54 45 2c 20 6f 72 20 44 45 4c 45 54 45 20 69  ATE, or DELETE i
b940: 73 20 61 6c 77 61 79 73 20 69 6e 20 0a 2f 2f 20  s always in .// 
b950: 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73  the same databas
b960: 65 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  e as the table t
b970: 68 61 74 20 74 68 65 20 74 72 69 67 67 65 72 20  hat the trigger 
b980: 66 69 72 65 73 20 6f 6e 2e 0a 2f 2f 0a 25 74 79  fires on..//.%ty
b990: 70 65 20 74 72 6e 6d 20 7b 54 6f 6b 65 6e 7d 0a  pe trnm {Token}.
b9a0: 74 72 6e 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 58  trnm(A) ::= nm(X
b9b0: 29 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 74 72  ).   {A = X;}.tr
b9c0: 6e 6d 28 41 29 20 3a 3a 3d 20 6e 6d 20 44 4f 54  nm(A) ::= nm DOT
b9d0: 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20   nm(X). {.  A = 
b9e0: 58 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  X;.  sqlite3Erro
b9f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
ba00: 20 20 20 20 20 20 22 71 75 61 6c 69 66 69 65 64        "qualified
ba10: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 61 72 65   table names are
ba20: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20   not allowed on 
ba30: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
ba40: 61 6e 64 20 44 45 4c 45 54 45 20 22 0a 20 20 20  and DELETE ".   
ba50: 20 20 20 20 20 22 73 74 61 74 65 6d 65 6e 74 73       "statements
ba60: 20 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73   within triggers
ba70: 22 29 3b 0a 7d 0a 0a 2f 2f 20 44 69 73 61 6c 6c  ");.}..// Disall
ba80: 6f 77 20 74 68 65 20 49 4e 44 45 58 20 42 59 20  ow the INDEX BY 
ba90: 61 6e 64 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  and NOT INDEXED 
baa0: 63 6c 61 75 73 65 73 20 6f 6e 20 55 50 44 41 54  clauses on UPDAT
bab0: 45 20 61 6e 64 20 44 45 4c 45 54 45 0a 2f 2f 20  E and DELETE.// 
bac0: 73 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69  statements withi
bad0: 6e 20 74 72 69 67 67 65 72 73 2e 20 20 57 65 20  n triggers.  We 
bae0: 6d 61 6b 65 20 61 20 73 70 65 63 69 66 69 63 20  make a specific 
baf0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 6f  error message fo
bb00: 72 20 74 68 69 73 0a 2f 2f 20 73 69 6e 63 65 20  r this.// since 
bb10: 69 74 20 69 73 20 61 6e 20 65 78 63 65 70 74 69  it is an excepti
bb20: 6f 6e 20 74 6f 20 74 68 65 20 64 65 66 61 75 6c  on to the defaul
bb30: 74 20 67 72 61 6d 6d 61 72 20 72 75 6c 65 73 2e  t grammar rules.
bb40: 0a 2f 2f 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20  .//.tridxby ::= 
bb50: 2e 0a 74 72 69 64 78 62 79 20 3a 3a 3d 20 49 4e  ..tridxby ::= IN
bb60: 44 45 58 45 44 20 42 59 20 6e 6d 2e 20 7b 0a 20  DEXED BY nm. {. 
bb70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
bb80: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
bb90: 20 22 74 68 65 20 49 4e 44 45 58 45 44 20 42 59   "the INDEXED BY
bba0: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 61   clause is not a
bbb0: 6c 6c 6f 77 65 64 20 6f 6e 20 55 50 44 41 54 45  llowed on UPDATE
bbc0: 20 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65   or DELETE state
bbd0: 6d 65 6e 74 73 20 22 0a 20 20 20 20 20 20 20 20  ments ".        
bbe0: 22 77 69 74 68 69 6e 20 74 72 69 67 67 65 72 73  "within triggers
bbf0: 22 29 3b 0a 7d 0a 74 72 69 64 78 62 79 20 3a 3a  ");.}.tridxby ::
bc00: 3d 20 4e 4f 54 20 49 4e 44 45 58 45 44 2e 20 7b  = NOT INDEXED. {
bc10: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
bc20: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
bc30: 20 20 20 22 74 68 65 20 4e 4f 54 20 49 4e 44 45     "the NOT INDE
bc40: 58 45 44 20 63 6c 61 75 73 65 20 69 73 20 6e 6f  XED clause is no
bc50: 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 55 50 44  t allowed on UPD
bc60: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
bc70: 61 74 65 6d 65 6e 74 73 20 22 0a 20 20 20 20 20  atements ".     
bc80: 20 20 20 22 77 69 74 68 69 6e 20 74 72 69 67 67     "within trigg
bc90: 65 72 73 22 29 3b 0a 7d 0a 0a 0a 0a 25 74 79 70  ers");.}....%typ
bca0: 65 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 54  e trigger_cmd {T
bcb0: 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65  riggerStep*}.%de
bcc0: 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72  structor trigger
bcd0: 5f 63 6d 64 20 7b 73 71 6c 69 74 65 33 44 65 6c  _cmd {sqlite3Del
bce0: 65 74 65 54 72 69 67 67 65 72 53 74 65 70 28 70  eteTriggerStep(p
bcf0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
bd00: 0a 2f 2f 20 55 50 44 41 54 45 20 0a 74 72 69 67  .// UPDATE .trig
bd10: 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 0a 20  ger_cmd(A) ::=. 
bd20: 20 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28    UPDATE orconf(
bd30: 52 29 20 74 72 6e 6d 28 58 29 20 74 72 69 64 78  R) trnm(X) tridx
bd40: 62 79 20 53 45 54 20 73 65 74 6c 69 73 74 28 59  by SET setlist(Y
bd50: 29 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 20  ) where_opt(Z). 
bd60: 20 0a 20 20 20 7b 20 41 20 3d 20 73 71 6c 69 74   .   { A = sqlit
bd70: 65 33 54 72 69 67 67 65 72 55 70 64 61 74 65 53  e3TriggerUpdateS
bd80: 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  tep(pParse->db, 
bd90: 26 58 2c 20 59 2c 20 5a 2c 20 52 29 3b 20 7d 0a  &X, Y, Z, R); }.
bda0: 0a 2f 2f 20 49 4e 53 45 52 54 0a 74 72 69 67 67  .// INSERT.trigg
bdb0: 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 69 6e  er_cmd(A) ::= in
bdc0: 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54 4f  sert_cmd(R) INTO
bdd0: 20 74 72 6e 6d 28 58 29 20 69 6e 73 63 6f 6c 6c   trnm(X) inscoll
bde0: 69 73 74 5f 6f 70 74 28 46 29 20 73 65 6c 65 63  ist_opt(F) selec
bdf0: 74 28 53 29 2e 0a 20 20 20 20 20 20 20 20 20 20  t(S)..          
be00: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
be10: 33 54 72 69 67 67 65 72 49 6e 73 65 72 74 53 74  3TriggerInsertSt
be20: 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26  ep(pParse->db, &
be30: 58 2c 20 46 2c 20 53 2c 20 52 29 3b 7d 0a 0a 2f  X, F, S, R);}../
be40: 2f 20 44 45 4c 45 54 45 0a 74 72 69 67 67 65 72  / DELETE.trigger
be50: 5f 63 6d 64 28 41 29 20 3a 3a 3d 20 44 45 4c 45  _cmd(A) ::= DELE
be60: 54 45 20 46 52 4f 4d 20 74 72 6e 6d 28 58 29 20  TE FROM trnm(X) 
be70: 74 72 69 64 78 62 79 20 77 68 65 72 65 5f 6f 70  tridxby where_op
be80: 74 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20  t(Y)..          
be90: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
bea0: 33 54 72 69 67 67 65 72 44 65 6c 65 74 65 53 74  3TriggerDeleteSt
beb0: 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 26  ep(pParse->db, &
bec0: 58 2c 20 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45  X, Y);}..// SELE
bed0: 43 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41  CT.trigger_cmd(A
bee0: 29 20 3a 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e  ) ::= select(X).
bef0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72    {A = sqlite3Tr
bf00: 69 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28  iggerSelectStep(
bf10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 58 29 3b 20  pParse->db, X); 
bf20: 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63 69 61  }..// The specia
bf30: 6c 20 52 41 49 53 45 20 65 78 70 72 65 73 73 69  l RAISE expressi
bf40: 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63 63 75  on that may occu
bf50: 72 20 69 6e 20 74 72 69 67 67 65 72 20 70 72 6f  r in trigger pro
bf60: 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20 3a 3a  grams.expr(A) ::
bf70: 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 49 47  = RAISE(X) LP IG
bf80: 4e 4f 52 45 20 52 50 28 59 29 2e 20 20 7b 0a 20  NORE RP(Y).  {. 
bf90: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74   A.pExpr = sqlit
bfa0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
bfb0: 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20 30 2c 20  TK_RAISE, 0, 0, 
bfc0: 30 29 3b 20 0a 20 20 69 66 28 20 41 2e 70 45 78  0); .  if( A.pEx
bfd0: 70 72 20 29 7b 0a 20 20 20 20 41 2e 70 45 78 70  pr ){.    A.pExp
bfe0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 4f 45  r->affinity = OE
bff0: 5f 49 67 6e 6f 72 65 3b 0a 20 20 7d 0a 20 20 41  _Ignore;.  }.  A
c000: 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 3b 0a 20  .zStart = X.z;. 
c010: 20 41 2e 7a 45 6e 64 20 3d 20 26 59 2e 7a 5b 59   A.zEnd = &Y.z[Y
c020: 2e 6e 5d 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  .n];.}.expr(A) :
c030: 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 72  := RAISE(X) LP r
c040: 61 69 73 65 74 79 70 65 28 54 29 20 43 4f 4d 4d  aisetype(T) COMM
c050: 41 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20 20  A nm(Z) RP(Y).  
c060: 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71  {.  A.pExpr = sq
c070: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
c080: 65 2c 20 54 4b 5f 52 41 49 53 45 2c 20 30 2c 20  e, TK_RAISE, 0, 
c090: 30 2c 20 26 5a 29 3b 20 0a 20 20 69 66 28 20 41  0, &Z); .  if( A
c0a0: 2e 70 45 78 70 72 20 29 20 7b 0a 20 20 20 20 41  .pExpr ) {.    A
c0b0: 2e 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79  .pExpr->affinity
c0c0: 20 3d 20 28 63 68 61 72 29 54 3b 0a 20 20 7d 0a   = (char)T;.  }.
c0d0: 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a    A.zStart = X.z
c0e0: 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26 59 2e  ;.  A.zEnd = &Y.
c0f0: 7a 5b 59 2e 6e 5d 3b 0a 7d 0a 25 65 6e 64 69 66  z[Y.n];.}.%endif
c100: 20 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54    !SQLITE_OMIT_T
c110: 52 49 47 47 45 52 0a 0a 25 74 79 70 65 20 72 61  RIGGER..%type ra
c120: 69 73 65 74 79 70 65 20 7b 69 6e 74 7d 0a 72 61  isetype {int}.ra
c130: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 52  isetype(A) ::= R
c140: 4f 4c 4c 42 41 43 4b 2e 20 20 7b 41 20 3d 20 4f  OLLBACK.  {A = O
c150: 45 5f 52 6f 6c 6c 62 61 63 6b 3b 7d 0a 72 61 69  E_Rollback;}.rai
c160: 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 41 42  setype(A) ::= AB
c170: 4f 52 54 2e 20 20 20 20 20 7b 41 20 3d 20 4f 45  ORT.     {A = OE
c180: 5f 41 62 6f 72 74 3b 7d 0a 72 61 69 73 65 74 79  _Abort;}.raisety
c190: 70 65 28 41 29 20 3a 3a 3d 20 46 41 49 4c 2e 20  pe(A) ::= FAIL. 
c1a0: 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 46 61 69       {A = OE_Fai
c1b0: 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  l;}...//////////
c1c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 20  //////////////  
c1d0: 44 52 4f 50 20 54 52 49 47 47 45 52 20 73 74 61  DROP TRIGGER sta
c1e0: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  tement /////////
c1f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c200: 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51  /////.%ifndef SQ
c210: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
c220: 52 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 54  R.cmd ::= DROP T
c230: 52 49 47 47 45 52 20 69 66 65 78 69 73 74 73 28  RIGGER ifexists(
c240: 4e 4f 45 52 52 29 20 66 75 6c 6c 6e 61 6d 65 28  NOERR) fullname(
c250: 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44  X). {.  sqlite3D
c260: 72 6f 70 54 72 69 67 67 65 72 28 70 50 61 72 73  ropTrigger(pPars
c270: 65 2c 58 2c 4e 4f 45 52 52 29 3b 0a 7d 0a 25 65  e,X,NOERR);.}.%e
c280: 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f 4d  ndif  !SQLITE_OM
c290: 49 54 5f 54 52 49 47 47 45 52 0a 0a 2f 2f 2f 2f  IT_TRIGGER..////
c2a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c2b0: 2f 2f 2f 2f 20 41 54 54 41 43 48 20 44 41 54 41  //// ATTACH DATA
c2c0: 42 41 53 45 20 66 69 6c 65 20 41 53 20 6e 61 6d  BASE file AS nam
c2d0: 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  e //////////////
c2e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e  ///////////.%ifn
c2f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c300: 41 54 54 41 43 48 0a 63 6d 64 20 3a 3a 3d 20 41  ATTACH.cmd ::= A
c310: 54 54 41 43 48 20 64 61 74 61 62 61 73 65 5f 6b  TTACH database_k
c320: 77 5f 6f 70 74 20 65 78 70 72 28 46 29 20 41 53  w_opt expr(F) AS
c330: 20 65 78 70 72 28 44 29 20 6b 65 79 5f 6f 70 74   expr(D) key_opt
c340: 28 4b 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33  (K). {.  sqlite3
c350: 41 74 74 61 63 68 28 70 50 61 72 73 65 2c 20 46  Attach(pParse, F
c360: 2e 70 45 78 70 72 2c 20 44 2e 70 45 78 70 72 2c  .pExpr, D.pExpr,
c370: 20 4b 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44   K);.}.cmd ::= D
c380: 45 54 41 43 48 20 64 61 74 61 62 61 73 65 5f 6b  ETACH database_k
c390: 77 5f 6f 70 74 20 65 78 70 72 28 44 29 2e 20 7b  w_opt expr(D). {
c3a0: 0a 20 20 73 71 6c 69 74 65 33 44 65 74 61 63 68  .  sqlite3Detach
c3b0: 28 70 50 61 72 73 65 2c 20 44 2e 70 45 78 70 72  (pParse, D.pExpr
c3c0: 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 6b 65 79 5f  );.}..%type key_
c3d0: 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73  opt {Expr*}.%des
c3e0: 74 72 75 63 74 6f 72 20 6b 65 79 5f 6f 70 74 20  tructor key_opt 
c3f0: 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65  {sqlite3ExprDele
c400: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
c410: 24 29 3b 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20  $);}.key_opt(A) 
c420: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20  ::= .           
c430: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
c440: 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74 28 41 29 20  0; }.key_opt(A) 
c450: 3a 3a 3d 20 4b 45 59 20 65 78 70 72 28 58 29 2e  ::= KEY expr(X).
c460: 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20            { A = 
c470: 58 2e 70 45 78 70 72 3b 20 7d 0a 0a 64 61 74 61  X.pExpr; }..data
c480: 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20  base_kw_opt ::= 
c490: 44 41 54 41 42 41 53 45 2e 0a 64 61 74 61 62 61  DATABASE..databa
c4a0: 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a 3d 20 2e 0a  se_kw_opt ::= ..
c4b0: 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d  %endif SQLITE_OM
c4c0: 49 54 5f 41 54 54 41 43 48 0a 0a 2f 2f 2f 2f 2f  IT_ATTACH../////
c4d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c4e0: 2f 2f 2f 2f 2f 20 52 45 49 4e 44 45 58 20 63 6f  ///// REINDEX co
c4f0: 6c 6c 61 74 69 6f 6e 20 2f 2f 2f 2f 2f 2f 2f 2f  llation ////////
c500: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c510: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64  //////////.%ifnd
c520: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
c530: 45 49 4e 44 45 58 0a 63 6d 64 20 3a 3a 3d 20 52  EINDEX.cmd ::= R
c540: 45 49 4e 44 45 58 2e 20 20 20 20 20 20 20 20 20  EINDEX.         
c550: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 52         {sqlite3R
c560: 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c 20 30  eindex(pParse, 0
c570: 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52  , 0);}.cmd ::= R
c580: 45 49 4e 44 45 58 20 6e 6d 28 58 29 20 64 62 6e  EINDEX nm(X) dbn
c590: 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 52  m(Y).  {sqlite3R
c5a0: 65 69 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  eindex(pParse, &
c5b0: 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66 20  X, &Y);}.%endif 
c5c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
c5d0: 4e 44 45 58 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  NDEX..//////////
c5e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c5f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4e 41 4c 59 5a  ///////// ANALYZ
c600: 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  E //////////////
c610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c620: 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51  /////.%ifndef SQ
c630: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a  LITE_OMIT_ANALYZ
c640: 45 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a  E.cmd ::= ANALYZ
c650: 45 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E.              
c660: 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a    {sqlite3Analyz
c670: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 29 3b  e(pParse, 0, 0);
c680: 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4e 41 4c 59 5a  }.cmd ::= ANALYZ
c690: 45 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e  E nm(X) dbnm(Y).
c6a0: 20 20 7b 73 71 6c 69 74 65 33 41 6e 61 6c 79 7a    {sqlite3Analyz
c6b0: 65 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59  e(pParse, &X, &Y
c6c0: 29 3b 7d 0a 25 65 6e 64 69 66 0a 0a 2f 2f 2f 2f  );}.%endif..////
c6d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c6e0: 2f 2f 2f 2f 20 41 4c 54 45 52 20 54 41 42 4c 45  //// ALTER TABLE
c6f0: 20 74 61 62 6c 65 20 2e 2e 2e 20 2f 2f 2f 2f 2f   table ... /////
c700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c710: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e  ///////////.%ifn
c720: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c730: 41 4c 54 45 52 54 41 42 4c 45 0a 63 6d 64 20 3a  ALTERTABLE.cmd :
c740: 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20 66  := ALTER TABLE f
c750: 75 6c 6c 6e 61 6d 65 28 58 29 20 52 45 4e 41 4d  ullname(X) RENAM
c760: 45 20 54 4f 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20  E TO nm(Z). {.  
c770: 73 71 6c 69 74 65 33 41 6c 74 65 72 52 65 6e 61  sqlite3AlterRena
c780: 6d 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 58  meTable(pParse,X
c790: 2c 26 5a 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20  ,&Z);.}.cmd ::= 
c7a0: 41 4c 54 45 52 20 54 41 42 4c 45 20 61 64 64 5f  ALTER TABLE add_
c7b0: 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20  column_fullname 
c7c0: 41 44 44 20 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74  ADD kwcolumn_opt
c7d0: 20 63 6f 6c 75 6d 6e 28 59 29 2e 20 7b 0a 20 20   column(Y). {.  
c7e0: 73 71 6c 69 74 65 33 41 6c 74 65 72 46 69 6e 69  sqlite3AlterFini
c7f0: 73 68 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72  shAddColumn(pPar
c800: 73 65 2c 20 26 59 29 3b 0a 7d 0a 61 64 64 5f 63  se, &Y);.}.add_c
c810: 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61 6d 65 20 3a  olumn_fullname :
c820: 3a 3d 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20  := fullname(X). 
c830: 7b 0a 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  {.  pParse->db->
c840: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
c850: 65 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ed = 0;.  sqlite
c860: 33 41 6c 74 65 72 42 65 67 69 6e 41 64 64 43 6f  3AlterBeginAddCo
c870: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 58 29 3b  lumn(pParse, X);
c880: 0a 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20  .}.kwcolumn_opt 
c890: 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f  ::= ..kwcolumn_o
c8a0: 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57 2e  pt ::= COLUMNKW.
c8b0: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f  .%endif  SQLITE_
c8c0: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a  OMIT_ALTERTABLE.
c8d0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
c8e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54 45  ///////// CREATE
c8f0: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 2e   VIRTUAL TABLE .
c900: 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .. /////////////
c910: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c920: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
c930: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
c940: 45 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65  E.cmd ::= create
c950: 5f 76 74 61 62 2e 20 20 20 20 20 20 20 20 20 20  _vtab.          
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
c970: 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50  lite3VtabFinishP
c980: 61 72 73 65 28 70 50 61 72 73 65 2c 30 29 3b 7d  arse(pParse,0);}
c990: 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f  .cmd ::= create_
c9a0: 76 74 61 62 20 4c 50 20 76 74 61 62 61 72 67 6c  vtab LP vtabargl
c9b0: 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c  ist RP(X).  {sql
c9c0: 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50 61  ite3VtabFinishPa
c9d0: 72 73 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d  rse(pParse,&X);}
c9e0: 0a 63 72 65 61 74 65 5f 76 74 61 62 20 3a 3a 3d  .create_vtab ::=
c9f0: 20 63 72 65 61 74 65 6b 77 20 56 49 52 54 55 41   createkw VIRTUA
ca00: 4c 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78 69  L TABLE ifnotexi
ca10: 73 74 73 28 45 29 0a 20 20 20 20 20 20 20 20 20  sts(E).         
ca20: 20 20 20 20 20 20 20 6e 6d 28 58 29 20 64 62 6e         nm(X) dbn
ca30: 6d 28 59 29 20 55 53 49 4e 47 20 6e 6d 28 5a 29  m(Y) USING nm(Z)
ca40: 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  . {.    sqlite3V
ca50: 74 61 62 42 65 67 69 6e 50 61 72 73 65 28 70 50  tabBeginParse(pP
ca60: 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a  arse, &X, &Y, &Z
ca70: 2c 20 45 29 3b 0a 7d 0a 76 74 61 62 61 72 67 6c  , E);.}.vtabargl
ca80: 69 73 74 20 3a 3a 3d 20 76 74 61 62 61 72 67 2e  ist ::= vtabarg.
ca90: 0a 76 74 61 62 61 72 67 6c 69 73 74 20 3a 3a 3d  .vtabarglist ::=
caa0: 20 76 74 61 62 61 72 67 6c 69 73 74 20 43 4f 4d   vtabarglist COM
cab0: 4d 41 20 76 74 61 62 61 72 67 2e 0a 76 74 61 62  MA vtabarg..vtab
cac0: 61 72 67 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  arg ::= .       
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 49  {sqlite3VtabArgI
caf0: 6e 69 74 28 70 50 61 72 73 65 29 3b 7d 0a 76 74  nit(pParse);}.vt
cb00: 61 62 61 72 67 20 3a 3a 3d 20 76 74 61 62 61 72  abarg ::= vtabar
cb10: 67 20 76 74 61 62 61 72 67 74 6f 6b 65 6e 2e 0a  g vtabargtoken..
cb20: 76 74 61 62 61 72 67 74 6f 6b 65 6e 20 3a 3a 3d  vtabargtoken ::=
cb30: 20 41 4e 59 28 58 29 2e 20 20 20 20 20 20 20 20   ANY(X).        
cb40: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62      {sqlite3Vtab
cb50: 41 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65  ArgExtend(pParse
cb60: 2c 26 58 29 3b 7d 0a 76 74 61 62 61 72 67 74 6f  ,&X);}.vtabargto
cb70: 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c 69  ken ::= lp anyli
cb80: 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c 69  st RP(X).  {sqli
cb90: 74 65 33 56 74 61 62 41 72 67 45 78 74 65 6e 64  te3VtabArgExtend
cba0: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 6c 70  (pParse,&X);}.lp
cbb0: 20 3a 3a 3d 20 4c 50 28 58 29 2e 20 20 20 20 20   ::= LP(X).     
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbd0: 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72    {sqlite3VtabAr
cbe0: 67 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c 26  gExtend(pParse,&
cbf0: 58 29 3b 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d  X);}.anylist ::=
cc00: 20 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61   ..anylist ::= a
cc10: 6e 79 6c 69 73 74 20 4c 50 20 61 6e 79 6c 69 73  nylist LP anylis
cc20: 74 20 52 50 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a  t RP..anylist ::
cc30: 3d 20 61 6e 79 6c 69 73 74 20 41 4e 59 2e 0a 25  = anylist ANY..%
cc40: 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d  endif  SQLITE_OM
cc50: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
cc60: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
cc70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 4f 4d 4d 4f  ////////// COMMO
cc80: 4e 20 54 41 42 4c 45 20 45 58 50 52 45 53 53 49  N TABLE EXPRESSI
cc90: 4f 4e 53 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ONS ////////////
cca0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ccb0: 0a 25 74 79 70 65 20 77 69 74 68 20 7b 57 69 74  .%type with {Wit
ccc0: 68 2a 7d 0a 25 74 79 70 65 20 77 71 6c 69 73 74  h*}.%type wqlist
ccd0: 20 7b 57 69 74 68 2a 7d 0a 25 64 65 73 74 72 75   {With*}.%destru
cce0: 63 74 6f 72 20 77 69 74 68 20 7b 73 71 6c 69 74  ctor with {sqlit
ccf0: 65 33 57 69 74 68 44 65 6c 65 74 65 28 70 50 61  e3WithDelete(pPa
cd00: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
cd10: 64 65 73 74 72 75 63 74 6f 72 20 77 71 6c 69 73  destructor wqlis
cd20: 74 20 7b 73 71 6c 69 74 65 33 57 69 74 68 44 65  t {sqlite3WithDe
cd30: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
cd40: 20 24 24 29 3b 7d 0a 0a 77 69 74 68 28 41 29 20   $$);}..with(A) 
cd50: 3a 3a 3d 20 2e 20 7b 41 20 3d 20 30 3b 7d 0a 25  ::= . {A = 0;}.%
cd60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cd70: 49 54 5f 43 54 45 0a 77 69 74 68 28 41 29 20 3a  IT_CTE.with(A) :
cd80: 3a 3d 20 57 49 54 48 20 77 71 6c 69 73 74 28 57  := WITH wqlist(W
cd90: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
cda0: 7b 20 41 20 3d 20 57 3b 20 7d 0a 77 69 74 68 28  { A = W; }.with(
cdb0: 41 29 20 3a 3a 3d 20 57 49 54 48 20 52 45 43 55  A) ::= WITH RECU
cdc0: 52 53 49 56 45 20 77 71 6c 69 73 74 28 57 29 2e  RSIVE wqlist(W).
cdd0: 20 20 20 20 7b 20 41 20 3d 20 57 3b 20 7d 0a 0a      { A = W; }..
cde0: 77 71 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d  wqlist(A) ::= nm
cdf0: 28 58 29 20 69 64 78 6c 69 73 74 5f 6f 70 74 28  (X) idxlist_opt(
ce00: 59 29 20 41 53 20 4c 50 20 73 65 6c 65 63 74 28  Y) AS LP select(
ce10: 5a 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73  Z) RP. {.  A = s
ce20: 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 70 50  qlite3WithAdd(pP
ce30: 61 72 73 65 2c 20 30 2c 20 26 58 2c 20 59 2c 20  arse, 0, &X, Y, 
ce40: 5a 29 3b 0a 7d 0a 77 71 6c 69 73 74 28 41 29 20  Z);.}.wqlist(A) 
ce50: 3a 3a 3d 20 77 71 6c 69 73 74 28 57 29 20 43 4f  ::= wqlist(W) CO
ce60: 4d 4d 41 20 6e 6d 28 58 29 20 69 64 78 6c 69 73  MMA nm(X) idxlis
ce70: 74 5f 6f 70 74 28 59 29 20 41 53 20 4c 50 20 73  t_opt(Y) AS LP s
ce80: 65 6c 65 63 74 28 5a 29 20 52 50 2e 20 7b 0a 20  elect(Z) RP. {. 
ce90: 20 41 20 3d 20 73 71 6c 69 74 65 33 57 69 74 68   A = sqlite3With
cea0: 41 64 64 28 70 50 61 72 73 65 2c 20 57 2c 20 26  Add(pParse, W, &
ceb0: 58 2c 20 59 2c 20 5a 29 3b 0a 7d 0a 25 65 6e 64  X, Y, Z);.}.%end
cec0: 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  if  SQLITE_OMIT_
ced0: 43 54 45 0a                                      CTE.