/ Hex Artifact Content
Login

Artifact b5c16bc5aa5e59a7ceb0fe94defa9dce3a6b1d3c:


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 25 69 6e 63  >db, $$);}..%inc
38b0: 6c 75 64 65 20 7b 0a 20 20 2f 2a 0a 20 20 2a 2a  lude {.  /*.  **
38c0: 20 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 20   For a compound 
38d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
38e0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 2d 3e 70  , make sure p->p
38f0: 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 20  Prior->pNext==p 
3900: 66 6f 72 0a 20 20 2a 2a 20 61 6c 6c 20 65 6c 65  for.  ** all ele
3910: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73  ments in the lis
3920: 74 2e 20 20 41 6e 64 20 6d 61 6b 65 20 73 75 72  t.  And make sur
3930: 65 20 6c 69 73 74 20 6c 65 6e 67 74 68 20 64 6f  e list length do
3940: 65 73 20 6e 6f 74 20 65 78 63 65 65 64 0a 20 20  es not exceed.  
3950: 2a 2a 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ** SQLITE_LIMIT_
3960: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2e  COMPOUND_SELECT.
3970: 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 70 61 72  .  */.  void par
3980: 73 65 72 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c  serDoubleLinkSel
3990: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
39a0: 65 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  e, Select *p){. 
39b0: 20 20 20 69 66 28 20 70 2d 3e 70 50 72 69 6f 72     if( p->pPrior
39c0: 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
39d0: 20 2a 70 4e 65 78 74 20 3d 20 30 2c 20 2a 70 4c   *pNext = 0, *pL
39e0: 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d  oop;.      int m
39f0: 78 53 65 6c 65 63 74 2c 20 63 6e 74 20 3d 20 30  xSelect, cnt = 0
3a00: 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 4c 6f 6f  ;.      for(pLoo
3a10: 70 3d 70 3b 20 70 4c 6f 6f 70 3b 20 70 4e 65 78  p=p; pLoop; pNex
3a20: 74 3d 70 4c 6f 6f 70 2c 20 70 4c 6f 6f 70 3d 70  t=pLoop, pLoop=p
3a30: 4c 6f 6f 70 2d 3e 70 50 72 69 6f 72 2c 20 63 6e  Loop->pPrior, cn
3a40: 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  t++){.        pL
3a50: 6f 6f 70 2d 3e 70 4e 65 78 74 20 3d 20 70 4e 65  oop->pNext = pNe
3a60: 78 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 6f 6f  xt;.        pLoo
3a70: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
3a80: 46 5f 43 6f 6d 70 6f 75 6e 64 3b 0a 20 20 20 20  F_Compound;.    
3a90: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 70    }.      if( (p
3aa0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
3ab0: 4d 75 6c 74 69 56 61 6c 75 65 29 3d 3d 30 20 26  MultiValue)==0 &
3ac0: 26 20 0a 20 20 20 20 20 20 20 20 28 6d 78 53 65  & .        (mxSe
3ad0: 6c 65 63 74 20 3d 20 70 50 61 72 73 65 2d 3e 64  lect = pParse->d
3ae0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
3af0: 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
3b00: 53 45 4c 45 43 54 5d 29 3e 30 20 26 26 0a 20 20  SELECT])>0 &&.  
3b10: 20 20 20 20 20 20 63 6e 74 3e 6d 78 53 65 6c 65        cnt>mxSele
3b20: 63 74 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ct.      ){.    
3b30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3b40: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
3b50: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 63   many terms in c
3b60: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 22 29  ompound SELECT")
3b70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3b80: 20 20 7d 0a 7d 0a 0a 73 65 6c 65 63 74 28 41 29    }.}..select(A)
3b90: 20 3a 3a 3d 20 77 69 74 68 28 57 29 20 73 65 6c   ::= with(W) sel
3ba0: 65 63 74 6e 6f 77 69 74 68 28 58 29 2e 20 7b 0a  ectnowith(X). {.
3bb0: 20 20 53 65 6c 65 63 74 20 2a 70 20 3d 20 58 3b    Select *p = X;
3bc0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
3bd0: 70 2d 3e 70 57 69 74 68 20 3d 20 57 3b 0a 20 20  p->pWith = W;.  
3be0: 20 20 70 61 72 73 65 72 44 6f 75 62 6c 65 4c 69    parserDoubleLi
3bf0: 6e 6b 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  nkSelect(pParse,
3c00: 20 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   p);.  }else{.  
3c10: 20 20 73 71 6c 69 74 65 33 57 69 74 68 44 65 6c    sqlite3WithDel
3c20: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
3c30: 57 29 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 70 3b  W);.  }.  A = p;
3c40: 0a 7d 0a 0a 73 65 6c 65 63 74 6e 6f 77 69 74 68  .}..selectnowith
3c50: 28 41 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63  (A) ::= oneselec
3c60: 74 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  t(X).           
3c70: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
3c80: 58 3b 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49  X;}.%ifndef SQLI
3c90: 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  TE_OMIT_COMPOUND
3ca0: 5f 53 45 4c 45 43 54 0a 73 65 6c 65 63 74 6e 6f  _SELECT.selectno
3cb0: 77 69 74 68 28 41 29 20 3a 3a 3d 20 73 65 6c 65  with(A) ::= sele
3cc0: 63 74 6e 6f 77 69 74 68 28 58 29 20 6d 75 6c 74  ctnowith(X) mult
3cd0: 69 73 65 6c 65 63 74 5f 6f 70 28 59 29 20 6f 6e  iselect_op(Y) on
3ce0: 65 73 65 6c 65 63 74 28 5a 29 2e 20 20 7b 0a 20  eselect(Z).  {. 
3cf0: 20 53 65 6c 65 63 74 20 2a 70 52 68 73 20 3d 20   Select *pRhs = 
3d00: 5a 3b 0a 20 20 69 66 28 20 70 52 68 73 20 26 26  Z;.  if( pRhs &&
3d10: 20 70 52 68 73 2d 3e 70 50 72 69 6f 72 20 29 7b   pRhs->pPrior ){
3d20: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 46  .    SrcList *pF
3d30: 72 6f 6d 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 78  rom;.    Token x
3d40: 3b 0a 20 20 20 20 78 2e 6e 20 3d 20 30 3b 0a 20  ;.    x.n = 0;. 
3d50: 20 20 20 70 61 72 73 65 72 44 6f 75 62 6c 65 4c     parserDoubleL
3d60: 69 6e 6b 53 65 6c 65 63 74 28 70 50 61 72 73 65  inkSelect(pParse
3d70: 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 70 46 72  , pRhs);.    pFr
3d80: 6f 6d 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  om = sqlite3SrcL
3d90: 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72  istAppendFromTer
3da0: 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 26  m(pParse,0,0,0,&
3db0: 78 2c 70 52 68 73 2c 30 2c 30 29 3b 0a 20 20 20  x,pRhs,0,0);.   
3dc0: 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 53   pRhs = sqlite3S
3dd0: 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c  electNew(pParse,
3de0: 30 2c 70 46 72 6f 6d 2c 30 2c 30 2c 30 2c 30 2c  0,pFrom,0,0,0,0,
3df0: 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66  0,0,0);.  }.  if
3e00: 28 20 70 52 68 73 20 29 7b 0a 20 20 20 20 70 52  ( pRhs ){.    pR
3e10: 68 73 2d 3e 6f 70 20 3d 20 28 75 38 29 59 3b 0a  hs->op = (u8)Y;.
3e20: 20 20 20 20 70 52 68 73 2d 3e 70 50 72 69 6f 72      pRhs->pPrior
3e30: 20 3d 20 58 3b 0a 20 20 20 20 70 52 68 73 2d 3e   = X;.    pRhs->
3e40: 73 65 6c 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f  selFlags &= ~SF_
3e50: 4d 75 6c 74 69 56 61 6c 75 65 3b 0a 20 20 20 20  MultiValue;.    
3e60: 69 66 28 20 59 21 3d 54 4b 5f 41 4c 4c 20 29 20  if( Y!=TK_ALL ) 
3e70: 70 50 61 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f  pParse->hasCompo
3e80: 75 6e 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  und = 1;.  }else
3e90: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
3ea0: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  ectDelete(pParse
3eb0: 2d 3e 64 62 2c 20 58 29 3b 0a 20 20 7d 0a 20 20  ->db, X);.  }.  
3ec0: 41 20 3d 20 70 52 68 73 3b 0a 7d 0a 25 74 79 70  A = pRhs;.}.%typ
3ed0: 65 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70  e multiselect_op
3ee0: 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65   {int}.multisele
3ef0: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49  ct_op(A) ::= UNI
3f00: 4f 4e 28 4f 50 29 2e 20 20 20 20 20 20 20 20 20  ON(OP).         
3f10: 20 20 20 20 7b 41 20 3d 20 40 4f 50 3b 7d 0a 6d      {A = @OP;}.m
3f20: 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29  ultiselect_op(A)
3f30: 20 3a 3a 3d 20 55 4e 49 4f 4e 20 41 4c 4c 2e 20   ::= UNION ALL. 
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
3f50: 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d 75 6c 74 69 73   TK_ALL;}.multis
3f60: 65 6c 65 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20  elect_op(A) ::= 
3f70: 45 58 43 45 50 54 7c 49 4e 54 45 52 53 45 43 54  EXCEPT|INTERSECT
3f80: 28 4f 50 29 2e 20 20 7b 41 20 3d 20 40 4f 50 3b  (OP).  {A = @OP;
3f90: 7d 0a 25 65 6e 64 69 66 20 53 51 4c 49 54 45 5f  }.%endif SQLITE_
3fa0: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  OMIT_COMPOUND_SE
3fb0: 4c 45 43 54 0a 6f 6e 65 73 65 6c 65 63 74 28 41  LECT.oneselect(A
3fc0: 29 20 3a 3a 3d 20 53 45 4c 45 43 54 28 53 29 20  ) ::= SELECT(S) 
3fd0: 64 69 73 74 69 6e 63 74 28 44 29 20 73 65 6c 63  distinct(D) selc
3fe0: 6f 6c 6c 69 73 74 28 57 29 20 66 72 6f 6d 28 58  ollist(W) from(X
3ff0: 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29 0a 20  ) where_opt(Y). 
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 67 72 6f 75 70 62 79 5f 6f 70 74 28 50 29 20 68  groupby_opt(P) h
4020: 61 76 69 6e 67 5f 6f 70 74 28 51 29 20 6f 72 64  aving_opt(Q) ord
4030: 65 72 62 79 5f 6f 70 74 28 5a 29 20 6c 69 6d 69  erby_opt(Z) limi
4040: 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 41 20  t_opt(L). {.  A 
4050: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  = sqlite3SelectN
4060: 65 77 28 70 50 61 72 73 65 2c 57 2c 58 2c 59 2c  ew(pParse,W,X,Y,
4070: 50 2c 51 2c 5a 2c 44 2c 4c 2e 70 4c 69 6d 69 74  P,Q,Z,D,L.pLimit
4080: 2c 4c 2e 70 4f 66 66 73 65 74 29 3b 0a 23 69 66  ,L.pOffset);.#if
4090: 20 53 45 4c 45 43 54 54 52 41 43 45 5f 45 4e 41   SELECTTRACE_ENA
40a0: 42 4c 45 44 0a 20 20 2f 2a 20 50 6f 70 75 6c 61  BLED.  /* Popula
40b0: 74 65 20 74 68 65 20 53 65 6c 65 63 74 2e 7a 53  te the Select.zS
40c0: 65 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  elName[] string 
40d0: 74 68 61 74 20 69 73 20 75 73 65 64 20 74 6f 20  that is used to 
40e0: 68 65 6c 70 20 77 69 74 68 0a 20 20 2a 2a 20 71  help with.  ** q
40f0: 75 65 72 79 20 70 6c 61 6e 6e 65 72 20 64 65 62  uery planner deb
4100: 75 67 67 69 6e 67 2c 20 74 6f 20 64 69 66 66 65  ugging, to diffe
4110: 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e  rentiate between
4120: 20 6d 75 6c 74 69 70 6c 65 20 53 65 6c 65 63 74   multiple Select
4130: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e  .  ** objects in
4140: 20 61 20 63 6f 6d 70 6c 65 78 20 71 75 65 72 79   a complex query
4150: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
4160: 68 65 20 53 45 4c 45 43 54 20 6b 65 79 77 6f 72  he SELECT keywor
4170: 64 20 69 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  d is immediately
4180: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43   followed by a C
4190: 2d 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 0a 20  -style comment. 
41a0: 20 2a 2a 20 74 68 65 6e 20 65 78 74 72 61 63 74   ** then extract
41b0: 20 74 68 65 20 66 69 72 73 74 20 66 65 77 20 61   the first few a
41c0: 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72  lphanumeric char
41d0: 61 63 74 65 72 73 20 66 72 6f 6d 20 77 69 74 68  acters from with
41e0: 69 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 6f 6d  in that.  ** com
41f0: 6d 65 6e 74 20 74 6f 20 62 65 20 74 68 65 20 7a  ment to be the z
4200: 53 65 6c 4e 61 6d 65 20 76 61 6c 75 65 2e 20 20  SelName value.  
4210: 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c  Otherwise, the l
4220: 61 62 65 6c 20 69 73 20 23 4e 20 77 68 65 72 65  abel is #N where
4230: 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65  .  ** is an inte
4240: 67 65 72 20 74 68 61 74 20 69 73 20 69 6e 63 72  ger that is incr
4250: 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61 63  emented with eac
4260: 68 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  h SELECT stateme
4270: 6e 74 20 73 65 65 6e 2e 0a 20 20 2a 2f 0a 20 20  nt seen..  */.  
4280: 69 66 28 20 41 21 3d 30 20 29 7b 0a 20 20 20 20  if( A!=0 ){.    
4290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
42a0: 53 2e 7a 2b 36 3b 0a 20 20 20 20 69 6e 74 20 69  S.z+6;.    int i
42b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
42c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 41 2d  printf(sizeof(A-
42d0: 3e 7a 53 65 6c 4e 61 6d 65 29 2c 20 41 2d 3e 7a  >zSelName), A->z
42e0: 53 65 6c 4e 61 6d 65 2c 20 22 23 25 64 22 2c 0a  SelName, "#%d",.
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 20 20 20 2b 2b 70 50 61 72 73 65 2d 3e 6e       ++pParse->n
4310: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 77 68 69  Select);.    whi
4320: 6c 65 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20  le( z[0]==' ' ) 
4330: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  z++;.    if( z[0
4340: 5d 3d 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='/' && z[1]==
4350: 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 7a 20 2b  '*' ){.      z +
4360: 3d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  = 2;.      while
4370: 28 20 7a 5b 30 5d 3d 3d 27 20 27 20 29 20 7a 2b  ( z[0]==' ' ) z+
4380: 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  +;.      for(i=0
4390: 3b 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d  ; sqlite3Isalnum
43a0: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
43b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
43c0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 41 2d 3e  rintf(sizeof(A->
43d0: 7a 53 65 6c 4e 61 6d 65 29 2c 20 41 2d 3e 7a 53  zSelName), A->zS
43e0: 65 6c 4e 61 6d 65 2c 20 22 25 2e 2a 73 22 2c 20  elName, "%.*s", 
43f0: 69 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  i, z);.    }.  }
4400: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 45 4c 45 43  .#endif /* SELEC
4410: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 20 2a 2f  TRACE_ENABLED */
4420: 0a 7d 0a 6f 6e 65 73 65 6c 65 63 74 28 41 29 20  .}.oneselect(A) 
4430: 3a 3a 3d 20 76 61 6c 75 65 73 28 58 29 2e 20 20  ::= values(X).  
4440: 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70    {A = X;}..%typ
4450: 65 20 76 61 6c 75 65 73 20 7b 53 65 6c 65 63 74  e values {Select
4460: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 76  *}.%destructor v
4470: 61 6c 75 65 73 20 7b 73 71 6c 69 74 65 33 53 65  alues {sqlite3Se
4480: 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73  lectDelete(pPars
4490: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 76 61 6c  e->db, $$);}.val
44a0: 75 65 73 28 41 29 20 3a 3a 3d 20 56 41 4c 55 45  ues(A) ::= VALUE
44b0: 53 20 4c 50 20 6e 65 78 70 72 6c 69 73 74 28 58  S LP nexprlist(X
44c0: 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73 71  ) RP. {.  A = sq
44d0: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70  lite3SelectNew(p
44e0: 50 61 72 73 65 2c 58 2c 30 2c 30 2c 30 2c 30 2c  Parse,X,0,0,0,0,
44f0: 30 2c 53 46 5f 56 61 6c 75 65 73 2c 30 2c 30 29  0,SF_Values,0,0)
4500: 3b 0a 7d 0a 76 61 6c 75 65 73 28 41 29 20 3a 3a  ;.}.values(A) ::
4510: 3d 20 76 61 6c 75 65 73 28 58 29 20 43 4f 4d 4d  = values(X) COMM
4520: 41 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29  A LP exprlist(Y)
4530: 20 52 50 2e 20 7b 0a 20 20 53 65 6c 65 63 74 20   RP. {.  Select 
4540: 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 20  *pRight, *pLeft 
4550: 3d 20 58 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  = X;.  pRight = 
4560: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
4570: 28 70 50 61 72 73 65 2c 59 2c 30 2c 30 2c 30 2c  (pParse,Y,0,0,0,
4580: 30 2c 30 2c 53 46 5f 56 61 6c 75 65 73 7c 53 46  0,0,SF_Values|SF
4590: 5f 4d 75 6c 74 69 56 61 6c 75 65 2c 30 2c 30 29  _MultiValue,0,0)
45a0: 3b 0a 20 20 69 66 28 20 70 4c 65 66 74 20 29 20  ;.  if( pLeft ) 
45b0: 70 4c 65 66 74 2d 3e 73 65 6c 46 6c 61 67 73 20  pLeft->selFlags 
45c0: 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75  &= ~SF_MultiValu
45d0: 65 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 20  e;.  if( pRight 
45e0: 29 7b 0a 20 20 20 20 70 52 69 67 68 74 2d 3e 6f  ){.    pRight->o
45f0: 70 20 3d 20 54 4b 5f 41 4c 4c 3b 0a 20 20 20 20  p = TK_ALL;.    
4600: 70 4c 65 66 74 20 3d 20 58 3b 0a 20 20 20 20 70  pLeft = X;.    p
4610: 52 69 67 68 74 2d 3e 70 50 72 69 6f 72 20 3d 20  Right->pPrior = 
4620: 70 4c 65 66 74 3b 0a 20 20 20 20 41 20 3d 20 70  pLeft;.    A = p
4630: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Right;.  }else{.
4640: 20 20 20 20 41 20 3d 20 70 4c 65 66 74 3b 0a 20      A = pLeft;. 
4650: 20 7d 0a 7d 0a 0a 2f 2f 20 54 68 65 20 22 64 69   }.}..// The "di
4660: 73 74 69 6e 63 74 22 20 6e 6f 6e 74 65 72 6d 69  stinct" nontermi
4670: 6e 61 6c 20 69 73 20 74 72 75 65 20 28 31 29 20  nal is true (1) 
4680: 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  if the DISTINCT 
4690: 6b 65 79 77 6f 72 64 20 69 73 0a 2f 2f 20 70 72  keyword is.// pr
46a0: 65 73 65 6e 74 20 61 6e 64 20 66 61 6c 73 65 20  esent and false 
46b0: 28 30 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  (0) if it is not
46c0: 2e 0a 2f 2f 0a 25 74 79 70 65 20 64 69 73 74 69  ..//.%type disti
46d0: 6e 63 74 20 7b 75 31 36 7d 0a 64 69 73 74 69 6e  nct {u16}.distin
46e0: 63 74 28 41 29 20 3a 3a 3d 20 44 49 53 54 49 4e  ct(A) ::= DISTIN
46f0: 43 54 2e 20 20 20 7b 41 20 3d 20 53 46 5f 44 69  CT.   {A = SF_Di
4700: 73 74 69 6e 63 74 3b 7d 0a 64 69 73 74 69 6e 63  stinct;}.distinc
4710: 74 28 41 29 20 3a 3a 3d 20 41 4c 4c 2e 20 20 20  t(A) ::= ALL.   
4720: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 69       {A = 0;}.di
4730: 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 2e 20  stinct(A) ::= . 
4740: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
4750: 3b 7d 0a 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69 73  ;}..// selcollis
4760: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65  t is a list of e
4770: 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20  xpressions that 
4780: 61 72 65 20 74 6f 20 62 65 63 6f 6d 65 20 74 68  are to become th
4790: 65 20 72 65 74 75 72 6e 0a 2f 2f 20 76 61 6c 75  e return.// valu
47a0: 65 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  es of the SELECT
47b0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
47c0: 20 22 2a 22 20 69 6e 20 73 74 61 74 65 6d 65 6e   "*" in statemen
47d0: 74 73 20 6c 69 6b 65 0a 2f 2f 20 22 53 45 4c 45  ts like.// "SELE
47e0: 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 20 69  CT * FROM ..." i
47f0: 73 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 73  s encoded as a s
4800: 70 65 63 69 61 6c 20 65 78 70 72 65 73 73 69 6f  pecial expressio
4810: 6e 20 77 69 74 68 20 61 6e 0a 2f 2f 20 6f 70 63  n with an.// opc
4820: 6f 64 65 20 6f 66 20 54 4b 5f 41 4c 4c 2e 0a 2f  ode of TK_ALL../
4830: 2f 0a 25 74 79 70 65 20 73 65 6c 63 6f 6c 6c 69  /.%type selcolli
4840: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  st {ExprList*}.%
4850: 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 63 6f  destructor selco
4860: 6c 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  llist {sqlite3Ex
4870: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
4880: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
4890: 74 79 70 65 20 73 63 6c 70 20 7b 45 78 70 72 4c  type sclp {ExprL
48a0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  ist*}.%destructo
48b0: 72 20 73 63 6c 70 20 7b 73 71 6c 69 74 65 33 45  r sclp {sqlite3E
48c0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
48d0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
48e0: 73 63 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c 63  sclp(A) ::= selc
48f0: 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 2e  ollist(X) COMMA.
4900: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
4910: 3d 20 58 3b 7d 0a 73 63 6c 70 28 41 29 20 3a 3a  = X;}.sclp(A) ::
4920: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4940: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63     {A = 0;}.selc
4950: 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63  ollist(A) ::= sc
4960: 6c 70 28 50 29 20 65 78 70 72 28 58 29 20 61 73  lp(P) expr(X) as
4970: 28 59 29 2e 20 20 20 20 20 7b 0a 20 20 20 41 20  (Y).     {.   A 
4980: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
4990: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
49a0: 50 2c 20 58 2e 70 45 78 70 72 29 3b 0a 20 20 20  P, X.pExpr);.   
49b0: 69 66 28 20 59 2e 6e 3e 30 20 29 20 73 71 6c 69  if( Y.n>0 ) sqli
49c0: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
49d0: 6d 65 28 70 50 61 72 73 65 2c 20 41 2c 20 26 59  me(pParse, A, &Y
49e0: 2c 20 31 29 3b 0a 20 20 20 73 71 6c 69 74 65 33  , 1);.   sqlite3
49f0: 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e 28  ExprListSetSpan(
4a00: 70 50 61 72 73 65 2c 41 2c 26 58 29 3b 0a 7d 0a  pParse,A,&X);.}.
4a10: 73 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a  selcollist(A) ::
4a20: 3d 20 73 63 6c 70 28 50 29 20 53 54 41 52 2e 20  = sclp(P) STAR. 
4a30: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
4a40: 6c 69 74 65 33 45 78 70 72 28 70 50 61 72 73 65  lite3Expr(pParse
4a50: 2d 3e 64 62 2c 20 54 4b 5f 41 4c 4c 2c 20 30 29  ->db, TK_ALL, 0)
4a60: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45  ;.  A = sqlite3E
4a70: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50  xprListAppend(pP
4a80: 61 72 73 65 2c 20 50 2c 20 70 29 3b 0a 7d 0a 73  arse, P, p);.}.s
4a90: 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d  elcollist(A) ::=
4aa0: 20 73 63 6c 70 28 50 29 20 6e 6d 28 58 29 20 44   sclp(P) nm(X) D
4ab0: 4f 54 20 53 54 41 52 28 59 29 2e 20 7b 0a 20 20  OT STAR(Y). {.  
4ac0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 73  Expr *pRight = s
4ad0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
4ae0: 73 65 2c 20 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30  se, TK_ALL, 0, 0
4af0: 2c 20 26 59 29 3b 0a 20 20 45 78 70 72 20 2a 70  , &Y);.  Expr *p
4b00: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 50 45  Left = sqlite3PE
4b10: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49  xpr(pParse, TK_I
4b20: 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 20 20  D, 0, 0, &X);.  
4b30: 45 78 70 72 20 2a 70 44 6f 74 20 3d 20 73 71 6c  Expr *pDot = sql
4b40: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65  ite3PExpr(pParse
4b50: 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 66 74 2c  , TK_DOT, pLeft,
4b60: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 41   pRight, 0);.  A
4b70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
4b80: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
4b90: 50 2c 20 70 44 6f 74 29 3b 0a 7d 0a 0a 2f 2f 20  P, pDot);.}..// 
4ba0: 41 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20 3c 69  An option "AS <i
4bb0: 64 3e 22 20 70 68 72 61 73 65 20 74 68 61 74 20  d>" phrase that 
4bc0: 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65 20 6f  can follow one o
4bd0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
4be0: 73 20 74 68 61 74 0a 2f 2f 20 64 65 66 69 6e 65  s that.// define
4bf0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
4c00: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
4c10: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
4c20: 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25 74 79  M clause..//.%ty
4c30: 70 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a 61 73  pe as {Token}.as
4c40: 28 58 29 20 3a 3a 3d 20 41 53 20 6e 6d 28 59 29  (X) ::= AS nm(Y)
4c50: 2e 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a 61 73  .    {X = Y;}.as
4c60: 28 58 29 20 3a 3a 3d 20 69 64 73 28 59 29 2e 20  (X) ::= ids(Y). 
4c70: 20 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a 61 73       {X = Y;}.as
4c80: 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (X) ::= .       
4c90: 20 20 20 20 20 7b 58 2e 6e 20 3d 20 30 3b 7d 0a       {X.n = 0;}.
4ca0: 0a 0a 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69  ..%type seltabli
4cb0: 73 74 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  st {SrcList*}.%d
4cc0: 65 73 74 72 75 63 74 6f 72 20 73 65 6c 74 61 62  estructor seltab
4cd0: 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 53 72 63  list {sqlite3Src
4ce0: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
4cf0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 74 79  e->db, $$);}.%ty
4d00: 70 65 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 53  pe stl_prefix {S
4d10: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75  rcList*}.%destru
4d20: 63 74 6f 72 20 73 74 6c 5f 70 72 65 66 69 78 20  ctor stl_prefix 
4d30: 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44  {sqlite3SrcListD
4d40: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
4d50: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 66 72  , $$);}.%type fr
4d60: 6f 6d 20 7b 53 72 63 4c 69 73 74 2a 7d 0a 25 64  om {SrcList*}.%d
4d70: 65 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b  estructor from {
4d80: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
4d90: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
4da0: 20 24 24 29 3b 7d 0a 0a 2f 2f 20 41 20 63 6f 6d   $$);}..// A com
4db0: 70 6c 65 74 65 20 46 52 4f 4d 20 63 6c 61 75 73  plete FROM claus
4dc0: 65 2e 0a 2f 2f 0a 66 72 6f 6d 28 41 29 20 3a 3a  e..//.from(A) ::
4dd0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
4de0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 44     {A = sqlite3D
4df0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
4e00: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
4e10: 41 29 29 3b 7d 0a 66 72 6f 6d 28 41 29 20 3a 3a  A));}.from(A) ::
4e20: 3d 20 46 52 4f 4d 20 73 65 6c 74 61 62 6c 69 73  = FROM seltablis
4e30: 74 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 58 3b  t(X). {.  A = X;
4e40: 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
4e50: 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 41  tShiftJoinType(A
4e60: 29 3b 0a 7d 0a 0a 2f 2f 20 22 73 65 6c 74 61 62  );.}..// "seltab
4e70: 6c 69 73 74 22 20 69 73 20 61 20 22 53 65 6c 65  list" is a "Sele
4e80: 63 74 20 54 61 62 6c 65 20 4c 69 73 74 22 20 2d  ct Table List" -
4e90: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
4ea0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a  the FROM clause.
4eb0: 2f 2f 20 69 6e 20 61 20 53 45 4c 45 43 54 20 73  // in a SELECT s
4ec0: 74 61 74 65 6d 65 6e 74 2e 20 20 22 73 74 6c 5f  tatement.  "stl_
4ed0: 70 72 65 66 69 78 22 20 69 73 20 61 20 70 72 65  prefix" is a pre
4ee0: 66 69 78 20 6f 66 20 74 68 69 73 20 6c 69 73 74  fix of this list
4ef0: 2e 0a 2f 2f 0a 73 74 6c 5f 70 72 65 66 69 78 28  ..//.stl_prefix(
4f00: 41 29 20 3a 3a 3d 20 73 65 6c 74 61 62 6c 69 73  A) ::= seltablis
4f10: 74 28 58 29 20 6a 6f 69 6e 6f 70 28 59 29 2e 20  t(X) joinop(Y). 
4f20: 20 20 20 7b 0a 20 20 20 41 20 3d 20 58 3b 0a 20     {.   A = X;. 
4f30: 20 20 69 66 28 20 41 4c 57 41 59 53 28 41 20 26    if( ALWAYS(A &
4f40: 26 20 41 2d 3e 6e 53 72 63 3e 30 29 20 29 20 41  & A->nSrc>0) ) A
4f50: 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e 6a  ->a[A->nSrc-1].j
4f60: 6f 69 6e 74 79 70 65 20 3d 20 28 75 38 29 59 3b  ointype = (u8)Y;
4f70: 0a 7d 0a 73 74 6c 5f 70 72 65 66 69 78 28 41 29  .}.stl_prefix(A)
4f80: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 74 61 62   {A = 0;}.seltab
4fb0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f  list(A) ::= stl_
4fc0: 70 72 65 66 69 78 28 58 29 20 6e 6d 28 59 29 20  prefix(X) nm(Y) 
4fd0: 64 62 6e 6d 28 44 29 20 61 73 28 5a 29 20 69 6e  dbnm(D) as(Z) in
4fe0: 64 65 78 65 64 5f 6f 70 74 28 49 29 0a 20 20 20  dexed_opt(I).   
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
5000: 6e 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f  n_opt(N) using_o
5010: 70 74 28 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73  pt(U). {.  A = s
5020: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
5030: 65 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72  endFromTerm(pPar
5040: 73 65 2c 58 2c 26 59 2c 26 44 2c 26 5a 2c 30 2c  se,X,&Y,&D,&Z,0,
5050: 4e 2c 55 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  N,U);.  sqlite3S
5060: 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28  rcListIndexedBy(
5070: 70 50 61 72 73 65 2c 20 41 2c 20 26 49 29 3b 0a  pParse, A, &I);.
5080: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
5090: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
50a0: 20 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a   seltablist(A) :
50b0: 3a 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29  := stl_prefix(X)
50c0: 20 4c 50 20 73 65 6c 65 63 74 28 53 29 20 52 50   LP select(S) RP
50d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
50e0: 20 20 20 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70       as(Z) on_op
50f0: 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 74 28 55  t(N) using_opt(U
5100: 29 2e 20 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c  ). {.    A = sql
5110: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
5120: 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
5130: 2c 58 2c 30 2c 30 2c 26 5a 2c 53 2c 4e 2c 55 29  ,X,0,0,&Z,S,N,U)
5140: 3b 0a 20 20 7d 0a 20 20 73 65 6c 74 61 62 6c 69  ;.  }.  seltabli
5150: 73 74 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72  st(A) ::= stl_pr
5160: 65 66 69 78 28 58 29 20 4c 50 20 73 65 6c 74 61  efix(X) LP selta
5170: 62 6c 69 73 74 28 46 29 20 52 50 0a 20 20 20 20  blist(F) RP.    
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20  as(Z) on_opt(N) 
51a0: 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a  using_opt(U). {.
51b0: 20 20 20 20 69 66 28 20 58 3d 3d 30 20 26 26 20      if( X==0 && 
51c0: 5a 2e 6e 3d 3d 30 20 26 26 20 4e 3d 3d 30 20 26  Z.n==0 && N==0 &
51d0: 26 20 55 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  & U==0 ){.      
51e0: 41 20 3d 20 46 3b 0a 20 20 20 20 7d 65 6c 73 65  A = F;.    }else
51f0: 20 69 66 28 20 46 2d 3e 6e 53 72 63 3d 3d 31 20   if( F->nSrc==1 
5200: 29 7b 0a 20 20 20 20 20 20 41 20 3d 20 73 71 6c  ){.      A = sql
5210: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
5220: 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
5230: 2c 58 2c 30 2c 30 2c 26 5a 2c 30 2c 4e 2c 55 29  ,X,0,0,&Z,0,N,U)
5240: 3b 0a 20 20 20 20 20 20 69 66 28 20 41 20 29 7b  ;.      if( A ){
5250: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
5260: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
5270: 65 77 20 3d 20 26 41 2d 3e 61 5b 41 2d 3e 6e 53  ew = &A->a[A->nS
5280: 72 63 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 73  rc-1];.        s
5290: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
52a0: 65 6d 20 2a 70 4f 6c 64 20 3d 20 46 2d 3e 61 3b  em *pOld = F->a;
52b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a  .        pNew->z
52c0: 4e 61 6d 65 20 3d 20 70 4f 6c 64 2d 3e 7a 4e 61  Name = pOld->zNa
52d0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  me;.        pNew
52e0: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 70 4f  ->zDatabase = pO
52f0: 6c 64 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20  ld->zDatabase;. 
5300: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 53 65         pNew->pSe
5310: 6c 65 63 74 20 3d 20 70 4f 6c 64 2d 3e 70 53 65  lect = pOld->pSe
5320: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 70 4f  lect;.        pO
5330: 6c 64 2d 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c 64  ld->zName = pOld
5340: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 30 3b  ->zDatabase = 0;
5350: 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 2d 3e 70  .        pOld->p
5360: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 20 20  Select = 0;.    
5370: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
5380: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70  3SrcListDelete(p
5390: 50 61 72 73 65 2d 3e 64 62 2c 20 46 29 3b 0a 20  Parse->db, F);. 
53a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
53b0: 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72  Select *pSubquer
53c0: 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  y;.      sqlite3
53d0: 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e  SrcListShiftJoin
53e0: 54 79 70 65 28 46 29 3b 0a 20 20 20 20 20 20 70  Type(F);.      p
53f0: 53 75 62 71 75 65 72 79 20 3d 20 73 71 6c 69 74  Subquery = sqlit
5400: 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72  e3SelectNew(pPar
5410: 73 65 2c 30 2c 46 2c 30 2c 30 2c 30 2c 30 2c 53  se,0,F,0,0,0,0,S
5420: 46 5f 4e 65 73 74 65 64 46 72 6f 6d 2c 30 2c 30  F_NestedFrom,0,0
5430: 29 3b 0a 20 20 20 20 20 20 41 20 3d 20 73 71 6c  );.      A = sql
5440: 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
5450: 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 65  dFromTerm(pParse
5460: 2c 58 2c 30 2c 30 2c 26 5a 2c 70 53 75 62 71 75  ,X,0,0,&Z,pSubqu
5470: 65 72 79 2c 4e 2c 55 29 3b 0a 20 20 20 20 7d 0a  ery,N,U);.    }.
5480: 20 20 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49    }.%endif  SQLI
5490: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
54a0: 0a 0a 25 74 79 70 65 20 64 62 6e 6d 20 7b 54 6f  ..%type dbnm {To
54b0: 6b 65 6e 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d  ken}.dbnm(A) ::=
54c0: 20 2e 20 20 20 20 20 20 20 20 20 20 7b 41 2e 7a   .          {A.z
54d0: 3d 30 3b 20 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d  =0; A.n=0;}.dbnm
54e0: 28 41 29 20 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58  (A) ::= DOT nm(X
54f0: 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79  ). {A = X;}..%ty
5500: 70 65 20 66 75 6c 6c 6e 61 6d 65 20 7b 53 72 63  pe fullname {Src
5510: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
5520: 6f 72 20 66 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c  or fullname {sql
5530: 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
5540: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24  e(pParse->db, $$
5550: 29 3b 7d 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20  );}.fullname(A) 
5560: 3a 3a 3d 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59  ::= nm(X) dbnm(Y
5570: 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33  ).  {A = sqlite3
5580: 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50  SrcListAppend(pP
5590: 61 72 73 65 2d 3e 64 62 2c 30 2c 26 58 2c 26 59  arse->db,0,&X,&Y
55a0: 29 3b 7d 0a 0a 25 74 79 70 65 20 6a 6f 69 6e 6f  );}..%type joino
55b0: 70 20 7b 69 6e 74 7d 0a 25 74 79 70 65 20 6a 6f  p {int}.%type jo
55c0: 69 6e 6f 70 32 20 7b 69 6e 74 7d 0a 6a 6f 69 6e  inop2 {int}.join
55d0: 6f 70 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 7c  op(X) ::= COMMA|
55e0: 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20 20 20 20  JOIN.           
55f0: 20 20 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45     { X = JT_INNE
5600: 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a  R; }.joinop(X) :
5610: 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f  := JOIN_KW(A) JO
5620: 49 4e 2e 20 20 20 20 20 20 20 20 20 7b 20 58 20  IN.         { X 
5630: 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70  = sqlite3JoinTyp
5640: 65 28 70 50 61 72 73 65 2c 26 41 2c 30 2c 30 29  e(pParse,&A,0,0)
5650: 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a  ; }.joinop(X) ::
5660: 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28  = JOIN_KW(A) nm(
5670: 42 29 20 4a 4f 49 4e 2e 20 20 20 7b 20 58 20 3d  B) JOIN.   { X =
5680: 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 70 65   sqlite3JoinType
5690: 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c 30 29  (pParse,&A,&B,0)
56a0: 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a  ; }.joinop(X) ::
56b0: 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28  = JOIN_KW(A) nm(
56c0: 42 29 20 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20  B) nm(C) JOIN.. 
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 20 20 20 20 7b 20 58 20 3d 20 73 71 6c 69        { X = sqli
5700: 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72  te3JoinType(pPar
5710: 73 65 2c 26 41 2c 26 42 2c 26 43 29 3b 20 7d 0a  se,&A,&B,&C); }.
5720: 0a 25 74 79 70 65 20 6f 6e 5f 6f 70 74 20 7b 45  .%type on_opt {E
5730: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
5740: 72 20 6f 6e 5f 6f 70 74 20 7b 73 71 6c 69 74 65  r on_opt {sqlite
5750: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
5760: 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 6f 6e  se->db, $$);}.on
5770: 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 4f 4e 20 65  _opt(N) ::= ON e
5780: 78 70 72 28 45 29 2e 20 20 20 7b 4e 20 3d 20 45  xpr(E).   {N = E
5790: 2e 70 45 78 70 72 3b 7d 0a 6f 6e 5f 6f 70 74 28  .pExpr;}.on_opt(
57a0: 4e 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  N) ::= .        
57b0: 20 20 20 20 20 7b 4e 20 3d 20 30 3b 7d 0a 0a 2f       {N = 0;}../
57c0: 2f 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  / Note that this
57d0: 20 62 6c 6f 63 6b 20 61 62 75 73 65 73 20 74 68   block abuses th
57e0: 65 20 54 6f 6b 65 6e 20 74 79 70 65 20 6a 75 73  e Token type jus
57f0: 74 20 61 20 6c 69 74 74 6c 65 2e 20 49 66 20 74  t a little. If t
5800: 68 65 72 65 20 69 73 0a 2f 2f 20 6e 6f 20 22 49  here is.// no "I
5810: 4e 44 45 58 45 44 20 42 59 22 20 63 6c 61 75 73  NDEXED BY" claus
5820: 65 2c 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  e, the returned 
5830: 74 6f 6b 65 6e 20 69 73 20 65 6d 70 74 79 20 28  token is empty (
5840: 7a 3d 3d 30 20 26 26 20 6e 3d 3d 30 29 2e 20 49  z==0 && n==0). I
5850: 66 0a 2f 2f 20 74 68 65 72 65 20 69 73 20 61 6e  f.// there is an
5860: 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
5870: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f 6b  se, then the tok
5880: 65 6e 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  en is populated 
5890: 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2c 0a 2f  as per normal,./
58a0: 2f 20 77 69 74 68 20 7a 20 70 6f 69 6e 74 69 6e  / with z pointin
58b0: 67 20 74 6f 20 74 68 65 20 74 6f 6b 65 6e 20 64  g to the token d
58c0: 61 74 61 20 61 6e 64 20 6e 20 63 6f 6e 74 61 69  ata and n contai
58d0: 6e 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ning the number 
58e0: 6f 66 20 62 79 74 65 73 0a 2f 2f 20 69 6e 20 74  of bytes.// in t
58f0: 68 65 20 74 6f 6b 65 6e 2e 0a 2f 2f 0a 2f 2f 20  he token..//.// 
5900: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 22 4e  If there is a "N
5910: 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
5920: 73 65 2c 20 74 68 65 6e 20 28 7a 3d 3d 30 20 26  se, then (z==0 &
5930: 26 20 6e 3d 3d 31 29 2c 20 77 68 69 63 68 20 69  & n==1), which i
5940: 73 20 0a 2f 2f 20 6e 6f 72 6d 61 6c 6c 79 20 69  s .// normally i
5950: 6c 6c 65 67 61 6c 2e 20 54 68 65 20 73 71 6c 69  llegal. The sqli
5960: 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
5970: 64 42 79 28 29 20 66 75 6e 63 74 69 6f 6e 20 0a  dBy() function .
5980: 2f 2f 20 72 65 63 6f 67 6e 69 7a 65 73 20 61 6e  // recognizes an
5990: 64 20 69 6e 74 65 72 70 72 65 74 73 20 74 68 69  d interprets thi
59a0: 73 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  s as a special c
59b0: 61 73 65 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 6e  ase..//.%type in
59c0: 64 65 78 65 64 5f 6f 70 74 20 7b 54 6f 6b 65 6e  dexed_opt {Token
59d0: 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74 28 41 29  }.indexed_opt(A)
59e0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
59f0: 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b 20 41         {A.z=0; A
5a00: 2e 6e 3d 30 3b 7d 0a 69 6e 64 65 78 65 64 5f 6f  .n=0;}.indexed_o
5a10: 70 74 28 41 29 20 3a 3a 3d 20 49 4e 44 45 58 45  pt(A) ::= INDEXE
5a20: 44 20 42 59 20 6e 6d 28 58 29 2e 20 7b 41 20 3d  D BY nm(X). {A =
5a30: 20 58 3b 7d 0a 69 6e 64 65 78 65 64 5f 6f 70 74   X;}.indexed_opt
5a40: 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 49 4e 44 45  (A) ::= NOT INDE
5a50: 58 45 44 2e 20 20 20 20 20 20 7b 41 2e 7a 3d 30  XED.      {A.z=0
5a60: 3b 20 41 2e 6e 3d 31 3b 7d 0a 0a 25 74 79 70 65  ; A.n=1;}..%type
5a70: 20 75 73 69 6e 67 5f 6f 70 74 20 7b 49 64 4c 69   using_opt {IdLi
5a80: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
5a90: 20 75 73 69 6e 67 5f 6f 70 74 20 7b 73 71 6c 69   using_opt {sqli
5aa0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
5ab0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
5ac0: 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29 20 3a  }.using_opt(U) :
5ad0: 3a 3d 20 55 53 49 4e 47 20 4c 50 20 69 64 6c 69  := USING LP idli
5ae0: 73 74 28 4c 29 20 52 50 2e 20 20 7b 55 20 3d 20  st(L) RP.  {U = 
5af0: 4c 3b 7d 0a 75 73 69 6e 67 5f 6f 70 74 28 55 29  L;}.using_opt(U)
5b00: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 55                {U
5b20: 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 70 65 20 6f   = 0;}...%type o
5b30: 72 64 65 72 62 79 5f 6f 70 74 20 7b 45 78 70 72  rderby_opt {Expr
5b40: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
5b50: 6f 72 20 6f 72 64 65 72 62 79 5f 6f 70 74 20 7b  or orderby_opt {
5b60: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
5b70: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
5b80: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 6f  , $$);}.%type so
5b90: 72 74 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  rtlist {ExprList
5ba0: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
5bb0: 6f 72 74 6c 69 73 74 20 7b 73 71 6c 69 74 65 33  ortlist {sqlite3
5bc0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
5bd0: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
5be0: 0a 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28 41 29  ..orderby_opt(A)
5bf0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
5c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c10: 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64 65 72 62 79  {A = 0;}.orderby
5c20: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4f 52 44 45  _opt(A) ::= ORDE
5c30: 52 20 42 59 20 73 6f 72 74 6c 69 73 74 28 58 29  R BY sortlist(X)
5c40: 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a  .      {A = X;}.
5c50: 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20  sortlist(A) ::= 
5c60: 73 6f 72 74 6c 69 73 74 28 58 29 20 43 4f 4d 4d  sortlist(X) COMM
5c70: 41 20 65 78 70 72 28 59 29 20 73 6f 72 74 6f 72  A expr(Y) sortor
5c80: 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20  der(Z). {.  A = 
5c90: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
5ca0: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 58 2c 59  ppend(pParse,X,Y
5cb0: 2e 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 41  .pExpr);.  if( A
5cc0: 20 29 20 41 2d 3e 61 5b 41 2d 3e 6e 45 78 70 72   ) A->a[A->nExpr
5cd0: 2d 31 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20  -1].sortOrder = 
5ce0: 28 75 38 29 5a 3b 0a 7d 0a 73 6f 72 74 6c 69 73  (u8)Z;.}.sortlis
5cf0: 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 59 29  t(A) ::= expr(Y)
5d00: 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b   sortorder(Z). {
5d10: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78  .  A = sqlite3Ex
5d20: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
5d30: 72 73 65 2c 30 2c 59 2e 70 45 78 70 72 29 3b 0a  rse,0,Y.pExpr);.
5d40: 20 20 69 66 28 20 41 20 26 26 20 41 4c 57 41 59    if( A && ALWAY
5d50: 53 28 41 2d 3e 61 29 20 29 20 41 2d 3e 61 5b 30  S(A->a) ) A->a[0
5d60: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  ].sortOrder = (u
5d70: 38 29 5a 3b 0a 7d 0a 0a 25 74 79 70 65 20 73 6f  8)Z;.}..%type so
5d80: 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d 0a 0a 73  rtorder {int}..s
5d90: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20  ortorder(A) ::= 
5da0: 41 53 43 2e 20 20 20 20 20 20 20 20 20 20 20 7b  ASC.           {
5db0: 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53  A = SQLITE_SO_AS
5dc0: 43 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29  C;}.sortorder(A)
5dd0: 20 3a 3a 3d 20 44 45 53 43 2e 20 20 20 20 20 20   ::= DESC.      
5de0: 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 5f      {A = SQLITE_
5df0: 53 4f 5f 44 45 53 43 3b 7d 0a 73 6f 72 74 6f 72  SO_DESC;}.sortor
5e00: 64 65 72 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  der(A) ::= .    
5e10: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53            {A = S
5e20: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 0a  QLITE_SO_ASC;}..
5e30: 25 74 79 70 65 20 67 72 6f 75 70 62 79 5f 6f 70  %type groupby_op
5e40: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
5e50: 65 73 74 72 75 63 74 6f 72 20 67 72 6f 75 70 62  estructor groupb
5e60: 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  y_opt {sqlite3Ex
5e70: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
5e80: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 67  rse->db, $$);}.g
5e90: 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a  roupby_opt(A) ::
5ea0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
5eb0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b           {A = 0;
5ec0: 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29  }.groupby_opt(A)
5ed0: 20 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 6e 65   ::= GROUP BY ne
5ee0: 78 70 72 6c 69 73 74 28 58 29 2e 20 7b 41 20 3d  xprlist(X). {A =
5ef0: 20 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76 69   X;}..%type havi
5f00: 6e 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25  ng_opt {Expr*}.%
5f10: 64 65 73 74 72 75 63 74 6f 72 20 68 61 76 69 6e  destructor havin
5f20: 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78  g_opt {sqlite3Ex
5f30: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
5f40: 3e 64 62 2c 20 24 24 29 3b 7d 0a 68 61 76 69 6e  >db, $$);}.havin
5f50: 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  g_opt(A) ::= .  
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
5f70: 20 3d 20 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70   = 0;}.having_op
5f80: 74 28 41 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20  t(A) ::= HAVING 
5f90: 65 78 70 72 28 58 29 2e 20 20 7b 41 20 3d 20 58  expr(X).  {A = X
5fa0: 2e 70 45 78 70 72 3b 7d 0a 0a 25 74 79 70 65 20  .pExpr;}..%type 
5fb0: 6c 69 6d 69 74 5f 6f 70 74 20 7b 73 74 72 75 63  limit_opt {struc
5fc0: 74 20 4c 69 6d 69 74 56 61 6c 7d 0a 0a 2f 2f 20  t LimitVal}..// 
5fd0: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  The destructor f
5fe0: 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 77 69 6c  or limit_opt wil
5ff0: 6c 20 6e 65 76 65 72 20 66 69 72 65 20 69 6e 20  l never fire in 
6000: 74 68 65 20 63 75 72 72 65 6e 74 20 67 72 61 6d  the current gram
6010: 6d 61 72 2e 0a 2f 2f 20 54 68 65 20 6c 69 6d 69  mar..// The limi
6020: 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e  t_opt non-termin
6030: 61 6c 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 61  al only occurs a
6040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 73  t the end of a s
6050: 69 6e 67 6c 65 20 70 72 6f 64 75 63 74 69 6f 6e  ingle production
6060: 0a 2f 2f 20 72 75 6c 65 20 66 6f 72 20 53 45 4c  .// rule for SEL
6070: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ECT statements. 
6080: 20 41 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 20   As soon as the 
6090: 72 75 6c 65 20 74 68 61 74 20 63 72 65 61 74 65  rule that create
60a0: 20 74 68 65 20 0a 2f 2f 20 6c 69 6d 69 74 5f 6f   the .// limit_o
60b0: 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  pt non-terminal 
60c0: 72 65 64 75 63 65 73 2c 20 74 68 65 20 53 45 4c  reduces, the SEL
60d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 75  ECT statement ru
60e0: 6c 65 20 77 69 6c 6c 20 61 6c 73 6f 0a 2f 2f 20  le will also.// 
60f0: 72 65 64 75 63 65 2e 20 20 53 6f 20 74 68 65 72  reduce.  So ther
6100: 65 20 69 73 20 6e 65 76 65 72 20 61 20 6c 69 6d  e is never a lim
6110: 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69  it_opt non-termi
6120: 6e 61 6c 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  nal on the stack
6130: 20 0a 2f 2f 20 65 78 63 65 70 74 20 61 73 20 61   .// except as a
6140: 20 74 72 61 6e 73 69 65 6e 74 2e 20 20 53 6f 20   transient.  So 
6150: 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
6160: 6e 79 74 68 69 6e 67 20 74 6f 20 64 65 73 74 72  nything to destr
6170: 6f 79 2e 0a 2f 2f 0a 2f 2f 25 64 65 73 74 72 75  oy..//.//%destru
6180: 63 74 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 7b  ctor limit_opt {
6190: 0a 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70 72  .//  sqlite3Expr
61a0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
61b0: 62 2c 20 24 24 2e 70 4c 69 6d 69 74 29 3b 0a 2f  b, $$.pLimit);./
61c0: 2f 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  /  sqlite3ExprDe
61d0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
61e0: 20 24 24 2e 70 4f 66 66 73 65 74 29 3b 0a 2f 2f   $$.pOffset);.//
61f0: 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a  }.limit_opt(A) :
6200: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20  := .            
6210: 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d 69          {A.pLimi
6220: 74 20 3d 20 30 3b 20 41 2e 70 4f 66 66 73 65 74  t = 0; A.pOffset
6230: 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74   = 0;}.limit_opt
6240: 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78  (A) ::= LIMIT ex
6250: 70 72 28 58 29 2e 20 20 20 20 20 20 20 7b 41 2e  pr(X).       {A.
6260: 70 4c 69 6d 69 74 20 3d 20 58 2e 70 45 78 70 72  pLimit = X.pExpr
6270: 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 30 3b  ; A.pOffset = 0;
6280: 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 3a  }.limit_opt(A) :
6290: 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58 29  := LIMIT expr(X)
62a0: 20 4f 46 46 53 45 54 20 65 78 70 72 28 59 29 2e   OFFSET expr(Y).
62b0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d 69          {A.pLimi
62e0: 74 20 3d 20 58 2e 70 45 78 70 72 3b 20 41 2e 70  t = X.pExpr; A.p
62f0: 4f 66 66 73 65 74 20 3d 20 59 2e 70 45 78 70 72  Offset = Y.pExpr
6300: 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20  ;}.limit_opt(A) 
6310: 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58  ::= LIMIT expr(X
6320: 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e  ) COMMA expr(Y).
6330: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 20 20 20 20 20 20 7b 41 2e 70 4f 66 66 73          {A.pOffs
6360: 65 74 20 3d 20 58 2e 70 45 78 70 72 3b 20 41 2e  et = X.pExpr; A.
6370: 70 4c 69 6d 69 74 20 3d 20 59 2e 70 45 78 70 72  pLimit = Y.pExpr
6380: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
6390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
63a0: 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 65  The DELETE state
63b0: 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ment ///////////
63c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
63d0: 2f 2f 0a 2f 2f 0a 25 69 66 64 65 66 20 53 51 4c  //.//.%ifdef SQL
63e0: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
63f0: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a 63  E_DELETE_LIMIT.c
6400: 6d 64 20 3a 3a 3d 20 77 69 74 68 28 43 29 20 44  md ::= with(C) D
6410: 45 4c 45 54 45 20 46 52 4f 4d 20 66 75 6c 6c 6e  ELETE FROM fulln
6420: 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f 6f  ame(X) indexed_o
6430: 70 74 28 49 29 20 77 68 65 72 65 5f 6f 70 74 28  pt(I) where_opt(
6440: 57 29 20 0a 20 20 20 20 20 20 20 20 6f 72 64 65  W) .        orde
6450: 72 62 79 5f 6f 70 74 28 4f 29 20 6c 69 6d 69 74  rby_opt(O) limit
6460: 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 73 71 6c  _opt(L). {.  sql
6470: 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61  ite3WithPush(pPa
6480: 72 73 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73 71  rse, C, 1);.  sq
6490: 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65  lite3SrcListInde
64a0: 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c  xedBy(pParse, X,
64b0: 20 26 49 29 3b 0a 20 20 57 20 3d 20 73 71 6c 69   &I);.  W = sqli
64c0: 74 65 33 4c 69 6d 69 74 57 68 65 72 65 28 70 50  te3LimitWhere(pP
64d0: 61 72 73 65 2c 20 58 2c 20 57 2c 20 4f 2c 20 4c  arse, X, W, O, L
64e0: 2e 70 4c 69 6d 69 74 2c 20 4c 2e 70 4f 66 66 73  .pLimit, L.pOffs
64f0: 65 74 2c 20 22 44 45 4c 45 54 45 22 29 3b 0a 20  et, "DELETE");. 
6500: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46 72   sqlite3DeleteFr
6510: 6f 6d 28 70 50 61 72 73 65 2c 58 2c 57 29 3b 0a  om(pParse,X,W);.
6520: 7d 0a 25 65 6e 64 69 66 0a 25 69 66 6e 64 65 66  }.%endif.%ifndef
6530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
6540: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
6550: 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 28  IT.cmd ::= with(
6560: 43 29 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 66  C) DELETE FROM f
6570: 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65 78  ullname(X) index
6580: 65 64 5f 6f 70 74 28 49 29 20 77 68 65 72 65 5f  ed_opt(I) where_
6590: 6f 70 74 28 57 29 2e 20 7b 0a 20 20 73 71 6c 69  opt(W). {.  sqli
65a0: 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 72  te3WithPush(pPar
65b0: 73 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73 71 6c  se, C, 1);.  sql
65c0: 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
65d0: 65 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c 20  edBy(pParse, X, 
65e0: 26 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  &I);.  sqlite3De
65f0: 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c  leteFrom(pParse,
6600: 58 2c 57 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a  X,W);.}.%endif..
6610: 25 74 79 70 65 20 77 68 65 72 65 5f 6f 70 74 20  %type where_opt 
6620: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63  {Expr*}.%destruc
6630: 74 6f 72 20 77 68 65 72 65 5f 6f 70 74 20 7b 73  tor where_opt {s
6640: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
6650: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
6660: 3b 7d 0a 0a 77 68 65 72 65 5f 6f 70 74 28 41 29  ;}..where_opt(A)
6670: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
6680: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
6690: 3b 7d 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 20  ;}.where_opt(A) 
66a0: 3a 3a 3d 20 57 48 45 52 45 20 65 78 70 72 28 58  ::= WHERE expr(X
66b0: 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58 2e  ).       {A = X.
66c0: 70 45 78 70 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  pExpr;}..///////
66d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
66e0: 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20 63  /// The UPDATE c
66f0: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
6700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6710: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65  ///////.//.%ifde
6720: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
6730: 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49  UPDATE_DELETE_LI
6740: 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68  MIT.cmd ::= with
6750: 28 43 29 20 55 50 44 41 54 45 20 6f 72 63 6f 6e  (C) UPDATE orcon
6760: 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29  f(R) fullname(X)
6770: 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 20   indexed_opt(I) 
6780: 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 0a 20  SET setlist(Y). 
6790: 20 20 20 20 20 20 20 77 68 65 72 65 5f 6f 70 74         where_opt
67a0: 28 57 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 28  (W) orderby_opt(
67b0: 4f 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e  O) limit_opt(L).
67c0: 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 74    {.  sqlite3Wit
67d0: 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 43 2c  hPush(pParse, C,
67e0: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72   1);.  sqlite3Sr
67f0: 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 70  cListIndexedBy(p
6800: 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20  Parse, X, &I);. 
6810: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
6820: 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
6830: 73 65 2c 59 2c 22 73 65 74 20 6c 69 73 74 22 29  se,Y,"set list")
6840: 3b 20 0a 20 20 57 20 3d 20 73 71 6c 69 74 65 33  ; .  W = sqlite3
6850: 4c 69 6d 69 74 57 68 65 72 65 28 70 50 61 72 73  LimitWhere(pPars
6860: 65 2c 20 58 2c 20 57 2c 20 4f 2c 20 4c 2e 70 4c  e, X, W, O, L.pL
6870: 69 6d 69 74 2c 20 4c 2e 70 4f 66 66 73 65 74 2c  imit, L.pOffset,
6880: 20 22 55 50 44 41 54 45 22 29 3b 0a 20 20 73 71   "UPDATE");.  sq
6890: 6c 69 74 65 33 55 70 64 61 74 65 28 70 50 61 72  lite3Update(pPar
68a0: 73 65 2c 58 2c 59 2c 57 2c 52 29 3b 0a 7d 0a 25  se,X,Y,W,R);.}.%
68b0: 65 6e 64 69 66 0a 25 69 66 6e 64 65 66 20 53 51  endif.%ifndef SQ
68c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
68d0: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a  TE_DELETE_LIMIT.
68e0: 63 6d 64 20 3a 3a 3d 20 77 69 74 68 28 43 29 20  cmd ::= with(C) 
68f0: 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 29  UPDATE orconf(R)
6900: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64   fullname(X) ind
6910: 65 78 65 64 5f 6f 70 74 28 49 29 20 53 45 54 20  exed_opt(I) SET 
6920: 73 65 74 6c 69 73 74 28 59 29 0a 20 20 20 20 20  setlist(Y).     
6930: 20 20 20 77 68 65 72 65 5f 6f 70 74 28 57 29 2e     where_opt(W).
6940: 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 74    {.  sqlite3Wit
6950: 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 43 2c  hPush(pParse, C,
6960: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72   1);.  sqlite3Sr
6970: 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 70  cListIndexedBy(p
6980: 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a 20  Parse, X, &I);. 
6990: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
69a0: 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
69b0: 73 65 2c 59 2c 22 73 65 74 20 6c 69 73 74 22 29  se,Y,"set list")
69c0: 3b 20 0a 20 20 73 71 6c 69 74 65 33 55 70 64 61  ; .  sqlite3Upda
69d0: 74 65 28 70 50 61 72 73 65 2c 58 2c 59 2c 57 2c  te(pParse,X,Y,W,
69e0: 52 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25 74  R);.}.%endif..%t
69f0: 79 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 70  ype setlist {Exp
6a00: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
6a10: 74 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 6c  tor setlist {sql
6a20: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
6a30: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  te(pParse->db, $
6a40: 24 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29  $);}..setlist(A)
6a50: 20 3a 3a 3d 20 73 65 74 6c 69 73 74 28 5a 29 20   ::= setlist(Z) 
6a60: 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 65  COMMA nm(X) EQ e
6a70: 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20  xpr(Y). {.  A = 
6a80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
6a90: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 5a 2c  ppend(pParse, Z,
6aa0: 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 73 71 6c   Y.pExpr);.  sql
6ab0: 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e  ite3ExprListSetN
6ac0: 61 6d 65 28 70 50 61 72 73 65 2c 20 41 2c 20 26  ame(pParse, A, &
6ad0: 58 2c 20 31 29 3b 0a 7d 0a 73 65 74 6c 69 73 74  X, 1);.}.setlist
6ae0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 45 51  (A) ::= nm(X) EQ
6af0: 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20   expr(Y). {.  A 
6b00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
6b10: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20  tAppend(pParse, 
6b20: 30 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 73  0, Y.pExpr);.  s
6b30: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65  qlite3ExprListSe
6b40: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 41 2c  tName(pParse, A,
6b50: 20 26 58 2c 20 31 29 3b 0a 7d 0a 0a 2f 2f 2f 2f   &X, 1);.}..////
6b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6b70: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 49 4e 53 45 52  ////// The INSER
6b80: 54 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  T command //////
6b90: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6ba0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63  ///////////.//.c
6bb0: 6d 64 20 3a 3a 3d 20 77 69 74 68 28 57 29 20 69  md ::= with(W) i
6bc0: 6e 73 65 72 74 5f 63 6d 64 28 52 29 20 49 4e 54  nsert_cmd(R) INT
6bd0: 4f 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e  O fullname(X) in
6be0: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20  scollist_opt(F) 
6bf0: 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73  select(S). {.  s
6c00: 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70  qlite3WithPush(p
6c10: 50 61 72 73 65 2c 20 57 2c 20 31 29 3b 0a 20 20  Parse, W, 1);.  
6c20: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70 50  sqlite3Insert(pP
6c30: 61 72 73 65 2c 20 58 2c 20 53 2c 20 46 2c 20 52  arse, X, S, F, R
6c40: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 77 69 74  );.}.cmd ::= wit
6c50: 68 28 57 29 20 69 6e 73 65 72 74 5f 63 6d 64 28  h(W) insert_cmd(
6c60: 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65  R) INTO fullname
6c70: 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f  (X) inscollist_o
6c80: 70 74 28 46 29 20 44 45 46 41 55 4c 54 20 56 41  pt(F) DEFAULT VA
6c90: 4c 55 45 53 2e 0a 7b 0a 20 20 73 71 6c 69 74 65  LUES..{.  sqlite
6ca0: 33 57 69 74 68 50 75 73 68 28 70 50 61 72 73 65  3WithPush(pParse
6cb0: 2c 20 57 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74  , W, 1);.  sqlit
6cc0: 65 33 49 6e 73 65 72 74 28 70 50 61 72 73 65 2c  e3Insert(pParse,
6cd0: 20 58 2c 20 30 2c 20 46 2c 20 52 29 3b 0a 7d 0a   X, 0, F, R);.}.
6ce0: 0a 25 74 79 70 65 20 69 6e 73 65 72 74 5f 63 6d  .%type insert_cm
6cf0: 64 20 7b 75 38 7d 0a 69 6e 73 65 72 74 5f 63 6d  d {u8}.insert_cm
6d00: 64 28 41 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20  d(A) ::= INSERT 
6d10: 6f 72 63 6f 6e 66 28 52 29 2e 20 20 20 7b 41 20  orconf(R).   {A 
6d20: 3d 20 52 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d 64  = R;}.insert_cmd
6d30: 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e  (A) ::= REPLACE.
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d              {A =
6d50: 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 25   OE_Replace;}..%
6d60: 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74 5f  type inscollist_
6d70: 6f 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64  opt {IdList*}.%d
6d80: 65 73 74 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c  estructor inscol
6d90: 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65  list_opt {sqlite
6da0: 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70 50  3IdListDelete(pP
6db0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a  arse->db, $$);}.
6dc0: 25 74 79 70 65 20 69 64 6c 69 73 74 20 7b 49 64  %type idlist {Id
6dd0: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
6de0: 6f 72 20 69 64 6c 69 73 74 20 7b 73 71 6c 69 74  or idlist {sqlit
6df0: 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 70  e3IdListDelete(p
6e00: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
6e10: 0a 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74  ..inscollist_opt
6e20: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
6e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e40: 7b 41 20 3d 20 30 3b 7d 0a 69 6e 73 63 6f 6c 6c  {A = 0;}.inscoll
6e50: 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c  ist_opt(A) ::= L
6e60: 50 20 69 64 6c 69 73 74 28 58 29 20 52 50 2e 20  P idlist(X) RP. 
6e70: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 6c 69     {A = X;}.idli
6e80: 73 74 28 41 29 20 3a 3a 3d 20 69 64 6c 69 73 74  st(A) ::= idlist
6e90: 28 58 29 20 43 4f 4d 4d 41 20 6e 6d 28 59 29 2e  (X) COMMA nm(Y).
6ea0: 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  .    {A = sqlite
6eb0: 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 70 50  3IdListAppend(pP
6ec0: 61 72 73 65 2d 3e 64 62 2c 58 2c 26 59 29 3b 7d  arse->db,X,&Y);}
6ed0: 0a 69 64 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e  .idlist(A) ::= n
6ee0: 6d 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73  m(Y)..    {A = s
6ef0: 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65  qlite3IdListAppe
6f00: 6e 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c  nd(pParse->db,0,
6f10: 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  &Y);}../////////
6f20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f30: 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20 50 72  // Expression Pr
6f40: 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f  ocessing ///////
6f50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
6f60: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65  //////.//..%type
6f70: 20 65 78 70 72 20 7b 45 78 70 72 53 70 61 6e 7d   expr {ExprSpan}
6f80: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78 70  .%destructor exp
6f90: 72 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65  r {sqlite3ExprDe
6fa0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
6fb0: 20 24 24 2e 70 45 78 70 72 29 3b 7d 0a 25 74 79   $$.pExpr);}.%ty
6fc0: 70 65 20 74 65 72 6d 20 7b 45 78 70 72 53 70 61  pe term {ExprSpa
6fd0: 6e 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74  n}.%destructor t
6fe0: 65 72 6d 20 7b 73 71 6c 69 74 65 33 45 78 70 72  erm {sqlite3Expr
6ff0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
7000: 62 2c 20 24 24 2e 70 45 78 70 72 29 3b 7d 0a 0a  b, $$.pExpr);}..
7010: 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20  %include {.  /* 
7020: 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74  This is a utilit
7030: 79 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74  y routine used t
7040: 6f 20 73 65 74 20 74 68 65 20 45 78 70 72 53 70  o set the ExprSp
7050: 61 6e 2e 7a 53 74 61 72 74 20 61 6e 64 0a 20 20  an.zStart and.  
7060: 2a 2a 20 45 78 70 72 53 70 61 6e 2e 7a 45 6e 64  ** ExprSpan.zEnd
7070: 20 76 61 6c 75 65 73 20 6f 66 20 70 4f 75 74 20   values of pOut 
7080: 73 6f 20 74 68 61 74 20 74 68 65 20 73 70 61 6e  so that the span
7090: 20 63 6f 76 65 72 73 20 74 68 65 20 63 6f 6d 70   covers the comp
70a0: 6c 65 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 20  lete.  ** range 
70b0: 6f 66 20 74 65 78 74 20 62 65 67 69 6e 6e 69 6e  of text beginnin
70c0: 67 20 77 69 74 68 20 70 53 74 61 72 74 20 61 6e  g with pStart an
70d0: 64 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 20 65  d going to the e
70e0: 6e 64 20 6f 66 20 70 45 6e 64 2e 0a 20 20 2a 2f  nd of pEnd..  */
70f0: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73  .  static void s
7100: 70 61 6e 53 65 74 28 45 78 70 72 53 70 61 6e 20  panSet(ExprSpan 
7110: 2a 70 4f 75 74 2c 20 54 6f 6b 65 6e 20 2a 70 53  *pOut, Token *pS
7120: 74 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e  tart, Token *pEn
7130: 64 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53  d){.    pOut->zS
7140: 74 61 72 74 20 3d 20 70 53 74 61 72 74 2d 3e 7a  tart = pStart->z
7150: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64  ;.    pOut->zEnd
7160: 20 3d 20 26 70 45 6e 64 2d 3e 7a 5b 70 45 6e 64   = &pEnd->z[pEnd
7170: 2d 3e 6e 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ->n];.  }..  /* 
7180: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
7190: 45 78 70 72 20 6f 62 6a 65 63 74 20 66 72 6f 6d  Expr object from
71a0: 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
71b0: 66 69 65 72 2e 20 20 55 73 65 20 74 68 65 0a 20  fier.  Use the. 
71c0: 20 2a 2a 20 6e 65 77 20 45 78 70 72 20 74 6f 20   ** new Expr to 
71d0: 70 6f 70 75 6c 61 74 65 20 70 4f 75 74 2e 20 20  populate pOut.  
71e0: 53 65 74 20 74 68 65 20 73 70 61 6e 20 6f 66 20  Set the span of 
71f0: 70 4f 75 74 20 74 6f 20 62 65 20 74 68 65 20 69  pOut to be the i
7200: 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 74  dentifier.  ** t
7210: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20  hat created the 
7220: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2f  expression..  */
7230: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73  .  static void s
7240: 70 61 6e 45 78 70 72 28 45 78 70 72 53 70 61 6e  panExpr(ExprSpan
7250: 20 2a 70 4f 75 74 2c 20 50 61 72 73 65 20 2a 70   *pOut, Parse *p
7260: 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54  Parse, int op, T
7270: 6f 6b 65 6e 20 2a 70 56 61 6c 75 65 29 7b 0a 20  oken *pValue){. 
7280: 20 20 20 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d     pOut->pExpr =
7290: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
72a0: 61 72 73 65 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  arse, op, 0, 0, 
72b0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 70 4f 75  pValue);.    pOu
72c0: 74 2d 3e 7a 53 74 61 72 74 20 3d 20 70 56 61 6c  t->zStart = pVal
72d0: 75 65 2d 3e 7a 3b 0a 20 20 20 20 70 4f 75 74 2d  ue->z;.    pOut-
72e0: 3e 7a 45 6e 64 20 3d 20 26 70 56 61 6c 75 65 2d  >zEnd = &pValue-
72f0: 3e 7a 5b 70 56 61 6c 75 65 2d 3e 6e 5d 3b 0a 20  >z[pValue->n];. 
7300: 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a   }.}..expr(A) ::
7310: 3d 20 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20  = term(X).      
7320: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
7330: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42  expr(A) ::= LP(B
7340: 29 20 65 78 70 72 28 58 29 20 52 50 28 45 29 2e  ) expr(X) RP(E).
7350: 20 7b 41 2e 70 45 78 70 72 20 3d 20 58 2e 70 45   {A.pExpr = X.pE
7360: 78 70 72 3b 20 73 70 61 6e 53 65 74 28 26 41 2c  xpr; spanSet(&A,
7370: 26 42 2c 26 45 29 3b 7d 0a 74 65 72 6d 28 41 29  &B,&E);}.term(A)
7380: 20 3a 3a 3d 20 4e 55 4c 4c 28 58 29 2e 20 20 20   ::= NULL(X).   
7390: 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 45            {spanE
73a0: 78 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c 20  xpr(&A, pParse, 
73b0: 40 58 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41  @X, &X);}.expr(A
73c0: 29 20 3a 3a 3d 20 69 64 28 58 29 2e 20 20 20 20  ) ::= id(X).    
73d0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e             {span
73e0: 45 78 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c  Expr(&A, pParse,
73f0: 20 54 4b 5f 49 44 2c 20 26 58 29 3b 7d 0a 65 78   TK_ID, &X);}.ex
7400: 70 72 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b  pr(A) ::= JOIN_K
7410: 57 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b  W(X).          {
7420: 73 70 61 6e 45 78 70 72 28 26 41 2c 20 70 50 61  spanExpr(&A, pPa
7430: 72 73 65 2c 20 54 4b 5f 49 44 2c 20 26 58 29 3b  rse, TK_ID, &X);
7440: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d  }.expr(A) ::= nm
7450: 28 58 29 20 44 4f 54 20 6e 6d 28 59 29 2e 20 7b  (X) DOT nm(Y). {
7460: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20 3d  .  Expr *temp1 =
7470: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
7480: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
7490: 30 2c 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a  0, &X);.  Expr *
74a0: 74 65 6d 70 32 20 3d 20 73 71 6c 69 74 65 33 50  temp2 = sqlite3P
74b0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
74c0: 49 44 2c 20 30 2c 20 30 2c 20 26 59 29 3b 0a 20  ID, 0, 0, &Y);. 
74d0: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74   A.pExpr = sqlit
74e0: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
74f0: 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74  TK_DOT, temp1, t
7500: 65 6d 70 32 2c 20 30 29 3b 0a 20 20 73 70 61 6e  emp2, 0);.  span
7510: 53 65 74 28 26 41 2c 26 58 2c 26 59 29 3b 0a 7d  Set(&A,&X,&Y);.}
7520: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e 6d 28  .expr(A) ::= nm(
7530: 58 29 20 44 4f 54 20 6e 6d 28 59 29 20 44 4f 54  X) DOT nm(Y) DOT
7540: 20 6e 6d 28 5a 29 2e 20 7b 0a 20 20 45 78 70 72   nm(Z). {.  Expr
7550: 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65   *temp1 = sqlite
7560: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7570: 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 58 29 3b  K_ID, 0, 0, &X);
7580: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20 3d  .  Expr *temp2 =
7590: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
75a0: 61 72 73 65 2c 20 54 4b 5f 49 44 2c 20 30 2c 20  arse, TK_ID, 0, 
75b0: 30 2c 20 26 59 29 3b 0a 20 20 45 78 70 72 20 2a  0, &Y);.  Expr *
75c0: 74 65 6d 70 33 20 3d 20 73 71 6c 69 74 65 33 50  temp3 = sqlite3P
75d0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
75e0: 49 44 2c 20 30 2c 20 30 2c 20 26 5a 29 3b 0a 20  ID, 0, 0, &Z);. 
75f0: 20 45 78 70 72 20 2a 74 65 6d 70 34 20 3d 20 73   Expr *temp4 = s
7600: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
7610: 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70  se, TK_DOT, temp
7620: 32 2c 20 74 65 6d 70 33 2c 20 30 29 3b 0a 20 20  2, temp3, 0);.  
7630: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65  A.pExpr = sqlite
7640: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7650: 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65  K_DOT, temp1, te
7660: 6d 70 34 2c 20 30 29 3b 0a 20 20 73 70 61 6e 53  mp4, 0);.  spanS
7670: 65 74 28 26 41 2c 26 58 2c 26 5a 29 3b 0a 7d 0a  et(&A,&X,&Z);.}.
7680: 74 65 72 6d 28 41 29 20 3a 3a 3d 20 49 4e 54 45  term(A) ::= INTE
7690: 47 45 52 7c 46 4c 4f 41 54 7c 42 4c 4f 42 28 58  GER|FLOAT|BLOB(X
76a0: 29 2e 20 20 7b 73 70 61 6e 45 78 70 72 28 26 41  ).  {spanExpr(&A
76b0: 2c 20 70 50 61 72 73 65 2c 20 40 58 2c 20 26 58  , pParse, @X, &X
76c0: 29 3b 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20  );}.term(A) ::= 
76d0: 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20 20 20  STRING(X).      
76e0: 20 20 20 20 20 20 20 20 7b 73 70 61 6e 45 78 70          {spanExp
76f0: 72 28 26 41 2c 20 70 50 61 72 73 65 2c 20 40 58  r(&A, pParse, @X
7700: 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20  , &X);}.expr(A) 
7710: 3a 3a 3d 20 56 41 52 49 41 42 4c 45 28 58 29 2e  ::= VARIABLE(X).
7720: 20 20 20 20 20 7b 0a 20 20 69 66 28 20 58 2e 6e       {.  if( X.n
7730: 3e 3d 32 20 26 26 20 58 2e 7a 5b 30 5d 3d 3d 27  >=2 && X.z[0]=='
7740: 23 27 20 26 26 20 73 71 6c 69 74 65 33 49 73 64  #' && sqlite3Isd
7750: 69 67 69 74 28 58 2e 7a 5b 31 5d 29 20 29 7b 0a  igit(X.z[1]) ){.
7760: 20 20 20 20 2f 2a 20 57 68 65 6e 20 64 6f 69 6e      /* When doin
7770: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
7780: 2c 20 6f 6e 65 20 63 61 6e 20 69 6e 63 6c 75 64  , one can includ
7790: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
77a0: 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20  pression.    ** 
77b0: 74 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74  that look like t
77c0: 68 69 73 3a 20 20 20 23 31 20 23 32 20 2e 2e 2e  his:   #1 #2 ...
77d0: 20 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65    These terms re
77e0: 66 65 72 20 74 6f 20 72 65 67 69 73 74 65 72 73  fer to registers
77f0: 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 76  .    ** in the v
7800: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
7810: 20 23 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20   #N is the N-th 
7820: 72 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20  register. */.   
7830: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73   if( pParse->nes
7840: 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ted==0 ){.      
7850: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7860: 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22  pParse, "near \"
7870: 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72  %T\": syntax err
7880: 6f 72 22 2c 20 26 58 29 3b 0a 20 20 20 20 20 20  or", &X);.      
7890: 41 2e 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20  A.pExpr = 0;.   
78a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 2e   }else{.      A.
78b0: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
78c0: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
78d0: 52 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20  REGISTER, 0, 0, 
78e0: 26 58 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41  &X);.      if( A
78f0: 2e 70 45 78 70 72 20 29 20 73 71 6c 69 74 65 33  .pExpr ) sqlite3
7900: 47 65 74 49 6e 74 33 32 28 26 58 2e 7a 5b 31 5d  GetInt32(&X.z[1]
7910: 2c 20 26 41 2e 70 45 78 70 72 2d 3e 69 54 61 62  , &A.pExpr->iTab
7920: 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  le);.    }.  }el
7930: 73 65 7b 0a 20 20 20 20 73 70 61 6e 45 78 70 72  se{.    spanExpr
7940: 28 26 41 2c 20 70 50 61 72 73 65 2c 20 54 4b 5f  (&A, pParse, TK_
7950: 56 41 52 49 41 42 4c 45 2c 20 26 58 29 3b 0a 20  VARIABLE, &X);. 
7960: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 73     sqlite3ExprAs
7970: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 70 50  signVarNumber(pP
7980: 61 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a  arse, A.pExpr);.
7990: 20 20 7d 0a 20 20 73 70 61 6e 53 65 74 28 26 41    }.  spanSet(&A
79a0: 2c 20 26 58 2c 20 26 58 29 3b 0a 7d 0a 65 78 70  , &X, &X);.}.exp
79b0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 45 29  r(A) ::= expr(E)
79c0: 20 43 4f 4c 4c 41 54 45 20 69 64 73 28 43 29 2e   COLLATE ids(C).
79d0: 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73   {.  A.pExpr = s
79e0: 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c  qlite3ExprAddCol
79f0: 6c 61 74 65 54 6f 6b 65 6e 28 70 50 61 72 73 65  lateToken(pParse
7a00: 2c 20 45 2e 70 45 78 70 72 2c 20 26 43 2c 20 31  , E.pExpr, &C, 1
7a10: 29 3b 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20  );.  A.zStart = 
7a20: 45 2e 7a 53 74 61 72 74 3b 0a 20 20 41 2e 7a 45  E.zStart;.  A.zE
7a30: 6e 64 20 3d 20 26 43 2e 7a 5b 43 2e 6e 5d 3b 0a  nd = &C.z[C.n];.
7a40: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.%ifndef SQLITE
7a50: 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28  _OMIT_CAST.expr(
7a60: 41 29 20 3a 3a 3d 20 43 41 53 54 28 58 29 20 4c  A) ::= CAST(X) L
7a70: 50 20 65 78 70 72 28 45 29 20 41 53 20 74 79 70  P expr(E) AS typ
7a80: 65 74 6f 6b 65 6e 28 54 29 20 52 50 28 59 29 2e  etoken(T) RP(Y).
7a90: 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73   {.  A.pExpr = s
7aa0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
7ab0: 73 65 2c 20 54 4b 5f 43 41 53 54 2c 20 45 2e 70  se, TK_CAST, E.p
7ac0: 45 78 70 72 2c 20 30 2c 20 26 54 29 3b 0a 20 20  Expr, 0, &T);.  
7ad0: 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c 26 59  spanSet(&A,&X,&Y
7ae0: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c  );.}.%endif  SQL
7af0: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78  ITE_OMIT_CAST.ex
7b00: 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 20  pr(A) ::= id(X) 
7b10: 4c 50 20 64 69 73 74 69 6e 63 74 28 44 29 20 65  LP distinct(D) e
7b20: 78 70 72 6c 69 73 74 28 59 29 20 52 50 28 45 29  xprlist(Y) RP(E)
7b30: 2e 20 7b 0a 20 20 69 66 28 20 59 20 26 26 20 59  . {.  if( Y && Y
7b40: 2d 3e 6e 45 78 70 72 3e 70 50 61 72 73 65 2d 3e  ->nExpr>pParse->
7b50: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7b60: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
7b70: 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c  _ARG] ){.    sql
7b80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7b90: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  rse, "too many a
7ba0: 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63  rguments on func
7bb0: 74 69 6f 6e 20 25 54 22 2c 20 26 58 29 3b 0a 20  tion %T", &X);. 
7bc0: 20 7d 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73   }.  A.pExpr = s
7bd0: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
7be0: 6f 6e 28 70 50 61 72 73 65 2c 20 59 2c 20 26 58  on(pParse, Y, &X
7bf0: 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c  );.  spanSet(&A,
7c00: 26 58 2c 26 45 29 3b 0a 20 20 69 66 28 20 44 20  &X,&E);.  if( D 
7c10: 26 26 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20  && A.pExpr ){.  
7c20: 20 20 41 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73    A.pExpr->flags
7c30: 20 7c 3d 20 45 50 5f 44 69 73 74 69 6e 63 74 3b   |= EP_Distinct;
7c40: 0a 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a  .  }.}.expr(A) :
7c50: 3a 3d 20 69 64 28 58 29 20 4c 50 20 53 54 41 52  := id(X) LP STAR
7c60: 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 2e 70 45   RP(E). {.  A.pE
7c70: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
7c80: 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  rFunction(pParse
7c90: 2c 20 30 2c 20 26 58 29 3b 0a 20 20 73 70 61 6e  , 0, &X);.  span
7ca0: 53 65 74 28 26 41 2c 26 58 2c 26 45 29 3b 0a 7d  Set(&A,&X,&E);.}
7cb0: 0a 74 65 72 6d 28 41 29 20 3a 3a 3d 20 43 54 49  .term(A) ::= CTI
7cc0: 4d 45 5f 4b 57 28 4f 50 29 2e 20 7b 0a 20 20 41  ME_KW(OP). {.  A
7cd0: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  .pExpr = sqlite3
7ce0: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 70 50 61  ExprFunction(pPa
7cf0: 72 73 65 2c 20 30 2c 20 26 4f 50 29 3b 0a 20 20  rse, 0, &OP);.  
7d00: 73 70 61 6e 53 65 74 28 26 41 2c 20 26 4f 50 2c  spanSet(&A, &OP,
7d10: 20 26 4f 50 29 3b 0a 7d 0a 0a 25 69 6e 63 6c 75   &OP);.}..%inclu
7d20: 64 65 20 7b 0a 20 20 2f 2a 20 54 68 69 73 20 72  de {.  /* This r
7d30: 6f 75 74 69 6e 65 20 63 6f 6e 73 74 72 75 63 74  outine construct
7d40: 73 20 61 20 62 69 6e 61 72 79 20 65 78 70 72 65  s a binary expre
7d50: 73 73 69 6f 6e 20 6e 6f 64 65 20 6f 75 74 20 6f  ssion node out o
7d60: 66 20 74 77 6f 20 45 78 70 72 53 70 61 6e 0a 20  f two ExprSpan. 
7d70: 20 2a 2a 20 6f 62 6a 65 63 74 73 20 61 6e 64 20   ** objects and 
7d80: 75 73 65 73 20 74 68 65 20 72 65 73 75 6c 74 20  uses the result 
7d90: 74 6f 20 70 6f 70 75 6c 61 74 65 20 61 20 6e 65  to populate a ne
7da0: 77 20 45 78 70 72 53 70 61 6e 20 6f 62 6a 65 63  w ExprSpan objec
7db0: 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63  t..  */.  static
7dc0: 20 76 6f 69 64 20 73 70 61 6e 42 69 6e 61 72 79   void spanBinary
7dd0: 45 78 70 72 28 0a 20 20 20 20 45 78 70 72 53 70  Expr(.    ExprSp
7de0: 61 6e 20 2a 70 4f 75 74 2c 20 20 20 20 20 2f 2a  an *pOut,     /*
7df0: 20 57 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   Write the resul
7e00: 74 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 50 61  t here */.    Pa
7e10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7e20: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7e30: 20 63 6f 6e 74 65 78 74 2e 20 20 45 72 72 6f 72   context.  Error
7e40: 73 20 61 63 63 75 6d 75 6c 61 74 65 20 68 65 72  s accumulate her
7e50: 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 2c  e */.    int op,
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e70: 54 68 65 20 62 69 6e 61 72 79 20 6f 70 65 72 61  The binary opera
7e80: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 45 78 70 72  tion */.    Expr
7e90: 53 70 61 6e 20 2a 70 4c 65 66 74 2c 20 20 20 20  Span *pLeft,    
7ea0: 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70 65 72  /* The left oper
7eb0: 61 6e 64 20 2a 2f 0a 20 20 20 20 45 78 70 72 53  and */.    ExprS
7ec0: 70 61 6e 20 2a 70 52 69 67 68 74 20 20 20 20 2f  pan *pRight    /
7ed0: 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72  * The right oper
7ee0: 61 6e 64 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 20  and */.  ){.    
7ef0: 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20 73 71  pOut->pExpr = sq
7f00: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
7f10: 65 2c 20 6f 70 2c 20 70 4c 65 66 74 2d 3e 70 45  e, op, pLeft->pE
7f20: 78 70 72 2c 20 70 52 69 67 68 74 2d 3e 70 45 78  xpr, pRight->pEx
7f30: 70 72 2c 20 30 29 3b 0a 20 20 20 20 70 4f 75 74  pr, 0);.    pOut
7f40: 2d 3e 7a 53 74 61 72 74 20 3d 20 70 4c 65 66 74  ->zStart = pLeft
7f50: 2d 3e 7a 53 74 61 72 74 3b 0a 20 20 20 20 70 4f  ->zStart;.    pO
7f60: 75 74 2d 3e 7a 45 6e 64 20 3d 20 70 52 69 67 68  ut->zEnd = pRigh
7f70: 74 2d 3e 7a 45 6e 64 3b 0a 20 20 7d 0a 7d 0a 0a  t->zEnd;.  }.}..
7f80: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
7f90: 28 58 29 20 41 4e 44 28 4f 50 29 20 65 78 70 72  (X) AND(OP) expr
7fa0: 28 59 29 2e 20 20 20 20 7b 73 70 61 6e 42 69 6e  (Y).    {spanBin
7fb0: 61 72 79 45 78 70 72 28 26 41 2c 70 50 61 72 73  aryExpr(&A,pPars
7fc0: 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 65  e,@OP,&X,&Y);}.e
7fd0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
7fe0: 58 29 20 4f 52 28 4f 50 29 20 65 78 70 72 28 59  X) OR(OP) expr(Y
7ff0: 29 2e 20 20 20 20 20 7b 73 70 61 6e 42 69 6e 61  ).     {spanBina
8000: 72 79 45 78 70 72 28 26 41 2c 70 50 61 72 73 65  ryExpr(&A,pParse
8010: 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 65 78  ,@OP,&X,&Y);}.ex
8020: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
8030: 29 20 4c 54 7c 47 54 7c 47 45 7c 4c 45 28 4f 50  ) LT|GT|GE|LE(OP
8040: 29 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20  ) expr(Y)..     
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8070: 20 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78     {spanBinaryEx
8080: 70 72 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50  pr(&A,pParse,@OP
8090: 2c 26 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41  ,&X,&Y);}.expr(A
80a0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 45 51  ) ::= expr(X) EQ
80b0: 7c 4e 45 28 4f 50 29 20 65 78 70 72 28 59 29 2e  |NE(OP) expr(Y).
80c0: 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78 70    {spanBinaryExp
80d0: 72 28 26 41 2c 70 50 61 72 73 65 2c 40 4f 50 2c  r(&A,pParse,@OP,
80e0: 26 58 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29  &X,&Y);}.expr(A)
80f0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 42 49 54   ::= expr(X) BIT
8100: 41 4e 44 7c 42 49 54 4f 52 7c 4c 53 48 49 46 54  AND|BITOR|LSHIFT
8110: 7c 52 53 48 49 46 54 28 4f 50 29 20 65 78 70 72  |RSHIFT(OP) expr
8120: 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  (Y)..           
8130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70               {sp
8150: 61 6e 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c  anBinaryExpr(&A,
8160: 70 50 61 72 73 65 2c 40 4f 50 2c 26 58 2c 26 59  pParse,@OP,&X,&Y
8170: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
8180: 65 78 70 72 28 58 29 20 50 4c 55 53 7c 4d 49 4e  expr(X) PLUS|MIN
8190: 55 53 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a  US(OP) expr(Y)..
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81c0: 20 20 20 20 20 20 20 20 7b 73 70 61 6e 42 69 6e          {spanBin
81d0: 61 72 79 45 78 70 72 28 26 41 2c 70 50 61 72 73  aryExpr(&A,pPars
81e0: 65 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 65  e,@OP,&X,&Y);}.e
81f0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
8200: 58 29 20 53 54 41 52 7c 53 4c 41 53 48 7c 52 45  X) STAR|SLASH|RE
8210: 4d 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20  M(OP) expr(Y).. 
8220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 20 20 20 20 20 20 20 7b 73 70 61 6e 42 69 6e 61         {spanBina
8250: 72 79 45 78 70 72 28 26 41 2c 70 50 61 72 73 65  ryExpr(&A,pParse
8260: 2c 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 65 78  ,@OP,&X,&Y);}.ex
8270: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
8280: 29 20 43 4f 4e 43 41 54 28 4f 50 29 20 65 78 70  ) CONCAT(OP) exp
8290: 72 28 59 29 2e 20 7b 73 70 61 6e 42 69 6e 61 72  r(Y). {spanBinar
82a0: 79 45 78 70 72 28 26 41 2c 70 50 61 72 73 65 2c  yExpr(&A,pParse,
82b0: 40 4f 50 2c 26 58 2c 26 59 29 3b 7d 0a 25 74 79  @OP,&X,&Y);}.%ty
82c0: 70 65 20 6c 69 6b 65 6f 70 20 7b 73 74 72 75 63  pe likeop {struc
82d0: 74 20 4c 69 6b 65 4f 70 7d 0a 6c 69 6b 65 6f 70  t LikeOp}.likeop
82e0: 28 41 29 20 3a 3a 3d 20 4c 49 4b 45 5f 4b 57 7c  (A) ::= LIKE_KW|
82f0: 4d 41 54 43 48 28 58 29 2e 20 20 20 20 20 7b 41  MATCH(X).     {A
8300: 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20 58 3b 20  .eOperator = X; 
8310: 41 2e 62 4e 6f 74 20 3d 20 30 3b 7d 0a 6c 69 6b  A.bNot = 0;}.lik
8320: 65 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 4c  eop(A) ::= NOT L
8330: 49 4b 45 5f 4b 57 7c 4d 41 54 43 48 28 58 29 2e  IKE_KW|MATCH(X).
8340: 20 7b 41 2e 65 4f 70 65 72 61 74 6f 72 20 3d 20   {A.eOperator = 
8350: 58 3b 20 41 2e 62 4e 6f 74 20 3d 20 31 3b 7d 0a  X; A.bNot = 1;}.
8360: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
8370: 28 58 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65  (X) likeop(OP) e
8380: 78 70 72 28 59 29 2e 20 20 5b 4c 49 4b 45 5f 4b  xpr(Y).  [LIKE_K
8390: 57 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74  W]  {.  ExprList
83a0: 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
83b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
83c0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
83d0: 30 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 70  0, Y.pExpr);.  p
83e0: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
83f0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
8400: 72 73 65 2c 70 4c 69 73 74 2c 20 58 2e 70 45 78  rse,pList, X.pEx
8410: 70 72 29 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d  pr);.  A.pExpr =
8420: 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63   sqlite3ExprFunc
8430: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 70 4c 69  tion(pParse, pLi
8440: 73 74 2c 20 26 4f 50 2e 65 4f 70 65 72 61 74 6f  st, &OP.eOperato
8450: 72 29 3b 0a 20 20 69 66 28 20 4f 50 2e 62 4e 6f  r);.  if( OP.bNo
8460: 74 20 29 20 41 2e 70 45 78 70 72 20 3d 20 73 71  t ) A.pExpr = sq
8470: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
8480: 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2e 70 45 78  e, TK_NOT, A.pEx
8490: 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 41 2e 7a  pr, 0, 0);.  A.z
84a0: 53 74 61 72 74 20 3d 20 58 2e 7a 53 74 61 72 74  Start = X.zStart
84b0: 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 59 2e 7a  ;.  A.zEnd = Y.z
84c0: 45 6e 64 3b 0a 20 20 69 66 28 20 41 2e 70 45 78  End;.  if( A.pEx
84d0: 70 72 20 29 20 41 2e 70 45 78 70 72 2d 3e 66 6c  pr ) A.pExpr->fl
84e0: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 66 69 78 46  ags |= EP_InfixF
84f0: 75 6e 63 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  unc;.}.expr(A) :
8500: 3a 3d 20 65 78 70 72 28 58 29 20 6c 69 6b 65 6f  := expr(X) likeo
8510: 70 28 4f 50 29 20 65 78 70 72 28 59 29 20 45 53  p(OP) expr(Y) ES
8520: 43 41 50 45 20 65 78 70 72 28 45 29 2e 20 20 5b  CAPE expr(E).  [
8530: 4c 49 4b 45 5f 4b 57 5d 20 20 7b 0a 20 20 45 78  LIKE_KW]  {.  Ex
8540: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  prList *pList;. 
8550: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
8560: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
8570: 50 61 72 73 65 2c 30 2c 20 59 2e 70 45 78 70 72  Parse,0, Y.pExpr
8580: 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
8590: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
85a0: 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c  nd(pParse,pList,
85b0: 20 58 2e 70 45 78 70 72 29 3b 0a 20 20 70 4c 69   X.pExpr);.  pLi
85c0: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
85d0: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
85e0: 65 2c 70 4c 69 73 74 2c 20 45 2e 70 45 78 70 72  e,pList, E.pExpr
85f0: 29 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73  );.  A.pExpr = s
8600: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69  qlite3ExprFuncti
8610: 6f 6e 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74  on(pParse, pList
8620: 2c 20 26 4f 50 2e 65 4f 70 65 72 61 74 6f 72 29  , &OP.eOperator)
8630: 3b 0a 20 20 69 66 28 20 4f 50 2e 62 4e 6f 74 20  ;.  if( OP.bNot 
8640: 29 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  ) A.pExpr = sqli
8650: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
8660: 20 54 4b 5f 4e 4f 54 2c 20 41 2e 70 45 78 70 72   TK_NOT, A.pExpr
8670: 2c 20 30 2c 20 30 29 3b 0a 20 20 41 2e 7a 53 74  , 0, 0);.  A.zSt
8680: 61 72 74 20 3d 20 58 2e 7a 53 74 61 72 74 3b 0a  art = X.zStart;.
8690: 20 20 41 2e 7a 45 6e 64 20 3d 20 45 2e 7a 45 6e    A.zEnd = E.zEn
86a0: 64 3b 0a 20 20 69 66 28 20 41 2e 70 45 78 70 72  d;.  if( A.pExpr
86b0: 20 29 20 41 2e 70 45 78 70 72 2d 3e 66 6c 61 67   ) A.pExpr->flag
86c0: 73 20 7c 3d 20 45 50 5f 49 6e 66 69 78 46 75 6e  s |= EP_InfixFun
86d0: 63 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b  c;.}..%include {
86e0: 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20  .  /* Construct 
86f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  an expression no
8700: 64 65 20 66 6f 72 20 61 20 75 6e 61 72 79 20 70  de for a unary p
8710: 6f 73 74 66 69 78 20 6f 70 65 72 61 74 6f 72 0a  ostfix operator.
8720: 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f    */.  static vo
8730: 69 64 20 73 70 61 6e 55 6e 61 72 79 50 6f 73 74  id spanUnaryPost
8740: 66 69 78 28 0a 20 20 20 20 45 78 70 72 53 70 61  fix(.    ExprSpa
8750: 6e 20 2a 70 4f 75 74 2c 20 20 20 20 20 20 20 20  n *pOut,        
8760: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 65 77  /* Write the new
8770: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
8780: 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 50 61 72   here */.    Par
8790: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
87a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
87b0: 6f 6e 74 65 78 74 20 74 6f 20 72 65 63 6f 72 64  ontext to record
87c0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 69   errors */.    i
87d0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
87e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65        /* The ope
87f0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70  rator */.    Exp
8800: 72 53 70 61 6e 20 2a 70 4f 70 65 72 61 6e 64 2c  rSpan *pOperand,
8810: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61      /* The opera
8820: 6e 64 20 2a 2f 0a 20 20 20 20 54 6f 6b 65 6e 20  nd */.    Token 
8830: 2a 70 50 6f 73 74 4f 70 20 20 20 20 20 20 20 20  *pPostOp        
8840: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 6e 64 20   /* The operand 
8850: 74 6f 6b 65 6e 20 66 6f 72 20 73 65 74 74 69 6e  token for settin
8860: 67 20 74 68 65 20 73 70 61 6e 20 2a 2f 0a 20 20  g the span */.  
8870: 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 45 78  ){.    pOut->pEx
8880: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
8890: 72 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 70 4f  r(pParse, op, pO
88a0: 70 65 72 61 6e 64 2d 3e 70 45 78 70 72 2c 20 30  perand->pExpr, 0
88b0: 2c 20 30 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  , 0);.    pOut->
88c0: 7a 53 74 61 72 74 20 3d 20 70 4f 70 65 72 61 6e  zStart = pOperan
88d0: 64 2d 3e 7a 53 74 61 72 74 3b 0a 20 20 20 20 70  d->zStart;.    p
88e0: 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 26 70 50 6f  Out->zEnd = &pPo
88f0: 73 74 4f 70 2d 3e 7a 5b 70 50 6f 73 74 4f 70 2d  stOp->z[pPostOp-
8900: 3e 6e 5d 3b 0a 20 20 7d 20 20 20 20 20 20 20 20  >n];.  }        
8910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8920: 20 20 20 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a     .}..expr(A) :
8930: 3a 3d 20 65 78 70 72 28 58 29 20 49 53 4e 55 4c  := expr(X) ISNUL
8940: 4c 7c 4e 4f 54 4e 55 4c 4c 28 45 29 2e 20 20 20  L|NOTNULL(E).   
8950: 7b 73 70 61 6e 55 6e 61 72 79 50 6f 73 74 66 69  {spanUnaryPostfi
8960: 78 28 26 41 2c 70 50 61 72 73 65 2c 40 45 2c 26  x(&A,pParse,@E,&
8970: 58 2c 26 45 29 3b 7d 0a 65 78 70 72 28 41 29 20  X,&E);}.expr(A) 
8980: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20  ::= expr(X) NOT 
8990: 4e 55 4c 4c 28 45 29 2e 20 7b 73 70 61 6e 55 6e  NULL(E). {spanUn
89a0: 61 72 79 50 6f 73 74 66 69 78 28 26 41 2c 70 50  aryPostfix(&A,pP
89b0: 61 72 73 65 2c 54 4b 5f 4e 4f 54 4e 55 4c 4c 2c  arse,TK_NOTNULL,
89c0: 26 58 2c 26 45 29 3b 7d 0a 0a 25 69 6e 63 6c 75  &X,&E);}..%inclu
89d0: 64 65 20 7b 0a 20 20 2f 2a 20 41 20 72 6f 75 74  de {.  /* A rout
89e0: 69 6e 65 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  ine to convert a
89f0: 20 62 69 6e 61 72 79 20 54 4b 5f 49 53 20 6f 72   binary TK_IS or
8a00: 20 54 4b 5f 49 53 4e 4f 54 20 65 78 70 72 65 73   TK_ISNOT expres
8a10: 73 69 6f 6e 20 69 6e 74 6f 20 61 0a 20 20 2a 2a  sion into a.  **
8a20: 20 75 6e 61 72 79 20 54 4b 5f 49 53 4e 55 4c 4c   unary TK_ISNULL
8a30: 20 6f 72 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 65   or TK_NOTNULL e
8a40: 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20  xpression. */.  
8a50: 73 74 61 74 69 63 20 76 6f 69 64 20 62 69 6e 61  static void bina
8a60: 72 79 54 6f 55 6e 61 72 79 49 66 4e 75 6c 6c 28  ryToUnaryIfNull(
8a70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
8a80: 78 70 72 20 2a 70 59 2c 20 45 78 70 72 20 2a 70  xpr *pY, Expr *p
8a90: 41 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 20 20  A, int op){.    
8aa0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8ab0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66  arse->db;.    if
8ac0: 28 20 70 59 20 26 26 20 70 41 20 26 26 20 70 59  ( pY && pA && pY
8ad0: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 55 4c 4c 20 29 7b  ->op==TK_NULL ){
8ae0: 0a 20 20 20 20 20 20 70 41 2d 3e 6f 70 20 3d 20  .      pA->op = 
8af0: 28 75 38 29 6f 70 3b 0a 20 20 20 20 20 20 73 71  (u8)op;.      sq
8b00: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
8b10: 64 62 2c 20 70 41 2d 3e 70 52 69 67 68 74 29 3b  db, pA->pRight);
8b20: 0a 20 20 20 20 20 20 70 41 2d 3e 70 52 69 67 68  .      pA->pRigh
8b30: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
8b40: 0a 7d 0a 0a 2f 2f 20 20 20 20 65 78 70 72 31 20  .}..//    expr1 
8b50: 49 53 20 65 78 70 72 32 0a 2f 2f 20 20 20 20 65  IS expr2.//    e
8b60: 78 70 72 31 20 49 53 20 4e 4f 54 20 65 78 70 72  xpr1 IS NOT expr
8b70: 32 0a 2f 2f 0a 2f 2f 20 49 66 20 65 78 70 72 32  2.//.// If expr2
8b80: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 63 6f   is NULL then co
8b90: 64 65 20 61 73 20 54 4b 5f 49 53 4e 55 4c 4c 20  de as TK_ISNULL 
8ba0: 6f 72 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 2e 20 20  or TK_NOTNULL.  
8bb0: 49 66 20 65 78 70 72 32 0a 2f 2f 20 69 73 20 61  If expr2.// is a
8bc0: 6e 79 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ny other express
8bd0: 69 6f 6e 2c 20 63 6f 64 65 20 61 73 20 54 4b 5f  ion, code as TK_
8be0: 49 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54 2e 0a  IS or TK_ISNOT..
8bf0: 2f 2f 20 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  // .expr(A) ::= 
8c00: 65 78 70 72 28 58 29 20 49 53 20 65 78 70 72 28  expr(X) IS expr(
8c10: 59 29 2e 20 20 20 20 20 7b 0a 20 20 73 70 61 6e  Y).     {.  span
8c20: 42 69 6e 61 72 79 45 78 70 72 28 26 41 2c 70 50  BinaryExpr(&A,pP
8c30: 61 72 73 65 2c 54 4b 5f 49 53 2c 26 58 2c 26 59  arse,TK_IS,&X,&Y
8c40: 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55 6e 61  );.  binaryToUna
8c50: 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73 65 2c  ryIfNull(pParse,
8c60: 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 45 78 70   Y.pExpr, A.pExp
8c70: 72 2c 20 54 4b 5f 49 53 4e 55 4c 4c 29 3b 0a 7d  r, TK_ISNULL);.}
8c80: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
8c90: 72 28 58 29 20 49 53 20 4e 4f 54 20 65 78 70 72  r(X) IS NOT expr
8ca0: 28 59 29 2e 20 7b 0a 20 20 73 70 61 6e 42 69 6e  (Y). {.  spanBin
8cb0: 61 72 79 45 78 70 72 28 26 41 2c 70 50 61 72 73  aryExpr(&A,pPars
8cc0: 65 2c 54 4b 5f 49 53 4e 4f 54 2c 26 58 2c 26 59  e,TK_ISNOT,&X,&Y
8cd0: 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55 6e 61  );.  binaryToUna
8ce0: 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73 65 2c  ryIfNull(pParse,
8cf0: 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 45 78 70   Y.pExpr, A.pExp
8d00: 72 2c 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a  r, TK_NOTNULL);.
8d10: 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20  }..%include {.  
8d20: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6e 20  /* Construct an 
8d30: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
8d40: 66 6f 72 20 61 20 75 6e 61 72 79 20 70 72 65 66  for a unary pref
8d50: 69 78 20 6f 70 65 72 61 74 6f 72 0a 20 20 2a 2f  ix operator.  */
8d60: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73  .  static void s
8d70: 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28 0a  panUnaryPrefix(.
8d80: 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70 4f      ExprSpan *pO
8d90: 75 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ut,        /* Wr
8da0: 69 74 65 20 74 68 65 20 6e 65 77 20 65 78 70 72  ite the new expr
8db0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 68 65 72 65  ession node here
8dc0: 20 2a 2f 0a 20 20 20 20 50 61 72 73 65 20 2a 70   */.    Parse *p
8dd0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
8de0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8df0: 74 20 74 6f 20 72 65 63 6f 72 64 20 65 72 72 6f  t to record erro
8e00: 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  rs */.    int op
8e10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8e20: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72   /* The operator
8e30: 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 70 61 6e   */.    ExprSpan
8e40: 20 2a 70 4f 70 65 72 61 6e 64 2c 20 20 20 20 2f   *pOperand,    /
8e50: 2a 20 54 68 65 20 6f 70 65 72 61 6e 64 20 2a 2f  * The operand */
8e60: 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50 72 65  .    Token *pPre
8e70: 4f 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Op         /* Th
8e80: 65 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65 6e 20  e operand token 
8e90: 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68 65 20  for setting the 
8ea0: 73 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  span */.  ){.   
8eb0: 20 70 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20 73   pOut->pExpr = s
8ec0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
8ed0: 73 65 2c 20 6f 70 2c 20 70 4f 70 65 72 61 6e 64  se, op, pOperand
8ee0: 2d 3e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  ->pExpr, 0, 0);.
8ef0: 20 20 20 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74      pOut->zStart
8f00: 20 3d 20 70 50 72 65 4f 70 2d 3e 7a 3b 0a 20 20   = pPreOp->z;.  
8f10: 20 20 70 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 70    pOut->zEnd = p
8f20: 4f 70 65 72 61 6e 64 2d 3e 7a 45 6e 64 3b 0a 20  Operand->zEnd;. 
8f30: 20 7d 0a 7d 0a 0a 0a 0a 65 78 70 72 28 41 29 20   }.}....expr(A) 
8f40: 3a 3a 3d 20 4e 4f 54 28 42 29 20 65 78 70 72 28  ::= NOT(B) expr(
8f50: 58 29 2e 20 20 20 20 7b 73 70 61 6e 55 6e 61 72  X).    {spanUnar
8f60: 79 50 72 65 66 69 78 28 26 41 2c 70 50 61 72 73  yPrefix(&A,pPars
8f70: 65 2c 40 42 2c 26 58 2c 26 42 29 3b 7d 0a 65 78  e,@B,&X,&B);}.ex
8f80: 70 72 28 41 29 20 3a 3a 3d 20 42 49 54 4e 4f 54  pr(A) ::= BITNOT
8f90: 28 42 29 20 65 78 70 72 28 58 29 2e 20 7b 73 70  (B) expr(X). {sp
8fa0: 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28 26 41  anUnaryPrefix(&A
8fb0: 2c 70 50 61 72 73 65 2c 40 42 2c 26 58 2c 26 42  ,pParse,@B,&X,&B
8fc0: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
8fd0: 4d 49 4e 55 53 28 42 29 20 65 78 70 72 28 58 29  MINUS(B) expr(X)
8fe0: 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20 20 20  . [BITNOT].     
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 55            {spanU
9010: 6e 61 72 79 50 72 65 66 69 78 28 26 41 2c 70 50  naryPrefix(&A,pP
9020: 61 72 73 65 2c 54 4b 5f 55 4d 49 4e 55 53 2c 26  arse,TK_UMINUS,&
9030: 58 2c 26 42 29 3b 7d 0a 65 78 70 72 28 41 29 20  X,&B);}.expr(A) 
9040: 3a 3a 3d 20 50 4c 55 53 28 42 29 20 65 78 70 72  ::= PLUS(B) expr
9050: 28 58 29 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20  (X). [BITNOT].  
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 70               {sp
9080: 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28 26 41  anUnaryPrefix(&A
9090: 2c 70 50 61 72 73 65 2c 54 4b 5f 55 50 4c 55 53  ,pParse,TK_UPLUS
90a0: 2c 26 58 2c 26 42 29 3b 7d 0a 0a 25 74 79 70 65  ,&X,&B);}..%type
90b0: 20 62 65 74 77 65 65 6e 5f 6f 70 20 7b 69 6e 74   between_op {int
90c0: 7d 0a 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20  }.between_op(A) 
90d0: 3a 3a 3d 20 42 45 54 57 45 45 4e 2e 20 20 20 20  ::= BETWEEN.    
90e0: 20 7b 41 20 3d 20 30 3b 7d 0a 62 65 74 77 65 65   {A = 0;}.betwee
90f0: 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20  n_op(A) ::= NOT 
9100: 42 45 54 57 45 45 4e 2e 20 7b 41 20 3d 20 31 3b  BETWEEN. {A = 1;
9110: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
9120: 70 72 28 57 29 20 62 65 74 77 65 65 6e 5f 6f 70  pr(W) between_op
9130: 28 4e 29 20 65 78 70 72 28 58 29 20 41 4e 44 20  (N) expr(X) AND 
9140: 65 78 70 72 28 59 29 2e 20 5b 42 45 54 57 45 45  expr(Y). [BETWEE
9150: 4e 5d 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  N] {.  ExprList 
9160: 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  *pList = sqlite3
9170: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
9180: 50 61 72 73 65 2c 30 2c 20 58 2e 70 45 78 70 72  Parse,0, X.pExpr
9190: 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  );.  pList = sql
91a0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
91b0: 6e 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c  nd(pParse,pList,
91c0: 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70   Y.pExpr);.  A.p
91d0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
91e0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 42  xpr(pParse, TK_B
91f0: 45 54 57 45 45 4e 2c 20 57 2e 70 45 78 70 72 2c  ETWEEN, W.pExpr,
9200: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 2e   0, 0);.  if( A.
9210: 70 45 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70  pExpr ){.    A.p
9220: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  Expr->x.pList = 
9230: 70 4c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pList;.  }else{.
9240: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
9250: 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65  istDelete(pParse
9260: 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20  ->db, pList);.  
9270: 7d 20 0a 20 20 69 66 28 20 4e 20 29 20 41 2e 70  } .  if( N ) A.p
9280: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45  Expr = sqlite3PE
9290: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4e  xpr(pParse, TK_N
92a0: 4f 54 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c 20  OT, A.pExpr, 0, 
92b0: 30 29 3b 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d  0);.  A.zStart =
92c0: 20 57 2e 7a 53 74 61 72 74 3b 0a 20 20 41 2e 7a   W.zStart;.  A.z
92d0: 45 6e 64 20 3d 20 59 2e 7a 45 6e 64 3b 0a 7d 0a  End = Y.zEnd;.}.
92e0: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
92f0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 25  MIT_SUBQUERY.  %
9300: 74 79 70 65 20 69 6e 5f 6f 70 20 7b 69 6e 74 7d  type in_op {int}
9310: 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20  .  in_op(A) ::= 
9320: 49 4e 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b  IN.      {A = 0;
9330: 7d 0a 20 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d  }.  in_op(A) ::=
9340: 20 4e 4f 54 20 49 4e 2e 20 20 7b 41 20 3d 20 31   NOT IN.  {A = 1
9350: 3b 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d  ;}.  expr(A) ::=
9360: 20 65 78 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e   expr(X) in_op(N
9370: 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29  ) LP exprlist(Y)
9380: 20 52 50 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a 20   RP(E). [IN] {. 
9390: 20 20 20 69 66 28 20 59 3d 3d 30 20 29 7b 0a 20     if( Y==0 ){. 
93a0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
93b0: 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ons of the form.
93c0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
93d0: 2a 20 20 20 20 20 20 65 78 70 72 31 20 49 4e 20  *      expr1 IN 
93e0: 28 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  ().      **     
93f0: 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20 28 29   expr1 NOT IN ()
9400: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
9410: 2a 2a 20 73 69 6d 70 6c 69 66 79 20 74 6f 20 63  ** simplify to c
9420: 6f 6e 73 74 61 6e 74 73 20 30 20 28 66 61 6c 73  onstants 0 (fals
9430: 65 29 20 61 6e 64 20 31 20 28 74 72 75 65 29 2c  e) and 1 (true),
9440: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2c 0a 20   respectively,. 
9450: 20 20 20 20 20 2a 2a 20 72 65 67 61 72 64 6c 65       ** regardle
9460: 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
9470: 6f 66 20 65 78 70 72 31 2e 0a 20 20 20 20 20 20  of expr1..      
9480: 2a 2f 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72  */.      A.pExpr
9490: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
94a0: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 54 45 47  pParse, TK_INTEG
94b0: 45 52 2c 20 30 2c 20 30 2c 20 26 73 71 6c 69 74  ER, 0, 0, &sqlit
94c0: 65 33 49 6e 74 54 6f 6b 65 6e 73 5b 4e 5d 29 3b  e3IntTokens[N]);
94d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
94e0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
94f0: 3e 64 62 2c 20 58 2e 70 45 78 70 72 29 3b 0a 20  >db, X.pExpr);. 
9500: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 59 2d 3e     }else if( Y->
9510: 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20  nExpr==1 ){.    
9520: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73    /* Expressions
9530: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20   of the form:.  
9540: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
9550: 20 20 20 20 20 65 78 70 72 31 20 49 4e 20 28 3f       expr1 IN (?
9560: 31 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  1).      **     
9570: 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20 28 3f   expr1 NOT IN (?
9580: 32 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  2).      **.    
9590: 20 20 2a 2a 20 77 69 74 68 20 65 78 61 63 74 6c    ** with exactl
95a0: 79 20 6f 6e 65 20 76 61 6c 75 65 20 6f 6e 20 74  y one value on t
95b0: 68 65 20 52 48 53 20 63 61 6e 20 62 65 20 73 69  he RHS can be si
95c0: 6d 70 6c 69 66 69 65 64 20 74 6f 20 73 6f 6d 65  mplified to some
95d0: 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6c  thing.      ** l
95e0: 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 20 20  ike this:.      
95f0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  **.      **     
9600: 20 65 78 70 72 31 20 3d 3d 20 3f 31 0a 20 20 20   expr1 == ?1.   
9610: 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31     **      expr1
9620: 20 3c 3e 20 3f 32 0a 20 20 20 20 20 20 2a 2a 0a   <> ?2.      **.
9630: 20 20 20 20 20 20 2a 2a 20 42 75 74 2c 20 74 68        ** But, th
9640: 65 20 52 48 53 20 6f 66 20 74 68 65 20 3d 3d 20  e RHS of the == 
9650: 6f 72 20 3c 3e 20 69 73 20 6d 61 72 6b 65 64 20  or <> is marked 
9660: 77 69 74 68 20 74 68 65 20 45 50 5f 47 65 6e 65  with the EP_Gene
9670: 72 69 63 20 66 6c 61 67 0a 20 20 20 20 20 20 2a  ric flag.      *
9680: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 79  * so that it may
9690: 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
96a0: 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  to the computati
96b0: 6f 6e 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  on of comparison
96c0: 0a 20 20 20 20 20 20 2a 2a 20 61 66 66 69 6e 69  .      ** affini
96d0: 74 79 20 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74  ty or the collat
96e0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
96f0: 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73  use for comparis
9700: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  on.  Otherwise,.
9710: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 6d        ** the sem
9720: 61 6e 74 69 63 73 20 77 6f 75 6c 64 20 62 65 20  antics would be 
9730: 73 75 62 74 6c 79 20 64 69 66 66 65 72 65 6e 74  subtly different
9740: 20 66 72 6f 6d 20 49 4e 20 6f 72 20 4e 4f 54 20   from IN or NOT 
9750: 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  IN..      */.   
9760: 20 20 20 45 78 70 72 20 2a 70 52 48 53 20 3d 20     Expr *pRHS = 
9770: 59 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  Y->a[0].pExpr;. 
9780: 20 20 20 20 20 59 2d 3e 61 5b 30 5d 2e 70 45 78       Y->a[0].pEx
9790: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  pr = 0;.      sq
97a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
97b0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
97c0: 59 29 3b 0a 20 20 20 20 20 20 2f 2a 20 70 52 48  Y);.      /* pRH
97d0: 53 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  S cannot be NULL
97e0: 20 62 65 63 61 75 73 65 20 61 20 6d 61 6c 6c 6f   because a mallo
97f0: 63 20 65 72 72 6f 72 20 77 6f 75 6c 64 20 68 61  c error would ha
9800: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ve been detected
9810: 0a 20 20 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  .      ** before
9820: 20 6e 6f 77 20 61 6e 64 20 63 6f 6e 74 72 6f 6c   now and control
9830: 20 77 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65   would have neve
9840: 72 20 72 65 61 63 68 65 64 20 74 68 69 73 20 70  r reached this p
9850: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  oint */.      if
9860: 28 20 41 4c 57 41 59 53 28 70 52 48 53 29 20 29  ( ALWAYS(pRHS) )
9870: 7b 0a 20 20 20 20 20 20 20 20 70 52 48 53 2d 3e  {.        pRHS->
9880: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c  flags &= ~EP_Col
9890: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52  late;.        pR
98a0: 48 53 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  HS->flags |= EP_
98b0: 47 65 6e 65 72 69 63 3b 0a 20 20 20 20 20 20 7d  Generic;.      }
98c0: 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d  .      A.pExpr =
98d0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
98e0: 61 72 73 65 2c 20 4e 20 3f 20 54 4b 5f 4e 45 20  arse, N ? TK_NE 
98f0: 3a 20 54 4b 5f 45 51 2c 20 58 2e 70 45 78 70 72  : TK_EQ, X.pExpr
9900: 2c 20 70 52 48 53 2c 20 30 29 3b 0a 20 20 20 20  , pRHS, 0);.    
9910: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41 2e 70  }else{.      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 49  xpr(pParse, TK_I
9940: 4e 2c 20 58 2e 70 45 78 70 72 2c 20 30 2c 20 30  N, X.pExpr, 0, 0
9950: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 2e 70  );.      if( A.p
9960: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
9970: 41 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  A.pExpr->x.pList
9980: 20 3d 20 59 3b 0a 20 20 20 20 20 20 20 20 73 71   = Y;.        sq
9990: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
99a0: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
99b0: 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20 20  e, A.pExpr);.   
99c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
99d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
99e0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
99f0: 64 62 2c 20 59 29 3b 0a 20 20 20 20 20 20 7d 0a  db, Y);.      }.
9a00: 20 20 20 20 20 20 69 66 28 20 4e 20 29 20 41 2e        if( N ) A.
9a10: 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50  pExpr = sqlite3P
9a20: 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f  Expr(pParse, TK_
9a30: 4e 4f 54 2c 20 41 2e 70 45 78 70 72 2c 20 30 2c  NOT, A.pExpr, 0,
9a40: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41   0);.    }.    A
9a50: 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 53 74 61  .zStart = X.zSta
9a60: 72 74 3b 0a 20 20 20 20 41 2e 7a 45 6e 64 20 3d  rt;.    A.zEnd =
9a70: 20 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a 20 20 7d 0a   &E.z[E.n];.  }.
9a80: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50    expr(A) ::= LP
9a90: 28 42 29 20 73 65 6c 65 63 74 28 58 29 20 52 50  (B) select(X) RP
9aa0: 28 45 29 2e 20 7b 0a 20 20 20 20 41 2e 70 45 78  (E). {.    A.pEx
9ab0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
9ac0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 53 45 4c  r(pParse, TK_SEL
9ad0: 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ECT, 0, 0, 0);. 
9ae0: 20 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29     if( A.pExpr )
9af0: 7b 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 2d  {.      A.pExpr-
9b00: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 58 3b 0a  >x.pSelect = X;.
9b10: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
9b20: 70 65 72 74 79 28 41 2e 70 45 78 70 72 2c 20 45  perty(A.pExpr, E
9b30: 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53  P_xIsSelect|EP_S
9b40: 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 20 20  ubquery);.      
9b50: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
9b60: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
9b70: 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20  rse, A.pExpr);. 
9b80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9b90: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
9ba0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
9bb0: 58 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 2e  X);.    }.    A.
9bc0: 7a 53 74 61 72 74 20 3d 20 42 2e 7a 3b 0a 20 20  zStart = B.z;.  
9bd0: 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b    A.zEnd = &E.z[
9be0: 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72  E.n];.  }.  expr
9bf0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20  (A) ::= expr(X) 
9c00: 69 6e 5f 6f 70 28 4e 29 20 4c 50 20 73 65 6c 65  in_op(N) LP sele
9c10: 63 74 28 59 29 20 52 50 28 45 29 2e 20 20 5b 49  ct(Y) RP(E).  [I
9c20: 4e 5d 20 7b 0a 20 20 20 20 41 2e 70 45 78 70 72  N] {.    A.pExpr
9c30: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
9c40: 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 58  pParse, TK_IN, X
9c50: 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20  .pExpr, 0, 0);. 
9c60: 20 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29     if( A.pExpr )
9c70: 7b 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 2d  {.      A.pExpr-
9c80: 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 59 3b 0a  >x.pSelect = Y;.
9c90: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
9ca0: 70 65 72 74 79 28 41 2e 70 45 78 70 72 2c 20 45  perty(A.pExpr, E
9cb0: 50 5f 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53  P_xIsSelect|EP_S
9cc0: 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 20 20  ubquery);.      
9cd0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48 65  sqlite3ExprSetHe
9ce0: 69 67 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61  ightAndFlags(pPa
9cf0: 72 73 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20  rse, A.pExpr);. 
9d00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9d10: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
9d20: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
9d30: 59 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Y);.    }.    if
9d40: 28 20 4e 20 29 20 41 2e 70 45 78 70 72 20 3d 20  ( N ) A.pExpr = 
9d50: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
9d60: 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41 2e 70  rse, TK_NOT, A.p
9d70: 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Expr, 0, 0);.   
9d80: 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e 7a 53   A.zStart = X.zS
9d90: 74 61 72 74 3b 0a 20 20 20 20 41 2e 7a 45 6e 64  tart;.    A.zEnd
9da0: 20 3d 20 26 45 2e 7a 5b 45 2e 6e 5d 3b 0a 20 20   = &E.z[E.n];.  
9db0: 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20  }.  expr(A) ::= 
9dc0: 65 78 70 72 28 58 29 20 69 6e 5f 6f 70 28 4e 29  expr(X) in_op(N)
9dd0: 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a 29 2e 20   nm(Y) dbnm(Z). 
9de0: 5b 49 4e 5d 20 7b 0a 20 20 20 20 53 72 63 4c 69  [IN] {.    SrcLi
9df0: 73 74 20 2a 70 53 72 63 20 3d 20 73 71 6c 69 74  st *pSrc = sqlit
9e00: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
9e10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 26 59  pParse->db, 0,&Y
9e20: 2c 26 5a 29 3b 0a 20 20 20 20 41 2e 70 45 78 70  ,&Z);.    A.pExp
9e30: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  r = sqlite3PExpr
9e40: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20  (pParse, TK_IN, 
9e50: 58 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a  X.pExpr, 0, 0);.
9e60: 20 20 20 20 69 66 28 20 41 2e 70 45 78 70 72 20      if( A.pExpr 
9e70: 29 7b 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72  ){.      A.pExpr
9e80: 2d 3e 78 2e 70 53 65 6c 65 63 74 20 3d 20 73 71  ->x.pSelect = sq
9e90: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70  lite3SelectNew(p
9ea0: 50 61 72 73 65 2c 20 30 2c 70 53 72 63 2c 30 2c  Parse, 0,pSrc,0,
9eb0: 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  0,0,0,0,0,0);.  
9ec0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
9ed0: 72 74 79 28 41 2e 70 45 78 70 72 2c 20 45 50 5f  rty(A.pExpr, EP_
9ee0: 78 49 73 53 65 6c 65 63 74 7c 45 50 5f 53 75 62  xIsSelect|EP_Sub
9ef0: 71 75 65 72 79 29 3b 0a 20 20 20 20 20 20 73 71  query);.      sq
9f00: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67  lite3ExprSetHeig
9f10: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73  htAndFlags(pPars
9f20: 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20 20  e, A.pExpr);.   
9f30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9f40: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
9f50: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
9f60: 53 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Src);.    }.    
9f70: 69 66 28 20 4e 20 29 20 41 2e 70 45 78 70 72 20  if( N ) A.pExpr 
9f80: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
9f90: 50 61 72 73 65 2c 20 54 4b 5f 4e 4f 54 2c 20 41  Parse, TK_NOT, A
9fa0: 2e 70 45 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20  .pExpr, 0, 0);. 
9fb0: 20 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e     A.zStart = X.
9fc0: 7a 53 74 61 72 74 3b 0a 20 20 20 20 41 2e 7a 45  zStart;.    A.zE
9fd0: 6e 64 20 3d 20 5a 2e 7a 20 3f 20 26 5a 2e 7a 5b  nd = Z.z ? &Z.z[
9fe0: 5a 2e 6e 5d 20 3a 20 26 59 2e 7a 5b 59 2e 6e 5d  Z.n] : &Y.z[Y.n]
9ff0: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 28 41 29 20  ;.  }.  expr(A) 
a000: 3a 3a 3d 20 45 58 49 53 54 53 28 42 29 20 4c 50  ::= EXISTS(B) LP
a010: 20 73 65 6c 65 63 74 28 59 29 20 52 50 28 45 29   select(Y) RP(E)
a020: 2e 20 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  . {.    Expr *p 
a030: 3d 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69  = A.pExpr = sqli
a040: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
a050: 20 54 4b 5f 45 58 49 53 54 53 2c 20 30 2c 20 30   TK_EXISTS, 0, 0
a060: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20  , 0);.    if( p 
a070: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 78 2e 70 53  ){.      p->x.pS
a080: 65 6c 65 63 74 20 3d 20 59 3b 0a 20 20 20 20 20  elect = Y;.     
a090: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
a0a0: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
a0b0: 7c 45 50 5f 53 75 62 71 75 65 72 79 29 3b 0a 20  |EP_Subquery);. 
a0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a0d0: 53 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67  SetHeightAndFlag
a0e0: 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  s(pParse, p);.  
a0f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
a100: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
a110: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 59  te(pParse->db, Y
a120: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 41 2e 7a  );.    }.    A.z
a130: 53 74 61 72 74 20 3d 20 42 2e 7a 3b 0a 20 20 20  Start = B.z;.   
a140: 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b 45   A.zEnd = &E.z[E
a150: 2e 6e 5d 3b 0a 20 20 7d 0a 25 65 6e 64 69 66 20  .n];.  }.%endif 
a160: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
a170: 55 45 52 59 0a 0a 2f 2a 20 43 41 53 45 20 65 78  UERY../* CASE ex
a180: 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 65 78 70  pressions */.exp
a190: 72 28 41 29 20 3a 3a 3d 20 43 41 53 45 28 43 29  r(A) ::= CASE(C)
a1a0: 20 63 61 73 65 5f 6f 70 65 72 61 6e 64 28 58 29   case_operand(X)
a1b0: 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28 59   case_exprlist(Y
a1c0: 29 20 63 61 73 65 5f 65 6c 73 65 28 5a 29 20 45  ) case_else(Z) E
a1d0: 4e 44 28 45 29 2e 20 7b 0a 20 20 41 2e 70 45 78  ND(E). {.  A.pEx
a1e0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
a1f0: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 43 41 53  r(pParse, TK_CAS
a200: 45 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69  E, X, 0, 0);.  i
a210: 66 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20  f( A.pExpr ){.  
a220: 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e 70 4c 69    A.pExpr->x.pLi
a230: 73 74 20 3d 20 5a 20 3f 20 73 71 6c 69 74 65 33  st = Z ? sqlite3
a240: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
a250: 50 61 72 73 65 2c 59 2c 5a 29 20 3a 20 59 3b 0a  Parse,Y,Z) : Y;.
a260: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53      sqlite3ExprS
a270: 65 74 48 65 69 67 68 74 41 6e 64 46 6c 61 67 73  etHeightAndFlags
a280: 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72  (pParse, A.pExpr
a290: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a2a0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
a2b0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
a2c0: 2c 20 59 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , Y);.    sqlite
a2d0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
a2e0: 73 65 2d 3e 64 62 2c 20 5a 29 3b 0a 20 20 7d 0a  se->db, Z);.  }.
a2f0: 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 43 2e 7a    A.zStart = C.z
a300: 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e  ;.  A.zEnd = &E.
a310: 7a 5b 45 2e 6e 5d 3b 0a 7d 0a 25 74 79 70 65 20  z[E.n];.}.%type 
a320: 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20 7b 45  case_exprlist {E
a330: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
a340: 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70 72 6c  uctor case_exprl
a350: 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  ist {sqlite3Expr
a360: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73  ListDelete(pPars
a370: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73  e->db, $$);}.cas
a380: 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a  e_exprlist(A) ::
a390: 3d 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28  = case_exprlist(
a3a0: 58 29 20 57 48 45 4e 20 65 78 70 72 28 59 29 20  X) WHEN expr(Y) 
a3b0: 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20 7b 0a  THEN expr(Z). {.
a3c0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
a3d0: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
a3e0: 73 65 2c 58 2c 20 59 2e 70 45 78 70 72 29 3b 0a  se,X, Y.pExpr);.
a3f0: 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 78 70    A = sqlite3Exp
a400: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
a410: 73 65 2c 41 2c 20 5a 2e 70 45 78 70 72 29 3b 0a  se,A, Z.pExpr);.
a420: 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 74 28  }.case_exprlist(
a430: 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72  A) ::= WHEN expr
a440: 28 59 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29  (Y) THEN expr(Z)
a450: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
a460: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a470: 70 50 61 72 73 65 2c 30 2c 20 59 2e 70 45 78 70  pParse,0, Y.pExp
a480: 72 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  r);.  A = sqlite
a490: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a4a0: 70 50 61 72 73 65 2c 41 2c 20 5a 2e 70 45 78 70  pParse,A, Z.pExp
a4b0: 72 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61 73 65  r);.}.%type case
a4c0: 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a 25 64  _else {Expr*}.%d
a4d0: 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65  estructor case_e
a4e0: 6c 73 65 20 7b 73 71 6c 69 74 65 33 45 78 70 72  lse {sqlite3Expr
a4f0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
a500: 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f 65 6c  b, $$);}.case_el
a510: 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53 45 20  se(A) ::=  ELSE 
a520: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20  expr(X).        
a530: 20 7b 41 20 3d 20 58 2e 70 45 78 70 72 3b 7d 0a   {A = X.pExpr;}.
a540: 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a 3a 3d  case_else(A) ::=
a550: 20 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
a560: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d          {A = 0;}
a570: 20 0a 25 74 79 70 65 20 63 61 73 65 5f 6f 70 65   .%type case_ope
a580: 72 61 6e 64 20 7b 45 78 70 72 2a 7d 0a 25 64 65  rand {Expr*}.%de
a590: 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f 6f 70  structor case_op
a5a0: 65 72 61 6e 64 20 7b 73 71 6c 69 74 65 33 45 78  erand {sqlite3Ex
a5b0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  prDelete(pParse-
a5c0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f  >db, $$);}.case_
a5d0: 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d 20 65  operand(A) ::= e
a5e0: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20 20  xpr(X).         
a5f0: 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70 72 3b     {A = X.pExpr;
a600: 7d 20 0a 63 61 73 65 5f 6f 70 65 72 61 6e 64 28  } .case_operand(
a610: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
a620: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20             {A = 
a630: 30 3b 7d 20 0a 0a 25 74 79 70 65 20 65 78 70 72  0;} ..%type expr
a640: 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d  list {ExprList*}
a650: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78 70  .%destructor exp
a660: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78  rlist {sqlite3Ex
a670: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
a680: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25  rse->db, $$);}.%
a690: 74 79 70 65 20 6e 65 78 70 72 6c 69 73 74 20 7b  type nexprlist {
a6a0: 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74  ExprList*}.%dest
a6b0: 72 75 63 74 6f 72 20 6e 65 78 70 72 6c 69 73 74  ructor nexprlist
a6c0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   {sqlite3ExprLis
a6d0: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e  tDelete(pParse->
a6e0: 64 62 2c 20 24 24 29 3b 7d 0a 0a 65 78 70 72 6c  db, $$);}..exprl
a6f0: 69 73 74 28 41 29 20 3a 3a 3d 20 6e 65 78 70 72  ist(A) ::= nexpr
a700: 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20 20 20  list(X).        
a710: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
a720: 0a 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d  .exprlist(A) ::=
a730: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
a750: 20 3d 20 30 3b 7d 0a 6e 65 78 70 72 6c 69 73 74   = 0;}.nexprlist
a760: 28 41 29 20 3a 3a 3d 20 6e 65 78 70 72 6c 69 73  (A) ::= nexprlis
a770: 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28  t(X) COMMA expr(
a780: 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c  Y)..    {A = sql
a790: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
a7a0: 6e 64 28 70 50 61 72 73 65 2c 58 2c 59 2e 70 45  nd(pParse,X,Y.pE
a7b0: 78 70 72 29 3b 7d 0a 6e 65 78 70 72 6c 69 73 74  xpr);}.nexprlist
a7c0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 59 29 2e  (A) ::= expr(Y).
a7d0: 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  .    {A = sqlite
a7e0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
a7f0: 70 50 61 72 73 65 2c 30 2c 59 2e 70 45 78 70 72  pParse,0,Y.pExpr
a800: 29 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  );}...//////////
a810: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a820: 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 20 49  /// The CREATE I
a830: 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  NDEX command ///
a840: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
a850: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
a860: 63 72 65 61 74 65 6b 77 28 53 29 20 75 6e 69 71  createkw(S) uniq
a870: 75 65 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20  ueflag(U) INDEX 
a880: 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 45 29 20  ifnotexists(NE) 
a890: 6e 6d 28 58 29 20 64 62 6e 6d 28 44 29 0a 20 20  nm(X) dbnm(D).  
a8a0: 20 20 20 20 20 20 4f 4e 20 6e 6d 28 59 29 20 4c        ON nm(Y) L
a8b0: 50 20 69 64 78 6c 69 73 74 28 5a 29 20 52 50 20  P idxlist(Z) RP 
a8c0: 77 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b 0a  where_opt(W). {.
a8d0: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49    sqlite3CreateI
a8e0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 58 2c  ndex(pParse, &X,
a8f0: 20 26 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20   &D, .          
a900: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
a910: 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
a920: 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59 2c  pParse->db,0,&Y,
a930: 30 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20 20 20  0), Z, U,.      
a940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a950: 26 53 2c 20 57 2c 20 53 51 4c 49 54 45 5f 53 4f  &S, W, SQLITE_SO
a960: 5f 41 53 43 2c 20 4e 45 29 3b 0a 7d 0a 0a 25 74  _ASC, NE);.}..%t
a970: 79 70 65 20 75 6e 69 71 75 65 66 6c 61 67 20 7b  ype uniqueflag {
a980: 69 6e 74 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28  int}.uniqueflag(
a990: 41 29 20 3a 3a 3d 20 55 4e 49 51 55 45 2e 20 20  A) ::= UNIQUE.  
a9a0: 7b 41 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a  {A = OE_Abort;}.
a9b0: 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a 3a  uniqueflag(A) ::
a9c0: 3d 20 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20  = .        {A = 
a9d0: 4f 45 5f 4e 6f 6e 65 3b 7d 0a 0a 25 74 79 70 65  OE_None;}..%type
a9e0: 20 69 64 78 6c 69 73 74 20 7b 45 78 70 72 4c 69   idxlist {ExprLi
a9f0: 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  st*}.%destructor
aa00: 20 69 64 78 6c 69 73 74 20 7b 73 71 6c 69 74 65   idxlist {sqlite
aa10: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
aa20: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b  pParse->db, $$);
aa30: 7d 0a 25 74 79 70 65 20 69 64 78 6c 69 73 74 5f  }.%type idxlist_
aa40: 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a  opt {ExprList*}.
aa50: 25 64 65 73 74 72 75 63 74 6f 72 20 69 64 78 6c  %destructor idxl
aa60: 69 73 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33  ist_opt {sqlite3
aa70: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
aa80: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d  Parse->db, $$);}
aa90: 0a 0a 69 64 78 6c 69 73 74 5f 6f 70 74 28 41 29  ..idxlist_opt(A)
aaa0: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b                 {
aac0: 41 20 3d 20 30 3b 7d 0a 69 64 78 6c 69 73 74 5f  A = 0;}.idxlist_
aad0: 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 64  opt(A) ::= LP id
aae0: 78 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20 20  xlist(X) RP.    
aaf0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64       {A = X;}.id
ab00: 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 78  xlist(A) ::= idx
ab10: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 6e 6d  list(X) COMMA nm
ab20: 28 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73  (Y) collate(C) s
ab30: 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 20 7b 0a  ortorder(Z).  {.
ab40: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
ab50: 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74  te3ExprAddCollat
ab60: 65 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 30  eToken(pParse, 0
ab70: 2c 20 26 43 2c 20 31 29 3b 0a 20 20 41 20 3d 20  , &C, 1);.  A = 
ab80: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
ab90: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 58 2c 20  ppend(pParse,X, 
aba0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  p);.  sqlite3Exp
abb0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61  rListSetName(pPa
abc0: 72 73 65 2c 41 2c 26 59 2c 31 29 3b 0a 20 20 73  rse,A,&Y,1);.  s
abd0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 43 68  qlite3ExprListCh
abe0: 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72 73 65  eckLength(pParse
abf0: 2c 20 41 2c 20 22 69 6e 64 65 78 22 29 3b 0a 20  , A, "index");. 
ac00: 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 41 2d   if( A ) A->a[A-
ac10: 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74 4f 72  >nExpr-1].sortOr
ac20: 64 65 72 20 3d 20 28 75 38 29 5a 3b 0a 7d 0a 69  der = (u8)Z;.}.i
ac30: 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d  dxlist(A) ::= nm
ac40: 28 59 29 20 63 6f 6c 6c 61 74 65 28 43 29 20 73  (Y) collate(C) s
ac50: 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20  ortorder(Z). {. 
ac60: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
ac70: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
ac80: 54 6f 6b 65 6e 28 70 50 61 72 73 65 2c 20 30 2c  Token(pParse, 0,
ac90: 20 26 43 2c 20 31 29 3b 0a 20 20 41 20 3d 20 73   &C, 1);.  A = s
aca0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
acb0: 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 20 70  pend(pParse,0, p
acc0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
acd0: 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 61 72  ListSetName(pPar
ace0: 73 65 2c 20 41 2c 20 26 59 2c 20 31 29 3b 0a 20  se, A, &Y, 1);. 
acf0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
ad00: 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 72  CheckLength(pPar
ad10: 73 65 2c 20 41 2c 20 22 69 6e 64 65 78 22 29 3b  se, A, "index");
ad20: 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b  .  if( A ) A->a[
ad30: 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f 72 74  A->nExpr-1].sort
ad40: 4f 72 64 65 72 20 3d 20 28 75 38 29 5a 3b 0a 7d  Order = (u8)Z;.}
ad50: 0a 0a 25 74 79 70 65 20 63 6f 6c 6c 61 74 65 20  ..%type collate 
ad60: 7b 54 6f 6b 65 6e 7d 0a 63 6f 6c 6c 61 74 65 28  {Token}.collate(
ad70: 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  C) ::= .        
ad80: 20 20 20 20 20 20 20 20 20 7b 43 2e 7a 20 3d 20           {C.z = 
ad90: 30 3b 20 43 2e 6e 20 3d 20 30 3b 7d 0a 63 6f 6c  0; C.n = 0;}.col
ada0: 6c 61 74 65 28 43 29 20 3a 3a 3d 20 43 4f 4c 4c  late(C) ::= COLL
adb0: 41 54 45 20 69 64 73 28 58 29 2e 20 20 20 7b 43  ATE ids(X).   {C
adc0: 20 3d 20 58 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f   = X;}...///////
add0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ade0: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20  ////// The DROP 
adf0: 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f  INDEX command //
ae00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae10: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
ae20: 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20 69 66  := DROP INDEX if
ae30: 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61  exists(E) fullna
ae40: 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74 65  me(X).   {sqlite
ae50: 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72 73  3DropIndex(pPars
ae60: 65 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f 2f  e, X, E);}..////
ae70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ae80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56 41  ///////// The VA
ae90: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f  CUUM command ///
aea0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
aeb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69  //////////.//.%i
aec0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
aed0: 54 5f 56 41 43 55 55 4d 0a 25 69 66 6e 64 65 66  T_VACUUM.%ifndef
aee0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54   SQLITE_OMIT_ATT
aef0: 41 43 48 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55  ACH.cmd ::= VACU
af00: 55 4d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  UM.             
af10: 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75     {sqlite3Vacuu
af20: 6d 28 70 50 61 72 73 65 29 3b 7d 0a 63 6d 64 20  m(pParse);}.cmd 
af30: 3a 3a 3d 20 56 41 43 55 55 4d 20 6e 6d 2e 20 20  ::= VACUUM nm.  
af40: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
af50: 74 65 33 56 61 63 75 75 6d 28 70 50 61 72 73 65  te3Vacuum(pParse
af60: 29 3b 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49  );}.%endif  SQLI
af70: 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 25  TE_OMIT_ATTACH.%
af80: 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d  endif  SQLITE_OM
af90: 49 54 5f 56 41 43 55 55 4d 0a 0a 2f 2f 2f 2f 2f  IT_VACUUM../////
afa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
afb0: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 50 52 41  //////// The PRA
afc0: 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  GMA command ////
afd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
afe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66  /////////.//.%if
aff0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b000: 5f 50 52 41 47 4d 41 0a 63 6d 64 20 3a 3a 3d 20  _PRAGMA.cmd ::= 
b010: 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e  PRAGMA nm(X) dbn
b020: 6d 28 5a 29 2e 20 20 20 20 20 20 20 20 20 20 20  m(Z).           
b030: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61       {sqlite3Pra
b040: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
b050: 2c 30 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20  ,0,0);}.cmd ::= 
b060: 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62 6e  PRAGMA nm(X) dbn
b070: 6d 28 5a 29 20 45 51 20 6e 6d 6e 75 6d 28 59 29  m(Z) EQ nmnum(Y)
b080: 2e 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72 61  .    {sqlite3Pra
b090: 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 5a  gma(pParse,&X,&Z
b0a0: 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d  ,&Y,0);}.cmd ::=
b0b0: 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64 62   PRAGMA nm(X) db
b0c0: 6e 6d 28 5a 29 20 4c 50 20 6e 6d 6e 75 6d 28 59  nm(Z) LP nmnum(Y
b0d0: 29 20 52 50 2e 20 7b 73 71 6c 69 74 65 33 50 72  ) RP. {sqlite3Pr
b0e0: 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26  agma(pParse,&X,&
b0f0: 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a  Z,&Y,0);}.cmd ::
b100: 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64  = PRAGMA nm(X) d
b110: 62 6e 6d 28 5a 29 20 45 51 20 6d 69 6e 75 73 5f  bnm(Z) EQ minus_
b120: 6e 75 6d 28 59 29 2e 20 0a 20 20 20 20 20 20 20  num(Y). .       
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b150: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 50 72        {sqlite3Pr
b160: 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26  agma(pParse,&X,&
b170: 5a 2c 26 59 2c 31 29 3b 7d 0a 63 6d 64 20 3a 3a  Z,&Y,1);}.cmd ::
b180: 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 29 20 64  = PRAGMA nm(X) d
b190: 62 6e 6d 28 5a 29 20 4c 50 20 6d 69 6e 75 73 5f  bnm(Z) LP minus_
b1a0: 6e 75 6d 28 59 29 20 52 50 2e 0a 20 20 20 20 20  num(Y) RP..     
b1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1d0: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
b1e0: 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58  Pragma(pParse,&X
b1f0: 2c 26 5a 2c 26 59 2c 31 29 3b 7d 0a 0a 6e 6d 6e  ,&Z,&Y,1);}..nmn
b200: 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73 5f 6e  um(A) ::= plus_n
b210: 75 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  um(X).          
b220: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75     {A = X;}.nmnu
b230: 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 2e 20  m(A) ::= nm(X). 
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b250: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d    {A = X;}.nmnum
b260: 28 41 29 20 3a 3a 3d 20 4f 4e 28 58 29 2e 20 20  (A) ::= ON(X).  
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 20 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28   {A = X;}.nmnum(
b290: 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 28 58 29  A) ::= DELETE(X)
b2a0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b2b0: 7b 41 20 3d 20 58 3b 7d 0a 6e 6d 6e 75 6d 28 41  {A = X;}.nmnum(A
b2c0: 29 20 3a 3a 3d 20 44 45 46 41 55 4c 54 28 58 29  ) ::= DEFAULT(X)
b2d0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  .              {
b2e0: 41 20 3d 20 58 3b 7d 0a 25 65 6e 64 69 66 20 53  A = X;}.%endif S
b2f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d  QLITE_OMIT_PRAGM
b300: 41 0a 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6e  A.%token_class n
b310: 75 6d 62 65 72 20 49 4e 54 45 47 45 52 7c 46 4c  umber INTEGER|FL
b320: 4f 41 54 2e 0a 70 6c 75 73 5f 6e 75 6d 28 41 29  OAT..plus_num(A)
b330: 20 3a 3a 3d 20 50 4c 55 53 20 6e 75 6d 62 65 72   ::= PLUS number
b340: 28 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20  (X).       {A = 
b350: 58 3b 7d 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20  X;}.plus_num(A) 
b360: 3a 3a 3d 20 6e 75 6d 62 65 72 28 58 29 2e 20 20  ::= number(X).  
b370: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
b380: 3b 7d 0a 6d 69 6e 75 73 5f 6e 75 6d 28 41 29 20  ;}.minus_num(A) 
b390: 3a 3a 3d 20 4d 49 4e 55 53 20 6e 75 6d 62 65 72  ::= MINUS number
b3a0: 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b  (X).     {A = X;
b3b0: 7d 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  }.//////////////
b3c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54  ////////////// T
b3d0: 68 65 20 43 52 45 41 54 45 20 54 52 49 47 47 45  he CREATE TRIGGE
b3e0: 52 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  R command //////
b3f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
b400: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .%ifndef SQLITE_
b410: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 63 6d  OMIT_TRIGGER..cm
b420: 64 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 20 74  d ::= createkw t
b430: 72 69 67 67 65 72 5f 64 65 63 6c 28 41 29 20 42  rigger_decl(A) B
b440: 45 47 49 4e 20 74 72 69 67 67 65 72 5f 63 6d 64  EGIN trigger_cmd
b450: 5f 6c 69 73 74 28 53 29 20 45 4e 44 28 5a 29 2e  _list(S) END(Z).
b460: 20 7b 0a 20 20 54 6f 6b 65 6e 20 61 6c 6c 3b 0a   {.  Token all;.
b470: 20 20 61 6c 6c 2e 7a 20 3d 20 41 2e 7a 3b 0a 20    all.z = A.z;. 
b480: 20 61 6c 6c 2e 6e 20 3d 20 28 69 6e 74 29 28 5a   all.n = (int)(Z
b490: 2e 7a 20 2d 20 41 2e 7a 29 20 2b 20 5a 2e 6e 3b  .z - A.z) + Z.n;
b4a0: 0a 20 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  .  sqlite3Finish
b4b0: 54 72 69 67 67 65 72 28 70 50 61 72 73 65 2c 20  Trigger(pParse, 
b4c0: 53 2c 20 26 61 6c 6c 29 3b 0a 7d 0a 0a 74 72 69  S, &all);.}..tri
b4d0: 67 67 65 72 5f 64 65 63 6c 28 41 29 20 3a 3a 3d  gger_decl(A) ::=
b4e0: 20 74 65 6d 70 28 54 29 20 54 52 49 47 47 45 52   temp(T) TRIGGER
b4f0: 20 69 66 6e 6f 74 65 78 69 73 74 73 28 4e 4f 45   ifnotexists(NOE
b500: 52 52 29 20 6e 6d 28 42 29 20 64 62 6e 6d 28 5a  RR) nm(B) dbnm(Z
b510: 29 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ) .             
b520: 20 20 20 20 20 20 20 74 72 69 67 67 65 72 5f 74         trigger_t
b530: 69 6d 65 28 43 29 20 74 72 69 67 67 65 72 5f 65  ime(C) trigger_e
b540: 76 65 6e 74 28 44 29 0a 20 20 20 20 20 20 20 20  vent(D).        
b550: 20 20 20 20 20 20 20 20 20 20 20 20 4f 4e 20 66              ON f
b560: 75 6c 6c 6e 61 6d 65 28 45 29 20 66 6f 72 65 61  ullname(E) forea
b570: 63 68 5f 63 6c 61 75 73 65 20 77 68 65 6e 5f 63  ch_clause when_c
b580: 6c 61 75 73 65 28 47 29 2e 20 7b 0a 20 20 73 71  lause(G). {.  sq
b590: 6c 69 74 65 33 42 65 67 69 6e 54 72 69 67 67 65  lite3BeginTrigge
b5a0: 72 28 70 50 61 72 73 65 2c 20 26 42 2c 20 26 5a  r(pParse, &B, &Z
b5b0: 2c 20 43 2c 20 44 2e 61 2c 20 44 2e 62 2c 20 45  , C, D.a, D.b, E
b5c0: 2c 20 47 2c 20 54 2c 20 4e 4f 45 52 52 29 3b 0a  , G, T, NOERR);.
b5d0: 20 20 41 20 3d 20 28 5a 2e 6e 3d 3d 30 3f 42 3a    A = (Z.n==0?B:
b5e0: 5a 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 74 72 69  Z);.}..%type tri
b5f0: 67 67 65 72 5f 74 69 6d 65 20 7b 69 6e 74 7d 0a  gger_time {int}.
b600: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 20  trigger_time(A) 
b610: 3a 3a 3d 20 42 45 46 4f 52 45 2e 20 20 20 20 20  ::= BEFORE.     
b620: 20 7b 20 41 20 3d 20 54 4b 5f 42 45 46 4f 52 45   { A = TK_BEFORE
b630: 3b 20 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d 65  ; }.trigger_time
b640: 28 41 29 20 3a 3a 3d 20 41 46 54 45 52 2e 20 20  (A) ::= AFTER.  
b650: 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 41 46       { A = TK_AF
b660: 54 45 52 3b 20 20 7d 0a 74 72 69 67 67 65 72 5f  TER;  }.trigger_
b670: 74 69 6d 65 28 41 29 20 3a 3a 3d 20 49 4e 53 54  time(A) ::= INST
b680: 45 41 44 20 4f 46 2e 20 20 7b 20 41 20 3d 20 54  EAD OF.  { A = T
b690: 4b 5f 49 4e 53 54 45 41 44 3b 7d 0a 74 72 69 67  K_INSTEAD;}.trig
b6a0: 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20  ger_time(A) ::= 
b6b0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41  .            { A
b6c0: 20 3d 20 54 4b 5f 42 45 46 4f 52 45 3b 20 7d 0a   = TK_BEFORE; }.
b6d0: 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 65  .%type trigger_e
b6e0: 76 65 6e 74 20 7b 73 74 72 75 63 74 20 54 72 69  vent {struct Tri
b6f0: 67 45 76 65 6e 74 7d 0a 25 64 65 73 74 72 75 63  gEvent}.%destruc
b700: 74 6f 72 20 74 72 69 67 67 65 72 5f 65 76 65 6e  tor trigger_even
b710: 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t {sqlite3IdList
b720: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
b730: 62 2c 20 24 24 2e 62 29 3b 7d 0a 74 72 69 67 67  b, $$.b);}.trigg
b740: 65 72 5f 65 76 65 6e 74 28 41 29 20 3a 3a 3d 20  er_event(A) ::= 
b750: 44 45 4c 45 54 45 7c 49 4e 53 45 52 54 28 4f 50  DELETE|INSERT(OP
b760: 29 2e 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20  ).       {A.a = 
b770: 40 4f 50 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 74  @OP; A.b = 0;}.t
b780: 72 69 67 67 65 72 5f 65 76 65 6e 74 28 41 29 20  rigger_event(A) 
b790: 3a 3a 3d 20 55 50 44 41 54 45 28 4f 50 29 2e 20  ::= UPDATE(OP). 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 2e               {A.
b7b0: 61 20 3d 20 40 4f 50 3b 20 41 2e 62 20 3d 20 30  a = @OP; A.b = 0
b7c0: 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e 74  ;}.trigger_event
b7d0: 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45 20 4f  (A) ::= UPDATE O
b7e0: 46 20 69 64 6c 69 73 74 28 58 29 2e 20 7b 41 2e  F idlist(X). {A.
b7f0: 61 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b 20 41  a = TK_UPDATE; A
b800: 2e 62 20 3d 20 58 3b 7d 0a 0a 66 6f 72 65 61 63  .b = X;}..foreac
b810: 68 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 2e 0a 66  h_clause ::= ..f
b820: 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 20 3a 3a  oreach_clause ::
b830: 3d 20 46 4f 52 20 45 41 43 48 20 52 4f 57 2e 0a  = FOR EACH ROW..
b840: 0a 25 74 79 70 65 20 77 68 65 6e 5f 63 6c 61 75  .%type when_clau
b850: 73 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74  se {Expr*}.%dest
b860: 72 75 63 74 6f 72 20 77 68 65 6e 5f 63 6c 61 75  ructor when_clau
b870: 73 65 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44  se {sqlite3ExprD
b880: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
b890: 2c 20 24 24 29 3b 7d 0a 77 68 65 6e 5f 63 6c 61  , $$);}.when_cla
b8a0: 75 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20  use(A) ::= .    
b8b0: 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 30           { A = 0
b8c0: 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 65 28  ; }.when_clause(
b8d0: 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78 70 72  A) ::= WHEN expr
b8e0: 28 58 29 2e 20 7b 20 41 20 3d 20 58 2e 70 45 78  (X). { A = X.pEx
b8f0: 70 72 3b 20 7d 0a 0a 25 74 79 70 65 20 74 72 69  pr; }..%type tri
b900: 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 54  gger_cmd_list {T
b910: 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 64 65  riggerStep*}.%de
b920: 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 65 72  structor trigger
b930: 5f 63 6d 64 5f 6c 69 73 74 20 7b 73 71 6c 69 74  _cmd_list {sqlit
b940: 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53  e3DeleteTriggerS
b950: 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  tep(pParse->db, 
b960: 24 24 29 3b 7d 0a 74 72 69 67 67 65 72 5f 63 6d  $$);}.trigger_cm
b970: 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72  d_list(A) ::= tr
b980: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 59  igger_cmd_list(Y
b990: 29 20 74 72 69 67 67 65 72 5f 63 6d 64 28 58 29  ) trigger_cmd(X)
b9a0: 20 53 45 4d 49 2e 20 7b 0a 20 20 61 73 73 65 72   SEMI. {.  asser
b9b0: 74 28 20 59 21 3d 30 20 29 3b 0a 20 20 59 2d 3e  t( Y!=0 );.  Y->
b9c0: 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d 20 58  pLast->pNext = X
b9d0: 3b 0a 20 20 59 2d 3e 70 4c 61 73 74 20 3d 20 58  ;.  Y->pLast = X
b9e0: 3b 0a 20 20 41 20 3d 20 59 3b 0a 7d 0a 74 72 69  ;.  A = Y;.}.tri
b9f0: 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 41 29  gger_cmd_list(A)
ba00: 20 3a 3a 3d 20 74 72 69 67 67 65 72 5f 63 6d 64   ::= trigger_cmd
ba10: 28 58 29 20 53 45 4d 49 2e 20 7b 20 0a 20 20 61  (X) SEMI. { .  a
ba20: 73 73 65 72 74 28 20 58 21 3d 30 20 29 3b 0a 20  ssert( X!=0 );. 
ba30: 20 58 2d 3e 70 4c 61 73 74 20 3d 20 58 3b 0a 20   X->pLast = X;. 
ba40: 20 41 20 3d 20 58 3b 0a 7d 0a 0a 2f 2f 20 44 69   A = X;.}..// Di
ba50: 73 61 6c 6c 6f 77 20 71 75 61 6c 69 66 69 65 64  sallow qualified
ba60: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 6f 6e 20   table names on 
ba70: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
ba80: 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61 74 65  and DELETE state
ba90: 6d 65 6e 74 73 0a 2f 2f 20 77 69 74 68 69 6e 20  ments.// within 
baa0: 61 20 74 72 69 67 67 65 72 2e 20 20 54 68 65 20  a trigger.  The 
bab0: 74 61 62 6c 65 20 74 6f 20 49 4e 53 45 52 54 2c  table to INSERT,
bac0: 20 55 50 44 41 54 45 2c 20 6f 72 20 44 45 4c 45   UPDATE, or DELE
bad0: 54 45 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20  TE is always in 
bae0: 0a 2f 2f 20 74 68 65 20 73 61 6d 65 20 64 61 74  .// the same dat
baf0: 61 62 61 73 65 20 61 73 20 74 68 65 20 74 61 62  abase as the tab
bb00: 6c 65 20 74 68 61 74 20 74 68 65 20 74 72 69 67  le that the trig
bb10: 67 65 72 20 66 69 72 65 73 20 6f 6e 2e 0a 2f 2f  ger fires on..//
bb20: 0a 25 74 79 70 65 20 74 72 6e 6d 20 7b 54 6f 6b  .%type trnm {Tok
bb30: 65 6e 7d 0a 74 72 6e 6d 28 41 29 20 3a 3a 3d 20  en}.trnm(A) ::= 
bb40: 6e 6d 28 58 29 2e 20 20 20 7b 41 20 3d 20 58 3b  nm(X).   {A = X;
bb50: 7d 0a 74 72 6e 6d 28 41 29 20 3a 3a 3d 20 6e 6d  }.trnm(A) ::= nm
bb60: 20 44 4f 54 20 6e 6d 28 58 29 2e 20 7b 0a 20 20   DOT nm(X). {.  
bb70: 41 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65 33  A = X;.  sqlite3
bb80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
bb90: 20 0a 20 20 20 20 20 20 20 20 22 71 75 61 6c 69   .        "quali
bba0: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 73  fied table names
bbb0: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
bbc0: 20 6f 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   on INSERT, UPDA
bbd0: 54 45 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 22  TE, and DELETE "
bbe0: 0a 20 20 20 20 20 20 20 20 22 73 74 61 74 65 6d  .        "statem
bbf0: 65 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67  ents within trig
bc00: 67 65 72 73 22 29 3b 0a 7d 0a 0a 2f 2f 20 44 69  gers");.}..// Di
bc10: 73 61 6c 6c 6f 77 20 74 68 65 20 49 4e 44 45 58  sallow the INDEX
bc20: 20 42 59 20 61 6e 64 20 4e 4f 54 20 49 4e 44 45   BY and NOT INDE
bc30: 58 45 44 20 63 6c 61 75 73 65 73 20 6f 6e 20 55  XED clauses on U
bc40: 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45  PDATE and DELETE
bc50: 0a 2f 2f 20 73 74 61 74 65 6d 65 6e 74 73 20 77  .// statements w
bc60: 69 74 68 69 6e 20 74 72 69 67 67 65 72 73 2e 20  ithin triggers. 
bc70: 20 57 65 20 6d 61 6b 65 20 61 20 73 70 65 63 69   We make a speci
bc80: 66 69 63 20 65 72 72 6f 72 20 6d 65 73 73 61 67  fic error messag
bc90: 65 20 66 6f 72 20 74 68 69 73 0a 2f 2f 20 73 69  e for this.// si
bca0: 6e 63 65 20 69 74 20 69 73 20 61 6e 20 65 78 63  nce it is an exc
bcb0: 65 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 64 65  eption to the de
bcc0: 66 61 75 6c 74 20 67 72 61 6d 6d 61 72 20 72 75  fault grammar ru
bcd0: 6c 65 73 2e 0a 2f 2f 0a 74 72 69 64 78 62 79 20  les..//.tridxby 
bce0: 3a 3a 3d 20 2e 0a 74 72 69 64 78 62 79 20 3a 3a  ::= ..tridxby ::
bcf0: 3d 20 49 4e 44 45 58 45 44 20 42 59 20 6e 6d 2e  = INDEXED BY nm.
bd00: 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f   {.  sqlite3Erro
bd10: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
bd20: 20 20 20 20 20 22 74 68 65 20 49 4e 44 45 58 45       "the INDEXE
bd30: 44 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 6e  D BY clause is n
bd40: 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 55 50  ot allowed on UP
bd50: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
bd60: 74 61 74 65 6d 65 6e 74 73 20 22 0a 20 20 20 20  tatements ".    
bd70: 20 20 20 20 22 77 69 74 68 69 6e 20 74 72 69 67      "within trig
bd80: 67 65 72 73 22 29 3b 0a 7d 0a 74 72 69 64 78 62  gers");.}.tridxb
bd90: 79 20 3a 3a 3d 20 4e 4f 54 20 49 4e 44 45 58 45  y ::= NOT INDEXE
bda0: 44 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 72  D. {.  sqlite3Er
bdb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
bdc0: 20 20 20 20 20 20 20 22 74 68 65 20 4e 4f 54 20         "the NOT 
bdd0: 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 69  INDEXED clause i
bde0: 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  s not allowed on
bdf0: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
be00: 45 20 73 74 61 74 65 6d 65 6e 74 73 20 22 0a 20  E statements ". 
be10: 20 20 20 20 20 20 20 22 77 69 74 68 69 6e 20 74         "within t
be20: 72 69 67 67 65 72 73 22 29 3b 0a 7d 0a 0a 0a 0a  riggers");.}....
be30: 25 74 79 70 65 20 74 72 69 67 67 65 72 5f 63 6d  %type trigger_cm
be40: 64 20 7b 54 72 69 67 67 65 72 53 74 65 70 2a 7d  d {TriggerStep*}
be50: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72 69  .%destructor tri
be60: 67 67 65 72 5f 63 6d 64 20 7b 73 71 6c 69 74 65  gger_cmd {sqlite
be70: 33 44 65 6c 65 74 65 54 72 69 67 67 65 72 53 74  3DeleteTriggerSt
be80: 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24  ep(pParse->db, $
be90: 24 29 3b 7d 0a 2f 2f 20 55 50 44 41 54 45 20 0a  $);}.// UPDATE .
bea0: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a  trigger_cmd(A) :
beb0: 3a 3d 0a 20 20 20 55 50 44 41 54 45 20 6f 72 63  :=.   UPDATE orc
bec0: 6f 6e 66 28 52 29 20 74 72 6e 6d 28 58 29 20 74  onf(R) trnm(X) t
bed0: 72 69 64 78 62 79 20 53 45 54 20 73 65 74 6c 69  ridxby SET setli
bee0: 73 74 28 59 29 20 77 68 65 72 65 5f 6f 70 74 28  st(Y) where_opt(
bef0: 5a 29 2e 20 20 0a 20 20 20 7b 20 41 20 3d 20 73  Z).  .   { A = s
bf00: 71 6c 69 74 65 33 54 72 69 67 67 65 72 55 70 64  qlite3TriggerUpd
bf10: 61 74 65 53 74 65 70 28 70 50 61 72 73 65 2d 3e  ateStep(pParse->
bf20: 64 62 2c 20 26 58 2c 20 59 2c 20 5a 2c 20 52 29  db, &X, Y, Z, R)
bf30: 3b 20 7d 0a 0a 2f 2f 20 49 4e 53 45 52 54 0a 74  ; }..// INSERT.t
bf40: 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a  rigger_cmd(A) ::
bf50: 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 20  = insert_cmd(R) 
bf60: 49 4e 54 4f 20 74 72 6e 6d 28 58 29 20 69 6e 73  INTO trnm(X) ins
bf70: 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 29 20 73  collist_opt(F) s
bf80: 65 6c 65 63 74 28 53 29 2e 0a 20 20 20 20 20 20  elect(S)..      
bf90: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
bfa0: 6c 69 74 65 33 54 72 69 67 67 65 72 49 6e 73 65  lite3TriggerInse
bfb0: 72 74 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64  rtStep(pParse->d
bfc0: 62 2c 20 26 58 2c 20 46 2c 20 53 2c 20 52 29 3b  b, &X, F, S, R);
bfd0: 7d 0a 0a 2f 2f 20 44 45 4c 45 54 45 0a 74 72 69  }..// DELETE.tri
bfe0: 67 67 65 72 5f 63 6d 64 28 41 29 20 3a 3a 3d 20  gger_cmd(A) ::= 
bff0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 72 6e 6d  DELETE FROM trnm
c000: 28 58 29 20 74 72 69 64 78 62 79 20 77 68 65 72  (X) tridxby wher
c010: 65 5f 6f 70 74 28 59 29 2e 0a 20 20 20 20 20 20  e_opt(Y)..      
c020: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71           {A = sq
c030: 6c 69 74 65 33 54 72 69 67 67 65 72 44 65 6c 65  lite3TriggerDele
c040: 74 65 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64  teStep(pParse->d
c050: 62 2c 20 26 58 2c 20 59 29 3b 7d 0a 0a 2f 2f 20  b, &X, Y);}..// 
c060: 53 45 4c 45 43 54 0a 74 72 69 67 67 65 72 5f 63  SELECT.trigger_c
c070: 6d 64 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74  md(A) ::= select
c080: 28 58 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (X).  {A = sqlit
c090: 65 33 54 72 69 67 67 65 72 53 65 6c 65 63 74 53  e3TriggerSelectS
c0a0: 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  tep(pParse->db, 
c0b0: 58 29 3b 20 7d 0a 0a 2f 2f 20 54 68 65 20 73 70  X); }..// The sp
c0c0: 65 63 69 61 6c 20 52 41 49 53 45 20 65 78 70 72  ecial RAISE expr
c0d0: 65 73 73 69 6f 6e 20 74 68 61 74 20 6d 61 79 20  ession that may 
c0e0: 6f 63 63 75 72 20 69 6e 20 74 72 69 67 67 65 72  occur in trigger
c0f0: 20 70 72 6f 67 72 61 6d 73 0a 65 78 70 72 28 41   programs.expr(A
c100: 29 20 3a 3a 3d 20 52 41 49 53 45 28 58 29 20 4c  ) ::= RAISE(X) L
c110: 50 20 49 47 4e 4f 52 45 20 52 50 28 59 29 2e 20  P IGNORE RP(Y). 
c120: 20 7b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73   {.  A.pExpr = s
c130: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
c140: 73 65 2c 20 54 4b 5f 52 41 49 53 45 2c 20 30 2c  se, TK_RAISE, 0,
c150: 20 30 2c 20 30 29 3b 20 0a 20 20 69 66 28 20 41   0, 0); .  if( A
c160: 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 41 2e  .pExpr ){.    A.
c170: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
c180: 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 0a 20 20 7d  = OE_Ignore;.  }
c190: 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d 20 58 2e  .  A.zStart = X.
c1a0: 7a 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 26 59  z;.  A.zEnd = &Y
c1b0: 2e 7a 5b 59 2e 6e 5d 3b 0a 7d 0a 65 78 70 72 28  .z[Y.n];.}.expr(
c1c0: 41 29 20 3a 3a 3d 20 52 41 49 53 45 28 58 29 20  A) ::= RAISE(X) 
c1d0: 4c 50 20 72 61 69 73 65 74 79 70 65 28 54 29 20  LP raisetype(T) 
c1e0: 43 4f 4d 4d 41 20 6e 6d 28 5a 29 20 52 50 28 59  COMMA nm(Z) RP(Y
c1f0: 29 2e 20 20 7b 0a 20 20 41 2e 70 45 78 70 72 20  ).  {.  A.pExpr 
c200: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
c210: 50 61 72 73 65 2c 20 54 4b 5f 52 41 49 53 45 2c  Parse, TK_RAISE,
c220: 20 30 2c 20 30 2c 20 26 5a 29 3b 20 0a 20 20 69   0, 0, &Z); .  i
c230: 66 28 20 41 2e 70 45 78 70 72 20 29 20 7b 0a 20  f( A.pExpr ) {. 
c240: 20 20 20 41 2e 70 45 78 70 72 2d 3e 61 66 66 69     A.pExpr->affi
c250: 6e 69 74 79 20 3d 20 28 63 68 61 72 29 54 3b 0a  nity = (char)T;.
c260: 20 20 7d 0a 20 20 41 2e 7a 53 74 61 72 74 20 3d    }.  A.zStart =
c270: 20 58 2e 7a 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d   X.z;.  A.zEnd =
c280: 20 26 59 2e 7a 5b 59 2e 6e 5d 3b 0a 7d 0a 25 65   &Y.z[Y.n];.}.%e
c290: 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f 4d  ndif  !SQLITE_OM
c2a0: 49 54 5f 54 52 49 47 47 45 52 0a 0a 25 74 79 70  IT_TRIGGER..%typ
c2b0: 65 20 72 61 69 73 65 74 79 70 65 20 7b 69 6e 74  e raisetype {int
c2c0: 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a  }.raisetype(A) :
c2d0: 3a 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b 41  := ROLLBACK.  {A
c2e0: 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b 7d   = OE_Rollback;}
c2f0: 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a 3a  .raisetype(A) ::
c300: 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 7b 41 20  = ABORT.     {A 
c310: 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61 69  = OE_Abort;}.rai
c320: 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46 41  setype(A) ::= FA
c330: 49 4c 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f 45  IL.      {A = OE
c340: 5f 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f  _Fail;}...//////
c350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c360: 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45 52  //  DROP TRIGGER
c370: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
c380: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c390: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65  /////////.%ifnde
c3a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
c3b0: 49 47 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44 52  IGGER.cmd ::= DR
c3c0: 4f 50 20 54 52 49 47 47 45 52 20 69 66 65 78 69  OP TRIGGER ifexi
c3d0: 73 74 73 28 4e 4f 45 52 52 29 20 66 75 6c 6c 6e  sts(NOERR) fulln
c3e0: 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69  ame(X). {.  sqli
c3f0: 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28 70  te3DropTrigger(p
c400: 50 61 72 73 65 2c 58 2c 4e 4f 45 52 52 29 3b 0a  Parse,X,NOERR);.
c410: 7d 0a 25 65 6e 64 69 66 20 20 21 53 51 4c 49 54  }.%endif  !SQLIT
c420: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a  E_OMIT_TRIGGER..
c430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c440: 2f 2f 2f 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 20  //////// ATTACH 
c450: 44 41 54 41 42 41 53 45 20 66 69 6c 65 20 41 53  DATABASE file AS
c460: 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f   name //////////
c470: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
c480: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
c490: 4d 49 54 5f 41 54 54 41 43 48 0a 63 6d 64 20 3a  MIT_ATTACH.cmd :
c4a0: 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61 62 61  := ATTACH databa
c4b0: 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 46  se_kw_opt expr(F
c4c0: 29 20 41 53 20 65 78 70 72 28 44 29 20 6b 65 79  ) AS expr(D) key
c4d0: 5f 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71 6c  _opt(K). {.  sql
c4e0: 69 74 65 33 41 74 74 61 63 68 28 70 50 61 72 73  ite3Attach(pPars
c4f0: 65 2c 20 46 2e 70 45 78 70 72 2c 20 44 2e 70 45  e, F.pExpr, D.pE
c500: 78 70 72 2c 20 4b 29 3b 0a 7d 0a 63 6d 64 20 3a  xpr, K);.}.cmd :
c510: 3a 3d 20 44 45 54 41 43 48 20 64 61 74 61 62 61  := DETACH databa
c520: 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 44  se_kw_opt expr(D
c530: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 65  ). {.  sqlite3De
c540: 74 61 63 68 28 70 50 61 72 73 65 2c 20 44 2e 70  tach(pParse, D.p
c550: 45 78 70 72 29 3b 0a 7d 0a 0a 25 74 79 70 65 20  Expr);.}..%type 
c560: 6b 65 79 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a  key_opt {Expr*}.
c570: 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 5f  %destructor key_
c580: 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 72  opt {sqlite3Expr
c590: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
c5a0: 62 2c 20 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70 74  b, $$);}.key_opt
c5b0: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20  (A) ::= .       
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
c5d0: 41 20 3d 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70 74  A = 0; }.key_opt
c5e0: 28 41 29 20 3a 3a 3d 20 4b 45 59 20 65 78 70 72  (A) ::= KEY expr
c5f0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 20  (X).          { 
c600: 41 20 3d 20 58 2e 70 45 78 70 72 3b 20 7d 0a 0a  A = X.pExpr; }..
c610: 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20  database_kw_opt 
c620: 3a 3a 3d 20 44 41 54 41 42 41 53 45 2e 0a 64 61  ::= DATABASE..da
c630: 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a 3a  tabase_kw_opt ::
c640: 3d 20 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49 54  = ..%endif SQLIT
c650: 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 0a 2f  E_OMIT_ATTACH../
c660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44 45  ///////// REINDE
c680: 58 20 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f 2f  X collation ////
c690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c6a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25  //////////////.%
c6b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c6c0: 49 54 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20 3a  IT_REINDEX.cmd :
c6d0: 3a 3d 20 52 45 49 4e 44 45 58 2e 20 20 20 20 20  := REINDEX.     
c6e0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
c6f0: 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72 73  te3Reindex(pPars
c700: 65 2c 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a  e, 0, 0);}.cmd :
c710: 3a 3d 20 52 45 49 4e 44 45 58 20 6e 6d 28 58 29  := REINDEX nm(X)
c720: 20 64 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c 69   dbnm(Y).  {sqli
c730: 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72 73  te3Reindex(pPars
c740: 65 2c 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65 6e  e, &X, &Y);}.%en
c750: 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 54  dif  SQLITE_OMIT
c760: 5f 52 45 49 4e 44 45 58 0a 0a 2f 2f 2f 2f 2f 2f  _REINDEX..//////
c770: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c780: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4e  ///////////// AN
c790: 41 4c 59 5a 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ALYZE //////////
c7a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c7b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 65  /////////.%ifnde
c7c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4e  f SQLITE_OMIT_AN
c7d0: 41 4c 59 5a 45 0a 63 6d 64 20 3a 3a 3d 20 41 4e  ALYZE.cmd ::= AN
c7e0: 41 4c 59 5a 45 2e 20 20 20 20 20 20 20 20 20 20  ALYZE.          
c7f0: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 6e        {sqlite3An
c800: 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 30 2c  alyze(pParse, 0,
c810: 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 41 4e   0);}.cmd ::= AN
c820: 41 4c 59 5a 45 20 6e 6d 28 58 29 20 64 62 6e 6d  ALYZE nm(X) dbnm
c830: 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 41 6e  (Y).  {sqlite3An
c840: 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 26 58  alyze(pParse, &X
c850: 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66 0a 0a  , &Y);}.%endif..
c860: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c870: 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20 54  //////// ALTER T
c880: 41 42 4c 45 20 74 61 62 6c 65 20 2e 2e 2e 20 2f  ABLE table ... /
c890: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
c8a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
c8b0: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  %ifndef SQLITE_O
c8c0: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 63  MIT_ALTERTABLE.c
c8d0: 6d 64 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42  md ::= ALTER TAB
c8e0: 4c 45 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 52  LE fullname(X) R
c8f0: 45 4e 41 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e 20  ENAME TO nm(Z). 
c900: 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72  {.  sqlite3Alter
c910: 52 65 6e 61 6d 65 54 61 62 6c 65 28 70 50 61 72  RenameTable(pPar
c920: 73 65 2c 58 2c 26 5a 29 3b 0a 7d 0a 63 6d 64 20  se,X,&Z);.}.cmd 
c930: 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 20  ::= ALTER TABLE 
c940: 61 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e  add_column_fulln
c950: 61 6d 65 20 41 44 44 20 6b 77 63 6f 6c 75 6d 6e  ame ADD kwcolumn
c960: 5f 6f 70 74 20 63 6f 6c 75 6d 6e 28 59 29 2e 20  _opt column(Y). 
c970: 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 72  {.  sqlite3Alter
c980: 46 69 6e 69 73 68 41 64 64 43 6f 6c 75 6d 6e 28  FinishAddColumn(
c990: 70 50 61 72 73 65 2c 20 26 59 29 3b 0a 7d 0a 61  pParse, &Y);.}.a
c9a0: 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c 6e 61  dd_column_fullna
c9b0: 6d 65 20 3a 3a 3d 20 66 75 6c 6c 6e 61 6d 65 28  me ::= fullname(
c9c0: 58 29 2e 20 7b 0a 20 20 70 50 61 72 73 65 2d 3e  X). {.  pParse->
c9d0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
c9e0: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 73 71  nabled = 0;.  sq
c9f0: 6c 69 74 65 33 41 6c 74 65 72 42 65 67 69 6e 41  lite3AlterBeginA
ca00: 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  ddColumn(pParse,
ca10: 20 58 29 3b 0a 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f   X);.}.kwcolumn_
ca20: 6f 70 74 20 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75  opt ::= ..kwcolu
ca30: 6d 6e 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d  mn_opt ::= COLUM
ca40: 4e 4b 57 2e 0a 25 65 6e 64 69 66 20 20 53 51 4c  NKW..%endif  SQL
ca50: 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41  ITE_OMIT_ALTERTA
ca60: 42 4c 45 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  BLE..///////////
ca70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52  ///////////// CR
ca80: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
ca90: 4c 45 20 2e 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  LE ... /////////
caa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
cab0: 2f 2f 2f 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c  ////.%ifndef SQL
cac0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
cad0: 54 41 42 4c 45 0a 63 6d 64 20 3a 3a 3d 20 63 72  TABLE.cmd ::= cr
cae0: 65 61 74 65 5f 76 74 61 62 2e 20 20 20 20 20 20  eate_vtab.      
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 7b 73 71 6c 69 74 65 33 56 74 61 62 46 69 6e   {sqlite3VtabFin
cb10: 69 73 68 50 61 72 73 65 28 70 50 61 72 73 65 2c  ishParse(pParse,
cb20: 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 63 72 65  0);}.cmd ::= cre
cb30: 61 74 65 5f 76 74 61 62 20 4c 50 20 76 74 61 62  ate_vtab LP vtab
cb40: 61 72 67 6c 69 73 74 20 52 50 28 58 29 2e 20 20  arglist RP(X).  
cb50: 7b 73 71 6c 69 74 65 33 56 74 61 62 46 69 6e 69  {sqlite3VtabFini
cb60: 73 68 50 61 72 73 65 28 70 50 61 72 73 65 2c 26  shParse(pParse,&
cb70: 58 29 3b 7d 0a 63 72 65 61 74 65 5f 76 74 61 62  X);}.create_vtab
cb80: 20 3a 3a 3d 20 63 72 65 61 74 65 6b 77 20 56 49   ::= createkw VI
cb90: 52 54 55 41 4c 20 54 41 42 4c 45 20 69 66 6e 6f  RTUAL TABLE ifno
cba0: 74 65 78 69 73 74 73 28 45 29 0a 20 20 20 20 20  texists(E).     
cbb0: 20 20 20 20 20 20 20 20 20 20 20 6e 6d 28 58 29             nm(X)
cbc0: 20 64 62 6e 6d 28 59 29 20 55 53 49 4e 47 20 6e   dbnm(Y) USING n
cbd0: 6d 28 5a 29 2e 20 7b 0a 20 20 20 20 73 71 6c 69  m(Z). {.    sqli
cbe0: 74 65 33 56 74 61 62 42 65 67 69 6e 50 61 72 73  te3VtabBeginPars
cbf0: 65 28 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59  e(pParse, &X, &Y
cc00: 2c 20 26 5a 2c 20 45 29 3b 0a 7d 0a 76 74 61 62  , &Z, E);.}.vtab
cc10: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 76 74 61 62  arglist ::= vtab
cc20: 61 72 67 2e 0a 76 74 61 62 61 72 67 6c 69 73 74  arg..vtabarglist
cc30: 20 3a 3a 3d 20 76 74 61 62 61 72 67 6c 69 73 74   ::= vtabarglist
cc40: 20 43 4f 4d 4d 41 20 76 74 61 62 61 72 67 2e 0a   COMMA vtabarg..
cc50: 76 74 61 62 61 72 67 20 3a 3a 3d 20 2e 20 20 20  vtabarg ::= .   
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc70: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62      {sqlite3Vtab
cc80: 41 72 67 49 6e 69 74 28 70 50 61 72 73 65 29 3b  ArgInit(pParse);
cc90: 7d 0a 76 74 61 62 61 72 67 20 3a 3a 3d 20 76 74  }.vtabarg ::= vt
cca0: 61 62 61 72 67 20 76 74 61 62 61 72 67 74 6f 6b  abarg vtabargtok
ccb0: 65 6e 2e 0a 76 74 61 62 61 72 67 74 6f 6b 65 6e  en..vtabargtoken
ccc0: 20 3a 3a 3d 20 41 4e 59 28 58 29 2e 20 20 20 20   ::= ANY(X).    
ccd0: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33          {sqlite3
cce0: 56 74 61 62 41 72 67 45 78 74 65 6e 64 28 70 50  VtabArgExtend(pP
ccf0: 61 72 73 65 2c 26 58 29 3b 7d 0a 76 74 61 62 61  arse,&X);}.vtaba
cd00: 72 67 74 6f 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61  rgtoken ::= lp a
cd10: 6e 79 6c 69 73 74 20 52 50 28 58 29 2e 20 20 7b  nylist RP(X).  {
cd20: 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 45 78  sqlite3VtabArgEx
cd30: 74 65 6e 64 28 70 50 61 72 73 65 2c 26 58 29 3b  tend(pParse,&X);
cd40: 7d 0a 6c 70 20 3a 3a 3d 20 4c 50 28 58 29 2e 20  }.lp ::= LP(X). 
cd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd60: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74        {sqlite3Vt
cd70: 61 62 41 72 67 45 78 74 65 6e 64 28 70 50 61 72  abArgExtend(pPar
cd80: 73 65 2c 26 58 29 3b 7d 0a 61 6e 79 6c 69 73 74  se,&X);}.anylist
cd90: 20 3a 3a 3d 20 2e 0a 61 6e 79 6c 69 73 74 20 3a   ::= ..anylist :
cda0: 3a 3d 20 61 6e 79 6c 69 73 74 20 4c 50 20 61 6e  := anylist LP an
cdb0: 79 6c 69 73 74 20 52 50 2e 0a 61 6e 79 6c 69 73  ylist RP..anylis
cdc0: 74 20 3a 3a 3d 20 61 6e 79 6c 69 73 74 20 41 4e  t ::= anylist AN
cdd0: 59 2e 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54  Y..%endif  SQLIT
cde0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
cdf0: 42 4c 45 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  BLE...//////////
ce00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43  ////////////// C
ce10: 4f 4d 4d 4f 4e 20 54 41 42 4c 45 20 45 58 50 52  OMMON TABLE EXPR
ce20: 45 53 53 49 4f 4e 53 20 2f 2f 2f 2f 2f 2f 2f 2f  ESSIONS ////////
ce30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
ce40: 2f 2f 2f 2f 0a 25 74 79 70 65 20 77 69 74 68 20  ////.%type with 
ce50: 7b 57 69 74 68 2a 7d 0a 25 74 79 70 65 20 77 71  {With*}.%type wq
ce60: 6c 69 73 74 20 7b 57 69 74 68 2a 7d 0a 25 64 65  list {With*}.%de
ce70: 73 74 72 75 63 74 6f 72 20 77 69 74 68 20 7b 73  structor with {s
ce80: 71 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65  qlite3WithDelete
ce90: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29  (pParse->db, $$)
cea0: 3b 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77  ;}.%destructor w
ceb0: 71 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 57 69  qlist {sqlite3Wi
cec0: 74 68 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  thDelete(pParse-
ced0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 77 69 74 68  >db, $$);}..with
cee0: 28 41 29 20 3a 3a 3d 20 2e 20 7b 41 20 3d 20 30  (A) ::= . {A = 0
cef0: 3b 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54  ;}.%ifndef SQLIT
cf00: 45 5f 4f 4d 49 54 5f 43 54 45 0a 77 69 74 68 28  E_OMIT_CTE.with(
cf10: 41 29 20 3a 3a 3d 20 57 49 54 48 20 77 71 6c 69  A) ::= WITH wqli
cf20: 73 74 28 57 29 2e 20 20 20 20 20 20 20 20 20 20  st(W).          
cf30: 20 20 20 20 7b 20 41 20 3d 20 57 3b 20 7d 0a 77      { A = W; }.w
cf40: 69 74 68 28 41 29 20 3a 3a 3d 20 57 49 54 48 20  ith(A) ::= WITH 
cf50: 52 45 43 55 52 53 49 56 45 20 77 71 6c 69 73 74  RECURSIVE wqlist
cf60: 28 57 29 2e 20 20 20 20 7b 20 41 20 3d 20 57 3b  (W).    { A = W;
cf70: 20 7d 0a 0a 77 71 6c 69 73 74 28 41 29 20 3a 3a   }..wqlist(A) ::
cf80: 3d 20 6e 6d 28 58 29 20 69 64 78 6c 69 73 74 5f  = nm(X) idxlist_
cf90: 6f 70 74 28 59 29 20 41 53 20 4c 50 20 73 65 6c  opt(Y) AS LP sel
cfa0: 65 63 74 28 5a 29 20 52 50 2e 20 7b 0a 20 20 41  ect(Z) RP. {.  A
cfb0: 20 3d 20 73 71 6c 69 74 65 33 57 69 74 68 41 64   = sqlite3WithAd
cfc0: 64 28 70 50 61 72 73 65 2c 20 30 2c 20 26 58 2c  d(pParse, 0, &X,
cfd0: 20 59 2c 20 5a 29 3b 0a 7d 0a 77 71 6c 69 73 74   Y, Z);.}.wqlist
cfe0: 28 41 29 20 3a 3a 3d 20 77 71 6c 69 73 74 28 57  (A) ::= wqlist(W
cff0: 29 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 69 64  ) COMMA nm(X) id
d000: 78 6c 69 73 74 5f 6f 70 74 28 59 29 20 41 53 20  xlist_opt(Y) AS 
d010: 4c 50 20 73 65 6c 65 63 74 28 5a 29 20 52 50 2e  LP select(Z) RP.
d020: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33   {.  A = sqlite3
d030: 57 69 74 68 41 64 64 28 70 50 61 72 73 65 2c 20  WithAdd(pParse, 
d040: 57 2c 20 26 58 2c 20 59 2c 20 5a 29 3b 0a 7d 0a  W, &X, Y, Z);.}.
d050: 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f  %endif  SQLITE_O
d060: 4d 49 54 5f 43 54 45 0a                          MIT_CTE.