/ Hex Artifact Content
Login

Artifact f0c6db38b85433a5cbb85f1591c708707f58ead1:


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 65 6c 73  rTab;.      }els
32a0: 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  e{.        pTab 
32b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
32c0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20      if( pTab ){ 
32d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
32e0: 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65  l;.        pSche
32f0: 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65  ma = pTab->pSche
3300: 6d 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54  ma;.        cntT
3310: 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f  ab++;.        fo
3320: 72 28 69 43 6f 6c 3d 30 2c 20 70 43 6f 6c 3d 70  r(iCol=0, pCol=p
3330: 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 43 6f 6c 3c  Tab->aCol; iCol<
3340: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c  pTab->nCol; iCol
3350: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
3360: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
3370: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
3380: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
3390: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
33a0: 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69  f( iCol==pTab->i
33b0: 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  PKey ){.        
33c0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b        iCol = -1;
33d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33e0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
33f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3400: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3410: 69 66 28 20 69 43 6f 6c 3e 3d 70 54 61 62 2d 3e  if( iCol>=pTab->
3420: 6e 43 6f 6c 20 26 26 20 73 71 6c 69 74 65 33 49  nCol && sqlite3I
3430: 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 26 26 20  sRowid(zCol) && 
3440: 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29  HasRowid(pTab) )
3450: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  {.          /* I
3460: 4d 50 3a 20 52 2d 32 34 33 30 39 2d 31 38 36 32  MP: R-24309-1862
3470: 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2f  5 */.          /
3480: 2a 20 49 4d 50 3a 20 52 2d 34 34 39 31 31 2d 35  * IMP: R-44911-5
3490: 35 31 32 34 20 2a 2f 0a 20 20 20 20 20 20 20 20  5124 */.        
34a0: 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20    iCol = -1;.   
34b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
34c0: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
34d0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
34e0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
34f0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
3500: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
3510: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
3520: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
3530: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
3540: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
3550: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
3560: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
3570: 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Col==31 );.     
3580: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
3590: 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20   iCol==32 );.   
35a0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
35b0: 3e 6f 6c 64 6d 61 73 6b 20 7c 3d 20 28 69 43 6f  >oldmask |= (iCo
35c0: 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66  l>=32 ? 0xffffff
35d0: 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c  ff : (((u32)1)<<
35e0: 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  iCol));.        
35f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
3600: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
3610: 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Col==31 );.     
3620: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
3630: 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20   iCol==32 );.   
3640: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
3650: 3e 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69 43 6f  >newmask |= (iCo
3660: 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66  l>=32 ? 0xffffff
3670: 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c  ff : (((u32)1)<<
3680: 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  iCol));.        
3690: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 45    }.          pE
36a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
36b0: 69 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20  i16)iCol;.      
36c0: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
36d0: 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
36e0: 20 20 69 73 54 72 69 67 67 65 72 20 3d 20 31 3b    isTrigger = 1;
36f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3700: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20   }.    }.#endif 
3710: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
3720: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
3730: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
3740: 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  ** Perhaps the n
3750: 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e  ame is a referen
3760: 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a  ce to the ROWID.
3770: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
3780: 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d  nt==0 && cntTab=
3790: 3d 31 20 26 26 20 70 4d 61 74 63 68 20 26 26 20  =1 && pMatch && 
37a0: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
37b0: 43 6f 6c 29 0a 20 20 20 20 20 26 26 20 48 61 73  Col).     && Has
37c0: 52 6f 77 69 64 28 70 4d 61 74 63 68 2d 3e 70 54  Rowid(pMatch->pT
37d0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  ab) ){.      cnt
37e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70   = 1;.      pExp
37f0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
3800: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
3810: 34 39 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20  4911-55124 */.  
3820: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
3830: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
3840: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a  _INTEGER;.    }.
3850: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
3860: 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f  f the input is o
3870: 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f  f the form Z (no
3880: 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20  t Y.Z or X.Y.Z) 
3890: 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a  then the name Z.
38a0: 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66      ** might ref
38b0: 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d  er to an result-
38c0: 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73  set alias.  This
38d0: 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
38e0: 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20  ample, when.    
38f0: 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76  ** we are resolv
3900: 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  ing names in the
3910: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
3920: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
3930: 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20  ommand:.    **. 
3940: 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
3950: 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74   a+b AS x FROM t
3960: 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b  able WHERE x<10;
3970: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3980: 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  n cases like thi
3990: 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70 72  s, replace pExpr
39a0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
39b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
39c0: 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73  hat.    ** forms
39d0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
39e0: 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20  entry ("a+b" in 
39f0: 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64  the example) and
3a00: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
3a10: 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65  ely..    ** Note
3a20: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
3a30: 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75  sion in the resu
3a40: 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61  lt set should ha
3a50: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
3a60: 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20      ** resolved 
3a70: 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
3a80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
3a90: 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2a  resolved..    **
3aa0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 62 69 6c  .    ** The abil
3ab0: 69 74 79 20 74 6f 20 75 73 65 20 61 6e 20 6f 75  ity to use an ou
3ac0: 74 70 75 74 20 72 65 73 75 6c 74 2d 73 65 74 20  tput result-set 
3ad0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 57 48  column in the WH
3ae0: 45 52 45 2c 20 47 52 4f 55 50 20 42 59 2c 0a 20  ERE, GROUP BY,. 
3af0: 20 20 20 2a 2a 20 6f 72 20 48 41 56 49 4e 47 20     ** or HAVING 
3b00: 63 6c 61 75 73 65 73 2c 20 6f 72 20 61 73 20 70  clauses, or as p
3b10: 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20  art of a larger 
3b20: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
3b30: 65 20 4f 52 44 52 45 20 42 59 0a 20 20 20 20 2a  e ORDRE BY.    *
3b40: 2a 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  * clause is not 
3b50: 73 74 61 6e 64 61 72 64 20 53 51 4c 2e 20 20 54  standard SQL.  T
3b60: 68 69 73 20 69 73 20 61 20 28 67 6f 6f 66 79 29  his is a (goofy)
3b70: 20 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f   SQLite extensio
3b80: 6e 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  n, that.    ** i
3b90: 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  s supported for 
3ba0: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
3bb0: 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e 20 20 54  ibility only.  T
3bc0: 4f 20 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  O DO: Issue a wa
3bd0: 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  rning.    ** on 
3be0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 77 68  sqlite3_log() wh
3bf0: 65 6e 65 76 65 72 20 74 68 65 20 63 61 70 61 62  enever the capab
3c00: 69 6c 69 74 79 20 69 73 20 75 73 65 64 2e 0a 20  ility is used.. 
3c10: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
3c20: 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c  EList = pNC->pEL
3c30: 69 73 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20  ist)!=0.     && 
3c40: 7a 54 61 62 3d 3d 30 0a 20 20 20 20 20 26 26 20  zTab==0.     && 
3c50: 63 6e 74 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  cnt==0.    ){.  
3c60: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3c70: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
3c80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
3c90: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
3ca0: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3cb0: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
3cc0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
3cd0: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
3ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
3cf0: 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 20   *pOrig;.       
3d00: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
3d10: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
3d20: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
3d30: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
3d40: 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt( pExpr->x.pLi
3d50: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st==0 );.       
3d60: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
3d70: 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ->x.pSelect==0 )
3d80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 69  ;.          pOri
3d90: 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  g = pEList->a[j]
3da0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
3db0: 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
3dc0: 61 67 73 26 4e 43 5f 41 6c 6c 6f 77 41 67 67 29  ags&NC_AllowAgg)
3dd0: 3d 3d 30 20 26 26 20 45 78 70 72 48 61 73 50 72  ==0 && ExprHasPr
3de0: 6f 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45 50  operty(pOrig, EP
3df0: 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20  _Agg) ){.       
3e00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3e10: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
3e20: 73 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64 20  suse of aliased 
3e30: 61 67 67 72 65 67 61 74 65 20 25 73 22 2c 20 7a  aggregate %s", z
3e40: 41 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  As);.           
3e50: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
3e60: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
3e70: 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65           resolve
3e80: 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45  Alias(pParse, pE
3e90: 4c 69 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c 20  List, j, pExpr, 
3ea0: 22 22 2c 20 6e 53 75 62 71 75 65 72 79 29 3b 0a  "", nSubquery);.
3eb0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20            cnt = 
3ec0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  1;.          pMa
3ed0: 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
3ee0: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
3ef0: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
3f00: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c            goto l
3f10: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20  ookupname_end;. 
3f20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3f30: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20   .    }..    /* 
3f40: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3f50: 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ext name context
3f60: 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  .  The loop will
3f70: 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65   exit when eithe
3f80: 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65  r.    ** we have
3f90: 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29   a match (cnt>0)
3fa0: 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20   or when we run 
3fb0: 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74  out of name cont
3fc0: 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  exts..    */.   
3fd0: 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20   if( cnt==0 ){. 
3fe0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
3ff0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 6e 53 75  pNext;.      nSu
4000: 62 71 75 65 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a  bquery++;.    }.
4010: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
4020: 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55  f X and Y are NU
4030: 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  LL (in other wor
4040: 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63  ds if only the c
4050: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a  olumn name Z is.
4060: 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61    ** supplied) a
4070: 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
4080: 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  Z is enclosed in
4090: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20   double-quotes, 
40a0: 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61  then.  ** Z is a
40b0: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
40c0: 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61  if it doesn't ma
40d0: 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e  tch any column n
40e0: 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20  ames.  In that. 
40f0: 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65   ** case, we nee
4100: 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68  d to return righ
4110: 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d  t away and not m
4120: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ake any changes 
4130: 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20  to.  ** pExpr.. 
4140: 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65   **.  ** Because
4150: 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
4160: 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20  s made to outer 
4170: 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e  contexts, the pN
4180: 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65  C->nRef.  ** fie
4190: 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e  lds are not chan
41a0: 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65  ged in any conte
41b0: 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  xt..  */.  if( c
41c0: 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  nt==0 && zTab==0
41d0: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
41e0: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 44 62 6c  rty(pExpr,EP_Dbl
41f0: 51 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 70  Quoted) ){.    p
4200: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54  Expr->op = TK_ST
4210: 52 49 4e 47 3b 0a 20 20 20 20 70 45 78 70 72 2d  RING;.    pExpr-
4220: 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 72  >pTab = 0;.    r
4230: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
4240: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4250: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
4260: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
4270: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
4280: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
4290: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
42a0: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
42b0: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
42c0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
42d0: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  t!=1 ){.    cons
42e0: 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
42f0: 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20    zErr = cnt==0 
4300: 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  ? "no such colum
4310: 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20  n" : "ambiguous 
4320: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20  column name";.  
4330: 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20    if( zDb ){.   
4340: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4350: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
4360: 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c  %s.%s.%s", zErr,
4370: 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c   zDb, zTab, zCol
4380: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
4390: 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73   zTab ){.      s
43a0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
43b0: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
43c0: 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20  s", zErr, zTab, 
43d0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zCol);.    }else
43e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
43f0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4400: 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20  "%s: %s", zErr, 
4410: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
4420: 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
4430: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 70 54  hema = 1;.    pT
4440: 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  opNC->nErr++;.  
4450: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c  }..  /* If a col
4460: 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  umn from a table
4470: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20   in pSrcList is 
4480: 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e  referenced, then
4490: 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69   record.  ** thi
44a0: 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53  s fact in the pS
44b0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
44c0: 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c  ed bitmask.  Col
44d0: 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a  umn 0 causes.  *
44e0: 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65  * bit 0 to be se
44f0: 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74  t.  Column 1 set
4500: 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f  s bit 1.  And so
4510: 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a   forth.  If the.
4520: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    ** column numb
4530: 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
4540: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  an the number of
4550: 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74   bits in the bit
4560: 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73  mask.  ** then s
4570: 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65  et the high-orde
4580: 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74  r bit of the bit
4590: 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mask..  */.  if(
45a0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
45b0: 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20  =0 && pMatch!=0 
45c0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
45d0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
45e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
45f0: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 69 66 28  BMS-1 );.    if(
4600: 20 6e 3e 3d 42 4d 53 20 29 7b 0a 20 20 20 20 20   n>=BMS ){.     
4610: 20 6e 20 3d 20 42 4d 53 2d 31 3b 0a 20 20 20 20   n = BMS-1;.    
4620: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  }.    assert( pM
4630: 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70  atch->iCursor==p
4640: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
4650: 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55      pMatch->colU
4660: 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b  sed |= ((Bitmask
4670: 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  )1)<<n;.  }..  /
4680: 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72  * Clean up and r
4690: 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
46a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
46b0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  b, pExpr->pLeft)
46c0: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
46d0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
46e0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
46f0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
4700: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
4710: 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  0;.  pExpr->op =
4720: 20 28 69 73 54 72 69 67 67 65 72 20 3f 20 54 4b   (isTrigger ? TK
4730: 5f 54 52 49 47 47 45 52 20 3a 20 54 4b 5f 43 4f  _TRIGGER : TK_CO
4740: 4c 55 4d 4e 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d  LUMN);.lookupnam
4750: 65 5f 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e 74  e_end:.  if( cnt
4760: 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==1 ){.    asser
4770: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  t( pNC!=0 );.   
4780: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
4790: 54 4b 5f 41 53 20 29 7b 0a 20 20 20 20 20 20 73  TK_AS ){.      s
47a0: 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70  qlite3AuthRead(p
47b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
47c0: 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63  chema, pNC->pSrc
47d0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
47e0: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
47f0: 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20  e nRef value on 
4800: 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  all name context
4810: 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20  s from TopNC up 
4820: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f  to.    ** the po
4830: 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e 61  int where the na
4840: 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20  me matched. */. 
4850: 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
4860: 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43    assert( pTopNC
4870: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f  !=0 );.      pTo
4880: 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pNC->nRef++;.   
4890: 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70     if( pTopNC==p
48a0: 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  NC ) break;.    
48b0: 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e    pTopNC = pTopN
48c0: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  C->pNext;.    }.
48d0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
48e0: 72 75 6e 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rune;.  } else {
48f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
4900: 41 62 6f 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Abort;.  }.}../*
4910: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
4920: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
4930: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
4940: 6f 6e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 63  on to load the c
4950: 6f 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72  olumn iCol.** fr
4960: 6f 6d 20 64 61 74 61 73 6f 75 72 63 65 20 69 53  om datasource iS
4970: 72 63 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53  rc in SrcList pS
4980: 72 63 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  rc..*/.Expr *sql
4990: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
49a0: 45 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Expr(sqlite3 *db
49b0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c  , SrcList *pSrc,
49c0: 20 69 6e 74 20 69 53 72 63 2c 20 69 6e 74 20 69   int iSrc, int i
49d0: 43 6f 6c 29 7b 0a 20 20 45 78 70 72 20 2a 70 20  Col){.  Expr *p 
49e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
49f0: 6f 63 28 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e  oc(db, TK_COLUMN
4a00: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  , 0, 0);.  if( p
4a10: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
4a20: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
4a30: 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 53  em = &pSrc->a[iS
4a40: 72 63 5d 3b 0a 20 20 20 20 70 2d 3e 70 54 61 62  rc];.    p->pTab
4a50: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
4a60: 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
4a70: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
4a80: 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62 2d      if( p->pTab-
4a90: 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a  >iPKey==iCol ){.
4aa0: 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e        p->iColumn
4ab0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
4ac0: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75  {.      p->iColu
4ad0: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69 43 6f 6c  mn = (ynVar)iCol
4ae0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4af0: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
4b00: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4b10: 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
4b20: 20 20 20 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73      pItem->colUs
4b30: 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  ed |= ((Bitmask)
4b40: 31 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d 53 20 3f  1)<<(iCol>=BMS ?
4b50: 20 42 4d 53 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a   BMS-1 : iCol);.
4b60: 20 20 20 20 7d 0a 20 20 20 20 45 78 70 72 53 65      }.    ExprSe
4b70: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
4b80: 52 65 73 6f 6c 76 65 64 29 3b 0a 20 20 7d 0a 20  Resolved);.  }. 
4b90: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
4ba0: 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72  .** Report an er
4bb0: 72 6f 72 20 74 68 61 74 20 61 6e 20 65 78 70 72  ror that an expr
4bc0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61  ession is not va
4bd0: 6c 69 64 20 66 6f 72 20 61 20 70 61 72 74 69 61  lid for a partia
4be0: 6c 20 69 6e 64 65 78 20 57 48 45 52 45 0a 2a 2a  l index WHERE.**
4bf0: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
4c00: 69 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69 64  ic void notValid
4c10: 50 61 72 74 49 64 78 57 68 65 72 65 28 0a 20 20  PartIdxWhere(.  
4c20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4c30: 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 65 72       /* Leave er
4c40: 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72 65  ror message here
4c50: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
4c60: 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68  t *pNC,    /* Th
4c70: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 2a  e name context *
4c80: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4c90: 7a 4d 73 67 20 20 20 20 20 2f 2a 20 54 79 70 65  zMsg     /* Type
4ca0: 20 6f 66 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a   of error */.){.
4cb0: 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
4cc0: 61 67 73 20 26 20 4e 43 5f 50 61 72 74 49 64 78  ags & NC_PartIdx
4cd0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4ce0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4cf0: 73 65 2c 20 22 25 73 20 70 72 6f 68 69 62 69 74  se, "%s prohibit
4d00: 65 64 20 69 6e 20 70 61 72 74 69 61 6c 20 69 6e  ed in partial in
4d10: 64 65 78 20 57 48 45 52 45 20 63 6c 61 75 73 65  dex WHERE clause
4d20: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
4d30: 20 20 20 20 20 20 20 20 7a 4d 73 67 29 3b 0a 20          zMsg);. 
4d40: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
4d50: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
4d60: 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20  /*.** Report an 
4d70: 65 72 72 6f 72 20 74 68 61 74 20 61 6e 20 65 78  error that an ex
4d80: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
4d90: 76 61 6c 69 64 20 66 6f 72 20 61 20 43 48 45 43  valid for a CHEC
4da0: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f  K constraint..*/
4db0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 74  .static void not
4dc0: 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72  ValidCheckConstr
4dd0: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
4de0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
4df0: 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  Leave error mess
4e00: 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 4e 61  age here */.  Na
4e10: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
4e20: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
4e30: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
4e40: 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 20 20 20  t char *zMsg    
4e50: 20 2f 2a 20 54 79 70 65 20 6f 66 20 65 72 72 6f   /* Type of erro
4e60: 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 28 70  r */.){.  if( (p
4e70: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
4e80: 5f 49 73 43 68 65 63 6b 29 21 3d 30 20 29 7b 0a  _IsCheck)!=0 ){.
4e90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4ea0: 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 70  Msg(pParse,"%s p
4eb0: 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45  rohibited in CHE
4ec0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 2c  CK constraints",
4ed0: 20 7a 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65   zMsg);.  }.}.#e
4ee0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6e 6f 74  lse.# define not
4ef0: 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72  ValidCheckConstr
4f00: 61 69 6e 74 28 50 2c 4e 2c 4d 29 0a 23 65 6e 64  aint(P,N,M).#end
4f10: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73  if../*.** Expres
4f20: 73 69 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65 6e  sion p should en
4f30: 63 6f 64 65 20 61 20 66 6c 6f 61 74 69 6e 67 20  code a floating 
4f40: 70 6f 69 6e 74 20 76 61 6c 75 65 20 62 65 74 77  point value betw
4f50: 65 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e  een 1.0 and 0.0.
4f60: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 30 32 34 20  .** Return 1024 
4f70: 74 69 6d 65 73 20 74 68 69 73 20 76 61 6c 75 65  times this value
4f80: 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20  .  Or return -1 
4f90: 69 66 20 70 20 69 73 20 6e 6f 74 20 61 20 66 6c  if p is not a fl
4fa0: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
4fb0: 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e  value between 1.
4fc0: 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74  0 and 0.0..*/.st
4fd0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 50 72 6f  atic int exprPro
4fe0: 62 61 62 69 6c 69 74 79 28 45 78 70 72 20 2a 70  bability(Expr *p
4ff0: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d 20  ){.  double r = 
5000: 2d 31 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  -1.0;.  if( p->o
5010: 70 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65  p!=TK_FLOAT ) re
5020: 74 75 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69 74  turn -1;.  sqlit
5030: 65 33 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b  e3AtoF(p->u.zTok
5040: 65 6e 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53  en, &r, sqlite3S
5050: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
5060: 6b 65 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  ken), SQLITE_UTF
5070: 38 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 3e  8);.  assert( r>
5080: 3d 30 2e 30 20 29 3b 0a 20 20 69 66 28 20 72 3e  =0.0 );.  if( r>
5090: 31 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  1.0 ) return -1;
50a0: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28  .  return (int)(
50b0: 72 2a 31 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a  r*1000.0);.}../*
50c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
50d0: 20 69 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72   is callback for
50e0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
50f0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76  ()..**.** Resolv
5100: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  e symbolic names
5110: 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20   into TK_COLUMN 
5120: 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68  operators for th
5130: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64  e current.** nod
5140: 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  e in the express
5150: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
5160: 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  n 0 to continue 
5170: 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a  the search down.
5180: 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32  ** the tree or 2
5190: 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72   to abort the tr
51a0: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ee walk..**.** T
51b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
51c0: 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63   does error chec
51d0: 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65  king and name re
51e0: 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  solution for.** 
51f0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20  function names. 
5200: 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f   The operator fo
5210: 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
5220: 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64  tions is changed
5230: 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55  .** to TK_AGG_FU
5240: 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69  NCTION..*/.stati
5250: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 45 78 70  c int resolveExp
5260: 72 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70 57  rStep(Walker *pW
5270: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
5280: 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  pr){.  NameConte
5290: 78 74 20 2a 70 4e 43 3b 0a 20 20 50 61 72 73 65  xt *pNC;.  Parse
52a0: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 70 4e 43   *pParse;..  pNC
52b0: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
52c0: 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
52d0: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 20  !=0 );.  pParse 
52e0: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
52f0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
5300: 3d 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  =pWalker->pParse
5310: 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48   );..  if( ExprH
5320: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
5330: 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20 29  , EP_Resolved) )
5340: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
5350: 65 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70  e;.  ExprSetProp
5360: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
5370: 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65  esolved);.#ifnde
5380: 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70  f NDEBUG.  if( p
5390: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20  NC->pSrcList && 
53a0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e  pNC->pSrcList->n
53b0: 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53  Alloc>0 ){.    S
53c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
53d0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
53e0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
53f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d   for(i=0; i<pNC-
5400: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  >pSrcList->nSrc;
5410: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   i++){.      ass
5420: 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61  ert( pSrcList->a
5430: 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26  [i].iCursor>=0 &
5440: 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  & pSrcList->a[i]
5450: 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d  .iCursor<pParse-
5460: 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20  >nTab);.    }.  
5470: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  }.#endif.  switc
5480: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
5490: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
54a0: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
54b0: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20  E_DELETE_LIMIT) 
54c0: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
54d0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
54e0: 29 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65  ).    /* The spe
54f0: 63 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 54 4b  cial operator TK
5500: 5f 52 4f 57 20 6d 65 61 6e 73 20 75 73 65 20 74  _ROW means use t
5510: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
5520: 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 63 6f   first.    ** co
5530: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f 4d  lumn in the FROM
5540: 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 69   clause.  This i
5550: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4c 49  s used by the LI
5560: 4d 49 54 20 61 6e 64 20 4f 52 44 45 52 20 42 59  MIT and ORDER BY
5570: 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 70  .    ** clause p
5580: 72 6f 63 65 73 73 69 6e 67 20 6f 6e 20 55 50 44  rocessing on UPD
5590: 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20 73  ATE and DELETE s
55a0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
55b0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 4f  /.    case TK_RO
55c0: 57 3a 20 7b 0a 20 20 20 20 20 20 53 72 63 4c 69  W: {.      SrcLi
55d0: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
55e0: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
55f0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
5600: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
5610: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
5620: 72 63 4c 69 73 74 20 26 26 20 70 53 72 63 4c 69  rcList && pSrcLi
5630: 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  st->nSrc==1 );. 
5640: 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 53 72       pItem = pSr
5650: 63 4c 69 73 74 2d 3e 61 3b 20 0a 20 20 20 20 20  cList->a; .     
5660: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
5670: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45  COLUMN;.      pE
5680: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 49 74 65  xpr->pTab = pIte
5690: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70  m->pTab;.      p
56a0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
56b0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
56c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
56d0: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
56e0: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
56f0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
5700: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
5710: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
5720: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
5730: 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f  E_ENABLE_UPDATE_
5740: 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26  DELETE_LIMIT) &&
5750: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5760: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
5770: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e  */..    /* A lon
5780: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
5790: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
57a0: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
57b0: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
57c0: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b       return look
57d0: 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30  upName(pParse, 0
57e0: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
57f0: 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72  oken, pNC, pExpr
5800: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
5810: 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20  /* A table name 
5820: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  and column name:
5830: 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a       ID.ID.    *
5840: 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c  * Or a database,
5850: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
5860: 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20  n:  ID.ID.ID.   
5870: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
5880: 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  DOT: {.      con
5890: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
58a0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
58b0: 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
58c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
58d0: 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
58e0: 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  Right;..      /*
58f0: 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30   if( pSrcList==0
5900: 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20   ) break; */.   
5910: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
5920: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
5930: 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d   if( pRight->op=
5940: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
5950: 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20    zDb = 0;.     
5960: 20 20 20 7a 54 61 62 6c 65 20 3d 20 70 45 78 70     zTable = pExp
5970: 72 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  r->pLeft->u.zTok
5980: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  en;.        zCol
5990: 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e  umn = pRight->u.
59a0: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65  zToken;.      }e
59b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
59c0: 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d  ert( pRight->op=
59d0: 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20  =TK_DOT );.     
59e0: 20 20 20 7a 44 62 20 3d 20 70 45 78 70 72 2d 3e     zDb = pExpr->
59f0: 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pLeft->u.zToken;
5a00: 0a 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20  .        zTable 
5a10: 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d  = pRight->pLeft-
5a20: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
5a30: 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69     zColumn = pRi
5a40: 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a  ght->pRight->u.z
5a50: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  Token;.      }. 
5a60: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b       return look
5a70: 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  upName(pParse, z
5a80: 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c  Db, zTable, zCol
5a90: 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29  umn, pNC, pExpr)
5aa0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5ab0: 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  Resolve function
5ac0: 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20   names.    */.  
5ad0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
5ae0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
5af0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
5b00: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  xpr->x.pList;   
5b10: 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
5b20: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69   list */.      i
5b30: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70  nt n = pList ? p
5b40: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
5b50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5b60: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5b70: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
5b80: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
5b90: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
5ba0: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
5bb0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
5bc0: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
5bd0: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
5be0: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
5bf0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
5c00: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
5c10: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5c20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
5c30: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
5c40: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
5c50: 6e 74 20 61 75 74 68 3b 20 20 20 20 20 20 20 20  nt auth;        
5c60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75             /* Au
5c70: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75  thorization to u
5c80: 73 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  se the function 
5c90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  */.      int nId
5ca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5cb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5cc0: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
5cd0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
5ce0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5cf0: 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20  r *zId;         
5d00: 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
5d10: 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  on name. */.    
5d20: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d40: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
5d50: 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ut the function 
5d60: 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
5d70: 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
5d80: 29 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  );   /* The data
5d90: 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  base encoding */
5da0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
5db0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5dc0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
5dd0: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e  lect) );.      n
5de0: 6f 74 56 61 6c 69 64 50 61 72 74 49 64 78 57 68  otValidPartIdxWh
5df0: 65 72 65 28 70 50 61 72 73 65 2c 20 70 4e 43 2c  ere(pParse, pNC,
5e00: 20 22 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20   "functions");. 
5e10: 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
5e20: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
5e30: 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53    nId = sqlite3S
5e40: 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20  trlen30(zId);.  
5e50: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
5e60: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
5e70: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
5e80: 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b  nId, n, enc, 0);
5e90: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
5ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
5eb0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
5ec0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
5ed0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d  >db, zId, nId, -
5ee0: 32 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  2, enc, 0);.    
5ef0: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
5f00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f  ){.          no_
5f10: 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20  such_func = 1;. 
5f20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5f30: 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75          wrong_nu
5f40: 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20  m_args = 1;.    
5f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
5f60: 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  e{.        is_ag
5f70: 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d  g = pDef->xFunc=
5f80: 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
5f90: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
5fa0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
5fb0: 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
5fc0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
5fd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e  rty(pExpr, EP_Un
5fe0: 6c 69 6b 65 6c 79 7c 45 50 5f 53 6b 69 70 29 3b  likely|EP_Skip);
5ff0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
6000: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
6010: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6020: 20 3d 20 65 78 70 72 50 72 6f 62 61 62 69 6c 69   = exprProbabili
6030: 74 79 28 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  ty(pList->a[1].p
6040: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
6050: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
6060: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
6070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6080: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6090: 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74  "second argument
60a0: 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   to likelihood()
60b0: 20 6d 75 73 74 20 62 65 20 61 20 22 0a 20 20 20   must be a ".   
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 22 63 6f 6e 73 74 61 6e 74 20 62 65 74     "constant bet
60f0: 77 65 65 6e 20 30 2e 30 20 61 6e 64 20 31 2e 30  ween 0.0 and 1.0
6100: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
6110: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
6120: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6130: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49            /* EVI
6150: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33 30  DENCE-OF: R-6130
6160: 34 2d 32 39 34 34 39 20 54 68 65 20 75 6e 6c 69  4-29449 The unli
6170: 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e  kely(X) function
6180: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
6190: 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
61a0: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 20 30   likelihood(X, 0
61b0: 2e 30 36 32 35 29 2e 0a 20 20 20 20 20 20 20 20  .0625)..        
61c0: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
61d0: 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31 31 36 33  OF: R-01283-1163
61e0: 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28 58  6 The unlikely(X
61f0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 68  ) function is sh
6200: 6f 72 74 2d 68 61 6e 64 20 66 6f 72 0a 20 20 20  ort-hand for.   
6210: 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65           ** like
6220: 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36 32 35 29  lihood(X,0.0625)
6230: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
6240: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6250: 20 36 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a   62;  /* TUNING:
6260: 20 20 44 65 66 61 75 6c 74 20 32 6e 64 20 61 72    Default 2nd ar
6270: 67 20 74 6f 20 75 6e 6c 69 6b 65 6c 79 28 29 20  g to unlikely() 
6280: 69 73 20 30 2e 30 36 32 35 20 2a 2f 0a 20 20 20  is 0.0625 */.   
6290: 20 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20         }        
62a0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
62b0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
62c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
62d0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20  ORIZATION.      
62e0: 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20  if( pDef ){.    
62f0: 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74      auth = sqlit
6300: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6310: 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54  se, SQLITE_FUNCT
6320: 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e  ION, 0, pDef->zN
6330: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
6340: 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54   if( auth!=SQLIT
6350: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6360: 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49    if( auth==SQLI
6370: 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20  TE_DENY ){.     
6380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
6390: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
63a0: 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74  not authorized t
63b0: 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20  o use function: 
63c0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63e0: 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a           pDef->z
63f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
6400: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
6410: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6420: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
6430: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
6440: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
6450: 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 7d  Prune;.        }
6460: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
6470: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
6480: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
6490: 41 4e 54 20 29 20 45 78 70 72 53 65 74 50 72 6f  ANT ) ExprSetPro
64a0: 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43  perty(pExpr,EP_C
64b0: 6f 6e 73 74 61 6e 74 29 3b 0a 20 20 20 20 20 20  onstant);.      
64c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  }.#endif.      i
64d0: 66 28 20 69 73 5f 61 67 67 20 26 26 20 28 70 4e  f( is_agg && (pN
64e0: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
64f0: 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20 29 7b 0a  AllowAgg)==0 ){.
6500: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6510: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6520: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
6530: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
6540: 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b  *s()", nId,zId);
6550: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
6560: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
6570: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
6580: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
6590: 68 5f 66 75 6e 63 20 26 26 20 70 50 61 72 73 65  h_func && pParse
65a0: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
65b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
65c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
65d0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66  arse, "no such f
65e0: 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20  unction: %.*s", 
65f0: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
6600: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
6610: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6620: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29  wrong_num_args )
6630: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6640: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6650: 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  ,"wrong number o
6660: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
6670: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
6680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49  .             nI
6690: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
66a0: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
66b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
66c0: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 6e 63  is_agg ) pNC->nc
66d0: 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c  Flags &= ~NC_All
66e0: 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c  owAgg;.      sql
66f0: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
6700: 28 70 57 61 6c 6b 65 72 2c 20 70 4c 69 73 74 29  (pWalker, pList)
6710: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  ;.      if( is_a
6720: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 61  gg ){.        Na
6730: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 32 20  meContext *pNC2 
6740: 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 70  = pNC;.        p
6750: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
6760: 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20  G_FUNCTION;.    
6770: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
6780: 20 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   0;.        whil
6790: 65 28 20 70 4e 43 32 20 26 26 20 21 73 71 6c 69  e( pNC2 && !sqli
67a0: 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54  te3FunctionUsesT
67b0: 68 69 73 53 72 63 28 70 45 78 70 72 2c 20 70 4e  hisSrc(pExpr, pN
67c0: 43 32 2d 3e 70 53 72 63 4c 69 73 74 29 20 29 7b  C2->pSrcList) ){
67d0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
67e0: 2d 3e 6f 70 32 2b 2b 3b 0a 20 20 20 20 20 20 20  ->op2++;.       
67f0: 20 20 20 70 4e 43 32 20 3d 20 70 4e 43 32 2d 3e     pNC2 = pNC2->
6800: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d  pNext;.        }
6810: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 43  .        if( pNC
6820: 32 20 29 20 70 4e 43 32 2d 3e 6e 63 46 6c 61 67  2 ) pNC2->ncFlag
6830: 73 20 7c 3d 20 4e 43 5f 48 61 73 41 67 67 3b 0a  s |= NC_HasAgg;.
6840: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46          pNC->ncF
6850: 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77  lags |= NC_Allow
6860: 41 67 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Agg;.      }.   
6870: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43     /* FIX ME:  C
6880: 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66  ompute pExpr->af
6890: 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20  finity based on 
68a0: 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74  the expected ret
68b0: 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70  urn.      ** typ
68c0: 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e of the functio
68d0: 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n .      */.    
68e0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
68f0: 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ne;.    }.#ifnde
6900: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
6910: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
6920: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
6930: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 20  ase TK_EXISTS:  
6940: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
6950: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
6960: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  ;.#endif.    cas
6970: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
6980: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
6990: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
69a0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
69b0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
69c0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
69d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65  .        int nRe
69e0: 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20  f = pNC->nRef;. 
69f0: 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 43         notValidC
6a00: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70  heckConstraint(p
6a10: 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 73 75 62  Parse, pNC, "sub
6a20: 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20  queries");.     
6a30: 20 20 20 6e 6f 74 56 61 6c 69 64 50 61 72 74 49     notValidPartI
6a40: 64 78 57 68 65 72 65 28 70 50 61 72 73 65 2c 20  dxWhere(pParse, 
6a50: 70 4e 43 2c 20 22 73 75 62 71 75 65 72 69 65 73  pNC, "subqueries
6a60: 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ");.        sqli
6a70: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
6a80: 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  alker, pExpr->x.
6a90: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
6aa0: 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e    assert( pNC->n
6ab0: 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20  Ref>=nRef );.   
6ac0: 20 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70       if( nRef!=p
6ad0: 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20  NC->nRef ){.    
6ae0: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
6af0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
6b00: 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  VarSelect);.    
6b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6b20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6b30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
6b40: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 6e  IABLE: {.      n
6b50: 6f 74 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73  otValidCheckCons
6b60: 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 70  traint(pParse, p
6b70: 4e 43 2c 20 22 70 61 72 61 6d 65 74 65 72 73 22  NC, "parameters"
6b80: 29 3b 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c 69  );.      notVali
6b90: 64 50 61 72 74 49 64 78 57 68 65 72 65 28 70 50  dPartIdxWhere(pP
6ba0: 61 72 73 65 2c 20 70 4e 43 2c 20 22 70 61 72 61  arse, pNC, "para
6bb0: 6d 65 74 65 72 73 22 29 3b 0a 20 20 20 20 20 20  meters");.      
6bc0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6bd0: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 72 73  .  return (pPars
6be0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
6bf0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6c00: 6c 65 64 29 20 3f 20 57 52 43 5f 41 62 6f 72 74  led) ? WRC_Abort
6c10: 20 3a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b   : WRC_Continue;
6c20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74  .}../*.** pEList
6c30: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78   is a list of ex
6c40: 70 72 65 73 73 69 6f 6e 73 20 77 68 69 63 68 20  pressions which 
6c50: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 72  are really the r
6c60: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
6c70: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
6c80: 74 65 6d 65 6e 74 2e 20 20 70 45 20 69 73 20 61  tement.  pE is a
6c90: 20 74 65 72 6d 20 69 6e 20 61 6e 20 4f 52 44 45   term in an ORDE
6ca0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
6cb0: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 54 68 69 73   clause..** This
6cc0: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
6cd0: 74 6f 20 73 65 65 20 69 66 20 70 45 20 69 73 20  to see if pE is 
6ce0: 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66  a simple identif
6cf0: 69 65 72 20 77 68 69 63 68 20 63 6f 72 72 65 73  ier which corres
6d00: 70 6f 6e 64 73 0a 2a 2a 20 74 6f 20 74 68 65 20  ponds.** to the 
6d10: 41 53 2d 6e 61 6d 65 20 6f 66 20 6f 6e 65 20 6f  AS-name of one o
6d20: 66 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  f the terms of t
6d30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
6d40: 73 74 2e 20 20 49 66 20 69 74 20 69 73 2c 0a 2a  st.  If it is,.*
6d50: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
6d60: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
6d70: 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e   between 1 and N
6d80: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
6d90: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6c 65  number of.** ele
6da0: 6d 65 6e 74 73 20 69 6e 20 70 45 4c 69 73 74 2c  ments in pEList,
6db0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
6dc0: 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65  o the matching e
6dd0: 6e 74 72 79 2e 20 20 49 66 20 74 68 65 72 65 20  ntry.  If there 
6de0: 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20  is.** no match, 
6df0: 6f 72 20 69 66 20 70 45 20 69 73 20 6e 6f 74 20  or if pE is not 
6e00: 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66  a simple identif
6e10: 69 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ier, then this r
6e20: 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
6e30: 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61   0..**.** The sa
6e40: 6d 65 4e 61 6d 65 4f 6e 6c 79 20 66 6c 61 67 20  meNameOnly flag 
6e50: 69 73 20 73 65 74 20 69 66 20 70 45 20 63 6f 6d  is set if pE com
6e60: 65 73 20 66 72 6f 6d 20 61 20 47 52 4f 55 50 20  es from a GROUP 
6e70: 42 59 20 63 6c 61 75 73 65 2e 20 20 54 68 65 0a  BY clause.  The.
6e80: 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20  ** arguments of 
6e90: 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
6ea0: 65 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 73  e are not suppos
6eb0: 65 64 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ed to be able to
6ec0: 20 6d 61 74 63 68 0a 2a 2a 20 61 67 61 69 6e 73   match.** agains
6ed0: 74 20 41 53 20 6e 61 6d 65 73 20 69 6e 20 53 51  t AS names in SQ
6ee0: 4c 2e 20 20 42 75 74 20 65 61 72 6c 79 20 76 65  L.  But early ve
6ef0: 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
6f00: 20 61 6c 6c 6f 77 65 64 20 74 68 69 73 0a 2a 2a   allowed this.**
6f10: 20 62 65 68 61 76 69 6f 72 20 62 79 20 6d 69 73   behavior by mis
6f20: 74 61 6b 65 2e 20 20 54 6f 20 70 72 6f 76 69 64  take.  To provid
6f30: 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  e backwards comp
6f40: 61 74 69 62 69 6c 69 74 79 2c 20 61 20 47 52 4f  atibility, a GRO
6f50: 55 50 20 42 59 0a 2a 2a 20 74 65 72 6d 20 77 69  UP BY.** term wi
6f60: 6c 6c 20 6d 61 74 63 68 20 61 73 20 41 53 20 61  ll match as AS a
6f70: 6c 69 61 73 20 6f 6e 6c 79 20 69 66 20 74 68 65  lias only if the
6f80: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72   corresponding r
6f90: 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
6fa0: 73 69 6f 6e 0a 2a 2a 20 72 65 66 65 72 73 20 74  sion.** refers t
6fb0: 6f 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  o a table column
6fc0: 20 62 79 20 74 68 65 20 73 61 6d 65 20 6e 61 6d   by the same nam
6fd0: 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  e.  In other wor
6fe0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ds:.**.**       
6ff0: 20 53 45 4c 45 43 54 20 74 31 2e 78 20 41 53 20   SELECT t1.x AS 
7000: 78 2c 20 74 32 2e 78 20 41 53 20 79 20 46 52 4f  x, t2.x AS y FRO
7010: 4d 20 74 31 2c 74 32 20 47 52 4f 55 50 20 42 59  M t1,t2 GROUP BY
7020: 20 78 3b 20 20 2d 2d 20 6d 61 74 63 68 0a 2a 2a   x;  -- match.**
7030: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 74          SELECT t
7040: 31 2e 79 20 41 53 20 78 2c 20 74 32 2e 79 20 41  1.y AS x, t2.y A
7050: 53 20 79 20 46 52 4f 4d 20 74 31 2c 74 32 20 47  S y FROM t1,t2 G
7060: 52 4f 55 50 20 42 59 20 78 3b 20 20 2d 2d 20 6e  ROUP BY x;  -- n
7070: 6f 20 6d 61 74 63 68 0a 2a 2a 0a 2a 2a 20 70 45  o match.**.** pE
7080: 4c 69 73 74 20 68 61 73 20 62 65 65 6e 20 72 65  List has been re
7090: 73 6f 6c 76 65 64 2e 20 20 70 45 20 68 61 73 20  solved.  pE has 
70a0: 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  not..*/.static i
70b0: 6e 74 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65  nt resolveAsName
70c0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
70d0: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
70e0: 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72  g context for er
70f0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
7100: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
7110: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
7120: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 73  expressions to s
7130: 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  can */.  Expr *p
7140: 45 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  E,          /* E
7150: 78 70 72 65 73 73 69 6f 6e 20 77 65 20 61 72 65  xpression we are
7160: 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 74 63 68   trying to match
7170: 20 2a 2f 0a 20 20 69 6e 74 20 73 61 6d 65 4e 61   */.  int sameNa
7180: 6d 65 4f 6e 6c 79 20 20 20 2f 2a 20 4f 6e 6c 79  meOnly   /* Only
7190: 20 72 65 73 6f 6c 76 65 20 69 66 20 74 68 65 20   resolve if the 
71a0: 61 6c 69 61 73 20 6d 61 74 63 68 65 73 20 74 68  alias matches th
71b0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  e column name */
71c0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
71d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
71e0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 55   counter */..  U
71f0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
7200: 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28 20  pParse);..  if( 
7210: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pE->op==TK_ID ){
7220: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  .    char *zCol 
7230: 3d 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  = pE->u.zToken;.
7240: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7250: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
7260: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
7270: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
7280: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
7290: 69 66 28 20 7a 41 73 3d 3d 30 20 29 20 63 6f 6e  if( zAs==0 ) con
72a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
72b0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
72c0: 7a 41 73 2c 20 7a 43 6f 6c 29 21 3d 30 20 29 20  zAs, zCol)!=0 ) 
72d0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
72e0: 69 66 28 20 73 61 6d 65 4e 61 6d 65 4f 6e 6c 79  if( sameNameOnly
72f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
7300: 20 2a 70 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b   *p = pEList->a[
7310: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
7320: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
7330: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 70         if( p->op
7340: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 20 63 6f  !=TK_COLUMN ) co
7350: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
7360: 70 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a  pTab = p->pTab;.
7370: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
7380: 74 65 33 53 74 72 49 43 6d 70 28 70 54 61 62 2d  te3StrICmp(pTab-
7390: 3e 61 43 6f 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e  >aCol[p->iColumn
73a0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 41 73 29 21 3d 30  ].zName, zAs)!=0
73b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
73c0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
73d0: 6e 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  n i+1;.    }.  }
73e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
73f0: 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70 6f  /*.** pE is a po
7400: 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72  inter to an expr
7410: 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73 20  ession which is 
7420: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  a single term in
7430: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
7440: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   of a compound S
7450: 45 4c 45 43 54 2e 20 20 54 68 65 20 65 78 70 72  ELECT.  The expr
7460: 65 73 73 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  ession has not b
7470: 65 65 6e 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  een.** name reso
7480: 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74  lved..**.** At t
7490: 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f  he point this ro
74a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
74b0: 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   we already know
74c0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44   that the.** ORD
74d0: 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f  ER BY term is no
74e0: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64  t an integer ind
74f0: 65 78 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75  ex into the resu
7500: 6c 74 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a  lt set.  That.**
7510: 20 63 61 73 65 20 69 73 20 68 61 6e 64 6c 65 64   case is handled
7520: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
7530: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41  routine..**.** A
7540: 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68 20  ttempt to match 
7550: 70 45 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c  pE against resul
7560: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  t set columns in
7570: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
7580: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
7590: 6e 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  nt.  Return the 
75a0: 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d  index i of the m
75b0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a  atching column,.
75c0: 2a 2a 20 61 73 20 61 6e 20 69 6e 64 69 63 61 74  ** as an indicat
75d0: 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ion to the calle
75e0: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
75f0: 20 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d 74   sort by the i-t
7600: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65  h column..** The
7610: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
7620: 6e 20 69 73 20 31 2e 20 20 49 6e 20 6f 74 68 65  n is 1.  In othe
7630: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 76 61 6c  r words, the val
7640: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
7650: 68 65 0a 2a 2a 20 73 61 6d 65 20 69 6e 74 65 67  he.** same integ
7660: 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 77 6f  er value that wo
7670: 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 20 74  uld be used in t
7680: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
7690: 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
76a0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  the column..**.*
76b0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
76c0: 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30   match, return 0
76d0: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
76e0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
76f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7700: 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72  esolveOrderByTer
7710: 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50  mToExprList(.  P
7720: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7730: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
7740: 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d  text for error m
7750: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
7760: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
7770: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
7780: 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65  atement with the
7790: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
77a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20   */.  Expr *pE  
77b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
77c0: 73 70 65 63 69 66 69 63 20 4f 52 44 45 52 20 42  specific ORDER B
77d0: 59 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  Y term */.){.  i
77e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
77f0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7800: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
7810: 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65  *pEList;  /* The
7820: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
7830: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
7840: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20  NameContext nc; 
7850: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
7860: 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67  xt for resolving
7870: 20 70 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   pE */.  sqlite3
7880: 20 2a 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44   *db;       /* D
7890: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
78a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
78b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
78c0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
78d0: 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
78e0: 20 20 75 38 20 73 61 76 65 64 53 75 70 70 45 72    u8 savedSuppEr
78f0: 72 3b 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61  r;   /* Saved va
7900: 6c 75 65 20 6f 66 20 64 62 2d 3e 73 75 70 70 72  lue of db->suppr
7910: 65 73 73 45 72 72 20 2a 2f 0a 0a 20 20 61 73 73  essErr */..  ass
7920: 65 72 74 28 20 73 71 6c 69 74 65 33 45 78 70 72  ert( sqlite3Expr
7930: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
7940: 29 3d 3d 30 20 29 3b 0a 20 20 70 45 4c 69 73 74  )==0 );.  pEList
7950: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
7960: 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  st;..  /* Resolv
7970: 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74  e all names in t
7980: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
7990: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f   expression.  */
79a0: 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30  .  memset(&nc, 0
79b0: 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20  , sizeof(nc));. 
79c0: 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61   nc.pParse = pPa
79d0: 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69  rse;.  nc.pSrcLi
79e0: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
79f0: 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20  rc;.  nc.pEList 
7a00: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e  = pEList;.  nc.n
7a10: 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f  cFlags = NC_Allo
7a20: 77 41 67 67 3b 0a 20 20 6e 63 2e 6e 45 72 72 20  wAgg;.  nc.nErr 
7a30: 3d 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  = 0;.  db = pPar
7a40: 73 65 2d 3e 64 62 3b 0a 20 20 73 61 76 65 64 53  se->db;.  savedS
7a50: 75 70 70 45 72 72 20 3d 20 64 62 2d 3e 73 75 70  uppErr = db->sup
7a60: 70 72 65 73 73 45 72 72 3b 0a 20 20 64 62 2d 3e  pressErr;.  db->
7a70: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 31 3b  suppressErr = 1;
7a80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52  .  rc = sqlite3R
7a90: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
7aa0: 26 6e 63 2c 20 70 45 29 3b 0a 20 20 64 62 2d 3e  &nc, pE);.  db->
7ab0: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 73 61  suppressErr = sa
7ac0: 76 65 64 53 75 70 70 45 72 72 3b 0a 20 20 69 66  vedSuppErr;.  if
7ad0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
7ae0: 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 6d 61  ..  /* Try to ma
7af0: 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  tch the ORDER BY
7b00: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
7b10: 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  nst an expressio
7b20: 6e 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  n.  ** in the re
7b30: 73 75 6c 74 20 73 65 74 2e 20 20 52 65 74 75 72  sult set.  Retur
7b40: 6e 20 61 6e 20 31 2d 62 61 73 65 64 20 69 6e 64  n an 1-based ind
7b50: 65 78 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69  ex of the matchi
7b60: 6e 67 0a 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73  ng.  ** result-s
7b70: 65 74 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20  et entry..  */. 
7b80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
7b90: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7ba0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7bb0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69  ExprCompare(pELi
7bc0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
7bd0: 70 45 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20  pE, -1)<2 ){.   
7be0: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
7bf0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
7c00: 66 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75  f no match, retu
7c10: 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72  rn 0. */.  retur
7c20: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
7c30: 6e 65 72 61 74 65 20 61 6e 20 4f 52 44 45 52 20  nerate an ORDER 
7c40: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 74  BY or GROUP BY t
7c50: 65 72 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  erm out-of-range
7c60: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
7c70: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 4f 75  c void resolveOu
7c80: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 0a 20  tOfRangeError(. 
7c90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7ca0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
7cb0: 72 72 6f 72 20 63 6f 6e 74 65 78 74 20 69 6e 74  rror context int
7cc0: 6f 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65  o which to write
7cd0: 20 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20   the error */.  
7ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
7cf0: 65 2c 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52  e,     /* "ORDER
7d00: 22 20 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a  " or "GROUP" */.
7d10: 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
7d20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7d30: 69 6e 64 65 78 20 28 31 2d 62 61 73 65 64 29 20  index (1-based) 
7d40: 6f 66 20 74 68 65 20 74 65 72 6d 20 6f 75 74 20  of the term out 
7d50: 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  of range */.  in
7d60: 74 20 6d 78 20 20 20 20 20 20 20 20 20 20 20 20  t mx            
7d70: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
7d80: 70 65 72 6d 69 73 73 69 62 6c 65 20 76 61 6c 75  permissible valu
7d90: 65 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20 20 73  e of i */.){.  s
7da0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7db0: 50 61 72 73 65 2c 20 0a 20 20 20 20 22 25 72 20  Parse, .    "%r 
7dc0: 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f  %s BY term out o
7dd0: 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
7de0: 20 62 65 20 22 0a 20 20 20 20 22 62 65 74 77 65   be ".    "betwe
7df0: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2c  en 1 and %d", i,
7e00: 20 7a 54 79 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a   zType, mx);.}..
7e10: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
7e20: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7e30: 65 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  e in a compound 
7e40: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7e50: 2e 20 20 20 4d 6f 64 69 66 79 0a 2a 2a 20 65 61  .   Modify.** ea
7e60: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ch term of the O
7e70: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
7e80: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
7e90: 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 0a 2a  eger between 1.*
7ea0: 2a 20 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20  * and N where N 
7eb0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
7ec0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
7ed0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e  compound SELECT.
7ee0: 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
7ef0: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 61  terms that are a
7f00: 6c 72 65 61 64 79 20 61 6e 20 69 6e 74 65 67 65  lready an intege
7f10: 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  r between 1 and 
7f20: 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66  N are.** unmodif
7f30: 69 65 64 2e 20 20 4f 52 44 45 52 20 42 59 20 74  ied.  ORDER BY t
7f40: 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 69 6e  erms that are in
7f50: 74 65 67 65 72 73 20 6f 75 74 73 69 64 65 20 74  tegers outside t
7f60: 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 31  he range of.** 1
7f70: 20 74 68 72 6f 75 67 68 20 4e 20 67 65 6e 65 72   through N gener
7f80: 61 74 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 4f  ate an error.  O
7f90: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
7fa0: 61 74 20 61 72 65 20 65 78 70 72 65 73 73 69 6f  at are expressio
7fb0: 6e 73 0a 2a 2a 20 61 72 65 20 6d 61 74 63 68 65  ns.** are matche
7fc0: 64 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74  d against result
7fd0: 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
7fe0: 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c   of compound SEL
7ff0: 45 43 54 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  ECT.** beginning
8000: 20 77 69 74 68 20 74 68 65 20 6c 65 66 74 2d 6d   with the left-m
8010: 6f 73 74 20 53 45 4c 45 43 54 20 61 6e 64 20 77  ost SELECT and w
8020: 6f 72 6b 69 6e 67 20 74 6f 77 61 72 64 20 74 68  orking toward th
8030: 65 20 72 69 67 68 74 2e 0a 2a 2a 20 41 74 20 74  e right..** At t
8040: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 2c 20  he first match, 
8050: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  the ORDER BY exp
8060: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 61 6e 73  ression is trans
8070: 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 20 74  formed into.** t
8080: 68 65 20 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d  he integer colum
8090: 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  n number..**.** 
80a0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
80b0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
80c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
80d0: 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f  resolveCompoundO
80e0: 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
80f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8100: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8110: 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72  xt.  Leave error
8120: 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a   messages here *
8130: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
8140: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ect       /* The
8150: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8160: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
8170: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 29 7b 0a   ORDER BY */.){.
8180: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c    int i;.  ExprL
8190: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20  ist *pOrderBy;. 
81a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
81b0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
81c0: 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f  ;.  int moreToDo
81d0: 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42   = 1;..  pOrderB
81e0: 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72  y = pSelect->pOr
81f0: 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72  derBy;.  if( pOr
8200: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
8210: 6e 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  n 0;.  db = pPar
8220: 73 65 2d 3e 64 62 3b 0a 23 69 66 20 53 51 4c 49  se->db;.#if SQLI
8230: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
8240: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  if( pOrderBy->nE
8250: 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
8260: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
8270: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
8280: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8290: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72  e, "too many ter
82a0: 6d 73 20 69 6e 20 4f 52 44 45 52 20 42 59 20 63  ms in ORDER BY c
82b0: 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 72 65 74  lause");.    ret
82c0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
82d0: 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  f.  for(i=0; i<p
82e0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
82f0: 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  i++){.    pOrder
8300: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
8310: 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65 63 74  0;.  }.  pSelect
8320: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 77  ->pNext = 0;.  w
8330: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
8340: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53 65  Prior ){.    pSe
8350: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  lect->pPrior->pN
8360: 65 78 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ext = pSelect;. 
8370: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
8380: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
8390: 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  }.  while( pSele
83a0: 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29  ct && moreToDo )
83b0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
83c0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
83d0: 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20  m;.    moreToDo 
83e0: 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  = 0;.    pEList 
83f0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
8400: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
8410: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
8420: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
8430: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f  OrderBy->a; i<pO
8440: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
8450: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
8460: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
8470: 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  1;.      Expr *p
8480: 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  E, *pDup;.      
8490: 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20  if( pItem->done 
84a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
84b0: 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78    pE = sqlite3Ex
84c0: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 49  prSkipCollate(pI
84d0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
84e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
84f0: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
8500: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
8510: 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c    if( iCol<=0 ||
8520: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
8530: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
8540: 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e   resolveOutOfRan
8550: 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  geError(pParse, 
8560: 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70 45  "ORDER", i+1, pE
8570: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
8580: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
8590: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
85a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
85b0: 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41   iCol = resolveA
85c0: 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 45  sName(pParse, pE
85d0: 4c 69 73 74 2c 20 70 45 2c 20 30 29 3b 0a 20 20  List, pE, 0);.  
85e0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d        if( iCol==
85f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
8600: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
8610: 72 44 75 70 28 64 62 2c 20 70 45 2c 20 30 29 3b  rDup(db, pE, 0);
8620: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
8630: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
8640: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8650: 61 73 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20  assert(pDup);.  
8660: 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d            iCol =
8670: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54   resolveOrderByT
8680: 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50  ermToExprList(pP
8690: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70  arse, pSelect, p
86a0: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
86b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
86c0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
86d0: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
86e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
86f0: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
8700: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72         /* Conver
8710: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  t the ORDER BY t
8720: 65 72 6d 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65  erm into an inte
8730: 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ger column numbe
8740: 72 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20  r iCol,.        
8750: 2a 2a 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  ** taking care t
8760: 6f 20 70 72 65 73 65 72 76 65 20 74 68 65 20 43  o preserve the C
8770: 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 20 69 66  OLLATE clause if
8780: 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
8790: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
87a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
87b0: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
87c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
87d0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
87e0: 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  1;.        pNew-
87f0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
8800: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
8810: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
8820: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66  iCol;.        if
8830: 28 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d  ( pItem->pExpr==
8840: 70 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pE ){.          
8850: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
8860: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  New;.        }el
8870: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
8880: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 70 45 78  sert( pItem->pEx
8890: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
88a0: 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TE );.          
88b0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 70  assert( pItem->p
88c0: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70 45 20  Expr->pLeft==pE 
88d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  );.          pIt
88e0: 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  em->pExpr->pLeft
88f0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
8900: 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
8910: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8920: 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20 70 49   pE);.        pI
8930: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
8940: 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c  yCol = (u16)iCol
8950: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  ;.        pItem-
8960: 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  >done = 1;.     
8970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8980: 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20  moreToDo = 1;.  
8990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
89a0: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
89b0: 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  t->pNext;.  }.  
89c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
89d0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
89e0: 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72  {.    if( pOrder
89f0: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30  By->a[i].done==0
8a00: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
8a10: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8a20: 2c 20 22 25 72 20 4f 52 44 45 52 20 42 59 20 74  , "%r ORDER BY t
8a30: 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  erm does not mat
8a40: 63 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20  ch any ".       
8a50: 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20       "column in 
8a60: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c  the result set",
8a70: 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74   i+1);.      ret
8a80: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
8a90: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8aa0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 65 76 65 72  /*.** Check ever
8ab0: 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52  y term in the OR
8ac0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
8ad0: 42 59 20 63 6c 61 75 73 65 20 70 4f 72 64 65 72  BY clause pOrder
8ae0: 42 79 20 6f 66 0a 2a 2a 20 74 68 65 20 53 45 4c  By of.** the SEL
8af0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53  ECT statement pS
8b00: 65 6c 65 63 74 2e 20 20 49 66 20 61 6e 79 20 74  elect.  If any t
8b10: 65 72 6d 20 69 73 20 72 65 66 65 72 65 6e 63 65  erm is reference
8b20: 20 74 6f 20 61 0a 2a 2a 20 72 65 73 75 6c 74 20   to a.** result 
8b30: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 28  set expression (
8b40: 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  as determined by
8b50: 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61 2e   the ExprList.a.
8b60: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 0a  u.x.iOrderByCol.
8b70: 2a 2a 20 66 69 65 6c 64 29 20 74 68 65 6e 20 63  ** field) then c
8b80: 6f 6e 76 65 72 74 20 74 68 61 74 20 74 65 72 6d  onvert that term
8b90: 20 69 6e 74 6f 20 61 20 63 6f 70 79 20 6f 66 20   into a copy of 
8ba0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
8bb0: 67 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20  g result set.** 
8bc0: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  column..**.** If
8bd0: 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65 20   any errors are 
8be0: 64 65 74 65 63 74 65 64 2c 20 61 64 64 20 61 6e  detected, add an
8bf0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
8c00: 6f 20 70 50 61 72 73 65 20 61 6e 64 0a 2a 2a 20  o pParse and.** 
8c10: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
8c20: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66    Return zero if
8c30: 20 6e 6f 20 65 72 72 6f 72 73 20 61 72 65 20 73   no errors are s
8c40: 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  een..*/.int sqli
8c50: 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
8c60: 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65 20  roupBy(.  Parse 
8c70: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8c80: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8c90: 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72  xt.  Leave error
8ca0: 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a   messages here *
8cb0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
8cc0: 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ect,      /* The
8cd0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8ce0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
8cf0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
8d00: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
8d10: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
8d20: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
8d30: 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63  lause to be proc
8d40: 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  essed */.  const
8d50: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
8d60: 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22   /* "ORDER" or "
8d70: 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20 20 69  GROUP" */.){.  i
8d80: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt i;.  sqlite3 
8d90: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8da0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
8db0: 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45  List;.  struct E
8dc0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
8dd0: 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64  tem;..  if( pOrd
8de0: 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73  erBy==0 || pPars
8df0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8e00: 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  led ) return 0;.
8e10: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
8e20: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64  OLUMN.  if( pOrd
8e30: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  erBy->nExpr>db->
8e40: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
8e50: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
8e60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8e70: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
8e80: 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73  many terms in %s
8e90: 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79   BY clause", zTy
8ea0: 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  pe);.    return 
8eb0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
8ec0: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
8ed0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
8ee0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
8ef0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65    /* sqlite3Sele
8f00: 63 74 4e 65 77 28 29 20 67 75 61 72 61 6e 74 65  ctNew() guarante
8f10: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 66 6f 72  es this */.  for
8f20: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
8f30: 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65  erBy->a; i<pOrde
8f40: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  rBy->nExpr; i++,
8f50: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
8f60: 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
8f70: 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20  rderByCol ){.   
8f80: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
8f90: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 70 45  x.iOrderByCol>pE
8fa0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
8fb0: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75         resolveOu
8fc0: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50  tOfRangeError(pP
8fd0: 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31  arse, zType, i+1
8fe0: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
8ff0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9000: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
9010: 20 20 72 65 73 6f 6c 76 65 41 6c 69 61 73 28 70    resolveAlias(p
9020: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70  Parse, pEList, p
9030: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
9040: 42 79 43 6f 6c 2d 31 2c 20 70 49 74 65 6d 2d 3e  ByCol-1, pItem->
9050: 70 45 78 70 72 2c 20 7a 54 79 70 65 2c 30 29 3b  pExpr, zType,0);
9060: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9070: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
9080: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
9090: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
90a0: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 53 45   BY clause in SE
90b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
90c0: 53 65 6c 65 63 74 2e 0a 2a 2a 20 54 68 65 20 4e  Select..** The N
90d0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
90e0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
90f0: 65 6e 74 20 69 73 20 70 4e 43 2e 20 20 7a 54 79  ent is pNC.  zTy
9100: 70 65 20 69 73 20 65 69 74 68 65 72 0a 2a 2a 20  pe is either.** 
9110: 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
9120: 50 22 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  P" depending on 
9130: 77 68 69 63 68 20 74 79 70 65 20 6f 66 20 63 6c  which type of cl
9140: 61 75 73 65 20 70 4f 72 64 65 72 42 79 20 69 73  ause pOrderBy is
9150: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9160: 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 65 61  tine resolves ea
9170: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63  ch term of the c
9180: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 20 65 78  lause into an ex
9190: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20  pression..** If 
91a0: 74 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72  the order-by ter
91b0: 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  m is an integer 
91c0: 49 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  I between 1 and 
91d0: 4e 20 28 77 68 65 72 65 20 4e 20 69 73 20 74 68  N (where N is th
91e0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63  e.** number of c
91f0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
9200: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
9210: 53 45 4c 45 43 54 29 20 74 68 65 6e 20 74 68 65  SELECT) then the
9220: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
9230: 6e 20 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e  n the resolution
9240: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
9250: 65 20 49 2d 74 68 20 72 65 73 75 6c 74 2d 73 65  e I-th result-se
9260: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  t expression.  I
9270: 66 0a 2a 2a 20 74 68 65 20 6f 72 64 65 72 2d 62  f.** the order-b
9280: 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69 64 65  y term is an ide
9290: 6e 74 69 66 69 65 72 20 74 68 61 74 20 63 6f 72  ntifier that cor
92a0: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
92b0: 41 53 2d 6e 61 6d 65 20 6f 66 0a 2a 2a 20 61 20  AS-name of.** a 
92c0: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
92d0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ssion, then the 
92e0: 74 65 72 6d 20 72 65 73 6f 6c 76 65 73 20 74 6f  term resolves to
92f0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a   a copy of the.*
9300: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
9310: 72 65 73 73 69 6f 6e 2e 20 20 4f 74 68 65 72 77  ression.  Otherw
9320: 69 73 65 2c 20 74 68 65 20 65 78 70 72 65 73 73  ise, the express
9330: 69 6f 6e 20 69 73 20 72 65 73 6f 6c 76 65 64 20  ion is resolved 
9340: 69 6e 0a 2a 2a 20 74 68 65 20 75 73 75 61 6c 20  in.** the usual 
9350: 77 61 79 20 2d 20 75 73 69 6e 67 20 73 71 6c 69  way - using sqli
9360: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
9370: 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mes()..**.** Thi
9380: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
9390: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
93a0: 65 72 72 6f 72 73 2e 20 20 49 66 20 65 72 72 6f  errors.  If erro
93b0: 72 73 20 6f 63 63 75 72 2c 20 74 68 65 6e 0a 2a  rs occur, then.*
93c0: 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
93d0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
93e0: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
93f0: 70 50 61 72 73 65 2e 20 20 28 4f 4f 4d 20 65 72  pParse.  (OOM er
9400: 72 6f 72 73 0a 2a 2a 20 65 78 63 65 70 74 65 64  rors.** excepted
9410: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
9420: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
9430: 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  upBy(.  NameCont
9440: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a  ext *pNC,     /*
9450: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
9460: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
9470: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
9480: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
9490: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
94a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 68 6f 6c  CT statement hol
94b0: 64 69 6e 67 20 70 4f 72 64 65 72 42 79 20 2a 2f  ding pOrderBy */
94c0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
94d0: 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f  derBy,   /* An O
94e0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
94f0: 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 72 65   BY clause to re
9500: 73 6f 6c 76 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  solve */.  const
9510: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
9520: 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45   /* Either "ORDE
9530: 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61  R" or "GROUP", a
9540: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
9550: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9580: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
9590: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
95a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
95b0: 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  umn number */.  
95c0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
95d0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 2f  item *pItem;   /
95e0: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
95f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
9600: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
9610: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
9620: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9630: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
9640: 6e 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  nResult;        
9650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9660: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
9670: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
9680: 2a 2f 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  */..  if( pOrder
9690: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  By==0 ) return 0
96a0: 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 70 53  ;.  nResult = pS
96b0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
96c0: 45 78 70 72 3b 0a 20 20 70 50 61 72 73 65 20 3d  Expr;.  pParse =
96d0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
96e0: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
96f0: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f  OrderBy->a; i<pO
9700: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
9710: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
9720: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 49 74    Expr *pE = pIt
9730: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45  em->pExpr;.    E
9740: 78 70 72 20 2a 70 45 32 20 3d 20 73 71 6c 69 74  xpr *pE2 = sqlit
9750: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
9760: 65 28 70 45 29 3b 0a 20 20 20 20 69 43 6f 6c 20  e(pE);.    iCol 
9770: 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28  = resolveAsName(
9780: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
9790: 3e 70 45 4c 69 73 74 2c 20 70 45 32 2c 20 7a 54  >pEList, pE2, zT
97a0: 79 70 65 5b 30 5d 3d 3d 27 47 27 29 3b 0a 20 20  ype[0]=='G');.  
97b0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
97c0: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 41        /* If an A
97d0: 53 2d 6e 61 6d 65 20 6d 61 74 63 68 20 69 73 20  S-name match is 
97e0: 66 6f 75 6e 64 2c 20 6d 61 72 6b 20 74 68 69 73  found, mark this
97f0: 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e   ORDER BY column
9800: 20 61 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20   as being.      
9810: 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ** a copy of the
9820: 20 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d   iCol-th result-
9830: 73 65 74 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  set column.  The
9840: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
9850: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c   to.      ** sql
9860: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
9870: 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63  GroupBy() will c
9880: 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65  onvert the expre
9890: 73 73 69 6f 6e 20 74 6f 20 61 0a 20 20 20 20 20  ssion to a.     
98a0: 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
98b0: 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73  iCol-th result-s
98c0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a  et expression. *
98d0: 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  /.      pItem->u
98e0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
98f0: 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20   (u16)iCol;.    
9900: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9910: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
9920: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
9930: 45 32 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  E2, &iCol) ){.  
9940: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
9950: 20 42 59 20 74 65 72 6d 20 69 73 20 61 6e 20 69   BY term is an i
9960: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e  nteger constant.
9970: 20 20 41 67 61 69 6e 2c 20 73 65 74 20 74 68 65    Again, set the
9980: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a   column.      **
9990: 20 6e 75 6d 62 65 72 20 73 6f 20 74 68 61 74 20   number so that 
99a0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
99b0: 64 65 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c  derGroupBy() wil
99c0: 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 0a 20 20  l convert the.  
99d0: 20 20 20 20 2a 2a 20 6f 72 64 65 72 2d 62 79 20      ** order-by 
99e0: 74 65 72 6d 20 74 6f 20 61 20 63 6f 70 79 20 6f  term to a copy o
99f0: 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  f the result-set
9a00: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
9a10: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 31 20       if( iCol<1 
9a20: 7c 7c 20 69 43 6f 6c 3e 30 78 66 66 66 66 20 29  || iCol>0xffff )
9a30: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76  {.        resolv
9a40: 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72  eOutOfRangeError
9a50: 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20  (pParse, zType, 
9a60: 69 2b 31 2c 20 6e 52 65 73 75 6c 74 29 3b 0a 20  i+1, nResult);. 
9a70: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
9a80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9a90: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
9aa0: 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f  ByCol = (u16)iCo
9ab0: 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  l;.      continu
9ac0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
9ad0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 72 65 61   Otherwise, trea
9ae0: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  t the ORDER BY t
9af0: 65 72 6d 20 61 73 20 61 6e 20 6f 72 64 69 6e 61  erm as an ordina
9b00: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ry expression */
9b10: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  .    pItem->u.x.
9b20: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b  iOrderByCol = 0;
9b30: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9b40: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
9b50: 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20  (pNC, pE) ){.   
9b60: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
9b70: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
9b80: 6a 3c 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  j<pSelect->pELis
9b90: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
9ba0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9bb0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 2c  3ExprCompare(pE,
9bc0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
9bd0: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31  ->a[j].pExpr, -1
9be0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9bf0: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
9c00: 72 42 79 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20  rByCol = j+1;.  
9c10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9c20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
9c30: 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
9c40: 70 42 79 28 70 50 61 72 73 65 2c 20 70 53 65 6c  pBy(pParse, pSel
9c50: 65 63 74 2c 20 70 4f 72 64 65 72 42 79 2c 20 7a  ect, pOrderBy, z
9c60: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
9c70: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
9c80: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
9c90: 65 6d 65 6e 74 20 70 20 61 6e 64 20 61 6c 6c 20  ement p and all 
9ca0: 6f 66 20 69 74 73 20 64 65 73 63 65 6e 64 65 6e  of its descenden
9cb0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
9cc0: 74 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  t resolveSelectS
9cd0: 74 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c  tep(Walker *pWal
9ce0: 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b  ker, Select *p){
9cf0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
9d00: 70 4f 75 74 65 72 4e 43 3b 20 20 2f 2a 20 43 6f  pOuterNC;  /* Co
9d10: 6e 74 65 78 74 20 74 68 61 74 20 63 6f 6e 74 61  ntext that conta
9d20: 69 6e 73 20 74 68 69 73 20 53 45 4c 45 43 54 20  ins this SELECT 
9d30: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
9d40: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20   sNC;        /* 
9d50: 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20  Name context of 
9d60: 74 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20  this SELECT */. 
9d70: 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 3b   int isCompound;
9d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
9d90: 20 69 66 20 70 20 69 73 20 61 20 63 6f 6d 70 6f   if p is a compo
9da0: 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20  und select */.  
9db0: 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e 64 3b 20 20  int nCompound;  
9dc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9dd0: 72 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 74 65  r of compound te
9de0: 72 6d 73 20 70 72 6f 63 65 73 73 65 64 20 73 6f  rms processed so
9df0: 20 66 61 72 20 2a 2f 0a 20 20 50 61 72 73 65 20   far */.  Parse 
9e00: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
9e10: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9e20: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
9e30: 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 20 20 20  st *pEList;     
9e40: 20 20 2f 2a 20 52 65 73 75 6c 74 20 73 65 74 20    /* Result set 
9e50: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
9e60: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e80: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
9e90: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
9ea0: 75 70 42 79 3b 20 20 20 20 20 2f 2a 20 54 68 65  upBy;     /* The
9eb0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
9ec0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 4c   */.  Select *pL
9ed0: 65 66 74 6d 6f 73 74 3b 20 20 20 20 20 20 2f 2a  eftmost;      /*
9ee0: 20 4c 65 66 74 2d 6d 6f 73 74 20 6f 66 20 53 45   Left-most of SE
9ef0: 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75  LECT of a compou
9f00: 6e 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nd */.  sqlite3 
9f10: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
9f20: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
9f30: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 0a 0a 20 20  ection */.  ..  
9f40: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
9f50: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
9f60: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
9f70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
9f80: 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
9f90: 4f 75 74 65 72 4e 43 20 3d 20 70 57 61 6c 6b 65  OuterNC = pWalke
9fa0: 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 70 50 61 72  r->u.pNC;.  pPar
9fb0: 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
9fc0: 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
9fd0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4e  rse->db;..  /* N
9fe0: 6f 72 6d 61 6c 6c 79 20 73 71 6c 69 74 65 33 53  ormally sqlite3S
9ff0: 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 69  electExpand() wi
a000: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  ll be called fir
a010: 73 74 20 61 6e 64 20 77 69 6c 6c 20 68 61 76 65  st and will have
a020: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78  .  ** already ex
a030: 70 61 6e 64 65 64 20 74 68 69 73 20 53 45 4c 45  panded this SELE
a040: 43 54 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66  CT.  However, if
a050: 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
a060: 65 72 79 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20  ery within.  ** 
a070: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 73  an expression, s
a080: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
a090: 72 4e 61 6d 65 73 28 29 20 77 69 6c 6c 20 62 65  rNames() will be
a0a0: 20 63 61 6c 6c 65 64 20 77 69 74 68 6f 75 74 20   called without 
a0b0: 61 0a 20 20 2a 2a 20 70 72 69 6f 72 20 63 61 6c  a.  ** prior cal
a0c0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 65 6c 65  l to sqlite3Sele
a0d0: 63 74 45 78 70 61 6e 64 28 29 2e 20 20 57 68 65  ctExpand().  Whe
a0e0: 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20  n that happens, 
a0f0: 6c 65 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  let.  ** sqlite3
a100: 53 65 6c 65 63 74 50 72 65 70 28 29 20 64 6f 20  SelectPrep() do 
a110: 61 6c 6c 20 6f 66 20 74 68 65 20 70 72 6f 63 65  all of the proce
a120: 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
a130: 45 4c 45 43 54 2e 0a 20 20 2a 2a 20 73 71 6c 69  ELECT..  ** sqli
a140: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 29 20  te3SelectPrep() 
a150: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 62 6f 74 68  will invoke both
a160: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
a170: 70 61 6e 64 28 29 20 61 6e 64 0a 20 20 2a 2a 20  pand() and.  ** 
a180: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
a190: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
a1a0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
a1b0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
a1c0: 45 78 70 61 6e 64 65 64 29 3d 3d 30 20 29 7b 0a  Expanded)==0 ){.
a1d0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
a1e0: 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
a1f0: 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20   pOuterNC);.    
a200: 72 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e  return (pParse->
a210: 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
a220: 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f  ocFailed) ? WRC_
a230: 41 62 6f 72 74 20 3a 20 57 52 43 5f 50 72 75 6e  Abort : WRC_Prun
a240: 65 3b 0a 20 20 7d 0a 0a 20 20 69 73 43 6f 6d 70  e;.  }..  isComp
a250: 6f 75 6e 64 20 3d 20 70 2d 3e 70 50 72 69 6f 72  ound = p->pPrior
a260: 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70 6f 75 6e 64  !=0;.  nCompound
a270: 20 3d 20 30 3b 0a 20 20 70 4c 65 66 74 6d 6f 73   = 0;.  pLeftmos
a280: 74 20 3d 20 70 3b 0a 20 20 77 68 69 6c 65 28 20  t = p;.  while( 
a290: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
a2a0: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
a2b0: 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
a2c0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
a2d0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
a2e0: 5f 52 65 73 6f 6c 76 65 64 29 3d 3d 30 20 29 3b  _Resolved)==0 );
a2f0: 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
a300: 20 7c 3d 20 53 46 5f 52 65 73 6f 6c 76 65 64 3b   |= SF_Resolved;
a310: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ..    /* Resolve
a320: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
a330: 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   in the LIMIT an
a340: 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
a350: 2e 20 54 68 65 73 65 0a 20 20 20 20 2a 2a 20 61  . These.    ** a
a360: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  re not allowed t
a370: 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  o refer to any n
a380: 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e  ames, so pass an
a390: 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65   empty NameConte
a3a0: 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  xt..    */.    m
a3b0: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
a3c0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
a3d0: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
a3e0: 61 72 73 65 3b 0a 20 20 20 20 69 66 28 20 73 71  arse;.    if( sq
a3f0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
a400: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
a410: 4c 69 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20  Limit) ||.      
a420: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
a430: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
a440: 70 2d 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20  p->pOffset) ){. 
a450: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
a460: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a  Abort;.    }.  .
a470: 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65      /* Recursive
a480: 6c 79 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65 73  ly resolve names
a490: 20 69 6e 20 61 6c 6c 20 73 75 62 71 75 65 72 69   in all subqueri
a4a0: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  es.    */.    fo
a4b0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63  r(i=0; i<p->pSrc
a4c0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
a4d0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
a4e0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
a4f0: 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b   &p->pSrc->a[i];
a500: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
a510: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
a520: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
a530: 20 2a 70 4e 43 3b 20 20 20 20 20 20 20 20 20 2f   *pNC;         /
a540: 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
a550: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20  e name contexts 
a560: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  */.        int n
a570: 52 65 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ref = 0;        
a580: 20 20 20 20 20 2f 2a 20 52 65 66 63 6f 75 6e 74       /* Refcount
a590: 20 66 6f 72 20 70 4f 75 74 65 72 4e 43 20 61 6e   for pOuterNC an
a5a0: 64 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73  d outer contexts
a5b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
a5c0: 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 43 6f  t char *zSavedCo
a5d0: 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d 3e  ntext = pParse->
a5e0: 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a 20  zAuthContext;.. 
a5f0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20         /* Count 
a600: 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
a610: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
a620: 6f 20 70 4f 75 74 65 72 4e 43 20 61 6e 64 20 61  o pOuterNC and a
a630: 6c 6c 20 6f 66 20 69 74 73 0a 20 20 20 20 20 20  ll of its.      
a640: 20 20 2a 2a 20 70 61 72 65 6e 74 20 63 6f 6e 74    ** parent cont
a650: 65 78 74 73 2e 20 41 66 74 65 72 20 72 65 73 6f  exts. After reso
a660: 6c 76 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  lving references
a670: 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
a680: 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 49  in.        ** pI
a690: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 63 68  tem->pSelect, ch
a6a0: 65 63 6b 20 69 66 20 74 68 69 73 20 76 61 6c 75  eck if this valu
a6b0: 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 49  e has changed. I
a6c0: 66 20 73 6f 2c 20 74 68 65 6e 0a 20 20 20 20 20  f so, then.     
a6d0: 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74 61     ** SELECT sta
a6e0: 74 65 6d 65 6e 74 20 70 49 74 65 6d 2d 3e 70 53  tement pItem->pS
a6f0: 65 6c 65 63 74 20 6d 75 73 74 20 62 65 20 63 6f  elect must be co
a700: 72 72 65 6c 61 74 65 64 2e 20 53 65 74 20 74 68  rrelated. Set th
a710: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 49 74  e.        ** pIt
a720: 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64  em->isCorrelated
a730: 20 66 6c 61 67 20 69 66 20 74 68 69 73 20 69 73   flag if this is
a740: 20 74 68 65 20 63 61 73 65 2e 20 2a 2f 0a 20 20   the case. */.  
a750: 20 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f        for(pNC=pO
a760: 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43  uterNC; pNC; pNC
a770: 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65  =pNC->pNext) nRe
a780: 66 20 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a  f += pNC->nRef;.
a790: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
a7a0: 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 70 50 61 72  em->zName ) pPar
a7b0: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
a7c0: 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b   = pItem->zName;
a7d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a7e0: 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d  ResolveSelectNam
a7f0: 65 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  es(pParse, pItem
a800: 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4f 75 74 65  ->pSelect, pOute
a810: 72 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 70 50  rNC);.        pP
a820: 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
a830: 78 74 20 3d 20 7a 53 61 76 65 64 43 6f 6e 74 65  xt = zSavedConte
a840: 78 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  xt;.        if( 
a850: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
a860: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a870: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
a880: 6f 72 74 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f  ort;..        fo
a890: 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20  r(pNC=pOuterNC; 
a8a0: 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e  pNC; pNC=pNC->pN
a8b0: 65 78 74 29 20 6e 52 65 66 20 2d 3d 20 70 4e 43  ext) nRef -= pNC
a8c0: 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20  ->nRef;.        
a8d0: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 69  assert( pItem->i
a8e0: 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 26  sCorrelated==0 &
a8f0: 26 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20 20  & nRef<=0 );.   
a900: 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 43 6f       pItem->isCo
a910: 72 72 65 6c 61 74 65 64 20 3d 20 28 6e 52 65 66  rrelated = (nRef
a920: 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
a930: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65    }.  .    /* Se
a940: 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e  t up the local n
a950: 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70  ame-context to p
a960: 61 73 73 20 74 6f 20 73 71 6c 69 74 65 33 52 65  ass to sqlite3Re
a970: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
a980: 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c   to.    ** resol
a990: 76 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  ve the result-se
a9a0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
a9b0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e  t..    */.    sN
a9c0: 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41  C.ncFlags = NC_A
a9d0: 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 73 4e 43  llowAgg;.    sNC
a9e0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
a9f0: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65  Src;.    sNC.pNe
aa00: 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20  xt = pOuterNC;. 
aa10: 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65   .    /* Resolve
aa20: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65   names in the re
aa30: 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20  sult set. */.   
aa40: 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c   pEList = p->pEL
aa50: 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
aa60: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
aa70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
aa80: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
aa90: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
aaa0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
aab0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28  pExpr;.      if(
aac0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
aad0: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
aae0: 58 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  X) ){.        re
aaf0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
ab00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ab10: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
ab20: 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61 74   are no aggregat
ab30: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74  e functions in t
ab40: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20 61  he result-set, a
ab50: 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a  nd no GROUP BY .
ab60: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
ab70: 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  n, do not allow 
ab80: 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61 6e  aggregates in an
ab90: 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 65  y of the other e
aba0: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 20 20  xpressions..    
abb0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
abc0: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
abd0: 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20 29  _Aggregate)==0 )
abe0: 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20 3d  ;.    pGroupBy =
abf0: 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20   p->pGroupBy;.  
ac00: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 7c    if( pGroupBy |
ac10: 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26  | (sNC.ncFlags &
ac20: 20 4e 43 5f 48 61 73 41 67 67 29 21 3d 30 20 29   NC_HasAgg)!=0 )
ac30: 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c  {.      p->selFl
ac40: 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
ac50: 61 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ate;.    }else{.
ac60: 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
ac70: 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67  s &= ~NC_AllowAg
ac80: 67 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  g;.    }.  .    
ac90: 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63  /* If a HAVING c
aca0: 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74  lause is present
acb0: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
acc0: 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20  t be a GROUP BY 
acd0: 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
ace0: 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
acf0: 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29  g && !pGroupBy )
ad00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
ad10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ad20: 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  "a GROUP BY clau
ad30: 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
ad40: 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a  efore HAVING");.
ad50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
ad60: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
ad70: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
ad80: 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20 6c 69  output column li
ad90: 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63  st to the name-c
ada0: 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61  ontext before pa
adb0: 72 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  rsing the.    **
adc0: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
add0: 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
ade0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
adf0: 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 20 20   is so that.    
ae00: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ** expressions i
ae10: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
ae20: 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65  se (etc.) can re
ae30: 66 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f  fer to expressio
ae40: 6e 73 20 62 79 0a 20 20 20 20 2a 2a 20 61 6c 69  ns by.    ** ali
ae50: 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ases in the resu
ae60: 6c 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  lt set..    **. 
ae70: 20 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e     ** Minor poin
ae80: 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  t: If this is th
ae90: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
aea0: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c   expression will
aeb0: 20 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d 65 76   be.    ** re-ev
aec0: 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68  aluated for each
aed0: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
aee0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43  ..    */.    sNC
aef0: 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c  .pEList = p->pEL
af00: 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ist;.    if( sql
af10: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
af20: 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48  ames(&sNC, p->pH
af30: 61 76 69 6e 67 29 20 29 20 72 65 74 75 72 6e 20  aving) ) return 
af40: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69  WRC_Abort;.    i
af50: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
af60: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
af70: 20 70 2d 3e 70 57 68 65 72 65 29 20 29 20 72 65   p->pWhere) ) re
af80: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
af90: 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  .    /* The ORDE
afa0: 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42  R BY and GROUP B
afb0: 59 20 63 6c 61 75 73 65 73 20 6d 61 79 20 6e 6f  Y clauses may no
afc0: 74 20 72 65 66 65 72 20 74 6f 20 74 65 72 6d 73  t refer to terms
afd0: 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72   in.    ** outer
afe0: 20 71 75 65 72 69 65 73 20 0a 20 20 20 20 2a 2f   queries .    */
aff0: 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d  .    sNC.pNext =
b000: 20 30 3b 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c   0;.    sNC.ncFl
b010: 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41  ags |= NC_AllowA
b020: 67 67 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63  gg;..    /* Proc
b030: 65 73 73 20 74 68 65 20 4f 52 44 45 52 20 42 59  ess the ORDER BY
b040: 20 63 6c 61 75 73 65 20 66 6f 72 20 73 69 6e 67   clause for sing
b050: 6c 65 74 6f 6e 20 53 45 4c 45 43 54 20 73 74 61  leton SELECT sta
b060: 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  tements..    ** 
b070: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
b080: 75 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64  use for compound
b090: 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  s SELECT stateme
b0a0: 6e 74 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 20  nts is handled. 
b0b0: 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61 66 74     ** below, aft
b0c0: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  er all of the re
b0d0: 73 75 6c 74 2d 73 65 74 73 20 66 6f 72 20 61 6c  sult-sets for al
b0e0: 6c 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e 74  l of the element
b0f0: 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
b100: 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65  compound have be
b110: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20  en resolved..   
b120: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 69 73 43   */.    if( !isC
b130: 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f 6c  ompound && resol
b140: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26  veOrderGroupBy(&
b150: 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65  sNC, p, p->pOrde
b160: 72 42 79 2c 20 22 4f 52 44 45 52 22 29 20 29 7b  rBy, "ORDER") ){
b170: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
b180: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
b190: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
b1a0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
b1b0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
b1c0: 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  t;.    }.  .    
b1d0: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 47  /* Resolve the G
b1e0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
b1f0: 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
b200: 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 0a 20 20  e, make sure .  
b210: 20 20 2a 2a 20 74 68 65 20 47 52 4f 55 50 20 42    ** the GROUP B
b220: 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  Y clause does no
b230: 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67  t contain aggreg
b240: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ate functions.. 
b250: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
b260: 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
b270: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
b280: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
b290: 20 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 6f   .      if( reso
b2a0: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
b2b0: 26 73 4e 43 2c 20 70 2c 20 70 47 72 6f 75 70 42  &sNC, p, pGroupB
b2c0: 79 2c 20 22 47 52 4f 55 50 22 29 20 7c 7c 20 64  y, "GROUP") || d
b2d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b2e0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
b2f0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
b300: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
b310: 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  =0, pItem=pGroup
b320: 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42  By->a; i<pGroupB
b330: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
b340: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
b350: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
b360: 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70  erty(pItem->pExp
b370: 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20  r, EP_Agg) ){.  
b380: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
b390: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
b3a0: 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74  "aggregate funct
b3b0: 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ions are not all
b3c0: 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20  owed in ".      
b3d0: 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f          "the GRO
b3e0: 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  UP BY clause");.
b3f0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
b400: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
b410: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b420: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61    }..    /* Adva
b430: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
b440: 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6f 6d 70  term of the comp
b450: 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ound.    */.    
b460: 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
b470: 20 20 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a     nCompound++;.
b480: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
b490: 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f  e the ORDER BY o
b4a0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  n a compound SEL
b4b0: 45 43 54 20 61 66 74 65 72 20 61 6c 6c 20 74 65  ECT after all te
b4c0: 72 6d 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rms of.  ** the 
b4d0: 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65  compound have be
b4e0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a  en resolved..  *
b4f0: 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75  /.  if( isCompou
b500: 6e 64 20 26 26 20 72 65 73 6f 6c 76 65 43 6f 6d  nd && resolveCom
b510: 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61  poundOrderBy(pPa
b520: 72 73 65 2c 20 70 4c 65 66 74 6d 6f 73 74 29 20  rse, pLeftmost) 
b530: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
b540: 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
b550: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
b560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
b570: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
b580: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
b590: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
b5a0: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
b5b0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  able columns and
b5c0: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
b5d0: 6d 6e 73 2e 20 20 41 74 20 74 68 65 20 73 61 6d  mns.  At the sam
b5e0: 65 20 74 69 6d 65 2c 20 64 6f 20 65 72 72 6f 72  e time, do error
b5f0: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  .** checking on 
b600: 66 75 6e 63 74 69 6f 6e 20 75 73 61 67 65 20 61  function usage a
b610: 6e 64 20 73 65 74 20 61 20 66 6c 61 67 20 69 66  nd set a flag if
b620: 20 61 6e 79 20 61 67 67 72 65 67 61 74 65 20 66   any aggregate f
b630: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  unctions.** are 
b640: 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 72  seen..**.** To r
b650: 65 73 6f 6c 76 65 20 74 61 62 6c 65 20 63 6f 6c  esolve table col
b660: 75 6d 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20  umns references 
b670: 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f 64 65  we look for node
b680: 73 20 28 6f 72 20 73 75 62 74 72 65 65 73 29 20  s (or subtrees) 
b690: 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 72 6d 20  of the .** form 
b6a0: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20  X.Y.Z or Y.Z or 
b6b0: 6a 75 73 74 20 5a 20 77 68 65 72 65 0a 2a 2a 0a  just Z where.**.
b6c0: 2a 2a 20 20 20 20 20 20 58 3a 20 20 20 54 68 65  **      X:   The
b6d0: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
b6e0: 61 73 65 2e 20 20 45 78 3a 20 20 22 6d 61 69 6e  ase.  Ex:  "main
b6f0: 22 20 6f 72 20 22 74 65 6d 70 22 20 6f 72 0a 2a  " or "temp" or.*
b700: 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20  *           the 
b710: 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 61 73  symbolic name as
b720: 73 69 67 6e 65 64 20 74 6f 20 61 6e 20 41 54 54  signed to an ATT
b730: 41 43 48 2d 65 64 20 64 61 74 61 62 61 73 65 2e  ACH-ed database.
b740: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 3a 20 20  .**.**      Y:  
b750: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   The name of a t
b760: 61 62 6c 65 20 69 6e 20 61 20 46 52 4f 4d 20 63  able in a FROM c
b770: 6c 61 75 73 65 2e 20 20 4f 72 20 69 6e 20 61 20  lause.  Or in a 
b780: 74 72 69 67 67 65 72 0a 2a 2a 20 20 20 20 20 20  trigger.**      
b790: 20 20 20 20 20 6f 6e 65 20 6f 66 20 74 68 65 20       one of the 
b7a0: 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22 6f  special names "o
b7b0: 6c 64 22 20 6f 72 20 22 6e 65 77 22 2e 0a 2a 2a  ld" or "new"..**
b7c0: 0a 2a 2a 20 20 20 20 20 20 5a 3a 20 20 20 54 68  .**      Z:   Th
b7d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
b7e0: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 59 2e 0a 2a  mn in table Y..*
b7f0: 2a 0a 2a 2a 20 54 68 65 20 6e 6f 64 65 20 61 74  *.** The node at
b800: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
b810: 20 73 75 62 74 72 65 65 20 69 73 20 6d 6f 64 69   subtree is modi
b820: 66 69 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  fied as follows:
b830: 0a 2a 2a 0a 2a 2a 20 20 20 20 45 78 70 72 2e 6f  .**.**    Expr.o
b840: 70 20 20 20 20 20 20 20 20 43 68 61 6e 67 65 64  p        Changed
b850: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a   to TK_COLUMN.**
b860: 20 20 20 20 45 78 70 72 2e 70 54 61 62 20 20 20      Expr.pTab   
b870: 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65     Points to the
b880: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 66 6f   Table object fo
b890: 72 20 58 2e 59 0a 2a 2a 20 20 20 20 45 78 70 72  r X.Y.**    Expr
b8a0: 2e 69 43 6f 6c 75 6d 6e 20 20 20 54 68 65 20 63  .iColumn   The c
b8b0: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20 58  olumn index in X
b8c0: 2e 59 2e 20 20 2d 31 20 66 6f 72 20 74 68 65 20  .Y.  -1 for the 
b8d0: 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 45 78 70  rowid..**    Exp
b8e0: 72 2e 69 54 61 62 6c 65 20 20 20 20 54 68 65 20  r.iTable    The 
b8f0: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
b900: 65 72 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a 2a 2a  er for X.Y.**.**
b910: 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 72  .** To resolve r
b920: 65 73 75 6c 74 2d 73 65 74 20 72 65 66 65 72 65  esult-set refere
b930: 6e 63 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72 20 65  nces, look for e
b940: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73 20  xpression nodes 
b950: 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 5a  of the.** form Z
b960: 20 28 77 69 74 68 20 6e 6f 20 58 20 61 6e 64 20   (with no X and 
b970: 59 20 70 72 65 66 69 78 29 20 77 68 65 72 65 20  Y prefix) where 
b980: 74 68 65 20 5a 20 6d 61 74 63 68 65 73 20 74 68  the Z matches th
b990: 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20  e right-hand.** 
b9a0: 73 69 7a 65 20 6f 66 20 61 6e 20 41 53 20 63 6c  size of an AS cl
b9b0: 61 75 73 65 20 69 6e 20 74 68 65 20 72 65 73 75  ause in the resu
b9c0: 6c 74 2d 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt-set of a SELE
b9d0: 43 54 2e 20 20 54 68 65 20 5a 20 65 78 70 72 65  CT.  The Z expre
b9e0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 70 6c  ssion.** is repl
b9f0: 61 63 65 64 20 62 79 20 61 20 63 6f 70 79 20 6f  aced by a copy o
ba00: 66 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  f the left-hand 
ba10: 73 69 64 65 20 6f 66 20 74 68 65 20 72 65 73 75  side of the resu
ba20: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
ba30: 6e 2e 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61 6d 65  n..** Table-name
ba40: 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 72 65   and function re
ba50: 73 6f 6c 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  solution occurs 
ba60: 6f 6e 20 74 68 65 20 73 75 62 73 74 69 74 75 74  on the substitut
ba70: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  ed expression.**
ba80: 20 74 72 65 65 2e 20 20 46 6f 72 20 65 78 61 6d   tree.  For exam
ba90: 70 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ple, in:.**.**  
baa0: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41      SELECT a+b A
bab0: 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46 52  S x, c+d AS y FR
bac0: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78  OM t1 ORDER BY x
bad0: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 78 22 20  ;.**.** The "x" 
bae0: 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 72 64 65  term of the orde
baf0: 72 20 62 79 20 69 73 20 72 65 70 6c 61 63 65 64  r by is replaced
bb00: 20 62 79 20 22 61 2b 62 22 20 74 6f 20 72 65 6e   by "a+b" to ren
bb10: 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  der:.**.**      
bb20: 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c  SELECT a+b AS x,
bb30: 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74   c+d AS y FROM t
bb40: 31 20 4f 52 44 45 52 20 42 59 20 61 2b 62 3b 0a  1 ORDER BY a+b;.
bb50: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 63  **.** Function c
bb60: 61 6c 6c 73 20 61 72 65 20 63 68 65 63 6b 65 64  alls are checked
bb70: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
bb80: 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
bb90: 69 73 20 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61  is .** defined a
bba0: 6e 64 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  nd that the corr
bbb0: 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ect number of ar
bbc0: 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63  guments are spec
bbd0: 69 66 69 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65  ified..** If the
bbe0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
bbf0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
bc00: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 4e 43 5f  on, then the NC_
bc10: 48 61 73 41 67 67 20 66 6c 61 67 20 69 73 0a 2a  HasAgg flag is.*
bc20: 2a 20 73 65 74 20 61 6e 64 20 74 68 65 20 6f 70  * set and the op
bc30: 63 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20  code is changed 
bc40: 66 72 6f 6d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  from TK_FUNCTION
bc50: 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54   to TK_AGG_FUNCT
bc60: 49 4f 4e 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ION..** If an ex
bc70: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
bc80: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
bc90: 74 69 6f 6e 73 20 74 68 65 6e 20 74 68 65 20 45  tions then the E
bca0: 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74  P_Agg.** propert
bcb0: 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  y on the express
bcc0: 69 6f 6e 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ion is set..**.*
bcd0: 2a 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  * An error messa
bce0: 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 50  ge is left in pP
bcf0: 61 72 73 65 20 69 66 20 61 6e 79 74 68 69 6e 67  arse if anything
bd00: 20 69 73 20 61 6d 69 73 73 2e 20 20 54 68 65 20   is amiss.  The 
bd10: 6e 75 6d 62 65 72 0a 2a 2a 20 69 66 20 65 72 72  number.** if err
bd20: 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ors is returned.
bd30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52  .*/.int sqlite3R
bd40: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
bd50: 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20   .  NameContext 
bd60: 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e  *pNC,       /* N
bd70: 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f  amespace to reso
bd80: 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lve expressions 
bd90: 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  in. */.  Expr *p
bda0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
bdb0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
bdc0: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
bdd0: 64 2e 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 73 61  d. */.){.  u8 sa
bde0: 76 65 64 48 61 73 41 67 67 3b 0a 20 20 57 61 6c  vedHasAgg;.  Wal
bdf0: 6b 65 72 20 77 3b 0a 0a 20 20 69 66 28 20 70 45  ker w;..  if( pE
be00: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
be10: 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  0;.#if SQLITE_MA
be20: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
be30: 20 7b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50   {.    Parse *pP
be40: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
be50: 73 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  se;.    if( sqli
be60: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
be70: 68 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ht(pParse, pExpr
be80: 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e 70  ->nHeight+pNC->p
be90: 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 20  Parse->nHeight) 
bea0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
beb0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
bec0: 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20  rse->nHeight += 
bed0: 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a  pExpr->nHeight;.
bee0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61 76    }.#endif.  sav
bef0: 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e  edHasAgg = pNC->
bf00: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73  ncFlags & NC_Has
bf10: 41 67 67 3b 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c  Agg;.  pNC->ncFl
bf20: 61 67 73 20 26 3d 20 7e 4e 43 5f 48 61 73 41 67  ags &= ~NC_HasAg
bf30: 67 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  g;.  memset(&w, 
bf40: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
bf50: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
bf60: 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74   = resolveExprSt
bf70: 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ep;.  w.xSelectC
bf80: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76  allback = resolv
bf90: 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77  eSelectStep;.  w
bfa0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
bfb0: 50 61 72 73 65 3b 0a 20 20 77 2e 75 2e 70 4e 43  Parse;.  w.u.pNC
bfc0: 20 3d 20 70 4e 43 3b 0a 20 20 73 71 6c 69 74 65   = pNC;.  sqlite
bfd0: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
bfe0: 78 70 72 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  xpr);.#if SQLITE
bff0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
c000: 30 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d  0.  pNC->pParse-
c010: 3e 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70  >nHeight -= pExp
c020: 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64  r->nHeight;.#end
c030: 69 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45  if.  if( pNC->nE
c040: 72 72 3e 30 20 7c 7c 20 77 2e 70 50 61 72 73 65  rr>0 || w.pParse
c050: 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
c060: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
c070: 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29  pExpr, EP_Error)
c080: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d  ;.  }.  if( pNC-
c090: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61  >ncFlags & NC_Ha
c0a0: 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72  sAgg ){.    Expr
c0b0: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
c0c0: 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 65  r, EP_Agg);.  }e
c0d0: 6c 73 65 20 69 66 28 20 73 61 76 65 64 48 61 73  lse if( savedHas
c0e0: 41 67 67 20 29 7b 0a 20 20 20 20 70 4e 43 2d 3e  Agg ){.    pNC->
c0f0: 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 48 61  ncFlags |= NC_Ha
c100: 73 41 67 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sAgg;.  }.  retu
c110: 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
c120: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
c130: 6f 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52  or);.}.../*.** R
c140: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
c150: 20 69 6e 20 61 6c 6c 20 65 78 70 72 65 73 73 69   in all expressi
c160: 6f 6e 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ons of a SELECT 
c170: 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65  and in all.** de
c180: 63 65 6e 64 65 6e 74 73 20 6f 66 20 74 68 65 20  cendents of the 
c190: 53 45 4c 45 43 54 2c 20 69 6e 63 6c 75 64 69 6e  SELECT, includin
c1a0: 67 20 63 6f 6d 70 6f 75 6e 64 73 20 6f 66 66 20  g compounds off 
c1b0: 6f 66 20 70 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a  of p->pPrior,.**
c1c0: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 65   subqueries in e
c1d0: 78 70 72 65 73 73 69 6f 6e 73 2c 20 61 6e 64 20  xpressions, and 
c1e0: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
c1f0: 61 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  as FROM clause.*
c200: 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53  * terms..**.** S
c210: 65 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ee sqlite3Resolv
c220: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 66 6f 72  eExprNames() for
c230: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
c240: 66 20 74 68 65 20 6b 69 6e 64 73 20 6f 66 0a 2a  f the kinds of.*
c250: 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  * transformation
c260: 73 20 74 68 61 74 20 6f 63 63 75 72 2e 0a 2a 2a  s that occur..**
c270: 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 73  .** All SELECT s
c280: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
c290: 20 68 61 76 65 20 62 65 65 6e 20 65 78 70 61 6e   have been expan
c2a0: 64 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ded using.** sql
c2b0: 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
c2c0: 28 29 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  () prior to invo
c2d0: 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
c2e0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
c2f0: 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
c300: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
c310: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
c320: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
c330: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
c340: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
c350: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
c360: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
c370: 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
c380: 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
c390: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
c3a0: 74 20 66 6f 72 20 70 61 72 65 6e 74 20 53 45 4c  t for parent SEL
c3b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
c3c0: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  .){.  Walker w;.
c3d0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
c3e0: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  );.  memset(&w, 
c3f0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
c400: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
c410: 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74   = resolveExprSt
c420: 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ep;.  w.xSelectC
c430: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76  allback = resolv
c440: 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77  eSelectStep;.  w
c450: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
c460: 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4f  ;.  w.u.pNC = pO
c470: 75 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69 74 65  uterNC;.  sqlite
c480: 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
c490: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
c4a0: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 65 78  olve names in ex
c4b0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 63  pressions that c
c4c0: 61 6e 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63  an only referenc
c4d0: 65 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  e a single table
c4e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 43  :.**.**    *   C
c4f0: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
c500: 0a 2a 2a 20 20 20 20 2a 20 20 20 57 48 45 52 45  .**    *   WHERE
c510: 20 63 6c 61 75 73 65 73 20 6f 6e 20 70 61 72 74   clauses on part
c520: 69 61 6c 20 69 6e 64 69 63 65 73 0a 2a 2a 0a 2a  ial indices.**.*
c530: 2a 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c  * The Expr.iTabl
c540: 65 20 76 61 6c 75 65 20 66 6f 72 20 45 78 70 72  e value for Expr
c550: 2e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  .op==TK_COLUMN n
c560: 6f 64 65 73 20 6f 66 20 74 68 65 20 65 78 70 72  odes of the expr
c570: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 73 65 74  ession.** is set
c580: 20 74 6f 20 2d 31 20 61 6e 64 20 74 68 65 20 45   to -1 and the E
c590: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
c5a0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
c5b0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a  column number..*
c5c0: 2a 0a 2a 2a 20 41 6e 79 20 65 72 72 6f 72 73 20  *.** Any errors 
c5d0: 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 6d  cause an error m
c5e0: 65 73 73 61 67 65 20 74 6f 20 62 65 20 73 65 74  essage to be set
c5f0: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
c600: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  oid sqlite3Resol
c610: 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
c620: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c630: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
c640: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
c650: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
c660: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
c670: 62 65 69 6e 67 20 72 65 66 65 72 65 6e 63 65 64  being referenced
c680: 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20   */.  int type, 
c690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 43 5f            /* NC_
c6a0: 49 73 43 68 65 63 6b 20 6f 72 20 4e 43 5f 50 61  IsCheck or NC_Pa
c6b0: 72 74 49 64 78 20 2a 2f 0a 20 20 45 78 70 72 20  rtIdx */.  Expr 
c6c0: 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f  *pExpr,        /
c6d0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  * Expression to 
c6e0: 72 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65  resolve.  May be
c6f0: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 45 78 70 72   NULL. */.  Expr
c700: 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20  List *pList     
c710: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69  /* Expression li
c720: 73 74 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20 20  st to resolve.  
c730: 4d 61 79 20 62 65 20 4e 55 4c 2e 20 2a 2f 0a 29  May be NUL. */.)
c740: 7b 0a 20 20 53 72 63 4c 69 73 74 20 73 53 72 63  {.  SrcList sSrc
c750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c760: 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c      /* Fake SrcL
c770: 69 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ist for pParse->
c780: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 4e  pNewTable */.  N
c790: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7b0: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
c7c0: 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  or pParse->pNewT
c7d0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  able */.  int i;
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c800: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
c810: 61 73 73 65 72 74 28 20 74 79 70 65 3d 3d 4e 43  assert( type==NC
c820: 5f 49 73 43 68 65 63 6b 20 7c 7c 20 74 79 70 65  _IsCheck || type
c830: 3d 3d 4e 43 5f 50 61 72 74 49 64 78 20 29 3b 0a  ==NC_PartIdx );.
c840: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
c850: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
c860: 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20    memset(&sSrc, 
c870: 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29  0, sizeof(sSrc))
c880: 3b 0a 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20  ;.  sSrc.nSrc = 
c890: 31 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a  1;.  sSrc.a[0].z
c8a0: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
c8b0: 6d 65 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e  me;.  sSrc.a[0].
c8c0: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 73  pTab = pTab;.  s
c8d0: 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  Src.a[0].iCursor
c8e0: 20 3d 20 2d 31 3b 0a 20 20 73 4e 43 2e 70 50 61   = -1;.  sNC.pPa
c8f0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
c900: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26  sNC.pSrcList = &
c910: 73 53 72 63 3b 0a 20 20 73 4e 43 2e 6e 63 46 6c  sSrc;.  sNC.ncFl
c920: 61 67 73 20 3d 20 74 79 70 65 3b 0a 20 20 69 66  ags = type;.  if
c930: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
c940: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
c950: 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b  pExpr) ) return;
c960: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
c970: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c980: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
c990: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c9a0: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
c9b0: 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c 69 73 74  ames(&sNC, pList
c9c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b  ->a[i].pExpr) ){
c9d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b  .        return;
c9e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c9f0: 20 7d 0a 7d 0a                                    }.}.