/ Hex Artifact Content
Login

Artifact 1c0f32b64f8e3f555fe1f732f9d6f501a7f05706:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 18.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 77  tines used for w
01a0: 61 6c 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65  alking the parse
01b0: 72 20 74 72 65 65 20 61 6e 64 0a 2a 2a 20 72 65  r tree and.** re
01c0: 73 6f 6c 76 65 20 61 6c 6c 20 69 64 65 6e 74 69  solve all identi
01d0: 66 69 65 72 73 20 62 79 20 61 73 73 6f 63 69 61  fiers by associa
01e0: 74 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 61  ting them with a
01f0: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 74   particular.** t
0200: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
0210: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0220: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
0230: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0240: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0250: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74  h>../*.** Turn t
0260: 68 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73  he pExpr express
0270: 69 6f 6e 20 69 6e 74 6f 20 61 6e 20 61 6c 69 61  ion into an alia
0280: 73 20 66 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74  s for the iCol-t
0290: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a  h column of the.
02a0: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 69 6e  ** result set in
02b0: 20 70 45 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49   pEList..**.** I
02c0: 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  f the result set
02d0: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 20 73 69 6d   column is a sim
02e0: 70 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72  ple column refer
02f0: 65 6e 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20  ence, then this 
0300: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 61 6b 65 73  routine.** makes
0310: 20 61 6e 20 65 78 61 63 74 20 63 6f 70 79 2e 20   an exact copy. 
0320: 20 42 75 74 20 66 6f 72 20 61 6e 79 20 6f 74 68   But for any oth
0330: 65 72 20 6b 69 6e 64 20 6f 66 20 65 78 70 72 65  er kind of expre
0340: 73 73 69 6f 6e 2c 20 74 68 69 73 0a 2a 2a 20 72  ssion, this.** r
0350: 6f 75 74 69 6e 65 20 6d 61 6b 65 20 61 20 63 6f  outine make a co
0360: 70 79 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  py of the result
0370: 20 73 65 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74   set column as t
0380: 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  he argument to t
0390: 68 65 0a 2a 2a 20 54 4b 5f 41 53 20 6f 70 65 72  he.** TK_AS oper
03a0: 61 74 6f 72 2e 20 20 54 68 65 20 54 4b 5f 41 53  ator.  The TK_AS
03b0: 20 6f 70 65 72 61 74 6f 72 20 63 61 75 73 65 73   operator causes
03c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
03d0: 74 6f 20 62 65 0a 2a 2a 20 65 76 61 6c 75 61 74  to be.** evaluat
03e0: 65 64 20 6a 75 73 74 20 6f 6e 63 65 20 61 6e 64  ed just once and
03f0: 20 74 68 65 6e 20 72 65 75 73 65 64 20 66 6f 72   then reused for
0400: 20 65 61 63 68 20 61 6c 69 61 73 2e 0a 2a 2a 0a   each alias..**.
0410: 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 66 6f  ** The reason fo
0420: 72 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68  r suppressing th
0430: 65 20 54 4b 5f 41 53 20 74 65 72 6d 20 77 68 65  e TK_AS term whe
0440: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
0450: 20 69 73 20 61 20 73 69 6d 70 6c 65 0a 2a 2a 20   is a simple.** 
0460: 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
0470: 20 69 73 20 73 6f 20 74 68 61 74 20 74 68 65 20   is so that the 
0480: 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65  column reference
0490: 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 67 6e 69   will be recogni
04a0: 7a 65 64 20 61 73 0a 2a 2a 20 75 73 61 62 6c 65  zed as.** usable
04b0: 20 62 79 20 69 6e 64 69 63 65 73 20 77 69 74 68   by indices with
04c0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
04d0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  use processing l
04e0: 6f 67 69 63 2e 20 0a 2a 2a 0a 2a 2a 20 48 61 63  ogic. .**.** Hac
04f0: 6b 3a 20 20 54 68 65 20 54 4b 5f 41 53 20 6f 70  k:  The TK_AS op
0500: 65 72 61 74 6f 72 20 69 73 20 69 6e 68 69 62 69  erator is inhibi
0510: 74 65 64 20 69 66 20 7a 54 79 70 65 5b 30 5d 3d  ted if zType[0]=
0520: 3d 27 47 27 2e 20 20 54 68 69 73 20 6d 65 61 6e  ='G'.  This mean
0530: 73 0a 2a 2a 20 74 68 61 74 20 69 6e 20 61 20 47  s.** that in a G
0540: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2c 20  ROUP BY clause, 
0550: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
0560: 73 20 65 76 61 6c 75 61 74 65 64 20 74 77 69 63  s evaluated twic
0570: 65 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a  e.  Hence:.**.**
0580: 20 20 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64       SELECT rand
0590: 6f 6d 28 29 25 35 20 41 53 20 78 2c 20 63 6f 75  om()%5 AS x, cou
05a0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 61 62 20 47  nt(*) FROM tab G
05b0: 52 4f 55 50 20 42 59 20 78 0a 2a 2a 0a 2a 2a 20  ROUP BY x.**.** 
05c0: 49 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  Is equivalent to
05d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
05e0: 43 54 20 72 61 6e 64 6f 6d 28 29 25 35 20 41 53  CT random()%5 AS
05f0: 20 78 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f   x, count(*) FRO
0600: 4d 20 74 61 62 20 47 52 4f 55 50 20 42 59 20 72  M tab GROUP BY r
0610: 61 6e 64 6f 6d 28 29 25 35 0a 2a 2a 0a 2a 2a 20  andom()%5.**.** 
0620: 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 72 61  The result of ra
0630: 6e 64 6f 6d 28 29 25 35 20 69 6e 20 74 68 65 20  ndom()%5 in the 
0640: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
0650: 69 73 20 70 72 6f 62 61 62 6c 79 20 64 69 66 66  is probably diff
0660: 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68  erent.** from th
0670: 65 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  e result in the 
0680: 72 65 73 75 6c 74 2d 73 65 74 2e 20 20 57 65 20  result-set.  We 
0690: 6d 69 67 68 74 20 66 69 78 20 74 68 69 73 20 73  might fix this s
06a0: 6f 6d 65 64 61 79 2e 20 20 4f 72 0a 2a 2a 20 74  omeday.  Or.** t
06b0: 68 65 6e 20 61 67 61 69 6e 2c 20 77 65 20 6d 69  hen again, we mi
06c0: 67 68 74 20 6e 6f 74 2e 2e 2e 0a 2a 2f 0a 73 74  ght not....*/.st
06d0: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
06e0: 65 41 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20  eAlias(.  Parse 
06f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
0700: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
0710: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
0720: 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20  t *pEList,      
0730: 2f 2a 20 41 20 72 65 73 75 6c 74 20 73 65 74 20  /* A result set 
0740: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
0750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0760: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72   column in the r
0770: 65 73 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70  esult set.  0..p
0780: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a  EList->nExpr-1 *
0790: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
07a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
07b0: 61 6e 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74  ansform this int
07c0: 6f 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68  o an alias to th
07d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
07e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
07f0: 79 70 65 20 20 20 20 20 20 2f 2a 20 22 47 52 4f  ype      /* "GRO
0800: 55 50 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f  UP" or "ORDER" o
0810: 72 20 22 22 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  r "" */.){.  Exp
0820: 72 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 20 20  r *pOrig;       
0830: 20 20 20 20 2f 2a 20 54 68 65 20 69 43 6f 6c 2d      /* The iCol-
0840: 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  th column of the
0850: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
0860: 20 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20   Expr *pDup;    
0870: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
0880: 6f 66 20 70 4f 72 69 67 20 2a 2f 0a 20 20 73 71  of pOrig */.  sq
0890: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
08a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
08b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
08c0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 43  */..  assert( iC
08d0: 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 45  ol>=0 && iCol<pE
08e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 3b 0a 20  List->nExpr );. 
08f0: 20 70 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d   pOrig = pEList-
0900: 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a  >a[iCol].pExpr;.
0910: 20 20 61 73 73 65 72 74 28 20 70 4f 72 69 67 21    assert( pOrig!
0920: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
0930: 70 4f 72 69 67 2d 3e 66 6c 61 67 73 20 26 20 45  pOrig->flags & E
0940: 50 5f 52 65 73 6f 6c 76 65 64 20 29 3b 0a 20 20  P_Resolved );.  
0950: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
0960: 0a 20 20 69 66 28 20 70 4f 72 69 67 2d 3e 6f 70  .  if( pOrig->op
0970: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 7a  !=TK_COLUMN && z
0980: 54 79 70 65 5b 30 5d 21 3d 27 47 27 20 29 7b 0a  Type[0]!='G' ){.
0990: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
09a0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
09b0: 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 70 44 75  rig, 0);.    pDu
09c0: 70 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  p = sqlite3PExpr
09d0: 28 70 50 61 72 73 65 2c 20 54 4b 5f 41 53 2c 20  (pParse, TK_AS, 
09e0: 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pDup, 0, 0);.   
09f0: 20 69 66 28 20 70 44 75 70 3d 3d 30 20 29 20 72   if( pDup==0 ) r
0a00: 65 74 75 72 6e 3b 0a 20 20 20 20 69 66 28 20 70  eturn;.    if( p
0a10: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 69  EList->a[iCol].i
0a20: 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Alias==0 ){.    
0a30: 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c    pEList->a[iCol
0a40: 5d 2e 69 41 6c 69 61 73 20 3d 20 28 75 31 36 29  ].iAlias = (u16)
0a50: 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61  (++pParse->nAlia
0a60: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  s);.    }.    pD
0a70: 75 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 4c  up->iTable = pEL
0a80: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41 6c  ist->a[iCol].iAl
0a90: 69 61 73 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ias;.  }else if(
0aa0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
0ab0: 28 70 4f 72 69 67 2c 20 45 50 5f 49 6e 74 56 61  (pOrig, EP_IntVa
0ac0: 6c 75 65 29 20 7c 7c 20 70 4f 72 69 67 2d 3e 75  lue) || pOrig->u
0ad0: 2e 7a 54 6f 6b 65 6e 3d 3d 30 20 29 7b 0a 20 20  .zToken==0 ){.  
0ae0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
0af0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72 69  ExprDup(db, pOri
0b00: 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  g, 0);.    if( p
0b10: 44 75 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Dup==0 ) return;
0b20: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
0b30: 61 72 20 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4f 72  ar *zToken = pOr
0b40: 69 67 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ig->u.zToken;.  
0b50: 20 20 61 73 73 65 72 74 28 20 7a 54 6f 6b 65 6e    assert( zToken
0b60: 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 69 67  !=0 );.    pOrig
0b70: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 30 3b 0a  ->u.zToken = 0;.
0b80: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
0b90: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
0ba0: 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 70 4f 72  rig, 0);.    pOr
0bb0: 69 67 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 7a  ig->u.zToken = z
0bc0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 66 28 20 70  Token;.    if( p
0bd0: 44 75 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Dup==0 ) return;
0be0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 44  .    assert( (pD
0bf0: 75 70 2d 3e 66 6c 61 67 73 20 26 20 28 45 50 5f  up->flags & (EP_
0c00: 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e  Reduced|EP_Token
0c10: 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Only))==0 );.   
0c20: 20 70 44 75 70 2d 3e 66 6c 61 67 73 32 20 7c 3d   pDup->flags2 |=
0c30: 20 45 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b   EP2_MallocedTok
0c40: 65 6e 3b 0a 20 20 20 20 70 44 75 70 2d 3e 75 2e  en;.    pDup->u.
0c50: 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  zToken = sqlite3
0c60: 44 62 53 74 72 44 75 70 28 64 62 2c 20 7a 54 6f  DbStrDup(db, zTo
0c70: 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ken);.  }.  if( 
0c80: 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 45  pExpr->flags & E
0c90: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 29 7b 0a  P_ExpCollate ){.
0ca0: 20 20 20 20 70 44 75 70 2d 3e 70 43 6f 6c 6c 20      pDup->pColl 
0cb0: 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a  = pExpr->pColl;.
0cc0: 20 20 20 20 70 44 75 70 2d 3e 66 6c 61 67 73 20      pDup->flags 
0cd0: 7c 3d 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  |= EP_ExpCollate
0ce0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
0cf0: 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  re calling sqlit
0d00: 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 2c 20  e3ExprDelete(), 
0d10: 73 65 74 20 74 68 65 20 45 50 5f 53 74 61 74 69  set the EP_Stati
0d20: 63 20 66 6c 61 67 2e 20 54 68 69 73 20 0a 20 20  c flag. This .  
0d30: 2a 2a 20 70 72 65 76 65 6e 74 73 20 45 78 70 72  ** prevents Expr
0d40: 44 65 6c 65 74 65 28 29 20 66 72 6f 6d 20 64 65  Delete() from de
0d50: 6c 65 74 69 6e 67 20 74 68 65 20 45 78 70 72 20  leting the Expr 
0d60: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
0d70: 2c 0a 20 20 2a 2a 20 61 6c 6c 6f 77 69 6e 67 20  ,.  ** allowing 
0d80: 69 74 20 74 6f 20 62 65 20 72 65 70 6f 70 75 6c  it to be repopul
0d90: 61 74 65 64 20 62 79 20 74 68 65 20 6d 65 6d 63  ated by the memc
0da0: 70 79 28 29 20 6f 6e 20 74 68 65 20 66 6f 6c 6c  py() on the foll
0db0: 6f 77 69 6e 67 20 6c 69 6e 65 2e 0a 20 20 2a 2f  owing line..  */
0dc0: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
0dd0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
0de0: 74 69 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  tic);.  sqlite3E
0df0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
0e00: 78 70 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  xpr);.  memcpy(p
0e10: 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65  Expr, pDup, size
0e20: 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 73  of(*pExpr));.  s
0e30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
0e40: 20 70 44 75 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pDup);.}../*.**
0e50: 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
0e60: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  of a column of t
0e70: 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72  he form X.Y.Z or
0e80: 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20   Y.Z or just Z, 
0e90: 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20  look up.** that 
0ea0: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20  name in the set 
0eb0: 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  of source tables
0ec0: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64   in pSrcList and
0ed0: 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20   make the pExpr 
0ee0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  .** expression n
0ef0: 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74  ode refer back t
0f00: 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f  o that source co
0f10: 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  lumn.  The follo
0f20: 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20  wing changes.** 
0f30: 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70  are made to pExp
0f40: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70  r:.**.**    pExp
0f50: 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20  r->iDb          
0f60: 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69   Set the index i
0f70: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74  n db->aDb[] of t
0f80: 68 65 20 64 61 74 61 62 61 73 65 20 58 0a 2a 2a  he database X.**
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fa0: 20 20 20 20 20 20 20 20 20 28 65 76 65 6e 20 69           (even i
0fb0: 66 20 58 20 69 73 20 69 6d 70 6c 69 65 64 29 2e  f X is implied).
0fc0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .**    pExpr->iT
0fd0: 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74 20  able        Set 
0fe0: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  to the cursor nu
0ff0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
1000: 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20  le obtained.**  
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63         from pSrc
1030: 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70  List..**    pExp
1040: 72 2d 3e 70 54 61 62 20 20 20 20 20 20 20 20 20  r->pTab         
1050: 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 54   Points to the T
1060: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 6f  able structure o
1070: 66 20 58 2e 59 20 28 65 76 65 6e 20 69 66 0a 2a  f X.Y (even if.*
1080: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1090: 20 20 20 20 20 20 20 20 20 20 58 20 61 6e 64 2f            X and/
10a0: 6f 72 20 59 20 61 72 65 20 69 6d 70 6c 69 65 64  or Y are implied
10b0: 2e 29 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  .).**    pExpr->
10c0: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
10d0: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
10e0: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
10f0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
1100: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
1110: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
1120: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
1130: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
1140: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
1150: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
1160: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
1170: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
1180: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
1190: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
11a0: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
11b0: 2a 0a 2a 2a 20 54 68 65 20 7a 44 62 20 76 61 72  *.** The zDb var
11c0: 69 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d  iable is the nam
11d0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
11e0: 65 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68  e (the "X").  Th
11f0: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a  is value may be.
1200: 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20  ** NULL meaning 
1210: 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20  that name is of 
1220: 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20  the form Y.Z or 
1230: 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c  Z.  Any availabl
1240: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61  e database.** ca
1250: 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20  n be used.  The 
1260: 7a 54 61 62 6c 65 20 76 61 72 69 61 62 6c 65 20  zTable variable 
1270: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
1280: 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59  he table (the "Y
1290: 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c  ").  This.** val
12a0: 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69  ue can be NULL i
12b0: 66 20 7a 44 62 20 69 73 20 61 6c 73 6f 20 4e 55  f zDb is also NU
12c0: 4c 4c 2e 20 20 49 66 20 7a 54 61 62 6c 65 20 69  LL.  If zTable i
12d0: 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61  s NULL it.** mea
12e0: 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d  ns that the form
12f0: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
1300: 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d  Z and that colum
1310: 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c  ns from any tabl
1320: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  e.** can be used
1330: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
1340: 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  ame cannot be re
1350: 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f  solved unambiguo
1360: 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65  usly, leave an e
1370: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
1380: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
1390: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 2e 20  turn WRC_Abort. 
13a0: 20 52 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   Return WRC_Prun
13b0: 65 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  e on success..*/
13c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b  .static int look
13d0: 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  upName(.  Parse 
13e0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
13f0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1400: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
1410: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
1420: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1430: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
1440: 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c  ng table, or NUL
1450: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
1460: 72 20 2a 7a 54 61 62 2c 20 20 20 20 2f 2a 20 4e  r *zTab,    /* N
1470: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e  ame of table con
1480: 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20  taining column, 
1490: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
14a0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
14b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
14c0: 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61   column. */.  Na
14d0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
14e0: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
14f0: 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72  ontext used to r
1500: 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20  esolve the name 
1510: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
1530: 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65  e this EXPR node
1540: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65   point to the se
1550: 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f  lected column */
1560: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
1570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1580: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
1590: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
15c0: 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20  matching column 
15d0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63  names */.  int c
15e0: 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20  ntTab = 0;      
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1600: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
1610: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a  ng table names *
1620: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1630: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
1640: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1650: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1660: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1670: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1680: 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66  ;       /* Use f
1690: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
16a0: 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a  pSrcList items *
16b0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
16c0: 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20  st_item *pMatch 
16d0: 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74  = 0;  /* The mat
16e0: 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69  ching pSrcList i
16f0: 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  tem */.  NameCon
1700: 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70  text *pTopNC = p
1710: 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  NC;        /* Fi
1720: 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20  rst namecontext 
1730: 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
1740: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1750: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1760: 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20     /* Schema of 
1770: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  the expression *
1780: 2f 0a 20 20 69 6e 74 20 69 73 54 72 69 67 67 65  /.  int isTrigge
1790: 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  r = 0;..  assert
17a0: 28 20 70 4e 43 20 29 3b 20 20 20 20 20 2f 2a 20  ( pNC );     /* 
17b0: 74 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  the name context
17c0: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e   cannot be NULL.
17d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 43   */.  assert( zC
17e0: 6f 6c 20 29 3b 20 20 20 20 2f 2a 20 54 68 65 20  ol );    /* The 
17f0: 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f  Z in X.Y.Z canno
1800: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 61  t be NULL */.  a
1810: 73 73 65 72 74 28 20 7e 45 78 70 72 48 61 73 41  ssert( ~ExprHasA
1820: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
1830: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
1840: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 0a 20  P_Reduced) );.. 
1850: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1860: 68 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d 6d 61  he node to no-ma
1870: 74 63 68 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e  tch */.  pExpr->
1880: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 70  iTable = -1;.  p
1890: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  Expr->pTab = 0;.
18a0: 20 20 45 78 70 72 53 65 74 49 72 72 65 64 75 63    ExprSetIrreduc
18b0: 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 0a 20 20  ible(pExpr);..  
18c0: 2f 2a 20 53 74 61 72 74 20 61 74 20 74 68 65 20  /* Start at the 
18d0: 69 6e 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e 74 65  inner-most conte
18e0: 78 74 20 61 6e 64 20 6d 6f 76 65 20 6f 75 74 77  xt and move outw
18f0: 61 72 64 20 75 6e 74 69 6c 20 61 20 6d 61 74 63  ard until a matc
1900: 68 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  h is found */.  
1910: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e  while( pNC && cn
1920: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  t==0 ){.    Expr
1930: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
1940: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
1950: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
1960: 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ist;..    if( pS
1970: 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  rcList ){.      
1980: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1990: 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53  SrcList->a; i<pS
19a0: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
19b0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
19c0: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
19d0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 44  ;.        int iD
19e0: 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  b;.        Colum
19f0: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20  n *pCol;.  .    
1a00: 20 20 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d      pTab = pItem
1a10: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
1a20: 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
1a30: 26 26 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d  && pTab->zName!=
1a40: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 44 62  0 );.        iDb
1a50: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1a60: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
1a70: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
1a80: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
1a90: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
1aa0: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
1ab0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
1ac0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
1ad0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
1ae0: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
1af0: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
1b00: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1b10: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
1b20: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
1b30: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1b40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b50: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
1b60: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
1b70: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
1b80: 69 66 28 20 4e 45 56 45 52 28 7a 54 61 62 4e 61  if( NEVER(zTabNa
1b90: 6d 65 3d 3d 30 29 20 7c 7c 20 73 71 6c 69 74 65  me==0) || sqlite
1ba0: 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d  3StrICmp(zTabNam
1bb0: 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a 20  e, zTab)!=0 ){. 
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
1bd0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
1be0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1bf0: 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73   if( zDb!=0 && s
1c00: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
1c10: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
1c20: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
1c30: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
1c40: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
1c50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1c60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c70: 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b   if( 0==(cntTab+
1c80: 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
1c90: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1ca0: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
1cb0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1cc0: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
1cd0: 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20          pSchema 
1ce0: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
1cf0: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
1d00: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
1d10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
1d20: 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (j=0, pCol=pTab-
1d30: 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
1d40: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
1d50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1d60: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1d70: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
1d80: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
1d90: 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70 55 73       IdList *pUs
1da0: 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ing;.           
1db0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
1dc0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
1dd0: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
1de0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  or;.            
1df0: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54  pExpr->pTab = pT
1e00: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
1e10: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 63 68              pSch
1e30: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
1e40: 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ema;.           
1e50: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
1e60: 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e  he rowid (column
1e70: 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54   -1) for the INT
1e80: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1e90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1ea0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
1eb0: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
1ec0: 3f 20 2d 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20  ? -1 : (i16)j;. 
1ed0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69             if( i
1ee0: 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 2d  <pSrcList->nSrc-
1ef0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1f00: 20 20 20 69 66 28 20 70 49 74 65 6d 5b 31 5d 2e     if( pItem[1].
1f10: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41  jointype & JT_NA
1f20: 54 55 52 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  TURAL ){.       
1f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
1f40: 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72 72  his match occurr
1f50: 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74 20 74  ed in the left t
1f60: 61 62 6c 65 20 6f 66 20 61 20 6e 61 74 75 72 61  able of a natura
1f70: 6c 20 6a 6f 69 6e 2c 0a 20 20 20 20 20 20 20 20  l join,.        
1f80: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
1f90: 73 6b 69 70 20 74 68 65 20 72 69 67 68 74 20 74  skip the right t
1fa0: 61 62 6c 65 20 74 6f 20 61 76 6f 69 64 20 61 20  able to avoid a 
1fb0: 64 75 70 6c 69 63 61 74 65 20 6d 61 74 63 68 20  duplicate match 
1fc0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1fd0: 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20     pItem++;.    
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
1ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
2000: 65 6c 73 65 20 69 66 28 20 28 70 55 73 69 6e 67  else if( (pUsing
2010: 20 3d 20 70 49 74 65 6d 5b 31 5d 2e 70 55 73 69   = pItem[1].pUsi
2020: 6e 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ng)!=0 ){.      
2030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2040: 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63 75 72  this match occur
2050: 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 74 68  s on a column th
2060: 61 74 20 69 73 20 69 6e 20 74 68 65 20 55 53 49  at is in the USI
2070: 4e 47 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20  NG clause.      
2080: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
2090: 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65  a join, skip the
20a0: 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 72   search of the r
20b0: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68  ight table of th
20c0: 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20  e join.         
20d0: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f         ** to avo
20e0: 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d  id a duplicate m
20f0: 61 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20  atch there. */. 
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2110: 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt k;.          
2120: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
2130: 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b  <pUsing->nId; k+
2140: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2150: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2160: 33 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d  3StrICmp(pUsing-
2170: 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  >a[k].zName, zCo
2180: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74               pIt
21a0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  em++;.          
21b0: 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20            i++;. 
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2210: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2220: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2230: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2250: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
2260: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
2270: 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68  R.    /* If we h
2280: 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  ave not already 
2290: 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d  resolved the nam
22a0: 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20  e, then maybe . 
22b0: 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65     ** it is a ne
22c0: 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69  w.* or old.* tri
22d0: 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65  gger argument re
22e0: 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20  ference.    */. 
22f0: 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26     if( zDb==0 &&
2300: 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d   zTab!=0 && cnt=
2310: 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54  =0 && pParse->pT
2320: 72 69 67 67 65 72 54 61 62 21 3d 30 20 29 7b 0a  riggerTab!=0 ){.
2330: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
2340: 50 61 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f  Parse->eTriggerO
2350: 70 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  p;.      Table *
2360: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
2370: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 44  assert( op==TK_D
2380: 45 4c 45 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ELETE || op==TK_
2390: 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b  UPDATE || op==TK
23a0: 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20 20 20 20  _INSERT );.     
23b0: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45   if( op!=TK_DELE
23c0: 54 45 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  TE && sqlite3Str
23d0: 49 43 6d 70 28 22 6e 65 77 22 2c 7a 54 61 62 29  ICmp("new",zTab)
23e0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20   == 0 ){.       
23f0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
2400: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   1;.        pTab
2410: 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67   = pParse->pTrig
2420: 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 65  gerTab;.      }e
2430: 6c 73 65 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49  lse if( op!=TK_I
2440: 4e 53 45 52 54 20 26 26 20 73 71 6c 69 74 65 33  NSERT && sqlite3
2450: 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 7a 54  StrICmp("old",zT
2460: 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ab)==0 ){.      
2470: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
2480: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61  = 0;.        pTa
2490: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69  b = pParse->pTri
24a0: 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d  ggerTab;.      }
24b0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ..      if( pTab
24c0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74   ){ .        int
24d0: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70   iCol;.        p
24e0: 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70  Schema = pTab->p
24f0: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
2500: 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20  cntTab++;.      
2510: 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
2520: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
2530: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2540: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
2550: 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f   &pTab->aCol[iCo
2560: 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  l];.          if
2570: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2580: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
2590: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
25a0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d        if( iCol==
25b0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20  pTab->iPKey ){. 
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f               iCo
25d0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  l = -1;.        
25e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2600: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2610: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e         if( iCol>
2620: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 73  =pTab->nCol && s
2630: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
2640: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ol) ){.         
2650: 20 69 43 6f 6c 20 3d 20 2d 31 3b 20 20 20 20 20   iCol = -1;     
2660: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 34 39     /* IMP: R-449
2670: 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20 20 20  11-55124 */.    
2680: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2690: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
26a0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  l ){.          c
26b0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
26c0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
26d0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
26e0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
26f0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
2700: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
2710: 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
2720: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2730: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
2740: 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  ol==31 );.      
2750: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2760: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
2770: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2780: 6f 6c 64 6d 61 73 6b 20 7c 3d 20 28 69 43 6f 6c  oldmask |= (iCol
2790: 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66 66  >=32 ? 0xfffffff
27a0: 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c 69  f : (((u32)1)<<i
27b0: 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Col));.         
27c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
27e0: 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  ol==31 );.      
27f0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2800: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
2810: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
2820: 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69 43 6f 6c  newmask |= (iCol
2830: 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66 66  >=32 ? 0xfffffff
2840: 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c 69  f : (((u32)1)<<i
2850: 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Col));.         
2860: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 45 78   }.          pEx
2870: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  pr->iColumn = (i
2880: 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16)iCol;.       
2890: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
28a0: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
28b0: 20 69 73 54 72 69 67 67 65 72 20 3d 20 31 3b 0a   isTrigger = 1;.
28c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28d0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
28e0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
28f0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
2900: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
2910: 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61  * Perhaps the na
2920: 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  me is a referenc
2930: 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20  e to the ROWID. 
2940: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
2950: 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d  t==0 && cntTab==
2960: 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  1 && sqlite3IsRo
2970: 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20  wid(zCol) ){.   
2980: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
2990: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
29a0: 20 3d 20 2d 31 3b 20 20 20 20 20 2f 2a 20 49 4d   = -1;     /* IM
29b0: 50 3a 20 52 2d 34 34 39 31 31 2d 35 35 31 32 34  P: R-44911-55124
29c0: 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d   */.      pExpr-
29d0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
29e0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
29f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
2a00: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75    ** If the inpu
2a10: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
2a20: 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58   Z (not Y.Z or X
2a30: 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e  .Y.Z) then the n
2a40: 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67  ame Z.    ** mig
2a50: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
2a60: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
2a70: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
2a80: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
2a90: 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20  n.    ** we are 
2aa0: 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20  resolving names 
2ab0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
2ac0: 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  use of the follo
2ad0: 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20  wing command:.  
2ae0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
2af0: 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20  SELECT a+b AS x 
2b00: 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45  FROM table WHERE
2b10: 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20   x<10;.    **.  
2b20: 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69    ** In cases li
2b30: 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65  ke this, replace
2b40: 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f   pExpr with a co
2b50: 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  py of the expres
2b60: 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a  sion that.    **
2b70: 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c   forms the resul
2b80: 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b  t set entry ("a+
2b90: 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c  b" in the exampl
2ba0: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d  e) and return im
2bb0: 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
2bc0: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
2bd0: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
2be0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f  e result set sho
2bf0: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
2c00: 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73   been.    ** res
2c10: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
2c20: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
2c30: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
2c40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
2c50: 6e 74 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74  nt==0 && (pEList
2c60: 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21   = pNC->pEList)!
2c70: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b  =0 && zTab==0 ){
2c80: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
2c90: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
2ca0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
2cb0: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
2cc0: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
2cd0: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
2ce0: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
2cf0: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
2d00: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
2d10: 78 70 72 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20  xpr *pOrig;.    
2d20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
2d30: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
2d40: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
2d50: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
2d60: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
2d70: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
2d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
2d90: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  xpr->x.pSelect==
2da0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
2db0: 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Orig = pEList->a
2dc0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
2dd0: 20 20 20 20 20 69 66 28 20 21 70 4e 43 2d 3e 61       if( !pNC->a
2de0: 6c 6c 6f 77 41 67 67 20 26 26 20 45 78 70 72 48  llowAgg && ExprH
2df0: 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 69 67  asProperty(pOrig
2e00: 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20  , EP_Agg) ){.   
2e10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2e20: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2e30: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 6c 69 61   "misuse of alia
2e40: 73 65 64 20 61 67 67 72 65 67 61 74 65 20 25 73  sed aggregate %s
2e50: 22 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20 20 20  ", zAs);.       
2e60: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
2e70: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 20  Abort;.         
2e80: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73   }.          res
2e90: 6f 6c 76 65 41 6c 69 61 73 28 70 50 61 72 73 65  olveAlias(pParse
2ea0: 2c 20 70 45 4c 69 73 74 2c 20 6a 2c 20 70 45 78  , pEList, j, pEx
2eb0: 70 72 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20  pr, "");.       
2ec0: 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20     cnt = 1;.    
2ed0: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 30        pMatch = 0
2ee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
2ef0: 72 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a  rt( zTab==0 && z
2f00: 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  Db==0 );.       
2f10: 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61     goto lookupna
2f20: 6d 65 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20  me_end;.        
2f30: 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d  }.      } .    }
2f40: 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  ..    /* Advance
2f50: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d   to the next nam
2f60: 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20  e context.  The 
2f70: 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77  loop will exit w
2f80: 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a  hen either.    *
2f90: 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61 74 63  * we have a matc
2fa0: 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65  h (cnt>0) or whe
2fb0: 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  n we run out of 
2fc0: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20  name contexts.. 
2fd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
2fe0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  t==0 ){.      pN
2ff0: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
3000: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
3010: 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20    ** If X and Y 
3020: 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68  are NULL (in oth
3030: 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79  er words if only
3040: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
3050: 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c   Z is.  ** suppl
3060: 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c  ied) and the val
3070: 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f  ue of Z is enclo
3080: 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75  sed in double-qu
3090: 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  otes, then.  ** 
30a0: 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69  Z is a string li
30b0: 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73  teral if it does
30c0: 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f  n't match any co
30d0: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20  lumn names.  In 
30e0: 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20  that.  ** case, 
30f0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72  we need to retur
3100: 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64  n right away and
3110: 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68   not make any ch
3120: 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45  anges to.  ** pE
3130: 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  xpr..  **.  ** B
3140: 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65  ecause no refere
3150: 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20  nce was made to 
3160: 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20  outer contexts, 
3170: 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20  the pNC->nRef.  
3180: 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f  ** fields are no
3190: 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79  t changed in any
31a0: 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20   context..  */. 
31b0: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a   if( cnt==0 && z
31c0: 54 61 62 3d 3d 30 20 26 26 20 45 78 70 72 48 61  Tab==0 && ExprHa
31d0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
31e0: 45 50 5f 44 62 6c 51 75 6f 74 65 64 29 20 29 7b  EP_DblQuoted) ){
31f0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
3200: 20 54 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20   TK_STRING;.    
3210: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b  pExpr->pTab = 0;
3220: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
3230: 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Prune;.  }..  /*
3240: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61  .  ** cnt==0 mea
3250: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  ns there was not
3260: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d   match.  cnt>1 m
3270: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20  eans there were 
3280: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65  two or.  ** more
3290: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65   matches.  Eithe
32a0: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61  r way, we have a
32b0: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
32c0: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20  if( cnt!=1 ){.  
32d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
32e0: 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63  rr;.    zErr = c
32f0: 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68  nt==0 ? "no such
3300: 20 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69   column" : "ambi
3310: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  guous column nam
3320: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  e";.    if( zDb 
3330: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3340: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3350: 20 22 25 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c   "%s: %s.%s.%s",
3360: 20 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62   zErr, zDb, zTab
3370: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c  , zCol);.    }el
3380: 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20  se if( zTab ){. 
3390: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
33a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
33b0: 3a 20 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20  : %s.%s", zErr, 
33c0: 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  zTab, zCol);.   
33d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
33e0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
33f0: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20  arse, "%s: %s", 
3400: 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  zErr, zCol);.   
3410: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
3420: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
3430: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72      pTopNC->nErr
3440: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
3450: 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61   a column from a
3460: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69   table in pSrcLi
3470: 73 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  st is referenced
3480: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20  , then record.  
3490: 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20  ** this fact in 
34a0: 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d  the pSrcList.a[]
34b0: 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b  .colUsed bitmask
34c0: 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73  .  Column 0 caus
34d0: 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f  es.  ** bit 0 to
34e0: 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e   be set.  Column
34f0: 20 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20   1 sets bit 1.  
3500: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
3510: 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d  f the.  ** colum
3520: 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  n number is grea
3530: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d  ter than the num
3540: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74  ber of bits in t
3550: 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
3560: 74 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67  then set the hig
3570: 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74  h-order bit of t
3580: 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f  he bitmask..  */
3590: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  .  if( pExpr->iC
35a0: 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74  olumn>=0 && pMat
35b0: 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ch!=0 ){.    int
35c0: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   n = pExpr->iCol
35d0: 75 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73  umn;.    testcas
35e0: 65 28 20 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( n==BMS-1 );. 
35f0: 20 20 20 69 66 28 20 6e 3e 3d 42 4d 53 20 29 7b     if( n>=BMS ){
3600: 0a 20 20 20 20 20 20 6e 20 3d 20 42 4d 53 2d 31  .      n = BMS-1
3610: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3620: 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72  rt( pMatch->iCur
3630: 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor==pExpr->iTab
3640: 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68  le );.    pMatch
3650: 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42  ->colUsed |= ((B
3660: 69 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20  itmask)1)<<n;.  
3670: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
3680: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
3690: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
36a0: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d 3e  lete(db, pExpr->
36b0: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
36c0: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
36d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
36e0: 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
36f0: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  t);.  pExpr->pRi
3700: 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72  ght = 0;.  pExpr
3710: 2d 3e 6f 70 20 3d 20 28 69 73 54 72 69 67 67 65  ->op = (isTrigge
3720: 72 20 3f 20 54 4b 5f 54 52 49 47 47 45 52 20 3a  r ? TK_TRIGGER :
3730: 20 54 4b 5f 43 4f 4c 55 4d 4e 29 3b 0a 6c 6f 6f   TK_COLUMN);.loo
3740: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 69  kupname_end:.  i
3750: 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  f( cnt==1 ){.   
3760: 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20   assert( pNC!=0 
3770: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  );.    sqlite3Au
3780: 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70  thRead(pParse, p
3790: 45 78 70 72 2c 20 70 53 63 68 65 6d 61 2c 20 70  Expr, pSchema, p
37a0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20  NC->pSrcList);. 
37b0: 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
37c0: 74 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f  the nRef value o
37d0: 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65  n all name conte
37e0: 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75  xts from TopNC u
37f0: 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  p to.    ** the 
3800: 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20  point where the 
3810: 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f  name matched. */
3820: 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
3830: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70      assert( pTop
3840: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  NC!=0 );.      p
3850: 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  TopNC->nRef++;. 
3860: 20 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d       if( pTopNC=
3870: 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20  =pNC ) break;.  
3880: 20 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f      pTopNC = pTo
3890: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
38a0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  }.    return WRC
38b0: 5f 50 72 75 6e 65 3b 0a 20 20 7d 20 65 6c 73 65  _Prune;.  } else
38c0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52   {.    return WR
38d0: 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 7d 0a 0a  C_Abort;.  }.}..
38e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61  /*.** Allocate a
38f0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
3900: 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ter to an expres
3910: 73 69 6f 6e 20 74 6f 20 6c 6f 61 64 20 74 68 65  sion to load the
3920: 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20   column iCol.** 
3930: 66 72 6f 6d 20 64 61 74 61 73 6f 75 72 63 65 20  from datasource 
3940: 69 53 72 63 20 69 6e 20 53 72 63 4c 69 73 74 20  iSrc in SrcList 
3950: 70 53 72 63 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  pSrc..*/.Expr *s
3960: 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75  qlite3CreateColu
3970: 6d 6e 45 78 70 72 28 73 71 6c 69 74 65 33 20 2a  mnExpr(sqlite3 *
3980: 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72  db, SrcList *pSr
3990: 63 2c 20 69 6e 74 20 69 53 72 63 2c 20 69 6e 74  c, int iSrc, int
39a0: 20 69 43 6f 6c 29 7b 0a 20 20 45 78 70 72 20 2a   iCol){.  Expr *
39b0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
39c0: 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 43 4f 4c 55  lloc(db, TK_COLU
39d0: 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  MN, 0, 0);.  if(
39e0: 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   p ){.    struct
39f0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3a00: 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b  Item = &pSrc->a[
3a10: 69 53 72 63 5d 3b 0a 20 20 20 20 70 2d 3e 70 54  iSrc];.    p->pT
3a20: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
3a30: 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20  ;.    p->iTable 
3a40: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
3a50: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61  ;.    if( p->pTa
3a60: 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29  b->iPKey==iCol )
3a70: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75  {.      p->iColu
3a80: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  mn = -1;.    }el
3a90: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f  se{.      p->iCo
3aa0: 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69 43  lumn = (ynVar)iC
3ab0: 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  ol;.      testca
3ac0: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b  se( iCol==BMS );
3ad0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
3ae0: 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a   iCol==BMS-1 );.
3af0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 63 6f 6c        pItem->col
3b00: 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73  Used |= ((Bitmas
3b10: 6b 29 31 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d 53  k)1)<<(iCol>=BMS
3b20: 20 3f 20 42 4d 53 2d 31 20 3a 20 69 43 6f 6c 29   ? BMS-1 : iCol)
3b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45 78 70 72  ;.    }.    Expr
3b40: 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45  SetProperty(p, E
3b50: 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 20 20 7d  P_Resolved);.  }
3b60: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3b70: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3b80: 6e 65 20 69 73 20 63 61 6c 6c 62 61 63 6b 20 66  ne is callback f
3b90: 6f 72 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  or sqlite3WalkEx
3ba0: 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f  pr()..**.** Reso
3bb0: 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  lve symbolic nam
3bc0: 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d  es into TK_COLUM
3bd0: 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  N operators for 
3be0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e  the current.** n
3bf0: 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65  ode in the expre
3c00: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
3c10: 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  urn 0 to continu
3c20: 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77  e the search dow
3c30: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72  n.** the tree or
3c40: 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20   2 to abort the 
3c50: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a  tree walk..**.**
3c60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
3c70: 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68  so does error ch
3c80: 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20  ecking and name 
3c90: 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a  resolution for.*
3ca0: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
3cb0: 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  .  The operator 
3cc0: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
3cd0: 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67  nctions is chang
3ce0: 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f  ed.** to TK_AGG_
3cf0: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61  FUNCTION..*/.sta
3d00: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 45  tic int resolveE
3d10: 78 70 72 53 74 65 70 28 57 61 6c 6b 65 72 20 2a  xprStep(Walker *
3d20: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
3d30: 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  Expr){.  NameCon
3d40: 74 65 78 74 20 2a 70 4e 43 3b 0a 20 20 50 61 72  text *pNC;.  Par
3d50: 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 70  se *pParse;..  p
3d60: 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
3d70: 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pNC;.  assert( p
3d80: 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  NC!=0 );.  pPars
3d90: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
3da0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
3db0: 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  e==pWalker->pPar
3dc0: 73 65 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70  se );..  if( Exp
3dd0: 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74 79 28  rHasAnyProperty(
3de0: 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76  pExpr, EP_Resolv
3df0: 65 64 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ed) ) return WRC
3e00: 5f 50 72 75 6e 65 3b 0a 20 20 45 78 70 72 53 65  _Prune;.  ExprSe
3e10: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
3e20: 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23   EP_Resolved);.#
3e30: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
3e40: 69 66 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  if( pNC->pSrcLis
3e50: 74 20 26 26 20 70 4e 43 2d 3e 70 53 72 63 4c 69  t && pNC->pSrcLi
3e60: 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a  st->nAlloc>0 ){.
3e70: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
3e80: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
3e90: 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  cList;.    int i
3ea0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
3eb0: 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e  <pNC->pSrcList->
3ec0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
3ed0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69    assert( pSrcLi
3ee0: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
3ef0: 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d  >=0 && pSrcList-
3f00: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50  >a[i].iCursor<pP
3f10: 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20  arse->nTab);.   
3f20: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
3f30: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
3f40: 70 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  p ){..#if define
3f50: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
3f60: 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49  UPDATE_DELETE_LI
3f70: 4d 49 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  MIT) && !defined
3f80: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
3f90: 51 55 45 52 59 29 0a 20 20 20 20 2f 2a 20 54 68  QUERY).    /* Th
3fa0: 65 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74  e special operat
3fb0: 6f 72 20 54 4b 5f 52 4f 57 20 6d 65 61 6e 73 20  or TK_ROW means 
3fc0: 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 66 6f  use the rowid fo
3fd0: 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  r the first.    
3fe0: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ** column in the
3ff0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
4000: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
4010: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 52 44  he LIMIT and ORD
4020: 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61  ER BY.    ** cla
4030: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  use processing o
4040: 6e 20 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c  n UPDATE and DEL
4050: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ETE statements..
4060: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
4070: 54 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  TK_ROW: {.      
4080: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
4090: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
40a0: 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
40b0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
40c0: 74 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tem;.      asser
40d0: 74 28 20 70 53 72 63 4c 69 73 74 20 26 26 20 70  t( pSrcList && p
40e0: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  SrcList->nSrc==1
40f0: 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 20   );.      pItem 
4100: 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 0a  = pSrcList->a; .
4110: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
4120: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
4130: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
4140: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
4150: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
4160: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
4170: 6f 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  or;.      pExpr-
4180: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
4190: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
41a0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
41b0: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
41c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
41d0: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
41e0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50  SQLITE_ENABLE_UP
41f0: 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49  DATE_DELETE_LIMI
4200: 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
4210: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4220: 45 52 59 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ERY) */..    /* 
4230: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
4240: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
4250: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
4260: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
4270: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
4280: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
4290: 73 65 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d  se, 0, 0, pExpr-
42a0: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 4e 43 2c 20  >u.zToken, pNC, 
42b0: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
42c0: 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  .    /* A table 
42d0: 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  name and column 
42e0: 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a  name:     ID.ID.
42f0: 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61      ** Or a data
4300: 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20  base, table and 
4310: 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49  column:  ID.ID.I
4320: 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  D.    */.    cas
4330: 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20  e TK_DOT: {.    
4340: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
4350: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  olumn;.      con
4360: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b  st char *zTable;
4370: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
4380: 72 20 2a 7a 44 62 3b 0a 20 20 20 20 20 20 45 78  r *zDb;.      Ex
4390: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
43a0: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
43b0: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
43c0: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
43d0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
43e0: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
43f0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
4400: 20 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a         zDb = 0;.
4410: 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d          zTable =
4420: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 75   pExpr->pLeft->u
4430: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
4440: 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68   zColumn = pRigh
4450: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
4460: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4470: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
4480: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a  ->op==TK_DOT );.
4490: 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 70 45          zDb = pE
44a0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54  xpr->pLeft->u.zT
44b0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a 54  oken;.        zT
44c0: 61 62 6c 65 20 3d 20 70 52 69 67 68 74 2d 3e 70  able = pRight->p
44d0: 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
44e0: 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20          zColumn 
44f0: 3d 20 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74  = pRight->pRight
4500: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
4510: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
4520: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
4530: 73 65 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c  se, zDb, zTable,
4540: 20 7a 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70   zColumn, pNC, p
4550: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Expr);.    }..  
4560: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e    /* Resolve fun
4570: 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20  ction names.    
4580: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  */.    case TK_C
4590: 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20 20 63  ONST_FUNC:.    c
45a0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
45b0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
45c0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
45d0: 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  ->x.pList;    /*
45e0: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
45f0: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
4600: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
4610: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 20  t->nExpr : 0;   
4620: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4630: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
4640: 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   int no_such_fun
4650: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  c = 0;       /* 
4660: 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20  True if no such 
4670: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20  function exists 
4680: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f  */.      int wro
4690: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b  ng_num_args = 0;
46a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
46b0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
46c0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
46d0: 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20     int is_agg = 
46e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
46f0: 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20  * True if is an 
4700: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
4710: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
4720: 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  auth;           
4730: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f          /* Autho
4740: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20  rization to use 
4750: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
4760: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
4790: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
47a0: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
47b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
47c0: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
47d0: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
47e0: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
47f0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
4800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4810: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
4820: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
4830: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
4840: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20  NC(pParse->db); 
4850: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
4860: 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20  e encoding */.. 
4870: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
4880: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4e  Expr->op==TK_CON
4890: 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20 20 20 20  ST_FUNC );.     
48a0: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
48b0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
48c0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
48d0: 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45  ;.      zId = pE
48e0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
48f0: 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74       nId = sqlit
4900: 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b  e3Strlen30(zId);
4910: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
4920: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
4930: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
4940: 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20  d, nId, n, enc, 
4950: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
4960: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
4970: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
4980: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
4990: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
49a0: 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  , -1, enc, 0);. 
49b0: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d         if( pDef=
49c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
49d0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31  no_such_func = 1
49e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
49f0: 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67  .          wrong
4a00: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20  _num_args = 1;. 
4a10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4a20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
4a30: 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75  _agg = pDef->xFu
4a40: 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 23  nc==0;.      }.#
4a50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4a60: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
4a70: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 20  .      if( pDef 
4a80: 29 7b 0a 20 20 20 20 20 20 20 20 61 75 74 68 20  ){.        auth 
4a90: 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  = sqlite3AuthChe
4aa0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
4ab0: 45 5f 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70  E_FUNCTION, 0, p
4ac0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Def->zName, 0);.
4ad0: 20 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68          if( auth
4ae0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4af0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 75 74           if( aut
4b00: 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  h==SQLITE_DENY )
4b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
4b20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4b30: 61 72 73 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f  arse, "not autho
4b40: 72 69 7a 65 64 20 74 6f 20 75 73 65 20 66 75 6e  rized to use fun
4b50: 63 74 69 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20  ction: %s",.    
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b80: 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pDef->zName);.  
4b90: 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e            pNC->n
4ba0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
4bb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 45 78   }.          pEx
4bc0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c  pr->op = TK_NULL
4bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
4be0: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
4bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4c00: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
4c10: 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d   is_agg && !pNC-
4c20: 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20  >allowAgg ){.   
4c30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4c40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
4c50: 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
4c60: 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  e function %.*s(
4c70: 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20  )", nId,zId);.  
4c80: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
4c90: 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  +;.        is_ag
4ca0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
4cb0: 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66  se if( no_such_f
4cc0: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
4cd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4ce0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
4cf0: 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c  function: %.*s",
4d00: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
4d10: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
4d20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
4d30: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
4d40: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
4d50: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4d60: 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  e,"wrong number 
4d70: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
4d80: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
4d90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  ,.             n
4da0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
4db0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
4dc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4dd0: 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20   is_agg ){.     
4de0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
4df0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a  K_AGG_FUNCTION;.
4e00: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73          pNC->has
4e10: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Agg = 1;.      }
4e20: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
4e30: 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67  g ) pNC->allowAg
4e40: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  g = 0;.      sql
4e50: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
4e60: 28 70 57 61 6c 6b 65 72 2c 20 70 4c 69 73 74 29  (pWalker, pList)
4e70: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  ;.      if( is_a
4e80: 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41  gg ) pNC->allowA
4e90: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  gg = 1;.      /*
4ea0: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74   FIX ME:  Comput
4eb0: 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  e pExpr->affinit
4ec0: 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65  y based on the e
4ed0: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a 20  xpected return. 
4ee0: 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66 20       ** type of 
4ef0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20  the function .  
4f00: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
4f10: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
4f20: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
4f30: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
4f40: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
4f50: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
4f60: 4b 5f 45 58 49 53 54 53 3a 20 20 74 65 73 74 63  K_EXISTS:  testc
4f70: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
4f80: 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23 65 6e  TK_EXISTS );.#en
4f90: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
4fa0: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  IN: {.      test
4fb0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
4fc0: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  =TK_IN );.      
4fd0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
4fe0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
4ff0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
5000: 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70      int nRef = p
5010: 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e 64 65  NC->nRef;.#ifnde
5020: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
5030: 45 43 4b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ECK.        if( 
5040: 70 4e 43 2d 3e 69 73 43 68 65 63 6b 20 29 7b 0a  pNC->isCheck ){.
5050: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
5060: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5070: 2c 22 73 75 62 71 75 65 72 69 65 73 20 70 72 6f  ,"subqueries pro
5080: 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b  hibited in CHECK
5090: 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a   constraints");.
50a0: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
50b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
50c0: 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b  WalkSelect(pWalk
50d0: 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65  er, pExpr->x.pSe
50e0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 61  lect);.        a
50f0: 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66  ssert( pNC->nRef
5100: 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20  >=nRef );.      
5110: 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d    if( nRef!=pNC-
5120: 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20  >nRef ){.       
5130: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
5140: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
5150: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20  Select);.       
5160: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5170: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
5180: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5190: 54 5f 43 48 45 43 4b 0a 20 20 20 20 63 61 73 65  T_CHECK.    case
51a0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
51b0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 69        if( pNC->i
51c0: 73 43 68 65 63 6b 20 29 7b 0a 20 20 20 20 20 20  sCheck ){.      
51d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
51e0: 67 28 70 50 61 72 73 65 2c 22 70 61 72 61 6d 65  g(pParse,"parame
51f0: 74 65 72 73 20 70 72 6f 68 69 62 69 74 65 64 20  ters prohibited 
5200: 69 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  in CHECK constra
5210: 69 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a  ints");.      }.
5220: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5230: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
5240: 72 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e  return (pParse->
5250: 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e  nErr || pParse->
5260: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
5270: 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20  ) ? WRC_Abort : 
5280: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
5290: 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73  ./*.** pEList is
52a0: 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65   a list of expre
52b0: 73 73 69 6f 6e 73 20 77 68 69 63 68 20 61 72 65  ssions which are
52c0: 20 72 65 61 6c 6c 79 20 74 68 65 20 72 65 73 75   really the resu
52d0: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a  lt set of the.**
52e0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
52f0: 65 6e 74 2e 20 20 70 45 20 69 73 20 61 20 74 65  ent.  pE is a te
5300: 72 6d 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42  rm in an ORDER B
5310: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
5320: 61 75 73 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  ause..** This ro
5330: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 6f 20  utine checks to 
5340: 73 65 65 20 69 66 20 70 45 20 69 73 20 61 20 73  see if pE is a s
5350: 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72  imple identifier
5360: 20 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e   which correspon
5370: 64 73 0a 2a 2a 20 74 6f 20 74 68 65 20 41 53 2d  ds.** to the AS-
5380: 6e 61 6d 65 20 6f 66 20 6f 6e 65 20 6f 66 20 74  name of one of t
5390: 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
53a0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
53b0: 20 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74    If it is,.** t
53c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
53d0: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65  rn an integer be
53e0: 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 77 68  tween 1 and N wh
53f0: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
5400: 62 65 72 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e  ber of.** elemen
5410: 74 73 20 69 6e 20 70 45 4c 69 73 74 2c 20 63 6f  ts in pEList, co
5420: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74  rresponding to t
5430: 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72  he matching entr
5440: 79 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 0a  y.  If there is.
5450: 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 6f 72 20  ** no match, or 
5460: 69 66 20 70 45 20 69 73 20 6e 6f 74 20 61 20 73  if pE is not a s
5470: 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72  imple identifier
5480: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
5490: 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  ine.** return 0.
54a0: 0a 2a 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 68 61  .**.** pEList ha
54b0: 73 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  s been resolved.
54c0: 20 20 70 45 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f    pE has not..*/
54d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
54e0: 6c 76 65 41 73 4e 61 6d 65 28 0a 20 20 50 61 72  lveAsName(.  Par
54f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5500: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
5510: 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
5520: 73 61 67 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  sages */.  ExprL
5530: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a  ist *pEList,  /*
5540: 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   List of express
5550: 69 6f 6e 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a  ions to scan */.
5560: 20 20 45 78 70 72 20 2a 70 45 20 20 20 20 20 20    Expr *pE      
5570: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
5580: 6f 6e 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  on we are trying
5590: 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a   to match */.){.
55a0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
55b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
55c0: 6e 74 65 72 20 2a 2f 0a 0a 20 20 55 4e 55 53 45  nter */..  UNUSE
55d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72  D_PARAMETER(pPar
55e0: 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 45 2d 3e  se);..  if( pE->
55f0: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
5600: 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 45   char *zCol = pE
5610: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
5620: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73  for(i=0; i<pELis
5630: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
5640: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20        char *zAs 
5650: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  = pEList->a[i].z
5660: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Name;.      if( 
5670: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
5680: 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43  3StrICmp(zAs, zC
5690: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
56a0: 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20    return i+1;.  
56b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
56c0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
56d0: 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70 6f 69  *.** pE is a poi
56e0: 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  nter to an expre
56f0: 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73 20 61  ssion which is a
5700: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20   single term in 
5710: 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  the.** ORDER BY 
5720: 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  of a compound SE
5730: 4c 45 43 54 2e 20 20 54 68 65 20 65 78 70 72 65  LECT.  The expre
5740: 73 73 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65  ssion has not be
5750: 65 6e 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c  en.** name resol
5760: 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68  ved..**.** At th
5770: 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
5780: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
5790: 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20  we already know 
57a0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45  that the.** ORDE
57b0: 52 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f 74  R BY term is not
57c0: 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64 65   an integer inde
57d0: 78 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75 6c  x into the resul
57e0: 74 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20  t set.  That.** 
57f0: 63 61 73 65 20 69 73 20 68 61 6e 64 6c 65 64 20  case is handled 
5800: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  by the calling r
5810: 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74  outine..**.** At
5820: 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68 20 70  tempt to match p
5830: 45 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74  E against result
5840: 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   set columns in 
5850: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
5860: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
5870: 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69  t.  Return the i
5880: 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d 61  ndex i of the ma
5890: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a  tching column,.*
58a0: 2a 20 61 73 20 61 6e 20 69 6e 64 69 63 61 74 69  * as an indicati
58b0: 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  on to the caller
58c0: 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
58d0: 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d 74 68  sort by the i-th
58e0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20   column..** The 
58f0: 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
5900: 20 69 73 20 31 2e 20 20 49 6e 20 6f 74 68 65 72   is 1.  In other
5910: 20 77 6f 72 64 73 2c 20 74 68 65 20 76 61 6c 75   words, the valu
5920: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
5930: 65 0a 2a 2a 20 73 61 6d 65 20 69 6e 74 65 67 65  e.** same intege
5940: 72 20 76 61 6c 75 65 20 74 68 61 74 20 77 6f 75  r value that wou
5950: 6c 64 20 62 65 20 75 73 65 64 20 69 6e 20 74 68  ld be used in th
5960: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
5970: 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
5980: 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  he column..**.**
5990: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
59a0: 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30 2e  match, return 0.
59b0: 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 61    Return -1 if a
59c0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
59d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
59e0: 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d  solveOrderByTerm
59f0: 54 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61  ToExprList(.  Pa
5a00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5a10: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
5a20: 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  ext for error me
5a30: 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65  ssages */.  Sele
5a40: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
5a50: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
5a60: 74 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20  tement with the 
5a70: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
5a80: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20 20  */.  Expr *pE   
5a90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
5aa0: 70 65 63 69 66 69 63 20 4f 52 44 45 52 20 42 59  pecific ORDER BY
5ab0: 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e   term */.){.  in
5ac0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
5ad0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
5ae0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5af0: 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65 20  pEList;  /* The 
5b00: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 72  columns of the r
5b10: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e  esult set */.  N
5b20: 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20  ameContext nc;  
5b30: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
5b40: 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20  t for resolving 
5b50: 70 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  pE */.  sqlite3 
5b60: 2a 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  *db;       /* Da
5b70: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
5b80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  n */.  int rc;  
5b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
5ba0: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
5bb0: 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20  bprocedures */. 
5bc0: 20 75 38 20 73 61 76 65 64 53 75 70 70 45 72 72   u8 savedSuppErr
5bd0: 3b 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c  ;   /* Saved val
5be0: 75 65 20 6f 66 20 64 62 2d 3e 73 75 70 70 72 65  ue of db->suppre
5bf0: 73 73 45 72 72 20 2a 2f 0a 0a 20 20 61 73 73 65  ssErr */..  asse
5c00: 72 74 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  rt( sqlite3ExprI
5c10: 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29  sInteger(pE, &i)
5c20: 3d 3d 30 20 29 3b 0a 20 20 70 45 4c 69 73 74 20  ==0 );.  pEList 
5c30: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
5c40: 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  t;..  /* Resolve
5c50: 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68   all names in th
5c60: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
5c70: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a  expression.  */.
5c80: 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c    memset(&nc, 0,
5c90: 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20   sizeof(nc));.  
5ca0: 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  nc.pParse = pPar
5cb0: 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73  se;.  nc.pSrcLis
5cc0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72  t = pSelect->pSr
5cd0: 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d  c;.  nc.pEList =
5ce0: 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 61 6c   pEList;.  nc.al
5cf0: 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20 6e 63  lowAgg = 1;.  nc
5d00: 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 64 62 20  .nErr = 0;.  db 
5d10: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
5d20: 73 61 76 65 64 53 75 70 70 45 72 72 20 3d 20 64  savedSuppErr = d
5d30: 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 3b 0a  b->suppressErr;.
5d40: 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72    db->suppressEr
5d50: 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  r = 1;.  rc = sq
5d60: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
5d70: 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 3b 0a  Names(&nc, pE);.
5d80: 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72    db->suppressEr
5d90: 72 20 3d 20 73 61 76 65 64 53 75 70 70 45 72 72  r = savedSuppErr
5da0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
5db0: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 79  urn 0;..  /* Try
5dc0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52   to match the OR
5dd0: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
5de0: 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70  n against an exp
5df0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 69 6e 20  ression.  ** in 
5e00: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20  the result set. 
5e10: 20 52 65 74 75 72 6e 20 61 6e 20 31 2d 62 61 73   Return an 1-bas
5e20: 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  ed index of the 
5e30: 6d 61 74 63 68 69 6e 67 0a 20 20 2a 2a 20 72 65  matching.  ** re
5e40: 73 75 6c 74 2d 73 65 74 20 65 6e 74 72 79 2e 0a  sult-set entry..
5e50: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
5e60: 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  i<pEList->nExpr;
5e70: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
5e80: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
5e90: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e(pEList->a[i].p
5ea0: 45 78 70 72 2c 20 70 45 29 3c 32 20 29 7b 0a 20  Expr, pE)<2 ){. 
5eb0: 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b       return i+1;
5ec0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5ed0: 20 49 66 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65   If no match, re
5ee0: 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74  turn 0. */.  ret
5ef0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5f00: 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 52 44 45  Generate an ORDE
5f10: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
5f20: 20 74 65 72 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e   term out-of-ran
5f30: 67 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  ge error..*/.sta
5f40: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
5f50: 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28  OutOfRangeError(
5f60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5f70: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
5f80: 20 65 72 72 6f 72 20 63 6f 6e 74 65 78 74 20 69   error context i
5f90: 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 77 72 69  nto which to wri
5fa0: 74 65 20 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a  te the error */.
5fb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
5fc0: 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 4f 52 44  ype,     /* "ORD
5fd0: 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20 2a  ER" or "GROUP" *
5fe0: 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
5ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6000: 65 20 69 6e 64 65 78 20 28 31 2d 62 61 73 65 64  e index (1-based
6010: 29 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6f 75  ) of the term ou
6020: 74 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20 20  t of range */.  
6030: 69 6e 74 20 6d 78 20 20 20 20 20 20 20 20 20 20  int mx          
6040: 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73         /* Larges
6050: 74 20 70 65 72 6d 69 73 73 69 62 6c 65 20 76 61  t permissible va
6060: 6c 75 65 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20  lue of i */.){. 
6070: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6080: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 22 25  (pParse, .    "%
6090: 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74  r %s BY term out
60a0: 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
60b0: 6c 64 20 62 65 20 22 0a 20 20 20 20 22 62 65 74  ld be ".    "bet
60c0: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
60d0: 69 2c 20 7a 54 79 70 65 2c 20 6d 78 29 3b 0a 7d  i, zType, mx);.}
60e0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
60f0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
6100: 75 73 65 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  use in a compoun
6110: 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
6120: 6e 74 2e 20 20 20 4d 6f 64 69 66 79 0a 2a 2a 20  nt.   Modify.** 
6130: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
6140: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
6150: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69   is a constant i
6160: 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31  nteger between 1
6170: 0a 2a 2a 20 61 6e 64 20 4e 20 77 68 65 72 65 20  .** and N where 
6180: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
6190: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
61a0: 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
61b0: 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  T..**.** ORDER B
61c0: 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  Y terms that are
61d0: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 74 65   already an inte
61e0: 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ger between 1 an
61f0: 64 20 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64  d N are.** unmod
6200: 69 66 69 65 64 2e 20 20 4f 52 44 45 52 20 42 59  ified.  ORDER BY
6210: 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
6220: 69 6e 74 65 67 65 72 73 20 6f 75 74 73 69 64 65  integers outside
6230: 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a   the range of.**
6240: 20 31 20 74 68 72 6f 75 67 68 20 4e 20 67 65 6e   1 through N gen
6250: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 2e 20  erate an error. 
6260: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
6270: 74 68 61 74 20 61 72 65 20 65 78 70 72 65 73 73  that are express
6280: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6d 61 74 63  ions.** are matc
6290: 68 65 64 20 61 67 61 69 6e 73 74 20 72 65 73 75  hed against resu
62a0: 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
62b0: 6e 73 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 53  ns of compound S
62c0: 45 4c 45 43 54 0a 2a 2a 20 62 65 67 69 6e 6e 69  ELECT.** beginni
62d0: 6e 67 20 77 69 74 68 20 74 68 65 20 6c 65 66 74  ng with the left
62e0: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 61 6e 64  -most SELECT and
62f0: 20 77 6f 72 6b 69 6e 67 20 74 6f 77 61 72 64 20   working toward 
6300: 74 68 65 20 72 69 67 68 74 2e 0a 2a 2a 20 41 74  the right..** At
6310: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
6320: 2c 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  , the ORDER BY e
6330: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 61  xpression is tra
6340: 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a  nsformed into.**
6350: 20 74 68 65 20 69 6e 74 65 67 65 72 20 63 6f 6c   the integer col
6360: 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  umn number..**.*
6370: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
6380: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
6390: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
63a0: 74 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e  t resolveCompoun
63b0: 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  dOrderBy(.  Pars
63c0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
63d0: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
63e0: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
63f0: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
6400: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
6410: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 54  elect       /* T
6420: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
6430: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
6440: 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 29  he ORDER BY */.)
6450: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  {.  int i;.  Exp
6460: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
6470: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
6480: 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
6490: 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f  db;.  int moreTo
64a0: 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65  Do = 1;..  pOrde
64b0: 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  rBy = pSelect->p
64c0: 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70  OrderBy;.  if( p
64d0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
64e0: 75 72 6e 20 30 3b 0a 20 20 64 62 20 3d 20 70 50  urn 0;.  db = pP
64f0: 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 20 53 51  arse->db;.#if SQ
6500: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
6510: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
6520: 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
6530: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
6540: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
6550: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6560: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
6570: 65 72 6d 73 20 69 6e 20 4f 52 44 45 52 20 42 59  erms in ORDER BY
6580: 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 72   clause");.    r
6590: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e  eturn 1;.  }.#en
65a0: 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  dif.  for(i=0; i
65b0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
65c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64  ; i++){.    pOrd
65d0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
65e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65  = 0;.  }.  pSele
65f0: 63 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ct->pNext = 0;. 
6600: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
6610: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
6620: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e  Select->pPrior->
6630: 70 4e 65 78 74 20 3d 20 70 53 65 6c 65 63 74 3b  pNext = pSelect;
6640: 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70  .    pSelect = p
6650: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
6660: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65    }.  while( pSe
6670: 6c 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f  lect && moreToDo
6680: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
6690: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
66a0: 74 65 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44  tem;.    moreToD
66b0: 6f 20 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73  o = 0;.    pELis
66c0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
66d0: 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
66e0: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
66f0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
6700: 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
6710: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
6720: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
6730: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
6740: 20 2d 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20   -1;.      Expr 
6750: 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20  *pE, *pDup;.    
6760: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e    if( pItem->don
6770: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
6780: 20 20 20 20 70 45 20 3d 20 70 49 74 65 6d 2d 3e      pE = pItem->
6790: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
67a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
67b0: 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29  teger(pE, &iCol)
67c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
67d0: 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e  iCol<=0 || iCol>
67e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
67f0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c  .          resol
6800: 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f  veOutOfRangeErro
6810: 72 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52  r(pParse, "ORDER
6820: 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e  ", i+1, pEList->
6830: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
6840: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6850: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6860: 65 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20  e{.        iCol 
6870: 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28  = resolveAsName(
6880: 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20  pParse, pEList, 
6890: 70 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pE);.        if(
68a0: 20 69 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   iCol==0 ){.    
68b0: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
68c0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
68d0: 70 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pE, 0);.        
68e0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
68f0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
6900: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 44         assert(pD
6910: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  up);.           
6920: 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 4f   iCol = resolveO
6930: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
6940: 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65  List(pParse, pSe
6950: 6c 65 63 74 2c 20 70 44 75 70 29 3b 0a 20 20 20  lect, pDup);.   
6960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6970: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
6980: 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a  lete(db, pDup);.
6990: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
69a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  }.      if( iCol
69b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  >0 ){.        Co
69c0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
69d0: 45 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  E->pColl;.      
69e0: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 45    int flags = pE
69f0: 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78 70  ->flags & EP_Exp
6a00: 43 6f 6c 6c 61 74 65 3b 0a 20 20 20 20 20 20 20  Collate;.       
6a10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6a20: 74 65 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20  te(db, pE);.    
6a30: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
6a40: 20 3d 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45   = pE = sqlite3E
6a50: 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47  xpr(db, TK_INTEG
6a60: 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ER, 0);.        
6a70: 69 66 28 20 70 45 3d 3d 30 20 29 20 72 65 74 75  if( pE==0 ) retu
6a80: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 45  rn 1;.        pE
6a90: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 3b  ->pColl = pColl;
6aa0: 0a 20 20 20 20 20 20 20 20 70 45 2d 3e 66 6c 61  .        pE->fla
6ab0: 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75  gs |= EP_IntValu
6ac0: 65 20 7c 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  e | flags;.     
6ad0: 20 20 20 70 45 2d 3e 75 2e 69 56 61 6c 75 65 20     pE->u.iValue 
6ae0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = iCol;.        
6af0: 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 28 75  pItem->iCol = (u
6b00: 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16)iCol;.       
6b10: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 31   pItem->done = 1
6b20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6b30: 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20         moreToDo 
6b40: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
6b50: 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d   }.    pSelect =
6b60: 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b   pSelect->pNext;
6b70: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
6b80: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
6b90: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
6ba0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
6bb0: 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  done==0 ){.     
6bc0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6bd0: 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52 44  (pParse, "%r ORD
6be0: 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20  ER BY term does 
6bf0: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22 0a  not match any ".
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c              "col
6c10: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
6c20: 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20  t set", i+1);.  
6c30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
6c40: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6c50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65   0;.}../*.** Che
6c60: 63 6b 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  ck every term in
6c70: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   the ORDER BY or
6c80: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
6c90: 20 70 4f 72 64 65 72 42 79 20 6f 66 0a 2a 2a 20   pOrderBy of.** 
6ca0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
6cb0: 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e 20 20 49  ment pSelect.  I
6cc0: 66 20 61 6e 79 20 74 65 72 6d 20 69 73 20 72 65  f any term is re
6cd0: 66 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20  ference to a.** 
6ce0: 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
6cf0: 73 73 69 6f 6e 20 28 61 73 20 64 65 74 65 72 6d  ssion (as determ
6d00: 69 6e 65 64 20 62 79 20 74 68 65 20 45 78 70 72  ined by the Expr
6d10: 4c 69 73 74 2e 61 2e 69 43 6f 6c 20 66 69 65 6c  List.a.iCol fiel
6d20: 64 29 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e 76 65  d).** then conve
6d30: 72 74 20 74 68 61 74 20 74 65 72 6d 20 69 6e 74  rt that term int
6d40: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
6d50: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 65  corresponding re
6d60: 73 75 6c 74 20 73 65 74 0a 2a 2a 20 63 6f 6c 75  sult set.** colu
6d70: 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  mn..**.** If any
6d80: 20 65 72 72 6f 72 73 20 61 72 65 20 64 65 74 65   errors are dete
6d90: 63 74 65 64 2c 20 61 64 64 20 61 6e 20 65 72 72  cted, add an err
6da0: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 50  or message to pP
6db0: 61 72 73 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75  arse and.** retu
6dc0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65  rn non-zero.  Re
6dd0: 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 6e 6f 20  turn zero if no 
6de0: 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2e  errors are seen.
6df0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52  .*/.int sqlite3R
6e00: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
6e10: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
6e20: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
6e30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
6e40: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
6e50: 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  sages here */.  
6e60: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
6e70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
6e80: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
6e90: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61  ntaining the cla
6ea0: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
6eb0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
6ec0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f  * The ORDER BY o
6ed0: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
6ee0: 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65  e to be processe
6ef0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
6f00: 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20  r *zType     /* 
6f10: 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
6f20: 50 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  P" */.){.  int i
6f30: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
6f40: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
6f50: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
6f60: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
6f70: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
6f80: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
6f90: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ==0 || pParse->d
6fa0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
6fb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20  ) return 0;.#if 
6fc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
6fd0: 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  N.  if( pOrderBy
6fe0: 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
6ff0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
7000: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
7010: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7020: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
7030: 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20   terms in %s BY 
7040: 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b  clause", zType);
7050: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
7060: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 45 4c 69   }.#endif.  pELi
7070: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
7080: 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20  List;.  assert( 
7090: 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a  pEList!=0 );  /*
70a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65   sqlite3SelectNe
70b0: 77 28 29 20 67 75 61 72 61 6e 74 65 65 73 20 74  w() guarantees t
70c0: 68 69 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  his */.  for(i=0
70d0: 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
70e0: 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  ->a; i<pOrderBy-
70f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
7100: 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  em++){.    if( p
7110: 49 74 65 6d 2d 3e 69 43 6f 6c 20 29 7b 0a 20 20  Item->iCol ){.  
7120: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69      if( pItem->i
7130: 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
7140: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  r ){.        res
7150: 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72  olveOutOfRangeEr
7160: 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54 79 70  ror(pParse, zTyp
7170: 65 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e  e, i+1, pEList->
7180: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
7190: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
71a0: 7d 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41  }.      resolveA
71b0: 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c  lias(pParse, pEL
71c0: 69 73 74 2c 20 70 49 74 65 6d 2d 3e 69 43 6f 6c  ist, pItem->iCol
71d0: 2d 31 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  -1, pItem->pExpr
71e0: 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 7d 0a  , zType);.    }.
71f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7200: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  }../*.** pOrderB
7210: 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  y is an ORDER BY
7220: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
7230: 75 73 65 20 69 6e 20 53 45 4c 45 43 54 20 73 74  use in SELECT st
7240: 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e  atement pSelect.
7250: 0a 2a 2a 20 54 68 65 20 4e 61 6d 65 20 63 6f 6e  .** The Name con
7260: 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45  text of the SELE
7270: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
7280: 70 4e 43 2e 20 20 7a 54 79 70 65 20 69 73 20 65  pNC.  zType is e
7290: 69 74 68 65 72 0a 2a 2a 20 22 4f 52 44 45 52 22  ither.** "ORDER"
72a0: 20 6f 72 20 22 47 52 4f 55 50 22 20 64 65 70 65   or "GROUP" depe
72b0: 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 74  nding on which t
72c0: 79 70 65 20 6f 66 20 63 6c 61 75 73 65 20 70 4f  ype of clause pO
72d0: 72 64 65 72 42 79 20 69 73 2e 0a 2a 2a 0a 2a 2a  rderBy is..**.**
72e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
72f0: 73 6f 6c 76 65 73 20 65 61 63 68 20 74 65 72 6d  solves each term
7300: 20 6f 66 20 74 68 65 20 63 6c 61 75 73 65 20 69   of the clause i
7310: 6e 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f  nto an expressio
7320: 6e 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 64  n..** If the ord
7330: 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61 6e  er-by term is an
7340: 20 69 6e 74 65 67 65 72 20 49 20 62 65 74 77 65   integer I betwe
7350: 65 6e 20 31 20 61 6e 64 20 4e 20 28 77 68 65 72  en 1 and N (wher
7360: 65 20 4e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  e N is the.** nu
7370: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
7380: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7390: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 29  t of the SELECT)
73a0: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
73b0: 73 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 72  sion.** in the r
73c0: 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 61 20 63  esolution is a c
73d0: 6f 70 79 20 6f 66 20 74 68 65 20 49 2d 74 68 20  opy of the I-th 
73e0: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
73f0: 73 73 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 74 68  ssion.  If.** th
7400: 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20  e order-by term 
7410: 69 73 20 61 6e 20 69 64 65 6e 74 69 66 79 20 74  is an identify t
7420: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
7430: 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f  to the AS-name o
7440: 66 0a 2a 2a 20 61 20 72 65 73 75 6c 74 2d 73 65  f.** a result-se
7450: 74 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  t expression, th
7460: 65 6e 20 74 68 65 20 74 65 72 6d 20 72 65 73 6f  en the term reso
7470: 6c 76 65 73 20 74 6f 20 61 20 63 6f 70 79 20 6f  lves to a copy o
7480: 66 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  f the.** result-
7490: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  set expression. 
74a0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
74b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
74c0: 73 6f 6c 76 65 64 20 69 6e 0a 2a 2a 20 74 68 65  solved in.** the
74d0: 20 75 73 75 61 6c 20 77 61 79 20 2d 20 75 73 69   usual way - usi
74e0: 6e 67 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ng sqlite3Resolv
74f0: 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2a  eExprNames()..**
7500: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7510: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
7520: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
7530: 49 66 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c  If errors occur,
7540: 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 61 70 70 72   then.** an appr
7550: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
7560: 73 73 61 67 65 20 6d 69 67 68 74 20 62 65 20 6c  ssage might be l
7570: 65 66 74 20 69 6e 20 70 50 61 72 73 65 2e 20 20  eft in pParse.  
7580: 28 4f 4f 4d 20 65 72 72 6f 72 73 0a 2a 2a 20 65  (OOM errors.** e
7590: 78 63 65 70 74 65 64 2e 29 0a 2a 2f 0a 73 74 61  xcepted.).*/.sta
75a0: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f  tic int resolveO
75b0: 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e  rderGroupBy(.  N
75c0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
75d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
75e0: 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   context of the 
75f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7600: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
7610: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
7620: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7630: 65 6e 74 20 68 6f 6c 64 69 6e 67 20 70 4f 72 64  ent holding pOrd
7640: 65 72 42 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  erBy */.  ExprLi
7650: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
7660: 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f  /* An ORDER BY o
7670: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
7680: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a  e to resolve */.
7690: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
76a0: 79 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65  ype     /* Eithe
76b0: 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  r "ORDER" or "GR
76c0: 4f 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72  OUP", as appropr
76d0: 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  iate */.){.  int
76e0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7700: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
7710: 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20   int iCol;      
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  /* Column number
7740: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70   */.  struct Exp
7750: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
7760: 6d 3b 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f  m;   /* A term o
7770: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
7780: 6c 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73 65  lause */.  Parse
7790: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
77a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
77b0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
77c0: 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 20 20    int nResult;  
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
77f0: 72 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  rms in the resul
7800: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20  t set */..  if( 
7810: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
7820: 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 73 75 6c  turn 0;.  nResul
7830: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
7840: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 50  ist->nExpr;.  pP
7850: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
7860: 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  se;.  for(i=0, p
7870: 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
7880: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
7890: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
78a0: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
78b0: 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
78c0: 0a 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f  .    iCol = reso
78d0: 6c 76 65 41 73 4e 61 6d 65 28 70 50 61 72 73 65  lveAsName(pParse
78e0: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  , pSelect->pELis
78f0: 74 2c 20 70 45 29 3b 0a 20 20 20 20 69 66 28 20  t, pE);.    if( 
7900: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
7910: 2f 2a 20 49 66 20 61 6e 20 41 53 2d 6e 61 6d 65  /* If an AS-name
7920: 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
7930: 20 6d 61 72 6b 20 74 68 69 73 20 4f 52 44 45 52   mark this ORDER
7940: 20 42 59 20 63 6f 6c 75 6d 6e 20 61 73 20 62 65   BY column as be
7950: 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 20 63  ing.      ** a c
7960: 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  opy of the iCol-
7970: 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  th result-set co
7980: 6c 75 6d 6e 2e 20 20 54 68 65 20 73 75 62 73 65  lumn.  The subse
7990: 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20  quent call to.  
79a0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65      ** sqlite3Re
79b0: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
79c0: 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74  y() will convert
79d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
79e0: 74 6f 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  to a.      ** co
79f0: 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  py of the iCol-t
7a00: 68 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  h result-set exp
7a10: 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ression. */.    
7a20: 20 20 70 49 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20    pItem->iCol = 
7a30: 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20  (u16)iCol;.     
7a40: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
7a50: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7a60: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
7a70: 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
7a80: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
7a90: 59 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74  Y term is an int
7aa0: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e 20 20  eger constant.  
7ab0: 41 67 61 69 6e 2c 20 73 65 74 20 74 68 65 20 63  Again, set the c
7ac0: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 6e  olumn.      ** n
7ad0: 75 6d 62 65 72 20 73 6f 20 74 68 61 74 20 73 71  umber so that sq
7ae0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
7af0: 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20  rGroupBy() will 
7b00: 63 6f 6e 76 65 72 74 20 74 68 65 0a 20 20 20 20  convert the.    
7b10: 20 20 2a 2a 20 6f 72 64 65 72 2d 62 79 20 74 65    ** order-by te
7b20: 72 6d 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20  rm to a copy of 
7b30: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65  the result-set e
7b40: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
7b50: 20 20 20 69 66 28 20 69 43 6f 6c 3c 31 20 29 7b     if( iCol<1 ){
7b60: 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65  .        resolve
7b70: 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28  OutOfRangeError(
7b80: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69  pParse, zType, i
7b90: 2b 31 2c 20 6e 52 65 73 75 6c 74 29 3b 0a 20 20  +1, nResult);.  
7ba0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7bb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
7bc0: 74 65 6d 2d 3e 69 43 6f 6c 20 3d 20 28 75 31 36  tem->iCol = (u16
7bd0: 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e  )iCol;.      con
7be0: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20  tinue;.    }..  
7bf0: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    /* Otherwise, 
7c00: 74 72 65 61 74 20 74 68 65 20 4f 52 44 45 52 20  treat the ORDER 
7c10: 42 59 20 74 65 72 6d 20 61 73 20 61 6e 20 6f 72  BY term as an or
7c20: 64 69 6e 61 72 79 20 65 78 70 72 65 73 73 69 6f  dinary expressio
7c30: 6e 20 2a 2f 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n */.    pItem->
7c40: 69 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  iCol = 0;.    if
7c50: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
7c60: 45 78 70 72 4e 61 6d 65 73 28 70 4e 43 2c 20 70  ExprNames(pNC, p
7c70: 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  E) ){.      retu
7c80: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
7c90: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
7ca0: 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
7cb0: 70 42 79 28 70 50 61 72 73 65 2c 20 70 53 65 6c  pBy(pParse, pSel
7cc0: 65 63 74 2c 20 70 4f 72 64 65 72 42 79 2c 20 7a  ect, pOrderBy, z
7cd0: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
7ce0: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
7cf0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
7d00: 65 6d 65 6e 74 20 70 20 61 6e 64 20 61 6c 6c 20  ement p and all 
7d10: 6f 66 20 69 74 73 20 64 65 73 63 65 6e 64 65 6e  of its descenden
7d20: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
7d30: 74 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  t resolveSelectS
7d40: 74 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  tep(Walker *pWal
7d50: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
7d60: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
7d70: 70 4f 75 74 65 72 4e 43 3b 20 20 2f 2a 20 43 6f  pOuterNC;  /* Co
7d80: 6e 74 65 78 74 20 74 68 61 74 20 63 6f 6e 74 61  ntext that conta
7d90: 69 6e 73 20 74 68 69 73 20 53 45 4c 45 43 54 20  ins this SELECT 
7da0: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
7db0: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20   sNC;        /* 
7dc0: 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20  Name context of 
7dd0: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
7de0: 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 3b   int isCompound;
7df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
7e00: 20 69 66 20 70 20 69 73 20 61 20 63 6f 6d 70 6f   if p is a compo
7e10: 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20  und select */.  
7e20: 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e 64 3b 20 20  int nCompound;  
7e30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7e40: 72 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 74 65  r of compound te
7e50: 72 6d 73 20 70 72 6f 63 65 73 73 65 64 20 73 6f  rms processed so
7e60: 20 66 61 72 20 2a 2f 0a 20 20 50 61 72 73 65 20   far */.  Parse 
7e70: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
7e80: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
7e90: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
7ea0: 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
7eb0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20    /* Result set 
7ec0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
7ed0: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7ef0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
7f00: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
7f10: 75 70 42 79 3b 20 20 20 20 20 2f 2a 20 54 68 65  upBy;     /* The
7f20: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
7f30: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 4c   */.  Select *pL
7f40: 65 66 74 6d 6f 73 74 3b 20 20 20 20 20 20 2f 2a  eftmost;      /*
7f50: 20 4c 65 66 74 2d 6d 6f 73 74 20 6f 66 20 53 45   Left-most of SE
7f60: 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75  LECT of a compou
7f70: 6e 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nd */.  sqlite3 
7f80: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
7f90: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7fa0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 0a 0a 20 20  ection */.  ..  
7fb0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
7fc0: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
7fd0: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
7fe0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
7ff0: 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
8000: 4f 75 74 65 72 4e 43 20 3d 20 70 57 61 6c 6b 65  OuterNC = pWalke
8010: 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 70 50 61 72  r->u.pNC;.  pPar
8020: 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
8030: 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
8040: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4e  rse->db;..  /* N
8050: 6f 72 6d 61 6c 6c 79 20 73 71 6c 69 74 65 33 53  ormally sqlite3S
8060: 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 69  electExpand() wi
8070: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  ll be called fir
8080: 73 74 20 61 6e 64 20 77 69 6c 6c 20 68 61 76 65  st and will have
8090: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78  .  ** already ex
80a0: 70 61 6e 64 65 64 20 74 68 69 73 20 53 45 4c 45  panded this SELE
80b0: 43 54 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66  CT.  However, if
80c0: 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
80d0: 65 72 79 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20  ery within.  ** 
80e0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 73  an expression, s
80f0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
8100: 72 4e 61 6d 65 73 28 29 20 77 69 6c 6c 20 62 65  rNames() will be
8110: 20 63 61 6c 6c 65 64 20 77 69 74 68 6f 75 74 20   called without 
8120: 61 0a 20 20 2a 2a 20 70 72 69 6f 72 20 63 61 6c  a.  ** prior cal
8130: 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 65 6c 65  l to sqlite3Sele
8140: 63 74 45 78 70 61 6e 64 28 29 2e 20 20 57 68 65  ctExpand().  Whe
8150: 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20  n that happens, 
8160: 6c 65 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  let.  ** sqlite3
8170: 53 65 6c 65 63 74 50 72 65 70 28 29 20 64 6f 20  SelectPrep() do 
8180: 61 6c 6c 20 6f 66 20 74 68 65 20 70 72 6f 63 65  all of the proce
8190: 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
81a0: 45 4c 45 43 54 2e 0a 20 20 2a 2a 20 73 71 6c 69  ELECT..  ** sqli
81b0: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 29 20  te3SelectPrep() 
81c0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 62 6f 74 68  will invoke both
81d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
81e0: 70 61 6e 64 28 29 20 61 6e 64 0a 20 20 2a 2a 20  pand() and.  ** 
81f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
8200: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
8210: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
8220: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
8230: 45 78 70 61 6e 64 65 64 29 3d 3d 30 20 29 7b 0a  Expanded)==0 ){.
8240: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
8250: 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
8260: 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20   pOuterNC);.    
8270: 72 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e  return (pParse->
8280: 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
8290: 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f  ocFailed) ? WRC_
82a0: 41 62 6f 72 74 20 3a 20 57 52 43 5f 50 72 75 6e  Abort : WRC_Prun
82b0: 65 3b 0a 20 20 7d 0a 0a 20 20 69 73 43 6f 6d 70  e;.  }..  isComp
82c0: 6f 75 6e 64 20 3d 20 70 2d 3e 70 50 72 69 6f 72  ound = p->pPrior
82d0: 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70 6f 75 6e 64  !=0;.  nCompound
82e0: 20 3d 20 30 3b 0a 20 20 70 4c 65 66 74 6d 6f 73   = 0;.  pLeftmos
82f0: 74 20 3d 20 70 3b 0a 20 20 77 68 69 6c 65 28 20  t = p;.  while( 
8300: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
8310: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
8320: 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
8330: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
8340: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
8350: 5f 52 65 73 6f 6c 76 65 64 29 3d 3d 30 20 29 3b  _Resolved)==0 );
8360: 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
8370: 20 7c 3d 20 53 46 5f 52 65 73 6f 6c 76 65 64 3b   |= SF_Resolved;
8380: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ..    /* Resolve
8390: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
83a0: 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   in the LIMIT an
83b0: 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
83c0: 2e 20 54 68 65 73 65 0a 20 20 20 20 2a 2a 20 61  . These.    ** a
83d0: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  re not allowed t
83e0: 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  o refer to any n
83f0: 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e  ames, so pass an
8400: 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65   empty NameConte
8410: 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  xt..    */.    m
8420: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
8430: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
8440: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
8450: 61 72 73 65 3b 0a 20 20 20 20 69 66 28 20 73 71  arse;.    if( sq
8460: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
8470: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
8480: 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20  Limit) ||.      
8490: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
84a0: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
84b0: 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20  p->pOffset) ){. 
84c0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
84d0: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a  Abort;.    }.  .
84e0: 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68      /* Set up th
84f0: 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e  e local name-con
8500: 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
8510: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
8520: 70 72 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 20  prNames() to.   
8530: 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20   ** resolve the 
8540: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
8550: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 20 20 20 20  ssion list..    
8560: 2a 2f 0a 20 20 20 20 73 4e 43 2e 61 6c 6c 6f 77  */.    sNC.allow
8570: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 73 4e 43  Agg = 1;.    sNC
8580: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
8590: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65  Src;.    sNC.pNe
85a0: 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20  xt = pOuterNC;. 
85b0: 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65   .    /* Resolve
85c0: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65   names in the re
85d0: 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20  sult set. */.   
85e0: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
85f0: 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
8600: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
8610: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
8620: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
8630: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
8640: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
8650: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
8660: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
8670: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
8680: 58 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  X) ){.        re
8690: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
86a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
86b0: 0a 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76  .    /* Recursiv
86c0: 65 6c 79 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65  ely resolve name
86d0: 73 20 69 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  s in all subquer
86e0: 69 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ies.    */.    f
86f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
8700: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
8710: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
8720: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
8730: 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
8740: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
8750: 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
8760: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
8770: 20 2a 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 20   *zSavedContext 
8780: 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  = pParse->zAuthC
8790: 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
87a0: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
87b0: 20 29 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   ) pParse->zAuth
87c0: 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d  Context = pItem-
87d0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
87e0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
87f0: 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
8800: 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
8810: 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20  , pOuterNC);.   
8820: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
8830: 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
8840: 65 64 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  edContext;.     
8850: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
8860: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
8870: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
8880: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
8890: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
88a0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
88b0: 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66 75   no aggregate fu
88c0: 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 72  nctions in the r
88d0: 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e  esult-set, and n
88e0: 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 20 20  o GROUP BY .    
88f0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 64  ** expression, d
8900: 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72  o not allow aggr
8910: 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f 66  egates in any of
8920: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
8930: 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  ssions..    */. 
8940: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
8950: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67 67  elFlags & SF_Agg
8960: 72 65 67 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20  regate)==0 );.  
8970: 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e    pGroupBy = p->
8980: 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69 66  pGroupBy;.    if
8990: 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 73 4e  ( pGroupBy || sN
89a0: 43 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20  C.hasAgg ){.    
89b0: 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d    p->selFlags |=
89c0: 20 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20   SF_Aggregate;. 
89d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
89e0: 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20 3d 20 30  sNC.allowAgg = 0
89f0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
8a00: 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
8a10: 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
8a20: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
8a30: 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
8a40: 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
8a50: 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
8a60: 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b   && !pGroupBy ){
8a70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8a80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8a90: 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
8aa0: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
8ab0: 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
8ac0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
8ad0: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a  Abort;.    }.  .
8ae0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65      /* Add the e
8af0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
8b00: 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65  o the name-conte
8b10: 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e  xt before parsin
8b20: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68  g the.    ** oth
8b30: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  er expressions i
8b40: 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  n the SELECT sta
8b50: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
8b60: 73 6f 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65  so that.    ** e
8b70: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
8b80: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28  e WHERE clause (
8b90: 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20  etc.) can refer 
8ba0: 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62  to expressions b
8bb0: 79 0a 20 20 20 20 2a 2a 20 61 6c 69 61 73 65 73  y.    ** aliases
8bc0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8bd0: 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  et..    **.    *
8be0: 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49  * Minor point: I
8bf0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
8c00: 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70  se, then the exp
8c10: 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a  ression will be.
8c20: 20 20 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61      ** re-evalua
8c30: 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66  ted for each ref
8c40: 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20  erence to it..  
8c50: 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 45 4c    */.    sNC.pEL
8c60: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
8c70: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8c80: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
8c90: 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65  (&sNC, p->pWhere
8ca0: 29 20 7c 7c 0a 20 20 20 20 20 20 20 73 71 6c 69  ) ||.       sqli
8cb0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
8cc0: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
8cd0: 76 69 6e 67 29 0a 20 20 20 20 29 7b 0a 20 20 20  ving).    ){.   
8ce0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
8cf0: 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ort;.    }..    
8d00: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
8d10: 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
8d20: 75 73 65 73 20 6d 61 79 20 6e 6f 74 20 72 65 66  uses may not ref
8d30: 65 72 20 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20  er to terms in. 
8d40: 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
8d50: 69 65 73 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ies .    */.    
8d60: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
8d70: 20 20 20 73 4e 43 2e 61 6c 6c 6f 77 41 67 67 20     sNC.allowAgg 
8d80: 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f  = 1;..    /* Pro
8d90: 63 65 73 73 20 74 68 65 20 4f 52 44 45 52 20 42  cess the ORDER B
8da0: 59 20 63 6c 61 75 73 65 20 66 6f 72 20 73 69 6e  Y clause for sin
8db0: 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54 20 73 74  gleton SELECT st
8dc0: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2a  atements..    **
8dd0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
8de0: 61 75 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e  ause for compoun
8df0: 64 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ds SELECT statem
8e00: 65 6e 74 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ents is handled.
8e10: 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61 66      ** below, af
8e20: 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ter all of the r
8e30: 65 73 75 6c 74 2d 73 65 74 73 20 66 6f 72 20 61  esult-sets for a
8e40: 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e  ll of the elemen
8e50: 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ts of.    ** the
8e60: 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62   compound have b
8e70: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20  een resolved..  
8e80: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73    */.    if( !is
8e90: 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f  Compound && reso
8ea0: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
8eb0: 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  &sNC, p, p->pOrd
8ec0: 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20 29  erBy, "ORDER") )
8ed0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
8ee0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
8ef0: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
8f00: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
8f10: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
8f20: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rt;.    }.  .   
8f30: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
8f40: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
8f50: 20 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69    At the same ti
8f60: 6d 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 0a 20  me, make sure . 
8f70: 20 20 20 2a 2a 20 74 68 65 20 47 52 4f 55 50 20     ** the GROUP 
8f80: 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
8f90: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65  ot contain aggre
8fa0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  gate functions..
8fb0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
8fc0: 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
8fd0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8fe0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
8ff0: 20 20 0a 20 20 20 20 20 20 69 66 28 20 72 65 73    .      if( res
9000: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
9010: 28 26 73 4e 43 2c 20 70 2c 20 70 47 72 6f 75 70  (&sNC, p, pGroup
9020: 42 79 2c 20 22 47 52 4f 55 50 22 29 20 7c 7c 20  By, "GROUP") || 
9030: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9040: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
9050: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
9060: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
9070: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  i=0, pItem=pGrou
9080: 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70  pBy->a; i<pGroup
9090: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
90a0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
90b0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
90c0: 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78  perty(pItem->pEx
90d0: 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20  pr, EP_Agg) ){. 
90e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
90f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9100: 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
9110: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
9120: 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
9130: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52           "the GR
9140: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b  OUP BY clause");
9150: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
9160: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
9170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9180: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
9190: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
91a0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6f 6d   term of the com
91b0: 70 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a 20 20 20  pound.    */.   
91c0: 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
91d0: 20 20 20 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b 3b      nCompound++;
91e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c  .  }..  /* Resol
91f0: 76 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ve the ORDER BY 
9200: 6f 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  on a compound SE
9210: 4c 45 43 54 20 61 66 74 65 72 20 61 6c 6c 20 74  LECT after all t
9220: 65 72 6d 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  erms of.  ** the
9230: 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62   compound have b
9240: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20  een resolved..  
9250: 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f  */.  if( isCompo
9260: 75 6e 64 20 26 26 20 72 65 73 6f 6c 76 65 43 6f  und && resolveCo
9270: 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50  mpoundOrderBy(pP
9280: 61 72 73 65 2c 20 70 4c 65 66 74 6d 6f 73 74 29  arse, pLeftmost)
9290: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
92a0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
92b0: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
92c0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
92d0: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
92e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
92f0: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
9300: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
9310: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 6e  table columns an
9320: 64 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  d result-set col
9330: 75 6d 6e 73 2e 20 20 41 74 20 74 68 65 20 73 61  umns.  At the sa
9340: 6d 65 20 74 69 6d 65 2c 20 64 6f 20 65 72 72 6f  me time, do erro
9350: 72 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 6f 6e  r.** checking on
9360: 20 66 75 6e 63 74 69 6f 6e 20 75 73 61 67 65 20   function usage 
9370: 61 6e 64 20 73 65 74 20 61 20 66 6c 61 67 20 69  and set a flag i
9380: 66 20 61 6e 79 20 61 67 67 72 65 67 61 74 65 20  f any aggregate 
9390: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  functions.** are
93a0: 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20   seen..**.** To 
93b0: 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 20 63 6f  resolve table co
93c0: 6c 75 6d 6e 73 20 72 65 66 65 72 65 6e 63 65 73  lumns references
93d0: 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f 64   we look for nod
93e0: 65 73 20 28 6f 72 20 73 75 62 74 72 65 65 73 29  es (or subtrees)
93f0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 72 6d   of the .** form
9400: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72   X.Y.Z or Y.Z or
9410: 20 6a 75 73 74 20 5a 20 77 68 65 72 65 0a 2a 2a   just Z where.**
9420: 0a 2a 2a 20 20 20 20 20 20 58 3a 20 20 20 54 68  .**      X:   Th
9430: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
9440: 62 61 73 65 2e 20 20 45 78 3a 20 20 22 6d 61 69  base.  Ex:  "mai
9450: 6e 22 20 6f 72 20 22 74 65 6d 70 22 20 6f 72 0a  n" or "temp" or.
9460: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 65  **           the
9470: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 61   symbolic name a
9480: 73 73 69 67 6e 65 64 20 74 6f 20 61 6e 20 41 54  ssigned to an AT
9490: 54 41 43 48 2d 65 64 20 64 61 74 61 62 61 73 65  TACH-ed database
94a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 3a 20  ..**.**      Y: 
94b0: 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20    The name of a 
94c0: 74 61 62 6c 65 20 69 6e 20 61 20 46 52 4f 4d 20  table in a FROM 
94d0: 63 6c 61 75 73 65 2e 20 20 4f 72 20 69 6e 20 61  clause.  Or in a
94e0: 20 74 72 69 67 67 65 72 0a 2a 2a 20 20 20 20 20   trigger.**     
94f0: 20 20 20 20 20 20 6f 6e 65 20 6f 66 20 74 68 65        one of the
9500: 20 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22   special names "
9510: 6f 6c 64 22 20 6f 72 20 22 6e 65 77 22 2e 0a 2a  old" or "new"..*
9520: 2a 0a 2a 2a 20 20 20 20 20 20 5a 3a 20 20 20 54  *.**      Z:   T
9530: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
9540: 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 59 2e 0a  umn in table Y..
9550: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 64 65 20 61  **.** The node a
9560: 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  t the root of th
9570: 65 20 73 75 62 74 72 65 65 20 69 73 20 6d 6f 64  e subtree is mod
9580: 69 66 69 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  ified as follows
9590: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 45 78 70 72 2e  :.**.**    Expr.
95a0: 6f 70 20 20 20 20 20 20 20 20 43 68 61 6e 67 65  op        Change
95b0: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a  d to TK_COLUMN.*
95c0: 2a 20 20 20 20 45 78 70 72 2e 70 54 61 62 20 20  *    Expr.pTab  
95d0: 20 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68      Points to th
95e0: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 66  e Table object f
95f0: 6f 72 20 58 2e 59 0a 2a 2a 20 20 20 20 45 78 70  or X.Y.**    Exp
9600: 72 2e 69 43 6f 6c 75 6d 6e 20 20 20 54 68 65 20  r.iColumn   The 
9610: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20  column index in 
9620: 58 2e 59 2e 20 20 2d 31 20 66 6f 72 20 74 68 65  X.Y.  -1 for the
9630: 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 45 78   rowid..**    Ex
9640: 70 72 2e 69 54 61 62 6c 65 20 20 20 20 54 68 65  pr.iTable    The
9650: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
9660: 62 65 72 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a 2a  ber for X.Y.**.*
9670: 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20  *.** To resolve 
9680: 72 65 73 75 6c 74 2d 73 65 74 20 72 65 66 65 72  result-set refer
9690: 65 6e 63 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72 20  ences, look for 
96a0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73  expression nodes
96b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
96c0: 5a 20 28 77 69 74 68 20 6e 6f 20 58 20 61 6e 64  Z (with no X and
96d0: 20 59 20 70 72 65 66 69 78 29 20 77 68 65 72 65   Y prefix) where
96e0: 20 74 68 65 20 5a 20 6d 61 74 63 68 65 73 20 74   the Z matches t
96f0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a  he right-hand.**
9700: 20 73 69 7a 65 20 6f 66 20 61 6e 20 41 53 20 63   size of an AS c
9710: 6c 61 75 73 65 20 69 6e 20 74 68 65 20 72 65 73  lause in the res
9720: 75 6c 74 2d 73 65 74 20 6f 66 20 61 20 53 45 4c  ult-set of a SEL
9730: 45 43 54 2e 20 20 54 68 65 20 5a 20 65 78 70 72  ECT.  The Z expr
9740: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 70  ession.** is rep
9750: 6c 61 63 65 64 20 62 79 20 61 20 63 6f 70 79 20  laced by a copy 
9760: 6f 66 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  of the left-hand
9770: 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 65 73   side of the res
9780: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
9790: 6f 6e 2e 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61 6d  on..** Table-nam
97a0: 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 72  e and function r
97b0: 65 73 6f 6c 75 74 69 6f 6e 20 6f 63 63 75 72 73  esolution occurs
97c0: 20 6f 6e 20 74 68 65 20 73 75 62 73 74 69 74 75   on the substitu
97d0: 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ted expression.*
97e0: 2a 20 74 72 65 65 2e 20 20 46 6f 72 20 65 78 61  * tree.  For exa
97f0: 6d 70 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  mple, in:.**.** 
9800: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
9810: 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46  AS x, c+d AS y F
9820: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
9830: 78 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 78 22  x;.**.** The "x"
9840: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 72 64   term of the ord
9850: 65 72 20 62 79 20 69 73 20 72 65 70 6c 61 63 65  er by is replace
9860: 64 20 62 79 20 22 61 2b 62 22 20 74 6f 20 72 65  d by "a+b" to re
9870: 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  nder:.**.**     
9880: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
9890: 2c 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20  , c+d AS y FROM 
98a0: 74 31 20 4f 52 44 45 52 20 42 59 20 61 2b 62 3b  t1 ORDER BY a+b;
98b0: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
98c0: 63 61 6c 6c 73 20 61 72 65 20 63 68 65 63 6b 65  calls are checke
98d0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
98e0: 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
98f0: 20 69 73 20 0a 2a 2a 20 64 65 66 69 6e 65 64 20   is .** defined 
9900: 61 6e 64 20 74 68 61 74 20 74 68 65 20 63 6f 72  and that the cor
9910: 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61  rect number of a
9920: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65  rguments are spe
9930: 63 69 66 69 65 64 2e 0a 2a 2a 20 49 66 20 74 68  cified..** If th
9940: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  e function is an
9950: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
9960: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 4e  ion, then the pN
9970: 43 2d 3e 68 61 73 41 67 67 20 69 73 0a 2a 2a 20  C->hasAgg is.** 
9980: 73 65 74 20 61 6e 64 20 74 68 65 20 6f 70 63 6f  set and the opco
9990: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 66 72  de is changed fr
99a0: 6f 6d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 74  om TK_FUNCTION t
99b0: 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  o TK_AGG_FUNCTIO
99c0: 4e 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 78 70 72  N..** If an expr
99d0: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
99e0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
99f0: 6f 6e 73 20 74 68 65 6e 20 74 68 65 20 45 50 5f  ons then the EP_
9a00: 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20  Agg.** property 
9a10: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
9a20: 6e 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  n is set..**.** 
9a30: 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  An error message
9a40: 20 69 73 20 6c 65 66 74 20 69 6e 20 70 50 61 72   is left in pPar
9a50: 73 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  se if anything i
9a60: 73 20 61 6d 69 73 73 2e 20 20 54 68 65 20 6e 75  s amiss.  The nu
9a70: 6d 62 65 72 0a 2a 2a 20 69 66 20 65 72 72 6f 72  mber.** if error
9a80: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
9a90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73  /.int sqlite3Res
9aa0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 20 0a  olveExprNames( .
9ab0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
9ac0: 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  NC,       /* Nam
9ad0: 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76  espace to resolv
9ae0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
9af0: 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  . */.  Expr *pEx
9b00: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
9b10: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
9b20: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e   to be analyzed.
9b30: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76   */.){.  int sav
9b40: 65 64 48 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b  edHasAgg;.  Walk
9b50: 65 72 20 77 3b 0a 0a 20 20 69 66 28 20 70 45 78  er w;..  if( pEx
9b60: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
9b70: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
9b80: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
9b90: 7b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 61  {.    Parse *pPa
9ba0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
9bb0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
9bc0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
9bd0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
9be0: 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50  >nHeight+pNC->pP
9bf0: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 20 29  arse->nHeight) )
9c00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
9c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
9c20: 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70  se->nHeight += p
9c30: 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20  Expr->nHeight;. 
9c40: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61 76 65   }.#endif.  save
9c50: 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 68  dHasAgg = pNC->h
9c60: 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 68 61  asAgg;.  pNC->ha
9c70: 73 41 67 67 20 3d 20 30 3b 0a 20 20 77 2e 78 45  sAgg = 0;.  w.xE
9c80: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65  xprCallback = re
9c90: 73 6f 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20  solveExprStep;. 
9ca0: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
9cb0: 63 6b 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65  ck = resolveSele
9cc0: 63 74 53 74 65 70 3b 0a 20 20 77 2e 70 50 61 72  ctStep;.  w.pPar
9cd0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
9ce0: 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
9cf0: 43 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b  C;.  sqlite3Walk
9d00: 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b  Expr(&w, pExpr);
9d10: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
9d20: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 70  EXPR_DEPTH>0.  p
9d30: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69  NC->pParse->nHei
9d40: 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48  ght -= pExpr->nH
9d50: 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20  eight;.#endif.  
9d60: 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20  if( pNC->nErr>0 
9d70: 7c 7c 20 77 2e 70 50 61 72 73 65 2d 3e 6e 45 72  || w.pParse->nEr
9d80: 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53  r>0 ){.    ExprS
9d90: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
9da0: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d  , EP_Error);.  }
9db0: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 68 61 73 41  .  if( pNC->hasA
9dc0: 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65  gg ){.    ExprSe
9dd0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
9de0: 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c 73   EP_Agg);.  }els
9df0: 65 20 69 66 28 20 73 61 76 65 64 48 61 73 41 67  e if( savedHasAg
9e00: 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 68 61  g ){.    pNC->ha
9e10: 73 41 67 67 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  sAgg = 1;.  }.  
9e20: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
9e30: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
9e40: 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  _Error);.}.../*.
9e50: 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  ** Resolve all n
9e60: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 65 78 70 72  ames in all expr
9e70: 65 73 73 69 6f 6e 73 20 6f 66 20 61 20 53 45 4c  essions of a SEL
9e80: 45 43 54 20 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a  ECT and in all.*
9e90: 2a 20 64 65 63 65 6e 64 65 6e 74 73 20 6f 66 20  * decendents of 
9ea0: 74 68 65 20 53 45 4c 45 43 54 2c 20 69 6e 63 6c  the SELECT, incl
9eb0: 75 64 69 6e 67 20 63 6f 6d 70 6f 75 6e 64 73 20  uding compounds 
9ec0: 6f 66 66 20 6f 66 20 70 2d 3e 70 50 72 69 6f 72  off of p->pPrior
9ed0: 2c 0a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  ,.** subqueries 
9ee0: 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  in expressions, 
9ef0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 75  and subqueries u
9f00: 73 65 64 20 61 73 20 46 52 4f 4d 20 63 6c 61 75  sed as FROM clau
9f10: 73 65 0a 2a 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a  se.** terms..**.
9f20: 2a 2a 20 53 65 65 20 73 71 6c 69 74 65 33 52 65  ** See sqlite3Re
9f30: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
9f40: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
9f50: 6f 6e 20 6f 66 20 74 68 65 20 6b 69 6e 64 73 20  on of the kinds 
9f60: 6f 66 0a 2a 2a 20 74 72 61 6e 73 66 6f 72 6d 61  of.** transforma
9f70: 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72  tions that occur
9f80: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45  ..**.** All SELE
9f90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68  CT statements sh
9fa0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 65  ould have been e
9fb0: 78 70 61 6e 64 65 64 20 75 73 69 6e 67 0a 2a 2a  xpanded using.**
9fc0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
9fd0: 70 61 6e 64 28 29 20 70 72 69 6f 72 20 74 6f 20  pand() prior to 
9fe0: 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
9ff0: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
a000: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
a010: 65 63 74 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  ectNames(.  Pars
a020: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a030: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
a040: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
a050: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
a060: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
a070: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
a080: 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
a090: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
a0a0: 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
a0b0: 6e 74 65 78 74 20 66 6f 72 20 70 61 72 65 6e 74  ntext for parent
a0c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a0d0: 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  t */.){.  Walker
a0e0: 20 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   w;..  assert( p
a0f0: 21 3d 30 20 29 3b 0a 20 20 77 2e 78 45 78 70 72  !=0 );.  w.xExpr
a100: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
a110: 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e  veExprStep;.  w.
a120: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
a130: 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  = resolveSelectS
a140: 74 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  tep;.  w.pParse 
a150: 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 75 2e  = pParse;.  w.u.
a160: 70 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a  pNC = pOuterNC;.
a170: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
a180: 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a        ect(&w, p);.}.