/ Hex Artifact Content
Login

Artifact 9aeb0719949bad117e0df9fdd06688a5fa06223b:


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 2a 0a 2a 2a 20 24 49 64 3a 20 72 65 73 6f  .**.** $Id: reso
0220: 6c 76 65 2e 63 2c 76 20 31 2e 36 20 32 30 30 38  lve.c,v 1.6 2008
0230: 2f 31 30 2f 30 36 20 31 33 3a 35 34 3a 33 35 20  /10/06 13:54:35 
0240: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0250: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74  clude "sqliteInt
0260: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
0270: 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  dlib.h>.#include
0280: 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a   <string.h>../*.
0290: 2a 2a 20 54 75 72 6e 20 74 68 65 20 70 45 78 70  ** Turn the pExp
02a0: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 74  r expression int
02b0: 6f 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74  o an alias for t
02c0: 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
02d0: 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 73 75  n of the.** resu
02e0: 6c 74 20 73 65 74 20 69 6e 20 70 45 4c 69 73 74  lt set in pEList
02f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ..**.** If the r
0300: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
0310: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f 6c   is a simple col
0320: 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2c 20 74  umn reference, t
0330: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
0340: 0a 2a 2a 20 6d 61 6b 65 73 20 61 6e 20 65 78 61  .** makes an exa
0350: 63 74 20 63 6f 70 79 2e 20 20 42 75 74 20 66 6f  ct copy.  But fo
0360: 72 20 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e 64  r any other kind
0370: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   of expression, 
0380: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
0390: 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
03a0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f  he result set co
03b0: 6c 75 6d 6e 20 61 73 20 74 68 65 20 61 72 67 75  lumn as the argu
03c0: 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20 54  ment to the.** T
03d0: 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 2e 20 20  K_AS operator.  
03e0: 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72 61 74  The TK_AS operat
03f0: 6f 72 20 63 61 75 73 65 73 20 74 68 65 20 65 78  or causes the ex
0400: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 0a 2a  pression to be.*
0410: 2a 20 65 76 61 6c 75 61 74 65 64 20 6a 75 73 74  * evaluated just
0420: 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 6e 20 72   once and then r
0430: 65 75 73 65 64 20 66 6f 72 20 65 61 63 68 20 61  eused for each a
0440: 6c 69 61 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lias..**.** The 
0450: 72 65 61 73 6f 6e 20 66 6f 72 20 73 75 70 70 72  reason for suppr
0460: 65 73 73 69 6e 67 20 74 68 65 20 54 4b 5f 41 53  essing the TK_AS
0470: 20 74 65 72 6d 20 77 68 65 6e 20 74 68 65 20 65   term when the e
0480: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 73  xpression is a s
0490: 69 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  imple.** column 
04a0: 72 65 66 65 72 65 6e 63 65 20 69 73 20 73 6f 20  reference is so 
04b0: 74 68 61 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20  that the column 
04c0: 72 65 66 65 72 65 6e 63 65 20 77 69 6c 6c 20 62  reference will b
04d0: 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 73 0a  e recognized as.
04e0: 2a 2a 20 75 73 61 62 6c 65 20 62 79 20 69 6e 64  ** usable by ind
04f0: 69 63 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ices within the 
0500: 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
0510: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 2e 20 0a  cessing logic. .
0520: 2a 2a 0a 2a 2a 20 48 61 63 6b 3a 20 20 54 68 65  **.** Hack:  The
0530: 20 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20   TK_AS operator 
0540: 69 73 20 69 6e 68 69 62 69 74 65 64 20 69 66 20  is inhibited if 
0550: 7a 54 79 70 65 5b 30 5d 3d 3d 27 47 27 2e 20 20  zType[0]=='G'.  
0560: 54 68 69 73 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  This means.** th
0570: 61 74 20 69 6e 20 61 20 47 52 4f 55 50 20 42 59  at in a GROUP BY
0580: 20 63 6c 61 75 73 65 2c 20 74 68 65 20 65 78 70   clause, the exp
0590: 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
05a0: 61 74 65 64 20 74 77 69 63 65 2e 20 20 48 65 6e  ated twice.  Hen
05b0: 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45  ce:.**.**     SE
05c0: 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 25 35 20  LECT random()%5 
05d0: 41 53 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46  AS x, count(*) F
05e0: 52 4f 4d 20 74 61 62 20 47 52 4f 55 50 20 42 59  ROM tab GROUP BY
05f0: 20 78 0a 2a 2a 0a 2a 2a 20 49 73 20 65 71 75 69   x.**.** Is equi
0600: 76 61 6c 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a  valent to:.**.**
0610: 20 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64       SELECT rand
0620: 6f 6d 28 29 25 35 20 41 53 20 78 2c 20 63 6f 75  om()%5 AS x, cou
0630: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 61 62 20 47  nt(*) FROM tab G
0640: 52 4f 55 50 20 42 59 20 72 61 6e 64 6f 6d 28 29  ROUP BY random()
0650: 25 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  %5.**.** The res
0660: 75 6c 74 20 6f 66 20 72 61 6e 64 6f 6d 28 29 25  ult of random()%
0670: 35 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20 42  5 in the GROUP B
0680: 59 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f 62  Y clause is prob
0690: 61 62 6c 79 20 64 69 66 66 65 72 65 6e 74 0a 2a  ably different.*
06a0: 2a 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  * from the resul
06b0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d  t in the result-
06c0: 73 65 74 2e 20 20 57 65 20 6d 69 67 68 74 20 66  set.  We might f
06d0: 69 78 20 74 68 69 73 20 73 6f 6d 65 64 61 79 2e  ix this someday.
06e0: 20 20 4f 72 0a 2a 2a 20 74 68 65 6e 20 61 67 61    Or.** then aga
06f0: 69 6e 2c 20 77 65 20 6d 69 67 68 74 20 6e 6f 74  in, we might not
0700: 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ....*/.static vo
0710: 69 64 20 72 65 73 6f 6c 76 65 41 6c 69 61 73 28  id resolveAlias(
0720: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
0730: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  ,         /* Par
0740: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
0750: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
0760: 73 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 72 65  st,      /* A re
0770: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e  sult set */.  in
0780: 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20  t iCol,         
0790: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
07a0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
07b0: 65 74 2e 20 20 30 2e 2e 70 45 4c 69 73 74 2d 3e  et.  0..pEList->
07c0: 6e 45 78 70 72 2d 31 20 2a 2f 0a 20 20 45 78 70  nExpr-1 */.  Exp
07d0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
07e0: 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d      /* Transform
07f0: 20 74 68 69 73 20 69 6e 74 6f 20 61 6e 20 61 6c   this into an al
0800: 69 61 73 20 74 6f 20 74 68 65 20 72 65 73 75 6c  ias to the resul
0810: 74 20 73 65 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  t set */.  const
0820: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
0830: 20 20 2f 2a 20 22 47 52 4f 55 50 22 20 6f 72 20    /* "GROUP" or 
0840: 22 4f 52 44 45 52 22 20 6f 72 20 22 22 20 2a 2f  "ORDER" or "" */
0850: 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4f 72 69  .){.  Expr *pOri
0860: 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  g;           /* 
0870: 54 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  The iCol-th colu
0880: 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  mn of the result
0890: 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a   set */.  Expr *
08a0: 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20 20  pDup;           
08b0: 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 4f 72 69   /* Copy of pOri
08c0: 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  g */.  sqlite3 *
08d0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
08e0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
08f0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  nnection */..  a
0900: 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26  ssert( iCol>=0 &
0910: 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74 2d 3e 6e  & iCol<pEList->n
0920: 45 78 70 72 20 29 3b 0a 20 20 70 4f 72 69 67 20  Expr );.  pOrig 
0930: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  = pEList->a[iCol
0940: 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72  ].pExpr;.  asser
0950: 74 28 20 70 4f 72 69 67 21 3d 30 20 29 3b 0a 20  t( pOrig!=0 );. 
0960: 20 61 73 73 65 72 74 28 20 70 4f 72 69 67 2d 3e   assert( pOrig->
0970: 66 6c 61 67 73 20 26 20 45 50 5f 52 65 73 6f 6c  flags & EP_Resol
0980: 76 65 64 20 29 3b 0a 20 20 64 62 20 3d 20 70 50  ved );.  db = pP
0990: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 44 75 70  arse->db;.  pDup
09a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
09b0: 70 28 64 62 2c 20 70 4f 72 69 67 29 3b 0a 20 20  p(db, pOrig);.  
09c0: 69 66 28 20 70 44 75 70 3d 3d 30 20 29 20 72 65  if( pDup==0 ) re
09d0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 44 75 70  turn;.  if( pDup
09e0: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
09f0: 26 26 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47 27  && zType[0]!='G'
0a00: 20 29 7b 0a 20 20 20 20 70 44 75 70 20 3d 20 73   ){.    pDup = s
0a10: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
0a20: 73 65 2c 20 54 4b 5f 41 53 2c 20 70 44 75 70 2c  se, TK_AS, pDup,
0a30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
0a40: 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  pDup==0 ) return
0a50: 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73 74  ;.    if( pEList
0a60: 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41 6c 69 61 73  ->a[iCol].iAlias
0a70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 4c  ==0 ){.      pEL
0a80: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41 6c  ist->a[iCol].iAl
0a90: 69 61 73 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ias = ++pParse->
0aa0: 6e 41 6c 69 61 73 3b 0a 20 20 20 20 7d 0a 20 20  nAlias;.    }.  
0ab0: 20 20 70 44 75 70 2d 3e 69 54 61 62 6c 65 20 3d    pDup->iTable =
0ac0: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d   pEList->a[iCol]
0ad0: 2e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 69  .iAlias;.  }.  i
0ae0: 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  f( pExpr->flags 
0af0: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  & EP_ExpCollate 
0b00: 29 7b 0a 20 20 20 20 70 44 75 70 2d 3e 70 43 6f  ){.    pDup->pCo
0b10: 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c  ll = pExpr->pCol
0b20: 6c 3b 0a 20 20 20 20 70 44 75 70 2d 3e 66 6c 61  l;.    pDup->fla
0b30: 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c  gs |= EP_ExpColl
0b40: 61 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ate;.  }.  if( p
0b50: 45 78 70 72 2d 3e 73 70 61 6e 2e 64 79 6e 20 29  Expr->span.dyn )
0b60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0b70: 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70 72 2d  b, (char*)pExpr-
0b80: 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20  >span.z);.  if( 
0b90: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pExpr->token.dyn
0ba0: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
0bb0: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 45 78 70  (db, (char*)pExp
0bc0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 6d  r->token.z);.  m
0bd0: 65 6d 63 70 79 28 70 45 78 70 72 2c 20 70 44 75  emcpy(pExpr, pDu
0be0: 70 2c 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72  p, sizeof(*pExpr
0bf0: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  ));.  sqlite3DbF
0c00: 72 65 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 7d  ree(db, pDup);.}
0c10: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
0c20: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
0c30: 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  mn of the form X
0c40: 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a  .Y.Z or Y.Z or j
0c50: 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a  ust Z, look up.*
0c60: 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74  * that name in t
0c70: 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65  he set of source
0c80: 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c   tables in pSrcL
0c90: 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65  ist and make the
0ca0: 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65   pExpr .** expre
0cb0: 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72  ssion node refer
0cc0: 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f   back to that so
0cd0: 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68  urce column.  Th
0ce0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
0cf0: 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20  ges.** are made 
0d00: 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20  to pExpr:.**.** 
0d10: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20     pExpr->iDb   
0d20: 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65 20          Set the 
0d30: 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62  index in db->aDb
0d40: 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  [] of the databa
0d50: 73 65 20 58 0a 2a 2a 20 20 20 20 20 20 20 20 20  se X.**         
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d70: 28 65 76 65 6e 20 69 66 20 58 20 69 73 20 69 6d  (even if X is im
0d80: 70 6c 69 65 64 29 2e 0a 2a 2a 20 20 20 20 70 45  plied)..**    pE
0d90: 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20  xpr->iTable     
0da0: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75     Set to the cu
0db0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
0dc0: 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e  the table obtain
0dd0: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ed.**           
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72                fr
0df0: 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20  om pSrcList..** 
0e00: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 20     pExpr->pTab  
0e10: 20 20 20 20 20 20 20 20 50 6f 69 6e 74 73 20 74          Points t
0e20: 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  o the Table stru
0e30: 63 74 75 72 65 20 6f 66 20 58 2e 59 20 28 65 76  cture of X.Y (ev
0e40: 65 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20  en if.**        
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 20 58 20 61 6e 64 2f 6f 72 20 59 20 61 72 65 20   X and/or Y are 
0e70: 69 6d 70 6c 69 65 64 2e 29 0a 2a 2a 20 20 20 20  implied.).**    
0e80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20  pExpr->iColumn  
0e90: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
0ea0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69  column number wi
0eb0: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  thin the table..
0ec0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20  **    pExpr->op 
0ed0: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
0ee0: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20  o TK_COLUMN..** 
0ef0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
0f00: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
0f10: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
0f20: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
0f30: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52  .**    pExpr->pR
0f40: 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20  ight        Any 
0f50: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
0f60: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
0f70: 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
0f80: 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20  pDbToken is the 
0f90: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
0fa0: 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20  base (the "X"). 
0fb0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
0fc0: 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69  be.** NULL meani
0fd0: 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20  ng that name is 
0fe0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20  of the form Y.Z 
0ff0: 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c  or Z.  Any avail
1000: 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  able database.**
1010: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54   can be used.  T
1020: 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69  he pTableToken i
1030: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
1040: 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22  e table (the "Y"
1050: 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75  ).  This.** valu
1060: 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66  e can be NULL if
1070: 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73   pDbToken is als
1080: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62  o NULL.  If pTab
1090: 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20  leToken is NULL 
10a0: 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  it.** means that
10b0: 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65   the form of the
10c0: 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74   name is Z and t
10d0: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d  hat columns from
10e0: 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61   any table.** ca
10f0: 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a  n be used..**.**
1100: 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e   If the name can
1110: 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20  not be resolved 
1120: 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c  unambiguously, l
1130: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1140: 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72  ssage.** in pPar
1150: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  se and return no
1160: 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20  n-zero.  Return 
1170: 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e  zero on success.
1180: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
1190: 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72  ookupName(.  Par
11a0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11b0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
11c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
11d0: 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20  ken *pDbToken,  
11e0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
11f0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1200: 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20  ining table, or 
1210: 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
1220: 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f  *pTableToken,  /
1230: 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20  * Name of table 
1240: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
1250: 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  n, or NULL */.  
1260: 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f  Token *pColumnTo
1270: 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ken, /* Name of 
1280: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20  the column. */. 
1290: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
12a0: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
12b0: 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74  e context used t
12c0: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61  o resolve the na
12d0: 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  me */.  Expr *pE
12e0: 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr          /* 
12f0: 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e  Make this EXPR n
1300: 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ode point to the
1310: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
1320: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
1330: 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  Db = 0;       /*
1340: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1350: 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20  abase.  The "X" 
1360: 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68  in X.Y.Z */.  ch
1370: 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
1380: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1390: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59  e table.  The "Y
13a0: 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  " in X.Y.Z or Y.
13b0: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Z */.  char *zCo
13c0: 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  l = 0;      /* N
13d0: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
13e0: 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20  n.  The "Z" */. 
13f0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1400: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
1410: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
1420: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1440: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
1450: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
1460: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62   */.  int cntTab
1470: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1480: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1490: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61  r of matching ta
14a0: 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73  ble names */.  s
14b0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
14c0: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
14d0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
14e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
14f0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1500: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20  item *pItem;    
1510: 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f     /* Use for lo
1520: 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63 4c  oping over pSrcL
1530: 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73  ist items */.  s
1540: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1550: 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20  em *pMatch = 0; 
1560: 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e 67   /* The matching
1570: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20 2a   pSrcList item *
1580: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
1590: 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20  *pTopNC = pNC;  
15a0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e        /* First n
15b0: 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74 68  amecontext in th
15c0: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53 63 68 65  e list */.  Sche
15d0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 30 3b  ma *pSchema = 0;
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f0: 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65 20 65   Schema of the e
1600: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20  xpression */..  
1610: 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54  assert( pColumnT
1620: 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54  oken && pColumnT
1630: 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68  oken->z ); /* Th
1640: 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e  e Z in X.Y.Z can
1650: 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 0a  not be NULL */..
1660: 20 20 2f 2a 20 44 65 71 75 6f 74 65 20 61 6e 64    /* Dequote and
1670: 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 20   zero-terminate 
1680: 74 68 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 7a  the names */.  z
1690: 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  Db = sqlite3Name
16a0: 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 44  FromToken(db, pD
16b0: 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20  bToken);.  zTab 
16c0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
16d0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
16e0: 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20  eToken);.  zCol 
16f0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1700: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 43 6f 6c 75  mToken(db, pColu
1710: 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20  mnToken);.  if( 
1720: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1730: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f   ){.    goto loo
1740: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d  kupname_end;.  }
1750: 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
1760: 65 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6e 6f  e the node to no
1770: 2d 6d 61 74 63 68 20 2a 2f 0a 20 20 70 45 78 70  -match */.  pExp
1780: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a  r->iTable = -1;.
1790: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
17a0: 30 3b 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 61  0;..  /* Start a
17b0: 74 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  t the inner-most
17c0: 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 6d 6f 76   context and mov
17d0: 65 20 6f 75 74 77 61 72 64 20 75 6e 74 69 6c 20  e outward until 
17e0: 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
17f0: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 4e 43   */.  while( pNC
1800: 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   && cnt==0 ){.  
1810: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
1820: 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  st;.    SrcList 
1830: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
1840: 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20  >pSrcList;..    
1850: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
1860: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
1870: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
1880: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
1890: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
18a0: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
18b0: 20 2a 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20   *pTab;.        
18c0: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
18d0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
18e0: 20 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d   .        pTab =
18f0: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
1900: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1910: 61 62 21 3d 30 20 26 26 20 70 54 61 62 2d 3e 7a  ab!=0 && pTab->z
1920: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  Name!=0 );.     
1930: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
1940: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
1950: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
1960: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1970: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
1980: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54  ;.        if( zT
1990: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
19a0: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
19b0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
19c0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
19d0: 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b  = pItem->zAlias;
19e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
19f0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1a00: 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21  zTabName, zTab)!
1a10: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1a20: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
1a40: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61   *zTabName = pTa
1a50: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
1a60: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61        if( zTabNa
1a70: 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  me==0 || sqlite3
1a80: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
1a90: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
1aa0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1ab0: 20 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26     if( zDb!=0 &&
1ac0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1ad0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
1ae0: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1b00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1b10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1b20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b30: 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61     if( 0==(cntTa
1b40: 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  b++) ){.        
1b50: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1b60: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
1b70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
1b80: 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  r->pTab = pTab;.
1b90: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
1ba0: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
1bb0: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  a;.          pMa
1bc0: 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20  tch = pItem;.   
1bd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
1be0: 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(j=0, pCol=pTa
1bf0: 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
1c00: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c  >nCol; j++, pCol
1c10: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
1c20: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1c30: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
1c40: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
1c50: 20 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70         IdList *p
1c60: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20  Using;.         
1c70: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
1c80: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1c90: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
1ca0: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rsor;.          
1cb0: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
1cc0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
1cd0: 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d    pMatch = pItem
1ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
1cf0: 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53  chema = pTab->pS
1d00: 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20  chema;.         
1d10: 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
1d20: 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75   the rowid (colu
1d30: 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49  mn -1) for the I
1d40: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1d50: 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  EY */.          
1d60: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
1d70: 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65   = j==pTab->iPKe
1d80: 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20  y ? -1 : j;.    
1d90: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 70 53          if( i<pS
1da0: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 20 29  rcList->nSrc-1 )
1db0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1dc0: 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e 6a 6f 69  if( pItem[1].joi
1dd0: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
1de0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
1df0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1e00: 20 6d 61 74 63 68 20 6f 63 63 75 72 72 65 64 20   match occurred 
1e10: 69 6e 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c  in the left tabl
1e20: 65 20 6f 66 20 61 20 6e 61 74 75 72 61 6c 20 6a  e of a natural j
1e30: 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oin,.           
1e40: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 73 6b 69       ** then ski
1e50: 70 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  p the right tabl
1e60: 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75 70  e to avoid a dup
1e70: 6c 69 63 61 74 65 20 6d 61 74 63 68 20 2a 2f 0a  licate match */.
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  pItem++;.       
1ea0: 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20           i++;.  
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1ec0: 65 20 69 66 28 20 28 70 55 73 69 6e 67 20 3d 20  e if( (pUsing = 
1ed0: 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69 6e 67 29  pItem[1].pUsing)
1ee0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
1ef0: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
1f00: 73 20 6d 61 74 63 68 20 6f 63 63 75 72 73 20 6f  s match occurs o
1f10: 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  n a column that 
1f20: 69 73 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  is in the USING 
1f30: 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 20  clause.         
1f40: 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 6a         ** of a j
1f50: 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65 20 73 65  oin, skip the se
1f60: 61 72 63 68 20 6f 66 20 74 68 65 20 72 69 67 68  arch of the righ
1f70: 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
1f80: 6f 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  oin.            
1f90: 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
1fa0: 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63  a duplicate matc
1fb0: 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  h there. */.    
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1fd0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
1fe0: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55     for(k=0; k<pU
1ff0: 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b  sing->nId; k++){
2000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2010: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2020: 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b  rICmp(pUsing->a[
2030: 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  k].zName, zCol)=
2040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2050: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2b            pItem+
2060: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
2070: 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
20a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
20d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
20e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2100: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2110: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2120: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20  E_OMIT_TRIGGER. 
2130: 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65     /* If we have
2140: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73   not already res
2150: 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20  olved the name, 
2160: 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20  then maybe .    
2170: 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a  ** it is a new.*
2180: 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65   or old.* trigge
2190: 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72  r argument refer
21a0: 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ence.    */.    
21b0: 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54  if( zDb==0 && zT
21c0: 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20  ab!=0 && cnt==0 
21d0: 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53  && pParse->trigS
21e0: 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20  tack!=0 ){.     
21f0: 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70   TriggerStack *p
2200: 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70  TriggerStack = p
2210: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
2220: 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70  ;.      Table *p
2230: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 75  Tab = 0;.      u
2240: 33 32 20 2a 70 69 43 6f 6c 4d 61 73 6b 3b 0a 20  32 *piColMask;. 
2250: 20 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65       if( pTrigge
2260: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
2270: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
2280: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
2290: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
22a0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
22b0: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
22c0: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
22d0: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
22e0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
22f0: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
2300: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
2310: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70 69  pTab;.        pi
2320: 43 6f 6c 4d 61 73 6b 20 3d 20 26 28 70 54 72 69  ColMask = &(pTri
2330: 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 43 6f  ggerStack->newCo
2340: 6c 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 65  lMask);.      }e
2350: 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65 72  lse if( pTrigger
2360: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d  Stack->oldIdx !=
2370: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
2380: 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61  rICmp("old", zTa
2390: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
23a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
23b0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
23c0: 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20  oldIdx;.        
23d0: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
23e0: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
23f0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
2400: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
2410: 62 3b 0a 20 20 20 20 20 20 20 20 70 69 43 6f 6c  b;.        piCol
2420: 4d 61 73 6b 20 3d 20 26 28 70 54 72 69 67 67 65  Mask = &(pTrigge
2430: 72 53 74 61 63 6b 2d 3e 6f 6c 64 43 6f 6c 4d 61  rStack->oldColMa
2440: 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  sk);.      }..  
2450: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20      if( pTab ){ 
2460: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
2470: 6c 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  l;.        Colum
2480: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
2490: 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70  aCol;..        p
24a0: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
24b0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
24c0: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
24d0: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
24e0: 6f 6c 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b  ol < pTab->nCol;
24f0: 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29   iCol++, pCol++)
2500: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
2510: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2520: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
2530: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
2540: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
2550: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2560: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70  Column = iCol==p
2570: 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20  Tab->iPKey ? -1 
2580: 3a 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  : iCol;.        
2590: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
25a0: 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
25b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20      if( iCol>=0 
25c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25d0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
25e0: 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
25f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2600: 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20  Col==32 );.     
2610: 20 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 4d           *piColM
2620: 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 3c 3c  ask |= ((u32)1<<
2630: 69 43 6f 6c 29 20 7c 20 28 69 43 6f 6c 3e 3d 33  iCol) | (iCol>=3
2640: 32 3f 30 78 66 66 66 66 66 66 66 66 3a 30 29 3b  2?0xffffffff:0);
2650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2660: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2670: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2690: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
26a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
26b0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
26c0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
26d0: 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65  Perhaps the name
26e0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
26f0: 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20  to the ROWID.   
2700: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
2710: 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20  =0 && cntTab==1 
2720: 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
2730: 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  d(zCol) ){.     
2740: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   cnt = 1;.      
2750: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
2760: 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72   -1;.      pExpr
2770: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
2780: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
2790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
27a0: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70     ** If the inp
27b0: 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ut is of the for
27c0: 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20  m Z (not Y.Z or 
27d0: 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20  X.Y.Z) then the 
27e0: 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69  name Z.    ** mi
27f0: 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20  ght refer to an 
2800: 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73  result-set alias
2810: 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c  .  This happens,
2820: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
2830: 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65  en.    ** we are
2840: 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73   resolving names
2850: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
2860: 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ause of the foll
2870: 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20  owing command:. 
2880: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
2890: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
28a0: 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52   FROM table WHER
28b0: 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20  E x<10;.    **. 
28c0: 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c     ** In cases l
28d0: 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63  ike this, replac
28e0: 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63  e pExpr with a c
28f0: 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
2900: 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a  ssion that.    *
2910: 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75  * forms the resu
2920: 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61  lt set entry ("a
2930: 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  +b" in the examp
2940: 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69  le) and return i
2950: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
2960: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2970: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
2980: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68  he result set sh
2990: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
29a0: 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65  y been.    ** re
29b0: 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69  solved by the ti
29c0: 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  me the WHERE cla
29d0: 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e  use is resolved.
29e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
29f0: 63 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73  cnt==0 && (pELis
2a00: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29  t = pNC->pEList)
2a10: 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29  !=0 && zTab==0 )
2a20: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
2a30: 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   j<pEList->nExpr
2a40: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
2a50: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
2a60: 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[j].zName;.
2a70: 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21          if( zAs!
2a80: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
2a90: 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d  ICmp(zAs, zCol)=
2aa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2ab0: 45 78 70 72 20 2a 70 4f 72 69 67 3b 0a 20 20 20  Expr *pOrig;.   
2ac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2ad0: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
2ae0: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
2af0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2b00: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
2b10: 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  List==0 );.     
2b20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
2b30: 70 72 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  pr->pSelect==0 )
2b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 69  ;.          pOri
2b50: 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  g = pEList->a[j]
2b60: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
2b70: 20 20 69 66 28 20 21 70 4e 43 2d 3e 61 6c 6c 6f    if( !pNC->allo
2b80: 77 41 67 67 20 26 26 20 45 78 70 72 48 61 73 50  wAgg && ExprHasP
2b90: 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45  roperty(pOrig, E
2ba0: 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  P_Agg) ){.      
2bb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2bc0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
2bd0: 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64  isuse of aliased
2be0: 20 61 67 67 72 65 67 61 74 65 20 25 73 22 2c 20   aggregate %s", 
2bf0: 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zAs);.          
2c00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c10: 64 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  db, zCol);.     
2c20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b         return 2;
2c30: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c40: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41 6c         resolveAl
2c50: 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ias(pParse, pELi
2c60: 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c 20 22 22  st, j, pExpr, ""
2c70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  );.          cnt
2c80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2c90: 70 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  pMatch = 0;.    
2ca0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
2cb0: 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20  ab==0 && zDb==0 
2cc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2cd0: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
2ce0: 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  _2;.        }.  
2cf0: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20      } .    }..  
2d00: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
2d10: 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f  the next name co
2d20: 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70  ntext.  The loop
2d30: 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20   will exit when 
2d40: 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65  either.    ** we
2d50: 20 68 61 76 65 20 61 20 6d 61 74 63 68 20 28 63   have a match (c
2d60: 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65  nt>0) or when we
2d70: 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65   run out of name
2d80: 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a   contexts..    *
2d90: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
2da0: 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20   ){.      pNC = 
2db0: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
2dc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
2dd0: 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20   If X and Y are 
2de0: 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77  NULL (in other w
2df0: 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65  ords if only the
2e00: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69   column name Z i
2e10: 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29  s.  ** supplied)
2e20: 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2e30: 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20  f Z is enclosed 
2e40: 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  in double-quotes
2e50: 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73  , then.  ** Z is
2e60: 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61   a string litera
2e70: 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20  l if it doesn't 
2e80: 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e  match any column
2e90: 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74   names.  In that
2ea0: 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e  .  ** case, we n
2eb0: 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69  eed to return ri
2ec0: 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74  ght away and not
2ed0: 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65   make any change
2ee0: 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e  s to.  ** pExpr.
2ef0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75  .  **.  ** Becau
2f00: 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  se no reference 
2f10: 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65  was made to oute
2f20: 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20  r contexts, the 
2f30: 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66  pNC->nRef.  ** f
2f40: 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68  ields are not ch
2f50: 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e  anged in any con
2f60: 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  text..  */.  if(
2f70: 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d   cnt==0 && zTab=
2f80: 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b  =0 && pColumnTok
2f90: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b  en->z[0]=='"' ){
2fa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
2fb0: 65 65 28 64 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20  ee(db, zCol);.  
2fc0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
2fd0: 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 72 65 74  _STRING;.    ret
2fe0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
2ff0: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61  .  ** cnt==0 mea
3000: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  ns there was not
3010: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d   match.  cnt>1 m
3020: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20  eans there were 
3030: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65  two or.  ** more
3040: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65   matches.  Eithe
3050: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61  r way, we have a
3060: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
3070: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20  if( cnt!=1 ){.  
3080: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
3090: 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63  rr;.    zErr = c
30a0: 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68  nt==0 ? "no such
30b0: 20 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69   column" : "ambi
30c0: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  guous column nam
30d0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  e";.    if( zDb 
30e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
30f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3100: 20 22 25 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c   "%s: %s.%s.%s",
3110: 20 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62   zErr, zDb, zTab
3120: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c  , zCol);.    }el
3130: 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20  se if( zTab ){. 
3140: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3150: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
3160: 3a 20 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20  : %s.%s", zErr, 
3170: 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  zTab, zCol);.   
3180: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
3190: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
31a0: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20  arse, "%s: %s", 
31b0: 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  zErr, zCol);.   
31c0: 20 7d 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e   }.    pTopNC->n
31d0: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Err++;.  }..  /*
31e0: 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f   If a column fro
31f0: 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72  m a table in pSr
3200: 63 4c 69 73 74 20 69 73 20 72 65 66 65 72 65 6e  cList is referen
3210: 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64  ced, then record
3220: 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20  .  ** this fact 
3230: 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e  in the pSrcList.
3240: 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d  a[].colUsed bitm
3250: 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63  ask.  Column 0 c
3260: 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30  auses.  ** bit 0
3270: 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c   to be set.  Col
3280: 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20 31  umn 1 sets bit 1
3290: 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
32a0: 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f    If the.  ** co
32b0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67  lumn number is g
32c0: 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20  reater than the 
32d0: 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69  number of bits i
32e0: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20  n the bitmask.  
32f0: 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  ** then set the 
3300: 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f  high-order bit o
3310: 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20  f the bitmask.. 
3320: 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d   */.  if( pExpr-
3330: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70  >iColumn>=0 && p
3340: 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20  Match!=0 ){.    
3350: 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69  int n = pExpr->i
3360: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 74 65 73 74  Column;.    test
3370: 63 61 73 65 28 20 6e 3d 3d 73 69 7a 65 6f 66 28  case( n==sizeof(
3380: 42 69 74 6d 61 73 6b 29 2a 38 2d 31 20 29 3b 0a  Bitmask)*8-1 );.
3390: 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f      if( n>=sizeo
33a0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a  f(Bitmask)*8 ){.
33b0: 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66        n = sizeof
33c0: 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20  (Bitmask)*8-1;. 
33d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
33e0: 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72   pMatch->iCursor
33f0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
3400: 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63  );.    pMatch->c
3410: 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d  olUsed |= ((Bitm
3420: 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a  ask)1)<<n;.  }..
3430: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a  lookupname_end:.
3440: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
3450: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
3460: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3470: 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , zDb);.  sqlite
3480: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 54 61 62  3DbFree(db, zTab
3490: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
34a0: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
34b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70  ->pLeft);.  pExp
34c0: 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
34d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
34e0: 65 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  e(db, pExpr->pRi
34f0: 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  ght);.  pExpr->p
3500: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78  Right = 0;.  pEx
3510: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
3520: 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65  MN;.lookupname_e
3530: 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65 33 44  nd_2:.  sqlite3D
3540: 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 29 3b  bFree(db, zCol);
3550: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b  .  if( cnt==1 ){
3560: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43  .    assert( pNC
3570: 21 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  !=0 );.    sqlit
3580: 65 33 41 75 74 68 52 65 61 64 28 70 50 61 72 73  e3AuthRead(pPars
3590: 65 2c 20 70 45 78 70 72 2c 20 70 53 63 68 65 6d  e, pExpr, pSchem
35a0: 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  a, pNC->pSrcList
35b0: 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  );.    /* Increm
35c0: 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c  ent the nRef val
35d0: 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63  ue on all name c
35e0: 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70  ontexts from Top
35f0: 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20  NC up to.    ** 
3600: 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20  the point where 
3610: 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64  the name matched
3620: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29  . */.    for(;;)
3630: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
3640: 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  pTopNC!=0 );.   
3650: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b     pTopNC->nRef+
3660: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  +;.      if( pTo
3670: 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b  pNC==pNC ) break
3680: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d  ;.      pTopNC =
3690: 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a   pTopNC->pNext;.
36a0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
36b0: 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   0;.  } else {. 
36c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
36d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
36e0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 62 61  outine is callba
36f0: 63 6b 20 66 6f 72 20 73 71 6c 69 74 65 33 57 61  ck for sqlite3Wa
3700: 6c 6b 45 78 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  lkExpr()..**.** 
3710: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63  Resolve symbolic
3720: 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43   names into TK_C
3730: 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20  OLUMN operators 
3740: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
3750: 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65  ** node in the e
3760: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
3770: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e   Return 0 to con
3780: 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68  tinue the search
3790: 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65   down.** the tre
37a0: 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20  e or 2 to abort 
37b0: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
37c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
37d0: 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f  e also does erro
37e0: 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e  r checking and n
37f0: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66  ame resolution f
3800: 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  or.** function n
3810: 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61  ames.  The opera
3820: 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74  tor for aggregat
3830: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63  e functions is c
3840: 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f  hanged.** to TK_
3850: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f  AGG_FUNCTION..*/
3860: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
3870: 6c 76 65 45 78 70 72 53 74 65 70 28 57 61 6c 6b  lveExprStep(Walk
3880: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
3890: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d  r *pExpr){.  Nam
38a0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 0a 20  eContext *pNC;. 
38b0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
38c0: 0a 20 20 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  .  pNC = pWalker
38d0: 2d 3e 75 2e 70 4e 43 3b 0a 20 20 61 73 73 65 72  ->u.pNC;.  asser
38e0: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70  t( pNC!=0 );.  p
38f0: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
3900: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
3910: 50 61 72 73 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Parse==pWalker->
3920: 70 50 61 72 73 65 20 29 3b 0a 0a 20 20 69 66 28  pParse );..  if(
3930: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
3940: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
3950: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
3960: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 45 78   WRC_Prune;.  Ex
3970: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
3980: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
3990: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
39a0: 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72  G.  if( pNC->pSr
39b0: 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53  cList && pNC->pS
39c0: 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30  rcList->nAlloc>0
39d0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
39e0: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
39f0: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69  >pSrcList;.    i
3a00: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
3a10: 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69  0; i<pNC->pSrcLi
3a20: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
3a30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
3a40: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
3a50: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
3a60: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
3a70: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
3a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
3a90: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
3aa0: 72 2d 3e 6f 70 20 29 7b 0a 0a 23 69 66 6e 64 65  r->op ){..#ifnde
3ab0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 50  f SQLITE_OMIT_UP
3ac0: 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49  DATE_DELETE_LIMI
3ad0: 54 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65  T.    /* The spe
3ae0: 63 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 54 4b  cial operator TK
3af0: 5f 52 4f 57 20 6d 65 61 6e 73 20 75 73 65 20 74  _ROW means use t
3b00: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
3b10: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 63 6f   first.    ** co
3b20: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f 4d  lumn in the FROM
3b30: 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 69   clause.  This i
3b40: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4c 49  s used by the LI
3b50: 4d 49 54 20 61 6e 64 20 4f 52 44 45 52 20 42 59  MIT and ORDER BY
3b60: 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 70  .    ** clause p
3b70: 72 6f 63 65 73 73 69 6e 67 20 6f 6e 20 55 50 44  rocessing on UPD
3b80: 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20 73  ATE and DELETE s
3b90: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
3ba0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 4f  /.    case TK_RO
3bb0: 57 3a 20 7b 0a 20 20 20 20 20 20 53 72 63 4c 69  W: {.      SrcLi
3bc0: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
3bd0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
3be0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
3bf0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
3c00: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
3c10: 72 63 4c 69 73 74 20 26 26 20 70 53 72 63 4c 69  rcList && pSrcLi
3c20: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  st->nSrc==1 );. 
3c30: 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 53 72       pItem = pSr
3c40: 63 4c 69 73 74 2d 3e 61 3b 20 0a 20 20 20 20 20  cList->a; .     
3c50: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
3c60: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45  COLUMN;.      pE
3c70: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 49 74 65  xpr->pTab = pIte
3c80: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70  m->pTab;.      p
3c90: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
3ca0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
3cb0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
3cc0: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
3cd0: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
3ce0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
3cf0: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
3d00: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
3d10: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
3d20: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
3d30: 49 54 0a 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e  IT..    /* A lon
3d40: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
3d50: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
3d60: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
3d70: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
3d80: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
3d90: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70  pParse, 0, 0, &p
3da0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43  Expr->token, pNC
3db0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
3dc0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
3dd0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
3de0: 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  * A table name a
3df0: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  nd column name: 
3e00: 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a      ID.ID.    **
3e10: 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20   Or a database, 
3e20: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
3e30: 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20  :  ID.ID.ID.    
3e40: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  */.    case TK_D
3e50: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65  OT: {.      Toke
3e60: 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  n *pColumn;.    
3e70: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b    Token *pTable;
3e80: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44  .      Token *pD
3e90: 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
3ea0: 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  Right;..      /*
3eb0: 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30   if( pSrcList==0
3ec0: 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20   ) break; */.   
3ed0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
3ee0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
3ef0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d   if( pRight->op=
3f00: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
3f10: 20 20 70 44 62 20 3d 20 30 3b 0a 20 20 20 20 20    pDb = 0;.     
3f20: 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 45 78     pTable = &pEx
3f30: 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pr->pLeft->token
3f40: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d  ;.        pColum
3f50: 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  n = &pRight->tok
3f60: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
3f70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
3f80: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
3f90: 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20 70  DOT );.        p
3fa0: 44 62 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65  Db = &pExpr->pLe
3fb0: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
3fc0: 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 52 69     pTable = &pRi
3fd0: 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  ght->pLeft->toke
3fe0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75  n;.        pColu
3ff0: 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 52  mn = &pRight->pR
4000: 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  ight->token;.   
4010: 20 20 20 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75     }.      looku
4020: 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44  pName(pParse, pD
4030: 62 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75  b, pTable, pColu
4040: 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b  mn, pNC, pExpr);
4050: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
4060: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 0a  C_Prune;.    }..
4070: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66      /* Resolve f
4080: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20  unction names.  
4090: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
40a0: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
40b0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
40c0: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
40d0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
40e0: 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  pr->pList;    /*
40f0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
4100: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
4110: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
4120: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f  t->nExpr : 0;  /
4130: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4140: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
4150: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
4160: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
4170: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
4180: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
4190: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
41a0: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
41b0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
41c0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
41d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
41e0: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4200: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
4210: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
4220: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 75   */.      int au
4230: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
4240: 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69        /* Authori
4250: 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74 68  zation to use th
4260: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
4270: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
42a0: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
42b0: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
42c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
42d0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
42e0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
42f0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
4300: 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
4310: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
4320: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
4330: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
4340: 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e      int enc = EN
4350: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20  C(pParse->db);  
4360: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
4370: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20  encoding */..   
4380: 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29     zId = (char*)
4390: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
43a0: 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
43b0: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
43c0: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
43d0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
43e0: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
43f0: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
4400: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
4410: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
4420: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
4430: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
4440: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c  b, zId, nId, -1,
4450: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
4460: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
4470: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
4480: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
4490: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
44a0: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
44b0: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
44c0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
44d0: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
44e0: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
44f0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
4500: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
4510: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
4520: 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20    if( pDef ){.  
4530: 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c        auth = sql
4540: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
4550: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e  arse, SQLITE_FUN
4560: 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e  CTION, 0, pDef->
4570: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
4580: 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c     if( auth!=SQL
4590: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
45a0: 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51      if( auth==SQ
45b0: 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20  LITE_DENY ){.   
45c0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
45d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
45e0: 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64   "not authorized
45f0: 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
4600: 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
4610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4620: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
4630: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
4640: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
4650: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4660: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
4670: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
4680: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
4690: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20  C_Prune;.       
46a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
46b0: 66 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  f.      if( is_a
46c0: 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f  gg && !pNC->allo
46d0: 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  wAgg ){.        
46e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
46f0: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
4700: 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  of aggregate fun
4710: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e  ction %.*s()", n
4720: 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  Id,zId);.       
4730: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
4740: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30        is_agg = 0
4750: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4760: 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29  ( no_such_func )
4770: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4780: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4790: 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  , "no such funct
47a0: 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c  ion: %.*s", nId,
47b0: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
47c0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
47d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e    }else if( wron
47e0: 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20  g_num_args ){.  
47f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4800: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72  orMsg(pParse,"wr
4810: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
4820: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
4830: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20  ion %.*s()",.   
4840: 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a            nId, z
4850: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
4860: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4870: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
4880: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  gg ){.        pE
4890: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
48a0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
48b0: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
48c0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
48d0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
48e0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  NC->allowAgg = 0
48f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
4900: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c  alkExprList(pWal
4910: 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  ker, pList);.   
4920: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
4930: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
4940: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
4950: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
4960: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
4970: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
4980: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
4990: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
49a0: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
49b0: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
49c0: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
49d0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
49e0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
49f0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
4a00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
4a10: 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  STS:.#endif.    
4a20: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
4a30: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
4a40: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
4a50: 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43    int nRef = pNC
4a60: 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20  ->nRef;.#ifndef 
4a70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
4a80: 4b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  K.        if( pN
4a90: 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20  C->isCheck ){.  
4aa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4ab0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
4ac0: 73 75 62 71 75 65 72 69 65 73 20 70 72 6f 68 69  subqueries prohi
4ad0: 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63  bited in CHECK c
4ae0: 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20  onstraints");.  
4af0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
4b00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
4b10: 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
4b20: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
4b30: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
4b40: 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52  t( pNC->nRef>=nR
4b50: 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ef );.        if
4b60: 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65  ( nRef!=pNC->nRe
4b70: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  f ){.          E
4b80: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
4b90: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
4ba0: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
4bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4bc0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
4bd0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
4be0: 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ECK.    case TK_
4bf0: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
4c00: 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65    if( pNC->isChe
4c10: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
4c20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4c30: 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73  arse,"parameters
4c40: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
4c50: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
4c60: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
4c70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4c80: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
4c90: 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  rn (pParse->nErr
4ca0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
4cb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20  mallocFailed) ? 
4cc0: 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f  WRC_Abort : WRC_
4cd0: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
4ce0: 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 61 20 6c  ** pEList is a l
4cf0: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
4d00: 6e 73 20 77 68 69 63 68 20 61 72 65 20 72 65 61  ns which are rea
4d10: 6c 6c 79 20 74 68 65 20 72 65 73 75 6c 74 20 73  lly the result s
4d20: 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 20 53  et of the.** a S
4d30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
4d40: 20 20 70 45 20 69 73 20 61 20 74 65 72 6d 20 69    pE is a term i
4d50: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  n an ORDER BY or
4d60: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
4d70: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
4d80: 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  e checks to see 
4d90: 69 66 20 70 45 20 69 73 20 61 20 73 69 6d 70 6c  if pE is a simpl
4da0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 68 69  e identifier whi
4db0: 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73 0a 2a  ch corresponds.*
4dc0: 2a 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d 65  * to the AS-name
4dd0: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
4de0: 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78 70 72  erms of the expr
4df0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
4e00: 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 69 73 20   it is,.** this 
4e10: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
4e20: 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  n integer betwee
4e30: 6e 20 31 20 61 6e 64 20 4e 20 77 68 65 72 65 20  n 1 and N where 
4e40: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
4e50: 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69  of.** elements i
4e60: 6e 20 70 45 4c 69 73 74 2c 20 63 6f 72 72 65 73  n pEList, corres
4e70: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6d  ponding to the m
4e80: 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 20 20  atching entry.  
4e90: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  If there is.** n
4ea0: 6f 20 6d 61 74 63 68 2c 20 6f 72 20 69 66 20 70  o match, or if p
4eb0: 45 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  E is not a simpl
4ec0: 65 20 69 64 65 6e 74 69 66 69 65 72 2c 20 74 68  e identifier, th
4ed0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
4ee0: 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ** return 0..**.
4ef0: 2a 2a 20 70 45 4c 69 73 74 20 68 61 73 20 62 65  ** pEList has be
4f00: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 70 45  en resolved.  pE
4f10: 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61   has not..*/.sta
4f20: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 41  tic int resolveA
4f30: 73 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  sName(.  Parse *
4f40: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
4f50: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  arsing context f
4f60: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
4f70: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
4f80: 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  *pEList,  /* Lis
4f90: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
4fa0: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
4fb0: 70 72 20 2a 70 45 20 20 20 20 20 20 20 20 20 20  pr *pE          
4fc0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 77   /* Expression w
4fd0: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
4fe0: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
4ff0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5000: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
5010: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 2d 3e 6f   */..  if( pE->o
5020: 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45 2d  p==TK_ID || (pE-
5030: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 26  >op==TK_STRING &
5040: 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  & pE->token.z[0]
5050: 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20 73  !='\'') ){.    s
5060: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5070: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61  rse->db;.    cha
5080: 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  r *zCol = sqlite
5090: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
50a0: 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a  b, &pE->token);.
50b0: 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20      if( zCol==0 
50c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
50d0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  -1;.    }.    fo
50e0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
50f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5100: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
5110: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
5120: 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  me;.      if( zA
5130: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
5140: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
5150: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5160: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5170: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
5180: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
5190: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
51a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
51b0: 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   zCol);.  }.  re
51c0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
51d0: 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74 65 72   pE is a pointer
51e0: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
51f0: 6e 20 77 68 69 63 68 20 69 73 20 61 20 73 69 6e  n which is a sin
5200: 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  gle term in the.
5210: 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 66 20 61  ** ORDER BY of a
5220: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
5230: 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
5240: 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a  n has not been.*
5250: 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65 64 2e  * name resolved.
5260: 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 70 6f  .**.** At the po
5270: 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  int this routine
5280: 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 61   is called, we a
5290: 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 61 74  lready know that
52a0: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
52b0: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 6e 20   term is not an 
52c0: 69 6e 74 65 67 65 72 20 69 6e 64 65 78 20 69 6e  integer index in
52d0: 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  to the result se
52e0: 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63 61 73 65  t.  That.** case
52f0: 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20 74   is handled by t
5300: 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
5310: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70  ne..**.** Attemp
5320: 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20 61 67  t to match pE ag
5330: 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74  ainst result set
5340: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
5350: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53 45 4c  left-most.** SEL
5360: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
5370: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
5380: 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69   i of the matchi
5390: 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61 73  ng column,.** as
53a0: 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74   an indication t
53b0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  o the caller tha
53c0: 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74  t it should sort
53d0: 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c   by the i-th col
53e0: 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74  umn..** The left
53f0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
5400: 31 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  1.  In other wor
5410: 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65  ds, the value re
5420: 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
5430: 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20 76 61   same integer va
5440: 6c 75 65 20 74 68 61 74 20 77 6f 75 6c 64 20 62  lue that would b
5450: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 53 51  e used in the SQ
5460: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69  L statement to i
5470: 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 65 20 63  ndicate.** the c
5480: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  olumn..**.** If 
5490: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
54a0: 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  h, return 0.  Re
54b0: 74 75 72 6e 20 2d 31 20 69 66 20 61 6e 20 65 72  turn -1 if an er
54c0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
54d0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
54e0: 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  eOrderByTermToEx
54f0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
5500: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
5510: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
5520: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
5530: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
5540: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68  pSelect,   /* Th
5550: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
5560: 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  nt with the ORDE
5570: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
5580: 20 45 78 70 72 20 2a 70 45 20 20 20 20 20 20 20   Expr *pE       
5590: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
55a0: 66 69 63 20 4f 52 44 45 52 20 42 59 20 74 65 72  fic ORDER BY ter
55b0: 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  m */.){.  int i;
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55d0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
55e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
55f0: 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  st;  /* The colu
5600: 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c  mns of the resul
5610: 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43  t set */.  NameC
5620: 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a  ontext nc;    /*
5630: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
5640: 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a  r resolving pE *
5650: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
5660: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
5670: 72 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a  r(pE, &i)==0 );.
5680: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
5690: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f  ct->pEList;..  /
56a0: 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61  * Resolve all na
56b0: 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mes in the ORDER
56c0: 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73 73   BY term express
56d0: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  ion.  */.  memse
56e0: 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&nc, 0, sizeof
56f0: 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72  (nc));.  nc.pPar
5700: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e  se = pParse;.  n
5710: 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  c.pSrcList = pSe
5720: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63  lect->pSrc;.  nc
5730: 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  .pEList = pEList
5740: 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41 67 67 20  ;.  nc.allowAgg 
5750: 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d  = 1;.  nc.nErr =
5760: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
5770: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
5780: 73 28 26 6e 63 2c 20 70 45 29 20 29 7b 0a 20 20  s(&nc, pE) ){.  
5790: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c    sqlite3ErrorCl
57a0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
57b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
57c0: 20 20 2f 2a 20 54 72 79 20 74 6f 20 6d 61 74 63    /* Try to matc
57d0: 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  h the ORDER BY e
57e0: 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73  xpression agains
57f0: 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  t an expression.
5800: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
5810: 6c 74 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20  lt set.  Return 
5820: 61 6e 20 31 2d 62 61 73 65 64 20 69 6e 64 65 78  an 1-based index
5830: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
5840: 0a 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  .  ** result-set
5850: 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 66   entry..  */.  f
5860: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
5870: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
5880: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
5890: 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74  prCompare(pEList
58a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
58b0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
58c0: 6e 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  n i+1;.    }.  }
58d0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 6d 61 74  ..  /* If no mat
58e0: 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 2a 2f  ch, return 0. */
58f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
5900: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
5910: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
5920: 4f 55 50 20 42 59 20 74 65 72 6d 20 6f 75 74 2d  OUP BY term out-
5930: 6f 66 2d 72 61 6e 67 65 20 65 72 72 6f 72 2e 0a  of-range error..
5940: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
5950: 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65  esolveOutOfRange
5960: 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  Error(.  Parse *
5970: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5980: 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f 6e  /* The error con
5990: 74 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20  text into which 
59a0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 65 72 72  to write the err
59b0: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
59c0: 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
59d0: 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  * "ORDER" or "GR
59e0: 4f 55 50 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  OUP" */.  int i,
59f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a00: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 28 31   /* The index (1
5a10: 2d 62 61 73 65 64 29 20 6f 66 20 74 68 65 20 74  -based) of the t
5a20: 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  erm out of range
5a30: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 20 20 20 20   */.  int mx    
5a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a50: 4c 61 72 67 65 73 74 20 70 65 72 6d 69 73 73 69  Largest permissi
5a60: 62 6c 65 20 76 61 6c 75 65 20 6f 66 20 69 20 2a  ble value of i *
5a70: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 72  /.){.  sqlite3Er
5a80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
5a90: 20 20 20 20 22 25 72 20 25 73 20 42 59 20 74 65      "%r %s BY te
5aa0: 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  rm out of range 
5ab0: 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
5ac0: 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
5ad0: 20 25 64 22 2c 20 69 2c 20 7a 54 79 70 65 2c 20   %d", i, zType, 
5ae0: 6d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  mx);.}../*.** An
5af0: 61 6c 79 7a 65 20 74 68 65 20 4f 52 44 45 52 20  alyze the ORDER 
5b00: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 63  BY clause in a c
5b10: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
5b20: 74 61 74 65 6d 65 6e 74 2e 20 20 20 4d 6f 64 69  tatement.   Modi
5b30: 66 79 0a 2a 2a 20 65 61 63 68 20 74 65 72 6d 20  fy.** each term 
5b40: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
5b50: 63 6c 61 75 73 65 20 69 73 20 61 20 63 6f 6e 73  clause is a cons
5b60: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 62 65 74  tant integer bet
5b70: 77 65 65 6e 20 31 0a 2a 2a 20 61 6e 64 20 4e 20  ween 1.** and N 
5b80: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
5b90: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5ba0: 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
5bb0: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f   SELECT..**.** O
5bc0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
5bd0: 61 74 20 61 72 65 20 61 6c 72 65 61 64 79 20 61  at are already a
5be0: 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  n integer betwee
5bf0: 6e 20 31 20 61 6e 64 20 4e 20 61 72 65 0a 2a 2a  n 1 and N are.**
5c00: 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20 20 4f 52   unmodified.  OR
5c10: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
5c20: 74 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 6f  t are integers o
5c30: 75 74 73 69 64 65 20 74 68 65 20 72 61 6e 67 65  utside the range
5c40: 20 6f 66 0a 2a 2a 20 31 20 74 68 72 6f 75 67 68   of.** 1 through
5c50: 20 4e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65   N generate an e
5c60: 72 72 6f 72 2e 20 20 4f 52 44 45 52 20 42 59 20  rror.  ORDER BY 
5c70: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 65  terms that are e
5c80: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72  xpressions.** ar
5c90: 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  e matched agains
5ca0: 74 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  t result set exp
5cb0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 63 6f 6d 70  ressions of comp
5cc0: 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 62  ound SELECT.** b
5cd0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 74 68  eginning with th
5ce0: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  e left-most SELE
5cf0: 43 54 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 74  CT and working t
5d00: 6f 77 61 72 64 20 74 68 65 20 72 69 67 68 74 2e  oward the right.
5d10: 0a 2a 2a 20 41 74 20 74 68 65 20 66 69 72 73 74  .** At the first
5d20: 20 6d 61 74 63 68 2c 20 74 68 65 20 4f 52 44 45   match, the ORDE
5d30: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
5d40: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  is transformed i
5d50: 6e 74 6f 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67  nto.** the integ
5d60: 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  er column number
5d70: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
5d80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
5d90: 6f 72 73 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61  ors seen..*/.sta
5da0: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 43  tic int resolveC
5db0: 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a  ompoundOrderBy(.
5dc0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5dd0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
5de0: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61  ng context.  Lea
5df0: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
5e00: 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
5e10: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
5e20: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
5e30: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
5e40: 6e 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ning the ORDER B
5e50: 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Y */.){.  int i;
5e60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
5e70: 64 65 72 42 79 3b 0a 20 20 45 78 70 72 4c 69 73  derBy;.  ExprLis
5e80: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
5e90: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
5ea0: 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20  moreToDo = 1;.. 
5eb0: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c   pOrderBy = pSel
5ec0: 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  ect->pOrderBy;. 
5ed0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
5ee0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64   ) return 0;.  d
5ef0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5f00: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
5f10: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64  OLUMN.  if( pOrd
5f20: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  erBy->nExpr>db->
5f30: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5f40: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
5f50: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5f60: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
5f70: 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52  many terms in OR
5f80: 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b  DER BY clause");
5f90: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
5fa0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
5fb0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
5fc0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5fd0: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
5fe0: 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  .done = 0;.  }. 
5ff0: 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 20   pSelect->pNext 
6000: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  = 0;.  while( pS
6010: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b  elect->pPrior ){
6020: 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 50  .    pSelect->pP
6030: 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 53  rior->pNext = pS
6040: 65 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65  elect;.    pSele
6050: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
6060: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  rior;.  }.  whil
6070: 65 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f  e( pSelect && mo
6080: 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 73 74  reToDo ){.    st
6090: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
60a0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 6d  em *pItem;.    m
60b0: 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20  oreToDo = 0;.   
60c0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
60d0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61  t->pEList;.    a
60e0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
60f0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   );.    for(i=0,
6100: 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
6110: 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  >a; i<pOrderBy->
6120: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
6130: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  m++){.      int 
6140: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  iCol = -1;.     
6150: 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70   Expr *pE, *pDup
6160: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
6170: 6d 2d 3e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  m->done ) contin
6180: 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  ue;.      pE = p
6190: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
61a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
61b0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
61c0: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
61d0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
61e0: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
61f0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
6200: 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67  resolveOutOfRang
6210: 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 22  eError(pParse, "
6220: 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70 45 4c  ORDER", i+1, pEL
6230: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
6240: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
6250: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6270: 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73  iCol = resolveAs
6280: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Name(pParse, pEL
6290: 69 73 74 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  ist, pE);.      
62a0: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29 7b    if( iCol==0 ){
62b0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20  .          pDup 
62c0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
62d0: 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  (db, pE);.      
62e0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
62f0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
6300: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
6310: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
6320: 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76     iCol = resolv
6330: 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  eOrderByTermToEx
6340: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
6350: 53 65 6c 65 63 74 2c 20 70 44 75 70 29 3b 0a 20  Select, pDup);. 
6360: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6370: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6380: 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29  Delete(db, pDup)
6390: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
63a0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
63b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
63c0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
63d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
63e0: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
63f0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
6400: 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a  ll = pE->pColl;.
6410: 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
6420: 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20 26 20  s = pE->flags & 
6430: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
6440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6450: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 29  prDelete(db, pE)
6460: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  ;.        pItem-
6470: 3e 70 45 78 70 72 20 3d 20 70 45 20 3d 20 73 71  >pExpr = pE = sq
6480: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
6490: 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20  _INTEGER, 0, 0, 
64a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
64b0: 70 45 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pE==0 ) return 1
64c0: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 70 43  ;.        pE->pC
64d0: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  oll = pColl;.   
64e0: 20 20 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c       pE->flags |
64f0: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 7c 20  = EP_IntValue | 
6500: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70  flags;.        p
6510: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 43 6f 6c  E->iTable = iCol
6520: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  ;.        pItem-
6530: 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20  >iCol = iCol;.  
6540: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e        pItem->don
6550: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 1;.      }el
6560: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72 65  se{.        more
6570: 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToDo = 1;.      
6580: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c  }.    }.    pSel
6590: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
65a0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Next;.  }.  for(
65b0: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
65c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
65d0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
65e0: 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a  a[i].done==0 ){.
65f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6600: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
6610: 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  r ORDER BY term 
6620: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
6630: 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ny ".           
6640: 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20   "column in the 
6650: 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69 2b 31  result set", i+1
6660: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6670: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
6680: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
6690: 2a 20 43 68 65 63 6b 20 65 76 65 72 79 20 74 65  * Check every te
66a0: 72 6d 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rm in the ORDER 
66b0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
66c0: 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79 20 6f  lause pOrderBy o
66d0: 66 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20  f.** the SELECT 
66e0: 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63  statement pSelec
66f0: 74 2e 20 20 49 66 20 61 6e 79 20 74 65 72 6d 20  t.  If any term 
6700: 69 73 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  is reference to 
6710: 61 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20  a.** result set 
6720: 65 78 70 72 65 73 73 69 6f 6e 20 28 61 73 20 64  expression (as d
6730: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
6740: 20 45 78 70 72 4c 69 73 74 2e 61 2e 69 43 6f 6c   ExprList.a.iCol
6750: 20 66 69 65 6c 64 29 0a 2a 2a 20 74 68 65 6e 20   field).** then 
6760: 63 6f 6e 76 65 72 74 20 74 68 61 74 20 74 65 72  convert that ter
6770: 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79 20 6f 66  m into a copy of
6780: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
6790: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  ng result set.**
67a0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49   column..**.** I
67b0: 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
67c0: 20 64 65 74 65 63 74 65 64 2c 20 61 64 64 20 61   detected, add a
67d0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
67e0: 74 6f 20 70 50 61 72 73 65 20 61 6e 64 0a 2a 2a  to pParse and.**
67f0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
6800: 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
6810: 66 20 6e 6f 20 65 72 72 6f 72 73 20 61 72 65 20  f no errors are 
6820: 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  seen..*/.int sql
6830: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
6840: 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65  GroupBy(.  Parse
6850: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6860: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6870: 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f  ext.  Leave erro
6880: 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20  r messages here 
6890: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
68a0: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  lect,      /* Th
68b0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
68c0: 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  nt containing th
68d0: 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  e clause */.  Ex
68e0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
68f0: 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ,   /* The ORDER
6900: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
6910: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f  clause to be pro
6920: 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  cessed */.  cons
6930: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
6940: 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72 20    /* "ORDER" or 
6950: 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20 20  "GROUP" */.){.  
6960: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
6970: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6980: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
6990: 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
69a0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
69b0: 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70 4f 72  Item;..  if( pOr
69c0: 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72  derBy==0 || pPar
69d0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
69e0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
69f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
6a00: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72  COLUMN.  if( pOr
6a10: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d  derBy->nExpr>db-
6a20: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
6a30: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
6a40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6a50: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
6a60: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25   many terms in %
6a70: 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54  s BY clause", zT
6a80: 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ype);.    return
6a90: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
6aa0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
6ab0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73  t->pEList;.  ass
6ac0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
6ad0: 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c  ;  /* sqlite3Sel
6ae0: 65 63 74 4e 65 77 28 29 20 67 75 61 72 61 6e 74  ectNew() guarant
6af0: 65 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 66 6f  ees this */.  fo
6b00: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
6b10: 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64  derBy->a; i<pOrd
6b20: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
6b30: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
6b40: 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20  if( pItem->iCol 
6b50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
6b60: 65 6d 2d 3e 69 43 6f 6c 3e 70 45 4c 69 73 74 2d  em->iCol>pEList-
6b70: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
6b80: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
6b90: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
6ba0: 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 70 45 4c   zType, i+1, pEL
6bb0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
6bc0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6bd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
6be0: 6f 6c 76 65 41 6c 69 61 73 28 70 50 61 72 73 65  olveAlias(pParse
6bf0: 2c 20 70 45 4c 69 73 74 2c 20 70 49 74 65 6d 2d  , pEList, pItem-
6c00: 3e 69 43 6f 6c 2d 31 2c 20 70 49 74 65 6d 2d 3e  >iCol-1, pItem->
6c10: 70 45 78 70 72 2c 20 7a 54 79 70 65 29 3b 0a 20  pExpr, zType);. 
6c20: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6c30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f  n 0;.}../*.** pO
6c40: 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44  rderBy is an ORD
6c50: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
6c60: 59 20 63 6c 61 75 73 65 20 69 6e 20 53 45 4c 45  Y clause in SELE
6c70: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65  CT statement pSe
6c80: 6c 65 63 74 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d  lect..** The Nam
6c90: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
6ca0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6cb0: 74 20 69 73 20 70 4e 43 2e 20 20 7a 54 79 70 65  t is pNC.  zType
6cc0: 20 69 73 20 65 69 74 68 65 72 0a 2a 2a 20 22 4f   is either.** "O
6cd0: 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
6ce0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
6cf0: 69 63 68 20 74 79 70 65 20 6f 66 20 63 6c 61 75  ich type of clau
6d00: 73 65 20 70 4f 72 64 65 72 42 79 20 69 73 2e 0a  se pOrderBy is..
6d10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6d20: 6e 65 20 72 65 73 6f 6c 76 65 73 20 65 61 63 68  ne resolves each
6d30: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6c 61   term of the cla
6d40: 75 73 65 20 69 6e 74 6f 20 61 6e 20 65 78 70 72  use into an expr
6d50: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68  ession..** If th
6d60: 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20  e order-by term 
6d70: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 49 20  is an integer I 
6d80: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20  between 1 and N 
6d90: 28 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a  (where N is the.
6da0: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ** number of col
6db0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
6dc0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
6dd0: 4c 45 43 54 29 20 74 68 65 6e 20 74 68 65 20 65  LECT) then the e
6de0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20  xpression.** in 
6df0: 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  the resolution i
6e00: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
6e10: 49 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20  I-th result-set 
6e20: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 0a  expression.  If.
6e30: 2a 2a 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  ** the order-by 
6e40: 74 65 72 6d 20 69 73 20 61 6e 20 69 64 65 6e 74  term is an ident
6e50: 69 66 79 20 74 68 61 74 20 63 6f 72 72 65 73 70  ify that corresp
6e60: 6f 6e 64 73 20 74 6f 20 74 68 65 20 41 53 2d 6e  onds to the AS-n
6e70: 61 6d 65 20 6f 66 0a 2a 2a 20 61 20 72 65 73 75  ame of.** a resu
6e80: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
6e90: 6e 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d  n, then the term
6ea0: 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 61 20 63   resolves to a c
6eb0: 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65  opy of the.** re
6ec0: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
6ed0: 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ion.  Otherwise,
6ee0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6ef0: 69 73 20 72 65 73 6f 6c 76 65 64 20 69 6e 0a 2a  is resolved in.*
6f00: 2a 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20  * the usual way 
6f10: 2d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  - using sqlite3R
6f20: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
6f30: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
6f40: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
6f50: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
6f60: 72 73 2e 20 20 49 66 20 65 72 72 6f 72 73 20 6f  rs.  If errors o
6f70: 63 63 75 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  ccur, then.** an
6f80: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6f90: 6f 72 20 6d 65 73 73 61 67 65 20 6d 69 67 68 74  or message might
6fa0: 20 62 65 20 6c 65 66 74 20 69 6e 20 70 50 61 72   be left in pPar
6fb0: 73 65 2e 20 20 28 4f 4f 4d 20 65 72 72 6f 72 73  se.  (OOM errors
6fc0: 0a 2a 2a 20 65 78 63 65 70 74 65 64 2e 29 0a 2a  .** excepted.).*
6fd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
6fe0: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
6ff0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
7000: 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pNC,     /* The
7010: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66   name context of
7020: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
7030: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
7040: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
7050: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
7060: 74 61 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67  tatement holding
7070: 20 70 4f 72 64 65 72 42 79 20 2a 2f 0a 20 20 45   pOrderBy */.  E
7080: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
7090: 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
70a0: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
70b0: 63 6c 61 75 73 65 20 74 6f 20 72 65 73 6f 6c 76  clause to resolv
70c0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
70d0: 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20  r *zType     /* 
70e0: 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f  Either "ORDER" o
70f0: 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70  r "GROUP", as ap
7100: 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a  propriate */.){.
7110: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7140: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
7150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7160: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
7170: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  umber */.  struc
7180: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
7190: 2a 70 49 74 65 6d 3b 20 20 20 2f 2a 20 41 20 74  *pItem;   /* A t
71a0: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
71b0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
71c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71e0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
71f0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  t */.  int nResu
7200: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
7210: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7220: 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
7230: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
7240: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
7250: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
7260: 52 65 73 75 6c 74 20 3d 20 70 53 65 6c 65 63 74  Result = pSelect
7270: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
7280: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  .  pParse = pNC-
7290: 3e 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69  >pParse;.  for(i
72a0: 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
72b0: 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42  By->a; i<pOrderB
72c0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
72d0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
72e0: 72 20 2a 70 45 20 3d 20 70 49 74 65 6d 2d 3e 70  r *pE = pItem->p
72f0: 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d  Expr;.    iCol =
7300: 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70   resolveAsName(p
7310: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
7320: 70 45 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20  pEList, pE);.   
7330: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
7340: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20       return 1;  
7350: 2f 2a 20 4f 4f 4d 20 65 72 72 6f 72 20 2a 2f 0a  /* OOM error */.
7360: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
7370: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ol>0 ){.      /*
7380: 20 49 66 20 61 6e 20 41 53 2d 6e 61 6d 65 20 6d   If an AS-name m
7390: 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 6d  atch is found, m
73a0: 61 72 6b 20 74 68 69 73 20 4f 52 44 45 52 20 42  ark this ORDER B
73b0: 59 20 63 6f 6c 75 6d 6e 20 61 73 20 62 65 69 6e  Y column as bein
73c0: 67 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70  g.      ** a cop
73d0: 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  y of the iCol-th
73e0: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
73f0: 6d 6e 2e 20 20 54 68 65 20 73 75 62 73 65 71 75  mn.  The subsequ
7400: 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ent call to.    
7410: 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 6f    ** sqlite3Reso
7420: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
7430: 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  ) will convert t
7440: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
7450: 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
7460: 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
7470: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
7480: 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ssion. */.      
7490: 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 69 43  pItem->iCol = iC
74a0: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
74b0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
74c0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
74d0: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
74e0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
74f0: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
7500: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
7510: 6e 73 74 61 6e 74 2e 20 20 41 67 61 69 6e 2c 20  nstant.  Again, 
7520: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  set the column. 
7530: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 73       ** number s
7540: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 52 65  o that sqlite3Re
7550: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
7560: 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74  y() will convert
7570: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72   the.      ** or
7580: 64 65 72 2d 62 79 20 74 65 72 6d 20 74 6f 20 61  der-by term to a
7590: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72 65 73   copy of the res
75a0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
75b0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
75c0: 69 43 6f 6c 3c 31 20 29 7b 0a 20 20 20 20 20 20  iCol<1 ){.      
75d0: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
75e0: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
75f0: 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 6e 52 65   zType, i+1, nRe
7600: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 72  sult);.        r
7610: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7620: 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
7630: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
7640: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
7650: 0a 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69  ..    /* Otherwi
7660: 73 65 2c 20 74 72 65 61 74 20 74 68 65 20 4f 52  se, treat the OR
7670: 44 45 52 20 42 59 20 74 65 72 6d 20 61 73 20 61  DER BY term as a
7680: 6e 20 6f 72 64 69 6e 61 72 79 20 65 78 70 72 65  n ordinary expre
7690: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 49 74  ssion */.    pIt
76a0: 65 6d 2d 3e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  em->iCol = 0;.  
76b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
76c0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e  olveExprNames(pN
76d0: 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  C, pE) ){.      
76e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
76f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
7700: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
7710: 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
7720: 70 53 65 6c 65 63 74 2c 20 70 4f 72 64 65 72 42  pSelect, pOrderB
7730: 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  y, zType);.}../*
7740: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65  .** Resolve name
7750: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
7760: 73 74 61 74 65 6d 65 6e 74 20 70 20 61 6e 64 20  statement p and 
7770: 61 6c 6c 20 6f 66 20 69 74 73 20 64 65 73 63 65  all of its desce
7780: 6e 64 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ndents..*/.stati
7790: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 53 65 6c  c int resolveSel
77a0: 65 63 74 53 74 65 70 28 57 61 6c 6b 65 72 20 2a  ectStep(Walker *
77b0: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
77c0: 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  *p){.  NameConte
77d0: 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20 20 2f  xt *pOuterNC;  /
77e0: 2a 20 43 6f 6e 74 65 78 74 20 74 68 61 74 20 63  * Context that c
77f0: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 53 45 4c  ontains this SEL
7800: 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ECT */.  NameCon
7810: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
7820: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
7830: 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20   of this SELECT 
7840: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f  */.  int isCompo
7850: 75 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  und;         /* 
7860: 54 72 75 65 20 69 66 20 70 20 69 73 20 61 20 63  True if p is a c
7870: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
7880: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e  /.  int nCompoun
7890: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  d;          /* N
78a0: 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f 75 6e  umber of compoun
78b0: 64 20 74 65 72 6d 73 20 70 72 6f 63 65 73 73 65  d terms processe
78c0: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61  d so far */.  Pa
78d0: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
78e0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
78f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
7900: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
7910: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
7920: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  set expression l
7930: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ist */.  int i; 
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7960: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7970: 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 2f 2a  pGroupBy;     /*
7980: 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
7990: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
79a0: 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20   *pLeftmost;    
79b0: 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 6f    /* Left-most o
79c0: 66 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f  f SELECT of a co
79d0: 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 73 71 6c 69  mpound */.  sqli
79e0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
79f0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
7a00: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
7a10: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
7a20: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   );.  if( p->sel
7a30: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
7a40: 76 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ved ){.    retur
7a50: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
7a60: 0a 20 20 70 4f 75 74 65 72 4e 43 20 3d 20 70 57  .  pOuterNC = pW
7a70: 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
7a80: 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
7a90: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
7aa0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
7ab0: 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 73 71 6c 69  /* Normally sqli
7ac0: 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
7ad0: 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  ) will be called
7ae0: 20 66 69 72 73 74 20 61 6e 64 20 77 69 6c 6c 20   first and will 
7af0: 68 61 76 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64  have.  ** alread
7b00: 79 20 65 78 70 61 6e 64 65 64 20 74 68 69 73 20  y expanded this 
7b10: 53 45 4c 45 43 54 2e 20 20 48 6f 77 65 76 65 72  SELECT.  However
7b20: 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  , if this is a s
7b30: 75 62 71 75 65 72 79 20 77 69 74 68 69 6e 0a 20  ubquery within. 
7b40: 20 2a 2a 20 61 6e 20 65 78 70 72 65 73 73 69 6f   ** an expressio
7b50: 6e 2c 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  n, sqlite3Resolv
7b60: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 77 69 6c  eExprNames() wil
7b70: 6c 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  l be called with
7b80: 6f 75 74 20 61 0a 20 20 2a 2a 20 70 72 69 6f 72  out a.  ** prior
7b90: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7ba0: 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 2e 20  SelectExpand(). 
7bb0: 20 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65   When that happe
7bc0: 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a 20 73 71 6c  ns, let.  ** sql
7bd0: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 29  ite3SelectPrep()
7be0: 20 64 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 70   do all of the p
7bf0: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
7c00: 69 73 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2a 20  is SELECT..  ** 
7c10: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
7c20: 70 28 29 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20  p() will invoke 
7c30: 62 6f 74 68 20 73 71 6c 69 74 65 33 53 65 6c 65  both sqlite3Sele
7c40: 63 74 45 78 70 61 6e 64 28 29 20 61 6e 64 0a 20  ctExpand() and. 
7c50: 20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65   ** this routine
7c60: 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
7c70: 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  order..  */.  if
7c80: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
7c90: 20 53 46 5f 45 78 70 61 6e 64 65 64 29 3d 3d 30   SF_Expanded)==0
7ca0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
7cb0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
7cc0: 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
7cd0: 20 20 20 20 72 65 74 75 72 6e 20 28 70 50 61 72      return (pPar
7ce0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
7cf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20  mallocFailed) ? 
7d00: 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f  WRC_Abort : WRC_
7d10: 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 69 73  Prune;.  }..  is
7d20: 43 6f 6d 70 6f 75 6e 64 20 3d 20 70 2d 3e 70 50  Compound = p->pP
7d30: 72 69 6f 72 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70  rior!=0;.  nComp
7d40: 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 70 4c 65 66  ound = 0;.  pLef
7d50: 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 77 68 69  tmost = p;.  whi
7d60: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  le( p ){.    ass
7d70: 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
7d80: 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
7d90: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
7da0: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
7db0: 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 3d 3d  & SF_Resolved)==
7dc0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  0 );.    p->selF
7dd0: 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 73 6f 6c  lags |= SF_Resol
7de0: 76 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73  ved;..    /* Res
7df0: 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
7e00: 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
7e10: 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
7e20: 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 20 20  uses. These.    
7e30: 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
7e40: 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
7e50: 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
7e60: 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
7e70: 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
7e80: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
7e90: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
7ea0: 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
7eb0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66  = pParse;.    if
7ec0: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
7ed0: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
7ee0: 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20  p->pLimit) ||.  
7ef0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
7f00: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
7f10: 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20  NC, p->pOffset) 
7f20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7f30: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
7f40: 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  .  .    /* Set u
7f50: 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65  p the local name
7f60: 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73  -context to pass
7f70: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   to sqlite3Resol
7f80: 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 74 6f  veExprNames() to
7f90: 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20  .    ** resolve 
7fa0: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65  the result-set e
7fb0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
7fc0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 61      */.    sNC.a
7fd0: 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20  llowAgg = 1;.   
7fe0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
7ff0: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 73 4e 43  p->pSrc;.    sNC
8000: 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e  .pNext = pOuterN
8010: 43 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73  C;.  .    /* Res
8020: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  olve names in th
8030: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  e result set. */
8040: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  .    pEList = p-
8050: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  >pEList;.    ass
8060: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
8070: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8080: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8090: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
80a0: 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pX = pEList->a
80b0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
80c0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
80d0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
80e0: 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20  C, pX) ){.      
80f0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
8100: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
8110: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 75  }.  .    /* Recu
8120: 72 73 69 76 65 6c 79 20 72 65 73 6f 6c 76 65 20  rsively resolve 
8130: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73 75 62  names in all sub
8140: 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2f 0a 20  queries.    */. 
8150: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
8160: 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
8170: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
8180: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
8190: 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
81a0: 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  a[i];.      if( 
81b0: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
81c0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
81d0: 63 68 61 72 20 2a 7a 53 61 76 65 64 43 6f 6e 74  char *zSavedCont
81e0: 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
81f0: 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
8200: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
8210: 4e 61 6d 65 20 29 20 70 50 61 72 73 65 2d 3e 7a  Name ) pParse->z
8220: 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
8230: 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
8240: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
8250: 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
8260: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
8270: 6c 65 63 74 2c 20 26 73 4e 43 29 3b 0a 20 20 20  lect, &sNC);.   
8280: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
8290: 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
82a0: 65 64 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  edContext;.     
82b0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
82c0: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
82d0: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
82e0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
82f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
8300: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
8310: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
8320: 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  nctions in the r
8330: 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e  esult-set, and n
8340: 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 20 20  o GROUP BY .    
8350: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64  ** expression, d
8360: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72  o not allow aggr
8370: 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66  egates in any of
8380: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
8390: 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  ssions..    */. 
83a0: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
83b0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
83c0: 72 65 67 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20  regate)==0 );.  
83d0: 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
83e0: 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69 66  pGroupBy;.    if
83f0: 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e  ( pGroupBy || sN
8400: 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  C.hasAgg ){.    
8410: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
8420: 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
8430: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8440: 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  sNC.allowAgg = 0
8450: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
8460: 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
8470: 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
8480: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
8490: 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
84a0: 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
84b0: 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
84c0: 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b   && !pGroupBy ){
84d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
84e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
84f0: 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
8500: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
8510: 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
8520: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
8530: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a  Abort;.    }.  .
8540: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65      /* Add the e
8550: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
8560: 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65  o the name-conte
8570: 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  xt before parsin
8580: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  g the.    ** oth
8590: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  er expressions i
85a0: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
85b0: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
85c0: 73 6f 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65  so that.    ** e
85d0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
85e0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28  e WHERE clause (
85f0: 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20  etc.) can refer 
8600: 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62  to expressions b
8610: 79 0a 20 20 20 20 2a 2a 20 61 6c 69 61 73 65 73  y.    ** aliases
8620: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8630: 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  et..    **.    *
8640: 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49  * Minor point: I
8650: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
8660: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  se, then the exp
8670: 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ression will be.
8680: 20 20 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61      ** re-evalua
8690: 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66  ted for each ref
86a0: 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20  erence to it..  
86b0: 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 45 4c    */.    sNC.pEL
86c0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
86d0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
86e0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
86f0: 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65  (&sNC, p->pWhere
8700: 29 20 7c 7c 0a 20 20 20 20 20 20 20 73 71 6c 69  ) ||.       sqli
8710: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
8720: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
8730: 76 69 6e 67 29 0a 20 20 20 20 29 7b 0a 20 20 20  ving).    ){.   
8740: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
8750: 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ort;.    }..    
8760: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
8770: 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
8780: 75 73 65 73 20 6d 61 79 20 6e 6f 74 20 72 65 66  uses may not ref
8790: 65 72 20 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20  er to terms in. 
87a0: 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
87b0: 69 65 73 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ies .    */.    
87c0: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
87d0: 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20     sNC.allowAgg 
87e0: 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  = 1;..    /* Pro
87f0: 63 65 73 73 20 74 68 65 20 4f 52 44 45 52 20 42  cess the ORDER B
8800: 59 20 63 6c 61 75 73 65 20 66 6f 72 20 73 69 6e  Y clause for sin
8810: 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54 20 73 74  gleton SELECT st
8820: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2a  atements..    **
8830: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
8840: 61 75 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e  ause for compoun
8850: 64 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ds SELECT statem
8860: 65 6e 74 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ents is handled.
8870: 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61 66      ** below, af
8880: 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ter all of the r
8890: 65 73 75 6c 74 2d 73 65 74 73 20 66 6f 72 20 61  esult-sets for a
88a0: 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e  ll of the elemen
88b0: 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ts of.    ** the
88c0: 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62   compound have b
88d0: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20  een resolved..  
88e0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73    */.    if( !is
88f0: 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f  Compound && reso
8900: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
8910: 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  &sNC, p, p->pOrd
8920: 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20 29  erBy, "ORDER") )
8930: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
8940: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
8950: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
8960: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
8970: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
8980: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rt;.    }.  .   
8990: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
89a0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
89b0: 20 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69    At the same ti
89c0: 6d 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 0a 20  me, make sure . 
89d0: 20 20 20 2a 2a 20 74 68 65 20 47 52 4f 55 50 20     ** the GROUP 
89e0: 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
89f0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65  ot contain aggre
8a00: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  gate functions..
8a10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8a20: 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
8a30: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8a40: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
8a50: 20 20 0a 20 20 20 20 20 20 69 66 28 20 72 65 73    .      if( res
8a60: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
8a70: 28 26 73 4e 43 2c 20 70 2c 20 70 47 72 6f 75 70  (&sNC, p, pGroup
8a80: 42 79 2c 20 22 47 52 4f 55 50 22 29 20 7c 7c 20  By, "GROUP") || 
8a90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8aa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
8ab0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
8ac0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8ad0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  i=0, pItem=pGrou
8ae0: 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70  pBy->a; i<pGroup
8af0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
8b00: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
8b10: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
8b20: 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78  perty(pItem->pEx
8b30: 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20  pr, EP_Agg) ){. 
8b40: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8b50: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8b60: 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
8b70: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
8b80: 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
8b90: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52           "the GR
8ba0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b  OUP BY clause");
8bb0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
8bc0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
8bd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8be0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
8bf0: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
8c00: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6f 6d   term of the com
8c10: 70 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a 20 20 20  pound.    */.   
8c20: 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
8c30: 20 20 20 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b 3b      nCompound++;
8c40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c  .  }..  /* Resol
8c50: 76 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ve the ORDER BY 
8c60: 6f 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  on a compound SE
8c70: 4c 45 43 54 20 61 66 74 65 72 20 61 6c 6c 20 74  LECT after all t
8c80: 65 72 6d 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  erms of.  ** the
8c90: 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62   compound have b
8ca0: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20  een resolved..  
8cb0: 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f  */.  if( isCompo
8cc0: 75 6e 64 20 26 26 20 72 65 73 6f 6c 76 65 43 6f  und && resolveCo
8cd0: 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50  mpoundOrderBy(pP
8ce0: 61 72 73 65 2c 20 70 4c 65 66 74 6d 6f 73 74 29  arse, pLeftmost)
8cf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
8d00: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
8d10: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
8d20: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
8d30: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
8d40: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
8d50: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
8d60: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
8d70: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 6e  table columns an
8d80: 64 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  d result-set col
8d90: 75 6d 6e 73 2e 20 20 41 74 20 74 68 65 20 73 61  umns.  At the sa
8da0: 6d 65 20 74 69 6d 65 2c 20 64 6f 20 65 72 72 6f  me time, do erro
8db0: 72 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 6f 6e  r.** checking on
8dc0: 20 66 75 6e 63 74 69 6f 6e 20 75 73 61 67 65 20   function usage 
8dd0: 61 6e 64 20 73 65 74 20 61 20 66 6c 61 67 20 69  and set a flag i
8de0: 66 20 61 6e 79 20 61 67 67 72 65 67 61 74 65 20  f any aggregate 
8df0: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  functions.** are
8e00: 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20   seen..**.** To 
8e10: 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 20 63 6f  resolve table co
8e20: 6c 75 6d 6e 73 20 72 65 66 65 72 65 6e 63 65 73  lumns references
8e30: 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f 64   we look for nod
8e40: 65 73 20 28 6f 72 20 73 75 62 74 72 65 65 73 29  es (or subtrees)
8e50: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 72 6d   of the .** form
8e60: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72   X.Y.Z or Y.Z or
8e70: 20 6a 75 73 74 20 5a 20 77 68 65 72 65 0a 2a 2a   just Z where.**
8e80: 0a 2a 2a 20 20 20 20 20 20 58 3a 20 20 20 54 68  .**      X:   Th
8e90: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
8ea0: 62 61 73 65 2e 20 20 45 78 3a 20 20 22 6d 61 69  base.  Ex:  "mai
8eb0: 6e 22 20 6f 72 20 22 74 65 6d 70 22 20 6f 72 0a  n" or "temp" or.
8ec0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 65  **           the
8ed0: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 61   symbolic name a
8ee0: 73 73 69 67 6e 65 64 20 74 6f 20 61 6e 20 41 54  ssigned to an AT
8ef0: 54 41 43 48 2d 65 64 20 64 61 74 61 62 61 73 65  TACH-ed database
8f00: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 3a 20  ..**.**      Y: 
8f10: 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20    The name of a 
8f20: 74 61 62 6c 65 20 69 6e 20 61 20 46 52 4f 4d 20  table in a FROM 
8f30: 63 6c 61 75 73 65 2e 20 20 4f 72 20 69 6e 20 61  clause.  Or in a
8f40: 20 74 72 69 67 67 65 72 0a 2a 2a 20 20 20 20 20   trigger.**     
8f50: 20 20 20 20 20 20 6f 6e 65 20 6f 66 20 74 68 65        one of the
8f60: 20 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22   special names "
8f70: 6f 6c 64 22 20 6f 72 20 22 6e 65 77 22 2e 0a 2a  old" or "new"..*
8f80: 2a 0a 2a 2a 20 20 20 20 20 20 5a 3a 20 20 20 54  *.**      Z:   T
8f90: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
8fa0: 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 59 2e 0a  umn in table Y..
8fb0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 64 65 20 61  **.** The node a
8fc0: 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  t the root of th
8fd0: 65 20 73 75 62 74 72 65 65 20 69 73 20 6d 6f 64  e subtree is mod
8fe0: 69 66 69 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  ified as follows
8ff0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 45 78 70 72 2e  :.**.**    Expr.
9000: 6f 70 20 20 20 20 20 20 20 20 43 68 61 6e 67 65  op        Change
9010: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a  d to TK_COLUMN.*
9020: 2a 20 20 20 20 45 78 70 72 2e 70 54 61 62 20 20  *    Expr.pTab  
9030: 20 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68      Points to th
9040: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 66  e Table object f
9050: 6f 72 20 58 2e 59 0a 2a 2a 20 20 20 20 45 78 70  or X.Y.**    Exp
9060: 72 2e 69 43 6f 6c 75 6d 6e 20 20 20 54 68 65 20  r.iColumn   The 
9070: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20  column index in 
9080: 58 2e 59 2e 20 20 2d 31 20 66 6f 72 20 74 68 65  X.Y.  -1 for the
9090: 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 45 78   rowid..**    Ex
90a0: 70 72 2e 69 54 61 62 6c 65 20 20 20 20 54 68 65  pr.iTable    The
90b0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
90c0: 62 65 72 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a 2a  ber for X.Y.**.*
90d0: 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20  *.** To resolve 
90e0: 72 65 73 75 6c 74 2d 73 65 74 20 72 65 66 65 72  result-set refer
90f0: 65 6e 63 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72 20  ences, look for 
9100: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73  expression nodes
9110: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
9120: 5a 20 28 77 69 74 68 20 6e 6f 20 58 20 61 6e 64  Z (with no X and
9130: 20 59 20 70 72 65 66 69 78 29 20 77 68 65 72 65   Y prefix) where
9140: 20 74 68 65 20 5a 20 6d 61 74 63 68 65 73 20 74   the Z matches t
9150: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a  he right-hand.**
9160: 20 73 69 7a 65 20 6f 66 20 61 6e 20 41 53 20 63   size of an AS c
9170: 6c 61 75 73 65 20 69 6e 20 74 68 65 20 72 65 73  lause in the res
9180: 75 6c 74 2d 73 65 74 20 6f 66 20 61 20 53 45 4c  ult-set of a SEL
9190: 45 43 54 2e 20 20 54 68 65 20 5a 20 65 78 70 72  ECT.  The Z expr
91a0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 70  ession.** is rep
91b0: 6c 61 63 65 64 20 62 79 20 61 20 63 6f 70 79 20  laced by a copy 
91c0: 6f 66 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  of the left-hand
91d0: 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 65 73   side of the res
91e0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
91f0: 6f 6e 2e 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61 6d  on..** Table-nam
9200: 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 72  e and function r
9210: 65 73 6f 6c 75 74 69 6f 6e 20 6f 63 63 75 72 73  esolution occurs
9220: 20 6f 6e 20 74 68 65 20 73 75 62 73 74 69 74 75   on the substitu
9230: 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ted expression.*
9240: 2a 20 74 72 65 65 2e 20 20 46 6f 72 20 65 78 61  * tree.  For exa
9250: 6d 70 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  mple, in:.**.** 
9260: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
9270: 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46  AS x, c+d AS y F
9280: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
9290: 78 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 78 22  x;.**.** The "x"
92a0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 72 64   term of the ord
92b0: 65 72 20 62 79 20 69 73 20 72 65 70 6c 61 63 65  er by is replace
92c0: 64 20 62 79 20 22 61 2b 62 22 20 74 6f 20 72 65  d by "a+b" to re
92d0: 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  nder:.**.**     
92e0: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
92f0: 2c 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20  , c+d AS y FROM 
9300: 74 31 20 4f 52 44 45 52 20 42 59 20 61 2b 62 3b  t1 ORDER BY a+b;
9310: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
9320: 63 61 6c 6c 73 20 61 72 65 20 63 68 65 63 6b 65  calls are checke
9330: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
9340: 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
9350: 20 69 73 20 0a 2a 2a 20 64 65 66 69 6e 65 64 20   is .** defined 
9360: 61 6e 64 20 74 68 61 74 20 74 68 65 20 63 6f 72  and that the cor
9370: 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61  rect number of a
9380: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65  rguments are spe
9390: 63 69 66 69 65 64 2e 0a 2a 2a 20 49 66 20 74 68  cified..** If th
93a0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  e function is an
93b0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
93c0: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 4e  ion, then the pN
93d0: 43 2d 3e 68 61 73 41 67 67 20 69 73 0a 2a 2a 20  C->hasAgg is.** 
93e0: 73 65 74 20 61 6e 64 20 74 68 65 20 6f 70 63 6f  set and the opco
93f0: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 66 72  de is changed fr
9400: 6f 6d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 74  om TK_FUNCTION t
9410: 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  o TK_AGG_FUNCTIO
9420: 4e 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 78 70 72  N..** If an expr
9430: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
9440: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
9450: 6f 6e 73 20 74 68 65 6e 20 74 68 65 20 45 50 5f  ons then the EP_
9460: 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20  Agg.** property 
9470: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
9480: 6e 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  n is set..**.** 
9490: 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  An error message
94a0: 20 69 73 20 6c 65 66 74 20 69 6e 20 70 50 61 72   is left in pPar
94b0: 73 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  se if anything i
94c0: 73 20 61 6d 69 73 73 2e 20 20 54 68 65 20 6e 75  s amiss.  The nu
94d0: 6d 62 65 72 0a 2a 2a 20 69 66 20 65 72 72 6f 72  mber.** if error
94e0: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
94f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73  /.int sqlite3Res
9500: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 20 0a  olveExprNames( .
9510: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
9520: 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  NC,       /* Nam
9530: 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76  espace to resolv
9540: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
9550: 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  . */.  Expr *pEx
9560: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
9570: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
9580: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e   to be analyzed.
9590: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76   */.){.  int sav
95a0: 65 64 48 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b  edHasAgg;.  Walk
95b0: 65 72 20 77 3b 0a 0a 20 20 69 66 28 20 70 45 78  er w;..  if( pEx
95c0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
95d0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
95e0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
95f0: 7b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 61  {.    Parse *pPa
9600: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
9610: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
9620: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
9630: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
9640: 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50  >nHeight+pNC->pP
9650: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 20 29  arse->nHeight) )
9660: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
9670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
9680: 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70  se->nHeight += p
9690: 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20  Expr->nHeight;. 
96a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61 76 65   }.#endif.  save
96b0: 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68  dHasAgg = pNC->h
96c0: 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61  asAgg;.  pNC->ha
96d0: 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 2e 78 45  sAgg = 0;.  w.xE
96e0: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65  xprCallback = re
96f0: 73 6f 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20  solveExprStep;. 
9700: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
9710: 63 6b 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65  ck = resolveSele
9720: 63 74 53 74 65 70 3b 0a 20 20 77 2e 70 50 61 72  ctStep;.  w.pPar
9730: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
9740: 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
9750: 43 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  C;.  sqlite3Walk
9760: 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
9770: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9780: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 70  EXPR_DEPTH>0.  p
9790: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69  NC->pParse->nHei
97a0: 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48  ght -= pExpr->nH
97b0: 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20  eight;.#endif.  
97c0: 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20  if( pNC->nErr>0 
97d0: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
97e0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
97f0: 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69  _Error);.  }.  i
9800: 66 28 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 29  f( pNC->hasAgg )
9810: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
9820: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
9830: 41 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Agg);.  }else if
9840: 28 20 73 61 76 65 64 48 61 73 41 67 67 20 29 7b  ( savedHasAgg ){
9850: 0a 20 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67  .    pNC->hasAgg
9860: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
9870: 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
9880: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
9890: 6f 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  or);.}.../*.** R
98a0: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
98b0: 20 69 6e 20 61 6c 6c 20 65 78 70 72 65 73 73 69   in all expressi
98c0: 6f 6e 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ons of a SELECT 
98d0: 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65  and in all.** de
98e0: 63 65 6e 64 65 6e 74 73 20 6f 66 20 74 68 65 20  cendents of the 
98f0: 53 45 4c 45 43 54 2c 20 69 6e 63 6c 75 64 69 6e  SELECT, includin
9900: 67 20 63 6f 6d 70 6f 75 6e 64 73 20 6f 66 66 20  g compounds off 
9910: 6f 66 20 70 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a  of p->pPrior,.**
9920: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 65   subqueries in e
9930: 78 70 72 65 73 73 69 6f 6e 73 2c 20 61 6e 64 20  xpressions, and 
9940: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
9950: 61 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  as FROM clause.*
9960: 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53  * terms..**.** S
9970: 65 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ee sqlite3Resolv
9980: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 66 6f 72  eExprNames() for
9990: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
99a0: 66 20 74 68 65 20 6b 69 6e 64 73 20 6f 66 0a 2a  f the kinds of.*
99b0: 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  * transformation
99c0: 73 20 74 68 61 74 20 6f 63 63 75 72 2e 0a 2a 2a  s that occur..**
99d0: 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 73  .** All SELECT s
99e0: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
99f0: 20 68 61 76 65 20 62 65 65 6e 20 65 78 70 61 6e   have been expan
9a00: 64 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ded using.** sql
9a10: 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
9a20: 28 29 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  () prior to invo
9a30: 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
9a40: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
9a50: 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
9a60: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
9a70: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
9a80: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
9a90: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
9aa0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
9ab0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
9ac0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
9ad0: 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
9ae0: 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
9af0: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
9b00: 74 20 66 6f 72 20 70 61 72 65 6e 74 20 53 45 4c  t for parent SEL
9b10: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
9b20: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  .){.  Walker w;.
9b30: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
9b40: 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
9b50: 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78  back = resolveEx
9b60: 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c  prStep;.  w.xSel
9b70: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65  ectCallback = re
9b80: 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70 3b  solveSelectStep;
9b90: 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
9ba0: 61 72 73 65 3b 0a 20 20 77 2e 75 2e 70 4e 43 20  arse;.  w.u.pNC 
9bb0: 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20 73 71  = pOuterNC;.  sq
9bc0: 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
9bd0: 26 77 2c 20 70 29 3b 0a 7d 0a                    &w, p);.}.