/ Hex Artifact Content
Login

Artifact e80f1cf6a280e3da0f49c9b60b14edc2f15912ec:


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 2a 0a 2a 2a 20 40 28 23 29 20  ens..**.** @(#) 
0270: 24 49 64 3a 20 70 61 72 73 65 2e 79 2c 76 20 31  $Id: parse.y,v 1
0280: 2e 34 34 20 32 30 30 32 2f 30 31 2f 33 30 20 31  .44 2002/01/30 1
0290: 36 3a 31 37 3a 32 34 20 64 72 68 20 45 78 70 20  6:17:24 drh Exp 
02a0: 24 0a 2a 2f 0a 25 74 6f 6b 65 6e 5f 70 72 65 66  $.*/.%token_pref
02b0: 69 78 20 54 4b 5f 0a 25 74 6f 6b 65 6e 5f 74 79  ix TK_.%token_ty
02c0: 70 65 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66 61  pe {Token}.%defa
02d0: 75 6c 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e 7d  ult_type {Token}
02e0: 0a 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  .%extra_argument
02f0: 20 7b 50 61 72 73 65 20 2a 70 50 61 72 73 65 7d   {Parse *pParse}
0300: 0a 25 73 79 6e 74 61 78 5f 65 72 72 6f 72 20 7b  .%syntax_error {
0310: 0a 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69  .  sqliteSetStri
0320: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72  ng(&pParse->zErr
0330: 4d 73 67 2c 22 73 79 6e 74 61 78 20 65 72 72 6f  Msg,"syntax erro
0340: 72 22 2c 30 29 3b 0a 20 20 70 50 61 72 73 65 2d  r",0);.  pParse-
0350: 3e 73 45 72 72 54 6f 6b 65 6e 20 3d 20 54 4f 4b  >sErrToken = TOK
0360: 45 4e 3b 0a 7d 0a 25 6e 61 6d 65 20 73 71 6c 69  EN;.}.%name sqli
0370: 74 65 50 61 72 73 65 72 0a 25 69 6e 63 6c 75 64  teParser.%includ
0380: 65 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  e {.#include "sq
0390: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
03a0: 75 64 65 20 22 70 61 72 73 65 2e 68 22 0a 0a 2f  ude "parse.h"../
03b0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
03c0: 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 77 6f   for holding two
03d0: 20 69 6e 74 65 67 65 72 73 0a 2a 2f 0a 73 74 72   integers.*/.str
03e0: 75 63 74 20 74 77 6f 69 6e 74 20 7b 20 69 6e 74  uct twoint { int
03f0: 20 61 2c 62 3b 20 7d 3b 0a 7d 0a 0a 2f 2f 20 54   a,b; };.}..// T
0400: 68 65 73 65 20 61 72 65 20 65 78 74 72 61 20 74  hese are extra t
0410: 6f 6b 65 6e 73 20 75 73 65 64 20 62 79 20 74 68  okens used by th
0420: 65 20 6c 65 78 65 72 20 62 75 74 20 6e 65 76 65  e lexer but neve
0430: 72 20 73 65 65 6e 20 62 79 20 74 68 65 0a 2f 2f  r seen by the.//
0440: 20 70 61 72 73 65 72 2e 20 20 57 65 20 70 75 74   parser.  We put
0450: 20 74 68 65 6d 20 69 6e 20 61 20 72 75 6c 65 20   them in a rule 
0460: 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 72 73  so that the pars
0470: 65 72 20 67 65 6e 65 72 61 74 6f 72 20 77 69 6c  er generator wil
0480: 6c 0a 2f 2f 20 61 64 64 20 74 68 65 6d 20 74 6f  l.// add them to
0490: 20 74 68 65 20 70 61 72 73 65 2e 68 20 6f 75 74   the parse.h out
04a0: 70 75 74 20 66 69 6c 65 2e 0a 2f 2f 0a 25 6e 6f  put file..//.%no
04b0: 6e 61 73 73 6f 63 20 45 4e 44 5f 4f 46 5f 46 49  nassoc END_OF_FI
04c0: 4c 45 20 49 4c 4c 45 47 41 4c 20 53 50 41 43 45  LE ILLEGAL SPACE
04d0: 20 55 4e 43 4c 4f 53 45 44 5f 53 54 52 49 4e 47   UNCLOSED_STRING
04e0: 20 43 4f 4d 4d 45 4e 54 20 46 55 4e 43 54 49 4f   COMMENT FUNCTIO
04f0: 4e 0a 20 20 20 20 20 20 20 20 20 20 43 4f 4c 55  N.          COLU
0500: 4d 4e 20 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e  MN AGG_FUNCTION.
0510: 0a 0a 2f 2f 20 49 6e 70 75 74 20 69 73 20 7a 65  ..// Input is ze
0520: 72 6f 20 6f 72 20 6d 6f 72 65 20 63 6f 6d 6d 61  ro or more comma
0530: 6e 64 73 2e 0a 69 6e 70 75 74 20 3a 3a 3d 20 63  nds..input ::= c
0540: 6d 64 6c 69 73 74 2e 0a 0a 2f 2f 20 41 20 6c 69  mdlist...// A li
0550: 73 74 20 6f 66 20 63 6f 6d 6d 61 6e 64 73 20 69  st of commands i
0560: 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63  s zero or more c
0570: 6f 6d 6d 61 6e 64 73 0a 2f 2f 0a 63 6d 64 6c 69  ommands.//.cmdli
0580: 73 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a 63 6d 64  st ::= ecmd..cmd
0590: 6c 69 73 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74  list ::= cmdlist
05a0: 20 53 45 4d 49 20 65 63 6d 64 2e 0a 65 63 6d 64   SEMI ecmd..ecmd
05b0: 20 3a 3a 3d 20 65 78 70 6c 61 69 6e 20 63 6d 64   ::= explain cmd
05c0: 2e 20 20 7b 73 71 6c 69 74 65 45 78 65 63 28 70  .  {sqliteExec(p
05d0: 50 61 72 73 65 29 3b 7d 0a 65 63 6d 64 20 3a 3a  Parse);}.ecmd ::
05e0: 3d 20 63 6d 64 2e 20 20 20 20 20 20 20 20 20 20  = cmd.          
05f0: 7b 73 71 6c 69 74 65 45 78 65 63 28 70 50 61 72  {sqliteExec(pPar
0600: 73 65 29 3b 7d 0a 65 63 6d 64 20 3a 3a 3d 20 2e  se);}.ecmd ::= .
0610: 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50  .explain ::= EXP
0620: 4c 41 49 4e 2e 20 20 20 20 7b 70 50 61 72 73 65  LAIN.    {pParse
0630: 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 31 3b 7d 0a  ->explain = 1;}.
0640: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  .///////////////
0650: 2f 2f 2f 2f 2f 2f 20 42 65 67 69 6e 20 61 6e 64  ////// Begin and
0660: 20 65 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   end transaction
0670: 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  s. /////////////
0680: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a  ///////////////.
0690: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 42 45 47 49 4e  //.cmd ::= BEGIN
06a0: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20   trans_opt.     
06b0: 20 20 7b 73 71 6c 69 74 65 42 65 67 69 6e 54 72    {sqliteBeginTr
06c0: 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65  ansaction(pParse
06d0: 29 3b 7d 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a  );}.trans_opt ::
06e0: 3d 20 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a  = ..trans_opt ::
06f0: 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e 2e 0a 74  = TRANSACTION..t
0700: 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41  rans_opt ::= TRA
0710: 4e 53 41 43 54 49 4f 4e 20 69 64 73 2e 0a 63 6d  NSACTION ids..cm
0720: 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54 20 74 72 61  d ::= COMMIT tra
0730: 6e 73 5f 6f 70 74 2e 20 20 20 20 20 20 7b 73 71  ns_opt.      {sq
0740: 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e 73 61  liteCommitTransa
0750: 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b 7d 0a  ction(pParse);}.
0760: 63 6d 64 20 3a 3a 3d 20 45 4e 44 20 74 72 61 6e  cmd ::= END tran
0770: 73 5f 6f 70 74 2e 20 20 20 20 20 20 20 20 20 7b  s_opt.         {
0780: 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 72 61 6e  sqliteCommitTran
0790: 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 29 3b  saction(pParse);
07a0: 7d 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c 4c 42 41  }.cmd ::= ROLLBA
07b0: 43 4b 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20  CK trans_opt.   
07c0: 20 7b 73 71 6c 69 74 65 52 6f 6c 6c 62 61 63 6b   {sqliteRollback
07d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72  Transaction(pPar
07e0: 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f  se);}../////////
07f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
0800: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
0810: 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f  atement ////////
0820: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
0830: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20  ////.//.cmd ::= 
0840: 63 72 65 61 74 65 5f 74 61 62 6c 65 20 63 72 65  create_table cre
0850: 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 2e 0a  ate_table_args..
0860: 63 72 65 61 74 65 5f 74 61 62 6c 65 20 3a 3a 3d  create_table ::=
0870: 20 43 52 45 41 54 45 28 58 29 20 74 65 6d 70 28   CREATE(X) temp(
0880: 54 29 20 54 41 42 4c 45 20 69 64 73 28 59 29 2e  T) TABLE ids(Y).
0890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
08c0: 69 74 65 53 74 61 72 74 54 61 62 6c 65 28 70 50  iteStartTable(pP
08d0: 61 72 73 65 2c 26 58 2c 26 59 2c 54 29 3b 7d 0a  arse,&X,&Y,T);}.
08e0: 25 74 79 70 65 20 74 65 6d 70 20 7b 69 6e 74 7d  %type temp {int}
08f0: 0a 74 65 6d 70 28 41 29 20 3a 3a 3d 20 54 45 4d  .temp(A) ::= TEM
0900: 50 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a 74 65 6d  P.  {A = 1;}.tem
0910: 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  p(A) ::= .      
0920: 7b 41 20 3d 20 30 3b 7d 0a 63 72 65 61 74 65 5f  {A = 0;}.create_
0930: 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 4c  table_args ::= L
0940: 50 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 63 6f 6e  P columnlist con
0950: 73 6c 69 73 74 5f 6f 70 74 20 52 50 28 58 29 2e  slist_opt RP(X).
0960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
0990: 69 74 65 45 6e 64 54 61 62 6c 65 28 70 50 61 72  iteEndTable(pPar
09a0: 73 65 2c 26 58 29 3b 7d 0a 63 6f 6c 75 6d 6e 6c  se,&X);}.columnl
09b0: 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6c 69  ist ::= columnli
09c0: 73 74 20 43 4f 4d 4d 41 20 63 6f 6c 75 6d 6e 2e  st COMMA column.
09d0: 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20  .columnlist ::= 
09e0: 63 6f 6c 75 6d 6e 2e 0a 0a 2f 2f 20 41 62 6f 75  column...// Abou
09f0: 74 20 74 68 65 20 6f 6e 6c 79 20 69 6e 66 6f 72  t the only infor
0a00: 6d 61 74 69 6f 6e 20 75 73 65 64 20 66 6f 72 20  mation used for 
0a10: 61 20 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20  a column is the 
0a20: 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2f 2f 20 63  name of the.// c
0a30: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 74 79 70 65  olumn.  The type
0a40: 20 69 73 20 61 6c 77 61 79 73 20 6a 75 73 74 20   is always just 
0a50: 22 74 65 78 74 22 2e 20 20 42 75 74 20 74 68 65  "text".  But the
0a60: 20 63 6f 64 65 20 77 69 6c 6c 20 61 63 63 65 70   code will accep
0a70: 74 0a 2f 2f 20 61 6e 20 65 6c 61 62 6f 72 61 74  t.// an elaborat
0a80: 65 20 74 79 70 65 6e 61 6d 65 2e 20 20 50 65 72  e typename.  Per
0a90: 68 61 70 73 20 73 6f 6d 65 64 61 79 20 77 65 27  haps someday we'
0aa0: 6c 6c 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20  ll do something 
0ab0: 77 69 74 68 20 69 74 2e 0a 2f 2f 0a 63 6f 6c 75  with it..//.colu
0ac0: 6d 6e 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 69 64 20  mn ::= columnid 
0ad0: 74 79 70 65 20 63 61 72 67 6c 69 73 74 2e 20 0a  type carglist. .
0ae0: 63 6f 6c 75 6d 6e 69 64 20 3a 3a 3d 20 69 64 73  columnid ::= ids
0af0: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20  (X).            
0b00: 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f      {sqliteAddCo
0b10: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 26 58 29 3b  lumn(pParse,&X);
0b20: 7d 0a 0a 2f 2f 20 41 6e 20 49 44 45 4e 54 49 46  }..// An IDENTIF
0b30: 49 45 52 20 63 61 6e 20 62 65 20 61 20 67 65 6e  IER can be a gen
0b40: 65 72 69 63 20 69 64 65 6e 74 69 66 69 65 72 2c  eric identifier,
0b50: 20 6f 72 20 6f 6e 65 20 6f 66 20 73 65 76 65 72   or one of sever
0b60: 61 6c 0a 2f 2f 20 6b 65 79 77 6f 72 64 73 2e 20  al.// keywords. 
0b70: 20 41 6e 79 20 6e 6f 6e 2d 73 74 61 6e 64 61 72   Any non-standar
0b80: 64 20 6b 65 79 77 6f 72 64 20 63 61 6e 20 61 6c  d keyword can al
0b90: 73 6f 20 62 65 20 61 6e 20 69 64 65 6e 74 69 66  so be an identif
0ba0: 69 65 72 2e 0a 2f 2f 20 57 65 20 61 6c 73 6f 20  ier..// We also 
0bb0: 6d 61 6b 65 20 44 45 53 43 20 61 6e 64 20 69 64  make DESC and id
0bc0: 65 6e 74 69 66 69 65 72 20 73 69 6e 63 65 20 69  entifier since i
0bd0: 74 20 63 6f 6d 65 73 20 75 70 20 73 6f 20 6f 66  t comes up so of
0be0: 74 65 6e 20 28 61 73 0a 2f 2f 20 61 6e 20 61 62  ten (as.// an ab
0bf0: 62 72 65 76 69 61 74 69 6f 6e 20 6f 66 20 22 64  breviation of "d
0c00: 65 73 63 72 69 70 74 69 6f 6e 22 29 2e 0a 2f 2f  escription")..//
0c10: 0a 25 74 79 70 65 20 69 64 20 7b 54 6f 6b 65 6e  .%type id {Token
0c20: 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 44 45 53 43  }.id(A) ::= DESC
0c30: 28 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20  (X).       {A = 
0c40: 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 41 53  X;}.id(A) ::= AS
0c50: 43 28 58 29 2e 20 20 20 20 20 20 20 20 7b 41 20  C(X).        {A 
0c60: 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20  = X;}.id(A) ::= 
0c70: 44 45 4c 49 4d 49 54 45 52 53 28 58 29 2e 20 7b  DELIMITERS(X). {
0c80: 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a  A = X;}.id(A) ::
0c90: 3d 20 45 58 50 4c 41 49 4e 28 58 29 2e 20 20 20  = EXPLAIN(X).   
0ca0: 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20   {A = X;}.id(A) 
0cb0: 3a 3a 3d 20 56 41 43 55 55 4d 28 58 29 2e 20 20  ::= VACUUM(X).  
0cc0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41     {A = X;}.id(A
0cd0: 29 20 3a 3a 3d 20 42 45 47 49 4e 28 58 29 2e 20  ) ::= BEGIN(X). 
0ce0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64       {A = X;}.id
0cf0: 28 41 29 20 3a 3a 3d 20 45 4e 44 28 58 29 2e 20  (A) ::= END(X). 
0d00: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
0d10: 69 64 28 41 29 20 3a 3a 3d 20 50 52 41 47 4d 41  id(A) ::= PRAGMA
0d20: 28 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b  (X).     {A = X;
0d30: 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 43 4c 55 53  }.id(A) ::= CLUS
0d40: 54 45 52 28 58 29 2e 20 20 20 20 7b 41 20 3d 20  TER(X).    {A = 
0d50: 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 49 44  X;}.id(A) ::= ID
0d60: 28 58 29 2e 20 20 20 20 20 20 20 20 20 7b 41 20  (X).         {A 
0d70: 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20  = X;}.id(A) ::= 
0d80: 54 45 4d 50 28 58 29 2e 20 20 20 20 20 20 20 7b  TEMP(X).       {
0d90: 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a  A = X;}.id(A) ::
0da0: 3d 20 4f 46 46 53 45 54 28 58 29 2e 20 20 20 20  = OFFSET(X).    
0db0: 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20   {A = X;}.id(A) 
0dc0: 3a 3a 3d 20 4b 45 59 28 58 29 2e 20 20 20 20 20  ::= KEY(X).     
0dd0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41     {A = X;}.id(A
0de0: 29 20 3a 3a 3d 20 41 42 4f 52 54 28 58 29 2e 20  ) ::= ABORT(X). 
0df0: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64       {A = X;}.id
0e00: 28 41 29 20 3a 3a 3d 20 49 47 4e 4f 52 45 28 58  (A) ::= IGNORE(X
0e10: 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a  ).     {A = X;}.
0e20: 69 64 28 41 29 20 3a 3a 3d 20 52 45 50 4c 41 43  id(A) ::= REPLAC
0e30: 45 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b  E(X).    {A = X;
0e40: 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 43 4f 4e 46  }.id(A) ::= CONF
0e50: 4c 49 43 54 28 58 29 2e 20 20 20 7b 41 20 3d 20  LICT(X).   {A = 
0e60: 58 3b 7d 0a 0a 2f 2f 20 41 6e 64 20 22 69 64 73  X;}..// And "ids
0e70: 22 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 65  " is an identife
0e80: 72 2d 6f 72 2d 73 74 72 69 6e 67 2e 0a 2f 2f 0a  r-or-string..//.
0e90: 25 74 79 70 65 20 69 64 73 20 7b 54 6f 6b 65 6e  %type ids {Token
0ea0: 7d 0a 69 64 73 28 41 29 20 3a 3a 3d 20 69 64 28  }.ids(A) ::= id(
0eb0: 58 29 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20  X).        {A = 
0ec0: 58 3b 7d 0a 69 64 73 28 41 29 20 3a 3a 3d 20 53  X;}.ids(A) ::= S
0ed0: 54 52 49 4e 47 28 58 29 2e 20 20 20 20 7b 41 20  TRING(X).    {A 
0ee0: 3d 20 58 3b 7d 0a 0a 74 79 70 65 20 3a 3a 3d 20  = X;}..type ::= 
0ef0: 2e 0a 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e  ..type ::= typen
0f00: 61 6d 65 28 58 29 2e 20 20 20 20 20 20 20 20 20  ame(X).         
0f10: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69             {sqli
0f20: 74 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  teAddColumnType(
0f30: 70 50 61 72 73 65 2c 26 58 2c 26 58 29 3b 7d 0a  pParse,&X,&X);}.
0f40: 74 79 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61 6d  type ::= typenam
0f50: 65 28 58 29 20 4c 50 20 73 69 67 6e 65 64 20 52  e(X) LP signed R
0f60: 50 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74 65  P(Y).    {sqlite
0f70: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70 50  AddColumnType(pP
0f80: 61 72 73 65 2c 26 58 2c 26 59 29 3b 7d 0a 74 79  arse,&X,&Y);}.ty
0f90: 70 65 20 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28  pe ::= typename(
0fa0: 58 29 20 4c 50 20 73 69 67 6e 65 64 20 43 4f 4d  X) LP signed COM
0fb0: 4d 41 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e  MA signed RP(Y).
0fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
0ff0: 65 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 70  eAddColumnType(p
1000: 50 61 72 73 65 2c 26 58 2c 26 59 29 3b 7d 0a 25  Parse,&X,&Y);}.%
1010: 74 79 70 65 20 74 79 70 65 6e 61 6d 65 20 7b 54  type typename {T
1020: 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61 6d 65 28 41  oken}.typename(A
1030: 29 20 3a 3a 3d 20 69 64 73 28 58 29 2e 20 20 20  ) ::= ids(X).   
1040: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d          {A = X;}
1050: 0a 74 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d  .typename(A) ::=
1060: 20 74 79 70 65 6e 61 6d 65 28 58 29 20 69 64 73   typename(X) ids
1070: 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 69 67 6e  .  {A = X;}.sign
1080: 65 64 20 3a 3a 3d 20 49 4e 54 45 47 45 52 2e 0a  ed ::= INTEGER..
1090: 73 69 67 6e 65 64 20 3a 3a 3d 20 50 4c 55 53 20  signed ::= PLUS 
10a0: 49 4e 54 45 47 45 52 2e 0a 73 69 67 6e 65 64 20  INTEGER..signed 
10b0: 3a 3a 3d 20 4d 49 4e 55 53 20 49 4e 54 45 47 45  ::= MINUS INTEGE
10c0: 52 2e 0a 63 61 72 67 6c 69 73 74 20 3a 3a 3d 20  R..carglist ::= 
10d0: 63 61 72 67 6c 69 73 74 20 63 61 72 67 2e 0a 63  carglist carg..c
10e0: 61 72 67 6c 69 73 74 20 3a 3a 3d 20 2e 0a 63 61  arglist ::= ..ca
10f0: 72 67 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e  rg ::= CONSTRAIN
1100: 54 20 69 64 73 20 63 63 6f 6e 73 2e 0a 63 61 72  T ids ccons..car
1110: 67 20 3a 3a 3d 20 63 63 6f 6e 73 2e 0a 63 61 72  g ::= ccons..car
1120: 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 53 54  g ::= DEFAULT ST
1130: 52 49 4e 47 28 58 29 2e 20 20 20 20 20 20 20 20  RING(X).        
1140: 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61    {sqliteAddDefa
1150: 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c  ultValue(pParse,
1160: 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d  &X,0);}.carg ::=
1170: 20 44 45 46 41 55 4c 54 20 49 44 28 58 29 2e 20   DEFAULT ID(X). 
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71               {sq
1190: 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61  liteAddDefaultVa
11a0: 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29  lue(pParse,&X,0)
11b0: 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41  ;}.carg ::= DEFA
11c0: 55 4c 54 20 49 4e 54 45 47 45 52 28 58 29 2e 20  ULT INTEGER(X). 
11d0: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 41          {sqliteA
11e0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70  ddDefaultValue(p
11f0: 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63 61  Parse,&X,0);}.ca
1200: 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 50  rg ::= DEFAULT P
1210: 4c 55 53 20 49 4e 54 45 47 45 52 28 58 29 2e 20  LUS INTEGER(X). 
1220: 20 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66     {sqliteAddDef
1230: 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65  aultValue(pParse
1240: 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a  ,&X,0);}.carg ::
1250: 3d 20 44 45 46 41 55 4c 54 20 4d 49 4e 55 53 20  = DEFAULT MINUS 
1260: 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20 7b 73  INTEGER(X).   {s
1270: 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56  qliteAddDefaultV
1280: 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c 31  alue(pParse,&X,1
1290: 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46  );}.carg ::= DEF
12a0: 41 55 4c 54 20 46 4c 4f 41 54 28 58 29 2e 20 20  AULT FLOAT(X).  
12b0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
12c0: 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28  AddDefaultValue(
12d0: 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63  pParse,&X,0);}.c
12e0: 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20  arg ::= DEFAULT 
12f0: 50 4c 55 53 20 46 4c 4f 41 54 28 58 29 2e 20 20  PLUS FLOAT(X).  
1300: 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65      {sqliteAddDe
1310: 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73  faultValue(pPars
1320: 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a  e,&X,0);}.carg :
1330: 3a 3d 20 44 45 46 41 55 4c 54 20 4d 49 4e 55 53  := DEFAULT MINUS
1340: 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 7b   FLOAT(X).     {
1350: 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74  sqliteAddDefault
1360: 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c  Value(pParse,&X,
1370: 31 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45  1);}.carg ::= DE
1380: 46 41 55 4c 54 20 4e 55 4c 4c 2e 20 0a 0a 2f 2f  FAULT NULL. ..//
1390: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
13a0: 74 68 65 20 74 79 70 65 20 6e 61 6d 65 2c 20 77  the type name, w
13b0: 65 20 61 6c 73 6f 20 63 61 72 65 20 61 62 6f 75  e also care abou
13c0: 74 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  t the primary ke
13d0: 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 55 45 20  y and.// UNIQUE 
13e0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2f 2f 0a  constraints..//.
13f0: 63 63 6f 6e 73 20 3a 3a 3d 20 4e 4f 54 20 4e 55  ccons ::= NOT NU
1400: 4c 4c 20 6f 6e 63 6f 6e 66 28 52 29 2e 20 20 20  LL onconf(R).   
1410: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
1420: 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 70 50  iteAddNotNull(pP
1430: 61 72 73 65 2c 20 52 29 3b 7d 0a 63 63 6f 6e 73  arse, R);}.ccons
1440: 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59   ::= PRIMARY KEY
1450: 20 73 6f 72 74 6f 72 64 65 72 20 6f 6e 63 6f 6e   sortorder oncon
1460: 66 28 52 29 2e 20 20 7b 73 71 6c 69 74 65 41 64  f(R).  {sqliteAd
1470: 64 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72  dPrimaryKey(pPar
1480: 73 65 2c 30 2c 52 29 3b 7d 0a 63 63 6f 6e 73 20  se,0,R);}.ccons 
1490: 3a 3a 3d 20 55 4e 49 51 55 45 20 6f 6e 63 6f 6e  ::= UNIQUE oncon
14a0: 66 28 52 29 2e 20 20 20 20 20 20 20 20 20 20 20  f(R).           
14b0: 20 7b 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e   {sqliteCreateIn
14c0: 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30  dex(pParse,0,0,0
14d0: 2c 52 2c 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20  ,R,0,0);}.ccons 
14e0: 3a 3a 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70  ::= CHECK LP exp
14f0: 72 20 52 50 20 6f 6e 63 6f 6e 66 2e 0a 0a 2f 2f  r RP onconf...//
1500: 20 46 6f 72 20 74 68 65 20 74 69 6d 65 20 62 65   For the time be
1510: 69 6e 67 2c 20 74 68 65 20 6f 6e 6c 79 20 63 6f  ing, the only co
1520: 6e 73 74 72 61 69 6e 74 20 77 65 20 63 61 72 65  nstraint we care
1530: 20 61 62 6f 75 74 20 69 73 20 74 68 65 20 70 72   about is the pr
1540: 69 6d 61 72 79 0a 2f 2f 20 6b 65 79 20 61 6e 64  imary.// key and
1550: 20 55 4e 49 51 55 45 2e 20 20 42 6f 74 68 20 63   UNIQUE.  Both c
1560: 72 65 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 2f  reate indices../
1570: 2f 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 3a  /.conslist_opt :
1580: 3a 3d 20 2e 0a 63 6f 6e 73 6c 69 73 74 5f 6f 70  := ..conslist_op
1590: 74 20 3a 3a 3d 20 43 4f 4d 4d 41 20 63 6f 6e 73  t ::= COMMA cons
15a0: 6c 69 73 74 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a  list..conslist :
15b0: 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 43 4f 4d 4d  := conslist COMM
15c0: 41 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73  A tcons..conslis
15d0: 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 20 74  t ::= conslist t
15e0: 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 20 3a  cons..conslist :
15f0: 3a 3d 20 74 63 6f 6e 73 2e 0a 74 63 6f 6e 73 20  := tcons..tcons 
1600: 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 69  ::= CONSTRAINT i
1610: 64 73 2e 0a 74 63 6f 6e 73 20 3a 3a 3d 20 50 52  ds..tcons ::= PR
1620: 49 4d 41 52 59 20 4b 45 59 20 4c 50 20 69 64 78  IMARY KEY LP idx
1630: 6c 69 73 74 28 58 29 20 52 50 20 6f 6e 63 6f 6e  list(X) RP oncon
1640: 66 28 52 29 2e 0a 20 20 20 20 20 20 20 20 20 20  f(R)..          
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 7b 73 71 6c 69 74 65 41 64 64 50 72 69     {sqliteAddPri
1680: 6d 61 72 79 4b 65 79 28 70 50 61 72 73 65 2c 58  maryKey(pParse,X
1690: 2c 52 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20  ,R);}.tcons ::= 
16a0: 55 4e 49 51 55 45 20 4c 50 20 69 64 78 6c 69 73  UNIQUE LP idxlis
16b0: 74 28 58 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52  t(X) RP onconf(R
16c0: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )..             
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
16f0: 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  eCreateIndex(pPa
1700: 72 73 65 2c 30 2c 30 2c 58 2c 52 2c 30 2c 30 29  rse,0,0,X,R,0,0)
1710: 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 48 45  ;}.tcons ::= CHE
1720: 43 4b 20 65 78 70 72 20 6f 6e 63 6f 6e 66 2e 0a  CK expr onconf..
1730: 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .// The followin
1740: 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74 61 6e 64  g is a non-stand
1750: 61 72 64 20 65 78 74 65 6e 73 69 6f 6e 20 74 68  ard extension th
1760: 61 74 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20  at allows us to 
1770: 64 65 63 6c 61 72 65 20 74 68 65 0a 2f 2f 20 64  declare the.// d
1780: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 20  efault behavior 
1790: 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  when there is a 
17a0: 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e 66 6c  constraint confl
17b0: 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 6f 6e  ict..//.%type on
17c0: 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 70 65  conf {int}.%type
17d0: 20 6f 6e 63 6f 6e 66 5f 75 20 7b 69 6e 74 7d 0a   onconf_u {int}.
17e0: 25 74 79 70 65 20 63 6f 6e 66 72 65 73 6f 6c 76  %type confresolv
17f0: 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28 41  e {int}.onconf(A
1800: 29 20 3a 3a 3d 20 63 6f 6e 66 72 65 73 6f 6c 76  ) ::= confresolv
1810: 65 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20  e(X).           
1820: 20 20 20 20 20 7b 20 41 20 3d 20 58 3b 20 7d 0a       { A = X; }.
1830: 6f 6e 63 6f 6e 66 28 41 29 20 3a 3a 3d 20 6f 6e  onconf(A) ::= on
1840: 63 6f 6e 66 5f 75 28 58 29 2e 20 20 20 20 20 20  conf_u(X).      
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
1860: 20 3d 20 58 3b 20 7d 0a 6f 6e 63 6f 6e 66 5f 75   = X; }.onconf_u
1870: 28 41 29 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c  (A) ::= ON CONFL
1880: 49 43 54 20 63 6f 6e 66 72 65 73 6f 6c 76 65 28  ICT confresolve(
1890: 58 29 2e 20 20 7b 20 41 20 3d 20 58 3b 20 7d 0a  X).  { A = X; }.
18a0: 6f 6e 63 6f 6e 66 5f 75 28 41 29 20 3a 3a 3d 20  onconf_u(A) ::= 
18b0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
18d0: 20 3d 20 4f 45 5f 44 65 66 61 75 6c 74 3b 20 7d   = OE_Default; }
18e0: 0a 63 6f 6e 66 72 65 73 6f 6c 76 65 28 41 29 20  .confresolve(A) 
18f0: 3a 3a 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 20  ::= ABORT.      
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20                { 
1910: 41 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 20 7d 0a  A = OE_Abort; }.
1920: 63 6f 6e 66 72 65 73 6f 6c 76 65 28 41 29 20 3a  confresolve(A) :
1930: 3a 3d 20 49 47 4e 4f 52 45 2e 20 20 20 20 20 20  := IGNORE.      
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
1950: 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 20 7d 0a   = OE_Ignore; }.
1960: 63 6f 6e 66 72 65 73 6f 6c 76 65 28 41 29 20 3a  confresolve(A) :
1970: 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20 20  := REPLACE.     
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41               { A
1990: 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 20 7d   = OE_Replace; }
19a0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ..//////////////
19b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
19c0: 20 44 52 4f 50 20 54 41 42 4c 45 20 2f 2f 2f 2f   DROP TABLE ////
19d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
19f0: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f  /.//.cmd ::= DRO
1a00: 50 20 54 41 42 4c 45 20 69 64 73 28 58 29 2e 20  P TABLE ids(X). 
1a10: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65           {sqlite
1a20: 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65  DropTable(pParse
1a30: 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  ,&X);}..////////
1a40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a50: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
1a60: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ement //////////
1a70: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
1a80: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
1a90: 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b  := select(X).  {
1aa0: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28  .  sqliteSelect(
1ab0: 70 50 61 72 73 65 2c 20 58 2c 20 53 52 54 5f 43  pParse, X, SRT_C
1ac0: 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 73  allback, 0);.  s
1ad0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74  qliteSelectDelet
1ae0: 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73  e(X);.}..%type s
1af0: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a  elect {Select*}.
1b00: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65  %destructor sele
1b10: 63 74 20 7b 73 71 6c 69 74 65 53 65 6c 65 63 74  ct {sqliteSelect
1b20: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79  Delete($$);}.%ty
1b30: 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65  pe oneselect {Se
1b40: 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  lect*}.%destruct
1b50: 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71  or oneselect {sq
1b60: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65  liteSelectDelete
1b70: 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74 28 41  ($$);}..select(A
1b80: 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28  ) ::= oneselect(
1b90: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  X).             
1ba0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
1bb0: 7d 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20  }.select(A) ::= 
1bc0: 73 65 6c 65 63 74 28 58 29 20 6a 6f 69 6e 6f 70  select(X) joinop
1bd0: 28 59 29 20 6f 6e 65 73 65 6c 65 63 74 28 5a 29  (Y) oneselect(Z)
1be0: 2e 20 20 7b 0a 20 20 69 66 28 20 5a 20 29 7b 0a  .  {.  if( Z ){.
1bf0: 20 20 20 20 5a 2d 3e 6f 70 20 3d 20 59 3b 0a 20      Z->op = Y;. 
1c00: 20 20 20 5a 2d 3e 70 50 72 69 6f 72 20 3d 20 58     Z->pPrior = X
1c10: 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 5a 3b 0a 7d  ;.  }.  A = Z;.}
1c20: 0a 25 74 79 70 65 20 6a 6f 69 6e 6f 70 20 7b 69  .%type joinop {i
1c30: 6e 74 7d 0a 6a 6f 69 6e 6f 70 28 41 29 20 3a 3a  nt}.joinop(A) ::
1c40: 3d 20 55 4e 49 4f 4e 2e 20 20 20 20 20 20 7b 41  = UNION.      {A
1c50: 20 3d 20 54 4b 5f 55 4e 49 4f 4e 3b 7d 0a 6a 6f   = TK_UNION;}.jo
1c60: 69 6e 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f  inop(A) ::= UNIO
1c70: 4e 20 41 4c 4c 2e 20 20 7b 41 20 3d 20 54 4b 5f  N ALL.  {A = TK_
1c80: 41 4c 4c 3b 7d 0a 6a 6f 69 6e 6f 70 28 41 29 20  ALL;}.joinop(A) 
1c90: 3a 3a 3d 20 49 4e 54 45 52 53 45 43 54 2e 20 20  ::= INTERSECT.  
1ca0: 7b 41 20 3d 20 54 4b 5f 49 4e 54 45 52 53 45 43  {A = TK_INTERSEC
1cb0: 54 3b 7d 0a 6a 6f 69 6e 6f 70 28 41 29 20 3a 3a  T;}.joinop(A) ::
1cc0: 3d 20 45 58 43 45 50 54 2e 20 20 20 20 20 7b 41  = EXCEPT.     {A
1cd0: 20 3d 20 54 4b 5f 45 58 43 45 50 54 3b 7d 0a 6f   = TK_EXCEPT;}.o
1ce0: 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20  neselect(A) ::= 
1cf0: 53 45 4c 45 43 54 20 64 69 73 74 69 6e 63 74 28  SELECT distinct(
1d00: 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57 29  D) selcollist(W)
1d10: 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65 5f 6f   from(X) where_o
1d20: 70 74 28 59 29 0a 20 20 20 20 20 20 20 20 20 20  pt(Y).          
1d30: 20 20 20 20 20 20 20 67 72 6f 75 70 62 79 5f 6f         groupby_o
1d40: 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f 70 74  pt(P) having_opt
1d50: 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 28  (Q) orderby_opt(
1d60: 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 2e  Z) limit_opt(L).
1d70: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 53   {.  A = sqliteS
1d80: 65 6c 65 63 74 4e 65 77 28 57 2c 58 2c 59 2c 50  electNew(W,X,Y,P
1d90: 2c 51 2c 5a 2c 44 2c 4c 2e 61 2c 4c 2e 62 29 3b  ,Q,Z,D,L.a,L.b);
1da0: 0a 7d 0a 0a 2f 2f 20 54 68 65 20 22 64 69 73 74  .}..// The "dist
1db0: 69 6e 63 74 22 20 6e 6f 6e 74 65 72 6d 69 6e 61  inct" nontermina
1dc0: 6c 20 69 73 20 74 72 75 65 20 28 31 29 20 69 66  l is true (1) if
1dd0: 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6b 65   the DISTINCT ke
1de0: 79 77 6f 72 64 20 69 73 0a 2f 2f 20 70 72 65 73  yword is.// pres
1df0: 65 6e 74 20 61 6e 64 20 66 61 6c 73 65 20 28 30  ent and false (0
1e00: 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a  ) if it is not..
1e10: 2f 2f 0a 25 74 79 70 65 20 64 69 73 74 69 6e 63  //.%type distinc
1e20: 74 20 7b 69 6e 74 7d 0a 64 69 73 74 69 6e 63 74  t {int}.distinct
1e30: 28 41 29 20 3a 3a 3d 20 44 49 53 54 49 4e 43 54  (A) ::= DISTINCT
1e40: 2e 20 20 20 7b 41 20 3d 20 31 3b 7d 0a 64 69 73  .   {A = 1;}.dis
1e50: 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 41 4c 4c  tinct(A) ::= ALL
1e60: 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b  .        {A = 0;
1e70: 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a  }.distinct(A) ::
1e80: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 7b 41  = .           {A
1e90: 20 3d 20 30 3b 7d 0a 0a 2f 2f 20 73 65 6c 63 6f   = 0;}..// selco
1ea0: 6c 6c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  llist is a list 
1eb0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  of expressions t
1ec0: 68 61 74 20 61 72 65 20 74 6f 20 62 65 63 6f 6d  hat are to becom
1ed0: 65 20 74 68 65 20 72 65 74 75 72 6e 0a 2f 2f 20  e the return.// 
1ee0: 76 61 6c 75 65 73 20 6f 66 20 74 68 65 20 53 45  values of the SE
1ef0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
1f00: 20 54 68 65 20 22 2a 22 20 69 6e 20 73 74 61 74   The "*" in stat
1f10: 65 6d 65 6e 74 73 20 6c 69 6b 65 0a 2f 2f 20 22  ements like.// "
1f20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 2e 2e  SELECT * FROM ..
1f30: 2e 22 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73  ." is encoded as
1f40: 20 61 20 73 70 65 63 69 61 6c 20 65 78 70 72 65   a special expre
1f50: 73 73 69 6f 6e 20 77 69 74 68 20 61 6e 0a 2f 2f  ssion with an.//
1f60: 20 6f 70 63 6f 64 65 20 6f 66 20 54 4b 5f 41 4c   opcode of TK_AL
1f70: 4c 2e 0a 2f 2f 0a 25 74 79 70 65 20 73 65 6c 63  L..//.%type selc
1f80: 6f 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74  ollist {ExprList
1f90: 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73  *}.%destructor s
1fa0: 65 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69 74  elcollist {sqlit
1fb0: 65 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  eExprListDelete(
1fc0: 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70  $$);}.%type sclp
1fd0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
1fe0: 73 74 72 75 63 74 6f 72 20 73 63 6c 70 20 7b 73  structor sclp {s
1ff0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c  qliteExprListDel
2000: 65 74 65 28 24 24 29 3b 7d 0a 73 63 6c 70 28 41  ete($$);}.sclp(A
2010: 29 20 3a 3a 3d 20 73 65 6c 63 6f 6c 6c 69 73 74  ) ::= selcollist
2020: 28 58 29 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20  (X) COMMA.      
2030: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
2040: 73 63 6c 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20  sclp(A) ::= .   
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20               {A 
2070: 3d 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74  = 0;}.selcollist
2080: 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20  (A) ::= sclp(P) 
2090: 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 20  expr(X).        
20a0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
20b0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 50 2c 58  prListAppend(P,X
20c0: 2c 30 29 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74  ,0);}.selcollist
20d0: 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29 20  (A) ::= sclp(P) 
20e0: 65 78 70 72 28 58 29 20 61 73 20 69 64 73 28 59  expr(X) as ids(Y
20f0: 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78  ). {A = sqliteEx
2100: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 50 2c 58  prListAppend(P,X
2110: 2c 26 59 29 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73  ,&Y);}.selcollis
2120: 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 50 29  t(A) ::= sclp(P)
2130: 20 53 54 41 52 2e 20 7b 0a 20 20 41 20 3d 20 73   STAR. {.  A = s
2140: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
2150: 65 6e 64 28 50 2c 20 73 71 6c 69 74 65 45 78 70  end(P, sqliteExp
2160: 72 28 54 4b 5f 41 4c 4c 2c 20 30 2c 20 30 2c 20  r(TK_ALL, 0, 0, 
2170: 30 29 2c 20 30 29 3b 0a 7d 0a 61 73 20 3a 3a 3d  0), 0);.}.as ::=
2180: 20 2e 0a 61 73 20 3a 3a 3d 20 41 53 2e 0a 0a 0a   ..as ::= AS....
2190: 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69 73 74  %type seltablist
21a0: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74   {IdList*}.%dest
21b0: 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c 69 73  ructor seltablis
21c0: 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44  t {sqliteIdListD
21d0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70  elete($$);}.%typ
21e0: 65 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 49 64  e stl_prefix {Id
21f0: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
2200: 6f 72 20 73 74 6c 5f 70 72 65 66 69 78 20 7b 73  or stl_prefix {s
2210: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
2220: 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 66 72  e($$);}.%type fr
2230: 6f 6d 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65  om {IdList*}.%de
2240: 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 7b 73  structor from {s
2250: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
2260: 65 28 24 24 29 3b 7d 0a 0a 66 72 6f 6d 28 41 29  e($$);}..from(A)
2270: 20 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74 61 62   ::= FROM seltab
2280: 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20 20 20  list(X).        
2290: 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a         {A = X;}.
22a0: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a  stl_prefix(A) ::
22b0: 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 58 29 20  = seltablist(X) 
22c0: 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20 7b 41  COMMA.        {A
22d0: 20 3d 20 58 3b 7d 0a 73 74 6c 5f 70 72 65 66 69   = X;}.stl_prefi
22e0: 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20  x(A) ::= .      
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2300: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65       {A = 0;}.se
2310: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20  ltablist(A) ::= 
2320: 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20 69 64  stl_prefix(X) id
2330: 73 28 59 29 2e 20 20 20 20 20 20 20 7b 41 20 3d  s(Y).       {A =
2340: 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70   sqliteIdListApp
2350: 65 6e 64 28 58 2c 26 59 29 3b 7d 0a 73 65 6c 74  end(X,&Y);}.selt
2360: 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 74  ablist(A) ::= st
2370: 6c 5f 70 72 65 66 69 78 28 58 29 20 69 64 73 28  l_prefix(X) ids(
2380: 59 29 20 61 73 20 69 64 73 28 5a 29 2e 20 7b 0a  Y) as ids(Z). {.
2390: 20 20 41 20 3d 20 73 71 6c 69 74 65 49 64 4c 69    A = sqliteIdLi
23a0: 73 74 41 70 70 65 6e 64 28 58 2c 26 59 29 3b 0a  stAppend(X,&Y);.
23b0: 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 64    sqliteIdListAd
23c0: 64 41 6c 69 61 73 28 41 2c 26 5a 29 3b 0a 7d 0a  dAlias(A,&Z);.}.
23d0: 0a 25 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f  .%type orderby_o
23e0: 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25  pt {ExprList*}.%
23f0: 64 65 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72  destructor order
2400: 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 45 78  by_opt {sqliteEx
2410: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29  prListDelete($$)
2420: 3b 7d 0a 25 74 79 70 65 20 73 6f 72 74 6c 69 73  ;}.%type sortlis
2430: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64  t {ExprList*}.%d
2440: 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74 6c 69  estructor sortli
2450: 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69  st {sqliteExprLi
2460: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25  stDelete($$);}.%
2470: 74 79 70 65 20 73 6f 72 74 69 74 65 6d 20 7b 45  type sortitem {E
2480: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f  xpr*}.%destructo
2490: 72 20 73 6f 72 74 69 74 65 6d 20 7b 73 71 6c 69  r sortitem {sqli
24a0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 24 24 29  teExprDelete($$)
24b0: 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70 74 28  ;}..orderby_opt(
24c0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20  A) ::= .        
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64 65 72    {A = 0;}.order
24f0: 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4f 52  by_opt(A) ::= OR
2500: 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73 74 28  DER BY sortlist(
2510: 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 3b  X).      {A = X;
2520: 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a  }.sortlist(A) ::
2530: 3d 20 73 6f 72 74 6c 69 73 74 28 58 29 20 43 4f  = sortlist(X) CO
2540: 4d 4d 41 20 73 6f 72 74 69 74 65 6d 28 59 29 20  MMA sortitem(Y) 
2550: 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a  sortorder(Z). {.
2560: 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72    A = sqliteExpr
2570: 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 59 2c 30  ListAppend(X,Y,0
2580: 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e  );.  if( A ) A->
2590: 61 5b 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e 73 6f  a[A->nExpr-1].so
25a0: 72 74 4f 72 64 65 72 20 3d 20 5a 3b 20 20 2f 2a  rtOrder = Z;  /*
25b0: 20 30 3d 61 73 63 65 6e 64 69 6e 67 2c 20 31 3d   0=ascending, 1=
25c0: 64 65 63 65 6e 64 69 6e 67 20 2a 2f 0a 7d 0a 73  decending */.}.s
25d0: 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73  ortlist(A) ::= s
25e0: 6f 72 74 69 74 65 6d 28 59 29 20 73 6f 72 74 6f  ortitem(Y) sorto
25f0: 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d  rder(Z). {.  A =
2600: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
2610: 70 70 65 6e 64 28 30 2c 59 2c 30 29 3b 0a 20 20  ppend(0,Y,0);.  
2620: 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 30 5d 2e  if( A ) A->a[0].
2630: 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a 3b 0a 7d  sortOrder = Z;.}
2640: 0a 73 6f 72 74 69 74 65 6d 28 41 29 20 3a 3a 3d  .sortitem(A) ::=
2650: 20 65 78 70 72 28 58 29 2e 20 20 20 7b 41 20 3d   expr(X).   {A =
2660: 20 58 3b 7d 0a 0a 25 74 79 70 65 20 73 6f 72 74   X;}..%type sort
2670: 6f 72 64 65 72 20 7b 69 6e 74 7d 0a 0a 73 6f 72  order {int}..sor
2680: 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 41 53  torder(A) ::= AS
2690: 43 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d  C.      {A = 0;}
26a0: 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a  .sortorder(A) ::
26b0: 3d 20 44 45 53 43 2e 20 20 20 20 20 7b 41 20 3d  = DESC.     {A =
26c0: 20 31 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41   1;}.sortorder(A
26d0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20  ) ::= .         
26e0: 7b 41 20 3d 20 30 3b 7d 0a 0a 25 74 79 70 65 20  {A = 0;}..%type 
26f0: 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 45 78 70  groupby_opt {Exp
2700: 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63  rList*}.%destruc
2710: 74 6f 72 20 67 72 6f 75 70 62 79 5f 6f 70 74 20  tor groupby_opt 
2720: 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44  {sqliteExprListD
2730: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 67 72 6f 75  elete($$);}.grou
2740: 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  pby_opt(A) ::= .
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 67        {A = 0;}.g
2770: 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a  roupby_opt(A) ::
2780: 3d 20 47 52 4f 55 50 20 42 59 20 65 78 70 72 6c  = GROUP BY exprl
2790: 69 73 74 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b  ist(X).  {A = X;
27a0: 7d 0a 0a 25 74 79 70 65 20 68 61 76 69 6e 67 5f  }..%type having_
27b0: 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73  opt {Expr*}.%des
27c0: 74 72 75 63 74 6f 72 20 68 61 76 69 6e 67 5f 6f  tructor having_o
27d0: 70 74 20 7b 73 71 6c 69 74 65 45 78 70 72 44 65  pt {sqliteExprDe
27e0: 6c 65 74 65 28 24 24 29 3b 7d 0a 68 61 76 69 6e  lete($$);}.havin
27f0: 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20  g_opt(A) ::= .  
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41                {A
2810: 20 3d 20 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f 70   = 0;}.having_op
2820: 74 28 41 29 20 3a 3a 3d 20 48 41 56 49 4e 47 20  t(A) ::= HAVING 
2830: 65 78 70 72 28 58 29 2e 20 20 7b 41 20 3d 20 58  expr(X).  {A = X
2840: 3b 7d 0a 0a 25 74 79 70 65 20 6c 69 6d 69 74 5f  ;}..%type limit_
2850: 6f 70 74 20 7b 73 74 72 75 63 74 20 74 77 6f 69  opt {struct twoi
2860: 6e 74 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29  nt}.limit_opt(A)
2870: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
2880: 20 20 20 20 20 20 20 20 7b 41 2e 61 20 3d 20 2d          {A.a = -
2890: 31 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 6c 69 6d  1; A.b = 0;}.lim
28a0: 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49  it_opt(A) ::= LI
28b0: 4d 49 54 20 49 4e 54 45 47 45 52 28 58 29 2e 20  MIT INTEGER(X). 
28c0: 20 7b 41 2e 61 20 3d 20 61 74 6f 69 28 58 2e 7a   {A.a = atoi(X.z
28d0: 29 3b 20 41 2e 62 20 3d 20 30 3b 7d 0a 6c 69 6d  ); A.b = 0;}.lim
28e0: 69 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 49  it_opt(A) ::= LI
28f0: 4d 49 54 20 49 4e 54 45 47 45 52 28 58 29 20 6c  MIT INTEGER(X) l
2900: 69 6d 69 74 5f 73 65 70 20 49 4e 54 45 47 45 52  imit_sep INTEGER
2910: 28 59 29 2e 20 0a 20 20 20 20 20 20 20 20 20 20  (Y). .          
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 20 20 20 7b 41 2e 61 20 3d            {A.a =
2940: 20 61 74 6f 69 28 58 2e 7a 29 3b 20 41 2e 62 20   atoi(X.z); A.b 
2950: 3d 20 61 74 6f 69 28 59 2e 7a 29 3b 7d 0a 6c 69  = atoi(Y.z);}.li
2960: 6d 69 74 5f 73 65 70 20 3a 3a 3d 20 4f 46 46 53  mit_sep ::= OFFS
2970: 45 54 2e 0a 6c 69 6d 69 74 5f 73 65 70 20 3a 3a  ET..limit_sep ::
2980: 3d 20 43 4f 4d 4d 41 2e 0a 0a 2f 2f 2f 2f 2f 2f  = COMMA...//////
2990: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29a0: 2f 2f 2f 2f 2f 20 54 68 65 20 44 45 4c 45 54 45  ///// The DELETE
29b0: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f   statement /////
29c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
29d0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
29e0: 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f 4d 20  ::= DELETE FROM 
29f0: 69 64 73 28 58 29 20 77 68 65 72 65 5f 6f 70 74  ids(X) where_opt
2a00: 28 59 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65  (Y)..    {sqlite
2a10: 44 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73  DeleteFrom(pPars
2a20: 65 2c 20 26 58 2c 20 59 29 3b 7d 0a 0a 25 74 79  e, &X, Y);}..%ty
2a30: 70 65 20 77 68 65 72 65 5f 6f 70 74 20 7b 45 78  pe where_opt {Ex
2a40: 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72  pr*}.%destructor
2a50: 20 77 68 65 72 65 5f 6f 70 74 20 7b 73 71 6c 69   where_opt {sqli
2a60: 74 65 45 78 70 72 44 65 6c 65 74 65 28 24 24 29  teExprDelete($$)
2a70: 3b 7d 0a 0a 77 68 65 72 65 5f 6f 70 74 28 41 29  ;}..where_opt(A)
2a80: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20   ::= .          
2a90: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
2aa0: 3b 7d 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 20  ;}.where_opt(A) 
2ab0: 3a 3a 3d 20 57 48 45 52 45 20 65 78 70 72 28 58  ::= WHERE expr(X
2ac0: 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b  ).       {A = X;
2ad0: 7d 0a 0a 25 74 79 70 65 20 73 65 74 6c 69 73 74  }..%type setlist
2ae0: 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65   {ExprList*}.%de
2af0: 73 74 72 75 63 74 6f 72 20 73 65 74 6c 69 73 74  structor setlist
2b00: 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74   {sqliteExprList
2b10: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f  Delete($$);}..//
2b20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b30: 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 55 50 44  //////// The UPD
2b40: 41 54 45 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f  ATE command ////
2b50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2b60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a  ////////////.//.
2b70: 63 6d 64 20 3a 3a 3d 20 55 50 44 41 54 45 20 6f  cmd ::= UPDATE o
2b80: 6e 63 6f 6e 66 5f 75 28 52 29 20 69 64 73 28 58  nconf_u(R) ids(X
2b90: 29 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29  ) SET setlist(Y)
2ba0: 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 0a 20   where_opt(Z).. 
2bb0: 20 20 20 7b 73 71 6c 69 74 65 55 70 64 61 74 65     {sqliteUpdate
2bc0: 28 70 50 61 72 73 65 2c 26 58 2c 59 2c 5a 2c 52  (pParse,&X,Y,Z,R
2bd0: 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20  );}..setlist(A) 
2be0: 3a 3a 3d 20 73 65 74 6c 69 73 74 28 5a 29 20 43  ::= setlist(Z) C
2bf0: 4f 4d 4d 41 20 69 64 73 28 58 29 20 45 51 20 65  OMMA ids(X) EQ e
2c00: 78 70 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d  xpr(Y)..    {A =
2c10: 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41   sqliteExprListA
2c20: 70 70 65 6e 64 28 5a 2c 59 2c 26 58 29 3b 7d 0a  ppend(Z,Y,&X);}.
2c30: 73 65 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69  setlist(A) ::= i
2c40: 64 73 28 58 29 20 45 51 20 65 78 70 72 28 59 29  ds(X) EQ expr(Y)
2c50: 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45  .   {A = sqliteE
2c60: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
2c70: 59 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  Y,&X);}..///////
2c80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2c90: 2f 2f 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63  /// The INSERT c
2ca0: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
2cb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
2cc0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20  ////////.//.cmd 
2cd0: 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 6e 63 6f 6e  ::= INSERT oncon
2ce0: 66 28 52 29 20 49 4e 54 4f 20 69 64 73 28 58 29  f(R) INTO ids(X)
2cf0: 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28   inscollist_opt(
2d00: 46 29 20 56 41 4c 55 45 53 20 4c 50 20 69 74 65  F) VALUES LP ite
2d10: 6d 6c 69 73 74 28 59 29 20 52 50 2e 0a 20 20 20  mlist(Y) RP..   
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c              {sql
2d30: 69 74 65 49 6e 73 65 72 74 28 70 50 61 72 73 65  iteInsert(pParse
2d40: 2c 20 26 58 2c 20 59 2c 20 30 2c 20 46 2c 20 52  , &X, Y, 0, F, R
2d50: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 49 4e 53 45  );}.cmd ::= INSE
2d60: 52 54 20 6f 6e 63 6f 6e 66 28 52 29 20 49 4e 54  RT onconf(R) INT
2d70: 4f 20 69 64 73 28 58 29 20 69 6e 73 63 6f 6c 6c  O ids(X) inscoll
2d80: 69 73 74 5f 6f 70 74 28 46 29 20 73 65 6c 65 63  ist_opt(F) selec
2d90: 74 28 53 29 2e 0a 20 20 20 20 20 20 20 20 20 20  t(S)..          
2da0: 20 20 20 20 20 7b 73 71 6c 69 74 65 49 6e 73 65       {sqliteInse
2db0: 72 74 28 70 50 61 72 73 65 2c 20 26 58 2c 20 30  rt(pParse, &X, 0
2dc0: 2c 20 53 2c 20 46 2c 20 52 29 3b 7d 0a 0a 0a 25  , S, F, R);}...%
2dd0: 74 79 70 65 20 69 74 65 6d 6c 69 73 74 20 7b 45  type itemlist {E
2de0: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
2df0: 75 63 74 6f 72 20 69 74 65 6d 6c 69 73 74 20 7b  uctor itemlist {
2e00: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
2e10: 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65  lete($$);}.%type
2e20: 20 69 74 65 6d 20 7b 45 78 70 72 2a 7d 0a 25 64   item {Expr*}.%d
2e30: 65 73 74 72 75 63 74 6f 72 20 69 74 65 6d 20 7b  estructor item {
2e40: 73 71 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65  sqliteExprDelete
2e50: 28 24 24 29 3b 7d 0a 0a 69 74 65 6d 6c 69 73 74  ($$);}..itemlist
2e60: 28 41 29 20 3a 3a 3d 20 69 74 65 6d 6c 69 73 74  (A) ::= itemlist
2e70: 28 58 29 20 43 4f 4d 4d 41 20 69 74 65 6d 28 59  (X) COMMA item(Y
2e80: 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45  ).  {A = sqliteE
2e90: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c  xprListAppend(X,
2ea0: 59 2c 30 29 3b 7d 0a 69 74 65 6d 6c 69 73 74 28  Y,0);}.itemlist(
2eb0: 41 29 20 3a 3a 3d 20 69 74 65 6d 28 58 29 2e 20  A) ::= item(X). 
2ec0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45      {A = sqliteE
2ed0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
2ee0: 58 2c 30 29 3b 7d 0a 69 74 65 6d 28 41 29 20 3a  X,0);}.item(A) :
2ef0: 3a 3d 20 49 4e 54 45 47 45 52 28 58 29 2e 20 20  := INTEGER(X).  
2f00: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45      {A = sqliteE
2f10: 78 70 72 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20  xpr(TK_INTEGER, 
2f20: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 69 74 65 6d  0, 0, &X);}.item
2f30: 28 41 29 20 3a 3a 3d 20 50 4c 55 53 20 49 4e 54  (A) ::= PLUS INT
2f40: 45 47 45 52 28 58 29 2e 20 7b 41 20 3d 20 73 71  EGER(X). {A = sq
2f50: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e 54 45  liteExpr(TK_INTE
2f60: 47 45 52 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d  GER, 0, 0, &X);}
2f70: 0a 69 74 65 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e  .item(A) ::= MIN
2f80: 55 53 20 49 4e 54 45 47 45 52 28 58 29 2e 20 7b  US INTEGER(X). {
2f90: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70  .  A = sqliteExp
2fa0: 72 28 54 4b 5f 55 4d 49 4e 55 53 2c 20 30 2c 20  r(TK_UMINUS, 0, 
2fb0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  0, 0);.  if( A )
2fc0: 20 41 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69   A->pLeft = sqli
2fd0: 74 65 45 78 70 72 28 54 4b 5f 49 4e 54 45 47 45  teExpr(TK_INTEGE
2fe0: 52 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a 7d 0a  R, 0, 0, &X);.}.
2ff0: 69 74 65 6d 28 41 29 20 3a 3a 3d 20 46 4c 4f 41  item(A) ::= FLOA
3000: 54 28 58 29 2e 20 20 20 20 20 20 20 20 7b 41 20  T(X).        {A 
3010: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3020: 46 4c 4f 41 54 2c 20 30 2c 20 30 2c 20 26 58 29  FLOAT, 0, 0, &X)
3030: 3b 7d 0a 69 74 65 6d 28 41 29 20 3a 3a 3d 20 50  ;}.item(A) ::= P
3040: 4c 55 53 20 46 4c 4f 41 54 28 58 29 2e 20 20 20  LUS FLOAT(X).   
3050: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28  {A = sqliteExpr(
3060: 54 4b 5f 46 4c 4f 41 54 2c 20 30 2c 20 30 2c 20  TK_FLOAT, 0, 0, 
3070: 26 58 29 3b 7d 0a 69 74 65 6d 28 41 29 20 3a 3a  &X);}.item(A) ::
3080: 3d 20 4d 49 4e 55 53 20 46 4c 4f 41 54 28 58 29  = MINUS FLOAT(X)
3090: 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  .  {.  A = sqlit
30a0: 65 45 78 70 72 28 54 4b 5f 55 4d 49 4e 55 53 2c  eExpr(TK_UMINUS,
30b0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
30c0: 20 41 20 29 20 41 2d 3e 70 4c 65 66 74 20 3d 20   A ) A->pLeft = 
30d0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 46 4c  sqliteExpr(TK_FL
30e0: 4f 41 54 2c 20 30 2c 20 30 2c 20 26 58 29 3b 0a  OAT, 0, 0, &X);.
30f0: 7d 0a 69 74 65 6d 28 41 29 20 3a 3a 3d 20 53 54  }.item(A) ::= ST
3100: 52 49 4e 47 28 58 29 2e 20 20 20 20 20 20 20 7b  RING(X).       {
3110: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
3120: 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c 20  K_STRING, 0, 0, 
3130: 26 58 29 3b 7d 0a 69 74 65 6d 28 41 29 20 3a 3a  &X);}.item(A) ::
3140: 3d 20 4e 55 4c 4c 2e 20 20 20 20 20 20 20 20 20  = NULL.         
3150: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
3160: 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30  pr(TK_NULL, 0, 0
3170: 2c 20 30 29 3b 7d 0a 0a 25 74 79 70 65 20 69 6e  , 0);}..%type in
3180: 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 20 7b 49 64  scollist_opt {Id
3190: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
31a0: 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70  or inscollist_op
31b0: 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44  t {sqliteIdListD
31c0: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70  elete($$);}.%typ
31d0: 65 20 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 49 64  e inscollist {Id
31e0: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74  List*}.%destruct
31f0: 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 74 20 7b 73  or inscollist {s
3200: 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c 65 74  qliteIdListDelet
3210: 65 28 24 24 29 3b 7d 0a 0a 69 6e 73 63 6f 6c 6c  e($$);}..inscoll
3220: 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e  ist_opt(A) ::= .
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3240: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a         {A = 0;}.
3250: 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41  inscollist_opt(A
3260: 29 20 3a 3a 3d 20 4c 50 20 69 6e 73 63 6f 6c 6c  ) ::= LP inscoll
3270: 69 73 74 28 58 29 20 52 50 2e 20 20 20 20 7b 41  ist(X) RP.    {A
3280: 20 3d 20 58 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73   = X;}.inscollis
3290: 74 28 41 29 20 3a 3a 3d 20 69 6e 73 63 6f 6c 6c  t(A) ::= inscoll
32a0: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 69 64 73  ist(X) COMMA ids
32b0: 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65  (Y). {A = sqlite
32c0: 49 64 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26  IdListAppend(X,&
32d0: 59 29 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 28  Y);}.inscollist(
32e0: 41 29 20 3a 3a 3d 20 69 64 73 28 59 29 2e 20 20  A) ::= ids(Y).  
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 49 64     {A = sqliteId
3310: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59 29  ListAppend(0,&Y)
3320: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
3330: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20  /////////////// 
3340: 45 78 70 72 65 73 73 69 6f 6e 20 50 72 6f 63 65  Expression Proce
3350: 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ssing //////////
3360: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
3370: 2f 2f 2f 0a 2f 2f 0a 25 6c 65 66 74 20 4f 52 2e  ///.//.%left OR.
3380: 0a 25 6c 65 66 74 20 41 4e 44 2e 0a 25 72 69 67  .%left AND..%rig
3390: 68 74 20 4e 4f 54 2e 0a 25 6c 65 66 74 20 45 51  ht NOT..%left EQ
33a0: 20 4e 45 20 49 53 4e 55 4c 4c 20 4e 4f 54 4e 55   NE ISNULL NOTNU
33b0: 4c 4c 20 49 53 20 4c 49 4b 45 20 47 4c 4f 42 20  LL IS LIKE GLOB 
33c0: 42 45 54 57 45 45 4e 20 49 4e 2e 0a 25 6c 65 66  BETWEEN IN..%lef
33d0: 74 20 47 54 20 47 45 20 4c 54 20 4c 45 2e 0a 25  t GT GE LT LE..%
33e0: 6c 65 66 74 20 42 49 54 41 4e 44 20 42 49 54 4f  left BITAND BITO
33f0: 52 20 4c 53 48 49 46 54 20 52 53 48 49 46 54 2e  R LSHIFT RSHIFT.
3400: 0a 25 6c 65 66 74 20 50 4c 55 53 20 4d 49 4e 55  .%left PLUS MINU
3410: 53 2e 0a 25 6c 65 66 74 20 53 54 41 52 20 53 4c  S..%left STAR SL
3420: 41 53 48 20 52 45 4d 2e 0a 25 6c 65 66 74 20 43  ASH REM..%left C
3430: 4f 4e 43 41 54 2e 0a 25 72 69 67 68 74 20 55 4d  ONCAT..%right UM
3440: 49 4e 55 53 20 42 49 54 4e 4f 54 2e 0a 0a 25 74  INUS BITNOT...%t
3450: 79 70 65 20 65 78 70 72 20 7b 45 78 70 72 2a 7d  ype expr {Expr*}
3460: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78 70  .%destructor exp
3470: 72 20 7b 73 71 6c 69 74 65 45 78 70 72 44 65 6c  r {sqliteExprDel
3480: 65 74 65 28 24 24 29 3b 7d 0a 0a 65 78 70 72 28  ete($$);}..expr(
3490: 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 65 78 70  A) ::= LP(B) exp
34a0: 72 28 58 29 20 52 50 28 45 29 2e 20 7b 41 20 3d  r(X) RP(E). {A =
34b0: 20 58 3b 20 73 71 6c 69 74 65 45 78 70 72 53 70   X; sqliteExprSp
34c0: 61 6e 28 41 2c 26 42 2c 26 45 29 3b 7d 0a 65 78  an(A,&B,&E);}.ex
34d0: 70 72 28 41 29 20 3a 3a 3d 20 4e 55 4c 4c 28 58  pr(A) ::= NULL(X
34e0: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  ).             {
34f0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
3500: 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 26 58  K_NULL, 0, 0, &X
3510: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
3520: 69 64 28 58 29 2e 20 20 20 20 20 20 20 20 20 20  id(X).          
3530: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
3540: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30  Expr(TK_ID, 0, 0
3550: 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20  , &X);}.expr(A) 
3560: 3a 3a 3d 20 69 64 73 28 58 29 20 44 4f 54 20 69  ::= ids(X) DOT i
3570: 64 73 28 59 29 2e 20 7b 0a 20 20 45 78 70 72 20  ds(Y). {.  Expr 
3580: 2a 74 65 6d 70 31 20 3d 20 73 71 6c 69 74 65 45  *temp1 = sqliteE
3590: 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c  xpr(TK_ID, 0, 0,
35a0: 20 26 58 29 3b 0a 20 20 45 78 70 72 20 2a 74 65   &X);.  Expr *te
35b0: 6d 70 32 20 3d 20 73 71 6c 69 74 65 45 78 70 72  mp2 = sqliteExpr
35c0: 28 54 4b 5f 49 44 2c 20 30 2c 20 30 2c 20 26 59  (TK_ID, 0, 0, &Y
35d0: 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45  );.  A = sqliteE
35e0: 78 70 72 28 54 4b 5f 44 4f 54 2c 20 74 65 6d 70  xpr(TK_DOT, temp
35f0: 31 2c 20 74 65 6d 70 32 2c 20 30 29 3b 0a 7d 0a  1, temp2, 0);.}.
3600: 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 4e 54 45  expr(A) ::= INTE
3610: 47 45 52 28 58 29 2e 20 20 20 20 20 20 7b 41 20  GER(X).      {A 
3620: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3630: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26  INTEGER, 0, 0, &
3640: 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  X);}.expr(A) ::=
3650: 20 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 20   FLOAT(X).      
3660: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70    {A = sqliteExp
3670: 72 28 54 4b 5f 46 4c 4f 41 54 2c 20 30 2c 20 30  r(TK_FLOAT, 0, 0
3680: 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20  , &X);}.expr(A) 
3690: 3a 3a 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20  ::= STRING(X).  
36a0: 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65       {A = sqlite
36b0: 45 78 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20  Expr(TK_STRING, 
36c0: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72  0, 0, &X);}.expr
36d0: 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 20 4c 50  (A) ::= ID(X) LP
36e0: 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 28   exprlist(Y) RP(
36f0: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  E). {.  A = sqli
3700: 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 59  teExprFunction(Y
3710: 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74 65 45  , &X);.  sqliteE
3720: 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26 45 29  xprSpan(A,&X,&E)
3730: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
3740: 49 44 28 58 29 20 4c 50 20 53 54 41 52 20 52 50  ID(X) LP STAR RP
3750: 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c  (E). {.  A = sql
3760: 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  iteExprFunction(
3770: 30 2c 20 26 58 29 3b 0a 20 20 73 71 6c 69 74 65  0, &X);.  sqlite
3780: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2c 26 45  ExprSpan(A,&X,&E
3790: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
37a0: 20 65 78 70 72 28 58 29 20 41 4e 44 20 65 78 70   expr(X) AND exp
37b0: 72 28 59 29 2e 20 20 20 7b 41 20 3d 20 73 71 6c  r(Y).   {A = sql
37c0: 69 74 65 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20  iteExpr(TK_AND, 
37d0: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
37e0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4f  A) ::= expr(X) O
37f0: 52 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41  R expr(Y).    {A
3800: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
3810: 5f 4f 52 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a  _OR, X, Y, 0);}.
3820: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72  expr(A) ::= expr
3830: 28 58 29 20 4c 54 20 65 78 70 72 28 59 29 2e 20  (X) LT expr(Y). 
3840: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
3850: 70 72 28 54 4b 5f 4c 54 2c 20 58 2c 20 59 2c 20  pr(TK_LT, X, Y, 
3860: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
3870: 20 65 78 70 72 28 58 29 20 47 54 20 65 78 70 72   expr(X) GT expr
3880: 28 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c  (Y).    {A = sql
3890: 69 74 65 45 78 70 72 28 54 4b 5f 47 54 2c 20 58  iteExpr(TK_GT, X
38a0: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
38b0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c 45  ) ::= expr(X) LE
38c0: 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20   expr(Y).    {A 
38d0: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
38e0: 4c 45 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65  LE, X, Y, 0);}.e
38f0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
3900: 58 29 20 47 45 20 65 78 70 72 28 59 29 2e 20 20  X) GE expr(Y).  
3910: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70    {A = sqliteExp
3920: 72 28 54 4b 5f 47 45 2c 20 58 2c 20 59 2c 20 30  r(TK_GE, X, Y, 0
3930: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  );}.expr(A) ::= 
3940: 65 78 70 72 28 58 29 20 4e 45 20 65 78 70 72 28  expr(X) NE expr(
3950: 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69  Y).    {A = sqli
3960: 74 65 45 78 70 72 28 54 4b 5f 4e 45 2c 20 58 2c  teExpr(TK_NE, X,
3970: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
3980: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 45 51 20   ::= expr(X) EQ 
3990: 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d  expr(Y).    {A =
39a0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 45   sqliteExpr(TK_E
39b0: 51 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78  Q, X, Y, 0);}.ex
39c0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58  pr(A) ::= expr(X
39d0: 29 20 42 49 54 41 4e 44 20 65 78 70 72 28 59 29  ) BITAND expr(Y)
39e0: 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70  . {A = sqliteExp
39f0: 72 28 54 4b 5f 42 49 54 41 4e 44 2c 20 58 2c 20  r(TK_BITAND, X, 
3a00: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20  Y, 0);}.expr(A) 
3a10: 3a 3a 3d 20 65 78 70 72 28 58 29 20 42 49 54 4f  ::= expr(X) BITO
3a20: 52 20 65 78 70 72 28 59 29 2e 20 20 7b 41 20 3d  R expr(Y).  {A =
3a30: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 42   sqliteExpr(TK_B
3a40: 49 54 4f 52 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  ITOR, X, Y, 0);}
3a50: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
3a60: 72 28 58 29 20 4c 53 48 49 46 54 20 65 78 70 72  r(X) LSHIFT expr
3a70: 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65  (Y). {A = sqlite
3a80: 45 78 70 72 28 54 4b 5f 4c 53 48 49 46 54 2c 20  Expr(TK_LSHIFT, 
3a90: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28  X, Y, 0);}.expr(
3aa0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 52  A) ::= expr(X) R
3ab0: 53 48 49 46 54 20 65 78 70 72 28 59 29 2e 20 7b  SHIFT expr(Y). {
3ac0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
3ad0: 4b 5f 52 53 48 49 46 54 2c 20 58 2c 20 59 2c 20  K_RSHIFT, X, Y, 
3ae0: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  0);}.expr(A) ::=
3af0: 20 65 78 70 72 28 58 29 20 4c 49 4b 45 20 65 78   expr(X) LIKE ex
3b00: 70 72 28 59 29 2e 20 20 20 7b 41 20 3d 20 73 71  pr(Y).   {A = sq
3b10: 6c 69 74 65 45 78 70 72 28 54 4b 5f 4c 49 4b 45  liteExpr(TK_LIKE
3b20: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70  , X, Y, 0);}.exp
3b30: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29  r(A) ::= expr(X)
3b40: 20 4e 4f 54 20 4c 49 4b 45 20 65 78 70 72 28 59   NOT LIKE expr(Y
3b50: 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  ).  {.  A = sqli
3b60: 74 65 45 78 70 72 28 54 4b 5f 4c 49 4b 45 2c 20  teExpr(TK_LIKE, 
3b70: 58 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20  X, Y, 0);.  A = 
3b80: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f  sqliteExpr(TK_NO
3b90: 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73  T, A, 0, 0);.  s
3ba0: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c  qliteExprSpan(A,
3bb0: 26 58 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70 61  &X->span,&Y->spa
3bc0: 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  n);.}.expr(A) ::
3bd0: 3d 20 65 78 70 72 28 58 29 20 47 4c 4f 42 20 65  = expr(X) GLOB e
3be0: 78 70 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 71  xpr(Y).  {A = sq
3bf0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 47 4c 4f 42  liteExpr(TK_GLOB
3c00: 2c 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 28 41  ,X,Y,0);}.expr(A
3c10: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f  ) ::= expr(X) NO
3c20: 54 20 47 4c 4f 42 20 65 78 70 72 28 59 29 2e 20  T GLOB expr(Y). 
3c30: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45   {.  A = sqliteE
3c40: 78 70 72 28 54 4b 5f 47 4c 4f 42 2c 20 58 2c 20  xpr(TK_GLOB, X, 
3c50: 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71 6c  Y, 0);.  A = sql
3c60: 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20  iteExpr(TK_NOT, 
3c70: 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  A, 0, 0);.  sqli
3c80: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d  teExprSpan(A,&X-
3c90: 3e 73 70 61 6e 2c 26 59 2d 3e 73 70 61 6e 29 3b  >span,&Y->span);
3ca0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65  .}.expr(A) ::= e
3cb0: 78 70 72 28 58 29 20 50 4c 55 53 20 65 78 70 72  xpr(X) PLUS expr
3cc0: 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74  (Y).  {A = sqlit
3cd0: 65 45 78 70 72 28 54 4b 5f 50 4c 55 53 2c 20 58  eExpr(TK_PLUS, X
3ce0: 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41  , Y, 0);}.expr(A
3cf0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4d 49  ) ::= expr(X) MI
3d00: 4e 55 53 20 65 78 70 72 28 59 29 2e 20 7b 41 20  NUS expr(Y). {A 
3d10: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f  = sqliteExpr(TK_
3d20: 4d 49 4e 55 53 2c 20 58 2c 20 59 2c 20 30 29 3b  MINUS, X, Y, 0);
3d30: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
3d40: 70 72 28 58 29 20 53 54 41 52 20 65 78 70 72 28  pr(X) STAR expr(
3d50: 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c 69 74 65  Y).  {A = sqlite
3d60: 45 78 70 72 28 54 4b 5f 53 54 41 52 2c 20 58 2c  Expr(TK_STAR, X,
3d70: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29   Y, 0);}.expr(A)
3d80: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 53 4c 41   ::= expr(X) SLA
3d90: 53 48 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d  SH expr(Y). {A =
3da0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 53   sqliteExpr(TK_S
3db0: 4c 41 53 48 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  LASH, X, Y, 0);}
3dc0: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
3dd0: 72 28 58 29 20 52 45 4d 20 65 78 70 72 28 59 29  r(X) REM expr(Y)
3de0: 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45  .   {A = sqliteE
3df0: 78 70 72 28 54 4b 5f 52 45 4d 2c 20 58 2c 20 59  xpr(TK_REM, X, Y
3e00: 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a  , 0);}.expr(A) :
3e10: 3a 3d 20 65 78 70 72 28 58 29 20 43 4f 4e 43 41  := expr(X) CONCA
3e20: 54 20 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20  T expr(Y). {A = 
3e30: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 43 4f  sqliteExpr(TK_CO
3e40: 4e 43 41 54 2c 20 58 2c 20 59 2c 20 30 29 3b 7d  NCAT, X, Y, 0);}
3e50: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70  .expr(A) ::= exp
3e60: 72 28 58 29 20 49 53 4e 55 4c 4c 28 45 29 2e 20  r(X) ISNULL(E). 
3e70: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  {.  A = sqliteEx
3e80: 70 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c  pr(TK_ISNULL, X,
3e90: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
3ea0: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73  ExprSpan(A,&X->s
3eb0: 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28  pan,&E);.}.expr(
3ec0: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49  A) ::= expr(X) I
3ed0: 53 20 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41  S NULL(E). {.  A
3ee0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
3ef0: 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30  _ISNULL, X, 0, 0
3f00: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53  );.  sqliteExprS
3f10: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26  pan(A,&X->span,&
3f20: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a  E);.}.expr(A) ::
3f30: 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 4e 55 4c  = expr(X) NOTNUL
3f40: 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  L(E). {.  A = sq
3f50: 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 4e  liteExpr(TK_NOTN
3f60: 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20  ULL, X, 0, 0);. 
3f70: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28   sqliteExprSpan(
3f80: 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a  A,&X->span,&E);.
3f90: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78  }.expr(A) ::= ex
3fa0: 70 72 28 58 29 20 4e 4f 54 20 4e 55 4c 4c 28 45  pr(X) NOT NULL(E
3fb0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
3fc0: 65 45 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c  eExpr(TK_NOTNULL
3fd0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
3fe0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
3ff0: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
4000: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28  xpr(A) ::= expr(
4010: 58 29 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 28 45  X) IS NOT NULL(E
4020: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  ). {.  A = sqlit
4030: 65 45 78 70 72 28 54 4b 5f 4e 4f 54 4e 55 4c 4c  eExpr(TK_NOTNULL
4040: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
4050: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
4060: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65  X->span,&E);.}.e
4070: 78 70 72 28 41 29 20 3a 3a 3d 20 4e 4f 54 28 42  xpr(A) ::= NOT(B
4080: 29 20 65 78 70 72 28 58 29 2e 20 7b 0a 20 20 41  ) expr(X). {.  A
4090: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b   = sqliteExpr(TK
40a0: 5f 4e 4f 54 2c 20 58 2c 20 30 2c 20 30 29 3b 0a  _NOT, X, 0, 0);.
40b0: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
40c0: 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b  (A,&B,&X->span);
40d0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 42  .}.expr(A) ::= B
40e0: 49 54 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29  ITNOT(B) expr(X)
40f0: 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65  . {.  A = sqlite
4100: 45 78 70 72 28 54 4b 5f 42 49 54 4e 4f 54 2c 20  Expr(TK_BITNOT, 
4110: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  X, 0, 0);.  sqli
4120: 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c  teExprSpan(A,&B,
4130: 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70  &X->span);.}.exp
4140: 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 53 28 42  r(A) ::= MINUS(B
4150: 29 20 65 78 70 72 28 58 29 2e 20 5b 55 4d 49 4e  ) expr(X). [UMIN
4160: 55 53 5d 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69  US] {.  A = sqli
4170: 74 65 45 78 70 72 28 54 4b 5f 55 4d 49 4e 55 53  teExpr(TK_UMINUS
4180: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71  , X, 0, 0);.  sq
4190: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26  liteExprSpan(A,&
41a0: 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65  B,&X->span);.}.e
41b0: 78 70 72 28 41 29 20 3a 3a 3d 20 50 4c 55 53 28  xpr(A) ::= PLUS(
41c0: 42 29 20 65 78 70 72 28 58 29 2e 20 5b 55 4d 49  B) expr(X). [UMI
41d0: 4e 55 53 5d 20 7b 0a 20 20 41 20 3d 20 58 3b 0a  NUS] {.  A = X;.
41e0: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e    sqliteExprSpan
41f0: 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b  (A,&B,&X->span);
4200: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4c  .}.expr(A) ::= L
4210: 50 28 42 29 20 73 65 6c 65 63 74 28 58 29 20 52  P(B) select(X) R
4220: 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71  P(E). {.  A = sq
4230: 6c 69 74 65 45 78 70 72 28 54 4b 5f 53 45 4c 45  liteExpr(TK_SELE
4240: 43 54 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  CT, 0, 0, 0);.  
4250: 69 66 28 20 41 20 29 20 41 2d 3e 70 53 65 6c 65  if( A ) A->pSele
4260: 63 74 20 3d 20 58 3b 0a 20 20 73 71 6c 69 74 65  ct = X;.  sqlite
4270: 45 78 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45  ExprSpan(A,&B,&E
4280: 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d  );.}.expr(A) ::=
4290: 20 65 78 70 72 28 57 29 20 42 45 54 57 45 45 4e   expr(W) BETWEEN
42a0: 20 65 78 70 72 28 58 29 20 41 4e 44 20 65 78 70   expr(X) AND exp
42b0: 72 28 59 29 2e 20 7b 0a 20 20 45 78 70 72 4c 69  r(Y). {.  ExprLi
42c0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 73 71 6c 69  st *pList = sqli
42d0: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  teExprListAppend
42e0: 28 30 2c 20 58 2c 20 30 29 3b 0a 20 20 70 4c 69  (0, X, 0);.  pLi
42f0: 73 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c  st = sqliteExprL
4300: 69 73 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c  istAppend(pList,
4310: 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d 20 73 71   Y, 0);.  A = sq
4320: 6c 69 74 65 45 78 70 72 28 54 4b 5f 42 45 54 57  liteExpr(TK_BETW
4330: 45 45 4e 2c 20 57 2c 20 30 2c 20 30 29 3b 0a 20  EEN, W, 0, 0);. 
4340: 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73   if( A ) A->pLis
4350: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 73 71 6c  t = pList;.  sql
4360: 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 57  iteExprSpan(A,&W
4370: 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70 61 6e 29  ->span,&Y->span)
4380: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
4390: 65 78 70 72 28 57 29 20 4e 4f 54 20 42 45 54 57  expr(W) NOT BETW
43a0: 45 45 4e 20 65 78 70 72 28 58 29 20 41 4e 44 20  EEN expr(X) AND 
43b0: 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 45 78 70  expr(Y). {.  Exp
43c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 73  rList *pList = s
43d0: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70  qliteExprListApp
43e0: 65 6e 64 28 30 2c 20 58 2c 20 30 29 3b 0a 20 20  end(0, X, 0);.  
43f0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 78  pList = sqliteEx
4400: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c 69  prListAppend(pLi
4410: 73 74 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d  st, Y, 0);.  A =
4420: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 42   sqliteExpr(TK_B
4430: 45 54 57 45 45 4e 2c 20 57 2c 20 30 2c 20 30 29  ETWEEN, W, 0, 0)
4440: 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70  ;.  if( A ) A->p
4450: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
4460: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54  A = sqliteExpr(T
4470: 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b  K_NOT, A, 0, 0);
4480: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  .  sqliteExprSpa
4490: 6e 28 41 2c 26 57 2d 3e 73 70 61 6e 2c 26 59 2d  n(A,&W->span,&Y-
44a0: 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41  >span);.}.expr(A
44b0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 4e  ) ::= expr(X) IN
44c0: 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29 20   LP exprlist(Y) 
44d0: 52 50 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20  RP(E).  {.  A = 
44e0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e  sqliteExpr(TK_IN
44f0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , X, 0, 0);.  if
4500: 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 20 3d  ( A ) A->pList =
4510: 20 59 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72   Y;.  sqliteExpr
4520: 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c  Span(A,&X->span,
4530: 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a  &E);.}.expr(A) :
4540: 3a 3d 20 65 78 70 72 28 58 29 20 49 4e 20 4c 50  := expr(X) IN LP
4550: 20 73 65 6c 65 63 74 28 59 29 20 52 50 28 45 29   select(Y) RP(E)
4560: 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74  .  {.  A = sqlit
4570: 65 45 78 70 72 28 54 4b 5f 49 4e 2c 20 58 2c 20  eExpr(TK_IN, X, 
4580: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29  0, 0);.  if( A )
4590: 20 41 2d 3e 70 53 65 6c 65 63 74 20 3d 20 59 3b   A->pSelect = Y;
45a0: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61  .  sqliteExprSpa
45b0: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29  n(A,&X->span,&E)
45c0: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20  ;.}.expr(A) ::= 
45d0: 65 78 70 72 28 58 29 20 4e 4f 54 20 49 4e 20 4c  expr(X) NOT IN L
45e0: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50  P exprlist(Y) RP
45f0: 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71  (E).  {.  A = sq
4600: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e 2c 20  liteExpr(TK_IN, 
4610: 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  X, 0, 0);.  if( 
4620: 41 20 29 20 41 2d 3e 70 4c 69 73 74 20 3d 20 59  A ) A->pList = Y
4630: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78  ;.  A = sqliteEx
4640: 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c  pr(TK_NOT, A, 0,
4650: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70   0);.  sqliteExp
4660: 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e  rSpan(A,&X->span
4670: 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20  ,&E);.}.expr(A) 
4680: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20  ::= expr(X) NOT 
4690: 49 4e 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20  IN LP select(Y) 
46a0: 52 50 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20  RP(E).  {.  A = 
46b0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e  sqliteExpr(TK_IN
46c0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , X, 0, 0);.  if
46d0: 28 20 41 20 29 20 41 2d 3e 70 53 65 6c 65 63 74  ( A ) A->pSelect
46e0: 20 3d 20 59 3b 0a 20 20 41 20 3d 20 73 71 6c 69   = Y;.  A = sqli
46f0: 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41  teExpr(TK_NOT, A
4700: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , 0, 0);.  sqlit
4710: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e  eExprSpan(A,&X->
4720: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 0a 0a 0a 25  span,&E);.}....%
4730: 74 79 70 65 20 65 78 70 72 6c 69 73 74 20 7b 45  type exprlist {E
4740: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72  xprList*}.%destr
4750: 75 63 74 6f 72 20 65 78 70 72 6c 69 73 74 20 7b  uctor exprlist {
4760: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65  sqliteExprListDe
4770: 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65  lete($$);}.%type
4780: 20 65 78 70 72 69 74 65 6d 20 7b 45 78 70 72 2a   expritem {Expr*
4790: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78  }.%destructor ex
47a0: 70 72 69 74 65 6d 20 7b 73 71 6c 69 74 65 45 78  pritem {sqliteEx
47b0: 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a  prDelete($$);}..
47c0: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20  exprlist(A) ::= 
47d0: 65 78 70 72 6c 69 73 74 28 58 29 20 43 4f 4d 4d  exprlist(X) COMM
47e0: 41 20 65 78 70 72 69 74 65 6d 28 59 29 2e 20 0a  A expritem(Y). .
47f0: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78     {A = sqliteEx
4800: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 59  prListAppend(X,Y
4810: 2c 30 29 3b 7d 0a 65 78 70 72 6c 69 73 74 28 41  ,0);}.exprlist(A
4820: 29 20 3a 3a 3d 20 65 78 70 72 69 74 65 6d 28 58  ) ::= expritem(X
4830: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 41  ).            {A
4840: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73   = sqliteExprLis
4850: 74 41 70 70 65 6e 64 28 30 2c 58 2c 30 29 3b 7d  tAppend(0,X,0);}
4860: 0a 65 78 70 72 69 74 65 6d 28 41 29 20 3a 3a 3d  .expritem(A) ::=
4870: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20   expr(X).       
4880: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b           {A = X;
4890: 7d 0a 65 78 70 72 69 74 65 6d 28 41 29 20 3a 3a  }.expritem(A) ::
48a0: 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20  = .             
48b0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30            {A = 0
48c0: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
48d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
48e0: 2f 20 54 68 65 20 43 52 45 41 54 45 20 49 4e 44  / The CREATE IND
48f0: 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f  EX command /////
4900: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4910: 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 43 52  //.//.cmd ::= CR
4920: 45 41 54 45 28 53 29 20 75 6e 69 71 75 65 66 6c  EATE(S) uniquefl
4930: 61 67 28 55 29 20 49 4e 44 45 58 20 69 64 73 28  ag(U) INDEX ids(
4940: 58 29 0a 20 20 20 20 20 20 20 20 4f 4e 20 69 64  X).        ON id
4950: 73 28 59 29 20 4c 50 20 69 64 78 6c 69 73 74 28  s(Y) LP idxlist(
4960: 5a 29 20 52 50 28 45 29 20 6f 6e 63 6f 6e 66 28  Z) RP(E) onconf(
4970: 52 29 2e 20 7b 0a 20 20 69 66 28 20 55 21 3d 4f  R). {.  if( U!=O
4980: 45 5f 4e 6f 6e 65 20 29 20 55 20 3d 20 52 3b 0a  E_None ) U = R;.
4990: 20 20 69 66 28 20 55 3d 3d 4f 45 5f 44 65 66 61    if( U==OE_Defa
49a0: 75 6c 74 29 20 55 20 3d 20 4f 45 5f 41 62 6f 72  ult) U = OE_Abor
49b0: 74 3b 0a 20 20 73 71 6c 69 74 65 43 72 65 61 74  t;.  sqliteCreat
49c0: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  eIndex(pParse, &
49d0: 58 2c 20 26 59 2c 20 5a 2c 20 55 2c 20 26 53 2c  X, &Y, Z, U, &S,
49e0: 20 26 45 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 75   &E);.}..%type u
49f0: 6e 69 71 75 65 66 6c 61 67 20 7b 69 6e 74 7d 0a  niqueflag {int}.
4a00: 75 6e 69 71 75 65 66 6c 61 67 28 41 29 20 3a 3a  uniqueflag(A) ::
4a10: 3d 20 55 4e 49 51 55 45 2e 20 20 7b 20 41 20 3d  = UNIQUE.  { A =
4a20: 20 4f 45 5f 41 62 6f 72 74 3b 20 7d 0a 75 6e 69   OE_Abort; }.uni
4a30: 71 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 2e  queflag(A) ::= .
4a40: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45          { A = OE
4a50: 5f 4e 6f 6e 65 3b 20 7d 0a 0a 25 74 79 70 65 20  _None; }..%type 
4a60: 69 64 78 6c 69 73 74 20 7b 49 64 4c 69 73 74 2a  idxlist {IdList*
4a70: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69 64  }.%destructor id
4a80: 78 6c 69 73 74 20 7b 73 71 6c 69 74 65 49 64 4c  xlist {sqliteIdL
4a90: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a  istDelete($$);}.
4aa0: 25 74 79 70 65 20 69 64 78 69 74 65 6d 20 7b 54  %type idxitem {T
4ab0: 6f 6b 65 6e 7d 0a 0a 69 64 78 6c 69 73 74 28 41  oken}..idxlist(A
4ac0: 29 20 3a 3a 3d 20 69 64 78 6c 69 73 74 28 58 29  ) ::= idxlist(X)
4ad0: 20 43 4f 4d 4d 41 20 69 64 78 69 74 65 6d 28 59   COMMA idxitem(Y
4ae0: 29 2e 20 20 0a 20 20 20 20 20 7b 41 20 3d 20 73  ).  .     {A = s
4af0: 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e  qliteIdListAppen
4b00: 64 28 58 2c 26 59 29 3b 7d 0a 69 64 78 6c 69 73  d(X,&Y);}.idxlis
4b10: 74 28 41 29 20 3a 3a 3d 20 69 64 78 69 74 65 6d  t(A) ::= idxitem
4b20: 28 59 29 2e 0a 20 20 20 20 20 7b 41 20 3d 20 73  (Y)..     {A = s
4b30: 71 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e  qliteIdListAppen
4b40: 64 28 30 2c 26 59 29 3b 7d 0a 69 64 78 69 74 65  d(0,&Y);}.idxite
4b50: 6d 28 41 29 20 3a 3a 3d 20 69 64 73 28 58 29 2e  m(A) ::= ids(X).
4b60: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58            {A = X
4b70: 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ;}..////////////
4b80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4b90: 2f 20 54 68 65 20 44 52 4f 50 20 49 4e 44 45 58  / The DROP INDEX
4ba0: 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f   command ///////
4bb0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4bc0: 2f 2f 0a 2f 2f 0a 0a 63 6d 64 20 3a 3a 3d 20 44  //.//..cmd ::= D
4bd0: 52 4f 50 20 49 4e 44 45 58 20 69 64 73 28 58 29  ROP INDEX ids(X)
4be0: 2e 20 20 20 20 20 20 7b 73 71 6c 69 74 65 44 72  .      {sqliteDr
4bf0: 6f 70 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  opIndex(pParse, 
4c00: 26 58 29 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f  &X);}...////////
4c10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c20: 2f 2f 2f 2f 2f 20 54 68 65 20 43 4f 50 59 20 63  ///// The COPY c
4c30: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f  ommand /////////
4c40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4c50: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a  //////.//.cmd ::
4c60: 3d 20 43 4f 50 59 20 6f 6e 63 6f 6e 66 5f 75 28  = COPY onconf_u(
4c70: 52 29 20 69 64 73 28 58 29 20 46 52 4f 4d 20 69  R) ids(X) FROM i
4c80: 64 73 28 59 29 20 55 53 49 4e 47 20 44 45 4c 49  ds(Y) USING DELI
4c90: 4d 49 54 45 52 53 20 53 54 52 49 4e 47 28 5a 29  MITERS STRING(Z)
4ca0: 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 43 6f 70  ..    {sqliteCop
4cb0: 79 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 26  y(pParse,&X,&Y,&
4cc0: 5a 2c 52 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 43  Z,R);}.cmd ::= C
4cd0: 4f 50 59 20 6f 6e 63 6f 6e 66 5f 75 28 52 29 20  OPY onconf_u(R) 
4ce0: 69 64 73 28 58 29 20 46 52 4f 4d 20 69 64 73 28  ids(X) FROM ids(
4cf0: 59 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 43  Y)..    {sqliteC
4d00: 6f 70 79 28 70 50 61 72 73 65 2c 26 58 2c 26 59  opy(pParse,&X,&Y
4d10: 2c 30 2c 52 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f  ,0,R);}..///////
4d20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4d30: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56 41 43 55 55  ////// The VACUU
4d40: 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f  M command //////
4d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4d60: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a  ///////.//.cmd :
4d70: 3a 3d 20 56 41 43 55 55 4d 2e 20 20 20 20 20 20  := VACUUM.      
4d80: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74            {sqlit
4d90: 65 56 61 63 75 75 6d 28 70 50 61 72 73 65 2c 30  eVacuum(pParse,0
4da0: 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55  );}.cmd ::= VACU
4db0: 55 4d 20 69 64 73 28 58 29 2e 20 20 20 20 20 20  UM ids(X).      
4dc0: 20 20 20 7b 73 71 6c 69 74 65 56 61 63 75 75 6d     {sqliteVacuum
4dd0: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 0a 2f  (pParse,&X);}../
4de0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4df0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65  //////////// The
4e00: 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20   PRAGMA command 
4e10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f  ////////////////
4e20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f  /////////////.//
4e30: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20  .cmd ::= PRAGMA 
4e40: 69 64 73 28 58 29 20 45 51 20 69 64 73 28 59 29  ids(X) EQ ids(Y)
4e50: 2e 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74  .         {sqlit
4e60: 65 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26  ePragma(pParse,&
4e70: 58 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a  X,&Y,0);}.cmd ::
4e80: 3d 20 50 52 41 47 4d 41 20 69 64 73 28 58 29 20  = PRAGMA ids(X) 
4e90: 45 51 20 4f 4e 28 59 29 2e 20 20 20 20 20 20 20  EQ ON(Y).       
4ea0: 20 20 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61     {sqlitePragma
4eb0: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29  (pParse,&X,&Y,0)
4ec0: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d  ;}.cmd ::= PRAGM
4ed0: 41 20 69 64 73 28 58 29 20 45 51 20 70 6c 75 73  A ids(X) EQ plus
4ee0: 5f 6e 75 6d 28 59 29 2e 20 20 20 20 7b 73 71 6c  _num(Y).    {sql
4ef0: 69 74 65 50 72 61 67 6d 61 28 70 50 61 72 73 65  itePragma(pParse
4f00: 2c 26 58 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20  ,&X,&Y,0);}.cmd 
4f10: 3a 3a 3d 20 50 52 41 47 4d 41 20 69 64 73 28 58  ::= PRAGMA ids(X
4f20: 29 20 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28 59  ) EQ minus_num(Y
4f30: 29 2e 20 20 20 7b 73 71 6c 69 74 65 50 72 61 67  ).   {sqlitePrag
4f40: 6d 61 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c  ma(pParse,&X,&Y,
4f50: 31 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41  1);}.cmd ::= PRA
4f60: 47 4d 41 20 69 64 73 28 58 29 20 4c 50 20 69 64  GMA ids(X) LP id
4f70: 73 28 59 29 20 52 50 2e 20 20 20 20 20 20 7b 73  s(Y) RP.      {s
4f80: 71 6c 69 74 65 50 72 61 67 6d 61 28 70 50 61 72  qlitePragma(pPar
4f90: 73 65 2c 26 58 2c 26 59 2c 30 29 3b 7d 0a 70 6c  se,&X,&Y,0);}.pl
4fa0: 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 6c  us_num(A) ::= pl
4fb0: 75 73 5f 6f 70 74 20 6e 75 6d 62 65 72 28 58 29  us_opt number(X)
4fc0: 2e 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e  .   {A = X;}.min
4fd0: 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49  us_num(A) ::= MI
4fe0: 4e 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20  NUS number(X).  
4ff0: 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62     {A = X;}.numb
5000: 65 72 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45  er(A) ::= INTEGE
5010: 52 28 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a  R(X).  {A = X;}.
5020: 6e 75 6d 62 65 72 28 41 29 20 3a 3a 3d 20 46 4c  number(A) ::= FL
5030: 4f 41 54 28 58 29 2e 20 20 20 20 7b 41 20 3d 20  OAT(X).    {A = 
5040: 58 3b 7d 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d  X;}.plus_opt ::=
5050: 20 50 4c 55 53 2e 0a 70 6c 75 73 5f 6f 70 74 20   PLUS..plus_opt 
5060: 3a 3a 3d 20 2e 0a                                ::= ..