0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65 /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68 mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a . In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d sing:.**.** M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 nd not evil..**
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 give others..**
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 aking more than
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 53 51 4c ile contains SQL
0190: 69 74 65 27 73 20 67 72 61 6d 6d 61 72 20 66 6f ite's grammar fo
01a0: 72 20 53 51 4c 2e 20 20 50 72 6f 63 65 73 73 20 r SQL. Process
01b0: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 75 73 69 this file.** usi
01c0: 6e 67 20 74 68 65 20 6c 65 6d 6f 6e 20 70 61 72 ng the lemon par
01d0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 74 6f ser generator to
01e0: 20 67 65 6e 65 72 61 74 65 20 43 20 63 6f 64 65 generate C code
01f0: 20 74 68 61 74 20 72 75 6e 73 0a 2a 2a 20 74 68 that runs.** th
0200: 65 20 70 61 72 73 65 72 2e 20 20 4c 65 6d 6f 6e e parser. Lemon
0210: 20 77 69 6c 6c 20 61 6c 73 6f 20 67 65 6e 65 72 will also gener
0220: 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69 6c ate a header fil
0230: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 e containing.**
0240: 6e 75 6d 65 72 69 63 20 63 6f 64 65 73 20 66 6f numeric codes fo
0250: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 6f 6b r all of the tok
0260: 65 6e 73 2e 0a 2a 2f 0a 0a 2f 2f 20 41 6c 6c 20 ens..*/..// All
0270: 74 6f 6b 65 6e 20 63 6f 64 65 73 20 61 72 65 20 token codes are
0280: 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 77 small integers w
0290: 69 74 68 20 23 64 65 66 69 6e 65 73 20 74 68 61 ith #defines tha
02a0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 54 4b t begin with "TK
02b0: 5f 22 0a 25 74 6f 6b 65 6e 5f 70 72 65 66 69 78 _".%token_prefix
02c0: 20 54 4b 5f 0a 0a 2f 2f 20 54 68 65 20 74 79 70 TK_..// The typ
02d0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 74 e of the data at
02e0: 74 61 63 68 65 64 20 74 6f 20 65 61 63 68 20 74 tached to each t
02f0: 6f 6b 65 6e 20 69 73 20 54 6f 6b 65 6e 2e 20 20 oken is Token.
0300: 54 68 69 73 20 69 73 20 61 6c 73 6f 20 74 68 65 This is also the
0310: 0a 2f 2f 20 64 65 66 61 75 6c 74 20 74 79 70 65 .// default type
0320: 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 for non-termina
0330: 6c 73 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e 5f 74 79 ls..//.%token_ty
0340: 70 65 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66 61 pe {Token}.%defa
0350: 75 6c 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e 7d ult_type {Token}
0360: 0a 0a 2f 2f 20 54 68 65 20 67 65 6e 65 72 61 74 ..// The generat
0370: 65 64 20 70 61 72 73 65 72 20 66 75 6e 63 74 69 ed parser functi
0380: 6f 6e 20 74 61 6b 65 73 20 61 20 34 74 68 20 61 on takes a 4th a
0390: 72 67 75 6d 65 6e 74 20 61 73 20 66 6f 6c 6c 6f rgument as follo
03a0: 77 73 3a 0a 25 65 78 74 72 61 5f 61 72 67 75 6d ws:.%extra_argum
03b0: 65 6e 74 20 7b 50 61 72 73 65 20 2a 70 50 61 72 ent {Parse *pPar
03c0: 73 65 7d 0a 0a 2f 2f 20 54 68 69 73 20 63 6f 64 se}..// This cod
03d0: 65 20 72 75 6e 73 20 77 68 65 6e 65 76 65 72 20 e runs whenever
03e0: 74 68 65 72 65 20 69 73 20 61 20 73 79 6e 74 61 there is a synta
03f0: 78 20 65 72 72 6f 72 0a 2f 2f 0a 25 73 79 6e 74 x error.//.%synt
0400: 61 78 5f 65 72 72 6f 72 20 7b 0a 20 20 55 4e 55 ax_error {. UNU
0410: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 79 79 SED_PARAMETER(yy
0420: 6d 61 6a 6f 72 29 3b 20 20 2f 2a 20 53 69 6c 65 major); /* Sile
0430: 6e 63 65 20 73 6f 6d 65 20 63 6f 6d 70 69 6c 65 nce some compile
0440: 72 20 77 61 72 6e 69 6e 67 73 20 2a 2f 0a 20 20 r warnings */.
0450: 61 73 73 65 72 74 28 20 54 4f 4b 45 4e 2e 7a 5b assert( TOKEN.z[
0460: 30 5d 20 29 3b 20 20 2f 2a 20 54 68 65 20 74 6f 0] ); /* The to
0470: 6b 65 6e 69 7a 65 72 20 61 6c 77 61 79 73 20 67 kenizer always g
0480: 69 76 65 73 20 75 73 20 61 20 74 6f 6b 65 6e 20 ives us a token
0490: 2a 2f 0a 20 20 70 61 72 73 65 72 53 79 6e 74 61 */. parserSynta
04a0: 78 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 26 xError(pParse, &
04b0: 54 4f 4b 45 4e 29 3b 0a 7d 0a 25 73 74 61 63 6b TOKEN);.}.%stack
04c0: 5f 6f 76 65 72 66 6c 6f 77 20 7b 0a 20 20 73 71 _overflow {. sq
04d0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
04e0: 61 72 73 65 2c 20 22 70 61 72 73 65 72 20 73 74 arse, "parser st
04f0: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 22 29 3b 0a ack overflow");.
0500: 7d 0a 0a 2f 2f 20 54 68 65 20 6e 61 6d 65 20 6f }..// The name o
0510: 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 f the generated
0520: 70 72 6f 63 65 64 75 72 65 20 74 68 61 74 20 69 procedure that i
0530: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 70 61 mplements the pa
0540: 72 73 65 72 0a 2f 2f 20 69 73 20 61 73 20 66 6f rser.// is as fo
0550: 6c 6c 6f 77 73 3a 0a 25 6e 61 6d 65 20 73 71 6c llows:.%name sql
0560: 69 74 65 33 50 61 72 73 65 72 0a 0a 2f 2f 20 54 ite3Parser..// T
0570: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 78 he following tex
0580: 74 20 69 73 20 69 6e 63 6c 75 64 65 64 20 6e 65 t is included ne
0590: 61 72 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 ar the beginning
05a0: 20 6f 66 20 74 68 65 20 43 20 73 6f 75 72 63 65 of the C source
05b0: 0a 2f 2f 20 63 6f 64 65 20 66 69 6c 65 20 74 68 .// code file th
05c0: 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 at implements th
05d0: 65 20 70 61 72 73 65 72 2e 0a 2f 2f 0a 25 69 6e e parser..//.%in
05e0: 63 6c 75 64 65 20 7b 0a 23 69 6e 63 6c 75 64 65 clude {.#include
05f0: 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a "sqliteInt.h"..
0600: 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6c /*.** Disable al
0610: 6c 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 l error recovery
0620: 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 74 processing in t
0630: 68 65 20 70 61 72 73 65 72 20 70 75 73 68 2d 64 he parser push-d
0640: 6f 77 6e 0a 2a 2a 20 61 75 74 6f 6d 61 74 6f 6e own.** automaton
0650: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 59 59 4e ..*/.#define YYN
0660: 4f 45 52 52 4f 52 52 45 43 4f 56 45 52 59 20 31 OERRORRECOVERY 1
0670: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 79 79 74 ../*.** Make yyt
0680: 65 73 74 63 61 73 65 28 29 20 74 68 65 20 73 61 estcase() the sa
0690: 6d 65 20 61 73 20 74 65 73 74 63 61 73 65 28 29 me as testcase()
06a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 79 79 74 65 .*/.#define yyte
06b0: 73 74 63 61 73 65 28 58 29 20 74 65 73 74 63 61 stcase(X) testca
06c0: 73 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 se(X)../*.** Ind
06d0: 69 63 61 74 65 20 74 68 61 74 20 73 71 6c 69 74 icate that sqlit
06e0: 65 33 50 61 72 73 65 72 46 72 65 65 28 29 20 77 e3ParserFree() w
06f0: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 63 61 6c ill never be cal
0700: 6c 65 64 20 77 69 74 68 20 61 20 6e 75 6c 6c 0a led with a null.
0710: 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23 ** pointer..*/.#
0720: 64 65 66 69 6e 65 20 59 59 50 41 52 53 45 46 52 define YYPARSEFR
0730: 45 45 4e 45 56 45 52 4e 55 4c 4c 20 31 0a 0a 2f EENEVERNULL 1../
0740: 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 6d 61 6c *.** In the amal
0750: 67 61 6d 61 74 69 6f 6e 2c 20 74 68 65 20 70 61 gamation, the pa
0760: 72 73 65 2e 63 20 66 69 6c 65 20 67 65 6e 65 72 rse.c file gener
0770: 61 74 65 64 20 62 79 20 6c 65 6d 6f 6e 20 61 6e ated by lemon an
0780: 64 20 74 68 65 0a 2a 2a 20 74 6f 6b 65 6e 69 7a d the.** tokeniz
0790: 65 2e 63 20 66 69 6c 65 20 61 72 65 20 63 6f 6e e.c file are con
07a0: 63 61 74 65 6e 61 74 65 64 2e 20 20 49 6e 20 74 catenated. In t
07b0: 68 61 74 20 63 61 73 65 2c 20 73 71 6c 69 74 65 hat case, sqlite
07c0: 33 52 75 6e 50 61 72 73 65 72 28 29 0a 2a 2a 20 3RunParser().**
07d0: 68 61 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 has access to th
07e0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 e the size of th
07f0: 65 20 79 79 50 61 72 73 65 72 20 6f 62 6a 65 63 e yyParser objec
0800: 74 20 61 6e 64 20 73 6f 20 74 68 65 20 70 61 72 t and so the par
0810: 73 65 72 0a 2a 2a 20 65 6e 67 69 6e 65 20 63 61 ser.** engine ca
0820: 6e 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 n be allocated f
0830: 72 6f 6d 20 73 74 61 63 6b 2e 20 20 49 6e 20 74 rom stack. In t
0840: 68 61 74 20 63 61 73 65 2c 20 6f 6e 6c 79 20 74 hat case, only t
0850: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 72 he.** sqlite3Par
0860: 73 65 72 49 6e 69 74 28 29 20 61 6e 64 20 73 71 serInit() and sq
0870: 6c 69 74 65 33 50 61 72 73 65 72 46 69 6e 61 6c lite3ParserFinal
0880: 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73 20 61 ize() routines a
0890: 72 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 61 6e re invoked.** an
08a0: 64 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 72 d the sqlite3Par
08b0: 73 65 72 41 6c 6c 6f 63 28 29 20 61 6e 64 20 73 serAlloc() and s
08c0: 71 6c 69 74 65 33 50 61 72 73 65 72 46 72 65 65 qlite3ParserFree
08d0: 28 29 20 72 6f 75 74 69 6e 65 73 20 63 61 6e 20 () routines can
08e0: 62 65 0a 2a 2a 20 6f 6d 69 74 74 65 64 2e 0a 2a be.** omitted..*
08f0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f /.#ifdef SQLITE_
0900: 41 4d 41 4c 47 41 4d 41 54 49 4f 4e 0a 23 20 64 AMALGAMATION.# d
0910: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 50 61 72 efine sqlite3Par
0920: 73 65 72 5f 45 4e 47 49 4e 45 41 4c 57 41 59 53 ser_ENGINEALWAYS
0930: 4f 4e 53 54 41 43 4b 20 31 0a 23 65 6e 64 69 66 ONSTACK 1.#endif
0940: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 74 65 72 6e 61 74 ../*.** Alternat
0950: 69 76 65 20 64 61 74 61 74 79 70 65 20 66 6f 72 ive datatype for
0960: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f the argument to
0970: 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20 72 6f the malloc() ro
0980: 75 74 69 6e 65 20 70 61 73 73 65 64 0a 2a 2a 20 utine passed.**
0990: 69 6e 74 6f 20 73 71 6c 69 74 65 33 50 61 72 73 into sqlite3Pars
09a0: 65 72 41 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 erAlloc(). The
09b0: 64 65 66 61 75 6c 74 20 69 73 20 73 69 7a 65 5f default is size_
09c0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 59 59 t..*/.#define YY
09d0: 4d 41 4c 4c 4f 43 41 52 47 54 59 50 45 20 20 75 MALLOCARGTYPE u
09e0: 36 34 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 64../*.** An ins
09f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 tance of this st
0a00: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 69 6e ructure holds in
0a10: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 formation about
0a20: 74 68 65 0a 2a 2a 20 4c 49 4d 49 54 20 63 6c 61 the.** LIMIT cla
0a30: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 use of a SELECT
0a40: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 statement..*/.st
0a50: 72 75 63 74 20 4c 69 6d 69 74 56 61 6c 20 7b 0a ruct LimitVal {.
0a60: 20 20 45 78 70 72 20 2a 70 4c 69 6d 69 74 3b 20 Expr *pLimit;
0a70: 20 20 20 2f 2a 20 54 68 65 20 4c 49 4d 49 54 20 /* The LIMIT
0a80: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4e 55 4c expression. NUL
0a90: 4c 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f L if there is no
0aa0: 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 45 78 70 72 limit */. Expr
0ab0: 20 2a 70 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 *pOffset; /*
0ac0: 54 68 65 20 4f 46 46 53 45 54 20 65 78 70 72 65 The OFFSET expre
0ad0: 73 73 69 6f 6e 2e 20 20 4e 55 4c 4c 20 69 66 20 ssion. NULL if
0ae0: 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 20 2a 2f there is none */
0af0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e .};../*.** An in
0b00: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f stance of the fo
0b10: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 llowing structur
0b20: 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 e describes the
0b30: 65 76 65 6e 74 20 6f 66 20 61 0a 2a 2a 20 54 52 event of a.** TR
0b40: 49 47 47 45 52 2e 20 20 22 61 22 20 69 73 20 74 IGGER. "a" is t
0b50: 68 65 20 65 76 65 6e 74 20 74 79 70 65 2c 20 6f he event type, o
0b60: 6e 65 20 6f 66 20 54 4b 5f 55 50 44 41 54 45 2c ne of TK_UPDATE,
0b70: 20 54 4b 5f 49 4e 53 45 52 54 2c 0a 2a 2a 20 54 TK_INSERT,.** T
0b80: 4b 5f 44 45 4c 45 54 45 2c 20 6f 72 20 54 4b 5f K_DELETE, or TK_
0b90: 49 4e 53 54 45 41 44 2e 20 20 49 66 20 74 68 65 INSTEAD. If the
0ba0: 20 65 76 65 6e 74 20 69 73 20 6f 66 20 74 68 65 event is of the
0bb0: 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 form.**.**
0bc0: 20 55 50 44 41 54 45 20 4f 4e 20 28 61 2c 62 2c UPDATE ON (a,b,
0bd0: 63 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 c).**.** Then th
0be0: 65 20 22 62 22 20 49 64 4c 69 73 74 20 72 65 63 e "b" IdList rec
0bf0: 6f 72 64 73 20 74 68 65 20 6c 69 73 74 20 22 61 ords the list "a
0c00: 2c 62 2c 63 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 ,b,c"..*/.struct
0c10: 20 54 72 69 67 45 76 65 6e 74 20 7b 20 69 6e 74 TrigEvent { int
0c20: 20 61 3b 20 49 64 4c 69 73 74 20 2a 20 62 3b 20 a; IdList * b;
0c30: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 };../*.** Genera
0c40: 74 65 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f te a syntax erro
0c50: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 r.*/.static void
0c60: 20 70 61 72 73 65 72 53 79 6e 74 61 78 45 72 72 parserSyntaxErr
0c70: 6f 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 or(Parse *pParse
0c80: 2c 20 54 6f 6b 65 6e 20 2a 70 29 7b 0a 20 20 73 , Token *p){. s
0c90: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 qlite3ErrorMsg(p
0ca0: 50 61 72 73 65 2c 20 22 6e 65 61 72 20 5c 22 25 Parse, "near \"%
0cb0: 54 5c 22 3a 20 73 79 6e 74 61 78 20 65 72 72 6f T\": syntax erro
0cc0: 72 22 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a r", p);.}../*.**
0cd0: 20 44 69 73 61 62 6c 65 20 6c 6f 6f 6b 61 73 69 Disable lookasi
0ce0: 64 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 de memory alloca
0cf0: 74 69 6f 6e 20 66 6f 72 20 6f 62 6a 65 63 74 73 tion for objects
0d00: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 0a 2a that might be.*
0d10: 2a 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 * shared across
0d20: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
0d30: 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ions..*/.static
0d40: 76 6f 69 64 20 64 69 73 61 62 6c 65 4c 6f 6f 6b void disableLook
0d50: 61 73 69 64 65 28 50 61 72 73 65 20 2a 70 50 61 aside(Parse *pPa
0d60: 72 73 65 29 7b 0a 20 20 70 50 61 72 73 65 2d 3e rse){. pParse->
0d70: 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 disableLookaside
0d80: 2b 2b 3b 0a 20 20 70 50 61 72 73 65 2d 3e 64 62 ++;. pParse->db
0d90: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 44 69 73 ->lookaside.bDis
0da0: 61 62 6c 65 2b 2b 3b 0a 7d 0a 0a 7d 20 2f 2f 20 able++;.}..} //
0db0: 65 6e 64 20 25 69 6e 63 6c 75 64 65 0a 0a 2f 2f end %include..//
0dc0: 20 49 6e 70 75 74 20 69 73 20 61 20 73 69 6e 67 Input is a sing
0dd0: 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 0a 69 le SQL command.i
0de0: 6e 70 75 74 20 3a 3a 3d 20 63 6d 64 6c 69 73 74 nput ::= cmdlist
0df0: 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 63 6d ..cmdlist ::= cm
0e00: 64 6c 69 73 74 20 65 63 6d 64 2e 0a 63 6d 64 6c dlist ecmd..cmdl
0e10: 69 73 74 20 3a 3a 3d 20 65 63 6d 64 2e 0a 65 63 ist ::= ecmd..ec
0e20: 6d 64 20 3a 3a 3d 20 53 45 4d 49 2e 0a 65 63 6d md ::= SEMI..ecm
0e30: 64 20 3a 3a 3d 20 65 78 70 6c 61 69 6e 20 63 6d d ::= explain cm
0e40: 64 78 20 53 45 4d 49 2e 0a 65 78 70 6c 61 69 6e dx SEMI..explain
0e50: 20 3a 3a 3d 20 2e 0a 25 69 66 6e 64 65 66 20 53 ::= ..%ifndef S
0e60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 QLITE_OMIT_EXPLA
0e70: 49 4e 0a 65 78 70 6c 61 69 6e 20 3a 3a 3d 20 45 IN.explain ::= E
0e80: 58 50 4c 41 49 4e 2e 20 20 20 20 20 20 20 20 20 XPLAIN.
0e90: 20 20 20 20 20 7b 20 70 50 61 72 73 65 2d 3e 65 { pParse->e
0ea0: 78 70 6c 61 69 6e 20 3d 20 31 3b 20 7d 0a 65 78 xplain = 1; }.ex
0eb0: 70 6c 61 69 6e 20 3a 3a 3d 20 45 58 50 4c 41 49 plain ::= EXPLAI
0ec0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 20 20 20 N QUERY PLAN.
0ed0: 7b 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 { pParse->explai
0ee0: 6e 20 3d 20 32 3b 20 7d 0a 25 65 6e 64 69 66 20 n = 2; }.%endif
0ef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 SQLITE_OMIT_EXP
0f00: 4c 41 49 4e 0a 63 6d 64 78 20 3a 3a 3d 20 63 6d LAIN.cmdx ::= cm
0f10: 64 2e 20 20 20 20 20 20 20 20 20 20 20 7b 20 73 d. { s
0f20: 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 qlite3FinishCodi
0f30: 6e 67 28 70 50 61 72 73 65 29 3b 20 7d 0a 0a 2f ng(pParse); }../
0f40: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0f50: 2f 2f 2f 2f 20 42 65 67 69 6e 20 61 6e 64 20 65 //// Begin and e
0f60: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e nd transactions.
0f70: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ///////////////
0f80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f /////////////.//
0f90: 0a 0a 63 6d 64 20 3a 3a 3d 20 42 45 47 49 4e 20 ..cmd ::= BEGIN
0fa0: 74 72 61 6e 73 74 79 70 65 28 59 29 20 74 72 61 transtype(Y) tra
0fb0: 6e 73 5f 6f 70 74 2e 20 20 7b 73 71 6c 69 74 65 ns_opt. {sqlite
0fc0: 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 3BeginTransactio
0fd0: 6e 28 70 50 61 72 73 65 2c 20 59 29 3b 7d 0a 74 n(pParse, Y);}.t
0fe0: 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 74 rans_opt ::= ..t
0ff0: 72 61 6e 73 5f 6f 70 74 20 3a 3a 3d 20 54 52 41 rans_opt ::= TRA
1000: 4e 53 41 43 54 49 4f 4e 2e 0a 74 72 61 6e 73 5f NSACTION..trans_
1010: 6f 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54 opt ::= TRANSACT
1020: 49 4f 4e 20 6e 6d 2e 0a 25 74 79 70 65 20 74 72 ION nm..%type tr
1030: 61 6e 73 74 79 70 65 20 7b 69 6e 74 7d 0a 74 72 anstype {int}.tr
1040: 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 2e anstype(A) ::= .
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 {A
1060: 3d 20 54 4b 5f 44 45 46 45 52 52 45 44 3b 7d 0a = TK_DEFERRED;}.
1070: 74 72 61 6e 73 74 79 70 65 28 41 29 20 3a 3a 3d transtype(A) ::=
1080: 20 44 45 46 45 52 52 45 44 28 58 29 2e 20 20 7b DEFERRED(X). {
1090: 41 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 A = @X; /*A-over
10a0: 77 72 69 74 65 73 2d 58 2a 2f 7d 0a 74 72 61 6e writes-X*/}.tran
10b0: 73 74 79 70 65 28 41 29 20 3a 3a 3d 20 49 4d 4d stype(A) ::= IMM
10c0: 45 44 49 41 54 45 28 58 29 2e 20 7b 41 20 3d 20 EDIATE(X). {A =
10d0: 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 @X; /*A-overwrit
10e0: 65 73 2d 58 2a 2f 7d 0a 74 72 61 6e 73 74 79 70 es-X*/}.transtyp
10f0: 65 28 41 29 20 3a 3a 3d 20 49 44 28 58 29 2e 20 e(A) ::= ID(X).
1100: 7b 0a 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 {. Token *p =
1110: 26 58 3b 0a 20 20 20 69 66 28 20 70 2d 3e 6e 3d &X;. if( p->n=
1120: 3d 39 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 =9 && sqlite3_st
1130: 72 6e 69 63 6d 70 28 70 2d 3e 7a 2c 22 65 78 63 rnicmp(p->z,"exc
1140: 6c 75 73 69 76 65 22 2c 39 29 3d 3d 30 20 29 7b lusive",9)==0 ){
1150: 0a 20 20 20 20 20 41 20 3d 20 54 4b 5f 45 58 43 . A = TK_EXC
1160: 4c 55 53 49 56 45 3b 0a 20 20 20 7d 65 6c 73 65 LUSIVE;. }else
1170: 20 69 66 28 20 70 2d 3e 6e 3d 3d 31 30 20 26 26 if( p->n==10 &&
1180: 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d sqlite3_strnicm
1190: 70 28 70 2d 3e 7a 2c 22 63 6f 6e 63 75 72 72 65 p(p->z,"concurre
11a0: 6e 74 22 2c 31 30 29 3d 3d 30 20 29 7b 0a 20 20 nt",10)==0 ){.
11b0: 20 20 20 41 20 3d 20 54 4b 5f 43 4f 4e 43 55 52 A = TK_CONCUR
11c0: 52 45 4e 54 3b 20 20 2f 2a 41 2d 6f 76 65 72 77 RENT; /*A-overw
11d0: 72 69 74 65 73 2d 58 2a 2f 0a 20 20 20 7d 65 6c rites-X*/. }el
11e0: 73 65 7b 0a 20 20 20 20 20 70 61 72 73 65 72 53 se{. parserS
11f0: 79 6e 74 61 78 45 72 72 6f 72 28 70 50 61 72 73 yntaxError(pPars
1200: 65 2c 20 70 29 3b 0a 20 20 20 7d 0a 7d 0a 63 6d e, p);. }.}.cm
1210: 64 20 3a 3a 3d 20 43 4f 4d 4d 49 54 7c 45 4e 44 d ::= COMMIT|END
1220: 28 58 29 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 (X) trans_opt.
1230: 20 7b 73 71 6c 69 74 65 33 45 6e 64 54 72 61 6e {sqlite3EndTran
1240: 73 61 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 40 saction(pParse,@
1250: 58 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 4f 4c X);}.cmd ::= ROL
1260: 4c 42 41 43 4b 28 58 29 20 74 72 61 6e 73 5f 6f LBACK(X) trans_o
1270: 70 74 2e 20 20 20 20 20 7b 73 71 6c 69 74 65 33 pt. {sqlite3
1280: 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 EndTransaction(p
1290: 50 61 72 73 65 2c 40 58 29 3b 7d 0a 0a 73 61 76 Parse,@X);}..sav
12a0: 65 70 6f 69 6e 74 5f 6f 70 74 20 3a 3a 3d 20 53 epoint_opt ::= S
12b0: 41 56 45 50 4f 49 4e 54 2e 0a 73 61 76 65 70 6f AVEPOINT..savepo
12c0: 69 6e 74 5f 6f 70 74 20 3a 3a 3d 20 2e 0a 63 6d int_opt ::= ..cm
12d0: 64 20 3a 3a 3d 20 53 41 56 45 50 4f 49 4e 54 20 d ::= SAVEPOINT
12e0: 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 71 6c 69 74 nm(X). {. sqlit
12f0: 65 33 53 61 76 65 70 6f 69 6e 74 28 70 50 61 72 e3Savepoint(pPar
1300: 73 65 2c 20 53 41 56 45 50 4f 49 4e 54 5f 42 45 se, SAVEPOINT_BE
1310: 47 49 4e 2c 20 26 58 29 3b 0a 7d 0a 63 6d 64 20 GIN, &X);.}.cmd
1320: 3a 3a 3d 20 52 45 4c 45 41 53 45 20 73 61 76 65 ::= RELEASE save
1330: 70 6f 69 6e 74 5f 6f 70 74 20 6e 6d 28 58 29 2e point_opt nm(X).
1340: 20 7b 0a 20 20 73 71 6c 69 74 65 33 53 61 76 65 {. sqlite3Save
1350: 70 6f 69 6e 74 28 70 50 61 72 73 65 2c 20 53 41 point(pParse, SA
1360: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c VEPOINT_RELEASE,
1370: 20 26 58 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 &X);.}.cmd ::=
1380: 52 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73 5f 6f ROLLBACK trans_o
1390: 70 74 20 54 4f 20 73 61 76 65 70 6f 69 6e 74 5f pt TO savepoint_
13a0: 6f 70 74 20 6e 6d 28 58 29 2e 20 7b 0a 20 20 73 opt nm(X). {. s
13b0: 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 qlite3Savepoint(
13c0: 70 50 61 72 73 65 2c 20 53 41 56 45 50 4f 49 4e pParse, SAVEPOIN
13d0: 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 26 58 29 3b T_ROLLBACK, &X);
13e0: 0a 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f .}..////////////
13f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 ///////// The CR
1400: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 EATE TABLE state
1410: 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ment ///////////
1420: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1430: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 /.//.cmd ::= cre
1440: 61 74 65 5f 74 61 62 6c 65 20 63 72 65 61 74 65 ate_table create
1450: 5f 74 61 62 6c 65 5f 61 72 67 73 2e 0a 63 72 65 _table_args..cre
1460: 61 74 65 5f 74 61 62 6c 65 20 3a 3a 3d 20 63 72 ate_table ::= cr
1470: 65 61 74 65 6b 77 20 74 65 6d 70 28 54 29 20 54 eatekw temp(T) T
1480: 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 73 74 73 ABLE ifnotexists
1490: 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 5a (E) nm(Y) dbnm(Z
14a0: 29 2e 20 7b 0a 20 20 20 73 71 6c 69 74 65 33 53 ). {. sqlite3S
14b0: 74 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 tartTable(pParse
14c0: 2c 26 59 2c 26 5a 2c 54 2c 30 2c 30 2c 45 29 3b ,&Y,&Z,T,0,0,E);
14d0: 0a 7d 0a 63 72 65 61 74 65 6b 77 28 41 29 20 3a .}.createkw(A) :
14e0: 3a 3d 20 43 52 45 41 54 45 28 41 29 2e 20 20 7b := CREATE(A). {
14f0: 64 69 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 disableLookaside
1500: 28 70 50 61 72 73 65 29 3b 7d 0a 0a 25 74 79 70 (pParse);}..%typ
1510: 65 20 69 66 6e 6f 74 65 78 69 73 74 73 20 7b 69 e ifnotexists {i
1520: 6e 74 7d 0a 69 66 6e 6f 74 65 78 69 73 74 73 28 nt}.ifnotexists(
1530: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 A) ::= .
1540: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 69 {A = 0;}.i
1550: 66 6e 6f 74 65 78 69 73 74 73 28 41 29 20 3a 3a fnotexists(A) ::
1560: 3d 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 2e = IF NOT EXISTS.
1570: 20 7b 41 20 3d 20 31 3b 7d 0a 25 74 79 70 65 20 {A = 1;}.%type
1580: 74 65 6d 70 20 7b 69 6e 74 7d 0a 25 69 66 6e 64 temp {int}.%ifnd
1590: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 ef SQLITE_OMIT_T
15a0: 45 4d 50 44 42 0a 74 65 6d 70 28 41 29 20 3a 3a EMPDB.temp(A) ::
15b0: 3d 20 54 45 4d 50 2e 20 20 7b 41 20 3d 20 31 3b = TEMP. {A = 1;
15c0: 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 }.%endif SQLITE
15d0: 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 74 65 6d _OMIT_TEMPDB.tem
15e0: 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 p(A) ::= .
15f0: 7b 41 20 3d 20 30 3b 7d 0a 63 72 65 61 74 65 5f {A = 0;}.create_
1600: 74 61 62 6c 65 5f 61 72 67 73 20 3a 3a 3d 20 4c table_args ::= L
1610: 50 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 63 6f 6e P columnlist con
1620: 73 6c 69 73 74 5f 6f 70 74 28 58 29 20 52 50 28 slist_opt(X) RP(
1630: 45 29 20 74 61 62 6c 65 5f 6f 70 74 69 6f 6e 73 E) table_options
1640: 28 46 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 (F). {. sqlite3
1650: 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c EndTable(pParse,
1660: 26 58 2c 26 45 2c 46 2c 30 29 3b 0a 7d 0a 63 72 &X,&E,F,0);.}.cr
1670: 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 20 eate_table_args
1680: 3a 3a 3d 20 41 53 20 73 65 6c 65 63 74 28 53 29 ::= AS select(S)
1690: 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 . {. sqlite3End
16a0: 54 61 62 6c 65 28 70 50 61 72 73 65 2c 30 2c 30 Table(pParse,0,0
16b0: 2c 30 2c 53 29 3b 0a 20 20 73 71 6c 69 74 65 33 ,0,S);. sqlite3
16c0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 50 61 SelectDelete(pPa
16d0: 72 73 65 2d 3e 64 62 2c 20 53 29 3b 0a 7d 0a 25 rse->db, S);.}.%
16e0: 74 79 70 65 20 74 61 62 6c 65 5f 6f 70 74 69 6f type table_optio
16f0: 6e 73 20 7b 69 6e 74 7d 0a 74 61 62 6c 65 5f 6f ns {int}.table_o
1700: 70 74 69 6f 6e 73 28 41 29 20 3a 3a 3d 20 2e 20 ptions(A) ::= .
1710: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 74 61 62 6c {A = 0;}.tabl
1720: 65 5f 6f 70 74 69 6f 6e 73 28 41 29 20 3a 3a 3d e_options(A) ::=
1730: 20 57 49 54 48 4f 55 54 20 6e 6d 28 58 29 2e 20 WITHOUT nm(X).
1740: 7b 0a 20 20 69 66 28 20 58 2e 6e 3d 3d 35 20 26 {. if( X.n==5 &
1750: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 & sqlite3_strnic
1760: 6d 70 28 58 2e 7a 2c 22 72 6f 77 69 64 22 2c 35 mp(X.z,"rowid",5
1770: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 41 20 3d 20 )==0 ){. A =
1780: 54 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 TF_WithoutRowid
1790: 7c 20 54 46 5f 4e 6f 56 69 73 69 62 6c 65 52 6f | TF_NoVisibleRo
17a0: 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 wid;. }else{.
17b0: 20 20 41 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c A = 0;. sql
17c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 ite3ErrorMsg(pPa
17d0: 72 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 74 61 rse, "unknown ta
17e0: 62 6c 65 20 6f 70 74 69 6f 6e 3a 20 25 2e 2a 73 ble option: %.*s
17f0: 22 2c 20 58 2e 6e 2c 20 58 2e 7a 29 3b 0a 20 20 ", X.n, X.z);.
1800: 7d 0a 7d 0a 63 6f 6c 75 6d 6e 6c 69 73 74 20 3a }.}.columnlist :
1810: 3a 3d 20 63 6f 6c 75 6d 6e 6c 69 73 74 20 43 4f := columnlist CO
1820: 4d 4d 41 20 63 6f 6c 75 6d 6e 6e 61 6d 65 20 63 MMA columnname c
1830: 61 72 67 6c 69 73 74 2e 0a 63 6f 6c 75 6d 6e 6c arglist..columnl
1840: 69 73 74 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 6e 61 ist ::= columnna
1850: 6d 65 20 63 61 72 67 6c 69 73 74 2e 0a 63 6f 6c me carglist..col
1860: 75 6d 6e 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 6e umnname(A) ::= n
1870: 6d 28 41 29 20 74 79 70 65 74 6f 6b 65 6e 28 59 m(A) typetoken(Y
1880: 29 2e 20 7b 73 71 6c 69 74 65 33 41 64 64 43 6f ). {sqlite3AddCo
1890: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 26 41 2c 26 lumn(pParse,&A,&
18a0: 59 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c Y);}..// The fol
18b0: 6c 6f 77 69 6e 67 20 64 69 72 65 63 74 69 76 65 lowing directive
18c0: 20 63 61 75 73 65 73 20 74 6f 6b 65 6e 73 20 41 causes tokens A
18d0: 42 4f 52 54 2c 20 41 46 54 45 52 2c 20 41 53 43 BORT, AFTER, ASC
18e0: 2c 20 65 74 63 2e 20 74 6f 0a 2f 2f 20 66 61 6c , etc. to.// fal
18f0: 6c 62 61 63 6b 20 74 6f 20 49 44 20 69 66 20 74 lback to ID if t
1900: 68 65 79 20 77 69 6c 6c 20 6e 6f 74 20 70 61 72 hey will not par
1910: 73 65 20 61 73 20 74 68 65 69 72 20 6f 72 69 67 se as their orig
1920: 69 6e 61 6c 20 76 61 6c 75 65 2e 0a 2f 2f 20 54 inal value..// T
1930: 68 69 73 20 6f 62 76 69 61 74 65 73 20 74 68 65 his obviates the
1940: 20 6e 65 65 64 20 66 6f 72 20 74 68 65 20 22 69 need for the "i
1950: 64 22 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a d" nonterminal..
1960: 2f 2f 0a 25 66 61 6c 6c 62 61 63 6b 20 49 44 0a //.%fallback ID.
1970: 20 20 41 42 4f 52 54 20 41 43 54 49 4f 4e 20 41 ABORT ACTION A
1980: 46 54 45 52 20 41 4e 41 4c 59 5a 45 20 41 53 43 FTER ANALYZE ASC
1990: 20 41 54 54 41 43 48 20 42 45 46 4f 52 45 20 42 ATTACH BEFORE B
19a0: 45 47 49 4e 20 42 59 20 43 41 53 43 41 44 45 20 EGIN BY CASCADE
19b0: 43 41 53 54 20 43 4f 4c 55 4d 4e 4b 57 0a 20 20 CAST COLUMNKW.
19c0: 43 4f 4e 46 4c 49 43 54 20 44 41 54 41 42 41 53 CONFLICT DATABAS
19d0: 45 20 44 45 46 45 52 52 45 44 20 44 45 53 43 20 E DEFERRED DESC
19e0: 44 45 54 41 43 48 20 45 41 43 48 20 45 4e 44 20 DETACH EACH END
19f0: 45 58 43 4c 55 53 49 56 45 20 45 58 50 4c 41 49 EXCLUSIVE EXPLAI
1a00: 4e 20 46 41 49 4c 20 46 4f 52 0a 20 20 49 47 4e N FAIL FOR. IGN
1a10: 4f 52 45 20 49 4d 4d 45 44 49 41 54 45 20 49 4e ORE IMMEDIATE IN
1a20: 49 54 49 41 4c 4c 59 20 49 4e 53 54 45 41 44 20 ITIALLY INSTEAD
1a30: 4c 49 4b 45 5f 4b 57 20 4d 41 54 43 48 20 4e 4f LIKE_KW MATCH NO
1a40: 20 50 4c 41 4e 0a 20 20 51 55 45 52 59 20 4b 45 PLAN. QUERY KE
1a50: 59 20 4f 46 20 4f 46 46 53 45 54 20 50 52 41 47 Y OF OFFSET PRAG
1a60: 4d 41 20 52 41 49 53 45 20 52 45 43 55 52 53 49 MA RAISE RECURSI
1a70: 56 45 20 52 45 4c 45 41 53 45 20 52 45 50 4c 41 VE RELEASE REPLA
1a80: 43 45 20 52 45 53 54 52 49 43 54 20 52 4f 57 0a CE RESTRICT ROW.
1a90: 20 20 52 4f 4c 4c 42 41 43 4b 20 53 41 56 45 50 ROLLBACK SAVEP
1aa0: 4f 49 4e 54 20 54 45 4d 50 20 54 52 49 47 47 45 OINT TEMP TRIGGE
1ab0: 52 20 56 41 43 55 55 4d 20 56 49 45 57 20 56 49 R VACUUM VIEW VI
1ac0: 52 54 55 41 4c 20 57 49 54 48 20 57 49 54 48 4f RTUAL WITH WITHO
1ad0: 55 54 0a 25 69 66 64 65 66 20 53 51 4c 49 54 45 UT.%ifdef SQLITE
1ae0: 5f 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 _OMIT_COMPOUND_S
1af0: 45 4c 45 43 54 0a 20 20 45 58 43 45 50 54 20 49 ELECT. EXCEPT I
1b00: 4e 54 45 52 53 45 43 54 20 55 4e 49 4f 4e 0a 25 NTERSECT UNION.%
1b10: 65 6e 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 endif SQLITE_OMI
1b20: 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 T_COMPOUND_SELEC
1b30: 54 0a 20 20 52 45 49 4e 44 45 58 20 52 45 4e 41 T. REINDEX RENA
1b40: 4d 45 20 43 54 49 4d 45 5f 4b 57 20 49 46 0a 20 ME CTIME_KW IF.
1b50: 20 2e 0a 25 77 69 6c 64 63 61 72 64 20 41 4e 59 ..%wildcard ANY
1b60: 2e 0a 0a 2f 2f 20 44 65 66 69 6e 65 20 6f 70 65 ...// Define ope
1b70: 72 61 74 6f 72 20 70 72 65 63 65 64 65 6e 63 65 rator precedence
1b80: 20 65 61 72 6c 79 20 73 6f 20 74 68 61 74 20 74 early so that t
1b90: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 his is the first
1ba0: 20 6f 63 63 75 72 72 65 6e 63 65 0a 2f 2f 20 6f occurrence.// o
1bb0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74 f the operator t
1bc0: 6f 6b 65 6e 73 20 69 6e 20 74 68 65 20 67 72 61 okens in the gra
1bd0: 6d 6d 65 72 2e 20 20 4b 65 65 70 69 6e 67 20 74 mmer. Keeping t
1be0: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 6f 67 he operators tog
1bf0: 65 74 68 65 72 0a 2f 2f 20 63 61 75 73 65 73 20 ether.// causes
1c00: 74 68 65 6d 20 74 6f 20 62 65 20 61 73 73 69 67 them to be assig
1c10: 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c 75 ned integer valu
1c20: 65 73 20 74 68 61 74 20 61 72 65 20 63 6c 6f 73 es that are clos
1c30: 65 20 74 6f 67 65 74 68 65 72 2c 0a 2f 2f 20 77 e together,.// w
1c40: 68 69 63 68 20 6b 65 65 70 73 20 70 61 72 73 65 hich keeps parse
1c50: 72 20 74 61 62 6c 65 73 20 73 6d 61 6c 6c 65 72 r tables smaller
1c60: 2e 0a 2f 2f 0a 2f 2f 20 54 68 65 20 74 6f 6b 65 ..//.// The toke
1c70: 6e 20 76 61 6c 75 65 73 20 61 73 73 69 67 6e 65 n values assigne
1c80: 64 20 74 6f 20 74 68 65 73 65 20 73 79 6d 62 6f d to these symbo
1c90: 6c 73 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 ls is determined
1ca0: 20 62 79 20 74 68 65 20 6f 72 64 65 72 0a 2f 2f by the order.//
1cb0: 20 69 6e 20 77 68 69 63 68 20 6c 65 6d 6f 6e 20 in which lemon
1cc0: 66 69 72 73 74 20 73 65 65 73 20 74 68 65 6d 2e first sees them.
1cd0: 20 20 49 74 20 6d 75 73 74 20 62 65 20 74 68 65 It must be the
1ce0: 20 63 61 73 65 20 74 68 61 74 20 49 53 4e 55 4c case that ISNUL
1cf0: 4c 2f 4e 4f 54 4e 55 4c 4c 2c 0a 2f 2f 20 4e 45 L/NOTNULL,.// NE
1d00: 2f 45 51 2c 20 47 54 2f 4c 45 2c 20 61 6e 64 20 /EQ, GT/LE, and
1d10: 47 45 2f 4c 54 20 61 72 65 20 73 65 70 61 72 61 GE/LT are separa
1d20: 74 65 64 20 62 79 20 6f 6e 6c 79 20 61 20 73 69 ted by only a si
1d30: 6e 67 6c 65 20 76 61 6c 75 65 2e 20 20 53 65 65 ngle value. See
1d40: 0a 2f 2f 20 74 68 65 20 73 71 6c 69 74 65 33 45 .// the sqlite3E
1d50: 78 70 72 49 66 46 61 6c 73 65 28 29 20 72 6f 75 xprIfFalse() rou
1d60: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f tine for additio
1d70: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 nal information
1d80: 6f 6e 20 74 68 69 73 0a 2f 2f 20 63 6f 6e 73 74 on this.// const
1d90: 72 61 69 6e 74 2e 0a 2f 2f 0a 25 6c 65 66 74 20 raint..//.%left
1da0: 4f 52 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a 25 OR..%left AND..%
1db0: 72 69 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66 74 right NOT..%left
1dc0: 20 49 53 20 4d 41 54 43 48 20 4c 49 4b 45 5f 4b IS MATCH LIKE_K
1dd0: 57 20 42 45 54 57 45 45 4e 20 49 4e 20 49 53 4e W BETWEEN IN ISN
1de0: 55 4c 4c 20 4e 4f 54 4e 55 4c 4c 20 4e 45 20 45 ULL NOTNULL NE E
1df0: 51 2e 0a 25 6c 65 66 74 20 47 54 20 4c 45 20 4c Q..%left GT LE L
1e00: 54 20 47 45 2e 0a 25 72 69 67 68 74 20 45 53 43 T GE..%right ESC
1e10: 41 50 45 2e 0a 25 6c 65 66 74 20 42 49 54 41 4e APE..%left BITAN
1e20: 44 20 42 49 54 4f 52 20 4c 53 48 49 46 54 20 52 D BITOR LSHIFT R
1e30: 53 48 49 46 54 2e 0a 25 6c 65 66 74 20 50 4c 55 SHIFT..%left PLU
1e40: 53 20 4d 49 4e 55 53 2e 0a 25 6c 65 66 74 20 53 S MINUS..%left S
1e50: 54 41 52 20 53 4c 41 53 48 20 52 45 4d 2e 0a 25 TAR SLASH REM..%
1e60: 6c 65 66 74 20 43 4f 4e 43 41 54 2e 0a 25 6c 65 left CONCAT..%le
1e70: 66 74 20 43 4f 4c 4c 41 54 45 2e 0a 25 72 69 67 ft COLLATE..%rig
1e80: 68 74 20 42 49 54 4e 4f 54 2e 0a 0a 2f 2f 20 41 ht BITNOT...// A
1e90: 6e 20 49 44 45 4e 54 49 46 49 45 52 20 63 61 6e n IDENTIFIER can
1ea0: 20 62 65 20 61 20 67 65 6e 65 72 69 63 20 69 64 be a generic id
1eb0: 65 6e 74 69 66 69 65 72 2c 20 6f 72 20 6f 6e 65 entifier, or one
1ec0: 20 6f 66 20 73 65 76 65 72 61 6c 0a 2f 2f 20 6b of several.// k
1ed0: 65 79 77 6f 72 64 73 2e 20 20 41 6e 79 20 6e 6f eywords. Any no
1ee0: 6e 2d 73 74 61 6e 64 61 72 64 20 6b 65 79 77 6f n-standard keywo
1ef0: 72 64 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 61 rd can also be a
1f00: 6e 20 69 64 65 6e 74 69 66 69 65 72 2e 0a 2f 2f n identifier..//
1f10: 0a 25 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 69 64 .%token_class id
1f20: 20 20 49 44 7c 49 4e 44 45 58 45 44 2e 0a 0a 2f ID|INDEXED.../
1f30: 2f 20 41 6e 64 20 22 69 64 73 22 20 69 73 20 61 / And "ids" is a
1f40: 6e 20 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d 73 n identifer-or-s
1f50: 74 72 69 6e 67 2e 0a 2f 2f 0a 25 74 6f 6b 65 6e tring..//.%token
1f60: 5f 63 6c 61 73 73 20 69 64 73 20 20 49 44 7c 53 _class ids ID|S
1f70: 54 52 49 4e 47 2e 0a 0a 2f 2f 20 54 68 65 20 6e TRING...// The n
1f80: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 ame of a column
1f90: 6f 72 20 74 61 62 6c 65 20 63 61 6e 20 62 65 20 or table can be
1fa0: 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f any of the follo
1fb0: 77 69 6e 67 3a 0a 2f 2f 0a 25 74 79 70 65 20 6e wing:.//.%type n
1fc0: 6d 20 7b 54 6f 6b 65 6e 7d 0a 6e 6d 28 41 29 20 m {Token}.nm(A)
1fd0: 3a 3a 3d 20 69 64 28 41 29 2e 0a 6e 6d 28 41 29 ::= id(A)..nm(A)
1fe0: 20 3a 3a 3d 20 53 54 52 49 4e 47 28 41 29 2e 0a ::= STRING(A)..
1ff0: 6e 6d 28 41 29 20 3a 3a 3d 20 4a 4f 49 4e 5f 4b nm(A) ::= JOIN_K
2000: 57 28 41 29 2e 0a 0a 2f 2f 20 41 20 74 79 70 65 W(A)...// A type
2010: 74 6f 6b 65 6e 20 69 73 20 72 65 61 6c 6c 79 20 token is really
2020: 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 74 6f 6b zero or more tok
2030: 65 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 61 20 ens that form a
2040: 74 79 70 65 20 6e 61 6d 65 20 73 75 63 68 0a 2f type name such./
2050: 2f 20 61 73 20 63 61 6e 20 62 65 20 66 6f 75 6e / as can be foun
2060: 64 20 61 66 74 65 72 20 74 68 65 20 63 6f 6c 75 d after the colu
2070: 6d 6e 20 6e 61 6d 65 20 69 6e 20 61 20 43 52 45 mn name in a CRE
2080: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d ATE TABLE statem
2090: 65 6e 74 2e 0a 2f 2f 20 4d 75 6c 74 69 70 6c 65 ent..// Multiple
20a0: 20 74 6f 6b 65 6e 73 20 61 72 65 20 63 6f 6e 63 tokens are conc
20b0: 61 74 65 6e 61 74 65 64 20 74 6f 20 66 6f 72 6d atenated to form
20c0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 the value of th
20d0: 65 20 74 79 70 65 74 6f 6b 65 6e 2e 0a 2f 2f 0a e typetoken..//.
20e0: 25 74 79 70 65 20 74 79 70 65 74 6f 6b 65 6e 20 %type typetoken
20f0: 7b 54 6f 6b 65 6e 7d 0a 74 79 70 65 74 6f 6b 65 {Token}.typetoke
2100: 6e 28 41 29 20 3a 3a 3d 20 2e 20 20 20 7b 41 2e n(A) ::= . {A.
2110: 6e 20 3d 20 30 3b 20 41 2e 7a 20 3d 20 30 3b 7d n = 0; A.z = 0;}
2120: 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a .typetoken(A) ::
2130: 3d 20 74 79 70 65 6e 61 6d 65 28 41 29 2e 0a 74 = typename(A)..t
2140: 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a 3d 20 ypetoken(A) ::=
2150: 74 79 70 65 6e 61 6d 65 28 41 29 20 4c 50 20 73 typename(A) LP s
2160: 69 67 6e 65 64 20 52 50 28 59 29 2e 20 7b 0a 20 igned RP(Y). {.
2170: 20 41 2e 6e 20 3d 20 28 69 6e 74 29 28 26 59 2e A.n = (int)(&Y.
2180: 7a 5b 59 2e 6e 5d 20 2d 20 41 2e 7a 29 3b 0a 7d z[Y.n] - A.z);.}
2190: 0a 74 79 70 65 74 6f 6b 65 6e 28 41 29 20 3a 3a .typetoken(A) ::
21a0: 3d 20 74 79 70 65 6e 61 6d 65 28 41 29 20 4c 50 = typename(A) LP
21b0: 20 73 69 67 6e 65 64 20 43 4f 4d 4d 41 20 73 69 signed COMMA si
21c0: 67 6e 65 64 20 52 50 28 59 29 2e 20 7b 0a 20 20 gned RP(Y). {.
21d0: 41 2e 6e 20 3d 20 28 69 6e 74 29 28 26 59 2e 7a A.n = (int)(&Y.z
21e0: 5b 59 2e 6e 5d 20 2d 20 41 2e 7a 29 3b 0a 7d 0a [Y.n] - A.z);.}.
21f0: 25 74 79 70 65 20 74 79 70 65 6e 61 6d 65 20 7b %type typename {
2200: 54 6f 6b 65 6e 7d 0a 74 79 70 65 6e 61 6d 65 28 Token}.typename(
2210: 41 29 20 3a 3a 3d 20 69 64 73 28 41 29 2e 0a 74 A) ::= ids(A)..t
2220: 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 74 ypename(A) ::= t
2230: 79 70 65 6e 61 6d 65 28 41 29 20 69 64 73 28 59 ypename(A) ids(Y
2240: 29 2e 20 7b 41 2e 6e 3d 59 2e 6e 2b 28 69 6e 74 ). {A.n=Y.n+(int
2250: 29 28 59 2e 7a 2d 41 2e 7a 29 3b 7d 0a 73 69 67 )(Y.z-A.z);}.sig
2260: 6e 65 64 20 3a 3a 3d 20 70 6c 75 73 5f 6e 75 6d ned ::= plus_num
2270: 2e 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 6d 69 6e ..signed ::= min
2280: 75 73 5f 6e 75 6d 2e 0a 0a 2f 2f 20 22 63 61 72 us_num...// "car
2290: 67 6c 69 73 74 22 20 69 73 20 61 20 6c 69 73 74 glist" is a list
22a0: 20 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 of additional c
22b0: 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 onstraints that
22c0: 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65 0a 2f come after the./
22d0: 2f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e / column name an
22e0: 64 20 63 6f 6c 75 6d 6e 20 74 79 70 65 20 69 6e d column type in
22f0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 a CREATE TABLE
2300: 73 74 61 74 65 6d 65 6e 74 2e 0a 2f 2f 0a 63 61 statement..//.ca
2310: 72 67 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c rglist ::= cargl
2320: 69 73 74 20 63 63 6f 6e 73 2e 0a 63 61 72 67 6c ist ccons..cargl
2330: 69 73 74 20 3a 3a 3d 20 2e 0a 63 63 6f 6e 73 20 ist ::= ..ccons
2340: 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 4e 54 20 6e ::= CONSTRAINT n
2350: 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 m(X).
2360: 7b 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 {pParse->constra
2370: 69 6e 74 4e 61 6d 65 20 3d 20 58 3b 7d 0a 63 63 intName = X;}.cc
2380: 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 ons ::= DEFAULT
2390: 74 65 72 6d 28 58 29 2e 20 20 20 20 20 20 20 20 term(X).
23a0: 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 44 {sqlite3AddD
23b0: 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 72 efaultValue(pPar
23c0: 73 65 2c 26 58 29 3b 7d 0a 63 63 6f 6e 73 20 3a se,&X);}.ccons :
23d0: 3a 3d 20 44 45 46 41 55 4c 54 20 4c 50 20 65 78 := DEFAULT LP ex
23e0: 70 72 28 58 29 20 52 50 2e 20 20 20 20 20 20 7b pr(X) RP. {
23f0: 73 71 6c 69 74 65 33 41 64 64 44 65 66 61 75 6c sqlite3AddDefaul
2400: 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 58 tValue(pParse,&X
2410: 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 44 45 );}.ccons ::= DE
2420: 46 41 55 4c 54 20 50 4c 55 53 20 74 65 72 6d 28 FAULT PLUS term(
2430: 58 29 2e 20 20 20 20 20 20 20 7b 73 71 6c 69 74 X). {sqlit
2440: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 e3AddDefaultValu
2450: 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63 e(pParse,&X);}.c
2460: 63 6f 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 cons ::= DEFAULT
2470: 20 4d 49 4e 55 53 28 41 29 20 74 65 72 6d 28 58 MINUS(A) term(X
2480: 29 2e 20 20 20 20 20 20 7b 0a 20 20 45 78 70 72 ). {. Expr
2490: 53 70 61 6e 20 76 3b 0a 20 20 76 2e 70 45 78 70 Span v;. v.pExp
24a0: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 r = sqlite3PExpr
24b0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 55 4d 49 4e (pParse, TK_UMIN
24c0: 55 53 2c 20 58 2e 70 45 78 70 72 2c 20 30 29 3b US, X.pExpr, 0);
24d0: 0a 20 20 76 2e 7a 53 74 61 72 74 20 3d 20 41 2e . v.zStart = A.
24e0: 7a 3b 0a 20 20 76 2e 7a 45 6e 64 20 3d 20 58 2e z;. v.zEnd = X.
24f0: 7a 45 6e 64 3b 0a 20 20 73 71 6c 69 74 65 33 41 zEnd;. sqlite3A
2500: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 ddDefaultValue(p
2510: 50 61 72 73 65 2c 26 76 29 3b 0a 7d 0a 63 63 6f Parse,&v);.}.cco
2520: 6e 73 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 69 ns ::= DEFAULT i
2530: 64 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 d(X).
2540: 20 20 20 7b 0a 20 20 45 78 70 72 53 70 61 6e 20 {. ExprSpan
2550: 76 3b 0a 20 20 73 70 61 6e 45 78 70 72 28 26 76 v;. spanExpr(&v
2560: 2c 20 70 50 61 72 73 65 2c 20 54 4b 5f 53 54 52 , pParse, TK_STR
2570: 49 4e 47 2c 20 58 29 3b 0a 20 20 73 71 6c 69 74 ING, X);. sqlit
2580: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 e3AddDefaultValu
2590: 65 28 70 50 61 72 73 65 2c 26 76 29 3b 0a 7d 0a e(pParse,&v);.}.
25a0: 0a 2f 2f 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 .// In addition
25b0: 74 6f 20 74 68 65 20 74 79 70 65 20 6e 61 6d 65 to the type name
25c0: 2c 20 77 65 20 61 6c 73 6f 20 63 61 72 65 20 61 , we also care a
25d0: 62 6f 75 74 20 74 68 65 20 70 72 69 6d 61 72 79 bout the primary
25e0: 20 6b 65 79 20 61 6e 64 0a 2f 2f 20 55 4e 49 51 key and.// UNIQ
25f0: 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a UE constraints..
2600: 2f 2f 0a 63 63 6f 6e 73 20 3a 3a 3d 20 4e 55 4c //.ccons ::= NUL
2610: 4c 20 6f 6e 63 6f 6e 66 2e 0a 63 63 6f 6e 73 20 L onconf..ccons
2620: 3a 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 20 6f 6e 63 ::= NOT NULL onc
2630: 6f 6e 66 28 52 29 2e 20 20 20 20 7b 73 71 6c 69 onf(R). {sqli
2640: 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 70 50 te3AddNotNull(pP
2650: 61 72 73 65 2c 20 52 29 3b 7d 0a 63 63 6f 6e 73 arse, R);}.ccons
2660: 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 ::= PRIMARY KEY
2670: 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 20 6f 6e sortorder(Z) on
2680: 63 6f 6e 66 28 52 29 20 61 75 74 6f 69 6e 63 28 conf(R) autoinc(
2690: 49 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 I)..
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26b0: 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 64 64 {sqlite3Add
26c0: 50 72 69 6d 61 72 79 4b 65 79 28 70 50 61 72 73 PrimaryKey(pPars
26d0: 65 2c 30 2c 52 2c 49 2c 5a 29 3b 7d 0a 63 63 6f e,0,R,I,Z);}.cco
26e0: 6e 73 20 3a 3a 3d 20 55 4e 49 51 55 45 20 6f 6e ns ::= UNIQUE on
26f0: 63 6f 6e 66 28 52 29 2e 20 20 20 20 20 20 7b 73 conf(R). {s
2700: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 qlite3CreateInde
2710: 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 30 x(pParse,0,0,0,0
2720: 2c 52 2c 30 2c 30 2c 30 2c 30 2c 0a 20 20 20 20 ,R,0,0,0,0,.
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 S
2750: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e QLITE_IDXTYPE_UN
2760: 49 51 55 45 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a IQUE);}.ccons ::
2770: 3d 20 43 48 45 43 4b 20 4c 50 20 65 78 70 72 28 = CHECK LP expr(
2780: 58 29 20 52 50 2e 20 20 20 7b 73 71 6c 69 74 65 X) RP. {sqlite
2790: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 3AddCheckConstra
27a0: 69 6e 74 28 70 50 61 72 73 65 2c 58 2e 70 45 78 int(pParse,X.pEx
27b0: 70 72 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 pr);}.ccons ::=
27c0: 52 45 46 45 52 45 4e 43 45 53 20 6e 6d 28 54 29 REFERENCES nm(T)
27d0: 20 65 69 64 6c 69 73 74 5f 6f 70 74 28 54 41 29 eidlist_opt(TA)
27e0: 20 72 65 66 61 72 67 73 28 52 29 2e 0a 20 20 20 refargs(R)..
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 {s
2810: 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 qlite3CreateFore
2820: 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c 30 2c ignKey(pParse,0,
2830: 26 54 2c 54 41 2c 52 29 3b 7d 0a 63 63 6f 6e 73 &T,TA,R);}.ccons
2840: 20 3a 3a 3d 20 64 65 66 65 72 5f 73 75 62 63 6c ::= defer_subcl
2850: 61 75 73 65 28 44 29 2e 20 20 20 20 7b 73 71 6c ause(D). {sql
2860: 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e ite3DeferForeign
2870: 4b 65 79 28 70 50 61 72 73 65 2c 44 29 3b 7d 0a Key(pParse,D);}.
2880: 63 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4c 4c 41 54 ccons ::= COLLAT
2890: 45 20 69 64 73 28 43 29 2e 20 20 20 20 20 20 20 E ids(C).
28a0: 20 7b 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c {sqlite3AddColl
28b0: 61 74 65 54 79 70 65 28 70 50 61 72 73 65 2c 20 ateType(pParse,
28c0: 26 43 29 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6f 70 &C);}..// The op
28d0: 74 69 6f 6e 61 6c 20 41 55 54 4f 49 4e 43 52 45 tional AUTOINCRE
28e0: 4d 45 4e 54 20 6b 65 79 77 6f 72 64 0a 25 74 79 MENT keyword.%ty
28f0: 70 65 20 61 75 74 6f 69 6e 63 20 7b 69 6e 74 7d pe autoinc {int}
2900: 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a 3a 3d 20 .autoinc(X) ::=
2910: 2e 20 20 20 20 20 20 20 20 20 20 7b 58 20 3d 20 . {X =
2920: 30 3b 7d 0a 61 75 74 6f 69 6e 63 28 58 29 20 3a 0;}.autoinc(X) :
2930: 3a 3d 20 41 55 54 4f 49 4e 43 52 2e 20 20 7b 58 := AUTOINCR. {X
2940: 20 3d 20 31 3b 7d 0a 0a 2f 2f 20 54 68 65 20 6e = 1;}..// The n
2950: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 75 6c ext group of rul
2960: 65 73 20 70 61 72 73 65 73 20 74 68 65 20 61 72 es parses the ar
2970: 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 52 45 46 guments to a REF
2980: 45 52 45 4e 43 45 53 20 63 6c 61 75 73 65 0a 2f ERENCES clause./
2990: 2f 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 / that determine
29a0: 20 69 66 20 74 68 65 20 72 65 66 65 72 65 6e 74 if the referent
29b0: 69 61 6c 20 69 6e 74 65 67 72 69 74 79 20 63 68 ial integrity ch
29c0: 65 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 ecking is deferr
29d0: 65 64 20 6f 72 0a 2f 2f 20 6f 72 20 69 6d 6d 65 ed or.// or imme
29e0: 64 69 61 74 65 20 61 6e 64 20 77 68 69 63 68 20 diate and which
29f0: 64 65 74 65 72 6d 69 6e 65 20 77 68 61 74 20 61 determine what a
2a00: 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 69 66 ction to take if
2a10: 20 61 20 72 65 66 2d 69 6e 74 65 67 0a 2f 2f 20 a ref-integ.//
2a20: 63 68 65 63 6b 20 66 61 69 6c 73 2e 0a 2f 2f 0a check fails..//.
2a30: 25 74 79 70 65 20 72 65 66 61 72 67 73 20 7b 69 %type refargs {i
2a40: 6e 74 7d 0a 72 65 66 61 72 67 73 28 41 29 20 3a nt}.refargs(A) :
2a50: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 := .
2a60: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 4e { A = OE_N
2a70: 6f 6e 65 2a 30 78 30 31 30 31 3b 20 2f 2a 20 45 one*0x0101; /* E
2a80: 56 3a 20 52 2d 31 39 38 30 33 2d 34 35 38 38 34 V: R-19803-45884
2a90: 20 2a 2f 7d 0a 72 65 66 61 72 67 73 28 41 29 20 */}.refargs(A)
2aa0: 3a 3a 3d 20 72 65 66 61 72 67 73 28 41 29 20 72 ::= refargs(A) r
2ab0: 65 66 61 72 67 28 59 29 2e 20 7b 20 41 20 3d 20 efarg(Y). { A =
2ac0: 28 41 20 26 20 7e 59 2e 6d 61 73 6b 29 20 7c 20 (A & ~Y.mask) |
2ad0: 59 2e 76 61 6c 75 65 3b 20 7d 0a 25 74 79 70 65 Y.value; }.%type
2ae0: 20 72 65 66 61 72 67 20 7b 73 74 72 75 63 74 20 refarg {struct
2af0: 7b 69 6e 74 20 76 61 6c 75 65 3b 20 69 6e 74 20 {int value; int
2b00: 6d 61 73 6b 3b 7d 7d 0a 72 65 66 61 72 67 28 41 mask;}}.refarg(A
2b10: 29 20 3a 3a 3d 20 4d 41 54 43 48 20 6e 6d 2e 20 ) ::= MATCH nm.
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 { A
2b30: 2e 76 61 6c 75 65 20 3d 20 30 3b 20 20 20 20 20 .value = 0;
2b40: 41 2e 6d 61 73 6b 20 3d 20 30 78 30 30 30 30 30 A.mask = 0x00000
2b50: 30 3b 20 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 0; }.refarg(A) :
2b60: 3a 3d 20 4f 4e 20 49 4e 53 45 52 54 20 72 65 66 := ON INSERT ref
2b70: 61 63 74 2e 20 20 20 20 20 20 7b 20 41 2e 76 61 act. { A.va
2b80: 6c 75 65 20 3d 20 30 3b 20 20 20 20 20 41 2e 6d lue = 0; A.m
2b90: 61 73 6b 20 3d 20 30 78 30 30 30 30 30 30 3b 20 ask = 0x000000;
2ba0: 7d 0a 72 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 }.refarg(A) ::=
2bb0: 4f 4e 20 44 45 4c 45 54 45 20 72 65 66 61 63 74 ON DELETE refact
2bc0: 28 58 29 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 (X). { A.value
2bd0: 20 3d 20 58 3b 20 20 20 20 20 41 2e 6d 61 73 6b = X; A.mask
2be0: 20 3d 20 30 78 30 30 30 30 66 66 3b 20 7d 0a 72 = 0x0000ff; }.r
2bf0: 65 66 61 72 67 28 41 29 20 3a 3a 3d 20 4f 4e 20 efarg(A) ::= ON
2c00: 55 50 44 41 54 45 20 72 65 66 61 63 74 28 58 29 UPDATE refact(X)
2c10: 2e 20 20 20 7b 20 41 2e 76 61 6c 75 65 20 3d 20 . { A.value =
2c20: 58 3c 3c 38 3b 20 20 41 2e 6d 61 73 6b 20 3d 20 X<<8; A.mask =
2c30: 30 78 30 30 66 66 30 30 3b 20 7d 0a 25 74 79 70 0x00ff00; }.%typ
2c40: 65 20 72 65 66 61 63 74 20 7b 69 6e 74 7d 0a 72 e refact {int}.r
2c50: 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45 54 efact(A) ::= SET
2c60: 20 4e 55 4c 4c 2e 20 20 20 20 20 20 20 20 20 20 NULL.
2c70: 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65 74 { A = OE_Set
2c80: 4e 75 6c 6c 3b 20 20 2f 2a 20 45 56 3a 20 52 2d Null; /* EV: R-
2c90: 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d 0a 33326-45252 */}.
2ca0: 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 53 45 refact(A) ::= SE
2cb0: 54 20 44 45 46 41 55 4c 54 2e 20 20 20 20 20 20 T DEFAULT.
2cc0: 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 53 65 { A = OE_Se
2cd0: 74 44 66 6c 74 3b 20 20 2f 2a 20 45 56 3a 20 52 tDflt; /* EV: R
2ce0: 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f 7d -33326-45252 */}
2cf0: 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 43 .refact(A) ::= C
2d00: 41 53 43 41 44 45 2e 20 20 20 20 20 20 20 20 20 ASCADE.
2d10: 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f 43 { A = OE_C
2d20: 61 73 63 61 64 65 3b 20 20 2f 2a 20 45 56 3a 20 ascade; /* EV:
2d30: 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a 2f R-33326-45252 */
2d40: 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d 20 }.refact(A) ::=
2d50: 52 45 53 54 52 49 43 54 2e 20 20 20 20 20 20 20 RESTRICT.
2d60: 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 5f { A = OE_
2d70: 52 65 73 74 72 69 63 74 3b 20 2f 2a 20 45 56 3a Restrict; /* EV:
2d80: 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20 2a R-33326-45252 *
2d90: 2f 7d 0a 72 65 66 61 63 74 28 41 29 20 3a 3a 3d /}.refact(A) ::=
2da0: 20 4e 4f 20 41 43 54 49 4f 4e 2e 20 20 20 20 20 NO ACTION.
2db0: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 4f 45 { A = OE
2dc0: 5f 4e 6f 6e 65 3b 20 20 20 20 20 2f 2a 20 45 56 _None; /* EV
2dd0: 3a 20 52 2d 33 33 33 32 36 2d 34 35 32 35 32 20 : R-33326-45252
2de0: 2a 2f 7d 0a 25 74 79 70 65 20 64 65 66 65 72 5f */}.%type defer_
2df0: 73 75 62 63 6c 61 75 73 65 20 7b 69 6e 74 7d 0a subclause {int}.
2e00: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 defer_subclause(
2e10: 41 29 20 3a 3a 3d 20 4e 4f 54 20 44 45 46 45 52 A) ::= NOT DEFER
2e20: 52 41 42 4c 45 20 69 6e 69 74 5f 64 65 66 65 72 RABLE init_defer
2e30: 72 65 64 5f 70 72 65 64 5f 6f 70 74 2e 20 20 20 red_pred_opt.
2e40: 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 65 66 65 72 {A = 0;}.defer
2e50: 5f 73 75 62 63 6c 61 75 73 65 28 41 29 20 3a 3a _subclause(A) ::
2e60: 3d 20 44 45 46 45 52 52 41 42 4c 45 20 69 6e 69 = DEFERRABLE ini
2e70: 74 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f t_deferred_pred_
2e80: 6f 70 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 opt(X). {A
2e90: 3d 20 58 3b 7d 0a 25 74 79 70 65 20 69 6e 69 74 = X;}.%type init
2ea0: 5f 64 65 66 65 72 72 65 64 5f 70 72 65 64 5f 6f _deferred_pred_o
2eb0: 70 74 20 7b 69 6e 74 7d 0a 69 6e 69 74 5f 64 65 pt {int}.init_de
2ec0: 66 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 ferred_pred_opt(
2ed0: 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 A) ::= .
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b {
2ef0: 41 20 3d 20 30 3b 7d 0a 69 6e 69 74 5f 64 65 66 A = 0;}.init_def
2f00: 65 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 erred_pred_opt(A
2f10: 29 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 ) ::= INITIALLY
2f20: 44 45 46 45 52 52 45 44 2e 20 20 20 20 20 7b 41 DEFERRED. {A
2f30: 20 3d 20 31 3b 7d 0a 69 6e 69 74 5f 64 65 66 65 = 1;}.init_defe
2f40: 72 72 65 64 5f 70 72 65 64 5f 6f 70 74 28 41 29 rred_pred_opt(A)
2f50: 20 3a 3a 3d 20 49 4e 49 54 49 41 4c 4c 59 20 49 ::= INITIALLY I
2f60: 4d 4d 45 44 49 41 54 45 2e 20 20 20 20 7b 41 20 MMEDIATE. {A
2f70: 3d 20 30 3b 7d 0a 0a 63 6f 6e 73 6c 69 73 74 5f = 0;}..conslist_
2f80: 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 opt(A) ::= .
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2fa0: 20 20 20 20 20 7b 41 2e 6e 20 3d 20 30 3b 20 41 {A.n = 0; A
2fb0: 2e 7a 20 3d 20 30 3b 7d 0a 63 6f 6e 73 6c 69 73 .z = 0;}.conslis
2fc0: 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 43 4f 4d t_opt(A) ::= COM
2fd0: 4d 41 28 41 29 20 63 6f 6e 73 6c 69 73 74 2e 0a MA(A) conslist..
2fe0: 63 6f 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e conslist ::= con
2ff0: 73 6c 69 73 74 20 74 63 6f 6e 73 63 6f 6d 6d 61 slist tconscomma
3000: 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c 69 73 74 tcons..conslist
3010: 20 3a 3a 3d 20 74 63 6f 6e 73 2e 0a 74 63 6f 6e ::= tcons..tcon
3020: 73 63 6f 6d 6d 61 20 3a 3a 3d 20 43 4f 4d 4d 41 scomma ::= COMMA
3030: 2e 20 20 20 20 20 20 20 20 20 20 20 20 7b 70 50 . {pP
3040: 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 arse->constraint
3050: 4e 61 6d 65 2e 6e 20 3d 20 30 3b 7d 0a 74 63 6f Name.n = 0;}.tco
3060: 6e 73 63 6f 6d 6d 61 20 3a 3a 3d 20 2e 0a 74 63 nscomma ::= ..tc
3070: 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 49 ons ::= CONSTRAI
3080: 4e 54 20 6e 6d 28 58 29 2e 20 20 20 20 20 20 7b NT nm(X). {
3090: 70 50 61 72 73 65 2d 3e 63 6f 6e 73 74 72 61 69 pParse->constrai
30a0: 6e 74 4e 61 6d 65 20 3d 20 58 3b 7d 0a 74 63 6f ntName = X;}.tco
30b0: 6e 73 20 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b ns ::= PRIMARY K
30c0: 45 59 20 4c 50 20 73 6f 72 74 6c 69 73 74 28 58 EY LP sortlist(X
30d0: 29 20 61 75 74 6f 69 6e 63 28 49 29 20 52 50 20 ) autoinc(I) RP
30e0: 6f 6e 63 6f 6e 66 28 52 29 2e 0a 20 20 20 20 20 onconf(R)..
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3100: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c {sql
3110: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 ite3AddPrimaryKe
3120: 79 28 70 50 61 72 73 65 2c 58 2c 52 2c 49 2c 30 y(pParse,X,R,I,0
3130: 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 55 4e );}.tcons ::= UN
3140: 49 51 55 45 20 4c 50 20 73 6f 72 74 6c 69 73 74 IQUE LP sortlist
3150: 28 58 29 20 52 50 20 6f 6e 63 6f 6e 66 28 52 29 (X) RP onconf(R)
3160: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3180: 20 20 20 7b 73 71 6c 69 74 65 33 43 72 65 61 74 {sqlite3Creat
3190: 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c eIndex(pParse,0,
31a0: 30 2c 30 2c 58 2c 52 2c 30 2c 30 2c 30 2c 30 2c 0,0,X,R,0,0,0,0,
31b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
31d0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 SQLITE_I
31e0: 44 58 54 59 50 45 5f 55 4e 49 51 55 45 29 3b 7d DXTYPE_UNIQUE);}
31f0: 0a 74 63 6f 6e 73 20 3a 3a 3d 20 43 48 45 43 4b .tcons ::= CHECK
3200: 20 4c 50 20 65 78 70 72 28 45 29 20 52 50 20 6f LP expr(E) RP o
3210: 6e 63 6f 6e 66 2e 0a 20 20 20 20 20 20 20 20 20 nconf..
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3230: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 {sqlite3
3240: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 AddCheckConstrai
3250: 6e 74 28 70 50 61 72 73 65 2c 45 2e 70 45 78 70 nt(pParse,E.pExp
3260: 72 29 3b 7d 0a 74 63 6f 6e 73 20 3a 3a 3d 20 46 r);}.tcons ::= F
3270: 4f 52 45 49 47 4e 20 4b 45 59 20 4c 50 20 65 69 OREIGN KEY LP ei
3280: 64 6c 69 73 74 28 46 41 29 20 52 50 0a 20 20 20 dlist(FA) RP.
3290: 20 20 20 20 20 20 20 52 45 46 45 52 45 4e 43 45 REFERENCE
32a0: 53 20 6e 6d 28 54 29 20 65 69 64 6c 69 73 74 5f S nm(T) eidlist_
32b0: 6f 70 74 28 54 41 29 20 72 65 66 61 72 67 73 28 opt(TA) refargs(
32c0: 52 29 20 64 65 66 65 72 5f 73 75 62 63 6c 61 75 R) defer_subclau
32d0: 73 65 5f 6f 70 74 28 44 29 2e 20 7b 0a 20 20 20 se_opt(D). {.
32e0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f sqlite3CreateFo
32f0: 72 65 69 67 6e 4b 65 79 28 70 50 61 72 73 65 2c reignKey(pParse,
3300: 20 46 41 2c 20 26 54 2c 20 54 41 2c 20 52 29 3b FA, &T, TA, R);
3310: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 66 65 . sqlite3Defe
3320: 72 46 6f 72 65 69 67 6e 4b 65 79 28 70 50 61 72 rForeignKey(pPar
3330: 73 65 2c 20 44 29 3b 0a 7d 0a 25 74 79 70 65 20 se, D);.}.%type
3340: 64 65 66 65 72 5f 73 75 62 63 6c 61 75 73 65 5f defer_subclause_
3350: 6f 70 74 20 7b 69 6e 74 7d 0a 64 65 66 65 72 5f opt {int}.defer_
3360: 73 75 62 63 6c 61 75 73 65 5f 6f 70 74 28 41 29 subclause_opt(A)
3370: 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 ::= .
3380: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 {A = 0
3390: 3b 7d 0a 64 65 66 65 72 5f 73 75 62 63 6c 61 75 ;}.defer_subclau
33a0: 73 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 64 65 se_opt(A) ::= de
33b0: 66 65 72 5f 73 75 62 63 6c 61 75 73 65 28 41 29 fer_subclause(A)
33c0: 2e 0a 0a 2f 2f 20 54 68 65 20 66 6f 6c 6c 6f 77 ...// The follow
33d0: 69 6e 67 20 69 73 20 61 20 6e 6f 6e 2d 73 74 61 ing is a non-sta
33e0: 6e 64 61 72 64 20 65 78 74 65 6e 73 69 6f 6e 20 ndard extension
33f0: 74 68 61 74 20 61 6c 6c 6f 77 73 20 75 73 20 74 that allows us t
3400: 6f 20 64 65 63 6c 61 72 65 20 74 68 65 0a 2f 2f o declare the.//
3410: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f default behavio
3420: 72 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 r when there is
3430: 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 6e a constraint con
3440: 66 6c 69 63 74 2e 0a 2f 2f 0a 25 74 79 70 65 20 flict..//.%type
3450: 6f 6e 63 6f 6e 66 20 7b 69 6e 74 7d 0a 25 74 79 onconf {int}.%ty
3460: 70 65 20 6f 72 63 6f 6e 66 20 7b 69 6e 74 7d 0a pe orconf {int}.
3470: 25 74 79 70 65 20 72 65 73 6f 6c 76 65 74 79 70 %type resolvetyp
3480: 65 20 7b 69 6e 74 7d 0a 6f 6e 63 6f 6e 66 28 41 e {int}.onconf(A
3490: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 ) ::= .
34a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
34b0: 20 20 20 20 20 7b 41 20 3d 20 4f 45 5f 44 65 66 {A = OE_Def
34c0: 61 75 6c 74 3b 7d 0a 6f 6e 63 6f 6e 66 28 41 29 ault;}.onconf(A)
34d0: 20 3a 3a 3d 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 ::= ON CONFLICT
34e0: 20 72 65 73 6f 6c 76 65 74 79 70 65 28 58 29 2e resolvetype(X).
34f0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 6f 72 63 {A = X;}.orc
3500: 6f 6e 66 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 onf(A) ::= .
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3520: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f {A = O
3530: 45 5f 44 65 66 61 75 6c 74 3b 7d 0a 6f 72 63 6f E_Default;}.orco
3540: 6e 66 28 41 29 20 3a 3a 3d 20 4f 52 20 72 65 73 nf(A) ::= OR res
3550: 6f 6c 76 65 74 79 70 65 28 58 29 2e 20 20 20 20 olvetype(X).
3560: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b {A = X;
3570: 7d 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 }.resolvetype(A)
3580: 20 3a 3a 3d 20 72 61 69 73 65 74 79 70 65 28 41 ::= raisetype(A
3590: 29 2e 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 )..resolvetype(A
35a0: 29 20 3a 3a 3d 20 49 47 4e 4f 52 45 2e 20 20 20 ) ::= IGNORE.
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
35c0: 7b 41 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 7d {A = OE_Ignore;}
35d0: 0a 72 65 73 6f 6c 76 65 74 79 70 65 28 41 29 20 .resolvetype(A)
35e0: 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 20 ::= REPLACE.
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 {A
3600: 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 7d 0a = OE_Replace;}.
3610: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f .///////////////
3620: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 /////////// The
3630: 44 52 4f 50 20 54 41 42 4c 45 20 2f 2f 2f 2f 2f DROP TABLE /////
3640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
3650: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
3660: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 .//.cmd ::= DROP
3670: 20 54 41 42 4c 45 20 69 66 65 78 69 73 74 73 28 TABLE ifexists(
3680: 45 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 E) fullname(X).
3690: 7b 0a 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 {. sqlite3DropT
36a0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 58 2c 20 able(pParse, X,
36b0: 30 2c 20 45 29 3b 0a 7d 0a 25 74 79 70 65 20 69 0, E);.}.%type i
36c0: 66 65 78 69 73 74 73 20 7b 69 6e 74 7d 0a 69 66 fexists {int}.if
36d0: 65 78 69 73 74 73 28 41 29 20 3a 3a 3d 20 49 46 exists(A) ::= IF
36e0: 20 45 58 49 53 54 53 2e 20 20 20 7b 41 20 3d 20 EXISTS. {A =
36f0: 31 3b 7d 0a 69 66 65 78 69 73 74 73 28 41 29 20 1;}.ifexists(A)
3700: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 ::= .
3710: 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f {A = 0;}../////
3720: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
3730: 20 54 68 65 20 43 52 45 41 54 45 20 56 49 45 57 The CREATE VIEW
3740: 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f statement /////
3750: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
3760: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 6e ////////.//.%ifn
3770: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
3780: 56 49 45 57 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 VIEW.cmd ::= cre
3790: 61 74 65 6b 77 28 58 29 20 74 65 6d 70 28 54 29 atekw(X) temp(T)
37a0: 20 56 49 45 57 20 69 66 6e 6f 74 65 78 69 73 74 VIEW ifnotexist
37b0: 73 28 45 29 20 6e 6d 28 59 29 20 64 62 6e 6d 28 s(E) nm(Y) dbnm(
37c0: 5a 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28 43 Z) eidlist_opt(C
37d0: 29 0a 20 20 20 20 20 20 20 20 20 20 41 53 20 73 ). AS s
37e0: 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 71 elect(S). {. sq
37f0: 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28 lite3CreateView(
3800: 70 50 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 pParse, &X, &Y,
3810: 26 5a 2c 20 43 2c 20 53 2c 20 54 2c 20 45 29 3b &Z, C, S, T, E);
3820: 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 .}.cmd ::= DROP
3830: 56 49 45 57 20 69 66 65 78 69 73 74 73 28 45 29 VIEW ifexists(E)
3840: 20 66 75 6c 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a fullname(X). {.
3850: 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62 sqlite3DropTab
3860: 6c 65 28 70 50 61 72 73 65 2c 20 58 2c 20 31 2c le(pParse, X, 1,
3870: 20 45 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 E);.}.%endif S
3880: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a QLITE_OMIT_VIEW.
3890: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f .///////////////
38a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 53 45 ///////// The SE
38b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2f LECT statement /
38c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
38d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
38e0: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 73 65 6c 65 .//.cmd ::= sele
38f0: 63 74 28 58 29 2e 20 20 7b 0a 20 20 53 65 6c 65 ct(X). {. Sele
3900: 63 74 44 65 73 74 20 64 65 73 74 20 3d 20 7b 53 ctDest dest = {S
3910: 52 54 5f 4f 75 74 70 75 74 2c 20 30 2c 20 30 2c RT_Output, 0, 0,
3920: 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 73 71 6c 0, 0, 0};. sql
3930: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 ite3Select(pPars
3940: 65 2c 20 58 2c 20 26 64 65 73 74 29 3b 0a 20 20 e, X, &dest);.
3950: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c sqlite3SelectDel
3960: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 ete(pParse->db,
3970: 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73 65 6c X);.}..%type sel
3980: 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 64 ect {Select*}.%d
3990: 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65 63 74 estructor select
39a0: 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 {sqlite3SelectD
39b0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 elete(pParse->db
39c0: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 65 , $$);}.%type se
39d0: 6c 65 63 74 6e 6f 77 69 74 68 20 7b 53 65 6c 65 lectnowith {Sele
39e0: 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 ct*}.%destructor
39f0: 20 73 65 6c 65 63 74 6e 6f 77 69 74 68 20 7b 73 selectnowith {s
3a00: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 qlite3SelectDele
3a10: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 te(pParse->db, $
3a20: 24 29 3b 7d 0a 25 74 79 70 65 20 6f 6e 65 73 65 $);}.%type onese
3a30: 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a 25 lect {Select*}.%
3a40: 64 65 73 74 72 75 63 74 6f 72 20 6f 6e 65 73 65 destructor onese
3a50: 6c 65 63 74 20 7b 73 71 6c 69 74 65 33 53 65 6c lect {sqlite3Sel
3a60: 65 63 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 ectDelete(pParse
3a70: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a 25 69 6e ->db, $$);}..%in
3a80: 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 0a 20 20 2a clude {. /*. *
3a90: 2a 20 46 6f 72 20 61 20 63 6f 6d 70 6f 75 6e 64 * For a compound
3aa0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e SELECT statemen
3ab0: 74 2c 20 6d 61 6b 65 20 73 75 72 65 20 70 2d 3e t, make sure p->
3ac0: 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 3d 3d 70 pPrior->pNext==p
3ad0: 20 66 6f 72 0a 20 20 2a 2a 20 61 6c 6c 20 65 6c for. ** all el
3ae0: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 ements in the li
3af0: 73 74 2e 20 20 41 6e 64 20 6d 61 6b 65 20 73 75 st. And make su
3b00: 72 65 20 6c 69 73 74 20 6c 65 6e 67 74 68 20 64 re list length d
3b10: 6f 65 73 20 6e 6f 74 20 65 78 63 65 65 64 0a 20 oes not exceed.
3b20: 20 2a 2a 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 ** SQLITE_LIMIT
3b30: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 _COMPOUND_SELECT
3b40: 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 .. */. static
3b50: 76 6f 69 64 20 70 61 72 73 65 72 44 6f 75 62 6c void parserDoubl
3b60: 65 4c 69 6e 6b 53 65 6c 65 63 74 28 50 61 72 73 eLinkSelect(Pars
3b70: 65 20 2a 70 50 61 72 73 65 2c 20 53 65 6c 65 63 e *pParse, Selec
3b80: 74 20 2a 70 29 7b 0a 20 20 20 20 69 66 28 20 70 t *p){. if( p
3b90: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 ->pPrior ){.
3ba0: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 78 74 20 Select *pNext
3bb0: 3d 20 30 2c 20 2a 70 4c 6f 6f 70 3b 0a 20 20 20 = 0, *pLoop;.
3bc0: 20 20 20 69 6e 74 20 6d 78 53 65 6c 65 63 74 2c int mxSelect,
3bd0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 cnt = 0;.
3be0: 66 6f 72 28 70 4c 6f 6f 70 3d 70 3b 20 70 4c 6f for(pLoop=p; pLo
3bf0: 6f 70 3b 20 70 4e 65 78 74 3d 70 4c 6f 6f 70 2c op; pNext=pLoop,
3c00: 20 70 4c 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 50 pLoop=pLoop->pP
3c10: 72 69 6f 72 2c 20 63 6e 74 2b 2b 29 7b 0a 20 20 rior, cnt++){.
3c20: 20 20 20 20 20 20 70 4c 6f 6f 70 2d 3e 70 4e 65 pLoop->pNe
3c30: 78 74 20 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 xt = pNext;.
3c40: 20 20 20 20 70 4c 6f 6f 70 2d 3e 73 65 6c 46 6c pLoop->selFl
3c50: 61 67 73 20 7c 3d 20 53 46 5f 43 6f 6d 70 6f 75 ags |= SF_Compou
3c60: 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 nd;. }.
3c70: 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 if( (p->selFla
3c80: 67 73 20 26 20 53 46 5f 4d 75 6c 74 69 56 61 6c gs & SF_MultiVal
3c90: 75 65 29 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 ue)==0 && .
3ca0: 20 20 20 28 6d 78 53 65 6c 65 63 74 20 3d 20 70 (mxSelect = p
3cb0: 50 61 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 Parse->db->aLimi
3cc0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 t[SQLITE_LIMIT_C
3cd0: 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 29 OMPOUND_SELECT])
3ce0: 3e 30 20 26 26 0a 20 20 20 20 20 20 20 20 63 6e >0 &&. cn
3cf0: 74 3e 6d 78 53 65 6c 65 63 74 0a 20 20 20 20 20 t>mxSelect.
3d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
3d10: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 te3ErrorMsg(pPar
3d20: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 se, "too many te
3d30: 72 6d 73 20 69 6e 20 63 6f 6d 70 6f 75 6e 64 20 rms in compound
3d40: 53 45 4c 45 43 54 22 29 3b 0a 20 20 20 20 20 20 SELECT");.
3d50: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 }. }. }.}..s
3d60: 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 77 69 74 elect(A) ::= wit
3d70: 68 28 57 29 20 73 65 6c 65 63 74 6e 6f 77 69 74 h(W) selectnowit
3d80: 68 28 58 29 2e 20 7b 0a 20 20 53 65 6c 65 63 74 h(X). {. Select
3d90: 20 2a 70 20 3d 20 58 3b 0a 20 20 69 66 28 20 70 *p = X;. if( p
3da0: 20 29 7b 0a 20 20 20 20 70 2d 3e 70 57 69 74 68 ){. p->pWith
3db0: 20 3d 20 57 3b 0a 20 20 20 20 70 61 72 73 65 72 = W;. parser
3dc0: 44 6f 75 62 6c 65 4c 69 6e 6b 53 65 6c 65 63 74 DoubleLinkSelect
3dd0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d (pParse, p);. }
3de0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 else{. sqlite
3df0: 33 57 69 74 68 44 65 6c 65 74 65 28 70 50 61 72 3WithDelete(pPar
3e00: 73 65 2d 3e 64 62 2c 20 57 29 3b 0a 20 20 7d 0a se->db, W);. }.
3e10: 20 20 41 20 3d 20 70 3b 20 2f 2a 41 2d 6f 76 65 A = p; /*A-ove
3e20: 72 77 72 69 74 65 73 2d 57 2a 2f 0a 7d 0a 0a 73 rwrites-W*/.}..s
3e30: 65 6c 65 63 74 6e 6f 77 69 74 68 28 41 29 20 3a electnowith(A) :
3e40: 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28 41 29 2e := oneselect(A).
3e50: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .%ifndef SQLITE_
3e60: 4f 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 OMIT_COMPOUND_SE
3e70: 4c 45 43 54 0a 73 65 6c 65 63 74 6e 6f 77 69 74 LECT.selectnowit
3e80: 68 28 41 29 20 3a 3a 3d 20 73 65 6c 65 63 74 6e h(A) ::= selectn
3e90: 6f 77 69 74 68 28 41 29 20 6d 75 6c 74 69 73 65 owith(A) multise
3ea0: 6c 65 63 74 5f 6f 70 28 59 29 20 6f 6e 65 73 65 lect_op(Y) onese
3eb0: 6c 65 63 74 28 5a 29 2e 20 20 7b 0a 20 20 53 65 lect(Z). {. Se
3ec0: 6c 65 63 74 20 2a 70 52 68 73 20 3d 20 5a 3b 0a lect *pRhs = Z;.
3ed0: 20 20 53 65 6c 65 63 74 20 2a 70 4c 68 73 20 3d Select *pLhs =
3ee0: 20 41 3b 0a 20 20 69 66 28 20 70 52 68 73 20 26 A;. if( pRhs &
3ef0: 26 20 70 52 68 73 2d 3e 70 50 72 69 6f 72 20 29 & pRhs->pPrior )
3f00: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 {. SrcList *p
3f10: 46 72 6f 6d 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 From;. Token
3f20: 78 3b 0a 20 20 20 20 78 2e 6e 20 3d 20 30 3b 0a x;. x.n = 0;.
3f30: 20 20 20 20 70 61 72 73 65 72 44 6f 75 62 6c 65 parserDouble
3f40: 4c 69 6e 6b 53 65 6c 65 63 74 28 70 50 61 72 73 LinkSelect(pPars
3f50: 65 2c 20 70 52 68 73 29 3b 0a 20 20 20 20 70 46 e, pRhs);. pF
3f60: 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 53 72 63 rom = sqlite3Src
3f70: 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 ListAppendFromTe
3f80: 72 6d 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c rm(pParse,0,0,0,
3f90: 26 78 2c 70 52 68 73 2c 30 2c 30 29 3b 0a 20 20 &x,pRhs,0,0);.
3fa0: 20 20 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 pRhs = sqlite3
3fb0: 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 SelectNew(pParse
3fc0: 2c 30 2c 70 46 72 6f 6d 2c 30 2c 30 2c 30 2c 30 ,0,pFrom,0,0,0,0
3fd0: 2c 30 2c 30 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 ,0,0,0);. }. i
3fe0: 66 28 20 70 52 68 73 20 29 7b 0a 20 20 20 20 70 f( pRhs ){. p
3ff0: 52 68 73 2d 3e 6f 70 20 3d 20 28 75 38 29 59 3b Rhs->op = (u8)Y;
4000: 0a 20 20 20 20 70 52 68 73 2d 3e 70 50 72 69 6f . pRhs->pPrio
4010: 72 20 3d 20 70 4c 68 73 3b 0a 20 20 20 20 69 66 r = pLhs;. if
4020: 28 20 41 4c 57 41 59 53 28 70 4c 68 73 29 20 29 ( ALWAYS(pLhs) )
4030: 20 70 4c 68 73 2d 3e 73 65 6c 46 6c 61 67 73 20 pLhs->selFlags
4040: 26 3d 20 7e 53 46 5f 4d 75 6c 74 69 56 61 6c 75 &= ~SF_MultiValu
4050: 65 3b 0a 20 20 20 20 70 52 68 73 2d 3e 73 65 6c e;. pRhs->sel
4060: 46 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c Flags &= ~SF_Mul
4070: 74 69 56 61 6c 75 65 3b 0a 20 20 20 20 69 66 28 tiValue;. if(
4080: 20 59 21 3d 54 4b 5f 41 4c 4c 20 29 20 70 50 61 Y!=TK_ALL ) pPa
4090: 72 73 65 2d 3e 68 61 73 43 6f 6d 70 6f 75 6e 64 rse->hasCompound
40a0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 = 1;. }else{.
40b0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 sqlite3Select
40c0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 Delete(pParse->d
40d0: 62 2c 20 70 4c 68 73 29 3b 0a 20 20 7d 0a 20 20 b, pLhs);. }.
40e0: 41 20 3d 20 70 52 68 73 3b 0a 7d 0a 25 74 79 70 A = pRhs;.}.%typ
40f0: 65 20 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f 70 e multiselect_op
4100: 20 7b 69 6e 74 7d 0a 6d 75 6c 74 69 73 65 6c 65 {int}.multisele
4110: 63 74 5f 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 ct_op(A) ::= UNI
4120: 4f 4e 28 4f 50 29 2e 20 20 20 20 20 20 20 20 20 ON(OP).
4130: 20 20 20 20 7b 41 20 3d 20 40 4f 50 3b 20 2f 2a {A = @OP; /*
4140: 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 4f 50 2a A-overwrites-OP*
4150: 2f 7d 0a 6d 75 6c 74 69 73 65 6c 65 63 74 5f 6f /}.multiselect_o
4160: 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f 4e 20 41 p(A) ::= UNION A
4170: 4c 4c 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 LL.
4180: 7b 41 20 3d 20 54 4b 5f 41 4c 4c 3b 7d 0a 6d 75 {A = TK_ALL;}.mu
4190: 6c 74 69 73 65 6c 65 63 74 5f 6f 70 28 41 29 20 ltiselect_op(A)
41a0: 3a 3a 3d 20 45 58 43 45 50 54 7c 49 4e 54 45 52 ::= EXCEPT|INTER
41b0: 53 45 43 54 28 4f 50 29 2e 20 20 7b 41 20 3d 20 SECT(OP). {A =
41c0: 40 4f 50 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 @OP; /*A-overwri
41d0: 74 65 73 2d 4f 50 2a 2f 7d 0a 25 65 6e 64 69 66 tes-OP*/}.%endif
41e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d SQLITE_OMIT_COM
41f0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 0a 6f 6e 65 POUND_SELECT.one
4200: 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 53 45 select(A) ::= SE
4210: 4c 45 43 54 28 53 29 20 64 69 73 74 69 6e 63 74 LECT(S) distinct
4220: 28 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57 (D) selcollist(W
4230: 29 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65 5f ) from(X) where_
4240: 6f 70 74 28 59 29 0a 20 20 20 20 20 20 20 20 20 opt(Y).
4250: 20 20 20 20 20 20 20 20 67 72 6f 75 70 62 79 5f groupby_
4260: 6f 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f 70 opt(P) having_op
4270: 74 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 t(Q) orderby_opt
4280: 28 5a 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 (Z) limit_opt(L)
4290: 2e 20 7b 0a 23 69 66 20 53 45 4c 45 43 54 54 52 . {.#if SELECTTR
42a0: 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 54 6f ACE_ENABLED. To
42b0: 6b 65 6e 20 73 20 3d 20 53 3b 20 2f 2a 41 2d 6f ken s = S; /*A-o
42c0: 76 65 72 77 72 69 74 65 73 2d 53 2a 2f 0a 23 65 verwrites-S*/.#e
42d0: 6e 64 69 66 0a 20 20 41 20 3d 20 73 71 6c 69 74 ndif. A = sqlit
42e0: 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 e3SelectNew(pPar
42f0: 73 65 2c 57 2c 58 2c 59 2c 50 2c 51 2c 5a 2c 44 se,W,X,Y,P,Q,Z,D
4300: 2c 4c 2e 70 4c 69 6d 69 74 2c 4c 2e 70 4f 66 66 ,L.pLimit,L.pOff
4310: 73 65 74 29 3b 0a 23 69 66 20 53 45 4c 45 43 54 set);.#if SELECT
4320: 54 52 41 43 45 5f 45 4e 41 42 4c 45 44 0a 20 20 TRACE_ENABLED.
4330: 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 /* Populate the
4340: 53 65 6c 65 63 74 2e 7a 53 65 6c 4e 61 6d 65 5b Select.zSelName[
4350: 5d 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 ] string that is
4360: 20 75 73 65 64 20 74 6f 20 68 65 6c 70 20 77 69 used to help wi
4370: 74 68 0a 20 20 2a 2a 20 71 75 65 72 79 20 70 6c th. ** query pl
4380: 61 6e 6e 65 72 20 64 65 62 75 67 67 69 6e 67 2c anner debugging,
4390: 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74 to differentiat
43a0: 65 20 62 65 74 77 65 65 6e 20 6d 75 6c 74 69 70 e between multip
43b0: 6c 65 20 53 65 6c 65 63 74 0a 20 20 2a 2a 20 6f le Select. ** o
43c0: 62 6a 65 63 74 73 20 69 6e 20 61 20 63 6f 6d 70 bjects in a comp
43d0: 6c 65 78 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a lex query.. **.
43e0: 20 20 2a 2a 20 49 66 20 74 68 65 20 53 45 4c 45 ** If the SELE
43f0: 43 54 20 6b 65 79 77 6f 72 64 20 69 73 20 69 6d CT keyword is im
4400: 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 mediately follow
4410: 65 64 20 62 79 20 61 20 43 2d 73 74 79 6c 65 20 ed by a C-style
4420: 63 6f 6d 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 comment. ** the
4430: 6e 20 65 78 74 72 61 63 74 20 74 68 65 20 66 69 n extract the fi
4440: 72 73 74 20 66 65 77 20 61 6c 70 68 61 6e 75 6d rst few alphanum
4450: 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73 20 eric characters
4460: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 61 74 from within that
4470: 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 74 6f . ** comment to
4480: 20 62 65 20 74 68 65 20 7a 53 65 6c 4e 61 6d 65 be the zSelName
4490: 20 76 61 6c 75 65 2e 20 20 4f 74 68 65 72 77 69 value. Otherwi
44a0: 73 65 2c 20 74 68 65 20 6c 61 62 65 6c 20 69 73 se, the label is
44b0: 20 23 4e 20 77 68 65 72 65 0a 20 20 2a 2a 20 69 #N where. ** i
44c0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 s an integer tha
44d0: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 t is incremented
44e0: 20 77 69 74 68 20 65 61 63 68 20 53 45 4c 45 43 with each SELEC
44f0: 54 20 73 74 61 74 65 6d 65 6e 74 20 73 65 65 6e T statement seen
4500: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 41 21 3d .. */. if( A!=
4510: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 0 ){. const c
4520: 68 61 72 20 2a 7a 20 3d 20 73 2e 7a 2b 36 3b 0a har *z = s.z+6;.
4530: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 int i;. s
4540: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
4550: 73 69 7a 65 6f 66 28 41 2d 3e 7a 53 65 6c 4e 61 sizeof(A->zSelNa
4560: 6d 65 29 2c 20 41 2d 3e 7a 53 65 6c 4e 61 6d 65 me), A->zSelName
4570: 2c 20 22 23 25 64 22 2c 0a 20 20 20 20 20 20 20 , "#%d",.
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 2b ++
4590: 70 50 61 72 73 65 2d 3e 6e 53 65 6c 65 63 74 29 pParse->nSelect)
45a0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 ;. while( z[0
45b0: 5d 3d 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 ]==' ' ) z++;.
45c0: 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 if( z[0]=='/'
45d0: 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a && z[1]=='*' ){.
45e0: 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 z += 2;.
45f0: 20 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 3d while( z[0]=
4600: 3d 27 20 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 =' ' ) z++;.
4610: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 for(i=0; sqlit
4620: 65 33 49 73 61 6c 6e 75 6d 28 7a 5b 69 5d 29 3b e3Isalnum(z[i]);
4630: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 73 71 i++){}. sq
4640: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 lite3_snprintf(s
4650: 69 7a 65 6f 66 28 41 2d 3e 7a 53 65 6c 4e 61 6d izeof(A->zSelNam
4660: 65 29 2c 20 41 2d 3e 7a 53 65 6c 4e 61 6d 65 2c e), A->zSelName,
4670: 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a "%.*s", i, z);.
4680: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 }. }.#endif
4690: 20 2f 2a 20 53 45 4c 45 43 54 52 41 43 45 5f 45 /* SELECTRACE_E
46a0: 4e 41 42 4c 45 44 20 2a 2f 0a 7d 0a 6f 6e 65 73 NABLED */.}.ones
46b0: 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 76 61 6c elect(A) ::= val
46c0: 75 65 73 28 41 29 2e 0a 0a 25 74 79 70 65 20 76 ues(A)...%type v
46d0: 61 6c 75 65 73 20 7b 53 65 6c 65 63 74 2a 7d 0a alues {Select*}.
46e0: 25 64 65 73 74 72 75 63 74 6f 72 20 76 61 6c 75 %destructor valu
46f0: 65 73 20 7b 73 71 6c 69 74 65 33 53 65 6c 65 63 es {sqlite3Selec
4700: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e tDelete(pParse->
4710: 64 62 2c 20 24 24 29 3b 7d 0a 76 61 6c 75 65 73 db, $$);}.values
4720: 28 41 29 20 3a 3a 3d 20 56 41 4c 55 45 53 20 4c (A) ::= VALUES L
4730: 50 20 6e 65 78 70 72 6c 69 73 74 28 58 29 20 52 P nexprlist(X) R
4740: 50 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 P. {. A = sqlit
4750: 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 61 72 e3SelectNew(pPar
4760: 73 65 2c 58 2c 30 2c 30 2c 30 2c 30 2c 30 2c 53 se,X,0,0,0,0,0,S
4770: 46 5f 56 61 6c 75 65 73 2c 30 2c 30 29 3b 0a 7d F_Values,0,0);.}
4780: 0a 76 61 6c 75 65 73 28 41 29 20 3a 3a 3d 20 76 .values(A) ::= v
4790: 61 6c 75 65 73 28 41 29 20 43 4f 4d 4d 41 20 4c alues(A) COMMA L
47a0: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 P exprlist(Y) RP
47b0: 2e 20 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 52 . {. Select *pR
47c0: 69 67 68 74 2c 20 2a 70 4c 65 66 74 20 3d 20 41 ight, *pLeft = A
47d0: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 73 71 6c ;. pRight = sql
47e0: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 70 50 ite3SelectNew(pP
47f0: 61 72 73 65 2c 59 2c 30 2c 30 2c 30 2c 30 2c 30 arse,Y,0,0,0,0,0
4800: 2c 53 46 5f 56 61 6c 75 65 73 7c 53 46 5f 4d 75 ,SF_Values|SF_Mu
4810: 6c 74 69 56 61 6c 75 65 2c 30 2c 30 29 3b 0a 20 ltiValue,0,0);.
4820: 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 65 66 if( ALWAYS(pLef
4830: 74 29 20 29 20 70 4c 65 66 74 2d 3e 73 65 6c 46 t) ) pLeft->selF
4840: 6c 61 67 73 20 26 3d 20 7e 53 46 5f 4d 75 6c 74 lags &= ~SF_Mult
4850: 69 56 61 6c 75 65 3b 0a 20 20 69 66 28 20 70 52 iValue;. if( pR
4860: 69 67 68 74 20 29 7b 0a 20 20 20 20 70 52 69 67 ight ){. pRig
4870: 68 74 2d 3e 6f 70 20 3d 20 54 4b 5f 41 4c 4c 3b ht->op = TK_ALL;
4880: 0a 20 20 20 20 70 52 69 67 68 74 2d 3e 70 50 72 . pRight->pPr
4890: 69 6f 72 20 3d 20 70 4c 65 66 74 3b 0a 20 20 20 ior = pLeft;.
48a0: 20 41 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 7d A = pRight;. }
48b0: 65 6c 73 65 7b 0a 20 20 20 20 41 20 3d 20 70 4c else{. A = pL
48c0: 65 66 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 54 eft;. }.}..// T
48d0: 68 65 20 22 64 69 73 74 69 6e 63 74 22 20 6e 6f he "distinct" no
48e0: 6e 74 65 72 6d 69 6e 61 6c 20 69 73 20 74 72 75 nterminal is tru
48f0: 65 20 28 31 29 20 69 66 20 74 68 65 20 44 49 53 e (1) if the DIS
4900: 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 20 69 73 TINCT keyword is
4910: 0a 2f 2f 20 70 72 65 73 65 6e 74 20 61 6e 64 20 .// present and
4920: 66 61 6c 73 65 20 28 30 29 20 69 66 20 69 74 20 false (0) if it
4930: 69 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 79 70 65 is not..//.%type
4940: 20 64 69 73 74 69 6e 63 74 20 7b 69 6e 74 7d 0a distinct {int}.
4950: 64 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 distinct(A) ::=
4960: 44 49 53 54 49 4e 43 54 2e 20 20 20 7b 41 20 3d DISTINCT. {A =
4970: 20 53 46 5f 44 69 73 74 69 6e 63 74 3b 7d 0a 64 SF_Distinct;}.d
4980: 69 73 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 41 istinct(A) ::= A
4990: 4c 4c 2e 20 20 20 20 20 20 20 20 7b 41 20 3d 20 LL. {A =
49a0: 53 46 5f 41 6c 6c 3b 7d 0a 64 69 73 74 69 6e 63 SF_All;}.distinc
49b0: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 t(A) ::= .
49c0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 2f {A = 0;}../
49d0: 2f 20 73 65 6c 63 6f 6c 6c 69 73 74 20 69 73 20 / selcollist is
49e0: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 a list of expres
49f0: 73 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20 74 sions that are t
4a00: 6f 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 o become the ret
4a10: 75 72 6e 0a 2f 2f 20 76 61 6c 75 65 73 20 6f 66 urn.// values of
4a20: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 the SELECT stat
4a30: 65 6d 65 6e 74 2e 20 20 54 68 65 20 22 2a 22 20 ement. The "*"
4a40: 69 6e 20 73 74 61 74 65 6d 65 6e 74 73 20 6c 69 in statements li
4a50: 6b 65 0a 2f 2f 20 22 53 45 4c 45 43 54 20 2a 20 ke.// "SELECT *
4a60: 46 52 4f 4d 20 2e 2e 2e 22 20 69 73 20 65 6e 63 FROM ..." is enc
4a70: 6f 64 65 64 20 61 73 20 61 20 73 70 65 63 69 61 oded as a specia
4a80: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 l expression wit
4a90: 68 20 61 6e 0a 2f 2f 20 6f 70 63 6f 64 65 20 6f h an.// opcode o
4aa0: 66 20 54 4b 5f 41 53 54 45 52 49 53 4b 2e 0a 2f f TK_ASTERISK../
4ab0: 2f 0a 25 74 79 70 65 20 73 65 6c 63 6f 6c 6c 69 /.%type selcolli
4ac0: 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 st {ExprList*}.%
4ad0: 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 63 6f destructor selco
4ae0: 6c 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 llist {sqlite3Ex
4af0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 prListDelete(pPa
4b00: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 rse->db, $$);}.%
4b10: 74 79 70 65 20 73 63 6c 70 20 7b 45 78 70 72 4c type sclp {ExprL
4b20: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f ist*}.%destructo
4b30: 72 20 73 63 6c 70 20 7b 73 71 6c 69 74 65 33 45 r sclp {sqlite3E
4b40: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 xprListDelete(pP
4b50: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a arse->db, $$);}.
4b60: 73 63 6c 70 28 41 29 20 3a 3a 3d 20 73 65 6c 63 sclp(A) ::= selc
4b70: 6f 6c 6c 69 73 74 28 41 29 20 43 4f 4d 4d 41 2e ollist(A) COMMA.
4b80: 0a 73 63 6c 70 28 41 29 20 3a 3a 3d 20 2e 20 20 .sclp(A) ::= .
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 {A
4bb0: 20 3d 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 = 0;}.selcollis
4bc0: 74 28 41 29 20 3a 3a 3d 20 73 63 6c 70 28 41 29 t(A) ::= sclp(A)
4bd0: 20 65 78 70 72 28 58 29 20 61 73 28 59 29 2e 20 expr(X) as(Y).
4be0: 20 20 20 20 7b 0a 20 20 20 41 20 3d 20 73 71 6c {. A = sql
4bf0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 ite3ExprListAppe
4c00: 6e 64 28 70 50 61 72 73 65 2c 20 41 2c 20 58 2e nd(pParse, A, X.
4c10: 70 45 78 70 72 29 3b 0a 20 20 20 69 66 28 20 59 pExpr);. if( Y
4c20: 2e 6e 3e 30 20 29 20 73 71 6c 69 74 65 33 45 78 .n>0 ) sqlite3Ex
4c30: 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 70 50 prListSetName(pP
4c40: 61 72 73 65 2c 20 41 2c 20 26 59 2c 20 31 29 3b arse, A, &Y, 1);
4c50: 0a 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c . sqlite3ExprL
4c60: 69 73 74 53 65 74 53 70 61 6e 28 70 50 61 72 73 istSetSpan(pPars
4c70: 65 2c 41 2c 26 58 29 3b 0a 7d 0a 73 65 6c 63 6f e,A,&X);.}.selco
4c80: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c llist(A) ::= scl
4c90: 70 28 41 29 20 53 54 41 52 2e 20 7b 0a 20 20 45 p(A) STAR. {. E
4ca0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 xpr *p = sqlite3
4cb0: 45 78 70 72 28 70 50 61 72 73 65 2d 3e 64 62 2c Expr(pParse->db,
4cc0: 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 29 TK_ASTERISK, 0)
4cd0: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 ;. A = sqlite3E
4ce0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 xprListAppend(pP
4cf0: 61 72 73 65 2c 20 41 2c 20 70 29 3b 0a 7d 0a 73 arse, A, p);.}.s
4d00: 65 6c 63 6f 6c 6c 69 73 74 28 41 29 20 3a 3a 3d elcollist(A) ::=
4d10: 20 73 63 6c 70 28 41 29 20 6e 6d 28 58 29 20 44 sclp(A) nm(X) D
4d20: 4f 54 20 53 54 41 52 2e 20 7b 0a 20 20 45 78 70 OT STAR. {. Exp
4d30: 72 20 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 r *pRight = sqli
4d40: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c te3PExpr(pParse,
4d50: 20 54 4b 5f 41 53 54 45 52 49 53 4b 2c 20 30 2c TK_ASTERISK, 0,
4d60: 20 30 29 3b 0a 20 20 45 78 70 72 20 2a 70 4c 65 0);. Expr *pLe
4d70: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 ft = sqlite3Expr
4d80: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 Alloc(pParse->db
4d90: 2c 20 54 4b 5f 49 44 2c 20 26 58 2c 20 31 29 3b , TK_ID, &X, 1);
4da0: 0a 20 20 45 78 70 72 20 2a 70 44 6f 74 20 3d 20 . Expr *pDot =
4db0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 sqlite3PExpr(pPa
4dc0: 72 73 65 2c 20 54 4b 5f 44 4f 54 2c 20 70 4c 65 rse, TK_DOT, pLe
4dd0: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 41 ft, pRight);. A
4de0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 = sqlite3ExprLi
4df0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c stAppend(pParse,
4e00: 41 2c 20 70 44 6f 74 29 3b 0a 7d 0a 0a 2f 2f 20 A, pDot);.}..//
4e10: 41 6e 20 6f 70 74 69 6f 6e 20 22 41 53 20 3c 69 An option "AS <i
4e20: 64 3e 22 20 70 68 72 61 73 65 20 74 68 61 74 20 d>" phrase that
4e30: 63 61 6e 20 66 6f 6c 6c 6f 77 20 6f 6e 65 20 6f can follow one o
4e40: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e f the expression
4e50: 73 20 74 68 61 74 0a 2f 2f 20 64 65 66 69 6e 65 s that.// define
4e60: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c the result set,
4e70: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 or one of the t
4e80: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f ables in the FRO
4e90: 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f 0a 25 74 79 M clause..//.%ty
4ea0: 70 65 20 61 73 20 7b 54 6f 6b 65 6e 7d 0a 61 73 pe as {Token}.as
4eb0: 28 58 29 20 3a 3a 3d 20 41 53 20 6e 6d 28 59 29 (X) ::= AS nm(Y)
4ec0: 2e 20 20 20 20 7b 58 20 3d 20 59 3b 7d 0a 61 73 . {X = Y;}.as
4ed0: 28 58 29 20 3a 3a 3d 20 69 64 73 28 58 29 2e 0a (X) ::= ids(X)..
4ee0: 61 73 28 58 29 20 3a 3a 3d 20 2e 20 20 20 20 20 as(X) ::= .
4ef0: 20 20 20 20 20 20 20 7b 58 2e 6e 20 3d 20 30 3b {X.n = 0;
4f00: 20 58 2e 7a 20 3d 20 30 3b 7d 0a 0a 0a 25 74 79 X.z = 0;}...%ty
4f10: 70 65 20 73 65 6c 74 61 62 6c 69 73 74 20 7b 53 pe seltablist {S
4f20: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 rcList*}.%destru
4f30: 63 74 6f 72 20 73 65 6c 74 61 62 6c 69 73 74 20 ctor seltablist
4f40: 7b 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 {sqlite3SrcListD
4f50: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 elete(pParse->db
4f60: 2c 20 24 24 29 3b 7d 0a 25 74 79 70 65 20 73 74 , $$);}.%type st
4f70: 6c 5f 70 72 65 66 69 78 20 7b 53 72 63 4c 69 73 l_prefix {SrcLis
4f80: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 t*}.%destructor
4f90: 73 74 6c 5f 70 72 65 66 69 78 20 7b 73 71 6c 69 stl_prefix {sqli
4fa0: 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 te3SrcListDelete
4fb0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 (pParse->db, $$)
4fc0: 3b 7d 0a 25 74 79 70 65 20 66 72 6f 6d 20 7b 53 ;}.%type from {S
4fd0: 72 63 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 rcList*}.%destru
4fe0: 63 74 6f 72 20 66 72 6f 6d 20 7b 73 71 6c 69 74 ctor from {sqlit
4ff0: 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 e3SrcListDelete(
5000: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b pParse->db, $$);
5010: 7d 0a 0a 2f 2f 20 41 20 63 6f 6d 70 6c 65 74 65 }..// A complete
5020: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 2f 2f FROM clause..//
5030: 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 2e 20 20 .from(A) ::= .
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 {A
5050: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c = sqlite3DbMall
5060: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 ocZero(pParse->d
5070: 62 2c 20 73 69 7a 65 6f 66 28 2a 41 29 29 3b 7d b, sizeof(*A));}
5080: 0a 66 72 6f 6d 28 41 29 20 3a 3a 3d 20 46 52 4f .from(A) ::= FRO
5090: 4d 20 73 65 6c 74 61 62 6c 69 73 74 28 58 29 2e M seltablist(X).
50a0: 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20 20 73 71 {. A = X;. sq
50b0: 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 lite3SrcListShif
50c0: 74 4a 6f 69 6e 54 79 70 65 28 41 29 3b 0a 7d 0a tJoinType(A);.}.
50d0: 0a 2f 2f 20 22 73 65 6c 74 61 62 6c 69 73 74 22 .// "seltablist"
50e0: 20 69 73 20 61 20 22 53 65 6c 65 63 74 20 54 61 is a "Select Ta
50f0: 62 6c 65 20 4c 69 73 74 22 20 2d 20 74 68 65 20 ble List" - the
5100: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 46 content of the F
5110: 52 4f 4d 20 63 6c 61 75 73 65 0a 2f 2f 20 69 6e ROM clause.// in
5120: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d a SELECT statem
5130: 65 6e 74 2e 20 20 22 73 74 6c 5f 70 72 65 66 69 ent. "stl_prefi
5140: 78 22 20 69 73 20 61 20 70 72 65 66 69 78 20 6f x" is a prefix o
5150: 66 20 74 68 69 73 20 6c 69 73 74 2e 0a 2f 2f 0a f this list..//.
5160: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 3a 3a stl_prefix(A) ::
5170: 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 = seltablist(A)
5180: 6a 6f 69 6e 6f 70 28 59 29 2e 20 20 20 20 7b 0a joinop(Y). {.
5190: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 41 20 if( ALWAYS(A
51a0: 26 26 20 41 2d 3e 6e 53 72 63 3e 30 29 20 29 20 && A->nSrc>0) )
51b0: 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d 31 5d 2e A->a[A->nSrc-1].
51c0: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 28 75 fg.jointype = (u
51d0: 38 29 59 3b 0a 7d 0a 73 74 6c 5f 70 72 65 66 69 8)Y;.}.stl_prefi
51e0: 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 x(A) ::= .
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5200: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 {A = 0;}.se
5210: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 ltablist(A) ::=
5220: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 6e 6d stl_prefix(A) nm
5230: 28 59 29 20 64 62 6e 6d 28 44 29 20 61 73 28 5a (Y) dbnm(D) as(Z
5240: 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 ) indexed_opt(I)
5250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
5260: 20 20 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 on_opt(N) usi
5270: 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 41 ng_opt(U). {. A
5280: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 = sqlite3SrcLis
5290: 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 tAppendFromTerm(
52a0: 70 50 61 72 73 65 2c 41 2c 26 59 2c 26 44 2c 26 pParse,A,&Y,&D,&
52b0: 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 20 73 71 6c 69 Z,0,N,U);. sqli
52c0: 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65 te3SrcListIndexe
52d0: 64 42 79 28 70 50 61 72 73 65 2c 20 41 2c 20 26 dBy(pParse, A, &
52e0: 49 29 3b 0a 7d 0a 73 65 6c 74 61 62 6c 69 73 74 I);.}.seltablist
52f0: 28 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 (A) ::= stl_pref
5300: 69 78 28 41 29 20 6e 6d 28 59 29 20 64 62 6e 6d ix(A) nm(Y) dbnm
5310: 28 44 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28 (D) LP exprlist(
5320: 45 29 20 52 50 20 61 73 28 5a 29 0a 20 20 20 20 E) RP as(Z).
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e on
5340: 5f 6f 70 74 28 4e 29 20 75 73 69 6e 67 5f 6f 70 _opt(N) using_op
5350: 74 28 55 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 t(U). {. A = sq
5360: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 lite3SrcListAppe
5370: 6e 64 46 72 6f 6d 54 65 72 6d 28 70 50 61 72 73 ndFromTerm(pPars
5380: 65 2c 41 2c 26 59 2c 26 44 2c 26 5a 2c 30 2c 4e e,A,&Y,&D,&Z,0,N
5390: 2c 55 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 ,U);. sqlite3Sr
53a0: 63 4c 69 73 74 46 75 6e 63 41 72 67 73 28 70 50 cListFuncArgs(pP
53b0: 61 72 73 65 2c 20 41 2c 20 45 29 3b 0a 7d 0a 25 arse, A, E);.}.%
53c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
53d0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 73 65 IT_SUBQUERY. se
53e0: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 ltablist(A) ::=
53f0: 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 4c 50 stl_prefix(A) LP
5400: 20 73 65 6c 65 63 74 28 53 29 20 52 50 0a 20 20 select(S) RP.
5410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5420: 20 20 61 73 28 5a 29 20 6f 6e 5f 6f 70 74 28 4e as(Z) on_opt(N
5430: 29 20 75 73 69 6e 67 5f 6f 70 74 28 55 29 2e 20 ) using_opt(U).
5440: 7b 0a 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 {. A = sqlite
5450: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 3SrcListAppendFr
5460: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c omTerm(pParse,A,
5470: 30 2c 30 2c 26 5a 2c 53 2c 4e 2c 55 29 3b 0a 20 0,0,&Z,S,N,U);.
5480: 20 7d 0a 20 20 73 65 6c 74 61 62 6c 69 73 74 28 }. seltablist(
5490: 41 29 20 3a 3a 3d 20 73 74 6c 5f 70 72 65 66 69 A) ::= stl_prefi
54a0: 78 28 41 29 20 4c 50 20 73 65 6c 74 61 62 6c 69 x(A) LP seltabli
54b0: 73 74 28 46 29 20 52 50 0a 20 20 20 20 20 20 20 st(F) RP.
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 28 as(
54d0: 5a 29 20 6f 6e 5f 6f 70 74 28 4e 29 20 75 73 69 Z) on_opt(N) usi
54e0: 6e 67 5f 6f 70 74 28 55 29 2e 20 7b 0a 20 20 20 ng_opt(U). {.
54f0: 20 69 66 28 20 41 3d 3d 30 20 26 26 20 5a 2e 6e if( A==0 && Z.n
5500: 3d 3d 30 20 26 26 20 4e 3d 3d 30 20 26 26 20 55 ==0 && N==0 && U
5510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 41 20 3d ==0 ){. A =
5520: 20 46 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 F;. }else if
5530: 28 20 46 2d 3e 6e 53 72 63 3d 3d 31 20 29 7b 0a ( F->nSrc==1 ){.
5540: 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 A = sqlite
5550: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 3SrcListAppendFr
5560: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c omTerm(pParse,A,
5570: 30 2c 30 2c 26 5a 2c 30 2c 4e 2c 55 29 3b 0a 20 0,0,&Z,0,N,U);.
5580: 20 20 20 20 20 69 66 28 20 41 20 29 7b 0a 20 20 if( A ){.
5590: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 struct Src
55a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 20 List_item *pNew
55b0: 3d 20 26 41 2d 3e 61 5b 41 2d 3e 6e 53 72 63 2d = &A->a[A->nSrc-
55c0: 31 5d 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 1];. stru
55d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 ct SrcList_item
55e0: 2a 70 4f 6c 64 20 3d 20 46 2d 3e 61 3b 0a 20 20 *pOld = F->a;.
55f0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d pNew->zNam
5600: 65 20 3d 20 70 4f 6c 64 2d 3e 7a 4e 61 6d 65 3b e = pOld->zName;
5610: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 7a . pNew->z
5620: 44 61 74 61 62 61 73 65 20 3d 20 70 4f 6c 64 2d Database = pOld-
5630: 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 20 20 >zDatabase;.
5640: 20 20 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 pNew->pSelec
5650: 74 20 3d 20 70 4f 6c 64 2d 3e 70 53 65 6c 65 63 t = pOld->pSelec
5660: 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 6c 64 2d t;. pOld-
5670: 3e 7a 4e 61 6d 65 20 3d 20 70 4f 6c 64 2d 3e 7a >zName = pOld->z
5680: 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 Database = 0;.
5690: 20 20 20 20 20 20 70 4f 6c 64 2d 3e 70 53 65 6c pOld->pSel
56a0: 65 63 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d ect = 0;. }
56b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 . sqlite3Sr
56c0: 63 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 cListDelete(pPar
56d0: 73 65 2d 3e 64 62 2c 20 46 29 3b 0a 20 20 20 20 se->db, F);.
56e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 65 6c }else{. Sel
56f0: 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 3b 0a ect *pSubquery;.
5700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 sqlite3Src
5710: 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 ListShiftJoinTyp
5720: 65 28 46 29 3b 0a 20 20 20 20 20 20 70 53 75 62 e(F);. pSub
5730: 71 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 53 query = sqlite3S
5740: 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c electNew(pParse,
5750: 30 2c 46 2c 30 2c 30 2c 30 2c 30 2c 53 46 5f 4e 0,F,0,0,0,0,SF_N
5760: 65 73 74 65 64 46 72 6f 6d 2c 30 2c 30 29 3b 0a estedFrom,0,0);.
5770: 20 20 20 20 20 20 41 20 3d 20 73 71 6c 69 74 65 A = sqlite
5780: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72 3SrcListAppendFr
5790: 6f 6d 54 65 72 6d 28 70 50 61 72 73 65 2c 41 2c omTerm(pParse,A,
57a0: 30 2c 30 2c 26 5a 2c 70 53 75 62 71 75 65 72 79 0,0,&Z,pSubquery
57b0: 2c 4e 2c 55 29 3b 0a 20 20 20 20 7d 0a 20 20 7d ,N,U);. }. }
57c0: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f .%endif SQLITE_
57d0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 0a 25 OMIT_SUBQUERY..%
57e0: 74 79 70 65 20 64 62 6e 6d 20 7b 54 6f 6b 65 6e type dbnm {Token
57f0: 7d 0a 64 62 6e 6d 28 41 29 20 3a 3a 3d 20 2e 20 }.dbnm(A) ::= .
5800: 20 20 20 20 20 20 20 20 20 7b 41 2e 7a 3d 30 3b {A.z=0;
5810: 20 41 2e 6e 3d 30 3b 7d 0a 64 62 6e 6d 28 41 29 A.n=0;}.dbnm(A)
5820: 20 3a 3a 3d 20 44 4f 54 20 6e 6d 28 58 29 2e 20 ::= DOT nm(X).
5830: 7b 41 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 {A = X;}..%type
5840: 66 75 6c 6c 6e 61 6d 65 20 7b 53 72 63 4c 69 73 fullname {SrcLis
5850: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 t*}.%destructor
5860: 66 75 6c 6c 6e 61 6d 65 20 7b 73 71 6c 69 74 65 fullname {sqlite
5870: 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 70 3SrcListDelete(p
5880: 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d Parse->db, $$);}
5890: 0a 66 75 6c 6c 6e 61 6d 65 28 41 29 20 3a 3a 3d .fullname(A) ::=
58a0: 20 6e 6d 28 58 29 20 64 62 6e 6d 28 59 29 2e 20 nm(X) dbnm(Y).
58b0: 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 . {A = sqlite
58c0: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 3SrcListAppend(p
58d0: 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 58 2c 26 Parse->db,0,&X,&
58e0: 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 Y); /*A-overwrit
58f0: 65 73 2d 58 2a 2f 7d 0a 0a 25 74 79 70 65 20 6a es-X*/}..%type j
5900: 6f 69 6e 6f 70 20 7b 69 6e 74 7d 0a 6a 6f 69 6e oinop {int}.join
5910: 6f 70 28 58 29 20 3a 3a 3d 20 43 4f 4d 4d 41 7c op(X) ::= COMMA|
5920: 4a 4f 49 4e 2e 20 20 20 20 20 20 20 20 20 20 20 JOIN.
5930: 20 20 20 7b 20 58 20 3d 20 4a 54 5f 49 4e 4e 45 { X = JT_INNE
5940: 52 3b 20 7d 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a R; }.joinop(X) :
5950: 3a 3d 20 4a 4f 49 4e 5f 4b 57 28 41 29 20 4a 4f := JOIN_KW(A) JO
5960: 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 IN..
5970: 20 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69 74 {X = sqlit
5980: 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 73 e3JoinType(pPars
5990: 65 2c 26 41 2c 30 2c 30 29 3b 20 20 2f 2a 58 2d e,&A,0,0); /*X-
59a0: 6f 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d 0a overwrites-A*/}.
59b0: 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a 4f joinop(X) ::= JO
59c0: 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 4a IN_KW(A) nm(B) J
59d0: 4f 49 4e 2e 0a 20 20 20 20 20 20 20 20 20 20 20 OIN..
59e0: 20 20 20 20 20 20 20 7b 58 20 3d 20 73 71 6c 69 {X = sqli
59f0: 74 65 33 4a 6f 69 6e 54 79 70 65 28 70 50 61 72 te3JoinType(pPar
5a00: 73 65 2c 26 41 2c 26 42 2c 30 29 3b 20 2f 2a 58 se,&A,&B,0); /*X
5a10: 2d 6f 76 65 72 77 72 69 74 65 73 2d 41 2a 2f 7d -overwrites-A*/}
5a20: 0a 6a 6f 69 6e 6f 70 28 58 29 20 3a 3a 3d 20 4a .joinop(X) ::= J
5a30: 4f 49 4e 5f 4b 57 28 41 29 20 6e 6d 28 42 29 20 OIN_KW(A) nm(B)
5a40: 6e 6d 28 43 29 20 4a 4f 49 4e 2e 0a 20 20 20 20 nm(C) JOIN..
5a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 58 {X
5a60: 20 3d 20 73 71 6c 69 74 65 33 4a 6f 69 6e 54 79 = sqlite3JoinTy
5a70: 70 65 28 70 50 61 72 73 65 2c 26 41 2c 26 42 2c pe(pParse,&A,&B,
5a80: 26 43 29 3b 2f 2a 58 2d 6f 76 65 72 77 72 69 74 &C);/*X-overwrit
5a90: 65 73 2d 41 2a 2f 7d 0a 0a 25 74 79 70 65 20 6f es-A*/}..%type o
5aa0: 6e 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 n_opt {Expr*}.%d
5ab0: 65 73 74 72 75 63 74 6f 72 20 6f 6e 5f 6f 70 74 estructor on_opt
5ac0: 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c {sqlite3ExprDel
5ad0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 ete(pParse->db,
5ae0: 24 24 29 3b 7d 0a 6f 6e 5f 6f 70 74 28 4e 29 20 $$);}.on_opt(N)
5af0: 3a 3a 3d 20 4f 4e 20 65 78 70 72 28 45 29 2e 20 ::= ON expr(E).
5b00: 20 20 7b 4e 20 3d 20 45 2e 70 45 78 70 72 3b 7d {N = E.pExpr;}
5b10: 0a 6f 6e 5f 6f 70 74 28 4e 29 20 3a 3a 3d 20 2e .on_opt(N) ::= .
5b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 4e 20 {N
5b30: 3d 20 30 3b 7d 0a 0a 2f 2f 20 4e 6f 74 65 20 74 = 0;}..// Note t
5b40: 68 61 74 20 74 68 69 73 20 62 6c 6f 63 6b 20 61 hat this block a
5b50: 62 75 73 65 73 20 74 68 65 20 54 6f 6b 65 6e 20 buses the Token
5b60: 74 79 70 65 20 6a 75 73 74 20 61 20 6c 69 74 74 type just a litt
5b70: 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a le. If there is.
5b80: 2f 2f 20 6e 6f 20 22 49 4e 44 45 58 45 44 20 42 // no "INDEXED B
5b90: 59 22 20 63 6c 61 75 73 65 2c 20 74 68 65 20 72 Y" clause, the r
5ba0: 65 74 75 72 6e 65 64 20 74 6f 6b 65 6e 20 69 73 eturned token is
5bb0: 20 65 6d 70 74 79 20 28 7a 3d 3d 30 20 26 26 20 empty (z==0 &&
5bc0: 6e 3d 3d 30 29 2e 20 49 66 0a 2f 2f 20 74 68 65 n==0). If.// the
5bd0: 72 65 20 69 73 20 61 6e 20 49 4e 44 45 58 45 44 re is an INDEXED
5be0: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e BY clause, then
5bf0: 20 74 68 65 20 74 6f 6b 65 6e 20 69 73 20 70 6f the token is po
5c00: 70 75 6c 61 74 65 64 20 61 73 20 70 65 72 20 6e pulated as per n
5c10: 6f 72 6d 61 6c 2c 0a 2f 2f 20 77 69 74 68 20 7a ormal,.// with z
5c20: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 pointing to the
5c30: 20 74 6f 6b 65 6e 20 64 61 74 61 20 61 6e 64 20 token data and
5c40: 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 n containing the
5c50: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
5c60: 0a 2f 2f 20 69 6e 20 74 68 65 20 74 6f 6b 65 6e .// in the token
5c70: 2e 0a 2f 2f 0a 2f 2f 20 49 66 20 74 68 65 72 65 ..//.// If there
5c80: 20 69 73 20 61 20 22 4e 4f 54 20 49 4e 44 45 58 is a "NOT INDEX
5c90: 45 44 22 20 63 6c 61 75 73 65 2c 20 74 68 65 6e ED" clause, then
5ca0: 20 28 7a 3d 3d 30 20 26 26 20 6e 3d 3d 31 29 2c (z==0 && n==1),
5cb0: 20 77 68 69 63 68 20 69 73 20 0a 2f 2f 20 6e 6f which is .// no
5cc0: 72 6d 61 6c 6c 79 20 69 6c 6c 65 67 61 6c 2e 20 rmally illegal.
5cd0: 54 68 65 20 73 71 6c 69 74 65 33 53 72 63 4c 69 The sqlite3SrcLi
5ce0: 73 74 49 6e 64 65 78 65 64 42 79 28 29 20 66 75 stIndexedBy() fu
5cf0: 6e 63 74 69 6f 6e 20 0a 2f 2f 20 72 65 63 6f 67 nction .// recog
5d00: 6e 69 7a 65 73 20 61 6e 64 20 69 6e 74 65 72 70 nizes and interp
5d10: 72 65 74 73 20 74 68 69 73 20 61 73 20 61 20 73 rets this as a s
5d20: 70 65 63 69 61 6c 20 63 61 73 65 2e 0a 2f 2f 0a pecial case..//.
5d30: 25 74 79 70 65 20 69 6e 64 65 78 65 64 5f 6f 70 %type indexed_op
5d40: 74 20 7b 54 6f 6b 65 6e 7d 0a 69 6e 64 65 78 65 t {Token}.indexe
5d50: 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 d_opt(A) ::= .
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b {
5d70: 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 30 3b 7d 0a 69 A.z=0; A.n=0;}.i
5d80: 6e 64 65 78 65 64 5f 6f 70 74 28 41 29 20 3a 3a ndexed_opt(A) ::
5d90: 3d 20 49 4e 44 45 58 45 44 20 42 59 20 6e 6d 28 = INDEXED BY nm(
5da0: 58 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 64 X). {A = X;}.ind
5db0: 65 78 65 64 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 exed_opt(A) ::=
5dc0: 4e 4f 54 20 49 4e 44 45 58 45 44 2e 20 20 20 20 NOT INDEXED.
5dd0: 20 20 7b 41 2e 7a 3d 30 3b 20 41 2e 6e 3d 31 3b {A.z=0; A.n=1;
5de0: 7d 0a 0a 25 74 79 70 65 20 75 73 69 6e 67 5f 6f }..%type using_o
5df0: 70 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 pt {IdList*}.%de
5e00: 73 74 72 75 63 74 6f 72 20 75 73 69 6e 67 5f 6f structor using_o
5e10: 70 74 20 7b 73 71 6c 69 74 65 33 49 64 4c 69 73 pt {sqlite3IdLis
5e20: 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e tDelete(pParse->
5e30: 64 62 2c 20 24 24 29 3b 7d 0a 75 73 69 6e 67 5f db, $$);}.using_
5e40: 6f 70 74 28 55 29 20 3a 3a 3d 20 55 53 49 4e 47 opt(U) ::= USING
5e50: 20 4c 50 20 69 64 6c 69 73 74 28 4c 29 20 52 50 LP idlist(L) RP
5e60: 2e 20 20 7b 55 20 3d 20 4c 3b 7d 0a 75 73 69 6e . {U = L;}.usin
5e70: 67 5f 6f 70 74 28 55 29 20 3a 3a 3d 20 2e 20 20 g_opt(U) ::= .
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5e90: 20 20 20 20 20 20 7b 55 20 3d 20 30 3b 7d 0a 0a {U = 0;}..
5ea0: 0a 25 74 79 70 65 20 6f 72 64 65 72 62 79 5f 6f .%type orderby_o
5eb0: 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 pt {ExprList*}.%
5ec0: 64 65 73 74 72 75 63 74 6f 72 20 6f 72 64 65 72 destructor order
5ed0: 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 by_opt {sqlite3E
5ee0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 xprListDelete(pP
5ef0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a arse->db, $$);}.
5f00: 0a 2f 2f 20 74 68 65 20 73 6f 72 74 6c 69 73 74 .// the sortlist
5f10: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 74 non-terminal st
5f20: 6f 72 65 73 20 61 20 6c 69 73 74 20 6f 66 20 65 ores a list of e
5f30: 78 70 72 65 73 73 69 6f 6e 20 77 68 65 72 65 20 xpression where
5f40: 65 61 63 68 0a 2f 2f 20 65 78 70 72 65 73 73 69 each.// expressi
5f50: 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 6c 79 on is optionally
5f60: 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 41 53 43 followed by ASC
5f70: 20 6f 72 20 44 45 53 43 20 74 6f 20 69 6e 64 69 or DESC to indi
5f80: 63 61 74 65 20 74 68 65 0a 2f 2f 20 73 6f 72 74 cate the.// sort
5f90: 20 6f 72 64 65 72 2e 0a 2f 2f 0a 25 74 79 70 65 order..//.%type
5fa0: 20 73 6f 72 74 6c 69 73 74 20 7b 45 78 70 72 4c sortlist {ExprL
5fb0: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f ist*}.%destructo
5fc0: 72 20 73 6f 72 74 6c 69 73 74 20 7b 73 71 6c 69 r sortlist {sqli
5fd0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 te3ExprListDelet
5fe0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 e(pParse->db, $$
5ff0: 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70 74 );}..orderby_opt
6000: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 (A) ::= .
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6020: 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64 65 {A = 0;}.orde
6030: 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4f rby_opt(A) ::= O
6040: 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73 74 RDER BY sortlist
6050: 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 (X). {A = X
6060: 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a ;}.sortlist(A) :
6070: 3a 3d 20 73 6f 72 74 6c 69 73 74 28 41 29 20 43 := sortlist(A) C
6080: 4f 4d 4d 41 20 65 78 70 72 28 59 29 20 73 6f 72 OMMA expr(Y) sor
6090: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 torder(Z). {. A
60a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 = sqlite3ExprLi
60b0: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c stAppend(pParse,
60c0: 41 2c 59 2e 70 45 78 70 72 29 3b 0a 20 20 73 71 A,Y.pExpr);. sq
60d0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 lite3ExprListSet
60e0: 53 6f 72 74 4f 72 64 65 72 28 41 2c 5a 29 3b 0a SortOrder(A,Z);.
60f0: 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a }.sortlist(A) ::
6100: 3d 20 65 78 70 72 28 59 29 20 73 6f 72 74 6f 72 = expr(Y) sortor
6110: 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 der(Z). {. A =
6120: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 sqlite3ExprListA
6130: 70 70 65 6e 64 28 70 50 61 72 73 65 2c 30 2c 59 ppend(pParse,0,Y
6140: 2e 70 45 78 70 72 29 3b 20 2f 2a 41 2d 6f 76 65 .pExpr); /*A-ove
6150: 72 77 72 69 74 65 73 2d 59 2a 2f 0a 20 20 73 71 rwrites-Y*/. sq
6160: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 lite3ExprListSet
6170: 53 6f 72 74 4f 72 64 65 72 28 41 2c 5a 29 3b 0a SortOrder(A,Z);.
6180: 7d 0a 0a 25 74 79 70 65 20 73 6f 72 74 6f 72 64 }..%type sortord
6190: 65 72 20 7b 69 6e 74 7d 0a 0a 73 6f 72 74 6f 72 er {int}..sortor
61a0: 64 65 72 28 41 29 20 3a 3a 3d 20 41 53 43 2e 20 der(A) ::= ASC.
61b0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 53 {A = S
61c0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 3b 7d 0a 73 QLITE_SO_ASC;}.s
61d0: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 ortorder(A) ::=
61e0: 44 45 53 43 2e 20 20 20 20 20 20 20 20 20 20 7b DESC. {
61f0: 41 20 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 44 45 A = SQLITE_SO_DE
6200: 53 43 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 SC;}.sortorder(A
6210: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 ) ::= .
6220: 20 20 20 20 20 7b 41 20 3d 20 53 51 4c 49 54 45 {A = SQLITE
6230: 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 3b 7d 0a _SO_UNDEFINED;}.
6240: 0a 25 74 79 70 65 20 67 72 6f 75 70 62 79 5f 6f .%type groupby_o
6250: 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 pt {ExprList*}.%
6260: 64 65 73 74 72 75 63 74 6f 72 20 67 72 6f 75 70 destructor group
6270: 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 by_opt {sqlite3E
6280: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 xprListDelete(pP
6290: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a arse->db, $$);}.
62a0: 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a groupby_opt(A) :
62b0: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 := .
62c0: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 {A = 0
62d0: 3b 7d 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 ;}.groupby_opt(A
62e0: 29 20 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 6e ) ::= GROUP BY n
62f0: 65 78 70 72 6c 69 73 74 28 58 29 2e 20 7b 41 20 exprlist(X). {A
6300: 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76 = X;}..%type hav
6310: 69 6e 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a ing_opt {Expr*}.
6320: 25 64 65 73 74 72 75 63 74 6f 72 20 68 61 76 69 %destructor havi
6330: 6e 67 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 ng_opt {sqlite3E
6340: 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 xprDelete(pParse
6350: 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 68 61 76 69 ->db, $$);}.havi
6360: 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e 20 ng_opt(A) ::= .
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b {
6380: 41 20 3d 20 30 3b 7d 0a 68 61 76 69 6e 67 5f 6f A = 0;}.having_o
6390: 70 74 28 41 29 20 3a 3a 3d 20 48 41 56 49 4e 47 pt(A) ::= HAVING
63a0: 20 65 78 70 72 28 58 29 2e 20 20 7b 41 20 3d 20 expr(X). {A =
63b0: 58 2e 70 45 78 70 72 3b 7d 0a 0a 25 74 79 70 65 X.pExpr;}..%type
63c0: 20 6c 69 6d 69 74 5f 6f 70 74 20 7b 73 74 72 75 limit_opt {stru
63d0: 63 74 20 4c 69 6d 69 74 56 61 6c 7d 0a 0a 2f 2f ct LimitVal}..//
63e0: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 The destructor
63f0: 66 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 77 69 for limit_opt wi
6400: 6c 6c 20 6e 65 76 65 72 20 66 69 72 65 20 69 6e ll never fire in
6410: 20 74 68 65 20 63 75 72 72 65 6e 74 20 67 72 61 the current gra
6420: 6d 6d 61 72 2e 0a 2f 2f 20 54 68 65 20 6c 69 6d mmar..// The lim
6430: 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 it_opt non-termi
6440: 6e 61 6c 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 nal only occurs
6450: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 at the end of a
6460: 73 69 6e 67 6c 65 20 70 72 6f 64 75 63 74 69 6f single productio
6470: 6e 0a 2f 2f 20 72 75 6c 65 20 66 6f 72 20 53 45 n.// rule for SE
6480: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e LECT statements.
6490: 20 20 41 73 20 73 6f 6f 6e 20 61 73 20 74 68 65 As soon as the
64a0: 20 72 75 6c 65 20 74 68 61 74 20 63 72 65 61 74 rule that creat
64b0: 65 20 74 68 65 20 0a 2f 2f 20 6c 69 6d 69 74 5f e the .// limit_
64c0: 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c opt non-terminal
64d0: 20 72 65 64 75 63 65 73 2c 20 74 68 65 20 53 45 reduces, the SE
64e0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 72 LECT statement r
64f0: 75 6c 65 20 77 69 6c 6c 20 61 6c 73 6f 0a 2f 2f ule will also.//
6500: 20 72 65 64 75 63 65 2e 20 20 53 6f 20 74 68 65 reduce. So the
6510: 72 65 20 69 73 20 6e 65 76 65 72 20 61 20 6c 69 re is never a li
6520: 6d 69 74 5f 6f 70 74 20 6e 6f 6e 2d 74 65 72 6d mit_opt non-term
6530: 69 6e 61 6c 20 6f 6e 20 74 68 65 20 73 74 61 63 inal on the stac
6540: 6b 20 0a 2f 2f 20 65 78 63 65 70 74 20 61 73 20 k .// except as
6550: 61 20 74 72 61 6e 73 69 65 6e 74 2e 20 20 53 6f a transient. So
6560: 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 there is never
6570: 61 6e 79 74 68 69 6e 67 20 74 6f 20 64 65 73 74 anything to dest
6580: 72 6f 79 2e 0a 2f 2f 0a 2f 2f 25 64 65 73 74 72 roy..//.//%destr
6590: 75 63 74 6f 72 20 6c 69 6d 69 74 5f 6f 70 74 20 uctor limit_opt
65a0: 7b 0a 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70 {.// sqlite3Exp
65b0: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e rDelete(pParse->
65c0: 64 62 2c 20 24 24 2e 70 4c 69 6d 69 74 29 3b 0a db, $$.pLimit);.
65d0: 2f 2f 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 // sqlite3ExprD
65e0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 elete(pParse->db
65f0: 2c 20 24 24 2e 70 4f 66 66 73 65 74 29 3b 0a 2f , $$.pOffset);./
6600: 2f 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 /}.limit_opt(A)
6610: 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 ::= .
6620: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d {A.pLim
6630: 69 74 20 3d 20 30 3b 20 41 2e 70 4f 66 66 73 65 it = 0; A.pOffse
6640: 74 20 3d 20 30 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 t = 0;}.limit_op
6650: 74 28 41 29 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 t(A) ::= LIMIT e
6660: 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 7b 41 xpr(X). {A
6670: 2e 70 4c 69 6d 69 74 20 3d 20 58 2e 70 45 78 70 .pLimit = X.pExp
6680: 72 3b 20 41 2e 70 4f 66 66 73 65 74 20 3d 20 30 r; A.pOffset = 0
6690: 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 20 ;}.limit_opt(A)
66a0: 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 58 ::= LIMIT expr(X
66b0: 29 20 4f 46 46 53 45 54 20 65 78 70 72 28 59 29 ) OFFSET expr(Y)
66c0: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 . .
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
66e0: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4c 69 6d {A.pLim
66f0: 69 74 20 3d 20 58 2e 70 45 78 70 72 3b 20 41 2e it = X.pExpr; A.
6700: 70 4f 66 66 73 65 74 20 3d 20 59 2e 70 45 78 70 pOffset = Y.pExp
6710: 72 3b 7d 0a 6c 69 6d 69 74 5f 6f 70 74 28 41 29 r;}.limit_opt(A)
6720: 20 3a 3a 3d 20 4c 49 4d 49 54 20 65 78 70 72 28 ::= LIMIT expr(
6730: 58 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 X) COMMA expr(Y)
6740: 2e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 . .
6750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6760: 20 20 20 20 20 20 20 20 20 7b 41 2e 70 4f 66 66 {A.pOff
6770: 73 65 74 20 3d 20 58 2e 70 45 78 70 72 3b 20 41 set = X.pExpr; A
6780: 2e 70 4c 69 6d 69 74 20 3d 20 59 2e 70 45 78 70 .pLimit = Y.pExp
6790: 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f r;}..///////////
67a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
67b0: 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 74 The DELETE stat
67c0: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ement //////////
67d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
67e0: 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 65 66 20 53 51 ///.//.%ifdef SQ
67f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 LITE_ENABLE_UPDA
6800: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 0a TE_DELETE_LIMIT.
6810: 63 6d 64 20 3a 3a 3d 20 77 69 74 68 28 43 29 20 cmd ::= with(C)
6820: 44 45 4c 45 54 45 20 46 52 4f 4d 20 66 75 6c 6c DELETE FROM full
6830: 6e 61 6d 65 28 58 29 20 69 6e 64 65 78 65 64 5f name(X) indexed_
6840: 6f 70 74 28 49 29 20 77 68 65 72 65 5f 6f 70 74 opt(I) where_opt
6850: 28 57 29 20 0a 20 20 20 20 20 20 20 20 6f 72 64 (W) . ord
6860: 65 72 62 79 5f 6f 70 74 28 4f 29 20 6c 69 6d 69 erby_opt(O) limi
6870: 74 5f 6f 70 74 28 4c 29 2e 20 7b 0a 20 20 73 71 t_opt(L). {. sq
6880: 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 lite3WithPush(pP
6890: 61 72 73 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73 arse, C, 1);. s
68a0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 qlite3SrcListInd
68b0: 65 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 58 exedBy(pParse, X
68c0: 2c 20 26 49 29 3b 0a 20 20 57 20 3d 20 73 71 6c , &I);. W = sql
68d0: 69 74 65 33 4c 69 6d 69 74 57 68 65 72 65 28 70 ite3LimitWhere(p
68e0: 50 61 72 73 65 2c 20 58 2c 20 57 2c 20 4f 2c 20 Parse, X, W, O,
68f0: 4c 2e 70 4c 69 6d 69 74 2c 20 4c 2e 70 4f 66 66 L.pLimit, L.pOff
6900: 73 65 74 2c 20 22 44 45 4c 45 54 45 22 29 3b 0a set, "DELETE");.
6910: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 46 sqlite3DeleteF
6920: 72 6f 6d 28 70 50 61 72 73 65 2c 58 2c 57 29 3b rom(pParse,X,W);
6930: 0a 7d 0a 25 65 6e 64 69 66 0a 25 69 66 6e 64 65 .}.%endif.%ifnde
6940: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
6950: 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 UPDATE_DELETE_LI
6960: 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 MIT.cmd ::= with
6970: 28 43 29 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 (C) DELETE FROM
6980: 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e 64 65 fullname(X) inde
6990: 78 65 64 5f 6f 70 74 28 49 29 20 77 68 65 72 65 xed_opt(I) where
69a0: 5f 6f 70 74 28 57 29 2e 20 7b 0a 20 20 73 71 6c _opt(W). {. sql
69b0: 69 74 65 33 57 69 74 68 50 75 73 68 28 70 50 61 ite3WithPush(pPa
69c0: 72 73 65 2c 20 43 2c 20 31 29 3b 0a 20 20 73 71 rse, C, 1);. sq
69d0: 6c 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 lite3SrcListInde
69e0: 78 65 64 42 79 28 70 50 61 72 73 65 2c 20 58 2c xedBy(pParse, X,
69f0: 20 26 49 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 &I);. sqlite3D
6a00: 65 6c 65 74 65 46 72 6f 6d 28 70 50 61 72 73 65 eleteFrom(pParse
6a10: 2c 58 2c 57 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a ,X,W);.}.%endif.
6a20: 0a 25 74 79 70 65 20 77 68 65 72 65 5f 6f 70 74 .%type where_opt
6a30: 20 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 {Expr*}.%destru
6a40: 63 74 6f 72 20 77 68 65 72 65 5f 6f 70 74 20 7b ctor where_opt {
6a50: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 sqlite3ExprDelet
6a60: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 e(pParse->db, $$
6a70: 29 3b 7d 0a 0a 77 68 65 72 65 5f 6f 70 74 28 41 );}..where_opt(A
6a80: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 ) ::= .
6a90: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 {A =
6aa0: 30 3b 7d 0a 77 68 65 72 65 5f 6f 70 74 28 41 29 0;}.where_opt(A)
6ab0: 20 3a 3a 3d 20 57 48 45 52 45 20 65 78 70 72 28 ::= WHERE expr(
6ac0: 58 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58 X). {A = X
6ad0: 2e 70 45 78 70 72 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f .pExpr;}..//////
6ae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
6af0: 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20 //// The UPDATE
6b00: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f command ////////
6b10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
6b20: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 66 64 ////////.//.%ifd
6b30: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
6b40: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c _UPDATE_DELETE_L
6b50: 49 4d 49 54 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 IMIT.cmd ::= wit
6b60: 68 28 43 29 20 55 50 44 41 54 45 20 6f 72 63 6f h(C) UPDATE orco
6b70: 6e 66 28 52 29 20 66 75 6c 6c 6e 61 6d 65 28 58 nf(R) fullname(X
6b80: 29 20 69 6e 64 65 78 65 64 5f 6f 70 74 28 49 29 ) indexed_opt(I)
6b90: 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 0a SET setlist(Y).
6ba0: 20 20 20 20 20 20 20 20 77 68 65 72 65 5f 6f 70 where_op
6bb0: 74 28 57 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 t(W) orderby_opt
6bc0: 28 4f 29 20 6c 69 6d 69 74 5f 6f 70 74 28 4c 29 (O) limit_opt(L)
6bd0: 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 . {. sqlite3Wi
6be0: 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 43 thPush(pParse, C
6bf0: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 , 1);. sqlite3S
6c00: 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 rcListIndexedBy(
6c10: 70 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a pParse, X, &I);.
6c20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 sqlite3ExprLis
6c30: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 tCheckLength(pPa
6c40: 72 73 65 2c 59 2c 22 73 65 74 20 6c 69 73 74 22 rse,Y,"set list"
6c50: 29 3b 20 0a 20 20 57 20 3d 20 73 71 6c 69 74 65 ); . W = sqlite
6c60: 33 4c 69 6d 69 74 57 68 65 72 65 28 70 50 61 72 3LimitWhere(pPar
6c70: 73 65 2c 20 58 2c 20 57 2c 20 4f 2c 20 4c 2e 70 se, X, W, O, L.p
6c80: 4c 69 6d 69 74 2c 20 4c 2e 70 4f 66 66 73 65 74 Limit, L.pOffset
6c90: 2c 20 22 55 50 44 41 54 45 22 29 3b 0a 20 20 73 , "UPDATE");. s
6ca0: 71 6c 69 74 65 33 55 70 64 61 74 65 28 70 50 61 qlite3Update(pPa
6cb0: 72 73 65 2c 58 2c 59 2c 57 2c 52 29 3b 0a 7d 0a rse,X,Y,W,R);.}.
6cc0: 25 65 6e 64 69 66 0a 25 69 66 6e 64 65 66 20 53 %endif.%ifndef S
6cd0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 QLITE_ENABLE_UPD
6ce0: 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 ATE_DELETE_LIMIT
6cf0: 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 28 43 29 .cmd ::= with(C)
6d00: 20 55 50 44 41 54 45 20 6f 72 63 6f 6e 66 28 52 UPDATE orconf(R
6d10: 29 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 69 6e ) fullname(X) in
6d20: 64 65 78 65 64 5f 6f 70 74 28 49 29 20 53 45 54 dexed_opt(I) SET
6d30: 20 73 65 74 6c 69 73 74 28 59 29 0a 20 20 20 20 setlist(Y).
6d40: 20 20 20 20 77 68 65 72 65 5f 6f 70 74 28 57 29 where_opt(W)
6d50: 2e 20 20 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 . {. sqlite3Wi
6d60: 74 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 43 thPush(pParse, C
6d70: 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 , 1);. sqlite3S
6d80: 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79 28 rcListIndexedBy(
6d90: 70 50 61 72 73 65 2c 20 58 2c 20 26 49 29 3b 0a pParse, X, &I);.
6da0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 sqlite3ExprLis
6db0: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70 50 61 tCheckLength(pPa
6dc0: 72 73 65 2c 59 2c 22 73 65 74 20 6c 69 73 74 22 rse,Y,"set list"
6dd0: 29 3b 20 0a 20 20 73 71 6c 69 74 65 33 55 70 64 ); . sqlite3Upd
6de0: 61 74 65 28 70 50 61 72 73 65 2c 58 2c 59 2c 57 ate(pParse,X,Y,W
6df0: 2c 52 29 3b 0a 7d 0a 25 65 6e 64 69 66 0a 0a 25 ,R);.}.%endif..%
6e00: 74 79 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 type setlist {Ex
6e10: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 prList*}.%destru
6e20: 63 74 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 ctor setlist {sq
6e30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c lite3ExprListDel
6e40: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 ete(pParse->db,
6e50: 24 24 29 3b 7d 0a 0a 73 65 74 6c 69 73 74 28 41 $$);}..setlist(A
6e60: 29 20 3a 3a 3d 20 73 65 74 6c 69 73 74 28 41 29 ) ::= setlist(A)
6e70: 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 45 51 20 COMMA nm(X) EQ
6e80: 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d expr(Y). {. A =
6e90: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 sqlite3ExprList
6ea0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 41 Append(pParse, A
6eb0: 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 73 71 , Y.pExpr);. sq
6ec0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 lite3ExprListSet
6ed0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 41 2c 20 Name(pParse, A,
6ee0: 26 58 2c 20 31 29 3b 0a 7d 0a 73 65 74 6c 69 73 &X, 1);.}.setlis
6ef0: 74 28 41 29 20 3a 3a 3d 20 73 65 74 6c 69 73 74 t(A) ::= setlist
6f00: 28 41 29 20 43 4f 4d 4d 41 20 4c 50 20 69 64 6c (A) COMMA LP idl
6f10: 69 73 74 28 58 29 20 52 50 20 45 51 20 65 78 70 ist(X) RP EQ exp
6f20: 72 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 r(Y). {. A = sq
6f30: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 lite3ExprListApp
6f40: 65 6e 64 56 65 63 74 6f 72 28 70 50 61 72 73 65 endVector(pParse
6f50: 2c 20 41 2c 20 58 2c 20 59 2e 70 45 78 70 72 29 , A, X, Y.pExpr)
6f60: 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41 29 20 3a ;.}.setlist(A) :
6f70: 3a 3d 20 6e 6d 28 58 29 20 45 51 20 65 78 70 72 := nm(X) EQ expr
6f80: 28 59 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c (Y). {. A = sql
6f90: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 ite3ExprListAppe
6fa0: 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 59 2e nd(pParse, 0, Y.
6fb0: 70 45 78 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 pExpr);. sqlite
6fc0: 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 3ExprListSetName
6fd0: 28 70 50 61 72 73 65 2c 20 41 2c 20 26 58 2c 20 (pParse, A, &X,
6fe0: 31 29 3b 0a 7d 0a 73 65 74 6c 69 73 74 28 41 29 1);.}.setlist(A)
6ff0: 20 3a 3a 3d 20 4c 50 20 69 64 6c 69 73 74 28 58 ::= LP idlist(X
7000: 29 20 52 50 20 45 51 20 65 78 70 72 28 59 29 2e ) RP EQ expr(Y).
7010: 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 {. A = sqlite3
7020: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 56 65 ExprListAppendVe
7030: 63 74 6f 72 28 70 50 61 72 73 65 2c 20 30 2c 20 ctor(pParse, 0,
7040: 58 2c 20 59 2e 70 45 78 70 72 29 3b 0a 7d 0a 0a X, Y.pExpr);.}..
7050: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
7060: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 49 ////////// The I
7070: 4e 53 45 52 54 20 63 6f 6d 6d 61 6e 64 20 2f 2f NSERT command //
7080: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
7090: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a ///////////////.
70a0: 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 68 28 //.cmd ::= with(
70b0: 57 29 20 69 6e 73 65 72 74 5f 63 6d 64 28 52 29 W) insert_cmd(R)
70c0: 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 28 58 INTO fullname(X
70d0: 29 20 69 64 6c 69 73 74 5f 6f 70 74 28 46 29 20 ) idlist_opt(F)
70e0: 73 65 6c 65 63 74 28 53 29 2e 20 7b 0a 20 20 73 select(S). {. s
70f0: 71 6c 69 74 65 33 57 69 74 68 50 75 73 68 28 70 qlite3WithPush(p
7100: 50 61 72 73 65 2c 20 57 2c 20 31 29 3b 0a 20 20 Parse, W, 1);.
7110: 73 71 6c 69 74 65 33 49 6e 73 65 72 74 28 70 50 sqlite3Insert(pP
7120: 61 72 73 65 2c 20 58 2c 20 53 2c 20 46 2c 20 52 arse, X, S, F, R
7130: 29 3b 0a 7d 0a 63 6d 64 20 3a 3a 3d 20 77 69 74 );.}.cmd ::= wit
7140: 68 28 57 29 20 69 6e 73 65 72 74 5f 63 6d 64 28 h(W) insert_cmd(
7150: 52 29 20 49 4e 54 4f 20 66 75 6c 6c 6e 61 6d 65 R) INTO fullname
7160: 28 58 29 20 69 64 6c 69 73 74 5f 6f 70 74 28 46 (X) idlist_opt(F
7170: 29 20 44 45 46 41 55 4c 54 20 56 41 4c 55 45 53 ) DEFAULT VALUES
7180: 2e 0a 7b 0a 20 20 73 71 6c 69 74 65 33 57 69 74 ..{. sqlite3Wit
7190: 68 50 75 73 68 28 70 50 61 72 73 65 2c 20 57 2c hPush(pParse, W,
71a0: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 1);. sqlite3In
71b0: 73 65 72 74 28 70 50 61 72 73 65 2c 20 58 2c 20 sert(pParse, X,
71c0: 30 2c 20 46 2c 20 52 29 3b 0a 7d 0a 0a 25 74 79 0, F, R);.}..%ty
71d0: 70 65 20 69 6e 73 65 72 74 5f 63 6d 64 20 7b 69 pe insert_cmd {i
71e0: 6e 74 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 nt}.insert_cmd(A
71f0: 29 20 3a 3a 3d 20 49 4e 53 45 52 54 20 6f 72 63 ) ::= INSERT orc
7200: 6f 6e 66 28 52 29 2e 20 20 20 7b 41 20 3d 20 52 onf(R). {A = R
7210: 3b 7d 0a 69 6e 73 65 72 74 5f 63 6d 64 28 41 29 ;}.insert_cmd(A)
7220: 20 3a 3a 3d 20 52 45 50 4c 41 43 45 2e 20 20 20 ::= REPLACE.
7230: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 4f 45 {A = OE
7240: 5f 52 65 70 6c 61 63 65 3b 7d 0a 0a 25 74 79 70 _Replace;}..%typ
7250: 65 20 69 64 6c 69 73 74 5f 6f 70 74 20 7b 49 64 e idlist_opt {Id
7260: 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 List*}.%destruct
7270: 6f 72 20 69 64 6c 69 73 74 5f 6f 70 74 20 7b 73 or idlist_opt {s
7280: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 qlite3IdListDele
7290: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 te(pParse->db, $
72a0: 24 29 3b 7d 0a 25 74 79 70 65 20 69 64 6c 69 73 $);}.%type idlis
72b0: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 t {IdList*}.%des
72c0: 74 72 75 63 74 6f 72 20 69 64 6c 69 73 74 20 7b tructor idlist {
72d0: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c sqlite3IdListDel
72e0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 ete(pParse->db,
72f0: 24 24 29 3b 7d 0a 0a 69 64 6c 69 73 74 5f 6f 70 $$);}..idlist_op
7300: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 t(A) ::= .
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7320: 20 7b 41 20 3d 20 30 3b 7d 0a 69 64 6c 69 73 74 {A = 0;}.idlist
7330: 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 _opt(A) ::= LP i
7340: 64 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20 20 dlist(X) RP.
7350: 7b 41 20 3d 20 58 3b 7d 0a 69 64 6c 69 73 74 28 {A = X;}.idlist(
7360: 41 29 20 3a 3a 3d 20 69 64 6c 69 73 74 28 41 29 A) ::= idlist(A)
7370: 20 43 4f 4d 4d 41 20 6e 6d 28 59 29 2e 0a 20 20 COMMA nm(Y)..
7380: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 49 64 {A = sqlite3Id
7390: 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 ListAppend(pPars
73a0: 65 2d 3e 64 62 2c 41 2c 26 59 29 3b 7d 0a 69 64 e->db,A,&Y);}.id
73b0: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59 list(A) ::= nm(Y
73c0: 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 ).. {A = sqli
73d0: 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 te3IdListAppend(
73e0: 70 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59 29 pParse->db,0,&Y)
73f0: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 ; /*A-overwrites
7400: 2d 59 2a 2f 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f -Y*/}../////////
7410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
7420: 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20 50 72 // Expression Pr
7430: 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f 2f ocessing ///////
7440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
7450: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 0a 25 74 79 70 65 //////.//..%type
7460: 20 65 78 70 72 20 7b 45 78 70 72 53 70 61 6e 7d expr {ExprSpan}
7470: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 65 78 70 .%destructor exp
7480: 72 20 7b 73 71 6c 69 74 65 33 45 78 70 72 44 65 r {sqlite3ExprDe
7490: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c lete(pParse->db,
74a0: 20 24 24 2e 70 45 78 70 72 29 3b 7d 0a 25 74 79 $$.pExpr);}.%ty
74b0: 70 65 20 74 65 72 6d 20 7b 45 78 70 72 53 70 61 pe term {ExprSpa
74c0: 6e 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 n}.%destructor t
74d0: 65 72 6d 20 7b 73 71 6c 69 74 65 33 45 78 70 72 erm {sqlite3Expr
74e0: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 Delete(pParse->d
74f0: 62 2c 20 24 24 2e 70 45 78 70 72 29 3b 7d 0a 0a b, $$.pExpr);}..
7500: 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 %include {. /*
7510: 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 This is a utilit
7520: 79 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 y routine used t
7530: 6f 20 73 65 74 20 74 68 65 20 45 78 70 72 53 70 o set the ExprSp
7540: 61 6e 2e 7a 53 74 61 72 74 20 61 6e 64 0a 20 20 an.zStart and.
7550: 2a 2a 20 45 78 70 72 53 70 61 6e 2e 7a 45 6e 64 ** ExprSpan.zEnd
7560: 20 76 61 6c 75 65 73 20 6f 66 20 70 4f 75 74 20 values of pOut
7570: 73 6f 20 74 68 61 74 20 74 68 65 20 73 70 61 6e so that the span
7580: 20 63 6f 76 65 72 73 20 74 68 65 20 63 6f 6d 70 covers the comp
7590: 6c 65 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 20 lete. ** range
75a0: 6f 66 20 74 65 78 74 20 62 65 67 69 6e 6e 69 6e of text beginnin
75b0: 67 20 77 69 74 68 20 70 53 74 61 72 74 20 61 6e g with pStart an
75c0: 64 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 20 65 d going to the e
75d0: 6e 64 20 6f 66 20 70 45 6e 64 2e 0a 20 20 2a 2f nd of pEnd.. */
75e0: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73 . static void s
75f0: 70 61 6e 53 65 74 28 45 78 70 72 53 70 61 6e 20 panSet(ExprSpan
7600: 2a 70 4f 75 74 2c 20 54 6f 6b 65 6e 20 2a 70 53 *pOut, Token *pS
7610: 74 61 72 74 2c 20 54 6f 6b 65 6e 20 2a 70 45 6e tart, Token *pEn
7620: 64 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 53 d){. pOut->zS
7630: 74 61 72 74 20 3d 20 70 53 74 61 72 74 2d 3e 7a tart = pStart->z
7640: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 45 6e 64 ;. pOut->zEnd
7650: 20 3d 20 26 70 45 6e 64 2d 3e 7a 5b 70 45 6e 64 = &pEnd->z[pEnd
7660: 2d 3e 6e 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 ->n];. }.. /*
7670: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 Construct a new
7680: 45 78 70 72 20 6f 62 6a 65 63 74 20 66 72 6f 6d Expr object from
7690: 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 a single identi
76a0: 66 69 65 72 2e 20 20 55 73 65 20 74 68 65 0a 20 fier. Use the.
76b0: 20 2a 2a 20 6e 65 77 20 45 78 70 72 20 74 6f 20 ** new Expr to
76c0: 70 6f 70 75 6c 61 74 65 20 70 4f 75 74 2e 20 20 populate pOut.
76d0: 53 65 74 20 74 68 65 20 73 70 61 6e 20 6f 66 20 Set the span of
76e0: 70 4f 75 74 20 74 6f 20 62 65 20 74 68 65 20 69 pOut to be the i
76f0: 64 65 6e 74 69 66 69 65 72 0a 20 20 2a 2a 20 74 dentifier. ** t
7700: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 65 20 hat created the
7710: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2f expression.. */
7720: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73 . static void s
7730: 70 61 6e 45 78 70 72 28 45 78 70 72 53 70 61 6e panExpr(ExprSpan
7740: 20 2a 70 4f 75 74 2c 20 50 61 72 73 65 20 2a 70 *pOut, Parse *p
7750: 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 Parse, int op, T
7760: 6f 6b 65 6e 20 74 29 7b 0a 20 20 20 20 45 78 70 oken t){. Exp
7770: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 44 62 r *p = sqlite3Db
7780: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 70 50 61 72 MallocRawNN(pPar
7790: 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 45 se->db, sizeof(E
77a0: 78 70 72 29 2b 74 2e 6e 2b 31 29 3b 0a 20 20 20 xpr)+t.n+1);.
77b0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 if( p ){.
77c0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a memset(p, 0, siz
77d0: 65 6f 66 28 45 78 70 72 29 29 3b 0a 20 20 20 20 eof(Expr));.
77e0: 20 20 70 2d 3e 6f 70 20 3d 20 28 75 38 29 6f 70 p->op = (u8)op
77f0: 3b 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 ;. p->flags
7800: 20 3d 20 45 50 5f 4c 65 61 66 3b 0a 20 20 20 20 = EP_Leaf;.
7810: 20 20 70 2d 3e 69 41 67 67 20 3d 20 2d 31 3b 0a p->iAgg = -1;.
7820: 20 20 20 20 20 20 70 2d 3e 75 2e 7a 54 6f 6b 65 p->u.zToke
7830: 6e 20 3d 20 28 63 68 61 72 2a 29 26 70 5b 31 5d n = (char*)&p[1]
7840: 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 ;. memcpy(p
7850: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 74 2e 7a 2c ->u.zToken, t.z,
7860: 20 74 2e 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e t.n);. p->
7870: 75 2e 7a 54 6f 6b 65 6e 5b 74 2e 6e 5d 20 3d 20 u.zToken[t.n] =
7880: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 0;. if( sql
7890: 69 74 65 33 49 73 71 75 6f 74 65 28 70 2d 3e 75 ite3Isquote(p->u
78a0: 2e 7a 54 6f 6b 65 6e 5b 30 5d 29 20 29 7b 0a 20 .zToken[0]) ){.
78b0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 75 2e if( p->u.
78c0: 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 22 27 20 29 zToken[0]=='"' )
78d0: 20 70 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f p->flags |= EP_
78e0: 44 62 6c 51 75 6f 74 65 64 3b 0a 20 20 20 20 20 DblQuoted;.
78f0: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 sqlite3Dequot
7900: 65 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a e(p->u.zToken);.
7910: 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 }.#if SQLI
7920: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 TE_MAX_EXPR_DEPT
7930: 48 3e 30 0a 20 20 20 20 20 20 70 2d 3e 6e 48 65 H>0. p->nHe
7940: 69 67 68 74 20 3d 20 31 3b 0a 23 65 6e 64 69 66 ight = 1;.#endif
7950: 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 . }. pOu
7960: 74 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 t->pExpr = p;.
7970: 20 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d pOut->zStart =
7980: 20 74 2e 7a 3b 0a 20 20 20 20 70 4f 75 74 2d 3e t.z;. pOut->
7990: 7a 45 6e 64 20 3d 20 26 74 2e 7a 5b 74 2e 6e 5d zEnd = &t.z[t.n]
79a0: 3b 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 ;. }.}..expr(A)
79b0: 20 3a 3a 3d 20 74 65 72 6d 28 41 29 2e 0a 65 78 ::= term(A)..ex
79c0: 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 pr(A) ::= LP(B)
79d0: 65 78 70 72 28 58 29 20 52 50 28 45 29 2e 0a 20 expr(X) RP(E)..
79e0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e {span
79f0: 53 65 74 28 26 41 2c 26 42 2c 26 45 29 3b 20 2f Set(&A,&B,&E); /
7a00: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 42 2a *A-overwrites-B*
7a10: 2f 20 20 41 2e 70 45 78 70 72 20 3d 20 58 2e 70 / A.pExpr = X.p
7a20: 45 78 70 72 3b 7d 0a 65 78 70 72 28 41 29 20 3a Expr;}.expr(A) :
7a30: 3a 3d 20 69 64 28 58 29 2e 20 20 20 20 20 20 20 := id(X).
7a40: 20 20 20 7b 73 70 61 6e 45 78 70 72 28 26 41 2c {spanExpr(&A,
7a50: 70 50 61 72 73 65 2c 54 4b 5f 49 44 2c 58 29 3b pParse,TK_ID,X);
7a60: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d /*A-overwrites-
7a70: 58 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d X*/}.expr(A) ::=
7a80: 20 4a 4f 49 4e 5f 4b 57 28 58 29 2e 20 20 20 20 JOIN_KW(X).
7a90: 20 7b 73 70 61 6e 45 78 70 72 28 26 41 2c 70 50 {spanExpr(&A,pP
7aa0: 61 72 73 65 2c 54 4b 5f 49 44 2c 58 29 3b 20 2f arse,TK_ID,X); /
7ab0: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a *A-overwrites-X*
7ac0: 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 6e /}.expr(A) ::= n
7ad0: 6d 28 58 29 20 44 4f 54 20 6e 6d 28 59 29 2e 20 m(X) DOT nm(Y).
7ae0: 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 31 20 {. Expr *temp1
7af0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c = sqlite3ExprAll
7b00: 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 oc(pParse->db, T
7b10: 4b 5f 49 44 2c 20 26 58 2c 20 31 29 3b 0a 20 20 K_ID, &X, 1);.
7b20: 45 78 70 72 20 2a 74 65 6d 70 32 20 3d 20 73 71 Expr *temp2 = sq
7b30: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 lite3ExprAlloc(p
7b40: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 Parse->db, TK_ID
7b50: 2c 20 26 59 2c 20 31 29 3b 0a 20 20 73 70 61 6e , &Y, 1);. span
7b60: 53 65 74 28 26 41 2c 26 58 2c 26 59 29 3b 20 2f Set(&A,&X,&Y); /
7b70: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a *A-overwrites-X*
7b80: 2f 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 /. A.pExpr = sq
7b90: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 lite3PExpr(pPars
7ba0: 65 2c 20 54 4b 5f 44 4f 54 2c 20 74 65 6d 70 31 e, TK_DOT, temp1
7bb0: 2c 20 74 65 6d 70 32 29 3b 0a 7d 0a 65 78 70 72 , temp2);.}.expr
7bc0: 28 41 29 20 3a 3a 3d 20 6e 6d 28 58 29 20 44 4f (A) ::= nm(X) DO
7bd0: 54 20 6e 6d 28 59 29 20 44 4f 54 20 6e 6d 28 5a T nm(Y) DOT nm(Z
7be0: 29 2e 20 7b 0a 20 20 45 78 70 72 20 2a 74 65 6d ). {. Expr *tem
7bf0: 70 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 p1 = sqlite3Expr
7c00: 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 Alloc(pParse->db
7c10: 2c 20 54 4b 5f 49 44 2c 20 26 58 2c 20 31 29 3b , TK_ID, &X, 1);
7c20: 0a 20 20 45 78 70 72 20 2a 74 65 6d 70 32 20 3d . Expr *temp2 =
7c30: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f sqlite3ExprAllo
7c40: 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b c(pParse->db, TK
7c50: 5f 49 44 2c 20 26 59 2c 20 31 29 3b 0a 20 20 45 _ID, &Y, 1);. E
7c60: 78 70 72 20 2a 74 65 6d 70 33 20 3d 20 73 71 6c xpr *temp3 = sql
7c70: 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 ite3ExprAlloc(pP
7c80: 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 44 2c arse->db, TK_ID,
7c90: 20 26 5a 2c 20 31 29 3b 0a 20 20 45 78 70 72 20 &Z, 1);. Expr
7ca0: 2a 74 65 6d 70 34 20 3d 20 73 71 6c 69 74 65 33 *temp4 = sqlite3
7cb0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b PExpr(pParse, TK
7cc0: 5f 44 4f 54 2c 20 74 65 6d 70 32 2c 20 74 65 6d _DOT, temp2, tem
7cd0: 70 33 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26 p3);. spanSet(&
7ce0: 41 2c 26 58 2c 26 5a 29 3b 20 2f 2a 41 2d 6f 76 A,&X,&Z); /*A-ov
7cf0: 65 72 77 72 69 74 65 73 2d 58 2a 2f 0a 20 20 41 erwrites-X*/. A
7d00: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 .pExpr = sqlite3
7d10: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b PExpr(pParse, TK
7d20: 5f 44 4f 54 2c 20 74 65 6d 70 31 2c 20 74 65 6d _DOT, temp1, tem
7d30: 70 34 29 3b 0a 7d 0a 74 65 72 6d 28 41 29 20 3a p4);.}.term(A) :
7d40: 3a 3d 20 4e 55 4c 4c 7c 46 4c 4f 41 54 7c 42 4c := NULL|FLOAT|BL
7d50: 4f 42 28 58 29 2e 20 7b 73 70 61 6e 45 78 70 72 OB(X). {spanExpr
7d60: 28 26 41 2c 70 50 61 72 73 65 2c 40 58 2c 58 29 (&A,pParse,@X,X)
7d70: 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 ; /*A-overwrites
7d80: 2d 58 2a 2f 7d 0a 74 65 72 6d 28 41 29 20 3a 3a -X*/}.term(A) ::
7d90: 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20 = STRING(X).
7da0: 20 20 20 20 20 20 7b 73 70 61 6e 45 78 70 72 28 {spanExpr(
7db0: 26 41 2c 70 50 61 72 73 65 2c 40 58 2c 58 29 3b &A,pParse,@X,X);
7dc0: 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d /*A-overwrites-
7dd0: 58 2a 2f 7d 0a 74 65 72 6d 28 41 29 20 3a 3a 3d X*/}.term(A) ::=
7de0: 20 49 4e 54 45 47 45 52 28 58 29 2e 20 7b 0a 20 INTEGER(X). {.
7df0: 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 A.pExpr = sqlit
7e00: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72 e3ExprAlloc(pPar
7e10: 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e 54 45 47 se->db, TK_INTEG
7e20: 45 52 2c 20 26 58 2c 20 31 29 3b 0a 20 20 41 2e ER, &X, 1);. A.
7e30: 7a 53 74 61 72 74 20 3d 20 58 2e 7a 3b 0a 20 20 zStart = X.z;.
7e40: 41 2e 7a 45 6e 64 20 3d 20 58 2e 7a 20 2b 20 58 A.zEnd = X.z + X
7e50: 2e 6e 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a .n;.}.expr(A) ::
7e60: 3d 20 56 41 52 49 41 42 4c 45 28 58 29 2e 20 20 = VARIABLE(X).
7e70: 20 20 20 7b 0a 20 20 69 66 28 20 21 28 58 2e 7a {. if( !(X.z
7e80: 5b 30 5d 3d 3d 27 23 27 20 26 26 20 73 71 6c 69 [0]=='#' && sqli
7e90: 74 65 33 49 73 64 69 67 69 74 28 58 2e 7a 5b 31 te3Isdigit(X.z[1
7ea0: 5d 29 29 20 29 7b 0a 20 20 20 20 75 33 32 20 6e ])) ){. u32 n
7eb0: 20 3d 20 58 2e 6e 3b 0a 20 20 20 20 73 70 61 6e = X.n;. span
7ec0: 45 78 70 72 28 26 41 2c 20 70 50 61 72 73 65 2c Expr(&A, pParse,
7ed0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 2c 20 58 29 TK_VARIABLE, X)
7ee0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 ;. sqlite3Exp
7ef0: 72 41 73 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 rAssignVarNumber
7f00: 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 (pParse, A.pExpr
7f10: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 , n);. }else{.
7f20: 20 20 20 2f 2a 20 57 68 65 6e 20 64 6f 69 6e 67 /* When doing
7f30: 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65 2c a nested parse,
7f40: 20 6f 6e 65 20 63 61 6e 20 69 6e 63 6c 75 64 65 one can include
7f50: 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78 70 terms in an exp
7f60: 72 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2a 20 74 ression. ** t
7f70: 68 61 74 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 hat look like th
7f80: 69 73 3a 20 20 20 23 31 20 23 32 20 2e 2e 2e 20 is: #1 #2 ...
7f90: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66 These terms ref
7fa0: 65 72 20 74 6f 20 72 65 67 69 73 74 65 72 73 0a er to registers.
7fb0: 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 76 69 ** in the vi
7fc0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 rtual machine.
7fd0: 23 4e 20 69 73 20 74 68 65 20 4e 2d 74 68 20 72 #N is the N-th r
7fe0: 65 67 69 73 74 65 72 2e 20 2a 2f 0a 20 20 20 20 egister. */.
7ff0: 54 6f 6b 65 6e 20 74 20 3d 20 58 3b 20 2f 2a 41 Token t = X; /*A
8000: 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 0a -overwrites-X*/.
8010: 20 20 20 20 61 73 73 65 72 74 28 20 74 2e 6e 3e assert( t.n>
8020: 3d 32 20 29 3b 0a 20 20 20 20 73 70 61 6e 53 65 =2 );. spanSe
8030: 74 28 26 41 2c 20 26 74 2c 20 26 74 29 3b 0a 20 t(&A, &t, &t);.
8040: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e if( pParse->n
8050: 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 ested==0 ){.
8060: 20 20 70 61 72 73 65 72 53 79 6e 74 61 78 45 72 parserSyntaxEr
8070: 72 6f 72 28 70 50 61 72 73 65 2c 20 26 74 29 3b ror(pParse, &t);
8080: 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d . A.pExpr =
8090: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0;. }else{.
80a0: 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73 A.pExpr = s
80b0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 qlite3PExpr(pPar
80c0: 73 65 2c 20 54 4b 5f 52 45 47 49 53 54 45 52 2c se, TK_REGISTER,
80d0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 0, 0);. if
80e0: 28 20 41 2e 70 45 78 70 72 20 29 20 73 71 6c 69 ( A.pExpr ) sqli
80f0: 74 65 33 47 65 74 49 6e 74 33 32 28 26 74 2e 7a te3GetInt32(&t.z
8100: 5b 31 5d 2c 20 26 41 2e 70 45 78 70 72 2d 3e 69 [1], &A.pExpr->i
8110: 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 Table);. }.
8120: 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 }.}.expr(A) ::=
8130: 65 78 70 72 28 41 29 20 43 4f 4c 4c 41 54 45 20 expr(A) COLLATE
8140: 69 64 73 28 43 29 2e 20 7b 0a 20 20 41 2e 70 45 ids(C). {. A.pE
8150: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 xpr = sqlite3Exp
8160: 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65 6e rAddCollateToken
8170: 28 70 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 (pParse, A.pExpr
8180: 2c 20 26 43 2c 20 31 29 3b 0a 20 20 41 2e 7a 45 , &C, 1);. A.zE
8190: 6e 64 20 3d 20 26 43 2e 7a 5b 43 2e 6e 5d 3b 0a nd = &C.z[C.n];.
81a0: 7d 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 }.%ifndef SQLITE
81b0: 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78 70 72 28 _OMIT_CAST.expr(
81c0: 41 29 20 3a 3a 3d 20 43 41 53 54 28 58 29 20 4c A) ::= CAST(X) L
81d0: 50 20 65 78 70 72 28 45 29 20 41 53 20 74 79 70 P expr(E) AS typ
81e0: 65 74 6f 6b 65 6e 28 54 29 20 52 50 28 59 29 2e etoken(T) RP(Y).
81f0: 20 7b 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c {. spanSet(&A,
8200: 26 58 2c 26 59 29 3b 20 2f 2a 41 2d 6f 76 65 72 &X,&Y); /*A-over
8210: 77 72 69 74 65 73 2d 58 2a 2f 0a 20 20 41 2e 70 writes-X*/. A.p
8220: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 Expr = sqlite3Ex
8230: 70 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e prAlloc(pParse->
8240: 64 62 2c 20 54 4b 5f 43 41 53 54 2c 20 26 54 2c db, TK_CAST, &T,
8250: 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 1);. sqlite3Ex
8260: 70 72 41 74 74 61 63 68 53 75 62 74 72 65 65 73 prAttachSubtrees
8270: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 41 2e 70 (pParse->db, A.p
8280: 45 78 70 72 2c 20 45 2e 70 45 78 70 72 2c 20 30 Expr, E.pExpr, 0
8290: 29 3b 0a 7d 0a 25 65 6e 64 69 66 20 20 53 51 4c );.}.%endif SQL
82a0: 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 65 78 ITE_OMIT_CAST.ex
82b0: 70 72 28 41 29 20 3a 3a 3d 20 69 64 28 58 29 20 pr(A) ::= id(X)
82c0: 4c 50 20 64 69 73 74 69 6e 63 74 28 44 29 20 65 LP distinct(D) e
82d0: 78 70 72 6c 69 73 74 28 59 29 20 52 50 28 45 29 xprlist(Y) RP(E)
82e0: 2e 20 7b 0a 20 20 69 66 28 20 59 20 26 26 20 59 . {. if( Y && Y
82f0: 2d 3e 6e 45 78 70 72 3e 70 50 61 72 73 65 2d 3e ->nExpr>pParse->
8300: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 db->aLimit[SQLIT
8310: 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e E_LIMIT_FUNCTION
8320: 5f 41 52 47 5d 20 29 7b 0a 20 20 20 20 73 71 6c _ARG] ){. sql
8330: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 ite3ErrorMsg(pPa
8340: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 rse, "too many a
8350: 72 67 75 6d 65 6e 74 73 20 6f 6e 20 66 75 6e 63 rguments on func
8360: 74 69 6f 6e 20 25 54 22 2c 20 26 58 29 3b 0a 20 tion %T", &X);.
8370: 20 7d 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 }. A.pExpr = s
8380: 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 qlite3ExprFuncti
8390: 6f 6e 28 70 50 61 72 73 65 2c 20 59 2c 20 26 58 on(pParse, Y, &X
83a0: 29 3b 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c );. spanSet(&A,
83b0: 26 58 2c 26 45 29 3b 0a 20 20 69 66 28 20 44 3d &X,&E);. if( D=
83c0: 3d 53 46 5f 44 69 73 74 69 6e 63 74 20 26 26 20 =SF_Distinct &&
83d0: 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 20 41 A.pExpr ){. A
83e0: 2e 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d .pExpr->flags |=
83f0: 20 45 50 5f 44 69 73 74 69 6e 63 74 3b 0a 20 20 EP_Distinct;.
8400: 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 }.}.expr(A) ::=
8410: 69 64 28 58 29 20 4c 50 20 53 54 41 52 20 52 50 id(X) LP STAR RP
8420: 28 45 29 2e 20 7b 0a 20 20 41 2e 70 45 78 70 72 (E). {. A.pExpr
8430: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 46 75 = sqlite3ExprFu
8440: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 nction(pParse, 0
8450: 2c 20 26 58 29 3b 0a 20 20 73 70 61 6e 53 65 74 , &X);. spanSet
8460: 28 26 41 2c 26 58 2c 26 45 29 3b 0a 7d 0a 74 65 (&A,&X,&E);.}.te
8470: 72 6d 28 41 29 20 3a 3a 3d 20 43 54 49 4d 45 5f rm(A) ::= CTIME_
8480: 4b 57 28 4f 50 29 2e 20 7b 0a 20 20 41 2e 70 45 KW(OP). {. A.pE
8490: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 xpr = sqlite3Exp
84a0: 72 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 rFunction(pParse
84b0: 2c 20 30 2c 20 26 4f 50 29 3b 0a 20 20 73 70 61 , 0, &OP);. spa
84c0: 6e 53 65 74 28 26 41 2c 20 26 4f 50 2c 20 26 4f nSet(&A, &OP, &O
84d0: 50 29 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 P);.}..%include
84e0: 7b 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 {. /* This rout
84f0: 69 6e 65 20 63 6f 6e 73 74 72 75 63 74 73 20 61 ine constructs a
8500: 20 62 69 6e 61 72 79 20 65 78 70 72 65 73 73 69 binary expressi
8510: 6f 6e 20 6e 6f 64 65 20 6f 75 74 20 6f 66 20 74 on node out of t
8520: 77 6f 20 45 78 70 72 53 70 61 6e 0a 20 20 2a 2a wo ExprSpan. **
8530: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 75 73 65 objects and use
8540: 73 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 s the result to
8550: 70 6f 70 75 6c 61 74 65 20 61 20 6e 65 77 20 45 populate a new E
8560: 78 70 72 53 70 61 6e 20 6f 62 6a 65 63 74 2e 0a xprSpan object..
8570: 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f */. static vo
8580: 69 64 20 73 70 61 6e 42 69 6e 61 72 79 45 78 70 id spanBinaryExp
8590: 72 28 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 r(. Parse *pP
85a0: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 arse, /* Th
85b0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 e parsing contex
85c0: 74 2e 20 20 45 72 72 6f 72 73 20 61 63 63 75 6d t. Errors accum
85d0: 75 6c 61 74 65 20 68 65 72 65 20 2a 2f 0a 20 20 ulate here */.
85e0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 int op,
85f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e /* The bin
8600: 61 72 79 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f ary operation */
8610: 0a 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70 . ExprSpan *p
8620: 4c 65 66 74 2c 20 20 20 20 2f 2a 20 54 68 65 20 Left, /* The
8630: 6c 65 66 74 20 6f 70 65 72 61 6e 64 2c 20 61 6e left operand, an
8640: 64 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 d output */.
8650: 45 78 70 72 53 70 61 6e 20 2a 70 52 69 67 68 74 ExprSpan *pRight
8660: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 /* The right
8670: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 29 7b operand */. ){
8680: 0a 20 20 20 20 70 4c 65 66 74 2d 3e 70 45 78 70 . pLeft->pExp
8690: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 r = sqlite3PExpr
86a0: 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 70 4c 65 (pParse, op, pLe
86b0: 66 74 2d 3e 70 45 78 70 72 2c 20 70 52 69 67 68 ft->pExpr, pRigh
86c0: 74 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 70 t->pExpr);. p
86d0: 4c 65 66 74 2d 3e 7a 45 6e 64 20 3d 20 70 52 69 Left->zEnd = pRi
86e0: 67 68 74 2d 3e 7a 45 6e 64 3b 0a 20 20 7d 0a 0a ght->zEnd;. }..
86f0: 20 20 2f 2a 20 49 66 20 64 6f 4e 6f 74 20 69 73 /* If doNot is
8700: 20 74 72 75 65 2c 20 74 68 65 6e 20 61 64 64 20 true, then add
8710: 61 20 54 4b 5f 4e 4f 54 20 45 78 70 72 2d 6e 6f a TK_NOT Expr-no
8720: 64 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e de wrapper aroun
8730: 64 20 74 68 65 0a 20 20 2a 2a 20 6f 75 74 73 69 d the. ** outsi
8740: 64 65 20 6f 66 20 2a 70 70 45 78 70 72 2e 0a 20 de of *ppExpr..
8750: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 */. static voi
8760: 64 20 65 78 70 72 4e 6f 74 28 50 61 72 73 65 20 d exprNot(Parse
8770: 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 64 6f 4e *pParse, int doN
8780: 6f 74 2c 20 45 78 70 72 53 70 61 6e 20 2a 70 53 ot, ExprSpan *pS
8790: 70 61 6e 29 7b 0a 20 20 20 20 69 66 28 20 64 6f pan){. if( do
87a0: 4e 6f 74 20 29 7b 0a 20 20 20 20 20 20 70 53 70 Not ){. pSp
87b0: 61 6e 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c 69 an->pExpr = sqli
87c0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c te3PExpr(pParse,
87d0: 20 54 4b 5f 4e 4f 54 2c 20 70 53 70 61 6e 2d 3e TK_NOT, pSpan->
87e0: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 7d pExpr, 0);. }
87f0: 0a 20 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20 . }.}..expr(A)
8800: 3a 3a 3d 20 4c 50 28 4c 29 20 6e 65 78 70 72 6c ::= LP(L) nexprl
8810: 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 65 78 70 ist(X) COMMA exp
8820: 72 28 59 29 20 52 50 28 52 29 2e 20 7b 0a 20 20 r(Y) RP(R). {.
8830: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 ExprList *pList
8840: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 = sqlite3ExprLis
8850: 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 tAppend(pParse,
8860: 58 2c 20 59 2e 70 45 78 70 72 29 3b 0a 20 20 41 X, Y.pExpr);. A
8870: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 .pExpr = sqlite3
8880: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b PExpr(pParse, TK
8890: 5f 56 45 43 54 4f 52 2c 20 30 2c 20 30 29 3b 0a _VECTOR, 0, 0);.
88a0: 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29 7b if( A.pExpr ){
88b0: 0a 20 20 20 20 41 2e 70 45 78 70 72 2d 3e 78 2e . A.pExpr->x.
88c0: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 pList = pList;.
88d0: 20 20 20 73 70 61 6e 53 65 74 28 26 41 2c 20 26 spanSet(&A, &
88e0: 4c 2c 20 26 52 29 3b 0a 20 20 7d 65 6c 73 65 7b L, &R);. }else{
88f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 . sqlite3Expr
8900: 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 ListDelete(pPars
8910: 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 e->db, pList);.
8920: 20 7d 0a 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a }.}..expr(A) ::
8930: 3d 20 65 78 70 72 28 41 29 20 41 4e 44 28 4f 50 = expr(A) AND(OP
8940: 29 20 65 78 70 72 28 59 29 2e 20 20 20 20 7b 73 ) expr(Y). {s
8950: 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 70 50 panBinaryExpr(pP
8960: 61 72 73 65 2c 40 4f 50 2c 26 41 2c 26 59 29 3b arse,@OP,&A,&Y);
8970: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 }.expr(A) ::= ex
8980: 70 72 28 41 29 20 4f 52 28 4f 50 29 20 65 78 70 pr(A) OR(OP) exp
8990: 72 28 59 29 2e 20 20 20 20 20 7b 73 70 61 6e 42 r(Y). {spanB
89a0: 69 6e 61 72 79 45 78 70 72 28 70 50 61 72 73 65 inaryExpr(pParse
89b0: 2c 40 4f 50 2c 26 41 2c 26 59 29 3b 7d 0a 65 78 ,@OP,&A,&Y);}.ex
89c0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 pr(A) ::= expr(A
89d0: 29 20 4c 54 7c 47 54 7c 47 45 7c 4c 45 28 4f 50 ) LT|GT|GE|LE(OP
89e0: 29 20 65 78 70 72 28 59 29 2e 0a 20 20 20 20 20 ) expr(Y)..
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8a10: 20 20 20 7b 73 70 61 6e 42 69 6e 61 72 79 45 78 {spanBinaryEx
8a20: 70 72 28 70 50 61 72 73 65 2c 40 4f 50 2c 26 41 pr(pParse,@OP,&A
8a30: 2c 26 59 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a ,&Y);}.expr(A) :
8a40: 3a 3d 20 65 78 70 72 28 41 29 20 45 51 7c 4e 45 := expr(A) EQ|NE
8a50: 28 4f 50 29 20 65 78 70 72 28 59 29 2e 20 20 7b (OP) expr(Y). {
8a60: 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 70 spanBinaryExpr(p
8a70: 50 61 72 73 65 2c 40 4f 50 2c 26 41 2c 26 59 29 Parse,@OP,&A,&Y)
8a80: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 ;}.expr(A) ::= e
8a90: 78 70 72 28 41 29 20 42 49 54 41 4e 44 7c 42 49 xpr(A) BITAND|BI
8aa0: 54 4f 52 7c 4c 53 48 49 46 54 7c 52 53 48 49 46 TOR|LSHIFT|RSHIF
8ab0: 54 28 4f 50 29 20 65 78 70 72 28 59 29 2e 0a 20 T(OP) expr(Y)..
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8ae0: 20 20 20 20 20 20 20 7b 73 70 61 6e 42 69 6e 61 {spanBina
8af0: 72 79 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f ryExpr(pParse,@O
8b00: 50 2c 26 41 2c 26 59 29 3b 7d 0a 65 78 70 72 28 P,&A,&Y);}.expr(
8b10: 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 50 A) ::= expr(A) P
8b20: 4c 55 53 7c 4d 49 4e 55 53 28 4f 50 29 20 65 78 LUS|MINUS(OP) ex
8b30: 70 72 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 pr(Y)..
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b {
8b60: 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 28 70 spanBinaryExpr(p
8b70: 50 61 72 73 65 2c 40 4f 50 2c 26 41 2c 26 59 29 Parse,@OP,&A,&Y)
8b80: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 ;}.expr(A) ::= e
8b90: 78 70 72 28 41 29 20 53 54 41 52 7c 53 4c 41 53 xpr(A) STAR|SLAS
8ba0: 48 7c 52 45 4d 28 4f 50 29 20 65 78 70 72 28 59 H|REM(OP) expr(Y
8bb0: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 )..
8bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8bd0: 20 20 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e {span
8be0: 42 69 6e 61 72 79 45 78 70 72 28 70 50 61 72 73 BinaryExpr(pPars
8bf0: 65 2c 40 4f 50 2c 26 41 2c 26 59 29 3b 7d 0a 65 e,@OP,&A,&Y);}.e
8c00: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 xpr(A) ::= expr(
8c10: 41 29 20 43 4f 4e 43 41 54 28 4f 50 29 20 65 78 A) CONCAT(OP) ex
8c20: 70 72 28 59 29 2e 20 7b 73 70 61 6e 42 69 6e 61 pr(Y). {spanBina
8c30: 72 79 45 78 70 72 28 70 50 61 72 73 65 2c 40 4f ryExpr(pParse,@O
8c40: 50 2c 26 41 2c 26 59 29 3b 7d 0a 25 74 79 70 65 P,&A,&Y);}.%type
8c50: 20 6c 69 6b 65 6f 70 20 7b 54 6f 6b 65 6e 7d 0a likeop {Token}.
8c60: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4c 49 likeop(A) ::= LI
8c70: 4b 45 5f 4b 57 7c 4d 41 54 43 48 28 41 29 2e 0a KE_KW|MATCH(A)..
8c80: 6c 69 6b 65 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f likeop(A) ::= NO
8c90: 54 20 4c 49 4b 45 5f 4b 57 7c 4d 41 54 43 48 28 T LIKE_KW|MATCH(
8ca0: 58 29 2e 20 7b 41 3d 58 3b 20 41 2e 6e 7c 3d 30 X). {A=X; A.n|=0
8cb0: 78 38 30 30 30 30 30 30 30 3b 20 2f 2a 41 2d 6f x80000000; /*A-o
8cc0: 76 65 72 77 72 69 74 65 2d 58 2a 2f 7d 0a 65 78 verwrite-X*/}.ex
8cd0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 pr(A) ::= expr(A
8ce0: 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65 78 70 ) likeop(OP) exp
8cf0: 72 28 59 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57 5d r(Y). [LIKE_KW]
8d00: 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a {. ExprList *
8d10: 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 62 4e 6f pList;. int bNo
8d20: 74 20 3d 20 4f 50 2e 6e 20 26 20 30 78 38 30 30 t = OP.n & 0x800
8d30: 30 30 30 30 30 3b 0a 20 20 4f 50 2e 6e 20 26 3d 00000;. OP.n &=
8d40: 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 70 0x7fffffff;. p
8d50: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 List = sqlite3Ex
8d60: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 prListAppend(pPa
8d70: 72 73 65 2c 30 2c 20 59 2e 70 45 78 70 72 29 3b rse,0, Y.pExpr);
8d80: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 . pList = sqlit
8d90: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 e3ExprListAppend
8da0: 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 41 (pParse,pList, A
8db0: 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70 45 78 .pExpr);. A.pEx
8dc0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 pr = sqlite3Expr
8dd0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2c Function(pParse,
8de0: 20 70 4c 69 73 74 2c 20 26 4f 50 29 3b 0a 20 20 pList, &OP);.
8df0: 65 78 70 72 4e 6f 74 28 70 50 61 72 73 65 2c 20 exprNot(pParse,
8e00: 62 4e 6f 74 2c 20 26 41 29 3b 0a 20 20 41 2e 7a bNot, &A);. A.z
8e10: 45 6e 64 20 3d 20 59 2e 7a 45 6e 64 3b 0a 20 20 End = Y.zEnd;.
8e20: 69 66 28 20 41 2e 70 45 78 70 72 20 29 20 41 2e if( A.pExpr ) A.
8e30: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 pExpr->flags |=
8e40: 45 50 5f 49 6e 66 69 78 46 75 6e 63 3b 0a 7d 0a EP_InfixFunc;.}.
8e50: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 expr(A) ::= expr
8e60: 28 41 29 20 6c 69 6b 65 6f 70 28 4f 50 29 20 65 (A) likeop(OP) e
8e70: 78 70 72 28 59 29 20 45 53 43 41 50 45 20 65 78 xpr(Y) ESCAPE ex
8e80: 70 72 28 45 29 2e 20 20 5b 4c 49 4b 45 5f 4b 57 pr(E). [LIKE_KW
8e90: 5d 20 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 ] {. ExprList
8ea0: 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20 62 4e *pList;. int bN
8eb0: 6f 74 20 3d 20 4f 50 2e 6e 20 26 20 30 78 38 30 ot = OP.n & 0x80
8ec0: 30 30 30 30 30 30 3b 0a 20 20 4f 50 2e 6e 20 26 000000;. OP.n &
8ed0: 3d 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 = 0x7fffffff;.
8ee0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 pList = sqlite3E
8ef0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 xprListAppend(pP
8f00: 61 72 73 65 2c 30 2c 20 59 2e 70 45 78 70 72 29 arse,0, Y.pExpr)
8f10: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 ;. pList = sqli
8f20: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e te3ExprListAppen
8f30: 64 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 d(pParse,pList,
8f40: 41 2e 70 45 78 70 72 29 3b 0a 20 20 70 4c 69 73 A.pExpr);. pLis
8f50: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c t = sqlite3ExprL
8f60: 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 istAppend(pParse
8f70: 2c 70 4c 69 73 74 2c 20 45 2e 70 45 78 70 72 29 ,pList, E.pExpr)
8f80: 3b 0a 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 ;. A.pExpr = sq
8f90: 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f lite3ExprFunctio
8fa0: 6e 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c n(pParse, pList,
8fb0: 20 26 4f 50 29 3b 0a 20 20 65 78 70 72 4e 6f 74 &OP);. exprNot
8fc0: 28 70 50 61 72 73 65 2c 20 62 4e 6f 74 2c 20 26 (pParse, bNot, &
8fd0: 41 29 3b 0a 20 20 41 2e 7a 45 6e 64 20 3d 20 45 A);. A.zEnd = E
8fe0: 2e 7a 45 6e 64 3b 0a 20 20 69 66 28 20 41 2e 70 .zEnd;. if( A.p
8ff0: 45 78 70 72 20 29 20 41 2e 70 45 78 70 72 2d 3e Expr ) A.pExpr->
9000: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 66 69 flags |= EP_Infi
9010: 78 46 75 6e 63 3b 0a 7d 0a 0a 25 69 6e 63 6c 75 xFunc;.}..%inclu
9020: 64 65 20 7b 0a 20 20 2f 2a 20 43 6f 6e 73 74 72 de {. /* Constr
9030: 75 63 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f uct an expressio
9040: 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 75 6e 61 n node for a una
9050: 72 79 20 70 6f 73 74 66 69 78 20 6f 70 65 72 61 ry postfix opera
9060: 74 6f 72 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 tor. */. stati
9070: 63 20 76 6f 69 64 20 73 70 61 6e 55 6e 61 72 79 c void spanUnary
9080: 50 6f 73 74 66 69 78 28 0a 20 20 20 20 50 61 72 Postfix(. Par
9090: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 se *pParse,
90a0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 /* Parsing c
90b0: 6f 6e 74 65 78 74 20 74 6f 20 72 65 63 6f 72 64 ontext to record
90c0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 69 errors */. i
90d0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 nt op,
90e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 /* The ope
90f0: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 rator */. Exp
9100: 72 53 70 61 6e 20 2a 70 4f 70 65 72 61 6e 64 2c rSpan *pOperand,
9110: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 /* The opera
9120: 6e 64 2c 20 61 6e 64 20 6f 75 74 70 75 74 20 2a nd, and output *
9130: 2f 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50 6f /. Token *pPo
9140: 73 74 4f 70 20 20 20 20 20 20 20 20 20 2f 2a 20 stOp /*
9150: 54 68 65 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65 The operand toke
9160: 6e 20 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68 n for setting th
9170: 65 20 73 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20 e span */. ){.
9180: 20 20 20 70 4f 70 65 72 61 6e 64 2d 3e 70 45 78 pOperand->pEx
9190: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 pr = sqlite3PExp
91a0: 72 28 70 50 61 72 73 65 2c 20 6f 70 2c 20 70 4f r(pParse, op, pO
91b0: 70 65 72 61 6e 64 2d 3e 70 45 78 70 72 2c 20 30 perand->pExpr, 0
91c0: 29 3b 0a 20 20 20 20 70 4f 70 65 72 61 6e 64 2d );. pOperand-
91d0: 3e 7a 45 6e 64 20 3d 20 26 70 50 6f 73 74 4f 70 >zEnd = &pPostOp
91e0: 2d 3e 7a 5b 70 50 6f 73 74 4f 70 2d 3e 6e 5d 3b ->z[pPostOp->n];
91f0: 0a 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 . }
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0a .
9210: 7d 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 }..expr(A) ::= e
9220: 78 70 72 28 41 29 20 49 53 4e 55 4c 4c 7c 4e 4f xpr(A) ISNULL|NO
9230: 54 4e 55 4c 4c 28 45 29 2e 20 20 20 7b 73 70 61 TNULL(E). {spa
9240: 6e 55 6e 61 72 79 50 6f 73 74 66 69 78 28 70 50 nUnaryPostfix(pP
9250: 61 72 73 65 2c 40 45 2c 26 41 2c 26 45 29 3b 7d arse,@E,&A,&E);}
9260: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 .expr(A) ::= exp
9270: 72 28 41 29 20 4e 4f 54 20 4e 55 4c 4c 28 45 29 r(A) NOT NULL(E)
9280: 2e 20 7b 73 70 61 6e 55 6e 61 72 79 50 6f 73 74 . {spanUnaryPost
9290: 66 69 78 28 70 50 61 72 73 65 2c 54 4b 5f 4e 4f fix(pParse,TK_NO
92a0: 54 4e 55 4c 4c 2c 26 41 2c 26 45 29 3b 7d 0a 0a TNULL,&A,&E);}..
92b0: 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 2f 2a 20 %include {. /*
92c0: 41 20 72 6f 75 74 69 6e 65 20 74 6f 20 63 6f 6e A routine to con
92d0: 76 65 72 74 20 61 20 62 69 6e 61 72 79 20 54 4b vert a binary TK
92e0: 5f 49 53 20 6f 72 20 54 4b 5f 49 53 4e 4f 54 20 _IS or TK_ISNOT
92f0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 expression into
9300: 61 0a 20 20 2a 2a 20 75 6e 61 72 79 20 54 4b 5f a. ** unary TK_
9310: 49 53 4e 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54 ISNULL or TK_NOT
9320: 4e 55 4c 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e NULL expression.
9330: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 */. static voi
9340: 64 20 62 69 6e 61 72 79 54 6f 55 6e 61 72 79 49 d binaryToUnaryI
9350: 66 4e 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 fNull(Parse *pPa
9360: 72 73 65 2c 20 45 78 70 72 20 2a 70 59 2c 20 45 rse, Expr *pY, E
9370: 78 70 72 20 2a 70 41 2c 20 69 6e 74 20 6f 70 29 xpr *pA, int op)
9380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 {. sqlite3 *d
9390: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a b = pParse->db;.
93a0: 20 20 20 20 69 66 28 20 70 41 20 26 26 20 70 59 if( pA && pY
93b0: 20 26 26 20 70 59 2d 3e 6f 70 3d 3d 54 4b 5f 4e && pY->op==TK_N
93c0: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 41 2d ULL ){. pA-
93d0: 3e 6f 70 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 >op = (u8)op;.
93e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 sqlite3ExprD
93f0: 65 6c 65 74 65 28 64 62 2c 20 70 41 2d 3e 70 52 elete(db, pA->pR
9400: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 41 2d ight);. pA-
9410: 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 >pRight = 0;.
9420: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2f 20 20 20 20 }. }.}..//
9430: 65 78 70 72 31 20 49 53 20 65 78 70 72 32 0a 2f expr1 IS expr2./
9440: 2f 20 20 20 20 65 78 70 72 31 20 49 53 20 4e 4f / expr1 IS NO
9450: 54 20 65 78 70 72 32 0a 2f 2f 0a 2f 2f 20 49 66 T expr2.//.// If
9460: 20 65 78 70 72 32 20 69 73 20 4e 55 4c 4c 20 74 expr2 is NULL t
9470: 68 65 6e 20 63 6f 64 65 20 61 73 20 54 4b 5f 49 hen code as TK_I
9480: 53 4e 55 4c 4c 20 6f 72 20 54 4b 5f 4e 4f 54 4e SNULL or TK_NOTN
9490: 55 4c 4c 2e 20 20 49 66 20 65 78 70 72 32 0a 2f ULL. If expr2./
94a0: 2f 20 69 73 20 61 6e 79 20 6f 74 68 65 72 20 65 / is any other e
94b0: 78 70 72 65 73 73 69 6f 6e 2c 20 63 6f 64 65 20 xpression, code
94c0: 61 73 20 54 4b 5f 49 53 20 6f 72 20 54 4b 5f 49 as TK_IS or TK_I
94d0: 53 4e 4f 54 2e 0a 2f 2f 20 0a 65 78 70 72 28 41 SNOT..// .expr(A
94e0: 29 20 3a 3a 3d 20 65 78 70 72 28 41 29 20 49 53 ) ::= expr(A) IS
94f0: 20 65 78 70 72 28 59 29 2e 20 20 20 20 20 7b 0a expr(Y). {.
9500: 20 20 73 70 61 6e 42 69 6e 61 72 79 45 78 70 72 spanBinaryExpr
9510: 28 70 50 61 72 73 65 2c 54 4b 5f 49 53 2c 26 41 (pParse,TK_IS,&A
9520: 2c 26 59 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f ,&Y);. binaryTo
9530: 55 6e 61 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 UnaryIfNull(pPar
9540: 73 65 2c 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 se, Y.pExpr, A.p
9550: 45 78 70 72 2c 20 54 4b 5f 49 53 4e 55 4c 4c 29 Expr, TK_ISNULL)
9560: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 ;.}.expr(A) ::=
9570: 65 78 70 72 28 41 29 20 49 53 20 4e 4f 54 20 65 expr(A) IS NOT e
9580: 78 70 72 28 59 29 2e 20 7b 0a 20 20 73 70 61 6e xpr(Y). {. span
9590: 42 69 6e 61 72 79 45 78 70 72 28 70 50 61 72 73 BinaryExpr(pPars
95a0: 65 2c 54 4b 5f 49 53 4e 4f 54 2c 26 41 2c 26 59 e,TK_ISNOT,&A,&Y
95b0: 29 3b 0a 20 20 62 69 6e 61 72 79 54 6f 55 6e 61 );. binaryToUna
95c0: 72 79 49 66 4e 75 6c 6c 28 70 50 61 72 73 65 2c ryIfNull(pParse,
95d0: 20 59 2e 70 45 78 70 72 2c 20 41 2e 70 45 78 70 Y.pExpr, A.pExp
95e0: 72 2c 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a r, TK_NOTNULL);.
95f0: 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b 0a 20 20 }..%include {.
9600: 2f 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6e 20 /* Construct an
9610: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 expression node
9620: 66 6f 72 20 61 20 75 6e 61 72 79 20 70 72 65 66 for a unary pref
9630: 69 78 20 6f 70 65 72 61 74 6f 72 0a 20 20 2a 2f ix operator. */
9640: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 73 . static void s
9650: 70 61 6e 55 6e 61 72 79 50 72 65 66 69 78 28 0a panUnaryPrefix(.
9660: 20 20 20 20 45 78 70 72 53 70 61 6e 20 2a 70 4f ExprSpan *pO
9670: 75 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72 ut, /* Wr
9680: 69 74 65 20 74 68 65 20 6e 65 77 20 65 78 70 72 ite the new expr
9690: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 68 65 72 65 ession node here
96a0: 20 2a 2f 0a 20 20 20 20 50 61 72 73 65 20 2a 70 */. Parse *p
96b0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f Parse, /
96c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 * Parsing contex
96d0: 74 20 74 6f 20 72 65 63 6f 72 64 20 65 72 72 6f t to record erro
96e0: 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 rs */. int op
96f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
9700: 20 2f 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 /* The operator
9710: 20 2a 2f 0a 20 20 20 20 45 78 70 72 53 70 61 6e */. ExprSpan
9720: 20 2a 70 4f 70 65 72 61 6e 64 2c 20 20 20 20 2f *pOperand, /
9730: 2a 20 54 68 65 20 6f 70 65 72 61 6e 64 20 2a 2f * The operand */
9740: 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 50 72 65 . Token *pPre
9750: 4f 70 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 Op /* Th
9760: 65 20 6f 70 65 72 61 6e 64 20 74 6f 6b 65 6e 20 e operand token
9770: 66 6f 72 20 73 65 74 74 69 6e 67 20 74 68 65 20 for setting the
9780: 73 70 61 6e 20 2a 2f 0a 20 20 29 7b 0a 20 20 20 span */. ){.
9790: 20 70 4f 75 74 2d 3e 7a 53 74 61 72 74 20 3d 20 pOut->zStart =
97a0: 70 50 72 65 4f 70 2d 3e 7a 3b 0a 20 20 20 20 70 pPreOp->z;. p
97b0: 4f 75 74 2d 3e 70 45 78 70 72 20 3d 20 73 71 6c Out->pExpr = sql
97c0: 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 ite3PExpr(pParse
97d0: 2c 20 6f 70 2c 20 70 4f 70 65 72 61 6e 64 2d 3e , op, pOperand->
97e0: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 70 pExpr, 0);. p
97f0: 4f 75 74 2d 3e 7a 45 6e 64 20 3d 20 70 4f 70 65 Out->zEnd = pOpe
9800: 72 61 6e 64 2d 3e 7a 45 6e 64 3b 0a 20 20 7d 0a rand->zEnd;. }.
9810: 7d 0a 0a 0a 0a 65 78 70 72 28 41 29 20 3a 3a 3d }....expr(A) ::=
9820: 20 4e 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e NOT(B) expr(X).
9830: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 .
9840: 20 7b 73 70 61 6e 55 6e 61 72 79 50 72 65 66 69 {spanUnaryPrefi
9850: 78 28 26 41 2c 70 50 61 72 73 65 2c 40 42 2c 26 x(&A,pParse,@B,&
9860: 58 2c 26 42 29 3b 2f 2a 41 2d 6f 76 65 72 77 72 X,&B);/*A-overwr
9870: 69 74 65 73 2d 42 2a 2f 7d 0a 65 78 70 72 28 41 ites-B*/}.expr(A
9880: 29 20 3a 3a 3d 20 42 49 54 4e 4f 54 28 42 29 20 ) ::= BITNOT(B)
9890: 65 78 70 72 28 58 29 2e 0a 20 20 20 20 20 20 20 expr(X)..
98a0: 20 20 20 20 20 20 20 7b 73 70 61 6e 55 6e 61 72 {spanUnar
98b0: 79 50 72 65 66 69 78 28 26 41 2c 70 50 61 72 73 yPrefix(&A,pPars
98c0: 65 2c 40 42 2c 26 58 2c 26 42 29 3b 2f 2a 41 2d e,@B,&X,&B);/*A-
98d0: 6f 76 65 72 77 72 69 74 65 73 2d 42 2a 2f 7d 0a overwrites-B*/}.
98e0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 expr(A) ::= MINU
98f0: 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b 42 S(B) expr(X). [B
9900: 49 54 4e 4f 54 5d 0a 20 20 20 20 20 20 20 20 20 ITNOT].
9910: 20 20 20 20 20 7b 73 70 61 6e 55 6e 61 72 79 50 {spanUnaryP
9920: 72 65 66 69 78 28 26 41 2c 70 50 61 72 73 65 2c refix(&A,pParse,
9930: 54 4b 5f 55 4d 49 4e 55 53 2c 26 58 2c 26 42 29 TK_UMINUS,&X,&B)
9940: 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d ;/*A-overwrites-
9950: 42 2a 2f 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d B*/}.expr(A) ::=
9960: 20 50 4c 55 53 28 42 29 20 65 78 70 72 28 58 29 PLUS(B) expr(X)
9970: 2e 20 5b 42 49 54 4e 4f 54 5d 0a 20 20 20 20 20 . [BITNOT].
9980: 20 20 20 20 20 20 20 20 20 7b 73 70 61 6e 55 6e {spanUn
9990: 61 72 79 50 72 65 66 69 78 28 26 41 2c 70 50 61 aryPrefix(&A,pPa
99a0: 72 73 65 2c 54 4b 5f 55 50 4c 55 53 2c 26 58 2c rse,TK_UPLUS,&X,
99b0: 26 42 29 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 &B);/*A-overwrit
99c0: 65 73 2d 42 2a 2f 7d 0a 0a 25 74 79 70 65 20 62 es-B*/}..%type b
99d0: 65 74 77 65 65 6e 5f 6f 70 20 7b 69 6e 74 7d 0a etween_op {int}.
99e0: 62 65 74 77 65 65 6e 5f 6f 70 28 41 29 20 3a 3a between_op(A) ::
99f0: 3d 20 42 45 54 57 45 45 4e 2e 20 20 20 20 20 7b = BETWEEN. {
9a00: 41 20 3d 20 30 3b 7d 0a 62 65 74 77 65 65 6e 5f A = 0;}.between_
9a10: 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f 54 20 42 45 op(A) ::= NOT BE
9a20: 54 57 45 45 4e 2e 20 7b 41 20 3d 20 31 3b 7d 0a TWEEN. {A = 1;}.
9a30: 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 expr(A) ::= expr
9a40: 28 41 29 20 62 65 74 77 65 65 6e 5f 6f 70 28 4e (A) between_op(N
9a50: 29 20 65 78 70 72 28 58 29 20 41 4e 44 20 65 78 ) expr(X) AND ex
9a60: 70 72 28 59 29 2e 20 5b 42 45 54 57 45 45 4e 5d pr(Y). [BETWEEN]
9a70: 20 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 {. ExprList *p
9a80: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 List = sqlite3Ex
9a90: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 prListAppend(pPa
9aa0: 72 73 65 2c 30 2c 20 58 2e 70 45 78 70 72 29 3b rse,0, X.pExpr);
9ab0: 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 . pList = sqlit
9ac0: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 e3ExprListAppend
9ad0: 28 70 50 61 72 73 65 2c 70 4c 69 73 74 2c 20 59 (pParse,pList, Y
9ae0: 2e 70 45 78 70 72 29 3b 0a 20 20 41 2e 70 45 78 .pExpr);. A.pEx
9af0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 pr = sqlite3PExp
9b00: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 42 45 54 r(pParse, TK_BET
9b10: 57 45 45 4e 2c 20 41 2e 70 45 78 70 72 2c 20 30 WEEN, A.pExpr, 0
9b20: 29 3b 0a 20 20 69 66 28 20 41 2e 70 45 78 70 72 );. if( A.pExpr
9b30: 20 29 7b 0a 20 20 20 20 41 2e 70 45 78 70 72 2d ){. A.pExpr-
9b40: 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 >x.pList = pList
9b50: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 ;. }else{. s
9b60: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 qlite3ExprListDe
9b70: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c lete(pParse->db,
9b80: 20 70 4c 69 73 74 29 3b 0a 20 20 7d 20 0a 20 20 pList);. } .
9b90: 65 78 70 72 4e 6f 74 28 70 50 61 72 73 65 2c 20 exprNot(pParse,
9ba0: 4e 2c 20 26 41 29 3b 0a 20 20 41 2e 7a 45 6e 64 N, &A);. A.zEnd
9bb0: 20 3d 20 59 2e 7a 45 6e 64 3b 0a 7d 0a 25 69 66 = Y.zEnd;.}.%if
9bc0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
9bd0: 5f 53 55 42 51 55 45 52 59 0a 20 20 25 74 79 70 _SUBQUERY. %typ
9be0: 65 20 69 6e 5f 6f 70 20 7b 69 6e 74 7d 0a 20 20 e in_op {int}.
9bf0: 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 49 4e 2e in_op(A) ::= IN.
9c00: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 20 {A = 0;}.
9c10: 20 69 6e 5f 6f 70 28 41 29 20 3a 3a 3d 20 4e 4f in_op(A) ::= NO
9c20: 54 20 49 4e 2e 20 20 7b 41 20 3d 20 31 3b 7d 0a T IN. {A = 1;}.
9c30: 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 expr(A) ::= ex
9c40: 70 72 28 41 29 20 69 6e 5f 6f 70 28 4e 29 20 4c pr(A) in_op(N) L
9c50: 50 20 65 78 70 72 6c 69 73 74 28 59 29 20 52 50 P exprlist(Y) RP
9c60: 28 45 29 2e 20 5b 49 4e 5d 20 7b 0a 20 20 20 20 (E). [IN] {.
9c70: 69 66 28 20 59 3d 3d 30 20 29 7b 0a 20 20 20 20 if( Y==0 ){.
9c80: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 /* Expressions
9c90: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 20 of the form.
9ca0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 **. **
9cb0: 20 20 20 20 65 78 70 72 31 20 49 4e 20 28 29 0a expr1 IN ().
9cc0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 65 78 ** ex
9cd0: 70 72 31 20 4e 4f 54 20 49 4e 20 28 29 0a 20 20 pr1 NOT IN ().
9ce0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 **. **
9cf0: 73 69 6d 70 6c 69 66 79 20 74 6f 20 63 6f 6e 73 simplify to cons
9d00: 74 61 6e 74 73 20 30 20 28 66 61 6c 73 65 29 20 tants 0 (false)
9d10: 61 6e 64 20 31 20 28 74 72 75 65 29 2c 20 72 65 and 1 (true), re
9d20: 73 70 65 63 74 69 76 65 6c 79 2c 0a 20 20 20 20 spectively,.
9d30: 20 20 2a 2a 20 72 65 67 61 72 64 6c 65 73 73 20 ** regardless
9d40: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 of the value of
9d50: 65 78 70 72 31 2e 0a 20 20 20 20 20 20 2a 2f 0a expr1.. */.
9d60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 sqlite3Exp
9d70: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e rDelete(pParse->
9d80: 64 62 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20 db, A.pExpr);.
9d90: 20 20 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 A.pExpr = sq
9da0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 lite3ExprAlloc(p
9db0: 50 61 72 73 65 2d 3e 64 62 2c 20 54 4b 5f 49 4e Parse->db, TK_IN
9dc0: 54 45 47 45 52 2c 26 73 71 6c 69 74 65 33 49 6e TEGER,&sqlite3In
9dd0: 74 54 6f 6b 65 6e 73 5b 4e 5d 2c 31 29 3b 0a 20 tTokens[N],1);.
9de0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 59 2d 3e }else if( Y->
9df0: 6e 45 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 nExpr==1 ){.
9e00: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 73 /* Expressions
9e10: 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 of the form:.
9e20: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 **. **
9e30: 20 20 20 20 20 65 78 70 72 31 20 49 4e 20 28 3f expr1 IN (?
9e40: 31 29 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 1). **
9e50: 20 65 78 70 72 31 20 4e 4f 54 20 49 4e 20 28 3f expr1 NOT IN (?
9e60: 32 29 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 2). **.
9e70: 20 20 2a 2a 20 77 69 74 68 20 65 78 61 63 74 6c ** with exactl
9e80: 79 20 6f 6e 65 20 76 61 6c 75 65 20 6f 6e 20 74 y one value on t
9e90: 68 65 20 52 48 53 20 63 61 6e 20 62 65 20 73 69 he RHS can be si
9ea0: 6d 70 6c 69 66 69 65 64 20 74 6f 20 73 6f 6d 65 mplified to some
9eb0: 74 68 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 6c thing. ** l
9ec0: 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 20 20 ike this:.
9ed0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 **. **
9ee0: 20 65 78 70 72 31 20 3d 3d 20 3f 31 0a 20 20 20 expr1 == ?1.
9ef0: 20 20 20 2a 2a 20 20 20 20 20 20 65 78 70 72 31 ** expr1
9f00: 20 3c 3e 20 3f 32 0a 20 20 20 20 20 20 2a 2a 0a <> ?2. **.
9f10: 20 20 20 20 20 20 2a 2a 20 42 75 74 2c 20 74 68 ** But, th
9f20: 65 20 52 48 53 20 6f 66 20 74 68 65 20 3d 3d 20 e RHS of the ==
9f30: 6f 72 20 3c 3e 20 69 73 20 6d 61 72 6b 65 64 20 or <> is marked
9f40: 77 69 74 68 20 74 68 65 20 45 50 5f 47 65 6e 65 with the EP_Gene
9f50: 72 69 63 20 66 6c 61 67 0a 20 20 20 20 20 20 2a ric flag. *
9f60: 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61 79 * so that it may
9f70: 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 not contribute
9f80: 74 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 to the computati
9f90: 6f 6e 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e on of comparison
9fa0: 0a 20 20 20 20 20 20 2a 2a 20 61 66 66 69 6e 69 . ** affini
9fb0: 74 79 20 6f 72 20 74 68 65 20 63 6f 6c 6c 61 74 ty or the collat
9fc0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 ing sequence to
9fd0: 75 73 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 use for comparis
9fe0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a on. Otherwise,.
9ff0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 6d ** the sem
a000: 61 6e 74 69 63 73 20 77 6f 75 6c 64 20 62 65 20 antics would be
a010: 73 75 62 74 6c 79 20 64 69 66 66 65 72 65 6e 74 subtly different
a020: 20 66 72 6f 6d 20 49 4e 20 6f 72 20 4e 4f 54 20 from IN or NOT
a030: 49 4e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 IN.. */.
a040: 20 20 20 45 78 70 72 20 2a 70 52 48 53 20 3d 20 Expr *pRHS =
a050: 59 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 Y->a[0].pExpr;.
a060: 20 20 20 20 20 59 2d 3e 61 5b 30 5d 2e 70 45 78 Y->a[0].pEx
a070: 70 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 pr = 0;. sq
a080: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c lite3ExprListDel
a090: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 ete(pParse->db,
a0a0: 59 29 3b 0a 20 20 20 20 20 20 2f 2a 20 70 52 48 Y);. /* pRH
a0b0: 53 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c S cannot be NULL
a0c0: 20 62 65 63 61 75 73 65 20 61 20 6d 61 6c 6c 6f because a mallo
a0d0: 63 20 65 72 72 6f 72 20 77 6f 75 6c 64 20 68 61 c error would ha
a0e0: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64 ve been detected
a0f0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 . ** before
a100: 20 6e 6f 77 20 61 6e 64 20 63 6f 6e 74 72 6f 6c now and control
a110: 20 77 6f 75 6c 64 20 68 61 76 65 20 6e 65 76 65 would have neve
a120: 72 20 72 65 61 63 68 65 64 20 74 68 69 73 20 70 r reached this p
a130: 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 oint */. if
a140: 28 20 41 4c 57 41 59 53 28 70 52 48 53 29 20 29 ( ALWAYS(pRHS) )
a150: 7b 0a 20 20 20 20 20 20 20 20 70 52 48 53 2d 3e {. pRHS->
a160: 66 6c 61 67 73 20 26 3d 20 7e 45 50 5f 43 6f 6c flags &= ~EP_Col
a170: 6c 61 74 65 3b 0a 20 20 20 20 20 20 20 20 70 52 late;. pR
a180: 48 53 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f HS->flags |= EP_
a190: 47 65 6e 65 72 69 63 3b 0a 20 20 20 20 20 20 7d Generic;. }
a1a0: 0a 20 20 20 20 20 20 41 2e 70 45 78 70 72 20 3d . A.pExpr =
a1b0: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 sqlite3PExpr(pP
a1c0: 61 72 73 65 2c 20 4e 20 3f 20 54 4b 5f 4e 45 20 arse, N ? TK_NE
a1d0: 3a 20 54 4b 5f 45 51 2c 20 41 2e 70 45 78 70 72 : TK_EQ, A.pExpr
a1e0: 2c 20 70 52 48 53 29 3b 0a 20 20 20 20 7d 65 6c , pRHS);. }el
a1f0: 73 65 7b 0a 20 20 20 20 20 20 41 2e 70 45 78 70 se{. A.pExp
a200: 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 r = sqlite3PExpr
a210: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20 (pParse, TK_IN,
a220: 41 2e 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 A.pExpr, 0);.
a230: 20 20 20 69 66 28 20 41 2e 70 45 78 70 72 20 29 if( A.pExpr )
a240: 7b 0a 20 20 20 20 20 20 20 20 41 2e 70 45 78 70 {. A.pExp
a250: 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 59 3b 0a r->x.pList = Y;.
a260: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 sqlite3E
a270: 78 70 72 53 65 74 48 65 69 67 68 74 41 6e 64 46 xprSetHeightAndF
a280: 6c 61 67 73 28 70 50 61 72 73 65 2c 20 41 2e 70 lags(pParse, A.p
a290: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c Expr);. }el
a2a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 se{. sqli
a2b0: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 te3ExprListDelet
a2c0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29 e(pParse->db, Y)
a2d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
a2e0: 65 78 70 72 4e 6f 74 28 70 50 61 72 73 65 2c 20 exprNot(pParse,
a2f0: 4e 2c 20 26 41 29 3b 0a 20 20 20 20 7d 0a 20 20 N, &A);. }.
a300: 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e 7a 5b A.zEnd = &E.z[
a310: 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78 70 72 E.n];. }. expr
a320: 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 20 73 65 (A) ::= LP(B) se
a330: 6c 65 63 74 28 58 29 20 52 50 28 45 29 2e 20 7b lect(X) RP(E). {
a340: 0a 20 20 20 20 73 70 61 6e 53 65 74 28 26 41 2c . spanSet(&A,
a350: 26 42 2c 26 45 29 3b 20 2f 2a 41 2d 6f 76 65 72 &B,&E); /*A-over
a360: 77 72 69 74 65 73 2d 42 2a 2f 0a 20 20 20 20 41 writes-B*/. A
a370: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 .pExpr = sqlite3
a380: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b PExpr(pParse, TK
a390: 5f 53 45 4c 45 43 54 2c 20 30 2c 20 30 29 3b 0a _SELECT, 0, 0);.
a3a0: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 sqlite3PExpr
a3b0: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 AddSelect(pParse
a3c0: 2c 20 41 2e 70 45 78 70 72 2c 20 58 29 3b 0a 20 , A.pExpr, X);.
a3d0: 20 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d }. expr(A) ::=
a3e0: 20 65 78 70 72 28 41 29 20 69 6e 5f 6f 70 28 4e expr(A) in_op(N
a3f0: 29 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52 ) LP select(Y) R
a400: 50 28 45 29 2e 20 20 5b 49 4e 5d 20 7b 0a 20 20 P(E). [IN] {.
a410: 20 20 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 A.pExpr = sqli
a420: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c te3PExpr(pParse,
a430: 20 54 4b 5f 49 4e 2c 20 41 2e 70 45 78 70 72 2c TK_IN, A.pExpr,
a440: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 0);. sqlite3
a450: 50 45 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 PExprAddSelect(p
a460: 50 61 72 73 65 2c 20 41 2e 70 45 78 70 72 2c 20 Parse, A.pExpr,
a470: 59 29 3b 0a 20 20 20 20 65 78 70 72 4e 6f 74 28 Y);. exprNot(
a480: 70 50 61 72 73 65 2c 20 4e 2c 20 26 41 29 3b 0a pParse, N, &A);.
a490: 20 20 20 20 41 2e 7a 45 6e 64 20 3d 20 26 45 2e A.zEnd = &E.
a4a0: 7a 5b 45 2e 6e 5d 3b 0a 20 20 7d 0a 20 20 65 78 z[E.n];. }. ex
a4b0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 41 pr(A) ::= expr(A
a4c0: 29 20 69 6e 5f 6f 70 28 4e 29 20 6e 6d 28 59 29 ) in_op(N) nm(Y)
a4d0: 20 64 62 6e 6d 28 5a 29 20 70 61 72 65 6e 5f 65 dbnm(Z) paren_e
a4e0: 78 70 72 6c 69 73 74 28 45 29 2e 20 5b 49 4e 5d xprlist(E). [IN]
a4f0: 20 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a {. SrcList *
a500: 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 pSrc = sqlite3Sr
a510: 63 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 cListAppend(pPar
a520: 73 65 2d 3e 64 62 2c 20 30 2c 26 59 2c 26 5a 29 se->db, 0,&Y,&Z)
a530: 3b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 ;. Select *pS
a540: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 elect = sqlite3S
a550: 65 6c 65 63 74 4e 65 77 28 70 50 61 72 73 65 2c electNew(pParse,
a560: 20 30 2c 70 53 72 63 2c 30 2c 30 2c 30 2c 30 2c 0,pSrc,0,0,0,0,
a570: 30 2c 30 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 0,0,0);. if(
a580: 45 20 29 20 20 73 71 6c 69 74 65 33 53 72 63 4c E ) sqlite3SrcL
a590: 69 73 74 46 75 6e 63 41 72 67 73 28 70 50 61 72 istFuncArgs(pPar
a5a0: 73 65 2c 20 70 53 65 6c 65 63 74 20 3f 20 70 53 se, pSelect ? pS
a5b0: 72 63 20 3a 20 30 2c 20 45 29 3b 0a 20 20 20 20 rc : 0, E);.
a5c0: 41 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 A.pExpr = sqlite
a5d0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 3PExpr(pParse, T
a5e0: 4b 5f 49 4e 2c 20 41 2e 70 45 78 70 72 2c 20 30 K_IN, A.pExpr, 0
a5f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 45 );. sqlite3PE
a600: 78 70 72 41 64 64 53 65 6c 65 63 74 28 70 50 61 xprAddSelect(pPa
a610: 72 73 65 2c 20 41 2e 70 45 78 70 72 2c 20 70 53 rse, A.pExpr, pS
a620: 65 6c 65 63 74 29 3b 0a 20 20 20 20 65 78 70 72 elect);. expr
a630: 4e 6f 74 28 70 50 61 72 73 65 2c 20 4e 2c 20 26 Not(pParse, N, &
a640: 41 29 3b 0a 20 20 20 20 41 2e 7a 45 6e 64 20 3d A);. A.zEnd =
a650: 20 5a 2e 7a 20 3f 20 26 5a 2e 7a 5b 5a 2e 6e 5d Z.z ? &Z.z[Z.n]
a660: 20 3a 20 26 59 2e 7a 5b 59 2e 6e 5d 3b 0a 20 20 : &Y.z[Y.n];.
a670: 7d 0a 20 20 65 78 70 72 28 41 29 20 3a 3a 3d 20 }. expr(A) ::=
a680: 45 58 49 53 54 53 28 42 29 20 4c 50 20 73 65 6c EXISTS(B) LP sel
a690: 65 63 74 28 59 29 20 52 50 28 45 29 2e 20 7b 0a ect(Y) RP(E). {.
a6a0: 20 20 20 20 45 78 70 72 20 2a 70 3b 0a 20 20 20 Expr *p;.
a6b0: 20 73 70 61 6e 53 65 74 28 26 41 2c 26 42 2c 26 spanSet(&A,&B,&
a6c0: 45 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 E); /*A-overwrit
a6d0: 65 73 2d 42 2a 2f 0a 20 20 20 20 70 20 3d 20 41 es-B*/. p = A
a6e0: 2e 70 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 .pExpr = sqlite3
a6f0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b PExpr(pParse, TK
a700: 5f 45 58 49 53 54 53 2c 20 30 2c 20 30 29 3b 0a _EXISTS, 0, 0);.
a710: 20 20 20 20 73 71 6c 69 74 65 33 50 45 78 70 72 sqlite3PExpr
a720: 41 64 64 53 65 6c 65 63 74 28 70 50 61 72 73 65 AddSelect(pParse
a730: 2c 20 70 2c 20 59 29 3b 0a 20 20 7d 0a 25 65 6e , p, Y);. }.%en
a740: 64 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f dif SQLITE_OMIT_
a750: 53 55 42 51 55 45 52 59 0a 0a 2f 2a 20 43 41 53 SUBQUERY../* CAS
a760: 45 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f E expressions */
a770: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 43 41 53 .expr(A) ::= CAS
a780: 45 28 43 29 20 63 61 73 65 5f 6f 70 65 72 61 6e E(C) case_operan
a790: 64 28 58 29 20 63 61 73 65 5f 65 78 70 72 6c 69 d(X) case_exprli
a7a0: 73 74 28 59 29 20 63 61 73 65 5f 65 6c 73 65 28 st(Y) case_else(
a7b0: 5a 29 20 45 4e 44 28 45 29 2e 20 7b 0a 20 20 73 Z) END(E). {. s
a7c0: 70 61 6e 53 65 74 28 26 41 2c 26 43 2c 26 45 29 panSet(&A,&C,&E)
a7d0: 3b 20 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 ; /*A-overwrite
a7e0: 73 2d 43 2a 2f 0a 20 20 41 2e 70 45 78 70 72 20 s-C*/. A.pExpr
a7f0: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 = sqlite3PExpr(p
a800: 50 61 72 73 65 2c 20 54 4b 5f 43 41 53 45 2c 20 Parse, TK_CASE,
a810: 58 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 2e 70 X, 0);. if( A.p
a820: 45 78 70 72 20 29 7b 0a 20 20 20 20 41 2e 70 45 Expr ){. A.pE
a830: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 5a xpr->x.pList = Z
a840: 20 3f 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 ? sqlite3ExprLi
a850: 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c stAppend(pParse,
a860: 59 2c 5a 29 20 3a 20 59 3b 0a 20 20 20 20 73 71 Y,Z) : Y;. sq
a870: 6c 69 74 65 33 45 78 70 72 53 65 74 48 65 69 67 lite3ExprSetHeig
a880: 68 74 41 6e 64 46 6c 61 67 73 28 70 50 61 72 73 htAndFlags(pPars
a890: 65 2c 20 41 2e 70 45 78 70 72 29 3b 0a 20 20 7d e, A.pExpr);. }
a8a0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 else{. sqlite
a8b0: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 3ExprListDelete(
a8c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 59 29 3b 0a pParse->db, Y);.
a8d0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 sqlite3ExprD
a8e0: 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 elete(pParse->db
a8f0: 2c 20 5a 29 3b 0a 20 20 7d 0a 7d 0a 25 74 79 70 , Z);. }.}.%typ
a900: 65 20 63 61 73 65 5f 65 78 70 72 6c 69 73 74 20 e case_exprlist
a910: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 {ExprList*}.%des
a920: 74 72 75 63 74 6f 72 20 63 61 73 65 5f 65 78 70 tructor case_exp
a930: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 rlist {sqlite3Ex
a940: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 prListDelete(pPa
a950: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 rse->db, $$);}.c
a960: 61 73 65 5f 65 78 70 72 6c 69 73 74 28 41 29 20 ase_exprlist(A)
a970: 3a 3a 3d 20 63 61 73 65 5f 65 78 70 72 6c 69 73 ::= case_exprlis
a980: 74 28 41 29 20 57 48 45 4e 20 65 78 70 72 28 59 t(A) WHEN expr(Y
a990: 29 20 54 48 45 4e 20 65 78 70 72 28 5a 29 2e 20 ) THEN expr(Z).
a9a0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 {. A = sqlite3E
a9b0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 xprListAppend(pP
a9c0: 61 72 73 65 2c 41 2c 20 59 2e 70 45 78 70 72 29 arse,A, Y.pExpr)
a9d0: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 45 ;. A = sqlite3E
a9e0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 xprListAppend(pP
a9f0: 61 72 73 65 2c 41 2c 20 5a 2e 70 45 78 70 72 29 arse,A, Z.pExpr)
aa00: 3b 0a 7d 0a 63 61 73 65 5f 65 78 70 72 6c 69 73 ;.}.case_exprlis
aa10: 74 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78 t(A) ::= WHEN ex
aa20: 70 72 28 59 29 20 54 48 45 4e 20 65 78 70 72 28 pr(Y) THEN expr(
aa30: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 Z). {. A = sqli
aa40: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e te3ExprListAppen
aa50: 64 28 70 50 61 72 73 65 2c 30 2c 20 59 2e 70 45 d(pParse,0, Y.pE
aa60: 78 70 72 29 3b 0a 20 20 41 20 3d 20 73 71 6c 69 xpr);. A = sqli
aa70: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e te3ExprListAppen
aa80: 64 28 70 50 61 72 73 65 2c 41 2c 20 5a 2e 70 45 d(pParse,A, Z.pE
aa90: 78 70 72 29 3b 0a 7d 0a 25 74 79 70 65 20 63 61 xpr);.}.%type ca
aaa0: 73 65 5f 65 6c 73 65 20 7b 45 78 70 72 2a 7d 0a se_else {Expr*}.
aab0: 25 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 %destructor case
aac0: 5f 65 6c 73 65 20 7b 73 71 6c 69 74 65 33 45 78 _else {sqlite3Ex
aad0: 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d prDelete(pParse-
aae0: 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73 65 5f >db, $$);}.case_
aaf0: 65 6c 73 65 28 41 29 20 3a 3a 3d 20 20 45 4c 53 else(A) ::= ELS
ab00: 45 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 E expr(X).
ab10: 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70 72 3b {A = X.pExpr;
ab20: 7d 0a 63 61 73 65 5f 65 6c 73 65 28 41 29 20 3a }.case_else(A) :
ab30: 3a 3d 20 20 2e 20 20 20 20 20 20 20 20 20 20 20 := .
ab40: 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 {A = 0
ab50: 3b 7d 20 0a 25 74 79 70 65 20 63 61 73 65 5f 6f ;} .%type case_o
ab60: 70 65 72 61 6e 64 20 7b 45 78 70 72 2a 7d 0a 25 perand {Expr*}.%
ab70: 64 65 73 74 72 75 63 74 6f 72 20 63 61 73 65 5f destructor case_
ab80: 6f 70 65 72 61 6e 64 20 7b 73 71 6c 69 74 65 33 operand {sqlite3
ab90: 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72 73 ExprDelete(pPars
aba0: 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 63 61 73 e->db, $$);}.cas
abb0: 65 5f 6f 70 65 72 61 6e 64 28 41 29 20 3a 3a 3d e_operand(A) ::=
abc0: 20 65 78 70 72 28 58 29 2e 20 20 20 20 20 20 20 expr(X).
abd0: 20 20 20 20 20 7b 41 20 3d 20 58 2e 70 45 78 70 {A = X.pExp
abe0: 72 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 r; /*A-overwrite
abf0: 73 2d 58 2a 2f 7d 20 0a 63 61 73 65 5f 6f 70 65 s-X*/} .case_ope
ac00: 72 61 6e 64 28 41 29 20 3a 3a 3d 20 2e 20 20 20 rand(A) ::= .
ac10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ac20: 7b 41 20 3d 20 30 3b 7d 20 0a 0a 25 74 79 70 65 {A = 0;} ..%type
ac30: 20 65 78 70 72 6c 69 73 74 20 7b 45 78 70 72 4c exprlist {ExprL
ac40: 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f ist*}.%destructo
ac50: 72 20 65 78 70 72 6c 69 73 74 20 7b 73 71 6c 69 r exprlist {sqli
ac60: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 te3ExprListDelet
ac70: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 e(pParse->db, $$
ac80: 29 3b 7d 0a 25 74 79 70 65 20 6e 65 78 70 72 6c );}.%type nexprl
ac90: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a ist {ExprList*}.
aca0: 25 64 65 73 74 72 75 63 74 6f 72 20 6e 65 78 70 %destructor nexp
acb0: 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 78 rlist {sqlite3Ex
acc0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61 prListDelete(pPa
acd0: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 0a rse->db, $$);}..
ace0: 65 78 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 exprlist(A) ::=
acf0: 6e 65 78 70 72 6c 69 73 74 28 41 29 2e 0a 65 78 nexprlist(A)..ex
ad00: 70 72 6c 69 73 74 28 41 29 20 3a 3a 3d 20 2e 20 prlist(A) ::= .
ad10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ad20: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 {A =
ad30: 30 3b 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41 29 0;}.nexprlist(A)
ad40: 20 3a 3a 3d 20 6e 65 78 70 72 6c 69 73 74 28 41 ::= nexprlist(A
ad50: 29 20 43 4f 4d 4d 41 20 65 78 70 72 28 59 29 2e ) COMMA expr(Y).
ad60: 0a 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 . {A = sqlite
ad70: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 3ExprListAppend(
ad80: 70 50 61 72 73 65 2c 41 2c 59 2e 70 45 78 70 72 pParse,A,Y.pExpr
ad90: 29 3b 7d 0a 6e 65 78 70 72 6c 69 73 74 28 41 29 );}.nexprlist(A)
ada0: 20 3a 3a 3d 20 65 78 70 72 28 59 29 2e 0a 20 20 ::= expr(Y)..
adb0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 45 78 {A = sqlite3Ex
adc0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 prListAppend(pPa
add0: 72 73 65 2c 30 2c 59 2e 70 45 78 70 72 29 3b 20 rse,0,Y.pExpr);
ade0: 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 59 /*A-overwrites-Y
adf0: 2a 2f 7d 0a 0a 25 69 66 6e 64 65 66 20 53 51 4c */}..%ifndef SQL
ae00: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 ITE_OMIT_SUBQUER
ae10: 59 0a 2f 2a 20 41 20 70 61 72 65 6e 5f 65 78 70 Y./* A paren_exp
ae20: 72 6c 69 73 74 20 69 73 20 61 6e 20 6f 70 74 69 rlist is an opti
ae30: 6f 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 onal expression
ae40: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 list contained i
ae50: 6e 73 69 64 65 0a 2a 2a 20 6f 66 20 70 61 72 65 nside.** of pare
ae60: 6e 74 68 65 73 69 73 20 2a 2f 0a 25 74 79 70 65 nthesis */.%type
ae70: 20 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 74 20 paren_exprlist
ae80: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 {ExprList*}.%des
ae90: 74 72 75 63 74 6f 72 20 70 61 72 65 6e 5f 65 78 tructor paren_ex
aea0: 70 72 6c 69 73 74 20 7b 73 71 6c 69 74 65 33 45 prlist {sqlite3E
aeb0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 xprListDelete(pP
aec0: 61 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a arse->db, $$);}.
aed0: 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 74 28 41 paren_exprlist(A
aee0: 29 20 3a 3a 3d 20 2e 20 20 20 7b 41 20 3d 20 30 ) ::= . {A = 0
aef0: 3b 7d 0a 70 61 72 65 6e 5f 65 78 70 72 6c 69 73 ;}.paren_exprlis
af00: 74 28 41 29 20 3a 3a 3d 20 4c 50 20 65 78 70 72 t(A) ::= LP expr
af10: 6c 69 73 74 28 58 29 20 52 50 2e 20 20 7b 41 20 list(X) RP. {A
af20: 3d 20 58 3b 7d 0a 25 65 6e 64 69 66 20 53 51 4c = X;}.%endif SQL
af30: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 ITE_OMIT_SUBQUER
af40: 59 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f Y...////////////
af50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
af60: 2f 20 54 68 65 20 43 52 45 41 54 45 20 49 4e 44 / The CREATE IND
af70: 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f EX command /////
af80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
af90: 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 63 72 //.//.cmd ::= cr
afa0: 65 61 74 65 6b 77 28 53 29 20 75 6e 69 71 75 65 eatekw(S) unique
afb0: 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20 69 66 flag(U) INDEX if
afc0: 6e 6f 74 65 78 69 73 74 73 28 4e 45 29 20 6e 6d notexists(NE) nm
afd0: 28 58 29 20 64 62 6e 6d 28 44 29 0a 20 20 20 20 (X) dbnm(D).
afe0: 20 20 20 20 4f 4e 20 6e 6d 28 59 29 20 4c 50 20 ON nm(Y) LP
aff0: 73 6f 72 74 6c 69 73 74 28 5a 29 20 52 50 20 77 sortlist(Z) RP w
b000: 68 65 72 65 5f 6f 70 74 28 57 29 2e 20 7b 0a 20 here_opt(W). {.
b010: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e sqlite3CreateIn
b020: 64 65 78 28 70 50 61 72 73 65 2c 20 26 58 2c 20 dex(pParse, &X,
b030: 26 44 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 &D, .
b040: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
b050: 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 70 3SrcListAppend(p
b060: 50 61 72 73 65 2d 3e 64 62 2c 30 2c 26 59 2c 30 Parse->db,0,&Y,0
b070: 29 2c 20 5a 2c 20 55 2c 0a 20 20 20 20 20 20 20 ), Z, U,.
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 &
b090: 53 2c 20 57 2c 20 53 51 4c 49 54 45 5f 53 4f 5f S, W, SQLITE_SO_
b0a0: 41 53 43 2c 20 4e 45 2c 20 53 51 4c 49 54 45 5f ASC, NE, SQLITE_
b0b0: 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 29 3b IDXTYPE_APPDEF);
b0c0: 0a 7d 0a 0a 25 74 79 70 65 20 75 6e 69 71 75 65 .}..%type unique
b0d0: 66 6c 61 67 20 7b 69 6e 74 7d 0a 75 6e 69 71 75 flag {int}.uniqu
b0e0: 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 55 4e 49 eflag(A) ::= UNI
b0f0: 51 55 45 2e 20 20 7b 41 20 3d 20 4f 45 5f 41 62 QUE. {A = OE_Ab
b100: 6f 72 74 3b 7d 0a 75 6e 69 71 75 65 66 6c 61 67 ort;}.uniqueflag
b110: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 (A) ::= .
b120: 20 7b 41 20 3d 20 4f 45 5f 4e 6f 6e 65 3b 7d 0a {A = OE_None;}.
b130: 0a 0a 2f 2f 20 54 68 65 20 65 69 64 6c 69 73 74 ..// The eidlist
b140: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 28 45 non-terminal (E
b150: 78 70 72 65 73 73 69 6f 6e 20 49 64 20 4c 69 73 xpression Id Lis
b160: 74 29 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20 t) generates an
b170: 45 78 70 72 4c 69 73 74 0a 2f 2f 20 66 72 6f 6d ExprList.// from
b180: 20 61 20 6c 69 73 74 20 6f 66 20 69 64 65 6e 74 a list of ident
b190: 69 66 69 65 72 73 2e 20 20 54 68 65 20 69 64 65 ifiers. The ide
b1a0: 6e 74 69 66 69 65 72 20 6e 61 6d 65 73 20 61 72 ntifier names ar
b1b0: 65 20 69 6e 20 45 78 70 72 4c 69 73 74 2e 61 5b e in ExprList.a[
b1c0: 5d 2e 7a 4e 61 6d 65 2e 0a 2f 2f 20 54 68 69 73 ].zName..// This
b1d0: 20 6c 69 73 74 20 69 73 20 73 74 6f 72 65 64 20 list is stored
b1e0: 69 6e 20 61 6e 20 45 78 70 72 4c 69 73 74 20 72 in an ExprList r
b1f0: 61 74 68 65 72 20 74 68 61 6e 20 61 6e 20 49 64 ather than an Id
b200: 4c 69 73 74 20 73 6f 20 74 68 61 74 20 69 74 0a List so that it.
b210: 2f 2f 20 63 61 6e 20 62 65 20 65 61 73 69 6c 79 // can be easily
b220: 20 73 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 sent to sqlite3
b230: 43 6f 6c 75 6d 6e 73 45 78 70 72 4c 69 73 74 28 ColumnsExprList(
b240: 29 2e 0a 2f 2f 0a 2f 2f 20 65 69 64 6c 69 73 74 )..//.// eidlist
b250: 20 69 73 20 67 72 6f 75 70 65 64 20 77 69 74 68 is grouped with
b260: 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62 65 CREATE INDEX be
b270: 63 61 75 73 65 20 69 74 20 75 73 65 64 20 74 6f cause it used to
b280: 20 62 65 20 74 68 65 20 6e 6f 6e 2d 74 65 72 6d be the non-term
b290: 69 6e 61 6c 0a 2f 2f 20 75 73 65 64 20 66 6f 72 inal.// used for
b2a0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 the arguments t
b2b0: 6f 20 61 6e 20 69 6e 64 65 78 2e 20 20 54 68 61 o an index. Tha
b2c0: 74 20 69 73 20 6a 75 73 74 20 61 6e 20 68 69 73 t is just an his
b2d0: 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65 6e 74 torical accident
b2e0: 2e 0a 2f 2f 0a 2f 2f 20 49 4d 50 4f 52 54 41 4e ..//.// IMPORTAN
b2f0: 54 20 43 4f 4d 50 41 54 49 42 49 4c 49 54 59 20 T COMPATIBILITY
b300: 4e 4f 54 45 3a 20 20 53 6f 6d 65 20 70 72 69 6f NOTE: Some prio
b310: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 r versions of SQ
b320: 4c 69 74 65 20 61 63 63 65 70 74 65 64 0a 2f 2f Lite accepted.//
b330: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 73 COLLATE clauses
b340: 20 61 6e 64 20 41 53 43 20 6f 72 20 44 45 53 43 and ASC or DESC
b350: 20 6b 65 79 77 6f 72 64 73 20 6f 6e 20 49 44 20 keywords on ID
b360: 6c 69 73 74 73 20 69 6e 20 69 6e 61 70 70 72 6f lists in inappro
b370: 70 72 69 61 74 65 0a 2f 2f 20 70 6c 61 63 65 73 priate.// places
b380: 20 2d 20 70 6c 61 63 65 73 20 74 68 61 74 20 6d - places that m
b390: 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 73 ight have been s
b3a0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73 71 6c tored in the sql
b3b0: 69 74 65 5f 6d 61 73 74 65 72 20 73 63 68 65 6d ite_master schem
b3c0: 61 2e 0a 2f 2f 20 54 68 6f 73 65 20 65 78 74 72 a..// Those extr
b3d0: 61 20 66 65 61 74 75 72 65 73 20 77 65 72 65 20 a features were
b3e0: 69 67 6e 6f 72 65 64 2e 20 20 42 75 74 20 62 65 ignored. But be
b3f0: 63 61 75 73 65 20 74 68 65 79 20 6d 69 67 68 74 cause they might
b400: 20 62 65 20 69 6e 20 73 6f 6d 65 0a 2f 2f 20 28 be in some.// (
b410: 62 75 73 74 65 64 29 20 6f 6c 64 20 64 61 74 61 busted) old data
b420: 62 61 73 65 73 2c 20 77 65 20 6e 65 65 64 20 74 bases, we need t
b430: 6f 20 63 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 o continue parsi
b440: 6e 67 20 74 68 65 6d 20 77 68 65 6e 20 6c 6f 61 ng them when loa
b450: 64 69 6e 67 0a 2f 2f 20 68 69 73 74 6f 72 69 63 ding.// historic
b460: 61 6c 20 73 63 68 65 6d 61 73 2e 0a 2f 2f 0a 25 al schemas..//.%
b470: 74 79 70 65 20 65 69 64 6c 69 73 74 20 7b 45 78 type eidlist {Ex
b480: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 prList*}.%destru
b490: 63 74 6f 72 20 65 69 64 6c 69 73 74 20 7b 73 71 ctor eidlist {sq
b4a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c lite3ExprListDel
b4b0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 ete(pParse->db,
b4c0: 24 24 29 3b 7d 0a 25 74 79 70 65 20 65 69 64 6c $$);}.%type eidl
b4d0: 69 73 74 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 ist_opt {ExprLis
b4e0: 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 t*}.%destructor
b4f0: 65 69 64 6c 69 73 74 5f 6f 70 74 20 7b 73 71 6c eidlist_opt {sql
b500: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 ite3ExprListDele
b510: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 te(pParse->db, $
b520: 24 29 3b 7d 0a 0a 25 69 6e 63 6c 75 64 65 20 7b $);}..%include {
b530: 0a 20 20 2f 2a 20 41 64 64 20 61 20 73 69 6e 67 . /* Add a sing
b540: 6c 65 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 61 le new term to a
b550: 6e 20 45 78 70 72 4c 69 73 74 20 74 68 61 74 20 n ExprList that
b560: 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 is used to store
b570: 20 61 0a 20 20 2a 2a 20 6c 69 73 74 20 6f 66 20 a. ** list of
b580: 69 64 65 6e 74 69 66 69 65 72 73 2e 20 20 52 65 identifiers. Re
b590: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 69 66 port an error if
b5a0: 20 74 68 65 20 49 44 20 6c 69 73 74 20 63 6f 6e the ID list con
b5b0: 74 61 69 6e 73 0a 20 20 2a 2a 20 61 20 43 4f 4c tains. ** a COL
b5c0: 4c 41 54 45 20 63 6c 61 75 73 65 20 6f 72 20 61 LATE clause or a
b5d0: 6e 20 41 53 43 20 6f 72 20 44 45 53 43 20 6b 65 n ASC or DESC ke
b5e0: 79 77 6f 72 64 2c 20 65 78 63 65 70 74 20 69 67 yword, except ig
b5f0: 6e 6f 72 65 20 74 68 65 0a 20 20 2a 2a 20 65 72 nore the. ** er
b600: 72 6f 72 20 77 68 69 6c 65 20 70 61 72 73 69 6e ror while parsin
b610: 67 20 61 20 6c 65 67 61 63 79 20 73 63 68 65 6d g a legacy schem
b620: 61 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 a.. */. static
b630: 20 45 78 70 72 4c 69 73 74 20 2a 70 61 72 73 65 ExprList *parse
b640: 72 41 64 64 45 78 70 72 49 64 4c 69 73 74 54 65 rAddExprIdListTe
b650: 72 6d 28 0a 20 20 20 20 50 61 72 73 65 20 2a 70 rm(. Parse *p
b660: 50 61 72 73 65 2c 0a 20 20 20 20 45 78 70 72 4c Parse,. ExprL
b670: 69 73 74 20 2a 70 50 72 69 6f 72 2c 0a 20 20 20 ist *pPrior,.
b680: 20 54 6f 6b 65 6e 20 2a 70 49 64 54 6f 6b 65 6e Token *pIdToken
b690: 2c 0a 20 20 20 20 69 6e 74 20 68 61 73 43 6f 6c ,. int hasCol
b6a0: 6c 61 74 65 2c 0a 20 20 20 20 69 6e 74 20 73 6f late,. int so
b6b0: 72 74 4f 72 64 65 72 0a 20 20 29 7b 0a 20 20 20 rtOrder. ){.
b6c0: 20 45 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 73 ExprList *p = s
b6d0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 qlite3ExprListAp
b6e0: 70 65 6e 64 28 70 50 61 72 73 65 2c 20 70 50 72 pend(pParse, pPr
b6f0: 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 ior, 0);. if(
b700: 20 28 68 61 73 43 6f 6c 6c 61 74 65 20 7c 7c 20 (hasCollate ||
b710: 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 sortOrder!=SQLIT
b720: 45 5f 53 4f 5f 55 4e 44 45 46 49 4e 45 44 29 0a E_SO_UNDEFINED).
b730: 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72 73 && pPars
b740: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 e->db->init.busy
b750: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 ==0. ){.
b760: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 sqlite3ErrorMsg
b770: 28 70 50 61 72 73 65 2c 20 22 73 79 6e 74 61 78 (pParse, "syntax
b780: 20 65 72 72 6f 72 20 61 66 74 65 72 20 63 6f 6c error after col
b790: 75 6d 6e 20 6e 61 6d 65 20 5c 22 25 2e 2a 73 5c umn name \"%.*s\
b7a0: 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 "",.
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 pId
b7c0: 54 6f 6b 65 6e 2d 3e 6e 2c 20 70 49 64 54 6f 6b Token->n, pIdTok
b7d0: 65 6e 2d 3e 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 en->z);. }.
b7e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 sqlite3ExprLis
b7f0: 74 53 65 74 4e 61 6d 65 28 70 50 61 72 73 65 2c tSetName(pParse,
b800: 20 70 2c 20 70 49 64 54 6f 6b 65 6e 2c 20 31 29 p, pIdToken, 1)
b810: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a ;. return p;.
b820: 20 20 7d 0a 7d 20 2f 2f 20 65 6e 64 20 25 69 6e }.} // end %in
b830: 63 6c 75 64 65 0a 0a 65 69 64 6c 69 73 74 5f 6f clude..eidlist_o
b840: 70 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 pt(A) ::= .
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b860: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 65 69 64 {A = 0;}.eid
b870: 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 list_opt(A) ::=
b880: 4c 50 20 65 69 64 6c 69 73 74 28 58 29 20 52 50 LP eidlist(X) RP
b890: 2e 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 . {A = X
b8a0: 3b 7d 0a 65 69 64 6c 69 73 74 28 41 29 20 3a 3a ;}.eidlist(A) ::
b8b0: 3d 20 65 69 64 6c 69 73 74 28 41 29 20 43 4f 4d = eidlist(A) COM
b8c0: 4d 41 20 6e 6d 28 59 29 20 63 6f 6c 6c 61 74 65 MA nm(Y) collate
b8d0: 28 43 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 (C) sortorder(Z)
b8e0: 2e 20 20 7b 0a 20 20 41 20 3d 20 70 61 72 73 65 . {. A = parse
b8f0: 72 41 64 64 45 78 70 72 49 64 4c 69 73 74 54 65 rAddExprIdListTe
b900: 72 6d 28 70 50 61 72 73 65 2c 20 41 2c 20 26 59 rm(pParse, A, &Y
b910: 2c 20 43 2c 20 5a 29 3b 0a 7d 0a 65 69 64 6c 69 , C, Z);.}.eidli
b920: 73 74 28 41 29 20 3a 3a 3d 20 6e 6d 28 59 29 20 st(A) ::= nm(Y)
b930: 63 6f 6c 6c 61 74 65 28 43 29 20 73 6f 72 74 6f collate(C) sorto
b940: 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 20 3d rder(Z). {. A =
b950: 20 70 61 72 73 65 72 41 64 64 45 78 70 72 49 64 parserAddExprId
b960: 4c 69 73 74 54 65 72 6d 28 70 50 61 72 73 65 2c ListTerm(pParse,
b970: 20 30 2c 20 26 59 2c 20 43 2c 20 5a 29 3b 20 2f 0, &Y, C, Z); /
b980: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 59 2a *A-overwrites-Y*
b990: 2f 0a 7d 0a 0a 25 74 79 70 65 20 63 6f 6c 6c 61 /.}..%type colla
b9a0: 74 65 20 7b 69 6e 74 7d 0a 63 6f 6c 6c 61 74 65 te {int}.collate
b9b0: 28 43 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 (C) ::= .
b9c0: 20 20 20 20 20 20 20 7b 43 20 3d 20 30 3b 7d 0a {C = 0;}.
b9d0: 63 6f 6c 6c 61 74 65 28 43 29 20 3a 3a 3d 20 43 collate(C) ::= C
b9e0: 4f 4c 4c 41 54 45 20 69 64 73 2e 20 20 20 7b 43 OLLATE ids. {C
b9f0: 20 3d 20 31 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f 2f 2f = 1;}...///////
ba00: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
ba10: 2f 2f 2f 2f 2f 2f 20 54 68 65 20 44 52 4f 50 20 ////// The DROP
ba20: 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f 2f INDEX command //
ba30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
ba40: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a ///////.//.cmd :
ba50: 3a 3d 20 44 52 4f 50 20 49 4e 44 45 58 20 69 66 := DROP INDEX if
ba60: 65 78 69 73 74 73 28 45 29 20 66 75 6c 6c 6e 61 exists(E) fullna
ba70: 6d 65 28 58 29 2e 20 20 20 7b 73 71 6c 69 74 65 me(X). {sqlite
ba80: 33 44 72 6f 70 49 6e 64 65 78 28 70 50 61 72 73 3DropIndex(pPars
ba90: 65 2c 20 58 2c 20 45 29 3b 7d 0a 0a 2f 2f 2f 2f e, X, E);}..////
baa0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
bab0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 56 41 ///////// The VA
bac0: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 2f 2f 2f CUUM command ///
bad0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
bae0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 69 //////////.//.%i
baf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
bb00: 54 5f 56 41 43 55 55 4d 0a 25 69 66 6e 64 65 66 T_VACUUM.%ifndef
bb10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 SQLITE_OMIT_ATT
bb20: 41 43 48 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 ACH.cmd ::= VACU
bb30: 55 4d 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 UM.
bb40: 20 20 20 7b 73 71 6c 69 74 65 33 56 61 63 75 75 {sqlite3Vacuu
bb50: 6d 28 70 50 61 72 73 65 2c 30 29 3b 7d 0a 63 6d m(pParse,0);}.cm
bb60: 64 20 3a 3a 3d 20 56 41 43 55 55 4d 20 6e 6d 28 d ::= VACUUM nm(
bb70: 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 73 71 X). {sq
bb80: 6c 69 74 65 33 56 61 63 75 75 6d 28 70 50 61 72 lite3Vacuum(pPar
bb90: 73 65 2c 26 58 29 3b 7d 0a 25 65 6e 64 69 66 20 se,&X);}.%endif
bba0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 SQLITE_OMIT_ATT
bbb0: 41 43 48 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 ACH.%endif SQLI
bbc0: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 0a TE_OMIT_VACUUM..
bbd0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
bbe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 ///////////// Th
bbf0: 65 20 50 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 e PRAGMA command
bc00: 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ///////////////
bc10: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f //////////////./
bc20: 2f 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 /.%ifndef SQLITE
bc30: 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 63 6d 64 _OMIT_PRAGMA.cmd
bc40: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 ::= PRAGMA nm(X
bc50: 29 20 64 62 6e 6d 28 5a 29 2e 20 20 20 20 20 20 ) dbnm(Z).
bc60: 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 {sqlit
bc70: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c e3Pragma(pParse,
bc80: 26 58 2c 26 5a 2c 30 2c 30 29 3b 7d 0a 63 6d 64 &X,&Z,0,0);}.cmd
bc90: 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 58 ::= PRAGMA nm(X
bca0: 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6e 6d 6e ) dbnm(Z) EQ nmn
bcb0: 75 6d 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74 um(Y). {sqlit
bcc0: 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c e3Pragma(pParse,
bcd0: 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 6d &X,&Z,&Y,0);}.cm
bce0: 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d 28 d ::= PRAGMA nm(
bcf0: 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20 6e 6d X) dbnm(Z) LP nm
bd00: 6e 75 6d 28 59 29 20 52 50 2e 20 7b 73 71 6c 69 num(Y) RP. {sqli
bd10: 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 te3Pragma(pParse
bd20: 2c 26 58 2c 26 5a 2c 26 59 2c 30 29 3b 7d 0a 63 ,&X,&Z,&Y,0);}.c
bd30: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d md ::= PRAGMA nm
bd40: 28 58 29 20 64 62 6e 6d 28 5a 29 20 45 51 20 6d (X) dbnm(Z) EQ m
bd50: 69 6e 75 73 5f 6e 75 6d 28 59 29 2e 20 0a 20 20 inus_num(Y). .
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bd80: 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 {sqli
bd90: 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 73 65 te3Pragma(pParse
bda0: 2c 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 7d 0a 63 ,&X,&Z,&Y,1);}.c
bdb0: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 6e 6d md ::= PRAGMA nm
bdc0: 28 58 29 20 64 62 6e 6d 28 5a 29 20 4c 50 20 6d (X) dbnm(Z) LP m
bdd0: 69 6e 75 73 5f 6e 75 6d 28 59 29 20 52 50 2e 0a inus_num(Y) RP..
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 {sq
be10: 6c 69 74 65 33 50 72 61 67 6d 61 28 70 50 61 72 lite3Pragma(pPar
be20: 73 65 2c 26 58 2c 26 5a 2c 26 59 2c 31 29 3b 7d se,&X,&Z,&Y,1);}
be30: 0a 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 ..nmnum(A) ::= p
be40: 6c 75 73 5f 6e 75 6d 28 41 29 2e 0a 6e 6d 6e 75 lus_num(A)..nmnu
be50: 6d 28 41 29 20 3a 3a 3d 20 6e 6d 28 41 29 2e 0a m(A) ::= nm(A)..
be60: 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d 20 4f 4e 28 nmnum(A) ::= ON(
be70: 41 29 2e 0a 6e 6d 6e 75 6d 28 41 29 20 3a 3a 3d A)..nmnum(A) ::=
be80: 20 44 45 4c 45 54 45 28 41 29 2e 0a 6e 6d 6e 75 DELETE(A)..nmnu
be90: 6d 28 41 29 20 3a 3a 3d 20 44 45 46 41 55 4c 54 m(A) ::= DEFAULT
bea0: 28 41 29 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49 (A)..%endif SQLI
beb0: 54 45 5f 4f 4d 49 54 5f 50 52 41 47 4d 41 0a 25 TE_OMIT_PRAGMA.%
bec0: 74 6f 6b 65 6e 5f 63 6c 61 73 73 20 6e 75 6d 62 token_class numb
bed0: 65 72 20 49 4e 54 45 47 45 52 7c 46 4c 4f 41 54 er INTEGER|FLOAT
bee0: 2e 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a ..plus_num(A) ::
bef0: 3d 20 50 4c 55 53 20 6e 75 6d 62 65 72 28 58 29 = PLUS number(X)
bf00: 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d . {A = X;}
bf10: 0a 70 6c 75 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d .plus_num(A) ::=
bf20: 20 6e 75 6d 62 65 72 28 41 29 2e 0a 6d 69 6e 75 number(A)..minu
bf30: 73 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e s_num(A) ::= MIN
bf40: 55 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 US number(X).
bf50: 20 20 7b 41 20 3d 20 58 3b 7d 0a 2f 2f 2f 2f 2f {A = X;}./////
bf60: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
bf70: 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 /////// The CREA
bf80: 54 45 20 54 52 49 47 47 45 52 20 63 6f 6d 6d 61 TE TRIGGER comma
bf90: 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f nd /////////////
bfa0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 0a 25 69 66 6e 64 65 ////////..%ifnde
bfb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 f SQLITE_OMIT_TR
bfc0: 49 47 47 45 52 0a 0a 63 6d 64 20 3a 3a 3d 20 63 IGGER..cmd ::= c
bfd0: 72 65 61 74 65 6b 77 20 74 72 69 67 67 65 72 5f reatekw trigger_
bfe0: 64 65 63 6c 28 41 29 20 42 45 47 49 4e 20 74 72 decl(A) BEGIN tr
bff0: 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 28 53 igger_cmd_list(S
c000: 29 20 45 4e 44 28 5a 29 2e 20 7b 0a 20 20 54 6f ) END(Z). {. To
c010: 6b 65 6e 20 61 6c 6c 3b 0a 20 20 61 6c 6c 2e 7a ken all;. all.z
c020: 20 3d 20 41 2e 7a 3b 0a 20 20 61 6c 6c 2e 6e 20 = A.z;. all.n
c030: 3d 20 28 69 6e 74 29 28 5a 2e 7a 20 2d 20 41 2e = (int)(Z.z - A.
c040: 7a 29 20 2b 20 5a 2e 6e 3b 0a 20 20 73 71 6c 69 z) + Z.n;. sqli
c050: 74 65 33 46 69 6e 69 73 68 54 72 69 67 67 65 72 te3FinishTrigger
c060: 28 70 50 61 72 73 65 2c 20 53 2c 20 26 61 6c 6c (pParse, S, &all
c070: 29 3b 0a 7d 0a 0a 74 72 69 67 67 65 72 5f 64 65 );.}..trigger_de
c080: 63 6c 28 41 29 20 3a 3a 3d 20 74 65 6d 70 28 54 cl(A) ::= temp(T
c090: 29 20 54 52 49 47 47 45 52 20 69 66 6e 6f 74 65 ) TRIGGER ifnote
c0a0: 78 69 73 74 73 28 4e 4f 45 52 52 29 20 6e 6d 28 xists(NOERR) nm(
c0b0: 42 29 20 64 62 6e 6d 28 5a 29 20 0a 20 20 20 20 B) dbnm(Z) .
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c0d0: 74 72 69 67 67 65 72 5f 74 69 6d 65 28 43 29 20 trigger_time(C)
c0e0: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 28 44 29 trigger_event(D)
c0f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
c100: 20 20 20 20 20 4f 4e 20 66 75 6c 6c 6e 61 6d 65 ON fullname
c110: 28 45 29 20 66 6f 72 65 61 63 68 5f 63 6c 61 75 (E) foreach_clau
c120: 73 65 20 77 68 65 6e 5f 63 6c 61 75 73 65 28 47 se when_clause(G
c130: 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 42 65 ). {. sqlite3Be
c140: 67 69 6e 54 72 69 67 67 65 72 28 70 50 61 72 73 ginTrigger(pPars
c150: 65 2c 20 26 42 2c 20 26 5a 2c 20 43 2c 20 44 2e e, &B, &Z, C, D.
c160: 61 2c 20 44 2e 62 2c 20 45 2c 20 47 2c 20 54 2c a, D.b, E, G, T,
c170: 20 4e 4f 45 52 52 29 3b 0a 20 20 41 20 3d 20 28 NOERR);. A = (
c180: 5a 2e 6e 3d 3d 30 3f 42 3a 5a 29 3b 20 2f 2a 41 Z.n==0?B:Z); /*A
c190: 2d 6f 76 65 72 77 72 69 74 65 73 2d 54 2a 2f 0a -overwrites-T*/.
c1a0: 7d 0a 0a 25 74 79 70 65 20 74 72 69 67 67 65 72 }..%type trigger
c1b0: 5f 74 69 6d 65 20 7b 69 6e 74 7d 0a 74 72 69 67 _time {int}.trig
c1c0: 67 65 72 5f 74 69 6d 65 28 41 29 20 3a 3a 3d 20 ger_time(A) ::=
c1d0: 42 45 46 4f 52 45 7c 41 46 54 45 52 28 58 29 2e BEFORE|AFTER(X).
c1e0: 20 20 7b 20 41 20 3d 20 40 58 3b 20 2f 2a 41 2d { A = @X; /*A-
c1f0: 6f 76 65 72 77 72 69 74 65 73 2d 58 2a 2f 20 7d overwrites-X*/ }
c200: 0a 74 72 69 67 67 65 72 5f 74 69 6d 65 28 41 29 .trigger_time(A)
c210: 20 3a 3a 3d 20 49 4e 53 54 45 41 44 20 4f 46 2e ::= INSTEAD OF.
c220: 20 20 7b 20 41 20 3d 20 54 4b 5f 49 4e 53 54 45 { A = TK_INSTE
c230: 41 44 3b 7d 0a 74 72 69 67 67 65 72 5f 74 69 6d AD;}.trigger_tim
c240: 65 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 e(A) ::= .
c250: 20 20 20 20 20 20 7b 20 41 20 3d 20 54 4b 5f 42 { A = TK_B
c260: 45 46 4f 52 45 3b 20 7d 0a 0a 25 74 79 70 65 20 EFORE; }..%type
c270: 74 72 69 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 trigger_event {s
c280: 74 72 75 63 74 20 54 72 69 67 45 76 65 6e 74 7d truct TrigEvent}
c290: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 .%destructor tri
c2a0: 67 67 65 72 5f 65 76 65 6e 74 20 7b 73 71 6c 69 gger_event {sqli
c2b0: 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 te3IdListDelete(
c2c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 24 24 2e 62 pParse->db, $$.b
c2d0: 29 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 6e );}.trigger_even
c2e0: 74 28 41 29 20 3a 3a 3d 20 44 45 4c 45 54 45 7c t(A) ::= DELETE|
c2f0: 49 4e 53 45 52 54 28 58 29 2e 20 20 20 7b 41 2e INSERT(X). {A.
c300: 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 72 a = @X; /*A-over
c310: 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e 62 20 3d writes-X*/ A.b =
c320: 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 65 0;}.trigger_eve
c330: 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 45 nt(A) ::= UPDATE
c340: 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b 41 (X). {A
c350: 2e 61 20 3d 20 40 58 3b 20 2f 2a 41 2d 6f 76 65 .a = @X; /*A-ove
c360: 72 77 72 69 74 65 73 2d 58 2a 2f 20 41 2e 62 20 rwrites-X*/ A.b
c370: 3d 20 30 3b 7d 0a 74 72 69 67 67 65 72 5f 65 76 = 0;}.trigger_ev
c380: 65 6e 74 28 41 29 20 3a 3a 3d 20 55 50 44 41 54 ent(A) ::= UPDAT
c390: 45 20 4f 46 20 69 64 6c 69 73 74 28 58 29 2e 7b E OF idlist(X).{
c3a0: 41 2e 61 20 3d 20 54 4b 5f 55 50 44 41 54 45 3b A.a = TK_UPDATE;
c3b0: 20 41 2e 62 20 3d 20 58 3b 7d 0a 0a 66 6f 72 65 A.b = X;}..fore
c3c0: 61 63 68 5f 63 6c 61 75 73 65 20 3a 3a 3d 20 2e ach_clause ::= .
c3d0: 0a 66 6f 72 65 61 63 68 5f 63 6c 61 75 73 65 20 .foreach_clause
c3e0: 3a 3a 3d 20 46 4f 52 20 45 41 43 48 20 52 4f 57 ::= FOR EACH ROW
c3f0: 2e 0a 0a 25 74 79 70 65 20 77 68 65 6e 5f 63 6c ...%type when_cl
c400: 61 75 73 65 20 7b 45 78 70 72 2a 7d 0a 25 64 65 ause {Expr*}.%de
c410: 73 74 72 75 63 74 6f 72 20 77 68 65 6e 5f 63 6c structor when_cl
c420: 61 75 73 65 20 7b 73 71 6c 69 74 65 33 45 78 70 ause {sqlite3Exp
c430: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e rDelete(pParse->
c440: 64 62 2c 20 24 24 29 3b 7d 0a 77 68 65 6e 5f 63 db, $$);}.when_c
c450: 6c 61 75 73 65 28 41 29 20 3a 3a 3d 20 2e 20 20 lause(A) ::= .
c460: 20 20 20 20 20 20 20 20 20 20 20 7b 20 41 20 3d { A =
c470: 20 30 3b 20 7d 0a 77 68 65 6e 5f 63 6c 61 75 73 0; }.when_claus
c480: 65 28 41 29 20 3a 3a 3d 20 57 48 45 4e 20 65 78 e(A) ::= WHEN ex
c490: 70 72 28 58 29 2e 20 7b 20 41 20 3d 20 58 2e 70 pr(X). { A = X.p
c4a0: 45 78 70 72 3b 20 7d 0a 0a 25 74 79 70 65 20 74 Expr; }..%type t
c4b0: 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 20 rigger_cmd_list
c4c0: 7b 54 72 69 67 67 65 72 53 74 65 70 2a 7d 0a 25 {TriggerStep*}.%
c4d0: 64 65 73 74 72 75 63 74 6f 72 20 74 72 69 67 67 destructor trigg
c4e0: 65 72 5f 63 6d 64 5f 6c 69 73 74 20 7b 73 71 6c er_cmd_list {sql
c4f0: 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 67 65 ite3DeleteTrigge
c500: 72 53 74 65 70 28 70 50 61 72 73 65 2d 3e 64 62 rStep(pParse->db
c510: 2c 20 24 24 29 3b 7d 0a 74 72 69 67 67 65 72 5f , $$);}.trigger_
c520: 63 6d 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 cmd_list(A) ::=
c530: 74 72 69 67 67 65 72 5f 63 6d 64 5f 6c 69 73 74 trigger_cmd_list
c540: 28 41 29 20 74 72 69 67 67 65 72 5f 63 6d 64 28 (A) trigger_cmd(
c550: 58 29 20 53 45 4d 49 2e 20 7b 0a 20 20 61 73 73 X) SEMI. {. ass
c560: 65 72 74 28 20 41 21 3d 30 20 29 3b 0a 20 20 41 ert( A!=0 );. A
c570: 2d 3e 70 4c 61 73 74 2d 3e 70 4e 65 78 74 20 3d ->pLast->pNext =
c580: 20 58 3b 0a 20 20 41 2d 3e 70 4c 61 73 74 20 3d X;. A->pLast =
c590: 20 58 3b 0a 7d 0a 74 72 69 67 67 65 72 5f 63 6d X;.}.trigger_cm
c5a0: 64 5f 6c 69 73 74 28 41 29 20 3a 3a 3d 20 74 72 d_list(A) ::= tr
c5b0: 69 67 67 65 72 5f 63 6d 64 28 41 29 20 53 45 4d igger_cmd(A) SEM
c5c0: 49 2e 20 7b 20 0a 20 20 61 73 73 65 72 74 28 20 I. { . assert(
c5d0: 41 21 3d 30 20 29 3b 0a 20 20 41 2d 3e 70 4c 61 A!=0 );. A->pLa
c5e0: 73 74 20 3d 20 41 3b 0a 7d 0a 0a 2f 2f 20 44 69 st = A;.}..// Di
c5f0: 73 61 6c 6c 6f 77 20 71 75 61 6c 69 66 69 65 64 sallow qualified
c600: 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 6f 6e 20 table names on
c610: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 INSERT, UPDATE,
c620: 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61 74 65 and DELETE state
c630: 6d 65 6e 74 73 0a 2f 2f 20 77 69 74 68 69 6e 20 ments.// within
c640: 61 20 74 72 69 67 67 65 72 2e 20 20 54 68 65 20 a trigger. The
c650: 74 61 62 6c 65 20 74 6f 20 49 4e 53 45 52 54 2c table to INSERT,
c660: 20 55 50 44 41 54 45 2c 20 6f 72 20 44 45 4c 45 UPDATE, or DELE
c670: 54 45 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 TE is always in
c680: 0a 2f 2f 20 74 68 65 20 73 61 6d 65 20 64 61 74 .// the same dat
c690: 61 62 61 73 65 20 61 73 20 74 68 65 20 74 61 62 abase as the tab
c6a0: 6c 65 20 74 68 61 74 20 74 68 65 20 74 72 69 67 le that the trig
c6b0: 67 65 72 20 66 69 72 65 73 20 6f 6e 2e 0a 2f 2f ger fires on..//
c6c0: 0a 25 74 79 70 65 20 74 72 6e 6d 20 7b 54 6f 6b .%type trnm {Tok
c6d0: 65 6e 7d 0a 74 72 6e 6d 28 41 29 20 3a 3a 3d 20 en}.trnm(A) ::=
c6e0: 6e 6d 28 41 29 2e 0a 74 72 6e 6d 28 41 29 20 3a nm(A)..trnm(A) :
c6f0: 3a 3d 20 6e 6d 20 44 4f 54 20 6e 6d 28 58 29 2e := nm DOT nm(X).
c700: 20 7b 0a 20 20 41 20 3d 20 58 3b 0a 20 20 73 71 {. A = X;. sq
c710: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
c720: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 arse, . "
c730: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 qualified table
c740: 6e 61 6d 65 73 20 61 72 65 20 6e 6f 74 20 61 6c names are not al
c750: 6c 6f 77 65 64 20 6f 6e 20 49 4e 53 45 52 54 2c lowed on INSERT,
c760: 20 55 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c UPDATE, and DEL
c770: 45 54 45 20 22 0a 20 20 20 20 20 20 20 20 22 73 ETE ". "s
c780: 74 61 74 65 6d 65 6e 74 73 20 77 69 74 68 69 6e tatements within
c790: 20 74 72 69 67 67 65 72 73 22 29 3b 0a 7d 0a 0a triggers");.}..
c7a0: 2f 2f 20 44 69 73 61 6c 6c 6f 77 20 74 68 65 20 // Disallow the
c7b0: 49 4e 44 45 58 20 42 59 20 61 6e 64 20 4e 4f 54 INDEX BY and NOT
c7c0: 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73 INDEXED clauses
c7d0: 20 6f 6e 20 55 50 44 41 54 45 20 61 6e 64 20 44 on UPDATE and D
c7e0: 45 4c 45 54 45 0a 2f 2f 20 73 74 61 74 65 6d 65 ELETE.// stateme
c7f0: 6e 74 73 20 77 69 74 68 69 6e 20 74 72 69 67 67 nts within trigg
c800: 65 72 73 2e 20 20 57 65 20 6d 61 6b 65 20 61 20 ers. We make a
c810: 73 70 65 63 69 66 69 63 20 65 72 72 6f 72 20 6d specific error m
c820: 65 73 73 61 67 65 20 66 6f 72 20 74 68 69 73 0a essage for this.
c830: 2f 2f 20 73 69 6e 63 65 20 69 74 20 69 73 20 61 // since it is a
c840: 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20 74 n exception to t
c850: 68 65 20 64 65 66 61 75 6c 74 20 67 72 61 6d 6d he default gramm
c860: 61 72 20 72 75 6c 65 73 2e 0a 2f 2f 0a 74 72 69 ar rules..//.tri
c870: 64 78 62 79 20 3a 3a 3d 20 2e 0a 74 72 69 64 78 dxby ::= ..tridx
c880: 62 79 20 3a 3a 3d 20 49 4e 44 45 58 45 44 20 42 by ::= INDEXED B
c890: 59 20 6e 6d 2e 20 7b 0a 20 20 73 71 6c 69 74 65 Y nm. {. sqlite
c8a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 3ErrorMsg(pParse
c8b0: 2c 0a 20 20 20 20 20 20 20 20 22 74 68 65 20 49 ,. "the I
c8c0: 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 NDEXED BY clause
c8d0: 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 is not allowed
c8e0: 6f 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c on UPDATE or DEL
c8f0: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 22 ETE statements "
c900: 0a 20 20 20 20 20 20 20 20 22 77 69 74 68 69 6e . "within
c910: 20 74 72 69 67 67 65 72 73 22 29 3b 0a 7d 0a 74 triggers");.}.t
c920: 72 69 64 78 62 79 20 3a 3a 3d 20 4e 4f 54 20 49 ridxby ::= NOT I
c930: 4e 44 45 58 45 44 2e 20 7b 0a 20 20 73 71 6c 69 NDEXED. {. sqli
c940: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 te3ErrorMsg(pPar
c950: 73 65 2c 0a 20 20 20 20 20 20 20 20 22 74 68 65 se,. "the
c960: 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 NOT INDEXED cla
c970: 75 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 use is not allow
c980: 65 64 20 6f 6e 20 55 50 44 41 54 45 20 6f 72 20 ed on UPDATE or
c990: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 DELETE statement
c9a0: 73 20 22 0a 20 20 20 20 20 20 20 20 22 77 69 74 s ". "wit
c9b0: 68 69 6e 20 74 72 69 67 67 65 72 73 22 29 3b 0a hin triggers");.
c9c0: 7d 0a 0a 0a 0a 25 74 79 70 65 20 74 72 69 67 67 }....%type trigg
c9d0: 65 72 5f 63 6d 64 20 7b 54 72 69 67 67 65 72 53 er_cmd {TriggerS
c9e0: 74 65 70 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f tep*}.%destructo
c9f0: 72 20 74 72 69 67 67 65 72 5f 63 6d 64 20 7b 73 r trigger_cmd {s
ca00: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 72 69 67 qlite3DeleteTrig
ca10: 67 65 72 53 74 65 70 28 70 50 61 72 73 65 2d 3e gerStep(pParse->
ca20: 64 62 2c 20 24 24 29 3b 7d 0a 2f 2f 20 55 50 44 db, $$);}.// UPD
ca30: 41 54 45 20 0a 74 72 69 67 67 65 72 5f 63 6d 64 ATE .trigger_cmd
ca40: 28 41 29 20 3a 3a 3d 0a 20 20 20 55 50 44 41 54 (A) ::=. UPDAT
ca50: 45 20 6f 72 63 6f 6e 66 28 52 29 20 74 72 6e 6d E orconf(R) trnm
ca60: 28 58 29 20 74 72 69 64 78 62 79 20 53 45 54 20 (X) tridxby SET
ca70: 73 65 74 6c 69 73 74 28 59 29 20 77 68 65 72 65 setlist(Y) where
ca80: 5f 6f 70 74 28 5a 29 2e 20 20 0a 20 20 20 7b 41 _opt(Z). . {A
ca90: 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 = sqlite3Trigge
caa0: 72 55 70 64 61 74 65 53 74 65 70 28 70 50 61 72 rUpdateStep(pPar
cab0: 73 65 2d 3e 64 62 2c 20 26 58 2c 20 59 2c 20 5a se->db, &X, Y, Z
cac0: 2c 20 52 29 3b 7d 0a 0a 2f 2f 20 49 4e 53 45 52 , R);}..// INSER
cad0: 54 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 T.trigger_cmd(A)
cae0: 20 3a 3a 3d 20 69 6e 73 65 72 74 5f 63 6d 64 28 ::= insert_cmd(
caf0: 52 29 20 49 4e 54 4f 20 74 72 6e 6d 28 58 29 20 R) INTO trnm(X)
cb00: 69 64 6c 69 73 74 5f 6f 70 74 28 46 29 20 73 65 idlist_opt(F) se
cb10: 6c 65 63 74 28 53 29 2e 0a 20 20 20 7b 41 20 3d lect(S).. {A =
cb20: 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 49 sqlite3TriggerI
cb30: 6e 73 65 72 74 53 74 65 70 28 70 50 61 72 73 65 nsertStep(pParse
cb40: 2d 3e 64 62 2c 20 26 58 2c 20 46 2c 20 53 2c 20 ->db, &X, F, S,
cb50: 52 29 3b 2f 2a 41 2d 6f 76 65 72 77 72 69 74 65 R);/*A-overwrite
cb60: 73 2d 52 2a 2f 7d 0a 0a 2f 2f 20 44 45 4c 45 54 s-R*/}..// DELET
cb70: 45 0a 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 E.trigger_cmd(A)
cb80: 20 3a 3a 3d 20 44 45 4c 45 54 45 20 46 52 4f 4d ::= DELETE FROM
cb90: 20 74 72 6e 6d 28 58 29 20 74 72 69 64 78 62 79 trnm(X) tridxby
cba0: 20 77 68 65 72 65 5f 6f 70 74 28 59 29 2e 0a 20 where_opt(Y)..
cbb0: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 {A = sqlite3Tr
cbc0: 69 67 67 65 72 44 65 6c 65 74 65 53 74 65 70 28 iggerDeleteStep(
cbd0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 26 58 2c 20 pParse->db, &X,
cbe0: 59 29 3b 7d 0a 0a 2f 2f 20 53 45 4c 45 43 54 0a Y);}..// SELECT.
cbf0: 74 72 69 67 67 65 72 5f 63 6d 64 28 41 29 20 3a trigger_cmd(A) :
cc00: 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 0a 20 20 := select(X)..
cc10: 20 7b 41 20 3d 20 73 71 6c 69 74 65 33 54 72 69 {A = sqlite3Tri
cc20: 67 67 65 72 53 65 6c 65 63 74 53 74 65 70 28 70 ggerSelectStep(p
cc30: 50 61 72 73 65 2d 3e 64 62 2c 20 58 29 3b 20 2f Parse->db, X); /
cc40: 2a 41 2d 6f 76 65 72 77 72 69 74 65 73 2d 58 2a *A-overwrites-X*
cc50: 2f 7d 0a 0a 2f 2f 20 54 68 65 20 73 70 65 63 69 /}..// The speci
cc60: 61 6c 20 52 41 49 53 45 20 65 78 70 72 65 73 73 al RAISE express
cc70: 69 6f 6e 20 74 68 61 74 20 6d 61 79 20 6f 63 63 ion that may occ
cc80: 75 72 20 69 6e 20 74 72 69 67 67 65 72 20 70 72 ur in trigger pr
cc90: 6f 67 72 61 6d 73 0a 65 78 70 72 28 41 29 20 3a ograms.expr(A) :
cca0: 3a 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 49 := RAISE(X) LP I
ccb0: 47 4e 4f 52 45 20 52 50 28 59 29 2e 20 20 7b 0a GNORE RP(Y). {.
ccc0: 20 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58 2c spanSet(&A,&X,
ccd0: 26 59 29 3b 20 20 2f 2a 41 2d 6f 76 65 72 77 72 &Y); /*A-overwr
cce0: 69 74 65 73 2d 58 2a 2f 0a 20 20 41 2e 70 45 78 ites-X*/. A.pEx
ccf0: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 pr = sqlite3PExp
cd00: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 52 41 49 r(pParse, TK_RAI
cd10: 53 45 2c 20 30 2c 20 30 29 3b 20 0a 20 20 69 66 SE, 0, 0); . if
cd20: 28 20 41 2e 70 45 78 70 72 20 29 7b 0a 20 20 20 ( A.pExpr ){.
cd30: 20 41 2e 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 A.pExpr->affini
cd40: 74 79 20 3d 20 4f 45 5f 49 67 6e 6f 72 65 3b 0a ty = OE_Ignore;.
cd50: 20 20 7d 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a }.}.expr(A) ::
cd60: 3d 20 52 41 49 53 45 28 58 29 20 4c 50 20 72 61 = RAISE(X) LP ra
cd70: 69 73 65 74 79 70 65 28 54 29 20 43 4f 4d 4d 41 isetype(T) COMMA
cd80: 20 6e 6d 28 5a 29 20 52 50 28 59 29 2e 20 20 7b nm(Z) RP(Y). {
cd90: 0a 20 20 73 70 61 6e 53 65 74 28 26 41 2c 26 58 . spanSet(&A,&X
cda0: 2c 26 59 29 3b 20 20 2f 2a 41 2d 6f 76 65 72 77 ,&Y); /*A-overw
cdb0: 72 69 74 65 73 2d 58 2a 2f 0a 20 20 41 2e 70 45 rites-X*/. A.pE
cdc0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 xpr = sqlite3Exp
cdd0: 72 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 rAlloc(pParse->d
cde0: 62 2c 20 54 4b 5f 52 41 49 53 45 2c 20 26 5a 2c b, TK_RAISE, &Z,
cdf0: 20 31 29 3b 20 0a 20 20 69 66 28 20 41 2e 70 45 1); . if( A.pE
ce00: 78 70 72 20 29 20 7b 0a 20 20 20 20 41 2e 70 45 xpr ) {. A.pE
ce10: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 xpr->affinity =
ce20: 28 63 68 61 72 29 54 3b 0a 20 20 7d 0a 7d 0a 25 (char)T;. }.}.%
ce30: 65 6e 64 69 66 20 20 21 53 51 4c 49 54 45 5f 4f endif !SQLITE_O
ce40: 4d 49 54 5f 54 52 49 47 47 45 52 0a 0a 25 74 79 MIT_TRIGGER..%ty
ce50: 70 65 20 72 61 69 73 65 74 79 70 65 20 7b 69 6e pe raisetype {in
ce60: 74 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 t}.raisetype(A)
ce70: 3a 3a 3d 20 52 4f 4c 4c 42 41 43 4b 2e 20 20 7b ::= ROLLBACK. {
ce80: 41 20 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 3b A = OE_Rollback;
ce90: 7d 0a 72 61 69 73 65 74 79 70 65 28 41 29 20 3a }.raisetype(A) :
cea0: 3a 3d 20 41 42 4f 52 54 2e 20 20 20 20 20 7b 41 := ABORT. {A
ceb0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 7d 0a 72 61 = OE_Abort;}.ra
cec0: 69 73 65 74 79 70 65 28 41 29 20 3a 3a 3d 20 46 isetype(A) ::= F
ced0: 41 49 4c 2e 20 20 20 20 20 20 7b 41 20 3d 20 4f AIL. {A = O
cee0: 45 5f 46 61 69 6c 3b 7d 0a 0a 0a 2f 2f 2f 2f 2f E_Fail;}.../////
cef0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
cf00: 2f 2f 2f 20 20 44 52 4f 50 20 54 52 49 47 47 45 /// DROP TRIGGE
cf10: 52 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f 2f R statement ////
cf20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
cf30: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 //////////.%ifnd
cf40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 ef SQLITE_OMIT_T
cf50: 52 49 47 47 45 52 0a 63 6d 64 20 3a 3a 3d 20 44 RIGGER.cmd ::= D
cf60: 52 4f 50 20 54 52 49 47 47 45 52 20 69 66 65 78 ROP TRIGGER ifex
cf70: 69 73 74 73 28 4e 4f 45 52 52 29 20 66 75 6c 6c ists(NOERR) full
cf80: 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 73 71 6c name(X). {. sql
cf90: 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 28 ite3DropTrigger(
cfa0: 70 50 61 72 73 65 2c 58 2c 4e 4f 45 52 52 29 3b pParse,X,NOERR);
cfb0: 0a 7d 0a 25 65 6e 64 69 66 20 20 21 53 51 4c 49 .}.%endif !SQLI
cfc0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a TE_OMIT_TRIGGER.
cfd0: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f .///////////////
cfe0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 54 54 41 43 48 ///////// ATTACH
cff0: 20 44 41 54 41 42 41 53 45 20 66 69 6c 65 20 41 DATABASE file A
d000: 53 20 6e 61 6d 65 20 2f 2f 2f 2f 2f 2f 2f 2f 2f S name /////////
d010: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
d020: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .%ifndef SQLITE_
d030: 4f 4d 49 54 5f 41 54 54 41 43 48 0a 63 6d 64 20 OMIT_ATTACH.cmd
d040: 3a 3a 3d 20 41 54 54 41 43 48 20 64 61 74 61 62 ::= ATTACH datab
d050: 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 ase_kw_opt expr(
d060: 46 29 20 41 53 20 65 78 70 72 28 44 29 20 6b 65 F) AS expr(D) ke
d070: 79 5f 6f 70 74 28 4b 29 2e 20 7b 0a 20 20 73 71 y_opt(K). {. sq
d080: 6c 69 74 65 33 41 74 74 61 63 68 28 70 50 61 72 lite3Attach(pPar
d090: 73 65 2c 20 46 2e 70 45 78 70 72 2c 20 44 2e 70 se, F.pExpr, D.p
d0a0: 45 78 70 72 2c 20 4b 29 3b 0a 7d 0a 63 6d 64 20 Expr, K);.}.cmd
d0b0: 3a 3a 3d 20 44 45 54 41 43 48 20 64 61 74 61 62 ::= DETACH datab
d0c0: 61 73 65 5f 6b 77 5f 6f 70 74 20 65 78 70 72 28 ase_kw_opt expr(
d0d0: 44 29 2e 20 7b 0a 20 20 73 71 6c 69 74 65 33 44 D). {. sqlite3D
d0e0: 65 74 61 63 68 28 70 50 61 72 73 65 2c 20 44 2e etach(pParse, D.
d0f0: 70 45 78 70 72 29 3b 0a 7d 0a 0a 25 74 79 70 65 pExpr);.}..%type
d100: 20 6b 65 79 5f 6f 70 74 20 7b 45 78 70 72 2a 7d key_opt {Expr*}
d110: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 .%destructor key
d120: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 33 45 78 70 _opt {sqlite3Exp
d130: 72 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e rDelete(pParse->
d140: 64 62 2c 20 24 24 29 3b 7d 0a 6b 65 79 5f 6f 70 db, $$);}.key_op
d150: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 t(A) ::= .
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b {
d170: 20 41 20 3d 20 30 3b 20 7d 0a 6b 65 79 5f 6f 70 A = 0; }.key_op
d180: 74 28 41 29 20 3a 3a 3d 20 4b 45 59 20 65 78 70 t(A) ::= KEY exp
d190: 72 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 7b r(X). {
d1a0: 20 41 20 3d 20 58 2e 70 45 78 70 72 3b 20 7d 0a A = X.pExpr; }.
d1b0: 0a 64 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 .database_kw_opt
d1c0: 20 3a 3a 3d 20 44 41 54 41 42 41 53 45 2e 0a 64 ::= DATABASE..d
d1d0: 61 74 61 62 61 73 65 5f 6b 77 5f 6f 70 74 20 3a atabase_kw_opt :
d1e0: 3a 3d 20 2e 0a 25 65 6e 64 69 66 20 53 51 4c 49 := ..%endif SQLI
d1f0: 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 0a TE_OMIT_ATTACH..
d200: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
d210: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 52 45 49 4e 44 ////////// REIND
d220: 45 58 20 63 6f 6c 6c 61 74 69 6f 6e 20 2f 2f 2f EX collation ///
d230: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
d240: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a ///////////////.
d250: 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f %ifndef SQLITE_O
d260: 4d 49 54 5f 52 45 49 4e 44 45 58 0a 63 6d 64 20 MIT_REINDEX.cmd
d270: 3a 3a 3d 20 52 45 49 4e 44 45 58 2e 20 20 20 20 ::= REINDEX.
d280: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c {sql
d290: 69 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72 ite3Reindex(pPar
d2a0: 73 65 2c 20 30 2c 20 30 29 3b 7d 0a 63 6d 64 20 se, 0, 0);}.cmd
d2b0: 3a 3a 3d 20 52 45 49 4e 44 45 58 20 6e 6d 28 58 ::= REINDEX nm(X
d2c0: 29 20 64 62 6e 6d 28 59 29 2e 20 20 7b 73 71 6c ) dbnm(Y). {sql
d2d0: 69 74 65 33 52 65 69 6e 64 65 78 28 70 50 61 72 ite3Reindex(pPar
d2e0: 73 65 2c 20 26 58 2c 20 26 59 29 3b 7d 0a 25 65 se, &X, &Y);}.%e
d2f0: 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d 49 ndif SQLITE_OMI
d300: 54 5f 52 45 49 4e 44 45 58 0a 0a 2f 2f 2f 2f 2f T_REINDEX../////
d310: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
d320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 ////////////// A
d330: 4e 41 4c 59 5a 45 20 2f 2f 2f 2f 2f 2f 2f 2f 2f NALYZE /////////
d340: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
d350: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 25 69 66 6e 64 //////////.%ifnd
d360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 ef SQLITE_OMIT_A
d370: 4e 41 4c 59 5a 45 0a 63 6d 64 20 3a 3a 3d 20 41 NALYZE.cmd ::= A
d380: 4e 41 4c 59 5a 45 2e 20 20 20 20 20 20 20 20 20 NALYZE.
d390: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 33 41 {sqlite3A
d3a0: 6e 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 30 nalyze(pParse, 0
d3b0: 2c 20 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 41 , 0);}.cmd ::= A
d3c0: 4e 41 4c 59 5a 45 20 6e 6d 28 58 29 20 64 62 6e NALYZE nm(X) dbn
d3d0: 6d 28 59 29 2e 20 20 7b 73 71 6c 69 74 65 33 41 m(Y). {sqlite3A
d3e0: 6e 61 6c 79 7a 65 28 70 50 61 72 73 65 2c 20 26 nalyze(pParse, &
d3f0: 58 2c 20 26 59 29 3b 7d 0a 25 65 6e 64 69 66 0a X, &Y);}.%endif.
d400: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f .///////////////
d410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 41 4c 54 45 52 20 ///////// ALTER
d420: 54 41 42 4c 45 20 74 61 62 6c 65 20 2e 2e 2e 20 TABLE table ...
d430: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
d440: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
d450: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .%ifndef SQLITE_
d460: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a OMIT_ALTERTABLE.
d470: 63 6d 64 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 cmd ::= ALTER TA
d480: 42 4c 45 20 66 75 6c 6c 6e 61 6d 65 28 58 29 20 BLE fullname(X)
d490: 52 45 4e 41 4d 45 20 54 4f 20 6e 6d 28 5a 29 2e RENAME TO nm(Z).
d4a0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 41 6c 74 65 {. sqlite3Alte
d4b0: 72 52 65 6e 61 6d 65 54 61 62 6c 65 28 70 50 61 rRenameTable(pPa
d4c0: 72 73 65 2c 58 2c 26 5a 29 3b 0a 7d 0a 63 6d 64 rse,X,&Z);.}.cmd
d4d0: 20 3a 3a 3d 20 41 4c 54 45 52 20 54 41 42 4c 45 ::= ALTER TABLE
d4e0: 20 61 64 64 5f 63 6f 6c 75 6d 6e 5f 66 75 6c 6c add_column_full
d4f0: 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 41 44 44 name. ADD
d500: 20 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 63 6f kwcolumn_opt co
d510: 6c 75 6d 6e 6e 61 6d 65 28 59 29 20 63 61 72 67 lumnname(Y) carg
d520: 6c 69 73 74 2e 20 7b 0a 20 20 59 2e 6e 20 3d 20 list. {. Y.n =
d530: 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c (int)(pParse->sL
d540: 61 73 74 54 6f 6b 65 6e 2e 7a 2d 59 2e 7a 29 20 astToken.z-Y.z)
d550: 2b 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 + pParse->sLastT
d560: 6f 6b 65 6e 2e 6e 3b 0a 20 20 73 71 6c 69 74 65 oken.n;. sqlite
d570: 33 41 6c 74 65 72 46 69 6e 69 73 68 41 64 64 43 3AlterFinishAddC
d580: 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 26 59 olumn(pParse, &Y
d590: 29 3b 0a 7d 0a 61 64 64 5f 63 6f 6c 75 6d 6e 5f );.}.add_column_
d5a0: 66 75 6c 6c 6e 61 6d 65 20 3a 3a 3d 20 66 75 6c fullname ::= ful
d5b0: 6c 6e 61 6d 65 28 58 29 2e 20 7b 0a 20 20 64 69 lname(X). {. di
d5c0: 73 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 28 70 sableLookaside(p
d5d0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 Parse);. sqlite
d5e0: 33 41 6c 74 65 72 42 65 67 69 6e 41 64 64 43 6f 3AlterBeginAddCo
d5f0: 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 58 29 3b lumn(pParse, X);
d600: 0a 7d 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f 70 74 20 .}.kwcolumn_opt
d610: 3a 3a 3d 20 2e 0a 6b 77 63 6f 6c 75 6d 6e 5f 6f ::= ..kwcolumn_o
d620: 70 74 20 3a 3a 3d 20 43 4f 4c 55 4d 4e 4b 57 2e pt ::= COLUMNKW.
d630: 0a 25 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f .%endif SQLITE_
d640: 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a OMIT_ALTERTABLE.
d650: 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f .///////////////
d660: 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 52 45 41 54 45 ///////// CREATE
d670: 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 2e VIRTUAL TABLE .
d680: 2e 2e 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f .. /////////////
d690: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
d6a0: 0a 25 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .%ifndef SQLITE_
d6b0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c OMIT_VIRTUALTABL
d6c0: 45 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 E.cmd ::= create
d6d0: 5f 76 74 61 62 2e 20 20 20 20 20 20 20 20 20 20 _vtab.
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 {sq
d6f0: 6c 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50 lite3VtabFinishP
d700: 61 72 73 65 28 70 50 61 72 73 65 2c 30 29 3b 7d arse(pParse,0);}
d710: 0a 63 6d 64 20 3a 3a 3d 20 63 72 65 61 74 65 5f .cmd ::= create_
d720: 76 74 61 62 20 4c 50 20 76 74 61 62 61 72 67 6c vtab LP vtabargl
d730: 69 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c ist RP(X). {sql
d740: 69 74 65 33 56 74 61 62 46 69 6e 69 73 68 50 61 ite3VtabFinishPa
d750: 72 73 65 28 70 50 61 72 73 65 2c 26 58 29 3b 7d rse(pParse,&X);}
d760: 0a 63 72 65 61 74 65 5f 76 74 61 62 20 3a 3a 3d .create_vtab ::=
d770: 20 63 72 65 61 74 65 6b 77 20 56 49 52 54 55 41 createkw VIRTUA
d780: 4c 20 54 41 42 4c 45 20 69 66 6e 6f 74 65 78 69 L TABLE ifnotexi
d790: 73 74 73 28 45 29 0a 20 20 20 20 20 20 20 20 20 sts(E).
d7a0: 20 20 20 20 20 20 20 6e 6d 28 58 29 20 64 62 6e nm(X) dbn
d7b0: 6d 28 59 29 20 55 53 49 4e 47 20 6e 6d 28 5a 29 m(Y) USING nm(Z)
d7c0: 2e 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 . {. sqlite3V
d7d0: 74 61 62 42 65 67 69 6e 50 61 72 73 65 28 70 50 tabBeginParse(pP
d7e0: 61 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 26 5a arse, &X, &Y, &Z
d7f0: 2c 20 45 29 3b 0a 7d 0a 76 74 61 62 61 72 67 6c , E);.}.vtabargl
d800: 69 73 74 20 3a 3a 3d 20 76 74 61 62 61 72 67 2e ist ::= vtabarg.
d810: 0a 76 74 61 62 61 72 67 6c 69 73 74 20 3a 3a 3d .vtabarglist ::=
d820: 20 76 74 61 62 61 72 67 6c 69 73 74 20 43 4f 4d vtabarglist COM
d830: 4d 41 20 76 74 61 62 61 72 67 2e 0a 76 74 61 62 MA vtabarg..vtab
d840: 61 72 67 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 arg ::= .
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d860: 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 67 49 {sqlite3VtabArgI
d870: 6e 69 74 28 70 50 61 72 73 65 29 3b 7d 0a 76 74 nit(pParse);}.vt
d880: 61 62 61 72 67 20 3a 3a 3d 20 76 74 61 62 61 72 abarg ::= vtabar
d890: 67 20 76 74 61 62 61 72 67 74 6f 6b 65 6e 2e 0a g vtabargtoken..
d8a0: 76 74 61 62 61 72 67 74 6f 6b 65 6e 20 3a 3a 3d vtabargtoken ::=
d8b0: 20 41 4e 59 28 58 29 2e 20 20 20 20 20 20 20 20 ANY(X).
d8c0: 20 20 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 {sqlite3Vtab
d8d0: 41 72 67 45 78 74 65 6e 64 28 70 50 61 72 73 65 ArgExtend(pParse
d8e0: 2c 26 58 29 3b 7d 0a 76 74 61 62 61 72 67 74 6f ,&X);}.vtabargto
d8f0: 6b 65 6e 20 3a 3a 3d 20 6c 70 20 61 6e 79 6c 69 ken ::= lp anyli
d900: 73 74 20 52 50 28 58 29 2e 20 20 7b 73 71 6c 69 st RP(X). {sqli
d910: 74 65 33 56 74 61 62 41 72 67 45 78 74 65 6e 64 te3VtabArgExtend
d920: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 6c 70 (pParse,&X);}.lp
d930: 20 3a 3a 3d 20 4c 50 28 58 29 2e 20 20 20 20 20 ::= LP(X).
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d950: 20 20 7b 73 71 6c 69 74 65 33 56 74 61 62 41 72 {sqlite3VtabAr
d960: 67 45 78 74 65 6e 64 28 70 50 61 72 73 65 2c 26 gExtend(pParse,&
d970: 58 29 3b 7d 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d X);}.anylist ::=
d980: 20 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a 3d 20 61 ..anylist ::= a
d990: 6e 79 6c 69 73 74 20 4c 50 20 61 6e 79 6c 69 73 nylist LP anylis
d9a0: 74 20 52 50 2e 0a 61 6e 79 6c 69 73 74 20 3a 3a t RP..anylist ::
d9b0: 3d 20 61 6e 79 6c 69 73 74 20 41 4e 59 2e 0a 25 = anylist ANY..%
d9c0: 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d endif SQLITE_OM
d9d0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a IT_VIRTUALTABLE.
d9e0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ..//////////////
d9f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 43 4f 4d 4d 4f ////////// COMMO
da00: 4e 20 54 41 42 4c 45 20 45 58 50 52 45 53 53 49 N TABLE EXPRESSI
da10: 4f 4e 53 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ONS ////////////
da20: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
da30: 0a 25 74 79 70 65 20 77 69 74 68 20 7b 57 69 74 .%type with {Wit
da40: 68 2a 7d 0a 25 74 79 70 65 20 77 71 6c 69 73 74 h*}.%type wqlist
da50: 20 7b 57 69 74 68 2a 7d 0a 25 64 65 73 74 72 75 {With*}.%destru
da60: 63 74 6f 72 20 77 69 74 68 20 7b 73 71 6c 69 74 ctor with {sqlit
da70: 65 33 57 69 74 68 44 65 6c 65 74 65 28 70 50 61 e3WithDelete(pPa
da80: 72 73 65 2d 3e 64 62 2c 20 24 24 29 3b 7d 0a 25 rse->db, $$);}.%
da90: 64 65 73 74 72 75 63 74 6f 72 20 77 71 6c 69 73 destructor wqlis
daa0: 74 20 7b 73 71 6c 69 74 65 33 57 69 74 68 44 65 t {sqlite3WithDe
dab0: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c lete(pParse->db,
dac0: 20 24 24 29 3b 7d 0a 0a 77 69 74 68 28 41 29 20 $$);}..with(A)
dad0: 3a 3a 3d 20 2e 20 7b 41 20 3d 20 30 3b 7d 0a 25 ::= . {A = 0;}.%
dae0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
daf0: 49 54 5f 43 54 45 0a 77 69 74 68 28 41 29 20 3a IT_CTE.with(A) :
db00: 3a 3d 20 57 49 54 48 20 77 71 6c 69 73 74 28 57 := WITH wqlist(W
db10: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ).
db20: 7b 20 41 20 3d 20 57 3b 20 7d 0a 77 69 74 68 28 { A = W; }.with(
db30: 41 29 20 3a 3a 3d 20 57 49 54 48 20 52 45 43 55 A) ::= WITH RECU
db40: 52 53 49 56 45 20 77 71 6c 69 73 74 28 57 29 2e RSIVE wqlist(W).
db50: 20 20 20 20 7b 20 41 20 3d 20 57 3b 20 7d 0a 0a { A = W; }..
db60: 77 71 6c 69 73 74 28 41 29 20 3a 3a 3d 20 6e 6d wqlist(A) ::= nm
db70: 28 58 29 20 65 69 64 6c 69 73 74 5f 6f 70 74 28 (X) eidlist_opt(
db80: 59 29 20 41 53 20 4c 50 20 73 65 6c 65 63 74 28 Y) AS LP select(
db90: 5a 29 20 52 50 2e 20 7b 0a 20 20 41 20 3d 20 73 Z) RP. {. A = s
dba0: 71 6c 69 74 65 33 57 69 74 68 41 64 64 28 70 50 qlite3WithAdd(pP
dbb0: 61 72 73 65 2c 20 30 2c 20 26 58 2c 20 59 2c 20 arse, 0, &X, Y,
dbc0: 5a 29 3b 20 2f 2a 41 2d 6f 76 65 72 77 72 69 74 Z); /*A-overwrit
dbd0: 65 73 2d 58 2a 2f 0a 7d 0a 77 71 6c 69 73 74 28 es-X*/.}.wqlist(
dbe0: 41 29 20 3a 3a 3d 20 77 71 6c 69 73 74 28 41 29 A) ::= wqlist(A)
dbf0: 20 43 4f 4d 4d 41 20 6e 6d 28 58 29 20 65 69 64 COMMA nm(X) eid
dc00: 6c 69 73 74 5f 6f 70 74 28 59 29 20 41 53 20 4c list_opt(Y) AS L
dc10: 50 20 73 65 6c 65 63 74 28 5a 29 20 52 50 2e 20 P select(Z) RP.
dc20: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 33 57 {. A = sqlite3W
dc30: 69 74 68 41 64 64 28 70 50 61 72 73 65 2c 20 41 ithAdd(pParse, A
dc40: 2c 20 26 58 2c 20 59 2c 20 5a 29 3b 0a 7d 0a 25 , &X, Y, Z);.}.%
dc50: 65 6e 64 69 66 20 20 53 51 4c 49 54 45 5f 4f 4d endif SQLITE_OM
dc60: 49 54 5f 43 54 45 0a IT_CTE.