/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact cca3aa77b95706df5d635a2141a4d1de60ae6598:


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 57 61 6c 6b 20 74  h>../*.** Walk t
0260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
0270: 65 65 20 70 45 78 70 72 20 61 6e 64 20 69 6e 63  ee pExpr and inc
0280: 72 65 61 73 65 20 74 68 65 20 61 67 67 72 65 67  rease the aggreg
0290: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
02a0: 64 65 70 74 68 20 28 74 68 65 20 45 78 70 72 2e  depth (the Expr.
02b0: 6f 70 32 20 66 69 65 6c 64 29 20 62 79 20 4e 20  op2 field) by N 
02c0: 6f 6e 20 65 76 65 72 79 20 54 4b 5f 41 47 47 5f  on every TK_AGG_
02d0: 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 2e 0a 2a  FUNCTION node..*
02e0: 2a 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  * This needs to 
02f0: 6f 63 63 75 72 20 77 68 65 6e 20 63 6f 70 79 69  occur when copyi
0300: 6e 67 20 61 20 54 4b 5f 41 47 47 5f 46 55 4e 43  ng a TK_AGG_FUNC
0310: 54 49 4f 4e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  TION node from a
0320: 6e 0a 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79  n.** outer query
0330: 20 69 6e 74 6f 20 61 6e 20 69 6e 6e 65 72 20 73   into an inner s
0340: 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 69  ubquery..**.** i
0350: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0360: 70 74 68 28 70 45 78 70 72 2c 6e 29 20 69 73 20  pth(pExpr,n) is 
0370: 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65  the main routine
0380: 2e 20 20 69 6e 63 72 41 67 67 44 65 70 74 68 28  .  incrAggDepth(
0390: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 68 65 6c 70  ..).** is a help
03a0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 2d 20 61 20  er function - a 
03b0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
03c0: 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2f   tree walker..*/
03d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
03e0: 41 67 67 44 65 70 74 68 28 57 61 6c 6b 65 72 20  AggDepth(Walker 
03f0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
0400: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
0410: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
0420: 46 55 4e 43 54 49 4f 4e 20 29 20 70 45 78 70 72  FUNCTION ) pExpr
0430: 2d 3e 6f 70 32 20 2b 3d 20 70 57 61 6c 6b 65 72  ->op2 += pWalker
0440: 2d 3e 75 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20  ->u.n;.  return 
0450: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
0460: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72  static void incr
0470: 41 67 67 46 75 6e 63 74 69 6f 6e 44 65 70 74 68  AggFunctionDepth
0480: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
0490: 74 20 4e 29 7b 0a 20 20 69 66 28 20 4e 3e 30 20  t N){.  if( N>0 
04a0: 29 7b 0a 20 20 20 20 57 61 6c 6b 65 72 20 77 3b  ){.    Walker w;
04b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  .    memset(&w, 
04c0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
04d0: 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61     w.xExprCallba
04e0: 63 6b 20 3d 20 69 6e 63 72 41 67 67 44 65 70 74  ck = incrAggDept
04f0: 68 3b 0a 20 20 20 20 77 2e 75 2e 6e 20 3d 20 4e  h;.    w.u.n = N
0500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
0510: 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
0520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
0530: 75 72 6e 20 74 68 65 20 70 45 78 70 72 20 65 78  urn the pExpr ex
0540: 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 6e  pression into an
0550: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 69   alias for the i
0560: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
0570: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 73   the.** result s
0580: 65 74 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2a  et in pEList..**
0590: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72  .** If the refer
05a0: 65 6e 63 65 20 69 73 20 66 6f 6c 6c 6f 77 65 64  ence is followed
05b0: 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70   by a COLLATE op
05c0: 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 6d 61 6b  erator, then mak
05d0: 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20 43 4f  e sure.** the CO
05e0: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 20 69  LLATE operator i
05f0: 73 20 70 72 65 73 65 72 76 65 64 2e 20 20 46 6f  s preserved.  Fo
0600: 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
0610: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 2c       SELECT a+b,
0620: 20 63 2b 64 20 46 52 4f 4d 20 74 31 20 4f 52 44   c+d FROM t1 ORD
0630: 45 52 20 42 59 20 31 20 43 4f 4c 4c 41 54 45 20  ER BY 1 COLLATE 
0640: 6e 6f 63 61 73 65 3b 0a 2a 2a 0a 2a 2a 20 53 68  nocase;.**.** Sh
0650: 6f 75 6c 64 20 62 65 20 74 72 61 6e 73 66 6f 72  ould be transfor
0660: 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a 2a 20  med into:.**.** 
0670: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 2c 20      SELECT a+b, 
0680: 63 2b 64 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  c+d FROM t1 ORDE
0690: 52 20 42 59 20 28 61 2b 62 29 20 43 4f 4c 4c 41  R BY (a+b) COLLA
06a0: 54 45 20 6e 6f 63 61 73 65 3b 0a 2a 2a 0a 2a 2a  TE nocase;.**.**
06b0: 20 54 68 65 20 6e 53 75 62 71 75 65 72 79 20 70   The nSubquery p
06c0: 61 72 61 6d 65 74 65 72 20 73 70 65 63 69 66 69  arameter specifi
06d0: 65 73 20 68 6f 77 20 6d 61 6e 79 20 6c 65 76 65  es how many leve
06e0: 6c 73 20 6f 66 20 73 75 62 71 75 65 72 79 20 74  ls of subquery t
06f0: 68 65 0a 2a 2a 20 61 6c 69 61 73 20 69 73 20 72  he.** alias is r
0700: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
0710: 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73  original express
0720: 69 6f 6e 2e 20 20 54 68 65 20 75 73 75 61 6c 20  ion.  The usual 
0730: 76 61 6c 75 65 20 69 73 0a 2a 2a 20 7a 65 72 6f  value is.** zero
0740: 20 62 75 74 20 69 74 20 6d 69 67 68 74 20 62 65   but it might be
0750: 20 6d 6f 72 65 20 69 66 20 74 68 65 20 61 6c 69   more if the ali
0760: 61 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  as is contained 
0770: 77 69 74 68 69 6e 20 61 20 73 75 62 71 75 65 72  within a subquer
0780: 79 0a 2a 2a 20 6f 66 20 74 68 65 20 6f 72 69 67  y.** of the orig
0790: 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 2e  inal expression.
07a0: 20 20 54 68 65 20 45 78 70 72 2e 6f 70 32 20 66    The Expr.op2 f
07b0: 69 65 6c 64 20 6f 66 20 54 4b 5f 41 47 47 5f 46  ield of TK_AGG_F
07c0: 55 4e 43 54 49 4f 4e 0a 2a 2a 20 73 74 72 75 63  UNCTION.** struc
07d0: 74 75 72 65 73 20 6d 75 73 74 20 62 65 20 69 6e  tures must be in
07e0: 63 72 65 61 73 65 64 20 62 79 20 74 68 65 20 6e  creased by the n
07f0: 53 75 62 71 75 65 72 79 20 61 6d 6f 75 6e 74 2e  Subquery amount.
0800: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
0810: 72 65 73 6f 6c 76 65 41 6c 69 61 73 28 0a 20 20  resolveAlias(.  
0820: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
0830: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
0840: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
0850: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
0860: 20 20 20 20 20 20 2f 2a 20 41 20 72 65 73 75 6c        /* A resul
0870: 74 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69  t set */.  int i
0880: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
0890: 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 69 6e    /* A column in
08a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
08b0: 20 20 30 2e 2e 70 45 4c 69 73 74 2d 3e 6e 45 78    0..pEList->nEx
08c0: 70 72 2d 31 20 2a 2f 0a 20 20 45 78 70 72 20 2a  pr-1 */.  Expr *
08d0: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20  pExpr,          
08e0: 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 20 74 68   /* Transform th
08f0: 69 73 20 69 6e 74 6f 20 61 6e 20 61 6c 69 61 73  is into an alias
0900: 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 73   to the result s
0910: 65 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  et */.  const ch
0920: 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
0930: 2a 20 22 47 52 4f 55 50 22 20 6f 72 20 22 4f 52  * "GROUP" or "OR
0940: 44 45 52 22 20 6f 72 20 22 22 20 2a 2f 0a 20 20  DER" or "" */.  
0950: 69 6e 74 20 6e 53 75 62 71 75 65 72 79 20 20 20  int nSubquery   
0960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0970: 20 6f 66 20 73 75 62 71 75 65 72 69 65 73 20 74   of subqueries t
0980: 68 61 74 20 74 68 65 20 6c 61 62 65 6c 20 69 73  hat the label is
0990: 20 6d 6f 76 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20   moving */.){.  
09a0: 45 78 70 72 20 2a 70 4f 72 69 67 3b 20 20 20 20  Expr *pOrig;    
09b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 43         /* The iC
09c0: 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66 20  ol-th column of 
09d0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a  the result set *
09e0: 2f 0a 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20  /.  Expr *pDup; 
09f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
0a00: 70 79 20 6f 66 20 70 4f 72 69 67 20 2a 2f 0a 20  py of pOrig */. 
0a10: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
0a20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
0a30: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
0a40: 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
0a50: 20 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c   iCol>=0 && iCol
0a60: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <pEList->nExpr )
0a70: 3b 0a 20 20 70 4f 72 69 67 20 3d 20 70 45 4c 69  ;.  pOrig = pELi
0a80: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 70 45 78 70  st->a[iCol].pExp
0a90: 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  r;.  assert( pOr
0aa0: 69 67 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  ig!=0 );.  db = 
0ab0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 44  pParse->db;.  pD
0ac0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
0ad0: 44 75 70 28 64 62 2c 20 70 4f 72 69 67 2c 20 30  Dup(db, pOrig, 0
0ae0: 29 3b 0a 20 20 69 66 28 20 70 44 75 70 3d 3d 30  );.  if( pDup==0
0af0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0b00: 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47 27 20 29   zType[0]!='G' )
0b10: 20 69 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e   incrAggFunction
0b20: 44 65 70 74 68 28 70 44 75 70 2c 20 6e 53 75 62  Depth(pDup, nSub
0b30: 71 75 65 72 79 29 3b 0a 20 20 69 66 28 20 70 45  query);.  if( pE
0b40: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  xpr->op==TK_COLL
0b50: 41 54 45 20 29 7b 0a 20 20 20 20 70 44 75 70 20  ATE ){.    pDup 
0b60: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 64 64  = sqlite3ExprAdd
0b70: 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50  CollateString(pP
0b80: 61 72 73 65 2c 20 70 44 75 70 2c 20 70 45 78 70  arse, pDup, pExp
0b90: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
0ba0: 7d 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  }.  ExprSetPrope
0bb0: 72 74 79 28 70 44 75 70 2c 20 45 50 5f 41 6c 69  rty(pDup, EP_Ali
0bc0: 61 73 29 3b 0a 0a 20 20 2f 2a 20 42 65 66 6f 72  as);..  /* Befor
0bd0: 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  e calling sqlite
0be0: 33 45 78 70 72 44 65 6c 65 74 65 28 29 2c 20 73  3ExprDelete(), s
0bf0: 65 74 20 74 68 65 20 45 50 5f 53 74 61 74 69 63  et the EP_Static
0c00: 20 66 6c 61 67 2e 20 54 68 69 73 20 0a 20 20 2a   flag. This .  *
0c10: 2a 20 70 72 65 76 65 6e 74 73 20 45 78 70 72 44  * prevents ExprD
0c20: 65 6c 65 74 65 28 29 20 66 72 6f 6d 20 64 65 6c  elete() from del
0c30: 65 74 69 6e 67 20 74 68 65 20 45 78 70 72 20 73  eting the Expr s
0c40: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c  tructure itself,
0c50: 0a 20 20 2a 2a 20 61 6c 6c 6f 77 69 6e 67 20 69  .  ** allowing i
0c60: 74 20 74 6f 20 62 65 20 72 65 70 6f 70 75 6c 61  t to be repopula
0c70: 74 65 64 20 62 79 20 74 68 65 20 6d 65 6d 63 70  ted by the memcp
0c80: 79 28 29 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f  y() on the follo
0c90: 77 69 6e 67 20 6c 69 6e 65 2e 0a 20 20 2a 2a 20  wing line..  ** 
0ca0: 54 68 65 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  The pExpr->u.zTo
0cb0: 6b 65 6e 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ken might point 
0cc0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74  into memory that
0cd0: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62   will be freed b
0ce0: 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  y the.  ** sqlit
0cf0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 75  e3DbFree(db, pDu
0d00: 70 29 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 6c  p) on the last l
0d10: 69 6e 65 20 6f 66 20 74 68 69 73 20 62 6c 6f 63  ine of this bloc
0d20: 6b 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  k, so be sure to
0d30: 0a 20 20 2a 2a 20 6d 61 6b 65 20 61 20 63 6f 70  .  ** make a cop
0d40: 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 62  y of the token b
0d50: 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 65 20  efore doing the 
0d60: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
0d70: 0a 20 20 2a 2f 0a 20 20 45 78 70 72 53 65 74 50  .  */.  ExprSetP
0d80: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0d90: 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 73 71 6c  P_Static);.  sql
0da0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
0db0: 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 6d 65 6d  b, pExpr);.  mem
0dc0: 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c  cpy(pExpr, pDup,
0dd0: 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29   sizeof(*pExpr))
0de0: 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73  ;.  if( !ExprHas
0df0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0e00: 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20  EP_IntValue) && 
0e10: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21  pExpr->u.zToken!
0e20: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
0e30: 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20  ( (pExpr->flags 
0e40: 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50  & (EP_Reduced|EP
0e50: 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20  _TokenOnly))==0 
0e60: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 75 2e  );.    pExpr->u.
0e70: 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  zToken = sqlite3
0e80: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 78  DbStrDup(db, pEx
0e90: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
0ea0: 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20     pExpr->flags 
0eb0: 7c 3d 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 3b 0a  |= EP_MemToken;.
0ec0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
0ed0: 72 65 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 7d  ree(db, pDup);.}
0ee0: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
0ef0: 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65  TRUE if the name
0f00: 20 7a 43 6f 6c 20 6f 63 63 75 72 73 20 61 6e 79   zCol occurs any
0f10: 77 68 65 72 65 20 69 6e 20 74 68 65 20 55 53 49  where in the USI
0f20: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
0f30: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
0f40: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
0f50: 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  e is NULL or if 
0f60: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  it does not cont
0f70: 61 69 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a  ain.** zCol..*/.
0f80: 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 49  static int nameI
0f90: 6e 55 73 69 6e 67 43 6c 61 75 73 65 28 49 64 4c  nUsingClause(IdL
0fa0: 69 73 74 20 2a 70 55 73 69 6e 67 2c 20 63 6f 6e  ist *pUsing, con
0fb0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
0fc0: 20 20 69 66 28 20 70 55 73 69 6e 67 20 29 7b 0a    if( pUsing ){.
0fd0: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 66      int k;.    f
0fe0: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67  or(k=0; k<pUsing
0ff0: 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ->nId; k++){.   
1000: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1010: 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b  rICmp(pUsing->a[
1020: 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  k].zName, zCol)=
1030: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1040: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1050: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75  n 0;.}../*.** Su
1060: 62 71 75 65 72 69 65 73 20 73 74 6f 72 65 73 20  bqueries stores 
1070: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1080: 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64  abase, table and
1090: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
10a0: 72 20 74 68 65 69 72 0a 2a 2a 20 72 65 73 75 6c  r their.** resul
10b0: 74 20 73 65 74 73 20 69 6e 20 45 78 70 72 4c 69  t sets in ExprLi
10c0: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 2c 20 69 6e  st.a[].zSpan, in
10d0: 20 74 68 65 20 66 6f 72 6d 20 22 44 41 54 41 42   the form "DATAB
10e0: 41 53 45 2e 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e  ASE.TABLE.COLUMN
10f0: 22 2e 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  "..** Check to s
1100: 65 65 20 69 66 20 74 68 65 20 7a 53 70 61 6e 20  ee if the zSpan 
1110: 67 69 76 65 6e 20 74 6f 20 74 68 69 73 20 72 6f  given to this ro
1120: 75 74 69 6e 65 20 6d 61 74 63 68 65 73 20 74 68  utine matches th
1130: 65 20 7a 44 62 2c 20 7a 54 61 62 2c 0a 2a 2a 20  e zDb, zTab,.** 
1140: 61 6e 64 20 7a 43 6f 6c 2e 20 20 49 66 20 61 6e  and zCol.  If an
1150: 79 20 6f 66 20 7a 44 62 2c 20 7a 54 61 62 2c 20  y of zDb, zTab, 
1160: 61 6e 64 20 7a 43 6f 6c 20 61 72 65 20 4e 55 4c  and zCol are NUL
1170: 4c 20 74 68 65 6e 20 74 68 6f 73 65 20 66 69 65  L then those fie
1180: 6c 64 73 20 77 69 6c 6c 0a 2a 2a 20 6d 61 74 63  lds will.** matc
1190: 68 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2f 0a 69  h anything..*/.i
11a0: 6e 74 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  nt sqlite3MatchS
11b0: 70 61 6e 4e 61 6d 65 28 0a 20 20 63 6f 6e 73 74  panName(.  const
11c0: 20 63 68 61 72 20 2a 7a 53 70 61 6e 2c 0a 20 20   char *zSpan,.  
11d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
11e0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
11f0: 7a 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  zTab,.  const ch
1200: 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20 69 6e 74  ar *zDb.){.  int
1210: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41   n;.  for(n=0; A
1220: 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20  LWAYS(zSpan[n]) 
1230: 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27  && zSpan[n]!='.'
1240: 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a  ; n++){}.  if( z
1250: 44 62 20 26 26 20 28 73 71 6c 69 74 65 33 53 74  Db && (sqlite3St
1260: 72 4e 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 44  rNICmp(zSpan, zD
1270: 62 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 44 62 5b  b, n)!=0 || zDb[
1280: 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65  n]!=0) ){.    re
1290: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53  turn 0;.  }.  zS
12a0: 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 66 6f  pan += n+1;.  fo
12b0: 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53  r(n=0; ALWAYS(zS
12c0: 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e  pan[n]) && zSpan
12d0: 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d  [n]!='.'; n++){}
12e0: 0a 20 20 69 66 28 20 7a 54 61 62 20 26 26 20 28  .  if( zTab && (
12f0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
1300: 7a 53 70 61 6e 2c 20 7a 54 61 62 2c 20 6e 29 21  zSpan, zTab, n)!
1310: 3d 30 20 7c 7c 20 7a 54 61 62 5b 6e 5d 21 3d 30  =0 || zTab[n]!=0
1320: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1330: 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b  0;.  }.  zSpan +
1340: 3d 20 6e 2b 31 3b 0a 20 20 69 66 28 20 7a 43 6f  = n+1;.  if( zCo
1350: 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  l && sqlite3StrI
1360: 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 43 6f 6c 29  Cmp(zSpan, zCol)
1370: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
1380: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
1390: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 1;.}../*.** Gi
13a0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
13b0: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
13c0: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
13d0: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
13e0: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
13f0: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
1400: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
1410: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
1420: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
1430: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
1440: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
1450: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
1460: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
1470: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
1480: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
1490: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
14a0: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
14b0: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
14c0: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
14d0: 64 61 74 61 62 61 73 65 20 58 0a 2a 2a 20 20 20  database X.**   
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 20 20 20 20 28 65 76 65 6e 20 69 66 20 58        (even if X
1500: 20 69 73 20 69 6d 70 6c 69 65 64 29 2e 0a 2a 2a   is implied)..**
1510: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
1520: 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  e        Set to 
1530: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
1540: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
1550: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20  obtained.**     
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73      from pSrcLis
1580: 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  t..**    pExpr->
1590: 70 54 61 62 20 20 20 20 20 20 20 20 20 20 50 6f  pTab          Po
15a0: 69 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c  ints to the Tabl
15b0: 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 58  e structure of X
15c0: 2e 59 20 28 65 76 65 6e 20 69 66 0a 2a 2a 20 20  .Y (even if.**  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 20 20 58 20 61 6e 64 2f 6f 72 20         X and/or 
15f0: 59 20 61 72 65 20 69 6d 70 6c 69 65 64 2e 29 0a  Y are implied.).
1600: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  **    pExpr->iCo
1610: 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74  lumn       Set t
1620: 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  o the column num
1630: 62 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74  ber within the t
1640: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70  able..**    pExp
1650: 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
1660: 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d   Set to TK_COLUM
1670: 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  N..**    pExpr->
1680: 70 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e  pLeft         An
1690: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
16a0: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
16b0: 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78  eleted.**    pEx
16c0: 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20  pr->pRight      
16d0: 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
16e0: 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20   this points to 
16f0: 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
1700: 2a 20 54 68 65 20 7a 44 62 20 76 61 72 69 61 62  * The zDb variab
1710: 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  le is the name o
1720: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  f the database (
1730: 74 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20  the "X").  This 
1740: 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20  value may be.** 
1750: 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61  NULL meaning tha
1760: 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65  t name is of the
1770: 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20   form Y.Z or Z. 
1780: 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64   Any available d
1790: 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62  atabase.** can b
17a0: 65 20 75 73 65 64 2e 20 20 54 68 65 20 7a 54 61  e used.  The zTa
17b0: 62 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73 20  ble variable is 
17c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
17d0: 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e  table (the "Y").
17e0: 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20    This.** value 
17f0: 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 7a  can be NULL if z
1800: 44 62 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  Db is also NULL.
1810: 20 20 49 66 20 7a 54 61 62 6c 65 20 69 73 20 4e    If zTable is N
1820: 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20  ULL it.** means 
1830: 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66  that the form of
1840: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61   the name is Z a
1850: 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20  nd that columns 
1860: 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a  from any table.*
1870: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a  * can be used..*
1880: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65  *.** If the name
1890: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c   cannot be resol
18a0: 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c  ved unambiguousl
18b0: 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  y, leave an erro
18c0: 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20  r message.** in 
18d0: 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
18e0: 6e 20 57 52 43 5f 41 62 6f 72 74 2e 20 20 52 65  n WRC_Abort.  Re
18f0: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 20 6f  turn WRC_Prune o
1900: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
1910: 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e  atic int lookupN
1920: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
1930: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  arse,       /* T
1940: 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
1950: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
1960: 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 2f 2a 20  ar *zDb,     /* 
1970: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
1980: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1990: 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  table, or NULL *
19a0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
19b0: 7a 54 61 62 2c 20 20 20 20 2f 2a 20 4e 61 6d 65  zTab,    /* Name
19c0: 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69   of table contai
19d0: 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20  ning column, or 
19e0: 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
19f0: 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f  char *zCol,    /
1a00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f  * Name of the co
1a10: 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  lumn. */.  NameC
1a20: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
1a30: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74  /* The name cont
1a40: 65 78 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f  ext used to reso
1a50: 6c 76 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a  lve the name */.
1a60: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
1a70: 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74         /* Make t
1a80: 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f  his EXPR node po
1a90: 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63  int to the selec
1aa0: 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b  ted column */.){
1ab0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1ae0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
1af0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b10: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
1b20: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ng column names 
1b30: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20  */.  int cntTab 
1b40: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1b50: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b60: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62   of matching tab
1b70: 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  le names */.  in
1b80: 74 20 6e 53 75 62 71 75 65 72 79 20 3d 20 30 3b  t nSubquery = 0;
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 6c 65 76 65  /* How many leve
1bb0: 6c 73 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a  ls of subquery *
1bc0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1bd0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
1be0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1c00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1c10: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1c20: 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66  ;       /* Use f
1c30: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1c40: 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a  pSrcList items *
1c50: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1c60: 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20  st_item *pMatch 
1c70: 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74  = 0;  /* The mat
1c80: 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69  ching pSrcList i
1c90: 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  tem */.  NameCon
1ca0: 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70  text *pTopNC = p
1cb0: 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  NC;        /* Fi
1cc0: 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20  rst namecontext 
1cd0: 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20  in the list */. 
1ce0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1cf0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d00: 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20     /* Schema of 
1d10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  the expression *
1d20: 2f 0a 20 20 69 6e 74 20 69 73 54 72 69 67 67 65  /.  int isTrigge
1d30: 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1d40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1d50: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 74   resolved to a t
1d60: 72 69 67 67 65 72 20 63 6f 6c 75 6d 6e 20 2a 2f  rigger column */
1d70: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
1d80: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d90: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 6f       /* Table ho
1da0: 6c 64 20 74 68 65 20 72 6f 77 20 2a 2f 0a 20 20  ld the row */.  
1db0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 20 20 20  Column *pCol;   
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6f 66    /* A column of
1de0: 20 70 54 61 62 20 2a 2f 0a 0a 20 20 61 73 73 65   pTab */..  asse
1df0: 72 74 28 20 70 4e 43 20 29 3b 20 20 20 20 20 2f  rt( pNC );     /
1e00: 2a 20 74 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * the name conte
1e10: 78 74 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  xt cannot be NUL
1e20: 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  L. */.  assert( 
1e30: 7a 43 6f 6c 20 29 3b 20 20 20 20 2f 2a 20 54 68  zCol );    /* Th
1e40: 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e  e Z in X.Y.Z can
1e50: 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  not be NULL */. 
1e60: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
1e70: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1e80: 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
1e90: 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 0a 20 20  _Reduced) );..  
1ea0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1eb0: 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d 6d 61 74  e node to no-mat
1ec0: 63 68 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69  ch */.  pExpr->i
1ed0: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 70 45  Table = -1;.  pE
1ee0: 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20  xpr->pTab = 0;. 
1ef0: 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
1f00: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
1f10: 52 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a 20 54  Reduce);..  /* T
1f20: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 73 63 68  ranslate the sch
1f30: 65 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44 62 20  ema name in zDb 
1f40: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
1f50: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
1f60: 69 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d 61 2e  ing.  ** schema.
1f70: 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20    If not found, 
1f80: 70 53 63 68 65 6d 61 20 77 69 6c 6c 20 72 65 6d  pSchema will rem
1f90: 61 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e 6f 74  ain NULL and not
1fa0: 68 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63 68 0a  hing will match.
1fb0: 20 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 69    ** resulting i
1fc0: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
1fd0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
1fe0: 6f 77 61 72 64 20 74 68 65 20 65 6e 64 20 6f 66  oward the end of
1ff0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
2000: 2a 2f 0a 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  */.  if( zDb ){.
2010: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
2020: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2030: 50 61 72 74 49 64 78 20 29 3b 0a 20 20 20 20 74  PartIdx );.    t
2040: 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63  estcase( pNC->nc
2050: 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68 65  Flags & NC_IsChe
2060: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ck );.    if( (p
2070: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28 4e  NC->ncFlags & (N
2080: 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 73 43  C_PartIdx|NC_IsC
2090: 68 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20 20 20  heck))!=0 ){.   
20a0: 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 69     /* Silently i
20b0: 67 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20 71  gnore database q
20c0: 75 61 6c 69 66 69 65 72 73 20 69 6e 73 69 64 65  ualifiers inside
20d0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
20e0: 74 73 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ts and.      ** 
20f0: 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 2e  partial indices.
2100: 20 20 44 6f 20 6e 6f 74 20 72 61 69 73 65 20 65    Do not raise e
2110: 72 72 6f 72 73 20 62 65 63 61 75 73 65 20 74 68  rrors because th
2120: 61 74 20 6d 69 67 68 74 20 62 72 65 61 6b 0a 20  at might break. 
2130: 20 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 61       ** legacy a
2140: 6e 64 20 62 65 63 61 75 73 65 20 69 74 20 64 6f  nd because it do
2150: 65 73 20 6e 6f 74 20 68 75 72 74 20 61 6e 79 74  es not hurt anyt
2160: 68 69 6e 67 20 74 6f 20 6a 75 73 74 20 69 67 6e  hing to just ign
2170: 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ore the.      **
2180: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
2190: 2a 2f 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 30  */.      zDb = 0
21a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
21c0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
21d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
21e0: 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20 29 3b  >aDb[i].zName );
21f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2200: 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e  ite3StrICmp(db->
2210: 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 44 62  aDb[i].zName,zDb
2220: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2230: 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e    pSchema = db->
2240: 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a  aDb[i].pSchema;.
2250: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2260: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2270: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2280: 2f 2a 20 53 74 61 72 74 20 61 74 20 74 68 65 20  /* Start at the 
2290: 69 6e 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e 74 65  inner-most conte
22a0: 78 74 20 61 6e 64 20 6d 6f 76 65 20 6f 75 74 77  xt and move outw
22b0: 61 72 64 20 75 6e 74 69 6c 20 61 20 6d 61 74 63  ard until a matc
22c0: 68 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20  h is found */.  
22d0: 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e  while( pNC && cn
22e0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72  t==0 ){.    Expr
22f0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
2300: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
2310: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
2320: 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ist;..    if( pS
2330: 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  rcList ){.      
2340: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
2350: 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53  SrcList->a; i<pS
2360: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
2370: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
2380: 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 74 65       pTab = pIte
2390: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20  m->pTab;.       
23a0: 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
23b0: 20 26 26 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 21   && pTab->zName!
23c0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
23d0: 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c  sert( pTab->nCol
23e0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  >0 );.        if
23f0: 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
2400: 20 26 26 20 28 70 49 74 65 6d 2d 3e 70 53 65 6c   && (pItem->pSel
2410: 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ect->selFlags & 
2420: 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d  SF_NestedFrom)!=
2430: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
2440: 6e 74 20 68 69 74 20 3d 20 30 3b 0a 20 20 20 20  nt hit = 0;.    
2450: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
2460: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Item->pSelect->p
2470: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  EList;.         
2480: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69   for(j=0; j<pELi
2490: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
24a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24b0: 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
24c0: 6e 4e 61 6d 65 28 70 45 4c 69 73 74 2d 3e 61 5b  nName(pEList->a[
24d0: 6a 5d 2e 7a 53 70 61 6e 2c 20 7a 43 6f 6c 2c 20  j].zSpan, zCol, 
24e0: 7a 54 61 62 2c 20 7a 44 62 29 20 29 7b 0a 20 20  zTab, zDb) ){.  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b              cnt+
2500: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
2510: 20 63 6e 74 54 61 62 20 3d 20 32 3b 0a 20 20 20   cntTab = 2;.   
2520: 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63             pMatc
2530: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
2540: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2550: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  iColumn = j;.   
2560: 20 20 20 20 20 20 20 20 20 20 20 68 69 74 20 3d             hit =
2570: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
2580: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2590: 20 20 20 20 20 20 20 20 69 66 28 20 68 69 74 20          if( hit 
25a0: 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 63 6f 6e  || zTab==0 ) con
25b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
25c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62  .        if( zDb
25d0: 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
25e0: 61 21 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  a!=pSchema ){.  
25f0: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2600: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2610: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
2620: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2630: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
2640: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f   pItem->zAlias ?
2650: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a   pItem->zAlias :
2660: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20   pTab->zName;.  
2670: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2680: 7a 54 61 62 4e 61 6d 65 21 3d 30 20 29 3b 0a 20  zTabName!=0 );. 
2690: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
26a0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62  ite3StrICmp(zTab
26b0: 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29  Name, zTab)!=0 )
26c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
26d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
26e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
26f0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e        if( 0==(cn
2700: 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20  tTab++) ){.     
2710: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
2720: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tem;.        }. 
2730: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20         for(j=0, 
2740: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
2750: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
2760: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
2770: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2780: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
2790: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
27a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
27b0: 2a 20 49 66 20 74 68 65 72 65 20 68 61 73 20 62  * If there has b
27c0: 65 65 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  een exactly one 
27d0: 70 72 69 6f 72 20 6d 61 74 63 68 20 61 6e 64 20  prior match and 
27e0: 74 68 69 73 20 6d 61 74 63 68 0a 20 20 20 20 20  this match.     
27f0: 20 20 20 20 20 20 20 2a 2a 20 69 73 20 66 6f 72         ** is for
2800: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
2810: 74 61 62 6c 65 20 6f 66 20 61 20 4e 41 54 55 52  table of a NATUR
2820: 41 4c 20 4a 4f 49 4e 20 6f 72 20 69 73 20 69 6e  AL JOIN or is in
2830: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   a .            
2840: 2a 2a 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c  ** USING clause,
2850: 20 74 68 65 6e 20 73 6b 69 70 20 74 68 69 73 20   then skip this 
2860: 6d 61 74 63 68 2e 0a 20 20 20 20 20 20 20 20 20  match..         
2870: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
2880: 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a    if( cnt==1 ){.
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
28a0: 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e  ( pItem->fg.join
28b0: 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41  type & JT_NATURA
28c0: 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28e0: 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75 73  nameInUsingClaus
28f0: 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 2c  e(pItem->pUsing,
2900: 20 7a 43 6f 6c 29 20 29 20 63 6f 6e 74 69 6e 75   zCol) ) continu
2910: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74  .            cnt
2930: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2940: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
2950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2960: 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72 6f  ubstitute the ro
2970: 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20  wid (column -1) 
2980: 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20  for the INTEGER 
2990: 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20  PRIMARY KEY */. 
29a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
29b0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70  ->iColumn = j==p
29c0: 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20  Tab->iPKey ? -1 
29d0: 3a 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 20 20  : (i16)j;.      
29e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2a10: 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20   if( pMatch ){. 
2a20: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2a30: 61 62 6c 65 20 3d 20 70 4d 61 74 63 68 2d 3e 69  able = pMatch->i
2a40: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
2a50: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d  pExpr->pTab = pM
2a60: 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20  atch->pTab;.    
2a70: 20 20 20 20 2f 2a 20 52 49 47 48 54 20 4a 4f 49      /* RIGHT JOI
2a80: 4e 20 6e 6f 74 20 28 79 65 74 29 20 73 75 70 70  N not (yet) supp
2a90: 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  orted */.       
2aa0: 20 61 73 73 65 72 74 28 20 28 70 4d 61 74 63 68   assert( (pMatch
2ab0: 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20  ->fg.jointype & 
2ac0: 4a 54 5f 52 49 47 48 54 29 3d 3d 30 20 29 3b 0a  JT_RIGHT)==0 );.
2ad0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4d 61          if( (pMa
2ae0: 74 63 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tch->fg.jointype
2af0: 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29   & JT_LEFT)!=0 )
2b00: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
2b10: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
2b20: 72 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29  r, EP_CanBeNull)
2b30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b40: 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70 45      pSchema = pE
2b50: 78 70 72 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65  xpr->pTab->pSche
2b60: 6d 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ma;.      }.    
2b70: 7d 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73  } /* if( pSrcLis
2b80: 74 20 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  t ) */..#ifndef 
2b90: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
2ba0: 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  GER.    /* If we
2bb0: 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64   have not alread
2bc0: 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e  y resolved the n
2bd0: 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20  ame, then maybe 
2be0: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20  .    ** it is a 
2bf0: 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74  new.* or old.* t
2c00: 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20  rigger argument 
2c10: 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f  reference.    */
2c20: 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20  .    if( zDb==0 
2c30: 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e  && zTab!=0 && cn
2c40: 74 54 61 62 3d 3d 30 20 26 26 20 70 50 61 72 73  tTab==0 && pPars
2c50: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 21 3d  e->pTriggerTab!=
2c60: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
2c70: 70 20 3d 20 70 50 61 72 73 65 2d 3e 65 54 72 69  p = pParse->eTri
2c80: 67 67 65 72 4f 70 3b 0a 20 20 20 20 20 20 61 73  ggerOp;.      as
2c90: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 44 45 4c  sert( op==TK_DEL
2ca0: 45 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50  ETE || op==TK_UP
2cb0: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  DATE || op==TK_I
2cc0: 4e 53 45 52 54 20 29 3b 0a 20 20 20 20 20 20 69  NSERT );.      i
2cd0: 66 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54 45  f( op!=TK_DELETE
2ce0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2cf0: 6d 70 28 22 6e 65 77 22 2c 7a 54 61 62 29 20 3d  mp("new",zTab) =
2d00: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  = 0 ){.        p
2d10: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 31  Expr->iTable = 1
2d20: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
2d30: 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65   pParse->pTrigge
2d40: 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rTab;.      }els
2d50: 65 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 53  e if( op!=TK_INS
2d60: 45 52 54 20 26 26 20 73 71 6c 69 74 65 33 53 74  ERT && sqlite3St
2d70: 72 49 43 6d 70 28 22 6f 6c 64 22 2c 7a 54 61 62  rICmp("old",zTab
2d80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2d90: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2da0: 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  0;.        pTab 
2db0: 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67  = pParse->pTrigg
2dc0: 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c  erTab;.      }el
2dd0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
2de0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
2df0: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b       if( pTab ){
2e00: 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43   .        int iC
2e10: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68  ol;.        pSch
2e20: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
2e30: 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74  ema;.        cnt
2e40: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  Tab++;.        f
2e50: 6f 72 28 69 43 6f 6c 3d 30 2c 20 70 43 6f 6c 3d  or(iCol=0, pCol=
2e60: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 43 6f 6c  pTab->aCol; iCol
2e70: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
2e80: 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  l++, pCol++){.  
2e90: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2ea0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
2eb0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
2ec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2ed0: 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  if( iCol==pTab->
2ee0: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
2ef0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31         iCol = -1
2f00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2f20: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
2f30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2f40: 20 69 66 28 20 69 43 6f 6c 3e 3d 70 54 61 62 2d   if( iCol>=pTab-
2f50: 3e 6e 43 6f 6c 20 26 26 20 73 71 6c 69 74 65 33  >nCol && sqlite3
2f60: 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 26 26  IsRowid(zCol) &&
2f70: 20 56 69 73 69 62 6c 65 52 6f 77 69 64 28 70 54   VisibleRowid(pT
2f80: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
2f90: 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 31 34   /* IMP: R-51414
2fa0: 2d 33 32 39 31 30 20 2a 2f 0a 20 20 20 20 20 20  -32910 */.      
2fb0: 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20      iCol = -1;. 
2fc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fd0: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
2fe0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
2ff0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
3000: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
3010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
3020: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  pr->affinity = S
3030: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
3040: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  R;.          }el
3050: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54  se if( pExpr->iT
3060: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  able==0 ){.     
3070: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
3080: 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20   iCol==31 );.   
3090: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
30a0: 65 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20  e( iCol==32 );. 
30b0: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
30c0: 65 2d 3e 6f 6c 64 6d 61 73 6b 20 7c 3d 20 28 69  e->oldmask |= (i
30d0: 43 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66  Col>=32 ? 0xffff
30e0: 66 66 66 66 20 3a 20 28 28 28 75 33 32 29 31 29  ffff : (((u32)1)
30f0: 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  <<iCol));.      
3100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3110: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
3120: 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20   iCol==31 );.   
3130: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
3140: 65 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20  e( iCol==32 );. 
3150: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
3160: 65 2d 3e 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69  e->newmask |= (i
3170: 43 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66  Col>=32 ? 0xffff
3180: 66 66 66 66 20 3a 20 28 28 28 75 33 32 29 31 29  ffff : (((u32)1)
3190: 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  <<iCol));.      
31a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
31b0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
31c0: 20 28 69 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20   (i16)iCol;.    
31d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
31e0: 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
31f0: 20 20 20 20 69 73 54 72 69 67 67 65 72 20 3d 20      isTrigger = 
3200: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
3210: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
3220: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
3240: 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  R) */..    /*.  
3250: 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65    ** Perhaps the
3260: 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72   name is a refer
3270: 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49  ence to the ROWI
3280: 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  D.    */.    if(
3290: 20 63 6e 74 3d 3d 30 0a 20 20 20 20 20 26 26 20   cnt==0.     && 
32a0: 63 6e 74 54 61 62 3d 3d 31 0a 20 20 20 20 20 26  cntTab==1.     &
32b0: 26 20 70 4d 61 74 63 68 0a 20 20 20 20 20 26 26  & pMatch.     &&
32c0: 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
32d0: 20 4e 43 5f 49 64 78 45 78 70 72 29 3d 3d 30 0a   NC_IdxExpr)==0.
32e0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49       && sqlite3I
32f0: 73 52 6f 77 69 64 28 7a 43 6f 6c 29 0a 20 20 20  sRowid(zCol).   
3300: 20 20 26 26 20 56 69 73 69 62 6c 65 52 6f 77 69    && VisibleRowi
3310: 64 28 70 4d 61 74 63 68 2d 3e 70 54 61 62 29 0a  d(pMatch->pTab).
3320: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6e 74      ){.      cnt
3330: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70   = 1;.      pExp
3340: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
3350: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66  .      pExpr->af
3360: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
3370: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
3380: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
3390: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69  * If the input i
33a0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20  s of the form Z 
33b0: 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e  (not Y.Z or X.Y.
33c0: 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65  Z) then the name
33d0: 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20   Z.    ** might 
33e0: 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75  refer to an resu
33f0: 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54  lt-set alias.  T
3400: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
3410: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20   example, when. 
3420: 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73     ** we are res
3430: 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20  olving names in 
3440: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
3450: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3460: 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a  g command:.    *
3470: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c  *.    **     SEL
3480: 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f  ECT a+b AS x FRO
3490: 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c  M table WHERE x<
34a0: 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  10;.    **.    *
34b0: 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20  * In cases like 
34c0: 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45  this, replace pE
34d0: 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79 20  xpr with a copy 
34e0: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
34f0: 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f  n that.    ** fo
3500: 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  rms the result s
3510: 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20  et entry ("a+b" 
3520: 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
3530: 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
3540: 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e  iately..    ** N
3550: 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ote that the exp
3560: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
3570: 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64  esult set should
3580: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
3590: 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76  en.    ** resolv
35a0: 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ed by the time t
35b0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
35c0: 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20  is resolved..   
35d0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
35e0: 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 61 6e  bility to use an
35f0: 20 6f 75 74 70 75 74 20 72 65 73 75 6c 74 2d 73   output result-s
3600: 65 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  et column in the
3610: 20 57 48 45 52 45 2c 20 47 52 4f 55 50 20 42 59   WHERE, GROUP BY
3620: 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 48 41 56 49  ,.    ** or HAVI
3630: 4e 47 20 63 6c 61 75 73 65 73 2c 20 6f 72 20 61  NG clauses, or a
3640: 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67  s part of a larg
3650: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
3660: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
3670: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 6e    ** clause is n
3680: 6f 74 20 73 74 61 6e 64 61 72 64 20 53 51 4c 2e  ot standard SQL.
3690: 20 20 54 68 69 73 20 69 73 20 61 20 28 67 6f 6f    This is a (goo
36a0: 66 79 29 20 53 51 4c 69 74 65 20 65 78 74 65 6e  fy) SQLite exten
36b0: 73 69 6f 6e 2c 20 74 68 61 74 0a 20 20 20 20 2a  sion, that.    *
36c0: 2a 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 66  * is supported f
36d0: 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
36e0: 70 61 74 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e  patibility only.
36f0: 20 48 65 6e 63 65 2c 20 77 65 20 69 73 73 75 65   Hence, we issue
3700: 20 61 20 77 61 72 6e 69 6e 67 0a 20 20 20 20 2a   a warning.    *
3710: 2a 20 6f 6e 20 73 71 6c 69 74 65 33 5f 6c 6f 67  * on sqlite3_log
3720: 28 29 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  () whenever the 
3730: 63 61 70 61 62 69 6c 69 74 79 20 69 73 20 75 73  capability is us
3740: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
3750: 66 28 20 28 70 45 4c 69 73 74 20 3d 20 70 4e 43  f( (pEList = pNC
3760: 2d 3e 70 45 4c 69 73 74 29 21 3d 30 0a 20 20 20  ->pEList)!=0.   
3770: 20 20 26 26 20 7a 54 61 62 3d 3d 30 0a 20 20 20    && zTab==0.   
3780: 20 20 26 26 20 63 6e 74 3d 3d 30 0a 20 20 20 20    && cnt==0.    
3790: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
37a0: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
37b0: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
37c0: 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c   char *zAs = pEL
37d0: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
37e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73  .        if( zAs
37f0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
3800: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
3810: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
3820: 20 45 78 70 72 20 2a 70 4f 72 69 67 3b 0a 20 20   Expr *pOrig;.  
3830: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3840: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
3850: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
3860: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
3870: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
3880: 78 2e 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20  x.pList==0 );.  
3890: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
38a0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
38b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
38c0: 20 70 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d   pOrig = pEList-
38d0: 3e 61 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[j].pExpr;.   
38e0: 20 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d         if( (pNC-
38f0: 3e 6e 63 46 6c 61 67 73 26 4e 43 5f 41 6c 6c 6f  >ncFlags&NC_Allo
3900: 77 41 67 67 29 3d 3d 30 20 26 26 20 45 78 70 72  wAgg)==0 && Expr
3910: 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72 69  HasProperty(pOri
3920: 67 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20  g, EP_Agg) ){.  
3930: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3940: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3950: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 6c 69  , "misuse of ali
3960: 61 73 65 64 20 61 67 67 72 65 67 61 74 65 20 25  ased aggregate %
3970: 73 22 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20 20  s", zAs);.      
3980: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
3990: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
39a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65    }.          re
39b0: 73 6f 6c 76 65 41 6c 69 61 73 28 70 50 61 72 73  solveAlias(pPars
39c0: 65 2c 20 70 45 4c 69 73 74 2c 20 6a 2c 20 70 45  e, pEList, j, pE
39d0: 78 70 72 2c 20 22 22 2c 20 6e 53 75 62 71 75 65  xpr, "", nSubque
39e0: 72 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  ry);.          c
39f0: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
3a00: 20 20 70 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20    pMatch = 0;.  
3a10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3a20: 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d  zTab==0 && zDb==
3a30: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  0 );.          g
3a40: 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65  oto lookupname_e
3a50: 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nd;.        }.  
3a60: 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20      } .    }..  
3a70: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
3a80: 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f  the next name co
3a90: 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70  ntext.  The loop
3aa0: 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20   will exit when 
3ab0: 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65  either.    ** we
3ac0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 20 28 63   have a match (c
3ad0: 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65  nt>0) or when we
3ae0: 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65   run out of name
3af0: 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a   contexts..    *
3b00: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
3b10: 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20   ){.      pNC = 
3b20: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
3b30: 20 20 6e 53 75 62 71 75 65 72 79 2b 2b 3b 0a 20    nSubquery++;. 
3b40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20     }.  }..  /*. 
3b50: 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61   ** If X and Y a
3b60: 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65  re NULL (in othe
3b70: 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20  r words if only 
3b80: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
3b90: 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69  Z is.  ** suppli
3ba0: 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ed) and the valu
3bb0: 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73  e of Z is enclos
3bc0: 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f  ed in double-quo
3bd0: 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a  tes, then.  ** Z
3be0: 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74   is a string lit
3bf0: 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e  eral if it doesn
3c00: 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c  't match any col
3c10: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74  umn names.  In t
3c20: 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77  hat.  ** case, w
3c30: 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e  e need to return
3c40: 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20   right away and 
3c50: 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61  not make any cha
3c60: 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78  nges to.  ** pEx
3c70: 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65  pr..  **.  ** Be
3c80: 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e  cause no referen
3c90: 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f  ce was made to o
3ca0: 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74  uter contexts, t
3cb0: 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a  he pNC->nRef.  *
3cc0: 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  * fields are not
3cd0: 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20   changed in any 
3ce0: 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  context..  */.  
3cf0: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54  if( cnt==0 && zT
3d00: 61 62 3d 3d 30 20 26 26 20 45 78 70 72 48 61 73  ab==0 && ExprHas
3d10: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45  Property(pExpr,E
3d20: 50 5f 44 62 6c 51 75 6f 74 65 64 29 20 29 7b 0a  P_DblQuoted) ){.
3d30: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
3d40: 54 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 70  TK_STRING;.    p
3d50: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  Expr->pTab = 0;.
3d60: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
3d70: 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rune;.  }..  /*.
3d80: 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e    ** cnt==0 mean
3d90: 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20  s there was not 
3da0: 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65  match.  cnt>1 me
3db0: 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74  ans there were t
3dc0: 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20  wo or.  ** more 
3dd0: 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72  matches.  Either
3de0: 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e   way, we have an
3df0: 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69   error..  */.  i
3e00: 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20  f( cnt!=1 ){.   
3e10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
3e20: 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e  r;.    zErr = cn
3e30: 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20  t==0 ? "no such 
3e40: 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69 67  column" : "ambig
3e50: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
3e60: 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29  ";.    if( zDb )
3e70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
3e80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3e90: 22 25 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c 20  "%s: %s.%s.%s", 
3ea0: 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62 2c  zErr, zDb, zTab,
3eb0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73   zCol);.    }els
3ec0: 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20  e if( zTab ){.  
3ed0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3ee0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
3ef0: 20 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a   %s.%s", zErr, z
3f00: 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Tab, zCol);.    
3f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
3f20: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
3f30: 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a  rse, "%s: %s", z
3f40: 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Err, zCol);.    
3f50: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
3f60: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
3f70: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
3f80: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
3f90: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
3fa0: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73  table in pSrcLis
3fb0: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c  t is referenced,
3fc0: 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a   then record.  *
3fd0: 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74  * this fact in t
3fe0: 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  he pSrcList.a[].
3ff0: 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e  colUsed bitmask.
4000: 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65    Column 0 cause
4010: 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20  s.  ** bit 0 to 
4020: 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20  be set.  Column 
4030: 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41  1 sets bit 1.  A
4040: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
4050: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   the.  ** column
4060: 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
4070: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  er than the numb
4080: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  er of bits in th
4090: 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74  e bitmask.  ** t
40a0: 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68  hen set the high
40b0: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68  -order bit of th
40c0: 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  e bitmask..  */.
40d0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
40e0: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63  lumn>=0 && pMatc
40f0: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
4100: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
4110: 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  mn;.    testcase
4120: 28 20 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( n==BMS-1 );.  
4130: 20 20 69 66 28 20 6e 3e 3d 42 4d 53 20 29 7b 0a    if( n>=BMS ){.
4140: 20 20 20 20 20 20 6e 20 3d 20 42 4d 53 2d 31 3b        n = BMS-1;
4150: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4160: 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73  t( pMatch->iCurs
4170: 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or==pExpr->iTabl
4180: 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d  e );.    pMatch-
4190: 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69  >colUsed |= ((Bi
41a0: 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d  tmask)1)<<n;.  }
41b0: 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
41c0: 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  and return.  */.
41d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
41e0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ete(db, pExpr->p
41f0: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
4200: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
4210: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4220: 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
4230: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
4240: 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d  ht = 0;.  pExpr-
4250: 3e 6f 70 20 3d 20 28 69 73 54 72 69 67 67 65 72  >op = (isTrigger
4260: 20 3f 20 54 4b 5f 54 52 49 47 47 45 52 20 3a 20   ? TK_TRIGGER : 
4270: 54 4b 5f 43 4f 4c 55 4d 4e 29 3b 0a 6c 6f 6f 6b  TK_COLUMN);.look
4280: 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 69 66  upname_end:.  if
4290: 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ( cnt==1 ){.    
42a0: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
42b0: 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48  ;.    if( !ExprH
42c0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
42d0: 2c 20 45 50 5f 41 6c 69 61 73 29 20 29 7b 0a 20  , EP_Alias) ){. 
42e0: 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68       sqlite3Auth
42f0: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
4300: 70 72 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e 43  pr, pSchema, pNC
4310: 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20  ->pSrcList);.   
4320: 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d   }.    /* Increm
4330: 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c  ent the nRef val
4340: 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63  ue on all name c
4350: 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70  ontexts from Top
4360: 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20  NC up to.    ** 
4370: 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20  the point where 
4380: 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64  the name matched
4390: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29  . */.    for(;;)
43a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
43b0: 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  pTopNC!=0 );.   
43c0: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b     pTopNC->nRef+
43d0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  +;.      if( pTo
43e0: 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b  pNC==pNC ) break
43f0: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d  ;.      pTopNC =
4400: 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a   pTopNC->pNext;.
4410: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
4420: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 20   WRC_Prune;.  } 
4430: 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72  else {.    retur
4440: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
4450: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
4460: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
4470: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78  pointer to an ex
4480: 70 72 65 73 73 69 6f 6e 20 74 6f 20 6c 6f 61 64  pression to load
4490: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c   the column iCol
44a0: 0a 2a 2a 20 66 72 6f 6d 20 64 61 74 61 73 6f 75  .** from datasou
44b0: 72 63 65 20 69 53 72 63 20 69 6e 20 53 72 63 4c  rce iSrc in SrcL
44c0: 69 73 74 20 70 53 72 63 2e 0a 2a 2f 0a 45 78 70  ist pSrc..*/.Exp
44d0: 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65  r *sqlite3Create
44e0: 43 6f 6c 75 6d 6e 45 78 70 72 28 73 71 6c 69 74  ColumnExpr(sqlit
44f0: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
4500: 2a 70 53 72 63 2c 20 69 6e 74 20 69 53 72 63 2c  *pSrc, int iSrc,
4510: 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 45 78   int iCol){.  Ex
4520: 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45  pr *p = sqlite3E
4530: 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f  xprAlloc(db, TK_
4540: 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20  COLUMN, 0, 0);. 
4550: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74   if( p ){.    st
4560: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
4570: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63  m *pItem = &pSrc
4580: 2d 3e 61 5b 69 53 72 63 5d 3b 0a 20 20 20 20 70  ->a[iSrc];.    p
4590: 2d 3e 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e  ->pTab = pItem->
45a0: 70 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61  pTab;.    p->iTa
45b0: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
45c0: 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rsor;.    if( p-
45d0: 3e 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43  >pTab->iPKey==iC
45e0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  ol ){.      p->i
45f0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
4600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
4610: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61  >iColumn = (ynVa
4620: 72 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65  r)iCol;.      te
4630: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
4640: 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  S );.      testc
4650: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31  ase( iCol==BMS-1
4660: 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d   );.      pItem-
4670: 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69  >colUsed |= ((Bi
4680: 74 6d 61 73 6b 29 31 29 3c 3c 28 69 43 6f 6c 3e  tmask)1)<<(iCol>
4690: 3d 42 4d 53 20 3f 20 42 4d 53 2d 31 20 3a 20 69  =BMS ? BMS-1 : i
46a0: 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
46b0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
46c0: 70 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b  p, EP_Resolved);
46d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
46e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74  .}../*.** Report
46f0: 20 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20 61   an error that a
4700: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  n expression is 
4710: 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 73 6f  not valid for so
4720: 6d 65 20 73 65 74 20 6f 66 0a 2a 2a 20 70 4e 43  me set of.** pNC
4730: 2d 3e 6e 63 46 6c 61 67 73 20 76 61 6c 75 65 73  ->ncFlags values
4740: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 76   determined by v
4750: 61 6c 69 64 4d 61 73 6b 2e 0a 2a 2f 0a 73 74 61  alidMask..*/.sta
4760: 74 69 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69  tic void notVali
4770: 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  d(.  Parse *pPar
4780: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4c 65 61  se,       /* Lea
4790: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
47a0: 20 68 65 72 65 20 2a 2f 0a 20 20 4e 61 6d 65 43   here */.  NameC
47b0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
47c0: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74  /* The name cont
47d0: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
47e0: 68 61 72 20 2a 7a 4d 73 67 2c 20 20 20 20 2f 2a  har *zMsg,    /*
47f0: 20 54 79 70 65 20 6f 66 20 65 72 72 6f 72 20 2a   Type of error *
4800: 2f 0a 20 20 69 6e 74 20 76 61 6c 69 64 4d 61 73  /.  int validMas
4810: 6b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  k        /* Set 
4820: 6f 66 20 63 6f 6e 74 65 78 74 73 20 66 6f 72 20  of contexts for 
4830: 77 68 69 63 68 20 70 72 6f 68 69 62 69 74 65 64  which prohibited
4840: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
4850: 20 28 76 61 6c 69 64 4d 61 73 6b 26 7e 28 4e 43   (validMask&~(NC
4860: 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72 74  _IsCheck|NC_Part
4870: 49 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 29 29  Idx|NC_IdxExpr))
4880: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 4e  ==0 );.  if( (pN
4890: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 76 61 6c  C->ncFlags & val
48a0: 69 64 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  idMask)!=0 ){.  
48b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
48c0: 6e 20 3d 20 22 70 61 72 74 69 61 6c 20 69 6e 64  n = "partial ind
48d0: 65 78 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  ex WHERE clauses
48e0: 22 3b 0a 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  ";.    if( pNC->
48f0: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 64 78  ncFlags & NC_Idx
4900: 45 78 70 72 20 29 20 20 20 20 20 20 7a 49 6e 20  Expr )      zIn 
4910: 3d 20 22 69 6e 64 65 78 20 65 78 70 72 65 73 73  = "index express
4920: 69 6f 6e 73 22 3b 0a 23 69 66 6e 64 65 66 20 53  ions";.#ifndef S
4930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
4940: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 4e  .    else if( pN
4950: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
4960: 49 73 43 68 65 63 6b 20 29 20 7a 49 6e 20 3d 20  IsCheck ) zIn = 
4970: 22 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e  "CHECK constrain
4980: 74 73 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ts";.#endif.    
4990: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
49a0: 70 50 61 72 73 65 2c 20 22 25 73 20 70 72 6f 68  pParse, "%s proh
49b0: 69 62 69 74 65 64 20 69 6e 20 25 73 22 2c 20 7a  ibited in %s", z
49c0: 4d 73 67 2c 20 7a 49 6e 29 3b 0a 20 20 7d 0a 7d  Msg, zIn);.  }.}
49d0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
49e0: 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65 6e 63 6f  on p should enco
49f0: 64 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f  de a floating po
4a00: 69 6e 74 20 76 61 6c 75 65 20 62 65 74 77 65 65  int value betwee
4a10: 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a  n 1.0 and 0.0..*
4a20: 2a 20 52 65 74 75 72 6e 20 31 30 32 34 20 74 69  * Return 1024 ti
4a30: 6d 65 73 20 74 68 69 73 20 76 61 6c 75 65 2e 20  mes this value. 
4a40: 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69 66   Or return -1 if
4a50: 20 70 20 69 73 20 6e 6f 74 20 61 20 66 6c 6f 61   p is not a floa
4a60: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
4a70: 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 30 20  lue between 1.0 
4a80: 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61 74  and 0.0..*/.stat
4a90: 69 63 20 69 6e 74 20 65 78 70 72 50 72 6f 62 61  ic int exprProba
4aa0: 62 69 6c 69 74 79 28 45 78 70 72 20 2a 70 29 7b  bility(Expr *p){
4ab0: 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 2d 31  .  double r = -1
4ac0: 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 21  .0;.  if( p->op!
4ad0: 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74 75  =TK_FLOAT ) retu
4ae0: 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33  rn -1;.  sqlite3
4af0: 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  AtoF(p->u.zToken
4b00: 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72  , &r, sqlite3Str
4b10: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
4b20: 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  n), SQLITE_UTF8)
4b30: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 3e 3d 30  ;.  assert( r>=0
4b40: 2e 30 20 29 3b 0a 20 20 69 66 28 20 72 3e 31 2e  .0 );.  if( r>1.
4b50: 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
4b60: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 72 2a   return (int)(r*
4b70: 31 33 34 32 31 37 37 32 38 2e 30 29 3b 0a 7d 0a  134217728.0);.}.
4b80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
4b90: 69 6e 65 20 69 73 20 63 61 6c 6c 62 61 63 6b 20  ine is callback 
4ba0: 66 6f 72 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  for sqlite3WalkE
4bb0: 78 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73  xpr()..**.** Res
4bc0: 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61  olve symbolic na
4bd0: 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55  mes into TK_COLU
4be0: 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  MN operators for
4bf0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
4c00: 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72  node in the expr
4c10: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
4c20: 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e  turn 0 to contin
4c30: 75 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f  ue the search do
4c40: 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f  wn.** the tree o
4c50: 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65  r 2 to abort the
4c60: 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a   tree walk..**.*
4c70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
4c80: 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63  lso does error c
4c90: 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65  hecking and name
4ca0: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a   resolution for.
4cb0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ** function name
4cc0: 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72  s.  The operator
4cd0: 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
4ce0: 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e  unctions is chan
4cf0: 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47  ged.** to TK_AGG
4d00: 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74  _FUNCTION..*/.st
4d10: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
4d20: 45 78 70 72 53 74 65 70 28 57 61 6c 6b 65 72 20  ExprStep(Walker 
4d30: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
4d40: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
4d50: 6e 74 65 78 74 20 2a 70 4e 43 3b 0a 20 20 50 61  ntext *pNC;.  Pa
4d60: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20  rse *pParse;..  
4d70: 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
4d80: 2e 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20  .pNC;.  assert( 
4d90: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  pNC!=0 );.  pPar
4da0: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
4db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
4dc0: 73 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70 50 61  se==pWalker->pPa
4dd0: 72 73 65 20 29 3b 0a 0a 20 20 69 66 28 20 45 78  rse );..  if( Ex
4de0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
4df0: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
4e00: 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50  ) ) return WRC_P
4e10: 72 75 6e 65 3b 0a 20 20 45 78 70 72 53 65 74 50  rune;.  ExprSetP
4e20: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
4e30: 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66  P_Resolved);.#if
4e40: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66  ndef NDEBUG.  if
4e50: 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20  ( pNC->pSrcList 
4e60: 26 26 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  && pNC->pSrcList
4e70: 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20  ->nAlloc>0 ){.  
4e80: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
4e90: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
4ea0: 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ist;.    int i;.
4eb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4ec0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53  NC->pSrcList->nS
4ed0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
4ee0: 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 74  assert( pSrcList
4ef0: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d  ->a[i].iCursor>=
4f00: 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61  0 && pSrcList->a
4f10: 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72  [i].iCursor<pPar
4f20: 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d  se->nTab);.    }
4f30: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77  .  }.#endif.  sw
4f40: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
4f50: 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ){..#if defined(
4f60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50  SQLITE_ENABLE_UP
4f70: 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49  DATE_DELETE_LIMI
4f80: 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
4f90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
4fa0: 45 52 59 29 0a 20 20 20 20 2f 2a 20 54 68 65 20  ERY).    /* The 
4fb0: 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f 72  special operator
4fc0: 20 54 4b 5f 52 4f 57 20 6d 65 61 6e 73 20 75 73   TK_ROW means us
4fd0: 65 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  e the rowid for 
4fe0: 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a  the first.    **
4ff0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 46   column in the F
5000: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 69  ROM clause.  Thi
5010: 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  s is used by the
5020: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 52 44 45 52   LIMIT and ORDER
5030: 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73   BY.    ** claus
5040: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 6e 20  e processing on 
5050: 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54  UPDATE and DELET
5060: 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  E statements..  
5070: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
5080: 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 53 72  _ROW: {.      Sr
5090: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
50a0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
50b0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
50c0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
50d0: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
50e0: 20 70 53 72 63 4c 69 73 74 20 26 26 20 70 53 72   pSrcList && pSr
50f0: 63 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29  cList->nSrc==1 )
5100: 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20  ;.      pItem = 
5110: 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 0a 20 20  pSrcList->a; .  
5120: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
5130: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
5140: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
5150: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
5160: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
5170: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
5180: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5190: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
51a0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
51b0: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
51c0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
51d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
51e0: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
51f0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
5200: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29  TE_DELETE_LIMIT)
5210: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 21 64  .          && !d
5220: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5230: 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a  IT_SUBQUERY) */.
5240: 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69  .    /* A lone i
5250: 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65  dentifier is the
5260: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
5270: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
5280: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
5290: 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70 4e    return lookupN
52a0: 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30  ame(pParse, 0, 0
52b0: 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
52c0: 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a  n, pNC, pExpr);.
52d0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
52e0: 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  A table name and
52f0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20   column name:   
5300: 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f    ID.ID.    ** O
5310: 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61  r a database, ta
5320: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20  ble and column: 
5330: 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f   ID.ID.ID.    */
5340: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
5350: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
5360: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20  char *zColumn;. 
5370: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5380: 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 63  *zTable;.      c
5390: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
53a0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
53b0: 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66  ht;..      /* if
53c0: 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  ( pSrcList==0 ) 
53d0: 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20  break; */.      
53e0: 6e 6f 74 56 61 6c 69 64 28 70 50 61 72 73 65 2c  notValid(pParse,
53f0: 20 70 4e 43 2c 20 22 74 68 65 20 5c 22 2e 5c 22   pNC, "the \".\"
5400: 20 6f 70 65 72 61 74 6f 72 22 2c 20 4e 43 5f 49   operator", NC_I
5410: 64 78 45 78 70 72 29 3b 0a 20 20 20 20 20 20 2f  dxExpr);.      /
5420: 2a 6e 6f 74 56 61 6c 69 64 28 70 50 61 72 73 65  *notValid(pParse
5430: 2c 20 70 4e 43 2c 20 22 74 68 65 20 5c 22 2e 5c  , pNC, "the \".\
5440: 22 20 6f 70 65 72 61 74 6f 72 22 2c 20 4e 43 5f  " operator", NC_
5450: 50 61 72 74 49 64 78 7c 4e 43 5f 49 73 43 68 65  PartIdx|NC_IsChe
5460: 63 6b 2c 20 31 29 3b 2a 2f 0a 20 20 20 20 20 20  ck, 1);*/.      
5470: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
5480: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
5490: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
54a0: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _ID ){.        z
54b0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
54c0: 7a 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e  zTable = pExpr->
54d0: 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
54e0: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e  .        zColumn
54f0: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
5500: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ken;.      }else
5510: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5520: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
5530: 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20  _DOT );.        
5540: 7a 44 62 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  zDb = pExpr->pLe
5550: 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
5560: 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 70        zTable = p
5570: 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 75 2e  Right->pLeft->u.
5580: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
5590: 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74  zColumn = pRight
55a0: 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  ->pRight->u.zTok
55b0: 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  en;.      }.    
55c0: 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70 4e    return lookupN
55d0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 44 62 2c  ame(pParse, zDb,
55e0: 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e   zTable, zColumn
55f0: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
5600: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
5610: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
5620: 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  mes.    */.    c
5630: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
5640: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
5650: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
5660: 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  ->x.pList;    /*
5670: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
5680: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
5690: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
56a0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 20  t->nExpr : 0;   
56b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
56c0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
56d0: 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   int no_such_fun
56e0: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  c = 0;       /* 
56f0: 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20  True if no such 
5700: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20  function exists 
5710: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f  */.      int wro
5720: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b  ng_num_args = 0;
5730: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5740: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
5750: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
5760: 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20     int is_agg = 
5770: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
5780: 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20  * True if is an 
5790: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
57a0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
57b0: 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20 20  auth;           
57c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f          /* Autho
57d0: 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20  rization to use 
57e0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
57f0: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5820: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
5830: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
5840: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5850: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
5860: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
5870: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
5880: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
5890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
58a0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
58b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
58c0: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
58d0: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20  NC(pParse->db); 
58e0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
58f0: 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20  e encoding */.. 
5900: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
5910: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
5920: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
5930: 74 29 20 29 3b 0a 20 20 20 20 20 20 6e 6f 74 56  t) );.      notV
5940: 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e 43  alid(pParse, pNC
5950: 2c 20 22 66 75 6e 63 74 69 6f 6e 73 22 2c 20 4e  , "functions", N
5960: 43 5f 50 61 72 74 49 64 78 29 3b 0a 20 20 20 20  C_PartIdx);.    
5970: 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
5980: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e  .zToken;.      n
5990: 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Id = sqlite3Strl
59a0: 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20  en30(zId);.     
59b0: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
59c0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
59d0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 2c 20  se->db, zId, n, 
59e0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
59f0: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
5a00: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
5a10: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
5a20: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
5a30: 2c 20 2d 32 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  , -2, enc, 0);. 
5a40: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d         if( pDef=
5a50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5a60: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31  no_such_func = 1
5a70: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5a80: 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67  .          wrong
5a90: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20  _num_args = 1;. 
5aa0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5ab0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
5ac0: 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 69  _agg = pDef->xFi
5ad0: 6e 61 6c 69 7a 65 21 3d 30 3b 0a 20 20 20 20 20  nalize!=0;.     
5ae0: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
5af0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
5b00: 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
5b10: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53  .          ExprS
5b20: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
5b30: 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 7c 45 50  , EP_Unlikely|EP
5b40: 5f 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 20 20  _Skip);.        
5b50: 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 0a 20 20    if( n==2 ){.  
5b60: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
5b70: 3e 69 54 61 62 6c 65 20 3d 20 65 78 70 72 50 72  >iTable = exprPr
5b80: 6f 62 61 62 69 6c 69 74 79 28 70 4c 69 73 74 2d  obability(pList-
5b90: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
5ba0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
5bb0: 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b  xpr->iTable<0 ){
5bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
5bd0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5be0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
5bf0: 20 20 20 20 20 20 20 22 73 65 63 6f 6e 64 20 61         "second a
5c00: 72 67 75 6d 65 6e 74 20 74 6f 20 6c 69 6b 65 6c  rgument to likel
5c10: 69 68 6f 6f 64 28 29 20 6d 75 73 74 20 62 65 20  ihood() must be 
5c20: 61 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  a ".            
5c30: 20 20 20 20 22 63 6f 6e 73 74 61 6e 74 20 62 65      "constant be
5c40: 74 77 65 65 6e 20 30 2e 30 20 61 6e 64 20 31 2e  tween 0.0 and 1.
5c50: 30 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0");.           
5c60: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5c80: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5c90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 56             /* EV
5ca0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33  IDENCE-OF: R-613
5cb0: 30 34 2d 32 39 34 34 39 20 54 68 65 20 75 6e 6c  04-29449 The unl
5cc0: 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f  ikely(X) functio
5cd0: 6e 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  n is.           
5ce0: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
5cf0: 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 20  o likelihood(X, 
5d00: 30 2e 30 36 32 35 29 2e 0a 20 20 20 20 20 20 20  0.0625)..       
5d10: 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
5d20: 2d 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31 31 36  -OF: R-01283-116
5d30: 33 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28  36 The unlikely(
5d40: 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  X) function is. 
5d50: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 68             ** sh
5d60: 6f 72 74 2d 68 61 6e 64 20 66 6f 72 20 6c 69 6b  ort-hand for lik
5d70: 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36 32 35  elihood(X,0.0625
5d80: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
5d90: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
5da0: 2d 33 36 38 35 30 2d 33 34 31 32 37 20 54 68 65  -36850-34127 The
5db0: 20 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74   likely(X) funct
5dc0: 69 6f 6e 20 69 73 20 73 68 6f 72 74 2d 68 61 6e  ion is short-han
5dd0: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
5de0: 20 66 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28   for likelihood(
5df0: 58 2c 30 2e 39 33 37 35 29 2e 0a 20 20 20 20 20  X,0.9375)..     
5e00: 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e         ** EVIDEN
5e10: 43 45 2d 4f 46 3a 20 52 2d 35 33 34 33 36 2d 34  CE-OF: R-53436-4
5e20: 30 39 37 33 20 54 68 65 20 6c 69 6b 65 6c 79 28  0973 The likely(
5e30: 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  X) function is e
5e40: 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
5e50: 20 20 20 20 20 20 2a 2a 20 74 6f 20 6c 69 6b 65        ** to like
5e60: 6c 69 68 6f 6f 64 28 58 2c 30 2e 39 33 37 35 29  lihood(X,0.9375)
5e70: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
5e80: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 75 6e 6c 69   /* TUNING: unli
5e90: 6b 65 6c 79 28 29 20 70 72 6f 62 61 62 69 6c 69  kely() probabili
5ea0: 74 79 20 69 73 20 30 2e 30 36 32 35 2e 20 20 6c  ty is 0.0625.  l
5eb0: 69 6b 65 6c 79 28 29 20 69 73 20 30 2e 39 33 37  ikely() is 0.937
5ec0: 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  5 */.           
5ed0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
5ee0: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b 30 5d 3d   pDef->zName[0]=
5ef0: 3d 27 75 27 20 3f 20 38 33 38 38 36 30 38 20 3a  ='u' ? 8388608 :
5f00: 20 31 32 35 38 32 39 31 32 30 3b 0a 20 20 20 20   125829120;.    
5f10: 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 20        }         
5f20: 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 23      .        }.#
5f30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5f40: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
5f50: 0a 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20  .        auth = 
5f60: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
5f70: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
5f80: 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65  FUNCTION, 0, pDe
5f90: 66 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  f->zName, 0);.  
5fa0: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d        if( auth!=
5fb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5fc0: 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d         if( auth=
5fd0: 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a  =SQLITE_DENY ){.
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
5ff0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6000: 73 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69  se, "not authori
6010: 7a 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74  zed to use funct
6020: 69 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  ion: %s",.      
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
6050: 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ef->zName);.    
6060: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
6070: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r++;.          }
6080: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
6090: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
60a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
60b0: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
60c0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
60d0: 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
60e0: 75 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49  uncFlags & (SQLI
60f0: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54  TE_FUNC_CONSTANT
6100: 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f 53 4c 4f  |SQLITE_FUNC_SLO
6110: 43 48 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20  CHNG) ){.       
6120: 20 20 20 2f 2a 20 46 6f 72 20 74 68 65 20 70 75     /* For the pu
6130: 72 70 6f 73 65 73 20 6f 66 20 74 68 65 20 45 50  rposes of the EP
6140: 5f 43 6f 6e 73 74 46 75 6e 63 20 66 6c 61 67 2c  _ConstFunc flag,
6150: 20 64 61 74 65 20 61 6e 64 20 74 69 6d 65 0a 20   date and time. 
6160: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
6170: 74 69 6f 6e 73 20 61 6e 64 20 6f 74 68 65 72 20  tions and other 
6180: 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 63  functions that c
6190: 68 61 6e 67 65 20 73 6c 6f 77 6c 79 20 61 72 65  hange slowly are
61a0: 20 63 6f 6e 73 69 64 65 72 65 64 0a 20 20 20 20   considered.    
61b0: 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 61 6e        ** constan
61c0: 74 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61  t because they a
61d0: 72 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20  re constant for 
61e0: 74 68 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20  the duration of 
61f0: 6f 6e 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20  one query */.   
6200: 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
6210: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
6220: 43 6f 6e 73 74 46 75 6e 63 29 3b 0a 20 20 20 20  ConstFunc);.    
6230: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6240: 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
6250: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
6260: 5f 43 4f 4e 53 54 41 4e 54 29 3d 3d 30 20 29 7b  _CONSTANT)==0 ){
6270: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  .          /* Da
6280: 74 65 2f 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e  te/time function
6290: 73 20 74 68 61 74 20 75 73 65 20 27 6e 6f 77 27  s that use 'now'
62a0: 2c 20 61 6e 64 20 6f 74 68 65 72 20 66 75 6e 63  , and other func
62b0: 74 69 6f 6e 73 20 6c 69 6b 65 0a 20 20 20 20 20  tions like.     
62c0: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 76       ** sqlite_v
62d0: 65 72 73 69 6f 6e 28 29 20 74 68 61 74 20 6d 69  ersion() that mi
62e0: 67 68 74 20 63 68 61 6e 67 65 20 6f 76 65 72 20  ght change over 
62f0: 74 69 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 75  time cannot be u
6300: 73 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  sed.          **
6310: 20 69 6e 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f   in an index. */
6320: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 74 56 61  .          notVa
6330: 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c  lid(pParse, pNC,
6340: 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73   "non-determinis
6350: 74 69 63 20 66 75 6e 63 74 69 6f 6e 73 22 2c 20  tic functions", 
6360: 4e 43 5f 49 64 78 45 78 70 72 29 3b 0a 20 20 20  NC_IdxExpr);.   
6370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6380: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
6390: 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  && (pNC->ncFlags
63a0: 20 26 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d   & NC_AllowAgg)=
63b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
63c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
63d0: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
63e0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
63f0: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64  ion %.*s()", nId
6400: 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70  ,zId);.        p
6410: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
6420: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a      is_agg = 0;.
6430: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6440: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 26 26 20  no_such_func && 
6450: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74  pParse->db->init
6460: 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
6470: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6480: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
6490: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25  such function: %
64a0: 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  .*s", nId, zId);
64b0: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
64c0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rr++;.      }els
64d0: 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f  e if( wrong_num_
64e0: 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  args ){.        
64f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6500: 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75  pParse,"wrong nu
6510: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
6520: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e  s to function %.
6530: 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20  *s()",.         
6540: 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20      nId, zId);. 
6550: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
6560: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
6570: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70    if( is_agg ) p
6580: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  NC->ncFlags &= ~
6590: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20  NC_AllowAgg;.   
65a0: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
65b0: 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c 20  prList(pWalker, 
65c0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
65d0: 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20  ( is_agg ){.    
65e0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
65f0: 2a 70 4e 43 32 20 3d 20 70 4e 43 3b 0a 20 20 20  *pNC2 = pNC;.   
6600: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
6610: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
6620: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
6630: 3e 6f 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  >op2 = 0;.      
6640: 20 20 77 68 69 6c 65 28 20 70 4e 43 32 20 26 26    while( pNC2 &&
6650: 20 21 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f   !sqlite3Functio
6660: 6e 55 73 65 73 54 68 69 73 53 72 63 28 70 45 78  nUsesThisSrc(pEx
6670: 70 72 2c 20 70 4e 43 32 2d 3e 70 53 72 63 4c 69  pr, pNC2->pSrcLi
6680: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  st) ){.         
6690: 20 70 45 78 70 72 2d 3e 6f 70 32 2b 2b 3b 0a 20   pExpr->op2++;. 
66a0: 20 20 20 20 20 20 20 20 20 70 4e 43 32 20 3d 20           pNC2 = 
66b0: 70 4e 43 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pNC2->pNext;.   
66c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
66d0: 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
66e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
66f0: 43 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  C2 ){.          
6700: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46  assert( SQLITE_F
6710: 55 4e 43 5f 4d 49 4e 4d 41 58 3d 3d 4e 43 5f 4d  UNC_MINMAX==NC_M
6720: 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 20 20  inMaxAgg );.    
6730: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6740: 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
6750: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
6760: 49 4e 4d 41 58 29 21 3d 30 20 29 3b 0a 20 20 20  INMAX)!=0 );.   
6770: 20 20 20 20 20 20 20 70 4e 43 32 2d 3e 6e 63 46         pNC2->ncF
6780: 6c 61 67 73 20 7c 3d 20 4e 43 5f 48 61 73 41 67  lags |= NC_HasAg
6790: 67 20 7c 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  g | (pDef->funcF
67a0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
67b0: 4e 43 5f 4d 49 4e 4d 41 58 29 3b 0a 0a 20 20 20  NC_MINMAX);..   
67c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
67d0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  NC->ncFlags |= N
67e0: 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20  C_AllowAgg;.    
67f0: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49 58    }.      /* FIX
6800: 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45   ME:  Compute pE
6810: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61  xpr->affinity ba
6820: 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63  sed on the expec
6830: 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  ted return.     
6840: 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20   ** type of the 
6850: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  function .      
6860: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
6870: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
6880: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6890: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
68a0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
68b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  :.    case TK_EX
68c0: 49 53 54 53 3a 20 20 74 65 73 74 63 61 73 65 28  ISTS:  testcase(
68d0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
68e0: 58 49 53 54 53 20 29 3b 0a 23 65 6e 64 69 66 0a  XISTS );.#endif.
68f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
6900: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
6910: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
6920: 49 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IN );.      if( 
6930: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6940: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
6950: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
6960: 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e  int nRef = pNC->
6970: 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 6e 6f  nRef;.        no
6980: 74 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70  tValid(pParse, p
6990: 4e 43 2c 20 22 73 75 62 71 75 65 72 69 65 73 22  NC, "subqueries"
69a0: 2c 20 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f  , NC_IsCheck|NC_
69b0: 50 61 72 74 49 64 78 7c 4e 43 5f 49 64 78 45 78  PartIdx|NC_IdxEx
69c0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  pr);.        sql
69d0: 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
69e0: 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78  Walker, pExpr->x
69f0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
6a00: 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e     assert( pNC->
6a10: 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20  nRef>=nRef );.  
6a20: 20 20 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d        if( nRef!=
6a30: 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20  pNC->nRef ){.   
6a40: 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
6a50: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
6a60: 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20  _VarSelect);.   
6a70: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c         pNC->ncFl
6a80: 61 67 73 20 7c 3d 20 4e 43 5f 56 61 72 53 65 6c  ags |= NC_VarSel
6a90: 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ect;.        }. 
6aa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6ab0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
6ac0: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
6ad0: 7b 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64  {.      notValid
6ae0: 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 70  (pParse, pNC, "p
6af0: 61 72 61 6d 65 74 65 72 73 22 2c 20 4e 43 5f 49  arameters", NC_I
6b00: 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49 64  sCheck|NC_PartId
6b10: 78 7c 4e 43 5f 49 64 78 45 78 70 72 29 3b 0a 20  x|NC_IdxExpr);. 
6b20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6b30: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  }.  }.  return (
6b40: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
6b50: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6b60: 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f  ocFailed) ? WRC_
6b70: 41 62 6f 72 74 20 3a 20 57 52 43 5f 43 6f 6e 74  Abort : WRC_Cont
6b80: 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  inue;.}../*.** p
6b90: 45 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  EList is a list 
6ba0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77  of expressions w
6bb0: 68 69 63 68 20 61 72 65 20 72 65 61 6c 6c 79 20  hich are really 
6bc0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
6bd0: 66 20 74 68 65 0a 2a 2a 20 61 20 53 45 4c 45 43  f the.** a SELEC
6be0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 45  T statement.  pE
6bf0: 20 69 73 20 61 20 74 65 72 6d 20 69 6e 20 61 6e   is a term in an
6c00: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
6c10: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  UP BY clause..**
6c20: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
6c30: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70  ecks to see if p
6c40: 45 20 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64  E is a simple id
6c50: 65 6e 74 69 66 69 65 72 20 77 68 69 63 68 20 63  entifier which c
6c60: 6f 72 72 65 73 70 6f 6e 64 73 0a 2a 2a 20 74 6f  orresponds.** to
6c70: 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 20   the AS-name of 
6c80: 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 72 6d 73  one of the terms
6c90: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
6ca0: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 69 74 20  on list.  If it 
6cb0: 69 73 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  is,.** this rout
6cc0: 69 6e 65 20 72 65 74 75 72 6e 20 61 6e 20 69 6e  ine return an in
6cd0: 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20  teger between 1 
6ce0: 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73  and N where N is
6cf0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
6d00: 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 45  * elements in pE
6d10: 4c 69 73 74 2c 20 63 6f 72 72 65 73 70 6f 6e 64  List, correspond
6d20: 69 6e 67 20 74 6f 20 74 68 65 20 6d 61 74 63 68  ing to the match
6d30: 69 6e 67 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ing entry.  If t
6d40: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61  here is.** no ma
6d50: 74 63 68 2c 20 6f 72 20 69 66 20 70 45 20 69 73  tch, or if pE is
6d60: 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 69 64   not a simple id
6d70: 65 6e 74 69 66 69 65 72 2c 20 74 68 65 6e 20 74  entifier, then t
6d80: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
6d90: 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 70  eturn 0..**.** p
6da0: 45 4c 69 73 74 20 68 61 73 20 62 65 65 6e 20 72  EList has been r
6db0: 65 73 6f 6c 76 65 64 2e 20 20 70 45 20 68 61 73  esolved.  pE has
6dc0: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
6dd0: 69 6e 74 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d  int resolveAsNam
6de0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
6df0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
6e00: 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65  ng context for e
6e10: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
6e20: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
6e30: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
6e40: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20   expressions to 
6e50: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
6e60: 70 45 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pE           /* 
6e70: 45 78 70 72 65 73 73 69 6f 6e 20 77 65 20 61 72  Expression we ar
6e80: 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 74 63  e trying to matc
6e90: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
6ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6eb0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
6ec0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
6ed0: 54 45 52 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  TER(pParse);..  
6ee0: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pE->op==TK_I
6ef0: 44 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  D ){.    char *z
6f00: 43 6f 6c 20 3d 20 70 45 2d 3e 75 2e 7a 54 6f 6b  Col = pE->u.zTok
6f10: 65 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  en;.    for(i=0;
6f20: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
6f30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
6f40: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
6f50: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
6f60: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
6f70: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
6f80: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
6f90: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6fa0: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i+1;.      }.  
6fb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6fc0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20   0;.}../*.** pE 
6fd0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
6fe0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68  an expression wh
6ff0: 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ich is a single 
7000: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 4f  term in the.** O
7010: 52 44 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d  RDER BY of a com
7020: 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e 20 20 54  pound SELECT.  T
7030: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
7040: 73 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20 6e 61  s not been.** na
7050: 6d 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  me resolved..**.
7060: 2a 2a 20 41 74 20 74 68 65 20 70 6f 69 6e 74 20  ** At the point 
7070: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7080: 63 61 6c 6c 65 64 2c 20 77 65 20 61 6c 72 65 61  called, we alrea
7090: 64 79 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  dy know that the
70a0: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72  .** ORDER BY ter
70b0: 6d 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  m is not an inte
70c0: 67 65 72 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  ger index into t
70d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
70e0: 54 68 61 74 0a 2a 2a 20 63 61 73 65 20 69 73 20  That.** case is 
70f0: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 63  handled by the c
7100: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a  alling routine..
7110: 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  **.** Attempt to
7120: 20 6d 61 74 63 68 20 70 45 20 61 67 61 69 6e 73   match pE agains
7130: 74 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  t result set col
7140: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74  umns in the left
7150: 2d 6d 6f 73 74 0a 2a 2a 20 53 45 4c 45 43 54 20  -most.** SELECT 
7160: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
7170: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f  rn the index i o
7180: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
7190: 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61 73 20 61 6e 20  olumn,.** as an 
71a0: 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68  indication to th
71b0: 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74  e caller that it
71c0: 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20   should sort by 
71d0: 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e  the i-th column.
71e0: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
71f0: 74 20 63 6f 6c 75 6d 6e 20 69 73 20 31 2e 20 20  t column is 1.  
7200: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
7210: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
7220: 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d  ed is the.** sam
7230: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
7240: 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 75 73  that would be us
7250: 65 64 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ed in the SQL st
7260: 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 64 69 63  atement to indic
7270: 61 74 65 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d  ate.** the colum
7280: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  n..**.** If ther
7290: 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2c 20 72  e is no match, r
72a0: 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
72b0: 20 2d 31 20 69 66 20 61 6e 20 65 72 72 6f 72 20   -1 if an error 
72c0: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
72d0: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64  c int resolveOrd
72e0: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
72f0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
7300: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
7310: 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ing context for 
7320: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
7330: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
7340: 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45  ect,   /* The SE
7350: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77  LECT statement w
7360: 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
7370: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
7380: 72 20 2a 70 45 20 20 20 20 20 20 20 20 20 20 20  r *pE           
7390: 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
73a0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f  ORDER BY term */
73b0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
73c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
73d0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
73e0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
73f0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20   /* The columns 
7400: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
7410: 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t */.  NameConte
7420: 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d  xt nc;    /* Nam
7430: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65  e context for re
7440: 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 20 20  solving pE */.  
7450: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
7460: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
7470: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
7480: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7490: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
74a0: 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
74b0: 72 65 73 20 2a 2f 0a 20 20 75 38 20 73 61 76 65  res */.  u8 save
74c0: 64 53 75 70 70 45 72 72 3b 20 20 20 2f 2a 20 53  dSuppErr;   /* S
74d0: 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 64 62  aved value of db
74e0: 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20 2a 2f  ->suppressErr */
74f0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7500: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
7510: 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20  (pE, &i)==0 );. 
7520: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
7530: 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  t->pEList;..  /*
7540: 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d   Resolve all nam
7550: 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  es in the ORDER 
7560: 42 59 20 74 65 72 6d 20 65 78 70 72 65 73 73 69  BY term expressi
7570: 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  on.  */.  memset
7580: 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&nc, 0, sizeof(
7590: 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73  nc));.  nc.pPars
75a0: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e 63  e = pParse;.  nc
75b0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
75c0: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e  ect->pSrc;.  nc.
75d0: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
75e0: 0a 20 20 6e 63 2e 6e 63 46 6c 61 67 73 20 3d 20  .  nc.ncFlags = 
75f0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 6e  NC_AllowAgg;.  n
7600: 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 64 62  c.nErr = 0;.  db
7610: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
7620: 20 73 61 76 65 64 53 75 70 70 45 72 72 20 3d 20   savedSuppErr = 
7630: 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 3b  db->suppressErr;
7640: 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  .  db->suppressE
7650: 72 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  rr = 1;.  rc = s
7660: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
7670: 72 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 3b  rNames(&nc, pE);
7680: 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  .  db->suppressE
7690: 72 72 20 3d 20 73 61 76 65 64 53 75 70 70 45 72  rr = savedSuppEr
76a0: 72 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  r;.  if( rc ) re
76b0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 72  turn 0;..  /* Tr
76c0: 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f  y to match the O
76d0: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
76e0: 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78  on against an ex
76f0: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 69 6e  pression.  ** in
7700: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
7710: 20 20 52 65 74 75 72 6e 20 61 6e 20 31 2d 62 61    Return an 1-ba
7720: 73 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  sed index of the
7730: 20 6d 61 74 63 68 69 6e 67 0a 20 20 2a 2a 20 72   matching.  ** r
7740: 65 73 75 6c 74 2d 73 65 74 20 65 6e 74 72 79 2e  esult-set entry.
7750: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
7760: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
7770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7780: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
7790: 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  re(pEList->a[i].
77a0: 70 45 78 70 72 2c 20 70 45 2c 20 2d 31 29 3c 32  pExpr, pE, -1)<2
77b0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
77c0: 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i+1;.    }.  }.
77d0: 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 6d 61 74 63  .  /* If no matc
77e0: 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 2a 2f 0a  h, return 0. */.
77f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
7800: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
7810: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
7820: 55 50 20 42 59 20 74 65 72 6d 20 6f 75 74 2d 6f  UP BY term out-o
7830: 66 2d 72 61 6e 67 65 20 65 72 72 6f 72 2e 0a 2a  f-range error..*
7840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
7850: 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45  solveOutOfRangeE
7860: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
7870: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
7880: 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f 6e 74  * The error cont
7890: 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20 74  ext into which t
78a0: 6f 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f  o write the erro
78b0: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
78c0: 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a  r *zType,     /*
78d0: 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f   "ORDER" or "GRO
78e0: 55 50 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  UP" */.  int i, 
78f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7900: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 28 31 2d  /* The index (1-
7910: 62 61 73 65 64 29 20 6f 66 20 74 68 65 20 74 65  based) of the te
7920: 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  rm out of range 
7930: 2a 2f 0a 20 20 69 6e 74 20 6d 78 20 20 20 20 20  */.  int mx     
7940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7950: 61 72 67 65 73 74 20 70 65 72 6d 69 73 73 69 62  argest permissib
7960: 6c 65 20 76 61 6c 75 65 20 6f 66 20 69 20 2a 2f  le value of i */
7970: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  .){.  sqlite3Err
7980: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
7990: 20 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72     "%r %s BY ter
79a0: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  m out of range -
79b0: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
79c0: 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
79d0: 25 64 22 2c 20 69 2c 20 7a 54 79 70 65 2c 20 6d  %d", i, zType, m
79e0: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  x);.}../*.** Ana
79f0: 6c 79 7a 65 20 74 68 65 20 4f 52 44 45 52 20 42  lyze the ORDER B
7a00: 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 63 6f  Y clause in a co
7a10: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
7a20: 61 74 65 6d 65 6e 74 2e 20 20 20 4d 6f 64 69 66  atement.   Modif
7a30: 79 0a 2a 2a 20 65 61 63 68 20 74 65 72 6d 20 6f  y.** each term o
7a40: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
7a50: 6c 61 75 73 65 20 69 73 20 61 20 63 6f 6e 73 74  lause is a const
7a60: 61 6e 74 20 69 6e 74 65 67 65 72 20 62 65 74 77  ant integer betw
7a70: 65 65 6e 20 31 0a 2a 2a 20 61 6e 64 20 4e 20 77  een 1.** and N w
7a80: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
7a90: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
7aa0: 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
7ab0: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52  SELECT..**.** OR
7ac0: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
7ad0: 74 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 6e  t are already an
7ae0: 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e   integer between
7af0: 20 31 20 61 6e 64 20 4e 20 61 72 65 0a 2a 2a 20   1 and N are.** 
7b00: 75 6e 6d 6f 64 69 66 69 65 64 2e 20 20 4f 52 44  unmodified.  ORD
7b10: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
7b20: 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 6f 75   are integers ou
7b30: 74 73 69 64 65 20 74 68 65 20 72 61 6e 67 65 20  tside the range 
7b40: 6f 66 0a 2a 2a 20 31 20 74 68 72 6f 75 67 68 20  of.** 1 through 
7b50: 4e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72  N generate an er
7b60: 72 6f 72 2e 20 20 4f 52 44 45 52 20 42 59 20 74  ror.  ORDER BY t
7b70: 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 65 78  erms that are ex
7b80: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
7b90: 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74   matched against
7ba0: 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
7bb0: 65 73 73 69 6f 6e 73 20 6f 66 20 63 6f 6d 70 6f  essions of compo
7bc0: 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 62 65  und SELECT.** be
7bd0: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 74 68 65  ginning with the
7be0: 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   left-most SELEC
7bf0: 54 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 74 6f  T and working to
7c00: 77 61 72 64 20 74 68 65 20 72 69 67 68 74 2e 0a  ward the right..
7c10: 2a 2a 20 41 74 20 74 68 65 20 66 69 72 73 74 20  ** At the first 
7c20: 6d 61 74 63 68 2c 20 74 68 65 20 4f 52 44 45 52  match, the ORDER
7c30: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69   BY expression i
7c40: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
7c50: 74 6f 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65  to.** the intege
7c60: 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e  r column number.
7c70: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
7c80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
7c90: 72 73 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74  rs seen..*/.stat
7ca0: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 43 6f  ic int resolveCo
7cb0: 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a 20  mpoundOrderBy(. 
7cc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7cd0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
7ce0: 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76  g context.  Leav
7cf0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
7d00: 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
7d10: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
7d20: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
7d30: 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  tatement contain
7d40: 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
7d50: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
7d60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
7d70: 65 72 42 79 3b 0a 20 20 45 78 70 72 4c 69 73 74  erBy;.  ExprList
7d80: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69   *pEList;.  sqli
7d90: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d  te3 *db;.  int m
7da0: 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20  oreToDo = 1;..  
7db0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c 65  pOrderBy = pSele
7dc0: 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ct->pOrderBy;.  
7dd0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
7de0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62  ) return 0;.  db
7df0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
7e00: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
7e10: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65  LUMN.  if( pOrde
7e20: 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  rBy->nExpr>db->a
7e30: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
7e40: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
7e50: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7e60: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
7e70: 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44  any terms in ORD
7e80: 45 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  ER BY clause");.
7e90: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7ea0: 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
7eb0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
7ec0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7ed0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
7ee0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
7ef0: 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 20 3d  pSelect->pNext =
7f00: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
7f10: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
7f20: 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 50 72      pSelect->pPr
7f30: 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 53 65  ior->pNext = pSe
7f40: 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63  lect;.    pSelec
7f50: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
7f60: 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ior;.  }.  while
7f70: 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72  ( pSelect && mor
7f80: 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 73 74 72  eToDo ){.    str
7f90: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
7fa0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 6d 6f  m *pItem;.    mo
7fb0: 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20  reToDo = 0;.    
7fc0: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
7fd0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73  ->pEList;.    as
7fe0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
7ff0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  );.    for(i=0, 
8000: 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
8010: 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  a; i<pOrderBy->n
8020: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
8030: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
8040: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Col = -1;.      
8050: 45 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b  Expr *pE, *pDup;
8060: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
8070: 2d 3e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  ->done ) continu
8080: 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71  e;.      pE = sq
8090: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
80a0: 6c 61 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  late(pItem->pExp
80b0: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  r);.      if( sq
80c0: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
80d0: 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b  er(pE, &iCol) ){
80e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
80f0: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
8100: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
8110: 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f          resolveO
8120: 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70  utOfRangeError(p
8130: 50 61 72 73 65 2c 20 22 4f 52 44 45 52 22 2c 20  Parse, "ORDER", 
8140: 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  i+1, pEList->nEx
8150: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  pr);.          r
8160: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
8170: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
8180: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72          iCol = r
8190: 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50 61  esolveAsName(pPa
81a0: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 45 29  rse, pEList, pE)
81b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
81c0: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ol==0 ){.       
81d0: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
81e0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 2c  3ExprDup(db, pE,
81f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
8200: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
8210: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
8220: 20 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29      assert(pDup)
8230: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ;.            iC
8240: 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 4f 72 64 65  ol = resolveOrde
8250: 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73  rByTermToExprLis
8260: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
8270: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
8280: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8290: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
82a0: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
82b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
82c0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
82d0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
82e0: 6e 76 65 72 74 20 74 68 65 20 4f 52 44 45 52 20  nvert the ORDER 
82f0: 42 59 20 74 65 72 6d 20 69 6e 74 6f 20 61 6e 20  BY term into an 
8300: 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e  integer column n
8310: 75 6d 62 65 72 20 69 43 6f 6c 2c 0a 20 20 20 20  umber iCol,.    
8320: 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 63 61      ** taking ca
8330: 72 65 20 74 6f 20 70 72 65 73 65 72 76 65 20 74  re to preserve t
8340: 68 65 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  he COLLATE claus
8350: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a  e if it exists *
8360: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
8370: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
8380: 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
8390: 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
83a0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
83b0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
83c0: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
83d0: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
83e0: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
83f0: 65 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  e = iCol;.      
8400: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 45 78    if( pItem->pEx
8410: 70 72 3d 3d 70 45 20 29 7b 0a 20 20 20 20 20 20  pr==pE ){.      
8420: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
8430: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
8440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8450: 20 20 45 78 70 72 20 2a 70 50 61 72 65 6e 74 20    Expr *pParent 
8460: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
8470: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
8480: 28 20 70 50 61 72 65 6e 74 2d 3e 6f 70 3d 3d 54  ( pParent->op==T
8490: 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20  K_COLLATE );.   
84a0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50         while( pP
84b0: 61 72 65 6e 74 2d 3e 70 4c 65 66 74 2d 3e 6f 70  arent->pLeft->op
84c0: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 20 70  ==TK_COLLATE ) p
84d0: 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
84e0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
84f0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
8500: 6e 74 2d 3e 70 4c 65 66 74 3d 3d 70 45 20 29 3b  nt->pLeft==pE );
8510: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 65  .          pPare
8520: 6e 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77  nt->pLeft = pNew
8530: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8540: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8550: 65 6c 65 74 65 28 64 62 2c 20 70 45 29 3b 0a 20  elete(db, pE);. 
8560: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
8570: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
8580: 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20  (u16)iCol;.     
8590: 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d     pItem->done =
85a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
85b0: 0a 20 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44  .        moreToD
85c0: 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  o = 1;.      }. 
85d0: 20 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74     }.    pSelect
85e0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78   = pSelect->pNex
85f0: 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  t;.  }.  for(i=0
8600: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
8610: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  xpr; i++){.    i
8620: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69  f( pOrderBy->a[i
8630: 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  ].done==0 ){.   
8640: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8650: 73 67 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f  sg(pParse, "%r O
8660: 52 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65  RDER BY term doe
8670: 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20  s not match any 
8680: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63  ".            "c
8690: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
86a0: 75 6c 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a  ult set", i+1);.
86b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
86c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
86d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
86e0: 68 65 63 6b 20 65 76 65 72 79 20 74 65 72 6d 20  heck every term 
86f0: 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
8700: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
8710: 73 65 20 70 4f 72 64 65 72 42 79 20 6f 66 0a 2a  se pOrderBy of.*
8720: 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  * the SELECT sta
8730: 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e 20  tement pSelect. 
8740: 20 49 66 20 61 6e 79 20 74 65 72 6d 20 69 73 20   If any term is 
8750: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a  reference to a.*
8760: 2a 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  * result set exp
8770: 72 65 73 73 69 6f 6e 20 28 61 73 20 64 65 74 65  ression (as dete
8780: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 45 78  rmined by the Ex
8790: 70 72 4c 69 73 74 2e 61 2e 75 2e 78 2e 69 4f 72  prList.a.u.x.iOr
87a0: 64 65 72 42 79 43 6f 6c 0a 2a 2a 20 66 69 65 6c  derByCol.** fiel
87b0: 64 29 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20  d) then convert 
87c0: 74 68 61 74 20 74 65 72 6d 20 69 6e 74 6f 20 61  that term into a
87d0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 72   copy of the cor
87e0: 72 65 73 70 6f 6e 64 69 6e 67 20 72 65 73 75 6c  responding resul
87f0: 74 20 73 65 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e  t set.** column.
8800: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 65 72  .**.** If any er
8810: 72 6f 72 73 20 61 72 65 20 64 65 74 65 63 74 65  rors are detecte
8820: 64 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20  d, add an error 
8830: 6d 65 73 73 61 67 65 20 74 6f 20 70 50 61 72 73  message to pPars
8840: 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  e and.** return 
8850: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
8860: 6e 20 7a 65 72 6f 20 69 66 20 6e 6f 20 65 72 72  n zero if no err
8870: 6f 72 73 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2f  ors are seen..*/
8880: 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f  .int sqlite3Reso
8890: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
88a0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
88b0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
88c0: 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65  ing context.  Le
88d0: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
88e0: 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  es here */.  Sel
88f0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
8900: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
8910: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61   statement conta
8920: 69 6e 69 6e 67 20 74 68 65 20 63 6c 61 75 73 65  ining the clause
8930: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8940: 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54  pOrderBy,   /* T
8950: 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  he ORDER BY or G
8960: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
8970: 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a  o be processed *
8980: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
8990: 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 22 4f 52  zType     /* "OR
89a0: 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20  DER" or "GROUP" 
89b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
89c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
89d0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70  Parse->db;.  Exp
89e0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
89f0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
8a00: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20  _item *pItem;.. 
8a10: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
8a20: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
8a30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
8a40: 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c  eturn 0;.#if SQL
8a50: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
8a60: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e   if( pOrderBy->n
8a70: 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
8a80: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
8a90: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
8aa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8ab0: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
8ac0: 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c 61  rms in %s BY cla
8ad0: 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20  use", zType);.  
8ae0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
8af0: 23 65 6e 64 69 66 0a 20 20 70 45 4c 69 73 74 20  #endif.  pEList 
8b00: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
8b10: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c  t;.  assert( pEL
8b20: 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 73 71  ist!=0 );  /* sq
8b30: 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 29  lite3SelectNew()
8b40: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73   guarantees this
8b50: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
8b60: 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
8b70: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
8b80: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
8b90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65  +){.    if( pIte
8ba0: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
8bb0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ol ){.      if( 
8bc0: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
8bd0: 72 42 79 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  rByCol>pEList->n
8be0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
8bf0: 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67  resolveOutOfRang
8c00: 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a  eError(pParse, z
8c10: 54 79 70 65 2c 20 69 2b 31 2c 20 70 45 4c 69 73  Type, i+1, pELis
8c20: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
8c30: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8c40: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 6f 6c     }.      resol
8c50: 76 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  veAlias(pParse, 
8c60: 70 45 4c 69 73 74 2c 20 70 49 74 65 6d 2d 3e 75  pEList, pItem->u
8c70: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31  .x.iOrderByCol-1
8c80: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 0a  , pItem->pExpr,.
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ca0: 20 20 20 7a 54 79 70 65 2c 30 29 3b 0a 20 20 20     zType,0);.   
8cb0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8cc0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f 72 64  0;.}../*.** pOrd
8cd0: 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52  erBy is an ORDER
8ce0: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
8cf0: 63 6c 61 75 73 65 20 69 6e 20 53 45 4c 45 43 54  clause in SELECT
8d00: 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65   statement pSele
8d10: 63 74 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d 65 20  ct..** The Name 
8d20: 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53  context of the S
8d30: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8d40: 69 73 20 70 4e 43 2e 20 20 7a 54 79 70 65 20 69  is pNC.  zType i
8d50: 73 20 65 69 74 68 65 72 0a 2a 2a 20 22 4f 52 44  s either.** "ORD
8d60: 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20 64  ER" or "GROUP" d
8d70: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63  epending on whic
8d80: 68 20 74 79 70 65 20 6f 66 20 63 6c 61 75 73 65  h type of clause
8d90: 20 70 4f 72 64 65 72 42 79 20 69 73 2e 0a 2a 2a   pOrderBy is..**
8da0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8db0: 20 72 65 73 6f 6c 76 65 73 20 65 61 63 68 20 74   resolves each t
8dc0: 65 72 6d 20 6f 66 20 74 68 65 20 63 6c 61 75 73  erm of the claus
8dd0: 65 20 69 6e 74 6f 20 61 6e 20 65 78 70 72 65 73  e into an expres
8de0: 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68 65 20  sion..** If the 
8df0: 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73  order-by term is
8e00: 20 61 6e 20 69 6e 74 65 67 65 72 20 49 20 62 65   an integer I be
8e10: 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 28 77  tween 1 and N (w
8e20: 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a 2a 2a  here N is the.**
8e30: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
8e40: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
8e50: 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45   set of the SELE
8e60: 43 54 29 20 74 68 65 6e 20 74 68 65 20 65 78 70  CT) then the exp
8e70: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ression.** in th
8e80: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20  e resolution is 
8e90: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 49 2d  a copy of the I-
8ea0: 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  th result-set ex
8eb0: 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 0a 2a 2a  pression.  If.**
8ec0: 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65   the order-by te
8ed0: 72 6d 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66  rm is an identif
8ee0: 69 65 72 20 74 68 61 74 20 63 6f 72 72 65 73 70  ier that corresp
8ef0: 6f 6e 64 73 20 74 6f 20 74 68 65 20 41 53 2d 6e  onds to the AS-n
8f00: 61 6d 65 20 6f 66 0a 2a 2a 20 61 20 72 65 73 75  ame of.** a resu
8f10: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
8f20: 6e 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d  n, then the term
8f30: 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 61 20 63   resolves to a c
8f40: 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65  opy of the.** re
8f50: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
8f60: 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ion.  Otherwise,
8f70: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
8f80: 69 73 20 72 65 73 6f 6c 76 65 64 20 69 6e 0a 2a  is resolved in.*
8f90: 2a 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20  * the usual way 
8fa0: 2d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52  - using sqlite3R
8fb0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
8fc0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
8fd0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
8fe0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
8ff0: 72 73 2e 20 20 49 66 20 65 72 72 6f 72 73 20 6f  rs.  If errors o
9000: 63 63 75 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e  ccur, then.** an
9010: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
9020: 6f 72 20 6d 65 73 73 61 67 65 20 6d 69 67 68 74  or message might
9030: 20 62 65 20 6c 65 66 74 20 69 6e 20 70 50 61 72   be left in pPar
9040: 73 65 2e 20 20 28 4f 4f 4d 20 65 72 72 6f 72 73  se.  (OOM errors
9050: 0a 2a 2a 20 65 78 63 65 70 74 65 64 2e 29 0a 2a  .** excepted.).*
9060: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
9070: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
9080: 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  (.  NameContext 
9090: 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pNC,     /* The
90a0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66   name context of
90b0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
90c0: 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63  ement */.  Selec
90d0: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20  t *pSelect,     
90e0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
90f0: 74 61 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67  tatement holding
9100: 20 70 4f 72 64 65 72 42 79 20 2a 2f 0a 20 20 45   pOrderBy */.  E
9110: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
9120: 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52  y,   /* An ORDER
9130: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
9140: 63 6c 61 75 73 65 20 74 6f 20 72 65 73 6f 6c 76  clause to resolv
9150: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
9160: 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20  r *zType     /* 
9170: 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f  Either "ORDER" o
9180: 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70  r "GROUP", as ap
9190: 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a  propriate */.){.
91a0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
91d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  s */.  int iCol;
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91f0: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
9200: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75  number */.  stru
9210: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9220: 20 2a 70 49 74 65 6d 3b 20 20 20 2f 2a 20 41 20   *pItem;   /* A 
9230: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
9240: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
9250: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9280: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73  xt */.  int nRes
9290: 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ult;            
92a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
92b0: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65   of terms in the
92c0: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a   result set */..
92d0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
92e0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
92f0: 6e 52 65 73 75 6c 74 20 3d 20 70 53 65 6c 65 63  nResult = pSelec
9300: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
9310: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
9320: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28  ->pParse;.  for(
9330: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
9340: 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72  rBy->a; i<pOrder
9350: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
9360: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
9370: 70 72 20 2a 70 45 20 3d 20 70 49 74 65 6d 2d 3e  pr *pE = pItem->
9380: 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20  pExpr;.    Expr 
9390: 2a 70 45 32 20 3d 20 73 71 6c 69 74 65 33 45 78  *pE2 = sqlite3Ex
93a0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
93b0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65  );.    if( zType
93c0: 5b 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20  [0]!='G' ){.    
93d0: 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65    iCol = resolve
93e0: 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  AsName(pParse, p
93f0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20  Select->pEList, 
9400: 70 45 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pE2);.      if( 
9410: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
9420: 20 20 2f 2a 20 49 66 20 61 6e 20 41 53 2d 6e 61    /* If an AS-na
9430: 6d 65 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e  me match is foun
9440: 64 2c 20 6d 61 72 6b 20 74 68 69 73 20 4f 52 44  d, mark this ORD
9450: 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 61 73 20  ER BY column as 
9460: 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  being.        **
9470: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69   a copy of the i
9480: 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73 65  Col-th result-se
9490: 74 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 73  t column.  The s
94a0: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74  ubsequent call t
94b0: 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c  o.        ** sql
94c0: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
94d0: 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63  GroupBy() will c
94e0: 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65  onvert the expre
94f0: 73 73 69 6f 6e 20 74 6f 20 61 0a 20 20 20 20 20  ssion to a.     
9500: 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
9510: 65 20 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74  e iCol-th result
9520: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e  -set expression.
9530: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 74 65   */.        pIte
9540: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
9550: 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a  ol = (u16)iCol;.
9560: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
9590: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32  xprIsInteger(pE2
95a0: 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
95b0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
95c0: 59 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74  Y term is an int
95d0: 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e 20 20  eger constant.  
95e0: 41 67 61 69 6e 2c 20 73 65 74 20 74 68 65 20 63  Again, set the c
95f0: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 6e  olumn.      ** n
9600: 75 6d 62 65 72 20 73 6f 20 74 68 61 74 20 73 71  umber so that sq
9610: 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
9620: 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20  rGroupBy() will 
9630: 63 6f 6e 76 65 72 74 20 74 68 65 0a 20 20 20 20  convert the.    
9640: 20 20 2a 2a 20 6f 72 64 65 72 2d 62 79 20 74 65    ** order-by te
9650: 72 6d 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20  rm to a copy of 
9660: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65  the result-set e
9670: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
9680: 20 20 20 69 66 28 20 69 43 6f 6c 3c 31 20 7c 7c     if( iCol<1 ||
9690: 20 69 43 6f 6c 3e 30 78 66 66 66 66 20 29 7b 0a   iCol>0xffff ){.
96a0: 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f          resolveO
96b0: 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70  utOfRangeError(p
96c0: 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b  Parse, zType, i+
96d0: 31 2c 20 6e 52 65 73 75 6c 74 29 3b 0a 20 20 20  1, nResult);.   
96e0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
96f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
9700: 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
9710: 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b  Col = (u16)iCol;
9720: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
9730: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
9740: 74 68 65 72 77 69 73 65 2c 20 74 72 65 61 74 20  therwise, treat 
9750: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
9760: 6d 20 61 73 20 61 6e 20 6f 72 64 69 6e 61 72 79  m as an ordinary
9770: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
9780: 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f     pItem->u.x.iO
9790: 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20  rderByCol = 0;. 
97a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
97b0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70  solveExprNames(p
97c0: 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  NC, pE) ){.     
97d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
97e0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
97f0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
9800: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
9810: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
9820: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70  xprCompare(pE, p
9830: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
9840: 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31 29 3d  a[j].pExpr, -1)=
9850: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =0 ){.        pI
9860: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
9870: 79 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20 20  yCol = j+1;.    
9880: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9890: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52 65  return sqlite3Re
98a0: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
98b0: 79 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  y(pParse, pSelec
98c0: 74 2c 20 70 4f 72 64 65 72 42 79 2c 20 7a 54 79  t, pOrderBy, zTy
98d0: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pe);.}../*.** Re
98e0: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
98f0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9900: 65 6e 74 20 70 20 61 6e 64 20 61 6c 6c 20 6f 66  ent p and all of
9910: 20 69 74 73 20 64 65 73 63 65 6e 64 61 6e 74 73   its descendants
9920: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9930: 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65  resolveSelectSte
9940: 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  p(Walker *pWalke
9950: 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  r, Select *p){. 
9960: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
9970: 75 74 65 72 4e 43 3b 20 20 2f 2a 20 43 6f 6e 74  uterNC;  /* Cont
9980: 65 78 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ext that contain
9990: 73 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  s this SELECT */
99a0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
99b0: 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  NC;        /* Na
99c0: 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68  me context of th
99d0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69  is SELECT */.  i
99e0: 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 3b 20 20  nt isCompound;  
99f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
9a00: 66 20 70 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e  f p is a compoun
9a10: 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e  d select */.  in
9a20: 74 20 6e 43 6f 6d 70 6f 75 6e 64 3b 20 20 20 20  t nCompound;    
9a30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9a40: 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 74 65 72 6d  of compound term
9a50: 73 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20 66  s processed so f
9a60: 61 72 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  ar */.  Parse *p
9a70: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
9a80: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
9a90: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
9ac0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9ad0: 47 72 6f 75 70 42 79 3b 20 20 20 20 20 2f 2a 20  GroupBy;     /* 
9ae0: 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  The GROUP BY cla
9af0: 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  use */.  Select 
9b00: 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20 20  *pLeftmost;     
9b10: 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 6f 66   /* Left-most of
9b20: 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d   SELECT of a com
9b30: 70 6f 75 6e 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pound */.  sqlit
9b40: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
9b50: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
9b60: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 0a  onnection */.  .
9b70: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
9b80: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  );.  if( p->selF
9b90: 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
9ba0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ed ){.    return
9bb0: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
9bc0: 20 20 70 4f 75 74 65 72 4e 43 20 3d 20 70 57 61    pOuterNC = pWa
9bd0: 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 70  lker->u.pNC;.  p
9be0: 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d  Parse = pWalker-
9bf0: 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20  >pParse;.  db = 
9c00: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f  pParse->db;..  /
9c10: 2a 20 4e 6f 72 6d 61 6c 6c 79 20 73 71 6c 69 74  * Normally sqlit
9c20: 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
9c30: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
9c40: 66 69 72 73 74 20 61 6e 64 20 77 69 6c 6c 20 68  first and will h
9c50: 61 76 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79  ave.  ** already
9c60: 20 65 78 70 61 6e 64 65 64 20 74 68 69 73 20 53   expanded this S
9c70: 45 4c 45 43 54 2e 20 20 48 6f 77 65 76 65 72 2c  ELECT.  However,
9c80: 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75   if this is a su
9c90: 62 71 75 65 72 79 20 77 69 74 68 69 6e 0a 20 20  bquery within.  
9ca0: 2a 2a 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ** an expression
9cb0: 2c 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  , sqlite3Resolve
9cc0: 45 78 70 72 4e 61 6d 65 73 28 29 20 77 69 6c 6c  ExprNames() will
9cd0: 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 6f   be called witho
9ce0: 75 74 20 61 0a 20 20 2a 2a 20 70 72 69 6f 72 20  ut a.  ** prior 
9cf0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53  call to sqlite3S
9d00: 65 6c 65 63 74 45 78 70 61 6e 64 28 29 2e 20 20  electExpand().  
9d10: 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e  When that happen
9d20: 73 2c 20 6c 65 74 0a 20 20 2a 2a 20 73 71 6c 69  s, let.  ** sqli
9d30: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 29 20  te3SelectPrep() 
9d40: 64 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 70 72  do all of the pr
9d50: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69  ocessing for thi
9d60: 73 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2a 20 73  s SELECT..  ** s
9d70: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
9d80: 28 29 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 62  () will invoke b
9d90: 6f 74 68 20 73 71 6c 69 74 65 33 53 65 6c 65 63  oth sqlite3Selec
9da0: 74 45 78 70 61 6e 64 28 29 20 61 6e 64 0a 20 20  tExpand() and.  
9db0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9dc0: 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f  in the correct o
9dd0: 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rder..  */.  if(
9de0: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
9df0: 53 46 5f 45 78 70 61 6e 64 65 64 29 3d 3d 30 20  SF_Expanded)==0 
9e00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  ){.    sqlite3Se
9e10: 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c  lectPrep(pParse,
9e20: 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20   p, pOuterNC);. 
9e30: 20 20 20 72 65 74 75 72 6e 20 28 70 50 61 72 73     return (pPars
9e40: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
9e50: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20 57  allocFailed) ? W
9e60: 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f 50  RC_Abort : WRC_P
9e70: 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 69 73 43  rune;.  }..  isC
9e80: 6f 6d 70 6f 75 6e 64 20 3d 20 70 2d 3e 70 50 72  ompound = p->pPr
9e90: 69 6f 72 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70 6f  ior!=0;.  nCompo
9ea0: 75 6e 64 20 3d 20 30 3b 0a 20 20 70 4c 65 66 74  und = 0;.  pLeft
9eb0: 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 77 68 69 6c  most = p;.  whil
9ec0: 65 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65  e( p ){.    asse
9ed0: 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  rt( (p->selFlags
9ee0: 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21   & SF_Expanded)!
9ef0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
9f00: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
9f10: 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 3d 3d 30   SF_Resolved)==0
9f20: 20 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c   );.    p->selFl
9f30: 61 67 73 20 7c 3d 20 53 46 5f 52 65 73 6f 6c 76  ags |= SF_Resolv
9f40: 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f  ed;..    /* Reso
9f50: 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69  lve the expressi
9f60: 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49 54  ons in the LIMIT
9f70: 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75   and OFFSET clau
9f80: 73 65 73 2e 20 54 68 65 73 65 0a 20 20 20 20 2a  ses. These.    *
9f90: 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  * are not allowe
9fa0: 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e  d to refer to an
9fb0: 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73  y names, so pass
9fc0: 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f   an empty NameCo
9fd0: 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ntext..    */.  
9fe0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
9ff0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
a000: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
a010: 20 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66 28   pParse;.    if(
a020: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
a030: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
a040: 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20  ->pLimit) ||.   
a050: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f       sqlite3Reso
a060: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
a070: 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29  C, p->pOffset) )
a080: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
a090: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
a0a0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53  .    /* If the S
a0b0: 46 5f 43 6f 6e 76 65 72 74 65 64 20 66 6c 61 67  F_Converted flag
a0c0: 73 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  s is set, then t
a0d0: 68 69 73 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  his Select objec
a0e0: 74 20 77 61 73 0a 20 20 20 20 2a 2a 20 77 61 73  t was.    ** was
a0f0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
a100: 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
a110: 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
a120: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  ) function..    
a130: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
a140: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
a150: 75 73 65 20 28 70 2d 3e 70 4f 72 64 65 72 42 79  use (p->pOrderBy
a160: 29 20 73 68 6f 75 6c 64 20 62 65 20 72 65 73 6f  ) should be reso
a170: 6c 76 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 69  lved.    ** as i
a180: 66 20 69 74 20 77 65 72 65 20 70 61 72 74 20 6f  f it were part o
a190: 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2c  f the sub-query,
a1a0: 20 6e 6f 74 20 74 68 65 20 70 61 72 65 6e 74 2e   not the parent.
a1b0: 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 20 20   This block.    
a1c0: 2a 2a 20 6d 6f 76 65 73 20 74 68 65 20 70 4f 72  ** moves the pOr
a1d0: 64 65 72 42 79 20 64 6f 77 6e 20 74 6f 20 74 68  derBy down to th
a1e0: 65 20 73 75 62 2d 71 75 65 72 79 2e 20 49 74 20  e sub-query. It 
a1f0: 77 69 6c 6c 20 62 65 20 6d 6f 76 65 64 20 62 61  will be moved ba
a200: 63 6b 0a 20 20 20 20 2a 2a 20 61 66 74 65 72 20  ck.    ** after 
a210: 74 68 65 20 6e 61 6d 65 73 20 68 61 76 65 20 62  the names have b
a220: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 2a  een resolved.  *
a230: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  /.    if( p->sel
a240: 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
a250: 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65  rted ){.      Se
a260: 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e  lect *pSub = p->
a270: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
a280: 63 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ct;.      assert
a290: 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3d  ( p->pSrc->nSrc=
a2a0: 3d 31 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42  =1 && p->pOrderB
a2b0: 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
a2c0: 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  t( pSub->pPrior 
a2d0: 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
a2e0: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  y==0 );.      pS
a2f0: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  ub->pOrderBy = p
a300: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
a310: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
a320: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
a330: 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 72  /* Recursively r
a340: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
a350: 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 0a 20  all subqueries. 
a360: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
a370: 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
a380: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
a390: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
a3a0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
a3b0: 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
a3c0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
a3d0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
a3e0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
a3f0: 43 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  C;         /* Us
a400: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 6e 61  ed to iterate na
a410: 6d 65 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  me contexts */. 
a420: 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20         int nRef 
a430: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a440: 20 2f 2a 20 52 65 66 63 6f 75 6e 74 20 66 6f 72   /* Refcount for
a450: 20 70 4f 75 74 65 72 4e 43 20 61 6e 64 20 6f 75   pOuterNC and ou
a460: 74 65 72 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ter contexts */.
a470: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a480: 61 72 20 2a 7a 53 61 76 65 64 43 6f 6e 74 65 78  ar *zSavedContex
a490: 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
a4a0: 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 20  hContext;..     
a4b0: 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20     /* Count the 
a4c0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
a4d0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 4f  references to pO
a4e0: 75 74 65 72 4e 43 20 61 6e 64 20 61 6c 6c 20 6f  uterNC and all o
a4f0: 66 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  f its.        **
a500: 20 70 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 73   parent contexts
a510: 2e 20 41 66 74 65 72 20 72 65 73 6f 6c 76 69 6e  . After resolvin
a520: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
a530: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 0a 20  expressions in. 
a540: 20 20 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d         ** pItem-
a550: 3e 70 53 65 6c 65 63 74 2c 20 63 68 65 63 6b 20  >pSelect, check 
a560: 69 66 20 74 68 69 73 20 76 61 6c 75 65 20 68 61  if this value ha
a570: 73 20 63 68 61 6e 67 65 64 2e 20 49 66 20 73 6f  s changed. If so
a580: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
a590: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
a5a0: 6e 74 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  nt pItem->pSelec
a5b0: 74 20 6d 75 73 74 20 62 65 20 63 6f 72 72 65 6c  t must be correl
a5c0: 61 74 65 64 2e 20 53 65 74 20 74 68 65 0a 20 20  ated. Set the.  
a5d0: 20 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e        ** pItem->
a5e0: 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
a5f0: 66 6c 61 67 20 69 66 20 74 68 69 73 20 69 73 20  flag if this is 
a600: 74 68 65 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  the case. */.   
a610: 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75       for(pNC=pOu
a620: 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d  terNC; pNC; pNC=
a630: 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66  pNC->pNext) nRef
a640: 20 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 0a   += pNC->nRef;..
a650: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
a660: 6d 2d 3e 7a 4e 61 6d 65 20 29 20 70 50 61 72 73  m->zName ) pPars
a670: 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
a680: 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
a690: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a6a0: 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
a6b0: 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
a6c0: 3e 70 53 65 6c 65 63 74 2c 20 70 4f 75 74 65 72  >pSelect, pOuter
a6d0: 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  NC);.        pPa
a6e0: 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
a6f0: 74 20 3d 20 7a 53 61 76 65 64 43 6f 6e 74 65 78  t = zSavedContex
a700: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
a710: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
a720: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a730: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
a740: 72 74 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72  rt;..        for
a750: 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70  (pNC=pOuterNC; p
a760: 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65  NC; pNC=pNC->pNe
a770: 78 74 29 20 6e 52 65 66 20 2d 3d 20 70 4e 43 2d  xt) nRef -= pNC-
a780: 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 61  >nRef;.        a
a790: 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
a7a0: 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
a7b0: 20 26 26 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20   && nRef<=0 );. 
a7c0: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67         pItem->fg
a7d0: 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20  .isCorrelated = 
a7e0: 28 6e 52 65 66 21 3d 30 29 3b 0a 20 20 20 20 20  (nRef!=0);.     
a7f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
a800: 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  /* Set up the lo
a810: 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
a820: 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69   to pass to sqli
a830: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
a840: 6d 65 73 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  mes() to.    ** 
a850: 72 65 73 6f 6c 76 65 20 74 68 65 20 72 65 73 75  resolve the resu
a860: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
a870: 6e 20 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20  n list..    */. 
a880: 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d     sNC.ncFlags =
a890: 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20   NC_AllowAgg;.  
a8a0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
a8b0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 73 4e   p->pSrc;.    sN
a8c0: 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72  C.pNext = pOuter
a8d0: 4e 43 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  NC;.  .    /* Re
a8e0: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
a8f0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a  he result set. *
a900: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
a910: 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74  3ResolveExprList
a920: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
a930: 45 4c 69 73 74 29 20 29 20 72 65 74 75 72 6e 20  EList) ) return 
a940: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 0a 20 20  WRC_Abort;.  .  
a950: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
a960: 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  e no aggregate f
a970: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  unctions in the 
a980: 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20  result-set, and 
a990: 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 20  no GROUP BY .   
a9a0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   ** expression, 
a9b0: 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67  do not allow agg
a9c0: 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f  regates in any o
a9d0: 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72  f the other expr
a9e0: 65 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a  essions..    */.
a9f0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
aa00: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
aa10: 67 72 65 67 61 74 65 29 3d 3d 30 20 29 3b 0a 20  gregate)==0 );. 
aa20: 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
aa30: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69  >pGroupBy;.    i
aa40: 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 28  f( pGroupBy || (
aa50: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 20 4e 43  sNC.ncFlags & NC
aa60: 5f 48 61 73 41 67 67 29 21 3d 30 20 29 7b 0a 20  _HasAgg)!=0 ){. 
aa70: 20 20 20 20 20 61 73 73 65 72 74 28 20 4e 43 5f       assert( NC_
aa80: 4d 69 6e 4d 61 78 41 67 67 3d 3d 53 46 5f 4d 69  MinMaxAgg==SF_Mi
aa90: 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 20 20 20  nMaxAgg );.     
aaa0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
aab0: 53 46 5f 41 67 67 72 65 67 61 74 65 20 7c 20 28  SF_Aggregate | (
aac0: 73 4e 43 2e 6e 63 46 6c 61 67 73 26 4e 43 5f 4d  sNC.ncFlags&NC_M
aad0: 69 6e 4d 61 78 41 67 67 29 3b 0a 20 20 20 20 7d  inMaxAgg);.    }
aae0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 4e 43 2e  else{.      sNC.
aaf0: 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41  ncFlags &= ~NC_A
ab00: 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 7d 0a 20  llowAgg;.    }. 
ab10: 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 48 41   .    /* If a HA
ab20: 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70  VING clause is p
ab30: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
ab40: 72 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f  re must be a GRO
ab50: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
ab60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
ab70: 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f  pHaving && !pGro
ab80: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 73 71  upBy ){.      sq
ab90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
aba0: 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42  arse, "a GROUP B
abb0: 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  Y clause is requ
abc0: 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49  ired before HAVI
abd0: 4e 47 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  NG");.      retu
abe0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
abf0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64    }.  .    /* Ad
ac00: 64 20 74 68 65 20 6f 75 74 70 75 74 20 63 6f 6c  d the output col
ac10: 75 6d 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20  umn list to the 
ac20: 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66  name-context bef
ac30: 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a  ore parsing the.
ac40: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70      ** other exp
ac50: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
ac60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
ac70: 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  . This is so tha
ac80: 74 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73  t.    ** express
ac90: 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
aca0: 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20  E clause (etc.) 
acb0: 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70  can refer to exp
acc0: 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 20 20  ressions by.    
acd0: 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68  ** aliases in th
ace0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
acf0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4d 69 6e 6f    **.    ** Mino
ad00: 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73  r point: If this
ad10: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
ad20: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
ad30: 6e 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  n will be.    **
ad40: 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f   re-evaluated fo
ad50: 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65  r each reference
ad60: 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
ad70: 20 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20     sNC.pEList = 
ad80: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  p->pEList;.    i
ad90: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
ada0: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
adb0: 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 20 72   p->pHaving) ) r
adc0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
add0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
ade0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
adf0: 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65  (&sNC, p->pWhere
ae00: 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
ae10: 62 6f 72 74 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  bort;..    /* Re
ae20: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
ae30: 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63  able-valued-func
ae40: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
ae50: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
ae60: 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20  <p->pSrc->nSrc; 
ae70: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
ae80: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
ae90: 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72  *pItem = &p->pSr
aea0: 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  c->a[i];.      i
aeb0: 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  f( pItem->fg.isT
aec0: 61 62 46 75 6e 63 0a 20 20 20 20 20 20 20 26 26  abFunc.       &&
aed0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
aee0: 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e  xprListNames(&sN
aef0: 43 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  C, pItem->u1.pFu
af00: 6e 63 41 72 67 29 20 0a 20 20 20 20 20 20 29 7b  ncArg) .      ){
af10: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
af20: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
af30: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
af40: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   The ORDER BY an
af50: 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  d GROUP BY claus
af60: 65 73 20 6d 61 79 20 6e 6f 74 20 72 65 66 65 72  es may not refer
af70: 20 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20 20 20   to terms in.   
af80: 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 69 65   ** outer querie
af90: 73 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e  s .    */.    sN
afa0: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  C.pNext = 0;.   
afb0: 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
afc0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 0a 20 20  NC_AllowAgg;..  
afd0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
afe0: 61 20 63 6f 6e 76 65 72 74 65 64 20 63 6f 6d 70  a converted comp
aff0: 6f 75 6e 64 20 71 75 65 72 79 2c 20 6d 6f 76 65  ound query, move
b000: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b010: 61 75 73 65 20 66 72 6f 6d 20 0a 20 20 20 20 2a  ause from .    *
b020: 2a 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  * the sub-query 
b030: 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65  back to the pare
b040: 6e 74 20 71 75 65 72 79 2e 20 41 74 20 74 68 69  nt query. At thi
b050: 73 20 70 6f 69 6e 74 20 65 61 63 68 20 74 65 72  s point each ter
b060: 6d 0a 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20  m.    ** within 
b070: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
b080: 75 73 65 20 68 61 73 20 62 65 65 6e 20 74 72 61  use has been tra
b090: 6e 73 66 6f 72 6d 65 64 20 74 6f 20 61 6e 20 69  nsformed to an i
b0a0: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 20 20  nteger value..  
b0b0: 20 20 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67    ** These integ
b0c0: 65 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6c  ers will be repl
b0d0: 61 63 65 64 20 62 79 20 63 6f 70 69 65 73 20 6f  aced by copies o
b0e0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
b0f0: 69 6e 67 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  ing result.    *
b100: 2a 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  * set expression
b110: 73 20 62 79 20 74 68 65 20 63 61 6c 6c 20 74 6f  s by the call to
b120: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
b130: 75 70 42 79 28 29 20 62 65 6c 6f 77 2e 20 20 2a  upBy() below.  *
b140: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  /.    if( p->sel
b150: 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
b160: 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65  rted ){.      Se
b170: 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e  lect *pSub = p->
b180: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
b190: 63 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  ct;.      p->pOr
b1a0: 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
b1b0: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
b1c0: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
b1d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b1e0: 50 72 6f 63 65 73 73 20 74 68 65 20 4f 52 44 45  Process the ORDE
b1f0: 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20  R BY clause for 
b200: 73 69 6e 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54  singleton SELECT
b210: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
b220: 20 2a 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   ** The ORDER BY
b230: 20 63 6c 61 75 73 65 20 66 6f 72 20 63 6f 6d 70   clause for comp
b240: 6f 75 6e 64 73 20 53 45 4c 45 43 54 20 73 74 61  ounds SELECT sta
b250: 74 65 6d 65 6e 74 73 20 69 73 20 68 61 6e 64 6c  tements is handl
b260: 65 64 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c  ed.    ** below,
b270: 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
b280: 65 20 72 65 73 75 6c 74 2d 73 65 74 73 20 66 6f  e result-sets fo
b290: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65  r all of the ele
b2a0: 6d 65 6e 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ments of.    ** 
b2b0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76  the compound hav
b2c0: 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  e been resolved.
b2d0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
b2e0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
b2f0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e  DER BY clause on
b300: 20 61 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d   a term of a com
b310: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 6f 74 68  pound-select oth
b320: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
b330: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 74 65  he right-most te
b340: 72 6d 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  rm, then that is
b350: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e   a syntax error.
b360: 20 20 42 75 74 20 74 68 65 20 65 72 72 6f 72 0a    But the error.
b370: 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65      ** is not de
b380: 74 65 63 74 65 64 20 75 6e 74 69 6c 20 6d 75 63  tected until muc
b390: 68 20 6c 61 74 65 72 2c 20 61 6e 64 20 73 6f 20  h later, and so 
b3a0: 77 65 20 6e 65 65 64 20 74 6f 20 67 6f 20 61 68  we need to go ah
b3b0: 65 61 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 72  ead and.    ** r
b3c0: 65 73 6f 6c 76 65 20 74 68 6f 73 65 20 73 79 6d  esolve those sym
b3d0: 62 6f 6c 73 20 6f 6e 20 74 68 65 20 69 6e 63 6f  bols on the inco
b3e0: 72 72 65 63 74 20 4f 52 44 45 52 20 42 59 20 66  rrect ORDER BY f
b3f0: 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 2e 0a  or consistency..
b400: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
b410: 73 43 6f 6d 70 6f 75 6e 64 3c 3d 6e 43 6f 6d 70  sCompound<=nComp
b420: 6f 75 6e 64 20 20 2f 2a 20 44 65 66 65 72 20 72  ound  /* Defer r
b430: 69 67 68 74 2d 6d 6f 73 74 20 4f 52 44 45 52 20  ight-most ORDER 
b440: 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  BY of a compound
b450: 20 2a 2f 0a 20 20 20 20 20 26 26 20 72 65 73 6f   */.     && reso
b460: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
b470: 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  &sNC, p, p->pOrd
b480: 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 0a 20  erBy, "ORDER"). 
b490: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
b4a0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
b4b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
b4c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b4d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
b4e0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
b4f0: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
b500: 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
b510: 75 73 65 2e 20 20 41 74 20 74 68 65 20 73 61 6d  use.  At the sam
b520: 65 20 74 69 6d 65 2c 20 6d 61 6b 65 20 73 75 72  e time, make sur
b530: 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 47 52  e .    ** the GR
b540: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f  OUP BY clause do
b550: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
b560: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
b570: 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ns..    */.    i
b580: 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
b590: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
b5a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
b5b0: 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28  ;.    .      if(
b5c0: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
b5d0: 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 47  upBy(&sNC, p, pG
b5e0: 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29  roupBy, "GROUP")
b5f0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
b600: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
b610: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
b620: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b630: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
b640: 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
b650: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
b660: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
b670: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
b680: 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d  sProperty(pItem-
b690: 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20  >pExpr, EP_Agg) 
b6a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b6b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b6c0: 72 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20  rse, "aggregate 
b6d0: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  functions are no
b6e0: 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20  t allowed in ". 
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68               "th
b700: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
b710: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e");.          r
b720: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
b730: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b740: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
b750: 20 49 66 20 74 68 69 73 20 69 73 20 70 61 72 74   If this is part
b760: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   of a compound S
b770: 45 4c 45 43 54 2c 20 63 68 65 63 6b 20 74 68 61  ELECT, check tha
b780: 74 20 69 74 20 68 61 73 20 74 68 65 20 72 69 67  t it has the rig
b790: 68 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ht.    ** number
b7a0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
b7b0: 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c 69  in the select li
b7c0: 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  st. */.    if( p
b7d0: 2d 3e 70 4e 65 78 74 20 26 26 20 70 2d 3e 70 45  ->pNext && p->pE
b7e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 2d 3e  List->nExpr!=p->
b7f0: 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pNext->pEList->n
b800: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
b810: 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
b820: 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50  NumTermsError(pP
b830: 61 72 73 65 2c 20 70 2d 3e 70 4e 65 78 74 29 3b  arse, p->pNext);
b840: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
b850: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a  C_Abort;.    }..
b860: 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
b870: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
b880: 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 0a  of the compound.
b890: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
b8a0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 43  ->pPrior;.    nC
b8b0: 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a  ompound++;.  }..
b8c0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
b8d0: 20 4f 52 44 45 52 20 42 59 20 6f 6e 20 61 20 63   ORDER BY on a c
b8e0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
b8f0: 66 74 65 72 20 61 6c 6c 20 74 65 72 6d 73 20 6f  fter all terms o
b900: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f  f.  ** the compo
b910: 75 6e 64 20 68 61 76 65 20 62 65 65 6e 20 72 65  und have been re
b920: 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  solved..  */.  i
b930: 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 26 26  f( isCompound &&
b940: 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64   resolveCompound
b950: 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
b960: 70 4c 65 66 74 6d 6f 73 74 29 20 29 7b 0a 20 20  pLeftmost) ){.  
b970: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
b980: 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rt;.  }..  retur
b990: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a  n WRC_Prune;.}..
b9a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b9b0: 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72  ne walks an expr
b9c0: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
b9d0: 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e  resolves referen
b9e0: 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20  ces to.** table 
b9f0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 72 65 73 75  columns and resu
ba00: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 20  lt-set columns. 
ba10: 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
ba20: 65 2c 20 64 6f 20 65 72 72 6f 72 0a 2a 2a 20 63  e, do error.** c
ba30: 68 65 63 6b 69 6e 67 20 6f 6e 20 66 75 6e 63 74  hecking on funct
ba40: 69 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 73 65  ion usage and se
ba50: 74 20 61 20 66 6c 61 67 20 69 66 20 61 6e 79 20  t a flag if any 
ba60: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
ba70: 6f 6e 73 0a 2a 2a 20 61 72 65 20 73 65 65 6e 2e  ons.** are seen.
ba80: 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76  .**.** To resolv
ba90: 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  e table columns 
baa0: 72 65 66 65 72 65 6e 63 65 73 20 77 65 20 6c 6f  references we lo
bab0: 6f 6b 20 66 6f 72 20 6e 6f 64 65 73 20 28 6f 72  ok for nodes (or
bac0: 20 73 75 62 74 72 65 65 73 29 20 6f 66 20 74 68   subtrees) of th
bad0: 65 20 0a 2a 2a 20 66 6f 72 6d 20 58 2e 59 2e 5a  e .** form X.Y.Z
bae0: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
baf0: 5a 20 77 68 65 72 65 0a 2a 2a 0a 2a 2a 20 20 20  Z where.**.**   
bb00: 20 20 20 58 3a 20 20 20 54 68 65 20 6e 61 6d 65     X:   The name
bb10: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 2e 20   of a database. 
bb20: 20 45 78 3a 20 20 22 6d 61 69 6e 22 20 6f 72 20   Ex:  "main" or 
bb30: 22 74 65 6d 70 22 20 6f 72 0a 2a 2a 20 20 20 20  "temp" or.**    
bb40: 20 20 20 20 20 20 20 74 68 65 20 73 79 6d 62 6f         the symbo
bb50: 6c 69 63 20 6e 61 6d 65 20 61 73 73 69 67 6e 65  lic name assigne
bb60: 64 20 74 6f 20 61 6e 20 41 54 54 41 43 48 2d 65  d to an ATTACH-e
bb70: 64 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  d database..**.*
bb80: 2a 20 20 20 20 20 20 59 3a 20 20 20 54 68 65 20  *      Y:   The 
bb90: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
bba0: 69 6e 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  in a FROM clause
bbb0: 2e 20 20 4f 72 20 69 6e 20 61 20 74 72 69 67 67  .  Or in a trigg
bbc0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
bbd0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
bbe0: 61 6c 20 6e 61 6d 65 73 20 22 6f 6c 64 22 20 6f  al names "old" o
bbf0: 72 20 22 6e 65 77 22 2e 0a 2a 2a 0a 2a 2a 20 20  r "new"..**.**  
bc00: 20 20 20 20 5a 3a 20 20 20 54 68 65 20 6e 61 6d      Z:   The nam
bc10: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  e of a column in
bc20: 20 74 61 62 6c 65 20 59 2e 0a 2a 2a 0a 2a 2a 20   table Y..**.** 
bc30: 54 68 65 20 6e 6f 64 65 20 61 74 20 74 68 65 20  The node at the 
bc40: 72 6f 6f 74 20 6f 66 20 74 68 65 20 73 75 62 74  root of the subt
bc50: 72 65 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ree is modified 
bc60: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
bc70: 2a 20 20 20 20 45 78 70 72 2e 6f 70 20 20 20 20  *    Expr.op    
bc80: 20 20 20 20 43 68 61 6e 67 65 64 20 74 6f 20 54      Changed to T
bc90: 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 45  K_COLUMN.**    E
bca0: 78 70 72 2e 70 54 61 62 20 20 20 20 20 20 50 6f  xpr.pTab      Po
bcb0: 69 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c  ints to the Tabl
bcc0: 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 58 2e 59  e object for X.Y
bcd0: 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 43 6f 6c  .**    Expr.iCol
bce0: 75 6d 6e 20 20 20 54 68 65 20 63 6f 6c 75 6d 6e  umn   The column
bcf0: 20 69 6e 64 65 78 20 69 6e 20 58 2e 59 2e 20 20   index in X.Y.  
bd00: 2d 31 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64  -1 for the rowid
bd10: 2e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 54 61  ..**    Expr.iTa
bd20: 62 6c 65 20 20 20 20 54 68 65 20 56 44 42 45 20  ble    The VDBE 
bd30: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
bd40: 72 20 58 2e 59 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  r X.Y.**.**.** T
bd50: 6f 20 72 65 73 6f 6c 76 65 20 72 65 73 75 6c 74  o resolve result
bd60: 2d 73 65 74 20 72 65 66 65 72 65 6e 63 65 73 2c  -set references,
bd70: 20 6c 6f 6f 6b 20 66 6f 72 20 65 78 70 72 65 73   look for expres
bd80: 73 69 6f 6e 20 6e 6f 64 65 73 20 6f 66 20 74 68  sion nodes of th
bd90: 65 0a 2a 2a 20 66 6f 72 6d 20 5a 20 28 77 69 74  e.** form Z (wit
bda0: 68 20 6e 6f 20 58 20 61 6e 64 20 59 20 70 72 65  h no X and Y pre
bdb0: 66 69 78 29 20 77 68 65 72 65 20 74 68 65 20 5a  fix) where the Z
bdc0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 72 69 67   matches the rig
bdd0: 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 7a 65 20  ht-hand.** size 
bde0: 6f 66 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  of an AS clause 
bdf0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  in the result-se
be00: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 20 20  t of a SELECT.  
be10: 54 68 65 20 5a 20 65 78 70 72 65 73 73 69 6f 6e  The Z expression
be20: 0a 2a 2a 20 69 73 20 72 65 70 6c 61 63 65 64 20  .** is replaced 
be30: 62 79 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  by a copy of the
be40: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
be50: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  of the result-se
be60: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
be70: 20 54 61 62 6c 65 2d 6e 61 6d 65 20 61 6e 64 20   Table-name and 
be80: 66 75 6e 63 74 69 6f 6e 20 72 65 73 6f 6c 75 74  function resolut
be90: 69 6f 6e 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  ion occurs on th
bea0: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 65 78  e substituted ex
beb0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65  pression.** tree
bec0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
bed0: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53  in:.**.**      S
bee0: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20  ELECT a+b AS x, 
bef0: 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c+d AS y FROM t1
bf00: 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 2a 2a 0a   ORDER BY x;.**.
bf10: 2a 2a 20 54 68 65 20 22 78 22 20 74 65 72 6d 20  ** The "x" term 
bf20: 6f 66 20 74 68 65 20 6f 72 64 65 72 20 62 79 20  of the order by 
bf30: 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 22  is replaced by "
bf40: 61 2b 62 22 20 74 6f 20 72 65 6e 64 65 72 3a 0a  a+b" to render:.
bf50: 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43  **.**      SELEC
bf60: 54 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20  T a+b AS x, c+d 
bf70: 41 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44  AS y FROM t1 ORD
bf80: 45 52 20 42 59 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a  ER BY a+b;.**.**
bf90: 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   Function calls 
bfa0: 61 72 65 20 63 68 65 63 6b 65 64 20 74 6f 20 6d  are checked to m
bfb0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
bfc0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  e function is .*
bfd0: 2a 20 64 65 66 69 6e 65 64 20 61 6e 64 20 74 68  * defined and th
bfe0: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  at the correct n
bff0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
c000: 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ts are specified
c010: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  ..** If the func
c020: 74 69 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65  tion is an aggre
c030: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 74  gate function, t
c040: 68 65 6e 20 74 68 65 20 4e 43 5f 48 61 73 41 67  hen the NC_HasAg
c050: 67 20 66 6c 61 67 20 69 73 0a 2a 2a 20 73 65 74  g flag is.** set
c060: 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 20   and the opcode 
c070: 69 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  is changed from 
c080: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 74 6f 20 54  TK_FUNCTION to T
c090: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a  K_AGG_FUNCTION..
c0a0: 2a 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  ** If an express
c0b0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67  ion contains agg
c0c0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
c0d0: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 41 67 67   then the EP_Agg
c0e0: 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  .** property on 
c0f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
c100: 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  s set..**.** An 
c110: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
c120: 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65 20   left in pParse 
c130: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61  if anything is a
c140: 6d 69 73 73 2e 20 20 54 68 65 20 6e 75 6d 62 65  miss.  The numbe
c150: 72 0a 2a 2a 20 69 66 20 65 72 72 6f 72 73 20 69  r.** if errors i
c160: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
c170: 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  nt sqlite3Resolv
c180: 65 45 78 70 72 4e 61 6d 65 73 28 20 0a 20 20 4e  eExprNames( .  N
c190: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
c1a0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70         /* Namesp
c1b0: 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65  ace to resolve e
c1c0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a  xpressions in. *
c1d0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c1f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
c200: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f   be analyzed. */
c210: 0a 29 7b 0a 20 20 75 31 36 20 73 61 76 65 64 48  .){.  u16 savedH
c220: 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b 65 72 20  asAgg;.  Walker 
c230: 77 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  w;..  if( pExpr=
c240: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  =0 ) return 0;.#
c250: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
c260: 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 7b 0a 20  PR_DEPTH>0.  {. 
c270: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
c280: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
c290: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
c2a0: 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 70  xprCheckHeight(p
c2b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 6e 48  Parse, pExpr->nH
c2c0: 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50 61 72 73  eight+pNC->pPars
c2d0: 65 2d 3e 6e 48 65 69 67 68 74 29 20 29 7b 0a 20  e->nHeight) ){. 
c2e0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
c2f0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
c300: 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45 78 70  >nHeight += pExp
c310: 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20 7d 0a  r->nHeight;.  }.
c320: 23 65 6e 64 69 66 0a 20 20 73 61 76 65 64 48 61  #endif.  savedHa
c330: 73 41 67 67 20 3d 20 70 4e 43 2d 3e 6e 63 46 6c  sAgg = pNC->ncFl
c340: 61 67 73 20 26 20 28 4e 43 5f 48 61 73 41 67 67  ags & (NC_HasAgg
c350: 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a  |NC_MinMaxAgg);.
c360: 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26    pNC->ncFlags &
c370: 3d 20 7e 28 4e 43 5f 48 61 73 41 67 67 7c 4e 43  = ~(NC_HasAgg|NC
c380: 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a 20 20 77  _MinMaxAgg);.  w
c390: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
c3a0: 50 61 72 73 65 3b 0a 20 20 77 2e 78 45 78 70 72  Parse;.  w.xExpr
c3b0: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
c3c0: 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e  veExprStep;.  w.
c3d0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
c3e0: 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  = resolveSelectS
c3f0: 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  tep;.  w.xSelect
c400: 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
c410: 20 77 2e 77 61 6c 6b 65 72 44 65 70 74 68 20 3d   w.walkerDepth =
c420: 20 30 3b 0a 20 20 77 2e 65 43 6f 64 65 20 3d 20   0;.  w.eCode = 
c430: 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  0;.  w.u.pNC = p
c440: 4e 43 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  NC;.  sqlite3Wal
c450: 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
c460: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
c470: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
c480: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65  pNC->pParse->nHe
c490: 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e  ight -= pExpr->n
c4a0: 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20  Height;.#endif. 
c4b0: 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30   if( pNC->nErr>0
c4c0: 20 7c 7c 20 77 2e 70 50 61 72 73 65 2d 3e 6e 45   || w.pParse->nE
c4d0: 72 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72  rr>0 ){.    Expr
c4e0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
c4f0: 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20  r, EP_Error);.  
c500: 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 63 46  }.  if( pNC->ncF
c510: 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41 67 67  lags & NC_HasAgg
c520: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
c530: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
c540: 50 5f 41 67 67 29 3b 0a 20 20 7d 0a 20 20 70 4e  P_Agg);.  }.  pN
c550: 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 73 61  C->ncFlags |= sa
c560: 76 65 64 48 61 73 41 67 67 3b 0a 20 20 72 65 74  vedHasAgg;.  ret
c570: 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65  urn ExprHasPrope
c580: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
c590: 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ror);.}../*.** R
c5a0: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
c5b0: 20 66 6f 72 20 61 6c 6c 20 65 78 70 72 65 73 73   for all express
c5c0: 69 6f 6e 20 69 6e 20 61 6e 20 65 78 70 72 65 73  ion in an expres
c5d0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 69 73  sion list.  This
c5e0: 20 69 73 0a 2a 2a 20 6a 75 73 74 20 6c 69 6b 65   is.** just like
c5f0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
c600: 78 70 72 4e 61 6d 65 73 28 29 20 65 78 63 65 70  xprNames() excep
c610: 74 20 74 68 61 74 20 69 74 20 77 6f 72 6b 73 20  t that it works 
c620: 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f  for an expressio
c630: 6e 0a 2a 2a 20 6c 69 73 74 20 72 61 74 68 65 72  n.** list rather
c640: 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65   than a single e
c650: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e  xpression..*/.in
c660: 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  t sqlite3Resolve
c670: 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 20 0a  ExprListNames( .
c680: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
c690: 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  NC,       /* Nam
c6a0: 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76  espace to resolv
c6b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
c6c0: 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  . */.  ExprList 
c6d0: 2a 70 4c 69 73 74 20 20 20 20 20 20 20 20 20 2f  *pList         /
c6e0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
c6f0: 20 6c 69 73 74 20 74 6f 20 62 65 20 61 6e 61 6c   list to be anal
c700: 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  yzed. */.){.  in
c710: 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  t i;.  if( pList
c720: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
c730: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c740: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
c750: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
c760: 78 70 72 4e 61 6d 65 73 28 70 4e 43 2c 20 70 4c  xprNames(pNC, pL
c770: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
c780: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
c790: 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ort;.    }.  }. 
c7a0: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
c7b0: 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  inue;.}../*.** R
c7c0: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
c7d0: 20 69 6e 20 61 6c 6c 20 65 78 70 72 65 73 73 69   in all expressi
c7e0: 6f 6e 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ons of a SELECT 
c7f0: 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65  and in all.** de
c800: 63 65 6e 64 65 6e 74 73 20 6f 66 20 74 68 65 20  cendents of the 
c810: 53 45 4c 45 43 54 2c 20 69 6e 63 6c 75 64 69 6e  SELECT, includin
c820: 67 20 63 6f 6d 70 6f 75 6e 64 73 20 6f 66 66 20  g compounds off 
c830: 6f 66 20 70 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a  of p->pPrior,.**
c840: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 65   subqueries in e
c850: 78 70 72 65 73 73 69 6f 6e 73 2c 20 61 6e 64 20  xpressions, and 
c860: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
c870: 61 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  as FROM clause.*
c880: 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53  * terms..**.** S
c890: 65 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ee sqlite3Resolv
c8a0: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 66 6f 72  eExprNames() for
c8b0: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
c8c0: 66 20 74 68 65 20 6b 69 6e 64 73 20 6f 66 0a 2a  f the kinds of.*
c8d0: 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  * transformation
c8e0: 73 20 74 68 61 74 20 6f 63 63 75 72 2e 0a 2a 2a  s that occur..**
c8f0: 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 73  .** All SELECT s
c900: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
c910: 20 68 61 76 65 20 62 65 65 6e 20 65 78 70 61 6e   have been expan
c920: 64 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ded using.** sql
c930: 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
c940: 28 29 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  () prior to invo
c950: 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
c960: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
c970: 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
c980: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
c990: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
c9a0: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
c9b0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
c9c0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
c9d0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
c9e0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
c9f0: 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
ca00: 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
ca10: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
ca20: 74 20 66 6f 72 20 70 61 72 65 6e 74 20 53 45 4c  t for parent SEL
ca30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
ca40: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  .){.  Walker w;.
ca50: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
ca60: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  );.  memset(&w, 
ca70: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
ca80: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
ca90: 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74   = resolveExprSt
caa0: 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ep;.  w.xSelectC
cab0: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76  allback = resolv
cac0: 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77  eSelectStep;.  w
cad0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
cae0: 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4f  ;.  w.u.pNC = pO
caf0: 75 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69 74 65  uterNC;.  sqlite
cb00: 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
cb10: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
cb20: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 65 78  olve names in ex
cb30: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 63  pressions that c
cb40: 61 6e 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63  an only referenc
cb50: 65 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  e a single table
cb60: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 43  :.**.**    *   C
cb70: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
cb80: 0a 2a 2a 20 20 20 20 2a 20 20 20 57 48 45 52 45  .**    *   WHERE
cb90: 20 63 6c 61 75 73 65 73 20 6f 6e 20 70 61 72 74   clauses on part
cba0: 69 61 6c 20 69 6e 64 69 63 65 73 0a 2a 2a 0a 2a  ial indices.**.*
cbb0: 2a 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c  * The Expr.iTabl
cbc0: 65 20 76 61 6c 75 65 20 66 6f 72 20 45 78 70 72  e value for Expr
cbd0: 2e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  .op==TK_COLUMN n
cbe0: 6f 64 65 73 20 6f 66 20 74 68 65 20 65 78 70 72  odes of the expr
cbf0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 73 65 74  ession.** is set
cc00: 20 74 6f 20 2d 31 20 61 6e 64 20 74 68 65 20 45   to -1 and the E
cc10: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
cc20: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
cc30: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a  column number..*
cc40: 2a 0a 2a 2a 20 41 6e 79 20 65 72 72 6f 72 73 20  *.** Any errors 
cc50: 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 6d  cause an error m
cc60: 65 73 73 61 67 65 20 74 6f 20 62 65 20 73 65 74  essage to be set
cc70: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
cc80: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  oid sqlite3Resol
cc90: 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
cca0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ccb0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
ccc0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
ccd0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
cce0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
ccf0: 62 65 69 6e 67 20 72 65 66 65 72 65 6e 63 65 64  being referenced
cd00: 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20   */.  int type, 
cd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 43 5f            /* NC_
cd20: 49 73 43 68 65 63 6b 20 6f 72 20 4e 43 5f 50 61  IsCheck or NC_Pa
cd30: 72 74 49 64 78 20 6f 72 20 4e 43 5f 49 64 78 45  rtIdx or NC_IdxE
cd40: 78 70 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  xpr */.  Expr *p
cd50: 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
cd60: 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 72 65  Expression to re
cd70: 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e  solve.  May be N
cd80: 55 4c 4c 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ULL. */.  ExprLi
cd90: 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20 2f 2a  st *pList     /*
cda0: 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   Expression list
cdb0: 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20 20 4d 61   to resolve.  Ma
cdc0: 79 20 62 65 20 4e 55 4c 2e 20 2a 2f 0a 29 7b 0a  y be NUL. */.){.
cdd0: 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20    SrcList sSrc; 
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdf0: 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73    /* Fake SrcLis
ce00: 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e  t for pParse->pN
ce10: 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 4e 61 6d  ewTable */.  Nam
ce20: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce40: 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
ce50: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ce60: 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
ce70: 20 74 79 70 65 3d 3d 4e 43 5f 49 73 43 68 65 63   type==NC_IsChec
ce80: 6b 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f 50 61  k || type==NC_Pa
ce90: 72 74 49 64 78 20 7c 7c 20 74 79 70 65 3d 3d 4e  rtIdx || type==N
cea0: 43 5f 49 64 78 45 78 70 72 20 29 3b 0a 20 20 6d  C_IdxExpr );.  m
ceb0: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
cec0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 6d  izeof(sNC));.  m
ced0: 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20  emset(&sSrc, 0, 
cee0: 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20  sizeof(sSrc));. 
cef0: 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a   sSrc.nSrc = 1;.
cf00: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
cf10: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
cf20: 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61  .  sSrc.a[0].pTa
cf30: 62 20 3d 20 70 54 61 62 3b 0a 20 20 73 53 72 63  b = pTab;.  sSrc
cf40: 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  .a[0].iCursor = 
cf50: 2d 31 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  -1;.  sNC.pParse
cf60: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43   = pParse;.  sNC
cf70: 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72  .pSrcList = &sSr
cf80: 63 3b 0a 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73  c;.  sNC.ncFlags
cf90: 20 3d 20 74 79 70 65 3b 0a 20 20 69 66 28 20 73   = type;.  if( s
cfa0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
cfb0: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 45 78  rNames(&sNC, pEx
cfc0: 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pr) ) return;.  
cfd0: 69 66 28 20 70 4c 69 73 74 20 29 20 73 71 6c 69  if( pList ) sqli
cfe0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69  te3ResolveExprLi
cff0: 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c  stNames(&sNC, pL
d000: 69 73 74 29 3b 0a 7d 0a                          ist);.}.