0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73 /*.** 2008 Augus
0010: 74 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 t 18.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 uthor disclaims
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 s source code.
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 g:.**.** May
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 you do good and
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 not evil..**
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 e others..**
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 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 0a 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 72 6f 75 ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 77 tines used for w
01a0: 61 6c 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65 alking the parse
01b0: 72 20 74 72 65 65 20 61 6e 64 0a 2a 2a 20 72 65 r tree and.** re
01c0: 73 6f 6c 76 65 20 61 6c 6c 20 69 64 65 6e 74 69 solve all identi
01d0: 66 69 65 72 73 20 62 79 20 61 73 73 6f 63 69 61 fiers by associa
01e0: 74 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 61 ting them with a
01f0: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 74 particular.** t
0200: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e able and column.
0210: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 .*/.#include "sq
0220: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a liteInt.h"../*.*
0230: 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65 * Walk the expre
0240: 73 73 69 6f 6e 20 74 72 65 65 20 70 45 78 70 72 ssion tree pExpr
0250: 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20 74 68 and increase th
0260: 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 e aggregate func
0270: 74 69 6f 6e 0a 2a 2a 20 64 65 70 74 68 20 28 74 tion.** depth (t
0280: 68 65 20 45 78 70 72 2e 6f 70 32 20 66 69 65 6c he Expr.op2 fiel
0290: 64 29 20 62 79 20 4e 20 6f 6e 20 65 76 65 72 79 d) by N on every
02a0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e TK_AGG_FUNCTION
02b0: 20 6e 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 6e node..** This n
02c0: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 20 77 68 eeds to occur wh
02d0: 65 6e 20 63 6f 70 79 69 6e 67 20 61 20 54 4b 5f en copying a TK_
02e0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 AGG_FUNCTION nod
02f0: 65 20 66 72 6f 6d 20 61 6e 0a 2a 2a 20 6f 75 74 e from an.** out
0300: 65 72 20 71 75 65 72 79 20 69 6e 74 6f 20 61 6e er query into an
0310: 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 2e inner subquery.
0320: 0a 2a 2a 0a 2a 2a 20 69 6e 63 72 41 67 67 46 75 .**.** incrAggFu
0330: 6e 63 74 69 6f 6e 44 65 70 74 68 28 70 45 78 70 nctionDepth(pExp
0340: 72 2c 6e 29 20 69 73 20 74 68 65 20 6d 61 69 6e r,n) is the main
0350: 20 72 6f 75 74 69 6e 65 2e 20 20 69 6e 63 72 41 routine. incrA
0360: 67 67 44 65 70 74 68 28 2e 2e 29 0a 2a 2a 20 69 ggDepth(..).** i
0370: 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63 74 s a helper funct
0380: 69 6f 6e 20 2d 20 61 20 63 61 6c 6c 62 61 63 6b ion - a callback
0390: 20 66 6f 72 20 74 68 65 20 74 72 65 65 20 77 61 for the tree wa
03a0: 6c 6b 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 lker..*/.static
03b0: 69 6e 74 20 69 6e 63 72 41 67 67 44 65 70 74 68 int incrAggDepth
03c0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 (Walker *pWalker
03d0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a , Expr *pExpr){.
03e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d if( pExpr->op=
03f0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e =TK_AGG_FUNCTION
0400: 20 29 20 70 45 78 70 72 2d 3e 6f 70 32 20 2b 3d ) pExpr->op2 +=
0410: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 6e 3b 0a 20 pWalker->u.n;.
0420: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 return WRC_Cont
0430: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76 inue;.}.static v
0440: 6f 69 64 20 69 6e 63 72 41 67 67 46 75 6e 63 74 oid incrAggFunct
0450: 69 6f 6e 44 65 70 74 68 28 45 78 70 72 20 2a 70 ionDepth(Expr *p
0460: 45 78 70 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 Expr, int N){.
0470: 69 66 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 57 if( N>0 ){. W
0480: 61 6c 6b 65 72 20 77 3b 0a 20 20 20 20 6d 65 6d alker w;. mem
0490: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f set(&w, 0, sizeo
04a0: 66 28 77 29 29 3b 0a 20 20 20 20 77 2e 78 45 78 f(w));. w.xEx
04b0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6e 63 prCallback = inc
04c0: 72 41 67 67 44 65 70 74 68 3b 0a 20 20 20 20 77 rAggDepth;. w
04d0: 2e 75 2e 6e 20 3d 20 4e 3b 0a 20 20 20 20 73 71 .u.n = N;. sq
04e0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 lite3WalkExpr(&w
04f0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a , pExpr);. }.}.
0500: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 68 65 20 ./*.** Turn the
0510: 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e pExpr expression
0520: 20 69 6e 74 6f 20 61 6e 20 61 6c 69 61 73 20 66 into an alias f
0530: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 or the iCol-th c
0540: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 olumn of the.**
0550: 72 65 73 75 6c 74 20 73 65 74 20 69 6e 20 70 45 result set in pE
0560: 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 List..**.** If t
0570: 68 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 he reference is
0580: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 4f followed by a CO
0590: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20 LLATE operator,
05a0: 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 2a then make sure.*
05b0: 2a 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 * the COLLATE op
05c0: 65 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 72 erator is preser
05d0: 76 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c ved. For exampl
05e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c e:.**.** SEL
05f0: 45 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f ECT a+b, c+d FRO
0600: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 M t1 ORDER BY 1
0610: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a COLLATE nocase;.
0620: 2a 2a 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20 **.** Should be
0630: 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f transformed into
0640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 :.**.** SELE
0650: 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d CT a+b, c+d FROM
0660: 20 74 31 20 4f 52 44 45 52 20 42 59 20 28 61 2b t1 ORDER BY (a+
0670: 62 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 b) COLLATE nocas
0680: 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 53 75 e;.**.** The nSu
0690: 62 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 bquery parameter
06a0: 20 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d specifies how m
06b0: 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 any levels of su
06c0: 62 71 75 65 72 79 20 74 68 65 0a 2a 2a 20 61 6c bquery the.** al
06d0: 69 61 73 20 69 73 20 72 65 6d 6f 76 65 64 20 66 ias is removed f
06e0: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c rom the original
06f0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 expression. Th
0700: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 69 73 e usual value is
0710: 0a 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74 20 .** zero but it
0720: 6d 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69 66 might be more if
0730: 20 74 68 65 20 61 6c 69 61 73 20 69 73 20 63 6f the alias is co
0740: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 ntained within a
0750: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66 20 subquery.** of
0760: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 the original exp
0770: 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45 78 ression. The Ex
0780: 70 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66 20 pr.op2 field of
0790: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 0a TK_AGG_FUNCTION.
07a0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d 75 ** structures mu
07b0: 73 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 st be increased
07c0: 62 79 20 74 68 65 20 6e 53 75 62 71 75 65 72 79 by the nSubquery
07d0: 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61 74 amount..*/.stat
07e0: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 41 ic void resolveA
07f0: 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a 70 lias(. Parse *p
0800: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f Parse, /
0810: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 * Parsing contex
0820: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 t */. ExprList
0830: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a *pEList, /*
0840: 20 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f A result set */
0850: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 . int iCol,
0860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 /* A c
0870: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 olumn in the res
0880: 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45 4c ult set. 0..pEL
0890: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f 0a ist->nExpr-1 */.
08a0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 Expr *pExpr,
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e /* Tran
08c0: 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f 20 sform this into
08d0: 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 an alias to the
08e0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 result set */.
08f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 const char *zTyp
0900: 65 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55 50 e, /* "GROUP
0910: 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72 20 " or "ORDER" or
0920: 22 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 "" */. int nSub
0930: 71 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f query /
0940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 71 * Number of subq
0950: 75 65 72 69 65 73 20 74 68 61 74 20 74 68 65 20 ueries that the
0960: 6c 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67 20 label is moving
0970: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4f */.){. Expr *pO
0980: 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f rig; /
0990: 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f * The iCol-th co
09a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 lumn of the resu
09b0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 lt set */. Expr
09c0: 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 *pDup;
09d0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 4f /* Copy of pO
09e0: 72 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 rig */. sqlite3
09f0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 *db;
0a00: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 /* The database
0a10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 connection */..
0a20: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 assert( iCol>=0
0a30: 20 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74 2d && iCol<pEList-
0a40: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72 69 >nExpr );. pOri
0a50: 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 g = pEList->a[iC
0a60: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 ol].pExpr;. ass
0a70: 65 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29 3b ert( pOrig!=0 );
0a80: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e . db = pParse->
0a90: 64 62 3b 0a 20 20 70 44 75 70 20 3d 20 73 71 6c db;. pDup = sql
0aa0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 ite3ExprDup(db,
0ab0: 70 4f 72 69 67 2c 20 30 29 3b 0a 20 20 69 66 28 pOrig, 0);. if(
0ac0: 20 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75 72 pDup==0 ) retur
0ad0: 6e 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 5b 30 n;. if( zType[0
0ae0: 5d 21 3d 27 47 27 20 29 20 69 6e 63 72 41 67 67 ]!='G' ) incrAgg
0af0: 46 75 6e 63 74 69 6f 6e 44 65 70 74 68 28 70 44 FunctionDepth(pD
0b00: 75 70 2c 20 6e 53 75 62 71 75 65 72 79 29 3b 0a up, nSubquery);.
0b10: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d if( pExpr->op=
0b20: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 =TK_COLLATE ){.
0b30: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 pDup = sqlite
0b40: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 3ExprAddCollateS
0b50: 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 44 tring(pParse, pD
0b60: 75 70 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f up, pExpr->u.zTo
0b70: 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 45 78 70 72 ken);. }. Expr
0b80: 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 75 70 SetProperty(pDup
0b90: 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a 0a 20 20 , EP_Alias);..
0ba0: 2f 2a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e /* Before callin
0bb0: 67 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c g sqlite3ExprDel
0bc0: 65 74 65 28 29 2c 20 73 65 74 20 74 68 65 20 45 ete(), set the E
0bd0: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 2e 20 54 P_Static flag. T
0be0: 68 69 73 20 0a 20 20 2a 2a 20 70 72 65 76 65 6e his . ** preven
0bf0: 74 73 20 45 78 70 72 44 65 6c 65 74 65 28 29 20 ts ExprDelete()
0c00: 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67 20 74 68 from deleting th
0c10: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65 e Expr structure
0c20: 20 69 74 73 65 6c 66 2c 0a 20 20 2a 2a 20 61 6c itself,. ** al
0c30: 6c 6f 77 69 6e 67 20 69 74 20 74 6f 20 62 65 20 lowing it to be
0c40: 72 65 70 6f 70 75 6c 61 74 65 64 20 62 79 20 74 repopulated by t
0c50: 68 65 20 6d 65 6d 63 70 79 28 29 20 6f 6e 20 74 he memcpy() on t
0c60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e he following lin
0c70: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 70 45 78 70 e.. ** The pExp
0c80: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 6d 69 67 68 r->u.zToken migh
0c90: 74 20 70 6f 69 6e 74 20 69 6e 74 6f 20 6d 65 6d t point into mem
0ca0: 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 ory that will be
0cb0: 20 66 72 65 65 64 20 62 79 20 74 68 65 0a 20 20 freed by the.
0cc0: 2a 2a 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 ** sqlite3DbFree
0cd0: 28 64 62 2c 20 70 44 75 70 29 20 6f 6e 20 74 68 (db, pDup) on th
0ce0: 65 20 6c 61 73 74 20 6c 69 6e 65 20 6f 66 20 74 e last line of t
0cf0: 68 69 73 20 62 6c 6f 63 6b 2c 20 73 6f 20 62 65 his block, so be
0d00: 20 73 75 72 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 sure to. ** ma
0d10: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 ke a copy of the
0d20: 20 74 6f 6b 65 6e 20 62 65 66 6f 72 65 20 64 6f token before do
0d30: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 44 ing the sqlite3D
0d40: 62 46 72 65 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 bFree().. */.
0d50: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 ExprSetProperty(
0d60: 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 pExpr, EP_Static
0d70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 );. sqlite3Expr
0d80: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 Delete(db, pExpr
0d90: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 45 78 70 );. memcpy(pExp
0da0: 72 2c 20 70 44 75 70 2c 20 73 69 7a 65 6f 66 28 r, pDup, sizeof(
0db0: 2a 70 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20 *pExpr));. if(
0dc0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 !ExprHasProperty
0dd0: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 (pExpr, EP_IntVa
0de0: 6c 75 65 29 20 26 26 20 70 45 78 70 72 2d 3e 75 lue) && pExpr->u
0df0: 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 7b 0a 20 20 .zToken!=0 ){.
0e00: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 assert( (pExpr
0e10: 2d 3e 66 6c 61 67 73 20 26 20 28 45 50 5f 52 65 ->flags & (EP_Re
0e20: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e duced|EP_TokenOn
0e30: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 ly))==0 );. p
0e40: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d Expr->u.zToken =
0e50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 sqlite3DbStrDup
0e60: 28 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 (db, pExpr->u.zT
0e70: 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 45 78 70 72 oken);. pExpr
0e80: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 4d 65 ->flags |= EP_Me
0e90: 6d 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 73 71 mToken;. }. sq
0ea0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
0eb0: 70 44 75 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a pDup);.}.../*.**
0ec0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 Return TRUE if
0ed0: 74 68 65 20 6e 61 6d 65 20 7a 43 6f 6c 20 6f 63 the name zCol oc
0ee0: 63 75 72 73 20 61 6e 79 77 68 65 72 65 20 69 6e curs anywhere in
0ef0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 the USING claus
0f00: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 e..**.** Return
0f10: 46 41 4c 53 45 20 69 66 20 74 68 65 20 55 53 49 FALSE if the USI
0f20: 4e 47 20 63 6c 61 75 73 65 20 69 73 20 4e 55 4c NG clause is NUL
0f30: 4c 20 6f 72 20 69 66 20 69 74 20 64 6f 65 73 20 L or if it does
0f40: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 7a not contain.** z
0f50: 43 6f 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 Col..*/.static i
0f60: 6e 74 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c nt nameInUsingCl
0f70: 61 75 73 65 28 49 64 4c 69 73 74 20 2a 70 55 73 ause(IdList *pUs
0f80: 69 6e 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ing, const char
0f90: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 66 28 20 70 55 *zCol){. if( pU
0fa0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 sing ){. int
0fb0: 6b 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 k;. for(k=0;
0fc0: 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b k<pUsing->nId; k
0fd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 ++){. if( s
0fe0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55 qlite3StrICmp(pU
0ff0: 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 sing->a[k].zName
1000: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 , zCol)==0 ) ret
1010: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d urn 1;. }. }
1020: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a . return 0;.}..
1030: 2f 2a 0a 2a 2a 20 53 75 62 71 75 65 72 69 65 73 /*.** Subqueries
1040: 20 73 74 6f 72 65 73 20 74 68 65 20 6f 72 69 67 stores the orig
1050: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c 20 74 inal database, t
1060: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 able and column
1070: 6e 61 6d 65 73 20 66 6f 72 20 74 68 65 69 72 0a names for their.
1080: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 73 20 69 ** result sets i
1090: 6e 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a n ExprList.a[].z
10a0: 53 70 61 6e 2c 20 69 6e 20 74 68 65 20 66 6f 72 Span, in the for
10b0: 6d 20 22 44 41 54 41 42 41 53 45 2e 54 41 42 4c m "DATABASE.TABL
10c0: 45 2e 43 4f 4c 55 4d 4e 22 2e 0a 2a 2a 20 43 68 E.COLUMN"..** Ch
10d0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 eck to see if th
10e0: 65 20 7a 53 70 61 6e 20 67 69 76 65 6e 20 74 6f e zSpan given to
10f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 this routine ma
1100: 74 63 68 65 73 20 74 68 65 20 7a 44 62 2c 20 7a tches the zDb, z
1110: 54 61 62 2c 0a 2a 2a 20 61 6e 64 20 7a 43 6f 6c Tab,.** and zCol
1120: 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 7a 44 62 . If any of zDb
1130: 2c 20 7a 54 61 62 2c 20 61 6e 64 20 7a 43 6f 6c , zTab, and zCol
1140: 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 are NULL then t
1150: 68 6f 73 65 20 66 69 65 6c 64 73 20 77 69 6c 6c hose fields will
1160: 0a 2a 2a 20 6d 61 74 63 68 20 61 6e 79 74 68 69 .** match anythi
1170: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 ng..*/.int sqlit
1180: 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 e3MatchSpanName(
1190: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
11a0: 53 70 61 6e 2c 0a 20 20 63 6f 6e 73 74 20 63 68 Span,. const ch
11b0: 61 72 20 2a 7a 43 6f 6c 2c 0a 20 20 63 6f 6e 73 ar *zCol,. cons
11c0: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a 20 20 t char *zTab,.
11d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 0a const char *zDb.
11e0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f ){. int n;. fo
11f0: 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53 r(n=0; ALWAYS(zS
1200: 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e pan[n]) && zSpan
1210: 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d [n]!='.'; n++){}
1220: 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 28 73 . if( zDb && (s
1230: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a qlite3StrNICmp(z
1240: 53 70 61 6e 2c 20 7a 44 62 2c 20 6e 29 21 3d 30 Span, zDb, n)!=0
1250: 20 7c 7c 20 7a 44 62 5b 6e 5d 21 3d 30 29 20 29 || zDb[n]!=0) )
1260: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
1270: 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b 3d 20 6e }. zSpan += n
1280: 2b 31 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41 +1;. for(n=0; A
1290: 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20 LWAYS(zSpan[n])
12a0: 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27 && zSpan[n]!='.'
12b0: 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a ; n++){}. if( z
12c0: 54 61 62 20 26 26 20 28 73 71 6c 69 74 65 33 53 Tab && (sqlite3S
12d0: 74 72 4e 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a trNICmp(zSpan, z
12e0: 54 61 62 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 54 Tab, n)!=0 || zT
12f0: 61 62 5b 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 ab[n]!=0) ){.
1300: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 return 0;. }.
1310: 20 7a 53 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 zSpan += n+1;.
1320: 20 69 66 28 20 7a 43 6f 6c 20 26 26 20 73 71 6c if( zCol && sql
1330: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 53 70 61 ite3StrICmp(zSpa
1340: 6e 2c 20 7a 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 n, zCol)!=0 ){.
1350: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
1360: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a . return 1;.}..
1370: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 /*.** Given the
1380: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e name of a column
1390: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 of the form X.Y
13a0: 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 .Z or Y.Z or jus
13b0: 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 t Z, look up.**
13c0: 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 that name in the
13d0: 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 set of source t
13e0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 ables in pSrcLis
13f0: 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 t and make the p
1400: 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 Expr .** express
1410: 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 ion node refer b
1420: 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 ack to that sour
1430: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 ce column. The
1440: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 following change
1450: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f s.** are made to
1460: 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 pExpr:.**.**
1470: 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 pExpr->iDb
1480: 20 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e Set the in
1490: 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d dex in db->aDb[]
14a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 of the database
14b0: 20 58 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 X.**
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65 (e
14d0: 76 65 6e 20 69 66 20 58 20 69 73 20 69 6d 70 6c ven if X is impl
14e0: 69 65 64 29 2e 0a 2a 2a 20 20 20 20 70 45 78 70 ied)..** pExp
14f0: 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 r->iTable
1500: 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 Set to the curs
1510: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 or number for th
1520: 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 e table obtained
1530: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
1540: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d from
1550: 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 pSrcList..**
1560: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 20 20 20 pExpr->pTab
1570: 20 20 20 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 Points to
1580: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 the Table struct
1590: 75 72 65 20 6f 66 20 58 2e 59 20 28 65 76 65 6e ure of X.Y (even
15a0: 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 if.**
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58 X
15c0: 20 61 6e 64 2f 6f 72 20 59 20 61 72 65 20 69 6d and/or Y are im
15d0: 70 6c 69 65 64 2e 29 0a 2a 2a 20 20 20 20 70 45 plied.).** pE
15e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 xpr->iColumn
15f0: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f Set to the co
1600: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 lumn number with
1610: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a in the table..**
1620: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 pExpr->op
1630: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 Set to
1640: 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 TK_COLUMN..**
1650: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 pExpr->pLeft
1660: 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 Any expres
1670: 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 sion this points
1680: 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a to is deleted.*
1690: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 * pExpr->pRig
16a0: 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 ht Any ex
16b0: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f pression this po
16c0: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 ints to is delet
16d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 44 ed..**.** The zD
16e0: 62 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 b variable is th
16f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 e name of the da
1700: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29 tabase (the "X")
1710: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 . This value ma
1720: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 y be.** NULL mea
1730: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 ning that name i
1740: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e s of the form Y.
1750: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 Z or Z. Any ava
1760: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a ilable database.
1770: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 ** can be used.
1780: 20 54 68 65 20 7a 54 61 62 6c 65 20 76 61 72 69 The zTable vari
1790: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 able is the name
17a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 of the table (t
17b0: 68 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a he "Y"). This.*
17c0: 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e * value can be N
17d0: 55 4c 4c 20 69 66 20 7a 44 62 20 69 73 20 61 6c ULL if zDb is al
17e0: 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 7a 54 61 so NULL. If zTa
17f0: 62 6c 65 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a ble is NULL it.*
1800: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 * means that the
1810: 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d form of the nam
1820: 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20 e is Z and that
1830: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 columns from any
1840: 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 table.** can be
1850: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 used..**.** If
1860: 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 the name cannot
1870: 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d be resolved unam
1880: 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 biguously, leave
1890: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 an error messag
18a0: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 e.** in pParse a
18b0: 6e 64 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 nd return WRC_Ab
18c0: 6f 72 74 2e 20 20 52 65 74 75 72 6e 20 57 52 43 ort. Return WRC
18d0: 5f 50 72 75 6e 65 20 6f 6e 20 73 75 63 63 65 73 _Prune on succes
18e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 s..*/.static int
18f0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 lookupName(. P
1900: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 arse *pParse,
1910: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 /* The parsi
1920: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 ng context */.
1930: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c const char *zDb,
1940: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 /* Name of
1950: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e the database con
1960: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f taining table, o
1970: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 r NULL */. cons
1980: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 20 20 t char *zTab,
1990: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c /* Name of tabl
19a0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c e containing col
19b0: 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a umn, or NULL */.
19c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 const char *zC
19d0: 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f ol, /* Name o
19e0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f f the column. */
19f0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a . NameContext *
1a00: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e pNC, /* The n
1a10: 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 ame context used
1a20: 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 to resolve the
1a30: 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a name */. Expr *
1a40: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f pExpr /
1a50: 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 * Make this EXPR
1a60: 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 node point to t
1a70: 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 he selected colu
1a80: 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 mn */.){. int i
1a90: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 , j;
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1ab0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f Loop counters */
1ac0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 . int cnt = 0;
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ae0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
1af0: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d f matching colum
1b00: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 n names */. int
1b10: 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20 cntTab = 0;
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 * Number of matc
1b40: 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 hing table names
1b50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 71 75 */. int nSubqu
1b60: 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 ery = 0;
1b70: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d /* How m
1b80: 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 any levels of su
1b90: 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 bquery */. sqli
1ba0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 te3 *db = pParse
1bb0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 2f 2a ->db; /*
1bc0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f The database co
1bd0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 nnection */. st
1be0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 ruct SrcList_ite
1bf0: 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 m *pItem;
1c00: 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 /* Use for loopi
1c10: 6e 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 ng over pSrcList
1c20: 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 items */. stru
1c30: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 ct SrcList_item
1c40: 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a *pMatch = 0; /*
1c50: 20 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 The matching pS
1c60: 72 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 rcList item */.
1c70: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 NameContext *pT
1c80: 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 opNC = pNC;
1c90: 20 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 /* First name
1ca0: 63 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c context in the l
1cb0: 69 73 74 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20 ist */. Schema
1cc0: 2a 70 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 *pSchema = 0;
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 /* Sc
1ce0: 68 65 6d 61 20 6f 66 20 74 68 65 20 65 78 70 72 hema of the expr
1cf0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 ession */. int
1d00: 69 73 54 72 69 67 67 65 72 20 3d 20 30 3b 20 20 isTrigger = 0;
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1d20: 20 54 72 75 65 20 69 66 20 72 65 73 6f 6c 76 65 True if resolve
1d30: 64 20 74 6f 20 61 20 74 72 69 67 67 65 72 20 63 d to a trigger c
1d40: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 54 61 62 6c 65 olumn */. Table
1d50: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20 *pTab = 0;
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1d70: 54 61 62 6c 65 20 68 6f 6c 64 20 74 68 65 20 72 Table hold the r
1d80: 6f 77 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a ow */. Column *
1d90: 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 pCol;
1da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 /* A c
1db0: 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62 20 2a 2f olumn of pTab */
1dc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 20 .. assert( pNC
1dd0: 29 3b 20 20 20 20 20 2f 2a 20 74 68 65 20 6e 61 ); /* the na
1de0: 6d 65 20 63 6f 6e 74 65 78 74 20 63 61 6e 6e 6f me context canno
1df0: 74 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 t be NULL. */.
1e00: 61 73 73 65 72 74 28 20 7a 43 6f 6c 20 29 3b 20 assert( zCol );
1e10: 20 20 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 /* The Z in X
1e20: 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e .Y.Z cannot be N
1e30: 55 4c 4c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 ULL */. assert(
1e40: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 !ExprHasPropert
1e50: 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 y(pExpr, EP_Toke
1e60: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 nOnly|EP_Reduced
1e70: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 ) );.. /* Initi
1e80: 61 6c 69 7a 65 20 74 68 65 20 6e 6f 64 65 20 74 alize the node t
1e90: 6f 20 6e 6f 2d 6d 61 74 63 68 20 2a 2f 0a 20 20 o no-match */.
1ea0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 pExpr->iTable =
1eb0: 2d 31 3b 0a 20 20 70 45 78 70 72 2d 3e 70 54 61 -1;. pExpr->pTa
1ec0: 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 53 65 74 b = 0;. ExprSet
1ed0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70 VVAProperty(pExp
1ee0: 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b r, EP_NoReduce);
1ef0: 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 .. /* Translate
1f00: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 the schema name
1f10: 20 69 6e 20 7a 44 62 20 69 6e 74 6f 20 61 20 70 in zDb into a p
1f20: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f ointer to the co
1f30: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 20 20 2a 2a rresponding. **
1f40: 20 73 63 68 65 6d 61 2e 20 20 49 66 20 6e 6f 74 schema. If not
1f50: 20 66 6f 75 6e 64 2c 20 70 53 63 68 65 6d 61 20 found, pSchema
1f60: 77 69 6c 6c 20 72 65 6d 61 69 6e 20 4e 55 4c 4c will remain NULL
1f70: 20 61 6e 64 20 6e 6f 74 68 69 6e 67 20 77 69 6c and nothing wil
1f80: 6c 20 6d 61 74 63 68 0a 20 20 2a 2a 20 72 65 73 l match. ** res
1f90: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 70 70 ulting in an app
1fa0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d ropriate error m
1fb0: 65 73 73 61 67 65 20 74 6f 77 61 72 64 20 74 68 essage toward th
1fc0: 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 72 6f e end of this ro
1fd0: 75 74 69 6e 65 0a 20 20 2a 2f 0a 20 20 69 66 28 utine. */. if(
1fe0: 20 7a 44 62 20 29 7b 0a 20 20 20 20 74 65 73 74 zDb ){. test
1ff0: 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 case( pNC->ncFla
2000: 67 73 20 26 20 4e 43 5f 50 61 72 74 49 64 78 20 gs & NC_PartIdx
2010: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 );. testcase(
2020: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 pNC->ncFlags &
2030: 4e 43 5f 49 73 43 68 65 63 6b 20 29 3b 0a 20 20 NC_IsCheck );.
2040: 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c if( (pNC->ncFl
2050: 61 67 73 20 26 20 28 4e 43 5f 50 61 72 74 49 64 ags & (NC_PartId
2060: 78 7c 4e 43 5f 49 73 43 68 65 63 6b 29 29 21 3d x|NC_IsCheck))!=
2070: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 0 ){. /* Si
2080: 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20 64 61 lently ignore da
2090: 74 61 62 61 73 65 20 71 75 61 6c 69 66 69 65 72 tabase qualifier
20a0: 73 20 69 6e 73 69 64 65 20 43 48 45 43 4b 20 63 s inside CHECK c
20b0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 0a 20 onstraints and.
20c0: 20 20 20 20 20 2a 2a 20 70 61 72 74 69 61 6c 20 ** partial
20d0: 69 6e 64 69 63 65 73 2e 20 20 44 6f 20 6e 6f 74 indices. Do not
20e0: 20 72 61 69 73 65 20 65 72 72 6f 72 73 20 62 65 raise errors be
20f0: 63 61 75 73 65 20 74 68 61 74 20 6d 69 67 68 74 cause that might
2100: 20 62 72 65 61 6b 0a 20 20 20 20 20 20 2a 2a 20 break. **
2110: 6c 65 67 61 63 79 20 61 6e 64 20 62 65 63 61 75 legacy and becau
2120: 73 65 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 se it does not h
2130: 75 72 74 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 urt anything to
2140: 6a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 65 0a just ignore the.
2150: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 ** databas
2160: 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 e name. */.
2170: 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 7d 65 zDb = 0;. }e
2180: 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 lse{. for(i
2190: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 =0; i<db->nDb; i
21a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 ++){. ass
21b0: 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e ert( db->aDb[i].
21c0: 7a 44 62 53 4e 61 6d 65 20 29 3b 0a 20 20 20 20 zDbSName );.
21d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 if( sqlite3S
21e0: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69 trICmp(db->aDb[i
21f0: 5d 2e 7a 44 62 53 4e 61 6d 65 2c 7a 44 62 29 3d ].zDbSName,zDb)=
2200: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
2210: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 pSchema = db->aD
2220: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 b[i].pSchema;.
2230: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
2240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
2250: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a . }. }.. /*
2260: 20 53 74 61 72 74 20 61 74 20 74 68 65 20 69 6e Start at the in
2270: 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e 74 65 78 74 ner-most context
2280: 20 61 6e 64 20 6d 6f 76 65 20 6f 75 74 77 61 72 and move outwar
2290: 64 20 75 6e 74 69 6c 20 61 20 6d 61 74 63 68 20 d until a match
22a0: 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 61 73 is found */. as
22b0: 73 65 72 74 28 20 70 4e 43 20 26 26 20 63 6e 74 sert( pNC && cnt
22c0: 3d 3d 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 ==0 );. do{.
22d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 ExprList *pELis
22e0: 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a t;. SrcList *
22f0: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e pSrcList = pNC->
2300: 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 pSrcList;.. i
2310: 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 f( pSrcList ){.
2320: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 for(i=0, pI
2330: 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b tem=pSrcList->a;
2340: 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 i<pSrcList->nSr
2350: 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 c; i++, pItem++)
2360: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d {. pTab =
2370: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 pItem->pTab;.
2380: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 assert( pT
2390: 61 62 21 3d 30 20 26 26 20 70 54 61 62 2d 3e 7a ab!=0 && pTab->z
23a0: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 Name!=0 );.
23b0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d assert( pTab-
23c0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 >nCol>0 );.
23d0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 if( pItem->pS
23e0: 65 6c 65 63 74 20 26 26 20 28 70 49 74 65 6d 2d elect && (pItem-
23f0: 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 >pSelect->selFla
2400: 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72 gs & SF_NestedFr
2410: 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 om)!=0 ){.
2420: 20 20 20 20 69 6e 74 20 68 69 74 20 3d 20 30 3b int hit = 0;
2430: 0a 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 . pELis
2440: 74 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 t = pItem->pSele
2450: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 ct->pEList;.
2460: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a for(j=0; j
2470: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 <pEList->nExpr;
2480: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 j++){.
2490: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 74 if( sqlite3Mat
24a0: 63 68 53 70 61 6e 4e 61 6d 65 28 70 45 4c 69 73 chSpanName(pELis
24b0: 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 7a t->a[j].zSpan, z
24c0: 43 6f 6c 2c 20 7a 54 61 62 2c 20 7a 44 62 29 20 Col, zTab, zDb)
24d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ){.
24e0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 cnt++;.
24f0: 20 20 20 20 20 20 63 6e 74 54 61 62 20 3d 20 32 cntTab = 2
2500: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
2510: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a pMatch = pItem;.
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 pE
2530: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a xpr->iColumn = j
2540: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
2550: 68 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 hit = 1;.
2560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
2570: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 }. if(
2580: 20 68 69 74 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 hit || zTab==0
2590: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 ) continue;.
25a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 }. if
25b0: 28 20 7a 44 62 20 26 26 20 70 54 61 62 2d 3e 70 ( zDb && pTab->p
25c0: 53 63 68 65 6d 61 21 3d 70 53 63 68 65 6d 61 20 Schema!=pSchema
25d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e ){. con
25e0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d tinue;. }
25f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 . if( zTa
2600: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 b ){. c
2610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e onst char *zTabN
2620: 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c ame = pItem->zAl
2630: 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c ias ? pItem->zAl
2640: 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d ias : pTab->zNam
2650: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 e;. ass
2660: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 21 3d 30 ert( zTabName!=0
2670: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 );. if
2680: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 ( sqlite3StrICmp
2690: 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 (zTabName, zTab)
26a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 !=0 ){.
26b0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 continue;.
26c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
26d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 }. if( 0
26e0: 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a ==(cntTab++) ){.
26f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 pMatch
2700: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 = pItem;.
2710: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 }. for(
2720: 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e j=0, pCol=pTab->
2730: 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 aCol; j<pTab->nC
2740: 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 ol; j++, pCol++)
2750: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 {. if(
2760: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 sqlite3StrICmp(p
2770: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c Col->zName, zCol
2780: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )==0 ){.
2790: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 /* If there
27a0: 68 61 73 20 62 65 65 6e 20 65 78 61 63 74 6c 79 has been exactly
27b0: 20 6f 6e 65 20 70 72 69 6f 72 20 6d 61 74 63 68 one prior match
27c0: 20 61 6e 64 20 74 68 69 73 20 6d 61 74 63 68 0a and this match.
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 ** i
27e0: 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d s for the right-
27f0: 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 61 20 hand table of a
2800: 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 6f 72 20 NATURAL JOIN or
2810: 69 73 20 69 6e 20 61 20 0a 20 20 20 20 20 20 20 is in a .
2820: 20 20 20 20 20 2a 2a 20 55 53 49 4e 47 20 63 6c ** USING cl
2830: 61 75 73 65 2c 20 74 68 65 6e 20 73 6b 69 70 20 ause, then skip
2840: 74 68 69 73 20 6d 61 74 63 68 2e 0a 20 20 20 20 this match..
2850: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 */.
2860: 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d if( cnt==
2870: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 1 ){.
2880: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 if( pItem->fg
2890: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e .jointype & JT_N
28a0: 41 54 55 52 41 4c 20 29 20 63 6f 6e 74 69 6e 75 ATURAL ) continu
28b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 e;.
28c0: 20 69 66 28 20 6e 61 6d 65 49 6e 55 73 69 6e 67 if( nameInUsing
28d0: 43 6c 61 75 73 65 28 70 49 74 65 6d 2d 3e 70 55 Clause(pItem->pU
28e0: 73 69 6e 67 2c 20 7a 43 6f 6c 29 20 29 20 63 6f sing, zCol) ) co
28f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 ntinue;.
2900: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
2910: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 cnt++;.
2920: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 pMatch = pI
2930: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 tem;.
2940: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 /* Substitute t
2950: 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e he rowid (column
2960: 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 -1) for the INT
2970: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY
2980: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 */.
2990: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d pExpr->iColumn =
29a0: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 j==pTab->iPKey
29b0: 3f 20 2d 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20 ? -1 : (i16)j;.
29c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b break
29d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ;. }.
29e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
29f0: 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 if( pMatch
2a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 ){. pExp
2a10: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4d 61 74 r->iTable = pMat
2a20: 63 68 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 ch->iCursor;.
2a30: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 pExpr->pTab
2a40: 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b = pMatch->pTab;
2a50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 49 47 48 . /* RIGH
2a60: 54 20 4a 4f 49 4e 20 6e 6f 74 20 28 79 65 74 29 T JOIN not (yet)
2a70: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 supported */.
2a80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 assert( (p
2a90: 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79 Match->fg.jointy
2aa0: 70 65 20 26 20 4a 54 5f 52 49 47 48 54 29 3d 3d pe & JT_RIGHT)==
2ab0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 0 );. if(
2ac0: 20 28 70 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69 (pMatch->fg.joi
2ad0: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 ntype & JT_LEFT)
2ae0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 !=0 ){.
2af0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 ExprSetProperty
2b00: 28 70 45 78 70 72 2c 20 45 50 5f 43 61 6e 42 65 (pExpr, EP_CanBe
2b10: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d Null);. }
2b20: 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 . pSchema
2b30: 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e = pExpr->pTab->
2b40: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 7d pSchema;. }
2b50: 0a 20 20 20 20 7d 20 2f 2a 20 69 66 28 20 70 53 . } /* if( pS
2b60: 72 63 4c 69 73 74 20 29 20 2a 2f 0a 0a 23 69 66 rcList ) */..#if
2b70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
2b80: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 _TRIGGER. /*
2b90: 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 If we have not a
2ba0: 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20 lready resolved
2bb0: 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d the name, then m
2bc0: 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 aybe . ** it
2bd0: 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c is a new.* or ol
2be0: 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 d.* trigger argu
2bf0: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20 ment reference.
2c00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 */. if( zD
2c10: 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 b==0 && zTab!=0
2c20: 26 26 20 63 6e 74 54 61 62 3d 3d 30 20 26 26 20 && cntTab==0 &&
2c30: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 pParse->pTrigger
2c40: 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 Tab!=0 ){.
2c50: 69 6e 74 20 6f 70 20 3d 20 70 50 61 72 73 65 2d int op = pParse-
2c60: 3e 65 54 72 69 67 67 65 72 4f 70 3b 0a 20 20 20 >eTriggerOp;.
2c70: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 assert( op==T
2c80: 4b 5f 44 45 4c 45 54 45 20 7c 7c 20 6f 70 3d 3d K_DELETE || op==
2c90: 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d TK_UPDATE || op=
2ca0: 3d 54 4b 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20 =TK_INSERT );.
2cb0: 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 44 if( op!=TK_D
2cc0: 45 4c 45 54 45 20 26 26 20 73 71 6c 69 74 65 33 ELETE && sqlite3
2cd0: 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 7a 54 StrICmp("new",zT
2ce0: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 ab) == 0 ){.
2cf0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c pExpr->iTabl
2d00: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 e = 1;. p
2d10: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 Tab = pParse->pT
2d20: 72 69 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 riggerTab;.
2d30: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 21 3d 54 }else if( op!=T
2d40: 4b 5f 49 4e 53 45 52 54 20 26 26 20 73 71 6c 69 K_INSERT && sqli
2d50: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 te3StrICmp("old"
2d60: 2c 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 ,zTab)==0 ){.
2d70: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 pExpr->iTab
2d80: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 le = 0;.
2d90: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 pTab = pParse->p
2da0: 54 72 69 67 67 65 72 54 61 62 3b 0a 20 20 20 20 TriggerTab;.
2db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
2dc0: 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 pTab = 0;.
2dd0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 }.. if( pT
2de0: 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 ab ){ . i
2df0: 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 nt iCol;.
2e00: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d pSchema = pTab-
2e10: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 >pSchema;.
2e20: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 cntTab++;.
2e30: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 2c 20 for(iCol=0,
2e40: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b pCol=pTab->aCol;
2e50: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c iCol<pTab->nCol
2e60: 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b ; iCol++, pCol++
2e70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ){. if(
2e80: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 sqlite3StrICmp(
2e90: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f pCol->zName, zCo
2ea0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 l)==0 ){.
2eb0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 if( iCol==p
2ec0: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 Tab->iPKey ){.
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c iCol
2ee0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 = -1;.
2ef0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 }.
2f00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 break;.
2f10: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 }. }.
2f20: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d if( iCol>=
2f30: 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 73 71 pTab->nCol && sq
2f40: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f lite3IsRowid(zCo
2f50: 6c 29 20 26 26 20 56 69 73 69 62 6c 65 52 6f 77 l) && VisibleRow
2f60: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 id(pTab) ){.
2f70: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d /* IMP: R-
2f80: 35 31 34 31 34 2d 33 32 39 31 30 20 2a 2f 0a 20 51414-32910 */.
2f90: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 iCol =
2fa0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 -1;. }.
2fb0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 if( iCol<p
2fc0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 Tab->nCol ){.
2fd0: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 cnt++;.
2fe0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c if( iCol
2ff0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 <0 ){.
3000: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 pExpr->affinit
3010: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 y = SQLITE_AFF_I
3020: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 NTEGER;.
3030: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 }else if( pExp
3040: 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a r->iTable==0 ){.
3050: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 test
3060: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 case( iCol==31 )
3070: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 ;. te
3080: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32 stcase( iCol==32
3090: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 );.
30a0: 70 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b 20 pParse->oldmask
30b0: 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30 |= (iCol>=32 ? 0
30c0: 78 66 66 66 66 66 66 66 66 20 3a 20 28 28 28 75 xffffffff : (((u
30d0: 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20 32)1)<<iCol));.
30e0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a }else{.
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 test
3100: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 case( iCol==31 )
3110: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 ;. te
3120: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32 stcase( iCol==32
3130: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 );.
3140: 70 50 61 72 73 65 2d 3e 6e 65 77 6d 61 73 6b 20 pParse->newmask
3150: 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30 |= (iCol>=32 ? 0
3160: 78 66 66 66 66 66 66 66 66 20 3a 20 28 28 28 75 xffffffff : (((u
3170: 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20 32)1)<<iCol));.
3180: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
3190: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c pExpr->iCol
31a0: 75 6d 6e 20 3d 20 28 69 31 36 29 69 43 6f 6c 3b umn = (i16)iCol;
31b0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 . pExpr
31c0: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 ->pTab = pTab;.
31d0: 20 20 20 20 20 20 20 20 20 69 73 54 72 69 67 67 isTrigg
31e0: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 er = 1;.
31f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }. }.
3200: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e #endif /* !defin
3210: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 ed(SQLITE_OMIT_T
3220: 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 RIGGER) */..
3230: 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70 /*. ** Perhap
3240: 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20 s the name is a
3250: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 reference to the
3260: 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 ROWID. */.
3270: 20 20 69 66 28 20 63 6e 74 3d 3d 30 0a 20 20 20 if( cnt==0.
3280: 20 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 0a 20 && cntTab==1.
3290: 20 20 20 20 26 26 20 70 4d 61 74 63 68 0a 20 20 && pMatch.
32a0: 20 20 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c && (pNC->ncFl
32b0: 61 67 73 20 26 20 4e 43 5f 49 64 78 45 78 70 72 ags & NC_IdxExpr
32c0: 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c )==0. && sql
32d0: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c ite3IsRowid(zCol
32e0: 29 0a 20 20 20 20 20 26 26 20 56 69 73 69 62 6c ). && Visibl
32f0: 65 52 6f 77 69 64 28 70 4d 61 74 63 68 2d 3e 70 eRowid(pMatch->p
3300: 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 Tab). ){.
3310: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 cnt = 1;.
3320: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 pExpr->iColumn
3330: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 = -1;. pExp
3340: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 r->affinity = SQ
3350: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 LITE_AFF_INTEGER
3360: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
3370: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e ** If the in
3380: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f put is of the fo
3390: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 rm Z (not Y.Z or
33a0: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 X.Y.Z) then the
33b0: 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d name Z. ** m
33c0: 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e ight refer to an
33d0: 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 result-set alia
33e0: 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 s. This happens
33f0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 , for example, w
3400: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 hen. ** we ar
3410: 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 e resolving name
3420: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 s in the WHERE c
3430: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c lause of the fol
3440: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a lowing command:.
3450: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 **. **
3460: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 SELECT a+b AS
3470: 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 x FROM table WHE
3480: 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a RE x<10;. **.
3490: 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 ** In cases
34a0: 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 like this, repla
34b0: 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20 ce pExpr with a
34c0: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 copy of the expr
34d0: 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 ession that.
34e0: 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 ** forms the res
34f0: 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 ult set entry ("
3500: 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d a+b" in the exam
3510: 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 ple) and return
3520: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 immediately..
3530: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 ** Note that th
3540: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 e expression in
3550: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 the result set s
3560: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 hould have alrea
3570: 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 dy been. ** r
3580: 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 esolved by the t
3590: 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c ime the WHERE cl
35a0: 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 ause is resolved
35b0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 .. **. **
35c0: 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 75 The ability to u
35d0: 73 65 20 61 6e 20 6f 75 74 70 75 74 20 72 65 73 se an output res
35e0: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 69 ult-set column i
35f0: 6e 20 74 68 65 20 57 48 45 52 45 2c 20 47 52 4f n the WHERE, GRO
3600: 55 50 20 42 59 2c 0a 20 20 20 20 2a 2a 20 6f 72 UP BY,. ** or
3610: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 2c HAVING clauses,
3620: 20 6f 72 20 61 73 20 70 61 72 74 20 6f 66 20 61 or as part of a
3630: 20 6c 61 72 67 65 72 20 65 78 70 72 65 73 73 69 larger expressi
3640: 6f 6e 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 on in the ORDER
3650: 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 BY. ** clause
3660: 20 69 73 20 6e 6f 74 20 73 74 61 6e 64 61 72 64 is not standard
3670: 20 53 51 4c 2e 20 20 54 68 69 73 20 69 73 20 61 SQL. This is a
3680: 20 28 67 6f 6f 66 79 29 20 53 51 4c 69 74 65 20 (goofy) SQLite
3690: 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 61 74 0a extension, that.
36a0: 20 20 20 20 2a 2a 20 69 73 20 73 75 70 70 6f 72 ** is suppor
36b0: 74 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64 ted for backward
36c0: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 s compatibility
36d0: 6f 6e 6c 79 2e 20 48 65 6e 63 65 2c 20 77 65 20 only. Hence, we
36e0: 69 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 0a issue a warning.
36f0: 20 20 20 20 2a 2a 20 6f 6e 20 73 71 6c 69 74 65 ** on sqlite
3700: 33 5f 6c 6f 67 28 29 20 77 68 65 6e 65 76 65 72 3_log() whenever
3710: 20 74 68 65 20 63 61 70 61 62 69 6c 69 74 79 20 the capability
3720: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a is used.. */.
3730: 20 20 20 20 69 66 28 20 28 70 45 4c 69 73 74 20 if( (pEList
3740: 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d = pNC->pEList)!=
3750: 30 0a 20 20 20 20 20 26 26 20 7a 54 61 62 3d 3d 0. && zTab==
3760: 30 0a 20 20 20 20 20 26 26 20 63 6e 74 3d 3d 30 0. && cnt==0
3770: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f . ){. fo
3780: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d r(j=0; j<pEList-
3790: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 >nExpr; j++){.
37a0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 char *zAs
37b0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a = pEList->a[j].z
37c0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 Name;. if
37d0: 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 ( zAs!=0 && sqli
37e0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 te3StrICmp(zAs,
37f0: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 zCol)==0 ){.
3800: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 69 Expr *pOri
3810: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 g;. ass
3820: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 ert( pExpr->pLef
3830: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 t==0 && pExpr->p
3840: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 Right==0 );.
3850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 assert( pE
3860: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20 xpr->x.pList==0
3870: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 );. ass
3880: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 53 ert( pExpr->x.pS
3890: 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 elect==0 );.
38a0: 20 20 20 20 20 20 70 4f 72 69 67 20 3d 20 70 45 pOrig = pE
38b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 List->a[j].pExpr
38c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 ;. if(
38d0: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 26 4e 43 (pNC->ncFlags&NC
38e0: 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20 26 26 _AllowAgg)==0 &&
38f0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 ExprHasProperty
3900: 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20 (pOrig, EP_Agg)
3910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 ){. s
3920: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 qlite3ErrorMsg(p
3930: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f Parse, "misuse o
3940: 66 20 61 6c 69 61 73 65 64 20 61 67 67 72 65 67 f aliased aggreg
3950: 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20 ate %s", zAs);.
3960: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
3970: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 n WRC_Abort;.
3980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
3990: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 if( sqlite3Ex
39a0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4f 72 prVectorSize(pOr
39b0: 69 67 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 ig)!=1 ){.
39c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 sqlite3Err
39d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 orMsg(pParse, "r
39e0: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 ow value misused
39f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ");.
3a00: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 return WRC_Abort
3a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ;. }.
3a20: 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41 resolveA
3a30: 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c lias(pParse, pEL
3a40: 69 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c 20 22 ist, j, pExpr, "
3a50: 22 2c 20 6e 53 75 62 71 75 65 72 79 29 3b 0a 20 ", nSubquery);.
3a60: 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 cnt = 1
3a70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 ;. pMat
3a80: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 ch = 0;.
3a90: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d assert( zTab==
3aa0: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 0 && zDb==0 );.
3ab0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f goto lo
3ac0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 okupname_end;.
3ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 }. }
3ae0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 . }.. /* A
3af0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 dvance to the ne
3b00: 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e xt name context.
3b10: 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 The loop will
3b20: 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 exit when either
3b30: 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 . ** we have
3b40: 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 a match (cnt>0)
3b50: 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f or when we run o
3b60: 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 ut of name conte
3b70: 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 xts.. */.
3b80: 69 66 28 20 63 6e 74 20 29 20 62 72 65 61 6b 3b if( cnt ) break;
3b90: 0a 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e . pNC = pNC->
3ba0: 70 4e 65 78 74 3b 0a 20 20 20 20 6e 53 75 62 71 pNext;. nSubq
3bb0: 75 65 72 79 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 uery++;. }while
3bc0: 28 20 70 4e 43 20 29 3b 0a 0a 0a 20 20 2f 2a 0a ( pNC );... /*.
3bd0: 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 ** If X and Y
3be0: 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 are NULL (in oth
3bf0: 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 er words if only
3c00: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 the column name
3c10: 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c Z is. ** suppl
3c20: 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c ied) and the val
3c30: 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f ue of Z is enclo
3c40: 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 sed in double-qu
3c50: 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 otes, then. **
3c60: 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 Z is a string li
3c70: 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 teral if it does
3c80: 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f n't match any co
3c90: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 lumn names. In
3ca0: 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 that. ** case,
3cb0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 we need to retur
3cc0: 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 n right away and
3cd0: 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 not make any ch
3ce0: 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 anges to. ** pE
3cf0: 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 xpr.. **. ** B
3d00: 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 ecause no refere
3d10: 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 nce was made to
3d20: 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 outer contexts,
3d30: 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 the pNC->nRef.
3d40: 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f ** fields are no
3d50: 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 t changed in any
3d60: 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 context.. */.
3d70: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a if( cnt==0 && z
3d80: 54 61 62 3d 3d 30 20 26 26 20 45 78 70 72 48 61 Tab==0 && ExprHa
3d90: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c sProperty(pExpr,
3da0: 45 50 5f 44 62 6c 51 75 6f 74 65 64 29 20 29 7b EP_DblQuoted) ){
3db0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d . pExpr->op =
3dc0: 20 54 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 TK_STRING;.
3dd0: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b pExpr->pTab = 0;
3de0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f . return WRC_
3df0: 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a Prune;. }.. /*
3e00: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 . ** cnt==0 mea
3e10: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 ns there was not
3e20: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d match. cnt>1 m
3e30: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 eans there were
3e40: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 two or. ** more
3e50: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 matches. Eithe
3e60: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 r way, we have a
3e70: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 n error.. */.
3e80: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 if( cnt!=1 ){.
3e90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 const char *zE
3ea0: 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 rr;. zErr = c
3eb0: 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 nt==0 ? "no such
3ec0: 20 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69 column" : "ambi
3ed0: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d guous column nam
3ee0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 e";. if( zDb
3ef0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
3f00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c ErrorMsg(pParse,
3f10: 20 22 25 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c "%s: %s.%s.%s",
3f20: 20 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62 zErr, zDb, zTab
3f30: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c , zCol);. }el
3f40: 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 se if( zTab ){.
3f50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f sqlite3Erro
3f60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 rMsg(pParse, "%s
3f70: 3a 20 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 : %s.%s", zErr,
3f80: 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 zTab, zCol);.
3f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 }else{. sq
3fa0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
3fb0: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 arse, "%s: %s",
3fc0: 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 zErr, zCol);.
3fd0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 }. pParse->c
3fe0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a heckSchema = 1;.
3ff0: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 pTopNC->nErr
4000: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 ++;. }.. /* If
4010: 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 a column from a
4020: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 table in pSrcLi
4030: 73 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 st is referenced
4040: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 , then record.
4050: 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 ** this fact in
4060: 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d the pSrcList.a[]
4070: 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b .colUsed bitmask
4080: 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 . Column 0 caus
4090: 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f es. ** bit 0 to
40a0: 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e be set. Column
40b0: 20 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 1 sets bit 1.
40c0: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 And so forth. I
40d0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d f the. ** colum
40e0: 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 n number is grea
40f0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d ter than the num
4100: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 ber of bits in t
4110: 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 he bitmask. **
4120: 74 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 then set the hig
4130: 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 h-order bit of t
4140: 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f he bitmask.. */
4150: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 . if( pExpr->iC
4160: 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 olumn>=0 && pMat
4170: 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 ch!=0 ){. int
4180: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c n = pExpr->iCol
4190: 75 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 umn;. testcas
41a0: 65 28 20 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 e( n==BMS-1 );.
41b0: 20 20 20 69 66 28 20 6e 3e 3d 42 4d 53 20 29 7b if( n>=BMS ){
41c0: 0a 20 20 20 20 20 20 6e 20 3d 20 42 4d 53 2d 31 . n = BMS-1
41d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 ;. }. asse
41e0: 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 rt( pMatch->iCur
41f0: 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 sor==pExpr->iTab
4200: 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 le );. pMatch
4210: 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 ->colUsed |= ((B
4220: 69 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 itmask)1)<<n;.
4230: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 }.. /* Clean up
4240: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f and return. */
4250: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 . sqlite3ExprDe
4260: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d 3e lete(db, pExpr->
4270: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d pLeft);. pExpr-
4280: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 >pLeft = 0;. sq
4290: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 lite3ExprDelete(
42a0: 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 db, pExpr->pRigh
42b0: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 t);. pExpr->pRi
42c0: 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 ght = 0;. pExpr
42d0: 2d 3e 6f 70 20 3d 20 28 69 73 54 72 69 67 67 65 ->op = (isTrigge
42e0: 72 20 3f 20 54 4b 5f 54 52 49 47 47 45 52 20 3a r ? TK_TRIGGER :
42f0: 20 54 4b 5f 43 4f 4c 55 4d 4e 29 3b 0a 6c 6f 6f TK_COLUMN);.loo
4300: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 69 kupname_end:. i
4310: 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 f( cnt==1 ){.
4320: 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 assert( pNC!=0
4330: 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 );. if( !Expr
4340: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 HasProperty(pExp
4350: 72 2c 20 45 50 5f 41 6c 69 61 73 29 20 29 7b 0a r, EP_Alias) ){.
4360: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 sqlite3Aut
4370: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 hRead(pParse, pE
4380: 78 70 72 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e xpr, pSchema, pN
4390: 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 C->pSrcList);.
43a0: 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 }. /* Incre
43b0: 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 ment the nRef va
43c0: 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 lue on all name
43d0: 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f contexts from To
43e0: 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a pNC up to. **
43f0: 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 the point where
4400: 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 the name matche
4410: 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b d. */. for(;;
4420: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ){. assert(
4430: 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 pTopNC!=0 );.
4440: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 pTopNC->nRef
4450: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 ++;. if( pT
4460: 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 opNC==pNC ) brea
4470: 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 k;. pTopNC
4480: 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b = pTopNC->pNext;
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
44a0: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d n WRC_Prune;. }
44b0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 else {. retu
44c0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 rn WRC_Abort;.
44d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 }.}../*.** Alloc
44e0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 ate and return a
44f0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 pointer to an e
4500: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 6c 6f 61 xpression to loa
4510: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 43 6f d the column iCo
4520: 6c 0a 2a 2a 20 66 72 6f 6d 20 64 61 74 61 73 6f l.** from dataso
4530: 75 72 63 65 20 69 53 72 63 20 69 6e 20 53 72 63 urce iSrc in Src
4540: 4c 69 73 74 20 70 53 72 63 2e 0a 2a 2f 0a 45 78 List pSrc..*/.Ex
4550: 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 pr *sqlite3Creat
4560: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 73 71 6c 69 eColumnExpr(sqli
4570: 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 te3 *db, SrcList
4580: 20 2a 70 53 72 63 2c 20 69 6e 74 20 69 53 72 63 *pSrc, int iSrc
4590: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 45 , int iCol){. E
45a0: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 xpr *p = sqlite3
45b0: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b ExprAlloc(db, TK
45c0: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a _COLUMN, 0, 0);.
45d0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 if( p ){. s
45e0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 truct SrcList_it
45f0: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 em *pItem = &pSr
4600: 63 2d 3e 61 5b 69 53 72 63 5d 3b 0a 20 20 20 20 c->a[iSrc];.
4610: 70 2d 3e 70 54 61 62 20 3d 20 70 49 74 65 6d 2d p->pTab = pItem-
4620: 3e 70 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 54 >pTab;. p->iT
4630: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 able = pItem->iC
4640: 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 ursor;. if( p
4650: 2d 3e 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 ->pTab->iPKey==i
4660: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e Col ){. p->
4670: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 iColumn = -1;.
4680: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 }else{. p
4690: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 ->iColumn = (ynV
46a0: 61 72 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 ar)iCol;. t
46b0: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 estcase( iCol==B
46c0: 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 MS );. test
46d0: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d case( iCol==BMS-
46e0: 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 1 );. pItem
46f0: 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 ->colUsed |= ((B
4700: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 69 43 6f 6c itmask)1)<<(iCol
4710: 3e 3d 42 4d 53 20 3f 20 42 4d 53 2d 31 20 3a 20 >=BMS ? BMS-1 :
4720: 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 iCol);. }.
4730: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 ExprSetProperty
4740: 28 70 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 (p, EP_Resolved)
4750: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 ;. }. return p
4760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 ;.}../*.** Repor
4770: 74 20 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20 t an error that
4780: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 an expression is
4790: 20 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 73 not valid for s
47a0: 6f 6d 65 20 73 65 74 20 6f 66 0a 2a 2a 20 70 4e ome set of.** pN
47b0: 43 2d 3e 6e 63 46 6c 61 67 73 20 76 61 6c 75 65 C->ncFlags value
47c0: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 s determined by
47d0: 76 61 6c 69 64 4d 61 73 6b 2e 0a 2a 2f 0a 73 74 validMask..*/.st
47e0: 61 74 69 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c atic void notVal
47f0: 69 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 id(. Parse *pPa
4800: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4c 65 rse, /* Le
4810: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 ave error messag
4820: 65 20 68 65 72 65 20 2a 2f 0a 20 20 4e 61 6d 65 e here */. Name
4830: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 Context *pNC,
4840: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e /* The name con
4850: 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 text */. const
4860: 63 68 61 72 20 2a 7a 4d 73 67 2c 20 20 20 20 2f char *zMsg, /
4870: 2a 20 54 79 70 65 20 6f 66 20 65 72 72 6f 72 20 * Type of error
4880: 2a 2f 0a 20 20 69 6e 74 20 76 61 6c 69 64 4d 61 */. int validMa
4890: 73 6b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 sk /* Set
48a0: 20 6f 66 20 63 6f 6e 74 65 78 74 73 20 66 6f 72 of contexts for
48b0: 20 77 68 69 63 68 20 70 72 6f 68 69 62 69 74 65 which prohibite
48c0: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 d */.){. assert
48d0: 28 20 28 76 61 6c 69 64 4d 61 73 6b 26 7e 28 4e ( (validMask&~(N
48e0: 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72 C_IsCheck|NC_Par
48f0: 74 49 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 29 tIdx|NC_IdxExpr)
4900: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 )==0 );. if( (p
4910: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 76 61 NC->ncFlags & va
4920: 6c 69 64 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 lidMask)!=0 ){.
4930: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a const char *z
4940: 49 6e 20 3d 20 22 70 61 72 74 69 61 6c 20 69 6e In = "partial in
4950: 64 65 78 20 57 48 45 52 45 20 63 6c 61 75 73 65 dex WHERE clause
4960: 73 22 3b 0a 20 20 20 20 69 66 28 20 70 4e 43 2d s";. if( pNC-
4970: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 64 >ncFlags & NC_Id
4980: 78 45 78 70 72 20 29 20 20 20 20 20 20 7a 49 6e xExpr ) zIn
4990: 20 3d 20 22 69 6e 64 65 78 20 65 78 70 72 65 73 = "index expres
49a0: 73 69 6f 6e 73 22 3b 0a 23 69 66 6e 64 65 66 20 sions";.#ifndef
49b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 SQLITE_OMIT_CHEC
49c0: 4b 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 K. else if( p
49d0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 NC->ncFlags & NC
49e0: 5f 49 73 43 68 65 63 6b 20 29 20 7a 49 6e 20 3d _IsCheck ) zIn =
49f0: 20 22 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 "CHECK constrai
4a00: 6e 74 73 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 nts";.#endif.
4a10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 sqlite3ErrorMsg
4a20: 28 70 50 61 72 73 65 2c 20 22 25 73 20 70 72 6f (pParse, "%s pro
4a30: 68 69 62 69 74 65 64 20 69 6e 20 25 73 22 2c 20 hibited in %s",
4a40: 7a 4d 73 67 2c 20 7a 49 6e 29 3b 0a 20 20 7d 0a zMsg, zIn);. }.
4a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 }../*.** Express
4a60: 69 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65 6e 63 ion p should enc
4a70: 6f 64 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 ode a floating p
4a80: 6f 69 6e 74 20 76 61 6c 75 65 20 62 65 74 77 65 oint value betwe
4a90: 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a en 1.0 and 0.0..
4aa0: 2a 2a 20 52 65 74 75 72 6e 20 31 30 32 34 20 74 ** Return 1024 t
4ab0: 69 6d 65 73 20 74 68 69 73 20 76 61 6c 75 65 2e imes this value.
4ac0: 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69 Or return -1 i
4ad0: 66 20 70 20 69 73 20 6e 6f 74 20 61 20 66 6c 6f f p is not a flo
4ae0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 ating point.** v
4af0: 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 30 alue between 1.0
4b00: 20 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61 and 0.0..*/.sta
4b10: 74 69 63 20 69 6e 74 20 65 78 70 72 50 72 6f 62 tic int exprProb
4b20: 61 62 69 6c 69 74 79 28 45 78 70 72 20 2a 70 29 ability(Expr *p)
4b30: 7b 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 2d {. double r = -
4b40: 31 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 1.0;. if( p->op
4b50: 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74 !=TK_FLOAT ) ret
4b60: 75 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 urn -1;. sqlite
4b70: 33 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65 3AtoF(p->u.zToke
4b80: 6e 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74 n, &r, sqlite3St
4b90: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b rlen30(p->u.zTok
4ba0: 65 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 en), SQLITE_UTF8
4bb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 3e 3d );. assert( r>=
4bc0: 30 2e 30 20 29 3b 0a 20 20 69 66 28 20 72 3e 31 0.0 );. if( r>1
4bd0: 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a .0 ) return -1;.
4be0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 72 return (int)(r
4bf0: 2a 31 33 34 32 31 37 37 32 38 2e 30 29 3b 0a 7d *134217728.0);.}
4c00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ../*.** This rou
4c10: 74 69 6e 65 20 69 73 20 63 61 6c 6c 62 61 63 6b tine is callback
4c20: 20 66 6f 72 20 73 71 6c 69 74 65 33 57 61 6c 6b for sqlite3Walk
4c30: 45 78 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 Expr()..**.** Re
4c40: 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e solve symbolic n
4c50: 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c ames into TK_COL
4c60: 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f UMN operators fo
4c70: 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a r the current.**
4c80: 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 node in the exp
4c90: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 ression tree. R
4ca0: 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 eturn 0 to conti
4cb0: 6e 75 65 20 74 68 65 20 73 65 61 72 63 68 20 64 nue the search d
4cc0: 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 own.** the tree
4cd0: 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 or 2 to abort th
4ce0: 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a e tree walk..**.
4cf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
4d00: 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 also does error
4d10: 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d checking and nam
4d20: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 e resolution for
4d30: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d .** function nam
4d40: 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f es. The operato
4d50: 72 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 r for aggregate
4d60: 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 functions is cha
4d70: 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 nged.** to TK_AG
4d80: 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 G_FUNCTION..*/.s
4d90: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 tatic int resolv
4da0: 65 45 78 70 72 53 74 65 70 28 57 61 6c 6b 65 72 eExprStep(Walker
4db0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 *pWalker, Expr
4dc0: 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 *pExpr){. NameC
4dd0: 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 0a 20 20 50 ontext *pNC;. P
4de0: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 arse *pParse;..
4df0: 20 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e pNC = pWalker->
4e00: 75 2e 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 u.pNC;. assert(
4e10: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 pNC!=0 );. pPa
4e20: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 rse = pNC->pPars
4e30: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 e;. assert( pPa
4e40: 72 73 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70 50 rse==pWalker->pP
4e50: 61 72 73 65 20 29 3b 0a 0a 20 20 69 66 28 20 45 arse );.. if( E
4e60: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 xprHasProperty(p
4e70: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 Expr, EP_Resolve
4e80: 64 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f d) ) return WRC_
4e90: 50 72 75 6e 65 3b 0a 20 20 45 78 70 72 53 65 74 Prune;. ExprSet
4ea0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 Property(pExpr,
4eb0: 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 EP_Resolved);.#i
4ec0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 fndef NDEBUG. i
4ed0: 66 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 f( pNC->pSrcList
4ee0: 20 26 26 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 && pNC->pSrcLis
4ef0: 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 t->nAlloc>0 ){.
4f00: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 SrcList *pSrc
4f10: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 List = pNC->pSrc
4f20: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b List;. int i;
4f30: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
4f40: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e pNC->pSrcList->n
4f50: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 Src; i++){.
4f60: 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 assert( pSrcLis
4f70: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e t->a[i].iCursor>
4f80: 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e =0 && pSrcList->
4f90: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 a[i].iCursor<pPa
4fa0: 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 rse->nTab);.
4fb0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 }. }.#endif. s
4fc0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 witch( pExpr->op
4fd0: 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 ){..#if defined
4fe0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 (SQLITE_ENABLE_U
4ff0: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d PDATE_DELETE_LIM
5000: 49 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 IT) && !defined(
5010: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 SQLITE_OMIT_SUBQ
5020: 55 45 52 59 29 0a 20 20 20 20 2f 2a 20 54 68 65 UERY). /* The
5030: 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f special operato
5040: 72 20 54 4b 5f 52 4f 57 20 6d 65 61 6e 73 20 75 r TK_ROW means u
5050: 73 65 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 se the rowid for
5060: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a the first. *
5070: 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 * column in the
5080: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 FROM clause. Th
5090: 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 is is used by th
50a0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 52 44 45 e LIMIT and ORDE
50b0: 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 R BY. ** clau
50c0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 6e se processing on
50d0: 20 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45 UPDATE and DELE
50e0: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 TE statements..
50f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 */. case T
5100: 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 53 K_ROW: {. S
5110: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 rcList *pSrcList
5120: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 = pNC->pSrcList
5130: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 ;. struct S
5140: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 rcList_item *pIt
5150: 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 em;. assert
5160: 28 20 70 53 72 63 4c 69 73 74 20 26 26 20 70 53 ( pSrcList && pS
5170: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 rcList->nSrc==1
5180: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d );. pItem =
5190: 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 0a 20 pSrcList->a; .
51a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d pExpr->op =
51b0: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 TK_COLUMN;.
51c0: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 pExpr->pTab =
51d0: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 pItem->pTab;.
51e0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 pExpr->iTable
51f0: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f = pItem->iCurso
5200: 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e r;. pExpr->
5210: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 iColumn = -1;.
5220: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e pExpr->affin
5230: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 ity = SQLITE_AFF
5240: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 _INTEGER;.
5250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e break;. }.#en
5260: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 dif /* defined(S
5270: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 QLITE_ENABLE_UPD
5280: 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 ATE_DELETE_LIMIT
5290: 29 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 21 ). && !
52a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
52b0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f MIT_SUBQUERY) */
52c0: 0a 0a 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d .. /* A colum
52d0: 6e 20 6e 61 6d 65 3a 20 20 20 20 20 20 20 20 20 n name:
52e0: 20 20 20 20 20 20 20 20 20 20 20 49 44 0a 20 20 ID.
52f0: 20 20 2a 2a 20 4f 72 20 74 61 62 6c 65 20 6e 61 ** Or table na
5300: 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 me and column na
5310: 6d 65 3a 20 20 20 20 49 44 2e 49 44 0a 20 20 20 me: ID.ID.
5320: 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 ** Or a databas
5330: 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c e, table and col
5340: 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 umn: ID.ID.ID.
5350: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 **. ** The
5360: 20 54 4b 5f 49 44 20 61 6e 64 20 54 4b 5f 4f 55 TK_ID and TK_OU
5370: 54 20 63 61 73 65 73 20 61 72 65 20 63 6f 6d 62 T cases are comb
5380: 69 6e 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 ined so that the
5390: 72 65 20 77 69 6c 6c 20 6f 6e 6c 79 0a 20 20 20 re will only.
53a0: 20 2a 2a 20 62 65 20 6f 6e 65 20 63 61 6c 6c 20 ** be one call
53b0: 74 6f 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 29 2e to lookupName().
53c0: 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6d 70 69 Then the compi
53d0: 6c 65 72 20 77 69 6c 6c 20 69 6e 2d 6c 69 6e 65 ler will in-line
53e0: 20 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 4e . ** lookupN
53f0: 61 6d 65 28 29 20 66 6f 72 20 61 20 73 69 7a 65 ame() for a size
5400: 20 72 65 64 75 63 74 69 6f 6e 20 61 6e 64 20 70 reduction and p
5410: 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 63 72 65 erformance incre
5420: 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ase.. */.
5430: 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 case TK_ID:.
5440: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 case TK_DOT: {.
5450: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 const char
5460: 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 *zColumn;.
5470: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 const char *zTab
5480: 6c 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 le;. const
5490: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 20 char *zDb;.
54a0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a Expr *pRight;..
54b0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d if( pExpr-
54c0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 >op==TK_ID ){.
54d0: 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20 zDb = 0;.
54e0: 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 zTable =
54f0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 0;. zColu
5500: 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 mn = pExpr->u.zT
5510: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 oken;. }els
5520: 65 7b 0a 20 20 20 20 20 20 20 20 6e 6f 74 56 61 e{. notVa
5530: 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c lid(pParse, pNC,
5540: 20 22 74 68 65 20 5c 22 2e 5c 22 20 6f 70 65 72 "the \".\" oper
5550: 61 74 6f 72 22 2c 20 4e 43 5f 49 64 78 45 78 70 ator", NC_IdxExp
5560: 72 29 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 r);. pRig
5570: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 ht = pExpr->pRig
5580: 68 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ht;. if(
5590: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 pRight->op==TK_I
55a0: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a D ){. z
55b0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 Db = 0;.
55c0: 20 20 7a 54 61 62 6c 65 20 3d 20 70 45 78 70 72 zTable = pExpr
55d0: 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 ->pLeft->u.zToke
55e0: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f n;. zCo
55f0: 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75 lumn = pRight->u
5600: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 .zToken;.
5610: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
5620: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 assert( pRight
5630: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a ->op==TK_DOT );.
5640: 20 20 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 zDb =
5650: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 75 2e pExpr->pLeft->u.
5660: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 zToken;.
5670: 20 20 7a 54 61 62 6c 65 20 3d 20 70 52 69 67 68 zTable = pRigh
5680: 74 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b t->pLeft->u.zTok
5690: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 en;. zC
56a0: 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e olumn = pRight->
56b0: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e pRight->u.zToken
56c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
56d0: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e }. return
56e0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 lookupName(pPar
56f0: 73 65 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c se, zDb, zTable,
5700: 20 7a 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 zColumn, pNC, p
5710: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 Expr);. }..
5720: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e /* Resolve fun
5730: 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 ction names.
5740: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 */. case TK_F
5750: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 UNCTION: {.
5760: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 ExprList *pList
5770: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 = pExpr->x.pLis
5780: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 t; /* The arg
5790: 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 ument list */.
57a0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 int n = pLis
57b0: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 t ? pList->nExpr
57c0: 20 3a 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 : 0; /* Numb
57d0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 er of arguments
57e0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f */. int no_
57f0: 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 such_func = 0;
5800: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
5810: 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e no such function
5820: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 exists */.
5830: 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 int wrong_num_a
5840: 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 rgs = 0; /*
5850: 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 True if wrong nu
5860: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
5870: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 s */. int i
5880: 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20 s_agg = 0;
5890: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 /* True i
58a0: 66 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 f is an aggregat
58b0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 e function */.
58c0: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 int nId;
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
58e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 /* Number of cha
58f0: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74 racters in funct
5900: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 ion name */.
5910: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 const char *zI
5920: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a d; /*
5930: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 The function na
5940: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e me. */. Fun
5950: 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 cDef *pDef;
5960: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f /* Info
5970: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 rmation about th
5980: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 e function */.
5990: 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 u8 enc = ENC
59a0: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 20 (pParse->db);
59b0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 /* The database
59c0: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 encoding */..
59d0: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 assert( !Expr
59e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 HasProperty(pExp
59f0: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 r, EP_xIsSelect)
5a00: 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 );. zId =
5a10: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b pExpr->u.zToken;
5a20: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c . nId = sql
5a30: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 ite3Strlen30(zId
5a40: 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 );. pDef =
5a50: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 sqlite3FindFunct
5a60: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 ion(pParse->db,
5a70: 7a 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b zId, n, enc, 0);
5a80: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d . if( pDef=
5a90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 =0 ){. pD
5aa0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 ef = sqlite3Find
5ab0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d Function(pParse-
5ac0: 3e 64 62 2c 20 7a 49 64 2c 20 2d 32 2c 20 65 6e >db, zId, -2, en
5ad0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 c, 0);. i
5ae0: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 f( pDef==0 ){.
5af0: 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f no_such_
5b00: 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 func = 1;.
5b10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
5b20: 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 wrong_num_arg
5b30: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d s = 1;. }
5b40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
5b50: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 is_agg = p
5b60: 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d Def->xFinalize!=
5b70: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 0;. if( p
5b80: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 Def->funcFlags &
5b90: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c SQLITE_FUNC_UNL
5ba0: 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 IKELY ){.
5bb0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 ExprSetProper
5bc0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c ty(pExpr, EP_Unl
5bd0: 69 6b 65 6c 79 7c 45 50 5f 53 6b 69 70 29 3b 0a ikely|EP_Skip);.
5be0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d if( n=
5bf0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =2 ){.
5c00: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 pExpr->iTable
5c10: 3d 20 65 78 70 72 50 72 6f 62 61 62 69 6c 69 74 = exprProbabilit
5c20: 79 28 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 y(pList->a[1].pE
5c30: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 xpr);.
5c40: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 if( pExpr->iTa
5c50: 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 ble<0 ){.
5c60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 sqlite3Er
5c70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 rorMsg(pParse,.
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
5c90: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 second argument
5ca0: 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 to likelihood()
5cb0: 6d 75 73 74 20 62 65 20 61 20 22 0a 20 20 20 20 must be a ".
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e "con
5cd0: 73 74 61 6e 74 20 62 65 74 77 65 65 6e 20 30 2e stant between 0.
5ce0: 30 20 61 6e 64 20 31 2e 30 22 29 3b 0a 20 20 20 0 and 1.0");.
5cf0: 20 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e pNC->
5d00: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 nErr++;.
5d10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 }.
5d20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
5d30: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f /* EVIDENCE-O
5d40: 46 3a 20 52 2d 36 31 33 30 34 2d 32 39 34 34 39 F: R-61304-29449
5d50: 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28 58 29 The unlikely(X)
5d60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 function is.
5d70: 20 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 69 ** equi
5d80: 76 61 6c 65 6e 74 20 74 6f 20 6c 69 6b 65 6c 69 valent to likeli
5d90: 68 6f 6f 64 28 58 2c 20 30 2e 30 36 32 35 29 2e hood(X, 0.0625).
5da0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 . **
5db0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 EVIDENCE-OF: R-0
5dc0: 31 32 38 33 2d 31 31 36 33 36 20 54 68 65 20 75 1283-11636 The u
5dd0: 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 nlikely(X) funct
5de0: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 20 ion is.
5df0: 20 20 20 2a 2a 20 73 68 6f 72 74 2d 68 61 6e 64 ** short-hand
5e00: 20 66 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 for likelihood(
5e10: 58 2c 30 2e 30 36 32 35 29 2e 0a 20 20 20 20 20 X,0.0625)..
5e20: 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e ** EVIDEN
5e30: 43 45 2d 4f 46 3a 20 52 2d 33 36 38 35 30 2d 33 CE-OF: R-36850-3
5e40: 34 31 32 37 20 54 68 65 20 6c 69 6b 65 6c 79 28 4127 The likely(
5e50: 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 X) function is s
5e60: 68 6f 72 74 2d 68 61 6e 64 0a 20 20 20 20 20 20 hort-hand.
5e70: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6c 69 6b ** for lik
5e80: 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 39 33 37 35 elihood(X,0.9375
5e90: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a ).. *
5ea0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 * EVIDENCE-OF: R
5eb0: 2d 35 33 34 33 36 2d 34 30 39 37 33 20 54 68 65 -53436-40973 The
5ec0: 20 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 likely(X) funct
5ed0: 69 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e ion is equivalen
5ee0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a t. **
5ef0: 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 to likelihood(X
5f00: 2c 30 2e 39 33 37 35 29 2e 20 2a 2f 0a 20 20 20 ,0.9375). */.
5f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 /* TUNI
5f20: 4e 47 3a 20 75 6e 6c 69 6b 65 6c 79 28 29 20 70 NG: unlikely() p
5f30: 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 30 2e robability is 0.
5f40: 30 36 32 35 2e 20 20 6c 69 6b 65 6c 79 28 29 20 0625. likely()
5f50: 69 73 20 30 2e 39 33 37 35 20 2a 2f 0a 20 20 20 is 0.9375 */.
5f60: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e pExpr->
5f70: 69 54 61 62 6c 65 20 3d 20 70 44 65 66 2d 3e 7a iTable = pDef->z
5f80: 4e 61 6d 65 5b 30 5d 3d 3d 27 75 27 20 3f 20 38 Name[0]=='u' ? 8
5f90: 33 38 38 36 30 38 20 3a 20 31 32 35 38 32 39 31 388608 : 1258291
5fa0: 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 20;. }
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 .
5fc0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 }.#ifndef S
5fd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f QLITE_OMIT_AUTHO
5fe0: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 RIZATION.
5ff0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 {. int
6000: 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41 auth = sqlite3A
6010: 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c uthCheck(pParse,
6020: 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e SQLITE_FUNCTION
6030: 2c 20 30 2c 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c , 0,pDef->zName,
6040: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 0);. if
6050: 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f ( auth!=SQLITE_O
6060: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 K ){.
6070: 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 if( auth==SQLIT
6080: 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 E_DENY ){.
6090: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 sqlite3E
60a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 rrorMsg(pParse,
60b0: 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 "not authorized
60c0: 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a to use function:
60d0: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 %s",.
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 pDef
6100: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 ->zName);.
6110: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 pNC->nEr
6120: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 r++;.
6130: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 }. p
6140: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 Expr->op = TK_NU
6150: 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 LL;.
6160: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 return WRC_Prune
6170: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ;. }.
6180: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 }.#endif.
6190: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d if( pDef-
61a0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 >funcFlags & (SQ
61b0: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 LITE_FUNC_CONSTA
61c0: 4e 54 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 53 NT|SQLITE_FUNC_S
61d0: 4c 4f 43 48 4e 47 29 20 29 7b 0a 20 20 20 20 20 LOCHNG) ){.
61e0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 /* For the
61f0: 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 65 20 purposes of the
6200: 45 50 5f 43 6f 6e 73 74 46 75 6e 63 20 66 6c 61 EP_ConstFunc fla
6210: 67 2c 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 g, date and time
6220: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 . ** fu
6230: 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6f 74 68 65 nctions and othe
6240: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 r functions that
6250: 20 63 68 61 6e 67 65 20 73 6c 6f 77 6c 79 20 61 change slowly a
6260: 72 65 20 63 6f 6e 73 69 64 65 72 65 64 0a 20 20 re considered.
6270: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 ** const
6280: 61 6e 74 20 62 65 63 61 75 73 65 20 74 68 65 79 ant because they
6290: 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f are constant fo
62a0: 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f r the duration o
62b0: 66 20 6f 6e 65 20 71 75 65 72 79 20 2a 2f 0a 20 f one query */.
62c0: 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 ExprSet
62d0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 Property(pExpr,E
62e0: 50 5f 43 6f 6e 73 74 46 75 6e 63 29 3b 0a 20 20 P_ConstFunc);.
62f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
6300: 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 if( (pDef->funcF
6310: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 lags & SQLITE_FU
6320: 4e 43 5f 43 4f 4e 53 54 41 4e 54 29 3d 3d 30 20 NC_CONSTANT)==0
6330: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ){. /*
6340: 44 61 74 65 2f 74 69 6d 65 20 66 75 6e 63 74 69 Date/time functi
6350: 6f 6e 73 20 74 68 61 74 20 75 73 65 20 27 6e 6f ons that use 'no
6360: 77 27 2c 20 61 6e 64 20 6f 74 68 65 72 20 66 75 w', and other fu
6370: 6e 63 74 69 6f 6e 73 20 6c 69 6b 65 0a 20 20 20 nctions like.
6380: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 ** sqlite
6390: 5f 76 65 72 73 69 6f 6e 28 29 20 74 68 61 74 20 _version() that
63a0: 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 76 65 might change ove
63b0: 72 20 74 69 6d 65 20 63 61 6e 6e 6f 74 20 62 65 r time cannot be
63c0: 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 20 20 used.
63d0: 2a 2a 20 69 6e 20 61 6e 20 69 6e 64 65 78 2e 20 ** in an index.
63e0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 */. not
63f0: 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e Valid(pParse, pN
6400: 43 2c 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e C, "non-determin
6410: 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 22 istic functions"
6420: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
6430: 20 20 20 20 20 4e 43 5f 49 64 78 45 78 70 72 7c NC_IdxExpr|
6440: 4e 43 5f 50 61 72 74 49 64 78 29 3b 0a 20 20 20 NC_PartIdx);.
6450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
6460: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 if( is_agg
6470: 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 && (pNC->ncFlags
6480: 20 26 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d & NC_AllowAgg)=
6490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 =0 ){. sq
64a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 lite3ErrorMsg(pP
64b0: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 arse, "misuse of
64c0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 aggregate funct
64d0: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 ion %.*s()", nId
64e0: 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 ,zId);. p
64f0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 NC->nErr++;.
6500: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a is_agg = 0;.
6510: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
6520: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 26 26 20 no_such_func &&
6530: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 pParse->db->init
6540: 2e 62 75 73 79 3d 3d 30 0a 23 69 66 64 65 66 20 .busy==0.#ifdef
6550: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e SQLITE_ENABLE_UN
6560: 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 KNOWN_SQL_FUNCTI
6570: 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ON.
6580: 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 && pParse->ex
6590: 70 6c 61 69 6e 3d 3d 30 0a 23 65 6e 64 69 66 0a plain==0.#endif.
65a0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 ){.
65b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 sqlite3ErrorMsg
65c0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 (pParse, "no suc
65d0: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 h function: %.*s
65e0: 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 ", nId, zId);.
65f0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b pNC->nErr+
6600: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 +;. }else i
6610: 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 f( wrong_num_arg
6620: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c s ){. sql
6630: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 ite3ErrorMsg(pPa
6640: 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 rse,"wrong numbe
6650: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 r of arguments t
6660: 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 o function %.*s(
6670: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 )",.
6680: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 nId, zId);.
6690: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b pNC->nErr++;
66a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
66b0: 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d f( is_agg ) pNC-
66c0: 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f >ncFlags &= ~NC_
66d0: 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 AllowAgg;.
66e0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c sqlite3WalkExprL
66f0: 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70 4c 69 ist(pWalker, pLi
6700: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 st);. if( i
6710: 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 s_agg ){.
6720: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e NameContext *pN
6730: 43 32 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 C2 = pNC;.
6740: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b pExpr->op = TK
6750: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 _AGG_FUNCTION;.
6760: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 pExpr->op
6770: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77 2 = 0;. w
6780: 68 69 6c 65 28 20 70 4e 43 32 20 26 26 20 21 73 hile( pNC2 && !s
6790: 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 qlite3FunctionUs
67a0: 65 73 54 68 69 73 53 72 63 28 70 45 78 70 72 2c esThisSrc(pExpr,
67b0: 20 70 4e 43 32 2d 3e 70 53 72 63 4c 69 73 74 29 pNC2->pSrcList)
67c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 ){. pE
67d0: 78 70 72 2d 3e 6f 70 32 2b 2b 3b 0a 20 20 20 20 xpr->op2++;.
67e0: 20 20 20 20 20 20 70 4e 43 32 20 3d 20 70 4e 43 pNC2 = pNC
67f0: 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 2->pNext;.
6800: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 }. asse
6810: 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 rt( pDef!=0 );.
6820: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 32 20 if( pNC2
6830: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 ){. ass
6840: 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 ert( SQLITE_FUNC
6850: 5f 4d 49 4e 4d 41 58 3d 3d 4e 43 5f 4d 69 6e 4d _MINMAX==NC_MinM
6860: 61 78 41 67 67 20 29 3b 0a 20 20 20 20 20 20 20 axAgg );.
6870: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 44 testcase( (pD
6880: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 ef->funcFlags &
6890: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d SQLITE_FUNC_MINM
68a0: 41 58 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 AX)!=0 );.
68b0: 20 20 20 20 70 4e 43 32 2d 3e 6e 63 46 6c 61 67 pNC2->ncFlag
68c0: 73 20 7c 3d 20 4e 43 5f 48 61 73 41 67 67 20 7c s |= NC_HasAgg |
68d0: 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 (pDef->funcFlag
68e0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f s & SQLITE_FUNC_
68f0: 4d 49 4e 4d 41 58 29 3b 0a 0a 20 20 20 20 20 20 MINMAX);..
6900: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 43 2d }. pNC-
6910: 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 >ncFlags |= NC_A
6920: 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 7d llowAgg;. }
6930: 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 . /* FIX ME
6940: 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 : Compute pExpr
6950: 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 ->affinity based
6960: 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 on the expected
6970: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a return. **
6980: 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e type of the fun
6990: 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a ction . */.
69a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 return WRC
69b0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 _Prune;. }.#i
69c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
69d0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 T_SUBQUERY. c
69e0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 ase TK_SELECT:.
69f0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 case TK_EXIST
6a00: 53 3a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 S: testcase( pE
6a10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 xpr->op==TK_EXIS
6a20: 54 53 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 TS );.#endif.
6a30: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 case TK_IN: {.
6a40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 testcase( p
6a50: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 Expr->op==TK_IN
6a60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 );. if( Exp
6a70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 rHasProperty(pEx
6a80: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 pr, EP_xIsSelect
6a90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 ) ){. int
6aa0: 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 nRef = pNC->nRe
6ab0: 66 3b 0a 20 20 20 20 20 20 20 20 6e 6f 74 56 61 f;. notVa
6ac0: 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c lid(pParse, pNC,
6ad0: 20 22 73 75 62 71 75 65 72 69 65 73 22 2c 20 4e "subqueries", N
6ae0: 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72 C_IsCheck|NC_Par
6af0: 74 49 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 29 tIdx|NC_IdxExpr)
6b00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 ;. sqlite
6b10: 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 3WalkSelect(pWal
6b20: 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 ker, pExpr->x.pS
6b30: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 elect);.
6b40: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 assert( pNC->nRe
6b50: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 f>=nRef );.
6b60: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 if( nRef!=pNC
6b70: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 ->nRef ){.
6b80: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 ExprSetPrope
6b90: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 rty(pExpr, EP_Va
6ba0: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 rSelect);.
6bb0: 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 pNC->ncFlags
6bc0: 20 7c 3d 20 4e 43 5f 56 61 72 53 65 6c 65 63 74 |= NC_VarSelect
6bd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
6be0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b }. break;
6bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
6c00: 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 TK_VARIABLE: {.
6c10: 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 notValid(pP
6c20: 61 72 73 65 2c 20 70 4e 43 2c 20 22 70 61 72 61 arse, pNC, "para
6c30: 6d 65 74 65 72 73 22 2c 20 4e 43 5f 49 73 43 68 meters", NC_IsCh
6c40: 65 63 6b 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e eck|NC_PartIdx|N
6c50: 43 5f 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20 C_IdxExpr);.
6c60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
6c70: 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 case TK_BETWE
6c80: 45 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f EN:. case TK_
6c90: 45 51 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f EQ:. case TK_
6ca0: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f NE:. case TK_
6cb0: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f LT:. case TK_
6cc0: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f LE:. case TK_
6cd0: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f GT:. case TK_
6ce0: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f GE:. case TK_
6cf0: 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f IS:. case TK_
6d00: 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 69 ISNOT: {. i
6d10: 6e 74 20 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 nt nLeft, nRight
6d20: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 ;. if( pPar
6d30: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 se->db->mallocFa
6d40: 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 iled ) break;.
6d50: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 assert( pExp
6d60: 72 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 r->pLeft!=0 );.
6d70: 20 20 20 20 20 6e 4c 65 66 74 20 3d 20 73 71 6c nLeft = sql
6d80: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 ite3ExprVectorSi
6d90: 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 ze(pExpr->pLeft)
6da0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 ;. if( pExp
6db0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 r->op==TK_BETWEE
6dc0: 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 52 69 N ){. nRi
6dd0: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 ght = sqlite3Exp
6de0: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 rVectorSize(pExp
6df0: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d r->x.pList->a[0]
6e00: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 .pExpr);.
6e10: 20 69 66 28 20 6e 52 69 67 68 74 3d 3d 6e 4c 65 if( nRight==nLe
6e20: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 ft ){.
6e30: 6e 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 nRight = sqlite3
6e40: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 ExprVectorSize(p
6e50: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 Expr->x.pList->a
6e60: 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 [1].pExpr);.
6e70: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 }. }els
6e80: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 e{. asser
6e90: 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 t( pExpr->pRight
6ea0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 6e !=0 );. n
6eb0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 Right = sqlite3E
6ec0: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 xprVectorSize(pE
6ed0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 xpr->pRight);.
6ee0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 }. if(
6ef0: 6e 4c 65 66 74 21 3d 6e 52 69 67 68 74 20 29 7b nLeft!=nRight ){
6f00: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 . testcas
6f10: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b e( pExpr->op==TK
6f20: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74 _EQ );. t
6f30: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e estcase( pExpr->
6f40: 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 op==TK_NE );.
6f50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 testcase( p
6f60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 Expr->op==TK_LT
6f70: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 );. testc
6f80: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d ase( pExpr->op==
6f90: 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 20 TK_LE );.
6fa0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 testcase( pExpr
6fb0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 ->op==TK_GT );.
6fc0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 testcase(
6fd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 pExpr->op==TK_G
6fe0: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 E );. tes
6ff0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 tcase( pExpr->op
7000: 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 ==TK_IS );.
7010: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 testcase( pEx
7020: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 pr->op==TK_ISNOT
7030: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 );. test
7040: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d case( pExpr->op=
7050: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29 3b 0a 20 =TK_BETWEEN );.
7060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 sqlite3Er
7070: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 rorMsg(pParse, "
7080: 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 row value misuse
7090: 64 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 d");. }.
70a0: 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d break; . }
70b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 . }. return (p
70c0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 Parse->nErr || p
70d0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f Parse->db->mallo
70e0: 63 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f 41 cFailed) ? WRC_A
70f0: 62 6f 72 74 20 3a 20 57 52 43 5f 43 6f 6e 74 69 bort : WRC_Conti
7100: 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 nue;.}../*.** pE
7110: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f List is a list o
7120: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 f expressions wh
7130: 69 63 68 20 61 72 65 20 72 65 61 6c 6c 79 20 74 ich are really t
7140: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 he result set of
7150: 20 74 68 65 0a 2a 2a 20 61 20 53 45 4c 45 43 54 the.** a SELECT
7160: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 45 20 statement. pE
7170: 69 73 20 61 20 74 65 72 6d 20 69 6e 20 61 6e 20 is a term in an
7180: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 ORDER BY or GROU
7190: 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 P BY clause..**
71a0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 This routine che
71b0: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70 45 cks to see if pE
71c0: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64 65 is a simple ide
71d0: 6e 74 69 66 69 65 72 20 77 68 69 63 68 20 63 6f ntifier which co
71e0: 72 72 65 73 70 6f 6e 64 73 0a 2a 2a 20 74 6f 20 rresponds.** to
71f0: 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 20 6f the AS-name of o
7200: 6e 65 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 ne of the terms
7210: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f of the expressio
7220: 6e 20 6c 69 73 74 2e 20 20 49 66 20 69 74 20 69 n list. If it i
7230: 73 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 s,.** this routi
7240: 6e 65 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 ne return an int
7250: 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61 eger between 1 a
7260: 6e 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73 20 nd N where N is
7270: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a the number of.**
7280: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 45 4c elements in pEL
7290: 69 73 74 2c 20 63 6f 72 72 65 73 70 6f 6e 64 69 ist, correspondi
72a0: 6e 67 20 74 6f 20 74 68 65 20 6d 61 74 63 68 69 ng to the matchi
72b0: 6e 67 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 ng entry. If th
72c0: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 ere is.** no mat
72d0: 63 68 2c 20 6f 72 20 69 66 20 70 45 20 69 73 20 ch, or if pE is
72e0: 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 69 64 65 not a simple ide
72f0: 6e 74 69 66 69 65 72 2c 20 74 68 65 6e 20 74 68 ntifier, then th
7300: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 is routine.** re
7310: 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 45 turn 0..**.** pE
7320: 4c 69 73 74 20 68 61 73 20 62 65 65 6e 20 72 65 List has been re
7330: 73 6f 6c 76 65 64 2e 20 20 70 45 20 68 61 73 20 solved. pE has
7340: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 not..*/.static i
7350: 6e 74 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 nt resolveAsName
7360: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 (. Parse *pPars
7370: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e e, /* Parsin
7380: 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 g context for er
7390: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a ror messages */.
73a0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 ExprList *pELi
73b0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 st, /* List of
73c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 73 expressions to s
73d0: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 can */. Expr *p
73e0: 45 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 E /* E
73f0: 78 70 72 65 73 73 69 6f 6e 20 77 65 20 61 72 65 xpression we are
7400: 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 74 63 68 trying to match
7410: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 */.){. int i;
7420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c /* L
7430: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a oop counter */..
7440: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 UNUSED_PARAMET
7450: 45 52 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 ER(pParse);.. i
7460: 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 f( pE->op==TK_ID
7470: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 ){. char *zC
7480: 6f 6c 20 3d 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 ol = pE->u.zToke
7490: 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 n;. for(i=0;
74a0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b i<pEList->nExpr;
74b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 i++){. cha
74c0: 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d r *zAs = pEList-
74d0: 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 >a[i].zName;.
74e0: 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 if( zAs!=0 &&
74f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 sqlite3StrICmp(
7500: 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b zAs, zCol)==0 ){
7510: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
7520: 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 i+1;. }.
7530: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 }. }. return
7540: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 0;.}../*.** pE i
7550: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 s a pointer to a
7560: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69 n expression whi
7570: 63 68 20 69 73 20 61 20 73 69 6e 67 6c 65 20 74 ch is a single t
7580: 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 4f 52 erm in the.** OR
7590: 44 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d 70 DER BY of a comp
75a0: 6f 75 6e 64 20 53 45 4c 45 43 54 2e 20 20 54 68 ound SELECT. Th
75b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 e expression has
75c0: 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20 6e 61 6d not been.** nam
75d0: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a e resolved..**.*
75e0: 2a 20 41 74 20 74 68 65 20 70 6f 69 6e 74 20 74 * At the point t
75f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 his routine is c
7600: 61 6c 6c 65 64 2c 20 77 65 20 61 6c 72 65 61 64 alled, we alread
7610: 79 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 0a y know that the.
7620: 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d ** ORDER BY term
7630: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 is not an integ
7640: 65 72 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 er index into th
7650: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 e result set. T
7660: 68 61 74 0a 2a 2a 20 63 61 73 65 20 69 73 20 68 hat.** case is h
7670: 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 63 61 andled by the ca
7680: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a lling routine..*
7690: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 *.** Attempt to
76a0: 6d 61 74 63 68 20 70 45 20 61 67 61 69 6e 73 74 match pE against
76b0: 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 result set colu
76c0: 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d mns in the left-
76d0: 6d 6f 73 74 0a 2a 2a 20 53 45 4c 45 43 54 20 73 most.** SELECT s
76e0: 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 tatement. Retur
76f0: 6e 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f 66 n the index i of
7700: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f the matching co
7710: 6c 75 6d 6e 2c 0a 2a 2a 20 61 73 20 61 6e 20 69 lumn,.** as an i
7720: 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 ndication to the
7730: 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 caller that it
7740: 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 should sort by t
7750: 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 0a he i-th column..
7760: 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 ** The left-most
7770: 20 63 6f 6c 75 6d 6e 20 69 73 20 31 2e 20 20 49 column is 1. I
7780: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 n other words, t
7790: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 he value returne
77a0: 64 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 d is the.** same
77b0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74 integer value t
77c0: 68 61 74 20 77 6f 75 6c 64 20 62 65 20 75 73 65 hat would be use
77d0: 64 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 d in the SQL sta
77e0: 74 65 6d 65 6e 74 20 74 6f 20 69 6e 64 69 63 61 tement to indica
77f0: 74 65 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e te.** the column
7800: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 ..**.** If there
7810: 20 69 73 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 is no match, re
7820: 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 turn 0. Return
7830: 2d 31 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f -1 if an error o
7840: 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 ccurs..*/.static
7850: 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64 65 int resolveOrde
7860: 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 rByTermToExprLis
7870: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 t(. Parse *pPar
7880: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 se, /* Parsi
7890: 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 ng context for e
78a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f rror messages */
78b0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 . Select *pSele
78c0: 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45 4c ct, /* The SEL
78d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77 69 ECT statement wi
78e0: 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 th the ORDER BY
78f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 clause */. Expr
7900: 20 2a 70 45 20 20 20 20 20 20 20 20 20 20 20 2f *pE /
7910: 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 4f * The specific O
7920: 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a RDER BY term */.
7930: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 ){. int i;
7940: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 /* Loop
7950: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 counter */. Exp
7960: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 rList *pEList;
7970: 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f /* The columns o
7980: 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 f the result set
7990: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 */. NameContex
79a0: 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 t nc; /* Name
79b0: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 73 context for res
79c0: 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 20 20 73 olving pE */. s
79d0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 qlite3 *db;
79e0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f /* Database co
79f0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e nnection */. in
7a00: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 t rc;
7a10: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 /* Return code
7a20: 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 from subprocedur
7a30: 65 73 20 2a 2f 0a 20 20 75 38 20 73 61 76 65 64 es */. u8 saved
7a40: 53 75 70 70 45 72 72 3b 20 20 20 2f 2a 20 53 61 SuppErr; /* Sa
7a50: 76 65 64 20 76 61 6c 75 65 20 6f 66 20 64 62 2d ved value of db-
7a60: 3e 73 75 70 70 72 65 73 73 45 72 72 20 2a 2f 0a >suppressErr */.
7a70: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
7a80: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 e3ExprIsInteger(
7a90: 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20 20 pE, &i)==0 );.
7aa0: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 pEList = pSelect
7ab0: 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 ->pEList;.. /*
7ac0: 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 Resolve all name
7ad0: 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 s in the ORDER B
7ae0: 59 20 74 65 72 6d 20 65 78 70 72 65 73 73 69 6f Y term expressio
7af0: 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 n. */. memset(
7b00: 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e &nc, 0, sizeof(n
7b10: 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 c));. nc.pParse
7b20: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e = pParse;. nc.
7b30: 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 pSrcList = pSele
7b40: 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 ct->pSrc;. nc.p
7b50: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a EList = pEList;.
7b60: 20 20 6e 63 2e 6e 63 46 6c 61 67 73 20 3d 20 4e nc.ncFlags = N
7b70: 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 6e 63 C_AllowAgg;. nc
7b80: 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 64 62 20 .nErr = 0;. db
7b90: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 = pParse->db;.
7ba0: 73 61 76 65 64 53 75 70 70 45 72 72 20 3d 20 64 savedSuppErr = d
7bb0: 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 3b 0a b->suppressErr;.
7bc0: 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 db->suppressEr
7bd0: 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 r = 1;. rc = sq
7be0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 lite3ResolveExpr
7bf0: 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 3b 0a Names(&nc, pE);.
7c00: 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 db->suppressEr
7c10: 72 20 3d 20 73 61 76 65 64 53 75 70 70 45 72 72 r = savedSuppErr
7c20: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 ;. if( rc ) ret
7c30: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 79 urn 0;.. /* Try
7c40: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52 to match the OR
7c50: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f DER BY expressio
7c60: 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70 n against an exp
7c70: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 69 6e 20 ression. ** in
7c80: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 the result set.
7c90: 20 52 65 74 75 72 6e 20 61 6e 20 31 2d 62 61 73 Return an 1-bas
7ca0: 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 ed index of the
7cb0: 6d 61 74 63 68 69 6e 67 0a 20 20 2a 2a 20 72 65 matching. ** re
7cc0: 73 75 6c 74 2d 73 65 74 20 65 6e 74 72 79 2e 0a sult-set entry..
7cd0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 */. for(i=0;
7ce0: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b i<pEList->nExpr;
7cf0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 i++){. if( s
7d00: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 qlite3ExprCompar
7d10: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 e(pEList->a[i].p
7d20: 45 78 70 72 2c 20 70 45 2c 20 2d 31 29 3c 32 20 Expr, pE, -1)<2
7d30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ){. return
7d40: 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a i+1;. }. }..
7d50: 20 20 2f 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 /* If no match
7d60: 2c 20 72 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 , return 0. */.
7d70: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
7d80: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 .** Generate an
7d90: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 ORDER BY or GROU
7da0: 50 20 42 59 20 74 65 72 6d 20 6f 75 74 2d 6f 66 P BY term out-of
7db0: 2d 72 61 6e 67 65 20 65 72 72 6f 72 2e 0a 2a 2f -range error..*/
7dc0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 .static void res
7dd0: 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 olveOutOfRangeEr
7de0: 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 ror(. Parse *pP
7df0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a arse, /*
7e00: 20 54 68 65 20 65 72 72 6f 72 20 63 6f 6e 74 65 The error conte
7e10: 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f xt into which to
7e20: 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f 72 write the error
7e30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
7e40: 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 *zType, /*
7e50: 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 "ORDER" or "GROU
7e60: 50 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 P" */. int i,
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
7e80: 2a 20 54 68 65 20 69 6e 64 65 78 20 28 31 2d 62 * The index (1-b
7e90: 61 73 65 64 29 20 6f 66 20 74 68 65 20 74 65 72 ased) of the ter
7ea0: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2a m out of range *
7eb0: 2f 0a 20 20 69 6e 74 20 6d 78 20 20 20 20 20 20 /. int mx
7ec0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 /* La
7ed0: 72 67 65 73 74 20 70 65 72 6d 69 73 73 69 62 6c rgest permissibl
7ee0: 65 20 76 61 6c 75 65 20 6f 66 20 69 20 2a 2f 0a e value of i */.
7ef0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f ){. sqlite3Erro
7f00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 rMsg(pParse, .
7f10: 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72 6d "%r %s BY term
7f20: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 out of range -
7f30: 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 should be ".
7f40: 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 "between 1 and %
7f50: 64 22 2c 20 69 2c 20 7a 54 79 70 65 2c 20 6d 78 d", i, zType, mx
7f60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c );.}../*.** Anal
7f70: 79 7a 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 yze the ORDER BY
7f80: 20 63 6c 61 75 73 65 20 69 6e 20 61 20 63 6f 6d clause in a com
7f90: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 pound SELECT sta
7fa0: 74 65 6d 65 6e 74 2e 20 20 20 4d 6f 64 69 66 79 tement. Modify
7fb0: 0a 2a 2a 20 65 61 63 68 20 74 65 72 6d 20 6f 66 .** each term of
7fc0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c the ORDER BY cl
7fd0: 61 75 73 65 20 69 73 20 61 20 63 6f 6e 73 74 61 ause is a consta
7fe0: 6e 74 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 nt integer betwe
7ff0: 65 6e 20 31 0a 2a 2a 20 61 6e 64 20 4e 20 77 68 en 1.** and N wh
8000: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d ere N is the num
8010: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 ber of columns i
8020: 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 n the compound S
8030: 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52 44 ELECT..**.** ORD
8040: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 ER BY terms that
8050: 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 6e 20 are already an
8060: 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 integer between
8070: 31 20 61 6e 64 20 4e 20 61 72 65 0a 2a 2a 20 75 1 and N are.** u
8080: 6e 6d 6f 64 69 66 69 65 64 2e 20 20 4f 52 44 45 nmodified. ORDE
8090: 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 R BY terms that
80a0: 61 72 65 20 69 6e 74 65 67 65 72 73 20 6f 75 74 are integers out
80b0: 73 69 64 65 20 74 68 65 20 72 61 6e 67 65 20 6f side the range o
80c0: 66 0a 2a 2a 20 31 20 74 68 72 6f 75 67 68 20 4e f.** 1 through N
80d0: 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 generate an err
80e0: 6f 72 2e 20 20 4f 52 44 45 52 20 42 59 20 74 65 or. ORDER BY te
80f0: 72 6d 73 20 74 68 61 74 20 61 72 65 20 65 78 70 rms that are exp
8100: 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 ressions.** are
8110: 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 matched against
8120: 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 result set expre
8130: 73 73 69 6f 6e 73 20 6f 66 20 63 6f 6d 70 6f 75 ssions of compou
8140: 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 62 65 67 nd SELECT.** beg
8150: 69 6e 6e 69 6e 67 20 77 69 74 68 20 74 68 65 20 inning with the
8160: 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 left-most SELECT
8170: 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 74 6f 77 and working tow
8180: 61 72 64 20 74 68 65 20 72 69 67 68 74 2e 0a 2a ard the right..*
8190: 2a 20 41 74 20 74 68 65 20 66 69 72 73 74 20 6d * At the first m
81a0: 61 74 63 68 2c 20 74 68 65 20 4f 52 44 45 52 20 atch, the ORDER
81b0: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 BY expression is
81c0: 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 transformed int
81d0: 6f 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72 o.** the integer
81e0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a column number..
81f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 **.** Return the
8200: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 number of error
8210: 73 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 s seen..*/.stati
8220: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 43 6f 6d c int resolveCom
8230: 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 poundOrderBy(.
8240: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 Parse *pParse,
8250: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 /* Parsing
8260: 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 context. Leave
8270: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 error messages
8280: 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 here */. Select
8290: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 *pSelect
82a0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 /* The SELECT st
82b0: 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 atement containi
82c0: 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 ng the ORDER BY
82d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 */.){. int i;.
82e0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 ExprList *pOrde
82f0: 72 42 79 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 rBy;. ExprList
8300: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 *pEList;. sqlit
8310: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f e3 *db;. int mo
8320: 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 reToDo = 1;.. p
8330: 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c 65 63 OrderBy = pSelec
8340: 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 t->pOrderBy;. i
8350: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 f( pOrderBy==0 )
8360: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 20 return 0;. db
8370: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 = pParse->db;.#i
8380: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c f SQLITE_MAX_COL
8390: 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72 UMN. if( pOrder
83a0: 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c By->nExpr>db->aL
83b0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 imit[SQLITE_LIMI
83c0: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 T_COLUMN] ){.
83d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 sqlite3ErrorMsg
83e0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 (pParse, "too ma
83f0: 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44 45 ny terms in ORDE
8400: 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 R BY clause");.
8410: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d return 1;. }
8420: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d .#endif. for(i=
8430: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 0; i<pOrderBy->n
8440: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 Expr; i++){.
8450: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 pOrderBy->a[i].d
8460: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 one = 0;. }. p
8470: 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 20 3d 20 Select->pNext =
8480: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 0;. while( pSel
8490: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 ect->pPrior ){.
84a0: 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 pSelect->pPri
84b0: 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 53 65 6c or->pNext = pSel
84c0: 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 ect;. pSelect
84d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 = pSelect->pPri
84e0: 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 or;. }. while(
84f0: 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72 65 pSelect && more
8500: 54 6f 44 6f 20 29 7b 0a 20 20 20 20 73 74 72 75 ToDo ){. stru
8510: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d ct ExprList_item
8520: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 6d 6f 72 *pItem;. mor
8530: 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20 70 eToDo = 0;. p
8540: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d EList = pSelect-
8550: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 >pEList;. ass
8560: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 ert( pEList!=0 )
8570: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 ;. for(i=0, p
8580: 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 Item=pOrderBy->a
8590: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 ; i<pOrderBy->nE
85a0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b xpr; i++, pItem+
85b0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 +){. int iC
85c0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45 ol = -1;. E
85d0: 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a xpr *pE, *pDup;.
85e0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d if( pItem-
85f0: 3e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 >done ) continue
8600: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c ;. pE = sql
8610: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c ite3ExprSkipColl
8620: 61 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 ate(pItem->pExpr
8630: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c );. if( sql
8640: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 ite3ExprIsIntege
8650: 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a r(pE, &iCol) ){.
8660: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c if( iCol
8670: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 <=0 || iCol>pELi
8680: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 st->nExpr ){.
8690: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 resolveOu
86a0: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50 tOfRangeError(pP
86b0: 61 72 73 65 2c 20 22 4f 52 44 45 52 22 2c 20 69 arse, "ORDER", i
86c0: 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 +1, pEList->nExp
86d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 r);. re
86e0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 turn 1;.
86f0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }. }else{.
8700: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 iCol = re
8710: 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50 61 72 solveAsName(pPar
8720: 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 3b se, pEList, pE);
8730: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f . if( iCo
8740: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 l==0 ){.
8750: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 pDup = sqlite3
8760: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 2c 20 ExprDup(db, pE,
8770: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 0);. if
8780: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 ( !db->mallocFai
8790: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 led ){.
87a0: 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29 3b assert(pDup);
87b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f . iCo
87c0: 6c 20 3d 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 l = resolveOrder
87d0: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 ByTermToExprList
87e0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 (pParse, pSelect
87f0: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 , pDup);.
8800: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 }. s
8810: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 qlite3ExprDelete
8820: 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 (db, pDup);.
8830: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
8840: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 if( iCol>0 )
8850: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e {. /* Con
8860: 76 65 72 74 20 74 68 65 20 4f 52 44 45 52 20 42 vert the ORDER B
8870: 59 20 74 65 72 6d 20 69 6e 74 6f 20 61 6e 20 69 Y term into an i
8880: 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 nteger column nu
8890: 6d 62 65 72 20 69 43 6f 6c 2c 0a 20 20 20 20 20 mber iCol,.
88a0: 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 63 61 72 ** taking car
88b0: 65 20 74 6f 20 70 72 65 73 65 72 76 65 20 74 68 e to preserve th
88c0: 65 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 e COLLATE clause
88d0: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f if it exists */
88e0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 . Expr *p
88f0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 New = sqlite3Exp
8900: 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 r(db, TK_INTEGER
8910: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 , 0);. if
8920: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 ( pNew==0 ) retu
8930: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e rn 1;. pN
8940: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f ew->flags |= EP_
8950: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 IntValue;.
8960: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 pNew->u.iValue
8970: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 = iCol;.
8980: 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 45 78 70 if( pItem->pExp
8990: 72 3d 3d 70 45 20 29 7b 0a 20 20 20 20 20 20 20 r==pE ){.
89a0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 pItem->pExpr
89b0: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 = pNew;.
89c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
89d0: 20 45 78 70 72 20 2a 70 50 61 72 65 6e 74 20 3d Expr *pParent =
89e0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 pItem->pExpr;.
89f0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 assert(
8a00: 20 70 50 61 72 65 6e 74 2d 3e 6f 70 3d 3d 54 4b pParent->op==TK
8a10: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 _COLLATE );.
8a20: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 61 while( pPa
8a30: 72 65 6e 74 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d rent->pLeft->op=
8a40: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 20 70 50 =TK_COLLATE ) pP
8a50: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 2d arent = pParent-
8a60: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 >pLeft;.
8a70: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e assert( pParen
8a80: 74 2d 3e 70 4c 65 66 74 3d 3d 70 45 20 29 3b 0a t->pLeft==pE );.
8a90: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 65 6e pParen
8aa0: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 3b t->pLeft = pNew;
8ab0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
8ac0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 sqlite3ExprDe
8ad0: 6c 65 74 65 28 64 62 2c 20 70 45 29 3b 0a 20 20 lete(db, pE);.
8ae0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 pItem->u.x
8af0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 .iOrderByCol = (
8b00: 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 u16)iCol;.
8b10: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 pItem->done =
8b20: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 1;. }else{.
8b30: 20 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f moreToDo
8b40: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = 1;. }.
8b50: 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20 }. pSelect
8b60: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 = pSelect->pNext
8b70: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b ;. }. for(i=0;
8b80: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 i<pOrderBy->nEx
8b90: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 pr; i++){. if
8ba0: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d ( pOrderBy->a[i]
8bb0: 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 .done==0 ){.
8bc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 sqlite3ErrorMs
8bd0: 67 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52 g(pParse, "%r OR
8be0: 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 DER BY term does
8bf0: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22 not match any "
8c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f . "co
8c10: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 lumn in the resu
8c20: 6c 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 lt set", i+1);.
8c30: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 return 1;.
8c40: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 }. }. retur
8c50: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 n 0;.}../*.** Ch
8c60: 65 63 6b 20 65 76 65 72 79 20 74 65 72 6d 20 69 eck every term i
8c70: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f n the ORDER BY o
8c80: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 r GROUP BY claus
8c90: 65 20 70 4f 72 64 65 72 42 79 20 6f 66 0a 2a 2a e pOrderBy of.**
8ca0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 the SELECT stat
8cb0: 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e 20 20 ement pSelect.
8cc0: 49 66 20 61 6e 79 20 74 65 72 6d 20 69 73 20 72 If any term is r
8cd0: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a 2a eference to a.**
8ce0: 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 result set expr
8cf0: 65 73 73 69 6f 6e 20 28 61 73 20 64 65 74 65 72 ession (as deter
8d00: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 45 78 70 mined by the Exp
8d10: 72 4c 69 73 74 2e 61 2e 75 2e 78 2e 69 4f 72 64 rList.a.u.x.iOrd
8d20: 65 72 42 79 43 6f 6c 0a 2a 2a 20 66 69 65 6c 64 erByCol.** field
8d30: 29 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 ) then convert t
8d40: 68 61 74 20 74 65 72 6d 20 69 6e 74 6f 20 61 20 hat term into a
8d50: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 72 72 copy of the corr
8d60: 65 73 70 6f 6e 64 69 6e 67 20 72 65 73 75 6c 74 esponding result
8d70: 20 73 65 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a set.** column..
8d80: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 65 72 72 **.** If any err
8d90: 6f 72 73 20 61 72 65 20 64 65 74 65 63 74 65 64 ors are detected
8da0: 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d , add an error m
8db0: 65 73 73 61 67 65 20 74 6f 20 70 50 61 72 73 65 essage to pParse
8dc0: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 6e and.** return n
8dd0: 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e on-zero. Return
8de0: 20 7a 65 72 6f 20 69 66 20 6e 6f 20 65 72 72 6f zero if no erro
8df0: 72 73 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2f 0a rs are seen..*/.
8e00: 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c int sqlite3Resol
8e10: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a veOrderGroupBy(.
8e20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c Parse *pParse,
8e30: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 /* Parsi
8e40: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 ng context. Lea
8e50: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 ve error message
8e60: 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 s here */. Sele
8e70: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 ct *pSelect,
8e80: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 /* The SELECT
8e90: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 statement contai
8ea0: 6e 69 6e 67 20 74 68 65 20 63 6c 61 75 73 65 20 ning the clause
8eb0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 */. ExprList *p
8ec0: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68 OrderBy, /* Th
8ed0: 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 e ORDER BY or GR
8ee0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f OUP BY clause to
8ef0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f be processed */
8f00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
8f10: 54 79 70 65 20 20 20 20 20 2f 2a 20 22 4f 52 44 Type /* "ORD
8f20: 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20 2a ER" or "GROUP" *
8f30: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 /.){. int i;.
8f40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 sqlite3 *db = pP
8f50: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72 arse->db;. Expr
8f60: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 List *pEList;.
8f70: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f struct ExprList_
8f80: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 item *pItem;..
8f90: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 if( pOrderBy==0
8fa0: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d || pParse->db->m
8fb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 allocFailed ) re
8fc0: 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49 turn 0;.#if SQLI
8fd0: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 TE_MAX_COLUMN.
8fe0: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 if( pOrderBy->nE
8ff0: 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 xpr>db->aLimit[S
9000: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 QLITE_LIMIT_COLU
9010: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 MN] ){. sqlit
9020: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 e3ErrorMsg(pPars
9030: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 e, "too many ter
9040: 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c 61 75 ms in %s BY clau
9050: 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 se", zType);.
9060: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 return 1;. }.#
9070: 65 6e 64 69 66 0a 20 20 70 45 4c 69 73 74 20 3d endif. pEList =
9080: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 pSelect->pEList
9090: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 ;. assert( pELi
90a0: 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 73 71 6c st!=0 ); /* sql
90b0: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 29 20 ite3SelectNew()
90c0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 guarantees this
90d0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 */. for(i=0, pI
90e0: 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b tem=pOrderBy->a;
90f0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 i<pOrderBy->nEx
9100: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b pr; i++, pItem++
9110: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d ){. if( pItem
9120: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f ->u.x.iOrderByCo
9130: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 l ){. if( p
9140: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 Item->u.x.iOrder
9150: 42 79 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 ByCol>pEList->nE
9160: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 xpr ){. r
9170: 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 esolveOutOfRange
9180: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54 Error(pParse, zT
9190: 79 70 65 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 ype, i+1, pEList
91a0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 ->nExpr);.
91b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 return 1;.
91c0: 20 20 7d 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 }. resolv
91d0: 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 eAlias(pParse, p
91e0: 45 4c 69 73 74 2c 20 70 49 74 65 6d 2d 3e 75 2e EList, pItem->u.
91f0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 2c x.iOrderByCol-1,
9200: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 0a 20 pItem->pExpr,.
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9220: 20 20 7a 54 79 70 65 2c 30 29 3b 0a 20 20 20 20 zType,0);.
9230: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 }. }. return 0
9240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f 72 64 65 ;.}../*.** pOrde
9250: 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 rBy is an ORDER
9260: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 BY or GROUP BY c
9270: 6c 61 75 73 65 20 69 6e 20 53 45 4c 45 43 54 20 lause in SELECT
9280: 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 statement pSelec
9290: 74 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d 65 20 63 t..** The Name c
92a0: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 ontext of the SE
92b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 LECT statement i
92c0: 73 20 70 4e 43 2e 20 20 7a 54 79 70 65 20 69 73 s pNC. zType is
92d0: 20 65 69 74 68 65 72 0a 2a 2a 20 22 4f 52 44 45 either.** "ORDE
92e0: 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20 64 65 R" or "GROUP" de
92f0: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 pending on which
9300: 20 74 79 70 65 20 6f 66 20 63 6c 61 75 73 65 20 type of clause
9310: 70 4f 72 64 65 72 42 79 20 69 73 2e 0a 2a 2a 0a pOrderBy is..**.
9320: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
9330: 72 65 73 6f 6c 76 65 73 20 65 61 63 68 20 74 65 resolves each te
9340: 72 6d 20 6f 66 20 74 68 65 20 63 6c 61 75 73 65 rm of the clause
9350: 20 69 6e 74 6f 20 61 6e 20 65 78 70 72 65 73 73 into an express
9360: 69 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f ion..** If the o
9370: 72 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 rder-by term is
9380: 61 6e 20 69 6e 74 65 67 65 72 20 49 20 62 65 74 an integer I bet
9390: 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 28 77 68 ween 1 and N (wh
93a0: 65 72 65 20 4e 20 69 73 20 74 68 65 0a 2a 2a 20 ere N is the.**
93b0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e number of column
93c0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 s in the result
93d0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 set of the SELEC
93e0: 54 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 T) then the expr
93f0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 ession.** in the
9400: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 61 resolution is a
9410: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 49 2d 74 copy of the I-t
9420: 68 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 h result-set exp
9430: 72 65 73 73 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 ression. If.**
9440: 74 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 the order-by ter
9450: 6d 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 69 m is an identifi
9460: 65 72 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f er that correspo
9470: 6e 64 73 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 nds to the AS-na
9480: 6d 65 20 6f 66 0a 2a 2a 20 61 20 72 65 73 75 6c me of.** a resul
9490: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e t-set expression
94a0: 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 , then the term
94b0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 61 20 63 6f resolves to a co
94c0: 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 73 py of the.** res
94d0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 ult-set expressi
94e0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 on. Otherwise,
94f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 the expression i
9500: 73 20 72 65 73 6f 6c 76 65 64 20 69 6e 0a 2a 2a s resolved in.**
9510: 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 2d the usual way -
9520: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65 using sqlite3Re
9530: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 solveExprNames()
9540: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ..**.** This rou
9550: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 tine returns the
9560: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 number of error
9570: 73 2e 20 20 49 66 20 65 72 72 6f 72 73 20 6f 63 s. If errors oc
9580: 63 75 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 cur, then.** an
9590: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f appropriate erro
95a0: 72 20 6d 65 73 73 61 67 65 20 6d 69 67 68 74 20 r message might
95b0: 62 65 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 be left in pPars
95c0: 65 2e 20 20 28 4f 4f 4d 20 65 72 72 6f 72 73 0a e. (OOM errors.
95d0: 2a 2a 20 65 78 63 65 70 74 65 64 2e 29 0a 2a 2f ** excepted.).*/
95e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f .static int reso
95f0: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 lveOrderGroupBy(
9600: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a . NameContext *
9610: 70 4e 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 pNC, /* The
9620: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 name context of
9630: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 the SELECT state
9640: 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 ment */. Select
9650: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 *pSelect,
9660: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 /* The SELECT st
9670: 61 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67 20 atement holding
9680: 70 4f 72 64 65 72 42 79 20 2a 2f 0a 20 20 45 78 pOrderBy */. Ex
9690: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 prList *pOrderBy
96a0: 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 , /* An ORDER
96b0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 BY or GROUP BY c
96c0: 6c 61 75 73 65 20 74 6f 20 72 65 73 6f 6c 76 65 lause to resolve
96d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
96e0: 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45 *zType /* E
96f0: 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72 ither "ORDER" or
9700: 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70 "GROUP", as app
9710: 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 ropriate */.){.
9720: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 int i, j;
9730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9740: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 /* Loop counters
9750: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 */. int iCol;
9760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9770: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e /* Column n
9780: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 umber */. struc
9790: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 t ExprList_item
97a0: 2a 70 49 74 65 6d 3b 20 20 20 2f 2a 20 41 20 74 *pItem; /* A t
97b0: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 erm of the ORDER
97c0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 BY clause */.
97d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 Parse *pParse;
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
97f0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 * Parsing contex
9800: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 t */. int nResu
9810: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 lt;
9820: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
9830: 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 of terms in the
9840: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 result set */..
9850: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 if( pOrderBy==0
9860: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e ) return 0;. n
9870: 52 65 73 75 6c 74 20 3d 20 70 53 65 6c 65 63 74 Result = pSelect
9880: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b ->pEList->nExpr;
9890: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d . pParse = pNC-
98a0: 3e 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 >pParse;. for(i
98b0: 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 =0, pItem=pOrder
98c0: 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 By->a; i<pOrderB
98d0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 y->nExpr; i++, p
98e0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 Item++){. Exp
98f0: 72 20 2a 70 45 20 3d 20 70 49 74 65 6d 2d 3e 70 r *pE = pItem->p
9900: 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a Expr;. Expr *
9910: 70 45 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 pE2 = sqlite3Exp
9920: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 29 rSkipCollate(pE)
9930: 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b ;. if( zType[
9940: 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 20 0]!='G' ){.
9950: 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 iCol = resolveA
9960: 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 53 sName(pParse, pS
9970: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 elect->pEList, p
9980: 45 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 E2);. if( i
9990: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 Col>0 ){.
99a0: 20 2f 2a 20 49 66 20 61 6e 20 41 53 2d 6e 61 6d /* If an AS-nam
99b0: 65 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 e match is found
99c0: 2c 20 6d 61 72 6b 20 74 68 69 73 20 4f 52 44 45 , mark this ORDE
99d0: 52 20 42 59 20 63 6f 6c 75 6d 6e 20 61 73 20 62 R BY column as b
99e0: 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 eing. **
99f0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 a copy of the iC
9a00: 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 ol-th result-set
9a10: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 73 75 column. The su
9a20: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f bsequent call to
9a30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 . ** sqli
9a40: 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 te3ResolveOrderG
9a50: 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f roupBy() will co
9a60: 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73 nvert the expres
9a70: 73 69 6f 6e 20 74 6f 20 61 0a 20 20 20 20 20 20 sion to a.
9a80: 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 ** copy of the
9a90: 20 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d iCol-th result-
9aa0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 set expression.
9ab0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d */. pItem
9ac0: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f ->u.x.iOrderByCo
9ad0: 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 l = (u16)iCol;.
9ae0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b continue;
9af0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
9b00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 if( sqlite3Ex
9b10: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c prIsInteger(pE2,
9b20: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 &iCol) ){.
9b30: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 /* The ORDER BY
9b40: 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65 term is an inte
9b50: 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e 20 20 41 ger constant. A
9b60: 67 61 69 6e 2c 20 73 65 74 20 74 68 65 20 63 6f gain, set the co
9b70: 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 6e 75 lumn. ** nu
9b80: 6d 62 65 72 20 73 6f 20 74 68 61 74 20 73 71 6c mber so that sql
9b90: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 ite3ResolveOrder
9ba0: 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63 GroupBy() will c
9bb0: 6f 6e 76 65 72 74 20 74 68 65 0a 20 20 20 20 20 onvert the.
9bc0: 20 2a 2a 20 6f 72 64 65 72 2d 62 79 20 74 65 72 ** order-by ter
9bd0: 6d 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 m to a copy of t
9be0: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 he result-set ex
9bf0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 pression */.
9c00: 20 20 69 66 28 20 69 43 6f 6c 3c 31 20 7c 7c 20 if( iCol<1 ||
9c10: 69 43 6f 6c 3e 30 78 66 66 66 66 20 29 7b 0a 20 iCol>0xffff ){.
9c20: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 resolveOu
9c30: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50 tOfRangeError(pP
9c40: 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31 arse, zType, i+1
9c50: 2c 20 6e 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 , nResult);.
9c60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
9c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 }. pIte
9c80: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 m->u.x.iOrderByC
9c90: 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a ol = (u16)iCol;.
9ca0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a continue;.
9cb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 }.. /* Ot
9cc0: 68 65 72 77 69 73 65 2c 20 74 72 65 61 74 20 74 herwise, treat t
9cd0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d he ORDER BY term
9ce0: 20 61 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 as an ordinary
9cf0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 expression */.
9d00: 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 pItem->u.x.iOr
9d10: 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 derByCol = 0;.
9d20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 if( sqlite3Res
9d30: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e olveExprNames(pN
9d40: 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 C, pE) ){.
9d50: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a return 1;. }.
9d60: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 for(j=0; j<p
9d70: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e Select->pEList->
9d80: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 nExpr; j++){.
9d90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 if( sqlite3Ex
9da0: 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 53 prCompare(pE, pS
9db0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 elect->pEList->a
9dc0: 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31 29 3d 3d [j].pExpr, -1)==
9dd0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 0 ){. pIt
9de0: 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 em->u.x.iOrderBy
9df0: 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 Col = j+1;.
9e00: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 }. }. }. r
9e10: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65 73 eturn sqlite3Res
9e20: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 olveOrderGroupBy
9e30: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 (pParse, pSelect
9e40: 2c 20 70 4f 72 64 65 72 42 79 2c 20 7a 54 79 70 , pOrderBy, zTyp
9e50: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 e);.}../*.** Res
9e60: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 olve names in th
9e70: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 e SELECT stateme
9e80: 6e 74 20 70 20 61 6e 64 20 61 6c 6c 20 6f 66 20 nt p and all of
9e90: 69 74 73 20 64 65 73 63 65 6e 64 61 6e 74 73 2e its descendants.
9ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 .*/.static int r
9eb0: 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70 esolveSelectStep
9ec0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 (Walker *pWalker
9ed0: 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 , Select *p){.
9ee0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 NameContext *pOu
9ef0: 74 65 72 4e 43 3b 20 20 2f 2a 20 43 6f 6e 74 65 terNC; /* Conte
9f00: 78 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 xt that contains
9f10: 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a this SELECT */.
9f20: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e NameContext sN
9f30: 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d C; /* Nam
9f40: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 69 e context of thi
9f50: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e s SELECT */. in
9f60: 74 20 69 73 43 6f 6d 70 6f 75 6e 64 3b 20 20 20 t isCompound;
9f70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 /* True if
9f80: 20 70 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 p is a compound
9f90: 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 select */. int
9fa0: 20 6e 43 6f 6d 70 6f 75 6e 64 3b 20 20 20 20 20 nCompound;
9fb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
9fc0: 66 20 63 6f 6d 70 6f 75 6e 64 20 74 65 72 6d 73 f compound terms
9fd0: 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61 processed so fa
9fe0: 72 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 r */. Parse *pP
9ff0: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 2f arse; /
a000: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 * Parsing contex
a010: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 t */. int i;
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
a030: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a * Loop counter *
a040: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 /. ExprList *pG
a050: 72 6f 75 70 42 79 3b 20 20 20 20 20 2f 2a 20 54 roupBy; /* T
a060: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 he GROUP BY clau
a070: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a se */. Select *
a080: 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20 20 20 pLeftmost;
a090: 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 6f 66 20 /* Left-most of
a0a0: 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 SELECT of a comp
a0b0: 6f 75 6e 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 ound */. sqlite
a0c0: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 3 *db;
a0d0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f /* Database co
a0e0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 0a 0a nnection */. ..
a0f0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 assert( p!=0 )
a100: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c ;. if( p->selFl
a110: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 ags & SF_Resolve
a120: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 d ){. return
a130: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 WRC_Prune;. }.
a140: 20 70 4f 75 74 65 72 4e 43 20 3d 20 70 57 61 6c pOuterNC = pWal
a150: 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 70 50 ker->u.pNC;. pP
a160: 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e arse = pWalker->
a170: 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 pParse;. db = p
a180: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a Parse->db;.. /*
a190: 20 4e 6f 72 6d 61 6c 6c 79 20 73 71 6c 69 74 65 Normally sqlite
a1a0: 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 3SelectExpand()
a1b0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 will be called f
a1c0: 69 72 73 74 20 61 6e 64 20 77 69 6c 6c 20 68 61 irst and will ha
a1d0: 76 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 ve. ** already
a1e0: 65 78 70 61 6e 64 65 64 20 74 68 69 73 20 53 45 expanded this SE
a1f0: 4c 45 43 54 2e 20 20 48 6f 77 65 76 65 72 2c 20 LECT. However,
a200: 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62 if this is a sub
a210: 71 75 65 72 79 20 77 69 74 68 69 6e 0a 20 20 2a query within. *
a220: 2a 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c * an expression,
a230: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 sqlite3ResolveE
a240: 78 70 72 4e 61 6d 65 73 28 29 20 77 69 6c 6c 20 xprNames() will
a250: 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 6f 75 be called withou
a260: 74 20 61 0a 20 20 2a 2a 20 70 72 69 6f 72 20 63 t a. ** prior c
a270: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 65 all to sqlite3Se
a280: 6c 65 63 74 45 78 70 61 6e 64 28 29 2e 20 20 57 lectExpand(). W
a290: 68 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73 hen that happens
a2a0: 2c 20 6c 65 74 0a 20 20 2a 2a 20 73 71 6c 69 74 , let. ** sqlit
a2b0: 65 33 53 65 6c 65 63 74 50 72 65 70 28 29 20 64 e3SelectPrep() d
a2c0: 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 70 72 6f o all of the pro
a2d0: 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 cessing for this
a2e0: 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2a 20 73 71 SELECT.. ** sq
a2f0: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 lite3SelectPrep(
a300: 29 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 62 6f ) will invoke bo
a310: 74 68 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 th sqlite3Select
a320: 45 78 70 61 6e 64 28 29 20 61 6e 64 0a 20 20 2a Expand() and. *
a330: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * this routine i
a340: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 n the correct or
a350: 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 der.. */. if(
a360: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 (p->selFlags & S
a370: 46 5f 45 78 70 61 6e 64 65 64 29 3d 3d 30 20 29 F_Expanded)==0 )
a380: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c {. sqlite3Sel
a390: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 ectPrep(pParse,
a3a0: 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 p, pOuterNC);.
a3b0: 20 20 72 65 74 75 72 6e 20 28 70 50 61 72 73 65 return (pParse
a3c0: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 ->nErr || db->ma
a3d0: 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52 llocFailed) ? WR
a3e0: 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f 50 72 C_Abort : WRC_Pr
a3f0: 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 69 73 43 6f une;. }.. isCo
a400: 6d 70 6f 75 6e 64 20 3d 20 70 2d 3e 70 50 72 69 mpound = p->pPri
a410: 6f 72 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70 6f 75 or!=0;. nCompou
a420: 6e 64 20 3d 20 30 3b 0a 20 20 70 4c 65 66 74 6d nd = 0;. pLeftm
a430: 6f 73 74 20 3d 20 70 3b 0a 20 20 77 68 69 6c 65 ost = p;. while
a440: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 ( p ){. asser
a450: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 t( (p->selFlags
a460: 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d & SF_Expanded)!=
a470: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 0 );. assert(
a480: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 (p->selFlags &
a490: 53 46 5f 52 65 73 6f 6c 76 65 64 29 3d 3d 30 20 SF_Resolved)==0
a4a0: 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 );. p->selFla
a4b0: 67 73 20 7c 3d 20 53 46 5f 52 65 73 6f 6c 76 65 gs |= SF_Resolve
a4c0: 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c d;.. /* Resol
a4d0: 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f ve the expressio
a4e0: 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 ns in the LIMIT
a4f0: 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 and OFFSET claus
a500: 65 73 2e 20 54 68 65 73 65 0a 20 20 20 20 2a 2a es. These. **
a510: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 are not allowed
a520: 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79 to refer to any
a530: 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 names, so pass
a540: 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e an empty NameCon
a550: 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 text.. */.
a560: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c memset(&sNC, 0,
a570: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 sizeof(sNC));.
a580: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 sNC.pParse =
a590: 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66 28 20 pParse;. if(
a5a0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 sqlite3ResolveEx
a5b0: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d prNames(&sNC, p-
a5c0: 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 >pLimit) ||.
a5d0: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c sqlite3Resol
a5e0: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 veExprNames(&sNC
a5f0: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b , p->pOffset) ){
a600: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 . return WR
a610: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a C_Abort;. }..
a620: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53 46 /* If the SF
a630: 5f 43 6f 6e 76 65 72 74 65 64 20 66 6c 61 67 73 _Converted flags
a640: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 is set, then th
a650: 69 73 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 is Select object
a660: 20 77 61 73 0a 20 20 20 20 2a 2a 20 77 61 73 20 was. ** was
a670: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 63 created by the c
a680: 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 onvertCompoundSe
a690: 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 29 lectToSubquery()
a6a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a function.. *
a6b0: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 * In this case t
a6c0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 he ORDER BY clau
a6d0: 73 65 20 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 se (p->pOrderBy)
a6e0: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 73 6f 6c should be resol
a6f0: 76 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 69 66 ved. ** as if
a700: 20 69 74 20 77 65 72 65 20 70 61 72 74 20 6f 66 it were part of
a710: 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2c 20 the sub-query,
a720: 6e 6f 74 20 74 68 65 20 70 61 72 65 6e 74 2e 20 not the parent.
a730: 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 20 20 2a This block. *
a740: 2a 20 6d 6f 76 65 73 20 74 68 65 20 70 4f 72 64 * moves the pOrd
a750: 65 72 42 79 20 64 6f 77 6e 20 74 6f 20 74 68 65 erBy down to the
a760: 20 73 75 62 2d 71 75 65 72 79 2e 20 49 74 20 77 sub-query. It w
a770: 69 6c 6c 20 62 65 20 6d 6f 76 65 64 20 62 61 63 ill be moved bac
a780: 6b 0a 20 20 20 20 2a 2a 20 61 66 74 65 72 20 74 k. ** after t
a790: 68 65 20 6e 61 6d 65 73 20 68 61 76 65 20 62 65 he names have be
a7a0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 2a 2f en resolved. */
a7b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 . if( p->selF
a7c0: 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 lags & SF_Conver
a7d0: 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65 6c ted ){. Sel
a7e0: 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e 70 ect *pSub = p->p
a7f0: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 Src->a[0].pSelec
a800: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 t;. assert(
a810: 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3d 3d p->pSrc->nSrc==
a820: 31 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 1 && p->pOrderBy
a830: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 );. assert
a840: 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 26 ( pSub->pPrior &
a850: 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 & pSub->pOrderBy
a860: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 75 ==0 );. pSu
a870: 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d b->pOrderBy = p-
a880: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 >pOrderBy;.
a890: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 p->pOrderBy = 0
a8a0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f ;. }. . /
a8b0: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 72 65 * Recursively re
a8c0: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 solve names in a
a8d0: 6c 6c 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 ll subqueries.
a8e0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 */. for(i=0
a8f0: 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 ; i<p->pSrc->nSr
a900: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 c; i++){. s
a910: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 truct SrcList_it
a920: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e em *pItem = &p->
a930: 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 pSrc->a[i];.
a940: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 if( pItem->pSe
a950: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 lect ){.
a960: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 NameContext *pNC
a970: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 ; /* Use
a980: 64 20 74 6f 20 69 74 65 72 61 74 65 20 6e 61 6d d to iterate nam
a990: 65 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 e contexts */.
a9a0: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d int nRef =
a9b0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
a9c0: 2f 2a 20 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 /* Refcount for
a9d0: 70 4f 75 74 65 72 4e 43 20 61 6e 64 20 6f 75 74 pOuterNC and out
a9e0: 65 72 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 er contexts */.
a9f0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 const cha
aa00: 72 20 2a 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 r *zSavedContext
aa10: 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 = pParse->zAuth
aa20: 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 20 20 Context;..
aa30: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 74 /* Count the t
aa40: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 otal number of r
aa50: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 4f 75 eferences to pOu
aa60: 74 65 72 4e 43 20 61 6e 64 20 61 6c 6c 20 6f 66 terNC and all of
aa70: 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 its. **
aa80: 70 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 73 2e parent contexts.
aa90: 20 41 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67 After resolving
aaa0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 65 references to e
aab0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 0a 20 20 xpressions in.
aac0: 20 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e ** pItem->
aad0: 70 53 65 6c 65 63 74 2c 20 63 68 65 63 6b 20 69 pSelect, check i
aae0: 66 20 74 68 69 73 20 76 61 6c 75 65 20 68 61 73 f this value has
aaf0: 20 63 68 61 6e 67 65 64 2e 20 49 66 20 73 6f 2c changed. If so,
ab00: 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a then. **
ab10: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e SELECT statemen
ab20: 74 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 t pItem->pSelect
ab30: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 65 6c 61 must be correla
ab40: 74 65 64 2e 20 53 65 74 20 74 68 65 0a 20 20 20 ted. Set the.
ab50: 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 66 ** pItem->f
ab60: 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 66 g.isCorrelated f
ab70: 6c 61 67 20 69 66 20 74 68 69 73 20 69 73 20 74 lag if this is t
ab80: 68 65 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 he case. */.
ab90: 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74 for(pNC=pOut
aba0: 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70 erNC; pNC; pNC=p
abb0: 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66 20 NC->pNext) nRef
abc0: 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 0a 20 += pNC->nRef;..
abd0: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d if( pItem
abe0: 2d 3e 7a 4e 61 6d 65 20 29 20 70 50 61 72 73 65 ->zName ) pParse
abf0: 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d ->zAuthContext =
ac00: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 pItem->zName;.
ac10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 sqlite3Re
ac20: 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 solveSelectNames
ac30: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e (pParse, pItem->
ac40: 70 53 65 6c 65 63 74 2c 20 70 4f 75 74 65 72 4e pSelect, pOuterN
ac50: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 C);. pPar
ac60: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 se->zAuthContext
ac70: 20 3d 20 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 = zSavedContext
ac80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 ;. if( pP
ac90: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 arse->nErr || db
aca0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
acb0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 return WRC_Abor
acc0: 74 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 t;.. for(
acd0: 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e pNC=pOuterNC; pN
ace0: 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78 C; pNC=pNC->pNex
acf0: 74 29 20 6e 52 65 66 20 2d 3d 20 70 4e 43 2d 3e t) nRef -= pNC->
ad00: 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 61 73 nRef;. as
ad10: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e sert( pItem->fg.
ad20: 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 isCorrelated==0
ad30: 26 26 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20 && nRef<=0 );.
ad40: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e pItem->fg.
ad50: 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 28 isCorrelated = (
ad60: 6e 52 65 66 21 3d 30 29 3b 0a 20 20 20 20 20 20 nRef!=0);.
ad70: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f }. }. . /
ad80: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 * Set up the loc
ad90: 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 al name-context
ada0: 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69 74 to pass to sqlit
adb0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d e3ResolveExprNam
adc0: 65 73 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 es() to. ** r
add0: 65 73 6f 6c 76 65 20 74 68 65 20 72 65 73 75 6c esolve the resul
ade0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e t-set expression
adf0: 20 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 list.. */.
ae00: 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 sNC.ncFlags =
ae10: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 NC_AllowAgg;.
ae20: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 sNC.pSrcList =
ae30: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 73 4e 43 p->pSrc;. sNC
ae40: 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e .pNext = pOuterN
ae50: 43 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73 C;. . /* Res
ae60: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 olve names in th
ae70: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f e result set. */
ae80: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 . if( sqlite3
ae90: 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e ResolveExprListN
aea0: 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 45 ames(&sNC, p->pE
aeb0: 4c 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 57 List) ) return W
aec0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 0a 20 20 20 RC_Abort;. .
aed0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 /* If there are
aee0: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75 no aggregate fu
aef0: 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 nctions in the r
af00: 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e esult-set, and n
af10: 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 20 20 o GROUP BY .
af20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 ** expression, d
af30: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 o not allow aggr
af40: 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 egates in any of
af50: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 the other expre
af60: 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 ssions.. */.
af70: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 assert( (p->s
af80: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67 elFlags & SF_Agg
af90: 72 65 67 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 regate)==0 );.
afa0: 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e pGroupBy = p->
afb0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 pGroupBy;. if
afc0: 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 28 73 ( pGroupBy || (s
afd0: 4e 43 2e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f NC.ncFlags & NC_
afe0: 48 61 73 41 67 67 29 21 3d 30 20 29 7b 0a 20 20 HasAgg)!=0 ){.
aff0: 20 20 20 20 61 73 73 65 72 74 28 20 4e 43 5f 4d assert( NC_M
b000: 69 6e 4d 61 78 41 67 67 3d 3d 53 46 5f 4d 69 6e inMaxAgg==SF_Min
b010: 4d 61 78 41 67 67 20 29 3b 0a 20 20 20 20 20 20 MaxAgg );.
b020: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 p->selFlags |= S
b030: 46 5f 41 67 67 72 65 67 61 74 65 20 7c 20 28 73 F_Aggregate | (s
b040: 4e 43 2e 6e 63 46 6c 61 67 73 26 4e 43 5f 4d 69 NC.ncFlags&NC_Mi
b050: 6e 4d 61 78 41 67 67 29 3b 0a 20 20 20 20 7d 65 nMaxAgg);. }e
b060: 6c 73 65 7b 0a 20 20 20 20 20 20 73 4e 43 2e 6e lse{. sNC.n
b070: 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c cFlags &= ~NC_Al
b080: 6c 6f 77 41 67 67 3b 0a 20 20 20 20 7d 0a 20 20 lowAgg;. }.
b090: 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 48 41 56 . /* If a HAV
b0a0: 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 ING clause is pr
b0b0: 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 esent, then ther
b0c0: 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 e must be a GROU
b0d0: 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 P BY clause..
b0e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 */. if( p->p
b0f0: 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75 Having && !pGrou
b100: 70 42 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c pBy ){. sql
b110: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 ite3ErrorMsg(pPa
b120: 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 rse, "a GROUP BY
b130: 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 clause is requi
b140: 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e red before HAVIN
b150: 47 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 G");. retur
b160: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 n WRC_Abort;.
b170: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 }. . /* Add
b180: 20 74 68 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 the output colu
b190: 6d 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e mn list to the n
b1a0: 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f ame-context befo
b1b0: 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 re parsing the.
b1c0: 20 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 ** other expr
b1d0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 essions in the S
b1e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e ELECT statement.
b1f0: 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 This is so that
b200: 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 . ** expressi
b210: 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 ons in the WHERE
b220: 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 clause (etc.) c
b230: 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 an refer to expr
b240: 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 20 20 2a essions by. *
b250: 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 * aliases in the
b260: 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 20 result set..
b270: 20 2a 2a 0a 20 20 20 20 2a 2a 20 4d 69 6e 6f 72 **. ** Minor
b280: 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20 point: If this
b290: 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 is the case, the
b2a0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e n the expression
b2b0: 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 will be. **
b2c0: 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72 re-evaluated for
b2d0: 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20 each reference
b2e0: 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 to it.. */.
b2f0: 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 sNC.pEList = p
b300: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 ->pEList;. if
b310: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 ( sqlite3Resolve
b320: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 ExprNames(&sNC,
b330: 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 20 72 65 p->pHaving) ) re
b340: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a turn WRC_Abort;.
b350: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 if( sqlite3R
b360: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 esolveExprNames(
b370: 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 &sNC, p->pWhere)
b380: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 ) return WRC_Ab
b390: 6f 72 74 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 ort;.. /* Res
b3a0: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 61 olve names in ta
b3b0: 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 ble-valued-funct
b3c0: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f ion arguments */
b3d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
b3e0: 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 p->pSrc->nSrc; i
b3f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 ++){. struc
b400: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a t SrcList_item *
b410: 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 pItem = &p->pSrc
b420: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 ->a[i];. if
b430: 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 ( pItem->fg.isTa
b440: 62 46 75 6e 63 0a 20 20 20 20 20 20 20 26 26 20 bFunc. &&
b450: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 sqlite3ResolveEx
b460: 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 prListNames(&sNC
b470: 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e , pItem->u1.pFun
b480: 63 41 72 67 29 20 0a 20 20 20 20 20 20 29 7b 0a cArg) . ){.
b490: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 return W
b4a0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 RC_Abort;.
b4b0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
b4c0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 The ORDER BY and
b4d0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 GROUP BY clause
b4e0: 73 20 6d 61 79 20 6e 6f 74 20 72 65 66 65 72 20 s may not refer
b4f0: 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20 20 20 20 to terms in.
b500: 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 69 65 73 ** outer queries
b510: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 . */. sNC
b520: 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 .pNext = 0;.
b530: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e sNC.ncFlags |= N
b540: 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 0a 20 20 20 C_AllowAgg;..
b550: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 /* If this is a
b560: 20 63 6f 6e 76 65 72 74 65 64 20 63 6f 6d 70 6f converted compo
b570: 75 6e 64 20 71 75 65 72 79 2c 20 6d 6f 76 65 20 und query, move
b580: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 the ORDER BY cla
b590: 75 73 65 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a use from . **
b5a0: 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 62 the sub-query b
b5b0: 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e ack to the paren
b5c0: 74 20 71 75 65 72 79 2e 20 41 74 20 74 68 69 73 t query. At this
b5d0: 20 70 6f 69 6e 74 20 65 61 63 68 20 74 65 72 6d point each term
b5e0: 0a 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 . ** within t
b5f0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 he ORDER BY clau
b600: 73 65 20 68 61 73 20 62 65 65 6e 20 74 72 61 6e se has been tran
b610: 73 66 6f 72 6d 65 64 20 74 6f 20 61 6e 20 69 6e sformed to an in
b620: 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 20 20 20 teger value..
b630: 20 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 ** These intege
b640: 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 rs will be repla
b650: 63 65 64 20 62 79 20 63 6f 70 69 65 73 20 6f 66 ced by copies of
b660: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 the correspondi
b670: 6e 67 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a ng result. **
b680: 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 set expressions
b690: 20 62 79 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 by the call to
b6a0: 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 resolveOrderGrou
b6b0: 70 42 79 28 29 20 62 65 6c 6f 77 2e 20 20 2a 2f pBy() below. */
b6c0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 . if( p->selF
b6d0: 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 lags & SF_Conver
b6e0: 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65 6c ted ){. Sel
b6f0: 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e 70 ect *pSub = p->p
b700: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 Src->a[0].pSelec
b710: 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 t;. p->pOrd
b720: 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 erBy = pSub->pOr
b730: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 derBy;. pSu
b740: 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b b->pOrderBy = 0;
b750: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 . }.. /* P
b760: 72 6f 63 65 73 73 20 74 68 65 20 4f 52 44 45 52 rocess the ORDER
b770: 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 73 BY clause for s
b780: 69 6e 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54 20 ingleton SELECT
b790: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 statements..
b7a0: 2a 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 ** The ORDER BY
b7b0: 63 6c 61 75 73 65 20 66 6f 72 20 63 6f 6d 70 6f clause for compo
b7c0: 75 6e 64 73 20 53 45 4c 45 43 54 20 73 74 61 74 unds SELECT stat
b7d0: 65 6d 65 6e 74 73 20 69 73 20 68 61 6e 64 6c 65 ements is handle
b7e0: 64 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 d. ** below,
b7f0: 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 after all of the
b800: 20 72 65 73 75 6c 74 2d 73 65 74 73 20 66 6f 72 result-sets for
b810: 20 61 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65 6d all of the elem
b820: 65 6e 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 ents of. ** t
b830: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 he compound have
b840: 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a been resolved..
b850: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 **. ** If
b860: 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 there is an ORD
b870: 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 ER BY clause on
b880: 61 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 a term of a comp
b890: 6f 75 6e 64 2d 73 65 6c 65 63 74 20 6f 74 68 65 ound-select othe
b8a0: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 r. ** than th
b8b0: 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 74 65 72 e right-most ter
b8c0: 6d 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 m, then that is
b8d0: 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 a syntax error.
b8e0: 20 42 75 74 20 74 68 65 20 65 72 72 6f 72 0a 20 But the error.
b8f0: 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 74 ** is not det
b900: 65 63 74 65 64 20 75 6e 74 69 6c 20 6d 75 63 68 ected until much
b910: 20 6c 61 74 65 72 2c 20 61 6e 64 20 73 6f 20 77 later, and so w
b920: 65 20 6e 65 65 64 20 74 6f 20 67 6f 20 61 68 65 e need to go ahe
b930: 61 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 72 65 ad and. ** re
b940: 73 6f 6c 76 65 20 74 68 6f 73 65 20 73 79 6d 62 solve those symb
b950: 6f 6c 73 20 6f 6e 20 74 68 65 20 69 6e 63 6f 72 ols on the incor
b960: 72 65 63 74 20 4f 52 44 45 52 20 42 59 20 66 6f rect ORDER BY fo
b970: 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 2e 0a 20 r consistency..
b980: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 */. if( is
b990: 43 6f 6d 70 6f 75 6e 64 3c 3d 6e 43 6f 6d 70 6f Compound<=nCompo
b9a0: 75 6e 64 20 20 2f 2a 20 44 65 66 65 72 20 72 69 und /* Defer ri
b9b0: 67 68 74 2d 6d 6f 73 74 20 4f 52 44 45 52 20 42 ght-most ORDER B
b9c0: 59 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 Y of a compound
b9d0: 2a 2f 0a 20 20 20 20 20 26 26 20 72 65 73 6f 6c */. && resol
b9e0: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 veOrderGroupBy(&
b9f0: 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 sNC, p, p->pOrde
ba00: 72 42 79 2c 20 22 4f 52 44 45 52 22 29 0a 20 20 rBy, "ORDER").
ba10: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 ){. retur
ba20: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 n WRC_Abort;.
ba30: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d }. if( db->m
ba40: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 allocFailed ){.
ba50: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f return WRC_
ba60: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a Abort;. }. .
ba70: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 /* Resolve t
ba80: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 he GROUP BY clau
ba90: 73 65 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65 se. At the same
baa0: 20 74 69 6d 65 2c 20 6d 61 6b 65 20 73 75 72 65 time, make sure
bab0: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 47 52 4f . ** the GRO
bac0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 UP BY clause doe
bad0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 s not contain ag
bae0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e gregate function
baf0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 s.. */. if
bb00: 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 ( pGroupBy ){.
bb10: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c struct ExprL
bb20: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b ist_item *pItem;
bb30: 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 . . if(
bb40: 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 resolveOrderGrou
bb50: 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 47 72 pBy(&sNC, p, pGr
bb60: 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 20 oupBy, "GROUP")
bb70: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 || db->mallocFai
bb80: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 led ){. r
bb90: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b eturn WRC_Abort;
bba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 . }. f
bbb0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 or(i=0, pItem=pG
bbc0: 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 roupBy->a; i<pGr
bbd0: 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b oupBy->nExpr; i+
bbe0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 +, pItem++){.
bbf0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 if( ExprHas
bc00: 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e Property(pItem->
bc10: 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 pExpr, EP_Agg) )
bc20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 {. sqli
bc30: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 te3ErrorMsg(pPar
bc40: 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 se, "aggregate f
bc50: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 unctions are not
bc60: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 allowed in ".
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65 "the
bc80: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 GROUP BY clause
bc90: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 ");. re
bca0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a turn WRC_Abort;.
bcb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
bcc0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
bcd0: 49 66 20 74 68 69 73 20 69 73 20 70 61 72 74 20 If this is part
bce0: 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 of a compound SE
bcf0: 4c 45 43 54 2c 20 63 68 65 63 6b 20 74 68 61 74 LECT, check that
bd00: 20 69 74 20 68 61 73 20 74 68 65 20 72 69 67 68 it has the righ
bd10: 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 t. ** number
bd20: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 of expressions i
bd30: 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c 69 73 n the select lis
bd40: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d t. */. if( p-
bd50: 3e 70 4e 65 78 74 20 26 26 20 70 2d 3e 70 45 4c >pNext && p->pEL
bd60: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 2d 3e 70 ist->nExpr!=p->p
bd70: 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 Next->pEList->nE
bd80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c xpr ){. sql
bd90: 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e ite3SelectWrongN
bda0: 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50 61 umTermsError(pPa
bdb0: 72 73 65 2c 20 70 2d 3e 70 4e 65 78 74 29 3b 0a rse, p->pNext);.
bdc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 return WRC
bdd0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 _Abort;. }..
bde0: 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f /* Advance to
bdf0: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 6f the next term o
be00: 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 0a 20 f the compound.
be10: 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 2d */. p = p-
be20: 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 43 6f >pPrior;. nCo
be30: 6d 70 6f 75 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 mpound++;. }..
be40: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 /* Resolve the
be50: 4f 52 44 45 52 20 42 59 20 6f 6e 20 61 20 63 6f ORDER BY on a co
be60: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 66 mpound SELECT af
be70: 74 65 72 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 ter all terms of
be80: 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 . ** the compou
be90: 6e 64 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 nd have been res
bea0: 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 olved.. */. if
beb0: 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 26 26 20 ( isCompound &&
bec0: 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f resolveCompoundO
bed0: 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 rderBy(pParse, p
bee0: 4c 65 66 74 6d 6f 73 74 29 20 29 7b 0a 20 20 20 Leftmost) ){.
bef0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 return WRC_Abor
bf00: 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e t;. }.. return
bf10: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f WRC_Prune;.}../
bf20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
bf30: 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 e walks an expre
bf40: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 ssion tree and r
bf50: 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 esolves referenc
bf60: 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 es to.** table c
bf70: 6f 6c 75 6d 6e 73 20 61 6e 64 20 72 65 73 75 6c olumns and resul
bf80: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 t-set columns.
bf90: 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 At the same time
bfa0: 2c 20 64 6f 20 65 72 72 6f 72 0a 2a 2a 20 63 68 , do error.** ch
bfb0: 65 63 6b 69 6e 67 20 6f 6e 20 66 75 6e 63 74 69 ecking on functi
bfc0: 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 73 65 74 on usage and set
bfd0: 20 61 20 66 6c 61 67 20 69 66 20 61 6e 79 20 61 a flag if any a
bfe0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f ggregate functio
bff0: 6e 73 0a 2a 2a 20 61 72 65 20 73 65 65 6e 2e 0a ns.** are seen..
c000: 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 **.** To resolve
c010: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 72 table columns r
c020: 65 66 65 72 65 6e 63 65 73 20 77 65 20 6c 6f 6f eferences we loo
c030: 6b 20 66 6f 72 20 6e 6f 64 65 73 20 28 6f 72 20 k for nodes (or
c040: 73 75 62 74 72 65 65 73 29 20 6f 66 20 74 68 65 subtrees) of the
c050: 20 0a 2a 2a 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 .** form X.Y.Z
c060: 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a or Y.Z or just Z
c070: 20 77 68 65 72 65 0a 2a 2a 0a 2a 2a 20 20 20 20 where.**.**
c080: 20 20 58 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 X: The name
c090: 6f 66 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 of a database.
c0a0: 45 78 3a 20 20 22 6d 61 69 6e 22 20 6f 72 20 22 Ex: "main" or "
c0b0: 74 65 6d 70 22 20 6f 72 0a 2a 2a 20 20 20 20 20 temp" or.**
c0c0: 20 20 20 20 20 20 74 68 65 20 73 79 6d 62 6f 6c the symbol
c0d0: 69 63 20 6e 61 6d 65 20 61 73 73 69 67 6e 65 64 ic name assigned
c0e0: 20 74 6f 20 61 6e 20 41 54 54 41 43 48 2d 65 64 to an ATTACH-ed
c0f0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a database..**.**
c100: 20 20 20 20 20 20 59 3a 20 20 20 54 68 65 20 6e Y: The n
c110: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69 ame of a table i
c120: 6e 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e n a FROM clause.
c130: 20 20 4f 72 20 69 6e 20 61 20 74 72 69 67 67 65 Or in a trigge
c140: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f r.** o
c150: 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 ne of the specia
c160: 6c 20 6e 61 6d 65 73 20 22 6f 6c 64 22 20 6f 72 l names "old" or
c170: 20 22 6e 65 77 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 "new"..**.**
c180: 20 20 20 5a 3a 20 20 20 54 68 65 20 6e 61 6d 65 Z: The name
c190: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 of a column in
c1a0: 74 61 62 6c 65 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 table Y..**.** T
c1b0: 68 65 20 6e 6f 64 65 20 61 74 20 74 68 65 20 72 he node at the r
c1c0: 6f 6f 74 20 6f 66 20 74 68 65 20 73 75 62 74 72 oot of the subtr
c1d0: 65 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 61 ee is modified a
c1e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a s follows:.**.**
c1f0: 20 20 20 20 45 78 70 72 2e 6f 70 20 20 20 20 20 Expr.op
c200: 20 20 20 43 68 61 6e 67 65 64 20 74 6f 20 54 4b Changed to TK
c210: 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 45 78 _COLUMN.** Ex
c220: 70 72 2e 70 54 61 62 20 20 20 20 20 20 50 6f 69 pr.pTab Poi
c230: 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c 65 nts to the Table
c240: 20 6f 62 6a 65 63 74 20 66 6f 72 20 58 2e 59 0a object for X.Y.
c250: 2a 2a 20 20 20 20 45 78 70 72 2e 69 43 6f 6c 75 ** Expr.iColu
c260: 6d 6e 20 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 mn The column
c270: 69 6e 64 65 78 20 69 6e 20 58 2e 59 2e 20 20 2d index in X.Y. -
c280: 31 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 2e 1 for the rowid.
c290: 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 54 61 62 .** Expr.iTab
c2a0: 6c 65 20 20 20 20 54 68 65 20 56 44 42 45 20 63 le The VDBE c
c2b0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 ursor number for
c2c0: 20 58 2e 59 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 6f X.Y.**.**.** To
c2d0: 20 72 65 73 6f 6c 76 65 20 72 65 73 75 6c 74 2d resolve result-
c2e0: 73 65 74 20 72 65 66 65 72 65 6e 63 65 73 2c 20 set references,
c2f0: 6c 6f 6f 6b 20 66 6f 72 20 65 78 70 72 65 73 73 look for express
c300: 69 6f 6e 20 6e 6f 64 65 73 20 6f 66 20 74 68 65 ion nodes of the
c310: 0a 2a 2a 20 66 6f 72 6d 20 5a 20 28 77 69 74 68 .** form Z (with
c320: 20 6e 6f 20 58 20 61 6e 64 20 59 20 70 72 65 66 no X and Y pref
c330: 69 78 29 20 77 68 65 72 65 20 74 68 65 20 5a 20 ix) where the Z
c340: 6d 61 74 63 68 65 73 20 74 68 65 20 72 69 67 68 matches the righ
c350: 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 7a 65 20 6f t-hand.** size o
c360: 66 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 69 f an AS clause i
c370: 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 n the result-set
c380: 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 20 20 54 of a SELECT. T
c390: 68 65 20 5a 20 65 78 70 72 65 73 73 69 6f 6e 0a he Z expression.
c3a0: 2a 2a 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 ** is replaced b
c3b0: 79 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 y a copy of the
c3c0: 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f left-hand side o
c3d0: 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 f the result-set
c3e0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 expression..**
c3f0: 54 61 62 6c 65 2d 6e 61 6d 65 20 61 6e 64 20 66 Table-name and f
c400: 75 6e 63 74 69 6f 6e 20 72 65 73 6f 6c 75 74 69 unction resoluti
c410: 6f 6e 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 on occurs on the
c420: 20 73 75 62 73 74 69 74 75 74 65 64 20 65 78 70 substituted exp
c430: 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e ression.** tree.
c440: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 For example, i
c450: 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 n:.**.** SE
c460: 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20 63 LECT a+b AS x, c
c470: 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 +d AS y FROM t1
c480: 4f 52 44 45 52 20 42 59 20 78 3b 0a 2a 2a 0a 2a ORDER BY x;.**.*
c490: 2a 20 54 68 65 20 22 78 22 20 74 65 72 6d 20 6f * The "x" term o
c4a0: 66 20 74 68 65 20 6f 72 64 65 72 20 62 79 20 69 f the order by i
c4b0: 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 22 61 s replaced by "a
c4c0: 2b 62 22 20 74 6f 20 72 65 6e 64 65 72 3a 0a 2a +b" to render:.*
c4d0: 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 *.** SELECT
c4e0: 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20 41 a+b AS x, c+d A
c4f0: 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 S y FROM t1 ORDE
c500: 52 20 42 59 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a 20 R BY a+b;.**.**
c510: 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 61 Function calls a
c520: 72 65 20 63 68 65 63 6b 65 64 20 74 6f 20 6d 61 re checked to ma
c530: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 ke sure that the
c540: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a function is .**
c550: 20 64 65 66 69 6e 65 64 20 61 6e 64 20 74 68 61 defined and tha
c560: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 t the correct nu
c570: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
c580: 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e s are specified.
c590: 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 .** If the funct
c5a0: 69 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 ion is an aggreg
c5b0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 ate function, th
c5c0: 65 6e 20 74 68 65 20 4e 43 5f 48 61 73 41 67 67 en the NC_HasAgg
c5d0: 20 66 6c 61 67 20 69 73 0a 2a 2a 20 73 65 74 20 flag is.** set
c5e0: 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 20 69 and the opcode i
c5f0: 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 54 s changed from T
c600: 4b 5f 46 55 4e 43 54 49 4f 4e 20 74 6f 20 54 4b K_FUNCTION to TK
c610: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a _AGG_FUNCTION..*
c620: 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 * If an expressi
c630: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 on contains aggr
c640: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 egate functions
c650: 74 68 65 6e 20 74 68 65 20 45 50 5f 41 67 67 0a then the EP_Agg.
c660: 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 74 ** property on t
c670: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 he expression is
c680: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 set..**.** An e
c690: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 rror message is
c6a0: 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65 20 69 left in pParse i
c6b0: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d f anything is am
c6c0: 69 73 73 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 iss. The number
c6d0: 0a 2a 2a 20 69 66 20 65 72 72 6f 72 73 20 69 73 .** if errors is
c6e0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e returned..*/.in
c6f0: 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 t sqlite3Resolve
c700: 45 78 70 72 4e 61 6d 65 73 28 20 0a 20 20 4e 61 ExprNames( . Na
c710: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 meContext *pNC,
c720: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 /* Namespa
c730: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 ce to resolve ex
c740: 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f pressions in. */
c750: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 . Expr *pExpr
c760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
c770: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 e expression to
c780: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a be analyzed. */.
c790: 29 7b 0a 20 20 75 31 36 20 73 61 76 65 64 48 61 ){. u16 savedHa
c7a0: 73 41 67 67 3b 0a 20 20 57 61 6c 6b 65 72 20 77 sAgg;. Walker w
c7b0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d ;.. if( pExpr==
c7c0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 0 ) return 0;.#i
c7d0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 f SQLITE_MAX_EXP
c7e0: 52 5f 44 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 R_DEPTH>0. {.
c7f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 Parse *pParse
c800: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 = pNC->pParse;.
c810: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 if( sqlite3Ex
c820: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 prCheckHeight(pP
c830: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 6e 48 65 arse, pExpr->nHe
c840: 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 ight+pNC->pParse
c850: 2d 3e 6e 48 65 69 67 68 74 29 20 29 7b 0a 20 20 ->nHeight) ){.
c860: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
c870: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e }. pParse->
c880: 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78 70 72 nHeight += pExpr
c890: 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 7d 0a 23 ->nHeight;. }.#
c8a0: 65 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61 73 endif. savedHas
c8b0: 41 67 67 20 3d 20 70 4e 43 2d 3e 6e 63 46 6c 61 Agg = pNC->ncFla
c8c0: 67 73 20 26 20 28 4e 43 5f 48 61 73 41 67 67 7c gs & (NC_HasAgg|
c8d0: 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a 20 NC_MinMaxAgg);.
c8e0: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d pNC->ncFlags &=
c8f0: 20 7e 28 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f ~(NC_HasAgg|NC_
c900: 4d 69 6e 4d 61 78 41 67 67 29 3b 0a 20 20 77 2e MinMaxAgg);. w.
c910: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 pParse = pNC->pP
c920: 61 72 73 65 3b 0a 20 20 77 2e 78 45 78 70 72 43 arse;. w.xExprC
c930: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 allback = resolv
c940: 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 eExprStep;. w.x
c950: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d SelectCallback =
c960: 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 resolveSelectSt
c970: 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 ep;. w.xSelectC
c980: 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 allback2 = 0;.
c990: 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d 20 w.walkerDepth =
c9a0: 30 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20 30 0;. w.eCode = 0
c9b0: 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e ;. w.u.pNC = pN
c9c0: 43 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b C;. sqlite3Walk
c9d0: 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b Expr(&w, pExpr);
c9e0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f .#if SQLITE_MAX_
c9f0: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 70 EXPR_DEPTH>0. p
ca00: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 NC->pParse->nHei
ca10: 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 ght -= pExpr->nH
ca20: 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 eight;.#endif.
ca30: 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 if( pNC->nErr>0
ca40: 7c 7c 20 77 2e 70 50 61 72 73 65 2d 3e 6e 45 72 || w.pParse->nEr
ca50: 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53 r>0 ){. ExprS
ca60: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 etProperty(pExpr
ca70: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d , EP_Error);. }
ca80: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 63 46 6c . if( pNC->ncFl
ca90: 61 67 73 20 26 20 4e 43 5f 48 61 73 41 67 67 20 ags & NC_HasAgg
caa0: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 ){. ExprSetPr
cab0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 operty(pExpr, EP
cac0: 5f 41 67 67 29 3b 0a 20 20 7d 0a 20 20 70 4e 43 _Agg);. }. pNC
cad0: 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 73 61 76 ->ncFlags |= sav
cae0: 65 64 48 61 73 41 67 67 3b 0a 20 20 72 65 74 75 edHasAgg;. retu
caf0: 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 rn ExprHasProper
cb00: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 ty(pExpr, EP_Err
cb10: 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 or);.}../*.** Re
cb20: 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 solve all names
cb30: 66 6f 72 20 61 6c 6c 20 65 78 70 72 65 73 73 69 for all expressi
cb40: 6f 6e 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 on in an express
cb50: 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 69 73 20 ion list. This
cb60: 69 73 0a 2a 2a 20 6a 75 73 74 20 6c 69 6b 65 20 is.** just like
cb70: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 sqlite3ResolveEx
cb80: 70 72 4e 61 6d 65 73 28 29 20 65 78 63 65 70 74 prNames() except
cb90: 20 74 68 61 74 20 69 74 20 77 6f 72 6b 73 20 66 that it works f
cba0: 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e or an expression
cbb0: 0a 2a 2a 20 6c 69 73 74 20 72 61 74 68 65 72 20 .** list rather
cbc0: 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 78 than a single ex
cbd0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 pression..*/.int
cbe0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 sqlite3ResolveE
cbf0: 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 20 0a 20 xprListNames( .
cc00: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e NameContext *pN
cc10: 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 C, /* Name
cc20: 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 space to resolve
cc30: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e expressions in.
cc40: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a */. ExprList *
cc50: 70 4c 69 73 74 20 20 20 20 20 20 20 20 20 2f 2a pList /*
cc60: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 The expression
cc70: 6c 69 73 74 20 74 6f 20 62 65 20 61 6e 61 6c 79 list to be analy
cc80: 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 zed. */.){. int
cc90: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 i;. if( pList
cca0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 ){. for(i=0;
ccb0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 i<pList->nExpr;
ccc0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 i++){. if(
ccd0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 sqlite3ResolveEx
cce0: 70 72 4e 61 6d 65 73 28 70 4e 43 2c 20 70 4c 69 prNames(pNC, pLi
ccf0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 st->a[i].pExpr)
cd00: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f ) return WRC_Abo
cd10: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 rt;. }. }.
cd20: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 return WRC_Conti
cd30: 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 nue;.}../*.** Re
cd40: 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 solve all names
cd50: 69 6e 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f in all expressio
cd60: 6e 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20 61 ns of a SELECT a
cd70: 6e 64 20 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65 63 nd in all.** dec
cd80: 65 6e 64 65 6e 74 73 20 6f 66 20 74 68 65 20 53 endents of the S
cd90: 45 4c 45 43 54 2c 20 69 6e 63 6c 75 64 69 6e 67 ELECT, including
cda0: 20 63 6f 6d 70 6f 75 6e 64 73 20 6f 66 66 20 6f compounds off o
cdb0: 66 20 70 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a 20 f p->pPrior,.**
cdc0: 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 65 78 subqueries in ex
cdd0: 70 72 65 73 73 69 6f 6e 73 2c 20 61 6e 64 20 73 pressions, and s
cde0: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61 ubqueries used a
cdf0: 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a s FROM clause.**
ce00: 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 terms..**.** Se
ce10: 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 e sqlite3Resolve
ce20: 45 78 70 72 4e 61 6d 65 73 28 29 20 66 6f 72 20 ExprNames() for
ce30: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 a description of
ce40: 20 74 68 65 20 6b 69 6e 64 73 20 6f 66 0a 2a 2a the kinds of.**
ce50: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 transformations
ce60: 20 74 68 61 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a that occur..**.
ce70: 2a 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 73 74 ** All SELECT st
ce80: 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 atements should
ce90: 68 61 76 65 20 62 65 65 6e 20 65 78 70 61 6e 64 have been expand
cea0: 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 ed using.** sqli
ceb0: 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 te3SelectExpand(
cec0: 29 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b ) prior to invok
ced0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 ing this routine
cee0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
cef0: 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 3ResolveSelectNa
cf00: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 mes(. Parse *pP
cf10: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a arse, /*
cf20: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 The parser cont
cf30: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 ext */. Select
cf40: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 *p,
cf50: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 /* The SELECT st
cf60: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f atement being co
cf70: 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f ded. */. NameCo
cf80: 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 ntext *pOuterNC
cf90: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 /* Name context
cfa0: 20 66 6f 72 20 70 61 72 65 6e 74 20 53 45 4c 45 for parent SELE
cfb0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a CT statement */.
cfc0: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a ){. Walker w;..
cfd0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 assert( p!=0 )
cfe0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30 ;. memset(&w, 0
cff0: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20 , sizeof(w));.
d000: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 w.xExprCallback
d010: 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65 = resolveExprSte
d020: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 p;. w.xSelectCa
d030: 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 llback = resolve
d040: 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77 2e SelectStep;. w.
d050: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b pParse = pParse;
d060: 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4f 75 . w.u.pNC = pOu
d070: 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69 74 65 33 terNC;. sqlite3
d080: 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 WalkSelect(&w, p
d090: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f );.}../*.** Reso
d0a0: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 65 78 70 lve names in exp
d0b0: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 63 61 ressions that ca
d0c0: 6e 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 n only reference
d0d0: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 3a a single table:
d0e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 43 48 .**.** * CH
d0f0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a ECK constraints.
d100: 2a 2a 20 20 20 20 2a 20 20 20 57 48 45 52 45 20 ** * WHERE
d110: 63 6c 61 75 73 65 73 20 6f 6e 20 70 61 72 74 69 clauses on parti
d120: 61 6c 20 69 6e 64 69 63 65 73 0a 2a 2a 0a 2a 2a al indices.**.**
d130: 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 The Expr.iTable
d140: 20 76 61 6c 75 65 20 66 6f 72 20 45 78 70 72 2e value for Expr.
d150: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f op==TK_COLUMN no
d160: 64 65 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 des of the expre
d170: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 73 65 74 20 ssion.** is set
d180: 74 6f 20 2d 31 20 61 6e 64 20 74 68 65 20 45 78 to -1 and the Ex
d190: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 pr.iColumn value
d1a0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 is set to the c
d1b0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a olumn number..**
d1c0: 0a 2a 2a 20 41 6e 79 20 65 72 72 6f 72 73 20 63 .** Any errors c
d1d0: 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 ause an error me
d1e0: 73 73 61 67 65 20 74 6f 20 62 65 20 73 65 74 20 ssage to be set
d1f0: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f in pParse..*/.vo
d200: 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 id sqlite3Resolv
d210: 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 0a eSelfReference(.
d220: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c Parse *pParse,
d230: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 /* Parsing
d240: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 context */. Ta
d250: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 ble *pTab,
d260: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 /* The table b
d270: 65 69 6e 67 20 72 65 66 65 72 65 6e 63 65 64 20 eing referenced
d280: 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20 20 */. int type,
d290: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 43 5f 49 /* NC_I
d2a0: 73 43 68 65 63 6b 20 6f 72 20 4e 43 5f 50 61 72 sCheck or NC_Par
d2b0: 74 49 64 78 20 6f 72 20 4e 43 5f 49 64 78 45 78 tIdx or NC_IdxEx
d2c0: 70 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 pr */. Expr *pE
d2d0: 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 xpr, /* E
d2e0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 72 65 73 xpression to res
d2f0: 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 olve. May be NU
d300: 4c 4c 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 LL. */. ExprLis
d310: 74 20 2a 70 4c 69 73 74 20 20 20 20 20 2f 2a 20 t *pList /*
d320: 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 Expression list
d330: 74 6f 20 72 65 73 6f 6c 76 65 2e 20 20 4d 61 79 to resolve. May
d340: 20 62 65 20 4e 55 4c 2e 20 2a 2f 0a 29 7b 0a 20 be NUL. */.){.
d350: 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20 SrcList sSrc;
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d370: 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74 /* Fake SrcList
d380: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 for pParse->pNe
d390: 77 54 61 62 6c 65 20 2a 2f 0a 20 20 4e 61 6d 65 wTable */. Name
d3a0: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 Context sNC;
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
d3c0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 ame context for
d3d0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c pParse->pNewTabl
d3e0: 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 e */.. assert(
d3f0: 74 79 70 65 3d 3d 4e 43 5f 49 73 43 68 65 63 6b type==NC_IsCheck
d400: 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f 50 61 72 || type==NC_Par
d410: 74 49 64 78 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 tIdx || type==NC
d420: 5f 49 64 78 45 78 70 72 20 29 3b 0a 20 20 6d 65 _IdxExpr );. me
d430: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 mset(&sNC, 0, si
d440: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 6d 65 zeof(sNC));. me
d450: 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73 mset(&sSrc, 0, s
d460: 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 izeof(sSrc));.
d470: 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 sSrc.nSrc = 1;.
d480: 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 sSrc.a[0].zName
d490: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a = pTab->zName;.
d4a0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 sSrc.a[0].pTab
d4b0: 20 3d 20 70 54 61 62 3b 0a 20 20 73 53 72 63 2e = pTab;. sSrc.
d4c0: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d a[0].iCursor = -
d4d0: 31 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 1;. sNC.pParse
d4e0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e = pParse;. sNC.
d4f0: 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 pSrcList = &sSrc
d500: 3b 0a 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 ;. sNC.ncFlags
d510: 3d 20 74 79 70 65 3b 0a 20 20 69 66 28 20 73 71 = type;. if( sq
d520: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 lite3ResolveExpr
d530: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 45 78 70 Names(&sNC, pExp
d540: 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 r) ) return;. i
d550: 66 28 20 70 4c 69 73 74 20 29 20 73 71 6c 69 74 f( pList ) sqlit
d560: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 e3ResolveExprLis
d570: 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c 69 tNames(&sNC, pLi
d580: 73 74 29 3b 0a 7d 0a st);.}.