0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65 /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68 mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 ms copyright to
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a . In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d sing:.**.** M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 nd not evil..**
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 May you find
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 forgiveness for
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 give others..**
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 aking more than
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 53 51 4c ile contains SQL
0190: 69 74 65 27 73 20 67 72 61 6d 6d 61 72 20 66 6f ite's grammar fo
01a0: 72 20 53 51 4c 2e 20 20 50 72 6f 63 65 73 73 20 r SQL. Process
01b0: 74 68 69 73 20 66 69 6c 65 0a 2a 2a 20 75 73 69 this file.** usi
01c0: 6e 67 20 74 68 65 20 6c 65 6d 6f 6e 20 70 61 72 ng the lemon par
01d0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 20 74 6f ser generator to
01e0: 20 67 65 6e 65 72 61 74 65 20 43 20 63 6f 64 65 generate C code
01f0: 20 74 68 61 74 20 72 75 6e 73 0a 2a 2a 20 74 68 that runs.** th
0200: 65 20 70 61 72 73 65 72 2e 20 20 4c 65 6d 6f 6e e parser. Lemon
0210: 20 77 69 6c 6c 20 61 6c 73 6f 20 67 65 6e 65 72 will also gener
0220: 61 74 65 20 61 20 68 65 61 64 65 72 20 66 69 6c ate a header fil
0230: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 e containing.**
0240: 6e 75 6d 65 72 69 63 20 63 6f 64 65 73 20 66 6f numeric codes fo
0250: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 74 6f 6b r all of the tok
0260: 65 6e 73 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 ens..**.** @(#)
0270: 24 49 64 3a 20 70 61 72 73 65 2e 79 2c 76 20 31 $Id: parse.y,v 1
0280: 2e 33 36 20 32 30 30 31 2f 31 30 2f 31 32 20 31 .36 2001/10/12 1
0290: 37 3a 33 30 3a 30 35 20 64 72 68 20 45 78 70 20 7:30:05 drh Exp
02a0: 24 0a 2a 2f 0a 25 74 6f 6b 65 6e 5f 70 72 65 66 $.*/.%token_pref
02b0: 69 78 20 54 4b 5f 0a 25 74 6f 6b 65 6e 5f 74 79 ix TK_.%token_ty
02c0: 70 65 20 7b 54 6f 6b 65 6e 7d 0a 25 64 65 66 61 pe {Token}.%defa
02d0: 75 6c 74 5f 74 79 70 65 20 7b 54 6f 6b 65 6e 7d ult_type {Token}
02e0: 0a 25 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74 .%extra_argument
02f0: 20 7b 50 61 72 73 65 20 2a 70 50 61 72 73 65 7d {Parse *pParse}
0300: 0a 25 73 79 6e 74 61 78 5f 65 72 72 6f 72 20 7b .%syntax_error {
0310: 0a 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 . sqliteSetStri
0320: 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 ng(&pParse->zErr
0330: 4d 73 67 2c 22 73 79 6e 74 61 78 20 65 72 72 6f Msg,"syntax erro
0340: 72 22 2c 30 29 3b 0a 20 20 70 50 61 72 73 65 2d r",0);. pParse-
0350: 3e 73 45 72 72 54 6f 6b 65 6e 20 3d 20 54 4f 4b >sErrToken = TOK
0360: 45 4e 3b 0a 7d 0a 25 6e 61 6d 65 20 73 71 6c 69 EN;.}.%name sqli
0370: 74 65 50 61 72 73 65 72 0a 25 69 6e 63 6c 75 64 teParser.%includ
0380: 65 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 e {.#include "sq
0390: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c liteInt.h".#incl
03a0: 75 64 65 20 22 70 61 72 73 65 2e 68 22 0a 7d 0a ude "parse.h".}.
03b0: 0a 2f 2f 20 54 68 65 73 65 20 61 72 65 20 65 78 .// These are ex
03c0: 74 72 61 20 74 6f 6b 65 6e 73 20 75 73 65 64 20 tra tokens used
03d0: 62 79 20 74 68 65 20 6c 65 78 65 72 20 62 75 74 by the lexer but
03e0: 20 6e 65 76 65 72 20 73 65 65 6e 20 62 79 20 74 never seen by t
03f0: 68 65 0a 2f 2f 20 70 61 72 73 65 72 2e 20 20 57 he.// parser. W
0400: 65 20 70 75 74 20 74 68 65 6d 20 69 6e 20 61 20 e put them in a
0410: 72 75 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 rule so that the
0420: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f parser generato
0430: 72 20 77 69 6c 6c 0a 2f 2f 20 61 64 64 20 74 68 r will.// add th
0440: 65 6d 20 74 6f 20 74 68 65 20 70 61 72 73 65 2e em to the parse.
0450: 68 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 0a 2f h output file../
0460: 2f 0a 25 6e 6f 6e 61 73 73 6f 63 20 45 4e 44 5f /.%nonassoc END_
0470: 4f 46 5f 46 49 4c 45 20 49 4c 4c 45 47 41 4c 20 OF_FILE ILLEGAL
0480: 53 50 41 43 45 20 55 4e 43 4c 4f 53 45 44 5f 53 SPACE UNCLOSED_S
0490: 54 52 49 4e 47 20 43 4f 4d 4d 45 4e 54 20 46 55 TRING COMMENT FU
04a0: 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 NCTION.
04b0: 20 43 4f 4c 55 4d 4e 20 41 47 47 5f 46 55 4e 43 COLUMN AGG_FUNC
04c0: 54 49 4f 4e 2e 0a 0a 2f 2f 20 49 6e 70 75 74 20 TION...// Input
04d0: 69 73 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 is zero or more
04e0: 63 6f 6d 6d 61 6e 64 73 2e 0a 69 6e 70 75 74 20 commands..input
04f0: 3a 3a 3d 20 63 6d 64 6c 69 73 74 2e 0a 0a 2f 2f ::= cmdlist...//
0500: 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6d 6d 61 A list of comma
0510: 6e 64 73 20 69 73 20 7a 65 72 6f 20 6f 72 20 6d nds is zero or m
0520: 6f 72 65 20 63 6f 6d 6d 61 6e 64 73 0a 2f 2f 0a ore commands.//.
0530: 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 65 63 6d 64 cmdlist ::= ecmd
0540: 2e 0a 63 6d 64 6c 69 73 74 20 3a 3a 3d 20 63 6d ..cmdlist ::= cm
0550: 64 6c 69 73 74 20 53 45 4d 49 20 65 63 6d 64 2e dlist SEMI ecmd.
0560: 0a 65 63 6d 64 20 3a 3a 3d 20 65 78 70 6c 61 69 .ecmd ::= explai
0570: 6e 20 63 6d 64 2e 20 20 7b 73 71 6c 69 74 65 45 n cmd. {sqliteE
0580: 78 65 63 28 70 50 61 72 73 65 29 3b 7d 0a 65 63 xec(pParse);}.ec
0590: 6d 64 20 3a 3a 3d 20 63 6d 64 2e 20 20 20 20 20 md ::= cmd.
05a0: 20 20 20 20 20 7b 73 71 6c 69 74 65 45 78 65 63 {sqliteExec
05b0: 28 70 50 61 72 73 65 29 3b 7d 0a 65 63 6d 64 20 (pParse);}.ecmd
05c0: 3a 3a 3d 20 2e 0a 65 78 70 6c 61 69 6e 20 3a 3a ::= ..explain ::
05d0: 3d 20 45 58 50 4c 41 49 4e 2e 20 20 20 20 7b 70 = EXPLAIN. {p
05e0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d Parse->explain =
05f0: 20 31 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 1;}..//////////
0600: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 42 65 67 69 /////////// Begi
0610: 6e 20 61 6e 64 20 65 6e 64 20 74 72 61 6e 73 61 n and end transa
0620: 63 74 69 6f 6e 73 2e 20 2f 2f 2f 2f 2f 2f 2f 2f ctions. ////////
0630: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
0640: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 ////.//.cmd ::=
0650: 42 45 47 49 4e 20 74 72 61 6e 73 5f 6f 70 74 2e BEGIN trans_opt.
0660: 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 42 65 {sqliteBe
0670: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 ginTransaction(p
0680: 50 61 72 73 65 29 3b 7d 0a 74 72 61 6e 73 5f 6f Parse);}.trans_o
0690: 70 74 20 3a 3a 3d 20 2e 0a 74 72 61 6e 73 5f 6f pt ::= ..trans_o
06a0: 70 74 20 3a 3a 3d 20 54 52 41 4e 53 41 43 54 49 pt ::= TRANSACTI
06b0: 4f 4e 2e 0a 74 72 61 6e 73 5f 6f 70 74 20 3a 3a ON..trans_opt ::
06c0: 3d 20 54 52 41 4e 53 41 43 54 49 4f 4e 20 69 64 = TRANSACTION id
06d0: 73 2e 0a 63 6d 64 20 3a 3a 3d 20 43 4f 4d 4d 49 s..cmd ::= COMMI
06e0: 54 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 T trans_opt.
06f0: 20 20 7b 73 71 6c 69 74 65 43 6f 6d 6d 69 74 54 {sqliteCommitT
0700: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 72 73 ransaction(pPars
0710: 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 45 4e 44 e);}.cmd ::= END
0720: 20 74 72 61 6e 73 5f 6f 70 74 2e 20 20 20 20 20 trans_opt.
0730: 20 20 20 20 7b 73 71 6c 69 74 65 43 6f 6d 6d 69 {sqliteCommi
0740: 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 tTransaction(pPa
0750: 72 73 65 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 52 rse);}.cmd ::= R
0760: 4f 4c 4c 42 41 43 4b 20 74 72 61 6e 73 5f 6f 70 OLLBACK trans_op
0770: 74 2e 20 20 20 20 7b 73 71 6c 69 74 65 52 6f 6c t. {sqliteRol
0780: 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e lbackTransaction
0790: 28 70 50 61 72 73 65 29 3b 7d 0a 0a 2f 2f 2f 2f (pParse);}..////
07a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
07b0: 2f 20 54 68 65 20 43 52 45 41 54 45 20 54 41 42 / The CREATE TAB
07c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 2f 2f 2f LE statement ///
07d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
07e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 /////////.//.cmd
07f0: 20 3a 3a 3d 20 63 72 65 61 74 65 5f 74 61 62 6c ::= create_tabl
0800: 65 20 63 72 65 61 74 65 5f 74 61 62 6c 65 5f 61 e create_table_a
0810: 72 67 73 2e 0a 63 72 65 61 74 65 5f 74 61 62 6c rgs..create_tabl
0820: 65 20 3a 3a 3d 20 43 52 45 41 54 45 28 58 29 20 e ::= CREATE(X)
0830: 74 65 6d 70 28 54 29 20 54 41 42 4c 45 20 69 64 temp(T) TABLE id
0840: 73 28 59 29 2e 0a 20 20 20 20 20 20 20 20 20 20 s(Y)..
0850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0870: 20 7b 73 71 6c 69 74 65 53 74 61 72 74 54 61 62 {sqliteStartTab
0880: 6c 65 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c le(pParse,&X,&Y,
0890: 54 29 3b 7d 0a 25 74 79 70 65 20 74 65 6d 70 20 T);}.%type temp
08a0: 7b 69 6e 74 7d 0a 74 65 6d 70 28 41 29 20 3a 3a {int}.temp(A) ::
08b0: 3d 20 54 45 4d 50 2e 20 20 7b 41 20 3d 20 31 3b = TEMP. {A = 1;
08c0: 7d 0a 74 65 6d 70 28 41 29 20 3a 3a 3d 20 2e 20 }.temp(A) ::= .
08d0: 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 63 72 {A = 0;}.cr
08e0: 65 61 74 65 5f 74 61 62 6c 65 5f 61 72 67 73 20 eate_table_args
08f0: 3a 3a 3d 20 4c 50 20 63 6f 6c 75 6d 6e 6c 69 73 ::= LP columnlis
0900: 74 20 63 6f 6e 73 6c 69 73 74 5f 6f 70 74 20 52 t conslist_opt R
0910: 50 28 58 29 2e 0a 20 20 20 20 20 20 20 20 20 20 P(X)..
0920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0940: 20 7b 73 71 6c 69 74 65 45 6e 64 54 61 62 6c 65 {sqliteEndTable
0950: 28 70 50 61 72 73 65 2c 26 58 29 3b 7d 0a 63 6f (pParse,&X);}.co
0960: 6c 75 6d 6e 6c 69 73 74 20 3a 3a 3d 20 63 6f 6c lumnlist ::= col
0970: 75 6d 6e 6c 69 73 74 20 43 4f 4d 4d 41 20 63 6f umnlist COMMA co
0980: 6c 75 6d 6e 2e 0a 63 6f 6c 75 6d 6e 6c 69 73 74 lumn..columnlist
0990: 20 3a 3a 3d 20 63 6f 6c 75 6d 6e 2e 0a 0a 2f 2f ::= column...//
09a0: 20 41 62 6f 75 74 20 74 68 65 20 6f 6e 6c 79 20 About the only
09b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 73 65 64 information used
09c0: 20 66 6f 72 20 61 20 63 6f 6c 75 6d 6e 20 69 73 for a column is
09d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 the name of the
09e0: 0a 2f 2f 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 .// column. The
09f0: 20 74 79 70 65 20 69 73 20 61 6c 77 61 79 73 20 type is always
0a00: 6a 75 73 74 20 22 74 65 78 74 22 2e 20 20 42 75 just "text". Bu
0a10: 74 20 74 68 65 20 63 6f 64 65 20 77 69 6c 6c 20 t the code will
0a20: 61 63 63 65 70 74 0a 2f 2f 20 61 6e 20 65 6c 61 accept.// an ela
0a30: 62 6f 72 61 74 65 20 74 79 70 65 6e 61 6d 65 2e borate typename.
0a40: 20 20 50 65 72 68 61 70 73 20 73 6f 6d 65 64 61 Perhaps someda
0a50: 79 20 77 65 27 6c 6c 20 64 6f 20 73 6f 6d 65 74 y we'll do somet
0a60: 68 69 6e 67 20 77 69 74 68 20 69 74 2e 0a 2f 2f hing with it..//
0a70: 0a 63 6f 6c 75 6d 6e 20 3a 3a 3d 20 63 6f 6c 75 .column ::= colu
0a80: 6d 6e 69 64 20 74 79 70 65 20 63 61 72 67 6c 69 mnid type cargli
0a90: 73 74 2e 20 0a 63 6f 6c 75 6d 6e 69 64 20 3a 3a st. .columnid ::
0aa0: 3d 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20 = ids(X).
0ab0: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 {sqlite
0ac0: 41 64 64 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 AddColumn(pParse
0ad0: 2c 26 58 29 3b 7d 0a 0a 2f 2f 20 41 6e 20 49 44 ,&X);}..// An ID
0ae0: 45 4e 54 49 46 49 45 52 20 63 61 6e 20 62 65 20 ENTIFIER can be
0af0: 61 20 67 65 6e 65 72 69 63 20 69 64 65 6e 74 69 a generic identi
0b00: 66 69 65 72 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 fier, or one of
0b10: 73 65 76 65 72 61 6c 0a 2f 2f 20 6b 65 79 77 6f several.// keywo
0b20: 72 64 73 2e 20 20 41 6e 79 20 6e 6f 6e 2d 73 74 rds. Any non-st
0b30: 61 6e 64 61 72 64 20 6b 65 79 77 6f 72 64 20 63 andard keyword c
0b40: 61 6e 20 61 6c 73 6f 20 62 65 20 61 6e 20 69 64 an also be an id
0b50: 65 6e 74 69 66 69 65 72 2e 0a 2f 2f 20 57 65 20 entifier..// We
0b60: 61 6c 73 6f 20 6d 61 6b 65 20 44 45 53 43 20 61 also make DESC a
0b70: 6e 64 20 69 64 65 6e 74 69 66 69 65 72 20 73 69 nd identifier si
0b80: 6e 63 65 20 69 74 20 63 6f 6d 65 73 20 75 70 20 nce it comes up
0b90: 73 6f 20 6f 66 74 65 6e 20 28 61 73 0a 2f 2f 20 so often (as.//
0ba0: 61 6e 20 61 62 62 72 65 76 69 61 74 69 6f 6e 20 an abbreviation
0bb0: 6f 66 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 of "description"
0bc0: 29 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 64 20 7b )..//.%type id {
0bd0: 54 6f 6b 65 6e 7d 0a 69 64 28 41 29 20 3a 3a 3d Token}.id(A) ::=
0be0: 20 44 45 53 43 28 58 29 2e 20 20 20 20 20 20 20 DESC(X).
0bf0: 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a {A = X;}.id(A) :
0c00: 3a 3d 20 41 53 43 28 58 29 2e 20 20 20 20 20 20 := ASC(X).
0c10: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 {A = X;}.id(A)
0c20: 20 3a 3a 3d 20 44 45 4c 49 4d 49 54 45 52 53 28 ::= DELIMITERS(
0c30: 58 29 2e 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 X). {A = X;}.id(
0c40: 41 29 20 3a 3a 3d 20 45 58 50 4c 41 49 4e 28 58 A) ::= EXPLAIN(X
0c50: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 ). {A = X;}.i
0c60: 64 28 41 29 20 3a 3a 3d 20 56 41 43 55 55 4d 28 d(A) ::= VACUUM(
0c70: 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d X). {A = X;}
0c80: 0a 69 64 28 41 29 20 3a 3a 3d 20 42 45 47 49 4e .id(A) ::= BEGIN
0c90: 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 58 (X). {A = X
0ca0: 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 45 4e 44 ;}.id(A) ::= END
0cb0: 28 58 29 2e 20 20 20 20 20 20 20 20 7b 41 20 3d (X). {A =
0cc0: 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d 20 50 X;}.id(A) ::= P
0cd0: 52 41 47 4d 41 28 58 29 2e 20 20 20 20 20 7b 41 RAGMA(X). {A
0ce0: 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a 3a 3d = X;}.id(A) ::=
0cf0: 20 43 4c 55 53 54 45 52 28 58 29 2e 20 20 20 20 CLUSTER(X).
0d00: 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 20 3a {A = X;}.id(A) :
0d10: 3a 3d 20 49 44 28 58 29 2e 20 20 20 20 20 20 20 := ID(X).
0d20: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 28 41 29 {A = X;}.id(A)
0d30: 20 3a 3a 3d 20 54 45 4d 50 28 58 29 2e 20 20 20 ::= TEMP(X).
0d40: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f {A = X;}..//
0d50: 20 41 6e 64 20 22 69 64 73 22 20 69 73 20 61 6e And "ids" is an
0d60: 20 69 64 65 6e 74 69 66 65 72 2d 6f 72 2d 73 74 identifer-or-st
0d70: 72 69 6e 67 2e 0a 2f 2f 0a 25 74 79 70 65 20 69 ring..//.%type i
0d80: 64 73 20 7b 54 6f 6b 65 6e 7d 0a 69 64 73 28 41 ds {Token}.ids(A
0d90: 29 20 3a 3a 3d 20 69 64 28 58 29 2e 20 20 20 20 ) ::= id(X).
0da0: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 64 73 {A = X;}.ids
0db0: 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 (A) ::= STRING(X
0dc0: 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a ). {A = X;}..
0dd0: 74 79 70 65 20 3a 3a 3d 20 2e 0a 74 79 70 65 20 type ::= ..type
0de0: 3a 3a 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 2e ::= typename(X).
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0e00: 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f {sqliteAddCo
0e10: 6c 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c lumnType(pParse,
0e20: 26 58 2c 26 58 29 3b 7d 0a 74 79 70 65 20 3a 3a &X,&X);}.type ::
0e30: 3d 20 74 79 70 65 6e 61 6d 65 28 58 29 20 4c 50 = typename(X) LP
0e40: 20 73 69 67 6e 65 64 20 52 50 28 59 29 2e 20 20 signed RP(Y).
0e50: 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f 6c 75 {sqliteAddColu
0e60: 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 58 mnType(pParse,&X
0e70: 2c 26 59 29 3b 7d 0a 74 79 70 65 20 3a 3a 3d 20 ,&Y);}.type ::=
0e80: 74 79 70 65 6e 61 6d 65 28 58 29 20 4c 50 20 73 typename(X) LP s
0e90: 69 67 6e 65 64 20 43 4f 4d 4d 41 20 73 69 67 6e igned COMMA sign
0ea0: 65 64 20 52 50 28 59 29 2e 0a 20 20 20 20 20 20 ed RP(Y)..
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ed0: 20 20 20 7b 73 71 6c 69 74 65 41 64 64 43 6f 6c {sqliteAddCol
0ee0: 75 6d 6e 54 79 70 65 28 70 50 61 72 73 65 2c 26 umnType(pParse,&
0ef0: 58 2c 26 59 29 3b 7d 0a 25 74 79 70 65 20 74 79 X,&Y);}.%type ty
0f00: 70 65 6e 61 6d 65 20 7b 54 6f 6b 65 6e 7d 0a 74 pename {Token}.t
0f10: 79 70 65 6e 61 6d 65 28 41 29 20 3a 3a 3d 20 69 ypename(A) ::= i
0f20: 64 73 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 ds(X).
0f30: 20 7b 41 20 3d 20 58 3b 7d 0a 74 79 70 65 6e 61 {A = X;}.typena
0f40: 6d 65 28 41 29 20 3a 3a 3d 20 74 79 70 65 6e 61 me(A) ::= typena
0f50: 6d 65 28 58 29 20 69 64 73 2e 20 20 7b 41 20 3d me(X) ids. {A =
0f60: 20 58 3b 7d 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 X;}.signed ::=
0f70: 49 4e 54 45 47 45 52 2e 0a 73 69 67 6e 65 64 20 INTEGER..signed
0f80: 3a 3a 3d 20 50 4c 55 53 20 49 4e 54 45 47 45 52 ::= PLUS INTEGER
0f90: 2e 0a 73 69 67 6e 65 64 20 3a 3a 3d 20 4d 49 4e ..signed ::= MIN
0fa0: 55 53 20 49 4e 54 45 47 45 52 2e 0a 63 61 72 67 US INTEGER..carg
0fb0: 6c 69 73 74 20 3a 3a 3d 20 63 61 72 67 6c 69 73 list ::= carglis
0fc0: 74 20 63 61 72 67 2e 0a 63 61 72 67 6c 69 73 74 t carg..carglist
0fd0: 20 3a 3a 3d 20 2e 0a 63 61 72 67 20 3a 3a 3d 20 ::= ..carg ::=
0fe0: 43 4f 4e 53 54 52 41 49 4e 54 20 69 64 73 20 63 CONSTRAINT ids c
0ff0: 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 63 cons..carg ::= c
1000: 63 6f 6e 73 2e 0a 63 61 72 67 20 3a 3a 3d 20 44 cons..carg ::= D
1010: 45 46 41 55 4c 54 20 53 54 52 49 4e 47 28 58 29 EFAULT STRING(X)
1020: 2e 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 . {sqli
1030: 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75 teAddDefaultValu
1040: 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b 7d e(pParse,&X,0);}
1050: 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c .carg ::= DEFAUL
1060: 54 20 49 44 28 58 29 2e 20 20 20 20 20 20 20 20 T ID(X).
1070: 20 20 20 20 20 20 7b 73 71 6c 69 74 65 41 64 64 {sqliteAdd
1080: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 61 DefaultValue(pPa
1090: 72 73 65 2c 26 58 2c 30 29 3b 7d 0a 63 61 72 67 rse,&X,0);}.carg
10a0: 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 49 4e 54 ::= DEFAULT INT
10b0: 45 47 45 52 28 58 29 2e 20 20 20 20 20 20 20 20 EGER(X).
10c0: 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61 75 {sqliteAddDefau
10d0: 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c 26 ltValue(pParse,&
10e0: 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 X,0);}.carg ::=
10f0: 44 45 46 41 55 4c 54 20 50 4c 55 53 20 49 4e 54 DEFAULT PLUS INT
1100: 45 47 45 52 28 58 29 2e 20 20 20 20 7b 73 71 6c EGER(X). {sql
1110: 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 6c iteAddDefaultVal
1120: 75 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29 3b ue(pParse,&X,0);
1130: 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 55 }.carg ::= DEFAU
1140: 4c 54 20 4d 49 4e 55 53 20 49 4e 54 45 47 45 52 LT MINUS INTEGER
1150: 28 58 29 2e 20 20 20 7b 73 71 6c 69 74 65 41 64 (X). {sqliteAd
1160: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 50 dDefaultValue(pP
1170: 61 72 73 65 2c 26 58 2c 31 29 3b 7d 0a 63 61 72 arse,&X,1);}.car
1180: 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 46 4c g ::= DEFAULT FL
1190: 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20 20 20 OAT(X).
11a0: 20 20 7b 73 71 6c 69 74 65 41 64 64 44 65 66 61 {sqliteAddDefa
11b0: 75 6c 74 56 61 6c 75 65 28 70 50 61 72 73 65 2c ultValue(pParse,
11c0: 26 58 2c 30 29 3b 7d 0a 63 61 72 67 20 3a 3a 3d &X,0);}.carg ::=
11d0: 20 44 45 46 41 55 4c 54 20 50 4c 55 53 20 46 4c DEFAULT PLUS FL
11e0: 4f 41 54 28 58 29 2e 20 20 20 20 20 20 7b 73 71 OAT(X). {sq
11f0: 6c 69 74 65 41 64 64 44 65 66 61 75 6c 74 56 61 liteAddDefaultVa
1200: 6c 75 65 28 70 50 61 72 73 65 2c 26 58 2c 30 29 lue(pParse,&X,0)
1210: 3b 7d 0a 63 61 72 67 20 3a 3a 3d 20 44 45 46 41 ;}.carg ::= DEFA
1220: 55 4c 54 20 4d 49 4e 55 53 20 46 4c 4f 41 54 28 ULT MINUS FLOAT(
1230: 58 29 2e 20 20 20 20 20 7b 73 71 6c 69 74 65 41 X). {sqliteA
1240: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 70 ddDefaultValue(p
1250: 50 61 72 73 65 2c 26 58 2c 31 29 3b 7d 0a 63 61 Parse,&X,1);}.ca
1260: 72 67 20 3a 3a 3d 20 44 45 46 41 55 4c 54 20 4e rg ::= DEFAULT N
1270: 55 4c 4c 2e 20 0a 0a 2f 2f 20 49 6e 20 61 64 64 ULL. ..// In add
1280: 69 74 69 6f 6e 20 74 6f 20 74 68 65 20 74 79 70 ition to the typ
1290: 65 20 6e 61 6d 65 2c 20 77 65 20 61 6c 73 6f 20 e name, we also
12a0: 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20 70 care about the p
12b0: 72 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 0a 2f rimary key and./
12c0: 2f 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 / UNIQUE constra
12d0: 69 6e 74 73 2e 0a 2f 2f 0a 63 63 6f 6e 73 20 3a ints..//.ccons :
12e0: 3a 3d 20 4e 4f 54 20 4e 55 4c 4c 2e 20 20 20 20 := NOT NULL.
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 {s
1300: 71 6c 69 74 65 41 64 64 4e 6f 74 4e 75 6c 6c 28 qliteAddNotNull(
1310: 70 50 61 72 73 65 29 3b 7d 0a 63 63 6f 6e 73 20 pParse);}.ccons
1320: 3a 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20 ::= PRIMARY KEY
1330: 73 6f 72 74 6f 72 64 65 72 2e 20 20 20 20 20 7b sortorder. {
1340: 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 sqliteCreateInde
1350: 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 31 x(pParse,0,0,0,1
1360: 2c 30 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a ,0,0);}.ccons ::
1370: 3d 20 55 4e 49 51 55 45 2e 20 20 20 20 20 20 20 = UNIQUE.
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 {sq
1390: 6c 69 74 65 43 72 65 61 74 65 49 6e 64 65 78 28 liteCreateIndex(
13a0: 70 50 61 72 73 65 2c 30 2c 30 2c 30 2c 31 2c 30 pParse,0,0,0,1,0
13b0: 2c 30 29 3b 7d 0a 63 63 6f 6e 73 20 3a 3a 3d 20 ,0);}.ccons ::=
13c0: 43 48 45 43 4b 20 4c 50 20 65 78 70 72 20 52 50 CHECK LP expr RP
13d0: 2e 0a 0a 2f 2f 20 46 6f 72 20 74 68 65 20 74 69 ...// For the ti
13e0: 6d 65 20 62 65 69 6e 67 2c 20 74 68 65 20 6f 6e me being, the on
13f0: 6c 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 77 65 ly constraint we
1400: 20 63 61 72 65 20 61 62 6f 75 74 20 69 73 20 74 care about is t
1410: 68 65 20 70 72 69 6d 61 72 79 0a 2f 2f 20 6b 65 he primary.// ke
1420: 79 20 61 6e 64 20 55 4e 49 51 55 45 2e 20 20 42 y and UNIQUE. B
1430: 6f 74 68 20 63 72 65 61 74 65 20 69 6e 64 69 63 oth create indic
1440: 65 73 2e 0a 2f 2f 0a 63 6f 6e 73 6c 69 73 74 5f es..//.conslist_
1450: 6f 70 74 20 3a 3a 3d 20 2e 0a 63 6f 6e 73 6c 69 opt ::= ..consli
1460: 73 74 5f 6f 70 74 20 3a 3a 3d 20 43 4f 4d 4d 41 st_opt ::= COMMA
1470: 20 63 6f 6e 73 6c 69 73 74 2e 0a 63 6f 6e 73 6c conslist..consl
1480: 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c 69 73 74 ist ::= conslist
1490: 20 43 4f 4d 4d 41 20 74 63 6f 6e 73 2e 0a 63 6f COMMA tcons..co
14a0: 6e 73 6c 69 73 74 20 3a 3a 3d 20 63 6f 6e 73 6c nslist ::= consl
14b0: 69 73 74 20 74 63 6f 6e 73 2e 0a 63 6f 6e 73 6c ist tcons..consl
14c0: 69 73 74 20 3a 3a 3d 20 74 63 6f 6e 73 2e 0a 74 ist ::= tcons..t
14d0: 63 6f 6e 73 20 3a 3a 3d 20 43 4f 4e 53 54 52 41 cons ::= CONSTRA
14e0: 49 4e 54 20 69 64 73 2e 0a 74 63 6f 6e 73 20 3a INT ids..tcons :
14f0: 3a 3d 20 50 52 49 4d 41 52 59 20 4b 45 59 20 4c := PRIMARY KEY L
1500: 50 20 69 64 78 6c 69 73 74 28 58 29 20 52 50 2e P idxlist(X) RP.
1510: 20 7b 73 71 6c 69 74 65 43 72 65 61 74 65 49 6e {sqliteCreateIn
1520: 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c 58 dex(pParse,0,0,X
1530: 2c 31 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e 73 20 ,1,0,0);}.tcons
1540: 3a 3a 3d 20 55 4e 49 51 55 45 20 4c 50 20 69 64 ::= UNIQUE LP id
1550: 78 6c 69 73 74 28 58 29 20 52 50 2e 20 20 20 20 xlist(X) RP.
1560: 20 20 7b 73 71 6c 69 74 65 43 72 65 61 74 65 49 {sqliteCreateI
1570: 6e 64 65 78 28 70 50 61 72 73 65 2c 30 2c 30 2c ndex(pParse,0,0,
1580: 58 2c 31 2c 30 2c 30 29 3b 7d 0a 74 63 6f 6e 73 X,1,0,0);}.tcons
1590: 20 3a 3a 3d 20 43 48 45 43 4b 20 65 78 70 72 2e ::= CHECK expr.
15a0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ..//////////////
15b0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 //////////// The
15c0: 20 44 52 4f 50 20 54 41 42 4c 45 20 2f 2f 2f 2f DROP TABLE ////
15d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
15e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
15f0: 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f /.//.cmd ::= DRO
1600: 50 20 54 41 42 4c 45 20 69 64 73 28 58 29 2e 20 P TABLE ids(X).
1610: 20 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 {sqlite
1620: 44 72 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 DropTable(pParse
1630: 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f ,&X);}..////////
1640: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1650: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 The SELECT stat
1660: 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ement //////////
1670: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
1680: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a ///////.//.cmd :
1690: 3a 3d 20 73 65 6c 65 63 74 28 58 29 2e 20 20 7b := select(X). {
16a0: 0a 20 20 73 71 6c 69 74 65 53 65 6c 65 63 74 28 . sqliteSelect(
16b0: 70 50 61 72 73 65 2c 20 58 2c 20 53 52 54 5f 43 pParse, X, SRT_C
16c0: 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 73 allback, 0);. s
16d0: 71 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 qliteSelectDelet
16e0: 65 28 58 29 3b 0a 7d 0a 0a 25 74 79 70 65 20 73 e(X);.}..%type s
16f0: 65 6c 65 63 74 20 7b 53 65 6c 65 63 74 2a 7d 0a elect {Select*}.
1700: 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 6c 65 %destructor sele
1710: 63 74 20 7b 73 71 6c 69 74 65 53 65 6c 65 63 74 ct {sqliteSelect
1720: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 Delete($$);}.%ty
1730: 70 65 20 6f 6e 65 73 65 6c 65 63 74 20 7b 53 65 pe oneselect {Se
1740: 6c 65 63 74 2a 7d 0a 25 64 65 73 74 72 75 63 74 lect*}.%destruct
1750: 6f 72 20 6f 6e 65 73 65 6c 65 63 74 20 7b 73 71 or oneselect {sq
1760: 6c 69 74 65 53 65 6c 65 63 74 44 65 6c 65 74 65 liteSelectDelete
1770: 28 24 24 29 3b 7d 0a 0a 73 65 6c 65 63 74 28 41 ($$);}..select(A
1780: 29 20 3a 3a 3d 20 6f 6e 65 73 65 6c 65 63 74 28 ) ::= oneselect(
1790: 58 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 X).
17a0: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b {A = X;
17b0: 7d 0a 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 }.select(A) ::=
17c0: 73 65 6c 65 63 74 28 58 29 20 6a 6f 69 6e 6f 70 select(X) joinop
17d0: 28 59 29 20 6f 6e 65 73 65 6c 65 63 74 28 5a 29 (Y) oneselect(Z)
17e0: 2e 20 20 7b 0a 20 20 69 66 28 20 5a 20 29 7b 0a . {. if( Z ){.
17f0: 20 20 20 20 5a 2d 3e 6f 70 20 3d 20 59 3b 0a 20 Z->op = Y;.
1800: 20 20 20 5a 2d 3e 70 50 72 69 6f 72 20 3d 20 58 Z->pPrior = X
1810: 3b 0a 20 20 7d 0a 20 20 41 20 3d 20 5a 3b 0a 7d ;. }. A = Z;.}
1820: 0a 25 74 79 70 65 20 6a 6f 69 6e 6f 70 20 7b 69 .%type joinop {i
1830: 6e 74 7d 0a 6a 6f 69 6e 6f 70 28 41 29 20 3a 3a nt}.joinop(A) ::
1840: 3d 20 55 4e 49 4f 4e 2e 20 20 20 20 20 20 7b 41 = UNION. {A
1850: 20 3d 20 54 4b 5f 55 4e 49 4f 4e 3b 7d 0a 6a 6f = TK_UNION;}.jo
1860: 69 6e 6f 70 28 41 29 20 3a 3a 3d 20 55 4e 49 4f inop(A) ::= UNIO
1870: 4e 20 41 4c 4c 2e 20 20 7b 41 20 3d 20 54 4b 5f N ALL. {A = TK_
1880: 41 4c 4c 3b 7d 0a 6a 6f 69 6e 6f 70 28 41 29 20 ALL;}.joinop(A)
1890: 3a 3a 3d 20 49 4e 54 45 52 53 45 43 54 2e 20 20 ::= INTERSECT.
18a0: 7b 41 20 3d 20 54 4b 5f 49 4e 54 45 52 53 45 43 {A = TK_INTERSEC
18b0: 54 3b 7d 0a 6a 6f 69 6e 6f 70 28 41 29 20 3a 3a T;}.joinop(A) ::
18c0: 3d 20 45 58 43 45 50 54 2e 20 20 20 20 20 7b 41 = EXCEPT. {A
18d0: 20 3d 20 54 4b 5f 45 58 43 45 50 54 3b 7d 0a 6f = TK_EXCEPT;}.o
18e0: 6e 65 73 65 6c 65 63 74 28 41 29 20 3a 3a 3d 20 neselect(A) ::=
18f0: 53 45 4c 45 43 54 20 64 69 73 74 69 6e 63 74 28 SELECT distinct(
1900: 44 29 20 73 65 6c 63 6f 6c 6c 69 73 74 28 57 29 D) selcollist(W)
1910: 20 66 72 6f 6d 28 58 29 20 77 68 65 72 65 5f 6f from(X) where_o
1920: 70 74 28 59 29 0a 20 20 20 20 20 20 20 20 20 20 pt(Y).
1930: 20 20 20 20 20 20 20 67 72 6f 75 70 62 79 5f 6f groupby_o
1940: 70 74 28 50 29 20 68 61 76 69 6e 67 5f 6f 70 74 pt(P) having_opt
1950: 28 51 29 20 6f 72 64 65 72 62 79 5f 6f 70 74 28 (Q) orderby_opt(
1960: 5a 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 Z). {. A = sqli
1970: 74 65 53 65 6c 65 63 74 4e 65 77 28 57 2c 58 2c teSelectNew(W,X,
1980: 59 2c 50 2c 51 2c 5a 2c 44 29 3b 0a 7d 0a 0a 2f Y,P,Q,Z,D);.}../
1990: 2f 20 54 68 65 20 22 64 69 73 74 69 6e 63 74 22 / The "distinct"
19a0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 69 73 20 nonterminal is
19b0: 74 72 75 65 20 28 31 29 20 69 66 20 74 68 65 20 true (1) if the
19c0: 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72 64 DISTINCT keyword
19d0: 20 69 73 0a 2f 2f 20 70 72 65 73 65 6e 74 20 61 is.// present a
19e0: 6e 64 20 66 61 6c 73 65 20 28 30 29 20 69 66 20 nd false (0) if
19f0: 69 74 20 69 73 20 6e 6f 74 2e 0a 2f 2f 0a 25 74 it is not..//.%t
1a00: 79 70 65 20 64 69 73 74 69 6e 63 74 20 7b 69 6e ype distinct {in
1a10: 74 7d 0a 64 69 73 74 69 6e 63 74 28 41 29 20 3a t}.distinct(A) :
1a20: 3a 3d 20 44 49 53 54 49 4e 43 54 2e 20 20 20 7b := DISTINCT. {
1a30: 41 20 3d 20 31 3b 7d 0a 64 69 73 74 69 6e 63 74 A = 1;}.distinct
1a40: 28 41 29 20 3a 3a 3d 20 41 4c 4c 2e 20 20 20 20 (A) ::= ALL.
1a50: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 64 69 73 {A = 0;}.dis
1a60: 74 69 6e 63 74 28 41 29 20 3a 3a 3d 20 2e 20 20 tinct(A) ::= .
1a70: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b {A = 0;
1a80: 7d 0a 0a 2f 2f 20 73 65 6c 63 6f 6c 6c 69 73 74 }..// selcollist
1a90: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 is a list of ex
1aa0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 pressions that a
1ab0: 72 65 20 74 6f 20 62 65 63 6f 6d 65 20 74 68 65 re to become the
1ac0: 20 72 65 74 75 72 6e 0a 2f 2f 20 76 61 6c 75 65 return.// value
1ad0: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 s of the SELECT
1ae0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 74 statement. In t
1af0: 68 65 20 63 61 73 65 20 6f 66 20 22 53 45 4c 45 he case of "SELE
1b00: 43 54 20 2a 20 46 52 4f 4d 20 2e 2e 2e 22 0a 2f CT * FROM ..."./
1b10: 2f 20 74 68 65 20 73 65 6c 63 6f 6c 6c 69 73 74 / the selcollist
1b20: 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2e 20 value is NULL.
1b30: 20 0a 2f 2f 0a 25 74 79 70 65 20 73 65 6c 63 6f .//.%type selco
1b40: 6c 6c 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a llist {ExprList*
1b50: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 73 65 }.%destructor se
1b60: 6c 63 6f 6c 6c 69 73 74 20 7b 73 71 6c 69 74 65 lcollist {sqlite
1b70: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 ExprListDelete($
1b80: 24 29 3b 7d 0a 25 74 79 70 65 20 73 63 6c 70 20 $);}.%type sclp
1b90: 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 {ExprList*}.%des
1ba0: 74 72 75 63 74 6f 72 20 73 63 6c 70 20 7b 73 71 tructor sclp {sq
1bb0: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 liteExprListDele
1bc0: 74 65 28 24 24 29 3b 7d 0a 73 63 6c 70 28 41 29 te($$);}.sclp(A)
1bd0: 20 3a 3a 3d 20 73 65 6c 63 6f 6c 6c 69 73 74 28 ::= selcollist(
1be0: 58 29 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20 X) COMMA.
1bf0: 20 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 73 {A = X;}.s
1c00: 63 6c 70 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 clp(A) ::= .
1c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d {A =
1c30: 20 30 3b 7d 0a 73 65 6c 63 6f 6c 6c 69 73 74 28 0;}.selcollist(
1c40: 41 29 20 3a 3a 3d 20 53 54 41 52 2e 20 20 20 20 A) ::= STAR.
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c60: 20 20 7b 41 20 3d 20 30 3b 7d 0a 73 65 6c 63 6f {A = 0;}.selco
1c70: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c llist(A) ::= scl
1c80: 70 28 50 29 20 65 78 70 72 28 58 29 2e 20 20 20 p(P) expr(X).
1c90: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c {A = sql
1ca0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e iteExprListAppen
1cb0: 64 28 50 2c 58 2c 30 29 3b 7d 0a 73 65 6c 63 6f d(P,X,0);}.selco
1cc0: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 73 63 6c llist(A) ::= scl
1cd0: 70 28 50 29 20 65 78 70 72 28 58 29 20 61 73 20 p(P) expr(X) as
1ce0: 69 64 73 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c ids(Y). {A = sql
1cf0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e iteExprListAppen
1d00: 64 28 50 2c 58 2c 26 59 29 3b 7d 0a 61 73 20 3a d(P,X,&Y);}.as :
1d10: 3a 3d 20 2e 0a 61 73 20 3a 3a 3d 20 41 53 2e 0a := ..as ::= AS..
1d20: 0a 0a 25 74 79 70 65 20 73 65 6c 74 61 62 6c 69 ..%type seltabli
1d30: 73 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 st {IdList*}.%de
1d40: 73 74 72 75 63 74 6f 72 20 73 65 6c 74 61 62 6c structor seltabl
1d50: 69 73 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 ist {sqliteIdLis
1d60: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 74 tDelete($$);}.%t
1d70: 79 70 65 20 73 74 6c 5f 70 72 65 66 69 78 20 7b ype stl_prefix {
1d80: 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 IdList*}.%destru
1d90: 63 74 6f 72 20 73 74 6c 5f 70 72 65 66 69 78 20 ctor stl_prefix
1da0: 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c {sqliteIdListDel
1db0: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 ete($$);}.%type
1dc0: 66 72 6f 6d 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 from {IdList*}.%
1dd0: 64 65 73 74 72 75 63 74 6f 72 20 66 72 6f 6d 20 destructor from
1de0: 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c {sqliteIdListDel
1df0: 65 74 65 28 24 24 29 3b 7d 0a 0a 66 72 6f 6d 28 ete($$);}..from(
1e00: 41 29 20 3a 3a 3d 20 46 52 4f 4d 20 73 65 6c 74 A) ::= FROM selt
1e10: 61 62 6c 69 73 74 28 58 29 2e 20 20 20 20 20 20 ablist(X).
1e20: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 58 3b {A = X;
1e30: 7d 0a 73 74 6c 5f 70 72 65 66 69 78 28 41 29 20 }.stl_prefix(A)
1e40: 3a 3a 3d 20 73 65 6c 74 61 62 6c 69 73 74 28 58 ::= seltablist(X
1e50: 29 20 43 4f 4d 4d 41 2e 20 20 20 20 20 20 20 20 ) COMMA.
1e60: 7b 41 20 3d 20 58 3b 7d 0a 73 74 6c 5f 70 72 65 {A = X;}.stl_pre
1e70: 66 69 78 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 fix(A) ::= .
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e90: 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a {A = 0;}.
1ea0: 73 65 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a seltablist(A) ::
1eb0: 3d 20 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20 = stl_prefix(X)
1ec0: 69 64 73 28 59 29 2e 20 20 20 20 20 20 20 7b 41 ids(Y). {A
1ed0: 20 3d 20 73 71 6c 69 74 65 49 64 4c 69 73 74 41 = sqliteIdListA
1ee0: 70 70 65 6e 64 28 58 2c 26 59 29 3b 7d 0a 73 65 ppend(X,&Y);}.se
1ef0: 6c 74 61 62 6c 69 73 74 28 41 29 20 3a 3a 3d 20 ltablist(A) ::=
1f00: 73 74 6c 5f 70 72 65 66 69 78 28 58 29 20 69 64 stl_prefix(X) id
1f10: 73 28 59 29 20 61 73 20 69 64 73 28 5a 29 2e 20 s(Y) as ids(Z).
1f20: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 49 64 {. A = sqliteId
1f30: 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59 29 ListAppend(X,&Y)
1f40: 3b 0a 20 20 73 71 6c 69 74 65 49 64 4c 69 73 74 ;. sqliteIdList
1f50: 41 64 64 41 6c 69 61 73 28 41 2c 26 5a 29 3b 0a AddAlias(A,&Z);.
1f60: 7d 0a 0a 25 74 79 70 65 20 6f 72 64 65 72 62 79 }..%type orderby
1f70: 5f 6f 70 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d _opt {ExprList*}
1f80: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 6f 72 64 .%destructor ord
1f90: 65 72 62 79 5f 6f 70 74 20 7b 73 71 6c 69 74 65 erby_opt {sqlite
1fa0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 24 ExprListDelete($
1fb0: 24 29 3b 7d 0a 25 74 79 70 65 20 73 6f 72 74 6c $);}.%type sortl
1fc0: 69 73 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a ist {ExprList*}.
1fd0: 25 64 65 73 74 72 75 63 74 6f 72 20 73 6f 72 74 %destructor sort
1fe0: 6c 69 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 list {sqliteExpr
1ff0: 4c 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d ListDelete($$);}
2000: 0a 25 74 79 70 65 20 73 6f 72 74 69 74 65 6d 20 .%type sortitem
2010: 7b 45 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 {Expr*}.%destruc
2020: 74 6f 72 20 73 6f 72 74 69 74 65 6d 20 7b 73 71 tor sortitem {sq
2030: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 24 liteExprDelete($
2040: 24 29 3b 7d 0a 0a 6f 72 64 65 72 62 79 5f 6f 70 $);}..orderby_op
2050: 74 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 t(A) ::= .
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2070: 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 6f 72 64 {A = 0;}.ord
2080: 65 72 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 erby_opt(A) ::=
2090: 4f 52 44 45 52 20 42 59 20 73 6f 72 74 6c 69 73 ORDER BY sortlis
20a0: 74 28 58 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 t(X). {A =
20b0: 58 3b 7d 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 X;}.sortlist(A)
20c0: 3a 3a 3d 20 73 6f 72 74 6c 69 73 74 28 58 29 20 ::= sortlist(X)
20d0: 43 4f 4d 4d 41 20 73 6f 72 74 69 74 65 6d 28 59 COMMA sortitem(Y
20e0: 29 20 73 6f 72 74 6f 72 64 65 72 28 5a 29 2e 20 ) sortorder(Z).
20f0: 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 {. A = sqliteEx
2100: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 59 prListAppend(X,Y
2110: 2c 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 ,0);. if( A ) A
2120: 2d 3e 61 5b 41 2d 3e 6e 45 78 70 72 2d 31 5d 2e ->a[A->nExpr-1].
2130: 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a 3b 20 20 sortOrder = Z;
2140: 2f 2a 20 30 3d 61 73 63 65 6e 64 69 6e 67 2c 20 /* 0=ascending,
2150: 31 3d 64 65 63 65 6e 64 69 6e 67 20 2a 2f 0a 7d 1=decending */.}
2160: 0a 73 6f 72 74 6c 69 73 74 28 41 29 20 3a 3a 3d .sortlist(A) ::=
2170: 20 73 6f 72 74 69 74 65 6d 28 59 29 20 73 6f 72 sortitem(Y) sor
2180: 74 6f 72 64 65 72 28 5a 29 2e 20 7b 0a 20 20 41 torder(Z). {. A
2190: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 = sqliteExprLis
21a0: 74 41 70 70 65 6e 64 28 30 2c 59 2c 30 29 3b 0a tAppend(0,Y,0);.
21b0: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 61 5b 30 if( A ) A->a[0
21c0: 5d 2e 73 6f 72 74 4f 72 64 65 72 20 3d 20 5a 3b ].sortOrder = Z;
21d0: 0a 7d 0a 73 6f 72 74 69 74 65 6d 28 41 29 20 3a .}.sortitem(A) :
21e0: 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 7b 41 := expr(X). {A
21f0: 20 3d 20 58 3b 7d 0a 0a 25 74 79 70 65 20 73 6f = X;}..%type so
2200: 72 74 6f 72 64 65 72 20 7b 69 6e 74 7d 0a 0a 73 rtorder {int}..s
2210: 6f 72 74 6f 72 64 65 72 28 41 29 20 3a 3a 3d 20 ortorder(A) ::=
2220: 41 53 43 2e 20 20 20 20 20 20 7b 41 20 3d 20 30 ASC. {A = 0
2230: 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 28 41 29 20 ;}.sortorder(A)
2240: 3a 3a 3d 20 44 45 53 43 2e 20 20 20 20 20 7b 41 ::= DESC. {A
2250: 20 3d 20 31 3b 7d 0a 73 6f 72 74 6f 72 64 65 72 = 1;}.sortorder
2260: 28 41 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 (A) ::= .
2270: 20 20 7b 41 20 3d 20 30 3b 7d 0a 0a 25 74 79 70 {A = 0;}..%typ
2280: 65 20 67 72 6f 75 70 62 79 5f 6f 70 74 20 7b 45 e groupby_opt {E
2290: 78 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 xprList*}.%destr
22a0: 75 63 74 6f 72 20 67 72 6f 75 70 62 79 5f 6f 70 uctor groupby_op
22b0: 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 73 t {sqliteExprLis
22c0: 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 67 72 tDelete($$);}.gr
22d0: 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 3a 3a 3d oupby_opt(A) ::=
22e0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
22f0: 20 20 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d {A = 0;}
2300: 0a 67 72 6f 75 70 62 79 5f 6f 70 74 28 41 29 20 .groupby_opt(A)
2310: 3a 3a 3d 20 47 52 4f 55 50 20 42 59 20 65 78 70 ::= GROUP BY exp
2320: 72 6c 69 73 74 28 58 29 2e 20 20 7b 41 20 3d 20 rlist(X). {A =
2330: 58 3b 7d 0a 0a 25 74 79 70 65 20 68 61 76 69 6e X;}..%type havin
2340: 67 5f 6f 70 74 20 7b 45 78 70 72 2a 7d 0a 25 64 g_opt {Expr*}.%d
2350: 65 73 74 72 75 63 74 6f 72 20 68 61 76 69 6e 67 estructor having
2360: 5f 6f 70 74 20 7b 73 71 6c 69 74 65 45 78 70 72 _opt {sqliteExpr
2370: 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 68 61 76 Delete($$);}.hav
2380: 69 6e 67 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 2e ing_opt(A) ::= .
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23a0: 7b 41 20 3d 20 30 3b 7d 0a 68 61 76 69 6e 67 5f {A = 0;}.having_
23b0: 6f 70 74 28 41 29 20 3a 3a 3d 20 48 41 56 49 4e opt(A) ::= HAVIN
23c0: 47 20 65 78 70 72 28 58 29 2e 20 20 7b 41 20 3d G expr(X). {A =
23d0: 20 58 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f X;}..//////////
23e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
23f0: 2f 20 54 68 65 20 44 45 4c 45 54 45 20 73 74 61 / The DELETE sta
2400: 74 65 6d 65 6e 74 20 2f 2f 2f 2f 2f 2f 2f 2f 2f tement /////////
2410: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2420: 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 ////.//.cmd ::=
2430: 44 45 4c 45 54 45 20 46 52 4f 4d 20 69 64 73 28 DELETE FROM ids(
2440: 58 29 20 77 68 65 72 65 5f 6f 70 74 28 59 29 2e X) where_opt(Y).
2450: 0a 20 20 20 20 7b 73 71 6c 69 74 65 44 65 6c 65 . {sqliteDele
2460: 74 65 46 72 6f 6d 28 70 50 61 72 73 65 2c 20 26 teFrom(pParse, &
2470: 58 2c 20 59 29 3b 7d 0a 0a 25 74 79 70 65 20 77 X, Y);}..%type w
2480: 68 65 72 65 5f 6f 70 74 20 7b 45 78 70 72 2a 7d here_opt {Expr*}
2490: 0a 25 64 65 73 74 72 75 63 74 6f 72 20 77 68 65 .%destructor whe
24a0: 72 65 5f 6f 70 74 20 7b 73 71 6c 69 74 65 45 78 re_opt {sqliteEx
24b0: 70 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a prDelete($$);}..
24c0: 77 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d where_opt(A) ::=
24d0: 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
24e0: 20 20 20 20 20 20 7b 41 20 3d 20 30 3b 7d 0a 77 {A = 0;}.w
24f0: 68 65 72 65 5f 6f 70 74 28 41 29 20 3a 3a 3d 20 here_opt(A) ::=
2500: 57 48 45 52 45 20 65 78 70 72 28 58 29 2e 20 20 WHERE expr(X).
2510: 20 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 25 {A = X;}..%
2520: 74 79 70 65 20 73 65 74 6c 69 73 74 20 7b 45 78 type setlist {Ex
2530: 70 72 4c 69 73 74 2a 7d 0a 25 64 65 73 74 72 75 prList*}.%destru
2540: 63 74 6f 72 20 73 65 74 6c 69 73 74 20 7b 73 71 ctor setlist {sq
2550: 6c 69 74 65 45 78 70 72 4c 69 73 74 44 65 6c 65 liteExprListDele
2560: 74 65 28 24 24 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f te($$);}..//////
2570: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2580: 2f 2f 2f 2f 20 54 68 65 20 55 50 44 41 54 45 20 //// The UPDATE
2590: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f command ////////
25a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
25b0: 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 ////////.//.cmd
25c0: 3a 3a 3d 20 55 50 44 41 54 45 20 69 64 73 28 58 ::= UPDATE ids(X
25d0: 29 20 53 45 54 20 73 65 74 6c 69 73 74 28 59 29 ) SET setlist(Y)
25e0: 20 77 68 65 72 65 5f 6f 70 74 28 5a 29 2e 0a 20 where_opt(Z)..
25f0: 20 20 20 7b 73 71 6c 69 74 65 55 70 64 61 74 65 {sqliteUpdate
2600: 28 70 50 61 72 73 65 2c 26 58 2c 59 2c 5a 29 3b (pParse,&X,Y,Z);
2610: 7d 0a 0a 73 65 74 6c 69 73 74 28 41 29 20 3a 3a }..setlist(A) ::
2620: 3d 20 73 65 74 6c 69 73 74 28 5a 29 20 43 4f 4d = setlist(Z) COM
2630: 4d 41 20 69 64 73 28 58 29 20 45 51 20 65 78 70 MA ids(X) EQ exp
2640: 72 28 59 29 2e 0a 20 20 20 20 7b 41 20 3d 20 73 r(Y).. {A = s
2650: 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 qliteExprListApp
2660: 65 6e 64 28 5a 2c 59 2c 26 58 29 3b 7d 0a 73 65 end(Z,Y,&X);}.se
2670: 74 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 73 tlist(A) ::= ids
2680: 28 58 29 20 45 51 20 65 78 70 72 28 59 29 2e 20 (X) EQ expr(Y).
2690: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 {A = sqliteExp
26a0: 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 59 2c rListAppend(0,Y,
26b0: 26 58 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f &X);}../////////
26c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
26d0: 2f 20 54 68 65 20 49 4e 53 45 52 54 20 63 6f 6d / The INSERT com
26e0: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f mand ///////////
26f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2700: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a //////.//.cmd ::
2710: 3d 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 69 64 = INSERT INTO id
2720: 73 28 58 29 20 69 6e 73 63 6f 6c 6c 69 73 74 5f s(X) inscollist_
2730: 6f 70 74 28 46 29 20 56 41 4c 55 45 53 20 4c 50 opt(F) VALUES LP
2740: 20 69 74 65 6d 6c 69 73 74 28 59 29 20 52 50 2e itemlist(Y) RP.
2750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2760: 7b 73 71 6c 69 74 65 49 6e 73 65 72 74 28 70 50 {sqliteInsert(pP
2770: 61 72 73 65 2c 20 26 58 2c 20 59 2c 20 30 2c 20 arse, &X, Y, 0,
2780: 46 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 49 4e 53 F);}.cmd ::= INS
2790: 45 52 54 20 49 4e 54 4f 20 69 64 73 28 58 29 20 ERT INTO ids(X)
27a0: 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 46 inscollist_opt(F
27b0: 29 20 73 65 6c 65 63 74 28 53 29 2e 0a 20 20 20 ) select(S)..
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 73 71 6c {sql
27d0: 69 74 65 49 6e 73 65 72 74 28 70 50 61 72 73 65 iteInsert(pParse
27e0: 2c 20 26 58 2c 20 30 2c 20 53 2c 20 46 29 3b 7d , &X, 0, S, F);}
27f0: 0a 0a 0a 25 74 79 70 65 20 69 74 65 6d 6c 69 73 ...%type itemlis
2800: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 t {ExprList*}.%d
2810: 65 73 74 72 75 63 74 6f 72 20 69 74 65 6d 6c 69 estructor itemli
2820: 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 st {sqliteExprLi
2830: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 stDelete($$);}.%
2840: 74 79 70 65 20 69 74 65 6d 20 7b 45 78 70 72 2a type item {Expr*
2850: 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 20 69 74 }.%destructor it
2860: 65 6d 20 7b 73 71 6c 69 74 65 45 78 70 72 44 65 em {sqliteExprDe
2870: 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69 74 65 6d lete($$);}..item
2880: 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 74 65 6d list(A) ::= item
2890: 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 20 69 74 list(X) COMMA it
28a0: 65 6d 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 6c em(Y). {A = sql
28b0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e iteExprListAppen
28c0: 64 28 58 2c 59 2c 30 29 3b 7d 0a 69 74 65 6d 6c d(X,Y,0);}.iteml
28d0: 69 73 74 28 41 29 20 3a 3a 3d 20 69 74 65 6d 28 ist(A) ::= item(
28e0: 58 29 2e 20 20 20 20 20 7b 41 20 3d 20 73 71 6c X). {A = sql
28f0: 69 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e iteExprListAppen
2900: 64 28 30 2c 58 2c 30 29 3b 7d 0a 69 74 65 6d 28 d(0,X,0);}.item(
2910: 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 28 58 A) ::= INTEGER(X
2920: 29 2e 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c ). {A = sql
2930: 69 74 65 45 78 70 72 28 54 4b 5f 49 4e 54 45 47 iteExpr(TK_INTEG
2940: 45 52 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a ER, 0, 0, &X);}.
2950: 69 74 65 6d 28 41 29 20 3a 3a 3d 20 50 4c 55 53 item(A) ::= PLUS
2960: 20 49 4e 54 45 47 45 52 28 58 29 2e 20 7b 41 20 INTEGER(X). {A
2970: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f = sqliteExpr(TK_
2980: 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 INTEGER, 0, 0, &
2990: 58 29 3b 7d 0a 69 74 65 6d 28 41 29 20 3a 3a 3d X);}.item(A) ::=
29a0: 20 4d 49 4e 55 53 20 49 4e 54 45 47 45 52 28 58 MINUS INTEGER(X
29b0: 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 74 ). {. A = sqlit
29c0: 65 45 78 70 72 28 54 4b 5f 55 4d 49 4e 55 53 2c eExpr(TK_UMINUS,
29d0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 0, 0, 0);. if(
29e0: 20 41 20 29 20 41 2d 3e 70 4c 65 66 74 20 3d 20 A ) A->pLeft =
29f0: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e sqliteExpr(TK_IN
2a00: 54 45 47 45 52 2c 20 30 2c 20 30 2c 20 26 58 29 TEGER, 0, 0, &X)
2a10: 3b 0a 7d 0a 69 74 65 6d 28 41 29 20 3a 3a 3d 20 ;.}.item(A) ::=
2a20: 46 4c 4f 41 54 28 58 29 2e 20 20 20 20 20 20 20 FLOAT(X).
2a30: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 {A = sqliteExpr
2a40: 28 54 4b 5f 46 4c 4f 41 54 2c 20 30 2c 20 30 2c (TK_FLOAT, 0, 0,
2a50: 20 26 58 29 3b 7d 0a 69 74 65 6d 28 41 29 20 3a &X);}.item(A) :
2a60: 3a 3d 20 50 4c 55 53 20 46 4c 4f 41 54 28 58 29 := PLUS FLOAT(X)
2a70: 2e 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 . {A = sqliteE
2a80: 78 70 72 28 54 4b 5f 46 4c 4f 41 54 2c 20 30 2c xpr(TK_FLOAT, 0,
2a90: 20 30 2c 20 26 58 29 3b 7d 0a 69 74 65 6d 28 41 0, &X);}.item(A
2aa0: 29 20 3a 3a 3d 20 4d 49 4e 55 53 20 46 4c 4f 41 ) ::= MINUS FLOA
2ab0: 54 28 58 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 T(X). {. A = s
2ac0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 55 4d 49 qliteExpr(TK_UMI
2ad0: 4e 55 53 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 NUS, 0, 0, 0);.
2ae0: 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 65 66 if( A ) A->pLef
2af0: 74 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 t = sqliteExpr(T
2b00: 4b 5f 46 4c 4f 41 54 2c 20 30 2c 20 30 2c 20 26 K_FLOAT, 0, 0, &
2b10: 58 29 3b 0a 7d 0a 69 74 65 6d 28 41 29 20 3a 3a X);.}.item(A) ::
2b20: 3d 20 53 54 52 49 4e 47 28 58 29 2e 20 20 20 20 = STRING(X).
2b30: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 {A = sqliteEx
2b40: 70 72 28 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c pr(TK_STRING, 0,
2b50: 20 30 2c 20 26 58 29 3b 7d 0a 69 74 65 6d 28 41 0, &X);}.item(A
2b60: 29 20 3a 3a 3d 20 4e 55 4c 4c 2e 20 20 20 20 20 ) ::= NULL.
2b70: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 {A = sqli
2b80: 74 65 45 78 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20 teExpr(TK_NULL,
2b90: 30 2c 20 30 2c 20 30 29 3b 7d 0a 0a 25 74 79 70 0, 0, 0);}..%typ
2ba0: 65 20 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 70 74 e inscollist_opt
2bb0: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 {IdList*}.%dest
2bc0: 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 ructor inscollis
2bd0: 74 5f 6f 70 74 20 7b 73 71 6c 69 74 65 49 64 4c t_opt {sqliteIdL
2be0: 69 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a istDelete($$);}.
2bf0: 25 74 79 70 65 20 69 6e 73 63 6f 6c 6c 69 73 74 %type inscollist
2c00: 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 74 {IdList*}.%dest
2c10: 72 75 63 74 6f 72 20 69 6e 73 63 6f 6c 6c 69 73 ructor inscollis
2c20: 74 20 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 t {sqliteIdListD
2c30: 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 69 6e 73 elete($$);}..ins
2c40: 63 6f 6c 6c 69 73 74 5f 6f 70 74 28 41 29 20 3a collist_opt(A) :
2c50: 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 20 20 20 := .
2c60: 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 {A =
2c70: 30 3b 7d 0a 69 6e 73 63 6f 6c 6c 69 73 74 5f 6f 0;}.inscollist_o
2c80: 70 74 28 41 29 20 3a 3a 3d 20 4c 50 20 69 6e 73 pt(A) ::= LP ins
2c90: 63 6f 6c 6c 69 73 74 28 58 29 20 52 50 2e 20 20 collist(X) RP.
2ca0: 20 20 7b 41 20 3d 20 58 3b 7d 0a 69 6e 73 63 6f {A = X;}.insco
2cb0: 6c 6c 69 73 74 28 41 29 20 3a 3a 3d 20 69 6e 73 llist(A) ::= ins
2cc0: 63 6f 6c 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 collist(X) COMMA
2cd0: 20 69 64 73 28 59 29 2e 20 7b 41 20 3d 20 73 71 ids(Y). {A = sq
2ce0: 6c 69 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 liteIdListAppend
2cf0: 28 58 2c 26 59 29 3b 7d 0a 69 6e 73 63 6f 6c 6c (X,&Y);}.inscoll
2d00: 69 73 74 28 41 29 20 3a 3a 3d 20 69 64 73 28 59 ist(A) ::= ids(Y
2d10: 29 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ).
2d20: 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 {A = sqli
2d30: 74 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 30 teIdListAppend(0
2d40: 2c 26 59 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f ,&Y);}..////////
2d50: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2d60: 2f 2f 2f 20 45 78 70 72 65 73 73 69 6f 6e 20 50 /// Expression P
2d70: 72 6f 63 65 73 73 69 6e 67 20 2f 2f 2f 2f 2f 2f rocessing //////
2d80: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
2d90: 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 25 6c 65 66 74 ///////.//.%left
2da0: 20 4f 52 2e 0a 25 6c 65 66 74 20 41 4e 44 2e 0a OR..%left AND..
2db0: 25 72 69 67 68 74 20 4e 4f 54 2e 0a 25 6c 65 66 %right NOT..%lef
2dc0: 74 20 45 51 20 4e 45 20 49 53 4e 55 4c 4c 20 4e t EQ NE ISNULL N
2dd0: 4f 54 4e 55 4c 4c 20 49 53 20 4c 49 4b 45 20 47 OTNULL IS LIKE G
2de0: 4c 4f 42 20 42 45 54 57 45 45 4e 20 49 4e 2e 0a LOB BETWEEN IN..
2df0: 25 6c 65 66 74 20 47 54 20 47 45 20 4c 54 20 4c %left GT GE LT L
2e00: 45 2e 0a 25 6c 65 66 74 20 42 49 54 41 4e 44 20 E..%left BITAND
2e10: 42 49 54 4f 52 20 4c 53 48 49 46 54 20 52 53 48 BITOR LSHIFT RSH
2e20: 49 46 54 2e 0a 25 6c 65 66 74 20 50 4c 55 53 20 IFT..%left PLUS
2e30: 4d 49 4e 55 53 2e 0a 25 6c 65 66 74 20 53 54 41 MINUS..%left STA
2e40: 52 20 53 4c 41 53 48 20 4d 4f 44 2e 0a 25 6c 65 R SLASH MOD..%le
2e50: 66 74 20 43 4f 4e 43 41 54 2e 0a 25 72 69 67 68 ft CONCAT..%righ
2e60: 74 20 55 4d 49 4e 55 53 20 42 49 54 4e 4f 54 2e t UMINUS BITNOT.
2e70: 0a 0a 25 74 79 70 65 20 65 78 70 72 20 7b 45 78 ..%type expr {Ex
2e80: 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f 72 pr*}.%destructor
2e90: 20 65 78 70 72 20 7b 73 71 6c 69 74 65 45 78 70 expr {sqliteExp
2ea0: 72 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 0a 65 rDelete($$);}..e
2eb0: 78 70 72 28 41 29 20 3a 3a 3d 20 4c 50 28 42 29 xpr(A) ::= LP(B)
2ec0: 20 65 78 70 72 28 58 29 20 52 50 28 45 29 2e 20 expr(X) RP(E).
2ed0: 7b 41 20 3d 20 58 3b 20 73 71 6c 69 74 65 45 78 {A = X; sqliteEx
2ee0: 70 72 53 70 61 6e 28 41 2c 26 42 2c 26 45 29 3b prSpan(A,&B,&E);
2ef0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4e 55 }.expr(A) ::= NU
2f00: 4c 4c 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 LL(X).
2f10: 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 {A = sqliteEx
2f20: 70 72 28 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 pr(TK_NULL, 0, 0
2f30: 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 20 , &X);}.expr(A)
2f40: 3a 3a 3d 20 69 64 28 58 29 2e 20 20 20 20 20 20 ::= id(X).
2f50: 20 20 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 {A = sq
2f60: 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 liteExpr(TK_ID,
2f70: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 0, 0, &X);}.expr
2f80: 28 41 29 20 3a 3a 3d 20 69 64 73 28 58 29 20 44 (A) ::= ids(X) D
2f90: 4f 54 20 69 64 73 28 59 29 2e 20 7b 0a 20 20 45 OT ids(Y). {. E
2fa0: 78 70 72 20 2a 74 65 6d 70 31 20 3d 20 73 71 6c xpr *temp1 = sql
2fb0: 69 74 65 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 iteExpr(TK_ID, 0
2fc0: 2c 20 30 2c 20 26 58 29 3b 0a 20 20 45 78 70 72 , 0, &X);. Expr
2fd0: 20 2a 74 65 6d 70 32 20 3d 20 73 71 6c 69 74 65 *temp2 = sqlite
2fe0: 45 78 70 72 28 54 4b 5f 49 44 2c 20 30 2c 20 30 Expr(TK_ID, 0, 0
2ff0: 2c 20 26 59 29 3b 0a 20 20 41 20 3d 20 73 71 6c , &Y);. A = sql
3000: 69 74 65 45 78 70 72 28 54 4b 5f 44 4f 54 2c 20 iteExpr(TK_DOT,
3010: 74 65 6d 70 31 2c 20 74 65 6d 70 32 2c 20 30 29 temp1, temp2, 0)
3020: 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 ;.}.expr(A) ::=
3030: 49 4e 54 45 47 45 52 28 58 29 2e 20 20 20 20 20 INTEGER(X).
3040: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 {A = sqliteExpr
3050: 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 (TK_INTEGER, 0,
3060: 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 28 41 29 0, &X);}.expr(A)
3070: 20 3a 3a 3d 20 46 4c 4f 41 54 28 58 29 2e 20 20 ::= FLOAT(X).
3080: 20 20 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 {A = sqlit
3090: 65 45 78 70 72 28 54 4b 5f 46 4c 4f 41 54 2c 20 eExpr(TK_FLOAT,
30a0: 30 2c 20 30 2c 20 26 58 29 3b 7d 0a 65 78 70 72 0, 0, &X);}.expr
30b0: 28 41 29 20 3a 3a 3d 20 53 54 52 49 4e 47 28 58 (A) ::= STRING(X
30c0: 29 2e 20 20 20 20 20 20 20 7b 41 20 3d 20 73 71 ). {A = sq
30d0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 53 54 52 49 liteExpr(TK_STRI
30e0: 4e 47 2c 20 30 2c 20 30 2c 20 26 58 29 3b 7d 0a NG, 0, 0, &X);}.
30f0: 65 78 70 72 28 41 29 20 3a 3a 3d 20 49 44 28 58 expr(A) ::= ID(X
3100: 29 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 29 ) LP exprlist(Y)
3110: 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 RP(E). {. A =
3120: 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 sqliteExprFuncti
3130: 6f 6e 28 59 2c 20 26 58 29 3b 0a 20 20 73 71 6c on(Y, &X);. sql
3140: 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 iteExprSpan(A,&X
3150: 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 ,&E);.}.expr(A)
3160: 3a 3a 3d 20 49 44 28 58 29 20 4c 50 20 53 54 41 ::= ID(X) LP STA
3170: 52 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 3d R RP(E). {. A =
3180: 20 73 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 sqliteExprFunct
3190: 69 6f 6e 28 30 2c 20 26 58 29 3b 0a 20 20 73 71 ion(0, &X);. sq
31a0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 liteExprSpan(A,&
31b0: 58 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 X,&E);.}.expr(A)
31c0: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 41 4e 44 ::= expr(X) AND
31d0: 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20 3d expr(Y). {A =
31e0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 41 sqliteExpr(TK_A
31f0: 4e 44 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 ND, X, Y, 0);}.e
3200: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 xpr(A) ::= expr(
3210: 58 29 20 4f 52 20 65 78 70 72 28 59 29 2e 20 20 X) OR expr(Y).
3220: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 {A = sqliteExp
3230: 72 28 54 4b 5f 4f 52 2c 20 58 2c 20 59 2c 20 30 r(TK_OR, X, Y, 0
3240: 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 );}.expr(A) ::=
3250: 65 78 70 72 28 58 29 20 4c 54 20 65 78 70 72 28 expr(X) LT expr(
3260: 59 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 Y). {A = sqli
3270: 74 65 45 78 70 72 28 54 4b 5f 4c 54 2c 20 58 2c teExpr(TK_LT, X,
3280: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 Y, 0);}.expr(A)
3290: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 47 54 20 ::= expr(X) GT
32a0: 65 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d expr(Y). {A =
32b0: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 47 sqliteExpr(TK_G
32c0: 54 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 T, X, Y, 0);}.ex
32d0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 pr(A) ::= expr(X
32e0: 29 20 4c 45 20 65 78 70 72 28 59 29 2e 20 20 20 ) LE expr(Y).
32f0: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 {A = sqliteExpr
3300: 28 54 4b 5f 4c 45 2c 20 58 2c 20 59 2c 20 30 29 (TK_LE, X, Y, 0)
3310: 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 ;}.expr(A) ::= e
3320: 78 70 72 28 58 29 20 47 45 20 65 78 70 72 28 59 xpr(X) GE expr(Y
3330: 29 2e 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 ). {A = sqlit
3340: 65 45 78 70 72 28 54 4b 5f 47 45 2c 20 58 2c 20 eExpr(TK_GE, X,
3350: 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 Y, 0);}.expr(A)
3360: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 45 20 65 ::= expr(X) NE e
3370: 78 70 72 28 59 29 2e 20 20 20 20 7b 41 20 3d 20 xpr(Y). {A =
3380: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 45 sqliteExpr(TK_NE
3390: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 , X, Y, 0);}.exp
33a0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 r(A) ::= expr(X)
33b0: 20 45 51 20 65 78 70 72 28 59 29 2e 20 20 20 20 EQ expr(Y).
33c0: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 {A = sqliteExpr(
33d0: 54 4b 5f 45 51 2c 20 58 2c 20 59 2c 20 30 29 3b TK_EQ, X, Y, 0);
33e0: 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 }.expr(A) ::= ex
33f0: 70 72 28 58 29 20 42 49 54 41 4e 44 20 65 78 70 pr(X) BITAND exp
3400: 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 r(Y). {A = sqlit
3410: 65 45 78 70 72 28 54 4b 5f 42 49 54 41 4e 44 2c eExpr(TK_BITAND,
3420: 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 X, Y, 0);}.expr
3430: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 (A) ::= expr(X)
3440: 42 49 54 4f 52 20 65 78 70 72 28 59 29 2e 20 20 BITOR expr(Y).
3450: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 {A = sqliteExpr(
3460: 54 4b 5f 42 49 54 4f 52 2c 20 58 2c 20 59 2c 20 TK_BITOR, X, Y,
3470: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 0);}.expr(A) ::=
3480: 20 65 78 70 72 28 58 29 20 4c 53 48 49 46 54 20 expr(X) LSHIFT
3490: 65 78 70 72 28 59 29 2e 20 7b 41 20 3d 20 73 71 expr(Y). {A = sq
34a0: 6c 69 74 65 45 78 70 72 28 54 4b 5f 4c 53 48 49 liteExpr(TK_LSHI
34b0: 46 54 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 FT, X, Y, 0);}.e
34c0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 xpr(A) ::= expr(
34d0: 58 29 20 52 53 48 49 46 54 20 65 78 70 72 28 59 X) RSHIFT expr(Y
34e0: 29 2e 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 ). {A = sqliteEx
34f0: 70 72 28 54 4b 5f 52 53 48 49 46 54 2c 20 58 2c pr(TK_RSHIFT, X,
3500: 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 Y, 0);}.expr(A)
3510: 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4c 49 4b ::= expr(X) LIK
3520: 45 20 65 78 70 72 28 59 29 2e 20 20 20 7b 41 20 E expr(Y). {A
3530: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f = sqliteExpr(TK_
3540: 4c 49 4b 45 2c 20 58 2c 20 59 2c 20 30 29 3b 7d LIKE, X, Y, 0);}
3550: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 .expr(A) ::= exp
3560: 72 28 58 29 20 4e 4f 54 20 4c 49 4b 45 20 65 78 r(X) NOT LIKE ex
3570: 70 72 28 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 pr(Y). {. A =
3580: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4c 49 sqliteExpr(TK_LI
3590: 4b 45 2c 20 58 2c 20 59 2c 20 30 29 3b 0a 20 20 KE, X, Y, 0);.
35a0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 A = sqliteExpr(T
35b0: 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b K_NOT, A, 0, 0);
35c0: 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 . sqliteExprSpa
35d0: 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 59 2d n(A,&X->span,&Y-
35e0: 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 >span);.}.expr(A
35f0: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 47 4c ) ::= expr(X) GL
3600: 4f 42 20 65 78 70 72 28 59 29 2e 20 20 7b 41 20 OB expr(Y). {A
3610: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f = sqliteExpr(TK_
3620: 47 4c 4f 42 2c 58 2c 59 2c 30 29 3b 7d 0a 65 78 GLOB,X,Y,0);}.ex
3630: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 pr(A) ::= expr(X
3640: 29 20 4e 4f 54 20 47 4c 4f 42 20 65 78 70 72 28 ) NOT GLOB expr(
3650: 59 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 71 6c Y). {. A = sql
3660: 69 74 65 45 78 70 72 28 54 4b 5f 47 4c 4f 42 2c iteExpr(TK_GLOB,
3670: 20 58 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 3d X, Y, 0);. A =
3680: 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e sqliteExpr(TK_N
3690: 4f 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 OT, A, 0, 0);.
36a0: 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 sqliteExprSpan(A
36b0: 2c 26 58 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 70 ,&X->span,&Y->sp
36c0: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a an);.}.expr(A) :
36d0: 3a 3d 20 65 78 70 72 28 58 29 20 50 4c 55 53 20 := expr(X) PLUS
36e0: 65 78 70 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 expr(Y). {A = s
36f0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 50 4c 55 qliteExpr(TK_PLU
3700: 53 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 S, X, Y, 0);}.ex
3710: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 pr(A) ::= expr(X
3720: 29 20 4d 49 4e 55 53 20 65 78 70 72 28 59 29 2e ) MINUS expr(Y).
3730: 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 {A = sqliteExpr
3740: 28 54 4b 5f 4d 49 4e 55 53 2c 20 58 2c 20 59 2c (TK_MINUS, X, Y,
3750: 20 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 0);}.expr(A) ::
3760: 3d 20 65 78 70 72 28 58 29 20 53 54 41 52 20 65 = expr(X) STAR e
3770: 78 70 72 28 59 29 2e 20 20 7b 41 20 3d 20 73 71 xpr(Y). {A = sq
3780: 6c 69 74 65 45 78 70 72 28 54 4b 5f 53 54 41 52 liteExpr(TK_STAR
3790: 2c 20 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 , X, Y, 0);}.exp
37a0: 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 r(A) ::= expr(X)
37b0: 20 53 4c 41 53 48 20 65 78 70 72 28 59 29 2e 20 SLASH expr(Y).
37c0: 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 {A = sqliteExpr(
37d0: 54 4b 5f 53 4c 41 53 48 2c 20 58 2c 20 59 2c 20 TK_SLASH, X, Y,
37e0: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 0);}.expr(A) ::=
37f0: 20 65 78 70 72 28 58 29 20 4d 4f 44 20 65 78 70 expr(X) MOD exp
3800: 72 28 59 29 2e 20 20 20 7b 41 20 3d 20 73 71 6c r(Y). {A = sql
3810: 69 74 65 45 78 70 72 28 54 4b 5f 4d 4f 44 2c 20 iteExpr(TK_MOD,
3820: 58 2c 20 59 2c 20 30 29 3b 7d 0a 65 78 70 72 28 X, Y, 0);}.expr(
3830: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 43 A) ::= expr(X) C
3840: 4f 4e 43 41 54 20 65 78 70 72 28 59 29 2e 20 7b ONCAT expr(Y). {
3850: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 A = sqliteExpr(T
3860: 4b 5f 43 4f 4e 43 41 54 2c 20 58 2c 20 59 2c 20 K_CONCAT, X, Y,
3870: 30 29 3b 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 0);}.expr(A) ::=
3880: 20 65 78 70 72 28 58 29 20 49 53 4e 55 4c 4c 28 expr(X) ISNULL(
3890: 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 6c 69 E). {. A = sqli
38a0: 74 65 45 78 70 72 28 54 4b 5f 49 53 4e 55 4c 4c teExpr(TK_ISNULL
38b0: 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 , X, 0, 0);. sq
38c0: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 liteExprSpan(A,&
38d0: 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 X->span,&E);.}.e
38e0: 78 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 xpr(A) ::= expr(
38f0: 58 29 20 49 53 20 4e 55 4c 4c 28 45 29 2e 20 7b X) IS NULL(E). {
3900: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 . A = sqliteExp
3910: 72 28 54 4b 5f 49 53 4e 55 4c 4c 2c 20 58 2c 20 r(TK_ISNULL, X,
3920: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 0, 0);. sqliteE
3930: 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 xprSpan(A,&X->sp
3940: 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 an,&E);.}.expr(A
3950: 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f ) ::= expr(X) NO
3960: 54 4e 55 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 TNULL(E). {. A
3970: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f = sqliteExpr(TK_
3980: 4e 4f 54 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 NOTNULL, X, 0, 0
3990: 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 53 );. sqliteExprS
39a0: 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 pan(A,&X->span,&
39b0: 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a E);.}.expr(A) ::
39c0: 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20 4e 55 = expr(X) NOT NU
39d0: 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 LL(E). {. A = s
39e0: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 qliteExpr(TK_NOT
39f0: 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a NULL, X, 0, 0);.
3a00: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e sqliteExprSpan
3a10: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b (A,&X->span,&E);
3a20: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 65 .}.expr(A) ::= e
3a30: 78 70 72 28 58 29 20 49 53 20 4e 4f 54 20 4e 55 xpr(X) IS NOT NU
3a40: 4c 4c 28 45 29 2e 20 7b 0a 20 20 41 20 3d 20 73 LL(E). {. A = s
3a50: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 qliteExpr(TK_NOT
3a60: 4e 55 4c 4c 2c 20 58 2c 20 30 2c 20 30 29 3b 0a NULL, X, 0, 0);.
3a70: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e sqliteExprSpan
3a80: 28 41 2c 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b (A,&X->span,&E);
3a90: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4e .}.expr(A) ::= N
3aa0: 4f 54 28 42 29 20 65 78 70 72 28 58 29 2e 20 7b OT(B) expr(X). {
3ab0: 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 . A = sqliteExp
3ac0: 72 28 54 4b 5f 4e 4f 54 2c 20 58 2c 20 30 2c 20 r(TK_NOT, X, 0,
3ad0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 0);. sqliteExpr
3ae0: 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 Span(A,&B,&X->sp
3af0: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a an);.}.expr(A) :
3b00: 3a 3d 20 42 49 54 4e 4f 54 28 42 29 20 65 78 70 := BITNOT(B) exp
3b10: 72 28 58 29 2e 20 7b 0a 20 20 41 20 3d 20 73 71 r(X). {. A = sq
3b20: 6c 69 74 65 45 78 70 72 28 54 4b 5f 42 49 54 4e liteExpr(TK_BITN
3b30: 4f 54 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 OT, X, 0, 0);.
3b40: 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 sqliteExprSpan(A
3b50: 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b 0a 7d ,&B,&X->span);.}
3b60: 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 4d 49 4e .expr(A) ::= MIN
3b70: 55 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 5b US(B) expr(X). [
3b80: 55 4d 49 4e 55 53 5d 20 7b 0a 20 20 41 20 3d 20 UMINUS] {. A =
3b90: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 55 4d sqliteExpr(TK_UM
3ba0: 49 4e 55 53 2c 20 58 2c 20 30 2c 20 30 29 3b 0a INUS, X, 0, 0);.
3bb0: 20 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e sqliteExprSpan
3bc0: 28 41 2c 26 42 2c 26 58 2d 3e 73 70 61 6e 29 3b (A,&B,&X->span);
3bd0: 0a 7d 0a 65 78 70 72 28 41 29 20 3a 3a 3d 20 50 .}.expr(A) ::= P
3be0: 4c 55 53 28 42 29 20 65 78 70 72 28 58 29 2e 20 LUS(B) expr(X).
3bf0: 5b 55 4d 49 4e 55 53 5d 20 7b 0a 20 20 41 20 3d [UMINUS] {. A =
3c00: 20 58 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 72 X;. sqliteExpr
3c10: 53 70 61 6e 28 41 2c 26 42 2c 26 58 2d 3e 73 70 Span(A,&B,&X->sp
3c20: 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 3a an);.}.expr(A) :
3c30: 3a 3d 20 4c 50 28 42 29 20 73 65 6c 65 63 74 28 := LP(B) select(
3c40: 58 29 20 52 50 28 45 29 2e 20 7b 0a 20 20 41 20 X) RP(E). {. A
3c50: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f = sqliteExpr(TK_
3c60: 53 45 4c 45 43 54 2c 20 30 2c 20 30 2c 20 30 29 SELECT, 0, 0, 0)
3c70: 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 ;. if( A ) A->p
3c80: 53 65 6c 65 63 74 20 3d 20 58 3b 0a 20 20 73 71 Select = X;. sq
3c90: 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c 26 liteExprSpan(A,&
3ca0: 42 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 B,&E);.}.expr(A)
3cb0: 20 3a 3a 3d 20 65 78 70 72 28 57 29 20 42 45 54 ::= expr(W) BET
3cc0: 57 45 45 4e 20 65 78 70 72 28 58 29 20 41 4e 44 WEEN expr(X) AND
3cd0: 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 20 45 78 expr(Y). {. Ex
3ce0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 prList *pList =
3cf0: 73 71 6c 69 74 65 45 78 70 72 4c 69 73 74 41 70 sqliteExprListAp
3d00: 70 65 6e 64 28 30 2c 20 58 2c 20 30 29 3b 0a 20 pend(0, X, 0);.
3d10: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 45 pList = sqliteE
3d20: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c xprListAppend(pL
3d30: 69 73 74 2c 20 59 2c 20 30 29 3b 0a 20 20 41 20 ist, Y, 0);. A
3d40: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f = sqliteExpr(TK_
3d50: 42 45 54 57 45 45 4e 2c 20 57 2c 20 30 2c 20 30 BETWEEN, W, 0, 0
3d60: 29 3b 0a 20 20 69 66 28 20 41 20 29 20 41 2d 3e );. if( A ) A->
3d70: 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 pList = pList;.
3d80: 20 73 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 sqliteExprSpan(
3d90: 41 2c 26 57 2d 3e 73 70 61 6e 2c 26 59 2d 3e 73 A,&W->span,&Y->s
3da0: 70 61 6e 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 pan);.}.expr(A)
3db0: 3a 3a 3d 20 65 78 70 72 28 57 29 20 4e 4f 54 20 ::= expr(W) NOT
3dc0: 42 45 54 57 45 45 4e 20 65 78 70 72 28 58 29 20 BETWEEN expr(X)
3dd0: 41 4e 44 20 65 78 70 72 28 59 29 2e 20 7b 0a 20 AND expr(Y). {.
3de0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 ExprList *pList
3df0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 4c 69 73 = sqliteExprLis
3e00: 74 41 70 70 65 6e 64 28 30 2c 20 58 2c 20 30 29 tAppend(0, X, 0)
3e10: 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 ;. pList = sqli
3e20: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 teExprListAppend
3e30: 28 70 4c 69 73 74 2c 20 59 2c 20 30 29 3b 0a 20 (pList, Y, 0);.
3e40: 20 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 A = sqliteExpr(
3e50: 54 4b 5f 42 45 54 57 45 45 4e 2c 20 57 2c 20 30 TK_BETWEEN, W, 0
3e60: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 20 29 20 , 0);. if( A )
3e70: 41 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 A->pList = pList
3e80: 3b 0a 20 20 41 20 3d 20 73 71 6c 69 74 65 45 78 ;. A = sqliteEx
3e90: 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 2c 20 30 2c pr(TK_NOT, A, 0,
3ea0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 0);. sqliteExp
3eb0: 72 53 70 61 6e 28 41 2c 26 57 2d 3e 73 70 61 6e rSpan(A,&W->span
3ec0: 2c 26 59 2d 3e 73 70 61 6e 29 3b 0a 7d 0a 65 78 ,&Y->span);.}.ex
3ed0: 70 72 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 pr(A) ::= expr(X
3ee0: 29 20 49 4e 20 4c 50 20 65 78 70 72 6c 69 73 74 ) IN LP exprlist
3ef0: 28 59 29 20 52 50 28 45 29 2e 20 20 7b 0a 20 20 (Y) RP(E). {.
3f00: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 A = sqliteExpr(T
3f10: 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a K_IN, X, 0, 0);.
3f20: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 if( A ) A->pLi
3f30: 73 74 20 3d 20 59 3b 0a 20 20 73 71 6c 69 74 65 st = Y;. sqlite
3f40: 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 ExprSpan(A,&X->s
3f50: 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 pan,&E);.}.expr(
3f60: 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 49 A) ::= expr(X) I
3f70: 4e 20 4c 50 20 73 65 6c 65 63 74 28 59 29 20 52 N LP select(Y) R
3f80: 50 28 45 29 2e 20 20 7b 0a 20 20 41 20 3d 20 73 P(E). {. A = s
3f90: 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 49 4e 2c qliteExpr(TK_IN,
3fa0: 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 X, 0, 0);. if(
3fb0: 20 41 20 29 20 41 2d 3e 70 53 65 6c 65 63 74 20 A ) A->pSelect
3fc0: 3d 20 59 3b 0a 20 20 73 71 6c 69 74 65 45 78 70 = Y;. sqliteExp
3fd0: 72 53 70 61 6e 28 41 2c 26 58 2d 3e 73 70 61 6e rSpan(A,&X->span
3fe0: 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 28 41 29 20 ,&E);.}.expr(A)
3ff0: 3a 3a 3d 20 65 78 70 72 28 58 29 20 4e 4f 54 20 ::= expr(X) NOT
4000: 49 4e 20 4c 50 20 65 78 70 72 6c 69 73 74 28 59 IN LP exprlist(Y
4010: 29 20 52 50 28 45 29 2e 20 20 7b 0a 20 20 41 20 ) RP(E). {. A
4020: 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f = sqliteExpr(TK_
4030: 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a 20 20 IN, X, 0, 0);.
4040: 69 66 28 20 41 20 29 20 41 2d 3e 70 4c 69 73 74 if( A ) A->pList
4050: 20 3d 20 59 3b 0a 20 20 41 20 3d 20 73 71 6c 69 = Y;. A = sqli
4060: 74 65 45 78 70 72 28 54 4b 5f 4e 4f 54 2c 20 41 teExpr(TK_NOT, A
4070: 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 , 0, 0);. sqlit
4080: 65 45 78 70 72 53 70 61 6e 28 41 2c 26 58 2d 3e eExprSpan(A,&X->
4090: 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a 65 78 70 72 span,&E);.}.expr
40a0: 28 41 29 20 3a 3a 3d 20 65 78 70 72 28 58 29 20 (A) ::= expr(X)
40b0: 4e 4f 54 20 49 4e 20 4c 50 20 73 65 6c 65 63 74 NOT IN LP select
40c0: 28 59 29 20 52 50 28 45 29 2e 20 20 7b 0a 20 20 (Y) RP(E). {.
40d0: 41 20 3d 20 73 71 6c 69 74 65 45 78 70 72 28 54 A = sqliteExpr(T
40e0: 4b 5f 49 4e 2c 20 58 2c 20 30 2c 20 30 29 3b 0a K_IN, X, 0, 0);.
40f0: 20 20 69 66 28 20 41 20 29 20 41 2d 3e 70 53 65 if( A ) A->pSe
4100: 6c 65 63 74 20 3d 20 59 3b 0a 20 20 41 20 3d 20 lect = Y;. A =
4110: 73 71 6c 69 74 65 45 78 70 72 28 54 4b 5f 4e 4f sqliteExpr(TK_NO
4120: 54 2c 20 41 2c 20 30 2c 20 30 29 3b 0a 20 20 73 T, A, 0, 0);. s
4130: 71 6c 69 74 65 45 78 70 72 53 70 61 6e 28 41 2c qliteExprSpan(A,
4140: 26 58 2d 3e 73 70 61 6e 2c 26 45 29 3b 0a 7d 0a &X->span,&E);.}.
4150: 0a 0a 0a 25 74 79 70 65 20 65 78 70 72 6c 69 73 ...%type exprlis
4160: 74 20 7b 45 78 70 72 4c 69 73 74 2a 7d 0a 25 64 t {ExprList*}.%d
4170: 65 73 74 72 75 63 74 6f 72 20 65 78 70 72 6c 69 estructor exprli
4180: 73 74 20 7b 73 71 6c 69 74 65 45 78 70 72 4c 69 st {sqliteExprLi
4190: 73 74 44 65 6c 65 74 65 28 24 24 29 3b 7d 0a 25 stDelete($$);}.%
41a0: 74 79 70 65 20 65 78 70 72 69 74 65 6d 20 7b 45 type expritem {E
41b0: 78 70 72 2a 7d 0a 25 64 65 73 74 72 75 63 74 6f xpr*}.%destructo
41c0: 72 20 65 78 70 72 69 74 65 6d 20 7b 73 71 6c 69 r expritem {sqli
41d0: 74 65 45 78 70 72 44 65 6c 65 74 65 28 24 24 29 teExprDelete($$)
41e0: 3b 7d 0a 0a 65 78 70 72 6c 69 73 74 28 41 29 20 ;}..exprlist(A)
41f0: 3a 3a 3d 20 65 78 70 72 6c 69 73 74 28 58 29 20 ::= exprlist(X)
4200: 43 4f 4d 4d 41 20 65 78 70 72 69 74 65 6d 28 59 COMMA expritem(Y
4210: 29 2e 20 0a 20 20 20 7b 41 20 3d 20 73 71 6c 69 ). . {A = sqli
4220: 74 65 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 teExprListAppend
4230: 28 58 2c 59 2c 30 29 3b 7d 0a 65 78 70 72 6c 69 (X,Y,0);}.exprli
4240: 73 74 28 41 29 20 3a 3a 3d 20 65 78 70 72 69 74 st(A) ::= exprit
4250: 65 6d 28 58 29 2e 20 20 20 20 20 20 20 20 20 20 em(X).
4260: 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 45 78 70 {A = sqliteExp
4270: 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 58 2c rListAppend(0,X,
4280: 30 29 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41 29 0);}.expritem(A)
4290: 20 3a 3a 3d 20 65 78 70 72 28 58 29 2e 20 20 20 ::= expr(X).
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 20 {A
42b0: 3d 20 58 3b 7d 0a 65 78 70 72 69 74 65 6d 28 41 = X;}.expritem(A
42c0: 29 20 3a 3a 3d 20 2e 20 20 20 20 20 20 20 20 20 ) ::= .
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b 41 {A
42e0: 20 3d 20 30 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f = 0;}..////////
42f0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
4300: 2f 2f 2f 2f 2f 20 54 68 65 20 43 52 45 41 54 45 ///// The CREATE
4310: 20 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 20 2f INDEX command /
4320: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
4330: 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a //////.//.cmd ::
4340: 3d 20 43 52 45 41 54 45 28 53 29 20 75 6e 69 71 = CREATE(S) uniq
4350: 75 65 66 6c 61 67 28 55 29 20 49 4e 44 45 58 20 ueflag(U) INDEX
4360: 69 64 73 28 58 29 20 4f 4e 20 69 64 73 28 59 29 ids(X) ON ids(Y)
4370: 20 4c 50 20 69 64 78 6c 69 73 74 28 5a 29 20 52 LP idxlist(Z) R
4380: 50 28 45 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74 P(E).. {sqlit
4390: 65 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61 eCreateIndex(pPa
43a0: 72 73 65 2c 20 26 58 2c 20 26 59 2c 20 5a 2c 20 rse, &X, &Y, Z,
43b0: 55 2c 20 26 53 2c 20 26 45 29 3b 7d 0a 0a 25 74 U, &S, &E);}..%t
43c0: 79 70 65 20 75 6e 69 71 75 65 66 6c 61 67 20 7b ype uniqueflag {
43d0: 69 6e 74 7d 0a 75 6e 69 71 75 65 66 6c 61 67 28 int}.uniqueflag(
43e0: 41 29 20 3a 3a 3d 20 55 4e 49 51 55 45 2e 20 20 A) ::= UNIQUE.
43f0: 20 7b 20 41 20 3d 20 31 3b 20 7d 0a 75 6e 69 71 { A = 1; }.uniq
4400: 75 65 66 6c 61 67 28 41 29 20 3a 3a 3d 20 2e 20 ueflag(A) ::= .
4410: 20 20 20 20 20 20 20 20 7b 20 41 20 3d 20 30 3b { A = 0;
4420: 20 7d 0a 0a 25 74 79 70 65 20 69 64 78 6c 69 73 }..%type idxlis
4430: 74 20 7b 49 64 4c 69 73 74 2a 7d 0a 25 64 65 73 t {IdList*}.%des
4440: 74 72 75 63 74 6f 72 20 69 64 78 6c 69 73 74 20 tructor idxlist
4450: 7b 73 71 6c 69 74 65 49 64 4c 69 73 74 44 65 6c {sqliteIdListDel
4460: 65 74 65 28 24 24 29 3b 7d 0a 25 74 79 70 65 20 ete($$);}.%type
4470: 69 64 78 69 74 65 6d 20 7b 54 6f 6b 65 6e 7d 0a idxitem {Token}.
4480: 0a 69 64 78 6c 69 73 74 28 41 29 20 3a 3a 3d 20 .idxlist(A) ::=
4490: 69 64 78 6c 69 73 74 28 58 29 20 43 4f 4d 4d 41 idxlist(X) COMMA
44a0: 20 69 64 78 69 74 65 6d 28 59 29 2e 20 20 0a 20 idxitem(Y). .
44b0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 49 {A = sqliteI
44c0: 64 4c 69 73 74 41 70 70 65 6e 64 28 58 2c 26 59 dListAppend(X,&Y
44d0: 29 3b 7d 0a 69 64 78 6c 69 73 74 28 41 29 20 3a );}.idxlist(A) :
44e0: 3a 3d 20 69 64 78 69 74 65 6d 28 59 29 2e 0a 20 := idxitem(Y)..
44f0: 20 20 20 20 7b 41 20 3d 20 73 71 6c 69 74 65 49 {A = sqliteI
4500: 64 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 26 59 dListAppend(0,&Y
4510: 29 3b 7d 0a 69 64 78 69 74 65 6d 28 41 29 20 3a );}.idxitem(A) :
4520: 3a 3d 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 := ids(X).
4530: 20 20 20 20 7b 41 20 3d 20 58 3b 7d 0a 0a 2f 2f {A = X;}..//
4540: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
4550: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 /////////// The
4560: 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 6f 6d CREATE INDEX com
4570: 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f mand ///////////
4580: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a ////////////.//.
4590: 0a 63 6d 64 20 3a 3a 3d 20 44 52 4f 50 20 49 4e .cmd ::= DROP IN
45a0: 44 45 58 20 69 64 73 28 58 29 2e 20 20 20 20 20 DEX ids(X).
45b0: 20 7b 73 71 6c 69 74 65 44 72 6f 70 49 6e 64 65 {sqliteDropInde
45c0: 78 28 70 50 61 72 73 65 2c 20 26 58 29 3b 7d 0a x(pParse, &X);}.
45d0: 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ..//////////////
45e0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 ///////////////
45f0: 54 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 63 The DROP INDEX c
4600: 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f 2f ommand /////////
4610: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
4620: 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d 20 43 4f 50 59 .//.cmd ::= COPY
4630: 20 69 64 73 28 58 29 20 46 52 4f 4d 20 69 64 73 ids(X) FROM ids
4640: 28 59 29 20 55 53 49 4e 47 20 44 45 4c 49 4d 49 (Y) USING DELIMI
4650: 54 45 52 53 20 53 54 52 49 4e 47 28 5a 29 2e 0a TERS STRING(Z)..
4660: 20 20 20 20 7b 73 71 6c 69 74 65 43 6f 70 79 28 {sqliteCopy(
4670: 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 26 5a 29 pParse,&X,&Y,&Z)
4680: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 43 4f 50 59 20 ;}.cmd ::= COPY
4690: 69 64 73 28 58 29 20 46 52 4f 4d 20 69 64 73 28 ids(X) FROM ids(
46a0: 59 29 2e 0a 20 20 20 20 7b 73 71 6c 69 74 65 43 Y).. {sqliteC
46b0: 6f 70 79 28 70 50 61 72 73 65 2c 26 58 2c 26 59 opy(pParse,&X,&Y
46c0: 2c 30 29 3b 7d 0a 0a 2f 2f 2f 2f 2f 2f 2f 2f 2f ,0);}../////////
46d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
46e0: 2f 2f 2f 2f 20 54 68 65 20 56 41 43 55 55 4d 20 //// The VACUUM
46f0: 63 6f 6d 6d 61 6e 64 20 2f 2f 2f 2f 2f 2f 2f 2f command ////////
4700: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
4710: 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 6d 64 20 3a 3a 3d /////.//.cmd ::=
4720: 20 56 41 43 55 55 4d 2e 20 20 20 20 20 20 20 20 VACUUM.
4730: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 56 {sqliteV
4740: 61 63 75 75 6d 28 70 50 61 72 73 65 2c 30 29 3b acuum(pParse,0);
4750: 7d 0a 63 6d 64 20 3a 3a 3d 20 56 41 43 55 55 4d }.cmd ::= VACUUM
4760: 20 69 64 73 28 58 29 2e 20 20 20 20 20 20 20 20 ids(X).
4770: 20 7b 73 71 6c 69 74 65 56 61 63 75 75 6d 28 70 {sqliteVacuum(p
4780: 50 61 72 73 65 2c 26 58 29 3b 7d 0a 0a 2f 2f 2f Parse,&X);}..///
4790: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
47a0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 20 54 68 65 20 50 ////////// The P
47b0: 52 41 47 4d 41 20 63 6f 6d 6d 61 6e 64 20 2f 2f RAGMA command //
47c0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f ////////////////
47d0: 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 2f 0a 2f 2f 0a 63 ///////////.//.c
47e0: 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 69 64 md ::= PRAGMA id
47f0: 73 28 58 29 20 45 51 20 69 64 73 28 59 29 2e 20 s(X) EQ ids(Y).
4800: 20 20 20 20 20 20 20 20 7b 73 71 6c 69 74 65 50 {sqliteP
4810: 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 58 2c ragma(pParse,&X,
4820: 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 &Y,0);}.cmd ::=
4830: 50 52 41 47 4d 41 20 69 64 73 28 58 29 20 45 51 PRAGMA ids(X) EQ
4840: 20 4f 4e 28 59 29 2e 20 20 20 20 20 20 20 20 20 ON(Y).
4850: 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61 28 70 {sqlitePragma(p
4860: 50 61 72 73 65 2c 26 58 2c 26 59 2c 30 29 3b 7d Parse,&X,&Y,0);}
4870: 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d 41 20 .cmd ::= PRAGMA
4880: 69 64 73 28 58 29 20 45 51 20 70 6c 75 73 5f 6e ids(X) EQ plus_n
4890: 75 6d 28 59 29 2e 20 20 20 20 7b 73 71 6c 69 74 um(Y). {sqlit
48a0: 65 50 72 61 67 6d 61 28 70 50 61 72 73 65 2c 26 ePragma(pParse,&
48b0: 58 2c 26 59 2c 30 29 3b 7d 0a 63 6d 64 20 3a 3a X,&Y,0);}.cmd ::
48c0: 3d 20 50 52 41 47 4d 41 20 69 64 73 28 58 29 20 = PRAGMA ids(X)
48d0: 45 51 20 6d 69 6e 75 73 5f 6e 75 6d 28 59 29 2e EQ minus_num(Y).
48e0: 20 20 20 7b 73 71 6c 69 74 65 50 72 61 67 6d 61 {sqlitePragma
48f0: 28 70 50 61 72 73 65 2c 26 58 2c 26 59 2c 31 29 (pParse,&X,&Y,1)
4900: 3b 7d 0a 63 6d 64 20 3a 3a 3d 20 50 52 41 47 4d ;}.cmd ::= PRAGM
4910: 41 20 69 64 73 28 58 29 20 4c 50 20 69 64 73 28 A ids(X) LP ids(
4920: 59 29 20 52 50 2e 20 20 20 20 20 20 7b 73 71 6c Y) RP. {sql
4930: 69 74 65 50 72 61 67 6d 61 28 70 50 61 72 73 65 itePragma(pParse
4940: 2c 26 58 2c 26 59 2c 30 29 3b 7d 0a 70 6c 75 73 ,&X,&Y,0);}.plus
4950: 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 70 6c 75 73 _num(A) ::= plus
4960: 5f 6f 70 74 20 6e 75 6d 62 65 72 28 58 29 2e 20 _opt number(X).
4970: 20 20 7b 41 20 3d 20 58 3b 7d 0a 6d 69 6e 75 73 {A = X;}.minus
4980: 5f 6e 75 6d 28 41 29 20 3a 3a 3d 20 4d 49 4e 55 _num(A) ::= MINU
4990: 53 20 6e 75 6d 62 65 72 28 58 29 2e 20 20 20 20 S number(X).
49a0: 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 6d 62 65 72 {A = X;}.number
49b0: 28 41 29 20 3a 3a 3d 20 49 4e 54 45 47 45 52 28 (A) ::= INTEGER(
49c0: 58 29 2e 20 20 7b 41 20 3d 20 58 3b 7d 0a 6e 75 X). {A = X;}.nu
49d0: 6d 62 65 72 28 41 29 20 3a 3a 3d 20 46 4c 4f 41 mber(A) ::= FLOA
49e0: 54 28 58 29 2e 20 20 20 20 7b 41 20 3d 20 58 3b T(X). {A = X;
49f0: 7d 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a 3d 20 50 }.plus_opt ::= P
4a00: 4c 55 53 2e 0a 70 6c 75 73 5f 6f 70 74 20 3a 3a LUS..plus_opt ::
4a10: 3d 20 2e 0a = ..