/ Hex Artifact Content
Login

Artifact 3e518b962d932a997fae373366880fc028c75706:


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);.}.