/ Hex Artifact Content
Login

Artifact 7eda9097b29fcf3d2b42fdc17d1de672134e09b6:


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 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72  * The TK_AS oper
07d0: 61 74 6f 72 20 69 73 20 69 6e 68 69 62 69 74 65  ator is inhibite
07e0: 64 20 69 66 20 7a 54 79 70 65 5b 30 5d 3d 3d 27  d if zType[0]=='
07f0: 47 27 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 0a  G'.  This means.
0800: 2a 2a 20 74 68 61 74 20 69 6e 20 61 20 47 52 4f  ** that in a GRO
0810: 55 50 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  UP BY clause, th
0820: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
0830: 65 76 61 6c 75 61 74 65 64 20 74 77 69 63 65 2e  evaluated twice.
0840: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
0850: 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d     SELECT random
0860: 28 29 25 35 20 41 53 20 78 2c 20 63 6f 75 6e 74  ()%5 AS x, count
0870: 28 2a 29 20 46 52 4f 4d 20 74 61 62 20 47 52 4f  (*) FROM tab GRO
0880: 55 50 20 42 59 20 78 0a 2a 2a 0a 2a 2a 20 49 73  UP BY x.**.** Is
0890: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
08a0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
08b0: 20 72 61 6e 64 6f 6d 28 29 25 35 20 41 53 20 78   random()%5 AS x
08c0: 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
08d0: 74 61 62 20 47 52 4f 55 50 20 42 59 20 72 61 6e  tab GROUP BY ran
08e0: 64 6f 6d 28 29 25 35 0a 2a 2a 0a 2a 2a 20 54 68  dom()%5.**.** Th
08f0: 65 20 72 65 73 75 6c 74 20 6f 66 20 72 61 6e 64  e result of rand
0900: 6f 6d 28 29 25 35 20 69 6e 20 74 68 65 20 47 52  om()%5 in the GR
0910: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
0920: 20 70 72 6f 62 61 62 6c 79 20 64 69 66 66 65 72   probably differ
0930: 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ent.** from the 
0940: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 72 65  result in the re
0950: 73 75 6c 74 2d 73 65 74 2e 20 20 4f 6e 20 74 68  sult-set.  On th
0960: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 53 74 61  e other hand Sta
0970: 6e 64 61 72 64 20 53 51 4c 20 64 6f 65 73 0a 2a  ndard SQL does.*
0980: 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  * not allow the 
0990: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
09a0: 74 6f 20 63 6f 6e 74 61 69 6e 20 72 65 66 65 72  to contain refer
09b0: 65 6e 63 65 73 20 74 6f 20 72 65 73 75 6c 74 2d  ences to result-
09c0: 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20  set columns..** 
09d0: 53 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  So this should n
09e0: 65 76 65 72 20 63 6f 6d 65 20 75 70 20 69 6e 20  ever come up in 
09f0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 71 75 65 72  well-formed quer
0a00: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ies..**.** If th
0a10: 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 66  e reference is f
0a20: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 4f 4c  ollowed by a COL
0a30: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20 74  LATE operator, t
0a40: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 2a 2a  hen make sure.**
0a50: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
0a60: 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 72 76  rator is preserv
0a70: 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
0a80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
0a90: 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d  CT a+b, c+d FROM
0aa0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 43   t1 ORDER BY 1 C
0ab0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a 2a  OLLATE nocase;.*
0ac0: 2a 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20 74  *.** Should be t
0ad0: 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
0af0: 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d 20  T a+b, c+d FROM 
0b00: 74 31 20 4f 52 44 45 52 20 42 59 20 28 61 2b 62  t1 ORDER BY (a+b
0b10: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
0b20: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 53 75 62  ;.**.** The nSub
0b30: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
0b40: 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d 61  specifies how ma
0b50: 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 62  ny levels of sub
0b60: 71 75 65 72 79 20 74 68 65 0a 2a 2a 20 61 6c 69  query the.** ali
0b70: 61 73 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  as is removed fr
0b80: 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
0b90: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
0ba0: 20 75 73 75 61 6c 6c 79 20 76 61 6c 75 65 20 69   usually value i
0bb0: 73 0a 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74  s.** zero but it
0bc0: 20 6d 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69   might be more i
0bd0: 66 20 74 68 65 20 61 6c 69 61 73 20 69 73 20 63  f the alias is c
0be0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
0bf0: 61 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66  a subquery.** of
0c00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
0c10: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45  pression.  The E
0c20: 78 70 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66  xpr.op2 field of
0c30: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
0c40: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d  .** structures m
0c50: 75 73 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ust be increased
0c60: 20 62 79 20 74 68 65 20 6e 53 75 62 71 75 65 72   by the nSubquer
0c70: 79 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61  y amount..*/.sta
0c80: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
0c90: 41 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a  Alias(.  Parse *
0ca0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0cb0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0cc0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
0cd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f   *pEList,      /
0ce0: 2a 20 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a  * A result set *
0cf0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
0d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
0d10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
0d20: 73 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45  sult set.  0..pE
0d30: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f  List->nExpr-1 */
0d40: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
0d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
0d60: 6e 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f  nsform this into
0d70: 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
0d80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
0d90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
0da0: 70 65 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55  pe,     /* "GROU
0db0: 50 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72  P" or "ORDER" or
0dc0: 20 22 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75   "" */.  int nSu
0dd0: 62 71 75 65 72 79 20 20 20 20 20 20 20 20 20 20  bquery          
0de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
0df0: 71 75 65 72 69 65 73 20 74 68 61 74 20 74 68 65  queries that the
0e00: 20 6c 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67   label is moving
0e10: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
0e20: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
0e30: 2f 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63  /* The iCol-th c
0e40: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73  olumn of the res
0e50: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
0e60: 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20  r *pDup;        
0e70: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
0e80: 4f 72 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Orig */.  sqlite
0e90: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
0ea0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
0eb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
0ec0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
0ed0: 30 20 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74  0 && iCol<pEList
0ee0: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72  ->nExpr );.  pOr
0ef0: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ig = pEList->a[i
0f00: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  Col].pExpr;.  as
0f10: 73 65 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29  sert( pOrig!=0 )
0f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 69  ;.  assert( pOri
0f30: 67 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 52 65  g->flags & EP_Re
0f40: 73 6f 6c 76 65 64 20 29 3b 0a 20 20 64 62 20 3d  solved );.  db =
0f50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
0f60: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
0f70: 72 44 75 70 28 64 62 2c 20 70 4f 72 69 67 2c 20  rDup(db, pOrig, 
0f80: 30 29 3b 0a 20 20 69 66 28 20 70 44 75 70 3d 3d  0);.  if( pDup==
0f90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
0fa0: 28 20 70 4f 72 69 67 2d 3e 6f 70 21 3d 54 4b 5f  ( pOrig->op!=TK_
0fb0: 43 4f 4c 55 4d 4e 20 26 26 20 7a 54 79 70 65 5b  COLUMN && zType[
0fc0: 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 69  0]!='G' ){.    i
0fd0: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0fe0: 70 74 68 28 70 44 75 70 2c 20 6e 53 75 62 71 75  pth(pDup, nSubqu
0ff0: 65 72 79 29 3b 0a 20 20 20 20 70 44 75 70 20 3d  ery);.    pDup =
1000: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1010: 61 72 73 65 2c 20 54 4b 5f 41 53 2c 20 70 44 75  arse, TK_AS, pDu
1020: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  p, 0, 0);.    if
1030: 28 20 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75  ( pDup==0 ) retu
1040: 72 6e 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  rn;.    ExprSetP
1050: 72 6f 70 65 72 74 79 28 70 44 75 70 2c 20 45 50  roperty(pDup, EP
1060: 5f 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20  _Skip);.    if( 
1070: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
1080: 75 2e 78 2e 69 41 6c 69 61 73 3d 3d 30 20 29 7b  u.x.iAlias==0 ){
1090: 0a 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61  .      pEList->a
10a0: 5b 69 43 6f 6c 5d 2e 75 2e 78 2e 69 41 6c 69 61  [iCol].u.x.iAlia
10b0: 73 20 3d 20 28 75 31 36 29 28 2b 2b 70 50 61 72  s = (u16)(++pPar
10c0: 73 65 2d 3e 6e 41 6c 69 61 73 29 3b 0a 20 20 20  se->nAlias);.   
10d0: 20 7d 0a 20 20 20 20 70 44 75 70 2d 3e 69 54 61   }.    pDup->iTa
10e0: 62 6c 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ble = pEList->a[
10f0: 69 43 6f 6c 5d 2e 75 2e 78 2e 69 41 6c 69 61 73  iCol].u.x.iAlias
1100: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1110: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
1120: 45 20 29 7b 0a 20 20 20 20 70 44 75 70 20 3d 20  E ){.    pDup = 
1130: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
1140: 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
1150: 73 65 2c 20 70 44 75 70 2c 20 70 45 78 70 72 2d  se, pDup, pExpr-
1160: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  >u.zToken);.  }.
1170: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 63 61 6c  .  /* Before cal
1180: 6c 69 6e 67 20 73 71 6c 69 74 65 33 45 78 70 72  ling sqlite3Expr
1190: 44 65 6c 65 74 65 28 29 2c 20 73 65 74 20 74 68  Delete(), set th
11a0: 65 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  e EP_Static flag
11b0: 2e 20 54 68 69 73 20 0a 20 20 2a 2a 20 70 72 65  . This .  ** pre
11c0: 76 65 6e 74 73 20 45 78 70 72 44 65 6c 65 74 65  vents ExprDelete
11d0: 28 29 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67  () from deleting
11e0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
11f0: 75 72 65 20 69 74 73 65 6c 66 2c 0a 20 20 2a 2a  ure itself,.  **
1200: 20 61 6c 6c 6f 77 69 6e 67 20 69 74 20 74 6f 20   allowing it to 
1210: 62 65 20 72 65 70 6f 70 75 6c 61 74 65 64 20 62  be repopulated b
1220: 79 20 74 68 65 20 6d 65 6d 63 70 79 28 29 20 6f  y the memcpy() o
1230: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1240: 6c 69 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 70  line..  ** The p
1250: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 6d  Expr->u.zToken m
1260: 69 67 68 74 20 70 6f 69 6e 74 20 69 6e 74 6f 20  ight point into 
1270: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1280: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
1290: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 44 62 46  .  ** sqlite3DbF
12a0: 72 65 65 28 64 62 2c 20 70 44 75 70 29 20 6f 6e  ree(db, pDup) on
12b0: 20 74 68 65 20 6c 61 73 74 20 6c 69 6e 65 20 6f   the last line o
12c0: 66 20 74 68 69 73 20 62 6c 6f 63 6b 2c 20 73 6f  f this block, so
12d0: 20 62 65 20 73 75 72 65 20 74 6f 0a 20 20 2a 2a   be sure to.  **
12e0: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
12f0: 74 68 65 20 74 6f 6b 65 6e 20 62 65 66 6f 72 65  the token before
1300: 20 64 6f 69 6e 67 20 74 68 65 20 73 71 6c 69 74   doing the sqlit
1310: 65 33 44 62 46 72 65 65 28 29 2e 0a 20 20 2a 2f  e3DbFree()..  */
1320: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
1330: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
1340: 74 69 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  tic);.  sqlite3E
1350: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
1360: 78 70 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  xpr);.  memcpy(p
1370: 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65  Expr, pDup, size
1380: 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 69  of(*pExpr));.  i
1390: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
13a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
13b0: 74 56 61 6c 75 65 29 20 26 26 20 70 45 78 70 72  tValue) && pExpr
13c0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 7b  ->u.zToken!=0 ){
13d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45  .    assert( (pE
13e0: 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 28 45 50  xpr->flags & (EP
13f0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
1400: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
1410: 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
1420: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
1430: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 75  Dup(db, pExpr->u
1440: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 45  .zToken);.    pE
1450: 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
1460: 5f 4d 65 6d 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  _MemToken;.  }. 
1470: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1480: 62 2c 20 70 44 75 70 29 3b 0a 7d 0a 0a 0a 2f 2a  b, pDup);.}.../*
1490: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
14a0: 69 66 20 74 68 65 20 6e 61 6d 65 20 7a 43 6f 6c  if the name zCol
14b0: 20 6f 63 63 75 72 73 20 61 6e 79 77 68 65 72 65   occurs anywhere
14c0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
14d0: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ause..**.** Retu
14e0: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  rn FALSE if the 
14f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  USING clause is 
1500: 4e 55 4c 4c 20 6f 72 20 69 66 20 69 74 20 64 6f  NULL or if it do
1510: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a  es not contain.*
1520: 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a 73 74 61 74 69  * zCol..*/.stati
1530: 63 20 69 6e 74 20 6e 61 6d 65 49 6e 55 73 69 6e  c int nameInUsin
1540: 67 43 6c 61 75 73 65 28 49 64 4c 69 73 74 20 2a  gClause(IdList *
1550: 70 55 73 69 6e 67 2c 20 63 6f 6e 73 74 20 63 68  pUsing, const ch
1560: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 66 28  ar *zCol){.  if(
1570: 20 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 69   pUsing ){.    i
1580: 6e 74 20 6b 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  nt k;.    for(k=
1590: 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64  0; k<pUsing->nId
15a0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; k++){.      if
15b0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
15c0: 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e  (pUsing->a[k].zN
15d0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
15e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
15f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1600: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 71 75 65 72  }../*.** Subquer
1610: 69 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 6f  ies stores the o
1620: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1630: 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  , table and colu
1640: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65  mn names for the
1650: 69 72 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74  ir.** result set
1660: 73 20 69 6e 20 45 78 70 72 4c 69 73 74 2e 61 5b  s in ExprList.a[
1670: 5d 2e 7a 53 70 61 6e 2c 20 69 6e 20 74 68 65 20  ].zSpan, in the 
1680: 66 6f 72 6d 20 22 44 41 54 41 42 41 53 45 2e 54  form "DATABASE.T
1690: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 22 2e 0a 2a 2a  ABLE.COLUMN"..**
16a0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
16b0: 20 74 68 65 20 7a 53 70 61 6e 20 67 69 76 65 6e   the zSpan given
16c0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
16d0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 7a 44 62   matches the zDb
16e0: 2c 20 7a 54 61 62 2c 0a 2a 2a 20 61 6e 64 20 7a  , zTab,.** and z
16f0: 43 6f 6c 2e 20 20 49 66 20 61 6e 79 20 6f 66 20  Col.  If any of 
1700: 7a 44 62 2c 20 7a 54 61 62 2c 20 61 6e 64 20 7a  zDb, zTab, and z
1710: 43 6f 6c 20 61 72 65 20 4e 55 4c 4c 20 74 68 65  Col are NULL the
1720: 6e 20 74 68 6f 73 65 20 66 69 65 6c 64 73 20 77  n those fields w
1730: 69 6c 6c 0a 2a 2a 20 6d 61 74 63 68 20 61 6e 79  ill.** match any
1740: 74 68 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  thing..*/.int sq
1750: 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
1760: 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me(.  const char
1770: 20 2a 7a 53 70 61 6e 2c 0a 20 20 63 6f 6e 73 74   *zSpan,.  const
1780: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 0a 20 20 63   char *zCol,.  c
1790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c  onst char *zTab,
17a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17b0: 44 62 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Db.){.  int n;. 
17c0: 20 66 6f 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53   for(n=0; ALWAYS
17d0: 28 7a 53 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53  (zSpan[n]) && zS
17e0: 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b  pan[n]!='.'; n++
17f0: 29 7b 7d 0a 20 20 69 66 28 20 7a 44 62 20 26 26  ){}.  if( zDb &&
1800: 20 28 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d   (sqlite3StrNICm
1810: 70 28 7a 53 70 61 6e 2c 20 7a 44 62 2c 20 6e 29  p(zSpan, zDb, n)
1820: 21 3d 30 20 7c 7c 20 7a 44 62 5b 6e 5d 21 3d 30  !=0 || zDb[n]!=0
1830: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1840: 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b  0;.  }.  zSpan +
1850: 3d 20 6e 2b 31 3b 0a 20 20 66 6f 72 28 6e 3d 30  = n+1;.  for(n=0
1860: 3b 20 41 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e  ; ALWAYS(zSpan[n
1870: 5d 29 20 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d  ]) && zSpan[n]!=
1880: 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66  '.'; n++){}.  if
1890: 28 20 7a 54 61 62 20 26 26 20 28 73 71 6c 69 74  ( zTab && (sqlit
18a0: 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 70 61 6e  e3StrNICmp(zSpan
18b0: 2c 20 7a 54 61 62 2c 20 6e 29 21 3d 30 20 7c 7c  , zTab, n)!=0 ||
18c0: 20 7a 54 61 62 5b 6e 5d 21 3d 30 29 20 29 7b 0a   zTab[n]!=0) ){.
18d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18e0: 7d 0a 20 20 7a 53 70 61 6e 20 2b 3d 20 6e 2b 31  }.  zSpan += n+1
18f0: 3b 0a 20 20 69 66 28 20 7a 43 6f 6c 20 26 26 20  ;.  if( zCol && 
1900: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1910: 53 70 61 6e 2c 20 7a 43 6f 6c 29 21 3d 30 20 29  Span, zCol)!=0 )
1920: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1930: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1940: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1950: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
1960: 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  umn of the form 
1970: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20  X.Y.Z or Y.Z or 
1980: 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a  just Z, look up.
1990: 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20  ** that name in 
19a0: 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63  the set of sourc
19b0: 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  e tables in pSrc
19c0: 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68  List and make th
19d0: 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72  e pExpr .** expr
19e0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65  ession node refe
19f0: 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73  r back to that s
1a00: 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  ource column.  T
1a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
1a20: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1a30: 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a   to pExpr:.**.**
1a40: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20      pExpr->iDb  
1a50: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65           Set the
1a60: 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44   index in db->aD
1a70: 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62  b[] of the datab
1a80: 61 73 65 20 58 0a 2a 2a 20 20 20 20 20 20 20 20  ase X.**        
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 28 65 76 65 6e 20 69 66 20 58 20 69 73 20 69   (even if X is i
1ab0: 6d 70 6c 69 65 64 29 2e 0a 2a 2a 20 20 20 20 70  mplied)..**    p
1ac0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20  Expr->iTable    
1ad0: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
1ae0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1af0: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69   the table obtai
1b00: 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ned.**          
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1b20: 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a  rom pSrcList..**
1b30: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
1b40: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 73 20           Points 
1b50: 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
1b60: 75 63 74 75 72 65 20 6f 66 20 58 2e 59 20 28 65  ucture of X.Y (e
1b70: 76 65 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20  ven if.**       
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 58 20 61 6e 64 2f 6f 72 20 59 20 61 72 65    X and/or Y are
1ba0: 20 69 6d 70 6c 69 65 64 2e 29 0a 2a 2a 20 20 20   implied.).**   
1bb0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
1bc0: 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65        Set to the
1bd0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
1be0: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ithin the table.
1bf0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .**    pExpr->op
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20              Set 
1c10: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a  to TK_COLUMN..**
1c20: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1c30: 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70           Any exp
1c40: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
1c50: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
1c60: 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  d.**    pExpr->p
1c70: 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79  Right        Any
1c80: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
1c90: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
1ca0: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
1cb0: 20 7a 44 62 20 76 61 72 69 61 62 6c 65 20 69 73   zDb variable is
1cc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1cd0: 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22   database (the "
1ce0: 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65  X").  This value
1cf0: 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20   may be.** NULL 
1d00: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d  meaning that nam
1d10: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
1d20: 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20   Y.Z or Z.  Any 
1d30: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61  available databa
1d40: 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  se.** can be use
1d50: 64 2e 20 20 54 68 65 20 7a 54 61 62 6c 65 20 76  d.  The zTable v
1d60: 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 6e  ariable is the n
1d70: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1d80: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
1d90: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
1da0: 65 20 4e 55 4c 4c 20 69 66 20 7a 44 62 20 69 73  e NULL if zDb is
1db0: 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20   also NULL.  If 
1dc0: 7a 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 20 69  zTable is NULL i
1dd0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
1de0: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
1df0: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
1e00: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
1e10: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
1e20: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
1e30: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
1e40: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
1e50: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
1e60: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
1e70: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
1e80: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 57 52 43  e and return WRC
1e90: 5f 41 62 6f 72 74 2e 20 20 52 65 74 75 72 6e 20  _Abort.  Return 
1ea0: 57 52 43 5f 50 72 75 6e 65 20 6f 6e 20 73 75 63  WRC_Prune on suc
1eb0: 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
1ec0: 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a  int lookupName(.
1ed0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ee0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1ef0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1f00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f10: 44 62 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Db,     /* Name 
1f20: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
1f40: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c  onst char *zTab,
1f60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f70: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1f80: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20  column, or NULL 
1f90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1fa0: 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zCol,    /* Nam
1fb0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
1fc0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
1fd0: 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68  t *pNC,    /* Th
1fe0: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75  e name context u
1ff0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  sed to resolve t
2000: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  he name */.  Exp
2010: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
2020: 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45    /* Make this E
2030: 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74  XPR node point t
2040: 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63  o the selected c
2050: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  olumn */.){.  in
2060: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2090: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   */.  int cnt = 
20a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20c0: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
20d0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
20e0: 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20  int cntTab = 0; 
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
2110: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61  atching table na
2120: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  mes */.  int nSu
2130: 62 71 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20  bquery = 0;     
2140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
2150: 77 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66  w many levels of
2160: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
2170: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2180: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
2190: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
21a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
21b0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21c0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20  item *pItem;    
21d0: 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f     /* Use for lo
21e0: 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63 4c  oping over pSrcL
21f0: 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73  ist items */.  s
2200: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2210: 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20  em *pMatch = 0; 
2220: 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e 67   /* The matching
2230: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20 2a   pSrcList item *
2240: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
2250: 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20  *pTopNC = pNC;  
2260: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e        /* First n
2270: 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74 68  amecontext in th
2280: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53 63 68 65  e list */.  Sche
2290: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 30 3b  ma *pSchema = 0;
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b0: 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65 20 65   Schema of the e
22c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
22d0: 6e 74 20 69 73 54 72 69 67 67 65 72 20 3d 20 30  nt isTrigger = 0
22e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 73 6f   /* True if reso
2300: 6c 76 65 64 20 74 6f 20 61 20 74 72 69 67 67 65  lved to a trigge
2310: 72 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 54 61  r column */.  Ta
2320: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 2f 2a 20 54 61 62 6c 65 20 68 6f 6c 64 20 74 68  /* Table hold th
2350: 65 20 72 6f 77 20 2a 2f 0a 20 20 43 6f 6c 75 6d  e row */.  Colum
2360: 6e 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  n *pCol;        
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2380: 41 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62  A column of pTab
2390: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
23a0: 4e 43 20 29 3b 20 20 20 20 20 2f 2a 20 74 68 65  NC );     /* the
23b0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 63 61   name context ca
23c0: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f  nnot be NULL. */
23d0: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 20  .  assert( zCol 
23e0: 29 3b 20 20 20 20 2f 2a 20 54 68 65 20 5a 20 69  );    /* The Z i
23f0: 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62  n X.Y.Z cannot b
2400: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 61 73 73 65  e NULL */.  asse
2410: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2420: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2430: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2440: 63 65 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  ced) );..  /* In
2450: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 64  itialize the nod
2460: 65 20 74 6f 20 6e 6f 2d 6d 61 74 63 68 20 2a 2f  e to no-match */
2470: 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  .  pExpr->iTable
2480: 20 3d 20 2d 31 3b 0a 20 20 70 45 78 70 72 2d 3e   = -1;.  pExpr->
2490: 70 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  pTab = 0;.  Expr
24a0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
24b0: 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
24c0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 6c  e);..  /* Transl
24d0: 61 74 65 20 74 68 65 20 73 63 68 65 6d 61 20 6e  ate the schema n
24e0: 61 6d 65 20 69 6e 20 7a 44 62 20 69 6e 74 6f 20  ame in zDb into 
24f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2500: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 20   corresponding. 
2510: 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 49 66 20   ** schema.  If 
2520: 6e 6f 74 20 66 6f 75 6e 64 2c 20 70 53 63 68 65  not found, pSche
2530: 6d 61 20 77 69 6c 6c 20 72 65 6d 61 69 6e 20 4e  ma will remain N
2540: 55 4c 4c 20 61 6e 64 20 6e 6f 74 68 69 6e 67 20  ULL and nothing 
2550: 77 69 6c 6c 20 6d 61 74 63 68 0a 20 20 2a 2a 20  will match.  ** 
2560: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
2570: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
2580: 72 20 6d 65 73 73 61 67 65 20 74 6f 77 61 72 64  r message toward
2590: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
25a0: 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2f 0a 20 20   routine.  */.  
25b0: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 74  if( zDb ){.    t
25c0: 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63  estcase( pNC->nc
25d0: 46 6c 61 67 73 20 26 20 4e 43 5f 50 61 72 74 49  Flags & NC_PartI
25e0: 64 78 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  dx );.    testca
25f0: 73 65 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  se( pNC->ncFlags
2600: 20 26 20 4e 43 5f 49 73 43 68 65 63 6b 20 29 3b   & NC_IsCheck );
2610: 0a 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e  .    if( (pNC->n
2620: 63 46 6c 61 67 73 20 26 20 28 4e 43 5f 50 61 72  cFlags & (NC_Par
2630: 74 49 64 78 7c 4e 43 5f 49 73 43 68 65 63 6b 29  tIdx|NC_IsCheck)
2640: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
2650: 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65   Silently ignore
2660: 20 64 61 74 61 62 61 73 65 20 71 75 61 6c 69 66   database qualif
2670: 69 65 72 73 20 69 6e 73 69 64 65 20 43 48 45 43  iers inside CHEC
2680: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e  K constraints an
2690: 64 20 70 61 72 74 69 61 6c 0a 20 20 20 20 20 20  d partial.      
26a0: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20 44 6f 20  ** indices.  Do 
26b0: 6e 6f 74 20 72 61 69 73 65 20 65 72 72 6f 72 73  not raise errors
26c0: 20 62 65 63 61 75 73 65 20 74 68 61 74 20 6d 69   because that mi
26d0: 67 68 74 20 62 72 65 61 6b 20 6c 65 67 61 63 79  ght break legacy
26e0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 62 65   and.      ** be
26f0: 63 61 75 73 65 20 69 74 20 64 6f 65 73 20 6e 6f  cause it does no
2700: 74 20 68 75 72 74 20 61 6e 79 74 68 69 6e 67 20  t hurt anything 
2710: 74 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 74  to just ignore t
2720: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
2730: 2e 20 2a 2f 0a 20 20 20 20 20 20 7a 44 62 20 3d  . */.      zDb =
2740: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
2750: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2760: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2770: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
2780: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20  b->aDb[i].zName 
2790: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
27a0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
27b0: 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a  ->aDb[i].zName,z
27c0: 44 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)==0 ){.      
27d0: 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62      pSchema = db
27e0: 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61  ->aDb[i].pSchema
27f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2800: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2810: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2820: 20 20 2f 2a 20 53 74 61 72 74 20 61 74 20 74 68    /* Start at th
2830: 65 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e  e inner-most con
2840: 74 65 78 74 20 61 6e 64 20 6d 6f 76 65 20 6f 75  text and move ou
2850: 74 77 61 72 64 20 75 6e 74 69 6c 20 61 20 6d 61  tward until a ma
2860: 74 63 68 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a  tch is found */.
2870: 20 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20    while( pNC && 
2880: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78  cnt==0 ){.    Ex
2890: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
28a0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
28b0: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
28c0: 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20  cList;..    if( 
28d0: 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
28e0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
28f0: 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pSrcList->a; i<
2900: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
2910: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
2920: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49         pTab = pI
2930: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  tem->pTab;.     
2940: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21     assert( pTab!
2950: 3d 30 20 26 26 20 70 54 61 62 2d 3e 7a 4e 61 6d  =0 && pTab->zNam
2960: 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  e!=0 );.        
2970: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
2980: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ol>0 );.        
2990: 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
29a0: 63 74 20 26 26 20 28 70 49 74 65 6d 2d 3e 70 53  ct && (pItem->pS
29b0: 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20  elect->selFlags 
29c0: 26 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29  & SF_NestedFrom)
29d0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
29e0: 20 69 6e 74 20 68 69 74 20 3d 20 30 3b 0a 20 20   int hit = 0;.  
29f0: 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d          pEList =
2a00: 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
2a10: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  >pEList;.       
2a20: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45     for(j=0; j<pE
2a30: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
2a40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2a50: 66 28 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  f( sqlite3MatchS
2a60: 70 61 6e 4e 61 6d 65 28 70 45 4c 69 73 74 2d 3e  panName(pEList->
2a70: 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 7a 43 6f 6c  a[j].zSpan, zCol
2a80: 2c 20 7a 54 61 62 2c 20 7a 44 62 29 20 29 7b 0a  , zTab, zDb) ){.
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e                cn
2aa0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
2ab0: 20 20 20 63 6e 74 54 61 62 20 3d 20 32 3b 0a 20     cntTab = 2;. 
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61               pMa
2ad0: 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20  tch = pItem;.   
2ae0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
2af0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  ->iColumn = j;. 
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 69 74               hit
2b10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
2b20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2b30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68 69            if( hi
2b40: 74 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 63  t || zTab==0 ) c
2b50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2b60: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
2b70: 44 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68  Db && pTab->pSch
2b80: 65 6d 61 21 3d 70 53 63 68 65 6d 61 20 29 7b 0a  ema!=pSchema ){.
2b90: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2ba0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
2bb0: 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29        if( zTab )
2bc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
2bd0: 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65  t char *zTabName
2be0: 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   = pItem->zAlias
2bf0: 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   ? pItem->zAlias
2c00: 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   : pTab->zName;.
2c10: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2c20: 28 20 7a 54 61 62 4e 61 6d 65 21 3d 30 20 29 3b  ( zTabName!=0 );
2c30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
2c40: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
2c50: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
2c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c90: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28          if( 0==(
2ca0: 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20  cntTab++) ){.   
2cb0: 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
2cc0: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d  pItem;.        }
2cd0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
2ce0: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
2cf0: 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
2d00: 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   j++, pCol++){. 
2d10: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2d20: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
2d30: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ->zName, zCol)==
2d40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2d50: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 73   /* If there has
2d60: 20 62 65 65 6e 20 65 78 61 63 74 6c 79 20 6f 6e   been exactly on
2d70: 65 20 70 72 69 6f 72 20 6d 61 74 63 68 20 61 6e  e prior match an
2d80: 64 20 74 68 69 73 20 6d 61 74 63 68 0a 20 20 20  d this match.   
2d90: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 66           ** is f
2da0: 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  or the right-han
2db0: 64 20 74 61 62 6c 65 20 6f 66 20 61 20 4e 41 54  d table of a NAT
2dc0: 55 52 41 4c 20 4a 4f 49 4e 20 6f 72 20 69 73 20  URAL JOIN or is 
2dd0: 69 6e 20 61 20 0a 20 20 20 20 20 20 20 20 20 20  in a .          
2de0: 20 20 2a 2a 20 55 53 49 4e 47 20 63 6c 61 75 73    ** USING claus
2df0: 65 2c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 69  e, then skip thi
2e00: 73 20 6d 61 74 63 68 2e 0a 20 20 20 20 20 20 20  s match..       
2e10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2e20: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29      if( cnt==1 )
2e30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2e40: 69 66 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74  if( pItem->joint
2e50: 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c  ype & JT_NATURAL
2e60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2e70: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e             if( n
2e80: 61 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75 73 65  ameInUsingClause
2e90: 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 2c 20  (pItem->pUsing, 
2ea0: 7a 43 6f 6c 29 20 29 20 63 6f 6e 74 69 6e 75 65  zCol) ) continue
2eb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b              cnt+
2ed0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
2ee0: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
2f00: 62 73 74 69 74 75 74 65 20 74 68 65 20 72 6f 77  bstitute the row
2f10: 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66  id (column -1) f
2f20: 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  or the INTEGER P
2f30: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20  RIMARY KEY */.  
2f40: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2f50: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54  >iColumn = j==pT
2f60: 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a  ab->iPKey ? -1 :
2f70: 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 20 20 20   (i16)j;.       
2f80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2fa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2fb0: 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20 20  if( pMatch ){.  
2fc0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
2fd0: 62 6c 65 20 3d 20 70 4d 61 74 63 68 2d 3e 69 43  ble = pMatch->iC
2fe0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  ursor;.        p
2ff0: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61  Expr->pTab = pMa
3000: 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  tch->pTab;.     
3010: 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70 45 78     pSchema = pEx
3020: 70 72 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d  pr->pTab->pSchem
3030: 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  a;.      }.    }
3040: 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74   /* if( pSrcList
3050: 20 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53   ) */..#ifndef S
3060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
3070: 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  ER.    /* If we 
3080: 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79  have not already
3090: 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61   resolved the na
30a0: 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a  me, then maybe .
30b0: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e      ** it is a n
30c0: 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72  ew.* or old.* tr
30d0: 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72  igger argument r
30e0: 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a  eference.    */.
30f0: 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26      if( zDb==0 &
3100: 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74  & zTab!=0 && cnt
3110: 54 61 62 3d 3d 30 20 26 26 20 70 50 61 72 73 65  Tab==0 && pParse
3120: 2d 3e 70 54 72 69 67 67 65 72 54 61 62 21 3d 30  ->pTriggerTab!=0
3130: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70   ){.      int op
3140: 20 3d 20 70 50 61 72 73 65 2d 3e 65 54 72 69 67   = pParse->eTrig
3150: 67 65 72 4f 70 3b 0a 20 20 20 20 20 20 61 73 73  gerOp;.      ass
3160: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45  ert( op==TK_DELE
3170: 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44  TE || op==TK_UPD
3180: 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  ATE || op==TK_IN
3190: 53 45 52 54 20 29 3b 0a 20 20 20 20 20 20 69 66  SERT );.      if
31a0: 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54 45 20  ( op!=TK_DELETE 
31b0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
31c0: 70 28 22 6e 65 77 22 2c 7a 54 61 62 29 20 3d 3d  p("new",zTab) ==
31d0: 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45   0 ){.        pE
31e0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 31 3b  xpr->iTable = 1;
31f0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
3200: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
3210: 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Tab;.      }else
3220: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 53 45   if( op!=TK_INSE
3230: 52 54 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  RT && sqlite3Str
3240: 49 43 6d 70 28 22 6f 6c 64 22 2c 7a 54 61 62 29  ICmp("old",zTab)
3250: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
3260: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 30  Expr->iTable = 0
3270: 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  ;.        pTab =
3280: 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65   pParse->pTrigge
3290: 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rTab;.      }.. 
32a0: 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b       if( pTab ){
32b0: 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43   .        int iC
32c0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68  ol;.        pSch
32d0: 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68  ema = pTab->pSch
32e0: 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74  ema;.        cnt
32f0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66  Tab++;.        f
3300: 6f 72 28 69 43 6f 6c 3d 30 2c 20 70 43 6f 6c 3d  or(iCol=0, pCol=
3310: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 43 6f 6c  pTab->aCol; iCol
3320: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
3330: 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  l++, pCol++){.  
3340: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
3350: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
3360: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
3370: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3380: 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  if( iCol==pTab->
3390: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
33a0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31         iCol = -1
33b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
33d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
33e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
33f0: 20 69 66 28 20 69 43 6f 6c 3e 3d 70 54 61 62 2d   if( iCol>=pTab-
3400: 3e 6e 43 6f 6c 20 26 26 20 73 71 6c 69 74 65 33  >nCol && sqlite3
3410: 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 26 26  IsRowid(zCol) &&
3420: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
3430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
3440: 49 4d 50 3a 20 52 2d 32 34 33 30 39 2d 31 38 36  IMP: R-24309-186
3450: 32 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  25 */.          
3460: 2f 2a 20 49 4d 50 3a 20 52 2d 34 34 39 31 31 2d  /* IMP: R-44911-
3470: 35 35 31 32 34 20 2a 2f 0a 20 20 20 20 20 20 20  55124 */.       
3480: 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20     iCol = -1;.  
3490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
34a0: 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e  if( iCol<pTab->n
34b0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Col ){.         
34c0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
34d0: 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a    if( iCol<0 ){.
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
34f0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  r->affinity = SQ
3500: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
3510: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
3520: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61  e if( pExpr->iTa
3530: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble==0 ){.      
3540: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
3550: 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20  iCol==31 );.    
3560: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
3570: 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20  ( iCol==32 );.  
3580: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
3590: 2d 3e 6f 6c 64 6d 61 73 6b 20 7c 3d 20 28 69 43  ->oldmask |= (iC
35a0: 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66  ol>=32 ? 0xfffff
35b0: 66 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c  fff : (((u32)1)<
35c0: 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20  <iCol));.       
35d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
35e0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
35f0: 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20  iCol==31 );.    
3600: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
3610: 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20  ( iCol==32 );.  
3620: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
3630: 2d 3e 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69 43  ->newmask |= (iC
3640: 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66  ol>=32 ? 0xfffff
3650: 66 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c  fff : (((u32)1)<
3660: 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20  <iCol));.       
3670: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
3680: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
3690: 28 69 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20  (i16)iCol;.     
36a0: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
36b0: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
36c0: 20 20 20 69 73 54 72 69 67 67 65 72 20 3d 20 31     isTrigger = 1
36d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
36e0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
36f0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
3700: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
3710: 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ) */..    /*.   
3720: 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20   ** Perhaps the 
3730: 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65  name is a refere
3740: 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44  nce to the ROWID
3750: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
3760: 72 74 28 20 70 54 61 62 21 3d 30 20 7c 7c 20 63  rt( pTab!=0 || c
3770: 6e 74 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20  ntTab==0 );.    
3780: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e  if( cnt==0 && cn
3790: 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74  tTab==1 && sqlit
37a0: 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20  e3IsRowid(zCol) 
37b0: 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
37c0: 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d  ) ){.      cnt =
37d0: 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   1;.      pExpr-
37e0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20  >iColumn = -1;  
37f0: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 34 39     /* IMP: R-449
3800: 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20 20 20  11-55124 */.    
3810: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
3820: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
3830: 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20  NTEGER;.    }.. 
3840: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
3850: 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20  the input is of 
3860: 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20  the form Z (not 
3870: 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68  Y.Z or X.Y.Z) th
3880: 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20  en the name Z.  
3890: 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72    ** might refer
38a0: 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65   to an result-se
38b0: 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68  t alias.  This h
38c0: 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
38d0: 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  ple, when.    **
38e0: 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e   we are resolvin
38f0: 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57  g names in the W
3900: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
3910: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
3920: 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mand:.    **.   
3930: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
3940: 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62  +b AS x FROM tab
3950: 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20  le WHERE x<10;. 
3960: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
3970: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c  cases like this,
3980: 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77   replace pExpr w
3990: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
39a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
39b0: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74  t.    ** forms t
39c0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e  he result set en
39d0: 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68  try ("a+b" in th
39e0: 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72  e example) and r
39f0: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
3a00: 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  y..    ** Note t
3a10: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
3a20: 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
3a30: 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65   set should have
3a40: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
3a50: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79    ** resolved by
3a60: 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48   the time the WH
3a70: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65  ERE clause is re
3a80: 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  solved..    **. 
3a90: 20 20 20 2a 2a 20 54 68 65 20 61 62 69 6c 69 74     ** The abilit
3aa0: 79 20 74 6f 20 75 73 65 20 61 6e 20 6f 75 74 70  y to use an outp
3ab0: 75 74 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  ut result-set co
3ac0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 57 48 45 52  lumn in the WHER
3ad0: 45 2c 20 47 52 4f 55 50 20 42 59 2c 0a 20 20 20  E, GROUP BY,.   
3ae0: 20 2a 2a 20 6f 72 20 48 41 56 49 4e 47 20 63 6c   ** or HAVING cl
3af0: 61 75 73 65 73 2c 20 6f 72 20 61 73 20 70 61 72  auses, or as par
3b00: 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 65 78  t of a larger ex
3b10: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
3b20: 4f 52 44 52 45 20 42 59 0a 20 20 20 20 2a 2a 20  ORDRE BY.    ** 
3b30: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 73 74  clause is not st
3b40: 61 6e 64 61 72 64 20 53 51 4c 2e 20 20 54 68 69  andard SQL.  Thi
3b50: 73 20 69 73 20 61 20 28 67 6f 6f 66 79 29 20 53  s is a (goofy) S
3b60: 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e 2c  QLite extension,
3b70: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
3b80: 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 62 61  supported for ba
3b90: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
3ba0: 69 6c 69 74 79 20 6f 6e 6c 79 2e 20 20 54 4f 20  ility only.  TO 
3bb0: 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
3bc0: 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 73 71  ing.    ** on sq
3bd0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 77 68 65 6e  lite3_log() when
3be0: 65 76 65 72 20 74 68 65 20 63 61 70 61 62 69 6c  ever the capabil
3bf0: 69 74 79 20 69 73 20 75 73 65 64 2e 0a 20 20 20  ity is used..   
3c00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 45 4c   */.    if( (pEL
3c10: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73  ist = pNC->pELis
3c20: 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20 7a 54  t)!=0.     && zT
3c30: 61 62 3d 3d 30 0a 20 20 20 20 20 26 26 20 63 6e  ab==0.     && cn
3c40: 74 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  t==0.    ){.    
3c50: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c    for(j=0; j<pEL
3c60: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
3c70: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3c80: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
3c90: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3ca0: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
3cb0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
3cc0: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
3cd0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
3ce0: 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20  pOrig;.         
3cf0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
3d00: 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
3d10: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
3d20: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
3d30: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
3d40: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
3d50: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
3d60: 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  x.pSelect==0 );.
3d70: 20 20 20 20 20 20 20 20 20 20 70 4f 72 69 67 20            pOrig 
3d80: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  = pEList->a[j].p
3d90: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
3da0: 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
3db0: 73 26 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d  s&NC_AllowAgg)==
3dc0: 30 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  0 && ExprHasProp
3dd0: 65 72 74 79 28 70 4f 72 69 67 2c 20 45 50 5f 41  erty(pOrig, EP_A
3de0: 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gg) ){.         
3df0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3e00: 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
3e10: 73 65 20 6f 66 20 61 6c 69 61 73 65 64 20 61 67  se of aliased ag
3e20: 67 72 65 67 61 74 65 20 25 73 22 2c 20 7a 41 73  gregate %s", zAs
3e30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
3e40: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
3e50: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3e60: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41 6c         resolveAl
3e70: 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ias(pParse, pELi
3e80: 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c 20 22 22  st, j, pExpr, ""
3e90: 2c 20 6e 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , nSubquery);.  
3ea0: 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b          cnt = 1;
3eb0: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
3ec0: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  h = 0;.         
3ed0: 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30   assert( zTab==0
3ee0: 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20   && zDb==0 );.  
3ef0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f          goto loo
3f00: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 20  kupname_end;.   
3f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a       }.      } .
3f20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
3f30: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
3f40: 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  t name context. 
3f50: 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65   The loop will e
3f60: 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a  xit when either.
3f70: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61      ** we have a
3f80: 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f   match (cnt>0) o
3f90: 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75  r when we run ou
3fa0: 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78  t of name contex
3fb0: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
3fc0: 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  f( cnt==0 ){.   
3fd0: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
3fe0: 65 78 74 3b 0a 20 20 20 20 20 20 6e 53 75 62 71  ext;.      nSubq
3ff0: 75 65 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  uery++;.    }.  
4000: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
4010: 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c  X and Y are NULL
4020: 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
4030: 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c   if only the col
4040: 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20  umn name Z is.  
4050: 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64  ** supplied) and
4060: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20   the value of Z 
4070: 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64  is enclosed in d
4080: 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68  ouble-quotes, th
4090: 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73  en.  ** Z is a s
40a0: 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66  tring literal if
40b0: 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63   it doesn't matc
40c0: 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d  h any column nam
40d0: 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a  es.  In that.  *
40e0: 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20  * case, we need 
40f0: 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  to return right 
4100: 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b  away and not mak
4110: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
4120: 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a  .  ** pExpr..  *
4130: 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e  *.  ** Because n
4140: 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20  o reference was 
4150: 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f  made to outer co
4160: 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d  ntexts, the pNC-
4170: 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64  >nRef.  ** field
4180: 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65  s are not change
4190: 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74  d in any context
41a0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
41b0: 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26  ==0 && zTab==0 &
41c0: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
41d0: 79 28 70 45 78 70 72 2c 45 50 5f 44 62 6c 51 75  y(pExpr,EP_DblQu
41e0: 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 70 45 78  oted) ){.    pEx
41f0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52 49  pr->op = TK_STRI
4200: 4e 47 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70  NG;.    pExpr->p
4210: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Tab = 0;.    ret
4220: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
4230: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e   }..  /*.  ** cn
4240: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65  t==0 means there
4250: 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20   was not match. 
4260: 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65   cnt>1 means the
4270: 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20  re were two or. 
4280: 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73   ** more matches
4290: 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77  .  Either way, w
42a0: 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e  e have an error.
42b0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21  .  */.  if( cnt!
42c0: 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =1 ){.    const 
42d0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
42e0: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
42f0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 22  "no such column"
4300: 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f   : "ambiguous co
4310: 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20 20  lumn name";.    
4320: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20  if( zDb ){.     
4330: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4340: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
4350: 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a  .%s.%s", zErr, z
4360: 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b  Db, zTab, zCol);
4370: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
4380: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
4390: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
43a0: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
43b0: 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a 43  , zErr, zTab, zC
43c0: 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ol);.    }else{.
43d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
43e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
43f0: 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a 43  s: %s", zErr, zC
4400: 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ol);.    }.    p
4410: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
4420: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 70 54 6f 70  ma = 1;.    pTop
4430: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a  NC->nErr++;.  }.
4440: 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d  .  /* If a colum
4450: 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69  n from a table i
4460: 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72 65  n pSrcList is re
4470: 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72  ferenced, then r
4480: 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20  ecord.  ** this 
4490: 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72 63  fact in the pSrc
44a0: 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64  List.a[].colUsed
44b0: 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d   bitmask.  Colum
44c0: 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20  n 0 causes.  ** 
44d0: 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e  bit 0 to be set.
44e0: 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20    Column 1 sets 
44f0: 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66  bit 1.  And so f
4500: 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20  orth.  If the.  
4510: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  ** column number
4520: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
4530: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
4540: 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61  its in the bitma
4550: 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74  sk.  ** then set
4560: 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20   the high-order 
4570: 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61  bit of the bitma
4580: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  sk..  */.  if( p
4590: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
45a0: 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b   && pMatch!=0 ){
45b0: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78  .    int n = pEx
45c0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
45d0: 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 42 4d   testcase( n==BM
45e0: 53 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  S-1 );.    if( n
45f0: 3e 3d 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 6e  >=BMS ){.      n
4600: 20 3d 20 42 4d 53 2d 31 3b 0a 20 20 20 20 7d 0a   = BMS-1;.    }.
4610: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74      assert( pMat
4620: 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78  ch->iCursor==pEx
4630: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
4640: 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65    pMatch->colUse
4650: 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31  d |= ((Bitmask)1
4660: 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )<<n;.  }..  /* 
4670: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
4680: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
4690: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
46a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
46b0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
46c0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
46d0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
46e0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45  r->pRight);.  pE
46f0: 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b  xpr->pRight = 0;
4700: 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28  .  pExpr->op = (
4710: 69 73 54 72 69 67 67 65 72 20 3f 20 54 4b 5f 54  isTrigger ? TK_T
4720: 52 49 47 47 45 52 20 3a 20 54 4b 5f 43 4f 4c 55  RIGGER : TK_COLU
4730: 4d 4e 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  MN);.lookupname_
4740: 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e 74 3d 3d  end:.  if( cnt==
4750: 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  1 ){.    assert(
4760: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pNC!=0 );.    i
4770: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
4780: 5f 41 53 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _AS ){.      sql
4790: 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50 61  ite3AuthRead(pPa
47a0: 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63 68  rse, pExpr, pSch
47b0: 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ema, pNC->pSrcLi
47c0: 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  st);.    }.    /
47d0: 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  * Increment the 
47e0: 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c  nRef value on al
47f0: 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  l name contexts 
4800: 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f  from TopNC up to
4810: 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  .    ** the poin
4820: 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65  t where the name
4830: 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20   matched. */.   
4840: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
4850: 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d  assert( pTopNC!=
4860: 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  0 );.      pTopN
4870: 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20  C->nRef++;.     
4880: 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43   if( pTopNC==pNC
4890: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
48a0: 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d  pTopNC = pTopNC-
48b0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
48c0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
48d0: 6e 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ne;.  } else {. 
48e0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
48f0: 6f 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ort;.  }.}../*.*
4900: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
4910: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
4920: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
4930: 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   to load the col
4940: 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72 6f 6d  umn iCol.** from
4950: 20 64 61 74 61 73 6f 75 72 63 65 20 69 53 72 63   datasource iSrc
4960: 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63   in SrcList pSrc
4970: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
4980: 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78  e3CreateColumnEx
4990: 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  pr(sqlite3 *db, 
49a0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 69  SrcList *pSrc, i
49b0: 6e 74 20 69 53 72 63 2c 20 69 6e 74 20 69 43 6f  nt iSrc, int iCo
49c0: 6c 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20  l){.  Expr *p = 
49d0: 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63  sqlite3ExprAlloc
49e0: 28 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20  (db, TK_COLUMN, 
49f0: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29  0, 0);.  if( p )
4a00: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
4a10: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
4a20: 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 53 72 63   = &pSrc->a[iSrc
4a30: 5d 3b 0a 20 20 20 20 70 2d 3e 70 54 61 62 20 3d  ];.    p->pTab =
4a40: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
4a50: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49    p->iTable = pI
4a60: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
4a70: 20 20 69 66 28 20 70 2d 3e 70 54 61 62 2d 3e 69    if( p->pTab->i
4a80: 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20  PKey==iCol ){.  
4a90: 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
4aa0: 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
4ab0: 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e        p->iColumn
4ac0: 20 3d 20 28 79 6e 56 61 72 29 69 43 6f 6c 3b 0a   = (ynVar)iCol;.
4ad0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4ae0: 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20  iCol==BMS );.   
4af0: 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f     testcase( iCo
4b00: 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  l==BMS-1 );.    
4b10: 20 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64    pItem->colUsed
4b20: 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29   |= ((Bitmask)1)
4b30: 3c 3c 28 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 42  <<(iCol>=BMS ? B
4b40: 4d 53 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a 20 20  MS-1 : iCol);.  
4b50: 20 20 7d 0a 20 20 20 20 45 78 70 72 53 65 74 50    }.    ExprSetP
4b60: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
4b70: 73 6f 6c 76 65 64 29 3b 0a 20 20 7d 0a 20 20 72  solved);.  }.  r
4b80: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
4b90: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
4ba0: 72 20 74 68 61 74 20 61 6e 20 65 78 70 72 65 73  r that an expres
4bb0: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69  sion is not vali
4bc0: 64 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20  d for a partial 
4bd0: 69 6e 64 65 78 20 57 48 45 52 45 0a 2a 2a 20 63  index WHERE.** c
4be0: 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  lause..*/.static
4bf0: 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69 64 50 61   void notValidPa
4c00: 72 74 49 64 78 57 68 65 72 65 28 0a 20 20 50 61  rtIdxWhere(.  Pa
4c10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4c20: 20 20 20 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f     /* Leave erro
4c30: 72 20 6d 65 73 73 61 67 65 20 68 65 72 65 20 2a  r message here *
4c40: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
4c50: 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20  *pNC,    /* The 
4c60: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  name context */.
4c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
4c80: 73 67 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f  sg     /* Type o
4c90: 66 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20  f error */.){.  
4ca0: 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
4cb0: 73 20 26 20 4e 43 5f 50 61 72 74 49 64 78 29 21  s & NC_PartIdx)!
4cc0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
4cd0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
4ce0: 2c 20 22 25 73 20 70 72 6f 68 69 62 69 74 65 64  , "%s prohibited
4cf0: 20 69 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 65   in partial inde
4d00: 78 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 22  x WHERE clauses"
4d10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4d20: 20 20 20 20 20 20 7a 4d 73 67 29 3b 0a 20 20 7d        zMsg);.  }
4d30: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
4d40: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 2f 2a  TE_OMIT_CHECK./*
4d50: 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72  .** Report an er
4d60: 72 6f 72 20 74 68 61 74 20 61 6e 20 65 78 70 72  ror that an expr
4d70: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61  ession is not va
4d80: 6c 69 64 20 66 6f 72 20 61 20 43 48 45 43 4b 20  lid for a CHECK 
4d90: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73  constraint..*/.s
4da0: 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 74 56 61  tatic void notVa
4db0: 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  lidCheckConstrai
4dc0: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
4dd0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4c 65  rse,       /* Le
4de0: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
4df0: 65 20 68 65 72 65 20 2a 2f 0a 20 20 4e 61 6d 65  e here */.  Name
4e00: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
4e10: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e   /* The name con
4e20: 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
4e30: 63 68 61 72 20 2a 7a 4d 73 67 20 20 20 20 20 2f  char *zMsg     /
4e40: 2a 20 54 79 70 65 20 6f 66 20 65 72 72 6f 72 20  * Type of error 
4e50: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 28 70 4e 43  */.){.  if( (pNC
4e60: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49  ->ncFlags & NC_I
4e70: 73 43 68 65 63 6b 29 21 3d 30 20 29 7b 0a 20 20  sCheck)!=0 ){.  
4e80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4e90: 67 28 70 50 61 72 73 65 2c 22 25 73 20 70 72 6f  g(pParse,"%s pro
4ea0: 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b  hibited in CHECK
4eb0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 2c 20 7a   constraints", z
4ec0: 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73  Msg);.  }.}.#els
4ed0: 65 0a 23 20 64 65 66 69 6e 65 20 6e 6f 74 56 61  e.# define notVa
4ee0: 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  lidCheckConstrai
4ef0: 6e 74 28 50 2c 4e 2c 4d 29 0a 23 65 6e 64 69 66  nt(P,N,M).#endif
4f00: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
4f10: 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65 6e 63 6f  on p should enco
4f20: 64 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f  de a floating po
4f30: 69 6e 74 20 76 61 6c 75 65 20 62 65 74 77 65 65  int value betwee
4f40: 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a  n 1.0 and 0.0..*
4f50: 2a 20 52 65 74 75 72 6e 20 31 30 32 34 20 74 69  * Return 1024 ti
4f60: 6d 65 73 20 74 68 69 73 20 76 61 6c 75 65 2e 20  mes this value. 
4f70: 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69 66   Or return -1 if
4f80: 20 70 20 69 73 20 6e 6f 74 20 61 20 66 6c 6f 61   p is not a floa
4f90: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
4fa0: 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 30 20  lue between 1.0 
4fb0: 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61 74  and 0.0..*/.stat
4fc0: 69 63 20 69 6e 74 20 65 78 70 72 50 72 6f 62 61  ic int exprProba
4fd0: 62 69 6c 69 74 79 28 45 78 70 72 20 2a 70 29 7b  bility(Expr *p){
4fe0: 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 2d 31  .  double r = -1
4ff0: 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 21  .0;.  if( p->op!
5000: 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74 75  =TK_FLOAT ) retu
5010: 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33  rn -1;.  sqlite3
5020: 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  AtoF(p->u.zToken
5030: 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72  , &r, sqlite3Str
5040: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
5050: 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  n), SQLITE_UTF8)
5060: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 3e 3d 30  ;.  assert( r>=0
5070: 2e 30 20 29 3b 0a 20 20 69 66 28 20 72 3e 31 2e  .0 );.  if( r>1.
5080: 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
5090: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 72 2a   return (int)(r*
50a0: 31 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  1000.0);.}../*.*
50b0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
50c0: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73  s callback for s
50d0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29  qlite3WalkExpr()
50e0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ..**.** Resolve 
50f0: 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69  symbolic names i
5100: 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70  nto TK_COLUMN op
5110: 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20  erators for the 
5120: 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20  current.** node 
5130: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
5140: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
5150: 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68  0 to continue th
5160: 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a  e search down.**
5170: 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20 74   the tree or 2 t
5180: 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65 65  o abort the tree
5190: 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   walk..**.** Thi
51a0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
51b0: 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69  oes error checki
51c0: 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f  ng and name reso
51d0: 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75  lution for.** fu
51e0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54  nction names.  T
51f0: 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  he operator for 
5200: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
5210: 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a  ons is changed.*
5220: 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43  * to TK_AGG_FUNC
5230: 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  TION..*/.static 
5240: 69 6e 74 20 72 65 73 6f 6c 76 65 45 78 70 72 53  int resolveExprS
5250: 74 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  tep(Walker *pWal
5260: 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ker, Expr *pExpr
5270: 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
5280: 20 2a 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a   *pNC;.  Parse *
5290: 70 50 61 72 73 65 3b 0a 0a 20 20 70 4e 43 20 3d  pParse;..  pNC =
52a0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
52b0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d  .  assert( pNC!=
52c0: 30 20 29 3b 0a 20 20 70 50 61 72 73 65 20 3d 20  0 );.  pParse = 
52d0: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 61  pNC->pParse;.  a
52e0: 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70  ssert( pParse==p
52f0: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 20 29  Walker->pParse )
5300: 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
5310: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
5320: 45 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20 72  EP_Resolved) ) r
5330: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
5340: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
5350: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
5360: 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20  olved);.#ifndef 
5370: 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43  NDEBUG.  if( pNC
5380: 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e  ->pSrcList && pN
5390: 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c  C->pSrcList->nAl
53a0: 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63  loc>0 ){.    Src
53b0: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
53c0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
53d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
53e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70  or(i=0; i<pNC->p
53f0: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
5400: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
5410: 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  t( pSrcList->a[i
5420: 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20  ].iCursor>=0 && 
5430: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
5440: 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e  Cursor<pParse->n
5450: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
5460: 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
5470: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 23   pExpr->op ){..#
5480: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5490: 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f  E_ENABLE_UPDATE_
54a0: 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26  DELETE_LIMIT) &&
54b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
54c0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
54d0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
54e0: 61 6c 20 6f 70 65 72 61 74 6f 72 20 54 4b 5f 52  al operator TK_R
54f0: 4f 57 20 6d 65 61 6e 73 20 75 73 65 20 74 68 65  OW means use the
5500: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 66   rowid for the f
5510: 69 72 73 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  irst.    ** colu
5520: 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  mn in the FROM c
5530: 6c 61 75 73 65 2e 20 20 54 68 69 73 20 69 73 20  lause.  This is 
5540: 75 73 65 64 20 62 79 20 74 68 65 20 4c 49 4d 49  used by the LIMI
5550: 54 20 61 6e 64 20 4f 52 44 45 52 20 42 59 0a 20  T and ORDER BY. 
5560: 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 70 72 6f     ** clause pro
5570: 63 65 73 73 69 6e 67 20 6f 6e 20 55 50 44 41 54  cessing on UPDAT
5580: 45 20 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61  E and DELETE sta
5590: 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
55a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 4f 57 3a      case TK_ROW:
55b0: 20 7b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74   {.      SrcList
55c0: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
55d0: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
55e0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
55f0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
5600: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
5610: 4c 69 73 74 20 26 26 20 70 53 72 63 4c 69 73 74  List && pSrcList
5620: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20  ->nSrc==1 );.   
5630: 20 20 20 70 49 74 65 6d 20 3d 20 70 53 72 63 4c     pItem = pSrcL
5640: 69 73 74 2d 3e 61 3b 20 0a 20 20 20 20 20 20 70  ist->a; .      p
5650: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
5660: 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 78 70  LUMN;.      pExp
5670: 72 2d 3e 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  r->pTab = pItem-
5680: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78  >pTab;.      pEx
5690: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
56a0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
56b0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
56c0: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45  n = -1;.      pE
56d0: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
56e0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
56f0: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
5700: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
5710: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5720: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
5730: 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26 20 21  LETE_LIMIT) && !
5740: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5750: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f  MIT_SUBQUERY) */
5760: 0a 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20  ..    /* A lone 
5770: 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68  identifier is th
5780: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
5790: 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  mn..    */.    c
57a0: 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20  ase TK_ID: {.   
57b0: 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70     return lookup
57c0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
57d0: 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
57e0: 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b  en, pNC, pExpr);
57f0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
5800: 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   A table name an
5810: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20  d column name:  
5820: 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20     ID.ID.    ** 
5830: 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74  Or a database, t
5840: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a  able and column:
5850: 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a    ID.ID.ID.    *
5860: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  /.    case TK_DO
5870: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
5880: 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a   char *zColumn;.
5890: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
58a0: 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 20 20   *zTable;.      
58b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
58c0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
58d0: 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69  ght;..      /* i
58e0: 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  f( pSrcList==0 )
58f0: 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20   break; */.     
5900: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
5910: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69  >pRight;.      i
5920: 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  f( pRight->op==T
5930: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
5940: 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  zDb = 0;.       
5950: 20 7a 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d   zTable = pExpr-
5960: 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
5970: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d  ;.        zColum
5980: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54  n = pRight->u.zT
5990: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
59a0: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
59b0: 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  t( pRight->op==T
59c0: 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20  K_DOT );.       
59d0: 20 7a 44 62 20 3d 20 70 45 78 70 72 2d 3e 70 4c   zDb = pExpr->pL
59e0: 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
59f0: 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d 20         zTable = 
5a00: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 75  pRight->pLeft->u
5a10: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
5a20: 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68   zColumn = pRigh
5a30: 74 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f  t->pRight->u.zTo
5a40: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ken;.      }.   
5a50: 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70     return lookup
5a60: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 44 62  Name(pParse, zDb
5a70: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
5a80: 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a  n, pNC, pExpr);.
5a90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
5aa0: 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e  solve function n
5ab0: 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ames.    */.    
5ac0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
5ad0: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
5ae0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
5af0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f  r->x.pList;    /
5b00: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c  * The argument l
5b10: 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ist */.      int
5b20: 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69   n = pList ? pLi
5b30: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20  st->nExpr : 0;  
5b40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
5b50: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
5b60: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
5b70: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nc = 0;       /*
5b80: 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68   True if no such
5b90: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
5ba0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72   */.      int wr
5bb0: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30  ong_num_args = 0
5bc0: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
5bd0: 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66   wrong number of
5be0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5bf0: 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d      int is_agg =
5c00: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
5c10: 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e  /* True if is an
5c20: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
5c30: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
5c40: 20 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20   auth;          
5c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68           /* Auth
5c60: 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65  orization to use
5c70: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
5c80: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5cb0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75  characters in fu
5cc0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
5cd0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5ce0: 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  *zId;           
5cf0: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
5d00: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   name. */.      
5d10: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
5d20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
5d30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
5d40: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
5d50: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
5d60: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
5d70: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
5d80: 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a  se encoding */..
5d90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
5da0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5db0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
5dc0: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e 6f 74  ct) );.      not
5dd0: 56 61 6c 69 64 50 61 72 74 49 64 78 57 68 65 72  ValidPartIdxWher
5de0: 65 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22  e(pParse, pNC, "
5df0: 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20  functions");.   
5e00: 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
5e10: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
5e20: 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nId = sqlite3Str
5e30: 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20  len30(zId);.    
5e40: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
5e50: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
5e60: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
5e70: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
5e80: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
5e90: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
5ea0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
5eb0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
5ec0: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 32 2c  b, zId, nId, -2,
5ed0: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
5ee0: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
5ef0: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
5f00: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
5f10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
5f20: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
5f30: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
5f40: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
5f50: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
5f60: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
5f70: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  ;.        if( pD
5f80: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
5f90: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49  SQLITE_FUNC_UNLI
5fa0: 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  KELY ){.        
5fb0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
5fc0: 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69  y(pExpr, EP_Unli
5fd0: 6b 65 6c 79 7c 45 50 5f 53 6b 69 70 29 3b 0a 20  kely|EP_Skip);. 
5fe0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d           if( n==
5ff0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
6000: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6010: 20 65 78 70 72 50 72 6f 62 61 62 69 6c 69 74 79   exprProbability
6020: 28 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  (pList->a[1].pEx
6030: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
6040: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
6050: 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
6060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6070: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 73  orMsg(pParse, "s
6080: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
6090: 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 6d  o likelihood() m
60a0: 75 73 74 20 62 65 20 61 20 22 0a 20 20 20 20 20  ust be a ".     
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 20 22 63 6f 6e 73 74 61 6e 74 20 62 65 74 77 65   "constant betwe
60e0: 65 6e 20 30 2e 30 20 61 6e 64 20 31 2e 30 22 29  en 0.0 and 1.0")
60f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6100: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
6110: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6120: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6130: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
6140: 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33 30 34 2d  NCE-OF: R-61304-
6150: 32 39 34 34 39 20 54 68 65 20 75 6e 6c 69 6b 65  29449 The unlike
6160: 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69  ly(X) function i
6170: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 0a  s equivalent to.
6180: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c              ** l
6190: 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 20 30 2e 30  ikelihood(X, 0.0
61a0: 36 32 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20  625)..          
61b0: 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
61c0: 3a 20 52 2d 30 31 32 38 33 2d 31 31 36 33 36 20  : R-01283-11636 
61d0: 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28 58 29 20  The unlikely(X) 
61e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 68 6f 72  function is shor
61f0: 74 2d 68 61 6e 64 20 66 6f 72 0a 20 20 20 20 20  t-hand for.     
6200: 20 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65 6c 69         ** likeli
6210: 68 6f 6f 64 28 58 2c 30 2e 30 36 32 35 29 2e 20  hood(X,0.0625). 
6220: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
6230: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 36  Expr->iTable = 6
6240: 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 20  2;  /* TUNING:  
6250: 44 65 66 61 75 6c 74 20 32 6e 64 20 61 72 67 20  Default 2nd arg 
6260: 74 6f 20 75 6e 6c 69 6b 65 6c 79 28 29 20 69 73  to unlikely() is
6270: 20 30 2e 30 36 32 35 20 2a 2f 0a 20 20 20 20 20   0.0625 */.     
6280: 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 20 20       }          
6290: 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20     .        }.  
62a0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
62b0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
62c0: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69 66  IZATION.      if
62d0: 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20  ( pDef ){.      
62e0: 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33    auth = sqlite3
62f0: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
6300: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f  , SQLITE_FUNCTIO
6310: 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  N, 0, pDef->zNam
6320: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
6330: 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f  f( auth!=SQLITE_
6340: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
6350: 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45  if( auth==SQLITE
6360: 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20  _DENY ){.       
6370: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6380: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
6390: 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20  t authorized to 
63a0: 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73  use function: %s
63b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63d0: 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61         pDef->zNa
63e0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
63f0: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
6400: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6410: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
6420: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TK_NULL;.       
6430: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
6440: 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  une;.        }. 
6450: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d         if( pDef-
6460: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
6470: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e  ITE_FUNC_CONSTAN
6480: 54 20 29 20 45 78 70 72 53 65 74 50 72 6f 70 65  T ) ExprSetPrope
6490: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
64a0: 73 74 61 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  stant);.      }.
64b0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
64c0: 20 69 73 5f 61 67 67 20 26 26 20 28 70 4e 43 2d   is_agg && (pNC-
64d0: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 41 6c  >ncFlags & NC_Al
64e0: 6c 6f 77 41 67 67 29 3d 3d 30 20 29 7b 0a 20 20  lowAgg)==0 ){.  
64f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6500: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
6510: 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
6520: 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  te function %.*s
6530: 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20  ()", nId,zId);. 
6540: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
6550: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  ++;.        is_a
6560: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  gg = 0;.      }e
6570: 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f  lse if( no_such_
6580: 66 75 6e 63 20 26 26 20 70 50 61 72 73 65 2d 3e  func && pParse->
6590: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
65a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
65b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
65c0: 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e  se, "no such fun
65d0: 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49  ction: %.*s", nI
65e0: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
65f0: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
6600: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
6610: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a  ong_num_args ){.
6620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6630: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
6640: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
6650: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
6660: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20  ction %.*s()",. 
6670: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c              nId,
6680: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
6690: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
66a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
66b0: 5f 61 67 67 20 29 20 70 4e 43 2d 3e 6e 63 46 6c  _agg ) pNC->ncFl
66c0: 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77  ags &= ~NC_Allow
66d0: 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Agg;.      sqlit
66e0: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70  e3WalkExprList(p
66f0: 57 61 6c 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a  Walker, pList);.
6700: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
6710: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65   ){.        Name
6720: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 32 20 3d 20  Context *pNC2 = 
6730: 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 70 45 78  pNC;.        pEx
6740: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
6750: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20  FUNCTION;.      
6760: 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 30    pExpr->op2 = 0
6770: 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
6780: 20 70 4e 43 32 20 26 26 20 21 73 71 6c 69 74 65   pNC2 && !sqlite
6790: 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
67a0: 73 53 72 63 28 70 45 78 70 72 2c 20 70 4e 43 32  sSrc(pExpr, pNC2
67b0: 2d 3e 70 53 72 63 4c 69 73 74 29 20 29 7b 0a 20  ->pSrcList) ){. 
67c0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
67d0: 6f 70 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  op2++;.         
67e0: 20 70 4e 43 32 20 3d 20 70 4e 43 32 2d 3e 70 4e   pNC2 = pNC2->pN
67f0: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ext;.        }. 
6800: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 32 20         if( pNC2 
6810: 29 20 70 4e 43 32 2d 3e 6e 63 46 6c 61 67 73 20  ) pNC2->ncFlags 
6820: 7c 3d 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20  |= NC_HasAgg;.  
6830: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61        pNC->ncFla
6840: 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67  gs |= NC_AllowAg
6850: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  g;.      }.     
6860: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d   /* FIX ME:  Com
6870: 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69  pute pExpr->affi
6880: 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68  nity based on th
6890: 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  e expected retur
68a0: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20  n.      ** type 
68b0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
68c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
68d0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
68e0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
68f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6900: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
6910: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
6920: 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 20 74 65  e TK_EXISTS:  te
6930: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
6940: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
6950: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
6960: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TK_IN: {.      t
6970: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
6980: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
6990: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
69a0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
69b0: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
69c0: 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20         int nRef 
69d0: 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20  = pNC->nRef;.   
69e0: 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 43 68 65       notValidChe
69f0: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61  ckConstraint(pPa
6a00: 72 73 65 2c 20 70 4e 43 2c 20 22 73 75 62 71 75  rse, pNC, "subqu
6a10: 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20 20 20  eries");.       
6a20: 20 6e 6f 74 56 61 6c 69 64 50 61 72 74 49 64 78   notValidPartIdx
6a30: 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 4e  Where(pParse, pN
6a40: 43 2c 20 22 73 75 62 71 75 65 72 69 65 73 22 29  C, "subqueries")
6a50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6a60: 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
6a70: 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  ker, pExpr->x.pS
6a80: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
6a90: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65  assert( pNC->nRe
6aa0: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20  f>=nRef );.     
6ab0: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43     if( nRef!=pNC
6ac0: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20  ->nRef ){.      
6ad0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
6ae0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
6af0: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  rSelect);.      
6b00: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6b20: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
6b30: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 6e 6f 74  BLE: {.      not
6b40: 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72  ValidCheckConstr
6b50: 61 69 6e 74 28 70 50 61 72 73 65 2c 20 70 4e 43  aint(pParse, pNC
6b60: 2c 20 22 70 61 72 61 6d 65 74 65 72 73 22 29 3b  , "parameters");
6b70: 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 50  .      notValidP
6b80: 61 72 74 49 64 78 57 68 65 72 65 28 70 50 61 72  artIdxWhere(pPar
6b90: 73 65 2c 20 70 4e 43 2c 20 22 70 61 72 61 6d 65  se, pNC, "parame
6ba0: 74 65 72 73 22 29 3b 0a 20 20 20 20 20 20 62 72  ters");.      br
6bb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
6bc0: 20 72 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d   return (pParse-
6bd0: 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
6be0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6bf0: 64 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a  d) ? WRC_Abort :
6c00: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
6c10: 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69  ../*.** pEList i
6c20: 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
6c30: 65 73 73 69 6f 6e 73 20 77 68 69 63 68 20 61 72  essions which ar
6c40: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 72 65 73  e really the res
6c50: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a  ult set of the.*
6c60: 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
6c70: 6d 65 6e 74 2e 20 20 70 45 20 69 73 20 61 20 74  ment.  pE is a t
6c80: 65 72 6d 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  erm in an ORDER 
6c90: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
6ca0: 6c 61 75 73 65 2e 0a 2a 2a 20 54 68 69 73 20 72  lause..** This r
6cb0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 6f  outine checks to
6cc0: 20 73 65 65 20 69 66 20 70 45 20 69 73 20 61 20   see if pE is a 
6cd0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
6ce0: 72 20 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f  r which correspo
6cf0: 6e 64 73 0a 2a 2a 20 74 6f 20 74 68 65 20 41 53  nds.** to the AS
6d00: 2d 6e 61 6d 65 20 6f 66 20 6f 6e 65 20 6f 66 20  -name of one of 
6d10: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
6d20: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
6d30: 2e 20 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20  .  If it is,.** 
6d40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
6d50: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 62  urn an integer b
6d60: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 77  etween 1 and N w
6d70: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
6d80: 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  mber of.** eleme
6d90: 6e 74 73 20 69 6e 20 70 45 4c 69 73 74 2c 20 63  nts in pEList, c
6da0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6db0: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74  the matching ent
6dc0: 72 79 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ry.  If there is
6dd0: 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 6f 72  .** no match, or
6de0: 20 69 66 20 70 45 20 69 73 20 6e 6f 74 20 61 20   if pE is not a 
6df0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
6e00: 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
6e10: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 30  tine.** return 0
6e20: 2e 0a 2a 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 68  ..**.** pEList h
6e30: 61 73 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  as been resolved
6e40: 2e 20 20 70 45 20 68 61 73 20 6e 6f 74 2e 0a 2a  .  pE has not..*
6e50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
6e60: 6f 6c 76 65 41 73 4e 61 6d 65 28 0a 20 20 50 61  olveAsName(.  Pa
6e70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6e80: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
6e90: 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  ext for error me
6ea0: 73 73 61 67 65 73 20 2a 2f 0a 20 20 45 78 70 72  ssages */.  Expr
6eb0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f  List *pEList,  /
6ec0: 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73  * List of expres
6ed0: 73 69 6f 6e 73 20 74 6f 20 73 63 61 6e 20 2a 2f  sions to scan */
6ee0: 0a 20 20 45 78 70 72 20 2a 70 45 20 20 20 20 20  .  Expr *pE     
6ef0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
6f00: 69 6f 6e 20 77 65 20 61 72 65 20 74 72 79 69 6e  ion we are tryin
6f10: 67 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  g to match */.){
6f20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
6f30: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
6f40: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 55 4e 55 53  unter */..  UNUS
6f50: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
6f60: 72 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 45 2d  rse);..  if( pE-
6f70: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
6f80: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70    char *zCol = p
6f90: 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  E->u.zToken;.   
6fa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
6fb0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
6fc0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73  .      char *zAs
6fd0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
6fe0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
6ff0: 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74   zAs!=0 && sqlit
7000: 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a  e3StrICmp(zAs, z
7010: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
7020: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
7030: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7040: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7050: 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70 6f  /*.** pE is a po
7060: 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72  inter to an expr
7070: 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73 20  ession which is 
7080: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  a single term in
7090: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
70a0: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   of a compound S
70b0: 45 4c 45 43 54 2e 20 20 54 68 65 20 65 78 70 72  ELECT.  The expr
70c0: 65 73 73 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  ession has not b
70d0: 65 65 6e 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  een.** name reso
70e0: 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74  lved..**.** At t
70f0: 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f  he point this ro
7100: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
7110: 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   we already know
7120: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44   that the.** ORD
7130: 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f  ER BY term is no
7140: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64  t an integer ind
7150: 65 78 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75  ex into the resu
7160: 6c 74 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a  lt set.  That.**
7170: 20 63 61 73 65 20 69 73 20 68 61 6e 64 6c 65 64   case is handled
7180: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
7190: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41  routine..**.** A
71a0: 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68 20  ttempt to match 
71b0: 70 45 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c  pE against resul
71c0: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  t set columns in
71d0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
71e0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
71f0: 6e 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  nt.  Return the 
7200: 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d  index i of the m
7210: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a  atching column,.
7220: 2a 2a 20 61 73 20 61 6e 20 69 6e 64 69 63 61 74  ** as an indicat
7230: 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ion to the calle
7240: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
7250: 20 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d 74   sort by the i-t
7260: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65  h column..** The
7270: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
7280: 6e 20 69 73 20 31 2e 20 20 49 6e 20 6f 74 68 65  n is 1.  In othe
7290: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 76 61 6c  r words, the val
72a0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
72b0: 68 65 0a 2a 2a 20 73 61 6d 65 20 69 6e 74 65 67  he.** same integ
72c0: 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 77 6f  er value that wo
72d0: 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 20 74  uld be used in t
72e0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
72f0: 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
7300: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  the column..**.*
7310: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
7320: 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30   match, return 0
7330: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
7340: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
7350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7360: 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72  esolveOrderByTer
7370: 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50  mToExprList(.  P
7380: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7390: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
73a0: 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d  text for error m
73b0: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
73c0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
73d0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
73e0: 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65  atement with the
73f0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
7400: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20   */.  Expr *pE  
7410: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7420: 73 70 65 63 69 66 69 63 20 4f 52 44 45 52 20 42  specific ORDER B
7430: 59 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  Y term */.){.  i
7440: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7450: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7460: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
7470: 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65  *pEList;  /* The
7480: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
7490: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
74a0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20  NameContext nc; 
74b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
74c0: 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67  xt for resolving
74d0: 20 70 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   pE */.  sqlite3
74e0: 20 2a 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44   *db;       /* D
74f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
7500: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
7510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7520: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
7530: 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
7540: 20 20 75 38 20 73 61 76 65 64 53 75 70 70 45 72    u8 savedSuppEr
7550: 72 3b 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61  r;   /* Saved va
7560: 6c 75 65 20 6f 66 20 64 62 2d 3e 73 75 70 70 72  lue of db->suppr
7570: 65 73 73 45 72 72 20 2a 2f 0a 0a 20 20 61 73 73  essErr */..  ass
7580: 65 72 74 28 20 73 71 6c 69 74 65 33 45 78 70 72  ert( sqlite3Expr
7590: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
75a0: 29 3d 3d 30 20 29 3b 0a 20 20 70 45 4c 69 73 74  )==0 );.  pEList
75b0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
75c0: 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  st;..  /* Resolv
75d0: 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74  e all names in t
75e0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
75f0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f   expression.  */
7600: 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30  .  memset(&nc, 0
7610: 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20  , sizeof(nc));. 
7620: 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61   nc.pParse = pPa
7630: 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69  rse;.  nc.pSrcLi
7640: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
7650: 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20  rc;.  nc.pEList 
7660: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e  = pEList;.  nc.n
7670: 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f  cFlags = NC_Allo
7680: 77 41 67 67 3b 0a 20 20 6e 63 2e 6e 45 72 72 20  wAgg;.  nc.nErr 
7690: 3d 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  = 0;.  db = pPar
76a0: 73 65 2d 3e 64 62 3b 0a 20 20 73 61 76 65 64 53  se->db;.  savedS
76b0: 75 70 70 45 72 72 20 3d 20 64 62 2d 3e 73 75 70  uppErr = db->sup
76c0: 70 72 65 73 73 45 72 72 3b 0a 20 20 64 62 2d 3e  pressErr;.  db->
76d0: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 31 3b  suppressErr = 1;
76e0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52  .  rc = sqlite3R
76f0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
7700: 26 6e 63 2c 20 70 45 29 3b 0a 20 20 64 62 2d 3e  &nc, pE);.  db->
7710: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 73 61  suppressErr = sa
7720: 76 65 64 53 75 70 70 45 72 72 3b 0a 20 20 69 66  vedSuppErr;.  if
7730: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
7740: 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 6d 61  ..  /* Try to ma
7750: 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  tch the ORDER BY
7760: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
7770: 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  nst an expressio
7780: 6e 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  n.  ** in the re
7790: 73 75 6c 74 20 73 65 74 2e 20 20 52 65 74 75 72  sult set.  Retur
77a0: 6e 20 61 6e 20 31 2d 62 61 73 65 64 20 69 6e 64  n an 1-based ind
77b0: 65 78 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69  ex of the matchi
77c0: 6e 67 0a 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73  ng.  ** result-s
77d0: 65 74 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20  et entry..  */. 
77e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
77f0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7800: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7810: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69  ExprCompare(pELi
7820: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
7830: 70 45 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20  pE, -1)<2 ){.   
7840: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
7850: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
7860: 66 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75  f no match, retu
7870: 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72  rn 0. */.  retur
7880: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
7890: 6e 65 72 61 74 65 20 61 6e 20 4f 52 44 45 52 20  nerate an ORDER 
78a0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 74  BY or GROUP BY t
78b0: 65 72 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  erm out-of-range
78c0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
78d0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 4f 75  c void resolveOu
78e0: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 0a 20  tOfRangeError(. 
78f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7900: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
7910: 72 72 6f 72 20 63 6f 6e 74 65 78 74 20 69 6e 74  rror context int
7920: 6f 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65  o which to write
7930: 20 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20   the error */.  
7940: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
7950: 65 2c 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52  e,     /* "ORDER
7960: 22 20 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a  " or "GROUP" */.
7970: 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
7980: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7990: 69 6e 64 65 78 20 28 31 2d 62 61 73 65 64 29 20  index (1-based) 
79a0: 6f 66 20 74 68 65 20 74 65 72 6d 20 6f 75 74 20  of the term out 
79b0: 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  of range */.  in
79c0: 74 20 6d 78 20 20 20 20 20 20 20 20 20 20 20 20  t mx            
79d0: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
79e0: 70 65 72 6d 69 73 73 69 62 6c 65 20 76 61 6c 75  permissible valu
79f0: 65 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20 20 73  e of i */.){.  s
7a00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7a10: 50 61 72 73 65 2c 20 0a 20 20 20 20 22 25 72 20  Parse, .    "%r 
7a20: 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f  %s BY term out o
7a30: 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
7a40: 20 62 65 20 22 0a 20 20 20 20 22 62 65 74 77 65   be ".    "betwe
7a50: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2c  en 1 and %d", i,
7a60: 20 7a 54 79 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a   zType, mx);.}..
7a70: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
7a80: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7a90: 65 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  e in a compound 
7aa0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7ab0: 2e 20 20 20 4d 6f 64 69 66 79 0a 2a 2a 20 65 61  .   Modify.** ea
7ac0: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ch term of the O
7ad0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
7ae0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
7af0: 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 0a 2a  eger between 1.*
7b00: 2a 20 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20  * and N where N 
7b10: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
7b20: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
7b30: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e  compound SELECT.
7b40: 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
7b50: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 61  terms that are a
7b60: 6c 72 65 61 64 79 20 61 6e 20 69 6e 74 65 67 65  lready an intege
7b70: 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  r between 1 and 
7b80: 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66  N are.** unmodif
7b90: 69 65 64 2e 20 20 4f 52 44 45 52 20 42 59 20 74  ied.  ORDER BY t
7ba0: 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 69 6e  erms that are in
7bb0: 74 65 67 65 72 73 20 6f 75 74 73 69 64 65 20 74  tegers outside t
7bc0: 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 31  he range of.** 1
7bd0: 20 74 68 72 6f 75 67 68 20 4e 20 67 65 6e 65 72   through N gener
7be0: 61 74 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 4f  ate an error.  O
7bf0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
7c00: 61 74 20 61 72 65 20 65 78 70 72 65 73 73 69 6f  at are expressio
7c10: 6e 73 0a 2a 2a 20 61 72 65 20 6d 61 74 63 68 65  ns.** are matche
7c20: 64 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74  d against result
7c30: 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
7c40: 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c   of compound SEL
7c50: 45 43 54 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  ECT.** beginning
7c60: 20 77 69 74 68 20 74 68 65 20 6c 65 66 74 2d 6d   with the left-m
7c70: 6f 73 74 20 53 45 4c 45 43 54 20 61 6e 64 20 77  ost SELECT and w
7c80: 6f 72 6b 69 6e 67 20 74 6f 77 61 72 64 20 74 68  orking toward th
7c90: 65 20 72 69 67 68 74 2e 0a 2a 2a 20 41 74 20 74  e right..** At t
7ca0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 2c 20  he first match, 
7cb0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  the ORDER BY exp
7cc0: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 61 6e 73  ression is trans
7cd0: 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 20 74  formed into.** t
7ce0: 68 65 20 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d  he integer colum
7cf0: 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  n number..**.** 
7d00: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
7d10: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
7d20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7d30: 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f  resolveCompoundO
7d40: 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
7d50: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
7d60: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
7d70: 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72  xt.  Leave error
7d80: 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a   messages here *
7d90: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
7da0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ect       /* The
7db0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7dc0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
7dd0: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 29 7b 0a   ORDER BY */.){.
7de0: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c    int i;.  ExprL
7df0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20  ist *pOrderBy;. 
7e00: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
7e10: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
7e20: 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f  ;.  int moreToDo
7e30: 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42   = 1;..  pOrderB
7e40: 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72  y = pSelect->pOr
7e50: 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72  derBy;.  if( pOr
7e60: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
7e70: 6e 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  n 0;.  db = pPar
7e80: 73 65 2d 3e 64 62 3b 0a 23 69 66 20 53 51 4c 49  se->db;.#if SQLI
7e90: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
7ea0: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  if( pOrderBy->nE
7eb0: 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
7ec0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
7ed0: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
7ee0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7ef0: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72  e, "too many ter
7f00: 6d 73 20 69 6e 20 4f 52 44 45 52 20 42 59 20 63  ms in ORDER BY c
7f10: 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 72 65 74  lause");.    ret
7f20: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
7f30: 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  f.  for(i=0; i<p
7f40: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
7f50: 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  i++){.    pOrder
7f60: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
7f70: 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65 63 74  0;.  }.  pSelect
7f80: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 77  ->pNext = 0;.  w
7f90: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
7fa0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53 65  Prior ){.    pSe
7fb0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  lect->pPrior->pN
7fc0: 65 78 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ext = pSelect;. 
7fd0: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
7fe0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
7ff0: 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  }.  while( pSele
8000: 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29  ct && moreToDo )
8010: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
8020: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8030: 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20  m;.    moreToDo 
8040: 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  = 0;.    pEList 
8050: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
8060: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
8070: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
8080: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
8090: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f  OrderBy->a; i<pO
80a0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
80b0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
80c0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
80d0: 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  1;.      Expr *p
80e0: 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  E, *pDup;.      
80f0: 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20  if( pItem->done 
8100: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8110: 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78    pE = sqlite3Ex
8120: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 49  prSkipCollate(pI
8130: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
8140: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
8150: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
8160: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
8170: 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c    if( iCol<=0 ||
8180: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
8190: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
81a0: 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e   resolveOutOfRan
81b0: 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  geError(pParse, 
81c0: 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70 45  "ORDER", i+1, pE
81d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
81e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
81f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8200: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8210: 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41   iCol = resolveA
8220: 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 45  sName(pParse, pE
8230: 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20 20 20  List, pE);.     
8240: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29     if( iCol==0 )
8250: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 44 75 70  {.          pDup
8260: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8270: 70 28 64 62 2c 20 70 45 2c 20 30 29 3b 0a 20 20  p(db, pE, 0);.  
8280: 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
8290: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
82a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
82b0: 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ert(pDup);.     
82c0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65         iCol = re
82d0: 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d  solveOrderByTerm
82e0: 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  ToExprList(pPars
82f0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44 75 70  e, pSelect, pDup
8300: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8310: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8320: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8330: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Dup);.        }.
8340: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8350: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
8360: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
8370: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
8380: 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
8390: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
83a0: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  Col,.        ** 
83b0: 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 70  taking care to p
83c0: 72 65 73 65 72 76 65 20 74 68 65 20 43 4f 4c 4c  reserve the COLL
83d0: 41 54 45 20 63 6c 61 75 73 65 20 69 66 20 69 74  ATE clause if it
83e0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
83f0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
8400: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
8410: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
8420: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
8430: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
8440: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
8450: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
8460: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
8470: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 43 6f  ->u.iValue = iCo
8480: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  l;.        if( p
8490: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 45 20  Item->pExpr==pE 
84a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
84b0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77  em->pExpr = pNew
84c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
84d0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
84e0: 74 28 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d  t( pItem->pExpr-
84f0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
8500: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
8510: 65 72 74 28 20 70 49 74 65 6d 2d 3e 70 45 78 70  ert( pItem->pExp
8520: 72 2d 3e 70 4c 65 66 74 3d 3d 70 45 20 29 3b 0a  r->pLeft==pE );.
8530: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
8540: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20  >pExpr->pLeft = 
8550: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pNew;.        }.
8560: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8570: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
8580: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  );.        pItem
8590: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
85a0: 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20  l = (u16)iCol;. 
85b0: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f         pItem->do
85c0: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ne = 1;.      }e
85d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72  lse{.        mor
85e0: 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20  eToDo = 1;.     
85f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65   }.    }.    pSe
8600: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
8610: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72  pNext;.  }.  for
8620: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
8630: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
8640: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
8650: 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b  >a[i].done==0 ){
8660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
8670: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8680: 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  %r ORDER BY term
8690: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
86a0: 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20 20  any ".          
86b0: 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65    "column in the
86c0: 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69 2b   result set", i+
86d0: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
86e0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
86f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8700: 2a 2a 20 43 68 65 63 6b 20 65 76 65 72 79 20 74  ** Check every t
8710: 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 44 45 52  erm in the ORDER
8720: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
8730: 63 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79 20  clause pOrderBy 
8740: 6f 66 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54  of.** the SELECT
8750: 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65   statement pSele
8760: 63 74 2e 20 20 49 66 20 61 6e 79 20 74 65 72 6d  ct.  If any term
8770: 20 69 73 20 72 65 66 65 72 65 6e 63 65 20 74 6f   is reference to
8780: 20 61 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74   a.** result set
8790: 20 65 78 70 72 65 73 73 69 6f 6e 20 28 61 73 20   expression (as 
87a0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
87b0: 65 20 45 78 70 72 4c 69 73 74 2e 61 2e 75 2e 78  e ExprList.a.u.x
87c0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 0a 2a 2a 20  .iOrderByCol.** 
87d0: 66 69 65 6c 64 29 20 74 68 65 6e 20 63 6f 6e 76  field) then conv
87e0: 65 72 74 20 74 68 61 74 20 74 65 72 6d 20 69 6e  ert that term in
87f0: 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  to a copy of the
8800: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72   corresponding r
8810: 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 63 6f 6c  esult set.** col
8820: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  umn..**.** If an
8830: 79 20 65 72 72 6f 72 73 20 61 72 65 20 64 65 74  y errors are det
8840: 65 63 74 65 64 2c 20 61 64 64 20 61 6e 20 65 72  ected, add an er
8850: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70  ror message to p
8860: 50 61 72 73 65 20 61 6e 64 0a 2a 2a 20 72 65 74  Parse and.** ret
8870: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52  urn non-zero.  R
8880: 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 6e 6f  eturn zero if no
8890: 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
88a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
88b0: 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
88c0: 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pBy(.  Parse *pP
88d0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
88e0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  Parsing context.
88f0: 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65    Leave error me
8900: 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20  ssages here */. 
8910: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
8920: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45  ,      /* The SE
8930: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63  LECT statement c
8940: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c  ontaining the cl
8950: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
8960: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
8970: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
8980: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
8990: 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73  se to be process
89a0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
89b0: 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a  ar *zType     /*
89c0: 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f   "ORDER" or "GRO
89d0: 55 50 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  UP" */.){.  int 
89e0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
89f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8a00: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8a10: 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  t;.  struct Expr
8a20: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
8a30: 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
8a40: 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  y==0 || pParse->
8a50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8a60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66   ) return 0;.#if
8a70: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
8a80: 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  MN.  if( pOrderB
8a90: 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  y->nExpr>db->aLi
8aa0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8ab0: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
8ac0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8ad0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
8ae0: 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59  y terms in %s BY
8af0: 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29   clause", zType)
8b00: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
8b10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 45 4c    }.#endif.  pEL
8b20: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
8b30: 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  EList;.  assert(
8b40: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f   pEList!=0 );  /
8b50: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  * sqlite3SelectN
8b60: 65 77 28 29 20 67 75 61 72 61 6e 74 65 65 73 20  ew() guarantees 
8b70: 74 68 69 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  this */.  for(i=
8b80: 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
8b90: 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79  y->a; i<pOrderBy
8ba0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
8bb0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
8bc0: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
8bd0: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
8be0: 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
8bf0: 4f 72 64 65 72 42 79 43 6f 6c 3e 70 45 4c 69 73  OrderByCol>pELis
8c00: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
8c10: 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66      resolveOutOf
8c20: 52 61 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73  RangeError(pPars
8c30: 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 70  e, zType, i+1, p
8c40: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
8c50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
8c60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
8c70: 65 73 6f 6c 76 65 41 6c 69 61 73 28 70 50 61 72  esolveAlias(pPar
8c80: 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 49 74 65  se, pEList, pIte
8c90: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
8ca0: 6f 6c 2d 31 2c 20 70 49 74 65 6d 2d 3e 70 45 78  ol-1, pItem->pEx
8cb0: 70 72 2c 20 7a 54 79 70 65 2c 30 29 3b 0a 20 20  pr, zType,0);.  
8cc0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8cd0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f 72   0;.}../*.** pOr
8ce0: 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45  derBy is an ORDE
8cf0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
8d00: 20 63 6c 61 75 73 65 20 69 6e 20 53 45 4c 45 43   clause in SELEC
8d10: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c  T statement pSel
8d20: 65 63 74 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d 65  ect..** The Name
8d30: 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   context of the 
8d40: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8d50: 20 69 73 20 70 4e 43 2e 20 20 7a 54 79 70 65 20   is pNC.  zType 
8d60: 69 73 20 65 69 74 68 65 72 0a 2a 2a 20 22 4f 52  is either.** "OR
8d70: 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20  DER" or "GROUP" 
8d80: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69  depending on whi
8d90: 63 68 20 74 79 70 65 20 6f 66 20 63 6c 61 75 73  ch type of claus
8da0: 65 20 70 4f 72 64 65 72 42 79 20 69 73 2e 0a 2a  e pOrderBy is..*
8db0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8dc0: 65 20 72 65 73 6f 6c 76 65 73 20 65 61 63 68 20  e resolves each 
8dd0: 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6c 61 75  term of the clau
8de0: 73 65 20 69 6e 74 6f 20 61 6e 20 65 78 70 72 65  se into an expre
8df0: 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68 65  ssion..** If the
8e00: 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20 69   order-by term i
8e10: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 49 20 62  s an integer I b
8e20: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 28  etween 1 and N (
8e30: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a 2a  where N is the.*
8e40: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * number of colu
8e50: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
8e60: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
8e70: 45 43 54 29 20 74 68 65 6e 20 74 68 65 20 65 78  ECT) then the ex
8e80: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20 74  pression.** in t
8e90: 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73  he resolution is
8ea0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 49   a copy of the I
8eb0: 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20 65  -th result-set e
8ec0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 0a 2a  xpression.  If.*
8ed0: 2a 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 74  * the order-by t
8ee0: 65 72 6d 20 69 73 20 61 6e 20 69 64 65 6e 74 69  erm is an identi
8ef0: 66 69 65 72 20 74 68 61 74 20 63 6f 72 72 65 73  fier that corres
8f00: 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 41 53 2d  ponds to the AS-
8f10: 6e 61 6d 65 20 6f 66 0a 2a 2a 20 61 20 72 65 73  name of.** a res
8f20: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
8f30: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72  on, then the ter
8f40: 6d 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 61 20  m resolves to a 
8f50: 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20 72  copy of the.** r
8f60: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
8f70: 73 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65  sion.  Otherwise
8f80: 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  , the expression
8f90: 20 69 73 20 72 65 73 6f 6c 76 65 64 20 69 6e 0a   is resolved in.
8fa0: 2a 2a 20 74 68 65 20 75 73 75 61 6c 20 77 61 79  ** the usual way
8fb0: 20 2d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33   - using sqlite3
8fc0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
8fd0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ()..**.** This r
8fe0: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
8ff0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
9000: 6f 72 73 2e 20 20 49 66 20 65 72 72 6f 72 73 20  ors.  If errors 
9010: 6f 63 63 75 72 2c 20 74 68 65 6e 0a 2a 2a 20 61  occur, then.** a
9020: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
9030: 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 69 67 68  ror message migh
9040: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 70 50 61  t be left in pPa
9050: 72 73 65 2e 20 20 28 4f 4f 4d 20 65 72 72 6f 72  rse.  (OOM error
9060: 73 0a 2a 2a 20 65 78 63 65 70 74 65 64 2e 29 0a  s.** excepted.).
9070: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
9080: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
9090: 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  y(.  NameContext
90a0: 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 54 68   *pNC,     /* Th
90b0: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f  e name context o
90c0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
90d0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65  tement */.  Sele
90e0: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
90f0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
9100: 73 74 61 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e  statement holdin
9110: 67 20 70 4f 72 64 65 72 42 79 20 2a 2f 0a 20 20  g pOrderBy */.  
9120: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
9130: 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45  By,   /* An ORDE
9140: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
9150: 20 63 6c 61 75 73 65 20 74 6f 20 72 65 73 6f 6c   clause to resol
9160: 76 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ve */.  const ch
9170: 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a  ar *zType     /*
9180: 20 45 69 74 68 65 72 20 22 4f 52 44 45 52 22 20   Either "ORDER" 
9190: 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61  or "GROUP", as a
91a0: 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b  ppropriate */.){
91b0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20  .  int i, j;    
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
91e0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  rs */.  int iCol
91f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9200: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
9210: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72   number */.  str
9220: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
9230: 6d 20 2a 70 49 74 65 6d 3b 20 20 20 2f 2a 20 41  m *pItem;   /* A
9240: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
9250: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
9260: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
9270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9280: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9290: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ext */.  int nRe
92a0: 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20  sult;           
92b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
92c0: 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68  r of terms in th
92d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
92e0: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
92f0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
9300: 20 6e 52 65 73 75 6c 74 20 3d 20 70 53 65 6c 65   nResult = pSele
9310: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
9320: 72 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e  r;.  pParse = pN
9330: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 66 6f 72  C->pParse;.  for
9340: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
9350: 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65  erBy->a; i<pOrde
9360: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  rBy->nExpr; i++,
9370: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
9380: 78 70 72 20 2a 70 45 20 3d 20 70 49 74 65 6d 2d  xpr *pE = pItem-
9390: 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72  >pExpr;.    Expr
93a0: 20 2a 70 45 32 20 3d 20 73 71 6c 69 74 65 33 45   *pE2 = sqlite3E
93b0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
93c0: 45 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70  E);.    if( zTyp
93d0: 65 5b 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20  e[0]!='G' ){.   
93e0: 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76     iCol = resolv
93f0: 65 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  eAsName(pParse, 
9400: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c  pSelect->pEList,
9410: 20 70 45 32 29 3b 0a 20 20 20 20 20 20 69 66 28   pE2);.      if(
9420: 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20   iCol>0 ){.     
9430: 20 20 20 2f 2a 20 49 66 20 61 6e 20 41 53 2d 6e     /* If an AS-n
9440: 61 6d 65 20 6d 61 74 63 68 20 69 73 20 66 6f 75  ame match is fou
9450: 6e 64 2c 20 6d 61 72 6b 20 74 68 69 73 20 4f 52  nd, mark this OR
9460: 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 61 73  DER BY column as
9470: 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a   being.        *
9480: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
9490: 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73  iCol-th result-s
94a0: 65 74 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  et column.  The 
94b0: 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20  subsequent call 
94c0: 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71  to.        ** sq
94d0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
94e0: 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20  rGroupBy() will 
94f0: 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70 72  convert the expr
9500: 65 73 73 69 6f 6e 20 74 6f 20 61 0a 20 20 20 20  ession to a.    
9510: 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
9520: 68 65 20 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c  he iCol-th resul
9530: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
9540: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 74  . */.        pIt
9550: 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
9560: 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b  Col = (u16)iCol;
9570: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
9580: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
9590: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
95a0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
95b0: 32 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20  2, &iCol) ){.   
95c0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
95d0: 42 59 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e  BY term is an in
95e0: 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e 20  teger constant. 
95f0: 20 41 67 61 69 6e 2c 20 73 65 74 20 74 68 65 20   Again, set the 
9600: 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20  column.      ** 
9610: 6e 75 6d 62 65 72 20 73 6f 20 74 68 61 74 20 73  number so that s
9620: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
9630: 65 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c  erGroupBy() will
9640: 20 63 6f 6e 76 65 72 74 20 74 68 65 0a 20 20 20   convert the.   
9650: 20 20 20 2a 2a 20 6f 72 64 65 72 2d 62 79 20 74     ** order-by t
9660: 65 72 6d 20 74 6f 20 61 20 63 6f 70 79 20 6f 66  erm to a copy of
9670: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
9680: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
9690: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 31 20 7c      if( iCol<1 |
96a0: 7c 20 69 43 6f 6c 3e 30 78 66 66 66 66 20 29 7b  | iCol>0xffff ){
96b0: 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65  .        resolve
96c0: 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28  OutOfRangeError(
96d0: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69  pParse, zType, i
96e0: 2b 31 2c 20 6e 52 65 73 75 6c 74 29 3b 0a 20 20  +1, nResult);.  
96f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
9700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
9710: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
9720: 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c  yCol = (u16)iCol
9730: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
9740: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9750: 4f 74 68 65 72 77 69 73 65 2c 20 74 72 65 61 74  Otherwise, treat
9760: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
9770: 72 6d 20 61 73 20 61 6e 20 6f 72 64 69 6e 61 72  rm as an ordinar
9780: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  y expression */.
9790: 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
97a0: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a  OrderByCol = 0;.
97b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
97c0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
97d0: 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20  pNC, pE) ){.    
97e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
97f0: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  }.    for(j=0; j
9800: 3c 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  <pSelect->pEList
9810: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
9820: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9830: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20  ExprCompare(pE, 
9840: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
9850: 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31 29  >a[j].pExpr, -1)
9860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
9870: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
9880: 42 79 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20  ByCol = j+1;.   
9890: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
98a0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
98b0: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
98c0: 42 79 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  By(pParse, pSele
98d0: 63 74 2c 20 70 4f 72 64 65 72 42 79 2c 20 7a 54  ct, pOrderBy, zT
98e0: 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ype);.}../*.** R
98f0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
9900: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
9910: 6d 65 6e 74 20 70 20 61 6e 64 20 61 6c 6c 20 6f  ment p and all o
9920: 66 20 69 74 73 20 64 65 73 63 65 6e 64 65 6e 74  f its descendent
9930: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
9940: 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74   resolveSelectSt
9950: 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ep(Walker *pWalk
9960: 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
9970: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
9980: 4f 75 74 65 72 4e 43 3b 20 20 2f 2a 20 43 6f 6e  OuterNC;  /* Con
9990: 74 65 78 74 20 74 68 61 74 20 63 6f 6e 74 61 69  text that contai
99a0: 6e 73 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  ns this SELECT *
99b0: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
99c0: 73 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  sNC;        /* N
99d0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
99e0: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
99f0: 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 3b 20  int isCompound; 
9a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
9a10: 69 66 20 70 20 69 73 20 61 20 63 6f 6d 70 6f 75  if p is a compou
9a20: 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69  nd select */.  i
9a30: 6e 74 20 6e 43 6f 6d 70 6f 75 6e 64 3b 20 20 20  nt nCompound;   
9a40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9a50: 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 74 65 72   of compound ter
9a60: 6d 73 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20  ms processed so 
9a70: 66 61 72 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  far */.  Parse *
9a80: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
9a90: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9aa0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ext */.  ExprLis
9ab0: 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20 20  t *pEList;      
9ac0: 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20 65   /* Result set e
9ad0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 2a  xpression list *
9ae0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
9af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9b00: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
9b10: 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
9b20: 70 42 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  pBy;     /* The 
9b30: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
9b40: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 4c 65  */.  Select *pLe
9b50: 66 74 6d 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20  ftmost;      /* 
9b60: 4c 65 66 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  Left-most of SEL
9b70: 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ECT of a compoun
9b80: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
9b90: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  db;            /
9ba0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
9bb0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 0a 0a 20 20 61  ction */.  ..  a
9bc0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
9bd0: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
9be0: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
9bf0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
9c00: 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 4f  _Prune;.  }.  pO
9c10: 75 74 65 72 4e 43 20 3d 20 70 57 61 6c 6b 65 72  uterNC = pWalker
9c20: 2d 3e 75 2e 70 4e 43 3b 0a 20 20 70 50 61 72 73  ->u.pNC;.  pPars
9c30: 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
9c40: 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
9c50: 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4e 6f  se->db;..  /* No
9c60: 72 6d 61 6c 6c 79 20 73 71 6c 69 74 65 33 53 65  rmally sqlite3Se
9c70: 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 69 6c  lectExpand() wil
9c80: 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  l be called firs
9c90: 74 20 61 6e 64 20 77 69 6c 6c 20 68 61 76 65 0a  t and will have.
9ca0: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 70    ** already exp
9cb0: 61 6e 64 65 64 20 74 68 69 73 20 53 45 4c 45 43  anded this SELEC
9cc0: 54 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20  T.  However, if 
9cd0: 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
9ce0: 72 79 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 61  ry within.  ** a
9cf0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 73 71  n expression, sq
9d00: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
9d10: 4e 61 6d 65 73 28 29 20 77 69 6c 6c 20 62 65 20  Names() will be 
9d20: 63 61 6c 6c 65 64 20 77 69 74 68 6f 75 74 20 61  called without a
9d30: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 63 61 6c 6c  .  ** prior call
9d40: 20 74 6f 20 73 71 6c 69 74 65 33 53 65 6c 65 63   to sqlite3Selec
9d50: 74 45 78 70 61 6e 64 28 29 2e 20 20 57 68 65 6e  tExpand().  When
9d60: 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 6c   that happens, l
9d70: 65 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 53  et.  ** sqlite3S
9d80: 65 6c 65 63 74 50 72 65 70 28 29 20 64 6f 20 61  electPrep() do a
9d90: 6c 6c 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ll of the proces
9da0: 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
9db0: 4c 45 43 54 2e 0a 20 20 2a 2a 20 73 71 6c 69 74  LECT..  ** sqlit
9dc0: 65 33 53 65 6c 65 63 74 50 72 65 70 28 29 20 77  e3SelectPrep() w
9dd0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 62 6f 74 68 20  ill invoke both 
9de0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
9df0: 61 6e 64 28 29 20 61 6e 64 0a 20 20 2a 2a 20 74  and() and.  ** t
9e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 74  his routine in t
9e10: 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
9e20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
9e30: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  >selFlags & SF_E
9e40: 78 70 61 6e 64 65 64 29 3d 3d 30 20 29 7b 0a 20  xpanded)==0 ){. 
9e50: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
9e60: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
9e70: 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20 72  pOuterNC);.    r
9e80: 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e  eturn (pParse->n
9e90: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
9ea0: 63 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f 41  cFailed) ? WRC_A
9eb0: 62 6f 72 74 20 3a 20 57 52 43 5f 50 72 75 6e 65  bort : WRC_Prune
9ec0: 3b 0a 20 20 7d 0a 0a 20 20 69 73 43 6f 6d 70 6f  ;.  }..  isCompo
9ed0: 75 6e 64 20 3d 20 70 2d 3e 70 50 72 69 6f 72 21  und = p->pPrior!
9ee0: 3d 30 3b 0a 20 20 6e 43 6f 6d 70 6f 75 6e 64 20  =0;.  nCompound 
9ef0: 3d 20 30 3b 0a 20 20 70 4c 65 66 74 6d 6f 73 74  = 0;.  pLeftmost
9f00: 20 3d 20 70 3b 0a 20 20 77 68 69 6c 65 28 20 70   = p;.  while( p
9f10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
9f20: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
9f30: 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
9f40: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
9f50: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
9f60: 52 65 73 6f 6c 76 65 64 29 3d 3d 30 20 29 3b 0a  Resolved)==0 );.
9f70: 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
9f80: 7c 3d 20 53 46 5f 52 65 73 6f 6c 76 65 64 3b 0a  |= SF_Resolved;.
9f90: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
9fa0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
9fb0: 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  in the LIMIT and
9fc0: 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
9fd0: 20 54 68 65 73 65 0a 20 20 20 20 2a 2a 20 61 72   These.    ** ar
9fe0: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  e not allowed to
9ff0: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61   refer to any na
a000: 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20  mes, so pass an 
a010: 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78  empty NameContex
a020: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
a030: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
a040: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
a050: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
a060: 72 73 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  rse;.    if( sql
a070: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
a080: 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c  ames(&sNC, p->pL
a090: 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 20  imit) ||.       
a0a0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
a0b0: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
a0c0: 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20  ->pOffset) ){.  
a0d0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
a0e0: 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  bort;.    }.  . 
a0f0: 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c     /* Recursivel
a100: 79 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  y resolve names 
a110: 69 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69 65  in all subquerie
a120: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  s.    */.    for
a130: 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
a140: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
a150: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
a160: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
a170: 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
a180: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
a190: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
a1a0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
a1b0: 2a 70 4e 43 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pNC;         /*
a1c0: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
a1d0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 2a   name contexts *
a1e0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52  /.        int nR
a1f0: 65 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ef = 0;         
a200: 20 20 20 20 2f 2a 20 52 65 66 63 6f 75 6e 74 20      /* Refcount 
a210: 66 6f 72 20 70 4f 75 74 65 72 4e 43 20 61 6e 64  for pOuterNC and
a220: 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 20   outer contexts 
a230: 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  */.        const
a240: 20 63 68 61 72 20 2a 7a 53 61 76 65 64 43 6f 6e   char *zSavedCon
a250: 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a  text = pParse->z
a260: 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20  AuthContext;..  
a270: 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74        /* Count t
a280: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
a290: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
a2a0: 20 70 4f 75 74 65 72 4e 43 20 61 6e 64 20 61 6c   pOuterNC and al
a2b0: 6c 20 6f 66 20 69 74 73 0a 20 20 20 20 20 20 20  l of its.       
a2c0: 20 2a 2a 20 70 61 72 65 6e 74 20 63 6f 6e 74 65   ** parent conte
a2d0: 78 74 73 2e 20 41 66 74 65 72 20 72 65 73 6f 6c  xts. After resol
a2e0: 76 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ving references 
a2f0: 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  to expressions i
a300: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 49 74  n.        ** pIt
a310: 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 63 68 65  em->pSelect, che
a320: 63 6b 20 69 66 20 74 68 69 73 20 76 61 6c 75 65  ck if this value
a330: 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 49 66   has changed. If
a340: 20 73 6f 2c 20 74 68 65 6e 0a 20 20 20 20 20 20   so, then.      
a350: 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74    ** SELECT stat
a360: 65 6d 65 6e 74 20 70 49 74 65 6d 2d 3e 70 53 65  ement pItem->pSe
a370: 6c 65 63 74 20 6d 75 73 74 20 62 65 20 63 6f 72  lect must be cor
a380: 72 65 6c 61 74 65 64 2e 20 53 65 74 20 74 68 65  related. Set the
a390: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 49 74 65  .        ** pIte
a3a0: 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  m->isCorrelated 
a3b0: 66 6c 61 67 20 69 66 20 74 68 69 73 20 69 73 20  flag if this is 
a3c0: 74 68 65 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  the case. */.   
a3d0: 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75       for(pNC=pOu
a3e0: 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d  terNC; pNC; pNC=
a3f0: 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66  pNC->pNext) nRef
a400: 20 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 0a   += pNC->nRef;..
a410: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
a420: 6d 2d 3e 7a 4e 61 6d 65 20 29 20 70 50 61 72 73  m->zName ) pPars
a430: 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
a440: 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
a450: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a460: 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
a470: 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
a480: 3e 70 53 65 6c 65 63 74 2c 20 70 4f 75 74 65 72  >pSelect, pOuter
a490: 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  NC);.        pPa
a4a0: 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
a4b0: 74 20 3d 20 7a 53 61 76 65 64 43 6f 6e 74 65 78  t = zSavedContex
a4c0: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
a4d0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
a4e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a4f0: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
a500: 72 74 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72  rt;..        for
a510: 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70  (pNC=pOuterNC; p
a520: 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65  NC; pNC=pNC->pNe
a530: 78 74 29 20 6e 52 65 66 20 2d 3d 20 70 4e 43 2d  xt) nRef -= pNC-
a540: 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 61  >nRef;.        a
a550: 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69 73  ssert( pItem->is
a560: 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 26 26  Correlated==0 &&
a570: 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20 20 20   nRef<=0 );.    
a580: 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72      pItem->isCor
a590: 72 65 6c 61 74 65 64 20 3d 20 28 6e 52 65 66 21  related = (nRef!
a5a0: 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =0);.      }.   
a5b0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74   }.  .    /* Set
a5c0: 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61   up the local na
a5d0: 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61  me-context to pa
a5e0: 73 73 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ss to sqlite3Res
a5f0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20  olveExprNames() 
a600: 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76  to.    ** resolv
a610: 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  e the result-set
a620: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
a630: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43  ..    */.    sNC
a640: 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c  .ncFlags = NC_Al
a650: 6c 6f 77 41 67 67 3b 0a 20 20 20 20 73 4e 43 2e  lowAgg;.    sNC.
a660: 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53  pSrcList = p->pS
a670: 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78  rc;.    sNC.pNex
a680: 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20  t = pOuterNC;.  
a690: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
a6a0: 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73  names in the res
a6b0: 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20 20  ult set. */.    
a6c0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
a6d0: 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
a6e0: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
a6f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
a700: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
a710: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20  .      Expr *pX 
a720: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  = pEList->a[i].p
a730: 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20  Expr;.      if( 
a740: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
a750: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 58  prNames(&sNC, pX
a760: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
a770: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
a780: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
a790: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
a7a0: 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65  are no aggregate
a7b0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68   functions in th
a7c0: 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e  e result-set, an
a7d0: 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20  d no GROUP BY . 
a7e0: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
a7f0: 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  , do not allow a
a800: 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79  ggregates in any
a810: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65 78   of the other ex
a820: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a  pressions..    *
a830: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  /.    assert( (p
a840: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
a850: 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29 3b  Aggregate)==0 );
a860: 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20  .    pGroupBy = 
a870: 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20  p->pGroupBy;.   
a880: 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c   if( pGroupBy ||
a890: 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 20   (sNC.ncFlags & 
a8a0: 4e 43 5f 48 61 73 41 67 67 29 21 3d 30 20 29 7b  NC_HasAgg)!=0 ){
a8b0: 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  .      p->selFla
a8c0: 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61  gs |= SF_Aggrega
a8d0: 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  te;.    }else{. 
a8e0: 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
a8f0: 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67   &= ~NC_AllowAgg
a900: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
a910: 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
a920: 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
a930: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
a940: 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
a950: 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
a960: 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
a970: 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b   && !pGroupBy ){
a980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
a990: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a9a0: 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
a9b0: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
a9c0: 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
a9d0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
a9e0: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a  Abort;.    }.  .
a9f0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
aa00: 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20 6c 69 73  utput column lis
aa10: 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f  t to the name-co
aa20: 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61 72  ntext before par
aa30: 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  sing the.    ** 
aa40: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
aa50: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
aa60: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
aa70: 69 73 20 73 6f 20 74 68 61 74 0a 20 20 20 20 2a  is so that.    *
aa80: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
aa90: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
aaa0: 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66  e (etc.) can ref
aab0: 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  er to expression
aac0: 73 20 62 79 0a 20 20 20 20 2a 2a 20 61 6c 69 61  s by.    ** alia
aad0: 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ses in the resul
aae0: 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  t set..    **.  
aaf0: 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74    ** Minor point
ab00: 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  : If this is the
ab10: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
ab20: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20  expression will 
ab30: 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d 65 76 61  be.    ** re-eva
ab40: 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  luated for each 
ab50: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
ab60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e  .    */.    sNC.
ab70: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
ab80: 73 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  st;.    if( sqli
ab90: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
aba0: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
abb0: 76 69 6e 67 29 20 29 20 72 65 74 75 72 6e 20 57  ving) ) return W
abc0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
abd0: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
abe0: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
abf0: 70 2d 3e 70 57 68 65 72 65 29 20 29 20 72 65 74  p->pWhere) ) ret
ac00: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a  urn WRC_Abort;..
ac10: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
ac20: 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
ac30: 20 63 6c 61 75 73 65 73 20 6d 61 79 20 6e 6f 74   clauses may not
ac40: 20 72 65 66 65 72 20 74 6f 20 74 65 72 6d 73 20   refer to terms 
ac50: 69 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  in.    ** outer 
ac60: 71 75 65 72 69 65 73 20 0a 20 20 20 20 2a 2f 0a  queries .    */.
ac70: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
ac80: 30 3b 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  0;.    sNC.ncFla
ac90: 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67  gs |= NC_AllowAg
aca0: 67 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65  g;..    /* Proce
acb0: 73 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ss the ORDER BY 
acc0: 63 6c 61 75 73 65 20 66 6f 72 20 73 69 6e 67 6c  clause for singl
acd0: 65 74 6f 6e 20 53 45 4c 45 43 54 20 73 74 61 74  eton SELECT stat
ace0: 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 54  ements..    ** T
acf0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
ad00: 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64 73  se for compounds
ad10: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ad20: 74 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 20 20  ts is handled.  
ad30: 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61 66 74 65    ** below, afte
ad40: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 73  r all of the res
ad50: 75 6c 74 2d 73 65 74 73 20 66 6f 72 20 61 6c 6c  ult-sets for all
ad60: 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   of the elements
ad70: 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
ad80: 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65 65  ompound have bee
ad90: 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20  n resolved..    
ada0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 43 6f  */.    if( !isCo
adb0: 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f 6c 76  mpound && resolv
adc0: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  eOrderGroupBy(&s
add0: 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  NC, p, p->pOrder
ade0: 42 79 2c 20 22 4f 52 44 45 52 22 29 20 29 7b 0a  By, "ORDER") ){.
adf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ae00: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
ae10: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
ae20: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
ae30: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
ae40: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
ae50: 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 47 52  * Resolve the GR
ae60: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20  OUP BY clause.  
ae70: 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  At the same time
ae80: 2c 20 6d 61 6b 65 20 73 75 72 65 20 0a 20 20 20  , make sure .   
ae90: 20 2a 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59   ** the GROUP BY
aea0: 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74   clause does not
aeb0: 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61   contain aggrega
aec0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  te functions..  
aed0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72    */.    if( pGr
aee0: 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 73  oupBy ){.      s
aef0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
af00: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
af10: 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 6f 6c  .      if( resol
af20: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  veOrderGroupBy(&
af30: 73 4e 43 2c 20 70 2c 20 70 47 72 6f 75 70 42 79  sNC, p, pGroupBy
af40: 2c 20 22 47 52 4f 55 50 22 29 20 7c 7c 20 64 62  , "GROUP") || db
af50: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
af60: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
af70: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
af80: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
af90: 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42  0, pItem=pGroupB
afa0: 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79  y->a; i<pGroupBy
afb0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
afc0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
afd0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
afe0: 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  rty(pItem->pExpr
aff0: 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20  , EP_Agg) ){.   
b000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
b010: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b020: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
b030: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f  ons are not allo
b040: 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20  wed in ".       
b050: 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55         "the GROU
b060: 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  P BY clause");. 
b070: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b080: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
b090: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
b0a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e   }..    /* Advan
b0b0: 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74  ce to the next t
b0c0: 65 72 6d 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f  erm of the compo
b0d0: 75 6e 64 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  und.    */.    p
b0e0: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20   = p->pPrior;.  
b0f0: 20 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a 20    nCompound++;. 
b100: 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65   }..  /* Resolve
b110: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 6e   the ORDER BY on
b120: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
b130: 43 54 20 61 66 74 65 72 20 61 6c 6c 20 74 65 72  CT after all ter
b140: 6d 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63  ms of.  ** the c
b150: 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65 65  ompound have bee
b160: 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f  n resolved..  */
b170: 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e  .  if( isCompoun
b180: 64 20 26 26 20 72 65 73 6f 6c 76 65 43 6f 6d 70  d && resolveComp
b190: 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72  oundOrderBy(pPar
b1a0: 73 65 2c 20 70 4c 65 66 74 6d 6f 73 74 29 20 29  se, pLeftmost) )
b1b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
b1c0: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72  _Abort;.  }..  r
b1d0: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
b1e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
b1f0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20  outine walks an 
b200: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
b210: 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66  and resolves ref
b220: 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61  erences to.** ta
b230: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20  ble columns and 
b240: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
b250: 6e 73 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65  ns.  At the same
b260: 20 74 69 6d 65 2c 20 64 6f 20 65 72 72 6f 72 0a   time, do error.
b270: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 66  ** checking on f
b280: 75 6e 63 74 69 6f 6e 20 75 73 61 67 65 20 61 6e  unction usage an
b290: 64 20 73 65 74 20 61 20 66 6c 61 67 20 69 66 20  d set a flag if 
b2a0: 61 6e 79 20 61 67 67 72 65 67 61 74 65 20 66 75  any aggregate fu
b2b0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 73  nctions.** are s
b2c0: 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65  een..**.** To re
b2d0: 73 6f 6c 76 65 20 74 61 62 6c 65 20 63 6f 6c 75  solve table colu
b2e0: 6d 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20 77  mns references w
b2f0: 65 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f 64 65 73  e look for nodes
b300: 20 28 6f 72 20 73 75 62 74 72 65 65 73 29 20 6f   (or subtrees) o
b310: 66 20 74 68 65 20 0a 2a 2a 20 66 6f 72 6d 20 58  f the .** form X
b320: 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a  .Y.Z or Y.Z or j
b330: 75 73 74 20 5a 20 77 68 65 72 65 0a 2a 2a 0a 2a  ust Z where.**.*
b340: 2a 20 20 20 20 20 20 58 3a 20 20 20 54 68 65 20  *      X:   The 
b350: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
b360: 73 65 2e 20 20 45 78 3a 20 20 22 6d 61 69 6e 22  se.  Ex:  "main"
b370: 20 6f 72 20 22 74 65 6d 70 22 20 6f 72 0a 2a 2a   or "temp" or.**
b380: 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20 73             the s
b390: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 61 73 73  ymbolic name ass
b3a0: 69 67 6e 65 64 20 74 6f 20 61 6e 20 41 54 54 41  igned to an ATTA
b3b0: 43 48 2d 65 64 20 64 61 74 61 62 61 73 65 2e 0a  CH-ed database..
b3c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 3a 20 20 20  **.**      Y:   
b3d0: 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61  The name of a ta
b3e0: 62 6c 65 20 69 6e 20 61 20 46 52 4f 4d 20 63 6c  ble in a FROM cl
b3f0: 61 75 73 65 2e 20 20 4f 72 20 69 6e 20 61 20 74  ause.  Or in a t
b400: 72 69 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  rigger.**       
b410: 20 20 20 20 6f 6e 65 20 6f 66 20 74 68 65 20 73      one of the s
b420: 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22 6f 6c  pecial names "ol
b430: 64 22 20 6f 72 20 22 6e 65 77 22 2e 0a 2a 2a 0a  d" or "new"..**.
b440: 2a 2a 20 20 20 20 20 20 5a 3a 20 20 20 54 68 65  **      Z:   The
b450: 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d   name of a colum
b460: 6e 20 69 6e 20 74 61 62 6c 65 20 59 2e 0a 2a 2a  n in table Y..**
b470: 0a 2a 2a 20 54 68 65 20 6e 6f 64 65 20 61 74 20  .** The node at 
b480: 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
b490: 73 75 62 74 72 65 65 20 69 73 20 6d 6f 64 69 66  subtree is modif
b4a0: 69 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ied as follows:.
b4b0: 2a 2a 0a 2a 2a 20 20 20 20 45 78 70 72 2e 6f 70  **.**    Expr.op
b4c0: 20 20 20 20 20 20 20 20 43 68 61 6e 67 65 64 20          Changed 
b4d0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20  to TK_COLUMN.** 
b4e0: 20 20 20 45 78 70 72 2e 70 54 61 62 20 20 20 20     Expr.pTab    
b4f0: 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20    Points to the 
b500: 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72  Table object for
b510: 20 58 2e 59 0a 2a 2a 20 20 20 20 45 78 70 72 2e   X.Y.**    Expr.
b520: 69 43 6f 6c 75 6d 6e 20 20 20 54 68 65 20 63 6f  iColumn   The co
b530: 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20 58 2e  lumn index in X.
b540: 59 2e 20 20 2d 31 20 66 6f 72 20 74 68 65 20 72  Y.  -1 for the r
b550: 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 45 78 70 72  owid..**    Expr
b560: 2e 69 54 61 62 6c 65 20 20 20 20 54 68 65 20 56  .iTable    The V
b570: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
b580: 72 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a 2a 2a 0a  r for X.Y.**.**.
b590: 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 72 65  ** To resolve re
b5a0: 73 75 6c 74 2d 73 65 74 20 72 65 66 65 72 65 6e  sult-set referen
b5b0: 63 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72 20 65 78  ces, look for ex
b5c0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73 20 6f  pression nodes o
b5d0: 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 5a 20  f the.** form Z 
b5e0: 28 77 69 74 68 20 6e 6f 20 58 20 61 6e 64 20 59  (with no X and Y
b5f0: 20 70 72 65 66 69 78 29 20 77 68 65 72 65 20 74   prefix) where t
b600: 68 65 20 5a 20 6d 61 74 63 68 65 73 20 74 68 65  he Z matches the
b610: 20 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 73   right-hand.** s
b620: 69 7a 65 20 6f 66 20 61 6e 20 41 53 20 63 6c 61  ize of an AS cla
b630: 75 73 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c  use in the resul
b640: 74 2d 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43  t-set of a SELEC
b650: 54 2e 20 20 54 68 65 20 5a 20 65 78 70 72 65 73  T.  The Z expres
b660: 73 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 70 6c 61  sion.** is repla
b670: 63 65 64 20 62 79 20 61 20 63 6f 70 79 20 6f 66  ced by a copy of
b680: 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   the left-hand s
b690: 69 64 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ide of the resul
b6a0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
b6b0: 2e 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61 6d 65 20  ..** Table-name 
b6c0: 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 73  and function res
b6d0: 6f 6c 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 6f  olution occurs o
b6e0: 6e 20 74 68 65 20 73 75 62 73 74 69 74 75 74 65  n the substitute
b6f0: 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  d expression.** 
b700: 74 72 65 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  tree.  For examp
b710: 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  le, in:.**.**   
b720: 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53     SELECT a+b AS
b730: 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46 52 4f   x, c+d AS y FRO
b740: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 3b  M t1 ORDER BY x;
b750: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 78 22 20 74  .**.** The "x" t
b760: 65 72 6d 20 6f 66 20 74 68 65 20 6f 72 64 65 72  erm of the order
b770: 20 62 79 20 69 73 20 72 65 70 6c 61 63 65 64 20   by is replaced 
b780: 62 79 20 22 61 2b 62 22 20 74 6f 20 72 65 6e 64  by "a+b" to rend
b790: 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53  er:.**.**      S
b7a0: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20  ELECT a+b AS x, 
b7b0: 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c+d AS y FROM t1
b7c0: 20 4f 52 44 45 52 20 42 59 20 61 2b 62 3b 0a 2a   ORDER BY a+b;.*
b7d0: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61  *.** Function ca
b7e0: 6c 6c 73 20 61 72 65 20 63 68 65 63 6b 65 64 20  lls are checked 
b7f0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
b800: 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  t the function i
b810: 73 20 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 6e  s .** defined an
b820: 64 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  d that the corre
b830: 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ct number of arg
b840: 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63 69  uments are speci
b850: 66 69 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20  fied..** If the 
b860: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 61  function is an a
b870: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
b880: 6e 2c 20 74 68 65 6e 20 74 68 65 20 4e 43 5f 48  n, then the NC_H
b890: 61 73 41 67 67 20 66 6c 61 67 20 69 73 0a 2a 2a  asAgg flag is.**
b8a0: 20 73 65 74 20 61 6e 64 20 74 68 65 20 6f 70 63   set and the opc
b8b0: 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 66  ode is changed f
b8c0: 72 6f 6d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  rom TK_FUNCTION 
b8d0: 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  to TK_AGG_FUNCTI
b8e0: 4f 4e 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 78 70  ON..** If an exp
b8f0: 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ression contains
b900: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
b910: 69 6f 6e 73 20 74 68 65 6e 20 74 68 65 20 45 50  ions then the EP
b920: 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79  _Agg.** property
b930: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
b940: 6f 6e 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  on is set..**.**
b950: 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   An error messag
b960: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 50 61  e is left in pPa
b970: 72 73 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  rse if anything 
b980: 69 73 20 61 6d 69 73 73 2e 20 20 54 68 65 20 6e  is amiss.  The n
b990: 75 6d 62 65 72 0a 2a 2a 20 69 66 20 65 72 72 6f  umber.** if erro
b9a0: 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  rs is returned..
b9b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65  */.int sqlite3Re
b9c0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 20  solveExprNames( 
b9d0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
b9e0: 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61  pNC,       /* Na
b9f0: 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c  mespace to resol
ba00: 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ve expressions i
ba10: 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  n. */.  Expr *pE
ba20: 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20  xpr             
ba30: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
ba40: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
ba50: 2e 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 73 61 76  . */.){.  u8 sav
ba60: 65 64 48 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b  edHasAgg;.  Walk
ba70: 65 72 20 77 3b 0a 0a 20 20 69 66 28 20 70 45 78  er w;..  if( pEx
ba80: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
ba90: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
baa0: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
bab0: 7b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 61  {.    Parse *pPa
bac0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
bad0: 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e;.    if( sqlit
bae0: 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68  e3ExprCheckHeigh
baf0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
bb00: 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70 50  >nHeight+pNC->pP
bb10: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 20 29  arse->nHeight) )
bb20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
bb30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72  ;.    }.    pPar
bb40: 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70  se->nHeight += p
bb50: 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20  Expr->nHeight;. 
bb60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61 76 65   }.#endif.  save
bb70: 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 6e  dHasAgg = pNC->n
bb80: 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41  cFlags & NC_HasA
bb90: 67 67 3b 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c 61  gg;.  pNC->ncFla
bba0: 67 73 20 26 3d 20 7e 4e 43 5f 48 61 73 41 67 67  gs &= ~NC_HasAgg
bbb0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
bbc0: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
bbd0: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
bbe0: 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65  = resolveExprSte
bbf0: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
bc00: 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65  llback = resolve
bc10: 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77 2e  SelectStep;.  w.
bc20: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
bc30: 61 72 73 65 3b 0a 20 20 77 2e 75 2e 70 4e 43 20  arse;.  w.u.pNC 
bc40: 3d 20 70 4e 43 3b 0a 20 20 73 71 6c 69 74 65 33  = pNC;.  sqlite3
bc50: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
bc60: 70 72 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pr);.#if SQLITE_
bc70: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
bc80: 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  .  pNC->pParse->
bc90: 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72  nHeight -= pExpr
bca0: 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69  ->nHeight;.#endi
bcb0: 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72  f.  if( pNC->nEr
bcc0: 72 3e 30 20 7c 7c 20 77 2e 70 50 61 72 73 65 2d  r>0 || w.pParse-
bcd0: 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45  >nErr>0 ){.    E
bce0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
bcf0: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
bd00: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e  .  }.  if( pNC->
bd10: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73  ncFlags & NC_Has
bd20: 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53  Agg ){.    ExprS
bd30: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
bd40: 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65 6c  , EP_Agg);.  }el
bd50: 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73 41  se if( savedHasA
bd60: 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e 6e  gg ){.    pNC->n
bd70: 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 48 61 73  cFlags |= NC_Has
bd80: 41 67 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Agg;.  }.  retur
bd90: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
bda0: 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f  y(pExpr, EP_Erro
bdb0: 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  r);.}.../*.** Re
bdc0: 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20  solve all names 
bdd0: 69 6e 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f  in all expressio
bde0: 6e 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20 61  ns of a SELECT a
bdf0: 6e 64 20 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65 63  nd in all.** dec
be00: 65 6e 64 65 6e 74 73 20 6f 66 20 74 68 65 20 53  endents of the S
be10: 45 4c 45 43 54 2c 20 69 6e 63 6c 75 64 69 6e 67  ELECT, including
be20: 20 63 6f 6d 70 6f 75 6e 64 73 20 6f 66 66 20 6f   compounds off o
be30: 66 20 70 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a 20  f p->pPrior,.** 
be40: 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 65 78  subqueries in ex
be50: 70 72 65 73 73 69 6f 6e 73 2c 20 61 6e 64 20 73  pressions, and s
be60: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
be70: 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  s FROM clause.**
be80: 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53 65   terms..**.** Se
be90: 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  e sqlite3Resolve
bea0: 45 78 70 72 4e 61 6d 65 73 28 29 20 66 6f 72 20  ExprNames() for 
beb0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
bec0: 20 74 68 65 20 6b 69 6e 64 73 20 6f 66 0a 2a 2a   the kinds of.**
bed0: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73   transformations
bee0: 20 74 68 61 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a   that occur..**.
bef0: 2a 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 73 74  ** All SELECT st
bf00: 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  atements should 
bf10: 68 61 76 65 20 62 65 65 6e 20 65 78 70 61 6e 64  have been expand
bf20: 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
bf30: 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
bf40: 29 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  ) prior to invok
bf50: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
bf60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bf70: 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
bf80: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
bf90: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
bfa0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
bfb0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
bfc0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
bfd0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
bfe0: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
bff0: 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
c000: 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
c010: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
c020: 20 66 6f 72 20 70 61 72 65 6e 74 20 53 45 4c 45   for parent SELE
c030: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
c040: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a  ){.  Walker w;..
c050: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
c060: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
c070: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
c080: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
c090: 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65  = resolveExprSte
c0a0: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
c0b0: 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65  llback = resolve
c0c0: 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77 2e  SelectStep;.  w.
c0d0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
c0e0: 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4f 75  .  w.u.pNC = pOu
c0f0: 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69 74 65 33  terNC;.  sqlite3
c100: 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70  WalkSelect(&w, p
c110: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f  );.}../*.** Reso
c120: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 65 78 70  lve names in exp
c130: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 63 61  ressions that ca
c140: 6e 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65  n only reference
c150: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 3a   a single table:
c160: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 43 48  .**.**    *   CH
c170: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ECK constraints.
c180: 2a 2a 20 20 20 20 2a 20 20 20 57 48 45 52 45 20  **    *   WHERE 
c190: 63 6c 61 75 73 65 73 20 6f 6e 20 70 61 72 74 69  clauses on parti
c1a0: 61 6c 20 69 6e 64 69 63 65 73 0a 2a 2a 0a 2a 2a  al indices.**.**
c1b0: 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65   The Expr.iTable
c1c0: 20 76 61 6c 75 65 20 66 6f 72 20 45 78 70 72 2e   value for Expr.
c1d0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f  op==TK_COLUMN no
c1e0: 64 65 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  des of the expre
c1f0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 73 65 74 20  ssion.** is set 
c200: 74 6f 20 2d 31 20 61 6e 64 20 74 68 65 20 45 78  to -1 and the Ex
c210: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  pr.iColumn value
c220: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
c230: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a  olumn number..**
c240: 0a 2a 2a 20 41 6e 79 20 65 72 72 6f 72 73 20 63  .** Any errors c
c250: 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ause an error me
c260: 73 73 61 67 65 20 74 6f 20 62 65 20 73 65 74 20  ssage to be set 
c270: 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f  in pParse..*/.vo
c280: 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  id sqlite3Resolv
c290: 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 0a  eSelfReference(.
c2a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
c2b0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
c2c0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61   context */.  Ta
c2d0: 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20  ble *pTab,      
c2e0: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
c2f0: 65 69 6e 67 20 72 65 66 65 72 65 6e 63 65 64 20  eing referenced 
c300: 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20 20  */.  int type,  
c310: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 43 5f 49           /* NC_I
c320: 73 43 68 65 63 6b 20 6f 72 20 4e 43 5f 50 61 72  sCheck or NC_Par
c330: 74 49 64 78 20 2a 2f 0a 20 20 45 78 70 72 20 2a  tIdx */.  Expr *
c340: 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a  pExpr,        /*
c350: 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 72   Expression to r
c360: 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20  esolve.  May be 
c370: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 45 78 70 72 4c  NULL. */.  ExprL
c380: 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20 2f  ist *pList     /
c390: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * Expression lis
c3a0: 74 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20 20 4d  t to resolve.  M
c3b0: 61 79 20 62 65 20 4e 55 4c 2e 20 2a 2f 0a 29 7b  ay be NUL. */.){
c3c0: 0a 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b  .  SrcList sSrc;
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3e0: 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69     /* Fake SrcLi
c3f0: 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  st for pParse->p
c400: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 4e 61  NewTable */.  Na
c410: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c430: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
c440: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
c450: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ble */.  int i; 
c460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c470: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c480: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 61   counter */..  a
c490: 73 73 65 72 74 28 20 74 79 70 65 3d 3d 4e 43 5f  ssert( type==NC_
c4a0: 49 73 43 68 65 63 6b 20 7c 7c 20 74 79 70 65 3d  IsCheck || type=
c4b0: 3d 4e 43 5f 50 61 72 74 49 64 78 20 29 3b 0a 20  =NC_PartIdx );. 
c4c0: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
c4d0: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
c4e0: 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30   memset(&sSrc, 0
c4f0: 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b  , sizeof(sSrc));
c500: 0a 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31  .  sSrc.nSrc = 1
c510: 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e  ;.  sSrc.a[0].zN
c520: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
c530: 65 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70  e;.  sSrc.a[0].p
c540: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 73 53  Tab = pTab;.  sS
c550: 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20  rc.a[0].iCursor 
c560: 3d 20 2d 31 3b 0a 20 20 73 4e 43 2e 70 50 61 72  = -1;.  sNC.pPar
c570: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73  se = pParse;.  s
c580: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73  NC.pSrcList = &s
c590: 53 72 63 3b 0a 20 20 73 4e 43 2e 6e 63 46 6c 61  Src;.  sNC.ncFla
c5a0: 67 73 20 3d 20 74 79 70 65 3b 0a 20 20 69 66 28  gs = type;.  if(
c5b0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
c5c0: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
c5d0: 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a  Expr) ) return;.
c5e0: 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
c5f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c     for(i=0; i<pL
c600: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
c610: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
c620: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
c630: 6d 65 73 28 26 73 4e 43 2c 20 70 4c 69 73 74 2d  mes(&sNC, pList-
c640: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
c650: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
c660: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
c670: 7d 0a 7d 0a                                      }.}.