/ Hex Artifact Content
Login

Artifact ca8b99d894164435f5c55cb304c1b8121705c51e:


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 69 66 28 20  .    */.    if( 
3760: 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62  cnt==0 && cntTab
3770: 3d 3d 31 20 26 26 20 70 4d 61 74 63 68 20 26 26  ==1 && pMatch &&
3780: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
3790: 7a 43 6f 6c 29 0a 20 20 20 20 20 26 26 20 48 61  zCol).     && Ha
37a0: 73 52 6f 77 69 64 28 70 4d 61 74 63 68 2d 3e 70  sRowid(pMatch->p
37b0: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  Tab) ){.      cn
37c0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78  t = 1;.      pEx
37d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  pr->iColumn = -1
37e0: 3b 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  ;     /* IMP: R-
37f0: 34 34 39 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20  44911-55124 */. 
3800: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
3810: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
3820: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d  F_INTEGER;.    }
3830: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
3840: 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  If the input is 
3850: 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e  of the form Z (n
3860: 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29  ot Y.Z or X.Y.Z)
3870: 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a   then the name Z
3880: 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65  .    ** might re
3890: 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74  fer to an result
38a0: 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69  -set alias.  Thi
38b0: 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
38c0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20  xample, when.   
38d0: 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c   ** we are resol
38e0: 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68  ving names in th
38f0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
3900: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
3910: 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a  command:.    **.
3920: 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
3930: 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20  T a+b AS x FROM 
3940: 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30  table WHERE x<10
3950: 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
3960: 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  In cases like th
3970: 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70  is, replace pExp
3980: 72 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  r with a copy of
3990: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
39a0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d  that.    ** form
39b0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
39c0: 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e   entry ("a+b" in
39d0: 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e   the example) an
39e0: 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
39f0: 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74  tely..    ** Not
3a00: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
3a10: 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73  ssion in the res
3a20: 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68  ult set should h
3a30: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
3a40: 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64  .    ** resolved
3a50: 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
3a60: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
3a70: 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a   resolved..    *
3a80: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 62 69  *.    ** The abi
3a90: 6c 69 74 79 20 74 6f 20 75 73 65 20 61 6e 20 6f  lity to use an o
3aa0: 75 74 70 75 74 20 72 65 73 75 6c 74 2d 73 65 74  utput result-set
3ab0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 57   column in the W
3ac0: 48 45 52 45 2c 20 47 52 4f 55 50 20 42 59 2c 0a  HERE, GROUP BY,.
3ad0: 20 20 20 20 2a 2a 20 6f 72 20 48 41 56 49 4e 47      ** or HAVING
3ae0: 20 63 6c 61 75 73 65 73 2c 20 6f 72 20 61 73 20   clauses, or as 
3af0: 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72  part of a larger
3b00: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
3b10: 68 65 20 4f 52 44 52 45 20 42 59 0a 20 20 20 20  he ORDRE BY.    
3b20: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  ** clause is not
3b30: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 2e 20 20   standard SQL.  
3b40: 54 68 69 73 20 69 73 20 61 20 28 67 6f 6f 66 79  This is a (goofy
3b50: 29 20 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69  ) SQLite extensi
3b60: 6f 6e 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  on, that.    ** 
3b70: 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  is supported for
3b80: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
3b90: 74 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e 20 20  tibility only.  
3ba0: 54 4f 20 44 4f 3a 20 49 73 73 75 65 20 61 20 77  TO DO: Issue a w
3bb0: 61 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e  arning.    ** on
3bc0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 77   sqlite3_log() w
3bd0: 68 65 6e 65 76 65 72 20 74 68 65 20 63 61 70 61  henever the capa
3be0: 62 69 6c 69 74 79 20 69 73 20 75 73 65 64 2e 0a  bility is used..
3bf0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
3c00: 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45  pEList = pNC->pE
3c10: 4c 69 73 74 29 21 3d 30 0a 20 20 20 20 20 26 26  List)!=0.     &&
3c20: 20 7a 54 61 62 3d 3d 30 0a 20 20 20 20 20 26 26   zTab==0.     &&
3c30: 20 63 6e 74 3d 3d 30 0a 20 20 20 20 29 7b 0a 20   cnt==0.    ){. 
3c40: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3c50: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
3c60: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3c70: 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d  r *zAs = pEList-
3c80: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
3c90: 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20       if( zAs!=0 
3ca0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
3cb0: 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20  p(zAs, zCol)==0 
3cc0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
3cd0: 72 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20 20  r *pOrig;.      
3ce0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
3cf0: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
3d00: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
3d10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
3d20: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
3d30: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
3d40: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
3d50: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20  r->x.pSelect==0 
3d60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  );.          pOr
3d70: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  ig = pEList->a[j
3d80: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
3d90: 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
3da0: 6c 61 67 73 26 4e 43 5f 41 6c 6c 6f 77 41 67 67  lags&NC_AllowAgg
3db0: 29 3d 3d 30 20 26 26 20 45 78 70 72 48 61 73 50  )==0 && ExprHasP
3dc0: 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45  roperty(pOrig, E
3dd0: 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  P_Agg) ){.      
3de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3df0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
3e00: 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64  isuse of aliased
3e10: 20 61 67 67 72 65 67 61 74 65 20 25 73 22 2c 20   aggregate %s", 
3e20: 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zAs);.          
3e30: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
3e40: 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rt;.          }.
3e50: 20 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76            resolv
3e60: 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70  eAlias(pParse, p
3e70: 45 4c 69 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c  EList, j, pExpr,
3e80: 20 22 22 2c 20 6e 53 75 62 71 75 65 72 79 29 3b   "", nSubquery);
3e90: 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d  .          cnt =
3ea0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   1;.          pM
3eb0: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
3ec0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62      assert( zTab
3ed0: 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b  ==0 && zDb==0 );
3ee0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
3ef0: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a  lookupname_end;.
3f00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3f10: 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  } .    }..    /*
3f20: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
3f30: 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78  next name contex
3f40: 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c  t.  The loop wil
3f50: 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68  l exit when eith
3f60: 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76  er.    ** we hav
3f70: 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30  e a match (cnt>0
3f80: 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e  ) or when we run
3f90: 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e   out of name con
3fa0: 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  texts..    */.  
3fb0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a    if( cnt==0 ){.
3fc0: 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d        pNC = pNC-
3fd0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 6e 53  >pNext;.      nS
3fe0: 75 62 71 75 65 72 79 2b 2b 3b 0a 20 20 20 20 7d  ubquery++;.    }
3ff0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4000: 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e  If X and Y are N
4010: 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ULL (in other wo
4020: 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20  rds if only the 
4030: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73  column name Z is
4040: 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20  .  ** supplied) 
4050: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
4060: 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69   Z is enclosed i
4070: 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c  n double-quotes,
4080: 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20   then.  ** Z is 
4090: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
40a0: 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d   if it doesn't m
40b0: 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  atch any column 
40c0: 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a  names.  In that.
40d0: 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65    ** case, we ne
40e0: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67  ed to return rig
40f0: 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20  ht away and not 
4100: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
4110: 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a   to.  ** pExpr..
4120: 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73    **.  ** Becaus
4130: 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  e no reference w
4140: 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72  as made to outer
4150: 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70   contexts, the p
4160: 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69  NC->nRef.  ** fi
4170: 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61  elds are not cha
4180: 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74  nged in any cont
4190: 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ext..  */.  if( 
41a0: 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d  cnt==0 && zTab==
41b0: 30 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  0 && ExprHasProp
41c0: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 44 62  erty(pExpr,EP_Db
41d0: 6c 51 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20  lQuoted) ){.    
41e0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53  pExpr->op = TK_S
41f0: 54 52 49 4e 47 3b 0a 20 20 20 20 70 45 78 70 72  TRING;.    pExpr
4200: 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
4210: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
4220: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
4230: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
4240: 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63  ere was not matc
4250: 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20  h.  cnt>1 means 
4260: 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f  there were two o
4270: 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63  r.  ** more matc
4280: 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  hes.  Either way
4290: 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72  , we have an err
42a0: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  or..  */.  if( c
42b0: 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e  nt!=1 ){.    con
42c0: 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20  st char *zErr;. 
42d0: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
42e0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
42f0: 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73  mn" : "ambiguous
4300: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20   column name";. 
4310: 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20     if( zDb ){.  
4320: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4330: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
4340: 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72   %s.%s.%s", zErr
4350: 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f  , zDb, zTab, zCo
4360: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  l);.    }else if
4370: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
4380: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4390: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
43a0: 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c  %s", zErr, zTab,
43b0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73   zCol);.    }els
43c0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
43d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
43e0: 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c   "%s: %s", zErr,
43f0: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   zCol);.    }.  
4400: 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53    pParse->checkS
4410: 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 70  chema = 1;.    p
4420: 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  TopNC->nErr++;. 
4430: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f   }..  /* If a co
4440: 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c  lumn from a tabl
4450: 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73  e in pSrcList is
4460: 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65   referenced, the
4470: 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68  n record.  ** th
4480: 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70  is fact in the p
4490: 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55  SrcList.a[].colU
44a0: 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f  sed bitmask.  Co
44b0: 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20  lumn 0 causes.  
44c0: 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73  ** bit 0 to be s
44d0: 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65  et.  Column 1 se
44e0: 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73  ts bit 1.  And s
44f0: 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65  o forth.  If the
4500: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d  .  ** column num
4510: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
4520: 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  han the number o
4530: 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69  f bits in the bi
4540: 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20  tmask.  ** then 
4550: 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64  set the high-ord
4560: 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69  er bit of the bi
4570: 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  tmask..  */.  if
4580: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
4590: 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30  >=0 && pMatch!=0
45a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
45b0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
45c0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
45d0: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 69 66  =BMS-1 );.    if
45e0: 28 20 6e 3e 3d 42 4d 53 20 29 7b 0a 20 20 20 20  ( n>=BMS ){.    
45f0: 20 20 6e 20 3d 20 42 4d 53 2d 31 3b 0a 20 20 20    n = BMS-1;.   
4600: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
4610: 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d  Match->iCursor==
4620: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b  pExpr->iTable );
4630: 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c  .    pMatch->col
4640: 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73  Used |= ((Bitmas
4650: 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20 20  k)1)<<n;.  }..  
4660: 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  /* Clean up and 
4670: 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
4680: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4690: 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  db, pExpr->pLeft
46a0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  );.  pExpr->pLef
46b0: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
46c0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
46d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
46e0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
46f0: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
4700: 3d 20 28 69 73 54 72 69 67 67 65 72 20 3f 20 54  = (isTrigger ? T
4710: 4b 5f 54 52 49 47 47 45 52 20 3a 20 54 4b 5f 43  K_TRIGGER : TK_C
4720: 4f 4c 55 4d 4e 29 3b 0a 6c 6f 6f 6b 75 70 6e 61  OLUMN);.lookupna
4730: 6d 65 5f 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e  me_end:.  if( cn
4740: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65  t==1 ){.    asse
4750: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
4760: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21    if( pExpr->op!
4770: 3d 54 4b 5f 41 53 20 29 7b 0a 20 20 20 20 20 20  =TK_AS ){.      
4780: 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28  sqlite3AuthRead(
4790: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
47a0: 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72  Schema, pNC->pSr
47b0: 63 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  cList);.    }.  
47c0: 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
47d0: 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e  he nRef value on
47e0: 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78   all name contex
47f0: 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70  ts from TopNC up
4800: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   to.    ** the p
4810: 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e  oint where the n
4820: 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a  ame matched. */.
4830: 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
4840: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e     assert( pTopN
4850: 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  C!=0 );.      pT
4860: 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  opNC->nRef++;.  
4870: 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d      if( pTopNC==
4880: 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pNC ) break;.   
4890: 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70     pTopNC = pTop
48a0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  NC->pNext;.    }
48b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
48c0: 50 72 75 6e 65 3b 0a 20 20 7d 20 65 6c 73 65 20  Prune;.  } else 
48d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
48e0: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _Abort;.  }.}../
48f0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
4900: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
4910: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
4920: 69 6f 6e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  ion to load the 
4930: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66  column iCol.** f
4940: 72 6f 6d 20 64 61 74 61 73 6f 75 72 63 65 20 69  rom datasource i
4950: 53 72 63 20 69 6e 20 53 72 63 4c 69 73 74 20 70  Src in SrcList p
4960: 53 72 63 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  Src..*/.Expr *sq
4970: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
4980: 6e 45 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64  nExpr(sqlite3 *d
4990: 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  b, SrcList *pSrc
49a0: 2c 20 69 6e 74 20 69 53 72 63 2c 20 69 6e 74 20  , int iSrc, int 
49b0: 69 43 6f 6c 29 7b 0a 20 20 45 78 70 72 20 2a 70  iCol){.  Expr *p
49c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
49d0: 6c 6f 63 28 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d  loc(db, TK_COLUM
49e0: 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  N, 0, 0);.  if( 
49f0: 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  p ){.    struct 
4a00: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
4a10: 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
4a20: 53 72 63 5d 3b 0a 20 20 20 20 70 2d 3e 70 54 61  Src];.    p->pTa
4a30: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
4a40: 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
4a50: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
4a60: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
4a70: 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b  ->iPKey==iCol ){
4a80: 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
4a90: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  n = -1;.    }els
4aa0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  e{.      p->iCol
4ab0: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69 43 6f  umn = (ynVar)iCo
4ac0: 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
4ad0: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
4ae0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4af0: 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
4b00: 20 20 20 20 20 70 49 74 65 6d 2d 3e 63 6f 6c 55       pItem->colU
4b10: 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b  sed |= ((Bitmask
4b20: 29 31 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d 53 20  )1)<<(iCol>=BMS 
4b30: 3f 20 42 4d 53 2d 31 20 3a 20 69 43 6f 6c 29 3b  ? BMS-1 : iCol);
4b40: 0a 20 20 20 20 7d 0a 20 20 20 20 45 78 70 72 53  .    }.    ExprS
4b50: 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  etProperty(p, EP
4b60: 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 20 20 7d 0a  _Resolved);.  }.
4b70: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4b80: 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65  *.** Report an e
4b90: 72 72 6f 72 20 74 68 61 74 20 61 6e 20 65 78 70  rror that an exp
4ba0: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76  ression is not v
4bb0: 61 6c 69 64 20 66 6f 72 20 61 20 70 61 72 74 69  alid for a parti
4bc0: 61 6c 20 69 6e 64 65 78 20 57 48 45 52 45 0a 2a  al index WHERE.*
4bd0: 2a 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61  * clause..*/.sta
4be0: 74 69 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69  tic void notVali
4bf0: 64 50 61 72 74 49 64 78 57 68 65 72 65 28 0a 20  dPartIdxWhere(. 
4c00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4c10: 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 65        /* Leave e
4c20: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72  rror message her
4c30: 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  e */.  NameConte
4c40: 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54  xt *pNC,    /* T
4c50: 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20  he name context 
4c60: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
4c70: 2a 7a 4d 73 67 20 20 20 20 20 2f 2a 20 54 79 70  *zMsg     /* Typ
4c80: 65 20 6f 66 20 65 72 72 6f 72 20 2a 2f 0a 29 7b  e of error */.){
4c90: 0a 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46  .  if( (pNC->ncF
4ca0: 6c 61 67 73 20 26 20 4e 43 5f 50 61 72 74 49 64  lags & NC_PartId
4cb0: 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  x)!=0 ){.    sql
4cc0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4cd0: 72 73 65 2c 20 22 25 73 20 70 72 6f 68 69 62 69  rse, "%s prohibi
4ce0: 74 65 64 20 69 6e 20 70 61 72 74 69 61 6c 20 69  ted in partial i
4cf0: 6e 64 65 78 20 57 48 45 52 45 20 63 6c 61 75 73  ndex WHERE claus
4d00: 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  es",.           
4d10: 20 20 20 20 20 20 20 20 20 7a 4d 73 67 29 3b 0a           zMsg);.
4d20: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
4d30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
4d40: 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e  ./*.** Report an
4d50: 20 65 72 72 6f 72 20 74 68 61 74 20 61 6e 20 65   error that an e
4d60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
4d70: 20 76 61 6c 69 64 20 66 6f 72 20 61 20 43 48 45   valid for a CHE
4d80: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a  CK constraint..*
4d90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f  /.static void no
4da0: 74 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74  tValidCheckConst
4db0: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
4dc0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
4dd0: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
4de0: 73 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 4e  sage here */.  N
4df0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
4e00: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
4e10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
4e20: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 20 20  st char *zMsg   
4e30: 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 65 72 72    /* Type of err
4e40: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 28  or */.){.  if( (
4e50: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
4e60: 43 5f 49 73 43 68 65 63 6b 29 21 3d 30 20 29 7b  C_IsCheck)!=0 ){
4e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
4e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 20  rMsg(pParse,"%s 
4e90: 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48  prohibited in CH
4ea0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  ECK constraints"
4eb0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23  , zMsg);.  }.}.#
4ec0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6e 6f  else.# define no
4ed0: 74 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74  tValidCheckConst
4ee0: 72 61 69 6e 74 28 50 2c 4e 2c 4d 29 0a 23 65 6e  raint(P,N,M).#en
4ef0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  dif../*.** Expre
4f00: 73 73 69 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65  ssion p should e
4f10: 6e 63 6f 64 65 20 61 20 66 6c 6f 61 74 69 6e 67  ncode a floating
4f20: 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 62 65 74   point value bet
4f30: 77 65 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30  ween 1.0 and 0.0
4f40: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 30 32 34  ..** Return 1024
4f50: 20 74 69 6d 65 73 20 74 68 69 73 20 76 61 6c 75   times this valu
4f60: 65 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31  e.  Or return -1
4f70: 20 69 66 20 70 20 69 73 20 6e 6f 74 20 61 20 66   if p is not a f
4f80: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
4f90: 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31   value between 1
4fa0: 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73  .0 and 0.0..*/.s
4fb0: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 50 72  tatic int exprPr
4fc0: 6f 62 61 62 69 6c 69 74 79 28 45 78 70 72 20 2a  obability(Expr *
4fd0: 70 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d  p){.  double r =
4fe0: 20 2d 31 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e   -1.0;.  if( p->
4ff0: 6f 70 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72  op!=TK_FLOAT ) r
5000: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69  eturn -1;.  sqli
5010: 74 65 33 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f  te3AtoF(p->u.zTo
5020: 6b 65 6e 2c 20 26 72 2c 20 73 71 6c 69 74 65 33  ken, &r, sqlite3
5030: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
5040: 6f 6b 65 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54  oken), SQLITE_UT
5050: 46 38 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  F8);.  assert( r
5060: 3e 3d 30 2e 30 20 29 3b 0a 20 20 69 66 28 20 72  >=0.0 );.  if( r
5070: 3e 31 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  >1.0 ) return -1
5080: 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  ;.  return (int)
5090: 28 72 2a 31 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f  (r*1000.0);.}../
50a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
50b0: 65 20 69 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  e is callback fo
50c0: 72 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  r sqlite3WalkExp
50d0: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c  r()..**.** Resol
50e0: 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  ve symbolic name
50f0: 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  s into TK_COLUMN
5100: 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74   operators for t
5110: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f  he current.** no
5120: 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  de in the expres
5130: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
5140: 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  rn 0 to continue
5150: 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e   the search down
5160: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20  .** the tree or 
5170: 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74  2 to abort the t
5180: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20  ree walk..**.** 
5190: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
51a0: 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65  o does error che
51b0: 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72  cking and name r
51c0: 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a  esolution for.**
51d0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e   function names.
51e0: 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66    The operator f
51f0: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
5200: 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65  ctions is change
5210: 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46  d.** to TK_AGG_F
5220: 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74  UNCTION..*/.stat
5230: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 45 78  ic int resolveEx
5240: 70 72 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70  prStep(Walker *p
5250: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
5260: 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74  xpr){.  NameCont
5270: 65 78 74 20 2a 70 4e 43 3b 0a 20 20 50 61 72 73  ext *pNC;.  Pars
5280: 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 70 4e  e *pParse;..  pN
5290: 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
52a0: 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
52b0: 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65  C!=0 );.  pParse
52c0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
52d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
52e0: 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  ==pWalker->pPars
52f0: 65 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  e );..  if( Expr
5300: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5310: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
5320: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  ) return WRC_Pru
5330: 6e 65 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  ne;.  ExprSetPro
5340: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
5350: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
5360: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
5370: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26  pNC->pSrcList &&
5380: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e   pNC->pSrcList->
5390: 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20  nAlloc>0 ){.    
53a0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
53b0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
53c0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
53d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43    for(i=0; i<pNC
53e0: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  ->pSrcList->nSrc
53f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
5400: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
5410: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
5420: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
5430: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
5440: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
5450: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
5460: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
5470: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5480: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
5490: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29  TE_DELETE_LIMIT)
54a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
54b0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
54c0: 59 29 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 70  Y).    /* The sp
54d0: 65 63 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 54  ecial operator T
54e0: 4b 5f 52 4f 57 20 6d 65 61 6e 73 20 75 73 65 20  K_ROW means use 
54f0: 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  the rowid for th
5500: 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 63  e first.    ** c
5510: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f  olumn in the FRO
5520: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20  M clause.  This 
5530: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4c  is used by the L
5540: 49 4d 49 54 20 61 6e 64 20 4f 52 44 45 52 20 42  IMIT and ORDER B
5550: 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  Y.    ** clause 
5560: 70 72 6f 63 65 73 73 69 6e 67 20 6f 6e 20 55 50  processing on UP
5570: 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20  DATE and DELETE 
5580: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
5590: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  */.    case TK_R
55a0: 4f 57 3a 20 7b 0a 20 20 20 20 20 20 53 72 63 4c  OW: {.      SrcL
55b0: 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
55c0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
55d0: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
55e0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
55f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5600: 53 72 63 4c 69 73 74 20 26 26 20 70 53 72 63 4c  SrcList && pSrcL
5610: 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ist->nSrc==1 );.
5620: 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 53        pItem = pS
5630: 72 63 4c 69 73 74 2d 3e 61 3b 20 0a 20 20 20 20  rcList->a; .    
5640: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
5650: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70  _COLUMN;.      p
5660: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 49 74  Expr->pTab = pIt
5670: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
5680: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
5690: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
56a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
56b0: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
56c0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
56d0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
56e0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65  TEGER;.      bre
56f0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5700: 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
5710: 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45  TE_ENABLE_UPDATE
5720: 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26  _DELETE_LIMIT) &
5730: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
5740: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
5750: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 20 6c 6f   */..    /* A lo
5760: 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73  ne identifier is
5770: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
5780: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
5790: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a    case TK_ID: {.
57a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f        return loo
57b0: 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  kupName(pParse, 
57c0: 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  0, 0, pExpr->u.z
57d0: 54 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70  Token, pNC, pExp
57e0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  r);.    }.  .   
57f0: 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65   /* A table name
5800: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   and column name
5810: 3a 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20  :     ID.ID.    
5820: 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 65  ** Or a database
5830: 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  , table and colu
5840: 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20  mn:  ID.ID.ID.  
5850: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
5860: 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f  _DOT: {.      co
5870: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
5880: 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
5890: 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20  har *zTable;.   
58a0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
58b0: 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  Db;.      Expr *
58c0: 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f  pRight;..      /
58d0: 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d  * if( pSrcList==
58e0: 30 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20  0 ) break; */.  
58f0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
5900: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
5910: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70    if( pRight->op
5920: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
5930: 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20     zDb = 0;.    
5940: 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 70 45 78      zTable = pEx
5950: 70 72 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  pr->pLeft->u.zTo
5960: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f  ken;.        zCo
5970: 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75  lumn = pRight->u
5980: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d  .zToken;.      }
5990: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
59a0: 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70  sert( pRight->op
59b0: 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20  ==TK_DOT );.    
59c0: 20 20 20 20 7a 44 62 20 3d 20 70 45 78 70 72 2d      zDb = pExpr-
59d0: 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
59e0: 3b 0a 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65  ;.        zTable
59f0: 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66 74   = pRight->pLeft
5a00: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
5a10: 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52      zColumn = pR
5a20: 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 75 2e  ight->pRight->u.
5a30: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  zToken;.      }.
5a40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f        return loo
5a50: 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  kupName(pParse, 
5a60: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
5a70: 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72  lumn, pNC, pExpr
5a80: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
5a90: 20 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f   Resolve functio
5aa0: 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20  n names.    */. 
5ab0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
5ac0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
5ad0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
5ae0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
5af0: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
5b00: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
5b10: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
5b20: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
5b30: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
5b40: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5b50: 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68       int no_such
5b60: 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  _func = 0;      
5b70: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73   /* True if no s
5b80: 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  uch function exi
5b90: 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  sts */.      int
5ba0: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
5bb0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
5bc0: 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72   if wrong number
5bd0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
5be0: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67  .      int is_ag
5bf0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
5c00: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73     /* True if is
5c10: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
5c20: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
5c30: 69 6e 74 20 61 75 74 68 3b 20 20 20 20 20 20 20  int auth;       
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5c50: 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
5c60: 75 73 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  use the function
5c70: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   */.      int nI
5c80: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
5c90: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5ca0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
5cb0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
5cc0: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
5cd0: 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20  ar *zId;        
5ce0: 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
5cf0: 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  ion name. */.   
5d00: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
5d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
5d20: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
5d30: 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  out the function
5d40: 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
5d50: 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64   = ENC(pParse->d
5d60: 62 29 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  b);   /* The dat
5d70: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a  abase encoding *
5d80: 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  /..      assert(
5d90: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5da0: 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53  y(pExpr, EP_xIsS
5db0: 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20  elect) );.      
5dc0: 6e 6f 74 56 61 6c 69 64 50 61 72 74 49 64 78 57  notValidPartIdxW
5dd0: 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 4e 43  here(pParse, pNC
5de0: 2c 20 22 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a  , "functions");.
5df0: 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
5e00: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
5e10: 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33     nId = sqlite3
5e20: 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20  Strlen30(zId);. 
5e30: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
5e40: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
5e50: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
5e60: 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29   nId, n, enc, 0)
5e70: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
5e80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
5e90: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
5ea0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
5eb0: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
5ec0: 2d 32 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20  -2, enc, 0);.   
5ed0: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
5ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   ){.          no
5ef0: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a  _such_func = 1;.
5f00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5f10: 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e           wrong_n
5f20: 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20  um_args = 1;.   
5f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
5f40: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  se{.        is_a
5f50: 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63  gg = pDef->xFunc
5f60: 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ==0;.        if(
5f70: 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
5f80: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55   & SQLITE_FUNC_U
5f90: 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20  NLIKELY ){.     
5fa0: 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
5fb0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55  erty(pExpr, EP_U
5fc0: 6e 6c 69 6b 65 6c 79 7c 45 50 5f 53 6b 69 70 29  nlikely|EP_Skip)
5fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5fe0: 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  n==2 ){.        
5ff0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6000: 65 20 3d 20 65 78 70 72 50 72 6f 62 61 62 69 6c  e = exprProbabil
6010: 69 74 79 28 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ity(pList->a[1].
6020: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
6030: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
6040: 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20  Table<0 ){.     
6050: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6060: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6070: 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e   "second argumen
6080: 74 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  t to likelihood(
6090: 29 20 6d 75 73 74 20 62 65 20 61 20 22 0a 20 20  ) must be a ".  
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 20 22 63 6f 6e 73 74 61 6e 74 20 62 65      "constant be
60d0: 74 77 65 65 6e 20 30 2e 30 20 61 6e 64 20 31 2e  tween 0.0 and 1.
60e0: 30 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0");.           
60f0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
6100: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
6110: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 56             /* EV
6130: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33  IDENCE-OF: R-613
6140: 30 34 2d 32 39 34 34 39 20 54 68 65 20 75 6e 6c  04-29449 The unl
6150: 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f  ikely(X) functio
6160: 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  n is equivalent 
6170: 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  to.            *
6180: 2a 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 20  * likelihood(X, 
6190: 30 2e 30 36 32 35 29 2e 0a 20 20 20 20 20 20 20  0.0625)..       
61a0: 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
61b0: 2d 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31 31 36  -OF: R-01283-116
61c0: 33 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28  36 The unlikely(
61d0: 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  X) function is s
61e0: 68 6f 72 74 2d 68 61 6e 64 20 66 6f 72 0a 20 20  hort-hand for.  
61f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 69 6b            ** lik
6200: 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36 32 35  elihood(X,0.0625
6210: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
6220: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6230: 3d 20 36 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47  = 62;  /* TUNING
6240: 3a 20 20 44 65 66 61 75 6c 74 20 32 6e 64 20 61  :  Default 2nd a
6250: 72 67 20 74 6f 20 75 6e 6c 69 6b 65 6c 79 28 29  rg to unlikely()
6260: 20 69 73 20 30 2e 30 36 32 35 20 2a 2f 0a 20 20   is 0.0625 */.  
6270: 20 20 20 20 20 20 20 20 7d 20 20 20 20 20 20 20          }       
6280: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
6290: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
62a0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
62b0: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20  HORIZATION.     
62c0: 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20   if( pDef ){.   
62d0: 20 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69       auth = sqli
62e0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
62f0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  rse, SQLITE_FUNC
6300: 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a  TION, 0, pDef->z
6310: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
6320: 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49    if( auth!=SQLI
6330: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6340: 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c     if( auth==SQL
6350: 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20  ITE_DENY ){.    
6360: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6370: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6380: 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20  "not authorized 
6390: 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a  to use function:
63a0: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63c0: 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
63d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
63e0: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
63f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6400: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
6410: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
6420: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
6430: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20  _Prune;.        
6440: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  }.        if( pD
6450: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
6460: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
6470: 54 41 4e 54 20 29 20 45 78 70 72 53 65 74 50 72  TANT ) ExprSetPr
6480: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
6490: 43 6f 6e 73 74 61 6e 74 29 3b 0a 20 20 20 20 20  Constant);.     
64a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
64b0: 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 28 70  if( is_agg && (p
64c0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
64d0: 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20 29 7b  _AllowAgg)==0 ){
64e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
64f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6500: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
6510: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
6520: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
6530: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
6540: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
6550: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
6560: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
6570: 63 68 5f 66 75 6e 63 20 26 26 20 70 50 61 72 73  ch_func && pPars
6580: 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  e->db->init.busy
6590: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
65a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
65b0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
65c0: 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c  function: %.*s",
65d0: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
65e0: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
65f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6600: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
6610: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6620: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6630: 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  e,"wrong number 
6640: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
6650: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
6660: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  ,.             n
6670: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
6680: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
6690: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
66a0: 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 6e   is_agg ) pNC->n
66b0: 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c  cFlags &= ~NC_Al
66c0: 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 73 71  lowAgg;.      sq
66d0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73  lite3WalkExprLis
66e0: 74 28 70 57 61 6c 6b 65 72 2c 20 70 4c 69 73 74  t(pWalker, pList
66f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f  );.      if( is_
6700: 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 4e  agg ){.        N
6710: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 32  ameContext *pNC2
6720: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20   = pNC;.        
6730: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
6740: 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20  GG_FUNCTION;.   
6750: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20       pExpr->op2 
6760: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69  = 0;.        whi
6770: 6c 65 28 20 70 4e 43 32 20 26 26 20 21 73 71 6c  le( pNC2 && !sql
6780: 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73  ite3FunctionUses
6790: 54 68 69 73 53 72 63 28 70 45 78 70 72 2c 20 70  ThisSrc(pExpr, p
67a0: 4e 43 32 2d 3e 70 53 72 63 4c 69 73 74 29 20 29  NC2->pSrcList) )
67b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  {.          pExp
67c0: 72 2d 3e 6f 70 32 2b 2b 3b 0a 20 20 20 20 20 20  r->op2++;.      
67d0: 20 20 20 20 70 4e 43 32 20 3d 20 70 4e 43 32 2d      pNC2 = pNC2-
67e0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
67f0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  }.        if( pN
6800: 43 32 20 29 20 70 4e 43 32 2d 3e 6e 63 46 6c 61  C2 ) pNC2->ncFla
6810: 67 73 20 7c 3d 20 4e 43 5f 48 61 73 41 67 67 3b  gs |= NC_HasAgg;
6820: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63  .        pNC->nc
6830: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f  Flags |= NC_Allo
6840: 77 41 67 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wAgg;.      }.  
6850: 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20      /* FIX ME:  
6860: 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61  Compute pExpr->a
6870: 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e  ffinity based on
6880: 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65   the expected re
6890: 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79  turn.      ** ty
68a0: 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  pe of the functi
68b0: 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on .      */.   
68c0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
68d0: 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  une;.    }.#ifnd
68e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
68f0: 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65  UBQUERY.    case
6900: 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20   TK_SELECT:.    
6910: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20  case TK_EXISTS: 
6920: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
6930: 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
6940: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  );.#endif.    ca
6950: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
6960: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
6970: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  r->op==TK_IN );.
6980: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
6990: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
69a0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
69b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52  {.        int nR
69c0: 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a  ef = pNC->nRef;.
69d0: 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64          notValid
69e0: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
69f0: 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 73 75  pParse, pNC, "su
6a00: 62 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20  bqueries");.    
6a10: 20 20 20 20 6e 6f 74 56 61 6c 69 64 50 61 72 74      notValidPart
6a20: 49 64 78 57 68 65 72 65 28 70 50 61 72 73 65 2c  IdxWhere(pParse,
6a30: 20 70 4e 43 2c 20 22 73 75 62 71 75 65 72 69 65   pNC, "subquerie
6a40: 73 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  s");.        sql
6a50: 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70  ite3WalkSelect(p
6a60: 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78  Walker, pExpr->x
6a70: 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
6a80: 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e     assert( pNC->
6a90: 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20  nRef>=nRef );.  
6aa0: 20 20 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d        if( nRef!=
6ab0: 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20  pNC->nRef ){.   
6ac0: 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
6ad0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
6ae0: 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20  _VarSelect);.   
6af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6b00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6b10: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  }.    case TK_VA
6b20: 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
6b30: 6e 6f 74 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e  notValidCheckCon
6b40: 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20  straint(pParse, 
6b50: 70 4e 43 2c 20 22 70 61 72 61 6d 65 74 65 72 73  pNC, "parameters
6b60: 22 29 3b 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c  ");.      notVal
6b70: 69 64 50 61 72 74 49 64 78 57 68 65 72 65 28 70  idPartIdxWhere(p
6b80: 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 70 61 72  Parse, pNC, "par
6b90: 61 6d 65 74 65 72 73 22 29 3b 0a 20 20 20 20 20  ameters");.     
6ba0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6bb0: 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 72  }.  return (pPar
6bc0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
6bd0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
6be0: 69 6c 65 64 29 20 3f 20 57 52 43 5f 41 62 6f 72  iled) ? WRC_Abor
6bf0: 74 20 3a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  t : WRC_Continue
6c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73  ;.}../*.** pELis
6c10: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65  t is a list of e
6c20: 78 70 72 65 73 73 69 6f 6e 73 20 77 68 69 63 68  xpressions which
6c30: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
6c40: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
6c50: 65 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  e.** a SELECT st
6c60: 61 74 65 6d 65 6e 74 2e 20 20 70 45 20 69 73 20  atement.  pE is 
6c70: 61 20 74 65 72 6d 20 69 6e 20 61 6e 20 4f 52 44  a term in an ORD
6c80: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
6c90: 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 54 68 69  Y clause..** Thi
6ca0: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
6cb0: 20 74 6f 20 73 65 65 20 69 66 20 70 45 20 69 73   to see if pE is
6cc0: 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69   a simple identi
6cd0: 66 69 65 72 20 77 68 69 63 68 20 63 6f 72 72 65  fier which corre
6ce0: 73 70 6f 6e 64 73 0a 2a 2a 20 74 6f 20 74 68 65  sponds.** to the
6cf0: 20 41 53 2d 6e 61 6d 65 20 6f 66 20 6f 6e 65 20   AS-name of one 
6d00: 6f 66 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  of the terms of 
6d10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
6d20: 69 73 74 2e 20 20 49 66 20 69 74 20 69 73 2c 0a  ist.  If it is,.
6d30: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
6d40: 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
6d50: 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  r between 1 and 
6d60: 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  N where N is the
6d70: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6c   number of.** el
6d80: 65 6d 65 6e 74 73 20 69 6e 20 70 45 4c 69 73 74  ements in pEList
6d90: 2c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  , corresponding 
6da0: 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  to the matching 
6db0: 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 72 65  entry.  If there
6dc0: 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c   is.** no match,
6dd0: 20 6f 72 20 69 66 20 70 45 20 69 73 20 6e 6f 74   or if pE is not
6de0: 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69   a simple identi
6df0: 66 69 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20  fier, then this 
6e00: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
6e10: 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 45 4c 69 73  n 0..**.** pELis
6e20: 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 6f 6c  t has been resol
6e30: 76 65 64 2e 20 20 70 45 20 68 61 73 20 6e 6f 74  ved.  pE has not
6e40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6e50: 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 0a 20  resolveAsName(. 
6e60: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6e70: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
6e80: 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
6e90: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 45   messages */.  E
6ea0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
6eb0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70    /* List of exp
6ec0: 72 65 73 73 69 6f 6e 73 20 74 6f 20 73 63 61 6e  ressions to scan
6ed0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20   */.  Expr *pE  
6ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
6ef0: 65 73 73 69 6f 6e 20 77 65 20 61 72 65 20 74 72  ession we are tr
6f00: 79 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 2a 2f  ying to match */
6f10: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
6f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
6f30: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 55   counter */..  U
6f40: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6f50: 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28 20  pParse);..  if( 
6f60: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pE->op==TK_ID ){
6f70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  .    char *zCol 
6f80: 3d 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  = pE->u.zToken;.
6f90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
6fa0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
6fb0: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
6fc0: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
6fd0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
6fe0: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
6ff0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
7000: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
7010: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31        return i+1
7020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7030: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7040: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61  }../*.** pE is a
7050: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65   pointer to an e
7060: 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20  xpression which 
7070: 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  is a single term
7080: 20 69 6e 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52   in the.** ORDER
7090: 20 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e   BY of a compoun
70a0: 64 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20 65  d SELECT.  The e
70b0: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 6e 6f  xpression has no
70c0: 74 20 62 65 65 6e 0a 2a 2a 20 6e 61 6d 65 20 72  t been.** name r
70d0: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  esolved..**.** A
70e0: 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
70f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7100: 65 64 2c 20 77 65 20 61 6c 72 65 61 64 79 20 6b  ed, we already k
7110: 6e 6f 77 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  now that the.** 
7120: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73  ORDER BY term is
7130: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
7140: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 72  index into the r
7150: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 61 74  esult set.  That
7160: 0a 2a 2a 20 63 61 73 65 20 69 73 20 68 61 6e 64  .** case is hand
7170: 6c 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  led by the calli
7180: 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  ng routine..**.*
7190: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6d 61 74  * Attempt to mat
71a0: 63 68 20 70 45 20 61 67 61 69 6e 73 74 20 72 65  ch pE against re
71b0: 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
71c0: 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   in the left-mos
71d0: 74 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  t.** SELECT stat
71e0: 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 74  ement.  Return t
71f0: 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74 68  he index i of th
7200: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
7210: 6e 2c 0a 2a 2a 20 61 73 20 61 6e 20 69 6e 64 69  n,.** as an indi
7220: 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61  cation to the ca
7230: 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f  ller that it sho
7240: 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65 20  uld sort by the 
7250: 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  i-th column..** 
7260: 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  The left-most co
7270: 6c 75 6d 6e 20 69 73 20 31 2e 20 20 49 6e 20 6f  lumn is 1.  In o
7280: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
7290: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
72a0: 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 69 6e  s the.** same in
72b0: 74 65 67 65 72 20 76 61 6c 75 65 20 74 68 61 74  teger value that
72c0: 20 77 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69   would be used i
72d0: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
72e0: 65 6e 74 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  ent to indicate.
72f0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a  ** the column..*
7300: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
7310: 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72   no match, retur
7320: 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  n 0.  Return -1 
7330: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
7340: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
7350: 74 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 42 79  t resolveOrderBy
7360: 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a  TermToExprList(.
7370: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
7380: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
7390: 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f  context for erro
73a0: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
73b0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
73c0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
73d0: 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
73e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
73f0: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
7400: 45 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  E           /* T
7410: 68 65 20 73 70 65 63 69 66 69 63 20 4f 52 44 45  he specific ORDE
7420: 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a  R BY term */.){.
7430: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
7440: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
7450: 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  nter */.  ExprLi
7460: 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20  st *pEList;  /* 
7470: 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  The columns of t
7480: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
7490: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e  .  NameContext n
74a0: 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  c;    /* Name co
74b0: 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c 76  ntext for resolv
74c0: 69 6e 67 20 70 45 20 2a 2f 0a 20 20 73 71 6c 69  ing pE */.  sqli
74d0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 2f  te3 *db;       /
74e0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
74f0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
7500: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
7510: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
7520: 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
7530: 2a 2f 0a 20 20 75 38 20 73 61 76 65 64 53 75 70  */.  u8 savedSup
7540: 70 45 72 72 3b 20 20 20 2f 2a 20 53 61 76 65 64  pErr;   /* Saved
7550: 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 73 75   value of db->su
7560: 70 70 72 65 73 73 45 72 72 20 2a 2f 0a 0a 20 20  ppressErr */..  
7570: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 45  assert( sqlite3E
7580: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
7590: 20 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70 45 4c   &i)==0 );.  pEL
75a0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
75b0: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 73  EList;..  /* Res
75c0: 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69  olve all names i
75d0: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  n the ORDER BY t
75e0: 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  erm expression. 
75f0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63   */.  memset(&nc
7600: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29  , 0, sizeof(nc))
7610: 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20 3d 20  ;.  nc.pParse = 
7620: 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72  pParse;.  nc.pSr
7630: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
7640: 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69  >pSrc;.  nc.pELi
7650: 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e  st = pEList;.  n
7660: 63 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41  c.ncFlags = NC_A
7670: 6c 6c 6f 77 41 67 67 3b 0a 20 20 6e 63 2e 6e 45  llowAgg;.  nc.nE
7680: 72 72 20 3d 20 30 3b 0a 20 20 64 62 20 3d 20 70  rr = 0;.  db = p
7690: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 61 76  Parse->db;.  sav
76a0: 65 64 53 75 70 70 45 72 72 20 3d 20 64 62 2d 3e  edSuppErr = db->
76b0: 73 75 70 70 72 65 73 73 45 72 72 3b 0a 20 20 64  suppressErr;.  d
76c0: 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20 3d  b->suppressErr =
76d0: 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   1;.  rc = sqlit
76e0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
76f0: 65 73 28 26 6e 63 2c 20 70 45 29 3b 0a 20 20 64  es(&nc, pE);.  d
7700: 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20 3d  b->suppressErr =
7710: 20 73 61 76 65 64 53 75 70 70 45 72 72 3b 0a 20   savedSuppErr;. 
7720: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7730: 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f   0;..  /* Try to
7740: 20 6d 61 74 63 68 20 74 68 65 20 4f 52 44 45 52   match the ORDER
7750: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 61   BY expression a
7760: 67 61 69 6e 73 74 20 61 6e 20 65 78 70 72 65 73  gainst an expres
7770: 73 69 6f 6e 0a 20 20 2a 2a 20 69 6e 20 74 68 65  sion.  ** in the
7780: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 52 65   result set.  Re
7790: 74 75 72 6e 20 61 6e 20 31 2d 62 61 73 65 64 20  turn an 1-based 
77a0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6d 61 74  index of the mat
77b0: 63 68 69 6e 67 0a 20 20 2a 2a 20 72 65 73 75 6c  ching.  ** resul
77c0: 74 2d 73 65 74 20 65 6e 74 72 79 2e 0a 20 20 2a  t-set entry..  *
77d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
77e0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
77f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
7800: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
7810: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
7820: 72 2c 20 70 45 2c 20 2d 31 29 3c 32 20 29 7b 0a  r, pE, -1)<2 ){.
7830: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31        return i+1
7840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7850: 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 2c 20 72  * If no match, r
7860: 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65  eturn 0. */.  re
7870: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7880: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 52 44   Generate an ORD
7890: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
78a0: 59 20 74 65 72 6d 20 6f 75 74 2d 6f 66 2d 72 61  Y term out-of-ra
78b0: 6e 67 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  nge error..*/.st
78c0: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
78d0: 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72  eOutOfRangeError
78e0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
78f0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
7900: 65 20 65 72 72 6f 72 20 63 6f 6e 74 65 78 74 20  e error context 
7910: 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 77 72  into which to wr
7920: 69 74 65 20 74 68 65 20 65 72 72 6f 72 20 2a 2f  ite the error */
7930: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7940: 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 4f 52  Type,     /* "OR
7950: 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20  DER" or "GROUP" 
7960: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
7970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7980: 68 65 20 69 6e 64 65 78 20 28 31 2d 62 61 73 65  he index (1-base
7990: 64 29 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6f  d) of the term o
79a0: 75 74 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20  ut of range */. 
79b0: 20 69 6e 74 20 6d 78 20 20 20 20 20 20 20 20 20   int mx         
79c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65          /* Large
79d0: 73 74 20 70 65 72 6d 69 73 73 69 62 6c 65 20 76  st permissible v
79e0: 61 6c 75 65 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a  alue of i */.){.
79f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7a00: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 22  g(pParse, .    "
7a10: 25 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75  %r %s BY term ou
7a20: 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
7a30: 75 6c 64 20 62 65 20 22 0a 20 20 20 20 22 62 65  uld be ".    "be
7a40: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
7a50: 20 69 2c 20 7a 54 79 70 65 2c 20 6d 78 29 3b 0a   i, zType, mx);.
7a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
7a70: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
7a80: 61 75 73 65 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ause in a compou
7a90: 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
7aa0: 65 6e 74 2e 20 20 20 4d 6f 64 69 66 79 0a 2a 2a  ent.   Modify.**
7ab0: 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68   each term of th
7ac0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7ad0: 65 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  e is a constant 
7ae0: 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20  integer between 
7af0: 31 0a 2a 2a 20 61 6e 64 20 4e 20 77 68 65 72 65  1.** and N where
7b00: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
7b10: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
7b20: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
7b30: 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  CT..**.** ORDER 
7b40: 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  BY terms that ar
7b50: 65 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 74  e already an int
7b60: 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61  eger between 1 a
7b70: 6e 64 20 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f  nd N are.** unmo
7b80: 64 69 66 69 65 64 2e 20 20 4f 52 44 45 52 20 42  dified.  ORDER B
7b90: 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  Y terms that are
7ba0: 20 69 6e 74 65 67 65 72 73 20 6f 75 74 73 69 64   integers outsid
7bb0: 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a  e the range of.*
7bc0: 2a 20 31 20 74 68 72 6f 75 67 68 20 4e 20 67 65  * 1 through N ge
7bd0: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 2e  nerate an error.
7be0: 20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73    ORDER BY terms
7bf0: 20 74 68 61 74 20 61 72 65 20 65 78 70 72 65 73   that are expres
7c00: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6d 61 74  sions.** are mat
7c10: 63 68 65 64 20 61 67 61 69 6e 73 74 20 72 65 73  ched against res
7c20: 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
7c30: 6f 6e 73 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20  ons of compound 
7c40: 53 45 4c 45 43 54 0a 2a 2a 20 62 65 67 69 6e 6e  SELECT.** beginn
7c50: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6c 65 66  ing with the lef
7c60: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 61 6e  t-most SELECT an
7c70: 64 20 77 6f 72 6b 69 6e 67 20 74 6f 77 61 72 64  d working toward
7c80: 20 74 68 65 20 72 69 67 68 74 2e 0a 2a 2a 20 41   the right..** A
7c90: 74 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  t the first matc
7ca0: 68 2c 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  h, the ORDER BY 
7cb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
7cc0: 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a  ansformed into.*
7cd0: 2a 20 74 68 65 20 69 6e 74 65 67 65 72 20 63 6f  * the integer co
7ce0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  lumn number..**.
7cf0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
7d00: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
7d10: 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  een..*/.static i
7d20: 6e 74 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75  nt resolveCompou
7d30: 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ndOrderBy(.  Par
7d40: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7d50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7d60: 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72  ntext.  Leave er
7d70: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
7d80: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
7d90: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
7da0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
7db0: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ment containing 
7dc0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  the ORDER BY */.
7dd0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
7de0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
7df0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
7e00: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
7e10: 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54  *db;.  int moreT
7e20: 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64  oDo = 1;..  pOrd
7e30: 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e  erBy = pSelect->
7e40: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
7e50: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
7e60: 74 75 72 6e 20 30 3b 0a 20 20 64 62 20 3d 20 70  turn 0;.  db = p
7e70: 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 20 53  Parse->db;.#if S
7e80: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
7e90: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d  .  if( pOrderBy-
7ea0: 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69  >nExpr>db->aLimi
7eb0: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
7ec0: 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71  OLUMN] ){.    sq
7ed0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7ee0: 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20  arse, "too many 
7ef0: 74 65 72 6d 73 20 69 6e 20 4f 52 44 45 52 20 42  terms in ORDER B
7f00: 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20  Y clause");.    
7f10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65  return 1;.  }.#e
7f20: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ndif.  for(i=0; 
7f30: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
7f40: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72  r; i++){.    pOr
7f50: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
7f60: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c   = 0;.  }.  pSel
7f70: 65 63 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  ect->pNext = 0;.
7f80: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
7f90: 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20  ->pPrior ){.    
7fa0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d  pSelect->pPrior-
7fb0: 3e 70 4e 65 78 74 20 3d 20 70 53 65 6c 65 63 74  >pNext = pSelect
7fc0: 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20  ;.    pSelect = 
7fd0: 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b  pSelect->pPrior;
7fe0: 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53  .  }.  while( pS
7ff0: 65 6c 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44  elect && moreToD
8000: 6f 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  o ){.    struct 
8010: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
8020: 49 74 65 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f  Item;.    moreTo
8030: 44 6f 20 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69  Do = 0;.    pELi
8040: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
8050: 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
8060: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
8070: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
8080: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
8090: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
80a0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
80b0: 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  .      int iCol 
80c0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45 78 70 72  = -1;.      Expr
80d0: 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20   *pE, *pDup;.   
80e0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f     if( pItem->do
80f0: 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
8100: 20 20 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65       pE = sqlite
8110: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
8120: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  (pItem->pExpr);.
8130: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8140: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
8150: 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20  E, &iCol) ){.   
8160: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30       if( iCol<=0
8170: 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d   || iCol>pEList-
8180: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
8190: 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66      resolveOutOf
81a0: 52 61 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73  RangeError(pPars
81b0: 65 2c 20 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c  e, "ORDER", i+1,
81c0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b   pEList->nExpr);
81d0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
81e0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 1;.        }. 
81f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8200: 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c      iCol = resol
8210: 76 65 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c  veAsName(pParse,
8220: 20 70 45 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20   pEList, pE);.  
8230: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d        if( iCol==
8240: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
8250: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
8260: 72 44 75 70 28 64 62 2c 20 70 45 2c 20 30 29 3b  rDup(db, pE, 0);
8270: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
8280: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
82a0: 61 73 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20  assert(pDup);.  
82b0: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d            iCol =
82c0: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54   resolveOrderByT
82d0: 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50  ermToExprList(pP
82e0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70  arse, pSelect, p
82f0: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
8300: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
8310: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
8320: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
8330: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
8340: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
8350: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72         /* Conver
8360: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  t the ORDER BY t
8370: 65 72 6d 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65  erm into an inte
8380: 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ger column numbe
8390: 72 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  r iCol,.        
83a0: 2a 2a 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  ** taking care t
83b0: 6f 20 70 72 65 73 65 72 76 65 20 74 68 65 20 43  o preserve the C
83c0: 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 20 69 66  OLLATE clause if
83d0: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
83e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
83f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
8400: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
8410: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
8420: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8430: 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
8440: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
8450: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
8460: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
8470: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  iCol;.        if
8480: 28 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d  ( pItem->pExpr==
8490: 70 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pE ){.          
84a0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
84b0: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  New;.        }el
84c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
84d0: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 70 45 78  sert( pItem->pEx
84e0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
84f0: 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TE );.          
8500: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 70  assert( pItem->p
8510: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 45 20  Expr->pLeft==pE 
8520: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
8530: 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  em->pExpr->pLeft
8540: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
8550: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
8560: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8570: 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 49   pE);.        pI
8580: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
8590: 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c  yCol = (u16)iCol
85a0: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  ;.        pItem-
85b0: 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  >done = 1;.     
85c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
85d0: 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20  moreToDo = 1;.  
85e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
85f0: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
8600: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  t->pNext;.  }.  
8610: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
8620: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
8630: 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  {.    if( pOrder
8640: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30  By->a[i].done==0
8650: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8660: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8670: 2c 20 22 25 72 20 4f 52 44 45 52 20 42 59 20 74  , "%r ORDER BY t
8680: 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  erm does not mat
8690: 63 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20  ch any ".       
86a0: 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20       "column in 
86b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c  the result set",
86c0: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74   i+1);.      ret
86d0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
86e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
86f0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 65 76 65 72  /*.** Check ever
8700: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52  y term in the OR
8710: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
8720: 42 59 20 63 6c 61 75 73 65 20 70 4f 72 64 65 72  BY clause pOrder
8730: 42 79 20 6f 66 0a 2a 2a 20 74 68 65 20 53 45 4c  By of.** the SEL
8740: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
8750: 65 6c 65 63 74 2e 20 20 49 66 20 61 6e 79 20 74  elect.  If any t
8760: 65 72 6d 20 69 73 20 72 65 66 65 72 65 6e 63 65  erm is reference
8770: 20 74 6f 20 61 0a 2a 2a 20 72 65 73 75 6c 74 20   to a.** result 
8780: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 28  set expression (
8790: 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
87a0: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 2e   the ExprList.a.
87b0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 0a  u.x.iOrderByCol.
87c0: 2a 2a 20 66 69 65 6c 64 29 20 74 68 65 6e 20 63  ** field) then c
87d0: 6f 6e 76 65 72 74 20 74 68 61 74 20 74 65 72 6d  onvert that term
87e0: 20 69 6e 74 6f 20 61 20 63 6f 70 79 20 6f 66 20   into a copy of 
87f0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8800: 67 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  g result set.** 
8810: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  column..**.** If
8820: 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 20   any errors are 
8830: 64 65 74 65 63 74 65 64 2c 20 61 64 64 20 61 6e  detected, add an
8840: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
8850: 6f 20 70 50 61 72 73 65 20 61 6e 64 0a 2a 2a 20  o pParse and.** 
8860: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
8870: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
8880: 20 6e 6f 20 65 72 72 6f 72 73 20 61 72 65 20 73   no errors are s
8890: 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  een..*/.int sqli
88a0: 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
88b0: 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65 20  roupBy(.  Parse 
88c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
88d0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
88e0: 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72  xt.  Leave error
88f0: 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a   messages here *
8900: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
8910: 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ect,      /* The
8920: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8930: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
8940: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
8950: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
8960: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
8970: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
8980: 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63  lause to be proc
8990: 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  essed */.  const
89a0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
89b0: 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22   /* "ORDER" or "
89c0: 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20 20 69  GROUP" */.){.  i
89d0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
89e0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
89f0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
8a00: 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45  List;.  struct E
8a10: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
8a20: 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64  tem;..  if( pOrd
8a30: 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73  erBy==0 || pPars
8a40: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8a50: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
8a60: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
8a70: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64  OLUMN.  if( pOrd
8a80: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  erBy->nExpr>db->
8a90: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8aa0: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
8ab0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8ac0: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
8ad0: 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73  many terms in %s
8ae0: 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79   BY clause", zTy
8af0: 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  pe);.    return 
8b00: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
8b10: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
8b20: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
8b30: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
8b40: 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65    /* sqlite3Sele
8b50: 63 74 4e 65 77 28 29 20 67 75 61 72 61 6e 74 65  ctNew() guarante
8b60: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 66 6f 72  es this */.  for
8b70: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
8b80: 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65  erBy->a; i<pOrde
8b90: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  rBy->nExpr; i++,
8ba0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
8bb0: 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
8bc0: 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20  rderByCol ){.   
8bd0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
8be0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 70 45  x.iOrderByCol>pE
8bf0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
8c00: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75         resolveOu
8c10: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50  tOfRangeError(pP
8c20: 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31  arse, zType, i+1
8c30: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
8c40: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
8c50: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
8c60: 20 20 72 65 73 6f 6c 76 65 41 6c 69 61 73 28 70    resolveAlias(p
8c70: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70  Parse, pEList, p
8c80: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
8c90: 42 79 43 6f 6c 2d 31 2c 20 70 49 74 65 6d 2d 3e  ByCol-1, pItem->
8ca0: 70 45 78 70 72 2c 20 7a 54 79 70 65 2c 30 29 3b  pExpr, zType,0);
8cb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8cc0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8cd0: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
8ce0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
8cf0: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 53 45   BY clause in SE
8d00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
8d10: 53 65 6c 65 63 74 2e 0a 2a 2a 20 54 68 65 20 4e  Select..** The N
8d20: 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
8d30: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
8d40: 65 6e 74 20 69 73 20 70 4e 43 2e 20 20 7a 54 79  ent is pNC.  zTy
8d50: 70 65 20 69 73 20 65 69 74 68 65 72 0a 2a 2a 20  pe is either.** 
8d60: 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
8d70: 50 22 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  P" depending on 
8d80: 77 68 69 63 68 20 74 79 70 65 20 6f 66 20 63 6c  which type of cl
8d90: 61 75 73 65 20 70 4f 72 64 65 72 42 79 20 69 73  ause pOrderBy is
8da0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8db0: 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 65 61  tine resolves ea
8dc0: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63  ch term of the c
8dd0: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 20 65 78  lause into an ex
8de0: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20  pression..** If 
8df0: 74 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72  the order-by ter
8e00: 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  m is an integer 
8e10: 49 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  I between 1 and 
8e20: 4e 20 28 77 68 65 72 65 20 4e 20 69 73 20 74 68  N (where N is th
8e30: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63  e.** number of c
8e40: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
8e50: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
8e60: 53 45 4c 45 43 54 29 20 74 68 65 6e 20 74 68 65  SELECT) then the
8e70: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
8e80: 6e 20 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e  n the resolution
8e90: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
8ea0: 65 20 49 2d 74 68 20 72 65 73 75 6c 74 2d 73 65  e I-th result-se
8eb0: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  t expression.  I
8ec0: 66 0a 2a 2a 20 74 68 65 20 6f 72 64 65 72 2d 62  f.** the order-b
8ed0: 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69 64 65  y term is an ide
8ee0: 6e 74 69 66 69 65 72 20 74 68 61 74 20 63 6f 72  ntifier that cor
8ef0: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
8f00: 41 53 2d 6e 61 6d 65 20 6f 66 0a 2a 2a 20 61 20  AS-name of.** a 
8f10: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
8f20: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ssion, then the 
8f30: 74 65 72 6d 20 72 65 73 6f 6c 76 65 73 20 74 6f  term resolves to
8f40: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a   a copy of the.*
8f50: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
8f60: 72 65 73 73 69 6f 6e 2e 20 20 4f 74 68 65 72 77  ression.  Otherw
8f70: 69 73 65 2c 20 74 68 65 20 65 78 70 72 65 73 73  ise, the express
8f80: 69 6f 6e 20 69 73 20 72 65 73 6f 6c 76 65 64 20  ion is resolved 
8f90: 69 6e 0a 2a 2a 20 74 68 65 20 75 73 75 61 6c 20  in.** the usual 
8fa0: 77 61 79 20 2d 20 75 73 69 6e 67 20 73 71 6c 69  way - using sqli
8fb0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
8fc0: 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mes()..**.** Thi
8fd0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
8fe0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
8ff0: 65 72 72 6f 72 73 2e 20 20 49 66 20 65 72 72 6f  errors.  If erro
9000: 72 73 20 6f 63 63 75 72 2c 20 74 68 65 6e 0a 2a  rs occur, then.*
9010: 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
9020: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
9030: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
9040: 70 50 61 72 73 65 2e 20 20 28 4f 4f 4d 20 65 72  pParse.  (OOM er
9050: 72 6f 72 73 0a 2a 2a 20 65 78 63 65 70 74 65 64  rors.** excepted
9060: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
9070: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
9080: 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  upBy(.  NameCont
9090: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a  ext *pNC,     /*
90a0: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
90b0: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
90c0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
90d0: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
90e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
90f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 68 6f 6c  CT statement hol
9100: 64 69 6e 67 20 70 4f 72 64 65 72 42 79 20 2a 2f  ding pOrderBy */
9110: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
9120: 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f  derBy,   /* An O
9130: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
9140: 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 72 65   BY clause to re
9150: 73 6f 6c 76 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  solve */.  const
9160: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
9170: 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45   /* Either "ORDE
9180: 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61  R" or "GROUP", a
9190: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
91a0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
91d0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
91e0: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
91f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
9200: 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  umn number */.  
9210: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
9220: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 2f  item *pItem;   /
9230: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
9240: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
9250: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
9260: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
9270: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9280: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
9290: 6e 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  nResult;        
92a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
92b0: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
92c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
92d0: 2a 2f 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  */..  if( pOrder
92e0: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  By==0 ) return 0
92f0: 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 70 53  ;.  nResult = pS
9300: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
9310: 45 78 70 72 3b 0a 20 20 70 50 61 72 73 65 20 3d  Expr;.  pParse =
9320: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
9330: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
9340: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f  OrderBy->a; i<pO
9350: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
9360: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
9370: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 49 74    Expr *pE = pIt
9380: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45  em->pExpr;.    E
9390: 78 70 72 20 2a 70 45 32 20 3d 20 73 71 6c 69 74  xpr *pE2 = sqlit
93a0: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
93b0: 65 28 70 45 29 3b 0a 20 20 20 20 69 66 28 20 7a  e(pE);.    if( z
93c0: 54 79 70 65 5b 30 5d 21 3d 27 47 27 20 29 7b 0a  Type[0]!='G' ){.
93d0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 73        iCol = res
93e0: 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50 61 72 73  olveAsName(pPars
93f0: 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  e, pSelect->pELi
9400: 73 74 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20  st, pE2);.      
9410: 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( iCol>0 ){.  
9420: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 41        /* If an A
9430: 53 2d 6e 61 6d 65 20 6d 61 74 63 68 20 69 73 20  S-name match is 
9440: 66 6f 75 6e 64 2c 20 6d 61 72 6b 20 74 68 69 73  found, mark this
9450: 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e   ORDER BY column
9460: 20 61 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   as being.      
9470: 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74    ** a copy of t
9480: 68 65 20 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c  he iCol-th resul
9490: 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 2e 20 20 54  t-set column.  T
94a0: 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  he subsequent ca
94b0: 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  ll to.        **
94c0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f   sqlite3ResolveO
94d0: 72 64 65 72 47 72 6f 75 70 42 79 28 29 20 77 69  rderGroupBy() wi
94e0: 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65  ll convert the e
94f0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 61 0a 20  xpression to a. 
9500: 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f         ** copy o
9510: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 72 65  f the iCol-th re
9520: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
9530: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
9540: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
9550: 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43  rByCol = (u16)iC
9560: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  ol;.        cont
9570: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
9580: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
9590: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
95a0: 28 70 45 32 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  (pE2, &iCol) ){.
95b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
95c0: 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 61 6e  ER BY term is an
95d0: 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
95e0: 74 2e 20 20 41 67 61 69 6e 2c 20 73 65 74 20 74  t.  Again, set t
95f0: 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  he column.      
9600: 2a 2a 20 6e 75 6d 62 65 72 20 73 6f 20 74 68 61  ** number so tha
9610: 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  t sqlite3Resolve
9620: 4f 72 64 65 72 47 72 6f 75 70 42 79 28 29 20 77  OrderGroupBy() w
9630: 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 0a  ill convert the.
9640: 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 2d 62        ** order-b
9650: 79 20 74 65 72 6d 20 74 6f 20 61 20 63 6f 70 79  y term to a copy
9660: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73   of the result-s
9670: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  et expression */
9680: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c  .      if( iCol<
9690: 31 20 7c 7c 20 69 43 6f 6c 3e 30 78 66 66 66 66  1 || iCol>0xffff
96a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 6f   ){.        reso
96b0: 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72  lveOutOfRangeErr
96c0: 6f 72 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65  or(pParse, zType
96d0: 2c 20 69 2b 31 2c 20 6e 52 65 73 75 6c 74 29 3b  , i+1, nResult);
96e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
96f0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
9700: 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
9710: 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69  erByCol = (u16)i
9720: 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  Col;.      conti
9730: 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nue;.    }..    
9740: 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 72  /* Otherwise, tr
9750: 65 61 74 20 74 68 65 20 4f 52 44 45 52 20 42 59  eat the ORDER BY
9760: 20 74 65 72 6d 20 61 73 20 61 6e 20 6f 72 64 69   term as an ordi
9770: 6e 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20  nary expression 
9780: 2a 2f 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e  */.    pItem->u.
9790: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
97a0: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
97b0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
97c0: 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20  es(pNC, pE) ){. 
97d0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
97e0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30     }.    for(j=0
97f0: 3b 20 6a 3c 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ; j<pSelect->pEL
9800: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
9810: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9820: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
9830: 45 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  E, pSelect->pELi
9840: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20  st->a[j].pExpr, 
9850: 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
9860: 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72    pItem->u.x.iOr
9870: 64 65 72 42 79 43 6f 6c 20 3d 20 6a 2b 31 3b 0a  derByCol = j+1;.
9880: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9890: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
98a0: 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
98b0: 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70 53  oupBy(pParse, pS
98c0: 65 6c 65 63 74 2c 20 70 4f 72 64 65 72 42 79 2c  elect, pOrderBy,
98d0: 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zType);.}../*.*
98e0: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
98f0: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
9900: 61 74 65 6d 65 6e 74 20 70 20 61 6e 64 20 61 6c  atement p and al
9910: 6c 20 6f 66 20 69 74 73 20 64 65 73 63 65 6e 64  l of its descend
9920: 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ents..*/.static 
9930: 69 6e 74 20 72 65 73 6f 6c 76 65 53 65 6c 65 63  int resolveSelec
9940: 74 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70 57  tStep(Walker *pW
9950: 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70  alker, Select *p
9960: 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ){.  NameContext
9970: 20 2a 70 4f 75 74 65 72 4e 43 3b 20 20 2f 2a 20   *pOuterNC;  /* 
9980: 43 6f 6e 74 65 78 74 20 74 68 61 74 20 63 6f 6e  Context that con
9990: 74 61 69 6e 73 20 74 68 69 73 20 53 45 4c 45 43  tains this SELEC
99a0: 54 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  T */.  NameConte
99b0: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 2f  xt sNC;        /
99c0: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f  * Name context o
99d0: 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f  f this SELECT */
99e0: 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e  .  int isCompoun
99f0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  d;         /* Tr
9a00: 75 65 20 69 66 20 70 20 69 73 20 61 20 63 6f 6d  ue if p is a com
9a10: 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a  pound select */.
9a20: 20 20 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e 64 3b    int nCompound;
9a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9a40: 62 65 72 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20  ber of compound 
9a50: 74 65 72 6d 73 20 70 72 6f 63 65 73 73 65 64 20  terms processed 
9a60: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61 72 73  so far */.  Pars
9a70: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
9a80: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9a90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
9aa0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20  List *pEList;   
9ab0: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65      /* Result se
9ac0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
9ad0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9af0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
9b00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47  /.  ExprList *pG
9b10: 72 6f 75 70 42 79 3b 20 20 20 20 20 2f 2a 20 54  roupBy;     /* T
9b20: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
9b30: 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  se */.  Select *
9b40: 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20 20 20  pLeftmost;      
9b50: 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 6f 66 20  /* Left-most of 
9b60: 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70  SELECT of a comp
9b70: 6f 75 6e 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ound */.  sqlite
9b80: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
9b90: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
9ba0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 0a 0a  nnection */.  ..
9bb0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
9bc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c  ;.  if( p->selFl
9bd0: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
9be0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
9bf0: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20  WRC_Prune;.  }. 
9c00: 20 70 4f 75 74 65 72 4e 43 20 3d 20 70 57 61 6c   pOuterNC = pWal
9c10: 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 70 50  ker->u.pNC;.  pP
9c20: 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e  arse = pWalker->
9c30: 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70  pParse;.  db = p
9c40: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
9c50: 20 4e 6f 72 6d 61 6c 6c 79 20 73 71 6c 69 74 65   Normally sqlite
9c60: 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
9c70: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66  will be called f
9c80: 69 72 73 74 20 61 6e 64 20 77 69 6c 6c 20 68 61  irst and will ha
9c90: 76 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20  ve.  ** already 
9ca0: 65 78 70 61 6e 64 65 64 20 74 68 69 73 20 53 45  expanded this SE
9cb0: 4c 45 43 54 2e 20 20 48 6f 77 65 76 65 72 2c 20  LECT.  However, 
9cc0: 69 66 20 74 68 69 73 20 69 73 20 61 20 73 75 62  if this is a sub
9cd0: 71 75 65 72 79 20 77 69 74 68 69 6e 0a 20 20 2a  query within.  *
9ce0: 2a 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  * an expression,
9cf0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
9d00: 78 70 72 4e 61 6d 65 73 28 29 20 77 69 6c 6c 20  xprNames() will 
9d10: 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 6f 75  be called withou
9d20: 74 20 61 0a 20 20 2a 2a 20 70 72 69 6f 72 20 63  t a.  ** prior c
9d30: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 65  all to sqlite3Se
9d40: 6c 65 63 74 45 78 70 61 6e 64 28 29 2e 20 20 57  lectExpand().  W
9d50: 68 65 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73  hen that happens
9d60: 2c 20 6c 65 74 0a 20 20 2a 2a 20 73 71 6c 69 74  , let.  ** sqlit
9d70: 65 33 53 65 6c 65 63 74 50 72 65 70 28 29 20 64  e3SelectPrep() d
9d80: 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 70 72 6f  o all of the pro
9d90: 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73  cessing for this
9da0: 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2a 20 73 71   SELECT..  ** sq
9db0: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
9dc0: 29 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 62 6f  ) will invoke bo
9dd0: 74 68 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  th sqlite3Select
9de0: 45 78 70 61 6e 64 28 29 20 61 6e 64 0a 20 20 2a  Expand() and.  *
9df0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
9e00: 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72  n the correct or
9e10: 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  der..  */.  if( 
9e20: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
9e30: 46 5f 45 78 70 61 6e 64 65 64 29 3d 3d 30 20 29  F_Expanded)==0 )
9e40: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
9e50: 65 63 74 50 72 65 70 28 70 50 61 72 73 65 2c 20  ectPrep(pParse, 
9e60: 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  p, pOuterNC);.  
9e70: 20 20 72 65 74 75 72 6e 20 28 70 50 61 72 73 65    return (pParse
9e80: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
9e90: 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52  llocFailed) ? WR
9ea0: 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f 50 72  C_Abort : WRC_Pr
9eb0: 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 69 73 43 6f  une;.  }..  isCo
9ec0: 6d 70 6f 75 6e 64 20 3d 20 70 2d 3e 70 50 72 69  mpound = p->pPri
9ed0: 6f 72 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70 6f 75  or!=0;.  nCompou
9ee0: 6e 64 20 3d 20 30 3b 0a 20 20 70 4c 65 66 74 6d  nd = 0;.  pLeftm
9ef0: 6f 73 74 20 3d 20 70 3b 0a 20 20 77 68 69 6c 65  ost = p;.  while
9f00: 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
9f10: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
9f20: 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d  & SF_Expanded)!=
9f30: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
9f40: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
9f50: 53 46 5f 52 65 73 6f 6c 76 65 64 29 3d 3d 30 20  SF_Resolved)==0 
9f60: 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61  );.    p->selFla
9f70: 67 73 20 7c 3d 20 53 46 5f 52 65 73 6f 6c 76 65  gs |= SF_Resolve
9f80: 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c  d;..    /* Resol
9f90: 76 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ve the expressio
9fa0: 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20  ns in the LIMIT 
9fb0: 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73  and OFFSET claus
9fc0: 65 73 2e 20 54 68 65 73 65 0a 20 20 20 20 2a 2a  es. These.    **
9fd0: 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64   are not allowed
9fe0: 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79   to refer to any
9ff0: 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20   names, so pass 
a000: 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e  an empty NameCon
a010: 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  text..    */.   
a020: 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c   memset(&sNC, 0,
a030: 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20   sizeof(sNC));. 
a040: 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20     sNC.pParse = 
a050: 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66 28 20  pParse;.    if( 
a060: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
a070: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  prNames(&sNC, p-
a080: 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20  >pLimit) ||.    
a090: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
a0a0: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
a0b0: 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b  , p->pOffset) ){
a0c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
a0d0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
a0e0: 20 0a 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69   .    /* Recursi
a0f0: 76 65 6c 79 20 72 65 73 6f 6c 76 65 20 6e 61 6d  vely resolve nam
a100: 65 73 20 69 6e 20 61 6c 6c 20 73 75 62 71 75 65  es in all subque
a110: 72 69 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ries.    */.    
a120: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53  for(i=0; i<p->pS
a130: 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  rc->nSrc; i++){.
a140: 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63        struct Src
a150: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
a160: 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69   = &p->pSrc->a[i
a170: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ];.      if( pIt
a180: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
a190: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
a1a0: 78 74 20 2a 70 4e 43 3b 20 20 20 20 20 20 20 20  xt *pNC;        
a1b0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
a1c0: 61 74 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ate name context
a1d0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74  s */.        int
a1e0: 20 6e 52 65 66 20 3d 20 30 3b 20 20 20 20 20 20   nRef = 0;      
a1f0: 20 20 20 20 20 20 20 2f 2a 20 52 65 66 63 6f 75         /* Refcou
a200: 6e 74 20 66 6f 72 20 70 4f 75 74 65 72 4e 43 20  nt for pOuterNC 
a210: 61 6e 64 20 6f 75 74 65 72 20 63 6f 6e 74 65 78  and outer contex
a220: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ts */.        co
a230: 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64  nst char *zSaved
a240: 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65  Context = pParse
a250: 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a  ->zAuthContext;.
a260: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e  .        /* Coun
a270: 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  t the total numb
a280: 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
a290: 20 74 6f 20 70 4f 75 74 65 72 4e 43 20 61 6e 64   to pOuterNC and
a2a0: 20 61 6c 6c 20 6f 66 20 69 74 73 0a 20 20 20 20   all of its.    
a2b0: 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 63 6f      ** parent co
a2c0: 6e 74 65 78 74 73 2e 20 41 66 74 65 72 20 72 65  ntexts. After re
a2d0: 73 6f 6c 76 69 6e 67 20 72 65 66 65 72 65 6e 63  solving referenc
a2e0: 65 73 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  es to expression
a2f0: 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  s in.        ** 
a300: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20  pItem->pSelect, 
a310: 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 76 61  check if this va
a320: 6c 75 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  lue has changed.
a330: 20 49 66 20 73 6f 2c 20 74 68 65 6e 0a 20 20 20   If so, then.   
a340: 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73       ** SELECT s
a350: 74 61 74 65 6d 65 6e 74 20 70 49 74 65 6d 2d 3e  tatement pItem->
a360: 70 53 65 6c 65 63 74 20 6d 75 73 74 20 62 65 20  pSelect must be 
a370: 63 6f 72 72 65 6c 61 74 65 64 2e 20 53 65 74 20  correlated. Set 
a380: 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  the.        ** p
a390: 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
a3a0: 65 64 20 66 6c 61 67 20 69 66 20 74 68 69 73 20  ed flag if this 
a3b0: 69 73 20 74 68 65 20 63 61 73 65 2e 20 2a 2f 0a  is the case. */.
a3c0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 4e 43 3d          for(pNC=
a3d0: 70 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70  pOuterNC; pNC; p
a3e0: 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e  NC=pNC->pNext) n
a3f0: 52 65 66 20 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66  Ref += pNC->nRef
a400: 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
a410: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 70 50  Item->zName ) pP
a420: 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
a430: 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  xt = pItem->zNam
a440: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
a450: 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
a460: 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 49 74  ames(pParse, pIt
a470: 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4f 75  em->pSelect, pOu
a480: 74 65 72 4e 43 29 3b 0a 20 20 20 20 20 20 20 20  terNC);.        
a490: 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
a4a0: 74 65 78 74 20 3d 20 7a 53 61 76 65 64 43 6f 6e  text = zSavedCon
a4b0: 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 69 66  text;.        if
a4c0: 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
a4d0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
a4e0: 65 64 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  ed ) return WRC_
a4f0: 41 62 6f 72 74 3b 0a 0a 20 20 20 20 20 20 20 20  Abort;..        
a500: 66 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43  for(pNC=pOuterNC
a510: 3b 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e  ; pNC; pNC=pNC->
a520: 70 4e 65 78 74 29 20 6e 52 65 66 20 2d 3d 20 70  pNext) nRef -= p
a530: 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20  NC->nRef;.      
a540: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
a550: 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  >isCorrelated==0
a560: 20 26 26 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20   && nRef<=0 );. 
a570: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73         pItem->is
a580: 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 28 6e 52  Correlated = (nR
a590: 65 66 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ef!=0);.      }.
a5a0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
a5b0: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c  Set up the local
a5c0: 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f   name-context to
a5d0: 20 70 61 73 73 20 74 6f 20 73 71 6c 69 74 65 33   pass to sqlite3
a5e0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
a5f0: 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73  () to.    ** res
a600: 6f 6c 76 65 20 74 68 65 20 72 65 73 75 6c 74 2d  olve the result-
a610: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  set expression l
a620: 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ist..    */.    
a630: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43  sNC.ncFlags = NC
a640: 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 73  _AllowAgg;.    s
a650: 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d  NC.pSrcList = p-
a660: 3e 70 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70  >pSrc;.    sNC.p
a670: 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b  Next = pOuterNC;
a680: 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c  .  .    /* Resol
a690: 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ve names in the 
a6a0: 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20  result set. */. 
a6b0: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70     pEList = p->p
a6c0: 45 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72  EList;.    asser
a6d0: 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a  t( pEList!=0 );.
a6e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a6f0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
a700: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
a710: 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  pX = pEList->a[i
a720: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69  ].pExpr;.      i
a730: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
a740: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
a750: 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20 20 20   pX) ){.        
a760: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
a770: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
a780: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
a790: 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67  re are no aggreg
a7a0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
a7b0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c   the result-set,
a7c0: 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
a7d0: 20 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73   .    ** express
a7e0: 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ion, do not allo
a7f0: 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20  w aggregates in 
a800: 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  any of the other
a810: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
a820: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
a830: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
a840: 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30  SF_Aggregate)==0
a850: 20 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79   );.    pGroupBy
a860: 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
a870: 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
a880: 20 7c 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73   || (sNC.ncFlags
a890: 20 26 20 4e 43 5f 48 61 73 41 67 67 29 21 3d 30   & NC_HasAgg)!=0
a8a0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c   ){.      p->sel
a8b0: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72  Flags |= SF_Aggr
a8c0: 65 67 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65  egate;.    }else
a8d0: 7b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  {.      sNC.ncFl
a8e0: 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77  ags &= ~NC_Allow
a8f0: 41 67 67 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Agg;.    }.  .  
a900: 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47    /* If a HAVING
a910: 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65   clause is prese
a920: 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  nt, then there m
a930: 75 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42  ust be a GROUP B
a940: 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
a950: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76  .    if( p->pHav
a960: 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79  ing && !pGroupBy
a970: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a980: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a990: 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
a9a0: 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
a9b0: 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
a9c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
a9d0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
a9e0: 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68    .    /* Add th
a9f0: 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20  e output column 
aa00: 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
aa10: 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
aa20: 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 20 20  parsing the.    
aa30: 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ** other express
aa40: 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ions in the SELE
aa50: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
aa60: 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20  is is so that.  
aa70: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
aa80: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
aa90: 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
aaa0: 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
aab0: 69 6f 6e 73 20 62 79 0a 20 20 20 20 2a 2a 20 61  ions by.    ** a
aac0: 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65  liases in the re
aad0: 73 75 6c 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a  sult set..    **
aae0: 0a 20 20 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  .    ** Minor po
aaf0: 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
ab00: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
ab10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
ab20: 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d  ll be.    ** re-
ab30: 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61  evaluated for ea
ab40: 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ch reference to 
ab50: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  it..    */.    s
ab60: 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  NC.pEList = p->p
ab70: 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73  EList;.    if( s
ab80: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
ab90: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  rNames(&sNC, p->
aba0: 70 48 61 76 69 6e 67 29 20 29 20 72 65 74 75 72  pHaving) ) retur
abb0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
abc0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
abd0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
abe0: 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 29 20  C, p->pWhere) ) 
abf0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
ac00: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  ;..    /* The OR
ac10: 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50  DER BY and GROUP
ac20: 20 42 59 20 63 6c 61 75 73 65 73 20 6d 61 79 20   BY clauses may 
ac30: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 74 65 72  not refer to ter
ac40: 6d 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  ms in.    ** out
ac50: 65 72 20 71 75 65 72 69 65 73 20 0a 20 20 20 20  er queries .    
ac60: 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  */.    sNC.pNext
ac70: 20 3d 20 30 3b 0a 20 20 20 20 73 4e 43 2e 6e 63   = 0;.    sNC.nc
ac80: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f  Flags |= NC_Allo
ac90: 77 41 67 67 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  wAgg;..    /* Pr
aca0: 6f 63 65 73 73 20 74 68 65 20 4f 52 44 45 52 20  ocess the ORDER 
acb0: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 73 69  BY clause for si
acc0: 6e 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54 20 73  ngleton SELECT s
acd0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
ace0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
acf0: 6c 61 75 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75  lause for compou
ad00: 6e 64 73 20 53 45 4c 45 43 54 20 73 74 61 74 65  nds SELECT state
ad10: 6d 65 6e 74 73 20 69 73 20 68 61 6e 64 6c 65 64  ments is handled
ad20: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61  .    ** below, a
ad30: 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
ad40: 72 65 73 75 6c 74 2d 73 65 74 73 20 66 6f 72 20  result-sets for 
ad50: 61 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65 6d 65  all of the eleme
ad60: 6e 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  nts of.    ** th
ad70: 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20  e compound have 
ad80: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20  been resolved.. 
ad90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69     */.    if( !i
ada0: 73 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73  sCompound && res
adb0: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
adc0: 28 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72  (&sNC, p, p->pOr
add0: 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20  derBy, "ORDER") 
ade0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
adf0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
ae00: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
ae10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
ae20: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
ae30: 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ort;.    }.  .  
ae40: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
ae50: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
ae60: 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65 20 74  .  At the same t
ae70: 69 6d 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 0a  ime, make sure .
ae80: 20 20 20 20 2a 2a 20 74 68 65 20 47 52 4f 55 50      ** the GROUP
ae90: 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20   BY clause does 
aea0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72  not contain aggr
aeb0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e  egate functions.
aec0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
aed0: 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
aee0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
aef0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
af00: 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 72 65     .      if( re
af10: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
af20: 79 28 26 73 4e 43 2c 20 70 2c 20 70 47 72 6f 75  y(&sNC, p, pGrou
af30: 70 42 79 2c 20 22 47 52 4f 55 50 22 29 20 7c 7c  pBy, "GROUP") ||
af40: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
af50: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
af60: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
af70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
af80: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f  (i=0, pItem=pGro
af90: 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75  upBy->a; i<pGrou
afa0: 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  pBy->nExpr; i++,
afb0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
afc0: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
afd0: 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45  operty(pItem->pE
afe0: 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a  xpr, EP_Agg) ){.
aff0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
b000: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b010: 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e  , "aggregate fun
b020: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61  ctions are not a
b030: 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20  llowed in ".    
b040: 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47            "the G
b050: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29  ROUP BY clause")
b060: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
b070: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
b080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
b090: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
b0a0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
b0b0: 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6f  t term of the co
b0c0: 6d 70 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a 20 20  mpound.    */.  
b0d0: 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b    p = p->pPrior;
b0e0: 0a 20 20 20 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b  .    nCompound++
b0f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f  ;.  }..  /* Reso
b100: 6c 76 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  lve the ORDER BY
b110: 20 6f 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   on a compound S
b120: 45 4c 45 43 54 20 61 66 74 65 72 20 61 6c 6c 20  ELECT after all 
b130: 74 65 72 6d 73 20 6f 66 0a 20 20 2a 2a 20 74 68  terms of.  ** th
b140: 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20  e compound have 
b150: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20  been resolved.. 
b160: 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70   */.  if( isComp
b170: 6f 75 6e 64 20 26 26 20 72 65 73 6f 6c 76 65 43  ound && resolveC
b180: 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70  ompoundOrderBy(p
b190: 50 61 72 73 65 2c 20 70 4c 65 66 74 6d 6f 73 74  Parse, pLeftmost
b1a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
b1b0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
b1c0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
b1d0: 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ne;.}../*.** Thi
b1e0: 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20  s routine walks 
b1f0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
b200: 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20  ee and resolves 
b210: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a  references to.**
b220: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61   table columns a
b230: 6e 64 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  nd result-set co
b240: 6c 75 6d 6e 73 2e 20 20 41 74 20 74 68 65 20 73  lumns.  At the s
b250: 61 6d 65 20 74 69 6d 65 2c 20 64 6f 20 65 72 72  ame time, do err
b260: 6f 72 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 6f  or.** checking o
b270: 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73 61 67 65  n function usage
b280: 20 61 6e 64 20 73 65 74 20 61 20 66 6c 61 67 20   and set a flag 
b290: 69 66 20 61 6e 79 20 61 67 67 72 65 67 61 74 65  if any aggregate
b2a0: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72   functions.** ar
b2b0: 65 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f  e seen..**.** To
b2c0: 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 20 63   resolve table c
b2d0: 6f 6c 75 6d 6e 73 20 72 65 66 65 72 65 6e 63 65  olumns reference
b2e0: 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f  s we look for no
b2f0: 64 65 73 20 28 6f 72 20 73 75 62 74 72 65 65 73  des (or subtrees
b300: 29 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 72  ) of the .** for
b310: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
b320: 72 20 6a 75 73 74 20 5a 20 77 68 65 72 65 0a 2a  r just Z where.*
b330: 2a 0a 2a 2a 20 20 20 20 20 20 58 3a 20 20 20 54  *.**      X:   T
b340: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
b350: 61 62 61 73 65 2e 20 20 45 78 3a 20 20 22 6d 61  abase.  Ex:  "ma
b360: 69 6e 22 20 6f 72 20 22 74 65 6d 70 22 20 6f 72  in" or "temp" or
b370: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 68  .**           th
b380: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20  e symbolic name 
b390: 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6e 20 41  assigned to an A
b3a0: 54 54 41 43 48 2d 65 64 20 64 61 74 61 62 61 73  TTACH-ed databas
b3b0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 3a  e..**.**      Y:
b3c0: 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61     The name of a
b3d0: 20 74 61 62 6c 65 20 69 6e 20 61 20 46 52 4f 4d   table in a FROM
b3e0: 20 63 6c 61 75 73 65 2e 20 20 4f 72 20 69 6e 20   clause.  Or in 
b3f0: 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 20 20 20  a trigger.**    
b400: 20 20 20 20 20 20 20 6f 6e 65 20 6f 66 20 74 68         one of th
b410: 65 20 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20  e special names 
b420: 22 6f 6c 64 22 20 6f 72 20 22 6e 65 77 22 2e 0a  "old" or "new"..
b430: 2a 2a 0a 2a 2a 20 20 20 20 20 20 5a 3a 20 20 20  **.**      Z:   
b440: 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  The name of a co
b450: 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 59 2e  lumn in table Y.
b460: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 64 65 20  .**.** The node 
b470: 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  at the root of t
b480: 68 65 20 73 75 62 74 72 65 65 20 69 73 20 6d 6f  he subtree is mo
b490: 64 69 66 69 65 64 20 61 73 20 66 6f 6c 6c 6f 77  dified as follow
b4a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 45 78 70 72  s:.**.**    Expr
b4b0: 2e 6f 70 20 20 20 20 20 20 20 20 43 68 61 6e 67  .op        Chang
b4c0: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a  ed to TK_COLUMN.
b4d0: 2a 2a 20 20 20 20 45 78 70 72 2e 70 54 61 62 20  **    Expr.pTab 
b4e0: 20 20 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74       Points to t
b4f0: 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20  he Table object 
b500: 66 6f 72 20 58 2e 59 0a 2a 2a 20 20 20 20 45 78  for X.Y.**    Ex
b510: 70 72 2e 69 43 6f 6c 75 6d 6e 20 20 20 54 68 65  pr.iColumn   The
b520: 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e   column index in
b530: 20 58 2e 59 2e 20 20 2d 31 20 66 6f 72 20 74 68   X.Y.  -1 for th
b540: 65 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 45  e rowid..**    E
b550: 78 70 72 2e 69 54 61 62 6c 65 20 20 20 20 54 68  xpr.iTable    Th
b560: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
b570: 6d 62 65 72 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a  mber for X.Y.**.
b580: 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65  **.** To resolve
b590: 20 72 65 73 75 6c 74 2d 73 65 74 20 72 65 66 65   result-set refe
b5a0: 72 65 6e 63 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72  rences, look for
b5b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
b5c0: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d  s of the.** form
b5d0: 20 5a 20 28 77 69 74 68 20 6e 6f 20 58 20 61 6e   Z (with no X an
b5e0: 64 20 59 20 70 72 65 66 69 78 29 20 77 68 65 72  d Y prefix) wher
b5f0: 65 20 74 68 65 20 5a 20 6d 61 74 63 68 65 73 20  e the Z matches 
b600: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 2a  the right-hand.*
b610: 2a 20 73 69 7a 65 20 6f 66 20 61 6e 20 41 53 20  * size of an AS 
b620: 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20 72 65  clause in the re
b630: 73 75 6c 74 2d 73 65 74 20 6f 66 20 61 20 53 45  sult-set of a SE
b640: 4c 45 43 54 2e 20 20 54 68 65 20 5a 20 65 78 70  LECT.  The Z exp
b650: 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  ression.** is re
b660: 70 6c 61 63 65 64 20 62 79 20 61 20 63 6f 70 79  placed by a copy
b670: 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   of the left-han
b680: 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 65  d side of the re
b690: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
b6a0: 69 6f 6e 2e 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61  ion..** Table-na
b6b0: 6d 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20  me and function 
b6c0: 72 65 73 6f 6c 75 74 69 6f 6e 20 6f 63 63 75 72  resolution occur
b6d0: 73 20 6f 6e 20 74 68 65 20 73 75 62 73 74 69 74  s on the substit
b6e0: 75 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 0a  uted expression.
b6f0: 2a 2a 20 74 72 65 65 2e 20 20 46 6f 72 20 65 78  ** tree.  For ex
b700: 61 6d 70 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a  ample, in:.**.**
b710: 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62        SELECT a+b
b720: 20 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20   AS x, c+d AS y 
b730: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
b740: 20 78 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 78   x;.**.** The "x
b750: 22 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 72  " term of the or
b760: 64 65 72 20 62 79 20 69 73 20 72 65 70 6c 61 63  der by is replac
b770: 65 64 20 62 79 20 22 61 2b 62 22 20 74 6f 20 72  ed by "a+b" to r
b780: 65 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ender:.**.**    
b790: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
b7a0: 78 2c 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d  x, c+d AS y FROM
b7b0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 61 2b 62   t1 ORDER BY a+b
b7c0: 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ;.**.** Function
b7d0: 20 63 61 6c 6c 73 20 61 72 65 20 63 68 65 63 6b   calls are check
b7e0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
b7f0: 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f  that the functio
b800: 6e 20 69 73 20 0a 2a 2a 20 64 65 66 69 6e 65 64  n is .** defined
b810: 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 63 6f   and that the co
b820: 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20  rrect number of 
b830: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70  arguments are sp
b840: 65 63 69 66 69 65 64 2e 0a 2a 2a 20 49 66 20 74  ecified..** If t
b850: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  he function is a
b860: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
b870: 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 4e  tion, then the N
b880: 43 5f 48 61 73 41 67 67 20 66 6c 61 67 20 69 73  C_HasAgg flag is
b890: 0a 2a 2a 20 73 65 74 20 61 6e 64 20 74 68 65 20  .** set and the 
b8a0: 6f 70 63 6f 64 65 20 69 73 20 63 68 61 6e 67 65  opcode is change
b8b0: 64 20 66 72 6f 6d 20 54 4b 5f 46 55 4e 43 54 49  d from TK_FUNCTI
b8c0: 4f 4e 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ON to TK_AGG_FUN
b8d0: 43 54 49 4f 4e 2e 0a 2a 2a 20 49 66 20 61 6e 20  CTION..** If an 
b8e0: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
b8f0: 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ins aggregate fu
b900: 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 74 68 65  nctions then the
b910: 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65   EP_Agg.** prope
b920: 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65  rty on the expre
b930: 73 73 69 6f 6e 20 69 73 20 73 65 74 2e 0a 2a 2a  ssion is set..**
b940: 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 6d 65 73  .** An error mes
b950: 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20  sage is left in 
b960: 70 50 61 72 73 65 20 69 66 20 61 6e 79 74 68 69  pParse if anythi
b970: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 54 68  ng is amiss.  Th
b980: 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 69 66 20 65  e number.** if e
b990: 72 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65  rrors is returne
b9a0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
b9b0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
b9c0: 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  s( .  NameContex
b9d0: 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a  t *pNC,       /*
b9e0: 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65   Namespace to re
b9f0: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
ba00: 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20  s in. */.  Expr 
ba10: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20  *pExpr          
ba20: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
ba30: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
ba40: 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  zed. */.){.  u8 
ba50: 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20 57  savedHasAgg;.  W
ba60: 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 69 66 28 20  alker w;..  if( 
ba70: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
ba80: 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  n 0;.#if SQLITE_
ba90: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
baa0: 0a 20 20 7b 0a 20 20 20 20 50 61 72 73 65 20 2a  .  {.    Parse *
bab0: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
bac0: 61 72 73 65 3b 0a 20 20 20 20 69 66 28 20 73 71  arse;.    if( sq
bad0: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65  lite3ExprCheckHe
bae0: 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 45 78  ight(pParse, pEx
baf0: 70 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d  pr->nHeight+pNC-
bb00: 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74  >pParse->nHeight
bb10: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
bb20: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  n 1;.    }.    p
bb30: 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b  Parse->nHeight +
bb40: 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74  = pExpr->nHeight
bb50: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
bb60: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
bb70: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48  ->ncFlags & NC_H
bb80: 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 6e 63  asAgg;.  pNC->nc
bb90: 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 48 61 73  Flags &= ~NC_Has
bba0: 41 67 67 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  Agg;.  memset(&w
bbb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
bbc0: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
bbd0: 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72  ck = resolveExpr
bbe0: 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Step;.  w.xSelec
bbf0: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f  tCallback = reso
bc00: 6c 76 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20  lveSelectStep;. 
bc10: 20 77 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d   w.pParse = pNC-
bc20: 3e 70 50 61 72 73 65 3b 0a 20 20 77 2e 75 2e 70  >pParse;.  w.u.p
bc30: 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71 6c 69  NC = pNC;.  sqli
bc40: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
bc50: 70 45 78 70 72 29 3b 0a 23 69 66 20 53 51 4c 49  pExpr);.#if SQLI
bc60: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
bc70: 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73  H>0.  pNC->pPars
bc80: 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20 70 45  e->nHeight -= pE
bc90: 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65  xpr->nHeight;.#e
bca0: 6e 64 69 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e  ndif.  if( pNC->
bcb0: 6e 45 72 72 3e 30 20 7c 7c 20 77 2e 70 50 61 72  nErr>0 || w.pPar
bcc0: 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
bcd0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
bce0: 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f  y(pExpr, EP_Erro
bcf0: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  r);.  }.  if( pN
bd00: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
bd10: 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78  HasAgg ){.    Ex
bd20: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
bd30: 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20  xpr, EP_Agg);.  
bd40: 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65 64 48  }else if( savedH
bd50: 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43  asAgg ){.    pNC
bd60: 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  ->ncFlags |= NC_
bd70: 48 61 73 41 67 67 3b 0a 20 20 7d 0a 20 20 72 65  HasAgg;.  }.  re
bd80: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
bd90: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
bda0: 72 72 6f 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rror);.}.../*.**
bdb0: 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d   Resolve all nam
bdc0: 65 73 20 69 6e 20 61 6c 6c 20 65 78 70 72 65 73  es in all expres
bdd0: 73 69 6f 6e 73 20 6f 66 20 61 20 53 45 4c 45 43  sions of a SELEC
bde0: 54 20 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a 2a 20  T and in all.** 
bdf0: 64 65 63 65 6e 64 65 6e 74 73 20 6f 66 20 74 68  decendents of th
be00: 65 20 53 45 4c 45 43 54 2c 20 69 6e 63 6c 75 64  e SELECT, includ
be10: 69 6e 67 20 63 6f 6d 70 6f 75 6e 64 73 20 6f 66  ing compounds of
be20: 66 20 6f 66 20 70 2d 3e 70 50 72 69 6f 72 2c 0a  f of p->pPrior,.
be30: 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  ** subqueries in
be40: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 61 6e   expressions, an
be50: 64 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  d subqueries use
be60: 64 20 61 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  d as FROM clause
be70: 0a 2a 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  .** terms..**.**
be80: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 73 6f   See sqlite3Reso
be90: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 66  lveExprNames() f
bea0: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
beb0: 20 6f 66 20 74 68 65 20 6b 69 6e 64 73 20 6f 66   of the kinds of
bec0: 0a 2a 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  .** transformati
bed0: 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72 2e 0a  ons that occur..
bee0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45 43 54  **.** All SELECT
bef0: 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75   statements shou
bf00: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 65 78 70  ld have been exp
bf10: 61 6e 64 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  anded using.** s
bf20: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
bf30: 6e 64 28 29 20 70 72 69 6f 72 20 74 6f 20 69 6e  nd() prior to in
bf40: 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
bf50: 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ine..*/.void sql
bf60: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
bf70: 74 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  tNames(.  Parse 
bf80: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
bf90: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
bfa0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
bfb0: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
bfc0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
bfd0: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
bfe0: 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
bff0: 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
c000: 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
c010: 65 78 74 20 66 6f 72 20 70 61 72 65 6e 74 20 53  ext for parent S
c020: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
c030: 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  */.){.  Walker w
c040: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
c050: 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77  0 );.  memset(&w
c060: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b  , 0, sizeof(w));
c070: 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61  .  w.xExprCallba
c080: 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72  ck = resolveExpr
c090: 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Step;.  w.xSelec
c0a0: 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f  tCallback = reso
c0b0: 6c 76 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20  lveSelectStep;. 
c0c0: 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
c0d0: 73 65 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20  se;.  w.u.pNC = 
c0e0: 70 4f 75 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69  pOuterNC;.  sqli
c0f0: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
c100: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
c110: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
c120: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
c130: 20 63 61 6e 20 6f 6e 6c 79 20 72 65 66 65 72 65   can only refere
c140: 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nce a single tab
c150: 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  le:.**.**    *  
c160: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
c170: 74 73 0a 2a 2a 20 20 20 20 2a 20 20 20 57 48 45  ts.**    *   WHE
c180: 52 45 20 63 6c 61 75 73 65 73 20 6f 6e 20 70 61  RE clauses on pa
c190: 72 74 69 61 6c 20 69 6e 64 69 63 65 73 0a 2a 2a  rtial indices.**
c1a0: 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 54 61  .** The Expr.iTa
c1b0: 62 6c 65 20 76 61 6c 75 65 20 66 6f 72 20 45 78  ble value for Ex
c1c0: 70 72 2e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  pr.op==TK_COLUMN
c1d0: 20 6e 6f 64 65 73 20 6f 66 20 74 68 65 20 65 78   nodes of the ex
c1e0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 73  pression.** is s
c1f0: 65 74 20 74 6f 20 2d 31 20 61 6e 64 20 74 68 65  et to -1 and the
c200: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
c210: 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  lue is set to th
c220: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e  e column number.
c230: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 72 72 6f 72  .**.** Any error
c240: 73 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72  s cause an error
c250: 20 6d 65 73 73 61 67 65 20 74 6f 20 62 65 20 73   message to be s
c260: 65 74 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f  et in pParse..*/
c270: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
c280: 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
c290: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
c2a0: 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73  se,      /* Pars
c2b0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
c2c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20   Table *pTab,   
c2d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
c2e0: 65 20 62 65 69 6e 67 20 72 65 66 65 72 65 6e 63  e being referenc
c2f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65  ed */.  int type
c300: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
c310: 43 5f 49 73 43 68 65 63 6b 20 6f 72 20 4e 43 5f  C_IsCheck or NC_
c320: 50 61 72 74 49 64 78 20 2a 2f 0a 20 20 45 78 70  PartIdx */.  Exp
c330: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
c340: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
c350: 6f 20 72 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20  o resolve.  May 
c360: 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 45 78  be NULL. */.  Ex
c370: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
c380: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
c390: 6c 69 73 74 20 74 6f 20 72 65 73 6f 6c 76 65 2e  list to resolve.
c3a0: 20 20 4d 61 79 20 62 65 20 4e 55 4c 2e 20 2a 2f    May be NUL. */
c3b0: 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 73 53  .){.  SrcList sS
c3c0: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
c3d0: 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72        /* Fake Sr
c3e0: 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73 65  cList for pParse
c3f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20  ->pNewTable */. 
c400: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43   NameContext sNC
c410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c420: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
c430: 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65   for pParse->pNe
c440: 77 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  wTable */.  int 
c450: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c460: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c470: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
c480: 20 20 61 73 73 65 72 74 28 20 74 79 70 65 3d 3d    assert( type==
c490: 4e 43 5f 49 73 43 68 65 63 6b 20 7c 7c 20 74 79  NC_IsCheck || ty
c4a0: 70 65 3d 3d 4e 43 5f 50 61 72 74 49 64 78 20 29  pe==NC_PartIdx )
c4b0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c  ;.  memset(&sNC,
c4c0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29   0, sizeof(sNC))
c4d0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63  ;.  memset(&sSrc
c4e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63  , 0, sizeof(sSrc
c4f0: 29 29 3b 0a 20 20 73 53 72 63 2e 6e 53 72 63 20  ));.  sSrc.nSrc 
c500: 3d 20 31 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d  = 1;.  sSrc.a[0]
c510: 2e 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a  .zName = pTab->z
c520: 4e 61 6d 65 3b 0a 20 20 73 53 72 63 2e 61 5b 30  Name;.  sSrc.a[0
c530: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ].pTab = pTab;. 
c540: 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73   sSrc.a[0].iCurs
c550: 6f 72 20 3d 20 2d 31 3b 0a 20 20 73 4e 43 2e 70  or = -1;.  sNC.p
c560: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
c570: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
c580: 20 26 73 53 72 63 3b 0a 20 20 73 4e 43 2e 6e 63   &sSrc;.  sNC.nc
c590: 46 6c 61 67 73 20 3d 20 74 79 70 65 3b 0a 20 20  Flags = type;.  
c5a0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
c5b0: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
c5c0: 2c 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72  , pExpr) ) retur
c5d0: 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  n;.  if( pList )
c5e0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
c5f0: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
c600: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c610: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
c620: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c 69  rNames(&sNC, pLi
c630: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
c640: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c650: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
c660: 0a 20 20 7d 0a 7d 0a                             .  }.}.