/ Hex Artifact Content
Login

Artifact 203146a9adfed08c94cdb4bd59421b066a00e03f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 18.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 77  tines used for w
01a0: 61 6c 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65  alking the parse
01b0: 72 20 74 72 65 65 20 61 6e 64 0a 2a 2a 20 72 65  r tree and.** re
01c0: 73 6f 6c 76 65 20 61 6c 6c 20 69 64 65 6e 74 69  solve all identi
01d0: 66 69 65 72 73 20 62 79 20 61 73 73 6f 63 69 61  fiers by associa
01e0: 74 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 61  ting them with a
01f0: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 74   particular.** t
0200: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
0210: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0220: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
0230: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0240: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0250: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  h>../*.** Walk t
0260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
0270: 65 65 20 70 45 78 70 72 20 61 6e 64 20 69 6e 63  ee pExpr and inc
0280: 72 65 61 73 65 20 74 68 65 20 61 67 67 72 65 67  rease the aggreg
0290: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
02a0: 64 65 70 74 68 20 28 74 68 65 20 45 78 70 72 2e  depth (the Expr.
02b0: 6f 70 32 20 66 69 65 6c 64 29 20 62 79 20 4e 20  op2 field) by N 
02c0: 6f 6e 20 65 76 65 72 79 20 54 4b 5f 41 47 47 5f  on every TK_AGG_
02d0: 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 2e 0a 2a  FUNCTION node..*
02e0: 2a 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  * This needs to 
02f0: 6f 63 63 75 72 20 77 68 65 6e 20 63 6f 70 79 69  occur when copyi
0300: 6e 67 20 61 20 54 4b 5f 41 47 47 5f 46 55 4e 43  ng a TK_AGG_FUNC
0310: 54 49 4f 4e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  TION node from a
0320: 6e 0a 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79  n.** outer query
0330: 20 69 6e 74 6f 20 61 6e 20 69 6e 6e 65 72 20 73   into an inner s
0340: 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 69  ubquery..**.** i
0350: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0360: 70 74 68 28 70 45 78 70 72 2c 6e 29 20 69 73 20  pth(pExpr,n) is 
0370: 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65  the main routine
0380: 2e 20 20 69 6e 63 72 41 67 67 44 65 70 74 68 28  .  incrAggDepth(
0390: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 68 65 6c 70  ..).** is a help
03a0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 2d 20 61 20  er function - a 
03b0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
03c0: 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2f   tree walker..*/
03d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
03e0: 41 67 67 44 65 70 74 68 28 57 61 6c 6b 65 72 20  AggDepth(Walker 
03f0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
0400: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
0410: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
0420: 46 55 4e 43 54 49 4f 4e 20 29 20 70 45 78 70 72  FUNCTION ) pExpr
0430: 2d 3e 6f 70 32 20 2b 3d 20 70 57 61 6c 6b 65 72  ->op2 += pWalker
0440: 2d 3e 75 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20  ->u.n;.  return 
0450: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
0460: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72  static void incr
0470: 41 67 67 46 75 6e 63 74 69 6f 6e 44 65 70 74 68  AggFunctionDepth
0480: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
0490: 74 20 4e 29 7b 0a 20 20 69 66 28 20 4e 3e 30 20  t N){.  if( N>0 
04a0: 29 7b 0a 20 20 20 20 57 61 6c 6b 65 72 20 77 3b  ){.    Walker w;
04b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  .    memset(&w, 
04c0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
04d0: 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61     w.xExprCallba
04e0: 63 6b 20 3d 20 69 6e 63 72 41 67 67 44 65 70 74  ck = incrAggDept
04f0: 68 3b 0a 20 20 20 20 77 2e 75 2e 6e 20 3d 20 4e  h;.    w.u.n = N
0500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
0510: 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
0520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
0530: 75 72 6e 20 74 68 65 20 70 45 78 70 72 20 65 78  urn the pExpr ex
0540: 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 6e  pression into an
0550: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 69   alias for the i
0560: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
0570: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 73   the.** result s
0580: 65 74 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2a  et in pEList..**
0590: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 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 20 76 61 6c 75 65 20 69 73 0a   usual value is.
0bb0: 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74 20 6d  ** zero but it m
0bc0: 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69 66 20  ight be more if 
0bd0: 74 68 65 20 61 6c 69 61 73 20 69 73 20 63 6f 6e  the alias is con
0be0: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
0bf0: 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66 20 74  subquery.** of t
0c00: 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72  he original expr
0c10: 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45 78 70  ession.  The Exp
0c20: 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66 20 54  r.op2 field of T
0c30: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 0a 2a  K_AGG_FUNCTION.*
0c40: 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d 75 73  * structures mus
0c50: 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  t be increased b
0c60: 79 20 74 68 65 20 6e 53 75 62 71 75 65 72 79 20  y the nSubquery 
0c70: 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  amount..*/.stati
0c80: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 41 6c  c void resolveAl
0c90: 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ias(.  Parse *pP
0ca0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
0cb0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
0cc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
0cd0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20  pEList,      /* 
0ce0: 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  A result set */.
0cf0: 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
0d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
0d10: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
0d20: 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45 4c 69  lt set.  0..pELi
0d30: 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f 0a 20  st->nExpr-1 */. 
0d40: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
0d50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
0d60: 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f 20 61  form this into a
0d70: 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 72  n alias to the r
0d80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63  esult set */.  c
0d90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
0da0: 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55 50 22  ,     /* "GROUP"
0db0: 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22   or "ORDER" or "
0dc0: 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 71  " */.  int nSubq
0dd0: 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a  uery          /*
0de0: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 71 75   Number of subqu
0df0: 65 72 69 65 73 20 74 68 61 74 20 74 68 65 20 6c  eries that the l
0e00: 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67 20 2a  abel is moving *
0e10: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4f 72  /.){.  Expr *pOr
0e20: 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ig;           /*
0e30: 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   The iCol-th col
0e40: 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  umn of the resul
0e50: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
0e60: 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20  *pDup;          
0e70: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 4f 72    /* Copy of pOr
0e80: 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ig */.  sqlite3 
0e90: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
0ea0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
0eb0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
0ec0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
0ed0: 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74 2d 3e  && iCol<pEList->
0ee0: 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72 69 67  nExpr );.  pOrig
0ef0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f   = pEList->a[iCo
0f00: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  l].pExpr;.  asse
0f10: 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29 3b 0a  rt( pOrig!=0 );.
0f20: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0f30: 62 3b 0a 20 20 70 44 75 70 20 3d 20 73 71 6c 69  b;.  pDup = sqli
0f40: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
0f50: 4f 72 69 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  Orig, 0);.  if( 
0f60: 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  pDup==0 ) return
0f70: 3b 0a 20 20 69 66 28 20 70 4f 72 69 67 2d 3e 6f  ;.  if( pOrig->o
0f80: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
0f90: 7a 54 79 70 65 5b 30 5d 21 3d 27 47 27 20 29 7b  zType[0]!='G' ){
0fa0: 0a 20 20 20 20 69 6e 63 72 41 67 67 46 75 6e 63  .    incrAggFunc
0fb0: 74 69 6f 6e 44 65 70 74 68 28 70 44 75 70 2c 20  tionDepth(pDup, 
0fc0: 6e 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  nSubquery);.    
0fd0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 50 45  pDup = sqlite3PE
0fe0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41  xpr(pParse, TK_A
0ff0: 53 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a  S, pDup, 0, 0);.
1000: 20 20 20 20 69 66 28 20 70 44 75 70 3d 3d 30 20      if( pDup==0 
1010: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 45 78  ) return;.    Ex
1020: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  prSetProperty(pD
1030: 75 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 20 20  up, EP_Skip);.  
1040: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
1050: 69 43 6f 6c 5d 2e 75 2e 78 2e 69 41 6c 69 61 73  iCol].u.x.iAlias
1060: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 4c  ==0 ){.      pEL
1070: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 75 2e 78  ist->a[iCol].u.x
1080: 2e 69 41 6c 69 61 73 20 3d 20 28 75 31 36 29 28  .iAlias = (u16)(
1090: 2b 2b 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  ++pParse->nAlias
10a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 75  );.    }.    pDu
10b0: 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 4c 69  p->iTable = pELi
10c0: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 75 2e 78 2e  st->a[iCol].u.x.
10d0: 69 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 69 66  iAlias;.  }.  if
10e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
10f0: 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 70  COLLATE ){.    p
1100: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
1110: 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
1120: 67 28 70 50 61 72 73 65 2c 20 70 44 75 70 2c 20  g(pParse, pDup, 
1130: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1140: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
1150: 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  re calling sqlit
1160: 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 2c 20  e3ExprDelete(), 
1170: 73 65 74 20 74 68 65 20 45 50 5f 53 74 61 74 69  set the EP_Stati
1180: 63 20 66 6c 61 67 2e 20 54 68 69 73 20 0a 20 20  c flag. This .  
1190: 2a 2a 20 70 72 65 76 65 6e 74 73 20 45 78 70 72  ** prevents Expr
11a0: 44 65 6c 65 74 65 28 29 20 66 72 6f 6d 20 64 65  Delete() from de
11b0: 6c 65 74 69 6e 67 20 74 68 65 20 45 78 70 72 20  leting the Expr 
11c0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
11d0: 2c 0a 20 20 2a 2a 20 61 6c 6c 6f 77 69 6e 67 20  ,.  ** allowing 
11e0: 69 74 20 74 6f 20 62 65 20 72 65 70 6f 70 75 6c  it to be repopul
11f0: 61 74 65 64 20 62 79 20 74 68 65 20 6d 65 6d 63  ated by the memc
1200: 70 79 28 29 20 6f 6e 20 74 68 65 20 66 6f 6c 6c  py() on the foll
1210: 6f 77 69 6e 67 20 6c 69 6e 65 2e 0a 20 20 2a 2a  owing line..  **
1220: 20 54 68 65 20 70 45 78 70 72 2d 3e 75 2e 7a 54   The pExpr->u.zT
1230: 6f 6b 65 6e 20 6d 69 67 68 74 20 70 6f 69 6e 74  oken might point
1240: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61   into memory tha
1250: 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
1260: 62 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  by the.  ** sqli
1270: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
1280: 75 70 29 20 6f 6e 20 74 68 65 20 6c 61 73 74 20  up) on the last 
1290: 6c 69 6e 65 20 6f 66 20 74 68 69 73 20 62 6c 6f  line of this blo
12a0: 63 6b 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  ck, so be sure t
12b0: 6f 0a 20 20 2a 2a 20 6d 61 6b 65 20 61 20 63 6f  o.  ** make a co
12c0: 70 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  py of the token 
12d0: 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 65  before doing the
12e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
12f0: 2e 0a 20 20 2a 2f 0a 20 20 45 78 70 72 53 65 74  ..  */.  ExprSet
1300: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1310: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 73 71  EP_Static);.  sq
1320: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1330: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 6d 65  db, pExpr);.  me
1340: 6d 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70  mcpy(pExpr, pDup
1350: 2c 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29  , sizeof(*pExpr)
1360: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
1370: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1380: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
1390: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13a0: 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
13b0: 74 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  t( (pExpr->flags
13c0: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
13d0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30  P_TokenOnly))==0
13e0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 75   );.    pExpr->u
13f0: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
1400: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
1410: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1420: 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73      pExpr->flags
1430: 20 7c 3d 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 3b   |= EP_MemToken;
1440: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1450: 46 72 65 65 28 64 62 2c 20 70 44 75 70 29 3b 0a  Free(db, pDup);.
1460: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
1470: 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
1480: 65 20 7a 43 6f 6c 20 6f 63 63 75 72 73 20 61 6e  e zCol occurs an
1490: 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 55 53  ywhere in the US
14a0: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ING clause..**.*
14b0: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
14c0: 66 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  f the USING clau
14d0: 73 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  se is NULL or if
14e0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   it does not con
14f0: 74 61 69 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a 2f  tain.** zCol..*/
1500: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
1510: 49 6e 55 73 69 6e 67 43 6c 61 75 73 65 28 49 64  InUsingClause(Id
1520: 4c 69 73 74 20 2a 70 55 73 69 6e 67 2c 20 63 6f  List *pUsing, co
1530: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
1540: 0a 20 20 69 66 28 20 70 55 73 69 6e 67 20 29 7b  .  if( pUsing ){
1550: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
1560: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e  for(k=0; k<pUsin
1570: 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20  g->nId; k++){.  
1580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1590: 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61  trICmp(pUsing->a
15a0: 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [k].zName, zCol)
15b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
15c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
15e0: 75 62 71 75 65 72 69 65 73 20 73 74 6f 72 65 73  ubqueries stores
15f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1600: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
1610: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  d column names f
1620: 6f 72 20 74 68 65 69 72 0a 2a 2a 20 72 65 73 75  or their.** resu
1630: 6c 74 20 73 65 74 73 20 69 6e 20 45 78 70 72 4c  lt sets in ExprL
1640: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 2c 20 69  ist.a[].zSpan, i
1650: 6e 20 74 68 65 20 66 6f 72 6d 20 22 44 41 54 41  n the form "DATA
1660: 42 41 53 45 2e 54 41 42 4c 45 2e 43 4f 4c 55 4d  BASE.TABLE.COLUM
1670: 4e 22 2e 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  N"..** Check to 
1680: 73 65 65 20 69 66 20 74 68 65 20 7a 53 70 61 6e  see if the zSpan
1690: 20 67 69 76 65 6e 20 74 6f 20 74 68 69 73 20 72   given to this r
16a0: 6f 75 74 69 6e 65 20 6d 61 74 63 68 65 73 20 74  outine matches t
16b0: 68 65 20 7a 44 62 2c 20 7a 54 61 62 2c 0a 2a 2a  he zDb, zTab,.**
16c0: 20 61 6e 64 20 7a 43 6f 6c 2e 20 20 49 66 20 61   and zCol.  If a
16d0: 6e 79 20 6f 66 20 7a 44 62 2c 20 7a 54 61 62 2c  ny of zDb, zTab,
16e0: 20 61 6e 64 20 7a 43 6f 6c 20 61 72 65 20 4e 55   and zCol are NU
16f0: 4c 4c 20 74 68 65 6e 20 74 68 6f 73 65 20 66 69  LL then those fi
1700: 65 6c 64 73 20 77 69 6c 6c 0a 2a 2a 20 6d 61 74  elds will.** mat
1710: 63 68 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2f 0a  ch anything..*/.
1720: 69 6e 74 20 73 71 6c 69 74 65 33 4d 61 74 63 68  int sqlite3Match
1730: 53 70 61 6e 4e 61 6d 65 28 0a 20 20 63 6f 6e 73  SpanName(.  cons
1740: 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 2c 0a 20  t char *zSpan,. 
1750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1760: 6c 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l,.  const char 
1770: 2a 7a 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  *zTab,.  const c
1780: 68 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20 69 6e  har *zDb.){.  in
1790: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
17a0: 41 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29  ALWAYS(zSpan[n])
17b0: 20 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e   && zSpan[n]!='.
17c0: 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; n++){}.  if( 
17d0: 7a 44 62 20 26 26 20 28 73 71 6c 69 74 65 33 53  zDb && (sqlite3S
17e0: 74 72 4e 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a  trNICmp(zSpan, z
17f0: 44 62 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 44 62  Db, n)!=0 || zDb
1800: 5b 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  [n]!=0) ){.    r
1810: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
1820: 53 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 66  Span += n+1;.  f
1830: 6f 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a  or(n=0; ALWAYS(z
1840: 53 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61  Span[n]) && zSpa
1850: 6e 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b  n[n]!='.'; n++){
1860: 7d 0a 20 20 69 66 28 20 7a 54 61 62 20 26 26 20  }.  if( zTab && 
1870: 28 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  (sqlite3StrNICmp
1880: 28 7a 53 70 61 6e 2c 20 7a 54 61 62 2c 20 6e 29  (zSpan, zTab, n)
1890: 21 3d 30 20 7c 7c 20 7a 54 61 62 5b 6e 5d 21 3d  !=0 || zTab[n]!=
18a0: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
18b0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20   0;.  }.  zSpan 
18c0: 2b 3d 20 6e 2b 31 3b 0a 20 20 69 66 28 20 7a 43  += n+1;.  if( zC
18d0: 6f 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  ol && sqlite3Str
18e0: 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 43 6f 6c  ICmp(zSpan, zCol
18f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1900: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1910: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 1;.}../*.** G
1920: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1930: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65   a column of the
1940: 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59   form X.Y.Z or Y
1950: 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f  .Z or just Z, lo
1960: 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61  ok up.** that na
1970: 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66  me in the set of
1980: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69   source tables i
1990: 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d  n pSrcList and m
19a0: 61 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a  ake the pExpr .*
19b0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  * expression nod
19c0: 65 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20  e refer back to 
19d0: 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75  that source colu
19e0: 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  mn.  The followi
19f0: 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ng changes.** ar
1a00: 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a  e made to pExpr:
1a10: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  .**.**    pExpr-
1a20: 3e 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53  >iDb           S
1a30: 65 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  et the index in 
1a40: 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65  db->aDb[] of the
1a50: 20 64 61 74 61 62 61 73 65 20 58 0a 2a 2a 20 20   database X.**  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 28 65 76 65 6e 20 69 66 20         (even if 
1a80: 58 20 69 73 20 69 6d 70 6c 69 65 64 29 2e 0a 2a  X is implied)..*
1a90: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  *    pExpr->iTab
1aa0: 6c 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f  le        Set to
1ab0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
1ac0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
1ad0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20   obtained.**    
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69       from pSrcLi
1b00: 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  st..**    pExpr-
1b10: 3e 70 54 61 62 20 20 20 20 20 20 20 20 20 20 50  >pTab          P
1b20: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62  oints to the Tab
1b30: 6c 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  le structure of 
1b40: 58 2e 59 20 28 65 76 65 6e 20 69 66 0a 2a 2a 20  X.Y (even if.** 
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 58 20 61 6e 64 2f 6f 72          X and/or
1b70: 20 59 20 61 72 65 20 69 6d 70 6c 69 65 64 2e 29   Y are implied.)
1b80: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .**    pExpr->iC
1b90: 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20  olumn       Set 
1ba0: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  to the column nu
1bb0: 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65 20  mber within the 
1bc0: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
1bd0: 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
1be0: 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55    Set to TK_COLU
1bf0: 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  MN..**    pExpr-
1c00: 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20 41  >pLeft         A
1c10: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
1c20: 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20  is points to is 
1c30: 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45  deleted.**    pE
1c40: 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20  xpr->pRight     
1c50: 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f     Any expressio
1c60: 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f  n this points to
1c70: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
1c80: 2a 2a 20 54 68 65 20 7a 44 62 20 76 61 72 69 61  ** The zDb varia
1c90: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
1ca0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1cb0: 28 74 68 65 20 22 58 22 29 2e 20 20 54 68 69 73  (the "X").  This
1cc0: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a   value may be.**
1cd0: 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68   NULL meaning th
1ce0: 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68  at name is of th
1cf0: 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e  e form Y.Z or Z.
1d00: 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20    Any available 
1d10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20  database.** can 
1d20: 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 7a 54  be used.  The zT
1d30: 61 62 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73  able variable is
1d40: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1d50: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
1d60: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
1d70: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
1d80: 7a 44 62 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  zDb is also NULL
1d90: 2e 20 20 49 66 20 7a 54 61 62 6c 65 20 69 73 20  .  If zTable is 
1da0: 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  NULL it.** means
1db0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f   that the form o
1dc0: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20  f the name is Z 
1dd0: 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73  and that columns
1de0: 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a   from any table.
1df0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  ** can be used..
1e00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d  **.** If the nam
1e10: 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f  e cannot be reso
1e20: 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73  lved unambiguous
1e30: 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ly, leave an err
1e40: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
1e50: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
1e60: 72 6e 20 57 52 43 5f 41 62 6f 72 74 2e 20 20 52  rn WRC_Abort.  R
1e70: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 20  eturn WRC_Prune 
1e80: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73  on success..*/.s
1e90: 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70  tatic int lookup
1ea0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
1eb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
1ec0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1ed0: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
1ee0: 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 2f 2a  har *zDb,     /*
1ef0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1f00: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1f10: 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20   table, or NULL 
1f20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1f30: 2a 7a 54 61 62 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zTab,    /* Nam
1f40: 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61  e of table conta
1f50: 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72  ining column, or
1f60: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
1f70: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
1f80: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
1f90: 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65  olumn. */.  Name
1fa0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
1fb0: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e   /* The name con
1fc0: 74 65 78 74 20 75 73 65 64 20 74 6f 20 72 65 73  text used to res
1fd0: 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f  olve the name */
1fe0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
1ff0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
2000: 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70  this EXPR node p
2010: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65  oint to the sele
2020: 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29  cted column */.)
2030: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2060: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2070: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2090: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
20a0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
20b0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62   */.  int cntTab
20c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20e0: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61  r of matching ta
20f0: 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  ble names */.  i
2100: 6e 74 20 6e 53 75 62 71 75 65 72 79 20 3d 20 30  nt nSubquery = 0
2110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2120: 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 6c 65 76   /* How many lev
2130: 65 6c 73 20 6f 66 20 73 75 62 71 75 65 72 79 20  els of subquery 
2140: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2150: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
2160: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2170: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2180: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  n */.  struct Sr
2190: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
21a0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  m;       /* Use 
21b0: 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  for looping over
21c0: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20   pSrcList items 
21d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
21e0: 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68  ist_item *pMatch
21f0: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61   = 0;  /* The ma
2200: 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20  tching pSrcList 
2210: 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  item */.  NameCo
2220: 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20  ntext *pTopNC = 
2230: 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  pNC;        /* F
2240: 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74  irst namecontext
2250: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
2260: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
2270: 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
2280: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
2290: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22a0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 72 69 67 67  */.  int isTrigg
22b0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
22c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
22d0: 66 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  f resolved to a 
22e0: 74 72 69 67 67 65 72 20 63 6f 6c 75 6d 6e 20 2a  trigger column *
22f0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
2300: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2310: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68        /* Table h
2320: 6f 6c 64 20 74 68 65 20 72 6f 77 20 2a 2f 0a 20  old the row */. 
2330: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 20 20   Column *pCol;  
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6f     /* A column o
2360: 66 20 70 54 61 62 20 2a 2f 0a 0a 20 20 61 73 73  f pTab */..  ass
2370: 65 72 74 28 20 70 4e 43 20 29 3b 20 20 20 20 20  ert( pNC );     
2380: 2f 2a 20 74 68 65 20 6e 61 6d 65 20 63 6f 6e 74  /* the name cont
2390: 65 78 74 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  ext cannot be NU
23a0: 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  LL. */.  assert(
23b0: 20 7a 43 6f 6c 20 29 3b 20 20 20 20 2f 2a 20 54   zCol );    /* T
23c0: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
23d0: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
23e0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23f0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2400: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2410: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 0a 20  P_Reduced) );.. 
2420: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2430: 68 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d 6d 61  he node to no-ma
2440: 74 63 68 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e  tch */.  pExpr->
2450: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 70  iTable = -1;.  p
2460: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  Expr->pTab = 0;.
2470: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2480: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
2490: 6f 52 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a 20  oReduce);..  /* 
24a0: 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 73 63  Translate the sc
24b0: 68 65 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44 62  hema name in zDb
24c0: 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
24d0: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
24e0: 64 69 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d 61  ding.  ** schema
24f0: 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  .  If not found,
2500: 20 70 53 63 68 65 6d 61 20 77 69 6c 6c 20 72 65   pSchema will re
2510: 6d 61 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e 6f  main NULL and no
2520: 74 68 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63 68  thing will match
2530: 0a 20 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20  .  ** resulting 
2540: 69 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  in an appropriat
2550: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2560: 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 20 6f  toward the end o
2570: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  f this routine. 
2580: 20 2a 2f 0a 20 20 69 66 28 20 7a 44 62 20 29 7b   */.  if( zDb ){
2590: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
25a0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
25b0: 5f 50 61 72 74 49 64 78 20 29 3b 0a 20 20 20 20  _PartIdx );.    
25c0: 74 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e  testcase( pNC->n
25d0: 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68  cFlags & NC_IsCh
25e0: 65 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 28  eck );.    if( (
25f0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28  pNC->ncFlags & (
2600: 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 73  NC_PartIdx|NC_Is
2610: 43 68 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20 20  Check))!=0 ){.  
2620: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
2630: 69 67 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20  ignore database 
2640: 71 75 61 6c 69 66 69 65 72 73 20 69 6e 73 69 64  qualifiers insid
2650: 65 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  e CHECK constrai
2660: 6e 74 73 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  nts and.      **
2670: 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73   partial indices
2680: 2e 20 20 44 6f 20 6e 6f 74 20 72 61 69 73 65 20  .  Do not raise 
2690: 65 72 72 6f 72 73 20 62 65 63 61 75 73 65 20 74  errors because t
26a0: 68 61 74 20 6d 69 67 68 74 20 62 72 65 61 6b 0a  hat might break.
26b0: 20 20 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20        ** legacy 
26c0: 61 6e 64 20 62 65 63 61 75 73 65 20 69 74 20 64  and because it d
26d0: 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 61 6e 79  oes not hurt any
26e0: 74 68 69 6e 67 20 74 6f 20 6a 75 73 74 20 69 67  thing to just ig
26f0: 6e 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a  nore the.      *
2700: 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  * database name.
2710: 20 2a 2f 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   */.      zDb = 
2720: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2730: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
2740: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
2760: 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20 29  ->aDb[i].zName )
2770: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2780: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
2790: 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 44  >aDb[i].zName,zD
27a0: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
27b0: 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d     pSchema = db-
27c0: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[i].pSchema;
27d0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
27e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2800: 20 2f 2a 20 53 74 61 72 74 20 61 74 20 74 68 65   /* Start at the
2810: 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e 74   inner-most cont
2820: 65 78 74 20 61 6e 64 20 6d 6f 76 65 20 6f 75 74  ext and move out
2830: 77 61 72 64 20 75 6e 74 69 6c 20 61 20 6d 61 74  ward until a mat
2840: 63 68 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ch is found */. 
2850: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63   while( pNC && c
2860: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  nt==0 ){.    Exp
2870: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
2880: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
2890: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
28a0: 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70  List;..    if( p
28b0: 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  SrcList ){.     
28c0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
28d0: 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pSrcList->a; i<p
28e0: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
28f0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2900: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 74        pTab = pIt
2910: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
2920: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
2930: 30 20 26 26 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  0 && pTab->zName
2940: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
2950: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
2960: 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
2970: 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
2980: 74 20 26 26 20 28 70 49 74 65 6d 2d 3e 70 53 65  t && (pItem->pSe
2990: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
29a0: 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
29b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29c0: 69 6e 74 20 68 69 74 20 3d 20 30 3b 0a 20 20 20  int hit = 0;.   
29d0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
29e0: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
29f0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
2a00: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c    for(j=0; j<pEL
2a10: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
2a20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2a30: 28 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  ( sqlite3MatchSp
2a40: 61 6e 4e 61 6d 65 28 70 45 4c 69 73 74 2d 3e 61  anName(pEList->a
2a50: 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 7a 43 6f 6c 2c  [j].zSpan, zCol,
2a60: 20 7a 54 61 62 2c 20 7a 44 62 29 20 29 7b 0a 20   zTab, zDb) ){. 
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74               cnt
2a80: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2a90: 20 20 63 6e 74 54 61 62 20 3d 20 32 3b 0a 20 20    cntTab = 2;.  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74              pMat
2ab0: 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20  ch = pItem;.    
2ac0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2ad0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 68 69 74 20              hit 
2af0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2b00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2b10: 20 20 20 20 20 20 20 20 20 69 66 28 20 68 69 74           if( hit
2b20: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 63 6f   || zTab==0 ) co
2b30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2b40: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 44  }.        if( zD
2b50: 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
2b60: 6d 61 21 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20  ma!=pSchema ){. 
2b70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2b80: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2b90: 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b       if( zTab ){
2ba0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
2bb0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
2bc0: 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  = pItem->zAlias 
2bd0: 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ? pItem->zAlias 
2be0: 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  : pTab->zName;. 
2bf0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c00: 20 7a 54 61 62 4e 61 6d 65 21 3d 30 20 29 3b 0a   zTabName!=0 );.
2c10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2c20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
2c30: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
2c40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
2c50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c70: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63         if( 0==(c
2c80: 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20  ntTab++) ){.    
2c90: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
2ca0: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Item;.        }.
2cb0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
2cc0: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
2cd0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
2ce0: 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  j++, pCol++){.  
2cf0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2d00: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
2d10: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
2d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d30: 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 73 20  /* If there has 
2d40: 62 65 65 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65  been exactly one
2d50: 20 70 72 69 6f 72 20 6d 61 74 63 68 20 61 6e 64   prior match and
2d60: 20 74 68 69 73 20 6d 61 74 63 68 0a 20 20 20 20   this match.    
2d70: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 66 6f          ** is fo
2d80: 72 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  r the right-hand
2d90: 20 74 61 62 6c 65 20 6f 66 20 61 20 4e 41 54 55   table of a NATU
2da0: 52 41 4c 20 4a 4f 49 4e 20 6f 72 20 69 73 20 69  RAL JOIN or is i
2db0: 6e 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20  n a .           
2dc0: 20 2a 2a 20 55 53 49 4e 47 20 63 6c 61 75 73 65   ** USING clause
2dd0: 2c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 69 73  , then skip this
2de0: 20 6d 61 74 63 68 2e 0a 20 20 20 20 20 20 20 20   match..        
2df0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2e00: 20 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b     if( cnt==1 ){
2e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2e20: 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69  f( pItem->fg.joi
2e30: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
2e40: 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2e60: 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75   nameInUsingClau
2e70: 73 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  se(pItem->pUsing
2e80: 2c 20 7a 43 6f 6c 29 20 29 20 63 6f 6e 74 69 6e  , zCol) ) contin
2e90: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2ea0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  }.            cn
2eb0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
2ec0: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
2ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2ee0: 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72  Substitute the r
2ef0: 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29  owid (column -1)
2f00: 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52   for the INTEGER
2f10: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2f30: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d  r->iColumn = j==
2f40: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31  pTab->iPKey ? -1
2f50: 20 3a 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 20   : (i16)j;.     
2f60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2f70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f80: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2f90: 20 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a    if( pMatch ){.
2fa0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2fb0: 54 61 62 6c 65 20 3d 20 70 4d 61 74 63 68 2d 3e  Table = pMatch->
2fc0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
2fd0: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
2fe0: 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20  Match->pTab;.   
2ff0: 20 20 20 20 20 2f 2a 20 52 49 47 48 54 20 4a 4f       /* RIGHT JO
3000: 49 4e 20 6e 6f 74 20 28 79 65 74 29 20 73 75 70  IN not (yet) sup
3010: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  ported */.      
3020: 20 20 61 73 73 65 72 74 28 20 28 70 4d 61 74 63    assert( (pMatc
3030: 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  h->fg.jointype &
3040: 20 4a 54 5f 52 49 47 48 54 29 3d 3d 30 20 29 3b   JT_RIGHT)==0 );
3050: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4d  .        if( (pM
3060: 61 74 63 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  atch->fg.jointyp
3070: 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
3080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
3090: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
30a0: 70 72 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c  pr, EP_CanBeNull
30b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30c0: 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70       pSchema = p
30d0: 45 78 70 72 2d 3e 70 54 61 62 2d 3e 70 53 63 68  Expr->pTab->pSch
30e0: 65 6d 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ema;.      }.   
30f0: 20 7d 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69   } /* if( pSrcLi
3100: 73 74 20 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  st ) */..#ifndef
3110: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
3120: 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77  GGER.    /* If w
3130: 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61  e have not alrea
3140: 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20  dy resolved the 
3150: 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65  name, then maybe
3160: 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61   .    ** it is a
3170: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
3180: 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74  trigger argument
3190: 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a   reference.    *
31a0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  /.    if( zDb==0
31b0: 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63   && zTab!=0 && c
31c0: 6e 74 54 61 62 3d 3d 30 20 26 26 20 70 50 61 72  ntTab==0 && pPar
31d0: 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 21  se->pTriggerTab!
31e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
31f0: 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 65 54 72  op = pParse->eTr
3200: 69 67 67 65 72 4f 70 3b 0a 20 20 20 20 20 20 61  iggerOp;.      a
3210: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 44 45  ssert( op==TK_DE
3220: 4c 45 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  LETE || op==TK_U
3230: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  PDATE || op==TK_
3240: 49 4e 53 45 52 54 20 29 3b 0a 20 20 20 20 20 20  INSERT );.      
3250: 69 66 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54  if( op!=TK_DELET
3260: 45 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  E && sqlite3StrI
3270: 43 6d 70 28 22 6e 65 77 22 2c 7a 54 61 62 29 20  Cmp("new",zTab) 
3280: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
3290: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
32a0: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  1;.        pTab 
32b0: 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67  = pParse->pTrigg
32c0: 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c  erTab;.      }el
32d0: 73 65 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e  se if( op!=TK_IN
32e0: 53 45 52 54 20 26 26 20 73 71 6c 69 74 65 33 53  SERT && sqlite3S
32f0: 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 7a 54 61  trICmp("old",zTa
3300: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
3310: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
3320: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   0;.        pTab
3330: 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67   = pParse->pTrig
3340: 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 65  gerTab;.      }e
3350: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
3360: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  b = 0;.      }..
3370: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29        if( pTab )
3380: 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  { .        int i
3390: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 63  Col;.        pSc
33a0: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
33b0: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 63 6e  hema;.        cn
33c0: 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tTab++;.        
33d0: 66 6f 72 28 69 43 6f 6c 3d 30 2c 20 70 43 6f 6c  for(iCol=0, pCol
33e0: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 43 6f  =pTab->aCol; iCo
33f0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
3400: 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20  ol++, pCol++){. 
3410: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
3420: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
3430: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ->zName, zCol)==
3440: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3450: 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
3460: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
3470: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d          iCol = -
3480: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
3490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
34a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
34b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34c0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 70 54 61 62    if( iCol>=pTab
34d0: 2d 3e 6e 43 6f 6c 20 26 26 20 73 71 6c 69 74 65  ->nCol && sqlite
34e0: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 26  3IsRowid(zCol) &
34f0: 26 20 56 69 73 69 62 6c 65 52 6f 77 69 64 28 70  & VisibleRowid(p
3500: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
3510: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 31    /* IMP: R-5141
3520: 34 2d 33 32 39 31 30 20 2a 2f 0a 20 20 20 20 20  4-32910 */.     
3530: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
3540: 34 39 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20  4911-55124 */.  
3550: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d          iCol = -
3560: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
3570: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
3580: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
3590: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
35a0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
35b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
35c0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
35d0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
35e0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 20  TEGER;.         
35f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
3600: 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
3610: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
3620: 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b  ase( iCol==31 );
3630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
3640: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20  tcase( iCol==32 
3650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
3660: 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b 20 7c  Parse->oldmask |
3670: 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30 78  = (iCol>=32 ? 0x
3680: 66 66 66 66 66 66 66 66 20 3a 20 28 28 28 75 33  ffffffff : (((u3
3690: 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20  2)1)<<iCol));.  
36a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
36b0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
36c0: 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b  ase( iCol==31 );
36d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
36e0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20  tcase( iCol==32 
36f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
3700: 50 61 72 73 65 2d 3e 6e 65 77 6d 61 73 6b 20 7c  Parse->newmask |
3710: 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30 78  = (iCol>=32 ? 0x
3720: 66 66 66 66 66 66 66 66 20 3a 20 28 28 28 75 33  ffffffff : (((u3
3730: 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20  2)1)<<iCol));.  
3740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3750: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3760: 6d 6e 20 3d 20 28 69 31 36 29 69 43 6f 6c 3b 0a  mn = (i16)iCol;.
3770: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
3780: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
3790: 20 20 20 20 20 20 20 20 69 73 54 72 69 67 67 65          isTrigge
37a0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  r = 1;.        }
37b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
37c0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
37d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
37e0: 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f  IGGER) */..    /
37f0: 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73  *.    ** Perhaps
3800: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72   the name is a r
3810: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
3820: 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20  ROWID.    */.   
3830: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63   if( cnt==0 && c
3840: 6e 74 54 61 62 3d 3d 31 20 26 26 20 70 4d 61 74  ntTab==1 && pMat
3850: 63 68 20 26 26 20 73 71 6c 69 74 65 33 49 73 52  ch && sqlite3IsR
3860: 6f 77 69 64 28 7a 43 6f 6c 29 0a 20 20 20 20 20  owid(zCol).     
3870: 26 26 20 56 69 73 69 62 6c 65 52 6f 77 69 64 28  && VisibleRowid(
3880: 70 4d 61 74 63 68 2d 3e 70 54 61 62 29 20 29 7b  pMatch->pTab) ){
3890: 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a  .      cnt = 1;.
38a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
38b0: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 2f  lumn = -1;     /
38c0: 2a 20 49 4d 50 3a 20 52 2d 34 34 39 31 31 2d 35  * IMP: R-44911-5
38d0: 35 31 32 34 20 2a 2f 0a 20 20 20 20 20 20 70 45  5124 */.      pE
38e0: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
38f0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
3900: 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ER;.    }..    /
3910: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
3920: 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20  input is of the 
3930: 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20  form Z (not Y.Z 
3940: 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74  or X.Y.Z) then t
3950: 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a  he name Z.    **
3960: 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20   might refer to 
3970: 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c  an result-set al
3980: 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65  ias.  This happe
3990: 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
39a0: 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   when.    ** we 
39b0: 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61  are resolving na
39c0: 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  mes in the WHERE
39d0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
39e0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64  ollowing command
39f0: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
3a00: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41      SELECT a+b A
3a10: 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57  S x FROM table W
3a20: 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a  HERE x<10;.    *
3a30: 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65  *.    ** In case
3a40: 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70  s like this, rep
3a50: 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20  lace pExpr with 
3a60: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
3a70: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20  pression that.  
3a80: 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72    ** forms the r
3a90: 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20  esult set entry 
3aa0: 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78  ("a+b" in the ex
3ab0: 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72  ample) and retur
3ac0: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
3ad0: 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
3ae0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
3af0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
3b00: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
3b10: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a  eady been.    **
3b20: 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65   resolved by the
3b30: 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20   time the WHERE 
3b40: 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76  clause is resolv
3b50: 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
3b60: 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f  * The ability to
3b70: 20 75 73 65 20 61 6e 20 6f 75 74 70 75 74 20 72   use an output r
3b80: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
3b90: 20 69 6e 20 74 68 65 20 57 48 45 52 45 2c 20 47   in the WHERE, G
3ba0: 52 4f 55 50 20 42 59 2c 0a 20 20 20 20 2a 2a 20  ROUP BY,.    ** 
3bb0: 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  or HAVING clause
3bc0: 73 2c 20 6f 72 20 61 73 20 70 61 72 74 20 6f 66  s, or as part of
3bd0: 20 61 20 6c 61 72 67 65 72 20 65 78 70 72 65 73   a larger expres
3be0: 73 69 6f 6e 20 69 6e 20 74 68 65 20 4f 52 44 45  sion in the ORDE
3bf0: 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75  R BY.    ** clau
3c00: 73 65 20 69 73 20 6e 6f 74 20 73 74 61 6e 64 61  se is not standa
3c10: 72 64 20 53 51 4c 2e 20 20 54 68 69 73 20 69 73  rd SQL.  This is
3c20: 20 61 20 28 67 6f 6f 66 79 29 20 53 51 4c 69 74   a (goofy) SQLit
3c30: 65 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 61  e extension, tha
3c40: 74 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 70 70  t.    ** is supp
3c50: 6f 72 74 65 64 20 66 6f 72 20 62 61 63 6b 77 61  orted for backwa
3c60: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
3c70: 79 20 6f 6e 6c 79 2e 20 48 65 6e 63 65 2c 20 77  y only. Hence, w
3c80: 65 20 69 73 73 75 65 20 61 20 77 61 72 6e 69 6e  e issue a warnin
3c90: 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 73 71 6c 69  g.    ** on sqli
3ca0: 74 65 33 5f 6c 6f 67 28 29 20 77 68 65 6e 65 76  te3_log() whenev
3cb0: 65 72 20 74 68 65 20 63 61 70 61 62 69 6c 69 74  er the capabilit
3cc0: 79 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 2a  y is used..    *
3cd0: 2f 0a 20 20 20 20 69 66 28 20 28 70 45 4c 69 73  /.    if( (pELis
3ce0: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29  t = pNC->pEList)
3cf0: 21 3d 30 0a 20 20 20 20 20 26 26 20 7a 54 61 62  !=0.     && zTab
3d00: 3d 3d 30 0a 20 20 20 20 20 26 26 20 63 6e 74 3d  ==0.     && cnt=
3d10: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
3d20: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
3d30: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
3d40: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41          char *zA
3d50: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  s = pEList->a[j]
3d60: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3d70: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
3d80: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
3d90: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
3da0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f          Expr *pO
3db0: 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rig;.          a
3dc0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
3dd0: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
3de0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
3df0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3e00: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d  pExpr->x.pList==
3e10: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
3e20: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
3e30: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
3e40: 20 20 20 20 20 20 20 20 70 4f 72 69 67 20 3d 20          pOrig = 
3e50: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
3e60: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
3e70: 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 26  ( (pNC->ncFlags&
3e80: 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20  NC_AllowAgg)==0 
3e90: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
3ea0: 74 79 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67  ty(pOrig, EP_Agg
3eb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
3ec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3ed0: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
3ee0: 20 6f 66 20 61 6c 69 61 73 65 64 20 61 67 67 72   of aliased aggr
3ef0: 65 67 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b  egate %s", zAs);
3f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
3f10: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
3f20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3f30: 20 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69 61       resolveAlia
3f40: 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  s(pParse, pEList
3f50: 2c 20 6a 2c 20 70 45 78 70 72 2c 20 22 22 2c 20  , j, pExpr, "", 
3f60: 6e 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  nSubquery);.    
3f70: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
3f80: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
3f90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
3fa0: 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26  ssert( zTab==0 &
3fb0: 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  & zDb==0 );.    
3fc0: 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75        goto looku
3fd0: 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 20 20 20  pname_end;.     
3fe0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20     }.      } .  
3ff0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61    }..    /* Adva
4000: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
4010: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54  name context.  T
4020: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69  he loop will exi
4030: 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20  t when either.  
4040: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d    ** we have a m
4050: 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20  atch (cnt>0) or 
4060: 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20  when we run out 
4070: 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  of name contexts
4080: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
4090: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   cnt==0 ){.     
40a0: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
40b0: 74 3b 0a 20 20 20 20 20 20 6e 53 75 62 71 75 65  t;.      nSubque
40c0: 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ry++;.    }.  }.
40d0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20  .  /*.  ** If X 
40e0: 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28  and Y are NULL (
40f0: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  in other words i
4100: 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  f only the colum
4110: 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a  n name Z is.  **
4120: 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74   supplied) and t
4130: 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73  he value of Z is
4140: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75   enclosed in dou
4150: 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e  ble-quotes, then
4160: 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72  .  ** Z is a str
4170: 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69  ing literal if i
4180: 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  t doesn't match 
4190: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  any column names
41a0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
41b0: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
41c0: 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
41d0: 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20  ay and not make 
41e0: 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20  any changes to. 
41f0: 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a   ** pExpr..  **.
4200: 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20    ** Because no 
4210: 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61  reference was ma
4220: 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74  de to outer cont
4230: 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e  exts, the pNC->n
4240: 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20  Ref.  ** fields 
4250: 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20  are not changed 
4260: 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a  in any context..
4270: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
4280: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20  0 && zTab==0 && 
4290: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
42a0: 70 45 78 70 72 2c 45 50 5f 44 62 6c 51 75 6f 74  pExpr,EP_DblQuot
42b0: 65 64 29 20 29 7b 0a 20 20 20 20 70 45 78 70 72  ed) ){.    pExpr
42c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52 49 4e 47  ->op = TK_STRING
42d0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61  ;.    pExpr->pTa
42e0: 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  b = 0;.    retur
42f0: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
4300: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d  ..  /*.  ** cnt=
4310: 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77  =0 means there w
4320: 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63  as not match.  c
4330: 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72 65  nt>1 means there
4340: 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a   were two or.  *
4350: 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e 20  * more matches. 
4360: 20 45 69 74 68 65 72 20 77 61 79 2c 20 77 65 20   Either way, we 
4370: 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20  have an error.. 
4380: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d 31   */.  if( cnt!=1
4390: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
43a0: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45  ar *zErr;.    zE
43b0: 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e  rr = cnt==0 ? "n
43c0: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 22 20 3a  o such column" :
43d0: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
43e0: 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20 20 69 66  mn name";.    if
43f0: 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73  ( zDb ){.      s
4400: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4410: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
4420: 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 44 62  s.%s", zErr, zDb
4430: 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20  , zTab, zCol);. 
4440: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61     }else if( zTa
4450: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
4460: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4470: 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20  e, "%s: %s.%s", 
4480: 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c  zErr, zTab, zCol
4490: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
44a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
44b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
44c0: 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a 43 6f 6c   %s", zErr, zCol
44d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
44e0: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
44f0: 20 3d 20 31 3b 0a 20 20 20 20 70 54 6f 70 4e 43   = 1;.    pTopNC
4500: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nErr++;.  }.. 
4510: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
4520: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20  from a table in 
4530: 70 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65  pSrcList is refe
4540: 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63  renced, then rec
4550: 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ord.  ** this fa
4560: 63 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69  ct in the pSrcLi
4570: 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62  st.a[].colUsed b
4580: 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20  itmask.  Column 
4590: 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69  0 causes.  ** bi
45a0: 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20  t 0 to be set.  
45b0: 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69  Column 1 sets bi
45c0: 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  t 1.  And so for
45d0: 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  th.  If the.  **
45e0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
45f0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
4600: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
4610: 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  s in the bitmask
4620: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74  .  ** then set t
4630: 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  he high-order bi
4640: 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  t of the bitmask
4650: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
4660: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
4670: 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20  & pMatch!=0 ){. 
4680: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
4690: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 74  ->iColumn;.    t
46a0: 65 73 74 63 61 73 65 28 20 6e 3d 3d 42 4d 53 2d  estcase( n==BMS-
46b0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  1 );.    if( n>=
46c0: 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  BMS ){.      n =
46d0: 20 42 4d 53 2d 31 3b 0a 20 20 20 20 7d 0a 20 20   BMS-1;.    }.  
46e0: 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63 68    assert( pMatch
46f0: 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72  ->iCursor==pExpr
4700: 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
4710: 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20  pMatch->colUsed 
4720: 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  |= ((Bitmask)1)<
4730: 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c  <n;.  }..  /* Cl
4740: 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
4750: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
4760: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4770: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4780: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  pExpr->pLeft = 0
4790: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
47a0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d  elete(db, pExpr-
47b0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70  >pRight);.  pExp
47c0: 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  r->pRight = 0;. 
47d0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 69 73   pExpr->op = (is
47e0: 54 72 69 67 67 65 72 20 3f 20 54 4b 5f 54 52 49  Trigger ? TK_TRI
47f0: 47 47 45 52 20 3a 20 54 4b 5f 43 4f 4c 55 4d 4e  GGER : TK_COLUMN
4800: 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  );.lookupname_en
4810: 64 3a 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  d:.  if( cnt==1 
4820: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4830: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  NC!=0 );.    if(
4840: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
4850: 53 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S ){.      sqlit
4860: 65 33 41 75 74 68 52 65 61 64 28 70 50 61 72 73  e3AuthRead(pPars
4870: 65 2c 20 70 45 78 70 72 2c 20 70 53 63 68 65 6d  e, pExpr, pSchem
4880: 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  a, pNC->pSrcList
4890: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
48a0: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52  Increment the nR
48b0: 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20  ef value on all 
48c0: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72  name contexts fr
48d0: 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20  om TopNC up to. 
48e0: 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20     ** the point 
48f0: 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d  where the name m
4900: 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66  atched. */.    f
4910: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73  or(;;){.      as
4920: 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20  sert( pTopNC!=0 
4930: 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d  );.      pTopNC-
4940: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  >nRef++;.      i
4950: 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29  f( pTopNC==pNC )
4960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
4970: 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70  opNC = pTopNC->p
4980: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
4990: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
49a0: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
49b0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
49c0: 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
49d0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
49e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
49f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
4a00: 6f 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  o load the colum
4a10: 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72 6f 6d 20 64  n iCol.** from d
4a20: 61 74 61 73 6f 75 72 63 65 20 69 53 72 63 20 69  atasource iSrc i
4a30: 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63 2e 0a  n SrcList pSrc..
4a40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
4a50: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
4a60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
4a70: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 69 6e 74  cList *pSrc, int
4a80: 20 69 53 72 63 2c 20 69 6e 74 20 69 43 6f 6c 29   iSrc, int iCol)
4a90: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
4aa0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
4ab0: 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c  b, TK_COLUMN, 0,
4ac0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
4ad0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
4ae0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
4af0: 20 26 70 53 72 63 2d 3e 61 5b 69 53 72 63 5d 3b   &pSrc->a[iSrc];
4b00: 0a 20 20 20 20 70 2d 3e 70 54 61 62 20 3d 20 70  .    p->pTab = p
4b10: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
4b20: 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  p->iTable = pIte
4b30: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
4b40: 69 66 28 20 70 2d 3e 70 54 61 62 2d 3e 69 50 4b  if( p->pTab->iPK
4b50: 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20  ey==iCol ){.    
4b60: 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d    p->iColumn = -
4b70: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
4b80: 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
4b90: 20 28 79 6e 56 61 72 29 69 43 6f 6c 3b 0a 20 20   (ynVar)iCol;.  
4ba0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
4bb0: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
4bc0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
4bd0: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
4be0: 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 7c  pItem->colUsed |
4bf0: 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  = ((Bitmask)1)<<
4c00: 28 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 42 4d 53  (iCol>=BMS ? BMS
4c10: 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a 20 20 20 20  -1 : iCol);.    
4c20: 7d 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  }.    ExprSetPro
4c30: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 73 6f  perty(p, EP_Reso
4c40: 6c 76 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lved);.  }.  ret
4c50: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
4c60: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
4c70: 74 68 61 74 20 61 6e 20 65 78 70 72 65 73 73 69  that an expressi
4c80: 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 20  on is not valid 
4c90: 66 6f 72 20 73 6f 6d 65 20 73 65 74 20 6f 66 0a  for some set of.
4ca0: 2a 2a 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ** pNC->ncFlags 
4cb0: 76 61 6c 75 65 73 20 64 65 74 65 72 6d 69 6e 65  values determine
4cc0: 64 20 62 79 20 76 61 6c 69 64 4d 61 73 6b 2e 0a  d by validMask..
4cd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
4ce0: 6f 74 56 61 6c 69 64 28 0a 20 20 50 61 72 73 65  otValid(.  Parse
4cf0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4d00: 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  /* Leave error m
4d10: 65 73 73 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  essage here */. 
4d20: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
4d30: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
4d40: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  e context */.  c
4d50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c  onst char *zMsg,
4d60: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 65      /* Type of e
4d70: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 76 61  rror */.  int va
4d80: 6c 69 64 4d 61 73 6b 20 20 20 20 20 20 20 20 2f  lidMask        /
4d90: 2a 20 53 65 74 20 6f 66 20 63 6f 6e 74 65 78 74  * Set of context
4da0: 73 20 66 6f 72 20 77 68 69 63 68 20 70 72 6f 68  s for which proh
4db0: 69 62 69 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  ibited */.){.  a
4dc0: 73 73 65 72 74 28 20 28 76 61 6c 69 64 4d 61 73  ssert( (validMas
4dd0: 6b 26 7e 28 4e 43 5f 49 73 43 68 65 63 6b 7c 4e  k&~(NC_IsCheck|N
4de0: 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 64 78  C_PartIdx|NC_Idx
4df0: 45 78 70 72 29 29 3d 3d 30 20 29 3b 0a 20 20 69  Expr))==0 );.  i
4e00: 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
4e10: 20 26 20 76 61 6c 69 64 4d 61 73 6b 29 21 3d 30   & validMask)!=0
4e20: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
4e30: 61 72 20 2a 7a 49 6e 20 3d 20 22 70 61 72 74 69  ar *zIn = "parti
4e40: 61 6c 20 69 6e 64 65 78 20 57 48 45 52 45 20 63  al index WHERE c
4e50: 6c 61 75 73 65 73 22 3b 0a 20 20 20 20 69 66 28  lauses";.    if(
4e60: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
4e70: 4e 43 5f 49 64 78 45 78 70 72 20 29 20 20 20 20  NC_IdxExpr )    
4e80: 20 20 7a 49 6e 20 3d 20 22 69 6e 64 65 78 20 65    zIn = "index e
4e90: 78 70 72 65 73 73 69 6f 6e 73 22 3b 0a 23 69 66  xpressions";.#if
4ea0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4eb0: 5f 43 48 45 43 4b 0a 20 20 20 20 65 6c 73 65 20  _CHECK.    else 
4ec0: 69 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  if( pNC->ncFlags
4ed0: 20 26 20 4e 43 5f 49 73 43 68 65 63 6b 20 29 20   & NC_IsCheck ) 
4ee0: 7a 49 6e 20 3d 20 22 43 48 45 43 4b 20 63 6f 6e  zIn = "CHECK con
4ef0: 73 74 72 61 69 6e 74 73 22 3b 0a 23 65 6e 64 69  straints";.#endi
4f00: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  f.    sqlite3Err
4f10: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
4f20: 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
4f30: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 49 6e 29 3b  %s", zMsg, zIn);
4f40: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
4f50: 70 72 65 73 73 69 6f 6e 20 70 20 73 68 6f 75 6c  pression p shoul
4f60: 64 20 65 6e 63 6f 64 65 20 61 20 66 6c 6f 61 74  d encode a float
4f70: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20  ing point value 
4f80: 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e 64 20  between 1.0 and 
4f90: 30 2e 30 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31  0.0..** Return 1
4fa0: 30 32 34 20 74 69 6d 65 73 20 74 68 69 73 20 76  024 times this v
4fb0: 61 6c 75 65 2e 20 20 4f 72 20 72 65 74 75 72 6e  alue.  Or return
4fc0: 20 2d 31 20 69 66 20 70 20 69 73 20 6e 6f 74 20   -1 if p is not 
4fd0: 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  a floating point
4fe0: 0a 2a 2a 20 76 61 6c 75 65 20 62 65 74 77 65 65  .** value betwee
4ff0: 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a  n 1.0 and 0.0..*
5000: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
5010: 72 50 72 6f 62 61 62 69 6c 69 74 79 28 45 78 70  rProbability(Exp
5020: 72 20 2a 70 29 7b 0a 20 20 64 6f 75 62 6c 65 20  r *p){.  double 
5030: 72 20 3d 20 2d 31 2e 30 3b 0a 20 20 69 66 28 20  r = -1.0;.  if( 
5040: 70 2d 3e 6f 70 21 3d 54 4b 5f 46 4c 4f 41 54 20  p->op!=TK_FLOAT 
5050: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 73  ) return -1;.  s
5060: 71 6c 69 74 65 33 41 74 6f 46 28 70 2d 3e 75 2e  qlite3AtoF(p->u.
5070: 7a 54 6f 6b 65 6e 2c 20 26 72 2c 20 73 71 6c 69  zToken, &r, sqli
5080: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
5090: 2e 7a 54 6f 6b 65 6e 29 2c 20 53 51 4c 49 54 45  .zToken), SQLITE
50a0: 5f 55 54 46 38 29 3b 0a 20 20 61 73 73 65 72 74  _UTF8);.  assert
50b0: 28 20 72 3e 3d 30 2e 30 20 29 3b 0a 20 20 69 66  ( r>=0.0 );.  if
50c0: 28 20 72 3e 31 2e 30 20 29 20 72 65 74 75 72 6e  ( r>1.0 ) return
50d0: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 28 69   -1;.  return (i
50e0: 6e 74 29 28 72 2a 31 33 34 32 31 37 37 32 38 2e  nt)(r*134217728.
50f0: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
5100: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
5110: 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74 65  lback for sqlite
5120: 33 57 61 6c 6b 45 78 70 72 28 29 2e 0a 2a 2a 0a  3WalkExpr()..**.
5130: 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f  ** Resolve symbo
5140: 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54  lic names into T
5150: 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f  K_COLUMN operato
5160: 72 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  rs for the curre
5170: 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68  nt.** node in th
5180: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  e expression tre
5190: 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20  e.  Return 0 to 
51a0: 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61  continue the sea
51b0: 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20  rch down.** the 
51c0: 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f  tree or 2 to abo
51d0: 72 74 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  rt the tree walk
51e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
51f0: 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65  tine also does e
5200: 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e  rror checking an
5210: 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  d name resolutio
5220: 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f  n for.** functio
5230: 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70  n names.  The op
5240: 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65  erator for aggre
5250: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
5260: 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20  s changed.** to 
5270: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e  TK_AGG_FUNCTION.
5280: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5290: 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70 28 57  esolveExprStep(W
52a0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
52b0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
52c0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
52d0: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
52e0: 65 3b 0a 0a 20 20 70 4e 43 20 3d 20 70 57 61 6c  e;..  pNC = pWal
52f0: 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 61 73  ker->u.pNC;.  as
5300: 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a  sert( pNC!=0 );.
5310: 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e    pParse = pNC->
5320: 70 50 61 72 73 65 3b 0a 20 20 61 73 73 65 72 74  pParse;.  assert
5330: 28 20 70 50 61 72 73 65 3d 3d 70 57 61 6c 6b 65  ( pParse==pWalke
5340: 72 2d 3e 70 50 61 72 73 65 20 29 3b 0a 0a 20 20  r->pParse );..  
5350: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5360: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
5370: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
5380: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 45 78   WRC_Prune;.  Ex
5390: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
53a0: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
53b0: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
53c0: 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72  G.  if( pNC->pSr
53d0: 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53  cList && pNC->pS
53e0: 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30  rcList->nAlloc>0
53f0: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
5400: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
5410: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69  >pSrcList;.    i
5420: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
5430: 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69  0; i<pNC->pSrcLi
5440: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
5450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
5460: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
5470: 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c  rsor>=0 && pSrcL
5480: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
5490: 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b  r<pParse->nTab);
54a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
54b0: 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  f.  switch( pExp
54c0: 72 2d 3e 6f 70 20 29 7b 0a 0a 23 69 66 20 64 65  r->op ){..#if de
54d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
54e0: 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54  BLE_UPDATE_DELET
54f0: 45 5f 4c 49 4d 49 54 29 20 26 26 20 21 64 65 66  E_LIMIT) && !def
5500: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5510: 5f 53 55 42 51 55 45 52 59 29 0a 20 20 20 20 2f  _SUBQUERY).    /
5520: 2a 20 54 68 65 20 73 70 65 63 69 61 6c 20 6f 70  * The special op
5530: 65 72 61 74 6f 72 20 54 4b 5f 52 4f 57 20 6d 65  erator TK_ROW me
5540: 61 6e 73 20 75 73 65 20 74 68 65 20 72 6f 77 69  ans use the rowi
5550: 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a  d for the first.
5560: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e      ** column in
5570: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
5580: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5590: 62 79 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  by the LIMIT and
55a0: 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a   ORDER BY.    **
55b0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
55c0: 6e 67 20 6f 6e 20 55 50 44 41 54 45 20 61 6e 64  ng on UPDATE and
55d0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
55e0: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ts..    */.    c
55f0: 61 73 65 20 54 4b 5f 52 4f 57 3a 20 7b 0a 20 20  ase TK_ROW: {.  
5600: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
5610: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
5620: 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72  cList;.      str
5630: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5640: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 61   *pItem;.      a
5650: 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 20  ssert( pSrcList 
5660: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72  && pSrcList->nSr
5670: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 49  c==1 );.      pI
5680: 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e  tem = pSrcList->
5690: 61 3b 20 0a 20 20 20 20 20 20 70 45 78 70 72 2d  a; .      pExpr-
56a0: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
56b0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54  .      pExpr->pT
56c0: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
56d0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
56e0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
56f0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 45  Cursor;.      pE
5700: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
5710: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
5720: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
5730: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
5740: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5750: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
5760: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
5770: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
5780: 4c 49 4d 49 54 29 0a 20 20 20 20 20 20 20 20 20  LIMIT).         
5790: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
57a0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
57b0: 59 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 20  Y) */..    /* A 
57c0: 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20  lone identifier 
57d0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
57e0: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a   column..    */.
57f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20      case TK_ID: 
5800: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  {.      return l
5810: 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65  ookupName(pParse
5820: 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75  , 0, 0, pExpr->u
5830: 2e 7a 54 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45  .zToken, pNC, pE
5840: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  xpr);.    }.  . 
5850: 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61     /* A table na
5860: 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61  me and column na
5870: 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20 20  me:     ID.ID.  
5880: 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61    ** Or a databa
5890: 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  se, table and co
58a0: 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a  lumn:  ID.ID.ID.
58b0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
58c0: 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_DOT: {.      
58d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
58e0: 75 6d 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  umn;.      const
58f0: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20   char *zTable;. 
5900: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5910: 2a 7a 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72  *zDb;.      Expr
5920: 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20   *pRight;..     
5930: 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74   /* if( pSrcList
5940: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a  ==0 ) break; */.
5950: 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70        notValid(p
5960: 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 74 68 65  Parse, pNC, "the
5970: 20 5c 22 2e 5c 22 20 6f 70 65 72 61 74 6f 72 22   \".\" operator"
5980: 2c 20 4e 43 5f 49 64 78 45 78 70 72 29 3b 0a 20  , NC_IdxExpr);. 
5990: 20 20 20 20 20 2f 2a 6e 6f 74 56 61 6c 69 64 28       /*notValid(
59a0: 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 74 68  pParse, pNC, "th
59b0: 65 20 5c 22 2e 5c 22 20 6f 70 65 72 61 74 6f 72  e \".\" operator
59c0: 22 2c 20 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43  ", NC_PartIdx|NC
59d0: 5f 49 73 43 68 65 63 6b 2c 20 31 29 3b 2a 2f 0a  _IsCheck, 1);*/.
59e0: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
59f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
5a00: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
5a10: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
5a20: 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20       zDb = 0;.  
5a30: 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 70        zTable = p
5a40: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  Expr->pLeft->u.z
5a50: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a  Token;.        z
5a60: 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d  Column = pRight-
5a70: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
5a80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5a90: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
5aa0: 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20  op==TK_DOT );.  
5ab0: 20 20 20 20 20 20 7a 44 62 20 3d 20 70 45 78 70        zDb = pExp
5ac0: 72 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  r->pLeft->u.zTok
5ad0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a 54 61 62  en;.        zTab
5ae0: 6c 65 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65  le = pRight->pLe
5af0: 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
5b00: 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20        zColumn = 
5b10: 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e  pRight->pRight->
5b20: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
5b30: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
5b40: 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65  ookupName(pParse
5b50: 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a  , zDb, zTable, z
5b60: 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78  Column, pNC, pEx
5b70: 70 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  pr);.    }..    
5b80: 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63 74  /* Resolve funct
5b90: 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f  ion names.    */
5ba0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
5bb0: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
5bc0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
5bd0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
5be0: 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d      /* The argum
5bf0: 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ent list */.    
5c00: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20    int n = pList 
5c10: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
5c20: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
5c30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
5c40: 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75  .      int no_su
5c50: 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20  ch_func = 0;    
5c60: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f     /* True if no
5c70: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65   such function e
5c80: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  xists */.      i
5c90: 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  nt wrong_num_arg
5ca0: 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  s = 0;     /* Tr
5cb0: 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62  ue if wrong numb
5cc0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5cd0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f  */.      int is_
5ce0: 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  agg = 0;        
5cf0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5d00: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
5d10: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
5d20: 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20 20 20    int auth;     
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5d40: 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74   Authorization t
5d50: 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63 74 69  o use the functi
5d60: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
5d70: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
5d80: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5d90: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
5da0: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
5db0: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
5dc0: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
5dd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
5de0: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
5df0: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
5e00: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
5e10: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
5e20: 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69  about the functi
5e30: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
5e40: 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
5e50: 3e 64 62 29 3b 20 20 20 2f 2a 20 54 68 65 20 64  >db);   /* The d
5e60: 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67  atabase encoding
5e70: 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
5e80: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5e90: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
5ea0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
5eb0: 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61 72 73    notValid(pPars
5ec0: 65 2c 20 70 4e 43 2c 20 22 66 75 6e 63 74 69 6f  e, pNC, "functio
5ed0: 6e 73 22 2c 20 4e 43 5f 50 61 72 74 49 64 78 29  ns", NC_PartIdx)
5ee0: 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45  ;.      zId = pE
5ef0: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
5f00: 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74       nId = sqlit
5f10: 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b  e3Strlen30(zId);
5f20: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
5f30: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
5f40: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
5f50: 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20  d, nId, n, enc, 
5f60: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
5f70: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
5f80: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
5f90: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
5fa0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
5fb0: 2c 20 2d 32 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  , -2, enc, 0);. 
5fc0: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d         if( pDef=
5fd0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5fe0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31  no_such_func = 1
5ff0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
6000: 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67  .          wrong
6010: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20  _num_args = 1;. 
6020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6030: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
6040: 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75  _agg = pDef->xFu
6050: 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  nc==0;.        i
6060: 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
6070: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
6080: 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
6090: 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
60a0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
60b0: 5f 55 6e 6c 69 6b 65 6c 79 7c 45 50 5f 53 6b 69  _Unlikely|EP_Ski
60c0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
60d0: 28 20 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ( n==2 ){.      
60e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
60f0: 62 6c 65 20 3d 20 65 78 70 72 50 72 6f 62 61 62  ble = exprProbab
6100: 69 6c 69 74 79 28 70 4c 69 73 74 2d 3e 61 5b 31  ility(pList->a[1
6110: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
6120: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
6130: 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20  >iTable<0 ){.   
6140: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6150: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6160: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
6170: 20 20 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d     "second argum
6180: 65 6e 74 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f  ent to likelihoo
6190: 64 28 29 20 6d 75 73 74 20 62 65 20 61 20 22 0a  d() must be a ".
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 22 63 6f 6e 73 74 61 6e 74 20 62 65 74 77 65 65  "constant betwee
61c0: 6e 20 30 2e 30 20 61 6e 64 20 31 2e 30 22 29 3b  n 0.0 and 1.0");
61d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
61e0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
61f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6200: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6210: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
6220: 43 45 2d 4f 46 3a 20 52 2d 36 31 33 30 34 2d 32  CE-OF: R-61304-2
6230: 39 34 34 39 20 54 68 65 20 75 6e 6c 69 6b 65 6c  9449 The unlikel
6240: 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  y(X) function is
6250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
6260: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 69  equivalent to li
6270: 6b 65 6c 69 68 6f 6f 64 28 58 2c 20 30 2e 30 36  kelihood(X, 0.06
6280: 32 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  25)..           
6290: 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
62a0: 20 52 2d 30 31 32 38 33 2d 31 31 36 33 36 20 54   R-01283-11636 T
62b0: 68 65 20 75 6e 6c 69 6b 65 6c 79 28 58 29 20 66  he unlikely(X) f
62c0: 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  unction is.     
62d0: 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 2d         ** short-
62e0: 68 61 6e 64 20 66 6f 72 20 6c 69 6b 65 6c 69 68  hand for likelih
62f0: 6f 6f 64 28 58 2c 30 2e 30 36 32 35 29 2e 0a 20  ood(X,0.0625).. 
6300: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56             ** EV
6310: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 38  IDENCE-OF: R-368
6320: 35 30 2d 33 34 31 32 37 20 54 68 65 20 6c 69 6b  50-34127 The lik
6330: 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20  ely(X) function 
6340: 69 73 20 73 68 6f 72 74 2d 68 61 6e 64 0a 20 20  is short-hand.  
6350: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72            ** for
6360: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e   likelihood(X,0.
6370: 39 33 37 35 29 2e 0a 20 20 20 20 20 20 20 20 20  9375)..         
6380: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
6390: 46 3a 20 52 2d 35 33 34 33 36 2d 34 30 39 37 33  F: R-53436-40973
63a0: 20 54 68 65 20 6c 69 6b 65 6c 79 28 58 29 20 66   The likely(X) f
63b0: 75 6e 63 74 69 6f 6e 20 69 73 20 65 71 75 69 76  unction is equiv
63c0: 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20  alent.          
63d0: 20 20 2a 2a 20 74 6f 20 6c 69 6b 65 6c 69 68 6f    ** to likeliho
63e0: 6f 64 28 58 2c 30 2e 39 33 37 35 29 2e 20 2a 2f  od(X,0.9375). */
63f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
6400: 54 55 4e 49 4e 47 3a 20 75 6e 6c 69 6b 65 6c 79  TUNING: unlikely
6410: 28 29 20 70 72 6f 62 61 62 69 6c 69 74 79 20 69  () probability i
6420: 73 20 30 2e 30 36 32 35 2e 20 20 6c 69 6b 65 6c  s 0.0625.  likel
6430: 79 28 29 20 69 73 20 30 2e 39 33 37 35 20 2a 2f  y() is 0.9375 */
6440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6450: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 44 65  pr->iTable = pDe
6460: 66 2d 3e 7a 4e 61 6d 65 5b 30 5d 3d 3d 27 75 27  f->zName[0]=='u'
6470: 20 3f 20 38 33 38 38 36 30 38 20 3a 20 31 32 35   ? 8388608 : 125
6480: 38 32 39 31 32 30 3b 0a 20 20 20 20 20 20 20 20  829120;.        
6490: 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20    }             
64a0: 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  .        }.#ifnd
64b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
64c0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
64d0: 20 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69       auth = sqli
64e0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
64f0: 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43  rse, SQLITE_FUNC
6500: 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a  TION, 0, pDef->z
6510: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Name, 0);.      
6520: 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49    if( auth!=SQLI
6530: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
6540: 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c     if( auth==SQL
6550: 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20  ITE_DENY ){.    
6560: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6570: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6580: 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20  "not authorized 
6590: 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a  to use function:
65a0: 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %s",.          
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e            pDef->
65d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
65e0: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
65f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
6600: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
6610: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
6620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
6630: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20  _Prune;.        
6640: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
6650: 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
6660: 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
6670: 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 7c 53 51 4c  UNC_CONSTANT|SQL
6680: 49 54 45 5f 46 55 4e 43 5f 56 41 52 59 49 4e 47  ITE_FUNC_VARYING
6690: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
66a0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
66b0: 65 73 20 6f 66 20 74 68 65 20 45 50 5f 43 6f 6e  es of the EP_Con
66c0: 73 74 46 75 6e 63 20 66 6c 61 67 2c 20 64 61 74  stFunc flag, dat
66d0: 65 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20  e and time.     
66e0: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
66f0: 73 20 61 6e 64 20 6f 74 68 65 72 20 66 75 6e 63  s and other func
6700: 74 69 6f 6e 73 20 74 68 61 74 20 63 68 61 6e 67  tions that chang
6710: 65 20 73 6c 6f 77 6c 79 20 61 72 65 20 63 6f 6e  e slowly are con
6720: 73 69 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  sidered.        
6730: 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 62 65    ** constant be
6740: 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 63  cause they are c
6750: 6f 6e 73 74 61 6e 74 20 66 6f 72 20 74 68 65 20  onstant for the 
6760: 64 75 72 61 74 69 6f 6e 20 6f 66 20 6f 6e 65 20  duration of one 
6770: 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  query */.       
6780: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
6790: 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73  ty(pExpr,EP_Cons
67a0: 74 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  tFunc);.        
67b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
67c0: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
67d0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
67e0: 53 54 41 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  STANT)==0 ){.   
67f0: 20 20 20 20 20 20 20 2f 2a 20 44 41 54 45 54 49         /* DATETI
6800: 4d 45 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  ME functions are
6810: 20 63 6f 6e 73 69 64 65 72 65 64 20 6e 6f 6e 2d   considered non-
6820: 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 62 65  deterministic be
6830: 63 61 75 73 65 20 6f 66 0a 20 20 20 20 20 20 20  cause of.       
6840: 20 20 20 2a 2a 20 74 68 65 20 27 6e 6f 77 27 20     ** the 'now' 
6850: 63 61 70 61 62 69 6c 69 74 79 20 2a 2f 0a 20 20  capability */.  
6860: 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64          notValid
6870: 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 6e  (pParse, pNC, "n
6880: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
6890: 20 66 75 6e 63 74 69 6f 6e 73 22 2c 20 4e 43 5f   functions", NC_
68a0: 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20 20 20  IdxExpr);.      
68b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
68c0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20    if( is_agg && 
68d0: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
68e0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20  NC_AllowAgg)==0 
68f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6900: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6910: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67  e, "misuse of ag
6920: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
6930: 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49   %.*s()", nId,zI
6940: 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  d);.        pNC-
6950: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
6960: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
6970: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f     }else if( no_
6980: 73 75 63 68 5f 66 75 6e 63 20 26 26 20 70 50 61  such_func && pPa
6990: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
69a0: 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sy==0 ){.       
69b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
69c0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
69d0: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  h function: %.*s
69e0: 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20  ", nId, zId);.  
69f0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
6a00: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
6a10: 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  f( wrong_num_arg
6a20: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
6a30: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6a40: 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65  rse,"wrong numbe
6a50: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
6a60: 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  o function %.*s(
6a70: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
6a80: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
6a90: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
6aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6ab0: 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d  f( is_agg ) pNC-
6ac0: 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  >ncFlags &= ~NC_
6ad0: 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20  AllowAgg;.      
6ae0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
6af0: 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70 4c 69  ist(pWalker, pLi
6b00: 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  st);.      if( i
6b10: 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20  s_agg ){.       
6b20: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
6b30: 43 32 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  C2 = pNC;.      
6b40: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
6b50: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  _AGG_FUNCTION;. 
6b60: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
6b70: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77  2 = 0;.        w
6b80: 68 69 6c 65 28 20 70 4e 43 32 20 26 26 20 21 73  hile( pNC2 && !s
6b90: 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
6ba0: 65 73 54 68 69 73 53 72 63 28 70 45 78 70 72 2c  esThisSrc(pExpr,
6bb0: 20 70 4e 43 32 2d 3e 70 53 72 63 4c 69 73 74 29   pNC2->pSrcList)
6bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
6bd0: 78 70 72 2d 3e 6f 70 32 2b 2b 3b 0a 20 20 20 20  xpr->op2++;.    
6be0: 20 20 20 20 20 20 70 4e 43 32 20 3d 20 70 4e 43        pNC2 = pNC
6bf0: 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  2->pNext;.      
6c00: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
6c10: 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20  rt( pDef!=0 );. 
6c20: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 32 20         if( pNC2 
6c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
6c40: 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
6c50: 5f 4d 49 4e 4d 41 58 3d 3d 4e 43 5f 4d 69 6e 4d  _MINMAX==NC_MinM
6c60: 61 78 41 67 67 20 29 3b 0a 20 20 20 20 20 20 20  axAgg );.       
6c70: 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70 44     testcase( (pD
6c80: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
6c90: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
6ca0: 41 58 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  AX)!=0 );.      
6cb0: 20 20 20 20 70 4e 43 32 2d 3e 6e 63 46 6c 61 67      pNC2->ncFlag
6cc0: 73 20 7c 3d 20 4e 43 5f 48 61 73 41 67 67 20 7c  s |= NC_HasAgg |
6cd0: 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
6ce0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
6cf0: 4d 49 4e 4d 41 58 29 3b 0a 0a 20 20 20 20 20 20  MINMAX);..      
6d00: 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 43 2d    }.        pNC-
6d10: 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41  >ncFlags |= NC_A
6d20: 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 7d  llowAgg;.      }
6d30: 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45  .      /* FIX ME
6d40: 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72  :  Compute pExpr
6d50: 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64  ->affinity based
6d60: 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64   on the expected
6d70: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a   return.      **
6d80: 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e   type of the fun
6d90: 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a  ction .      */.
6da0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
6db0: 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69  _Prune;.    }.#i
6dc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6dd0: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
6de0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
6df0: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
6e00: 53 3a 20 20 74 65 73 74 63 61 73 65 28 20 70 45  S:  testcase( pE
6e10: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53  xpr->op==TK_EXIS
6e20: 54 53 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  TS );.#endif.   
6e30: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
6e40: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
6e50: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
6e60: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70  );.      if( Exp
6e70: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
6e80: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
6e90: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ) ){.        int
6ea0: 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65   nRef = pNC->nRe
6eb0: 66 3b 0a 20 20 20 20 20 20 20 20 6e 6f 74 56 61  f;.        notVa
6ec0: 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c  lid(pParse, pNC,
6ed0: 20 22 73 75 62 71 75 65 72 69 65 73 22 2c 20 4e   "subqueries", N
6ee0: 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72  C_IsCheck|NC_Par
6ef0: 74 49 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 29  tIdx|NC_IdxExpr)
6f00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6f10: 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c  3WalkSelect(pWal
6f20: 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  ker, pExpr->x.pS
6f30: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
6f40: 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65  assert( pNC->nRe
6f50: 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20  f>=nRef );.     
6f60: 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43     if( nRef!=pNC
6f70: 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20  ->nRef ){.      
6f80: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
6f90: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
6fa0: 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  rSelect);.      
6fb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
6fd0: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
6fe0: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 6e 6f 74  BLE: {.      not
6ff0: 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e  Valid(pParse, pN
7000: 43 2c 20 22 70 61 72 61 6d 65 74 65 72 73 22 2c  C, "parameters",
7010: 20 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50   NC_IsCheck|NC_P
7020: 61 72 74 49 64 78 7c 4e 43 5f 49 64 78 45 78 70  artIdx|NC_IdxExp
7030: 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  r);.      break;
7040: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7050: 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45 72  urn (pParse->nEr
7060: 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
7070: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f  >mallocFailed) ?
7080: 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43   WRC_Abort : WRC
7090: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
70a0: 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 61 20  .** pEList is a 
70b0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
70c0: 6f 6e 73 20 77 68 69 63 68 20 61 72 65 20 72 65  ons which are re
70d0: 61 6c 6c 79 20 74 68 65 20 72 65 73 75 6c 74 20  ally the result 
70e0: 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 20  set of the.** a 
70f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7100: 2e 20 20 70 45 20 69 73 20 61 20 74 65 72 6d 20  .  pE is a term 
7110: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  in an ORDER BY o
7120: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
7130: 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
7140: 6e 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ne checks to see
7150: 20 69 66 20 70 45 20 69 73 20 61 20 73 69 6d 70   if pE is a simp
7160: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 68  le identifier wh
7170: 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73 0a  ich corresponds.
7180: 2a 2a 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d  ** to the AS-nam
7190: 65 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  e of one of the 
71a0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78 70  terms of the exp
71b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
71c0: 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 69 73  f it is,.** this
71d0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20   routine return 
71e0: 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65  an integer betwe
71f0: 65 6e 20 31 20 61 6e 64 20 4e 20 77 68 65 72 65  en 1 and N where
7200: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
7210: 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20   of.** elements 
7220: 69 6e 20 70 45 4c 69 73 74 2c 20 63 6f 72 72 65  in pEList, corre
7230: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
7240: 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 20  matching entry. 
7250: 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   If there is.** 
7260: 6e 6f 20 6d 61 74 63 68 2c 20 6f 72 20 69 66 20  no match, or if 
7270: 70 45 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  pE is not a simp
7280: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 20 74  le identifier, t
7290: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
72a0: 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  .** return 0..**
72b0: 0a 2a 2a 20 70 45 4c 69 73 74 20 68 61 73 20 62  .** pEList has b
72c0: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 70  een resolved.  p
72d0: 45 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  E has not..*/.st
72e0: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
72f0: 41 73 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  AsName(.  Parse 
7300: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
7310: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
7320: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
7330: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
7340: 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69   *pEList,  /* Li
7350: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
7360: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
7370: 78 70 72 20 2a 70 45 20 20 20 20 20 20 20 20 20  xpr *pE         
7380: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
7390: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
73a0: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
73b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
73c0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
73d0: 72 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50  r */..  UNUSED_P
73e0: 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
73f0: 3b 0a 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  ;..  if( pE->op=
7400: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 63 68  =TK_ID ){.    ch
7410: 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 45 2d 3e 75  ar *zCol = pE->u
7420: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72  .zToken;.    for
7430: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
7440: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7450: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
7460: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
7470: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 73  e;.      if( zAs
7480: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
7490: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
74a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
74b0: 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20  eturn i+1;.     
74c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
74d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
74e0: 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74 65  * pE is a pointe
74f0: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
7500: 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20 73 69  on which is a si
7510: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65  ngle term in the
7520: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 66 20  .** ORDER BY of 
7530: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
7540: 54 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  T.  The expressi
7550: 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a  on has not been.
7560: 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65 64  ** name resolved
7570: 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 70  ..**.** At the p
7580: 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  oint this routin
7590: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
75a0: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 61  already know tha
75b0: 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42  t the.** ORDER B
75c0: 59 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 6e  Y term is not an
75d0: 20 69 6e 74 65 67 65 72 20 69 6e 64 65 78 20 69   integer index i
75e0: 6e 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 73  nto the result s
75f0: 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63 61 73  et.  That.** cas
7600: 65 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20  e is handled by 
7610: 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
7620: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d  ine..**.** Attem
7630: 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20 61  pt to match pE a
7640: 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65  gainst result se
7650: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
7660: 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53 45   left-most.** SE
7670: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
7680: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
7690: 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68  x i of the match
76a0: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61  ing column,.** a
76b0: 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  s an indication 
76c0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  to the caller th
76d0: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72  at it should sor
76e0: 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f  t by the i-th co
76f0: 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65 66  lumn..** The lef
7700: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
7710: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f   1.  In other wo
7720: 72 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20 72  rds, the value r
7730: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
7740: 2a 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20 76  * same integer v
7750: 61 6c 75 65 20 74 68 61 74 20 77 6f 75 6c 64 20  alue that would 
7760: 62 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 53  be used in the S
7770: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
7780: 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 65 20  indicate.** the 
7790: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  column..**.** If
77a0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74   there is no mat
77b0: 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ch, return 0.  R
77c0: 65 74 75 72 6e 20 2d 31 20 69 66 20 61 6e 20 65  eturn -1 if an e
77d0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
77e0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
77f0: 76 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45  veOrderByTermToE
7800: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
7810: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
7820: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
7830: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
7840: 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ges */.  Select 
7850: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54  *pSelect,   /* T
7860: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7870: 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52 44  ent with the ORD
7880: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
7890: 20 20 45 78 70 72 20 2a 70 45 20 20 20 20 20 20    Expr *pE      
78a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
78b0: 69 66 69 63 20 4f 52 44 45 52 20 42 59 20 74 65  ific ORDER BY te
78c0: 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  rm */.){.  int i
78d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
78e0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
78f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
7900: 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ist;  /* The col
7910: 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75  umns of the resu
7920: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65  lt set */.  Name
7930: 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f  Context nc;    /
7940: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
7950: 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20  or resolving pE 
7960: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
7970: 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
7980: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
7990: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
79a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
79b0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72   code from subpr
79c0: 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 75 38  ocedures */.  u8
79d0: 20 73 61 76 65 64 53 75 70 70 45 72 72 3b 20 20   savedSuppErr;  
79e0: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
79f0: 6f 66 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  of db->suppressE
7a00: 72 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rr */..  assert(
7a10: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
7a20: 74 65 67 65 72 28 70 45 2c 20 26 69 29 3d 3d 30  teger(pE, &i)==0
7a30: 20 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   );.  pEList = p
7a40: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
7a50: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c  .  /* Resolve al
7a60: 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 4f  l names in the O
7a70: 52 44 45 52 20 42 59 20 74 65 72 6d 20 65 78 70  RDER BY term exp
7a80: 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d  ression.  */.  m
7a90: 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73 69  emset(&nc, 0, si
7aa0: 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e  zeof(nc));.  nc.
7ab0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
7ac0: 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d  .  nc.pSrcList =
7ad0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
7ae0: 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70 45    nc.pEList = pE
7af0: 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e 63 46 6c 61  List;.  nc.ncFla
7b00: 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67  gs = NC_AllowAgg
7b10: 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b  ;.  nc.nErr = 0;
7b20: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
7b30: 64 62 3b 0a 20 20 73 61 76 65 64 53 75 70 70 45  db;.  savedSuppE
7b40: 72 72 20 3d 20 64 62 2d 3e 73 75 70 70 72 65 73  rr = db->suppres
7b50: 73 45 72 72 3b 0a 20 20 64 62 2d 3e 73 75 70 70  sErr;.  db->supp
7b60: 72 65 73 73 45 72 72 20 3d 20 31 3b 0a 20 20 72  ressErr = 1;.  r
7b70: 63 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  c = sqlite3Resol
7b80: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 6e 63 2c  veExprNames(&nc,
7b90: 20 70 45 29 3b 0a 20 20 64 62 2d 3e 73 75 70 70   pE);.  db->supp
7ba0: 72 65 73 73 45 72 72 20 3d 20 73 61 76 65 64 53  ressErr = savedS
7bb0: 75 70 70 45 72 72 3b 0a 20 20 69 66 28 20 72 63  uppErr;.  if( rc
7bc0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
7bd0: 2f 2a 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20  /* Try to match 
7be0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  the ORDER BY exp
7bf0: 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20  ression against 
7c00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  an expression.  
7c10: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
7c20: 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 61 6e   set.  Return an
7c30: 20 31 2d 62 61 73 65 64 20 69 6e 64 65 78 20 6f   1-based index o
7c40: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 20  f the matching. 
7c50: 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65   ** result-set e
7c60: 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ntry..  */.  for
7c70: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
7c80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7c90: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
7ca0: 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74 2d 3e  Compare(pEList->
7cb0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 2c 20  a[i].pExpr, pE, 
7cc0: 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  -1)<2 ){.      r
7cd0: 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 7d  eturn i+1;.    }
7ce0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
7cf0: 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30   match, return 0
7d00: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  . */.  return 0;
7d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
7d20: 74 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  te an ORDER BY o
7d30: 72 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20  r GROUP BY term 
7d40: 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 65 72 72  out-of-range err
7d50: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
7d60: 69 64 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52  id resolveOutOfR
7d70: 61 6e 67 65 45 72 72 6f 72 28 0a 20 20 50 61 72  angeError(.  Par
7d80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7d90: 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72      /* The error
7da0: 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77 68   context into wh
7db0: 69 63 68 20 74 6f 20 77 72 69 74 65 20 74 68 65  ich to write the
7dc0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73   error */.  cons
7dd0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
7de0: 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72     /* "ORDER" or
7df0: 20 22 47 52 4f 55 50 22 20 2a 2f 0a 20 20 69 6e   "GROUP" */.  in
7e00: 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
7e10: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
7e20: 78 20 28 31 2d 62 61 73 65 64 29 20 6f 66 20 74  x (1-based) of t
7e30: 68 65 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72  he term out of r
7e40: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ange */.  int mx
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e60: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 65 72 6d   /* Largest perm
7e70: 69 73 73 69 62 6c 65 20 76 61 6c 75 65 20 6f 66  issible value of
7e80: 20 69 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74   i */.){.  sqlit
7e90: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7ea0: 65 2c 20 0a 20 20 20 20 22 25 72 20 25 73 20 42  e, .    "%r %s B
7eb0: 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61  Y term out of ra
7ec0: 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nge - should be 
7ed0: 22 0a 20 20 20 20 22 62 65 74 77 65 65 6e 20 31  ".    "between 1
7ee0: 20 61 6e 64 20 25 64 22 2c 20 69 2c 20 7a 54 79   and %d", i, zTy
7ef0: 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pe, mx);.}../*.*
7f00: 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 4f 52  * Analyze the OR
7f10: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e  DER BY clause in
7f20: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
7f30: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 20  CT statement.   
7f40: 4d 6f 64 69 66 79 0a 2a 2a 20 65 61 63 68 20 74  Modify.** each t
7f50: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
7f60: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 20   BY clause is a 
7f70: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
7f80: 20 62 65 74 77 65 65 6e 20 31 0a 2a 2a 20 61 6e   between 1.** an
7f90: 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74  d N where N is t
7fa0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
7fb0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  umns in the comp
7fc0: 6f 75 6e 64 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  ound SELECT..**.
7fd0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ** ORDER BY term
7fe0: 73 20 74 68 61 74 20 61 72 65 20 61 6c 72 65 61  s that are alrea
7ff0: 64 79 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65  dy an integer be
8000: 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 61 72  tween 1 and N ar
8010: 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e  e.** unmodified.
8020: 20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73    ORDER BY terms
8030: 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 67 65   that are intege
8040: 72 73 20 6f 75 74 73 69 64 65 20 74 68 65 20 72  rs outside the r
8050: 61 6e 67 65 20 6f 66 0a 2a 2a 20 31 20 74 68 72  ange of.** 1 thr
8060: 6f 75 67 68 20 4e 20 67 65 6e 65 72 61 74 65 20  ough N generate 
8070: 61 6e 20 65 72 72 6f 72 2e 20 20 4f 52 44 45 52  an error.  ORDER
8080: 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 61   BY terms that a
8090: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  re expressions.*
80a0: 2a 20 61 72 65 20 6d 61 74 63 68 65 64 20 61 67  * are matched ag
80b0: 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74  ainst result set
80c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
80d0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
80e0: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
80f0: 68 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  h the left-most 
8100: 53 45 4c 45 43 54 20 61 6e 64 20 77 6f 72 6b 69  SELECT and worki
8110: 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20 72 69  ng toward the ri
8120: 67 68 74 2e 0a 2a 2a 20 41 74 20 74 68 65 20 66  ght..** At the f
8130: 69 72 73 74 20 6d 61 74 63 68 2c 20 74 68 65 20  irst match, the 
8140: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
8150: 69 6f 6e 20 69 73 20 74 72 61 6e 73 66 6f 72 6d  ion is transform
8160: 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 69  ed into.** the i
8170: 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75  nteger column nu
8180: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mber..**.** Retu
8190: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
81a0: 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2f   errors seen..*/
81b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
81c0: 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  lveCompoundOrder
81d0: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
81e0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
81f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
8200: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
8210: 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  sages here */.  
8220: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
8230: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
8240: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
8250: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f 52 44  ntaining the ORD
8260: 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ER BY */.){.  in
8270: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
8280: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
8290: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
82a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
82b0: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
82c0: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
82d0: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
82e0: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
82f0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
8300: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
8310: 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  db;.#if SQLITE_M
8320: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
8330: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
8340: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8350: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8360: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8370: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8380: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
8390: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
83a0: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e");.    return 
83b0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
83c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
83d0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
83e0: 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  {.    pOrderBy->
83f0: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20  a[i].done = 0;. 
8400: 20 7d 0a 20 20 70 53 65 6c 65 63 74 2d 3e 70 4e   }.  pSelect->pN
8410: 65 78 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ext = 0;.  while
8420: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
8430: 72 20 29 7b 0a 20 20 20 20 70 53 65 6c 65 63 74  r ){.    pSelect
8440: 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
8450: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70  = pSelect;.    p
8460: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
8470: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  ->pPrior;.  }.  
8480: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20 26  while( pSelect &
8490: 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20  & moreToDo ){.  
84a0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
84b0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
84c0: 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b     moreToDo = 0;
84d0: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53  .    pEList = pS
84e0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
84f0: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
8500: 74 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  t!=0 );.    for(
8510: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
8520: 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72  rBy->a; i<pOrder
8530: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
8540: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
8550: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
8560: 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a       Expr *pE, *
8570: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
8580: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 29 20 63 6f  pItem->done ) co
8590: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
85a0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
85b0: 69 70 43 6f 6c 6c 61 74 65 28 70 49 74 65 6d 2d  ipCollate(pItem-
85c0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
85d0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
85e0: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
85f0: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l) ){.        if
8600: 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
8610: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
8620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
8630: 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72  olveOutOfRangeEr
8640: 72 6f 72 28 70 50 61 72 73 65 2c 20 22 4f 52 44  ror(pParse, "ORD
8650: 45 52 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74  ER", i+1, pEList
8660: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
8670: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
8690: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  lse{.        iCo
86a0: 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d  l = resolveAsNam
86b0: 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
86c0: 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20 69  , pE);.        i
86d0: 66 28 20 69 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  f( iCol==0 ){.  
86e0: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
86f0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8700: 2c 20 70 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  , pE, 0);.      
8710: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
8720: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8730: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8740: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
8750: 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76     iCol = resolv
8760: 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  eOrderByTermToEx
8770: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
8780: 53 65 6c 65 63 74 2c 20 70 44 75 70 29 3b 0a 20  Select, pDup);. 
8790: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
87a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
87b0: 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29  Delete(db, pDup)
87c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
87d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
87e0: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol>0 ){.        
87f0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f  /* Convert the O
8800: 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 6e 74  RDER BY term int
8810: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6c  o an integer col
8820: 75 6d 6e 20 6e 75 6d 62 65 72 20 69 43 6f 6c 2c  umn number iCol,
8830: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 69  .        ** taki
8840: 6e 67 20 63 61 72 65 20 74 6f 20 70 72 65 73 65  ng care to prese
8850: 72 76 65 20 74 68 65 20 43 4f 4c 4c 41 54 45 20  rve the COLLATE 
8860: 63 6c 61 75 73 65 20 69 66 20 69 74 20 65 78 69  clause if it exi
8870: 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  sts */.        E
8880: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
8890: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
88a0: 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
88b0: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
88c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
88d0: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
88e0: 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
88f0: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
8900: 69 56 61 6c 75 65 20 3d 20 69 43 6f 6c 3b 0a 20  iValue = iCol;. 
8910: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
8920: 2d 3e 70 45 78 70 72 3d 3d 70 45 20 29 7b 0a 20  ->pExpr==pE ){. 
8930: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
8940: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
8950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8960: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 61         Expr *pPa
8970: 72 65 6e 74 20 3d 20 70 49 74 65 6d 2d 3e 70 45  rent = pItem->pE
8980: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 61  xpr;.          a
8990: 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
89a0: 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29  op==TK_COLLATE )
89b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
89c0: 65 28 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66  e( pParent->pLef
89d0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  t->op==TK_COLLAT
89e0: 45 20 29 20 70 50 61 72 65 6e 74 20 3d 20 70 50  E ) pParent = pP
89f0: 61 72 65 6e 74 2d 3e 70 4c 65 66 74 3b 0a 20 20  arent->pLeft;.  
8a00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8a10: 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74 3d 3d  pParent->pLeft==
8a20: 70 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pE );.          
8a30: 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74 20 3d  pParent->pLeft =
8a40: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   pNew;.        }
8a50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8a60: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8a70: 45 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  E);.        pIte
8a80: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
8a90: 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a  ol = (u16)iCol;.
8aa0: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 64          pItem->d
8ab0: 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  one = 1;.      }
8ac0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f  else{.        mo
8ad0: 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20  reToDo = 1;.    
8ae0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53    }.    }.    pS
8af0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
8b00: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f  >pNext;.  }.  fo
8b10: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8b20: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
8b30: 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
8b40: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29  ->a[i].done==0 )
8b50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
8b60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8b70: 22 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72  "%r ORDER BY ter
8b80: 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
8b90: 20 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20   any ".         
8ba0: 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68     "column in th
8bb0: 65 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69  e result set", i
8bc0: 2b 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  +1);.      retur
8bd0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
8be0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8bf0: 0a 2a 2a 20 43 68 65 63 6b 20 65 76 65 72 79 20  .** Check every 
8c00: 74 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 44 45  term in the ORDE
8c10: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
8c20: 20 63 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79   clause pOrderBy
8c30: 20 6f 66 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43   of.** the SELEC
8c40: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c  T statement pSel
8c50: 65 63 74 2e 20 20 49 66 20 61 6e 79 20 74 65 72  ect.  If any ter
8c60: 6d 20 69 73 20 72 65 66 65 72 65 6e 63 65 20 74  m is reference t
8c70: 6f 20 61 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65  o a.** result se
8c80: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 28 61 73  t expression (as
8c90: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
8ca0: 68 65 20 45 78 70 72 4c 69 73 74 2e 61 2e 75 2e  he ExprList.a.u.
8cb0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 0a 2a 2a  x.iOrderByCol.**
8cc0: 20 66 69 65 6c 64 29 20 74 68 65 6e 20 63 6f 6e   field) then con
8cd0: 76 65 72 74 20 74 68 61 74 20 74 65 72 6d 20 69  vert that term i
8ce0: 6e 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68  nto a copy of th
8cf0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8d00: 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 63 6f  result set.** co
8d10: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  lumn..**.** If a
8d20: 6e 79 20 65 72 72 6f 72 73 20 61 72 65 20 64 65  ny errors are de
8d30: 74 65 63 74 65 64 2c 20 61 64 64 20 61 6e 20 65  tected, add an e
8d40: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
8d50: 70 50 61 72 73 65 20 61 6e 64 0a 2a 2a 20 72 65  pParse and.** re
8d60: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  turn non-zero.  
8d70: 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 6e  Return zero if n
8d80: 6f 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65  o errors are see
8d90: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
8da0: 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
8db0: 75 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  upBy(.  Parse *p
8dc0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
8dd0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8de0: 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  .  Leave error m
8df0: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
8e00: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
8e10: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  t,      /* The S
8e20: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8e30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8e40: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
8e50: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
8e60: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
8e70: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
8e80: 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73  use to be proces
8e90: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
8ea0: 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f  har *zType     /
8eb0: 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  * "ORDER" or "GR
8ec0: 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  OUP" */.){.  int
8ed0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
8ee0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
8ef0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8f00: 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
8f10: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8f20: 6d 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  m;..  if( pOrder
8f30: 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  By==0 || pParse-
8f40: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8f50: 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69  d ) return 0;.#i
8f60: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
8f70: 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72  UMN.  if( pOrder
8f80: 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  By->nExpr>db->aL
8f90: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8fa0: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
8fb0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8fc0: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8fd0: 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42  ny terms in %s B
8fe0: 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65  Y clause", zType
8ff0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
9000: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 45  .  }.#endif.  pE
9010: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
9020: 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
9030: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20  ( pEList!=0 );  
9040: 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  /* sqlite3Select
9050: 4e 65 77 28 29 20 67 75 61 72 61 6e 74 65 65 73  New() guarantees
9060: 20 74 68 69 73 20 2a 2f 0a 20 20 66 6f 72 28 69   this */.  for(i
9070: 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
9080: 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42  By->a; i<pOrderB
9090: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
90a0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
90b0: 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
90c0: 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20  erByCol ){.     
90d0: 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
90e0: 69 4f 72 64 65 72 42 79 43 6f 6c 3e 70 45 4c 69  iOrderByCol>pELi
90f0: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
9100: 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f       resolveOutO
9110: 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50 61 72  fRangeError(pPar
9120: 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20  se, zType, i+1, 
9130: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
9140: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
9150: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9160: 72 65 73 6f 6c 76 65 41 6c 69 61 73 28 70 50 61  resolveAlias(pPa
9170: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 49 74  rse, pEList, pIt
9180: 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
9190: 43 6f 6c 2d 31 2c 20 70 49 74 65 6d 2d 3e 70 45  Col-1, pItem->pE
91a0: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
91b0: 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c 30 29          zType,0)
91c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
91d0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
91e0: 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20   pOrderBy is an 
91f0: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
9200: 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 53  P BY clause in S
9210: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
9220: 70 53 65 6c 65 63 74 2e 0a 2a 2a 20 54 68 65 20  pSelect..** The 
9230: 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20  Name context of 
9240: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
9250: 6d 65 6e 74 20 69 73 20 70 4e 43 2e 20 20 7a 54  ment is pNC.  zT
9260: 79 70 65 20 69 73 20 65 69 74 68 65 72 0a 2a 2a  ype is either.**
9270: 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f   "ORDER" or "GRO
9280: 55 50 22 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  UP" depending on
9290: 20 77 68 69 63 68 20 74 79 70 65 20 6f 66 20 63   which type of c
92a0: 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79 20 69  lause pOrderBy i
92b0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
92c0: 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 65  utine resolves e
92d0: 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ach term of the 
92e0: 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 20 65  clause into an e
92f0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66  xpression..** If
9300: 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65   the order-by te
9310: 72 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  rm is an integer
9320: 20 49 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64   I between 1 and
9330: 20 4e 20 28 77 68 65 72 65 20 4e 20 69 73 20 74   N (where N is t
9340: 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
9350: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
9360: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
9370: 20 53 45 4c 45 43 54 29 20 74 68 65 6e 20 74 68   SELECT) then th
9380: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
9390: 69 6e 20 74 68 65 20 72 65 73 6f 6c 75 74 69 6f  in the resolutio
93a0: 6e 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  n is a copy of t
93b0: 68 65 20 49 2d 74 68 20 72 65 73 75 6c 74 2d 73  he I-th result-s
93c0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  et expression.  
93d0: 49 66 0a 2a 2a 20 74 68 65 20 6f 72 64 65 72 2d  If.** the order-
93e0: 62 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69 64  by term is an id
93f0: 65 6e 74 69 66 69 65 72 20 74 68 61 74 20 63 6f  entifier that co
9400: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
9410: 20 41 53 2d 6e 61 6d 65 20 6f 66 0a 2a 2a 20 61   AS-name of.** a
9420: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
9430: 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  ession, then the
9440: 20 74 65 72 6d 20 72 65 73 6f 6c 76 65 73 20 74   term resolves t
9450: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a  o a copy of the.
9460: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  ** result-set ex
9470: 70 72 65 73 73 69 6f 6e 2e 20 20 4f 74 68 65 72  pression.  Other
9480: 77 69 73 65 2c 20 74 68 65 20 65 78 70 72 65 73  wise, the expres
9490: 73 69 6f 6e 20 69 73 20 72 65 73 6f 6c 76 65 64  sion is resolved
94a0: 20 69 6e 0a 2a 2a 20 74 68 65 20 75 73 75 61 6c   in.** the usual
94b0: 20 77 61 79 20 2d 20 75 73 69 6e 67 20 73 71 6c   way - using sql
94c0: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
94d0: 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ames()..**.** Th
94e0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
94f0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
9500: 20 65 72 72 6f 72 73 2e 20 20 49 66 20 65 72 72   errors.  If err
9510: 6f 72 73 20 6f 63 63 75 72 2c 20 74 68 65 6e 0a  ors occur, then.
9520: 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
9530: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
9540: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
9550: 20 70 50 61 72 73 65 2e 20 20 28 4f 4f 4d 20 65   pParse.  (OOM e
9560: 72 72 6f 72 73 0a 2a 2a 20 65 78 63 65 70 74 65  rrors.** excepte
9570: 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d.).*/.static in
9580: 74 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  t resolveOrderGr
9590: 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e  oupBy(.  NameCon
95a0: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f  text *pNC,     /
95b0: 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * The name conte
95c0: 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  xt of the SELECT
95d0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
95e0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
95f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
9600: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 68 6f  ECT statement ho
9610: 6c 64 69 6e 67 20 70 4f 72 64 65 72 42 79 20 2a  lding pOrderBy *
9620: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
9630: 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20  rderBy,   /* An 
9640: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
9650: 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 72  P BY clause to r
9660: 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 63 6f 6e 73  esolve */.  cons
9670: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
9680: 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44    /* Either "ORD
9690: 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20  ER" or "GROUP", 
96a0: 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a  as appropriate *
96b0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
96e0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
96f0: 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iCol;           
9700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
9710: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  lumn number */. 
9720: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
9730: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20  _item *pItem;   
9740: 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65  /* A term of the
9750: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
9760: 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61   */.  Parse *pPa
9770: 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  rse;            
9780: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9790: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
97a0: 20 6e 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20   nResult;       
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
97c0: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69  umber of terms i
97d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
97e0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4f 72 64 65   */..  if( pOrde
97f0: 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
9800: 30 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 70  0;.  nResult = p
9810: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
9820: 6e 45 78 70 72 3b 0a 20 20 70 50 61 72 73 65 20  nExpr;.  pParse 
9830: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
9840: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
9850: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70  pOrderBy->a; i<p
9860: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
9870: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9880: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 49     Expr *pE = pI
9890: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
98a0: 45 78 70 72 20 2a 70 45 32 20 3d 20 73 71 6c 69  Expr *pE2 = sqli
98b0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
98c0: 74 65 28 70 45 29 3b 0a 20 20 20 20 69 66 28 20  te(pE);.    if( 
98d0: 7a 54 79 70 65 5b 30 5d 21 3d 27 47 27 20 29 7b  zType[0]!='G' ){
98e0: 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65  .      iCol = re
98f0: 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50 61 72  solveAsName(pPar
9900: 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  se, pSelect->pEL
9910: 69 73 74 2c 20 70 45 32 29 3b 0a 20 20 20 20 20  ist, pE2);.     
9920: 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20   if( iCol>0 ){. 
9930: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
9940: 41 53 2d 6e 61 6d 65 20 6d 61 74 63 68 20 69 73  AS-name match is
9950: 20 66 6f 75 6e 64 2c 20 6d 61 72 6b 20 74 68 69   found, mark thi
9960: 73 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75 6d  s ORDER BY colum
9970: 6e 20 61 73 20 62 65 69 6e 67 0a 20 20 20 20 20  n as being.     
9980: 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20     ** a copy of 
9990: 74 68 65 20 69 43 6f 6c 2d 74 68 20 72 65 73 75  the iCol-th resu
99a0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 2e 20 20  lt-set column.  
99b0: 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 63  The subsequent c
99c0: 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  all to.        *
99d0: 2a 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  * sqlite3Resolve
99e0: 4f 72 64 65 72 47 72 6f 75 70 42 79 28 29 20 77  OrderGroupBy() w
99f0: 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 20  ill convert the 
9a00: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 61 0a  expression to a.
9a10: 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20          ** copy 
9a20: 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 72  of the iCol-th r
9a30: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
9a40: 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20  sion. */.       
9a50: 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
9a60: 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69  erByCol = (u16)i
9a70: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  Col;.        con
9a80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
9a90: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
9aa0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9ab0: 72 28 70 45 32 2c 20 26 69 43 6f 6c 29 20 29 7b  r(pE2, &iCol) ){
9ac0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  .      /* The OR
9ad0: 44 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 61  DER BY term is a
9ae0: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
9af0: 6e 74 2e 20 20 41 67 61 69 6e 2c 20 73 65 74 20  nt.  Again, set 
9b00: 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20  the column.     
9b10: 20 2a 2a 20 6e 75 6d 62 65 72 20 73 6f 20 74 68   ** number so th
9b20: 61 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  at sqlite3Resolv
9b30: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 29 20  eOrderGroupBy() 
9b40: 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
9b50: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 2d  .      ** order-
9b60: 62 79 20 74 65 72 6d 20 74 6f 20 61 20 63 6f 70  by term to a cop
9b70: 79 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d  y of the result-
9b80: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  set expression *
9b90: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  /.      if( iCol
9ba0: 3c 31 20 7c 7c 20 69 43 6f 6c 3e 30 78 66 66 66  <1 || iCol>0xfff
9bb0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  f ){.        res
9bc0: 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72  olveOutOfRangeEr
9bd0: 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54 79 70  ror(pParse, zTyp
9be0: 65 2c 20 69 2b 31 2c 20 6e 52 65 73 75 6c 74 29  e, i+1, nResult)
9bf0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
9c00: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
9c10: 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72    pItem->u.x.iOr
9c20: 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
9c30: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74  iCol;.      cont
9c40: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
9c50: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74   /* Otherwise, t
9c60: 72 65 61 74 20 74 68 65 20 4f 52 44 45 52 20 42  reat the ORDER B
9c70: 59 20 74 65 72 6d 20 61 73 20 61 6e 20 6f 72 64  Y term as an ord
9c80: 69 6e 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e  inary expression
9c90: 20 2a 2f 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75   */.    pItem->u
9ca0: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
9cb0: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
9cc0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
9cd0: 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a  mes(pNC, pE) ){.
9ce0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
9cf0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d      }.    for(j=
9d00: 30 3b 20 6a 3c 70 53 65 6c 65 63 74 2d 3e 70 45  0; j<pSelect->pE
9d10: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
9d20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
9d30: 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
9d40: 70 45 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pE, pSelect->pEL
9d50: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  ist->a[j].pExpr,
9d60: 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
9d70: 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f     pItem->u.x.iO
9d80: 72 64 65 72 42 79 43 6f 6c 20 3d 20 6a 2b 31 3b  rderByCol = j+1;
9d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9da0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
9db0: 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
9dc0: 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
9dd0: 53 65 6c 65 63 74 2c 20 70 4f 72 64 65 72 42 79  Select, pOrderBy
9de0: 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , zType);.}../*.
9df0: 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  ** Resolve names
9e00: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
9e10: 74 61 74 65 6d 65 6e 74 20 70 20 61 6e 64 20 61  tatement p and a
9e20: 6c 6c 20 6f 66 20 69 74 73 20 64 65 73 63 65 6e  ll of its descen
9e30: 64 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  dants..*/.static
9e40: 20 69 6e 74 20 72 65 73 6f 6c 76 65 53 65 6c 65   int resolveSele
9e50: 63 74 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70  ctStep(Walker *p
9e60: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
9e70: 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  p){.  NameContex
9e80: 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20 20 2f 2a  t *pOuterNC;  /*
9e90: 20 43 6f 6e 74 65 78 74 20 74 68 61 74 20 63 6f   Context that co
9ea0: 6e 74 61 69 6e 73 20 74 68 69 73 20 53 45 4c 45  ntains this SELE
9eb0: 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  CT */.  NameCont
9ec0: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
9ed0: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
9ee0: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
9ef0: 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75  /.  int isCompou
9f00: 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  nd;         /* T
9f10: 72 75 65 20 69 66 20 70 20 69 73 20 61 20 63 6f  rue if p is a co
9f20: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f  mpound select */
9f30: 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e 64  .  int nCompound
9f40: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
9f50: 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f 75 6e 64  mber of compound
9f60: 20 74 65 72 6d 73 20 70 72 6f 63 65 73 73 65 64   terms processed
9f70: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61 72   so far */.  Par
9f80: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
9f90: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9fa0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
9fb0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
9fc0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9fd0: 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  nter */.  ExprLi
9fe0: 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
9ff0: 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
a000: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
a010: 6c 65 63 74 20 2a 70 4c 65 66 74 6d 6f 73 74 3b  lect *pLeftmost;
a020: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
a030: 73 74 20 6f 66 20 53 45 4c 45 43 54 20 6f 66 20  st of SELECT of 
a040: 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  a compound */.  
a050: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
a060: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a070: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a080: 2f 0a 20 20 0a 0a 20 20 61 73 73 65 72 74 28 20  /.  ..  assert( 
a090: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  p!=0 );.  if( p-
a0a0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
a0b0: 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 72  esolved ){.    r
a0c0: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
a0d0: 0a 20 20 7d 0a 20 20 70 4f 75 74 65 72 4e 43 20  .  }.  pOuterNC 
a0e0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
a0f0: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ;.  pParse = pWa
a100: 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
a110: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a120: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20  ..  /* Normally 
a130: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
a140: 61 6e 64 28 29 20 77 69 6c 6c 20 62 65 20 63 61  and() will be ca
a150: 6c 6c 65 64 20 66 69 72 73 74 20 61 6e 64 20 77  lled first and w
a160: 69 6c 6c 20 68 61 76 65 0a 20 20 2a 2a 20 61 6c  ill have.  ** al
a170: 72 65 61 64 79 20 65 78 70 61 6e 64 65 64 20 74  ready expanded t
a180: 68 69 73 20 53 45 4c 45 43 54 2e 20 20 48 6f 77  his SELECT.  How
a190: 65 76 65 72 2c 20 69 66 20 74 68 69 73 20 69 73  ever, if this is
a1a0: 20 61 20 73 75 62 71 75 65 72 79 20 77 69 74 68   a subquery with
a1b0: 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 78 70 72 65  in.  ** an expre
a1c0: 73 73 69 6f 6e 2c 20 73 71 6c 69 74 65 33 52 65  ssion, sqlite3Re
a1d0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
a1e0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
a1f0: 77 69 74 68 6f 75 74 20 61 0a 20 20 2a 2a 20 70  without a.  ** p
a200: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
a210: 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
a220: 28 29 2e 20 20 57 68 65 6e 20 74 68 61 74 20 68  ().  When that h
a230: 61 70 70 65 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a  appens, let.  **
a240: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
a250: 65 70 28 29 20 64 6f 20 61 6c 6c 20 6f 66 20 74  ep() do all of t
a260: 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
a270: 72 20 74 68 69 73 20 53 45 4c 45 43 54 2e 0a 20  r this SELECT.. 
a280: 20 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   ** sqlite3Selec
a290: 74 50 72 65 70 28 29 20 77 69 6c 6c 20 69 6e 76  tPrep() will inv
a2a0: 6f 6b 65 20 62 6f 74 68 20 73 71 6c 69 74 65 33  oke both sqlite3
a2b0: 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 61  SelectExpand() a
a2c0: 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f 75  nd.  ** this rou
a2d0: 74 69 6e 65 20 69 6e 20 74 68 65 20 63 6f 72 72  tine in the corr
a2e0: 65 63 74 20 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a  ect order..  */.
a2f0: 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
a300: 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
a310: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
a320: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
a330: 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
a340: 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  C);.    return (
a350: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
a360: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a370: 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20  ) ? WRC_Abort : 
a380: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a  WRC_Prune;.  }..
a390: 20 20 69 73 43 6f 6d 70 6f 75 6e 64 20 3d 20 70    isCompound = p
a3a0: 2d 3e 70 50 72 69 6f 72 21 3d 30 3b 0a 20 20 6e  ->pPrior!=0;.  n
a3b0: 43 6f 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a 20 20  Compound = 0;.  
a3c0: 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 3b 0a 20  pLeftmost = p;. 
a3d0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
a3e0: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
a3f0: 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
a400: 64 65 64 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  ded)!=0 );.    a
a410: 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
a420: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
a430: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  d)==0 );.    p->
a440: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
a450: 65 73 6f 6c 76 65 64 3b 0a 0a 20 20 20 20 2f 2a  esolved;..    /*
a460: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70   Resolve the exp
a470: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
a480: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
a490: 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a   clauses. These.
a4a0: 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61      ** are not a
a4b0: 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20  llowed to refer 
a4c0: 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f  to any names, so
a4d0: 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e   pass an empty N
a4e0: 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20  ameContext..    
a4f0: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
a500: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
a510: 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
a520: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
a530: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
a540: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
a550: 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c  NC, p->pLimit) |
a560: 7c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  |.        sqlite
a570: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
a580: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73  s(&sNC, p->pOffs
a590: 65 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  et) ){.      ret
a5a0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
a5b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
a5c0: 74 68 65 20 53 46 5f 43 6f 6e 76 65 72 74 65 64  the SF_Converted
a5d0: 20 66 6c 61 67 73 20 69 73 20 73 65 74 2c 20 74   flags is set, t
a5e0: 68 65 6e 20 74 68 69 73 20 53 65 6c 65 63 74 20  hen this Select 
a5f0: 6f 62 6a 65 63 74 20 77 61 73 0a 20 20 20 20 2a  object was.    *
a600: 2a 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  * was created by
a610: 20 74 68 65 20 63 6f 6e 76 65 72 74 43 6f 6d 70   the convertComp
a620: 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71  oundSelectToSubq
a630: 75 65 72 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  uery() function.
a640: 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  .    ** In this 
a650: 63 61 73 65 20 74 68 65 20 4f 52 44 45 52 20 42  case the ORDER B
a660: 59 20 63 6c 61 75 73 65 20 28 70 2d 3e 70 4f 72  Y clause (p->pOr
a670: 64 65 72 42 79 29 20 73 68 6f 75 6c 64 20 62 65  derBy) should be
a680: 20 72 65 73 6f 6c 76 65 64 0a 20 20 20 20 2a 2a   resolved.    **
a690: 20 61 73 20 69 66 20 69 74 20 77 65 72 65 20 70   as if it were p
a6a0: 61 72 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71  art of the sub-q
a6b0: 75 65 72 79 2c 20 6e 6f 74 20 74 68 65 20 70 61  uery, not the pa
a6c0: 72 65 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  rent. This block
a6d0: 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 73 20 74 68  .    ** moves th
a6e0: 65 20 70 4f 72 64 65 72 42 79 20 64 6f 77 6e 20  e pOrderBy down 
a6f0: 74 6f 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  to the sub-query
a700: 2e 20 49 74 20 77 69 6c 6c 20 62 65 20 6d 6f 76  . It will be mov
a710: 65 64 20 62 61 63 6b 0a 20 20 20 20 2a 2a 20 61  ed back.    ** a
a720: 66 74 65 72 20 74 68 65 20 6e 61 6d 65 73 20 68  fter the names h
a730: 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  ave been resolve
a740: 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
a750: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
a760: 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
a770: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
a780: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
a790: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 61  pSelect;.      a
a7a0: 73 73 65 72 74 28 20 70 2d 3e 70 53 72 63 2d 3e  ssert( p->pSrc->
a7b0: 6e 53 72 63 3d 3d 31 20 26 26 20 70 2d 3e 70 4f  nSrc==1 && p->pO
a7c0: 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
a7d0: 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 50  assert( pSub->pP
a7e0: 72 69 6f 72 20 26 26 20 70 53 75 62 2d 3e 70 4f  rior && pSub->pO
a7f0: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
a800: 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
a810: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
a820: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
a830: 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  By = 0;.    }.  
a840: 0a 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76  .    /* Recursiv
a850: 65 6c 79 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65  ely resolve name
a860: 73 20 69 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  s in all subquer
a870: 69 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ies.    */.    f
a880: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
a890: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
a8a0: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
a8b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
a8c0: 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
a8d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
a8e0: 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
a8f0: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
a900: 74 20 2a 70 4e 43 3b 20 20 20 20 20 20 20 20 20  t *pNC;         
a910: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
a920: 74 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  te name contexts
a930: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
a940: 6e 52 65 66 20 3d 20 30 3b 20 20 20 20 20 20 20  nRef = 0;       
a950: 20 20 20 20 20 20 2f 2a 20 52 65 66 63 6f 75 6e        /* Refcoun
a960: 74 20 66 6f 72 20 70 4f 75 74 65 72 4e 43 20 61  t for pOuterNC a
a970: 6e 64 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74  nd outer context
a980: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  s */.        con
a990: 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 43  st char *zSavedC
a9a0: 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
a9b0: 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  >zAuthContext;..
a9c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
a9d0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
a9e0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
a9f0: 74 6f 20 70 4f 75 74 65 72 4e 43 20 61 6e 64 20  to pOuterNC and 
aa00: 61 6c 6c 20 6f 66 20 69 74 73 0a 20 20 20 20 20  all of its.     
aa10: 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 63 6f 6e     ** parent con
aa20: 74 65 78 74 73 2e 20 41 66 74 65 72 20 72 65 73  texts. After res
aa30: 6f 6c 76 69 6e 67 20 72 65 66 65 72 65 6e 63 65  olving reference
aa40: 73 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73  s to expressions
aa50: 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   in.        ** p
aa60: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 63  Item->pSelect, c
aa70: 68 65 63 6b 20 69 66 20 74 68 69 73 20 76 61 6c  heck if this val
aa80: 75 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ue has changed. 
aa90: 49 66 20 73 6f 2c 20 74 68 65 6e 0a 20 20 20 20  If so, then.    
aaa0: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
aab0: 61 74 65 6d 65 6e 74 20 70 49 74 65 6d 2d 3e 70  atement pItem->p
aac0: 53 65 6c 65 63 74 20 6d 75 73 74 20 62 65 20 63  Select must be c
aad0: 6f 72 72 65 6c 61 74 65 64 2e 20 53 65 74 20 74  orrelated. Set t
aae0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 49  he.        ** pI
aaf0: 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  tem->fg.isCorrel
ab00: 61 74 65 64 20 66 6c 61 67 20 69 66 20 74 68 69  ated flag if thi
ab10: 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 20 2a  s is the case. *
ab20: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4e  /.        for(pN
ab30: 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b  C=pOuterNC; pNC;
ab40: 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29   pNC=pNC->pNext)
ab50: 20 6e 52 65 66 20 2b 3d 20 70 4e 43 2d 3e 6e 52   nRef += pNC->nR
ab60: 65 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ef;..        if(
ab70: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20   pItem->zName ) 
ab80: 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
ab90: 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  text = pItem->zN
aba0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
abb0: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
abc0: 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
abd0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Item->pSelect, p
abe0: 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20 20 20  OuterNC);.      
abf0: 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
ac00: 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 43  ontext = zSavedC
ac10: 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
ac20: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
ac30: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
ac40: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 57 52  iled ) return WR
ac50: 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 20 20  C_Abort;..      
ac60: 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72    for(pNC=pOuter
ac70: 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43  NC; pNC; pNC=pNC
ac80: 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66 20 2d 3d  ->pNext) nRef -=
ac90: 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20   pNC->nRef;.    
aca0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
acb0: 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  m->fg.isCorrelat
acc0: 65 64 3d 3d 30 20 26 26 20 6e 52 65 66 3c 3d 30  ed==0 && nRef<=0
acd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   );.        pIte
ace0: 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c 61 74  m->fg.isCorrelat
acf0: 65 64 20 3d 20 28 6e 52 65 66 21 3d 30 29 3b 0a  ed = (nRef!=0);.
ad00: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ad10: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74  .    /* Set up t
ad20: 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f  he local name-co
ad30: 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f  ntext to pass to
ad40: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
ad50: 78 70 72 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20  xprNames() to.  
ad60: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65    ** resolve the
ad70: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
ad80: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 20 20 20  ession list..   
ad90: 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c   */.    sNC.ncFl
ada0: 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67  ags = NC_AllowAg
adb0: 67 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c  g;.    sNC.pSrcL
adc0: 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20  ist = p->pSrc;. 
add0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70     sNC.pNext = p
ade0: 4f 75 74 65 72 4e 43 3b 0a 20 20 0a 20 20 20 20  OuterNC;.  .    
adf0: 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
ae00: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
ae10: 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  et. */.    if( s
ae20: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
ae30: 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c  rListNames(&sNC,
ae40: 20 70 2d 3e 70 45 4c 69 73 74 29 20 29 20 72 65   p->pEList) ) re
ae50: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
ae60: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
ae70: 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67  re are no aggreg
ae80: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
ae90: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c   the result-set,
aea0: 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
aeb0: 20 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73   .    ** express
aec0: 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ion, do not allo
aed0: 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20  w aggregates in 
aee0: 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  any of the other
aef0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
af00: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
af10: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
af20: 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30  SF_Aggregate)==0
af30: 20 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79   );.    pGroupBy
af40: 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
af50: 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
af60: 20 7c 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73   || (sNC.ncFlags
af70: 20 26 20 4e 43 5f 48 61 73 41 67 67 29 21 3d 30   & NC_HasAgg)!=0
af80: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
af90: 28 20 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 3d 3d  ( NC_MinMaxAgg==
afa0: 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a  SF_MinMaxAgg );.
afb0: 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
afc0: 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
afd0: 65 20 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73  e | (sNC.ncFlags
afe0: 26 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a  &NC_MinMaxAgg);.
aff0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b000: 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
b010: 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20  ~NC_AllowAgg;.  
b020: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
b030: 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
b040: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
b050: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
b060: 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
b070: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
b080: 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
b090: 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
b0a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
b0b0: 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
b0c0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
b0d0: 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
b0e0: 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20   HAVING");.     
b0f0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
b100: 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  t;.    }.  .    
b110: 2f 2a 20 41 64 64 20 74 68 65 20 6f 75 74 70 75  /* Add the outpu
b120: 74 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f  t column list to
b130: 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78   the name-contex
b140: 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67  t before parsing
b150: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
b160: 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  r expressions in
b170: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
b180: 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73  ement. This is s
b190: 6f 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 78  o that.    ** ex
b1a0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
b1b0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65   WHERE clause (e
b1c0: 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74  tc.) can refer t
b1d0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  o expressions by
b1e0: 0a 20 20 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  .    ** aliases 
b1f0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
b200: 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
b210: 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66   Minor point: If
b220: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
b230: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  e, then the expr
b240: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20  ession will be. 
b250: 20 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74     ** re-evaluat
b260: 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65  ed for each refe
b270: 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 20  rence to it..   
b280: 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 45 4c 69   */.    sNC.pELi
b290: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
b2a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
b2b0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
b2c0: 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67  &sNC, p->pHaving
b2d0: 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
b2e0: 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 73 71  bort;.    if( sq
b2f0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
b300: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
b310: 57 68 65 72 65 29 20 29 20 72 65 74 75 72 6e 20  Where) ) return 
b320: 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20  WRC_Abort;..    
b330: 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
b340: 20 69 6e 20 74 61 62 6c 65 2d 76 61 6c 75 65 64   in table-valued
b350: 2d 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65  -function argume
b360: 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  nts */.    for(i
b370: 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e  =0; i<p->pSrc->n
b380: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
b390: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
b3a0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
b3b0: 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20  ->pSrc->a[i];.  
b3c0: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66      if( pItem->f
b3d0: 67 2e 69 73 54 61 62 46 75 6e 63 0a 20 20 20 20  g.isTabFunc.    
b3e0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 52 65 73     && sqlite3Res
b3f0: 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65  olveExprListName
b400: 73 28 26 73 4e 43 2c 20 70 49 74 65 6d 2d 3e 75  s(&sNC, pItem->u
b410: 31 2e 70 46 75 6e 63 41 72 67 29 20 0a 20 20 20  1.pFuncArg) .   
b420: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65     ){.        re
b430: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
b440: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
b450: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
b460: 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20  BY and GROUP BY 
b470: 63 6c 61 75 73 65 73 20 6d 61 79 20 6e 6f 74 20  clauses may not 
b480: 72 65 66 65 72 20 74 6f 20 74 65 72 6d 73 20 69  refer to terms i
b490: 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71  n.    ** outer q
b4a0: 75 65 72 69 65 73 20 0a 20 20 20 20 2a 2f 0a 20  ueries .    */. 
b4b0: 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30     sNC.pNext = 0
b4c0: 3b 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67  ;.    sNC.ncFlag
b4d0: 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67  s |= NC_AllowAgg
b4e0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
b4f0: 73 20 69 73 20 61 20 63 6f 6e 76 65 72 74 65 64  s is a converted
b500: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2c   compound query,
b510: 20 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20   move the ORDER 
b520: 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 0a  BY clause from .
b530: 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 71      ** the sub-q
b540: 75 65 72 79 20 62 61 63 6b 20 74 6f 20 74 68 65  uery back to the
b550: 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e 20 41   parent query. A
b560: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 65 61 63  t this point eac
b570: 68 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 77 69  h term.    ** wi
b580: 74 68 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  thin the ORDER B
b590: 59 20 63 6c 61 75 73 65 20 68 61 73 20 62 65 65  Y clause has bee
b5a0: 6e 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  n transformed to
b5b0: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
b5c0: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 73 65 20  e..    ** These 
b5d0: 69 6e 74 65 67 65 72 73 20 77 69 6c 6c 20 62 65  integers will be
b5e0: 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 70   replaced by cop
b5f0: 69 65 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ies of the corre
b600: 73 70 6f 6e 64 69 6e 67 20 72 65 73 75 6c 74 0a  sponding result.
b610: 20 20 20 20 2a 2a 20 73 65 74 20 65 78 70 72 65      ** set expre
b620: 73 73 69 6f 6e 73 20 62 79 20 74 68 65 20 63 61  ssions by the ca
b630: 6c 6c 20 74 6f 20 72 65 73 6f 6c 76 65 4f 72 64  ll to resolveOrd
b640: 65 72 47 72 6f 75 70 42 79 28 29 20 62 65 6c 6f  erGroupBy() belo
b650: 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  w.  */.    if( p
b660: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
b670: 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
b680: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
b690: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
b6a0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 70  pSelect;.      p
b6b0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
b6c0: 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
b6d0: 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
b6e0: 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 0;.    }..  
b6f0: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
b700: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b710: 20 66 6f 72 20 73 69 6e 67 6c 65 74 6f 6e 20 53   for singleton S
b720: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b730: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 52 44  ..    ** The ORD
b740: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
b750: 20 63 6f 6d 70 6f 75 6e 64 73 20 53 45 4c 45 43   compounds SELEC
b760: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
b770: 68 61 6e 64 6c 65 64 0a 20 20 20 20 2a 2a 20 62  handled.    ** b
b780: 65 6c 6f 77 2c 20 61 66 74 65 72 20 61 6c 6c 20  elow, after all 
b790: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  of the result-se
b7a0: 74 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  ts for all of th
b7b0: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 20 20  e elements of.  
b7c0: 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e    ** the compoun
b7d0: 64 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f  d have been reso
b7e0: 6c 76 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  lved..    **.   
b7f0: 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   ** If there is 
b800: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
b810: 73 65 20 6f 6e 20 61 20 74 65 72 6d 20 6f 66 20  se on a term of 
b820: 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
b830: 74 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  t other.    ** t
b840: 68 61 6e 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  han the right-mo
b850: 73 74 20 74 65 72 6d 2c 20 74 68 65 6e 20 74 68  st term, then th
b860: 61 74 20 69 73 20 61 20 73 79 6e 74 61 78 20 65  at is a syntax e
b870: 72 72 6f 72 2e 20 20 42 75 74 20 74 68 65 20 65  rror.  But the e
b880: 72 72 6f 72 0a 20 20 20 20 2a 2a 20 69 73 20 6e  rror.    ** is n
b890: 6f 74 20 64 65 74 65 63 74 65 64 20 75 6e 74 69  ot detected unti
b8a0: 6c 20 6d 75 63 68 20 6c 61 74 65 72 2c 20 61 6e  l much later, an
b8b0: 64 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20  d so we need to 
b8c0: 67 6f 20 61 68 65 61 64 20 61 6e 64 0a 20 20 20  go ahead and.   
b8d0: 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 6f 73   ** resolve thos
b8e0: 65 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65  e symbols on the
b8f0: 20 69 6e 63 6f 72 72 65 63 74 20 4f 52 44 45 52   incorrect ORDER
b900: 20 42 59 20 66 6f 72 20 63 6f 6e 73 69 73 74 65   BY for consiste
b910: 6e 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ncy..    */.    
b920: 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 3c 3d  if( isCompound<=
b930: 6e 43 6f 6d 70 6f 75 6e 64 20 20 2f 2a 20 44 65  nCompound  /* De
b940: 66 65 72 20 72 69 67 68 74 2d 6d 6f 73 74 20 4f  fer right-most O
b950: 52 44 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d  RDER BY of a com
b960: 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 26 26  pound */.     &&
b970: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
b980: 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 2d  upBy(&sNC, p, p-
b990: 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
b9a0: 52 22 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  R").    ){.     
b9b0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
b9c0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
b9d0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
b9e0: 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
b9f0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
ba00: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73   }.  .    /* Res
ba10: 6f 6c 76 65 20 74 68 65 20 47 52 4f 55 50 20 42  olve the GROUP B
ba20: 59 20 63 6c 61 75 73 65 2e 20 20 41 74 20 74 68  Y clause.  At th
ba30: 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 6d 61 6b  e same time, mak
ba40: 65 20 73 75 72 65 20 0a 20 20 20 20 2a 2a 20 74  e sure .    ** t
ba50: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
ba60: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  se does not cont
ba70: 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75  ain aggregate fu
ba80: 6e 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a  nctions..    */.
ba90: 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
baa0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
bab0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
bac0: 70 49 74 65 6d 3b 0a 20 20 20 20 0a 20 20 20 20  pItem;.    .    
bad0: 20 20 69 66 28 20 72 65 73 6f 6c 76 65 4f 72 64    if( resolveOrd
bae0: 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20  erGroupBy(&sNC, 
baf0: 70 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52  p, pGroupBy, "GR
bb00: 4f 55 50 22 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c  OUP") || db->mal
bb10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
bb20: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
bb30: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
bb40: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49       for(i=0, pI
bb50: 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b  tem=pGroupBy->a;
bb60: 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78   i<pGroupBy->nEx
bb70: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
bb80: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  ){.        if( E
bb90: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
bba0: 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f  Item->pExpr, EP_
bbb0: 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Agg) ){.        
bbc0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
bbd0: 67 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65  g(pParse, "aggre
bbe0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  gate functions a
bbf0: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
bc00: 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  n ".            
bc10: 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20    "the GROUP BY 
bc20: 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20  clause");.      
bc30: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
bc40: 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  bort;.        }.
bc50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
bc60: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
bc70: 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f   part of a compo
bc80: 75 6e 64 20 53 45 4c 45 43 54 2c 20 63 68 65 63  und SELECT, chec
bc90: 6b 20 74 68 61 74 20 69 74 20 68 61 73 20 74 68  k that it has th
bca0: 65 20 72 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e  e right.    ** n
bcb0: 75 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73 73  umber of express
bcc0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 73 65 6c 65  ions in the sele
bcd0: 63 74 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20  ct list. */.    
bce0: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 26 26 20  if( p->pNext && 
bcf0: 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  p->pEList->nExpr
bd00: 21 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69  !=p->pNext->pELi
bd10: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
bd20: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
bd30: 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72  WrongNumTermsErr
bd40: 6f 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4e  or(pParse, p->pN
bd50: 65 78 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ext);.      retu
bd60: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
bd70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61    }..    /* Adva
bd80: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
bd90: 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6f 6d 70  term of the comp
bda0: 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ound.    */.    
bdb0: 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20  p = p->pPrior;. 
bdc0: 20 20 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a     nCompound++;.
bdd0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76    }..  /* Resolv
bde0: 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f  e the ORDER BY o
bdf0: 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  n a compound SEL
be00: 45 43 54 20 61 66 74 65 72 20 61 6c 6c 20 74 65  ECT after all te
be10: 72 6d 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  rms of.  ** the 
be20: 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65  compound have be
be30: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a  en resolved..  *
be40: 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75  /.  if( isCompou
be50: 6e 64 20 26 26 20 72 65 73 6f 6c 76 65 43 6f 6d  nd && resolveCom
be60: 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61  poundOrderBy(pPa
be70: 72 73 65 2c 20 70 4c 65 66 74 6d 6f 73 74 29 20  rse, pLeftmost) 
be80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
be90: 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20  C_Abort;.  }..  
bea0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
beb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
bec0: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
bed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
bee0: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
bef0: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
bf00: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  able columns and
bf10: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
bf20: 6d 6e 73 2e 20 20 41 74 20 74 68 65 20 73 61 6d  mns.  At the sam
bf30: 65 20 74 69 6d 65 2c 20 64 6f 20 65 72 72 6f 72  e time, do error
bf40: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20  .** checking on 
bf50: 66 75 6e 63 74 69 6f 6e 20 75 73 61 67 65 20 61  function usage a
bf60: 6e 64 20 73 65 74 20 61 20 66 6c 61 67 20 69 66  nd set a flag if
bf70: 20 61 6e 79 20 61 67 67 72 65 67 61 74 65 20 66   any aggregate f
bf80: 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20  unctions.** are 
bf90: 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 72  seen..**.** To r
bfa0: 65 73 6f 6c 76 65 20 74 61 62 6c 65 20 63 6f 6c  esolve table col
bfb0: 75 6d 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20  umns references 
bfc0: 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f 64 65  we look for node
bfd0: 73 20 28 6f 72 20 73 75 62 74 72 65 65 73 29 20  s (or subtrees) 
bfe0: 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 72 6d 20  of the .** form 
bff0: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20  X.Y.Z or Y.Z or 
c000: 6a 75 73 74 20 5a 20 77 68 65 72 65 0a 2a 2a 0a  just Z where.**.
c010: 2a 2a 20 20 20 20 20 20 58 3a 20 20 20 54 68 65  **      X:   The
c020: 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62   name of a datab
c030: 61 73 65 2e 20 20 45 78 3a 20 20 22 6d 61 69 6e  ase.  Ex:  "main
c040: 22 20 6f 72 20 22 74 65 6d 70 22 20 6f 72 0a 2a  " or "temp" or.*
c050: 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20  *           the 
c060: 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 61 73  symbolic name as
c070: 73 69 67 6e 65 64 20 74 6f 20 61 6e 20 41 54 54  signed to an ATT
c080: 41 43 48 2d 65 64 20 64 61 74 61 62 61 73 65 2e  ACH-ed database.
c090: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 3a 20 20  .**.**      Y:  
c0a0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   The name of a t
c0b0: 61 62 6c 65 20 69 6e 20 61 20 46 52 4f 4d 20 63  able in a FROM c
c0c0: 6c 61 75 73 65 2e 20 20 4f 72 20 69 6e 20 61 20  lause.  Or in a 
c0d0: 74 72 69 67 67 65 72 0a 2a 2a 20 20 20 20 20 20  trigger.**      
c0e0: 20 20 20 20 20 6f 6e 65 20 6f 66 20 74 68 65 20       one of the 
c0f0: 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22 6f  special names "o
c100: 6c 64 22 20 6f 72 20 22 6e 65 77 22 2e 0a 2a 2a  ld" or "new"..**
c110: 0a 2a 2a 20 20 20 20 20 20 5a 3a 20 20 20 54 68  .**      Z:   Th
c120: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
c130: 6d 6e 20 69 6e 20 74 61 62 6c 65 20 59 2e 0a 2a  mn in table Y..*
c140: 2a 0a 2a 2a 20 54 68 65 20 6e 6f 64 65 20 61 74  *.** The node at
c150: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
c160: 20 73 75 62 74 72 65 65 20 69 73 20 6d 6f 64 69   subtree is modi
c170: 66 69 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  fied as follows:
c180: 0a 2a 2a 0a 2a 2a 20 20 20 20 45 78 70 72 2e 6f  .**.**    Expr.o
c190: 70 20 20 20 20 20 20 20 20 43 68 61 6e 67 65 64  p        Changed
c1a0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a   to TK_COLUMN.**
c1b0: 20 20 20 20 45 78 70 72 2e 70 54 61 62 20 20 20      Expr.pTab   
c1c0: 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65     Points to the
c1d0: 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 66 6f   Table object fo
c1e0: 72 20 58 2e 59 0a 2a 2a 20 20 20 20 45 78 70 72  r X.Y.**    Expr
c1f0: 2e 69 43 6f 6c 75 6d 6e 20 20 20 54 68 65 20 63  .iColumn   The c
c200: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20 58  olumn index in X
c210: 2e 59 2e 20 20 2d 31 20 66 6f 72 20 74 68 65 20  .Y.  -1 for the 
c220: 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 45 78 70  rowid..**    Exp
c230: 72 2e 69 54 61 62 6c 65 20 20 20 20 54 68 65 20  r.iTable    The 
c240: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
c250: 65 72 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a 2a 2a  er for X.Y.**.**
c260: 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 72  .** To resolve r
c270: 65 73 75 6c 74 2d 73 65 74 20 72 65 66 65 72 65  esult-set refere
c280: 6e 63 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72 20 65  nces, look for e
c290: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73 20  xpression nodes 
c2a0: 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 5a  of the.** form Z
c2b0: 20 28 77 69 74 68 20 6e 6f 20 58 20 61 6e 64 20   (with no X and 
c2c0: 59 20 70 72 65 66 69 78 29 20 77 68 65 72 65 20  Y prefix) where 
c2d0: 74 68 65 20 5a 20 6d 61 74 63 68 65 73 20 74 68  the Z matches th
c2e0: 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20  e right-hand.** 
c2f0: 73 69 7a 65 20 6f 66 20 61 6e 20 41 53 20 63 6c  size of an AS cl
c300: 61 75 73 65 20 69 6e 20 74 68 65 20 72 65 73 75  ause in the resu
c310: 6c 74 2d 73 65 74 20 6f 66 20 61 20 53 45 4c 45  lt-set of a SELE
c320: 43 54 2e 20 20 54 68 65 20 5a 20 65 78 70 72 65  CT.  The Z expre
c330: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 70 6c  ssion.** is repl
c340: 61 63 65 64 20 62 79 20 61 20 63 6f 70 79 20 6f  aced by a copy o
c350: 66 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20  f the left-hand 
c360: 73 69 64 65 20 6f 66 20 74 68 65 20 72 65 73 75  side of the resu
c370: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
c380: 6e 2e 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61 6d 65  n..** Table-name
c390: 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 72 65   and function re
c3a0: 73 6f 6c 75 74 69 6f 6e 20 6f 63 63 75 72 73 20  solution occurs 
c3b0: 6f 6e 20 74 68 65 20 73 75 62 73 74 69 74 75 74  on the substitut
c3c0: 65 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  ed expression.**
c3d0: 20 74 72 65 65 2e 20 20 46 6f 72 20 65 78 61 6d   tree.  For exam
c3e0: 70 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20  ple, in:.**.**  
c3f0: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41      SELECT a+b A
c400: 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46 52  S x, c+d AS y FR
c410: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 78  OM t1 ORDER BY x
c420: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 78 22 20  ;.**.** The "x" 
c430: 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 72 64 65  term of the orde
c440: 72 20 62 79 20 69 73 20 72 65 70 6c 61 63 65 64  r by is replaced
c450: 20 62 79 20 22 61 2b 62 22 20 74 6f 20 72 65 6e   by "a+b" to ren
c460: 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  der:.**.**      
c470: 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c  SELECT a+b AS x,
c480: 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74   c+d AS y FROM t
c490: 31 20 4f 52 44 45 52 20 42 59 20 61 2b 62 3b 0a  1 ORDER BY a+b;.
c4a0: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 63  **.** Function c
c4b0: 61 6c 6c 73 20 61 72 65 20 63 68 65 63 6b 65 64  alls are checked
c4c0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
c4d0: 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  at the function 
c4e0: 69 73 20 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61  is .** defined a
c4f0: 6e 64 20 74 68 61 74 20 74 68 65 20 63 6f 72 72  nd that the corr
c500: 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ect number of ar
c510: 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63  guments are spec
c520: 69 66 69 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65  ified..** If the
c530: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
c540: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
c550: 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 4e 43 5f  on, then the NC_
c560: 48 61 73 41 67 67 20 66 6c 61 67 20 69 73 0a 2a  HasAgg flag is.*
c570: 2a 20 73 65 74 20 61 6e 64 20 74 68 65 20 6f 70  * set and the op
c580: 63 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64 20  code is changed 
c590: 66 72 6f 6d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  from TK_FUNCTION
c5a0: 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54   to TK_AGG_FUNCT
c5b0: 49 4f 4e 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ION..** If an ex
c5c0: 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  pression contain
c5d0: 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  s aggregate func
c5e0: 74 69 6f 6e 73 20 74 68 65 6e 20 74 68 65 20 45  tions then the E
c5f0: 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74  P_Agg.** propert
c600: 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  y on the express
c610: 69 6f 6e 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ion is set..**.*
c620: 2a 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  * An error messa
c630: 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 50  ge is left in pP
c640: 61 72 73 65 20 69 66 20 61 6e 79 74 68 69 6e 67  arse if anything
c650: 20 69 73 20 61 6d 69 73 73 2e 20 20 54 68 65 20   is amiss.  The 
c660: 6e 75 6d 62 65 72 0a 2a 2a 20 69 66 20 65 72 72  number.** if err
c670: 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ors is returned.
c680: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52  .*/.int sqlite3R
c690: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
c6a0: 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20   .  NameContext 
c6b0: 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e  *pNC,       /* N
c6c0: 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f  amespace to reso
c6d0: 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lve expressions 
c6e0: 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  in. */.  Expr *p
c6f0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
c700: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c710: 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65  on to be analyze
c720: 64 2e 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 73  d. */.){.  u16 s
c730: 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20 57 61  avedHasAgg;.  Wa
c740: 6c 6b 65 72 20 77 3b 0a 0a 20 20 69 66 28 20 70  lker w;..  if( p
c750: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
c760: 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   0;.#if SQLITE_M
c770: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
c780: 20 20 7b 0a 20 20 20 20 50 61 72 73 65 20 2a 70    {.    Parse *p
c790: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
c7a0: 72 73 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  rse;.    if( sql
c7b0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
c7c0: 67 68 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ght(pParse, pExp
c7d0: 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e 43 2d 3e  r->nHeight+pNC->
c7e0: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29  pParse->nHeight)
c7f0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c800: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
c810: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
c820: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
c830: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 61  .  }.#endif.  sa
c840: 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d  vedHasAgg = pNC-
c850: 3e 6e 63 46 6c 61 67 73 20 26 20 28 4e 43 5f 48  >ncFlags & (NC_H
c860: 61 73 41 67 67 7c 4e 43 5f 4d 69 6e 4d 61 78 41  asAgg|NC_MinMaxA
c870: 67 67 29 3b 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c  gg);.  pNC->ncFl
c880: 61 67 73 20 26 3d 20 7e 28 4e 43 5f 48 61 73 41  ags &= ~(NC_HasA
c890: 67 67 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29  gg|NC_MinMaxAgg)
c8a0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20 30  ;.  memset(&w, 0
c8b0: 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20 20  , sizeof(w));.  
c8c0: 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20  w.xExprCallback 
c8d0: 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65  = resolveExprSte
c8e0: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
c8f0: 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65  llback = resolve
c900: 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77 2e  SelectStep;.  w.
c910: 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50  pParse = pNC->pP
c920: 61 72 73 65 3b 0a 20 20 77 2e 75 2e 70 4e 43 20  arse;.  w.u.pNC 
c930: 3d 20 70 4e 43 3b 0a 20 20 73 71 6c 69 74 65 33  = pNC;.  sqlite3
c940: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
c950: 70 72 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pr);.#if SQLITE_
c960: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
c970: 0a 20 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  .  pNC->pParse->
c980: 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72  nHeight -= pExpr
c990: 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69  ->nHeight;.#endi
c9a0: 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 45 72  f.  if( pNC->nEr
c9b0: 72 3e 30 20 7c 7c 20 77 2e 70 50 61 72 73 65 2d  r>0 || w.pParse-
c9c0: 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45  >nErr>0 ){.    E
c9d0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
c9e0: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
c9f0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 43 2d 3e  .  }.  if( pNC->
ca00: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73  ncFlags & NC_Has
ca10: 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53  Agg ){.    ExprS
ca20: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
ca30: 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 0a 20  , EP_Agg);.  }. 
ca40: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d   pNC->ncFlags |=
ca50: 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20   savedHasAgg;.  
ca60: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
ca70: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
ca80: 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _Error);.}../*.*
ca90: 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61  * Resolve all na
caa0: 6d 65 73 20 66 6f 72 20 61 6c 6c 20 65 78 70 72  mes for all expr
cab0: 65 73 73 69 6f 6e 20 69 6e 20 61 6e 20 65 78 70  ession in an exp
cac0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54  ression list.  T
cad0: 68 69 73 20 69 73 0a 2a 2a 20 6a 75 73 74 20 6c  his is.** just l
cae0: 69 6b 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  ike sqlite3Resol
caf0: 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 65 78  veExprNames() ex
cb00: 63 65 70 74 20 74 68 61 74 20 69 74 20 77 6f 72  cept that it wor
cb10: 6b 73 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73  ks for an expres
cb20: 73 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 72 61 74  sion.** list rat
cb30: 68 65 72 20 74 68 61 6e 20 61 20 73 69 6e 67 6c  her than a singl
cb40: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  e expression..*/
cb50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f  .int sqlite3Reso
cb60: 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73  lveExprListNames
cb70: 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ( .  NameContext
cb80: 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pNC,       /* 
cb90: 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73  Namespace to res
cba0: 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73  olve expressions
cbb0: 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69   in. */.  ExprLi
cbc0: 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20 20  st *pList       
cbd0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
cbe0: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 61  ion list to be a
cbf0: 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20  nalyzed. */.){. 
cc00: 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
cc10: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
cc20: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
cc30: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
cc40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
cc50: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70  solveExprNames(p
cc60: 4e 43 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  NC, pList->a[i].
cc70: 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 20  pExpr) ) return 
cc80: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 20  WRC_Abort;.  }. 
cc90: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
cca0: 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  inue;.}../*.** R
ccb0: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
ccc0: 20 69 6e 20 61 6c 6c 20 65 78 70 72 65 73 73 69   in all expressi
ccd0: 6f 6e 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20  ons of a SELECT 
cce0: 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65  and in all.** de
ccf0: 63 65 6e 64 65 6e 74 73 20 6f 66 20 74 68 65 20  cendents of the 
cd00: 53 45 4c 45 43 54 2c 20 69 6e 63 6c 75 64 69 6e  SELECT, includin
cd10: 67 20 63 6f 6d 70 6f 75 6e 64 73 20 6f 66 66 20  g compounds off 
cd20: 6f 66 20 70 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a  of p->pPrior,.**
cd30: 20 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 65   subqueries in e
cd40: 78 70 72 65 73 73 69 6f 6e 73 2c 20 61 6e 64 20  xpressions, and 
cd50: 73 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20  subqueries used 
cd60: 61 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a  as FROM clause.*
cd70: 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53  * terms..**.** S
cd80: 65 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ee sqlite3Resolv
cd90: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 66 6f 72  eExprNames() for
cda0: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
cdb0: 66 20 74 68 65 20 6b 69 6e 64 73 20 6f 66 0a 2a  f the kinds of.*
cdc0: 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  * transformation
cdd0: 73 20 74 68 61 74 20 6f 63 63 75 72 2e 0a 2a 2a  s that occur..**
cde0: 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 73  .** All SELECT s
cdf0: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
ce00: 20 68 61 76 65 20 62 65 65 6e 20 65 78 70 61 6e   have been expan
ce10: 64 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ded using.** sql
ce20: 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
ce30: 28 29 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  () prior to invo
ce40: 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
ce50: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
ce60: 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e  e3ResolveSelectN
ce70: 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70  ames(.  Parse *p
ce80: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
ce90: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
cea0: 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  text */.  Select
ceb0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
cec0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
ced0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63  tatement being c
cee0: 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43  oded. */.  NameC
cef0: 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43  ontext *pOuterNC
cf00: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
cf10: 74 20 66 6f 72 20 70 61 72 65 6e 74 20 53 45 4c  t for parent SEL
cf20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
cf30: 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  .){.  Walker w;.
cf40: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
cf50: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  );.  memset(&w, 
cf60: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
cf70: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
cf80: 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74   = resolveExprSt
cf90: 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ep;.  w.xSelectC
cfa0: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76  allback = resolv
cfb0: 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77  eSelectStep;.  w
cfc0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
cfd0: 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4f  ;.  w.u.pNC = pO
cfe0: 75 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69 74 65  uterNC;.  sqlite
cff0: 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
d000: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
d010: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 65 78  olve names in ex
d020: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 63  pressions that c
d030: 61 6e 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63  an only referenc
d040: 65 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  e a single table
d050: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 43  :.**.**    *   C
d060: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73  HECK constraints
d070: 0a 2a 2a 20 20 20 20 2a 20 20 20 57 48 45 52 45  .**    *   WHERE
d080: 20 63 6c 61 75 73 65 73 20 6f 6e 20 70 61 72 74   clauses on part
d090: 69 61 6c 20 69 6e 64 69 63 65 73 0a 2a 2a 0a 2a  ial indices.**.*
d0a0: 2a 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c  * The Expr.iTabl
d0b0: 65 20 76 61 6c 75 65 20 66 6f 72 20 45 78 70 72  e value for Expr
d0c0: 2e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 6e  .op==TK_COLUMN n
d0d0: 6f 64 65 73 20 6f 66 20 74 68 65 20 65 78 70 72  odes of the expr
d0e0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 73 65 74  ession.** is set
d0f0: 20 74 6f 20 2d 31 20 61 6e 64 20 74 68 65 20 45   to -1 and the E
d100: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
d110: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
d120: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a  column number..*
d130: 2a 0a 2a 2a 20 41 6e 79 20 65 72 72 6f 72 73 20  *.** Any errors 
d140: 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20 6d  cause an error m
d150: 65 73 73 61 67 65 20 74 6f 20 62 65 20 73 65 74  essage to be set
d160: 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76   in pParse..*/.v
d170: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  oid sqlite3Resol
d180: 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
d190: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d1a0: 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  ,      /* Parsin
d1b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
d1c0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
d1d0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
d1e0: 62 65 69 6e 67 20 72 65 66 65 72 65 6e 63 65 64  being referenced
d1f0: 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65 2c 20   */.  int type, 
d200: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 43 5f            /* NC_
d210: 49 73 43 68 65 63 6b 20 6f 72 20 4e 43 5f 50 61  IsCheck or NC_Pa
d220: 72 74 49 64 78 20 6f 72 20 4e 43 5f 49 64 78 45  rtIdx or NC_IdxE
d230: 78 70 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  xpr */.  Expr *p
d240: 45 78 70 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  Expr,        /* 
d250: 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 72 65  Expression to re
d260: 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e  solve.  May be N
d270: 55 4c 4c 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ULL. */.  ExprLi
d280: 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20 2f 2a  st *pList     /*
d290: 20 45 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   Expression list
d2a0: 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20 20 4d 61   to resolve.  Ma
d2b0: 79 20 62 65 20 4e 55 4c 2e 20 2a 2f 0a 29 7b 0a  y be NUL. */.){.
d2c0: 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20    SrcList sSrc; 
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73    /* Fake SrcLis
d2f0: 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e  t for pParse->pN
d300: 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 4e 61 6d  ewTable */.  Nam
d310: 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20  eContext sNC;   
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d330: 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72  Name context for
d340: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
d350: 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  le */..  assert(
d360: 20 74 79 70 65 3d 3d 4e 43 5f 49 73 43 68 65 63   type==NC_IsChec
d370: 6b 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f 50 61  k || type==NC_Pa
d380: 72 74 49 64 78 20 7c 7c 20 74 79 70 65 3d 3d 4e  rtIdx || type==N
d390: 43 5f 49 64 78 45 78 70 72 20 29 3b 0a 20 20 6d  C_IdxExpr );.  m
d3a0: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
d3b0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 6d  izeof(sNC));.  m
d3c0: 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20  emset(&sSrc, 0, 
d3d0: 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20  sizeof(sSrc));. 
d3e0: 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a   sSrc.nSrc = 1;.
d3f0: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d    sSrc.a[0].zNam
d400: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
d410: 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61  .  sSrc.a[0].pTa
d420: 62 20 3d 20 70 54 61 62 3b 0a 20 20 73 53 72 63  b = pTab;.  sSrc
d430: 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  .a[0].iCursor = 
d440: 2d 31 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65  -1;.  sNC.pParse
d450: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43   = pParse;.  sNC
d460: 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72  .pSrcList = &sSr
d470: 63 3b 0a 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73  c;.  sNC.ncFlags
d480: 20 3d 20 74 79 70 65 3b 0a 20 20 69 66 28 20 73   = type;.  if( s
d490: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
d4a0: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 45 78  rNames(&sNC, pEx
d4b0: 70 72 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  pr) ) return;.  
d4c0: 69 66 28 20 70 4c 69 73 74 20 29 20 73 71 6c 69  if( pList ) sqli
d4d0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69  te3ResolveExprLi
d4e0: 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c  stNames(&sNC, pL
d4f0: 69 73 74 29 3b 0a 7d 0a                          ist);.}.