/ Hex Artifact Content
Login

Artifact 6c32f21b5835136591b86cce6a82cde5947027c4:


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 31 32 20 32 30 30  lve.c,v 1.12 200
0230: 38 2f 31 32 2f 30 39 20 31 33 3a 30 34 3a 32 39  8/12/09 13:04:29
0240: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0250: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0260: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h".#include <s
0270: 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64  tdlib.h>.#includ
0280: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
0290: 0a 2a 2a 20 54 75 72 6e 20 74 68 65 20 70 45 78  .** Turn the pEx
02a0: 70 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  pr expression in
02b0: 74 6f 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20  to an alias for 
02c0: 74 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75  the iCol-th colu
02d0: 6d 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 73  mn of the.** res
02e0: 75 6c 74 20 73 65 74 20 69 6e 20 70 45 4c 69 73  ult set in pELis
02f0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
0300: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
0310: 6e 20 69 73 20 61 20 73 69 6d 70 6c 65 20 63 6f  n is a simple co
0320: 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2c 20  lumn reference, 
0330: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
0340: 65 0a 2a 2a 20 6d 61 6b 65 73 20 61 6e 20 65 78  e.** makes an ex
0350: 61 63 74 20 63 6f 70 79 2e 20 20 42 75 74 20 66  act copy.  But f
0360: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 6b 69 6e  or any other kin
0370: 64 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 2c  d of expression,
0380: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
0390: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
03a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 63  the result set c
03b0: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 61 72 67  olumn as the arg
03c0: 75 6d 65 6e 74 20 74 6f 20 74 68 65 0a 2a 2a 20  ument to the.** 
03d0: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 2e 20  TK_AS operator. 
03e0: 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72 61   The TK_AS opera
03f0: 74 6f 72 20 63 61 75 73 65 73 20 74 68 65 20 65  tor causes the e
0400: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 0a  xpression to be.
0410: 2a 2a 20 65 76 61 6c 75 61 74 65 64 20 6a 75 73  ** evaluated jus
0420: 74 20 6f 6e 63 65 20 61 6e 64 20 74 68 65 6e 20  t once and then 
0430: 72 65 75 73 65 64 20 66 6f 72 20 65 61 63 68 20  reused for each 
0440: 61 6c 69 61 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  alias..**.** The
0450: 20 72 65 61 73 6f 6e 20 66 6f 72 20 73 75 70 70   reason for supp
0460: 72 65 73 73 69 6e 67 20 74 68 65 20 54 4b 5f 41  ressing the TK_A
0470: 53 20 74 65 72 6d 20 77 68 65 6e 20 74 68 65 20  S term when the 
0480: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
0490: 73 69 6d 70 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e  simple.** column
04a0: 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 73 6f   reference is so
04b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6c 75 6d 6e   that the column
04c0: 20 72 65 66 65 72 65 6e 63 65 20 77 69 6c 6c 20   reference will 
04d0: 62 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 73  be recognized as
04e0: 0a 2a 2a 20 75 73 61 62 6c 65 20 62 79 20 69 6e  .** usable by in
04f0: 64 69 63 65 73 20 77 69 74 68 69 6e 20 74 68 65  dices within the
0500: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
0510: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 2e 20  ocessing logic. 
0520: 0a 2a 2a 0a 2a 2a 20 48 61 63 6b 3a 20 20 54 68  .**.** Hack:  Th
0530: 65 20 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72  e TK_AS operator
0540: 20 69 73 20 69 6e 68 69 62 69 74 65 64 20 69 66   is inhibited if
0550: 20 7a 54 79 70 65 5b 30 5d 3d 3d 27 47 27 2e 20   zType[0]=='G'. 
0560: 20 54 68 69 73 20 6d 65 61 6e 73 0a 2a 2a 20 74   This means.** t
0570: 68 61 74 20 69 6e 20 61 20 47 52 4f 55 50 20 42  hat in a GROUP B
0580: 59 20 63 6c 61 75 73 65 2c 20 74 68 65 20 65 78  Y clause, the ex
0590: 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c  pression is eval
05a0: 75 61 74 65 64 20 74 77 69 63 65 2e 20 20 48 65  uated twice.  He
05b0: 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  nce:.**.**     S
05c0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29 25 35  ELECT random()%5
05d0: 20 41 53 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20   AS x, count(*) 
05e0: 46 52 4f 4d 20 74 61 62 20 47 52 4f 55 50 20 42  FROM tab GROUP B
05f0: 59 20 78 0a 2a 2a 0a 2a 2a 20 49 73 20 65 71 75  Y x.**.** Is equ
0600: 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a  ivalent to:.**.*
0610: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e  *     SELECT ran
0620: 64 6f 6d 28 29 25 35 20 41 53 20 78 2c 20 63 6f  dom()%5 AS x, co
0630: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 61 62 20  unt(*) FROM tab 
0640: 47 52 4f 55 50 20 42 59 20 72 61 6e 64 6f 6d 28  GROUP BY random(
0650: 29 25 35 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  )%5.**.** The re
0660: 73 75 6c 74 20 6f 66 20 72 61 6e 64 6f 6d 28 29  sult of random()
0670: 25 35 20 69 6e 20 74 68 65 20 47 52 4f 55 50 20  %5 in the GROUP 
0680: 42 59 20 63 6c 61 75 73 65 20 69 73 20 70 72 6f  BY clause is pro
0690: 62 61 62 6c 79 20 64 69 66 66 65 72 65 6e 74 0a  bably different.
06a0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75  ** from the resu
06b0: 6c 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  lt in the result
06c0: 2d 73 65 74 2e 20 20 57 65 20 6d 69 67 68 74 20  -set.  We might 
06d0: 66 69 78 20 74 68 69 73 20 73 6f 6d 65 64 61 79  fix this someday
06e0: 2e 20 20 4f 72 0a 2a 2a 20 74 68 65 6e 20 61 67  .  Or.** then ag
06f0: 61 69 6e 2c 20 77 65 20 6d 69 67 68 74 20 6e 6f  ain, we might no
0700: 74 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t....*/.static v
0710: 6f 69 64 20 72 65 73 6f 6c 76 65 41 6c 69 61 73  oid resolveAlias
0720: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0730: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
0740: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
0750: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
0760: 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 72  ist,      /* A r
0770: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
0780: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
0790: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
07a0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
07b0: 73 65 74 2e 20 20 30 2e 2e 70 45 4c 69 73 74 2d  set.  0..pEList-
07c0: 3e 6e 45 78 70 72 2d 31 20 2a 2f 0a 20 20 45 78  >nExpr-1 */.  Ex
07d0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
07e0: 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 6f 72       /* Transfor
07f0: 6d 20 74 68 69 73 20 69 6e 74 6f 20 61 6e 20 61  m this into an a
0800: 6c 69 61 73 20 74 6f 20 74 68 65 20 72 65 73 75  lias to the resu
0810: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63 6f 6e 73  lt set */.  cons
0820: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
0830: 20 20 20 2f 2a 20 22 47 52 4f 55 50 22 20 6f 72     /* "GROUP" or
0840: 20 22 4f 52 44 45 52 22 20 6f 72 20 22 22 20 2a   "ORDER" or "" *
0850: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4f 72  /.){.  Expr *pOr
0860: 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ig;           /*
0870: 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   The iCol-th col
0880: 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  umn of the resul
0890: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
08a0: 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20  *pDup;          
08b0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 4f 72    /* Copy of pOr
08c0: 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ig */.  sqlite3 
08d0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
08e0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
08f0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
0900: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
0910: 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74 2d 3e  && iCol<pEList->
0920: 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72 69 67  nExpr );.  pOrig
0930: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f   = pEList->a[iCo
0940: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  l].pExpr;.  asse
0950: 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29 3b 0a  rt( pOrig!=0 );.
0960: 20 20 61 73 73 65 72 74 28 20 70 4f 72 69 67 2d    assert( pOrig-
0970: 3e 66 6c 61 67 73 20 26 20 45 50 5f 52 65 73 6f  >flags & EP_Reso
0980: 6c 76 65 64 20 29 3b 0a 20 20 64 62 20 3d 20 70  lved );.  db = p
0990: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 44 75  Parse->db;.  pDu
09a0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
09b0: 75 70 28 64 62 2c 20 70 4f 72 69 67 29 3b 0a 20  up(db, pOrig);. 
09c0: 20 69 66 28 20 70 44 75 70 3d 3d 30 20 29 20 72   if( pDup==0 ) r
09d0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 44 75  eturn;.  if( pDu
09e0: 70 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op!=TK_COLUMN
09f0: 20 26 26 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47   && zType[0]!='G
0a00: 27 20 29 7b 0a 20 20 20 20 70 44 75 70 20 3d 20  ' ){.    pDup = 
0a10: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
0a20: 72 73 65 2c 20 54 4b 5f 41 53 2c 20 70 44 75 70  rse, TK_AS, pDup
0a30: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
0a40: 20 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75 72   pDup==0 ) retur
0a50: 6e 3b 0a 20 20 20 20 69 66 28 20 70 45 4c 69 73  n;.    if( pELis
0a60: 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41 6c 69 61  t->a[iCol].iAlia
0a70: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45  s==0 ){.      pE
0a80: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41  List->a[iCol].iA
0a90: 6c 69 61 73 20 3d 20 2b 2b 70 50 61 72 73 65 2d  lias = ++pParse-
0aa0: 3e 6e 41 6c 69 61 73 3b 0a 20 20 20 20 7d 0a 20  >nAlias;.    }. 
0ab0: 20 20 20 70 44 75 70 2d 3e 69 54 61 62 6c 65 20     pDup->iTable 
0ac0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c  = pEList->a[iCol
0ad0: 5d 2e 69 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20  ].iAlias;.  }.  
0ae0: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
0af0: 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65   & EP_ExpCollate
0b00: 20 29 7b 0a 20 20 20 20 70 44 75 70 2d 3e 70 43   ){.    pDup->pC
0b10: 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  oll = pExpr->pCo
0b20: 6c 6c 3b 0a 20 20 20 20 70 44 75 70 2d 3e 66 6c  ll;.    pDup->fl
0b30: 61 67 73 20 7c 3d 20 45 50 5f 45 78 70 43 6f 6c  ags |= EP_ExpCol
0b40: 6c 61 74 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  late;.  }.  sqli
0b50: 74 65 33 45 78 70 72 43 6c 65 61 72 28 64 62 2c  te3ExprClear(db,
0b60: 20 70 45 78 70 72 29 3b 0a 20 20 6d 65 6d 63 70   pExpr);.  memcp
0b70: 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20 73  y(pExpr, pDup, s
0b80: 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a  izeof(*pExpr));.
0b90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
0ba0: 64 62 2c 20 70 44 75 70 29 3b 0a 7d 0a 0a 2f 2a  db, pDup);.}../*
0bb0: 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
0bc0: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f  me of a column o
0bd0: 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a  f the form X.Y.Z
0be0: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
0bf0: 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68  Z, look up.** th
0c00: 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  at name in the s
0c10: 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62  et of source tab
0c20: 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  les in pSrcList 
0c30: 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78  and make the pEx
0c40: 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  pr .** expressio
0c50: 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63  n node refer bac
0c60: 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65  k to that source
0c70: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f   column.  The fo
0c80: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a  llowing changes.
0c90: 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70  ** are made to p
0ca0: 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  Expr:.**.**    p
0cb0: 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20  Expr->iDb       
0cc0: 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65      Set the inde
0cd0: 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f  x in db->aDb[] o
0ce0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 58  f the database X
0cf0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 28 65 76 65              (eve
0d10: 6e 20 69 66 20 58 20 69 73 20 69 6d 70 6c 69 65  n if X is implie
0d20: 64 29 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  d)..**    pExpr-
0d30: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
0d40: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
0d50: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
0d60: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
0d70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0d80: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
0d90: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
0da0: 45 78 70 72 2d 3e 70 54 61 62 20 20 20 20 20 20  Expr->pTab      
0db0: 20 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68      Points to th
0dc0: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
0dd0: 65 20 6f 66 20 58 2e 59 20 28 65 76 65 6e 20 69  e of X.Y (even i
0de0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  f.**            
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20 61               X a
0e00: 6e 64 2f 6f 72 20 59 20 61 72 65 20 69 6d 70 6c  nd/or Y are impl
0e10: 69 65 64 2e 29 0a 2a 2a 20 20 20 20 70 45 78 70  ied.).**    pExp
0e20: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20  r->iColumn      
0e30: 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75   Set to the colu
0e40: 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e  mn number within
0e50: 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20   the table..**  
0e60: 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
0e70: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b         Set to TK
0e80: 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70  _COLUMN..**    p
0e90: 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20  Expr->pLeft     
0ea0: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
0eb0: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
0ec0: 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20  o is deleted.** 
0ed0: 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74     pExpr->pRight
0ee0: 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72          Any expr
0ef0: 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e  ession this poin
0f00: 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64  ts to is deleted
0f10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54  ..**.** The pDbT
0f20: 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  oken is the name
0f30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
0f40: 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68 69   (the "X").  Thi
0f50: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a  s value may be.*
0f60: 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74  * NULL meaning t
0f70: 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74  hat name is of t
0f80: 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a  he form Y.Z or Z
0f90: 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65  .  Any available
0fa0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e   database.** can
0fb0: 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 70   be used.  The p
0fc0: 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68  TableToken is th
0fd0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
0fe0: 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20 20  ble (the "Y").  
0ff0: 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61  This.** value ca
1000: 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70 44 62  n be NULL if pDb
1010: 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55  Token is also NU
1020: 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65 54 6f  LL.  If pTableTo
1030: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a  ken is NULL it.*
1040: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
1050: 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d   form of the nam
1060: 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20  e is Z and that 
1070: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79  columns from any
1080: 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65   table.** can be
1090: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
10a0: 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20  the name cannot 
10b0: 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d  be resolved unam
10c0: 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65  biguously, leave
10d0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
10e0: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61  e.** in pParse a
10f0: 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  nd return non-ze
1100: 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ro.  Return zero
1110: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
1120: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75  static int looku
1130: 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  pName(.  Parse *
1140: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
1150: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1160: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
1170: 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f  *pDbToken,     /
1180: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1190: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
11a0: 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c  g table, or NULL
11b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
11c0: 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61  bleToken,  /* Na
11d0: 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74  me of table cont
11e0: 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f  aining column, o
11f0: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
1200: 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c  n *pColumnToken,
1210: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1220: 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d  column. */.  Nam
1230: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
1240: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f    /* The name co
1250: 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72 65  ntext used to re
1260: 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20 2a  solve the name *
1270: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
1280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
1290: 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20   this EXPR node 
12a0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c  point to the sel
12b0: 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ected column */.
12c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
12d0: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
12e0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
12f0: 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20 58  e.  The "X" in X
1300: 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a  .Y.Z */.  char *
1310: 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  zTab = 0;      /
1320: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
1330: 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69 6e  ble.  The "Y" in
1340: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f   X.Y.Z or Y.Z */
1350: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  .  char *zCol = 
1360: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
1370: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20  of the column.  
1380: 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74  The "Z" */.  int
1390: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
13a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
13b0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  rs */.  int cnt 
13c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13e0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
13f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
1400: 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30    int cntTab = 0
1410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1420: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1430: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
1440: 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  names */.  sqlit
1450: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1460: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  >db;         /* 
1470: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
1480: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  nection */.  str
1490: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
14a0: 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f   *pItem;       /
14b0: 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e  * Use for loopin
14c0: 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  g over pSrcList 
14d0: 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  items */.  struc
14e0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
14f0: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20  pMatch = 0;  /* 
1500: 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72  The matching pSr
1510: 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20  cList item */.  
1520: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f  NameContext *pTo
1530: 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20  pNC = pNC;      
1540: 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63    /* First namec
1550: 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69  ontext in the li
1560: 73 74 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20 2a  st */.  Schema *
1570: 70 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20  pSchema = 0;    
1580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 68            /* Sch
1590: 65 6d 61 20 6f 66 20 74 68 65 20 65 78 70 72 65  ema of the expre
15a0: 73 73 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65  ssion */..  asse
15b0: 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  rt( pColumnToken
15c0: 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e   && pColumnToken
15d0: 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20  ->z ); /* The Z 
15e0: 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20  in X.Y.Z cannot 
15f0: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 0a 20 20 2f 2a  be NULL */..  /*
1600: 20 44 65 71 75 6f 74 65 20 61 6e 64 20 7a 65 72   Dequote and zer
1610: 6f 2d 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o-terminate the 
1620: 6e 61 6d 65 73 20 2a 2f 0a 20 20 7a 44 62 20 3d  names */.  zDb =
1630: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1640: 54 6f 6b 65 6e 28 64 62 2c 20 70 44 62 54 6f 6b  Token(db, pDbTok
1650: 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73 71  en);.  zTab = sq
1660: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1670: 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 54 6f 6b  en(db, pTableTok
1680: 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71  en);.  zCol = sq
1690: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
16a0: 65 6e 28 64 62 2c 20 70 43 6f 6c 75 6d 6e 54 6f  en(db, pColumnTo
16b0: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ken);.  if( db->
16c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
16d0: 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e      goto lookupn
16e0: 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20  ame_end;.  }..  
16f0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1700: 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d 6d 61 74  e node to no-mat
1710: 63 68 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69  ch */.  pExpr->i
1720: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 70 45  Table = -1;.  pE
1730: 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 0a  xpr->pTab = 0;..
1740: 20 20 2f 2a 20 53 74 61 72 74 20 61 74 20 74 68    /* Start at th
1750: 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e  e inner-most con
1760: 74 65 78 74 20 61 6e 64 20 6d 6f 76 65 20 6f 75  text and move ou
1770: 74 77 61 72 64 20 75 6e 74 69 6c 20 61 20 6d 61  tward until a ma
1780: 74 63 68 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  tch is found */.
1790: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
17a0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  cnt==0 ){.    Ex
17b0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
17c0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
17d0: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
17e0: 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20  cList;..    if( 
17f0: 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
1800: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
1810: 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pSrcList->a; i<
1820: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
1830: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
1840: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
1850: 61 62 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ab;.        int 
1860: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  iDb;.        Col
1870: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20  umn *pCol;.  .  
1880: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 74        pTab = pIt
1890: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
18a0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
18b0: 30 20 26 26 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  0 && pTab->zName
18c0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  !=0 );.        i
18d0: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
18e0: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
18f0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1900: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
1910: 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20  ab->nCol>0 );.  
1920: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29        if( zTab )
1930: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1940: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b  pItem->zAlias ){
1950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
1960: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
1970: 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
1980: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
1990: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62  ite3StrICmp(zTab
19a0: 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29  Name, zTab)!=0 )
19b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
19c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19d0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
19e0: 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  abName = pTab->z
19f0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Name;.          
1a00: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
1a10: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
1a20: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
1a30: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
1a40: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
1a50: 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c  f( zDb!=0 && sql
1a60: 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e  ite3StrICmp(db->
1a70: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
1a80: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
1a90: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1aa0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1ab0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ac0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1ad0: 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29  f( 0==(cntTab++)
1ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
1af0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
1b00: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
1b10: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
1b20: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
1b30: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
1b40: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
1b50: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
1b60: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
1b70: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a   }.        for(j
1b80: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
1b90: 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
1ba0: 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; j++, pCol++){
1bb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
1bc0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
1bd0: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
1be0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1bf0: 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e     IdList *pUsin
1c00: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  g;.            c
1c10: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
1c20: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1c30: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
1c40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
1c50: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  xpr->pTab = pTab
1c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
1c70: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
1c80: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
1c90: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
1ca0: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;.            /
1cb0: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
1cc0: 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d   rowid (column -
1cd0: 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  1) for the INTEG
1ce0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
1cf0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
1d00: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
1d10: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
1d20: 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20  -1 : j;.        
1d30: 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 4c 69      if( i<pSrcLi
1d40: 73 74 2d 3e 6e 53 72 63 2d 31 20 29 7b 0a 20 20  st->nSrc-1 ){.  
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1d60: 70 49 74 65 6d 5b 31 5d 2e 6a 6f 69 6e 74 79 70  pItem[1].jointyp
1d70: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
1d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d90: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74    /* If this mat
1da0: 63 68 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74  ch occurred in t
1db0: 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
1dc0: 20 61 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c   a natural join,
1dd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1de0: 20 2a 2a 20 74 68 65 6e 20 73 6b 69 70 20 74 68   ** then skip th
1df0: 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 74 6f  e right table to
1e00: 20 61 76 6f 69 64 20 61 20 64 75 70 6c 69 63 61   avoid a duplica
1e10: 74 65 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  te match */.    
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65              pIte
1e30: 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m++;.           
1e40: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1e50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1e60: 28 20 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65  ( (pUsing = pIte
1e70: 6d 5b 31 5d 2e 70 55 73 69 6e 67 29 21 3d 30 20  m[1].pUsing)!=0 
1e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e90: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6d 61     /* If this ma
1ea0: 74 63 68 20 6f 63 63 75 72 73 20 6f 6e 20 61 20  tch occurs on a 
1eb0: 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 69  column that is i
1ec0: 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  n the USING clau
1ed0: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  se.             
1ee0: 20 20 20 2a 2a 20 6f 66 20 61 20 6a 6f 69 6e 2c     ** of a join,
1ef0: 20 73 6b 69 70 20 74 68 65 20 73 65 61 72 63 68   skip the search
1f00: 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
1f10: 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 0a  ble of the join.
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f30: 2a 2a 20 74 6f 20 61 76 6f 69 64 20 61 20 64 75  ** to avoid a du
1f40: 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20 74 68  plicate match th
1f50: 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ere. */.        
1f60: 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20          int k;. 
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1f80: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67  or(k=0; k<pUsing
1f90: 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ->nId; k++){.   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1fb0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
1fc0: 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a  p(pUsing->a[k].z
1fd0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
1fe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1ff0: 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20        pItem++;. 
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20     i++;.        
2020: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2030: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2050: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2060: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2080: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2090: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
20a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
20b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20c0: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f  IT_TRIGGER.    /
20d0: 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74  * If we have not
20e0: 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65   already resolve
20f0: 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e  d the name, then
2100: 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69   maybe .    ** i
2110: 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20  t is a new.* or 
2120: 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72  old.* trigger ar
2130: 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  gument reference
2140: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2150: 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d  zDb==0 && zTab!=
2160: 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70  0 && cnt==0 && p
2170: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
2180: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72 69  !=0 ){.      Tri
2190: 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67  ggerStack *pTrig
21a0: 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73  gerStack = pPars
21b0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20  e->trigStack;.  
21c0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
21d0: 3d 20 30 3b 0a 20 20 20 20 20 20 75 33 32 20 2a  = 0;.      u32 *
21e0: 70 69 43 6f 6c 4d 61 73 6b 3b 0a 20 20 20 20 20  piColMask;.     
21f0: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61   if( pTriggerSta
2200: 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31  ck->newIdx != -1
2210: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2220: 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20  mp("new", zTab) 
2230: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
2240: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2250: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
2260: 65 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61  ewIdx;.        a
2270: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
2280: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
2290: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72        pTab = pTr
22a0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
22b0: 3b 0a 20 20 20 20 20 20 20 20 70 69 43 6f 6c 4d  ;.        piColM
22c0: 61 73 6b 20 3d 20 26 28 70 54 72 69 67 67 65 72  ask = &(pTrigger
22d0: 53 74 61 63 6b 2d 3e 6e 65 77 43 6f 6c 4d 61 73  Stack->newColMas
22e0: 6b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  k);.      }else 
22f0: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63  if( pTriggerStac
2300: 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20  k->oldIdx != -1 
2310: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2320: 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d  p("old", zTab)==
2330: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
2340: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72  pr->iTable = pTr
2350: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
2360: 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  dx;.        asse
2370: 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63  rt( pTriggerStac
2380: 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20  k->pTab );.     
2390: 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67     pTab = pTrigg
23a0: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20  erStack->pTab;. 
23b0: 20 20 20 20 20 20 20 70 69 43 6f 6c 4d 61 73 6b         piColMask
23c0: 20 3d 20 26 28 70 54 72 69 67 67 65 72 53 74 61   = &(pTriggerSta
23d0: 63 6b 2d 3e 6f 6c 64 43 6f 6c 4d 61 73 6b 29 3b  ck->oldColMask);
23e0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
23f0: 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20  if( pTab ){ .   
2400: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
2410: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
2420: 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  Col = pTab->aCol
2430: 3b 0a 0a 20 20 20 20 20 20 20 20 70 53 63 68 65  ;..        pSche
2440: 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65  ma = pTab->pSche
2450: 6d 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54  ma;.        cntT
2460: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f  ab++;.        fo
2470: 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 20 3c  r(iCol=0; iCol <
2480: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f   pTab->nCol; iCo
2490: 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20  l++, pCol++) {. 
24a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
24b0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
24c0: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ->zName, zCol)==
24d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
24e0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
24f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
2500: 6d 6e 20 3d 20 69 43 6f 6c 3d 3d 70 54 61 62 2d  mn = iCol==pTab-
2510: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 69 43  >iPKey ? -1 : iC
2520: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
2530: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54  pExpr->pTab = pT
2540: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
2550: 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2570: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20  tcase( iCol==31 
2580: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2590: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
25a0: 3d 33 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =32 );.         
25b0: 20 20 20 20 20 2a 70 69 43 6f 6c 4d 61 73 6b 20       *piColMask 
25c0: 7c 3d 20 28 28 75 33 32 29 31 3c 3c 69 43 6f 6c  |= ((u32)1<<iCol
25d0: 29 20 7c 20 28 69 43 6f 6c 3e 3d 33 32 3f 30 78  ) | (iCol>=32?0x
25e0: 66 66 66 66 66 66 66 66 3a 30 29 3b 0a 20 20 20  ffffffff:0);.   
25f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2600: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2610: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2620: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2630: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
2640: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2650: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20  _TRIGGER) */..  
2660: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68    /*.    ** Perh
2670: 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20  aps the name is 
2680: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
2690: 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a  he ROWID.    */.
26a0: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
26b0: 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73  & cntTab==1 && s
26c0: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
26d0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  ol) ){.      cnt
26e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70   = 1;.      pExp
26f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
2700: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66  .      pExpr->af
2710: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
2720: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
2730: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
2740: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69  * If the input i
2750: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20  s of the form Z 
2760: 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e  (not Y.Z or X.Y.
2770: 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65  Z) then the name
2780: 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20   Z.    ** might 
2790: 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75  refer to an resu
27a0: 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54  lt-set alias.  T
27b0: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
27c0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20   example, when. 
27d0: 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73     ** we are res
27e0: 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20  olving names in 
27f0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2800: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2810: 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a  g command:.    *
2820: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c  *.    **     SEL
2830: 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f  ECT a+b AS x FRO
2840: 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c  M table WHERE x<
2850: 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  10;.    **.    *
2860: 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20  * In cases like 
2870: 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45  this, replace pE
2880: 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79 20  xpr with a copy 
2890: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
28a0: 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f  n that.    ** fo
28b0: 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  rms the result s
28c0: 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20  et entry ("a+b" 
28d0: 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
28e0: 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
28f0: 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e  iately..    ** N
2900: 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ote that the exp
2910: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
2920: 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64  esult set should
2930: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
2940: 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76  en.    ** resolv
2950: 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ed by the time t
2960: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
2970: 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20  is resolved..   
2980: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
2990: 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20 3d 20  =0 && (pEList = 
29a0: 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30 20  pNC->pEList)!=0 
29b0: 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20  && zTab==0 ){.  
29c0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
29d0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
29e0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
29f0: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
2a00: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
2a10: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
2a20: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2a30: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
2a40: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
2a50: 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 20   *pOrig;.       
2a60: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
2a70: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
2a80: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
2a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2aa0: 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  rt( pExpr->pList
2ab0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
2ac0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
2ad0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
2ae0: 20 20 20 20 20 20 20 20 70 4f 72 69 67 20 3d 20          pOrig = 
2af0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
2b00: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
2b10: 28 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67  ( !pNC->allowAgg
2b20: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
2b30: 72 74 79 28 70 4f 72 69 67 2c 20 45 50 5f 41 67  rty(pOrig, EP_Ag
2b40: 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g) ){.          
2b50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
2b60: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
2b70: 65 20 6f 66 20 61 6c 69 61 73 65 64 20 61 67 67  e of aliased agg
2b80: 72 65 67 61 74 65 20 25 73 22 2c 20 7a 41 73 29  regate %s", zAs)
2b90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
2ba0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2bb0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zCol);.         
2bc0: 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20     return 2;.   
2bd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2be0: 20 20 20 72 65 73 6f 6c 76 65 41 6c 69 61 73 28     resolveAlias(
2bf0: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
2c00: 6a 2c 20 70 45 78 70 72 2c 20 22 22 29 3b 0a 20  j, pExpr, "");. 
2c10: 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31           cnt = 1
2c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
2c30: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
2c40: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
2c50: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
2c60: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
2c70: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 5f 32 3b 0a  okupname_end_2;.
2c80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c90: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
2ca0: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
2cb0: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
2cc0: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
2cd0: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
2ce0: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
2cf0: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
2d00: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
2d10: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
2d20: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
2d30: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
2d40: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
2d50: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2d60: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
2d70: 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c  X and Y are NULL
2d80: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
2d90: 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c   if only the col
2da0: 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20  umn name Z is.  
2db0: 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64  ** supplied) and
2dc0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20   the value of Z 
2dd0: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64  is enclosed in d
2de0: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68  ouble-quotes, th
2df0: 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73  en.  ** Z is a s
2e00: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66  tring literal if
2e10: 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   it doesn't matc
2e20: 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h any column nam
2e30: 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a  es.  In that.  *
2e40: 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  * case, we need 
2e50: 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  to return right 
2e60: 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b  away and not mak
2e70: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
2e80: 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a  .  ** pExpr..  *
2e90: 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e  *.  ** Because n
2ea0: 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
2eb0: 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f  made to outer co
2ec0: 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d  ntexts, the pNC-
2ed0: 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64  >nRef.  ** field
2ee0: 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65  s are not change
2ef0: 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  d in any context
2f00: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
2f10: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
2f20: 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  & pColumnToken->
2f30: 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20  z[0]=='"' ){.   
2f40: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2f50: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 70 45  b, zCol);.    pE
2f60: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52  xpr->op = TK_STR
2f70: 49 4e 47 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ING;.    pExpr->
2f80: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 72 65  pTab = 0;.    re
2f90: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
2fa0: 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65  *.  ** cnt==0 me
2fb0: 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f  ans there was no
2fc0: 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20  t match.  cnt>1 
2fd0: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65  means there were
2fe0: 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72   two or.  ** mor
2ff0: 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68  e matches.  Eith
3000: 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20  er way, we have 
3010: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20  an error..  */. 
3020: 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20   if( cnt!=1 ){. 
3030: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
3040: 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20  Err;.    zErr = 
3050: 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63  cnt==0 ? "no suc
3060: 68 20 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d 62  h column" : "amb
3070: 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61  iguous column na
3080: 6d 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  me";.    if( zDb
3090: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
30b0: 2c 20 22 25 73 3a 20 25 73 2e 25 73 2e 25 73 22  , "%s: %s.%s.%s"
30c0: 2c 20 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54 61  , zErr, zDb, zTa
30d0: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65  b, zCol);.    }e
30e0: 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a  lse if( zTab ){.
30f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3100: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
3110: 73 3a 20 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c  s: %s.%s", zErr,
3120: 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20   zTab, zCol);.  
3130: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
3140: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3150: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c  Parse, "%s: %s",
3160: 20 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20   zErr, zCol);.  
3170: 20 20 7d 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e    }.    pTopNC->
3180: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  nErr++;.  }..  /
3190: 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72  * If a column fr
31a0: 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53  om a table in pS
31b0: 72 63 4c 69 73 74 20 69 73 20 72 65 66 65 72 65  rcList is refere
31c0: 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72  nced, then recor
31d0: 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74  d.  ** this fact
31e0: 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74   in the pSrcList
31f0: 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74  .a[].colUsed bit
3200: 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20  mask.  Column 0 
3210: 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20  causes.  ** bit 
3220: 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f  0 to be set.  Co
3230: 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20  lumn 1 sets bit 
3240: 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  1.  And so forth
3250: 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63  .  If the.  ** c
3260: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20  olumn number is 
3270: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
3280: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
3290: 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  in the bitmask. 
32a0: 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65   ** then set the
32b0: 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20   high-order bit 
32c0: 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a  of the bitmask..
32d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
32e0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20  ->iColumn>=0 && 
32f0: 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20  pMatch!=0 ){.   
3300: 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e   int n = pExpr->
3310: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 74 65 73  iColumn;.    tes
3320: 74 63 61 73 65 28 20 6e 3d 3d 42 4d 53 2d 31 20  tcase( n==BMS-1 
3330: 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 42 4d  );.    if( n>=BM
3340: 53 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 42  S ){.      n = B
3350: 4d 53 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  MS-1;.    }.    
3360: 61 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e  assert( pMatch->
3370: 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e  iCursor==pExpr->
3380: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d  iTable );.    pM
3390: 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d  atch->colUsed |=
33a0: 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 6e   ((Bitmask)1)<<n
33b0: 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d  ;.  }..lookupnam
33c0: 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65 61  e_end:.  /* Clea
33d0: 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 0a  n up and return.
33e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 62    */.  sqlite3Db
33f0: 46 72 65 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20  Free(db, zDb);. 
3400: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3410: 62 2c 20 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69  b, zTab);.  sqli
3420: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
3430: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
3440: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  .  pExpr->pLeft 
3450: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
3460: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
3470: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  pr->pRight);.  p
3480: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30  Expr->pRight = 0
3490: 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20  ;.  pExpr->op = 
34a0: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75  TK_COLUMN;.looku
34b0: 70 6e 61 6d 65 5f 65 6e 64 5f 32 3a 0a 20 20 73  pname_end_2:.  s
34c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
34d0: 20 7a 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63 6e   zCol);.  if( cn
34e0: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65  t==1 ){.    asse
34f0: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
3500: 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61    sqlite3AuthRea
3510: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
3520: 20 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70   pSchema, pNC->p
3530: 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 2f 2a  SrcList);.    /*
3540: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
3550: 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c  Ref value on all
3560: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66   name contexts f
3570: 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a  rom TopNC up to.
3580: 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74      ** the point
3590: 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20   where the name 
35a0: 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20  matched. */.    
35b0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61  for(;;){.      a
35c0: 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30  ssert( pTopNC!=0
35d0: 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43   );.      pTopNC
35e0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
35f0: 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20  if( pTopNC==pNC 
3600: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
3610: 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e  TopNC = pTopNC->
3620: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
3630: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20 65   return 0;.  } e
3640: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
3650: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
3660: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
3670: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71   callback for sq
3680: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 2e  lite3WalkExpr().
3690: 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73  .**.** Resolve s
36a0: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e  ymbolic names in
36b0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65  to TK_COLUMN ope
36c0: 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  rators for the c
36d0: 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69  urrent.** node i
36e0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
36f0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30   tree.  Return 0
3700: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65   to continue the
3710: 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20   search down.** 
3720: 74 68 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f  the tree or 2 to
3730: 20 61 62 6f 72 74 20 74 68 65 20 74 72 65 65 20   abort the tree 
3740: 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  walk..**.** This
3750: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
3760: 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  es error checkin
3770: 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c  g and name resol
3780: 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e  ution for.** fun
3790: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
37a0: 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61  e operator for a
37b0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
37c0: 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a  ns is changed.**
37d0: 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54   to TK_AGG_FUNCT
37e0: 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ION..*/.static i
37f0: 6e 74 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74  nt resolveExprSt
3800: 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ep(Walker *pWalk
3810: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
3820: 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  {.  NameContext 
3830: 2a 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  *pNC;.  Parse *p
3840: 50 61 72 73 65 3b 0a 0a 20 20 70 4e 43 20 3d 20  Parse;..  pNC = 
3850: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
3860: 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30    assert( pNC!=0
3870: 20 29 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70   );.  pParse = p
3880: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 61 73  NC->pParse;.  as
3890: 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 57  sert( pParse==pW
38a0: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 20 29 3b  alker->pParse );
38b0: 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41  ..  if( ExprHasA
38c0: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
38d0: 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20 29  , EP_Resolved) )
38e0: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
38f0: 65 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  e;.  ExprSetProp
3900: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
3910: 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65  esolved);.#ifnde
3920: 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70  f NDEBUG.  if( p
3930: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20  NC->pSrcList && 
3940: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e  pNC->pSrcList->n
3950: 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53  Alloc>0 ){.    S
3960: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
3970: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
3980: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
3990: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d   for(i=0; i<pNC-
39a0: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  >pSrcList->nSrc;
39b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
39c0: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
39d0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
39e0: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
39f0: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
3a00: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
3a10: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
3a20: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
3a30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
3a40: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
3a50: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20  E_DELETE_LIMIT) 
3a60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
3a70: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
3a80: 29 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65  ).    /* The spe
3a90: 63 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 54 4b  cial operator TK
3aa0: 5f 52 4f 57 20 6d 65 61 6e 73 20 75 73 65 20 74  _ROW means use t
3ab0: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
3ac0: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 63 6f   first.    ** co
3ad0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f 4d  lumn in the FROM
3ae0: 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 69   clause.  This i
3af0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4c 49  s used by the LI
3b00: 4d 49 54 20 61 6e 64 20 4f 52 44 45 52 20 42 59  MIT and ORDER BY
3b10: 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 70  .    ** clause p
3b20: 72 6f 63 65 73 73 69 6e 67 20 6f 6e 20 55 50 44  rocessing on UPD
3b30: 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20 73  ATE and DELETE s
3b40: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
3b50: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 4f  /.    case TK_RO
3b60: 57 3a 20 7b 0a 20 20 20 20 20 20 53 72 63 4c 69  W: {.      SrcLi
3b70: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
3b80: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
3b90: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
3ba0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
3bb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
3bc0: 72 63 4c 69 73 74 20 26 26 20 70 53 72 63 4c 69  rcList && pSrcLi
3bd0: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  st->nSrc==1 );. 
3be0: 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 53 72       pItem = pSr
3bf0: 63 4c 69 73 74 2d 3e 61 3b 20 0a 20 20 20 20 20  cList->a; .     
3c00: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
3c10: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45  COLUMN;.      pE
3c20: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 49 74 65  xpr->pTab = pIte
3c30: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70  m->pTab;.      p
3c40: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
3c50: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
3c60: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
3c70: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
3c80: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
3c90: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
3ca0: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
3cb0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
3cc0: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
3cd0: 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f  E_ENABLE_UPDATE_
3ce0: 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26  DELETE_LIMIT) &&
3cf0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3d00: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
3d10: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e  */..    /* A lon
3d20: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
3d30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
3d40: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
3d50: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
3d60: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
3d70: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70  pParse, 0, 0, &p
3d80: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e 43  Expr->token, pNC
3d90: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
3da0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
3db0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
3dc0: 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  * A table name a
3dd0: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  nd column name: 
3de0: 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a      ID.ID.    **
3df0: 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20   Or a database, 
3e00: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
3e10: 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20  :  ID.ID.ID.    
3e20: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  */.    case TK_D
3e30: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65  OT: {.      Toke
3e40: 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  n *pColumn;.    
3e50: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b    Token *pTable;
3e60: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44  .      Token *pD
3e70: 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
3e80: 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  Right;..      /*
3e90: 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30   if( pSrcList==0
3ea0: 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20   ) break; */.   
3eb0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
3ec0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
3ed0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d   if( pRight->op=
3ee0: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
3ef0: 20 20 70 44 62 20 3d 20 30 3b 0a 20 20 20 20 20    pDb = 0;.     
3f00: 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 45 78     pTable = &pEx
3f10: 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  pr->pLeft->token
3f20: 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d  ;.        pColum
3f30: 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b  n = &pRight->tok
3f40: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
3f50: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
3f60: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
3f70: 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20 70  DOT );.        p
3f80: 44 62 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65  Db = &pExpr->pLe
3f90: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
3fa0: 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 52 69     pTable = &pRi
3fb0: 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  ght->pLeft->toke
3fc0: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75  n;.        pColu
3fd0: 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 52  mn = &pRight->pR
3fe0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  ight->token;.   
3ff0: 20 20 20 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75     }.      looku
4000: 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44  pName(pParse, pD
4010: 62 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75  b, pTable, pColu
4020: 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b  mn, pNC, pExpr);
4030: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
4040: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 0a  C_Prune;.    }..
4050: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66      /* Resolve f
4060: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20  unction names.  
4070: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
4080: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
4090: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
40a0: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
40b0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
40c0: 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  pr->pList;    /*
40d0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
40e0: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
40f0: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
4100: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f  t->nExpr : 0;  /
4110: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
4120: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
4130: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
4140: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
4150: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
4160: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
4170: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
4180: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
4190: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
41a0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
41b0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
41c0: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41e0: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
41f0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
4200: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 75   */.      int au
4210: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
4220: 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69        /* Authori
4230: 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74 68  zation to use th
4240: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
4250: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
4280: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
4290: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
42a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
42b0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
42c0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
42d0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
42e0: 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
42f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
4300: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
4310: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
4320: 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e      int enc = EN
4330: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20  C(pParse->db);  
4340: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
4350: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20  encoding */..   
4360: 20 20 20 7a 49 64 20 3d 20 28 63 68 61 72 2a 29     zId = (char*)
4370: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
4380: 20 20 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70        nId = pExp
4390: 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20  r->token.n;.    
43a0: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
43b0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
43c0: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
43d0: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
43e0: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
43f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
4400: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
4410: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
4420: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c  b, zId, nId, -1,
4430: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
4440: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
4450: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
4460: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
4470: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4480: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
4490: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
44a0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
44b0: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
44c0: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
44d0: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
44e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
44f0: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
4500: 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20    if( pDef ){.  
4510: 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c        auth = sql
4520: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
4530: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e  arse, SQLITE_FUN
4540: 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e  CTION, 0, pDef->
4550: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
4560: 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c     if( auth!=SQL
4570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4580: 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51      if( auth==SQ
4590: 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20  LITE_DENY ){.   
45a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
45b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
45c0: 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64   "not authorized
45d0: 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
45e0: 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4600: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
4610: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
4620: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
4630: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4640: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
4650: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
4660: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
4670: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20  C_Prune;.       
4680: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
4690: 66 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  f.      if( is_a
46a0: 67 67 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f  gg && !pNC->allo
46b0: 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  wAgg ){.        
46c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
46d0: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
46e0: 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  of aggregate fun
46f0: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e  ction %.*s()", n
4700: 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  Id,zId);.       
4710: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
4720: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30        is_agg = 0
4730: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4740: 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29  ( no_such_func )
4750: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4760: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4770: 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  , "no such funct
4780: 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c  ion: %.*s", nId,
4790: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
47a0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
47b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e    }else if( wron
47c0: 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20  g_num_args ){.  
47d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
47e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72  orMsg(pParse,"wr
47f0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
4800: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
4810: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20  ion %.*s()",.   
4820: 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a            nId, z
4830: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
4840: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4850: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
4860: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  gg ){.        pE
4870: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
4880: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
4890: 20 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d     pNC->hasAgg =
48a0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
48b0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
48c0: 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  NC->allowAgg = 0
48d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57  ;.      sqlite3W
48e0: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c  alkExprList(pWal
48f0: 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  ker, pList);.   
4900: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
4910: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
4920: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
4930: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
4940: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
4950: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
4960: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
4970: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
4980: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
4990: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
49a0: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
49b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
49c0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
49d0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
49e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
49f0: 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  STS:.#endif.    
4a00: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
4a10: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
4a20: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
4a30: 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43    int nRef = pNC
4a40: 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e 64 65 66 20  ->nRef;.#ifndef 
4a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
4a60: 4b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  K.        if( pN
4a70: 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a 20 20  C->isCheck ){.  
4a80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
4a90: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
4aa0: 73 75 62 71 75 65 72 69 65 73 20 70 72 6f 68 69  subqueries prohi
4ab0: 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63  bited in CHECK c
4ac0: 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20  onstraints");.  
4ad0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
4ae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
4af0: 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72  lkSelect(pWalker
4b00: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
4b10: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
4b20: 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52  t( pNC->nRef>=nR
4b30: 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ef );.        if
4b40: 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65  ( nRef!=pNC->nRe
4b50: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  f ){.          E
4b60: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
4b70: 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65  Expr, EP_VarSele
4b80: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ct);.        }. 
4b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
4ba0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
4bb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
4bc0: 45 43 4b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ECK.    case TK_
4bd0: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
4be0: 20 20 69 66 28 20 70 4e 43 2d 3e 69 73 43 68 65    if( pNC->isChe
4bf0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ck ){.        sq
4c00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4c10: 61 72 73 65 2c 22 70 61 72 61 6d 65 74 65 72 73  arse,"parameters
4c20: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
4c30: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
4c40: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
4c50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
4c60: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
4c70: 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  rn (pParse->nErr
4c80: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
4c90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20  mallocFailed) ? 
4ca0: 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f  WRC_Abort : WRC_
4cb0: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
4cc0: 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 61 20 6c  ** pEList is a l
4cd0: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
4ce0: 6e 73 20 77 68 69 63 68 20 61 72 65 20 72 65 61  ns which are rea
4cf0: 6c 6c 79 20 74 68 65 20 72 65 73 75 6c 74 20 73  lly the result s
4d00: 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 20 53  et of the.** a S
4d10: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
4d20: 20 20 70 45 20 69 73 20 61 20 74 65 72 6d 20 69    pE is a term i
4d30: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  n an ORDER BY or
4d40: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
4d50: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
4d60: 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  e checks to see 
4d70: 69 66 20 70 45 20 69 73 20 61 20 73 69 6d 70 6c  if pE is a simpl
4d80: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 68 69  e identifier whi
4d90: 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73 0a 2a  ch corresponds.*
4da0: 2a 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d 65  * to the AS-name
4db0: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
4dc0: 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78 70 72  erms of the expr
4dd0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
4de0: 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 69 73 20   it is,.** this 
4df0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
4e00: 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  n integer betwee
4e10: 6e 20 31 20 61 6e 64 20 4e 20 77 68 65 72 65 20  n 1 and N where 
4e20: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
4e30: 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69  of.** elements i
4e40: 6e 20 70 45 4c 69 73 74 2c 20 63 6f 72 72 65 73  n pEList, corres
4e50: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6d  ponding to the m
4e60: 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 20 20  atching entry.  
4e70: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  If there is.** n
4e80: 6f 20 6d 61 74 63 68 2c 20 6f 72 20 69 66 20 70  o match, or if p
4e90: 45 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  E is not a simpl
4ea0: 65 20 69 64 65 6e 74 69 66 69 65 72 2c 20 74 68  e identifier, th
4eb0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
4ec0: 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ** return 0..**.
4ed0: 2a 2a 20 70 45 4c 69 73 74 20 68 61 73 20 62 65  ** pEList has be
4ee0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 70 45  en resolved.  pE
4ef0: 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61   has not..*/.sta
4f00: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 41  tic int resolveA
4f10: 73 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  sName(.  Parse *
4f20: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
4f30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  arsing context f
4f40: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
4f50: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
4f60: 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  *pEList,  /* Lis
4f70: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
4f80: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
4f90: 70 72 20 2a 70 45 20 20 20 20 20 20 20 20 20 20  pr *pE          
4fa0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 77   /* Expression w
4fb0: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
4fc0: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
4fd0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
4fe0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
4ff0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45 2d 3e 6f   */..  if( pE->o
5000: 70 3d 3d 54 4b 5f 49 44 20 7c 7c 20 28 70 45 2d  p==TK_ID || (pE-
5010: 3e 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 26  >op==TK_STRING &
5020: 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d  & pE->token.z[0]
5030: 21 3d 27 5c 27 27 29 20 29 7b 0a 20 20 20 20 73  !='\'') ){.    s
5040: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5050: 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 63 68 61  rse->db;.    cha
5060: 72 20 2a 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  r *zCol = sqlite
5070: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
5080: 62 2c 20 26 70 45 2d 3e 74 6f 6b 65 6e 29 3b 0a  b, &pE->token);.
5090: 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20      if( zCol==0 
50a0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
50b0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  -1;.    }.    fo
50c0: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
50d0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
50e0: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
50f0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
5100: 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  me;.      if( zA
5110: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
5120: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
5130: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5140: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5150: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  , zCol);.       
5160: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
5170: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
5180: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5190: 20 7a 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   zCol);.  }.  re
51a0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
51b0: 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74 65 72   pE is a pointer
51c0: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
51d0: 6e 20 77 68 69 63 68 20 69 73 20 61 20 73 69 6e  n which is a sin
51e0: 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  gle term in the.
51f0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 66 20 61  ** ORDER BY of a
5200: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
5210: 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
5220: 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a  n has not been.*
5230: 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65 64 2e  * name resolved.
5240: 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 70 6f  .**.** At the po
5250: 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  int this routine
5260: 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 61   is called, we a
5270: 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 61 74  lready know that
5280: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
5290: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 6e 20   term is not an 
52a0: 69 6e 74 65 67 65 72 20 69 6e 64 65 78 20 69 6e  integer index in
52b0: 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  to the result se
52c0: 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63 61 73 65  t.  That.** case
52d0: 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20 74   is handled by t
52e0: 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
52f0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70  ne..**.** Attemp
5300: 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20 61 67  t to match pE ag
5310: 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74  ainst result set
5320: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
5330: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53 45 4c  left-most.** SEL
5340: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
5350: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
5360: 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69   i of the matchi
5370: 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61 73  ng column,.** as
5380: 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74   an indication t
5390: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  o the caller tha
53a0: 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74  t it should sort
53b0: 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c   by the i-th col
53c0: 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74  umn..** The left
53d0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
53e0: 31 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  1.  In other wor
53f0: 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65  ds, the value re
5400: 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
5410: 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20 76 61   same integer va
5420: 6c 75 65 20 74 68 61 74 20 77 6f 75 6c 64 20 62  lue that would b
5430: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 53 51  e used in the SQ
5440: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69  L statement to i
5450: 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 65 20 63  ndicate.** the c
5460: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  olumn..**.** If 
5470: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
5480: 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  h, return 0.  Re
5490: 74 75 72 6e 20 2d 31 20 69 66 20 61 6e 20 65 72  turn -1 if an er
54a0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
54b0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
54c0: 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  eOrderByTermToEx
54d0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
54e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
54f0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
5500: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
5510: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
5520: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68  pSelect,   /* Th
5530: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
5540: 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  nt with the ORDE
5550: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
5560: 20 45 78 70 72 20 2a 70 45 20 20 20 20 20 20 20   Expr *pE       
5570: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
5580: 66 69 63 20 4f 52 44 45 52 20 42 59 20 74 65 72  fic ORDER BY ter
5590: 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  m */.){.  int i;
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
55b0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
55c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
55d0: 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  st;  /* The colu
55e0: 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c  mns of the resul
55f0: 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43  t set */.  NameC
5600: 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a  ontext nc;    /*
5610: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
5620: 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a  r resolving pE *
5630: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
5640: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
5650: 72 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a  r(pE, &i)==0 );.
5660: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
5670: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f  ct->pEList;..  /
5680: 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61  * Resolve all na
5690: 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52  mes in the ORDER
56a0: 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73 73   BY term express
56b0: 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  ion.  */.  memse
56c0: 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&nc, 0, sizeof
56d0: 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72  (nc));.  nc.pPar
56e0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e  se = pParse;.  n
56f0: 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65  c.pSrcList = pSe
5700: 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63  lect->pSrc;.  nc
5710: 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74  .pEList = pEList
5720: 3b 0a 20 20 6e 63 2e 61 6c 6c 6f 77 41 67 67 20  ;.  nc.allowAgg 
5730: 3d 20 31 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d  = 1;.  nc.nErr =
5740: 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
5750: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
5760: 73 28 26 6e 63 2c 20 70 45 29 20 29 7b 0a 20 20  s(&nc, pE) ){.  
5770: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c    sqlite3ErrorCl
5780: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
5790: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
57a0: 20 20 2f 2a 20 54 72 79 20 74 6f 20 6d 61 74 63    /* Try to matc
57b0: 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  h the ORDER BY e
57c0: 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73  xpression agains
57d0: 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  t an expression.
57e0: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
57f0: 6c 74 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20  lt set.  Return 
5800: 61 6e 20 31 2d 62 61 73 65 64 20 69 6e 64 65 78  an 1-based index
5810: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
5820: 0a 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  .  ** result-set
5830: 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 66   entry..  */.  f
5840: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
5850: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
5860: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
5870: 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74  prCompare(pEList
5880: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
5890: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
58a0: 6e 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  n i+1;.    }.  }
58b0: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 6d 61 74  ..  /* If no mat
58c0: 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 2a 2f  ch, return 0. */
58d0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
58e0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
58f0: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
5900: 4f 55 50 20 42 59 20 74 65 72 6d 20 6f 75 74 2d  OUP BY term out-
5910: 6f 66 2d 72 61 6e 67 65 20 65 72 72 6f 72 2e 0a  of-range error..
5920: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
5930: 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65  esolveOutOfRange
5940: 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  Error(.  Parse *
5950: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
5960: 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f 6e  /* The error con
5970: 74 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20  text into which 
5980: 74 6f 20 77 72 69 74 65 20 74 68 65 20 65 72 72  to write the err
5990: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
59a0: 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
59b0: 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  * "ORDER" or "GR
59c0: 4f 55 50 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  OUP" */.  int i,
59d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59e0: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 28 31   /* The index (1
59f0: 2d 62 61 73 65 64 29 20 6f 66 20 74 68 65 20 74  -based) of the t
5a00: 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  erm out of range
5a10: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 20 20 20 20   */.  int mx    
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5a30: 4c 61 72 67 65 73 74 20 70 65 72 6d 69 73 73 69  Largest permissi
5a40: 62 6c 65 20 76 61 6c 75 65 20 6f 66 20 69 20 2a  ble value of i *
5a50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 72  /.){.  sqlite3Er
5a60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
5a70: 20 20 20 20 22 25 72 20 25 73 20 42 59 20 74 65      "%r %s BY te
5a80: 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  rm out of range 
5a90: 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
5aa0: 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
5ab0: 20 25 64 22 2c 20 69 2c 20 7a 54 79 70 65 2c 20   %d", i, zType, 
5ac0: 6d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  mx);.}../*.** An
5ad0: 61 6c 79 7a 65 20 74 68 65 20 4f 52 44 45 52 20  alyze the ORDER 
5ae0: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 63  BY clause in a c
5af0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
5b00: 74 61 74 65 6d 65 6e 74 2e 20 20 20 4d 6f 64 69  tatement.   Modi
5b10: 66 79 0a 2a 2a 20 65 61 63 68 20 74 65 72 6d 20  fy.** each term 
5b20: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
5b30: 63 6c 61 75 73 65 20 69 73 20 61 20 63 6f 6e 73  clause is a cons
5b40: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 62 65 74  tant integer bet
5b50: 77 65 65 6e 20 31 0a 2a 2a 20 61 6e 64 20 4e 20  ween 1.** and N 
5b60: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
5b70: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
5b80: 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
5b90: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f   SELECT..**.** O
5ba0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
5bb0: 61 74 20 61 72 65 20 61 6c 72 65 61 64 79 20 61  at are already a
5bc0: 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  n integer betwee
5bd0: 6e 20 31 20 61 6e 64 20 4e 20 61 72 65 0a 2a 2a  n 1 and N are.**
5be0: 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20 20 4f 52   unmodified.  OR
5bf0: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
5c00: 74 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 6f  t are integers o
5c10: 75 74 73 69 64 65 20 74 68 65 20 72 61 6e 67 65  utside the range
5c20: 20 6f 66 0a 2a 2a 20 31 20 74 68 72 6f 75 67 68   of.** 1 through
5c30: 20 4e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65   N generate an e
5c40: 72 72 6f 72 2e 20 20 4f 52 44 45 52 20 42 59 20  rror.  ORDER BY 
5c50: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 65  terms that are e
5c60: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72  xpressions.** ar
5c70: 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  e matched agains
5c80: 74 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  t result set exp
5c90: 72 65 73 73 69 6f 6e 73 20 6f 66 20 63 6f 6d 70  ressions of comp
5ca0: 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 62  ound SELECT.** b
5cb0: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 74 68  eginning with th
5cc0: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  e left-most SELE
5cd0: 43 54 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 74  CT and working t
5ce0: 6f 77 61 72 64 20 74 68 65 20 72 69 67 68 74 2e  oward the right.
5cf0: 0a 2a 2a 20 41 74 20 74 68 65 20 66 69 72 73 74  .** At the first
5d00: 20 6d 61 74 63 68 2c 20 74 68 65 20 4f 52 44 45   match, the ORDE
5d10: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
5d20: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  is transformed i
5d30: 6e 74 6f 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67  nto.** the integ
5d40: 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  er column number
5d50: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
5d60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
5d70: 6f 72 73 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61  ors seen..*/.sta
5d80: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 43  tic int resolveC
5d90: 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a  ompoundOrderBy(.
5da0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5db0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
5dc0: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61  ng context.  Lea
5dd0: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
5de0: 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
5df0: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
5e00: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
5e10: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
5e20: 6e 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ning the ORDER B
5e30: 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Y */.){.  int i;
5e40: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
5e50: 64 65 72 42 79 3b 0a 20 20 45 78 70 72 4c 69 73  derBy;.  ExprLis
5e60: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
5e70: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
5e80: 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20  moreToDo = 1;.. 
5e90: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c   pOrderBy = pSel
5ea0: 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  ect->pOrderBy;. 
5eb0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
5ec0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64   ) return 0;.  d
5ed0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5ee0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
5ef0: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64  OLUMN.  if( pOrd
5f00: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  erBy->nExpr>db->
5f10: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
5f20: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
5f30: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5f40: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
5f50: 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52  many terms in OR
5f60: 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b  DER BY clause");
5f70: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
5f80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28   }.#endif.  for(
5f90: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
5fa0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
5fb0: 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d    pOrderBy->a[i]
5fc0: 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  .done = 0;.  }. 
5fd0: 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 20   pSelect->pNext 
5fe0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53  = 0;.  while( pS
5ff0: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b  elect->pPrior ){
6000: 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 50  .    pSelect->pP
6010: 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 53  rior->pNext = pS
6020: 65 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65  elect;.    pSele
6030: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50  ct = pSelect->pP
6040: 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  rior;.  }.  whil
6050: 65 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f  e( pSelect && mo
6060: 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 73 74  reToDo ){.    st
6070: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
6080: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 6d  em *pItem;.    m
6090: 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20  oreToDo = 0;.   
60a0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
60b0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61  t->pEList;.    a
60c0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
60d0: 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   );.    for(i=0,
60e0: 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
60f0: 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  >a; i<pOrderBy->
6100: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
6110: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  m++){.      int 
6120: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  iCol = -1;.     
6130: 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70   Expr *pE, *pDup
6140: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
6150: 6d 2d 3e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e  m->done ) contin
6160: 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 70  ue;.      pE = p
6170: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
6180: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
6190: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
61a0: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
61b0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 7c 7c 20    if( iCol<0 || 
61c0: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
61d0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
61e0: 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67  resolveOutOfRang
61f0: 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 22  eError(pParse, "
6200: 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70 45 4c  ORDER", i+1, pEL
6210: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
6220: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
6230: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6240: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6250: 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73  iCol = resolveAs
6260: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Name(pParse, pEL
6270: 69 73 74 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  ist, pE);.      
6280: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29 7b    if( iCol==0 ){
6290: 0a 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20  .          pDup 
62a0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
62b0: 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  (db, pE);.      
62c0: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
62d0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
62e0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
62f0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
6300: 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76     iCol = resolv
6310: 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  eOrderByTermToEx
6320: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
6330: 53 65 6c 65 63 74 2c 20 70 44 75 70 29 3b 0a 20  Select, pDup);. 
6340: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6350: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6360: 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29  Delete(db, pDup)
6370: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6380: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
6390: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
63a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
63b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
63c0: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
63d0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
63e0: 6c 6c 20 3d 20 70 45 2d 3e 70 43 6f 6c 6c 3b 0a  ll = pE->pColl;.
63f0: 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67          int flag
6400: 73 20 3d 20 70 45 2d 3e 66 6c 61 67 73 20 26 20  s = pE->flags & 
6410: 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 3b 0a 20  EP_ExpCollate;. 
6420: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
6430: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 29  prDelete(db, pE)
6440: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  ;.        pItem-
6450: 3e 70 45 78 70 72 20 3d 20 70 45 20 3d 20 73 71  >pExpr = pE = sq
6460: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
6470: 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20 30 2c 20  _INTEGER, 0, 0, 
6480: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
6490: 70 45 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pE==0 ) return 1
64a0: 3b 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 70 43  ;.        pE->pC
64b0: 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b 0a 20 20 20  oll = pColl;.   
64c0: 20 20 20 20 20 70 45 2d 3e 66 6c 61 67 73 20 7c       pE->flags |
64d0: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 20 7c 20  = EP_IntValue | 
64e0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70  flags;.        p
64f0: 45 2d 3e 69 54 61 62 6c 65 20 3d 20 69 43 6f 6c  E->iTable = iCol
6500: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  ;.        pItem-
6510: 3e 69 43 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20  >iCol = iCol;.  
6520: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e        pItem->don
6530: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 1;.      }el
6540: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72 65  se{.        more
6550: 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToDo = 1;.      
6560: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c  }.    }.    pSel
6570: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
6580: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Next;.  }.  for(
6590: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
65a0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
65b0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
65c0: 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a  a[i].done==0 ){.
65d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
65e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
65f0: 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  r ORDER BY term 
6600: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
6610: 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ny ".           
6620: 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20   "column in the 
6630: 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69 2b 31  result set", i+1
6640: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
6650: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
6660: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
6670: 2a 20 43 68 65 63 6b 20 65 76 65 72 79 20 74 65  * Check every te
6680: 72 6d 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rm in the ORDER 
6690: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
66a0: 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79 20 6f  lause pOrderBy o
66b0: 66 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20  f.** the SELECT 
66c0: 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63  statement pSelec
66d0: 74 2e 20 20 49 66 20 61 6e 79 20 74 65 72 6d 20  t.  If any term 
66e0: 69 73 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  is reference to 
66f0: 61 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20  a.** result set 
6700: 65 78 70 72 65 73 73 69 6f 6e 20 28 61 73 20 64  expression (as d
6710: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
6720: 20 45 78 70 72 4c 69 73 74 2e 61 2e 69 43 6f 6c   ExprList.a.iCol
6730: 20 66 69 65 6c 64 29 0a 2a 2a 20 74 68 65 6e 20   field).** then 
6740: 63 6f 6e 76 65 72 74 20 74 68 61 74 20 74 65 72  convert that ter
6750: 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79 20 6f 66  m into a copy of
6760: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
6770: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  ng result set.**
6780: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49   column..**.** I
6790: 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
67a0: 20 64 65 74 65 63 74 65 64 2c 20 61 64 64 20 61   detected, add a
67b0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
67c0: 74 6f 20 70 50 61 72 73 65 20 61 6e 64 0a 2a 2a  to pParse and.**
67d0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
67e0: 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
67f0: 66 20 6e 6f 20 65 72 72 6f 72 73 20 61 72 65 20  f no errors are 
6800: 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  seen..*/.int sql
6810: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
6820: 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65  GroupBy(.  Parse
6830: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6840: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6850: 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f  ext.  Leave erro
6860: 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20  r messages here 
6870: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
6880: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  lect,      /* Th
6890: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
68a0: 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  nt containing th
68b0: 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  e clause */.  Ex
68c0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
68d0: 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ,   /* The ORDER
68e0: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
68f0: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f  clause to be pro
6900: 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  cessed */.  cons
6910: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
6920: 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72 20    /* "ORDER" or 
6930: 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20 20  "GROUP" */.){.  
6940: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
6950: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
6960: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
6970: 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
6980: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6990: 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70 4f 72  Item;..  if( pOr
69a0: 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72  derBy==0 || pPar
69b0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
69c0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
69d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
69e0: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72  COLUMN.  if( pOr
69f0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d  derBy->nExpr>db-
6a00: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
6a10: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
6a20: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6a30: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
6a40: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25   many terms in %
6a50: 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54  s BY clause", zT
6a60: 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ype);.    return
6a70: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
6a80: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
6a90: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73  t->pEList;.  ass
6aa0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
6ab0: 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c  ;  /* sqlite3Sel
6ac0: 65 63 74 4e 65 77 28 29 20 67 75 61 72 61 6e 74  ectNew() guarant
6ad0: 65 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 66 6f  ees this */.  fo
6ae0: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
6af0: 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64  derBy->a; i<pOrd
6b00: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
6b10: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
6b20: 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20  if( pItem->iCol 
6b30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
6b40: 65 6d 2d 3e 69 43 6f 6c 3e 70 45 4c 69 73 74 2d  em->iCol>pEList-
6b50: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
6b60: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
6b70: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
6b80: 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 70 45 4c   zType, i+1, pEL
6b90: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
6ba0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
6bc0: 6f 6c 76 65 41 6c 69 61 73 28 70 50 61 72 73 65  olveAlias(pParse
6bd0: 2c 20 70 45 4c 69 73 74 2c 20 70 49 74 65 6d 2d  , pEList, pItem-
6be0: 3e 69 43 6f 6c 2d 31 2c 20 70 49 74 65 6d 2d 3e  >iCol-1, pItem->
6bf0: 70 45 78 70 72 2c 20 7a 54 79 70 65 29 3b 0a 20  pExpr, zType);. 
6c00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6c10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f  n 0;.}../*.** pO
6c20: 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44  rderBy is an ORD
6c30: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
6c40: 59 20 63 6c 61 75 73 65 20 69 6e 20 53 45 4c 45  Y clause in SELE
6c50: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65  CT statement pSe
6c60: 6c 65 63 74 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d  lect..** The Nam
6c70: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
6c80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6c90: 74 20 69 73 20 70 4e 43 2e 20 20 7a 54 79 70 65  t is pNC.  zType
6ca0: 20 69 73 20 65 69 74 68 65 72 0a 2a 2a 20 22 4f   is either.** "O
6cb0: 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
6cc0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
6cd0: 69 63 68 20 74 79 70 65 20 6f 66 20 63 6c 61 75  ich type of clau
6ce0: 73 65 20 70 4f 72 64 65 72 42 79 20 69 73 2e 0a  se pOrderBy is..
6cf0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
6d00: 6e 65 20 72 65 73 6f 6c 76 65 73 20 65 61 63 68  ne resolves each
6d10: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6c 61   term of the cla
6d20: 75 73 65 20 69 6e 74 6f 20 61 6e 20 65 78 70 72  use into an expr
6d30: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68  ession..** If th
6d40: 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20  e order-by term 
6d50: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 49 20  is an integer I 
6d60: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20  between 1 and N 
6d70: 28 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a  (where N is the.
6d80: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ** number of col
6d90: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
6da0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
6db0: 4c 45 43 54 29 20 74 68 65 6e 20 74 68 65 20 65  LECT) then the e
6dc0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20  xpression.** in 
6dd0: 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  the resolution i
6de0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
6df0: 49 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20  I-th result-set 
6e00: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 0a  expression.  If.
6e10: 2a 2a 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  ** the order-by 
6e20: 74 65 72 6d 20 69 73 20 61 6e 20 69 64 65 6e 74  term is an ident
6e30: 69 66 79 20 74 68 61 74 20 63 6f 72 72 65 73 70  ify that corresp
6e40: 6f 6e 64 73 20 74 6f 20 74 68 65 20 41 53 2d 6e  onds to the AS-n
6e50: 61 6d 65 20 6f 66 0a 2a 2a 20 61 20 72 65 73 75  ame of.** a resu
6e60: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
6e70: 6e 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d  n, then the term
6e80: 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 61 20 63   resolves to a c
6e90: 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65  opy of the.** re
6ea0: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
6eb0: 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ion.  Otherwise,
6ec0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6ed0: 69 73 20 72 65 73 6f 6c 76 65 64 20 69 6e 0a 2a  is resolved in.*
6ee0: 2a 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20  * the usual way 
6ef0: 2d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  - using sqlite3R
6f00: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
6f10: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
6f20: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
6f30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
6f40: 72 73 2e 20 20 49 66 20 65 72 72 6f 72 73 20 6f  rs.  If errors o
6f50: 63 63 75 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  ccur, then.** an
6f60: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
6f70: 6f 72 20 6d 65 73 73 61 67 65 20 6d 69 67 68 74  or message might
6f80: 20 62 65 20 6c 65 66 74 20 69 6e 20 70 50 61 72   be left in pPar
6f90: 73 65 2e 20 20 28 4f 4f 4d 20 65 72 72 6f 72 73  se.  (OOM errors
6fa0: 0a 2a 2a 20 65 78 63 65 70 74 65 64 2e 29 0a 2a  .** excepted.).*
6fb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
6fc0: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
6fd0: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
6fe0: 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pNC,     /* The
6ff0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66   name context of
7000: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
7010: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
7020: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
7030: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
7040: 74 61 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67  tatement holding
7050: 20 70 4f 72 64 65 72 42 79 20 2a 2f 0a 20 20 45   pOrderBy */.  E
7060: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
7070: 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
7080: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
7090: 63 6c 61 75 73 65 20 74 6f 20 72 65 73 6f 6c 76  clause to resolv
70a0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
70b0: 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20  r *zType     /* 
70c0: 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f  Either "ORDER" o
70d0: 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70  r "GROUP", as ap
70e0: 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a  propriate */.){.
70f0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7120: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
7130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7140: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
7150: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  umber */.  struc
7160: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
7170: 2a 70 49 74 65 6d 3b 20 20 20 2f 2a 20 41 20 74  *pItem;   /* A t
7180: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
7190: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
71a0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
71c0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
71d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  t */.  int nResu
71e0: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
71f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7200: 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
7210: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
7220: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
7230: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
7240: 52 65 73 75 6c 74 20 3d 20 70 53 65 6c 65 63 74  Result = pSelect
7250: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
7260: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  .  pParse = pNC-
7270: 3e 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69  >pParse;.  for(i
7280: 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
7290: 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42  By->a; i<pOrderB
72a0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
72b0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
72c0: 72 20 2a 70 45 20 3d 20 70 49 74 65 6d 2d 3e 70  r *pE = pItem->p
72d0: 45 78 70 72 3b 0a 20 20 20 20 69 43 6f 6c 20 3d  Expr;.    iCol =
72e0: 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70   resolveAsName(p
72f0: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
7300: 70 45 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20  pEList, pE);.   
7310: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
7320: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20       return 1;  
7330: 2f 2a 20 4f 4f 4d 20 65 72 72 6f 72 20 2a 2f 0a  /* OOM error */.
7340: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 43      }.    if( iC
7350: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ol>0 ){.      /*
7360: 20 49 66 20 61 6e 20 41 53 2d 6e 61 6d 65 20 6d   If an AS-name m
7370: 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 6d  atch is found, m
7380: 61 72 6b 20 74 68 69 73 20 4f 52 44 45 52 20 42  ark this ORDER B
7390: 59 20 63 6f 6c 75 6d 6e 20 61 73 20 62 65 69 6e  Y column as bein
73a0: 67 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70  g.      ** a cop
73b0: 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  y of the iCol-th
73c0: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
73d0: 6d 6e 2e 20 20 54 68 65 20 73 75 62 73 65 71 75  mn.  The subsequ
73e0: 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  ent call to.    
73f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 6f    ** sqlite3Reso
7400: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
7410: 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  ) will convert t
7420: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
7430: 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
7440: 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
7450: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
7460: 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ssion. */.      
7470: 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 69 43  pItem->iCol = iC
7480: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
7490: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
74a0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
74b0: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
74c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
74d0: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
74e0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
74f0: 6e 73 74 61 6e 74 2e 20 20 41 67 61 69 6e 2c 20  nstant.  Again, 
7500: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  set the column. 
7510: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 73       ** number s
7520: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 52 65  o that sqlite3Re
7530: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
7540: 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74  y() will convert
7550: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72   the.      ** or
7560: 64 65 72 2d 62 79 20 74 65 72 6d 20 74 6f 20 61  der-by term to a
7570: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72 65 73   copy of the res
7580: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
7590: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
75a0: 69 43 6f 6c 3c 31 20 29 7b 0a 20 20 20 20 20 20  iCol<1 ){.      
75b0: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
75c0: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
75d0: 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 6e 52 65   zType, i+1, nRe
75e0: 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 72  sult);.        r
75f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7600: 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
7610: 6f 6c 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ol = iCol;.     
7620: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
7630: 0a 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69  ..    /* Otherwi
7640: 73 65 2c 20 74 72 65 61 74 20 74 68 65 20 4f 52  se, treat the OR
7650: 44 45 52 20 42 59 20 74 65 72 6d 20 61 73 20 61  DER BY term as a
7660: 6e 20 6f 72 64 69 6e 61 72 79 20 65 78 70 72 65  n ordinary expre
7670: 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 49 74  ssion */.    pIt
7680: 65 6d 2d 3e 69 43 6f 6c 20 3d 20 30 3b 0a 20 20  em->iCol = 0;.  
7690: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
76a0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e  olveExprNames(pN
76b0: 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  C, pE) ){.      
76c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
76d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
76e0: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
76f0: 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
7700: 70 53 65 6c 65 63 74 2c 20 70 4f 72 64 65 72 42  pSelect, pOrderB
7710: 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  y, zType);.}../*
7720: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65  .** Resolve name
7730: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
7740: 73 74 61 74 65 6d 65 6e 74 20 70 20 61 6e 64 20  statement p and 
7750: 61 6c 6c 20 6f 66 20 69 74 73 20 64 65 73 63 65  all of its desce
7760: 6e 64 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ndents..*/.stati
7770: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 53 65 6c  c int resolveSel
7780: 65 63 74 53 74 65 70 28 57 61 6c 6b 65 72 20 2a  ectStep(Walker *
7790: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
77a0: 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  *p){.  NameConte
77b0: 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20 20 2f  xt *pOuterNC;  /
77c0: 2a 20 43 6f 6e 74 65 78 74 20 74 68 61 74 20 63  * Context that c
77d0: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 53 45 4c  ontains this SEL
77e0: 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ECT */.  NameCon
77f0: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
7800: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
7810: 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20   of this SELECT 
7820: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f  */.  int isCompo
7830: 75 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  und;         /* 
7840: 54 72 75 65 20 69 66 20 70 20 69 73 20 61 20 63  True if p is a c
7850: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
7860: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e  /.  int nCompoun
7870: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  d;          /* N
7880: 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f 75 6e  umber of compoun
7890: 64 20 74 65 72 6d 73 20 70 72 6f 63 65 73 73 65  d terms processe
78a0: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61  d so far */.  Pa
78b0: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
78c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
78d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
78e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
78f0: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
7900: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  set expression l
7910: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ist */.  int i; 
7920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7930: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
7940: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
7950: 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 2f 2a  pGroupBy;     /*
7960: 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
7970: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
7980: 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20   *pLeftmost;    
7990: 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 6f    /* Left-most o
79a0: 66 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f  f SELECT of a co
79b0: 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 73 71 6c 69  mpound */.  sqli
79c0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
79d0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
79e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
79f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
7a00: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   );.  if( p->sel
7a10: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
7a20: 76 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ved ){.    retur
7a30: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
7a40: 0a 20 20 70 4f 75 74 65 72 4e 43 20 3d 20 70 57  .  pOuterNC = pW
7a50: 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
7a60: 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
7a70: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
7a80: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
7a90: 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 73 71 6c 69  /* Normally sqli
7aa0: 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
7ab0: 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  ) will be called
7ac0: 20 66 69 72 73 74 20 61 6e 64 20 77 69 6c 6c 20   first and will 
7ad0: 68 61 76 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64  have.  ** alread
7ae0: 79 20 65 78 70 61 6e 64 65 64 20 74 68 69 73 20  y expanded this 
7af0: 53 45 4c 45 43 54 2e 20 20 48 6f 77 65 76 65 72  SELECT.  However
7b00: 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  , if this is a s
7b10: 75 62 71 75 65 72 79 20 77 69 74 68 69 6e 0a 20  ubquery within. 
7b20: 20 2a 2a 20 61 6e 20 65 78 70 72 65 73 73 69 6f   ** an expressio
7b30: 6e 2c 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  n, sqlite3Resolv
7b40: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 77 69 6c  eExprNames() wil
7b50: 6c 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  l be called with
7b60: 6f 75 74 20 61 0a 20 20 2a 2a 20 70 72 69 6f 72  out a.  ** prior
7b70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7b80: 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 2e 20  SelectExpand(). 
7b90: 20 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65   When that happe
7ba0: 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a 20 73 71 6c  ns, let.  ** sql
7bb0: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 29  ite3SelectPrep()
7bc0: 20 64 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 70   do all of the p
7bd0: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
7be0: 69 73 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2a 20  is SELECT..  ** 
7bf0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
7c00: 70 28 29 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20  p() will invoke 
7c10: 62 6f 74 68 20 73 71 6c 69 74 65 33 53 65 6c 65  both sqlite3Sele
7c20: 63 74 45 78 70 61 6e 64 28 29 20 61 6e 64 0a 20  ctExpand() and. 
7c30: 20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65   ** this routine
7c40: 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
7c50: 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  order..  */.  if
7c60: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
7c70: 20 53 46 5f 45 78 70 61 6e 64 65 64 29 3d 3d 30   SF_Expanded)==0
7c80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
7c90: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
7ca0: 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
7cb0: 20 20 20 20 72 65 74 75 72 6e 20 28 70 50 61 72      return (pPar
7cc0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
7cd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20  mallocFailed) ? 
7ce0: 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f  WRC_Abort : WRC_
7cf0: 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 69 73  Prune;.  }..  is
7d00: 43 6f 6d 70 6f 75 6e 64 20 3d 20 70 2d 3e 70 50  Compound = p->pP
7d10: 72 69 6f 72 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70  rior!=0;.  nComp
7d20: 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 70 4c 65 66  ound = 0;.  pLef
7d30: 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 77 68 69  tmost = p;.  whi
7d40: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  le( p ){.    ass
7d50: 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
7d60: 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
7d70: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
7d80: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
7d90: 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 3d 3d  & SF_Resolved)==
7da0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  0 );.    p->selF
7db0: 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 73 6f 6c  lags |= SF_Resol
7dc0: 76 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73  ved;..    /* Res
7dd0: 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
7de0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
7df0: 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
7e00: 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 20 20  uses. These.    
7e10: 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
7e20: 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
7e30: 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
7e40: 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
7e50: 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
7e60: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
7e70: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
7e80: 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
7e90: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66  = pParse;.    if
7ea0: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
7eb0: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
7ec0: 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20  p->pLimit) ||.  
7ed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
7ee0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
7ef0: 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20  NC, p->pOffset) 
7f00: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7f10: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
7f20: 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  .  .    /* Set u
7f30: 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65  p the local name
7f40: 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73  -context to pass
7f50: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   to sqlite3Resol
7f60: 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 74 6f  veExprNames() to
7f70: 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20  .    ** resolve 
7f80: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65  the result-set e
7f90: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
7fa0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 61      */.    sNC.a
7fb0: 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 20  llowAgg = 1;.   
7fc0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
7fd0: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 73 4e 43  p->pSrc;.    sNC
7fe0: 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e  .pNext = pOuterN
7ff0: 43 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73  C;.  .    /* Res
8000: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  olve names in th
8010: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  e result set. */
8020: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  .    pEList = p-
8030: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  >pEList;.    ass
8040: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
8050: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
8060: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8070: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
8080: 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pX = pEList->a
8090: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
80a0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
80b0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
80c0: 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20  C, pX) ){.      
80d0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
80e0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
80f0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 75  }.  .    /* Recu
8100: 72 73 69 76 65 6c 79 20 72 65 73 6f 6c 76 65 20  rsively resolve 
8110: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73 75 62  names in all sub
8120: 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2f 0a 20  queries.    */. 
8130: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
8140: 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
8150: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
8160: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
8170: 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
8180: 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  a[i];.      if( 
8190: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
81a0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
81b0: 63 68 61 72 20 2a 7a 53 61 76 65 64 43 6f 6e 74  char *zSavedCont
81c0: 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41  ext = pParse->zA
81d0: 75 74 68 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  uthContext;.    
81e0: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
81f0: 4e 61 6d 65 20 29 20 70 50 61 72 73 65 2d 3e 7a  Name ) pParse->z
8200: 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
8210: 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
8220: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
8230: 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
8240: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
8250: 6c 65 63 74 2c 20 70 4f 75 74 65 72 4e 43 20 2f  lect, pOuterNC /
8260: 2a 26 73 4e 43 2a 2f 29 3b 0a 20 20 20 20 20 20  *&sNC*/);.      
8270: 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
8280: 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 43  ontext = zSavedC
8290: 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
82a0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
82b0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
82c0: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 57 52  iled ) return WR
82d0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
82e0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
82f0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
8300: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8310: 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
8320: 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
8330: 52 4f 55 50 20 42 59 20 0a 20 20 20 20 2a 2a 20  ROUP BY .    ** 
8340: 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e  expression, do n
8350: 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61  ot allow aggrega
8360: 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  tes in any of th
8370: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
8380: 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
8390: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
83a0: 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
83b0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ate)==0 );.    p
83c0: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
83d0: 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 70  oupBy;.    if( p
83e0: 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e 43 2e 68  GroupBy || sNC.h
83f0: 61 73 41 67 67 20 29 7b 0a 20 20 20 20 20 20 70  asAgg ){.      p
8400: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
8410: 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
8420: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 4e 43  }else{.      sNC
8430: 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20  .allowAgg = 0;. 
8440: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
8450: 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73  f a HAVING claus
8460: 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68  e is present, th
8470: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
8480: 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75   a GROUP BY clau
8490: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
84a0: 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26  f( p->pHaving &&
84b0: 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20   !pGroupBy ){.  
84c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
84d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47  Msg(pParse, "a G
84e0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
84f0: 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
8500: 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20  e HAVING");.    
8510: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
8520: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rt;.    }.  .   
8530: 20 2f 2a 20 41 64 64 20 74 68 65 20 65 78 70 72   /* Add the expr
8540: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 74  ession list to t
8550: 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  he name-context 
8560: 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74  before parsing t
8570: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
8580: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
8590: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
85a0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20  ent. This is so 
85b0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 78 70 72  that.    ** expr
85c0: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
85d0: 48 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63  HERE clause (etc
85e0: 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20  .) can refer to 
85f0: 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20  expressions by. 
8600: 20 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e     ** aliases in
8610: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
8620: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4d  .    **.    ** M
8630: 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74  inor point: If t
8640: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
8650: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
8660: 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 20  sion will be.   
8670: 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64   ** re-evaluated
8680: 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72 65   for each refere
8690: 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  nce to it..    *
86a0: 2f 0a 20 20 20 20 73 4e 43 2e 70 45 4c 69 73 74  /.    sNC.pEList
86b0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
86c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
86d0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
86e0: 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 7c  NC, p->pWhere) |
86f0: 7c 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  |.       sqlite3
8700: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
8710: 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e  (&sNC, p->pHavin
8720: 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  g).    ){.      
8730: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
8740: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8750: 54 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  The ORDER BY and
8760: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
8770: 73 20 6d 61 79 20 6e 6f 74 20 72 65 66 65 72 20  s may not refer 
8780: 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20 20 20 20  to terms in.    
8790: 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 69 65 73  ** outer queries
87a0: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43   .    */.    sNC
87b0: 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  .pNext = 0;.    
87c0: 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 31  sNC.allowAgg = 1
87d0: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73  ;..    /* Proces
87e0: 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  s the ORDER BY c
87f0: 6c 61 75 73 65 20 66 6f 72 20 73 69 6e 67 6c 65  lause for single
8800: 74 6f 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65  ton SELECT state
8810: 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68  ments..    ** Th
8820: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8830: 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64 73 20  e for compounds 
8840: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8850: 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 20 20 20  s is handled.   
8860: 20 2a 2a 20 62 65 6c 6f 77 2c 20 61 66 74 65 72   ** below, after
8870: 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 73 75   all of the resu
8880: 6c 74 2d 73 65 74 73 20 66 6f 72 20 61 6c 6c 20  lt-sets for all 
8890: 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20  of the elements 
88a0: 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
88b0: 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65 65 6e  mpound have been
88c0: 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a   resolved..    *
88d0: 2f 0a 20 20 20 20 69 66 28 20 21 69 73 43 6f 6d  /.    if( !isCom
88e0: 70 6f 75 6e 64 20 26 26 20 72 65 73 6f 6c 76 65  pound && resolve
88f0: 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e  OrderGroupBy(&sN
8900: 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  C, p, p->pOrderB
8910: 79 2c 20 22 4f 52 44 45 52 22 29 20 29 7b 0a 20  y, "ORDER") ){. 
8920: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
8930: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
8940: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
8950: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
8960: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
8970: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
8980: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 47 52 4f   Resolve the GRO
8990: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 41  UP BY clause.  A
89a0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
89b0: 20 6d 61 6b 65 20 73 75 72 65 20 0a 20 20 20 20   make sure .    
89c0: 2a 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  ** the GROUP BY 
89d0: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
89e0: 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74  contain aggregat
89f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 20  e functions..   
8a00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
8a10: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74  upBy ){.      st
8a20: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
8a30: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 0a  em *pItem;.    .
8a40: 20 20 20 20 20 20 69 66 28 20 72 65 73 6f 6c 76        if( resolv
8a50: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  eOrderGroupBy(&s
8a60: 4e 43 2c 20 70 2c 20 70 47 72 6f 75 70 42 79 2c  NC, p, pGroupBy,
8a70: 20 22 47 52 4f 55 50 22 29 20 7c 7c 20 64 62 2d   "GROUP") || db-
8a80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
8a90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
8aa0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
8ab0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
8ac0: 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
8ad0: 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  ->a; i<pGroupBy-
8ae0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
8af0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  em++){.        i
8b00: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
8b10: 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ty(pItem->pExpr,
8b20: 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
8b30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8b40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
8b50: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
8b60: 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ns are not allow
8b70: 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20  ed in ".        
8b80: 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55 50        "the GROUP
8b90: 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20   BY clause");.  
8ba0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
8bb0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
8bc0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8bd0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  }..    /* Advanc
8be0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65  e to the next te
8bf0: 72 6d 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  rm of the compou
8c00: 6e 64 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  nd.    */.    p 
8c10: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
8c20: 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a 20 20   nCompound++;.  
8c30: 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
8c40: 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 6e 20  the ORDER BY on 
8c50: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
8c60: 54 20 61 66 74 65 72 20 61 6c 6c 20 74 65 72 6d  T after all term
8c70: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
8c80: 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65 65 6e  mpound have been
8c90: 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a   resolved..  */.
8ca0: 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64    if( isCompound
8cb0: 20 26 26 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f   && resolveCompo
8cc0: 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72 73  undOrderBy(pPars
8cd0: 65 2c 20 70 4c 65 66 74 6d 6f 73 74 29 20 29 7b  e, pLeftmost) ){
8ce0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
8cf0: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  Abort;.  }..  re
8d00: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
8d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8d20: 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65  utine walks an e
8d30: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
8d40: 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65  nd resolves refe
8d50: 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62  rences to.** tab
8d60: 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 72  le columns and r
8d70: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
8d80: 73 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65 20  s.  At the same 
8d90: 74 69 6d 65 2c 20 64 6f 20 65 72 72 6f 72 0a 2a  time, do error.*
8da0: 2a 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 66 75  * checking on fu
8db0: 6e 63 74 69 6f 6e 20 75 73 61 67 65 20 61 6e 64  nction usage and
8dc0: 20 73 65 74 20 61 20 66 6c 61 67 20 69 66 20 61   set a flag if a
8dd0: 6e 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ny aggregate fun
8de0: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 73 65  ctions.** are se
8df0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73  en..**.** To res
8e00: 6f 6c 76 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d  olve table colum
8e10: 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20 77 65  ns references we
8e20: 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f 64 65 73 20   look for nodes 
8e30: 28 6f 72 20 73 75 62 74 72 65 65 73 29 20 6f 66  (or subtrees) of
8e40: 20 74 68 65 20 0a 2a 2a 20 66 6f 72 6d 20 58 2e   the .** form X.
8e50: 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75  Y.Z or Y.Z or ju
8e60: 73 74 20 5a 20 77 68 65 72 65 0a 2a 2a 0a 2a 2a  st Z where.**.**
8e70: 20 20 20 20 20 20 58 3a 20 20 20 54 68 65 20 6e        X:   The n
8e80: 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
8e90: 65 2e 20 20 45 78 3a 20 20 22 6d 61 69 6e 22 20  e.  Ex:  "main" 
8ea0: 6f 72 20 22 74 65 6d 70 22 20 6f 72 0a 2a 2a 20  or "temp" or.** 
8eb0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 73 79            the sy
8ec0: 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 61 73 73 69  mbolic name assi
8ed0: 67 6e 65 64 20 74 6f 20 61 6e 20 41 54 54 41 43  gned to an ATTAC
8ee0: 48 2d 65 64 20 64 61 74 61 62 61 73 65 2e 0a 2a  H-ed database..*
8ef0: 2a 0a 2a 2a 20 20 20 20 20 20 59 3a 20 20 20 54  *.**      Y:   T
8f00: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62  he name of a tab
8f10: 6c 65 20 69 6e 20 61 20 46 52 4f 4d 20 63 6c 61  le in a FROM cla
8f20: 75 73 65 2e 20 20 4f 72 20 69 6e 20 61 20 74 72  use.  Or in a tr
8f30: 69 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  igger.**        
8f40: 20 20 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70     one of the sp
8f50: 65 63 69 61 6c 20 6e 61 6d 65 73 20 22 6f 6c 64  ecial names "old
8f60: 22 20 6f 72 20 22 6e 65 77 22 2e 0a 2a 2a 0a 2a  " or "new"..**.*
8f70: 2a 20 20 20 20 20 20 5a 3a 20 20 20 54 68 65 20  *      Z:   The 
8f80: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
8f90: 20 69 6e 20 74 61 62 6c 65 20 59 2e 0a 2a 2a 0a   in table Y..**.
8fa0: 2a 2a 20 54 68 65 20 6e 6f 64 65 20 61 74 20 74  ** The node at t
8fb0: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 73  he root of the s
8fc0: 75 62 74 72 65 65 20 69 73 20 6d 6f 64 69 66 69  ubtree is modifi
8fd0: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
8fe0: 2a 0a 2a 2a 20 20 20 20 45 78 70 72 2e 6f 70 20  *.**    Expr.op 
8ff0: 20 20 20 20 20 20 20 43 68 61 6e 67 65 64 20 74         Changed t
9000: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20  o TK_COLUMN.**  
9010: 20 20 45 78 70 72 2e 70 54 61 62 20 20 20 20 20    Expr.pTab     
9020: 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 54   Points to the T
9030: 61 62 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  able object for 
9040: 58 2e 59 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69  X.Y.**    Expr.i
9050: 43 6f 6c 75 6d 6e 20 20 20 54 68 65 20 63 6f 6c  Column   The col
9060: 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20 58 2e 59  umn index in X.Y
9070: 2e 20 20 2d 31 20 66 6f 72 20 74 68 65 20 72 6f  .  -1 for the ro
9080: 77 69 64 2e 0a 2a 2a 20 20 20 20 45 78 70 72 2e  wid..**    Expr.
9090: 69 54 61 62 6c 65 20 20 20 20 54 68 65 20 56 44  iTable    The VD
90a0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
90b0: 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a 2a 2a 0a 2a   for X.Y.**.**.*
90c0: 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 72 65 73  * To resolve res
90d0: 75 6c 74 2d 73 65 74 20 72 65 66 65 72 65 6e 63  ult-set referenc
90e0: 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72 20 65 78 70  es, look for exp
90f0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73 20 6f 66  ression nodes of
9100: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 5a 20 28   the.** form Z (
9110: 77 69 74 68 20 6e 6f 20 58 20 61 6e 64 20 59 20  with no X and Y 
9120: 70 72 65 66 69 78 29 20 77 68 65 72 65 20 74 68  prefix) where th
9130: 65 20 5a 20 6d 61 74 63 68 65 73 20 74 68 65 20  e Z matches the 
9140: 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69  right-hand.** si
9150: 7a 65 20 6f 66 20 61 6e 20 41 53 20 63 6c 61 75  ze of an AS clau
9160: 73 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  se in the result
9170: 2d 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54  -set of a SELECT
9180: 2e 20 20 54 68 65 20 5a 20 65 78 70 72 65 73 73  .  The Z express
9190: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 70 6c 61 63  ion.** is replac
91a0: 65 64 20 62 79 20 61 20 63 6f 70 79 20 6f 66 20  ed by a copy of 
91b0: 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  the left-hand si
91c0: 64 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  de of the result
91d0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e  -set expression.
91e0: 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61 6d 65 20 61  .** Table-name a
91f0: 6e 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 6f  nd function reso
9200: 6c 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 6f 6e  lution occurs on
9210: 20 74 68 65 20 73 75 62 73 74 69 74 75 74 65 64   the substituted
9220: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
9230: 72 65 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ree.  For exampl
9240: 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e, in:.**.**    
9250: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
9260: 78 2c 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d  x, c+d AS y FROM
9270: 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 3b 0a   t1 ORDER BY x;.
9280: 2a 2a 0a 2a 2a 20 54 68 65 20 22 78 22 20 74 65  **.** The "x" te
9290: 72 6d 20 6f 66 20 74 68 65 20 6f 72 64 65 72 20  rm of the order 
92a0: 62 79 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  by is replaced b
92b0: 79 20 22 61 2b 62 22 20 74 6f 20 72 65 6e 64 65  y "a+b" to rende
92c0: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45  r:.**.**      SE
92d0: 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20 63  LECT a+b AS x, c
92e0: 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20  +d AS y FROM t1 
92f0: 4f 52 44 45 52 20 42 59 20 61 2b 62 3b 0a 2a 2a  ORDER BY a+b;.**
9300: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c  .** Function cal
9310: 6c 73 20 61 72 65 20 63 68 65 63 6b 65 64 20 74  ls are checked t
9320: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
9330: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
9340: 20 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 6e 64   .** defined and
9350: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
9360: 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  t number of argu
9370: 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63 69 66  ments are specif
9380: 69 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66  ied..** If the f
9390: 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 61 67  unction is an ag
93a0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
93b0: 2c 20 74 68 65 6e 20 74 68 65 20 70 4e 43 2d 3e  , then the pNC->
93c0: 68 61 73 41 67 67 20 69 73 0a 2a 2a 20 73 65 74  hasAgg is.** set
93d0: 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 20   and the opcode 
93e0: 69 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  is changed from 
93f0: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 74 6f 20 54  TK_FUNCTION to T
9400: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a  K_AGG_FUNCTION..
9410: 2a 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  ** If an express
9420: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67  ion contains agg
9430: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
9440: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 41 67 67   then the EP_Agg
9450: 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  .** property on 
9460: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
9470: 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  s set..**.** An 
9480: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
9490: 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65 20   left in pParse 
94a0: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61  if anything is a
94b0: 6d 69 73 73 2e 20 20 54 68 65 20 6e 75 6d 62 65  miss.  The numbe
94c0: 72 0a 2a 2a 20 69 66 20 65 72 72 6f 72 73 20 69  r.** if errors i
94d0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
94e0: 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  nt sqlite3Resolv
94f0: 65 45 78 70 72 4e 61 6d 65 73 28 20 0a 20 20 4e  eExprNames( .  N
9500: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
9510: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70         /* Namesp
9520: 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65  ace to resolve e
9530: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a  xpressions in. *
9540: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
9550: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9560: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
9570: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f   be analyzed. */
9580: 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48  .){.  int savedH
9590: 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b 65 72 20  asAgg;.  Walker 
95a0: 77 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  w;..  if( pExpr=
95b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  =0 ) return 0;.#
95c0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
95d0: 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 7b 0a 20  PR_DEPTH>0.  {. 
95e0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
95f0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
9600: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
9610: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
9620: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 6e 48  Parse, pExpr->nH
9630: 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61 72 73  eight+pNC->pPars
9640: 65 2d 3e 6e 48 65 69 67 68 74 29 20 29 7b 0a 20  e->nHeight) ){. 
9650: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9660: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
9670: 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78 70  >nHeight += pExp
9680: 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 7d 0a  r->nHeight;.  }.
9690: 23 65 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61  #endif.  savedHa
96a0: 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68 61 73 41  sAgg = pNC->hasA
96b0: 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61 73 41 67  gg;.  pNC->hasAg
96c0: 67 20 3d 20 30 3b 0a 20 20 77 2e 78 45 78 70 72  g = 0;.  w.xExpr
96d0: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
96e0: 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e  veExprStep;.  w.
96f0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
9700: 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  = resolveSelectS
9710: 74 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  tep;.  w.pParse 
9720: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
9730: 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
9740: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
9750: 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 23 69  r(&w, pExpr);.#i
9760: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
9770: 52 5f 44 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d  R_DEPTH>0.  pNC-
9780: 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74  >pParse->nHeight
9790: 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67   -= pExpr->nHeig
97a0: 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ht;.#endif.  if(
97b0: 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a   pNC->nErr>0 ){.
97c0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
97d0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
97e0: 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ror);.  }.  if( 
97f0: 70 4e 43 2d 3e 68 61 73 41 67 67 20 29 7b 0a 20  pNC->hasAgg ){. 
9800: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
9810: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67  ty(pExpr, EP_Agg
9820: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
9830: 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20 20  avedHasAgg ){.  
9840: 20 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20    pNC->hasAgg = 
9850: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
9860: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
9870: 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29  pExpr, EP_Error)
9880: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f  ;.}.../*.** Reso
9890: 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e  lve all names in
98a0: 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e 73   all expressions
98b0: 20 6f 66 20 61 20 53 45 4c 45 43 54 20 61 6e 64   of a SELECT and
98c0: 20 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65 63 65 6e   in all.** decen
98d0: 64 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c  dents of the SEL
98e0: 45 43 54 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ECT, including c
98f0: 6f 6d 70 6f 75 6e 64 73 20 6f 66 66 20 6f 66 20  ompounds off of 
9900: 70 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a 20 73 75  p->pPrior,.** su
9910: 62 71 75 65 72 69 65 73 20 69 6e 20 65 78 70 72  bqueries in expr
9920: 65 73 73 69 6f 6e 73 2c 20 61 6e 64 20 73 75 62  essions, and sub
9930: 71 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20  queries used as 
9940: 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 74  FROM clause.** t
9950: 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  erms..**.** See 
9960: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
9970: 70 72 4e 61 6d 65 73 28 29 20 66 6f 72 20 61 20  prNames() for a 
9980: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
9990: 68 65 20 6b 69 6e 64 73 20 6f 66 0a 2a 2a 20 74  he kinds of.** t
99a0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 74  ransformations t
99b0: 68 61 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a  hat occur..**.**
99c0: 20 41 6c 6c 20 53 45 4c 45 43 54 20 73 74 61 74   All SELECT stat
99d0: 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 68 61  ements should ha
99e0: 76 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64  ve been expanded
99f0: 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
9a00: 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
9a10: 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e  prior to invokin
9a20: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  g this routine..
9a30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
9a40: 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
9a50: 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  s(.  Parse *pPar
9a60: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
9a70: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
9a80: 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
9a90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
9aa0: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
9ab0: 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65  ement being code
9ac0: 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  d. */.  NameCont
9ad0: 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f  ext *pOuterNC  /
9ae0: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
9af0: 6f 72 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54  or parent SELECT
9b00: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b   statement */.){
9b10: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20 20  .  Walker w;..  
9b20: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
9b30: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
9b40: 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53  k = resolveExprS
9b50: 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  tep;.  w.xSelect
9b60: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
9b70: 76 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20  veSelectStep;.  
9b80: 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  w.pParse = pPars
9b90: 65 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  e;.  w.u.pNC = p
9ba0: 4f 75 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69 74  OuterNC;.  sqlit
9bb0: 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c  e3WalkSelect(&w,
9bc0: 20 70 29 3b 0a 7d 0a                              p);.}.