/ Hex Artifact Content
Login

Artifact 5ed606916be6c63f0e262cc2cb817712384f18b5:


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 69 3b 0a 20 20 72 65 74 75 72 6e 20  ->u.i;.  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 69 20 3d 20 4e  h;.    w.u.i = 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 73 75 6c  .** If the resul
05a0: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 20 69 73 20  t set column is 
05b0: 61 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20  a simple column 
05c0: 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65 6e 20  reference, then 
05d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
05e0: 6d 61 6b 65 73 20 61 6e 20 65 78 61 63 74 20 63  makes an exact c
05f0: 6f 70 79 2e 20 20 42 75 74 20 66 6f 72 20 61 6e  opy.  But for an
0600: 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20  y other kind of 
0610: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 69 73  expression, this
0620: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  .** routine make
0630: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72   a copy of the r
0640: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
0650: 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
0660: 20 74 6f 20 74 68 65 0a 2a 2a 20 54 4b 5f 41 53   to the.** TK_AS
0670: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
0680: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63  TK_AS operator c
0690: 61 75 73 65 73 20 74 68 65 20 65 78 70 72 65 73  auses the expres
06a0: 73 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20 65 76  sion to be.** ev
06b0: 61 6c 75 61 74 65 64 20 6a 75 73 74 20 6f 6e 63  aluated just onc
06c0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  e and then reuse
06d0: 64 20 66 6f 72 20 65 61 63 68 20 61 6c 69 61 73  d for each alias
06e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 61 73  ..**.** The reas
06f0: 6f 6e 20 66 6f 72 20 73 75 70 70 72 65 73 73 69  on for suppressi
0700: 6e 67 20 74 68 65 20 54 4b 5f 41 53 20 74 65 72  ng the TK_AS ter
0710: 6d 20 77 68 65 6e 20 74 68 65 20 65 78 70 72 65  m when the expre
0720: 73 73 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c  ssion is a simpl
0730: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65 66 65  e.** column refe
0740: 72 65 6e 63 65 20 69 73 20 73 6f 20 74 68 61 74  rence is so that
0750: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65   the column refe
0760: 72 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 72 65  rence will be re
0770: 63 6f 67 6e 69 7a 65 64 20 61 73 0a 2a 2a 20 75  cognized as.** u
0780: 73 61 62 6c 65 20 62 79 20 69 6e 64 69 63 65 73  sable by indices
0790: 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
07a0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
07b0: 69 6e 67 20 6c 6f 67 69 63 2e 20 0a 2a 2a 0a 2a  ing logic. .**.*
07c0: 2a 20 48 61 63 6b 3a 20 20 54 68 65 20 54 4b 5f  * Hack:  The TK_
07d0: 41 53 20 6f 70 65 72 61 74 6f 72 20 69 73 20 69  AS operator is i
07e0: 6e 68 69 62 69 74 65 64 20 69 66 20 7a 54 79 70  nhibited if zTyp
07f0: 65 5b 30 5d 3d 3d 27 47 27 2e 20 20 54 68 69 73  e[0]=='G'.  This
0800: 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 69   means.** that i
0810: 6e 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  n a GROUP BY cla
0820: 75 73 65 2c 20 74 68 65 20 65 78 70 72 65 73 73  use, the express
0830: 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
0840: 20 74 77 69 63 65 2e 20 20 48 65 6e 63 65 3a 0a   twice.  Hence:.
0850: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
0860: 20 72 61 6e 64 6f 6d 28 29 25 35 20 41 53 20 78   random()%5 AS x
0870: 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
0880: 74 61 62 20 47 52 4f 55 50 20 42 59 20 78 0a 2a  tab GROUP BY x.*
0890: 2a 0a 2a 2a 20 49 73 20 65 71 75 69 76 61 6c 65  *.** Is equivale
08a0: 6e 74 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  nt to:.**.**    
08b0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 28 29   SELECT random()
08c0: 25 35 20 41 53 20 78 2c 20 63 6f 75 6e 74 28 2a  %5 AS x, count(*
08d0: 29 20 46 52 4f 4d 20 74 61 62 20 47 52 4f 55 50  ) FROM tab GROUP
08e0: 20 42 59 20 72 61 6e 64 6f 6d 28 29 25 35 0a 2a   BY random()%5.*
08f0: 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  *.** The result 
0900: 6f 66 20 72 61 6e 64 6f 6d 28 29 25 35 20 69 6e  of random()%5 in
0910: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
0920: 61 75 73 65 20 69 73 20 70 72 6f 62 61 62 6c 79  ause is probably
0930: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
0940: 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e  om the result in
0950: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2e   the result-set.
0960: 20 20 57 65 20 6d 69 67 68 74 20 66 69 78 20 74    We might fix t
0970: 68 69 73 20 73 6f 6d 65 64 61 79 2e 20 20 4f 72  his someday.  Or
0980: 0a 2a 2a 20 74 68 65 6e 20 61 67 61 69 6e 2c 20  .** then again, 
0990: 77 65 20 6d 69 67 68 74 20 6e 6f 74 2e 2e 2e 0a  we might not....
09a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 66  **.** If the ref
09b0: 65 72 65 6e 63 65 20 69 73 20 66 6f 6c 6c 6f 77  erence is follow
09c0: 65 64 20 62 79 20 61 20 43 4f 4c 4c 41 54 45 20  ed by a COLLATE 
09d0: 6f 70 65 72 61 74 6f 72 2c 20 74 68 65 6e 20 6d  operator, then m
09e0: 61 6b 65 20 73 75 72 65 0a 2a 2a 20 74 68 65 20  ake sure.** the 
09f0: 43 4f 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72  COLLATE operator
0a00: 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 20 20   is preserved.  
0a10: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0a20: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
0a30: 62 2c 20 63 2b 64 20 46 52 4f 4d 20 74 31 20 4f  b, c+d FROM t1 O
0a40: 52 44 45 52 20 42 59 20 31 20 43 4f 4c 4c 41 54  RDER BY 1 COLLAT
0a50: 45 20 6e 6f 63 61 73 65 3b 0a 2a 2a 0a 2a 2a 20  E nocase;.**.** 
0a60: 53 68 6f 75 6c 64 20 62 65 20 74 72 61 6e 73 66  Should be transf
0a70: 6f 72 6d 65 64 20 69 6e 74 6f 3a 0a 2a 2a 0a 2a  ormed into:.**.*
0a80: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62  *     SELECT a+b
0a90: 2c 20 63 2b 64 20 46 52 4f 4d 20 74 31 20 4f 52  , c+d FROM t1 OR
0aa0: 44 45 52 20 42 59 20 28 61 2b 62 29 20 43 4f 4c  DER BY (a+b) COL
0ab0: 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a 2a 2a 0a  LATE nocase;.**.
0ac0: 2a 2a 20 54 68 65 20 6e 53 75 62 71 75 65 72 79  ** The nSubquery
0ad0: 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
0ae0: 66 69 65 73 20 68 6f 77 20 6d 61 6e 79 20 6c 65  fies how many le
0af0: 76 65 6c 73 20 6f 66 20 73 75 62 71 75 65 72 79  vels of subquery
0b00: 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 69 73   the.** alias is
0b10: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
0b20: 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65  e original expre
0b30: 73 73 69 6f 6e 2e 20 20 54 68 65 20 75 73 75 61  ssion.  The usua
0b40: 6c 6c 79 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  lly value is.** 
0b50: 7a 65 72 6f 20 62 75 74 20 69 74 20 6d 69 67 68  zero but it migh
0b60: 74 20 62 65 20 6d 6f 72 65 20 69 66 20 74 68 65  t be more if the
0b70: 20 61 6c 69 61 73 20 69 73 20 63 6f 6e 74 61 69   alias is contai
0b80: 6e 65 64 20 77 69 74 68 69 6e 20 61 20 73 75 62  ned within a sub
0b90: 71 75 65 72 79 0a 2a 2a 20 6f 66 20 74 68 65 20  query.** of the 
0ba0: 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73  original express
0bb0: 69 6f 6e 2e 20 20 54 68 65 20 45 78 70 72 2e 6f  ion.  The Expr.o
0bc0: 70 32 20 66 69 65 6c 64 20 6f 66 20 54 4b 5f 41  p2 field of TK_A
0bd0: 47 47 5f 46 55 4e 43 54 49 4f 4e 0a 2a 2a 20 73  GG_FUNCTION.** s
0be0: 74 72 75 63 74 75 72 65 73 20 6d 75 73 74 20 62  tructures must b
0bf0: 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20 74  e increased by t
0c00: 68 65 20 6e 53 75 62 71 75 65 72 79 20 61 6d 6f  he nSubquery amo
0c10: 75 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  unt..*/.static v
0c20: 6f 69 64 20 72 65 73 6f 6c 76 65 41 6c 69 61 73  oid resolveAlias
0c30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
0c40: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
0c50: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
0c60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
0c70: 69 73 74 2c 20 20 20 20 20 20 2f 2a 20 41 20 72  ist,      /* A r
0c80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69  esult set */.  i
0c90: 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
0ca0: 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d        /* A colum
0cb0: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
0cc0: 73 65 74 2e 20 20 30 2e 2e 70 45 4c 69 73 74 2d  set.  0..pEList-
0cd0: 3e 6e 45 78 70 72 2d 31 20 2a 2f 0a 20 20 45 78  >nExpr-1 */.  Ex
0ce0: 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20  pr *pExpr,      
0cf0: 20 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 6f 72       /* Transfor
0d00: 6d 20 74 68 69 73 20 69 6e 74 6f 20 61 6e 20 61  m this into an a
0d10: 6c 69 61 73 20 74 6f 20 74 68 65 20 72 65 73 75  lias to the resu
0d20: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63 6f 6e 73  lt set */.  cons
0d30: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
0d40: 20 20 20 2f 2a 20 22 47 52 4f 55 50 22 20 6f 72     /* "GROUP" or
0d50: 20 22 4f 52 44 45 52 22 20 6f 72 20 22 22 20 2a   "ORDER" or "" *
0d60: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 71 75 65 72  /.  int nSubquer
0d70: 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  y          /* Nu
0d80: 6d 62 65 72 20 6f 66 20 73 75 62 71 75 65 72 69  mber of subqueri
0d90: 65 73 20 74 68 61 74 20 74 68 65 20 6c 61 62 65  es that the labe
0da0: 6c 20 69 73 20 6d 6f 76 69 6e 67 20 2a 2f 0a 29  l is moving */.)
0db0: 7b 0a 20 20 45 78 70 72 20 2a 70 4f 72 69 67 3b  {.  Expr *pOrig;
0dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0dd0: 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e  e iCol-th column
0de0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
0df0: 65 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 44  et */.  Expr *pD
0e00: 75 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  up;            /
0e10: 2a 20 43 6f 70 79 20 6f 66 20 70 4f 72 69 67 20  * Copy of pOrig 
0e20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
0e30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
0e40: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
0e50: 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  ection */..  ass
0e60: 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20 26 26 20  ert( iCol>=0 && 
0e70: 69 43 6f 6c 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol<pEList->nEx
0e80: 70 72 20 29 3b 0a 20 20 70 4f 72 69 67 20 3d 20  pr );.  pOrig = 
0e90: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
0ea0: 70 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  pExpr;.  assert(
0eb0: 20 70 4f 72 69 67 21 3d 30 20 29 3b 0a 20 20 61   pOrig!=0 );.  a
0ec0: 73 73 65 72 74 28 20 70 4f 72 69 67 2d 3e 66 6c  ssert( pOrig->fl
0ed0: 61 67 73 20 26 20 45 50 5f 52 65 73 6f 6c 76 65  ags & EP_Resolve
0ee0: 64 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  d );.  db = pPar
0ef0: 73 65 2d 3e 64 62 3b 0a 20 20 70 44 75 70 20 3d  se->db;.  pDup =
0f00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
0f10: 64 62 2c 20 70 4f 72 69 67 2c 20 30 29 3b 0a 20  db, pOrig, 0);. 
0f20: 20 69 66 28 20 70 44 75 70 3d 3d 30 20 29 20 72   if( pDup==0 ) r
0f30: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4f 72  eturn;.  if( pOr
0f40: 69 67 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  ig->op!=TK_COLUM
0f50: 4e 20 26 26 20 7a 54 79 70 65 5b 30 5d 21 3d 27  N && zType[0]!='
0f60: 47 27 20 29 7b 0a 20 20 20 20 69 6e 63 72 41 67  G' ){.    incrAg
0f70: 67 46 75 6e 63 74 69 6f 6e 44 65 70 74 68 28 70  gFunctionDepth(p
0f80: 44 75 70 2c 20 6e 53 75 62 71 75 65 72 79 29 3b  Dup, nSubquery);
0f90: 0a 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69  .    pDup = sqli
0fa0: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
0fb0: 20 54 4b 5f 41 53 2c 20 70 44 75 70 2c 20 30 2c   TK_AS, pDup, 0,
0fc0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 44 75   0);.    if( pDu
0fd0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
0fe0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61     if( pEList->a
0ff0: 5b 69 43 6f 6c 5d 2e 69 41 6c 69 61 73 3d 3d 30  [iCol].iAlias==0
1000: 20 29 7b 0a 20 20 20 20 20 20 70 45 4c 69 73 74   ){.      pEList
1010: 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41 6c 69 61 73  ->a[iCol].iAlias
1020: 20 3d 20 28 75 31 36 29 28 2b 2b 70 50 61 72 73   = (u16)(++pPars
1030: 65 2d 3e 6e 41 6c 69 61 73 29 3b 0a 20 20 20 20  e->nAlias);.    
1040: 7d 0a 20 20 20 20 70 44 75 70 2d 3e 69 54 61 62  }.    pDup->iTab
1050: 6c 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  le = pEList->a[i
1060: 43 6f 6c 5d 2e 69 41 6c 69 61 73 3b 0a 20 20 7d  Col].iAlias;.  }
1070: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
1080: 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a  ==TK_COLLATE ){.
1090: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
10a0: 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65  e3ExprAddCollate
10b0: 53 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70  String(pParse, p
10c0: 44 75 70 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  Dup, pExpr->u.zT
10d0: 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  oken);.  }..  /*
10e0: 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   Before calling 
10f0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1100: 65 28 29 2c 20 73 65 74 20 74 68 65 20 45 50 5f  e(), set the EP_
1110: 53 74 61 74 69 63 20 66 6c 61 67 2e 20 54 68 69  Static flag. Thi
1120: 73 20 0a 20 20 2a 2a 20 70 72 65 76 65 6e 74 73  s .  ** prevents
1130: 20 45 78 70 72 44 65 6c 65 74 65 28 29 20 66 72   ExprDelete() fr
1140: 6f 6d 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  om deleting the 
1150: 45 78 70 72 20 73 74 72 75 63 74 75 72 65 20 69  Expr structure i
1160: 74 73 65 6c 66 2c 0a 20 20 2a 2a 20 61 6c 6c 6f  tself,.  ** allo
1170: 77 69 6e 67 20 69 74 20 74 6f 20 62 65 20 72 65  wing it to be re
1180: 70 6f 70 75 6c 61 74 65 64 20 62 79 20 74 68 65  populated by the
1190: 20 6d 65 6d 63 70 79 28 29 20 6f 6e 20 74 68 65   memcpy() on the
11a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65 2e   following line.
11b0: 0a 20 20 2a 2a 20 54 68 65 20 70 45 78 70 72 2d  .  ** The pExpr-
11c0: 3e 75 2e 7a 54 6f 6b 65 6e 20 6d 69 67 68 74 20  >u.zToken might 
11d0: 70 6f 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  point into memor
11e0: 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 66  y that will be f
11f0: 72 65 65 64 20 62 79 20 74 68 65 0a 20 20 2a 2a  reed by the.  **
1200: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1210: 62 2c 20 70 44 75 70 29 20 6f 6e 20 74 68 65 20  b, pDup) on the 
1220: 6c 61 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 69  last line of thi
1230: 73 20 62 6c 6f 63 6b 2c 20 73 6f 20 62 65 20 73  s block, so be s
1240: 75 72 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 6b 65  ure to.  ** make
1250: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 74   a copy of the t
1260: 6f 6b 65 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e  oken before doin
1270: 67 20 74 68 65 20 73 71 6c 69 74 65 33 44 62 46  g the sqlite3DbF
1280: 72 65 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 45 78  ree()..  */.  Ex
1290: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
12a0: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
12b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
12c0: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b  lete(db, pExpr);
12d0: 0a 20 20 6d 65 6d 63 70 79 28 70 45 78 70 72 2c  .  memcpy(pExpr,
12e0: 20 70 44 75 70 2c 20 73 69 7a 65 6f 66 28 2a 70   pDup, sizeof(*p
12f0: 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20 21 45  Expr));.  if( !E
1300: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1310: 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75  Expr, EP_IntValu
1320: 65 29 20 26 26 20 70 45 78 70 72 2d 3e 75 2e 7a  e) && pExpr->u.z
1330: 54 6f 6b 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20  Token!=0 ){.    
1340: 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e  assert( (pExpr->
1350: 66 6c 61 67 73 20 26 20 28 45 50 5f 52 65 64 75  flags & (EP_Redu
1360: 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  ced|EP_TokenOnly
1370: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 45 78  ))==0 );.    pEx
1380: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73  pr->u.zToken = s
1390: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64  qlite3DbStrDup(d
13a0: 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  b, pExpr->u.zTok
13b0: 65 6e 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  en);.    pExpr->
13c0: 66 6c 61 67 73 32 20 7c 3d 20 45 50 32 5f 4d 61  flags2 |= EP2_Ma
13d0: 6c 6c 6f 63 65 64 54 6f 6b 65 6e 3b 0a 20 20 7d  llocedToken;.  }
13e0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
13f0: 28 64 62 2c 20 70 44 75 70 29 3b 0a 7d 0a 0a 0a  (db, pDup);.}...
1400: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1410: 45 20 69 66 20 74 68 65 20 6e 61 6d 65 20 7a 43  E if the name zC
1420: 6f 6c 20 6f 63 63 75 72 73 20 61 6e 79 77 68 65  ol occurs anywhe
1430: 72 65 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20  re in the USING 
1440: 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  clause..**.** Re
1450: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
1460: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69  e USING clause i
1470: 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 69 74 20  s NULL or if it 
1480: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
1490: 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a 73 74 61  .** zCol..*/.sta
14a0: 74 69 63 20 69 6e 74 20 6e 61 6d 65 49 6e 55 73  tic int nameInUs
14b0: 69 6e 67 43 6c 61 75 73 65 28 49 64 4c 69 73 74  ingClause(IdList
14c0: 20 2a 70 55 73 69 6e 67 2c 20 63 6f 6e 73 74 20   *pUsing, const 
14d0: 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69  char *zCol){.  i
14e0: 66 28 20 70 55 73 69 6e 67 20 29 7b 0a 20 20 20  f( pUsing ){.   
14f0: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 66 6f 72 28   int k;.    for(
1500: 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e  k=0; k<pUsing->n
1510: 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  Id; k++){.      
1520: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
1530: 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e  mp(pUsing->a[k].
1540: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
1550: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
1560: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1570: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  ;.}.../*.** Give
1580: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
1590: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f  column of the fo
15a0: 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  rm X.Y.Z or Y.Z 
15b0: 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20  or just Z, look 
15c0: 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20  up.** that name 
15d0: 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f  in the set of so
15e0: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70  urce tables in p
15f0: 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65  SrcList and make
1600: 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65   the pExpr .** e
1610: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
1620: 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61  efer back to tha
1630: 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e  t source column.
1640: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1650: 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d  changes.** are m
1660: 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a  ade to pExpr:.**
1670: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44  .**    pExpr->iD
1680: 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20  b           Set 
1690: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d  the index in db-
16a0: 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61  >aDb[] of the da
16b0: 74 61 62 61 73 65 20 58 0a 2a 2a 20 20 20 20 20  tabase X.**     
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 28 65 76 65 6e 20 69 66 20 58 20 69      (even if X i
16e0: 73 20 69 6d 70 6c 69 65 64 29 2e 0a 2a 2a 20 20  s implied)..**  
16f0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1700: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
1710: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
1720: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62  for the table ob
1730: 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20  tained.**       
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e    from pSrcList.
1760: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 54  .**    pExpr->pT
1770: 61 62 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e  ab          Poin
1780: 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  ts to the Table 
1790: 73 74 72 75 63 74 75 72 65 20 6f 66 20 58 2e 59  structure of X.Y
17a0: 20 28 65 76 65 6e 20 69 66 0a 2a 2a 20 20 20 20   (even if.**    
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 20 20 20 58 20 61 6e 64 2f 6f 72 20 59 20       X and/or Y 
17d0: 61 72 65 20 69 6d 70 6c 69 65 64 2e 29 0a 2a 2a  are implied.).**
17e0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
17f0: 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  mn       Set to 
1800: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
1810: 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62  r within the tab
1820: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
1830: 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 53  >op            S
1840: 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  et to TK_COLUMN.
1850: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .**    pExpr->pL
1860: 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79 20  eft         Any 
1870: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
1880: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
1890: 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72  eted.**    pExpr
18a0: 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20 20  ->pRight        
18b0: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
18c0: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
18d0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
18e0: 54 68 65 20 7a 44 62 20 76 61 72 69 61 62 6c 65  The zDb variable
18f0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1900: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68  the database (th
1910: 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61  e "X").  This va
1920: 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55  lue may be.** NU
1930: 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  LL meaning that 
1940: 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66  name is of the f
1950: 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41  orm Y.Z or Z.  A
1960: 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74  ny available dat
1970: 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20  abase.** can be 
1980: 75 73 65 64 2e 20 20 54 68 65 20 7a 54 61 62 6c  used.  The zTabl
1990: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68  e variable is th
19a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
19b0: 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20 20  ble (the "Y").  
19c0: 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61  This.** value ca
19d0: 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 7a 44 62  n be NULL if zDb
19e0: 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20   is also NULL.  
19f0: 49 66 20 7a 54 61 62 6c 65 20 69 73 20 4e 55 4c  If zTable is NUL
1a00: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
1a10: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
1a20: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
1a30: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
1a40: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
1a50: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
1a60: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
1a70: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
1a80: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
1a90: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
1aa0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
1ab0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
1ac0: 57 52 43 5f 41 62 6f 72 74 2e 20 20 52 65 74 75  WRC_Abort.  Retu
1ad0: 72 6e 20 57 52 43 5f 50 72 75 6e 65 20 6f 6e 20  rn WRC_Prune on 
1ae0: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
1af0: 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d  ic int lookupNam
1b00: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
1b10: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
1b20: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1b30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b40: 20 2a 7a 44 62 2c 20 20 20 20 20 2f 2a 20 4e 61   *zDb,     /* Na
1b50: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1b60: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
1b70: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
1b80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1b90: 61 62 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ab,    /* Name o
1ba0: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
1bb0: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
1bc0: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LL */.  const ch
1bd0: 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20  ar *zCol,    /* 
1be0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
1bf0: 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  mn. */.  NameCon
1c00: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
1c10: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
1c20: 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  t used to resolv
1c30: 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  e the name */.  
1c40: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
1c50: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
1c60: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
1c70: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
1c80: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
1c90: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1cc0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ers */.  int cnt
1cd0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1cf0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
1d00: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
1d10: 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20  .  int cntTab = 
1d20: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1d30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1d40: 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  f matching table
1d50: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20   names */.  int 
1d60: 6e 53 75 62 71 75 65 72 79 20 3d 20 30 3b 20 20  nSubquery = 0;  
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d80: 20 48 6f 77 20 6d 61 6e 79 20 6c 65 76 65 6c 73   How many levels
1d90: 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
1da0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1db0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
1dc0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1dd0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1de0: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1df0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
1e00: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72        /* Use for
1e10: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53   looping over pS
1e20: 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a  rcList items */.
1e30: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1e40: 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20  _item *pMatch = 
1e50: 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68  0;  /* The match
1e60: 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65  ing pSrcList ite
1e70: 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  m */.  NameConte
1e80: 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43  xt *pTopNC = pNC
1e90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
1ea0: 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e  t namecontext in
1eb0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53   the list */.  S
1ec0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
1ed0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1ee0: 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68   /* Schema of th
1ef0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
1f00: 20 20 69 6e 74 20 69 73 54 72 69 67 67 65 72 20    int isTrigger 
1f10: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1f20: 70 4e 43 20 29 3b 20 20 20 20 20 2f 2a 20 74 68  pNC );     /* th
1f30: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 63  e name context c
1f40: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 2a  annot be NULL. *
1f50: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  /.  assert( zCol
1f60: 20 29 3b 20 20 20 20 2f 2a 20 54 68 65 20 5a 20   );    /* The Z 
1f70: 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20  in X.Y.Z cannot 
1f80: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 61 73 73  be NULL */.  ass
1f90: 65 72 74 28 20 21 45 78 70 72 48 61 73 41 6e 79  ert( !ExprHasAny
1fa0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1fb0: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
1fc0: 52 65 64 75 63 65 64 29 20 29 3b 0a 0a 20 20 2f  Reduced) );..  /
1fd0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1fe0: 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d 6d 61 74 63   node to no-matc
1ff0: 68 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54  h */.  pExpr->iT
2000: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 70 45 78  able = -1;.  pEx
2010: 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  pr->pTab = 0;.  
2020: 45 78 70 72 53 65 74 49 72 72 65 64 75 63 69 62  ExprSetIrreducib
2030: 6c 65 28 70 45 78 70 72 29 3b 0a 0a 20 20 2f 2a  le(pExpr);..  /*
2040: 20 53 74 61 72 74 20 61 74 20 74 68 65 20 69 6e   Start at the in
2050: 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e 74 65 78 74  ner-most context
2060: 20 61 6e 64 20 6d 6f 76 65 20 6f 75 74 77 61 72   and move outwar
2070: 64 20 75 6e 74 69 6c 20 61 20 6d 61 74 63 68 20  d until a match 
2080: 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 77 68  is found */.  wh
2090: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
20a0: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
20b0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
20c0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
20d0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
20e0: 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  t;..    if( pSrc
20f0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f  List ){.      fo
2100: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72  r(i=0, pItem=pSr
2110: 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63  cList->a; i<pSrc
2120: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2130: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2140: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a     Table *pTab;.
2150: 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b          int iDb;
2160: 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20  .        Column 
2170: 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20  *pCol;.  .      
2180: 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
2190: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73  pTab;.        as
21a0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 26 26  sert( pTab!=0 &&
21b0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d 30 20   pTab->zName!=0 
21c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d  );.        iDb =
21d0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
21e0: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
21f0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
2200: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
2210: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20  nCol>0 );.      
2220: 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20    if( zTab ){.  
2230: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
2240: 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
2250: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
2260: 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d  TabName = pItem-
2270: 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  >zAlias;.       
2280: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2290: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
22a0: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
22b0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
22c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22d0: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
22e0: 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  me = pTab->zName
22f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2300: 28 20 4e 45 56 45 52 28 7a 54 61 62 4e 61 6d 65  ( NEVER(zTabName
2310: 3d 3d 30 29 20 7c 7c 20 73 71 6c 69 74 65 33 53  ==0) || sqlite3S
2320: 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c  trICmp(zTabName,
2330: 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20   zTab)!=0 ){.   
2340: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2350: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2360: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2370: 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c  f( zDb!=0 && sql
2380: 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e  ite3StrICmp(db->
2390: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
23a0: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
23b0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
23c0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
23d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
23e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23f0: 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29  f( 0==(cntTab++)
2400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
2410: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
2420: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
2430: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2440: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
2450: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
2460: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
2470: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
2480: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
2490: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a   }.        for(j
24a0: 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61  =0, pCol=pTab->a
24b0: 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f  Col; j<pTab->nCo
24c0: 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b  l; j++, pCol++){
24d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
24e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
24f0: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
2500: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2510: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68     /* If there h
2520: 61 73 20 62 65 65 6e 20 65 78 61 63 74 6c 79 20  as been exactly 
2530: 6f 6e 65 20 70 72 69 6f 72 20 6d 61 74 63 68 20  one prior match 
2540: 61 6e 64 20 74 68 69 73 20 6d 61 74 63 68 0a 20  and this match. 
2550: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73             ** is
2560: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68   for the right-h
2570: 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 61 20 4e  and table of a N
2580: 41 54 55 52 41 4c 20 4a 4f 49 4e 20 6f 72 20 69  ATURAL JOIN or i
2590: 73 20 69 6e 20 61 20 0a 20 20 20 20 20 20 20 20  s in a .        
25a0: 20 20 20 20 2a 2a 20 55 53 49 4e 47 20 63 6c 61      ** USING cla
25b0: 75 73 65 2c 20 74 68 65 6e 20 73 6b 69 70 20 74  use, then skip t
25c0: 68 69 73 20 6d 61 74 63 68 2e 0a 20 20 20 20 20  his match..     
25d0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
25e0: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 31        if( cnt==1
25f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2600: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69    if( pItem->joi
2610: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
2620: 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2640: 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75   nameInUsingClau
2650: 73 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  se(pItem->pUsing
2660: 2c 20 7a 43 6f 6c 29 20 29 20 63 6f 6e 74 69 6e  , zCol) ) contin
2670: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2680: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  }.            cn
2690: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
26a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
26b0: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
26c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
26d0: 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  pr->pTab = pTab;
26e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61  .            pMa
26f0: 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20  tch = pItem;.   
2700: 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61           pSchema
2710: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
2720: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;.            /*
2730: 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20   Substitute the 
2740: 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31  rowid (column -1
2750: 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  ) for the INTEGE
2760: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
2770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
2780: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d  pr->iColumn = j=
2790: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
27a0: 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20 20 20 20  1 : (i16)j;.    
27b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
27c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
27e0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
27f0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
2800: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
2810: 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65  e not already re
2820: 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c  solved the name,
2830: 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20   then maybe .   
2840: 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e   ** it is a new.
2850: 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67  * or old.* trigg
2860: 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65  er argument refe
2870: 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20  rence.    */.   
2880: 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a   if( zDb==0 && z
2890: 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30  Tab!=0 && cnt==0
28a0: 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72 69   && pParse->pTri
28b0: 67 67 65 72 54 61 62 21 3d 30 20 29 7b 0a 20 20  ggerTab!=0 ){.  
28c0: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 50 61      int op = pPa
28d0: 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f 70 3b  rse->eTriggerOp;
28e0: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
28f0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ab = 0;.      as
2900: 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 44 45 4c  sert( op==TK_DEL
2910: 45 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50  ETE || op==TK_UP
2920: 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  DATE || op==TK_I
2930: 4e 53 45 52 54 20 29 3b 0a 20 20 20 20 20 20 69  NSERT );.      i
2940: 66 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54 45  f( op!=TK_DELETE
2950: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2960: 6d 70 28 22 6e 65 77 22 2c 7a 54 61 62 29 20 3d  mp("new",zTab) =
2970: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  = 0 ){.        p
2980: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 31  Expr->iTable = 1
2990: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
29a0: 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65   pParse->pTrigge
29b0: 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rTab;.      }els
29c0: 65 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 53  e if( op!=TK_INS
29d0: 45 52 54 20 26 26 20 73 71 6c 69 74 65 33 53 74  ERT && sqlite3St
29e0: 72 49 43 6d 70 28 22 6f 6c 64 22 2c 7a 54 61 62  rICmp("old",zTab
29f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2a00: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2a10: 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  0;.        pTab 
2a20: 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67  = pParse->pTrigg
2a30: 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 0a  erTab;.      }..
2a40: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29        if( pTab )
2a50: 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  { .        int i
2a60: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 63  Col;.        pSc
2a70: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
2a80: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 63 6e  hema;.        cn
2a90: 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tTab++;.        
2aa0: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
2ab0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
2ac0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
2ad0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26  Column *pCol = &
2ae0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
2af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2b10: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
2b20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2b30: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
2b40: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
2b50: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20             iCol 
2b60: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
2b70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2b80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2b90: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2ba0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 70       if( iCol>=p
2bb0: 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 73 71 6c  Tab->nCol && sql
2bc0: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
2bd0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
2be0: 43 6f 6c 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  Col = -1;       
2bf0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 34 39 31 31   /* IMP: R-44911
2c00: 2d 35 35 31 32 34 20 2a 2f 0a 20 20 20 20 20 20  -55124 */.      
2c10: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2c20: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
2c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  ){.          cnt
2c40: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
2c50: 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ( iCol<0 ){.    
2c60: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
2c70: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
2c80: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
2c90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2ca0: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
2cb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2cc0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
2cd0: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
2ce0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
2cf0: 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20  ol==32 );.      
2d00: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6c        pParse->ol
2d10: 64 6d 61 73 6b 20 7c 3d 20 28 69 43 6f 6c 3e 3d  dmask |= (iCol>=
2d20: 33 32 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  32 ? 0xffffffff 
2d30: 3a 20 28 28 28 75 33 32 29 31 29 3c 3c 69 43 6f  : (((u32)1)<<iCo
2d40: 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  l));.          }
2d50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2d60: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
2d70: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
2d80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
2d90: 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20  ol==32 );.      
2da0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 65        pParse->ne
2db0: 77 6d 61 73 6b 20 7c 3d 20 28 69 43 6f 6c 3e 3d  wmask |= (iCol>=
2dc0: 33 32 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  32 ? 0xffffffff 
2dd0: 3a 20 28 28 28 75 33 32 29 31 29 3c 3c 69 43 6f  : (((u32)1)<<iCo
2de0: 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  l));.          }
2df0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
2e00: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  ->iColumn = (i16
2e10: 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  )iCol;.         
2e20: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
2e30: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Tab;.          i
2e40: 73 54 72 69 67 67 65 72 20 3d 20 31 3b 0a 20 20  sTrigger = 1;.  
2e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2e60: 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
2e70: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2e80: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f  OMIT_TRIGGER) */
2e90: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
2ea0: 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65  Perhaps the name
2eb0: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
2ec0: 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20  to the ROWID.   
2ed0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
2ee0: 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20  =0 && cntTab==1 
2ef0: 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
2f00: 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  d(zCol) ){.     
2f10: 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   cnt = 1;.      
2f20: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
2f30: 20 2d 31 3b 20 20 20 20 20 2f 2a 20 49 4d 50 3a   -1;     /* IMP:
2f40: 20 52 2d 34 34 39 31 31 2d 35 35 31 32 34 20 2a   R-44911-55124 *
2f50: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61  /.      pExpr->a
2f60: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
2f70: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
2f80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
2f90: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
2fa0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a  is of the form Z
2fb0: 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59   (not Y.Z or X.Y
2fc0: 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d  .Z) then the nam
2fd0: 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74  e Z.    ** might
2fe0: 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73   refer to an res
2ff0: 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20  ult-set alias.  
3000: 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
3010: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
3020: 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65      ** we are re
3030: 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e  solving names in
3040: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
3050: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3060: 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20  ng command:.    
3070: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45  **.    **     SE
3080: 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52  LECT a+b AS x FR
3090: 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78  OM table WHERE x
30a0: 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  <10;.    **.    
30b0: 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65  ** In cases like
30c0: 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70   this, replace p
30d0: 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79  Expr with a copy
30e0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
30f0: 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66  on that.    ** f
3100: 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20  orms the result 
3110: 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22  set entry ("a+b"
3120: 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29   in the example)
3130: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65   and return imme
3140: 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20  diately..    ** 
3150: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78  Note that the ex
3160: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
3170: 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c  result set shoul
3180: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
3190: 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c  een.    ** resol
31a0: 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20  ved by the time 
31b0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
31c0: 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20   is resolved..  
31d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
31e0: 3d 3d 30 20 26 26 20 28 70 45 4c 69 73 74 20 3d  ==0 && (pEList =
31f0: 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d 30   pNC->pEList)!=0
3200: 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20   && zTab==0 ){. 
3210: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3220: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
3230: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3240: 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d  r *zAs = pEList-
3250: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
3260: 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20       if( zAs!=0 
3270: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
3280: 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20  p(zAs, zCol)==0 
3290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
32a0: 72 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20 20  r *pOrig;.      
32b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
32c0: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
32d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
32e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
32f0: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
3300: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
3310: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
3320: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20  r->x.pSelect==0 
3330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  );.          pOr
3340: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  ig = pEList->a[j
3350: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
3360: 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
3370: 6c 61 67 73 26 4e 43 5f 41 6c 6c 6f 77 41 67 67  lags&NC_AllowAgg
3380: 29 3d 3d 30 20 26 26 20 45 78 70 72 48 61 73 50  )==0 && ExprHasP
3390: 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45  roperty(pOrig, E
33a0: 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  P_Agg) ){.      
33b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
33c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
33d0: 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64  isuse of aliased
33e0: 20 61 67 67 72 65 67 61 74 65 20 25 73 22 2c 20   aggregate %s", 
33f0: 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zAs);.          
3400: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
3410: 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rt;.          }.
3420: 20 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76            resolv
3430: 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70  eAlias(pParse, p
3440: 45 4c 69 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c  EList, j, pExpr,
3450: 20 22 22 2c 20 6e 53 75 62 71 75 65 72 79 29 3b   "", nSubquery);
3460: 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d  .          cnt =
3470: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   1;.          pM
3480: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
3490: 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62      assert( zTab
34a0: 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b  ==0 && zDb==0 );
34b0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
34c0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a  lookupname_end;.
34d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34e0: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
34f0: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
3500: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
3510: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
3520: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
3530: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
3540: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
3550: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
3560: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
3570: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
3580: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
3590: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
35a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 6e 53  >pNext;.      nS
35b0: 75 62 71 75 65 72 79 2b 2b 3b 0a 20 20 20 20 7d  ubquery++;.    }
35c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
35d0: 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e  If X and Y are N
35e0: 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ULL (in other wo
35f0: 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20  rds if only the 
3600: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73  column name Z is
3610: 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20  .  ** supplied) 
3620: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
3630: 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69   Z is enclosed i
3640: 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c  n double-quotes,
3650: 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20   then.  ** Z is 
3660: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
3670: 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d   if it doesn't m
3680: 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  atch any column 
3690: 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a  names.  In that.
36a0: 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65    ** case, we ne
36b0: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67  ed to return rig
36c0: 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20  ht away and not 
36d0: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
36e0: 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a   to.  ** pExpr..
36f0: 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73    **.  ** Becaus
3700: 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  e no reference w
3710: 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72  as made to outer
3720: 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70   contexts, the p
3730: 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69  NC->nRef.  ** fi
3740: 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61  elds are not cha
3750: 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74  nged in any cont
3760: 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ext..  */.  if( 
3770: 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d  cnt==0 && zTab==
3780: 30 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  0 && ExprHasProp
3790: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 44 62  erty(pExpr,EP_Db
37a0: 6c 51 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20  lQuoted) ){.    
37b0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53  pExpr->op = TK_S
37c0: 54 52 49 4e 47 3b 0a 20 20 20 20 70 45 78 70 72  TRING;.    pExpr
37d0: 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
37e0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
37f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
3800: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
3810: 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63  ere was not matc
3820: 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20  h.  cnt>1 means 
3830: 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f  there were two o
3840: 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63  r.  ** more matc
3850: 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  hes.  Either way
3860: 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72  , we have an err
3870: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  or..  */.  if( c
3880: 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  nt!=1 ){.    con
3890: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
38a0: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
38b0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
38c0: 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73  mn" : "ambiguous
38d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20   column name";. 
38e0: 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20     if( zDb ){.  
38f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3900: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
3910: 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72   %s.%s.%s", zErr
3920: 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f  , zDb, zTab, zCo
3930: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
3940: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
3950: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3960: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
3970: 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c  %s", zErr, zTab,
3980: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73   zCol);.    }els
3990: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
39a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
39b0: 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c   "%s: %s", zErr,
39c0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   zCol);.    }.  
39d0: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
39e0: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 70  chema = 1;.    p
39f0: 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  TopNC->nErr++;. 
3a00: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f   }..  /* If a co
3a10: 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c  lumn from a tabl
3a20: 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73  e in pSrcList is
3a30: 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65   referenced, the
3a40: 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68  n record.  ** th
3a50: 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70  is fact in the p
3a60: 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55  SrcList.a[].colU
3a70: 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f  sed bitmask.  Co
3a80: 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20  lumn 0 causes.  
3a90: 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73  ** bit 0 to be s
3aa0: 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65  et.  Column 1 se
3ab0: 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73  ts bit 1.  And s
3ac0: 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65  o forth.  If the
3ad0: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d  .  ** column num
3ae0: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
3af0: 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  han the number o
3b00: 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69  f bits in the bi
3b10: 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20  tmask.  ** then 
3b20: 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64  set the high-ord
3b30: 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69  er bit of the bi
3b40: 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  tmask..  */.  if
3b50: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
3b60: 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30  >=0 && pMatch!=0
3b70: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
3b80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
3b90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
3ba0: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 69 66  =BMS-1 );.    if
3bb0: 28 20 6e 3e 3d 42 4d 53 20 29 7b 0a 20 20 20 20  ( n>=BMS ){.    
3bc0: 20 20 6e 20 3d 20 42 4d 53 2d 31 3b 0a 20 20 20    n = BMS-1;.   
3bd0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
3be0: 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d  Match->iCursor==
3bf0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
3c00: 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c  .    pMatch->col
3c10: 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73  Used |= ((Bitmas
3c20: 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20 20  k)1)<<n;.  }..  
3c30: 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  /* Clean up and 
3c40: 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
3c50: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3c60: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
3c70: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  );.  pExpr->pLef
3c80: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
3c90: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3ca0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
3cb0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
3cc0: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
3cd0: 3d 20 28 69 73 54 72 69 67 67 65 72 20 3f 20 54  = (isTrigger ? T
3ce0: 4b 5f 54 52 49 47 47 45 52 20 3a 20 54 4b 5f 43  K_TRIGGER : TK_C
3cf0: 4f 4c 55 4d 4e 29 3b 0a 6c 6f 6f 6b 75 70 6e 61  OLUMN);.lookupna
3d00: 6d 65 5f 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e  me_end:.  if( cn
3d10: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65  t==1 ){.    asse
3d20: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
3d30: 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61    sqlite3AuthRea
3d40: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
3d50: 20 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70   pSchema, pNC->p
3d60: 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 2f 2a  SrcList);.    /*
3d70: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
3d80: 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c  Ref value on all
3d90: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66   name contexts f
3da0: 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a  rom TopNC up to.
3db0: 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74      ** the point
3dc0: 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20   where the name 
3dd0: 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20  matched. */.    
3de0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61  for(;;){.      a
3df0: 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30  ssert( pTopNC!=0
3e00: 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43   );.      pTopNC
3e10: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
3e20: 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20  if( pTopNC==pNC 
3e30: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
3e40: 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e  TopNC = pTopNC->
3e50: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
3e60: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
3e70: 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
3e80: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
3e90: 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rt;.  }.}../*.**
3ea0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
3eb0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
3ec0: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
3ed0: 74 6f 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  to load the colu
3ee0: 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72 6f 6d 20  mn iCol.** from 
3ef0: 64 61 74 61 73 6f 75 72 63 65 20 69 53 72 63 20  datasource iSrc 
3f00: 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63 2e  in SrcList pSrc.
3f10: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
3f20: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
3f30: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  r(sqlite3 *db, S
3f40: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 69 6e  rcList *pSrc, in
3f50: 74 20 69 53 72 63 2c 20 69 6e 74 20 69 43 6f 6c  t iSrc, int iCol
3f60: 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73  ){.  Expr *p = s
3f70: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
3f80: 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30  db, TK_COLUMN, 0
3f90: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
3fa0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
3fb0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
3fc0: 3d 20 26 70 53 72 63 2d 3e 61 5b 69 53 72 63 5d  = &pSrc->a[iSrc]
3fd0: 3b 0a 20 20 20 20 70 2d 3e 70 54 61 62 20 3d 20  ;.    p->pTab = 
3fe0: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
3ff0: 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74   p->iTable = pIt
4000: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
4010: 20 69 66 28 20 70 2d 3e 70 54 61 62 2d 3e 69 50   if( p->pTab->iP
4020: 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20  Key==iCol ){.   
4030: 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20     p->iColumn = 
4040: 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
4050: 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20       p->iColumn 
4060: 3d 20 28 79 6e 56 61 72 29 69 43 6f 6c 3b 0a 20  = (ynVar)iCol;. 
4070: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4080: 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
4090: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
40a0: 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20  ==BMS-1 );.     
40b0: 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20   pItem->colUsed 
40c0: 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  |= ((Bitmask)1)<
40d0: 3c 28 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 42 4d  <(iCol>=BMS ? BM
40e0: 53 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a 20 20 20  S-1 : iCol);.   
40f0: 20 7d 0a 20 20 20 20 45 78 70 72 53 65 74 50 72   }.    ExprSetPr
4100: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 73  operty(p, EP_Res
4110: 6f 6c 76 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65  olved);.  }.  re
4120: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
4130: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
4140: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71   callback for sq
4150: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 2e  lite3WalkExpr().
4160: 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73  .**.** Resolve s
4170: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e  ymbolic names in
4180: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65  to TK_COLUMN ope
4190: 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  rators for the c
41a0: 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69  urrent.** node i
41b0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
41c0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30   tree.  Return 0
41d0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65   to continue the
41e0: 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20   search down.** 
41f0: 74 68 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f  the tree or 2 to
4200: 20 61 62 6f 72 74 20 74 68 65 20 74 72 65 65 20   abort the tree 
4210: 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  walk..**.** This
4220: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
4230: 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  es error checkin
4240: 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c  g and name resol
4250: 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e  ution for.** fun
4260: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
4270: 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61  e operator for a
4280: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
4290: 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a  ns is changed.**
42a0: 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54   to TK_AGG_FUNCT
42b0: 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ION..*/.static i
42c0: 6e 74 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74  nt resolveExprSt
42d0: 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ep(Walker *pWalk
42e0: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
42f0: 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  {.  NameContext 
4300: 2a 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  *pNC;.  Parse *p
4310: 50 61 72 73 65 3b 0a 0a 20 20 70 4e 43 20 3d 20  Parse;..  pNC = 
4320: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
4330: 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30    assert( pNC!=0
4340: 20 29 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70   );.  pParse = p
4350: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 61 73  NC->pParse;.  as
4360: 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 57  sert( pParse==pW
4370: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 20 29 3b  alker->pParse );
4380: 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 41  ..  if( ExprHasA
4390: 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  nyProperty(pExpr
43a0: 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20 29  , EP_Resolved) )
43b0: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
43c0: 65 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  e;.  ExprSetProp
43d0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
43e0: 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65  esolved);.#ifnde
43f0: 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70  f NDEBUG.  if( p
4400: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20  NC->pSrcList && 
4410: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e  pNC->pSrcList->n
4420: 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53  Alloc>0 ){.    S
4430: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
4440: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
4450: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
4460: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d   for(i=0; i<pNC-
4470: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  >pSrcList->nSrc;
4480: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
4490: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
44a0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
44b0: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
44c0: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
44d0: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
44e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
44f0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
4500: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4510: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
4520: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20  E_DELETE_LIMIT) 
4530: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
4540: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
4550: 29 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65  ).    /* The spe
4560: 63 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 54 4b  cial operator TK
4570: 5f 52 4f 57 20 6d 65 61 6e 73 20 75 73 65 20 74  _ROW means use t
4580: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
4590: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 63 6f   first.    ** co
45a0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f 4d  lumn in the FROM
45b0: 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 69   clause.  This i
45c0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4c 49  s used by the LI
45d0: 4d 49 54 20 61 6e 64 20 4f 52 44 45 52 20 42 59  MIT and ORDER BY
45e0: 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 70  .    ** clause p
45f0: 72 6f 63 65 73 73 69 6e 67 20 6f 6e 20 55 50 44  rocessing on UPD
4600: 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20 73  ATE and DELETE s
4610: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
4620: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 4f  /.    case TK_RO
4630: 57 3a 20 7b 0a 20 20 20 20 20 20 53 72 63 4c 69  W: {.      SrcLi
4640: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
4650: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
4660: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
4670: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
4680: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
4690: 72 63 4c 69 73 74 20 26 26 20 70 53 72 63 4c 69  rcList && pSrcLi
46a0: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  st->nSrc==1 );. 
46b0: 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 53 72       pItem = pSr
46c0: 63 4c 69 73 74 2d 3e 61 3b 20 0a 20 20 20 20 20  cList->a; .     
46d0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
46e0: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45  COLUMN;.      pE
46f0: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 49 74 65  xpr->pTab = pIte
4700: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70  m->pTab;.      p
4710: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
4720: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
4730: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
4740: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
4750: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
4760: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
4770: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
4780: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
4790: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
47a0: 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f  E_ENABLE_UPDATE_
47b0: 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26  DELETE_LIMIT) &&
47c0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
47d0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
47e0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e  */..    /* A lon
47f0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
4800: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
4810: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
4820: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
4830: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b       return look
4840: 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30  upName(pParse, 0
4850: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
4860: 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72  oken, pNC, pExpr
4870: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
4880: 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20  /* A table name 
4890: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  and column name:
48a0: 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a       ID.ID.    *
48b0: 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c  * Or a database,
48c0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
48d0: 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20  n:  ID.ID.ID.   
48e0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
48f0: 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  DOT: {.      con
4900: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
4910: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
4920: 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
4930: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
4940: 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
4950: 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  Right;..      /*
4960: 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30   if( pSrcList==0
4970: 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20   ) break; */.   
4980: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
4990: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
49a0: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d   if( pRight->op=
49b0: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
49c0: 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20    zDb = 0;.     
49d0: 20 20 20 7a 54 61 62 6c 65 20 3d 20 70 45 78 70     zTable = pExp
49e0: 72 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  r->pLeft->u.zTok
49f0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  en;.        zCol
4a00: 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e  umn = pRight->u.
4a10: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  zToken;.      }e
4a20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
4a30: 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d  ert( pRight->op=
4a40: 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_DOT );.     
4a50: 20 20 20 7a 44 62 20 3d 20 70 45 78 70 72 2d 3e     zDb = pExpr->
4a60: 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
4a70: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20  .        zTable 
4a80: 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d  = pRight->pLeft-
4a90: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
4aa0: 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69     zColumn = pRi
4ab0: 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a  ght->pRight->u.z
4ac0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Token;.      }. 
4ad0: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b       return look
4ae0: 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  upName(pParse, z
4af0: 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c  Db, zTable, zCol
4b00: 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29  umn, pNC, pExpr)
4b10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4b20: 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  Resolve function
4b30: 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20   names.    */.  
4b40: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f    case TK_CONST_
4b50: 46 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54  FUNC:.    case T
4b60: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
4b70: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
4b80: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
4b90: 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
4ba0: 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f  argument list */
4bb0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
4bc0: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
4bd0: 78 70 72 20 3a 20 30 3b 20 20 20 20 2f 2a 20 4e  xpr : 0;    /* N
4be0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
4bf0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
4c00: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
4c10: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
4c20: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
4c30: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
4c40: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
4c50: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
4c60: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
4c70: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
4c80: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
4c90: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
4ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4cb0: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
4cc0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
4cd0: 0a 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b  .      int auth;
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74     /* Authorizat
4d00: 69 6f 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66  ion to use the f
4d10: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
4d20: 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20   int nId;       
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4d40: 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  Number of charac
4d50: 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e  ters in function
4d60: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63   name */.      c
4d70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20  onst char *zId; 
4d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4d90: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
4da0: 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65   */.      FuncDe
4db0: 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20  f *pDef;        
4dc0: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
4dd0: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
4de0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
4df0: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50   u8 enc = ENC(pP
4e00: 61 72 73 65 2d 3e 64 62 29 3b 20 20 20 2f 2a 20  arse->db);   /* 
4e10: 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63  The database enc
4e20: 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20  oding */..      
4e30: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
4e40: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55  >op==TK_CONST_FU
4e50: 4e 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  NC );.      asse
4e60: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
4e70: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
4e80: 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20  IsSelect) );.   
4e90: 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
4ea0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
4eb0: 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nId = sqlite3Str
4ec0: 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20  len30(zId);.    
4ed0: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
4ee0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
4ef0: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
4f00: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
4f10: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
4f20: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
4f30: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
4f40: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
4f50: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 32 2c  b, zId, nId, -2,
4f60: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
4f70: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
4f80: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
4f90: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
4fa0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4fb0: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
4fc0: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
4fd0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
4fe0: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
4ff0: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
5000: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
5010: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5020: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
5030: 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20    if( pDef ){.  
5040: 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c        auth = sql
5050: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
5060: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e  arse, SQLITE_FUN
5070: 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e  CTION, 0, pDef->
5080: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
5090: 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c     if( auth!=SQL
50a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
50b0: 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51      if( auth==SQ
50c0: 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20  LITE_DENY ){.   
50d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
50e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
50f0: 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64   "not authorized
5100: 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
5110: 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d             pDef-
5140: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
5150: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
5160: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5170: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
5180: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
5190: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
51a0: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20  C_Prune;.       
51b0: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
51c0: 66 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  f.      if( is_a
51d0: 67 67 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c  gg && (pNC->ncFl
51e0: 61 67 73 20 26 20 4e 43 5f 41 6c 6c 6f 77 41 67  ags & NC_AllowAg
51f0: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  g)==0 ){.       
5200: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5210: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
5220: 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75   of aggregate fu
5230: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20  nction %.*s()", 
5240: 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20  nId,zId);.      
5250: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
5260: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
5270: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  0;.      }else i
5280: 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  f( no_such_func 
5290: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
52a0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
52b0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  e, "no such func
52c0: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64  tion: %.*s", nId
52d0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
52e0: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
52f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f     }else if( wro
5300: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20  ng_num_args ){. 
5310: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
5320: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77  rorMsg(pParse,"w
5330: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
5340: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
5350: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20  tion %.*s()",.  
5360: 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20             nId, 
5370: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
5380: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
5390: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
53a0: 61 67 67 20 29 20 70 4e 43 2d 3e 6e 63 46 6c 61  agg ) pNC->ncFla
53b0: 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41  gs &= ~NC_AllowA
53c0: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
53d0: 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57  3WalkExprList(pW
53e0: 61 6c 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20  alker, pList);. 
53f0: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
5400: 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43  ){.        NameC
5410: 6f 6e 74 65 78 74 20 2a 70 4e 43 32 20 3d 20 70  ontext *pNC2 = p
5420: 4e 43 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  NC;.        pExp
5430: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46  r->op = TK_AGG_F
5440: 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20  UNCTION;.       
5450: 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 30 3b   pExpr->op2 = 0;
5460: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
5470: 70 4e 43 32 20 26 26 20 21 73 71 6c 69 74 65 33  pNC2 && !sqlite3
5480: 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
5490: 53 72 63 28 70 45 78 70 72 2c 20 70 4e 43 32 2d  Src(pExpr, pNC2-
54a0: 3e 70 53 72 63 4c 69 73 74 29 20 29 7b 0a 20 20  >pSrcList) ){.  
54b0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
54c0: 70 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  p2++;.          
54d0: 70 4e 43 32 20 3d 20 70 4e 43 32 2d 3e 70 4e 65  pNC2 = pNC2->pNe
54e0: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
54f0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 32 20 29        if( pNC2 )
5500: 20 70 4e 43 32 2d 3e 6e 63 46 6c 61 67 73 20 7c   pNC2->ncFlags |
5510: 3d 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20 20  = NC_HasAgg;.   
5520: 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67       pNC->ncFlag
5530: 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67  s |= NC_AllowAgg
5540: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5550: 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70  /* FIX ME:  Comp
5560: 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ute pExpr->affin
5570: 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ity based on the
5580: 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e   expected return
5590: 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f  .      ** type o
55a0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a  f the function .
55b0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
55c0: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
55d0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
55e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
55f0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
5600: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
5610: 20 54 4b 5f 45 58 49 53 54 53 3a 20 20 74 65 73   TK_EXISTS:  tes
5620: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
5630: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23  ==TK_EXISTS );.#
5640: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
5650: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_IN: {.      te
5660: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
5670: 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
5680: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
5690: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
56a0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
56b0: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d        int nRef =
56c0: 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 23 69 66 6e   pNC->nRef;.#ifn
56d0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
56e0: 43 48 45 43 4b 0a 20 20 20 20 20 20 20 20 69 66  CHECK.        if
56f0: 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
5700: 26 20 4e 43 5f 49 73 43 68 65 63 6b 29 21 3d 30  & NC_IsCheck)!=0
5710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
5720: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5730: 61 72 73 65 2c 22 73 75 62 71 75 65 72 69 65 73  arse,"subqueries
5740: 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43   prohibited in C
5750: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
5760: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65  ");.        }.#e
5770: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 73 71 6c  ndif.        sql
5780: 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
5790: 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78  Walker, pExpr->x
57a0: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
57b0: 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e     assert( pNC->
57c0: 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20  nRef>=nRef );.  
57d0: 20 20 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d        if( nRef!=
57e0: 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20  pNC->nRef ){.   
57f0: 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
5800: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5810: 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20  _VarSelect);.   
5820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
5830: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5840: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
5850: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20 20  _OMIT_CHECK.    
5860: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
5870: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  : {.      if( (p
5880: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
5890: 5f 49 73 43 68 65 63 6b 29 21 3d 30 20 29 7b 0a  _IsCheck)!=0 ){.
58a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
58b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
58c0: 70 61 72 61 6d 65 74 65 72 73 20 70 72 6f 68 69  parameters prohi
58d0: 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63  bited in CHECK c
58e0: 6f 6e 73 74 72 61 69 6e 74 73 22 29 3b 0a 20 20  onstraints");.  
58f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5900: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
5910: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 50    }.  return (pP
5920: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
5930: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
5940: 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f 41 62  Failed) ? WRC_Ab
5950: 6f 72 74 20 3a 20 57 52 43 5f 43 6f 6e 74 69 6e  ort : WRC_Contin
5960: 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c  ue;.}../*.** pEL
5970: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
5980: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 69   expressions whi
5990: 63 68 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  ch are really th
59a0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
59b0: 74 68 65 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20  the.** a SELECT 
59c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 45 20 69  statement.  pE i
59d0: 73 20 61 20 74 65 72 6d 20 69 6e 20 61 6e 20 4f  s a term in an O
59e0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
59f0: 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 54   BY clause..** T
5a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
5a10: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70 45 20  ks to see if pE 
5a20: 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e  is a simple iden
5a30: 74 69 66 69 65 72 20 77 68 69 63 68 20 63 6f 72  tifier which cor
5a40: 72 65 73 70 6f 6e 64 73 0a 2a 2a 20 74 6f 20 74  responds.** to t
5a50: 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 20 6f 6e  he AS-name of on
5a60: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 6f  e of the terms o
5a70: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5a80: 20 6c 69 73 74 2e 20 20 49 66 20 69 74 20 69 73   list.  If it is
5a90: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
5aa0: 65 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  e return an inte
5ab0: 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ger between 1 an
5ac0: 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74  d N where N is t
5ad0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
5ae0: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 45 4c 69  elements in pELi
5af0: 73 74 2c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  st, correspondin
5b00: 67 20 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e  g to the matchin
5b10: 67 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  g entry.  If the
5b20: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63  re is.** no matc
5b30: 68 2c 20 6f 72 20 69 66 20 70 45 20 69 73 20 6e  h, or if pE is n
5b40: 6f 74 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e  ot a simple iden
5b50: 74 69 66 69 65 72 2c 20 74 68 65 6e 20 74 68 69  tifier, then thi
5b60: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
5b70: 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 45 4c  urn 0..**.** pEL
5b80: 69 73 74 20 68 61 73 20 62 65 65 6e 20 72 65 73  ist has been res
5b90: 6f 6c 76 65 64 2e 20 20 70 45 20 68 61 73 20 6e  olved.  pE has n
5ba0: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
5bb0: 74 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28  t resolveAsName(
5bc0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5bd0: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
5be0: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72   context for err
5bf0: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
5c00: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
5c10: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65  t,  /* List of e
5c20: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 73 63  xpressions to sc
5c30: 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  an */.  Expr *pE
5c40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
5c50: 70 72 65 73 73 69 6f 6e 20 77 65 20 61 72 65 20  pression we are 
5c60: 74 72 79 69 6e 67 20 74 6f 20 6d 61 74 63 68 20  trying to match 
5c70: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
5c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
5c90: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
5ca0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
5cb0: 52 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66  R(pParse);..  if
5cc0: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ( pE->op==TK_ID 
5cd0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
5ce0: 6c 20 3d 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e  l = pE->u.zToken
5cf0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5d00: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5d10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
5d20: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
5d30: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
5d40: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
5d50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5d60: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
5d70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
5d80: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
5d90: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
5da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73  ;.}../*.** pE is
5db0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
5dc0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63   expression whic
5dd0: 68 20 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65  h is a single te
5de0: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 4f 52 44  rm in the.** ORD
5df0: 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f  ER BY of a compo
5e00: 75 6e 64 20 53 45 4c 45 43 54 2e 20 20 54 68 65  und SELECT.  The
5e10: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
5e20: 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20 6e 61 6d 65  not been.** name
5e30: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a   resolved..**.**
5e40: 20 41 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   At the point th
5e50: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5e60: 6c 6c 65 64 2c 20 77 65 20 61 6c 72 65 61 64 79  lled, we already
5e70: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 0a 2a   know that the.*
5e80: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  * ORDER BY term 
5e90: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
5ea0: 72 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  r index into the
5eb0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
5ec0: 61 74 0a 2a 2a 20 63 61 73 65 20 69 73 20 68 61  at.** case is ha
5ed0: 6e 64 6c 65 64 20 62 79 20 74 68 65 20 63 61 6c  ndled by the cal
5ee0: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  ling routine..**
5ef0: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6d  .** Attempt to m
5f00: 61 74 63 68 20 70 45 20 61 67 61 69 6e 73 74 20  atch pE against 
5f10: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
5f20: 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ns in the left-m
5f30: 6f 73 74 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ost.** SELECT st
5f40: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
5f50: 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20   the index i of 
5f60: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  the matching col
5f70: 75 6d 6e 2c 0a 2a 2a 20 61 73 20 61 6e 20 69 6e  umn,.** as an in
5f80: 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  dication to the 
5f90: 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73  caller that it s
5fa0: 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68  hould sort by th
5fb0: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  e i-th column..*
5fc0: 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
5fd0: 63 6f 6c 75 6d 6e 20 69 73 20 31 2e 20 20 49 6e  column is 1.  In
5fe0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
5ff0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
6000: 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   is the.** same 
6010: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74 68  integer value th
6020: 61 74 20 77 6f 75 6c 64 20 62 65 20 75 73 65 64  at would be used
6030: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74   in the SQL stat
6040: 65 6d 65 6e 74 20 74 6f 20 69 6e 64 69 63 61 74  ement to indicat
6050: 65 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e.** the column.
6060: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
6070: 69 73 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74  is no match, ret
6080: 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 2d  urn 0.  Return -
6090: 31 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  1 if an error oc
60a0: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
60b0: 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64 65 72  int resolveOrder
60c0: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74  ByTermToExprList
60d0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
60e0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
60f0: 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72  g context for er
6100: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
6110: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
6120: 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  t,   /* The SELE
6130: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  CT statement wit
6140: 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
6150: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
6160: 2a 70 45 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *pE           /*
6170: 20 54 68 65 20 73 70 65 63 69 66 69 63 20 4f 52   The specific OR
6180: 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a 29  DER BY term */.)
6190: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
61a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
61b0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
61c0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f  List *pEList;  /
61d0: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * The columns of
61e0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
61f0: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
6200: 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20   nc;    /* Name 
6210: 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f  context for reso
6220: 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 20 20 73 71  lving pE */.  sq
6230: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
6240: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
6250: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
6260: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
6270: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
6280: 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
6290: 73 20 2a 2f 0a 20 20 75 38 20 73 61 76 65 64 53  s */.  u8 savedS
62a0: 75 70 70 45 72 72 3b 20 20 20 2f 2a 20 53 61 76  uppErr;   /* Sav
62b0: 65 64 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e  ed value of db->
62c0: 73 75 70 70 72 65 73 73 45 72 72 20 2a 2f 0a 0a  suppressErr */..
62d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
62e0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
62f0: 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70  E, &i)==0 );.  p
6300: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
6310: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 52  >pEList;..  /* R
6320: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
6330: 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
6340: 20 74 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e   term expression
6350: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
6360: 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63  nc, 0, sizeof(nc
6370: 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20  ));.  nc.pParse 
6380: 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70  = pParse;.  nc.p
6390: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
63a0: 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45  t->pSrc;.  nc.pE
63b0: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
63c0: 20 6e 63 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43   nc.ncFlags = NC
63d0: 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 6e 63 2e  _AllowAgg;.  nc.
63e0: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 64 62 20 3d  nErr = 0;.  db =
63f0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
6400: 61 76 65 64 53 75 70 70 45 72 72 20 3d 20 64 62  avedSuppErr = db
6410: 2d 3e 73 75 70 70 72 65 73 73 45 72 72 3b 0a 20  ->suppressErr;. 
6420: 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
6430: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
6440: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
6450: 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 3b 0a 20  ames(&nc, pE);. 
6460: 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
6470: 20 3d 20 73 61 76 65 64 53 75 70 70 45 72 72 3b   = savedSuppErr;
6480: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6490: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  rn 0;..  /* Try 
64a0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52 44  to match the ORD
64b0: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
64c0: 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70 72   against an expr
64d0: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 69 6e 20 74  ession.  ** in t
64e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
64f0: 52 65 74 75 72 6e 20 61 6e 20 31 2d 62 61 73 65  Return an 1-base
6500: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6d  d index of the m
6510: 61 74 63 68 69 6e 67 0a 20 20 2a 2a 20 72 65 73  atching.  ** res
6520: 75 6c 74 2d 73 65 74 20 65 6e 74 72 79 2e 0a 20  ult-set entry.. 
6530: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
6540: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
6550: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
6560: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
6570: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
6580: 78 70 72 2c 20 70 45 29 3c 32 20 29 7b 0a 20 20  xpr, pE)<2 ){.  
6590: 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a      return i+1;.
65a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
65b0: 49 66 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74  If no match, ret
65c0: 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75  urn 0. */.  retu
65d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
65e0: 65 6e 65 72 61 74 65 20 61 6e 20 4f 52 44 45 52  enerate an ORDER
65f0: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
6600: 74 65 72 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e 67  term out-of-rang
6610: 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  e error..*/.stat
6620: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 4f  ic void resolveO
6630: 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 0a  utOfRangeError(.
6640: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6650: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6660: 65 72 72 6f 72 20 63 6f 6e 74 65 78 74 20 69 6e  error context in
6670: 74 6f 20 77 68 69 63 68 20 74 6f 20 77 72 69 74  to which to writ
6680: 65 20 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20  e the error */. 
6690: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
66a0: 70 65 2c 20 20 20 20 20 2f 2a 20 22 4f 52 44 45  pe,     /* "ORDE
66b0: 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f  R" or "GROUP" */
66c0: 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
66d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
66e0: 20 69 6e 64 65 78 20 28 31 2d 62 61 73 65 64 29   index (1-based)
66f0: 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6f 75 74   of the term out
6700: 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69   of range */.  i
6710: 6e 74 20 6d 78 20 20 20 20 20 20 20 20 20 20 20  nt mx           
6720: 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74        /* Largest
6730: 20 70 65 72 6d 69 73 73 69 62 6c 65 20 76 61 6c   permissible val
6740: 75 65 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20 20  ue of i */.){.  
6750: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6760: 70 50 61 72 73 65 2c 20 0a 20 20 20 20 22 25 72  pParse, .    "%r
6770: 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20   %s BY term out 
6780: 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c  of range - shoul
6790: 64 20 62 65 20 22 0a 20 20 20 20 22 62 65 74 77  d be ".    "betw
67a0: 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69  een 1 and %d", i
67b0: 2c 20 7a 54 79 70 65 2c 20 6d 78 29 3b 0a 7d 0a  , zType, mx);.}.
67c0: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
67d0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
67e0: 73 65 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  se in a compound
67f0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6800: 74 2e 20 20 20 4d 6f 64 69 66 79 0a 2a 2a 20 65  t.   Modify.** e
6810: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
6820: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6830: 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  is a constant in
6840: 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 0a  teger between 1.
6850: 2a 2a 20 61 6e 64 20 4e 20 77 68 65 72 65 20 4e  ** and N where N
6860: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
6870: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
6880: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
6890: 2e 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59  ..**.** ORDER BY
68a0: 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
68b0: 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 74 65 67  already an integ
68c0: 65 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  er between 1 and
68d0: 20 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64 69   N are.** unmodi
68e0: 66 69 65 64 2e 20 20 4f 52 44 45 52 20 42 59 20  fied.  ORDER BY 
68f0: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 69  terms that are i
6900: 6e 74 65 67 65 72 73 20 6f 75 74 73 69 64 65 20  ntegers outside 
6910: 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20  the range of.** 
6920: 31 20 74 68 72 6f 75 67 68 20 4e 20 67 65 6e 65  1 through N gene
6930: 72 61 74 65 20 61 6e 20 65 72 72 6f 72 2e 20 20  rate an error.  
6940: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
6950: 68 61 74 20 61 72 65 20 65 78 70 72 65 73 73 69  hat are expressi
6960: 6f 6e 73 0a 2a 2a 20 61 72 65 20 6d 61 74 63 68  ons.** are match
6970: 65 64 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c  ed against resul
6980: 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
6990: 73 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45  s of compound SE
69a0: 4c 45 43 54 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e  LECT.** beginnin
69b0: 67 20 77 69 74 68 20 74 68 65 20 6c 65 66 74 2d  g with the left-
69c0: 6d 6f 73 74 20 53 45 4c 45 43 54 20 61 6e 64 20  most SELECT and 
69d0: 77 6f 72 6b 69 6e 67 20 74 6f 77 61 72 64 20 74  working toward t
69e0: 68 65 20 72 69 67 68 74 2e 0a 2a 2a 20 41 74 20  he right..** At 
69f0: 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 2c  the first match,
6a00: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78   the ORDER BY ex
6a10: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 61 6e  pression is tran
6a20: 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 20  sformed into.** 
6a30: 74 68 65 20 69 6e 74 65 67 65 72 20 63 6f 6c 75  the integer colu
6a40: 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  mn number..**.**
6a50: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
6a60: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
6a70: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
6a80: 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64   resolveCompound
6a90: 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65  OrderBy(.  Parse
6aa0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
6ab0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6ac0: 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f  ext.  Leave erro
6ad0: 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20  r messages here 
6ae0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
6af0: 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68  lect       /* Th
6b00: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
6b10: 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  nt containing th
6b20: 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 29 7b  e ORDER BY */.){
6b30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72  .  int i;.  Expr
6b40: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a  List *pOrderBy;.
6b50: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
6b60: 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  st;.  sqlite3 *d
6b70: 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44  b;.  int moreToD
6b80: 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72  o = 1;..  pOrder
6b90: 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f  By = pSelect->pO
6ba0: 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 4f  rderBy;.  if( pO
6bb0: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
6bc0: 72 6e 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61  rn 0;.  db = pPa
6bd0: 72 73 65 2d 3e 64 62 3b 0a 23 69 66 20 53 51 4c  rse->db;.#if SQL
6be0: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
6bf0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e   if( pOrderBy->n
6c00: 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
6c10: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
6c20: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
6c30: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6c40: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
6c50: 72 6d 73 20 69 6e 20 4f 52 44 45 52 20 42 59 20  rms in ORDER BY 
6c60: 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 72 65  clause");.    re
6c70: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  turn 1;.  }.#end
6c80: 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  if.  for(i=0; i<
6c90: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
6ca0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65   i++){.    pOrde
6cb0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
6cc0: 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65 63   0;.  }.  pSelec
6cd0: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
6ce0: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
6cf0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53  pPrior ){.    pS
6d00: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e 70  elect->pPrior->p
6d10: 4e 65 78 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  Next = pSelect;.
6d20: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
6d30: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
6d40: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
6d50: 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20  ect && moreToDo 
6d60: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
6d70: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
6d80: 65 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f  em;.    moreToDo
6d90: 20 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74   = 0;.    pEList
6da0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
6db0: 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
6dc0: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
6dd0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
6de0: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70  pOrderBy->a; i<p
6df0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
6e00: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
6e10: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
6e20: 2d 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  -1;.      Expr *
6e30: 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  pE, *pDup;.     
6e40: 20 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e 65   if( pItem->done
6e50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6e60: 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45     pE = sqlite3E
6e70: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
6e80: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
6e90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6ea0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
6eb0: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
6ec0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c     if( iCol<=0 |
6ed0: 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  | iCol>pEList->n
6ee0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
6ef0: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
6f00: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
6f10: 20 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70   "ORDER", i+1, p
6f20: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
6f30: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6f40: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
6f50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6f60: 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65    iCol = resolve
6f70: 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  AsName(pParse, p
6f80: 45 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20 20  EList, pE);.    
6f90: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20      if( iCol==0 
6fa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 44 75  ){.          pDu
6fb0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
6fc0: 75 70 28 64 62 2c 20 70 45 2c 20 30 29 3b 0a 20  up(db, pE, 0);. 
6fd0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62           if( !db
6fe0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6ff0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
7000: 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20 20  sert(pDup);.    
7010: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72          iCol = r
7020: 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72  esolveOrderByTer
7030: 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72  mToExprList(pPar
7040: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44 75  se, pSelect, pDu
7050: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
7060: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7070: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
7080: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  pDup);.        }
7090: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
70a0: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
70b0: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
70c0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
70d0: 6d 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  m into an intege
70e0: 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  r column number 
70f0: 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 2a 2a  iCol,.        **
7100: 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
7110: 70 72 65 73 65 72 76 65 20 74 68 65 20 43 4f 4c  preserve the COL
7120: 4c 41 54 45 20 63 6c 61 75 73 65 20 69 66 20 69  LATE clause if i
7130: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  t exists */.    
7140: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
7150: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
7160: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
7170: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
7180: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  w==0 ) return 1;
7190: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
71a0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
71b0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
71c0: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 43  w->u.iValue = iC
71d0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ol;.        if( 
71e0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 45  pItem->pExpr==pE
71f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
7200: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65  tem->pExpr = pNe
7210: 77 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  w;.        }else
7220: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
7230: 72 74 28 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  rt( pItem->pExpr
7240: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
7250: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
7260: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 70 45 78  sert( pItem->pEx
7270: 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 45 20 29 3b  pr->pLeft==pE );
7280: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
7290: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d  ->pExpr->pLeft =
72a0: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   pNew;.        }
72b0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
72c0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
72d0: 45 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  E);.        pIte
72e0: 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  m->iOrderByCol =
72f0: 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20   (u16)iCol;.    
7300: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
7310: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
7320: 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72 65 54 6f  {.        moreTo
7330: 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Do = 1;.      }.
7340: 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63      }.    pSelec
7350: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65  t = pSelect->pNe
7360: 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  xt;.  }.  for(i=
7370: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
7380: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
7390: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
73a0: 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20  i].done==0 ){.  
73b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
73c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 72 20  Msg(pParse, "%r 
73d0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f  ORDER BY term do
73e0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79  es not match any
73f0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
7400: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
7410: 73 75 6c 74 20 73 65 74 22 2c 20 69 2b 31 29 3b  sult set", i+1);
7420: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
7430: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7440: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7450: 43 68 65 63 6b 20 65 76 65 72 79 20 74 65 72 6d  Check every term
7460: 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
7470: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
7480: 75 73 65 20 70 4f 72 64 65 72 42 79 20 6f 66 0a  use pOrderBy of.
7490: 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ** the SELECT st
74a0: 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e  atement pSelect.
74b0: 20 20 49 66 20 61 6e 79 20 74 65 72 6d 20 69 73    If any term is
74c0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a   reference to a.
74d0: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ** result set ex
74e0: 70 72 65 73 73 69 6f 6e 20 28 61 73 20 64 65 74  pression (as det
74f0: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 45  ermined by the E
7500: 78 70 72 4c 69 73 74 2e 61 2e 69 43 6f 6c 20 66  xprList.a.iCol f
7510: 69 65 6c 64 29 0a 2a 2a 20 74 68 65 6e 20 63 6f  ield).** then co
7520: 6e 76 65 72 74 20 74 68 61 74 20 74 65 72 6d 20  nvert that term 
7530: 69 6e 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  into a copy of t
7540: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7550: 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 63   result set.** c
7560: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  olumn..**.** If 
7570: 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 20 64  any errors are d
7580: 65 74 65 63 74 65 64 2c 20 61 64 64 20 61 6e 20  etected, add an 
7590: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
75a0: 20 70 50 61 72 73 65 20 61 6e 64 0a 2a 2a 20 72   pParse and.** r
75b0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  eturn non-zero. 
75c0: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20   Return zero if 
75d0: 6e 6f 20 65 72 72 6f 72 73 20 61 72 65 20 73 65  no errors are se
75e0: 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  en..*/.int sqlit
75f0: 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
7600: 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a  oupBy(.  Parse *
7610: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
7620: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
7630: 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20  t.  Leave error 
7640: 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f  messages here */
7650: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
7660: 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct,      /* The 
7670: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7680: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7690: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
76a0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
76b0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
76c0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
76d0: 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65  ause to be proce
76e0: 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ssed */.  const 
76f0: 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20  char *zType     
7700: 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47  /* "ORDER" or "G
7710: 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ROUP" */.){.  in
7720: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t i;.  sqlite3 *
7730: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7740: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
7750: 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78  ist;.  struct Ex
7760: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
7770: 65 6d 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65  em;..  if( pOrde
7780: 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  rBy==0 || pParse
7790: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
77a0: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  ed ) return 0;.#
77b0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
77c0: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65  LUMN.  if( pOrde
77d0: 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  rBy->nExpr>db->a
77e0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
77f0: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
7800: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7810: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
7820: 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20  any terms in %s 
7830: 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70  BY clause", zTyp
7840: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
7850: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
7860: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
7870: 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72  >pEList;.  asser
7880: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 20  t( pEList!=0 ); 
7890: 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   /* sqlite3Selec
78a0: 74 4e 65 77 28 29 20 67 75 61 72 61 6e 74 65 65  tNew() guarantee
78b0: 73 20 74 68 69 73 20 2a 2f 0a 20 20 66 6f 72 28  s this */.  for(
78c0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
78d0: 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72  rBy->a; i<pOrder
78e0: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
78f0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
7900: 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  ( pItem->iOrderB
7910: 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  yCol ){.      if
7920: 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42  ( pItem->iOrderB
7930: 79 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  yCol>pEList->nEx
7940: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  pr ){.        re
7950: 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45  solveOutOfRangeE
7960: 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54 79  rror(pParse, zTy
7970: 70 65 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d  pe, i+1, pEList-
7980: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
7990: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
79a0: 20 7d 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65   }.      resolve
79b0: 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45  Alias(pParse, pE
79c0: 4c 69 73 74 2c 20 70 49 74 65 6d 2d 3e 69 4f 72  List, pItem->iOr
79d0: 64 65 72 42 79 43 6f 6c 2d 31 2c 20 70 49 74 65  derByCol-1, pIte
79e0: 6d 2d 3e 70 45 78 70 72 2c 20 7a 54 79 70 65 2c  m->pExpr, zType,
79f0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
7a00: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7a10: 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
7a20: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
7a30: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
7a40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7a50: 74 20 70 53 65 6c 65 63 74 2e 0a 2a 2a 20 54 68  t pSelect..** Th
7a60: 65 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f  e Name context o
7a70: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
7a80: 74 65 6d 65 6e 74 20 69 73 20 70 4e 43 2e 20 20  tement is pNC.  
7a90: 7a 54 79 70 65 20 69 73 20 65 69 74 68 65 72 0a  zType is either.
7aa0: 2a 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47  ** "ORDER" or "G
7ab0: 52 4f 55 50 22 20 64 65 70 65 6e 64 69 6e 67 20  ROUP" depending 
7ac0: 6f 6e 20 77 68 69 63 68 20 74 79 70 65 20 6f 66  on which type of
7ad0: 20 63 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79   clause pOrderBy
7ae0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
7af0: 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73  routine resolves
7b00: 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68   each term of th
7b10: 65 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e  e clause into an
7b20: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
7b30: 49 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  If the order-by 
7b40: 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65 67  term is an integ
7b50: 65 72 20 49 20 62 65 74 77 65 65 6e 20 31 20 61  er I between 1 a
7b60: 6e 64 20 4e 20 28 77 68 65 72 65 20 4e 20 69 73  nd N (where N is
7b70: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
7b80: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
7b90: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
7ba0: 68 65 20 53 45 4c 45 43 54 29 20 74 68 65 6e 20  he SELECT) then 
7bb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
7bc0: 2a 20 69 6e 20 74 68 65 20 72 65 73 6f 6c 75 74  * in the resolut
7bd0: 69 6f 6e 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ion is a copy of
7be0: 20 74 68 65 20 49 2d 74 68 20 72 65 73 75 6c 74   the I-th result
7bf0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e  -set expression.
7c00: 20 20 49 66 0a 2a 2a 20 74 68 65 20 6f 72 64 65    If.** the orde
7c10: 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61 6e 20  r-by term is an 
7c20: 69 64 65 6e 74 69 66 79 20 74 68 61 74 20 63 6f  identify that co
7c30: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
7c40: 20 41 53 2d 6e 61 6d 65 20 6f 66 0a 2a 2a 20 61   AS-name of.** a
7c50: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
7c60: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  ession, then the
7c70: 20 74 65 72 6d 20 72 65 73 6f 6c 76 65 73 20 74   term resolves t
7c80: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a  o a copy of the.
7c90: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
7ca0: 70 72 65 73 73 69 6f 6e 2e 20 20 4f 74 68 65 72  pression.  Other
7cb0: 77 69 73 65 2c 20 74 68 65 20 65 78 70 72 65 73  wise, the expres
7cc0: 73 69 6f 6e 20 69 73 20 72 65 73 6f 6c 76 65 64  sion is resolved
7cd0: 20 69 6e 0a 2a 2a 20 74 68 65 20 75 73 75 61 6c   in.** the usual
7ce0: 20 77 61 79 20 2d 20 75 73 69 6e 67 20 73 71 6c   way - using sql
7cf0: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
7d00: 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ames()..**.** Th
7d10: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
7d20: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
7d30: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 65 72 72   errors.  If err
7d40: 6f 72 73 20 6f 63 63 75 72 2c 20 74 68 65 6e 0a  ors occur, then.
7d50: 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
7d60: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
7d70: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
7d80: 20 70 50 61 72 73 65 2e 20 20 28 4f 4f 4d 20 65   pParse.  (OOM e
7d90: 72 72 6f 72 73 0a 2a 2a 20 65 78 63 65 70 74 65  rrors.** excepte
7da0: 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d.).*/.static in
7db0: 74 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  t resolveOrderGr
7dc0: 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e  oupBy(.  NameCon
7dd0: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f  text *pNC,     /
7de0: 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * The name conte
7df0: 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  xt of the SELECT
7e00: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
7e10: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
7e20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
7e30: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 68 6f  ECT statement ho
7e40: 6c 64 69 6e 67 20 70 4f 72 64 65 72 42 79 20 2a  lding pOrderBy *
7e50: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
7e60: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
7e70: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
7e80: 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 72  P BY clause to r
7e90: 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 63 6f 6e 73  esolve */.  cons
7ea0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
7eb0: 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44    /* Either "ORD
7ec0: 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20  ER" or "GROUP", 
7ed0: 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  as appropriate *
7ee0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7f10: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
7f20: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
7f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7f40: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  lumn number */. 
7f50: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
7f60: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20  _item *pItem;   
7f70: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
7f80: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
7f90: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
7fa0: 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
7fb0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
7fc0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
7fd0: 20 6e 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20   nResult;       
7fe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
7ff0: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
8000: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8010: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4f 72 64 65   */..  if( pOrde
8020: 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
8030: 30 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 70  0;.  nResult = p
8040: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
8050: 6e 45 78 70 72 3b 0a 20 20 70 50 61 72 73 65 20  nExpr;.  pParse 
8060: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
8070: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
8080: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70  pOrderBy->a; i<p
8090: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
80a0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
80b0: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 49     Expr *pE = pI
80c0: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
80d0: 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73  iCol = resolveAs
80e0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 53 65  Name(pParse, pSe
80f0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 45  lect->pEList, pE
8100: 29 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  );.    if( iCol>
8110: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  0 ){.      /* If
8120: 20 61 6e 20 41 53 2d 6e 61 6d 65 20 6d 61 74 63   an AS-name matc
8130: 68 20 69 73 20 66 6f 75 6e 64 2c 20 6d 61 72 6b  h is found, mark
8140: 20 74 68 69 73 20 4f 52 44 45 52 20 42 59 20 63   this ORDER BY c
8150: 6f 6c 75 6d 6e 20 61 73 20 62 65 69 6e 67 0a 20  olumn as being. 
8160: 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f       ** a copy o
8170: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 72 65  f the iCol-th re
8180: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 2e  sult-set column.
8190: 20 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74    The subsequent
81a0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 2a   call to.      *
81b0: 2a 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  * sqlite3Resolve
81c0: 4f 72 64 65 72 47 72 6f 75 70 42 79 28 29 20 77  OrderGroupBy() w
81d0: 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20  ill convert the 
81e0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 61 0a  expression to a.
81f0: 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
8200: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 72 65 73   the iCol-th res
8210: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
8220: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74  on. */.      pIt
8230: 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20  em->iOrderByCol 
8240: 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20  = (u16)iCol;.   
8250: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
8260: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
8270: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
8280: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
8290: 6f 6c 6c 61 74 65 28 70 45 29 2c 20 26 69 43 6f  ollate(pE), &iCo
82a0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  l) ){.      /* T
82b0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
82c0: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63   is an integer c
82d0: 6f 6e 73 74 61 6e 74 2e 20 20 41 67 61 69 6e 2c  onstant.  Again,
82e0: 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a   set the column.
82f0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
8300: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 52  so that sqlite3R
8310: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
8320: 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72  By() will conver
8330: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f  t the.      ** o
8340: 72 64 65 72 2d 62 79 20 74 65 72 6d 20 74 6f 20  rder-by term to 
8350: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72 65  a copy of the re
8360: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
8370: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ion */.      if(
8380: 20 28 69 43 6f 6c 20 26 20 7e 30 78 66 66 66 66   (iCol & ~0xffff
8390: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
83a0: 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67  resolveOutOfRang
83b0: 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a  eError(pParse, z
83c0: 54 79 70 65 2c 20 69 2b 31 2c 20 6e 52 65 73 75  Type, i+1, nResu
83d0: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  lt);.        ret
83e0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
83f0: 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64       pItem->iOrd
8400: 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69  erByCol = (u16)i
8410: 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  Col;.      conti
8420: 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
8430: 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 72  /* Otherwise, tr
8440: 65 61 74 20 74 68 65 20 4f 52 44 45 52 20 42 59  eat the ORDER BY
8450: 20 74 65 72 6d 20 61 73 20 61 6e 20 6f 72 64 69   term as an ordi
8460: 6e 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  nary expression 
8470: 2a 2f 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f  */.    pItem->iO
8480: 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20  rderByCol = 0;. 
8490: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
84a0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70  solveExprNames(p
84b0: 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20  NC, pE) ){.     
84c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
84d0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
84e0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
84f0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
8500: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
8510: 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70  xprCompare(pE, p
8520: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
8530: 61 5b 6a 5d 2e 70 45 78 70 72 29 3d 3d 30 20 29  a[j].pExpr)==0 )
8540: 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  {.        pItem-
8550: 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 6a  >iOrderByCol = j
8560: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
8570: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  }.  }.  return s
8580: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
8590: 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
85a0: 2c 20 70 53 65 6c 65 63 74 2c 20 70 4f 72 64 65  , pSelect, pOrde
85b0: 72 42 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a  rBy, zType);.}..
85c0: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61  /*.** Resolve na
85d0: 6d 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  mes in the SELEC
85e0: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 20 61 6e  T statement p an
85f0: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 64 65 73  d all of its des
8600: 63 65 6e 64 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  cendents..*/.sta
8610: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 53  tic int resolveS
8620: 65 6c 65 63 74 53 74 65 70 28 57 61 6c 6b 65 72  electStep(Walker
8630: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
8640: 74 20 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  t *p){.  NameCon
8650: 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20  text *pOuterNC; 
8660: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 74 68 61 74   /* Context that
8670: 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 53   contains this S
8680: 45 4c 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43  ELECT */.  NameC
8690: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
86a0: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
86b0: 78 74 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  xt of this SELEC
86c0: 54 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  T */.  int isCom
86d0: 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20 2f  pound;         /
86e0: 2a 20 54 72 75 65 20 69 66 20 70 20 69 73 20 61  * True if p is a
86f0: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
8700: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f   */.  int nCompo
8710: 75 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  und;          /*
8720: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f   Number of compo
8730: 75 6e 64 20 74 65 72 6d 73 20 70 72 6f 63 65 73  und terms proces
8740: 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
8750: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
8760: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
8770: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
8780: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
8790: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
87a0: 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
87b0: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
87c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
87d0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
87e0: 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  er */.  ExprList
87f0: 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20   *pGroupBy;     
8800: 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
8810: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
8820: 63 74 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 20  ct *pLeftmost;  
8830: 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
8840: 20 6f 66 20 53 45 4c 45 43 54 20 6f 66 20 61 20   of SELECT of a 
8850: 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 73 71  compound */.  sq
8860: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
8870: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
8880: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
8890: 20 20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21    ..  assert( p!
88a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  =0 );.  if( p->s
88b0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
88c0: 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 72 65 74  olved ){.    ret
88d0: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
88e0: 20 7d 0a 20 20 70 4f 75 74 65 72 4e 43 20 3d 20   }.  pOuterNC = 
88f0: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
8900: 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
8910: 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
8920: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
8930: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 73 71    /* Normally sq
8940: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
8950: 64 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  d() will be call
8960: 65 64 20 66 69 72 73 74 20 61 6e 64 20 77 69 6c  ed first and wil
8970: 6c 20 68 61 76 65 0a 20 20 2a 2a 20 61 6c 72 65  l have.  ** alre
8980: 61 64 79 20 65 78 70 61 6e 64 65 64 20 74 68 69  ady expanded thi
8990: 73 20 53 45 4c 45 43 54 2e 20 20 48 6f 77 65 76  s SELECT.  Howev
89a0: 65 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  er, if this is a
89b0: 20 73 75 62 71 75 65 72 79 20 77 69 74 68 69 6e   subquery within
89c0: 0a 20 20 2a 2a 20 61 6e 20 65 78 70 72 65 73 73  .  ** an express
89d0: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 52 65 73 6f  ion, sqlite3Reso
89e0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 77  lveExprNames() w
89f0: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 77 69  ill be called wi
8a00: 74 68 6f 75 74 20 61 0a 20 20 2a 2a 20 70 72 69  thout a.  ** pri
8a10: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
8a20: 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
8a30: 2e 20 20 57 68 65 6e 20 74 68 61 74 20 68 61 70  .  When that hap
8a40: 70 65 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a 20 73  pens, let.  ** s
8a50: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
8a60: 28 29 20 64 6f 20 61 6c 6c 20 6f 66 20 74 68 65  () do all of the
8a70: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
8a80: 74 68 69 73 20 53 45 4c 45 43 54 2e 0a 20 20 2a  this SELECT..  *
8a90: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  * sqlite3SelectP
8aa0: 72 65 70 28 29 20 77 69 6c 6c 20 69 6e 76 6f 6b  rep() will invok
8ab0: 65 20 62 6f 74 68 20 73 71 6c 69 74 65 33 53 65  e both sqlite3Se
8ac0: 6c 65 63 74 45 78 70 61 6e 64 28 29 20 61 6e 64  lectExpand() and
8ad0: 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .  ** this routi
8ae0: 6e 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ne in the correc
8af0: 74 20 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20  t order..  */.  
8b00: 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
8b10: 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 3d   & SF_Expanded)=
8b20: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8b30: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
8b40: 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
8b50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 70 50  ;.    return (pP
8b60: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
8b70: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20  ->mallocFailed) 
8b80: 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52  ? WRC_Abort : WR
8b90: 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20  C_Prune;.  }..  
8ba0: 69 73 43 6f 6d 70 6f 75 6e 64 20 3d 20 70 2d 3e  isCompound = p->
8bb0: 70 50 72 69 6f 72 21 3d 30 3b 0a 20 20 6e 43 6f  pPrior!=0;.  nCo
8bc0: 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 70 4c  mpound = 0;.  pL
8bd0: 65 66 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 77  eftmost = p;.  w
8be0: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 61  hile( p ){.    a
8bf0: 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
8c00: 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
8c10: 64 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  d)!=0 );.    ass
8c20: 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
8c30: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
8c40: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 73 65  ==0 );.    p->se
8c50: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 73  lFlags |= SF_Res
8c60: 6f 6c 76 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 52  olved;..    /* R
8c70: 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
8c80: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49  ssions in the LI
8c90: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
8ca0: 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20  lauses. These.  
8cb0: 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c    ** are not all
8cc0: 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f  owed to refer to
8cd0: 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70   any names, so p
8ce0: 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d  ass an empty Nam
8cf0: 65 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  eContext..    */
8d00: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
8d10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
8d20: 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
8d30: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
8d40: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
8d50: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
8d60: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a  , p->pLimit) ||.
8d70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
8d80: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
8d90: 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74  &sNC, p->pOffset
8da0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
8db0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
8dc0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74   }.  .    /* Set
8dd0: 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61   up the local na
8de0: 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61  me-context to pa
8df0: 73 73 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ss to sqlite3Res
8e00: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20  olveExprNames() 
8e10: 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76  to.    ** resolv
8e20: 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  e the result-set
8e30: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
8e40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43  ..    */.    sNC
8e50: 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c  .ncFlags = NC_Al
8e60: 6c 6f 77 41 67 67 3b 0a 20 20 20 20 73 4e 43 2e  lowAgg;.    sNC.
8e70: 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pSrcList = p->pS
8e80: 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78  rc;.    sNC.pNex
8e90: 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20  t = pOuterNC;.  
8ea0: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
8eb0: 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73  names in the res
8ec0: 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20 20  ult set. */.    
8ed0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
8ee0: 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
8ef0: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
8f00: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
8f10: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
8f20: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20  .      Expr *pX 
8f30: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
8f40: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
8f50: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
8f60: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58  prNames(&sNC, pX
8f70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
8f80: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
8f90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
8fa0: 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65      /* Recursive
8fb0: 6c 79 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73  ly resolve names
8fc0: 20 69 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   in all subqueri
8fd0: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  es.    */.    fo
8fe0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
8ff0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
9000: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
9010: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
9020: 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
9030: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
9040: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
9050: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
9060: 20 2a 70 4e 43 3b 20 20 20 20 20 20 20 20 20 2f   *pNC;         /
9070: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
9080: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  e name contexts 
9090: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
90a0: 52 65 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ref = 0;        
90b0: 20 20 20 20 20 2f 2a 20 52 65 66 63 6f 75 6e 74       /* Refcount
90c0: 20 66 6f 72 20 70 4f 75 74 65 72 4e 43 20 61 6e   for pOuterNC an
90d0: 64 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73  d outer contexts
90e0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
90f0: 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 43 6f  t char *zSavedCo
9100: 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
9110: 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  zAuthContext;.. 
9120: 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20         /* Count 
9130: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
9140: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
9150: 6f 20 70 4f 75 74 65 72 4e 43 20 61 6e 64 20 61  o pOuterNC and a
9160: 6c 6c 20 6f 66 20 69 74 73 0a 20 20 20 20 20 20  ll of its.      
9170: 20 20 2a 2a 20 70 61 72 65 6e 74 20 63 6f 6e 74    ** parent cont
9180: 65 78 74 73 2e 20 41 66 74 65 72 20 72 65 73 6f  exts. After reso
9190: 6c 76 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  lving references
91a0: 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
91b0: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 49  in.        ** pI
91c0: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 63 68  tem->pSelect, ch
91d0: 65 63 6b 20 69 66 20 74 68 69 73 20 76 61 6c 75  eck if this valu
91e0: 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 49  e has changed. I
91f0: 66 20 73 6f 2c 20 74 68 65 6e 0a 20 20 20 20 20  f so, then.     
9200: 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
9210: 74 65 6d 65 6e 74 20 70 49 74 65 6d 2d 3e 70 53  tement pItem->pS
9220: 65 6c 65 63 74 20 6d 75 73 74 20 62 65 20 63 6f  elect must be co
9230: 72 72 65 6c 61 74 65 64 2e 20 53 65 74 20 74 68  rrelated. Set th
9240: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 49 74  e.        ** pIt
9250: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
9260: 20 66 6c 61 67 20 69 66 20 74 68 69 73 20 69 73   flag if this is
9270: 20 74 68 65 20 63 61 73 65 2e 20 2a 2f 0a 20 20   the case. */.  
9280: 20 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f        for(pNC=pO
9290: 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43  uterNC; pNC; pNC
92a0: 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65  =pNC->pNext) nRe
92b0: 66 20 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a  f += pNC->nRef;.
92c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
92d0: 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 70 50 61 72  em->zName ) pPar
92e0: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
92f0: 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b   = pItem->zName;
9300: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9310: 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
9320: 65 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  es(pParse, pItem
9330: 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4f 75 74 65  ->pSelect, pOute
9340: 72 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 70 50  rNC);.        pP
9350: 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
9360: 78 74 20 3d 20 7a 53 61 76 65 64 43 6f 6e 74 65  xt = zSavedConte
9370: 78 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  xt;.        if( 
9380: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
9390: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
93a0: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
93b0: 6f 72 74 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f  ort;..        fo
93c0: 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20  r(pNC=pOuterNC; 
93d0: 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e  pNC; pNC=pNC->pN
93e0: 65 78 74 29 20 6e 52 65 66 20 2d 3d 20 70 4e 43  ext) nRef -= pNC
93f0: 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20  ->nRef;.        
9400: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
9410: 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 26  sCorrelated==0 &
9420: 26 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20 20  & nRef<=0 );.   
9430: 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 43 6f       pItem->isCo
9440: 72 72 65 6c 61 74 65 64 20 3d 20 28 6e 52 65 66  rrelated = (nRef
9450: 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
9460: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
9470: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67   there are no ag
9480: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
9490: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d  s in the result-
94a0: 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55  set, and no GROU
94b0: 50 20 42 59 20 0a 20 20 20 20 2a 2a 20 65 78 70  P BY .    ** exp
94c0: 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  ression, do not 
94d0: 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73  allow aggregates
94e0: 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f   in any of the o
94f0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73  ther expressions
9500: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
9510: 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
9520: 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
9530: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 47 72 6f  )==0 );.    pGro
9540: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
9550: 42 79 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f  By;.    if( pGro
9560: 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e 6e 63 46  upBy || (sNC.ncF
9570: 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41 67 67  lags & NC_HasAgg
9580: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )!=0 ){.      p-
9590: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
95a0: 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20 7d  Aggregate;.    }
95b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 4e 43 2e  else{.      sNC.
95c0: 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41  ncFlags &= ~NC_A
95d0: 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 7d 0a 20  llowAgg;.    }. 
95e0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 48 41   .    /* If a HA
95f0: 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70  VING clause is p
9600: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
9610: 72 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f  re must be a GRO
9620: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
9630: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
9640: 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f  pHaving && !pGro
9650: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 73 71  upBy ){.      sq
9660: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9670: 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42  arse, "a GROUP B
9680: 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  Y clause is requ
9690: 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49  ired before HAVI
96a0: 4e 47 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  NG");.      retu
96b0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
96c0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64    }.  .    /* Ad
96d0: 64 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  d the expression
96e0: 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d   list to the nam
96f0: 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65  e-context before
9700: 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 20   parsing the.   
9710: 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73   ** other expres
9720: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c  sions in the SEL
9730: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ECT statement. T
9740: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20  his is so that. 
9750: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
9760: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
9770: 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e  lause (etc.) can
9780: 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73   refer to expres
9790: 73 69 6f 6e 73 20 62 79 0a 20 20 20 20 2a 2a 20  sions by.    ** 
97a0: 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72  aliases in the r
97b0: 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 20 20 2a  esult set..    *
97c0: 2a 0a 20 20 20 20 2a 2a 20 4d 69 6e 6f 72 20 70  *.    ** Minor p
97d0: 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73  oint: If this is
97e0: 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
97f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77  the expression w
9800: 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 72 65  ill be.    ** re
9810: 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65  -evaluated for e
9820: 61 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f  ach reference to
9830: 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
9840: 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e  sNC.pEList = p->
9850: 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20  pEList;.    if( 
9860: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
9870: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  prNames(&sNC, p-
9880: 3e 70 57 68 65 72 65 29 20 7c 7c 0a 20 20 20 20  >pWhere) ||.    
9890: 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
98a0: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
98b0: 20 70 2d 3e 70 48 61 76 69 6e 67 29 0a 20 20 20   p->pHaving).   
98c0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
98d0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
98e0: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  }..    /* The OR
98f0: 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50  DER BY and GROUP
9900: 20 42 59 20 63 6c 61 75 73 65 73 20 6d 61 79 20   BY clauses may 
9910: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 74 65 72  not refer to ter
9920: 6d 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  ms in.    ** out
9930: 65 72 20 71 75 65 72 69 65 73 20 0a 20 20 20 20  er queries .    
9940: 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  */.    sNC.pNext
9950: 20 3d 20 30 3b 0a 20 20 20 20 73 4e 43 2e 6e 63   = 0;.    sNC.nc
9960: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f  Flags |= NC_Allo
9970: 77 41 67 67 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  wAgg;..    /* Pr
9980: 6f 63 65 73 73 20 74 68 65 20 4f 52 44 45 52 20  ocess the ORDER 
9990: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 73 69  BY clause for si
99a0: 6e 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54 20 73  ngleton SELECT s
99b0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
99c0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
99d0: 6c 61 75 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75  lause for compou
99e0: 6e 64 73 20 53 45 4c 45 43 54 20 73 74 61 74 65  nds SELECT state
99f0: 6d 65 6e 74 73 20 69 73 20 68 61 6e 64 6c 65 64  ments is handled
9a00: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61  .    ** below, a
9a10: 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
9a20: 72 65 73 75 6c 74 2d 73 65 74 73 20 66 6f 72 20  result-sets for 
9a30: 61 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65 6d 65  all of the eleme
9a40: 6e 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  nts of.    ** th
9a50: 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20  e compound have 
9a60: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20  been resolved.. 
9a70: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69     */.    if( !i
9a80: 73 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73  sCompound && res
9a90: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
9aa0: 28 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72  (&sNC, p, p->pOr
9ab0: 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20  derBy, "ORDER") 
9ac0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9ad0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
9ae0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
9af0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
9b00: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
9b10: 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ort;.    }.  .  
9b20: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
9b30: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
9b40: 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65 20 74  .  At the same t
9b50: 69 6d 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 0a  ime, make sure .
9b60: 20 20 20 20 2a 2a 20 74 68 65 20 47 52 4f 55 50      ** the GROUP
9b70: 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
9b80: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72  not contain aggr
9b90: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
9ba0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9bb0: 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
9bc0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
9bd0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
9be0: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 72 65     .      if( re
9bf0: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
9c00: 79 28 26 73 4e 43 2c 20 70 2c 20 70 47 72 6f 75  y(&sNC, p, pGrou
9c10: 70 42 79 2c 20 22 47 52 4f 55 50 22 29 20 7c 7c  pBy, "GROUP") ||
9c20: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9c30: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
9c40: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
9c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
9c60: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f  (i=0, pItem=pGro
9c70: 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75  upBy->a; i<pGrou
9c80: 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  pBy->nExpr; i++,
9c90: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
9ca0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
9cb0: 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45  operty(pItem->pE
9cc0: 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a  xpr, EP_Agg) ){.
9cd0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9ce0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
9cf0: 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e  , "aggregate fun
9d00: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61  ctions are not a
9d10: 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20  llowed in ".    
9d20: 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47            "the G
9d30: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29  ROUP BY clause")
9d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
9d50: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
9d60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9d70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
9d80: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
9d90: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6f  t term of the co
9da0: 6d 70 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a 20 20  mpound.    */.  
9db0: 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b    p = p->pPrior;
9dc0: 0a 20 20 20 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b  .    nCompound++
9dd0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f  ;.  }..  /* Reso
9de0: 6c 76 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  lve the ORDER BY
9df0: 20 6f 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   on a compound S
9e00: 45 4c 45 43 54 20 61 66 74 65 72 20 61 6c 6c 20  ELECT after all 
9e10: 74 65 72 6d 73 20 6f 66 0a 20 20 2a 2a 20 74 68  terms of.  ** th
9e20: 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20  e compound have 
9e30: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20  been resolved.. 
9e40: 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70   */.  if( isComp
9e50: 6f 75 6e 64 20 26 26 20 72 65 73 6f 6c 76 65 43  ound && resolveC
9e60: 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70  ompoundOrderBy(p
9e70: 50 61 72 73 65 2c 20 70 4c 65 66 74 6d 6f 73 74  Parse, pLeftmost
9e80: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
9e90: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
9ea0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
9eb0: 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ne;.}../*.** Thi
9ec0: 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20  s routine walks 
9ed0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
9ee0: 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20  ee and resolves 
9ef0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a  references to.**
9f00: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61   table columns a
9f10: 6e 64 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  nd result-set co
9f20: 6c 75 6d 6e 73 2e 20 20 41 74 20 74 68 65 20 73  lumns.  At the s
9f30: 61 6d 65 20 74 69 6d 65 2c 20 64 6f 20 65 72 72  ame time, do err
9f40: 6f 72 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 6f  or.** checking o
9f50: 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73 61 67 65  n function usage
9f60: 20 61 6e 64 20 73 65 74 20 61 20 66 6c 61 67 20   and set a flag 
9f70: 69 66 20 61 6e 79 20 61 67 67 72 65 67 61 74 65  if any aggregate
9f80: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72   functions.** ar
9f90: 65 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  e seen..**.** To
9fa0: 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 20 63   resolve table c
9fb0: 6f 6c 75 6d 6e 73 20 72 65 66 65 72 65 6e 63 65  olumns reference
9fc0: 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f  s we look for no
9fd0: 64 65 73 20 28 6f 72 20 73 75 62 74 72 65 65 73  des (or subtrees
9fe0: 29 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 72  ) of the .** for
9ff0: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
a000: 72 20 6a 75 73 74 20 5a 20 77 68 65 72 65 0a 2a  r just Z where.*
a010: 2a 0a 2a 2a 20 20 20 20 20 20 58 3a 20 20 20 54  *.**      X:   T
a020: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
a030: 61 62 61 73 65 2e 20 20 45 78 3a 20 20 22 6d 61  abase.  Ex:  "ma
a040: 69 6e 22 20 6f 72 20 22 74 65 6d 70 22 20 6f 72  in" or "temp" or
a050: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 68  .**           th
a060: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  e symbolic name 
a070: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6e 20 41  assigned to an A
a080: 54 54 41 43 48 2d 65 64 20 64 61 74 61 62 61 73  TTACH-ed databas
a090: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 3a  e..**.**      Y:
a0a0: 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61     The name of a
a0b0: 20 74 61 62 6c 65 20 69 6e 20 61 20 46 52 4f 4d   table in a FROM
a0c0: 20 63 6c 61 75 73 65 2e 20 20 4f 72 20 69 6e 20   clause.  Or in 
a0d0: 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 20 20 20  a trigger.**    
a0e0: 20 20 20 20 20 20 20 6f 6e 65 20 6f 66 20 74 68         one of th
a0f0: 65 20 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20  e special names 
a100: 22 6f 6c 64 22 20 6f 72 20 22 6e 65 77 22 2e 0a  "old" or "new"..
a110: 2a 2a 0a 2a 2a 20 20 20 20 20 20 5a 3a 20 20 20  **.**      Z:   
a120: 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  The name of a co
a130: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 59 2e  lumn in table Y.
a140: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 64 65 20  .**.** The node 
a150: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  at the root of t
a160: 68 65 20 73 75 62 74 72 65 65 20 69 73 20 6d 6f  he subtree is mo
a170: 64 69 66 69 65 64 20 61 73 20 66 6f 6c 6c 6f 77  dified as follow
a180: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 45 78 70 72  s:.**.**    Expr
a190: 2e 6f 70 20 20 20 20 20 20 20 20 43 68 61 6e 67  .op        Chang
a1a0: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a  ed to TK_COLUMN.
a1b0: 2a 2a 20 20 20 20 45 78 70 72 2e 70 54 61 62 20  **    Expr.pTab 
a1c0: 20 20 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74       Points to t
a1d0: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
a1e0: 66 6f 72 20 58 2e 59 0a 2a 2a 20 20 20 20 45 78  for X.Y.**    Ex
a1f0: 70 72 2e 69 43 6f 6c 75 6d 6e 20 20 20 54 68 65  pr.iColumn   The
a200: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e   column index in
a210: 20 58 2e 59 2e 20 20 2d 31 20 66 6f 72 20 74 68   X.Y.  -1 for th
a220: 65 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 45  e rowid..**    E
a230: 78 70 72 2e 69 54 61 62 6c 65 20 20 20 20 54 68  xpr.iTable    Th
a240: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
a250: 6d 62 65 72 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a  mber for X.Y.**.
a260: 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65  **.** To resolve
a270: 20 72 65 73 75 6c 74 2d 73 65 74 20 72 65 66 65   result-set refe
a280: 72 65 6e 63 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72  rences, look for
a290: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
a2a0: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  s of the.** form
a2b0: 20 5a 20 28 77 69 74 68 20 6e 6f 20 58 20 61 6e   Z (with no X an
a2c0: 64 20 59 20 70 72 65 66 69 78 29 20 77 68 65 72  d Y prefix) wher
a2d0: 65 20 74 68 65 20 5a 20 6d 61 74 63 68 65 73 20  e the Z matches 
a2e0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 2a  the right-hand.*
a2f0: 2a 20 73 69 7a 65 20 6f 66 20 61 6e 20 41 53 20  * size of an AS 
a300: 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 72 65  clause in the re
a310: 73 75 6c 74 2d 73 65 74 20 6f 66 20 61 20 53 45  sult-set of a SE
a320: 4c 45 43 54 2e 20 20 54 68 65 20 5a 20 65 78 70  LECT.  The Z exp
a330: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  ression.** is re
a340: 70 6c 61 63 65 64 20 62 79 20 61 20 63 6f 70 79  placed by a copy
a350: 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   of the left-han
a360: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 65  d side of the re
a370: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
a380: 69 6f 6e 2e 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61  ion..** Table-na
a390: 6d 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20  me and function 
a3a0: 72 65 73 6f 6c 75 74 69 6f 6e 20 6f 63 63 75 72  resolution occur
a3b0: 73 20 6f 6e 20 74 68 65 20 73 75 62 73 74 69 74  s on the substit
a3c0: 75 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 0a  uted expression.
a3d0: 2a 2a 20 74 72 65 65 2e 20 20 46 6f 72 20 65 78  ** tree.  For ex
a3e0: 61 6d 70 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a  ample, in:.**.**
a3f0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62        SELECT a+b
a400: 20 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20   AS x, c+d AS y 
a410: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
a420: 20 78 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 78   x;.**.** The "x
a430: 22 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 72  " term of the or
a440: 64 65 72 20 62 79 20 69 73 20 72 65 70 6c 61 63  der by is replac
a450: 65 64 20 62 79 20 22 61 2b 62 22 20 74 6f 20 72  ed by "a+b" to r
a460: 65 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ender:.**.**    
a470: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
a480: 78 2c 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d  x, c+d AS y FROM
a490: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2b 62   t1 ORDER BY a+b
a4a0: 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ;.**.** Function
a4b0: 20 63 61 6c 6c 73 20 61 72 65 20 63 68 65 63 6b   calls are check
a4c0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
a4d0: 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
a4e0: 6e 20 69 73 20 0a 2a 2a 20 64 65 66 69 6e 65 64  n is .** defined
a4f0: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 63 6f   and that the co
a500: 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrect number of 
a510: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70  arguments are sp
a520: 65 63 69 66 69 65 64 2e 0a 2a 2a 20 49 66 20 74  ecified..** If t
a530: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  he function is a
a540: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
a550: 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 4e  tion, then the N
a560: 43 5f 48 61 73 41 67 67 20 66 6c 61 67 20 69 73  C_HasAgg flag is
a570: 0a 2a 2a 20 73 65 74 20 61 6e 64 20 74 68 65 20  .** set and the 
a580: 6f 70 63 6f 64 65 20 69 73 20 63 68 61 6e 67 65  opcode is change
a590: 64 20 66 72 6f 6d 20 54 4b 5f 46 55 4e 43 54 49  d from TK_FUNCTI
a5a0: 4f 4e 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ON to TK_AGG_FUN
a5b0: 43 54 49 4f 4e 2e 0a 2a 2a 20 49 66 20 61 6e 20  CTION..** If an 
a5c0: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
a5d0: 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ins aggregate fu
a5e0: 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 74 68 65  nctions then the
a5f0: 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65   EP_Agg.** prope
a600: 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65  rty on the expre
a610: 73 73 69 6f 6e 20 69 73 20 73 65 74 2e 0a 2a 2a  ssion is set..**
a620: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 6d 65 73  .** An error mes
a630: 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20  sage is left in 
a640: 70 50 61 72 73 65 20 69 66 20 61 6e 79 74 68 69  pParse if anythi
a650: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 54 68  ng is amiss.  Th
a660: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 69 66 20 65  e number.** if e
a670: 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65  rrors is returne
a680: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
a690: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
a6a0: 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  s( .  NameContex
a6b0: 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a  t *pNC,       /*
a6c0: 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65   Namespace to re
a6d0: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
a6e0: 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20  s in. */.  Expr 
a6f0: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
a700: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
a710: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
a720: 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  zed. */.){.  u8 
a730: 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20 57  savedHasAgg;.  W
a740: 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 69 66 28 20  alker w;..  if( 
a750: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
a760: 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  n 0;.#if SQLITE_
a770: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
a780: 0a 20 20 7b 0a 20 20 20 20 50 61 72 73 65 20 2a  .  {.    Parse *
a790: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
a7a0: 61 72 73 65 3b 0a 20 20 20 20 69 66 28 20 73 71  arse;.    if( sq
a7b0: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
a7c0: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 45 78  ight(pParse, pEx
a7d0: 70 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d  pr->nHeight+pNC-
a7e0: 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74  >pParse->nHeight
a7f0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
a800: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 1;.    }.    p
a810: 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
a820: 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74  = pExpr->nHeight
a830: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
a840: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
a850: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48  ->ncFlags & NC_H
a860: 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 6e 63  asAgg;.  pNC->nc
a870: 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 48 61 73  Flags &= ~NC_Has
a880: 41 67 67 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  Agg;.  w.xExprCa
a890: 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65  llback = resolve
a8a0: 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53  ExprStep;.  w.xS
a8b0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
a8c0: 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65  resolveSelectSte
a8d0: 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
a8e0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77  pNC->pParse;.  w
a8f0: 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20  .u.pNC = pNC;.  
a900: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
a910: 26 77 2c 20 70 45 78 70 72 29 3b 0a 23 69 66 20  &w, pExpr);.#if 
a920: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
a930: 44 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70  DEPTH>0.  pNC->p
a940: 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d  Parse->nHeight -
a950: 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74  = pExpr->nHeight
a960: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
a970: 4e 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 77 2e  NC->nErr>0 || w.
a980: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29  pParse->nErr>0 )
a990: 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  {.    ExprSetPro
a9a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
a9b0: 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Error);.  }.  if
a9c0: 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26  ( pNC->ncFlags &
a9d0: 20 4e 43 5f 48 61 73 41 67 67 20 29 7b 0a 20 20   NC_HasAgg ){.  
a9e0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
a9f0: 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  y(pExpr, EP_Agg)
aa00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 61  ;.  }else if( sa
aa10: 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20 20 20  vedHasAgg ){.   
aa20: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d   pNC->ncFlags |=
aa30: 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20 7d 0a   NC_HasAgg;.  }.
aa40: 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61 73    return ExprHas
aa50: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
aa60: 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 0a 2f  EP_Error);.}.../
aa70: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c  *.** Resolve all
aa80: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 65 78   names in all ex
aa90: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 61 20 53  pressions of a S
aaa0: 45 4c 45 43 54 20 61 6e 64 20 69 6e 20 61 6c 6c  ELECT and in all
aab0: 0a 2a 2a 20 64 65 63 65 6e 64 65 6e 74 73 20 6f  .** decendents o
aac0: 66 20 74 68 65 20 53 45 4c 45 43 54 2c 20 69 6e  f the SELECT, in
aad0: 63 6c 75 64 69 6e 67 20 63 6f 6d 70 6f 75 6e 64  cluding compound
aae0: 73 20 6f 66 66 20 6f 66 20 70 2d 3e 70 50 72 69  s off of p->pPri
aaf0: 6f 72 2c 0a 2a 2a 20 73 75 62 71 75 65 72 69 65  or,.** subquerie
ab00: 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
ab10: 2c 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  , and subqueries
ab20: 20 75 73 65 64 20 61 73 20 46 52 4f 4d 20 63 6c   used as FROM cl
ab30: 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 2e 0a 2a  ause.** terms..*
ab40: 2a 0a 2a 2a 20 53 65 65 20 73 71 6c 69 74 65 33  *.** See sqlite3
ab50: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
ab60: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
ab70: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6b 69 6e 64  tion of the kind
ab80: 73 20 6f 66 0a 2a 2a 20 74 72 61 6e 73 66 6f 72  s of.** transfor
ab90: 6d 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63  mations that occ
aba0: 75 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 53 45  ur..**.** All SE
abb0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
abc0: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
abd0: 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e 67 0a   expanded using.
abe0: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
abf0: 45 78 70 61 6e 64 28 29 20 70 72 69 6f 72 20 74  Expand() prior t
ac00: 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
ac10: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64  routine..*/.void
ac20: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
ac30: 65 6c 65 63 74 4e 61 6d 65 73 28 0a 20 20 50 61  electNames(.  Pa
ac40: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ac50: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
ac60: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
ac70: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
ac80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
ac90: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
aca0: 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
acb0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
acc0: 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
acd0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 61 72 65  context for pare
ace0: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
acf0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  ent */.){.  Walk
ad00: 65 72 20 77 3b 0a 0a 20 20 61 73 73 65 72 74 28  er w;..  assert(
ad10: 20 70 21 3d 30 20 29 3b 0a 20 20 77 2e 78 45 78   p!=0 );.  w.xEx
ad20: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73  prCallback = res
ad30: 6f 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20  olveExprStep;.  
ad40: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
ad50: 6b 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63  k = resolveSelec
ad60: 74 53 74 65 70 3b 0a 20 20 77 2e 70 50 61 72 73  tStep;.  w.pPars
ad70: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e  e = pParse;.  w.
ad80: 75 2e 70 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43  u.pNC = pOuterNC
ad90: 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
ada0: 65 6c 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a  elect(&w, p);.}.