/ Hex Artifact Content
Login

Artifact fc4673cc49b116e51e7f12de074c0acf8f2388f9:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 18.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 77  tines used for w
01a0: 61 6c 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65  alking the parse
01b0: 72 20 74 72 65 65 20 61 6e 64 0a 2a 2a 20 72 65  r tree and.** re
01c0: 73 6f 6c 76 65 20 61 6c 6c 20 69 64 65 6e 74 69  solve all identi
01d0: 66 69 65 72 73 20 62 79 20 61 73 73 6f 63 69 61  fiers by associa
01e0: 74 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 61  ting them with a
01f0: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 74   particular.** t
0200: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
0210: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0220: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
0230: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0240: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0250: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  h>../*.** Walk t
0260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
0270: 65 65 20 70 45 78 70 72 20 61 6e 64 20 69 6e 63  ee pExpr and inc
0280: 72 65 61 73 65 20 74 68 65 20 61 67 67 72 65 67  rease the aggreg
0290: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
02a0: 64 65 70 74 68 20 28 74 68 65 20 45 78 70 72 2e  depth (the Expr.
02b0: 6f 70 32 20 66 69 65 6c 64 29 20 62 79 20 4e 20  op2 field) by N 
02c0: 6f 6e 20 65 76 65 72 79 20 54 4b 5f 41 47 47 5f  on every TK_AGG_
02d0: 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 2e 0a 2a  FUNCTION node..*
02e0: 2a 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  * This needs to 
02f0: 6f 63 63 75 72 20 77 68 65 6e 20 63 6f 70 79 69  occur when copyi
0300: 6e 67 20 61 20 54 4b 5f 41 47 47 5f 46 55 4e 43  ng a TK_AGG_FUNC
0310: 54 49 4f 4e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  TION node from a
0320: 6e 0a 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79  n.** outer query
0330: 20 69 6e 74 6f 20 61 6e 20 69 6e 6e 65 72 20 73   into an inner s
0340: 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 69  ubquery..**.** i
0350: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0360: 70 74 68 28 70 45 78 70 72 2c 6e 29 20 69 73 20  pth(pExpr,n) is 
0370: 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65  the main routine
0380: 2e 20 20 69 6e 63 72 41 67 67 44 65 70 74 68 28  .  incrAggDepth(
0390: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 68 65 6c 70  ..).** is a help
03a0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 2d 20 61 20  er function - a 
03b0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
03c0: 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2f   tree walker..*/
03d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
03e0: 41 67 67 44 65 70 74 68 28 57 61 6c 6b 65 72 20  AggDepth(Walker 
03f0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
0400: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
0410: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
0420: 46 55 4e 43 54 49 4f 4e 20 29 20 70 45 78 70 72  FUNCTION ) pExpr
0430: 2d 3e 6f 70 32 20 2b 3d 20 70 57 61 6c 6b 65 72  ->op2 += pWalker
0440: 2d 3e 75 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  ->u.i;.  return 
0450: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
0460: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72  static void incr
0470: 41 67 67 46 75 6e 63 74 69 6f 6e 44 65 70 74 68  AggFunctionDepth
0480: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
0490: 74 20 4e 29 7b 0a 20 20 69 66 28 20 4e 3e 30 20  t N){.  if( N>0 
04a0: 29 7b 0a 20 20 20 20 57 61 6c 6b 65 72 20 77 3b  ){.    Walker w;
04b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  .    memset(&w, 
04c0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
04d0: 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61     w.xExprCallba
04e0: 63 6b 20 3d 20 69 6e 63 72 41 67 67 44 65 70 74  ck = incrAggDept
04f0: 68 3b 0a 20 20 20 20 77 2e 75 2e 69 20 3d 20 4e  h;.    w.u.i = N
0500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
0510: 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
0520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
0530: 75 72 6e 20 74 68 65 20 70 45 78 70 72 20 65 78  urn the pExpr ex
0540: 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 6e  pression into an
0550: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 69   alias for the i
0560: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
0570: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 73   the.** result s
0580: 65 74 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2a  et in pEList..**
0590: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 73 75 6c  .** If the resul
05a0: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 20 69 73 20  t set column is 
05b0: 61 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20  a simple column 
05c0: 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65 6e 20  reference, then 
05d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
05e0: 6d 61 6b 65 73 20 61 6e 20 65 78 61 63 74 20 63  makes an exact c
05f0: 6f 70 79 2e 20 20 42 75 74 20 66 6f 72 20 61 6e  opy.  But for an
0600: 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20  y other kind of 
0610: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 69 73  expression, this
0620: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  .** routine make
0630: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72   a copy of the r
0640: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
0650: 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
0660: 20 74 6f 20 74 68 65 0a 2a 2a 20 54 4b 5f 41 53   to the.** TK_AS
0670: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
0680: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63  TK_AS operator c
0690: 61 75 73 65 73 20 74 68 65 20 65 78 70 72 65 73  auses the expres
06a0: 73 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20 65 76  sion to be.** ev
06b0: 61 6c 75 61 74 65 64 20 6a 75 73 74 20 6f 6e 63  aluated just onc
06c0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  e and then reuse
06d0: 64 20 66 6f 72 20 65 61 63 68 20 61 6c 69 61 73  d for each alias
06e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 61 73  ..**.** The reas
06f0: 6f 6e 20 66 6f 72 20 73 75 70 70 72 65 73 73 69  on for suppressi
0700: 6e 67 20 74 68 65 20 54 4b 5f 41 53 20 74 65 72  ng the TK_AS ter
0710: 6d 20 77 68 65 6e 20 74 68 65 20 65 78 70 72 65  m when the expre
0720: 73 73 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c  ssion is a simpl
0730: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65 66 65  e.** column refe
0740: 72 65 6e 63 65 20 69 73 20 73 6f 20 74 68 61 74  rence is so that
0750: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65   the column refe
0760: 72 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 72 65  rence will be re
0770: 63 6f 67 6e 69 7a 65 64 20 61 73 0a 2a 2a 20 75  cognized as.** u
0780: 73 61 62 6c 65 20 62 79 20 69 6e 64 69 63 65 73  sable by indices
0790: 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
07a0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
07b0: 69 6e 67 20 6c 6f 67 69 63 2e 20 0a 2a 2a 0a 2a  ing logic. .**.*
07c0: 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72  * The TK_AS oper
07d0: 61 74 6f 72 20 69 73 20 69 6e 68 69 62 69 74 65  ator is inhibite
07e0: 64 20 69 66 20 7a 54 79 70 65 5b 30 5d 3d 3d 27  d if zType[0]=='
07f0: 47 27 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 0a  G'.  This means.
0800: 2a 2a 20 74 68 61 74 20 69 6e 20 61 20 47 52 4f  ** that in a GRO
0810: 55 50 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  UP BY clause, th
0820: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
0830: 65 76 61 6c 75 61 74 65 64 20 74 77 69 63 65 2e  evaluated twice.
0840: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
0850: 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d     SELECT random
0860: 28 29 25 35 20 41 53 20 78 2c 20 63 6f 75 6e 74  ()%5 AS x, count
0870: 28 2a 29 20 46 52 4f 4d 20 74 61 62 20 47 52 4f  (*) FROM tab GRO
0880: 55 50 20 42 59 20 78 0a 2a 2a 0a 2a 2a 20 49 73  UP BY x.**.** Is
0890: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
08a0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
08b0: 20 72 61 6e 64 6f 6d 28 29 25 35 20 41 53 20 78   random()%5 AS x
08c0: 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
08d0: 74 61 62 20 47 52 4f 55 50 20 42 59 20 72 61 6e  tab GROUP BY ran
08e0: 64 6f 6d 28 29 25 35 0a 2a 2a 0a 2a 2a 20 54 68  dom()%5.**.** Th
08f0: 65 20 72 65 73 75 6c 74 20 6f 66 20 72 61 6e 64  e result of rand
0900: 6f 6d 28 29 25 35 20 69 6e 20 74 68 65 20 47 52  om()%5 in the GR
0910: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
0920: 20 70 72 6f 62 61 62 6c 79 20 64 69 66 66 65 72   probably differ
0930: 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ent.** from the 
0940: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 72 65  result in the re
0950: 73 75 6c 74 2d 73 65 74 2e 20 20 4f 6e 20 74 68  sult-set.  On th
0960: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 53 74 61  e other hand Sta
0970: 6e 64 61 72 64 20 53 51 4c 20 64 6f 65 73 0a 2a  ndard SQL does.*
0980: 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  * not allow the 
0990: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
09a0: 74 6f 20 63 6f 6e 74 61 69 6e 20 72 65 66 65 72  to contain refer
09b0: 65 6e 63 65 73 20 74 6f 20 72 65 73 75 6c 74 2d  ences to result-
09c0: 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20  set columns..** 
09d0: 53 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  So this should n
09e0: 65 76 65 72 20 63 6f 6d 65 20 75 70 20 69 6e 20  ever come up in 
09f0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 71 75 65 72  well-formed quer
0a00: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ies..**.** If th
0a10: 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 66  e reference is f
0a20: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 4f 4c  ollowed by a COL
0a30: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20 74  LATE operator, t
0a40: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 2a 2a  hen make sure.**
0a50: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
0a60: 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 72 76  rator is preserv
0a70: 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
0a80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
0a90: 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d  CT a+b, c+d FROM
0aa0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 43   t1 ORDER BY 1 C
0ab0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a 2a  OLLATE nocase;.*
0ac0: 2a 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20 74  *.** Should be t
0ad0: 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
0af0: 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d 20  T a+b, c+d FROM 
0b00: 74 31 20 4f 52 44 45 52 20 42 59 20 28 61 2b 62  t1 ORDER BY (a+b
0b10: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
0b20: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 53 75 62  ;.**.** The nSub
0b30: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
0b40: 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d 61  specifies how ma
0b50: 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 62  ny levels of sub
0b60: 71 75 65 72 79 20 74 68 65 0a 2a 2a 20 61 6c 69  query the.** ali
0b70: 61 73 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  as is removed fr
0b80: 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
0b90: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
0ba0: 20 75 73 75 61 6c 6c 79 20 76 61 6c 75 65 20 69   usually value i
0bb0: 73 0a 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74  s.** zero but it
0bc0: 20 6d 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69   might be more i
0bd0: 66 20 74 68 65 20 61 6c 69 61 73 20 69 73 20 63  f the alias is c
0be0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
0bf0: 61 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66  a subquery.** of
0c00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
0c10: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45  pression.  The E
0c20: 78 70 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66  xpr.op2 field of
0c30: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
0c40: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d  .** structures m
0c50: 75 73 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ust be increased
0c60: 20 62 79 20 74 68 65 20 6e 53 75 62 71 75 65 72   by the nSubquer
0c70: 79 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61  y amount..*/.sta
0c80: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
0c90: 41 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a  Alias(.  Parse *
0ca0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0cb0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0cc0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
0cd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f   *pEList,      /
0ce0: 2a 20 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a  * A result set *
0cf0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
0d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
0d10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
0d20: 73 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45  sult set.  0..pE
0d30: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f  List->nExpr-1 */
0d40: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
0d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
0d60: 6e 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f  nsform this into
0d70: 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
0d80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
0d90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
0da0: 70 65 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55  pe,     /* "GROU
0db0: 50 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72  P" or "ORDER" or
0dc0: 20 22 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75   "" */.  int nSu
0dd0: 62 71 75 65 72 79 20 20 20 20 20 20 20 20 20 20  bquery          
0de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
0df0: 71 75 65 72 69 65 73 20 74 68 61 74 20 74 68 65  queries that the
0e00: 20 6c 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67   label is moving
0e10: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
0e20: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
0e30: 2f 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63  /* The iCol-th c
0e40: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73  olumn of the res
0e50: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
0e60: 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20  r *pDup;        
0e70: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
0e80: 4f 72 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Orig */.  sqlite
0e90: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
0ea0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
0eb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
0ec0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
0ed0: 30 20 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74  0 && iCol<pEList
0ee0: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72  ->nExpr );.  pOr
0ef0: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ig = pEList->a[i
0f00: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  Col].pExpr;.  as
0f10: 73 65 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29  sert( pOrig!=0 )
0f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 69  ;.  assert( pOri
0f30: 67 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 52 65  g->flags & EP_Re
0f40: 73 6f 6c 76 65 64 20 29 3b 0a 20 20 64 62 20 3d  solved );.  db =
0f50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
0f60: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
0f70: 72 44 75 70 28 64 62 2c 20 70 4f 72 69 67 2c 20  rDup(db, pOrig, 
0f80: 30 29 3b 0a 20 20 69 66 28 20 70 44 75 70 3d 3d  0);.  if( pDup==
0f90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
0fa0: 28 20 70 4f 72 69 67 2d 3e 6f 70 21 3d 54 4b 5f  ( pOrig->op!=TK_
0fb0: 43 4f 4c 55 4d 4e 20 26 26 20 7a 54 79 70 65 5b  COLUMN && zType[
0fc0: 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 69  0]!='G' ){.    i
0fd0: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0fe0: 70 74 68 28 70 44 75 70 2c 20 6e 53 75 62 71 75  pth(pDup, nSubqu
0ff0: 65 72 79 29 3b 0a 20 20 20 20 70 44 75 70 20 3d  ery);.    pDup =
1000: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1010: 61 72 73 65 2c 20 54 4b 5f 41 53 2c 20 70 44 75  arse, TK_AS, pDu
1020: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  p, 0, 0);.    if
1030: 28 20 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75  ( pDup==0 ) retu
1040: 72 6e 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  rn;.    ExprSetP
1050: 72 6f 70 65 72 74 79 28 70 44 75 70 2c 20 45 50  roperty(pDup, EP
1060: 5f 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20  _Skip);.    if( 
1070: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
1080: 69 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  iAlias==0 ){.   
1090: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f     pEList->a[iCo
10a0: 6c 5d 2e 69 41 6c 69 61 73 20 3d 20 28 75 31 36  l].iAlias = (u16
10b0: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 41 6c 69  )(++pParse->nAli
10c0: 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  as);.    }.    p
10d0: 44 75 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Dup->iTable = pE
10e0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41  List->a[iCol].iA
10f0: 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lias;.  }.  if( 
1100: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1110: 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 70 44 75  LLATE ){.    pDu
1120: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
1130: 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
1140: 70 50 61 72 73 65 2c 20 70 44 75 70 2c 20 70 45  pParse, pDup, pE
1150: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1160: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
1170: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
1180: 45 78 70 72 44 65 6c 65 74 65 28 29 2c 20 73 65  ExprDelete(), se
1190: 74 20 74 68 65 20 45 50 5f 53 74 61 74 69 63 20  t the EP_Static 
11a0: 66 6c 61 67 2e 20 54 68 69 73 20 0a 20 20 2a 2a  flag. This .  **
11b0: 20 70 72 65 76 65 6e 74 73 20 45 78 70 72 44 65   prevents ExprDe
11c0: 6c 65 74 65 28 29 20 66 72 6f 6d 20 64 65 6c 65  lete() from dele
11d0: 74 69 6e 67 20 74 68 65 20 45 78 70 72 20 73 74  ting the Expr st
11e0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 0a  ructure itself,.
11f0: 20 20 2a 2a 20 61 6c 6c 6f 77 69 6e 67 20 69 74    ** allowing it
1200: 20 74 6f 20 62 65 20 72 65 70 6f 70 75 6c 61 74   to be repopulat
1210: 65 64 20 62 79 20 74 68 65 20 6d 65 6d 63 70 79  ed by the memcpy
1220: 28 29 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  () on the follow
1230: 69 6e 67 20 6c 69 6e 65 2e 0a 20 20 2a 2a 20 54  ing line..  ** T
1240: 68 65 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  he pExpr->u.zTok
1250: 65 6e 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 69  en might point i
1260: 6e 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  nto memory that 
1270: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
1280: 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
1290: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 75 70  3DbFree(db, pDup
12a0: 29 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 6c 69  ) on the last li
12b0: 6e 65 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b  ne of this block
12c0: 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
12d0: 20 20 2a 2a 20 6d 61 6b 65 20 61 20 63 6f 70 79    ** make a copy
12e0: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 62 65   of the token be
12f0: 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 65 20 73  fore doing the s
1300: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
1310: 20 20 2a 2f 0a 20 20 45 78 70 72 53 65 74 50 72    */.  ExprSetPr
1320: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1330: 5f 53 74 61 74 69 63 29 3b 0a 20 20 73 71 6c 69  _Static);.  sqli
1340: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1350: 2c 20 70 45 78 70 72 29 3b 0a 20 20 6d 65 6d 63  , pExpr);.  memc
1360: 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20  py(pExpr, pDup, 
1370: 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b  sizeof(*pExpr));
1380: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
1390: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
13a0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
13b0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
13c0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
13d0: 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
13e0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
13f0: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
1400: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a  ;.    pExpr->u.z
1410: 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44  Token = sqlite3D
1420: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 78 70  bStrDup(db, pExp
1430: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1440: 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c    pExpr->flags |
1450: 3d 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 3b 0a 20  = EP_MemToken;. 
1460: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
1470: 65 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 7d 0a  ee(db, pDup);.}.
1480: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1490: 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 20  RUE if the name 
14a0: 7a 43 6f 6c 20 6f 63 63 75 72 73 20 61 6e 79 77  zCol occurs anyw
14b0: 68 65 72 65 20 69 6e 20 74 68 65 20 55 53 49 4e  here in the USIN
14c0: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
14d0: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
14e0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
14f0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 69   is NULL or if i
1500: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
1510: 69 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a 73  in.** zCol..*/.s
1520: 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 49 6e  tatic int nameIn
1530: 55 73 69 6e 67 43 6c 61 75 73 65 28 49 64 4c 69  UsingClause(IdLi
1540: 73 74 20 2a 70 55 73 69 6e 67 2c 20 63 6f 6e 73  st *pUsing, cons
1550: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1560: 20 69 66 28 20 70 55 73 69 6e 67 20 29 7b 0a 20   if( pUsing ){. 
1570: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 66 6f     int k;.    fo
1580: 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d  r(k=0; k<pUsing-
1590: 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  >nId; k++){.    
15a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
15b0: 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b  ICmp(pUsing->a[k
15c0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
15d0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
15e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62   0;.}../*.** Sub
1600: 71 75 65 72 69 65 73 20 73 74 6f 72 65 73 20 74  queries stores t
1610: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1620: 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20  base, table and 
1630: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
1640: 20 74 68 65 69 72 0a 2a 2a 20 72 65 73 75 6c 74   their.** result
1650: 20 73 65 74 73 20 69 6e 20 45 78 70 72 4c 69 73   sets in ExprLis
1660: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 2c 20 69 6e 20  t.a[].zSpan, in 
1670: 74 68 65 20 66 6f 72 6d 20 22 44 41 54 41 42 41  the form "DATABA
1680: 53 45 2e 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 22  SE.TABLE.COLUMN"
1690: 2e 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  ..** Check to se
16a0: 65 20 69 66 20 74 68 65 20 7a 53 70 61 6e 20 67  e if the zSpan g
16b0: 69 76 65 6e 20 74 6f 20 74 68 69 73 20 72 6f 75  iven to this rou
16c0: 74 69 6e 65 20 6d 61 74 63 68 65 73 20 74 68 65  tine matches the
16d0: 20 7a 44 62 2c 20 7a 54 61 62 2c 0a 2a 2a 20 61   zDb, zTab,.** a
16e0: 6e 64 20 7a 43 6f 6c 2e 20 20 49 66 20 61 6e 79  nd zCol.  If any
16f0: 20 6f 66 20 7a 44 62 2c 20 7a 54 61 62 2c 20 61   of zDb, zTab, a
1700: 6e 64 20 7a 43 6f 6c 20 61 72 65 20 4e 55 4c 4c  nd zCol are NULL
1710: 20 74 68 65 6e 20 74 68 6f 73 65 20 66 69 65 6c   then those fiel
1720: 64 73 20 77 69 6c 6c 0a 2a 2a 20 6d 61 74 63 68  ds will.** match
1730: 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2f 0a 69 6e   anything..*/.in
1740: 74 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  t sqlite3MatchSp
1750: 61 6e 4e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20  anName(.  const 
1760: 63 68 61 72 20 2a 7a 53 70 61 6e 2c 0a 20 20 63  char *zSpan,.  c
1770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1780: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1790: 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tab,.  const cha
17a0: 72 20 2a 7a 44 62 0a 29 7b 0a 20 20 69 6e 74 20  r *zDb.){.  int 
17b0: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41 4c  n;.  for(n=0; AL
17c0: 57 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20 26  WAYS(zSpan[n]) &
17d0: 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b  & zSpan[n]!='.';
17e0: 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 44   n++){}.  if( zD
17f0: 62 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72  b && (sqlite3Str
1800: 4e 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 44 62  NICmp(zSpan, zDb
1810: 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 44 62 5b 6e  , n)!=0 || zDb[n
1820: 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74  ]!=0) ){.    ret
1830: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53 70  urn 0;.  }.  zSp
1840: 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 66 6f 72  an += n+1;.  for
1850: 28 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53 70  (n=0; ALWAYS(zSp
1860: 61 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e 5b  an[n]) && zSpan[
1870: 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a  n]!='.'; n++){}.
1880: 20 20 69 66 28 20 7a 54 61 62 20 26 26 20 28 73    if( zTab && (s
1890: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
18a0: 53 70 61 6e 2c 20 7a 54 61 62 2c 20 6e 29 21 3d  Span, zTab, n)!=
18b0: 30 20 7c 7c 20 7a 54 61 62 5b 6e 5d 21 3d 30 29  0 || zTab[n]!=0)
18c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
18d0: 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b 3d  ;.  }.  zSpan +=
18e0: 20 6e 2b 31 3b 0a 20 20 69 66 28 20 7a 43 6f 6c   n+1;.  if( zCol
18f0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1900: 6d 70 28 7a 53 70 61 6e 2c 20 7a 43 6f 6c 29 21  mp(zSpan, zCol)!
1910: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1920: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1930: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   1;.}../*.** Giv
1940: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
1950: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
1960: 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a  orm X.Y.Z or Y.Z
1970: 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b   or just Z, look
1980: 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65   up.** that name
1990: 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73   in the set of s
19a0: 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20  ource tables in 
19b0: 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b  pSrcList and mak
19c0: 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20  e the pExpr .** 
19d0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
19e0: 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68  refer back to th
19f0: 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e  at source column
1a00: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1a10: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1a20: 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a  made to pExpr:.*
1a30: 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  *.**    pExpr->i
1a40: 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74  Db           Set
1a50: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62   the index in db
1a60: 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64  ->aDb[] of the d
1a70: 61 74 61 62 61 73 65 20 58 0a 2a 2a 20 20 20 20  atabase X.**    
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 28 65 76 65 6e 20 69 66 20 58 20       (even if X 
1aa0: 69 73 20 69 6d 70 6c 69 65 64 29 2e 0a 2a 2a 20  is implied)..** 
1ab0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1ac0: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74          Set to t
1ad0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1ae0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f   for the table o
1af0: 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20  btained.**      
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74     from pSrcList
1b20: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  ..**    pExpr->p
1b30: 54 61 62 20 20 20 20 20 20 20 20 20 20 50 6f 69  Tab          Poi
1b40: 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c 65  nts to the Table
1b50: 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 58 2e   structure of X.
1b60: 59 20 28 65 76 65 6e 20 69 66 0a 2a 2a 20 20 20  Y (even if.**   
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 58 20 61 6e 64 2f 6f 72 20 59        X and/or Y
1b90: 20 61 72 65 20 69 6d 70 6c 69 65 64 2e 29 0a 2a   are implied.).*
1ba0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  *    pExpr->iCol
1bb0: 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f  umn       Set to
1bc0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1bd0: 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  er within the ta
1be0: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
1bf0: 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
1c00: 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  Set to TK_COLUMN
1c10: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  ..**    pExpr->p
1c20: 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79  Left         Any
1c30: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
1c40: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
1c50: 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70  leted.**    pExp
1c60: 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20  r->pRight       
1c70: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
1c80: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
1c90: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
1ca0: 20 54 68 65 20 7a 44 62 20 76 61 72 69 61 62 6c   The zDb variabl
1cb0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
1cc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
1cd0: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
1ce0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
1cf0: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
1d00: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
1d10: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
1d20: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
1d30: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
1d40: 20 75 73 65 64 2e 20 20 54 68 65 20 7a 54 61 62   used.  The zTab
1d50: 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 74  le variable is t
1d60: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1d70: 61 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20  able (the "Y"). 
1d80: 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63   This.** value c
1d90: 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 7a 44  an be NULL if zD
1da0: 62 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20  b is also NULL. 
1db0: 20 49 66 20 7a 54 61 62 6c 65 20 69 73 20 4e 55   If zTable is NU
1dc0: 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  LL it.** means t
1dd0: 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20  hat the form of 
1de0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e  the name is Z an
1df0: 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66  d that columns f
1e00: 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a  rom any table.**
1e10: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a   can be used..**
1e20: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20  .** If the name 
1e30: 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76  cannot be resolv
1e40: 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79  ed unambiguously
1e50: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
1e60: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
1e70: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
1e80: 20 57 52 43 5f 41 62 6f 72 74 2e 20 20 52 65 74   WRC_Abort.  Ret
1e90: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 20 6f 6e  urn WRC_Prune on
1ea0: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
1eb0: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
1ec0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
1ed0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
1ee0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1ef0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
1f00: 72 20 2a 7a 44 62 2c 20 20 20 20 20 2f 2a 20 4e  r *zDb,     /* N
1f10: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1f20: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
1f30: 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  able, or NULL */
1f40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f50: 54 61 62 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Tab,    /* Name 
1f60: 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  of table contain
1f70: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e  ing column, or N
1f80: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
1f90: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
1fa0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
1fb0: 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  umn. */.  NameCo
1fc0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f  ntext *pNC,    /
1fd0: 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * The name conte
1fe0: 78 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  xt used to resol
1ff0: 76 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  ve the name */. 
2000: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
2010: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68        /* Make th
2020: 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69  is EXPR node poi
2030: 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74  nt to the select
2040: 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  ed column */.){.
2050: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2080: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
2090: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20b0: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
20c0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  g column names *
20d0: 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d  /.  int cntTab =
20e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2100: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
2110: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  e names */.  int
2120: 20 6e 53 75 62 71 75 65 72 79 20 3d 20 30 3b 20   nSubquery = 0; 
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2140: 2a 20 48 6f 77 20 6d 61 6e 79 20 6c 65 76 65 6c  * How many level
2150: 73 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  s of subquery */
2160: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2170: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
2180: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2190: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
21a0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
21b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f         /* Use fo
21d0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
21e0: 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f  SrcList items */
21f0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2200: 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d  t_item *pMatch =
2210: 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63   0;  /* The matc
2220: 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74  hing pSrcList it
2230: 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  em */.  NameCont
2240: 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e  ext *pTopNC = pN
2250: 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  C;        /* Fir
2260: 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69  st namecontext i
2270: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
2280: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
2290: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22a0: 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74    /* Schema of t
22b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  he expression */
22c0: 0a 20 20 69 6e 74 20 69 73 54 72 69 67 67 65 72  .  int isTrigger
22d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22f0: 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 74 72  resolved to a tr
2300: 69 67 67 65 72 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  igger column */.
2310: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2320: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2330: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 6f 6c      /* Table hol
2340: 64 20 74 68 65 20 72 6f 77 20 2a 2f 0a 20 20 43  d the row */.  C
2350: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 20 20 20 20  olumn *pCol;    
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6f 66 20   /* A column of 
2380: 70 54 61 62 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pTab */..  asser
2390: 74 28 20 70 4e 43 20 29 3b 20 20 20 20 20 2f 2a  t( pNC );     /*
23a0: 20 74 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   the name contex
23b0: 74 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  t cannot be NULL
23c0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
23d0: 43 6f 6c 20 29 3b 20 20 20 20 2f 2a 20 54 68 65  Col );    /* The
23e0: 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e   Z in X.Y.Z cann
23f0: 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ot be NULL */.  
2400: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2410: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2420: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2430: 52 65 64 75 63 65 64 29 20 29 3b 0a 0a 20 20 2f  Reduced) );..  /
2440: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2450: 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d 6d 61 74 63   node to no-matc
2460: 68 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54  h */.  pExpr->iT
2470: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 70 45 78  able = -1;.  pEx
2480: 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  pr->pTab = 0;.  
2490: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
24a0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
24b0: 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a 20 54 72  educe);..  /* Tr
24c0: 61 6e 73 6c 61 74 65 20 74 68 65 20 73 63 68 65  anslate the sche
24d0: 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44 62 20 69  ma name in zDb i
24e0: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
24f0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2500: 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20  ng.  ** schema. 
2510: 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 70   If not found, p
2520: 53 63 68 65 6d 61 20 77 69 6c 6c 20 72 65 6d 61  Schema will rema
2530: 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e 6f 74 68  in NULL and noth
2540: 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63 68 0a 20  ing will match. 
2550: 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 69 6e   ** resulting in
2560: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
2570: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
2580: 77 61 72 64 20 74 68 65 20 65 6e 64 20 6f 66 20  ward the end of 
2590: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
25a0: 2f 0a 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20  /.  if( zDb ){. 
25b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 43     testcase( pNC
25c0: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 50  ->ncFlags & NC_P
25d0: 61 72 74 49 64 78 20 29 3b 0a 20 20 20 20 74 65  artIdx );.    te
25e0: 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63 46  stcase( pNC->ncF
25f0: 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68 65 63  lags & NC_IsChec
2600: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e  k );.    if( (pN
2610: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28 4e 43  C->ncFlags & (NC
2620: 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 73 43 68  _PartIdx|NC_IsCh
2630: 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  eck))!=0 ){.    
2640: 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 69 67    /* Silently ig
2650: 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20 71 75  nore database qu
2660: 61 6c 69 66 69 65 72 73 20 69 6e 73 69 64 65 20  alifiers inside 
2670: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
2680: 73 20 61 6e 64 20 70 61 72 74 69 61 6c 0a 20 20  s and partial.  
2690: 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20      ** indices. 
26a0: 20 44 6f 20 6e 6f 74 20 72 61 69 73 65 20 65 72   Do not raise er
26b0: 72 6f 72 73 20 62 65 63 61 75 73 65 20 74 68 61  rors because tha
26c0: 74 20 6d 69 67 68 74 20 62 72 65 61 6b 20 6c 65  t might break le
26d0: 67 61 63 79 20 61 6e 64 0a 20 20 20 20 20 20 2a  gacy and.      *
26e0: 2a 20 62 65 63 61 75 73 65 20 69 74 20 64 6f 65  * because it doe
26f0: 73 20 6e 6f 74 20 68 75 72 74 20 61 6e 79 74 68  s not hurt anyth
2700: 69 6e 67 20 74 6f 20 6a 75 73 74 20 69 67 6e 6f  ing to just igno
2710: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2720: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7a  name. */.      z
2730: 44 62 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Db = 0;.    }els
2740: 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e{.      for(i=0
2750: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2760: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2770: 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  t( db->aDb[i].zN
2780: 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ame );.        i
2790: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
27a0: 70 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  p(db->aDb[i].zNa
27b0: 6d 65 2c 7a 44 62 29 3d 3d 30 20 29 7b 0a 20 20  me,zDb)==0 ){.  
27c0: 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20          pSchema 
27d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  = db->aDb[i].pSc
27e0: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
27f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2810: 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 61   }..  /* Start a
2820: 74 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  t the inner-most
2830: 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 6d 6f 76   context and mov
2840: 65 20 6f 75 74 77 61 72 64 20 75 6e 74 69 6c 20  e outward until 
2850: 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
2860: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 4e 43   */.  while( pNC
2870: 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   && cnt==0 ){.  
2880: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2890: 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  st;.    SrcList 
28a0: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
28b0: 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20  >pSrcList;..    
28c0: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
28d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
28e0: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
28f0: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
2900: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
2910: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  ){.        pTab 
2920: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
2930: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2940: 54 61 62 21 3d 30 20 26 26 20 70 54 61 62 2d 3e  Tab!=0 && pTab->
2950: 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  zName!=0 );.    
2960: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2970: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
2980: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
2990: 53 65 6c 65 63 74 20 26 26 20 28 70 49 74 65 6d  Select && (pItem
29a0: 2d 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ->pSelect->selFl
29b0: 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
29c0: 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
29d0: 20 20 20 20 20 69 6e 74 20 68 69 74 20 3d 20 30       int hit = 0
29e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 4c 69  ;.          pELi
29f0: 73 74 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  st = pItem->pSel
2a00: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
2a10: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2a20: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
2a30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2a40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61     if( sqlite3Ma
2a50: 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 45 4c 69  tchSpanName(pELi
2a60: 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
2a70: 7a 43 6f 6c 2c 20 7a 54 61 62 2c 20 7a 44 62 29  zCol, zTab, zDb)
2a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a90: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
2aa0: 20 20 20 20 20 20 20 63 6e 74 54 61 62 20 3d 20         cntTab = 
2ab0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
2ac0: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
2ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2ae0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
2af0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
2b00: 20 68 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   hit = 1;.      
2b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2b30: 28 20 68 69 74 20 7c 7c 20 7a 54 61 62 3d 3d 30  ( hit || zTab==0
2b40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b60: 66 28 20 7a 44 62 20 26 26 20 70 54 61 62 2d 3e  f( zDb && pTab->
2b70: 70 53 63 68 65 6d 61 21 3d 70 53 63 68 65 6d 61  pSchema!=pSchema
2b80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
2b90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ba0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54  }.        if( zT
2bb0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
2bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2bd0: 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41  Name = pItem->zA
2be0: 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
2bf0: 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
2c00: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  me;.          as
2c10: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 21 3d  sert( zTabName!=
2c20: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
2c30: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2c40: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
2c50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2c60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c80: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2c90: 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b  0==(cntTab++) ){
2ca0: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
2cb0: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
2cc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
2cd0: 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (j=0, pCol=pTab-
2ce0: 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
2cf0: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
2d00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2d20: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
2d30: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
2d40: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
2d50: 20 68 61 73 20 62 65 65 6e 20 65 78 61 63 74 6c   has been exactl
2d60: 79 20 6f 6e 65 20 70 72 69 6f 72 20 6d 61 74 63  y one prior matc
2d70: 68 20 61 6e 64 20 74 68 69 73 20 6d 61 74 63 68  h and this match
2d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2d90: 69 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  is for the right
2da0: 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 61  -hand table of a
2db0: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 6f 72   NATURAL JOIN or
2dc0: 20 69 73 20 69 6e 20 61 20 0a 20 20 20 20 20 20   is in a .      
2dd0: 20 20 20 20 20 20 2a 2a 20 55 53 49 4e 47 20 63        ** USING c
2de0: 6c 61 75 73 65 2c 20 74 68 65 6e 20 73 6b 69 70  lause, then skip
2df0: 20 74 68 69 73 20 6d 61 74 63 68 2e 0a 20 20 20   this match..   
2e00: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2e10: 20 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d          if( cnt=
2e20: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
2e30: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a      if( pItem->j
2e40: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2e50: 55 52 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  URAL ) continue;
2e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2e70: 66 28 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c  f( nameInUsingCl
2e80: 61 75 73 65 28 70 49 74 65 6d 2d 3e 70 55 73 69  ause(pItem->pUsi
2e90: 6e 67 2c 20 7a 43 6f 6c 29 20 29 20 63 6f 6e 74  ng, zCol) ) cont
2ea0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2eb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ec0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
2ed0: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
2ee0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;.            /
2ef0: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
2f00: 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d   rowid (column -
2f10: 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  1) for the INTEG
2f20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
2f30: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
2f40: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
2f50: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
2f60: 2d 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20 20 20  -1 : (i16)j;.   
2f70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2f80: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2fa0: 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 29      if( pMatch )
2fb0: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
2fc0: 3e 69 54 61 62 6c 65 20 3d 20 70 4d 61 74 63 68  >iTable = pMatch
2fd0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2fe0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
2ff0: 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20   pMatch->pTab;. 
3000: 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d         pSchema =
3010: 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 70 53   pExpr->pTab->pS
3020: 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 7d 0a 20  chema;.      }. 
3030: 20 20 20 7d 20 2f 2a 20 69 66 28 20 70 53 72 63     } /* if( pSrc
3040: 4c 69 73 74 20 29 20 2a 2f 0a 0a 23 69 66 6e 64  List ) */..#ifnd
3050: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
3060: 52 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66  RIGGER.    /* If
3070: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72   we have not alr
3080: 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68  eady resolved th
3090: 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79  e name, then may
30a0: 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  be .    ** it is
30b0: 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e   a new.* or old.
30c0: 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65  * trigger argume
30d0: 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20  nt reference.   
30e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d   */.    if( zDb=
30f0: 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26  =0 && zTab!=0 &&
3100: 20 63 6e 74 54 61 62 3d 3d 30 20 26 26 20 70 50   cntTab==0 && pP
3110: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
3120: 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  b!=0 ){.      in
3130: 74 20 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 65  t op = pParse->e
3140: 54 72 69 67 67 65 72 4f 70 3b 0a 20 20 20 20 20  TriggerOp;.     
3150: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
3160: 44 45 4c 45 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b  DELETE || op==TK
3170: 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54  _UPDATE || op==T
3180: 4b 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20 20 20  K_INSERT );.    
3190: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 44 45 4c    if( op!=TK_DEL
31a0: 45 54 45 20 26 26 20 73 71 6c 69 74 65 33 53 74  ETE && sqlite3St
31b0: 72 49 43 6d 70 28 22 6e 65 77 22 2c 7a 54 61 62  rICmp("new",zTab
31c0: 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  ) == 0 ){.      
31d0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
31e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 61  = 1;.        pTa
31f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69  b = pParse->pTri
3200: 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d  ggerTab;.      }
3210: 65 6c 73 65 20 69 66 28 20 6f 70 21 3d 54 4b 5f  else if( op!=TK_
3220: 49 4e 53 45 52 54 20 26 26 20 73 71 6c 69 74 65  INSERT && sqlite
3230: 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 7a  3StrICmp("old",z
3240: 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)==0 ){.     
3250: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
3260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
3270: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72  ab = pParse->pTr
3280: 69 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20  iggerTab;.      
3290: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
32a0: 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e  b ){ .        in
32b0: 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t iCol;.        
32c0: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
32d0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
32e0: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
32f0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 2c 20 70     for(iCol=0, p
3300: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
3310: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
3320: 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29   iCol++, pCol++)
3330: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3340: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
3350: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
3360: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
3370: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
3380: 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20  ab->iPKey ){.   
3390: 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20             iCol 
33a0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
33b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
33c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
33d0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
33e0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 70       if( iCol>=p
33f0: 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 73 71 6c  Tab->nCol && sql
3400: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
3410: 29 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54  ) && HasRowid(pT
3420: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ab) ){.         
3430: 20 69 43 6f 6c 20 3d 20 2d 31 3b 20 20 20 20 20   iCol = -1;     
3440: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 34 39     /* IMP: R-449
3450: 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20 20 20  11-55124 */.    
3460: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
3470: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
3480: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  l ){.          c
3490: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
34a0: 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20  if( iCol<0 ){.  
34b0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
34c0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
34d0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
34e0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
34f0: 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
3500: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
3510: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
3520: 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  ol==31 );.      
3530: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
3540: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
3550: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3560: 6f 6c 64 6d 61 73 6b 20 7c 3d 20 28 69 43 6f 6c  oldmask |= (iCol
3570: 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66 66  >=32 ? 0xfffffff
3580: 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c 69  f : (((u32)1)<<i
3590: 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Col));.         
35a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
35b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
35c0: 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  ol==31 );.      
35d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
35e0: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
35f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3600: 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69 43 6f 6c  newmask |= (iCol
3610: 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66 66  >=32 ? 0xfffffff
3620: 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c 69  f : (((u32)1)<<i
3630: 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Col));.         
3640: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 45 78   }.          pEx
3650: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  pr->iColumn = (i
3660: 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16)iCol;.       
3670: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
3680: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
3690: 20 69 73 54 72 69 67 67 65 72 20 3d 20 31 3b 0a   isTrigger = 1;.
36a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36b0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  }.    }.#endif /
36c0: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
36d0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20  E_OMIT_TRIGGER) 
36e0: 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  */..    /*.    *
36f0: 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61  * Perhaps the na
3700: 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  me is a referenc
3710: 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20  e to the ROWID. 
3720: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
3730: 28 20 70 54 61 62 21 3d 30 20 7c 7c 20 63 6e 74  ( pTab!=0 || cnt
3740: 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab==0 );.    if
3750: 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54  ( cnt==0 && cntT
3760: 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33  ab==1 && sqlite3
3770: 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 26 26  IsRowid(zCol) &&
3780: 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29 20   HasRowid(pTab) 
3790: 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31  ){.      cnt = 1
37a0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
37b0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20  Column = -1;    
37c0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 34 39 31 31   /* IMP: R-44911
37d0: 2d 35 35 31 32 34 20 2a 2f 0a 20 20 20 20 20 20  -55124 */.      
37e0: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
37f0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
3800: 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  EGER;.    }..   
3810: 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   /*.    ** If th
3820: 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68  e input is of th
3830: 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e  e form Z (not Y.
3840: 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e  Z or X.Y.Z) then
3850: 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20   the name Z.    
3860: 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20 74  ** might refer t
3870: 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20  o an result-set 
3880: 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61 70  alias.  This hap
3890: 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c  pens, for exampl
38a0: 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77  e, when.    ** w
38b0: 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20  e are resolving 
38c0: 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45  names in the WHE
38d0: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
38e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61   following comma
38f0: 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  nd:.    **.    *
3900: 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62  *     SELECT a+b
3910: 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65   AS x FROM table
3920: 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20   WHERE x<10;.   
3930: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61   **.    ** In ca
3940: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72  ses like this, r
3950: 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74  eplace pExpr wit
3960: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
3970: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a  expression that.
3980: 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65      ** forms the
3990: 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72   result set entr
39a0: 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20  y ("a+b" in the 
39b0: 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74  example) and ret
39c0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  urn immediately.
39d0: 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  .    ** Note tha
39e0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
39f0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
3a00: 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61  et should have a
3a10: 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20  lready been.    
3a20: 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74  ** resolved by t
3a30: 68 65 20 74 69 6d 65 20 74 68 65 20 57 48 45 52  he time the WHER
3a40: 45 20 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f  E clause is reso
3a50: 6c 76 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  lved..    **.   
3a60: 20 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20   ** The ability 
3a70: 74 6f 20 75 73 65 20 61 6e 20 6f 75 74 70 75 74  to use an output
3a80: 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75   result-set colu
3a90: 6d 6e 20 69 6e 20 74 68 65 20 57 48 45 52 45 2c  mn in the WHERE,
3aa0: 20 47 52 4f 55 50 20 42 59 2c 0a 20 20 20 20 2a   GROUP BY,.    *
3ab0: 2a 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75  * or HAVING clau
3ac0: 73 65 73 2c 20 6f 72 20 61 73 20 70 61 72 74 20  ses, or as part 
3ad0: 6f 66 20 61 20 6c 61 72 67 65 72 20 65 78 70 72  of a larger expr
3ae0: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 4f 52  ession in the OR
3af0: 44 52 45 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c  DRE BY.    ** cl
3b00: 61 75 73 65 20 69 73 20 6e 6f 74 20 73 74 61 6e  ause is not stan
3b10: 64 61 72 64 20 53 51 4c 2e 20 20 54 68 69 73 20  dard SQL.  This 
3b20: 69 73 20 61 20 28 67 6f 6f 66 79 29 20 53 51 4c  is a (goofy) SQL
3b30: 69 74 65 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74  ite extension, t
3b40: 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 73 75  hat.    ** is su
3b50: 70 70 6f 72 74 65 64 20 66 6f 72 20 62 61 63 6b  pported for back
3b60: 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c  wards compatibil
3b70: 69 74 79 20 6f 6e 6c 79 2e 20 20 54 4f 20 44 4f  ity only.  TO DO
3b80: 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e  : Issue a warnin
3b90: 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 73 71 6c 69  g.    ** on sqli
3ba0: 74 65 33 5f 6c 6f 67 28 29 20 77 68 65 6e 65 76  te3_log() whenev
3bb0: 65 72 20 74 68 65 20 63 61 70 61 62 69 6c 69 74  er the capabilit
3bc0: 79 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 2a  y is used..    *
3bd0: 2f 0a 20 20 20 20 69 66 28 20 28 70 45 4c 69 73  /.    if( (pELis
3be0: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29  t = pNC->pEList)
3bf0: 21 3d 30 0a 20 20 20 20 20 26 26 20 7a 54 61 62  !=0.     && zTab
3c00: 3d 3d 30 0a 20 20 20 20 20 26 26 20 63 6e 74 3d  ==0.     && cnt=
3c10: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
3c20: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
3c30: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
3c40: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41          char *zA
3c50: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  s = pEList->a[j]
3c60: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3c70: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
3c80: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
3c90: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
3ca0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f          Expr *pO
3cb0: 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rig;.          a
3cc0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
3cd0: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
3ce0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
3cf0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3d00: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d  pExpr->x.pList==
3d10: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
3d20: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
3d30: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
3d40: 20 20 20 20 20 20 20 20 70 4f 72 69 67 20 3d 20          pOrig = 
3d50: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
3d60: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
3d70: 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 26  ( (pNC->ncFlags&
3d80: 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20  NC_AllowAgg)==0 
3d90: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
3da0: 74 79 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67  ty(pOrig, EP_Agg
3db0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
3dc0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3dd0: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
3de0: 20 6f 66 20 61 6c 69 61 73 65 64 20 61 67 67 72   of aliased aggr
3df0: 65 67 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b  egate %s", zAs);
3e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
3e10: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
3e20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3e30: 20 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69 61       resolveAlia
3e40: 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  s(pParse, pEList
3e50: 2c 20 6a 2c 20 70 45 78 70 72 2c 20 22 22 2c 20  , j, pExpr, "", 
3e60: 6e 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  nSubquery);.    
3e70: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
3e80: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
3e90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
3ea0: 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26  ssert( zTab==0 &
3eb0: 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  & zDb==0 );.    
3ec0: 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75        goto looku
3ed0: 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 20 20 20  pname_end;.     
3ee0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20     }.      } .  
3ef0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61    }..    /* Adva
3f00: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
3f10: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54  name context.  T
3f20: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69  he loop will exi
3f30: 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20  t when either.  
3f40: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d    ** we have a m
3f50: 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20  atch (cnt>0) or 
3f60: 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20  when we run out 
3f70: 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  of name contexts
3f80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3f90: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   cnt==0 ){.     
3fa0: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
3fb0: 74 3b 0a 20 20 20 20 20 20 6e 53 75 62 71 75 65  t;.      nSubque
3fc0: 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ry++;.    }.  }.
3fd0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20  .  /*.  ** If X 
3fe0: 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28  and Y are NULL (
3ff0: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  in other words i
4000: 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  f only the colum
4010: 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a  n name Z is.  **
4020: 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74   supplied) and t
4030: 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73  he value of Z is
4040: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75   enclosed in dou
4050: 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e  ble-quotes, then
4060: 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72  .  ** Z is a str
4070: 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69  ing literal if i
4080: 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  t doesn't match 
4090: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  any column names
40a0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
40b0: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
40c0: 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
40d0: 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20  ay and not make 
40e0: 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20  any changes to. 
40f0: 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a   ** pExpr..  **.
4100: 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20    ** Because no 
4110: 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61  reference was ma
4120: 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74  de to outer cont
4130: 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e  exts, the pNC->n
4140: 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20  Ref.  ** fields 
4150: 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20  are not changed 
4160: 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a  in any context..
4170: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
4180: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20  0 && zTab==0 && 
4190: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
41a0: 70 45 78 70 72 2c 45 50 5f 44 62 6c 51 75 6f 74  pExpr,EP_DblQuot
41b0: 65 64 29 20 29 7b 0a 20 20 20 20 70 45 78 70 72  ed) ){.    pExpr
41c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52 49 4e 47  ->op = TK_STRING
41d0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61  ;.    pExpr->pTa
41e0: 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  b = 0;.    retur
41f0: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
4200: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d  ..  /*.  ** cnt=
4210: 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77  =0 means there w
4220: 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63  as not match.  c
4230: 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72 65  nt>1 means there
4240: 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a   were two or.  *
4250: 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e 20  * more matches. 
4260: 20 45 69 74 68 65 72 20 77 61 79 2c 20 77 65 20   Either way, we 
4270: 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20  have an error.. 
4280: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d 31   */.  if( cnt!=1
4290: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
42a0: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45  ar *zErr;.    zE
42b0: 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e  rr = cnt==0 ? "n
42c0: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 22 20 3a  o such column" :
42d0: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
42e0: 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20 20 69 66  mn name";.    if
42f0: 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73  ( zDb ){.      s
4300: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4310: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
4320: 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 44 62  s.%s", zErr, zDb
4330: 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20  , zTab, zCol);. 
4340: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61     }else if( zTa
4350: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
4360: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4370: 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20  e, "%s: %s.%s", 
4380: 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c  zErr, zTab, zCol
4390: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
43a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
43b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
43c0: 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a 43 6f 6c   %s", zErr, zCol
43d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
43e0: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
43f0: 20 3d 20 31 3b 0a 20 20 20 20 70 54 6f 70 4e 43   = 1;.    pTopNC
4400: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nErr++;.  }.. 
4410: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
4420: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20  from a table in 
4430: 70 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65  pSrcList is refe
4440: 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63  renced, then rec
4450: 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ord.  ** this fa
4460: 63 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69  ct in the pSrcLi
4470: 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62  st.a[].colUsed b
4480: 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20  itmask.  Column 
4490: 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69  0 causes.  ** bi
44a0: 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20  t 0 to be set.  
44b0: 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69  Column 1 sets bi
44c0: 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  t 1.  And so for
44d0: 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  th.  If the.  **
44e0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
44f0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
4500: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
4510: 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  s in the bitmask
4520: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74  .  ** then set t
4530: 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  he high-order bi
4540: 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  t of the bitmask
4550: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
4560: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
4570: 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20  & pMatch!=0 ){. 
4580: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
4590: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 74  ->iColumn;.    t
45a0: 65 73 74 63 61 73 65 28 20 6e 3d 3d 42 4d 53 2d  estcase( n==BMS-
45b0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  1 );.    if( n>=
45c0: 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  BMS ){.      n =
45d0: 20 42 4d 53 2d 31 3b 0a 20 20 20 20 7d 0a 20 20   BMS-1;.    }.  
45e0: 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63 68    assert( pMatch
45f0: 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72  ->iCursor==pExpr
4600: 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
4610: 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20  pMatch->colUsed 
4620: 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  |= ((Bitmask)1)<
4630: 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c  <n;.  }..  /* Cl
4640: 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
4650: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
4660: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4670: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4680: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  pExpr->pLeft = 0
4690: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
46a0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d  elete(db, pExpr-
46b0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70  >pRight);.  pExp
46c0: 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  r->pRight = 0;. 
46d0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 69 73   pExpr->op = (is
46e0: 54 72 69 67 67 65 72 20 3f 20 54 4b 5f 54 52 49  Trigger ? TK_TRI
46f0: 47 47 45 52 20 3a 20 54 4b 5f 43 4f 4c 55 4d 4e  GGER : TK_COLUMN
4700: 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  );.lookupname_en
4710: 64 3a 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  d:.  if( cnt==1 
4720: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4730: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  NC!=0 );.    if(
4740: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
4750: 53 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S ){.      sqlit
4760: 65 33 41 75 74 68 52 65 61 64 28 70 50 61 72 73  e3AuthRead(pPars
4770: 65 2c 20 70 45 78 70 72 2c 20 70 53 63 68 65 6d  e, pExpr, pSchem
4780: 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  a, pNC->pSrcList
4790: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
47a0: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52  Increment the nR
47b0: 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20  ef value on all 
47c0: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72  name contexts fr
47d0: 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20  om TopNC up to. 
47e0: 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20     ** the point 
47f0: 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d  where the name m
4800: 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66  atched. */.    f
4810: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73  or(;;){.      as
4820: 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20  sert( pTopNC!=0 
4830: 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d  );.      pTopNC-
4840: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  >nRef++;.      i
4850: 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29  f( pTopNC==pNC )
4860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
4870: 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70  opNC = pTopNC->p
4880: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
4890: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
48a0: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
48b0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
48c0: 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
48d0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
48e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
48f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
4900: 6f 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  o load the colum
4910: 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72 6f 6d 20 64  n iCol.** from d
4920: 61 74 61 73 6f 75 72 63 65 20 69 53 72 63 20 69  atasource iSrc i
4930: 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63 2e 0a  n SrcList pSrc..
4940: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
4950: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
4960: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
4970: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 69 6e 74  cList *pSrc, int
4980: 20 69 53 72 63 2c 20 69 6e 74 20 69 43 6f 6c 29   iSrc, int iCol)
4990: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
49a0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
49b0: 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c  b, TK_COLUMN, 0,
49c0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
49d0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
49e0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
49f0: 20 26 70 53 72 63 2d 3e 61 5b 69 53 72 63 5d 3b   &pSrc->a[iSrc];
4a00: 0a 20 20 20 20 70 2d 3e 70 54 61 62 20 3d 20 70  .    p->pTab = p
4a10: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
4a20: 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  p->iTable = pIte
4a30: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
4a40: 69 66 28 20 70 2d 3e 70 54 61 62 2d 3e 69 50 4b  if( p->pTab->iPK
4a50: 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20  ey==iCol ){.    
4a60: 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d    p->iColumn = -
4a70: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
4a80: 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
4a90: 20 28 79 6e 56 61 72 29 69 43 6f 6c 3b 0a 20 20   (ynVar)iCol;.  
4aa0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
4ab0: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
4ac0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
4ad0: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
4ae0: 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 7c  pItem->colUsed |
4af0: 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  = ((Bitmask)1)<<
4b00: 28 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 42 4d 53  (iCol>=BMS ? BMS
4b10: 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a 20 20 20 20  -1 : iCol);.    
4b20: 7d 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  }.    ExprSetPro
4b30: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 73 6f  perty(p, EP_Reso
4b40: 6c 76 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lved);.  }.  ret
4b50: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
4b60: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
4b70: 74 68 61 74 20 61 6e 20 65 78 70 72 65 73 73 69  that an expressi
4b80: 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 20  on is not valid 
4b90: 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20 69 6e  for a partial in
4ba0: 64 65 78 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61  dex WHERE.** cla
4bb0: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
4bc0: 6f 69 64 20 6e 6f 74 56 61 6c 69 64 50 61 72 74  oid notValidPart
4bd0: 49 64 78 57 68 65 72 65 28 0a 20 20 50 61 72 73  IdxWhere(.  Pars
4be0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4bf0: 20 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f 72 20   /* Leave error 
4c00: 6d 65 73 73 61 67 65 20 68 65 72 65 20 2a 2f 0a  message here */.
4c10: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
4c20: 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61  NC,    /* The na
4c30: 6d 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  me context */.  
4c40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67  const char *zMsg
4c50: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
4c60: 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  error */.){.  if
4c70: 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
4c80: 26 20 4e 43 5f 50 61 72 74 49 64 78 29 21 3d 30  & NC_PartIdx)!=0
4c90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4ca0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4cb0: 22 25 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  "%s prohibited i
4cc0: 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  n partial index 
4cd0: 57 48 45 52 45 20 63 6c 61 75 73 65 73 22 2c 0a  WHERE clauses",.
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 20 7a 4d 73 67 29 3b 0a 20 20 7d 0a 7d      zMsg);.  }.}
4d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4d10: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  _OMIT_CHECK./*.*
4d20: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
4d30: 72 20 74 68 61 74 20 61 6e 20 65 78 70 72 65 73  r that an expres
4d40: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69  sion is not vali
4d50: 64 20 66 6f 72 20 61 20 43 48 45 43 4b 20 63 6f  d for a CHECK co
4d60: 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61  nstraint..*/.sta
4d70: 74 69 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69  tic void notVali
4d80: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
4d90: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4da0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76  e,       /* Leav
4db0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
4dc0: 68 65 72 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  here */.  NameCo
4dd0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f  ntext *pNC,    /
4de0: 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * The name conte
4df0: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
4e00: 61 72 20 2a 7a 4d 73 67 20 20 20 20 20 2f 2a 20  ar *zMsg     /* 
4e10: 54 79 70 65 20 6f 66 20 65 72 72 6f 72 20 2a 2f  Type of error */
4e20: 0a 29 7b 0a 20 20 69 66 28 20 28 70 4e 43 2d 3e  .){.  if( (pNC->
4e30: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43  ncFlags & NC_IsC
4e40: 68 65 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  heck)!=0 ){.    
4e50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4e60: 70 50 61 72 73 65 2c 22 25 73 20 70 72 6f 68 69  pParse,"%s prohi
4e70: 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63  bited in CHECK c
4e80: 6f 6e 73 74 72 61 69 6e 74 73 22 2c 20 7a 4d 73  onstraints", zMs
4e90: 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  g);.  }.}.#else.
4ea0: 23 20 64 65 66 69 6e 65 20 6e 6f 74 56 61 6c 69  # define notVali
4eb0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
4ec0: 28 50 2c 4e 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a  (P,N,M).#endif..
4ed0: 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e  /*.** Expression
4ee0: 20 70 20 73 68 6f 75 6c 64 20 65 6e 63 6f 64 65   p should encode
4ef0: 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e   a floating poin
4f00: 74 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  t value between 
4f10: 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2a 20  1.0 and 0.0..** 
4f20: 52 65 74 75 72 6e 20 31 30 32 34 20 74 69 6d 65  Return 1024 time
4f30: 73 20 74 68 69 73 20 76 61 6c 75 65 2e 20 20 4f  s this value.  O
4f40: 72 20 72 65 74 75 72 6e 20 2d 31 20 69 66 20 70  r return -1 if p
4f50: 20 69 73 20 6e 6f 74 20 61 20 66 6c 6f 61 74 69   is not a floati
4f60: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
4f70: 65 20 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e  e between 1.0 an
4f80: 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  d 0.0..*/.static
4f90: 20 69 6e 74 20 65 78 70 72 50 72 6f 62 61 62 69   int exprProbabi
4fa0: 6c 69 74 79 28 45 78 70 72 20 2a 70 29 7b 0a 20  lity(Expr *p){. 
4fb0: 20 64 6f 75 62 6c 65 20 72 20 3d 20 2d 31 2e 30   double r = -1.0
4fc0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54  ;.  if( p->op!=T
4fd0: 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74 75 72 6e  K_FLOAT ) return
4fe0: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 41 74   -1;.  sqlite3At
4ff0: 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  oF(p->u.zToken, 
5000: 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  &r, sqlite3Strle
5010: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
5020: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
5030: 20 20 61 73 73 65 72 74 28 20 72 3e 3d 30 2e 30    assert( r>=0.0
5040: 20 29 3b 0a 20 20 69 66 28 20 72 3e 31 2e 30 20   );.  if( r>1.0 
5050: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 72  ) return -1;.  r
5060: 65 74 75 72 6e 20 28 69 6e 74 29 28 72 2a 31 30  eturn (int)(r*10
5070: 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  00.0);.}../*.** 
5080: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
5090: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c  callback for sql
50a0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 2e 0a  ite3WalkExpr()..
50b0: 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79  **.** Resolve sy
50c0: 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74  mbolic names int
50d0: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72  o TK_COLUMN oper
50e0: 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75  ators for the cu
50f0: 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e  rrent.** node in
5100: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
5110: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20  tree.  Return 0 
5120: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20  to continue the 
5130: 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74  search down.** t
5140: 68 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20  he tree or 2 to 
5150: 61 62 6f 72 74 20 74 68 65 20 74 72 65 65 20 77  abort the tree w
5160: 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  alk..**.** This 
5170: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65  routine also doe
5180: 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  s error checking
5190: 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75   and name resolu
51a0: 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63  tion for.** func
51b0: 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65  tion names.  The
51c0: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67   operator for ag
51d0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
51e0: 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20  s is changed.** 
51f0: 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  to TK_AGG_FUNCTI
5200: 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ON..*/.static in
5210: 74 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65  t resolveExprSte
5220: 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  p(Walker *pWalke
5230: 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  r, Expr *pExpr){
5240: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
5250: 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pNC;.  Parse *pP
5260: 61 72 73 65 3b 0a 0a 20 20 70 4e 43 20 3d 20 70  arse;..  pNC = p
5270: 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20  Walker->u.pNC;. 
5280: 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20   assert( pNC!=0 
5290: 29 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e  );.  pParse = pN
52a0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 61 73 73  C->pParse;.  ass
52b0: 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 57 61  ert( pParse==pWa
52c0: 6c 6b 65 72 2d 3e 70 50 61 72 73 65 20 29 3b 0a  lker->pParse );.
52d0: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
52e0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
52f0: 5f 52 65 73 6f 6c 76 65 64 29 20 29 20 72 65 74  _Resolved) ) ret
5300: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
5310: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
5320: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
5330: 76 65 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44  ved);.#ifndef ND
5340: 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e  EBUG.  if( pNC->
5350: 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d  pSrcList && pNC-
5360: 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >pSrcList->nAllo
5370: 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69  c>0 ){.    SrcLi
5380: 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70  st *pSrcList = p
5390: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20  NC->pSrcList;.  
53a0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
53b0: 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72  (i=0; i<pNC->pSr
53c0: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
53d0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
53e0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
53f0: 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53  iCursor>=0 && pS
5400: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
5410: 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61  rsor<pParse->nTa
5420: 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  b);.    }.  }.#e
5430: 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70  ndif.  switch( p
5440: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 23 69 66  Expr->op ){..#if
5450: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5460: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
5470: 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26 20 21  LETE_LIMIT) && !
5480: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5490: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20  MIT_SUBQUERY).  
54a0: 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 61 6c    /* The special
54b0: 20 6f 70 65 72 61 74 6f 72 20 54 4b 5f 52 4f 57   operator TK_ROW
54c0: 20 6d 65 61 6e 73 20 75 73 65 20 74 68 65 20 72   means use the r
54d0: 6f 77 69 64 20 66 6f 72 20 74 68 65 20 66 69 72  owid for the fir
54e0: 73 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  st.    ** column
54f0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
5500: 75 73 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  use.  This is us
5510: 65 64 20 62 79 20 74 68 65 20 4c 49 4d 49 54 20  ed by the LIMIT 
5520: 61 6e 64 20 4f 52 44 45 52 20 42 59 0a 20 20 20  and ORDER BY.   
5530: 20 2a 2a 20 63 6c 61 75 73 65 20 70 72 6f 63 65   ** clause proce
5540: 73 73 69 6e 67 20 6f 6e 20 55 50 44 41 54 45 20  ssing on UPDATE 
5550: 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61 74 65  and DELETE state
5560: 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
5570: 20 20 63 61 73 65 20 54 4b 5f 52 4f 57 3a 20 7b    case TK_ROW: {
5580: 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a  .      SrcList *
5590: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
55a0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20  pSrcList;.      
55b0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
55c0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
55d0: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69    assert( pSrcLi
55e0: 73 74 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e  st && pSrcList->
55f0: 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 20  nSrc==1 );.     
5600: 20 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73   pItem = pSrcLis
5610: 74 2d 3e 61 3b 20 0a 20 20 20 20 20 20 70 45 78  t->a; .      pEx
5620: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
5630: 4d 4e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  MN;.      pExpr-
5640: 3e 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  >pTab = pItem->p
5650: 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72  Tab;.      pExpr
5660: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d  ->iTable = pItem
5670: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
5680: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
5690: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70  = -1;.      pExp
56a0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  r->affinity = SQ
56b0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
56c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
56d0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64     }.#endif /* d
56e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
56f0: 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45  ABLE_UPDATE_DELE
5700: 54 45 5f 4c 49 4d 49 54 29 20 26 26 20 21 64 65  TE_LIMIT) && !de
5710: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5720: 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a  T_SUBQUERY) */..
5730: 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64      /* A lone id
5740: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
5750: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
5760: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5770: 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20  e TK_ID: {.     
5780: 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70 4e 61   return lookupNa
5790: 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  me(pParse, 0, 0,
57a0: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
57b0: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
57c0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
57d0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
57e0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
57f0: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
5800: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
5810: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
5820: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
5830: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
5840: 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
5850: 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20  har *zColumn;.  
5860: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5870: 7a 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 63 6f  zTable;.      co
5880: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
5890: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
58a0: 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28  t;..      /* if(
58b0: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62   pSrcList==0 ) b
58c0: 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70  reak; */.      p
58d0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
58e0: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
58f0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
5900: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  ID ){.        zD
5910: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  b = 0;.        z
5920: 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 70  Table = pExpr->p
5930: 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
5940: 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20          zColumn 
5950: 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  = pRight->u.zTok
5960: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
5970: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5980: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
5990: 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  DOT );.        z
59a0: 44 62 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  Db = pExpr->pLef
59b0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
59c0: 20 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 70 52       zTable = pR
59d0: 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a  ight->pLeft->u.z
59e0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a  Token;.        z
59f0: 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d  Column = pRight-
5a00: 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65  >pRight->u.zToke
5a10: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
5a20: 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70 4e 61   return lookupNa
5a30: 6d 65 28 70 50 61 72 73 65 2c 20 7a 44 62 2c 20  me(pParse, zDb, 
5a40: 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c  zTable, zColumn,
5a50: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
5a60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
5a70: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
5a80: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
5a90: 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43  se TK_CONST_FUNC
5aa0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
5ab0: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
5ac0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
5ad0: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
5ae0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75  ;    /* The argu
5af0: 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20  ment list */.   
5b00: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74     int n = pList
5b10: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
5b20: 3a 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65  : 0;    /* Numbe
5b30: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
5b40: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73  /.      int no_s
5b50: 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20  uch_func = 0;   
5b60: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
5b70: 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20  o such function 
5b80: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20  exists */.      
5b90: 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  int wrong_num_ar
5ba0: 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  gs = 0;     /* T
5bb0: 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d  rue if wrong num
5bc0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
5bd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73   */.      int is
5be0: 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20  _agg = 0;       
5bf0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5c00: 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
5c10: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
5c20: 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20 20     int auth;    
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5c40: 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  * Authorization 
5c50: 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63 74  to use the funct
5c60: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
5c70: 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20   nId;           
5c80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5c90: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
5ca0: 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d   in function nam
5cb0: 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
5cc0: 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
5cd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
5ce0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a  nction name. */.
5cf0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
5d00: 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Def;            
5d10: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
5d20: 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74   about the funct
5d30: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ion */.      u8 
5d40: 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65  enc = ENC(pParse
5d50: 2d 3e 64 62 29 3b 20 20 20 2f 2a 20 54 68 65 20  ->db);   /* The 
5d60: 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e  database encodin
5d70: 67 20 2a 2f 0a 0a 20 20 20 20 20 20 74 65 73 74  g */..      test
5d80: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
5d90: 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 20 29  =TK_CONST_FUNC )
5da0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5db0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
5dc0: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
5dd0: 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e  lect) );.      n
5de0: 6f 74 56 61 6c 69 64 50 61 72 74 49 64 78 57 68  otValidPartIdxWh
5df0: 65 72 65 28 70 50 61 72 73 65 2c 20 70 4e 43 2c  ere(pParse, pNC,
5e00: 20 22 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20   "functions");. 
5e10: 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72       zId = pExpr
5e20: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
5e30: 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53    nId = sqlite3S
5e40: 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20  trlen30(zId);.  
5e50: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
5e60: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
5e70: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
5e80: 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b  nId, n, enc, 0);
5e90: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
5ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
5eb0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
5ec0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
5ed0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d  >db, zId, nId, -
5ee0: 32 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  2, enc, 0);.    
5ef0: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
5f00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f  ){.          no_
5f10: 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20  such_func = 1;. 
5f20: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5f30: 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75          wrong_nu
5f40: 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20  m_args = 1;.    
5f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
5f60: 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  e{.        is_ag
5f70: 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d  g = pDef->xFunc=
5f80: 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
5f90: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
5fa0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
5fb0: 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
5fc0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
5fd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e  rty(pExpr, EP_Un
5fe0: 6c 69 6b 65 6c 79 7c 45 50 5f 53 6b 69 70 29 3b  likely|EP_Skip);
5ff0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
6000: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
6010: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6020: 20 3d 20 65 78 70 72 50 72 6f 62 61 62 69 6c 69   = exprProbabili
6030: 74 79 28 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  ty(pList->a[1].p
6040: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
6050: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
6060: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
6070: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6080: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6090: 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74  "second argument
60a0: 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   to likelihood()
60b0: 20 6d 75 73 74 20 62 65 20 61 20 22 0a 20 20 20   must be a ".   
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 22 63 6f 6e 73 74 61 6e 74 20 62 65 74     "constant bet
60f0: 77 65 65 6e 20 30 2e 30 20 61 6e 64 20 31 2e 30  ween 0.0 and 1.0
6100: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
6110: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
6120: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6130: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49            /* EVI
6150: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33 30  DENCE-OF: R-6130
6160: 34 2d 32 39 34 34 39 20 54 68 65 20 75 6e 6c 69  4-29449 The unli
6170: 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e  kely(X) function
6180: 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
6190: 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  o.            **
61a0: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 20 30   likelihood(X, 0
61b0: 2e 30 36 32 35 29 2e 0a 20 20 20 20 20 20 20 20  .0625)..        
61c0: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
61d0: 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31 31 36 33  OF: R-01283-1163
61e0: 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28 58  6 The unlikely(X
61f0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 68  ) function is sh
6200: 6f 72 74 2d 68 61 6e 64 20 66 6f 72 0a 20 20 20  ort-hand for.   
6210: 20 20 20 20 20 20 20 20 20 2a 2a 20 6c 69 6b 65           ** like
6220: 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36 32 35 29  lihood(X,0.0625)
6230: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
6240: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6250: 20 36 32 3b 20 20 2f 2a 20 54 55 4e 49 4e 47 3a   62;  /* TUNING:
6260: 20 20 44 65 66 61 75 6c 74 20 32 6e 64 20 61 72    Default 2nd ar
6270: 67 20 74 6f 20 75 6e 6c 69 6b 65 6c 79 28 29 20  g to unlikely() 
6280: 69 73 20 30 2e 30 36 32 35 20 2a 2f 0a 20 20 20  is 0.0625 */.   
6290: 20 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20         }        
62a0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
62b0: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
62c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
62d0: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20  ORIZATION.      
62e0: 69 66 28 20 70 44 65 66 20 29 7b 0a 20 20 20 20  if( pDef ){.    
62f0: 20 20 20 20 61 75 74 68 20 3d 20 73 71 6c 69 74      auth = sqlit
6300: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6310: 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54  se, SQLITE_FUNCT
6320: 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d 3e 7a 4e  ION, 0, pDef->zN
6330: 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
6340: 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54   if( auth!=SQLIT
6350: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6360: 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49    if( auth==SQLI
6370: 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20  TE_DENY ){.     
6380: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
6390: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
63a0: 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64 20 74  not authorized t
63b0: 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20  o use function: 
63c0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63e0: 20 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a           pDef->z
63f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
6400: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
6410: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6420: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
6430: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
6440: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
6450: 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 7d  Prune;.        }
6460: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
6470: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
6480: 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67   && (pNC->ncFlag
6490: 73 20 26 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29  s & NC_AllowAgg)
64a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
64b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
64c0: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
64d0: 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
64e0: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49  tion %.*s()", nI
64f0: 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  d,zId);.        
6500: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
6510: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b       is_agg = 0;
6520: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6530: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 26 26   no_such_func &&
6540: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69   pParse->db->ini
6550: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
6560: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6570: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
6580: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
6590: 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29  %.*s", nId, zId)
65a0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
65b0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  Err++;.      }el
65c0: 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d  se if( wrong_num
65d0: 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20  _args ){.       
65e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
65f0: 28 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e  (pParse,"wrong n
6600: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
6610: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25  ts to function %
6620: 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20  .*s()",.        
6630: 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a       nId, zId);.
6640: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
6650: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r++;.      }.   
6660: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
6670: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20  pNC->ncFlags &= 
6680: 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20  ~NC_AllowAgg;.  
6690: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
66a0: 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c  xprList(pWalker,
66b0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69   pList);.      i
66c0: 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20  f( is_agg ){.   
66d0: 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74       NameContext
66e0: 20 2a 70 4e 43 32 20 3d 20 70 4e 43 3b 0a 20 20   *pNC2 = pNC;.  
66f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
6700: 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  = TK_AGG_FUNCTIO
6710: 4e 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  N;.        pExpr
6720: 2d 3e 6f 70 32 20 3d 20 30 3b 0a 20 20 20 20 20  ->op2 = 0;.     
6730: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 32 20 26     while( pNC2 &
6740: 26 20 21 73 71 6c 69 74 65 33 46 75 6e 63 74 69  & !sqlite3Functi
6750: 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 70 45  onUsesThisSrc(pE
6760: 78 70 72 2c 20 70 4e 43 32 2d 3e 70 53 72 63 4c  xpr, pNC2->pSrcL
6770: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
6780: 20 20 70 45 78 70 72 2d 3e 6f 70 32 2b 2b 3b 0a    pExpr->op2++;.
6790: 20 20 20 20 20 20 20 20 20 20 70 4e 43 32 20 3d            pNC2 =
67a0: 20 70 4e 43 32 2d 3e 70 4e 65 78 74 3b 0a 20 20   pNC2->pNext;.  
67b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
67c0: 69 66 28 20 70 4e 43 32 20 29 20 70 4e 43 32 2d  if( pNC2 ) pNC2-
67d0: 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 48  >ncFlags |= NC_H
67e0: 61 73 41 67 67 3b 0a 20 20 20 20 20 20 20 20 70  asAgg;.        p
67f0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  NC->ncFlags |= N
6800: 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20  C_AllowAgg;.    
6810: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49 58    }.      /* FIX
6820: 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45   ME:  Compute pE
6830: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61  xpr->affinity ba
6840: 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63  sed on the expec
6850: 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  ted return.     
6860: 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20   ** type of the 
6870: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  function .      
6880: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
6890: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d  WRC_Prune;.    }
68a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
68b0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
68c0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
68d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58  :.    case TK_EX
68e0: 49 53 54 53 3a 20 20 74 65 73 74 63 61 73 65 28  ISTS:  testcase(
68f0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
6900: 58 49 53 54 53 20 29 3b 0a 23 65 6e 64 69 66 0a  XISTS );.#endif.
6910: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
6920: 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
6930: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
6940: 49 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  IN );.      if( 
6950: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6960: 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
6970: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
6980: 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e  int nRef = pNC->
6990: 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 6e 6f  nRef;.        no
69a0: 74 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74  tValidCheckConst
69b0: 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 70 4e  raint(pParse, pN
69c0: 43 2c 20 22 73 75 62 71 75 65 72 69 65 73 22 29  C, "subqueries")
69d0: 3b 0a 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c  ;.        notVal
69e0: 69 64 50 61 72 74 49 64 78 57 68 65 72 65 28 70  idPartIdxWhere(p
69f0: 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 73 75 62  Parse, pNC, "sub
6a00: 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20  queries");.     
6a10: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
6a20: 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 45  lect(pWalker, pE
6a30: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
6a40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6a50: 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66   pNC->nRef>=nRef
6a60: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
6a70: 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20  nRef!=pNC->nRef 
6a80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
6a90: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
6aa0: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
6ab0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6ac0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6ad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
6ae0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
6af0: 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 43 68        notValidCh
6b00: 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  eckConstraint(pP
6b10: 61 72 73 65 2c 20 70 4e 43 2c 20 22 70 61 72 61  arse, pNC, "para
6b20: 6d 65 74 65 72 73 22 29 3b 0a 20 20 20 20 20 20  meters");.      
6b30: 6e 6f 74 56 61 6c 69 64 50 61 72 74 49 64 78 57  notValidPartIdxW
6b40: 68 65 72 65 28 70 50 61 72 73 65 2c 20 70 4e 43  here(pParse, pNC
6b50: 2c 20 22 70 61 72 61 6d 65 74 65 72 73 22 29 3b  , "parameters");
6b60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6b70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
6b80: 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c   (pParse->nErr |
6b90: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
6ba0: 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52  llocFailed) ? WR
6bb0: 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f 43 6f  C_Abort : WRC_Co
6bc0: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
6bd0: 20 70 45 4c 69 73 74 20 69 73 20 61 20 6c 69 73   pEList is a lis
6be0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
6bf0: 20 77 68 69 63 68 20 61 72 65 20 72 65 61 6c 6c   which are reall
6c00: 79 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  y the result set
6c10: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 20 53 45 4c   of the.** a SEL
6c20: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
6c30: 70 45 20 69 73 20 61 20 74 65 72 6d 20 69 6e 20  pE is a term in 
6c40: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
6c50: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
6c60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6c70: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
6c80: 20 70 45 20 69 73 20 61 20 73 69 6d 70 6c 65 20   pE is a simple 
6c90: 69 64 65 6e 74 69 66 69 65 72 20 77 68 69 63 68  identifier which
6ca0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 0a 2a 2a 20   corresponds.** 
6cb0: 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f  to the AS-name o
6cc0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 72  f one of the ter
6cd0: 6d 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ms of the expres
6ce0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 69  sion list.  If i
6cf0: 74 20 69 73 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  t is,.** this ro
6d00: 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 6e 20  utine return an 
6d10: 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20  integer between 
6d20: 31 20 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20  1 and N where N 
6d30: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
6d40: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  .** elements in 
6d50: 70 45 4c 69 73 74 2c 20 63 6f 72 72 65 73 70 6f  pEList, correspo
6d60: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6d 61 74  nding to the mat
6d70: 63 68 69 6e 67 20 65 6e 74 72 79 2e 20 20 49 66  ching entry.  If
6d80: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
6d90: 6d 61 74 63 68 2c 20 6f 72 20 69 66 20 70 45 20  match, or if pE 
6da0: 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
6db0: 69 64 65 6e 74 69 66 69 65 72 2c 20 74 68 65 6e  identifier, then
6dc0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
6dd0: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
6de0: 20 70 45 4c 69 73 74 20 68 61 73 20 62 65 65 6e   pEList has been
6df0: 20 72 65 73 6f 6c 76 65 64 2e 20 20 70 45 20 68   resolved.  pE h
6e00: 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  as not..*/.stati
6e10: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 41 73 4e  c int resolveAsN
6e20: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
6e30: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
6e40: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72  sing context for
6e50: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
6e60: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
6e70: 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  EList,  /* List 
6e80: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  of expressions t
6e90: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
6ea0: 20 2a 70 45 20 20 20 20 20 20 20 20 20 20 20 2f   *pE           /
6eb0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * Expression we 
6ec0: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  are trying to ma
6ed0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
6ee0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  i;             /
6ef0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
6f00: 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  /..  UNUSED_PARA
6f10: 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 0a  METER(pParse);..
6f20: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
6f30: 5f 49 44 20 29 7b 0a 20 20 20 20 63 68 61 72 20  _ID ){.    char 
6f40: 2a 7a 43 6f 6c 20 3d 20 70 45 2d 3e 75 2e 7a 54  *zCol = pE->u.zT
6f50: 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oken;.    for(i=
6f60: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
6f70: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
6f80: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
6f90: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
6fa0: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
6fb0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
6fc0: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
6fd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6fe0: 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  rn i+1;.      }.
6ff0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
7000: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
7010: 45 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  E is a pointer t
7020: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
7030: 77 68 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c  which is a singl
7040: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  e term in the.**
7050: 20 4f 52 44 45 52 20 42 59 20 6f 66 20 61 20 63   ORDER BY of a c
7060: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e 20  ompound SELECT. 
7070: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
7080: 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20  has not been.** 
7090: 6e 61 6d 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  name resolved..*
70a0: 2a 0a 2a 2a 20 41 74 20 74 68 65 20 70 6f 69 6e  *.** At the poin
70b0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  t this routine i
70c0: 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 61 6c 72  s called, we alr
70d0: 65 61 64 79 20 6b 6e 6f 77 20 74 68 61 74 20 74  eady know that t
70e0: 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74  he.** ORDER BY t
70f0: 65 72 6d 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  erm is not an in
7100: 74 65 67 65 72 20 69 6e 64 65 78 20 69 6e 74 6f  teger index into
7110: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
7120: 20 20 54 68 61 74 0a 2a 2a 20 63 61 73 65 20 69    That.** case i
7130: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65  s handled by the
7140: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
7150: 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ..**.** Attempt 
7160: 74 6f 20 6d 61 74 63 68 20 70 45 20 61 67 61 69  to match pE agai
7170: 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74 20 63  nst result set c
7180: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65  olumns in the le
7190: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53 45 4c 45 43  ft-most.** SELEC
71a0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
71b0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
71c0: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
71d0: 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61 73 20 61   column,.** as a
71e0: 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
71f0: 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
7200: 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62  it should sort b
7210: 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  y the i-th colum
7220: 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  n..** The left-m
7230: 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 31 2e  ost column is 1.
7240: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
7250: 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  , the value retu
7260: 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 73  rned is the.** s
7270: 61 6d 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ame integer valu
7280: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20  e that would be 
7290: 75 73 65 64 20 69 6e 20 74 68 65 20 53 51 4c 20  used in the SQL 
72a0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 64  statement to ind
72b0: 69 63 61 74 65 0a 2a 2a 20 74 68 65 20 63 6f 6c  icate.** the col
72c0: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  umn..**.** If th
72d0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2c  ere is no match,
72e0: 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
72f0: 72 6e 20 2d 31 20 69 66 20 61 6e 20 65 72 72 6f  rn -1 if an erro
7300: 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
7310: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f  tic int resolveO
7320: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
7330: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
7340: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
7350: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f  rsing context fo
7360: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
7370: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
7380: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20  elect,   /* The 
7390: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
73a0: 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
73b0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
73c0: 78 70 72 20 2a 70 45 20 20 20 20 20 20 20 20 20  xpr *pE         
73d0: 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
73e0: 63 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  c ORDER BY term 
73f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
7400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7410: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
7420: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
7430: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  ;  /* The column
7440: 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  s of the result 
7450: 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  set */.  NameCon
7460: 74 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e  text nc;    /* N
7470: 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
7480: 72 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a  resolving pE */.
7490: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
74a0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
74b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
74c0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
74d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
74e0: 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  de from subproce
74f0: 64 75 72 65 73 20 2a 2f 0a 20 20 75 38 20 73 61  dures */.  u8 sa
7500: 76 65 64 53 75 70 70 45 72 72 3b 20 20 20 2f 2a  vedSuppErr;   /*
7510: 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
7520: 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20  db->suppressErr 
7530: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
7540: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
7550: 65 72 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b  er(pE, &i)==0 );
7560: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
7570: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  ect->pEList;..  
7580: 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  /* Resolve all n
7590: 61 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ames in the ORDE
75a0: 52 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73  R BY term expres
75b0: 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  sion.  */.  mems
75c0: 65 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f  et(&nc, 0, sizeo
75d0: 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61  f(nc));.  nc.pPa
75e0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
75f0: 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  nc.pSrcList = pS
7600: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e  elect->pSrc;.  n
7610: 63 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73  c.pEList = pELis
7620: 74 3b 0a 20 20 6e 63 2e 6e 63 46 6c 61 67 73 20  t;.  nc.ncFlags 
7630: 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20  = NC_AllowAgg;. 
7640: 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20   nc.nErr = 0;.  
7650: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7660: 0a 20 20 73 61 76 65 64 53 75 70 70 45 72 72 20  .  savedSuppErr 
7670: 3d 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  = db->suppressEr
7680: 72 3b 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73  r;.  db->suppres
7690: 73 45 72 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d  sErr = 1;.  rc =
76a0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
76b0: 78 70 72 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45  xprNames(&nc, pE
76c0: 29 3b 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73  );.  db->suppres
76d0: 73 45 72 72 20 3d 20 73 61 76 65 64 53 75 70 70  sErr = savedSupp
76e0: 45 72 72 3b 0a 20 20 69 66 28 20 72 63 20 29 20  Err;.  if( rc ) 
76f0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
7700: 54 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  Try to match the
7710: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
7720: 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e 20  sion against an 
7730: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
7740: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7750: 74 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 31 2d  t.  Return an 1-
7760: 62 61 73 65 64 20 69 6e 64 65 78 20 6f 66 20 74  based index of t
7770: 68 65 20 6d 61 74 63 68 69 6e 67 0a 20 20 2a 2a  he matching.  **
7780: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 6e 74 72   result-set entr
7790: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
77a0: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
77b0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; i++){.    if
77c0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
77d0: 70 61 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69  pare(pEList->a[i
77e0: 5d 2e 70 45 78 70 72 2c 20 70 45 2c 20 2d 31 29  ].pExpr, pE, -1)
77f0: 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  <2 ){.      retu
7800: 72 6e 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  rn i+1;.    }.  
7810: 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 6d 61  }..  /* If no ma
7820: 74 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 2a  tch, return 0. *
7830: 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  /.  return 0;.}.
7840: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
7850: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
7860: 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6f 75 74  ROUP BY term out
7870: 2d 6f 66 2d 72 61 6e 67 65 20 65 72 72 6f 72 2e  -of-range error.
7880: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7890: 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67  resolveOutOfRang
78a0: 65 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20  eError(.  Parse 
78b0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
78c0: 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f   /* The error co
78d0: 6e 74 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68  ntext into which
78e0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 65 72   to write the er
78f0: 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ror */.  const c
7900: 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20  har *zType,     
7910: 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47  /* "ORDER" or "G
7920: 52 4f 55 50 22 20 2a 2f 0a 20 20 69 6e 74 20 69  ROUP" */.  int i
7930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7940: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 28    /* The index (
7950: 31 2d 62 61 73 65 64 29 20 6f 66 20 74 68 65 20  1-based) of the 
7960: 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67  term out of rang
7970: 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 20 20 20  e */.  int mx   
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7990: 20 4c 61 72 67 65 73 74 20 70 65 72 6d 69 73 73   Largest permiss
79a0: 69 62 6c 65 20 76 61 6c 75 65 20 6f 66 20 69 20  ible value of i 
79b0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45  */.){.  sqlite3E
79c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
79d0: 0a 20 20 20 20 22 25 72 20 25 73 20 42 59 20 74  .    "%r %s BY t
79e0: 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  erm out of range
79f0: 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20   - should be ". 
7a00: 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e     "between 1 an
7a10: 64 20 25 64 22 2c 20 69 2c 20 7a 54 79 70 65 2c  d %d", i, zType,
7a20: 20 6d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   mx);.}../*.** A
7a30: 6e 61 6c 79 7a 65 20 74 68 65 20 4f 52 44 45 52  nalyze the ORDER
7a40: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20   BY clause in a 
7a50: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
7a60: 73 74 61 74 65 6d 65 6e 74 2e 20 20 20 4d 6f 64  statement.   Mod
7a70: 69 66 79 0a 2a 2a 20 65 61 63 68 20 74 65 72 6d  ify.** each term
7a80: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
7a90: 20 63 6c 61 75 73 65 20 69 73 20 61 20 63 6f 6e   clause is a con
7aa0: 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 62 65  stant integer be
7ab0: 74 77 65 65 6e 20 31 0a 2a 2a 20 61 6e 64 20 4e  tween 1.** and N
7ac0: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
7ad0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
7ae0: 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e  s in the compoun
7af0: 64 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20  d SELECT..**.** 
7b00: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
7b10: 68 61 74 20 61 72 65 20 61 6c 72 65 61 64 79 20  hat are already 
7b20: 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65  an integer betwe
7b30: 65 6e 20 31 20 61 6e 64 20 4e 20 61 72 65 0a 2a  en 1 and N are.*
7b40: 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20 20 4f  * unmodified.  O
7b50: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
7b60: 61 74 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  at are integers 
7b70: 6f 75 74 73 69 64 65 20 74 68 65 20 72 61 6e 67  outside the rang
7b80: 65 20 6f 66 0a 2a 2a 20 31 20 74 68 72 6f 75 67  e of.** 1 throug
7b90: 68 20 4e 20 67 65 6e 65 72 61 74 65 20 61 6e 20  h N generate an 
7ba0: 65 72 72 6f 72 2e 20 20 4f 52 44 45 52 20 42 59  error.  ORDER BY
7bb0: 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
7bc0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61  expressions.** a
7bd0: 72 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e  re matched again
7be0: 73 74 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  st result set ex
7bf0: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 63 6f 6d  pressions of com
7c00: 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20  pound SELECT.** 
7c10: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 74  beginning with t
7c20: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c  he left-most SEL
7c30: 45 43 54 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20  ECT and working 
7c40: 74 6f 77 61 72 64 20 74 68 65 20 72 69 67 68 74  toward the right
7c50: 2e 0a 2a 2a 20 41 74 20 74 68 65 20 66 69 72 73  ..** At the firs
7c60: 74 20 6d 61 74 63 68 2c 20 74 68 65 20 4f 52 44  t match, the ORD
7c70: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
7c80: 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   is transformed 
7c90: 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 69 6e 74 65  into.** the inte
7ca0: 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  ger column numbe
7cb0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7cc0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
7cd0: 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74  rors seen..*/.st
7ce0: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
7cf0: 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28  CompoundOrderBy(
7d00: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7d10: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
7d20: 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65  ing context.  Le
7d30: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
7d40: 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c  es here */.  Sel
7d50: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
7d60: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
7d70: 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61   statement conta
7d80: 69 6e 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  ining the ORDER 
7d90: 42 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  BY */.){.  int i
7da0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ;.  ExprList *pO
7db0: 72 64 65 72 42 79 3b 0a 20 20 45 78 70 72 4c 69  rderBy;.  ExprLi
7dc0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71  st *pEList;.  sq
7dd0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
7de0: 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a   moreToDo = 1;..
7df0: 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65    pOrderBy = pSe
7e00: 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a  lect->pOrderBy;.
7e10: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
7e20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7e30: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
7e40: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
7e50: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72  COLUMN.  if( pOr
7e60: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d  derBy->nExpr>db-
7e70: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
7e80: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
7e90: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7ea0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
7eb0: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f   many terms in O
7ec0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 29  RDER BY clause")
7ed0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
7ee0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72    }.#endif.  for
7ef0: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
7f00: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7f10: 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69     pOrderBy->a[i
7f20: 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a  ].done = 0;.  }.
7f30: 20 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74    pSelect->pNext
7f40: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
7f50: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29  Select->pPrior )
7f60: 7b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70  {.    pSelect->p
7f70: 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70  Prior->pNext = p
7f80: 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c  Select;.    pSel
7f90: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
7fa0: 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69  Prior;.  }.  whi
7fb0: 6c 65 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d  le( pSelect && m
7fc0: 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 73  oreToDo ){.    s
7fd0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
7fe0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
7ff0: 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20  moreToDo = 0;.  
8000: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
8010: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
8020: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
8030: 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 );.    for(i=0
8040: 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
8050: 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  ->a; i<pOrderBy-
8060: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
8070: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  em++){.      int
8080: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20   iCol = -1;.    
8090: 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70 44 75    Expr *pE, *pDu
80a0: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  p;.      if( pIt
80b0: 65 6d 2d 3e 64 6f 6e 65 20 29 20 63 6f 6e 74 69  em->done ) conti
80c0: 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  nue;.      pE = 
80d0: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
80e0: 6f 6c 6c 61 74 65 28 70 49 74 65 6d 2d 3e 70 45  ollate(pItem->pE
80f0: 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xpr);.      if( 
8100: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
8110: 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20  eger(pE, &iCol) 
8120: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
8130: 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70  Col<=0 || iCol>p
8140: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  EList->nExpr ){.
8150: 20 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76            resolv
8160: 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72  eOutOfRangeError
8170: 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45 52 22  (pParse, "ORDER"
8180: 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e  , i+1, pEList->n
8190: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
81a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
81b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
81c0: 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d  {.        iCol =
81d0: 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70   resolveAsName(p
81e0: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70  Parse, pEList, p
81f0: 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  E);.        if( 
8200: 69 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iCol==0 ){.     
8210: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
8220: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8230: 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  E, 0);.         
8240: 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
8250: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
8260: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 44 75        assert(pDu
8270: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
8280: 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 4f 72  iCol = resolveOr
8290: 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c  derByTermToExprL
82a0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ist(pParse, pSel
82b0: 65 63 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  ect, pDup);.    
82c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
82d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
82e0: 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20  ete(db, pDup);. 
82f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8300: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  .      if( iCol>
8310: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
8320: 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 52 44 45  Convert the ORDE
8330: 52 20 42 59 20 74 65 72 6d 20 69 6e 74 6f 20 61  R BY term into a
8340: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e  n integer column
8350: 20 6e 75 6d 62 65 72 20 69 43 6f 6c 2c 0a 20 20   number iCol,.  
8360: 20 20 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20        ** taking 
8370: 63 61 72 65 20 74 6f 20 70 72 65 73 65 72 76 65  care to preserve
8380: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 63 6c 61   the COLLATE cla
8390: 75 73 65 20 69 66 20 69 74 20 65 78 69 73 74 73  use if it exists
83a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
83b0: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
83c0: 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45  Expr(db, TK_INTE
83d0: 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  GER, 0);.       
83e0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
83f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
8400: 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20   pNew->flags |= 
8410: 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20  EP_IntValue;.   
8420: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
8430: 6c 75 65 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  lue = iCol;.    
8440: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
8450: 45 78 70 72 3d 3d 70 45 20 29 7b 0a 20 20 20 20  Expr==pE ){.    
8460: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
8470: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  pr = pNew;.     
8480: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8490: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
84a0: 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  m->pExpr->op==TK
84b0: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20  _COLLATE );.    
84c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
84d0: 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  tem->pExpr->pLef
84e0: 74 3d 3d 70 45 20 29 3b 0a 20 20 20 20 20 20 20  t==pE );.       
84f0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d     pItem->pExpr-
8500: 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 3b 0a 20  >pLeft = pNew;. 
8510: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8520: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8530: 74 65 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20  te(db, pE);.    
8540: 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65      pItem->iOrde
8550: 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43  rByCol = (u16)iC
8560: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  ol;.        pIte
8570: 6d 2d 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  m->done = 1;.   
8580: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8590: 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a    moreToDo = 1;.
85a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
85b0: 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c    pSelect = pSel
85c0: 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ect->pNext;.  }.
85d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
85e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
85f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  +){.    if( pOrd
8600: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d  erBy->a[i].done=
8610: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8620: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8630: 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42 59  se, "%r ORDER BY
8640: 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d   term does not m
8650: 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20 20  atch any ".     
8660: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69         "column i
8670: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8680: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 72  ", i+1);.      r
8690: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
86a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
86b0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 65 76  ../*.** Check ev
86c0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
86d0: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
86e0: 50 20 42 59 20 63 6c 61 75 73 65 20 70 4f 72 64  P BY clause pOrd
86f0: 65 72 42 79 20 6f 66 0a 2a 2a 20 74 68 65 20 53  erBy of.** the S
8700: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8710: 70 53 65 6c 65 63 74 2e 20 20 49 66 20 61 6e 79  pSelect.  If any
8720: 20 74 65 72 6d 20 69 73 20 72 65 66 65 72 65 6e   term is referen
8730: 63 65 20 74 6f 20 61 0a 2a 2a 20 72 65 73 75 6c  ce to a.** resul
8740: 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
8750: 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
8760: 62 79 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  by the ExprList.
8770: 61 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 66 69  a.iOrderByCol fi
8780: 65 6c 64 29 0a 2a 2a 20 74 68 65 6e 20 63 6f 6e  eld).** then con
8790: 76 65 72 74 20 74 68 61 74 20 74 65 72 6d 20 69  vert that term i
87a0: 6e 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68  nto a copy of th
87b0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
87c0: 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 63 6f  result set.** co
87d0: 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  lumn..**.** If a
87e0: 6e 79 20 65 72 72 6f 72 73 20 61 72 65 20 64 65  ny errors are de
87f0: 74 65 63 74 65 64 2c 20 61 64 64 20 61 6e 20 65  tected, add an e
8800: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
8810: 70 50 61 72 73 65 20 61 6e 64 0a 2a 2a 20 72 65  pParse and.** re
8820: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20  turn non-zero.  
8830: 52 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 6e  Return zero if n
8840: 6f 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65  o errors are see
8850: 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
8860: 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
8870: 75 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  upBy(.  Parse *p
8880: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
8890: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
88a0: 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  .  Leave error m
88b0: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
88c0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
88d0: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  t,      /* The S
88e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
88f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8900: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
8910: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
8920: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
8930: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
8940: 75 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73  use to be proces
8950: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
8960: 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f  har *zType     /
8970: 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  * "ORDER" or "GR
8980: 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  OUP" */.){.  int
8990: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
89a0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
89b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
89c0: 73 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  st;.  struct Exp
89d0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
89e0: 6d 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  m;..  if( pOrder
89f0: 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d  By==0 || pParse-
8a00: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8a10: 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69  d ) return 0;.#i
8a20: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  f SQLITE_MAX_COL
8a30: 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72  UMN.  if( pOrder
8a40: 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  By->nExpr>db->aL
8a50: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
8a60: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
8a70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8a80: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
8a90: 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42  ny terms in %s B
8aa0: 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65  Y clause", zType
8ab0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
8ac0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 45  .  }.#endif.  pE
8ad0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
8ae0: 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74  pEList;.  assert
8af0: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20  ( pEList!=0 );  
8b00: 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  /* sqlite3Select
8b10: 4e 65 77 28 29 20 67 75 61 72 61 6e 74 65 65 73  New() guarantees
8b20: 20 74 68 69 73 20 2a 2f 0a 20 20 66 6f 72 28 69   this */.  for(i
8b30: 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
8b40: 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42  By->a; i<pOrderB
8b50: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
8b60: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
8b70: 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
8b80: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Col ){.      if(
8b90: 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
8ba0: 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
8bb0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  r ){.        res
8bc0: 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72  olveOutOfRangeEr
8bd0: 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54 79 70  ror(pParse, zTyp
8be0: 65 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e  e, i+1, pEList->
8bf0: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
8c00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
8c10: 7d 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41  }.      resolveA
8c20: 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c  lias(pParse, pEL
8c30: 69 73 74 2c 20 70 49 74 65 6d 2d 3e 69 4f 72 64  ist, pItem->iOrd
8c40: 65 72 42 79 43 6f 6c 2d 31 2c 20 70 49 74 65 6d  erByCol-1, pItem
8c50: 2d 3e 70 45 78 70 72 2c 20 7a 54 79 70 65 2c 30  ->pExpr, zType,0
8c60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
8c70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
8c80: 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e  * pOrderBy is an
8c90: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
8ca0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20  UP BY clause in 
8cb0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8cc0: 20 70 53 65 6c 65 63 74 2e 0a 2a 2a 20 54 68 65   pSelect..** The
8cd0: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66   Name context of
8ce0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
8cf0: 65 6d 65 6e 74 20 69 73 20 70 4e 43 2e 20 20 7a  ement is pNC.  z
8d00: 54 79 70 65 20 69 73 20 65 69 74 68 65 72 0a 2a  Type is either.*
8d10: 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  * "ORDER" or "GR
8d20: 4f 55 50 22 20 64 65 70 65 6e 64 69 6e 67 20 6f  OUP" depending o
8d30: 6e 20 77 68 69 63 68 20 74 79 70 65 20 6f 66 20  n which type of 
8d40: 63 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79 20  clause pOrderBy 
8d50: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  is..**.** This r
8d60: 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20  outine resolves 
8d70: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
8d80: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 20   clause into an 
8d90: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49  expression..** I
8da0: 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20 74  f the order-by t
8db0: 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65  erm is an intege
8dc0: 72 20 49 20 62 65 74 77 65 65 6e 20 31 20 61 6e  r I between 1 an
8dd0: 64 20 4e 20 28 77 68 65 72 65 20 4e 20 69 73 20  d N (where N is 
8de0: 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
8df0: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
8e00: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
8e10: 65 20 53 45 4c 45 43 54 29 20 74 68 65 6e 20 74  e SELECT) then t
8e20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
8e30: 20 69 6e 20 74 68 65 20 72 65 73 6f 6c 75 74 69   in the resoluti
8e40: 6f 6e 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20  on is a copy of 
8e50: 74 68 65 20 49 2d 74 68 20 72 65 73 75 6c 74 2d  the I-th result-
8e60: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  set expression. 
8e70: 20 49 66 0a 2a 2a 20 74 68 65 20 6f 72 64 65 72   If.** the order
8e80: 2d 62 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69  -by term is an i
8e90: 64 65 6e 74 69 66 69 65 72 20 74 68 61 74 20 63  dentifier that c
8ea0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68  orresponds to th
8eb0: 65 20 41 53 2d 6e 61 6d 65 20 6f 66 0a 2a 2a 20  e AS-name of.** 
8ec0: 61 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  a result-set exp
8ed0: 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 74 68  ression, then th
8ee0: 65 20 74 65 72 6d 20 72 65 73 6f 6c 76 65 73 20  e term resolves 
8ef0: 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  to a copy of the
8f00: 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65  .** result-set e
8f10: 78 70 72 65 73 73 69 6f 6e 2e 20 20 4f 74 68 65  xpression.  Othe
8f20: 72 77 69 73 65 2c 20 74 68 65 20 65 78 70 72 65  rwise, the expre
8f30: 73 73 69 6f 6e 20 69 73 20 72 65 73 6f 6c 76 65  ssion is resolve
8f40: 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 73 75 61  d in.** the usua
8f50: 6c 20 77 61 79 20 2d 20 75 73 69 6e 67 20 73 71  l way - using sq
8f60: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
8f70: 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Names()..**.** T
8f80: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
8f90: 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  rns the number o
8fa0: 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 65 72  f errors.  If er
8fb0: 72 6f 72 73 20 6f 63 63 75 72 2c 20 74 68 65 6e  rors occur, then
8fc0: 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
8fd0: 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
8fe0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
8ff0: 6e 20 70 50 61 72 73 65 2e 20 20 28 4f 4f 4d 20  n pParse.  (OOM 
9000: 65 72 72 6f 72 73 0a 2a 2a 20 65 78 63 65 70 74  errors.** except
9010: 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed.).*/.static i
9020: 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47  nt resolveOrderG
9030: 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f  roupBy(.  NameCo
9040: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20  ntext *pNC,     
9050: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74  /* The name cont
9060: 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  ext of the SELEC
9070: 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  T statement */. 
9080: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
9090: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45  ,      /* The SE
90a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 68  LECT statement h
90b0: 6f 6c 64 69 6e 67 20 70 4f 72 64 65 72 42 79 20  olding pOrderBy 
90c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
90d0: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e  OrderBy,   /* An
90e0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
90f0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20  UP BY clause to 
9100: 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 63 6f 6e  resolve */.  con
9110: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
9120: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52     /* Either "OR
9130: 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c  DER" or "GROUP",
9140: 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   as appropriate 
9150: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
9160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9170: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
9180: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
9190: 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20   iCol;          
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
91b0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a  olumn number */.
91c0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
91d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
91e0: 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68   /* A term of th
91f0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
9200: 65 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  e */.  Parse *pP
9210: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
9220: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9230: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
9240: 74 20 6e 52 65 73 75 6c 74 3b 20 20 20 20 20 20  t nResult;      
9250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9260: 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20  Number of terms 
9270: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9280: 74 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4f 72 64  t */..  if( pOrd
9290: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
92a0: 20 30 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20   0;.  nResult = 
92b0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
92c0: 3e 6e 45 78 70 72 3b 0a 20 20 70 50 61 72 73 65  >nExpr;.  pParse
92d0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
92e0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
92f0: 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
9300: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
9310: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
9320: 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70      Expr *pE = p
9330: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
9340: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 73 71 6c   Expr *pE2 = sql
9350: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
9360: 61 74 65 28 70 45 29 3b 0a 20 20 20 20 69 66 28  ate(pE);.    if(
9370: 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47 27 20 29   zType[0]!='G' )
9380: 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72  {.      iCol = r
9390: 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50 61  esolveAsName(pPa
93a0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45  rse, pSelect->pE
93b0: 4c 69 73 74 2c 20 70 45 32 29 3b 0a 20 20 20 20  List, pE2);.    
93c0: 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a    if( iCol>0 ){.
93d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
93e0: 20 41 53 2d 6e 61 6d 65 20 6d 61 74 63 68 20 69   AS-name match i
93f0: 73 20 66 6f 75 6e 64 2c 20 6d 61 72 6b 20 74 68  s found, mark th
9400: 69 73 20 4f 52 44 45 52 20 42 59 20 63 6f 6c 75  is ORDER BY colu
9410: 6d 6e 20 61 73 20 62 65 69 6e 67 0a 20 20 20 20  mn as being.    
9420: 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66      ** a copy of
9430: 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 72 65 73   the iCol-th res
9440: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 2e 20  ult-set column. 
9450: 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
9460: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20 20  call to.        
9470: 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ** sqlite3Resolv
9480: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 29 20  eOrderGroupBy() 
9490: 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
94a0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 61   expression to a
94b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
94c0: 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
94d0: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
94e0: 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ssion. */.      
94f0: 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42    pItem->iOrderB
9500: 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c  yCol = (u16)iCol
9510: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
9520: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
9530: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
9540: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
9550: 45 32 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  E2, &iCol) ){.  
9560: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
9570: 20 42 59 20 74 65 72 6d 20 69 73 20 61 6e 20 69   BY term is an i
9580: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e  nteger constant.
9590: 20 20 41 67 61 69 6e 2c 20 73 65 74 20 74 68 65    Again, set the
95a0: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a   column.      **
95b0: 20 6e 75 6d 62 65 72 20 73 6f 20 74 68 61 74 20   number so that 
95c0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
95d0: 64 65 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c  derGroupBy() wil
95e0: 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 0a 20 20  l convert the.  
95f0: 20 20 20 20 2a 2a 20 6f 72 64 65 72 2d 62 79 20      ** order-by 
9600: 74 65 72 6d 20 74 6f 20 61 20 63 6f 70 79 20 6f  term to a copy o
9610: 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  f the result-set
9620: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
9630: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 31 20       if( iCol<1 
9640: 7c 7c 20 69 43 6f 6c 3e 30 78 66 66 66 66 20 29  || iCol>0xffff )
9650: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76  {.        resolv
9660: 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72  eOutOfRangeError
9670: 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20  (pParse, zType, 
9680: 69 2b 31 2c 20 6e 52 65 73 75 6c 74 29 3b 0a 20  i+1, nResult);. 
9690: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
96a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
96b0: 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f  Item->iOrderByCo
96c0: 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20  l = (u16)iCol;. 
96d0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
96e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 68     }..    /* Oth
96f0: 65 72 77 69 73 65 2c 20 74 72 65 61 74 20 74 68  erwise, treat th
9700: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
9710: 61 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 65  as an ordinary e
9720: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
9730: 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42 79   pItem->iOrderBy
9740: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Col = 0;.    if(
9750: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
9760: 78 70 72 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45  xprNames(pNC, pE
9770: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
9780: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  n 1;.    }.    f
9790: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 65 6c 65 63  or(j=0; j<pSelec
97a0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
97b0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; j++){.      if
97c0: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
97d0: 70 61 72 65 28 70 45 2c 20 70 53 65 6c 65 63 74  pare(pE, pSelect
97e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  ->pEList->a[j].p
97f0: 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
9800: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69          pItem->i
9810: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 6a 2b 31  OrderByCol = j+1
9820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9830: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
9840: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
9850: 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
9860: 70 53 65 6c 65 63 74 2c 20 70 4f 72 64 65 72 42  pSelect, pOrderB
9870: 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  y, zType);.}../*
9880: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65  .** Resolve name
9890: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
98a0: 73 74 61 74 65 6d 65 6e 74 20 70 20 61 6e 64 20  statement p and 
98b0: 61 6c 6c 20 6f 66 20 69 74 73 20 64 65 73 63 65  all of its desce
98c0: 6e 64 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ndents..*/.stati
98d0: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 53 65 6c  c int resolveSel
98e0: 65 63 74 53 74 65 70 28 57 61 6c 6b 65 72 20 2a  ectStep(Walker *
98f0: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
9900: 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  *p){.  NameConte
9910: 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20 20 2f  xt *pOuterNC;  /
9920: 2a 20 43 6f 6e 74 65 78 74 20 74 68 61 74 20 63  * Context that c
9930: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 53 45 4c  ontains this SEL
9940: 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ECT */.  NameCon
9950: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
9960: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
9970: 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20   of this SELECT 
9980: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f  */.  int isCompo
9990: 75 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  und;         /* 
99a0: 54 72 75 65 20 69 66 20 70 20 69 73 20 61 20 63  True if p is a c
99b0: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
99c0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e  /.  int nCompoun
99d0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  d;          /* N
99e0: 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f 75 6e  umber of compoun
99f0: 64 20 74 65 72 6d 73 20 70 72 6f 63 65 73 73 65  d terms processe
9a00: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61  d so far */.  Pa
9a10: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
9a20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
9a30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
9a40: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
9a50: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
9a60: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  set expression l
9a70: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ist */.  int i; 
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
9aa0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9ab0: 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 2f 2a  pGroupBy;     /*
9ac0: 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
9ad0: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
9ae0: 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20   *pLeftmost;    
9af0: 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 6f    /* Left-most o
9b00: 66 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f  f SELECT of a co
9b10: 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 73 71 6c 69  mpound */.  sqli
9b20: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
9b30: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
9b40: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
9b50: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
9b60: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   );.  if( p->sel
9b70: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
9b80: 76 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ved ){.    retur
9b90: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
9ba0: 0a 20 20 70 4f 75 74 65 72 4e 43 20 3d 20 70 57  .  pOuterNC = pW
9bb0: 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
9bc0: 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
9bd0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
9be0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
9bf0: 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 73 71 6c 69  /* Normally sqli
9c00: 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
9c10: 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  ) will be called
9c20: 20 66 69 72 73 74 20 61 6e 64 20 77 69 6c 6c 20   first and will 
9c30: 68 61 76 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64  have.  ** alread
9c40: 79 20 65 78 70 61 6e 64 65 64 20 74 68 69 73 20  y expanded this 
9c50: 53 45 4c 45 43 54 2e 20 20 48 6f 77 65 76 65 72  SELECT.  However
9c60: 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  , if this is a s
9c70: 75 62 71 75 65 72 79 20 77 69 74 68 69 6e 0a 20  ubquery within. 
9c80: 20 2a 2a 20 61 6e 20 65 78 70 72 65 73 73 69 6f   ** an expressio
9c90: 6e 2c 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  n, sqlite3Resolv
9ca0: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 77 69 6c  eExprNames() wil
9cb0: 6c 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  l be called with
9cc0: 6f 75 74 20 61 0a 20 20 2a 2a 20 70 72 69 6f 72  out a.  ** prior
9cd0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
9ce0: 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 2e 20  SelectExpand(). 
9cf0: 20 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65   When that happe
9d00: 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a 20 73 71 6c  ns, let.  ** sql
9d10: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 29  ite3SelectPrep()
9d20: 20 64 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 70   do all of the p
9d30: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
9d40: 69 73 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2a 20  is SELECT..  ** 
9d50: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
9d60: 70 28 29 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20  p() will invoke 
9d70: 62 6f 74 68 20 73 71 6c 69 74 65 33 53 65 6c 65  both sqlite3Sele
9d80: 63 74 45 78 70 61 6e 64 28 29 20 61 6e 64 0a 20  ctExpand() and. 
9d90: 20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65   ** this routine
9da0: 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
9db0: 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  order..  */.  if
9dc0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
9dd0: 20 53 46 5f 45 78 70 61 6e 64 65 64 29 3d 3d 30   SF_Expanded)==0
9de0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
9df0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
9e00: 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
9e10: 20 20 20 20 72 65 74 75 72 6e 20 28 70 50 61 72      return (pPar
9e20: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
9e30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20  mallocFailed) ? 
9e40: 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f  WRC_Abort : WRC_
9e50: 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 69 73  Prune;.  }..  is
9e60: 43 6f 6d 70 6f 75 6e 64 20 3d 20 70 2d 3e 70 50  Compound = p->pP
9e70: 72 69 6f 72 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70  rior!=0;.  nComp
9e80: 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 70 4c 65 66  ound = 0;.  pLef
9e90: 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 77 68 69  tmost = p;.  whi
9ea0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  le( p ){.    ass
9eb0: 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
9ec0: 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
9ed0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
9ee0: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
9ef0: 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 3d 3d  & SF_Resolved)==
9f00: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  0 );.    p->selF
9f10: 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 73 6f 6c  lags |= SF_Resol
9f20: 76 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73  ved;..    /* Res
9f30: 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
9f40: 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
9f50: 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
9f60: 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 20 20  uses. These.    
9f70: 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
9f80: 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
9f90: 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
9fa0: 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
9fb0: 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
9fc0: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
9fd0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
9fe0: 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
9ff0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66  = pParse;.    if
a000: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
a010: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
a020: 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a 20 20  p->pLimit) ||.  
a030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73        sqlite3Res
a040: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
a050: 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74 29 20  NC, p->pOffset) 
a060: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
a070: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
a080: 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 75 72  .  .    /* Recur
a090: 73 69 76 65 6c 79 20 72 65 73 6f 6c 76 65 20 6e  sively resolve n
a0a0: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73 75 62 71  ames in all subq
a0b0: 75 65 72 69 65 73 0a 20 20 20 20 2a 2f 0a 20 20  ueries.    */.  
a0c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
a0d0: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
a0e0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
a0f0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
a100: 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
a110: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
a120: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
a130: 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  .        NameCon
a140: 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 20 20  text *pNC;      
a150: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
a160: 65 72 61 74 65 20 6e 61 6d 65 20 63 6f 6e 74 65  erate name conte
a170: 78 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  xts */.        i
a180: 6e 74 20 6e 52 65 66 20 3d 20 30 3b 20 20 20 20  nt nRef = 0;    
a190: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 63           /* Refc
a1a0: 6f 75 6e 74 20 66 6f 72 20 70 4f 75 74 65 72 4e  ount for pOuterN
a1b0: 43 20 61 6e 64 20 6f 75 74 65 72 20 63 6f 6e 74  C and outer cont
a1c0: 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  exts */.        
a1d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
a1e0: 65 64 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  edContext = pPar
a1f0: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
a200: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;..        /* Co
a210: 75 6e 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  unt the total nu
a220: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
a230: 65 73 20 74 6f 20 70 4f 75 74 65 72 4e 43 20 61  es to pOuterNC a
a240: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 0a 20 20  nd all of its.  
a250: 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20        ** parent 
a260: 63 6f 6e 74 65 78 74 73 2e 20 41 66 74 65 72 20  contexts. After 
a270: 72 65 73 6f 6c 76 69 6e 67 20 72 65 66 65 72 65  resolving refere
a280: 6e 63 65 73 20 74 6f 20 65 78 70 72 65 73 73 69  nces to expressi
a290: 6f 6e 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  ons in.        *
a2a0: 2a 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  * pItem->pSelect
a2b0: 2c 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20  , check if this 
a2c0: 76 61 6c 75 65 20 68 61 73 20 63 68 61 6e 67 65  value has change
a2d0: 64 2e 20 49 66 20 73 6f 2c 20 74 68 65 6e 0a 20  d. If so, then. 
a2e0: 20 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54         ** SELECT
a2f0: 20 73 74 61 74 65 6d 65 6e 74 20 70 49 74 65 6d   statement pItem
a300: 2d 3e 70 53 65 6c 65 63 74 20 6d 75 73 74 20 62  ->pSelect must b
a310: 65 20 63 6f 72 72 65 6c 61 74 65 64 2e 20 53 65  e correlated. Se
a320: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
a330: 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c   pItem->isCorrel
a340: 61 74 65 64 20 66 6c 61 67 20 69 66 20 74 68 69  ated flag if thi
a350: 73 20 69 73 20 74 68 65 20 63 61 73 65 2e 20 2a  s is the case. *
a360: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4e  /.        for(pN
a370: 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b  C=pOuterNC; pNC;
a380: 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29   pNC=pNC->pNext)
a390: 20 6e 52 65 66 20 2b 3d 20 70 4e 43 2d 3e 6e 52   nRef += pNC->nR
a3a0: 65 66 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  ef;..        if(
a3b0: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20   pItem->zName ) 
a3c0: 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
a3d0: 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e  text = pItem->zN
a3e0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ame;.        sql
a3f0: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
a400: 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70  tNames(pParse, p
a410: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70  Item->pSelect, p
a420: 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20 20 20  OuterNC);.      
a430: 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43    pParse->zAuthC
a440: 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65 64 43  ontext = zSavedC
a450: 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  ontext;.        
a460: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
a470: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
a480: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 57 52  iled ) return WR
a490: 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 20 20  C_Abort;..      
a4a0: 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72    for(pNC=pOuter
a4b0: 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43  NC; pNC; pNC=pNC
a4c0: 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66 20 2d 3d  ->pNext) nRef -=
a4d0: 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20   pNC->nRef;.    
a4e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
a4f0: 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d  m->isCorrelated=
a500: 3d 30 20 26 26 20 6e 52 65 66 3c 3d 30 20 29 3b  =0 && nRef<=0 );
a510: 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
a520: 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 28  isCorrelated = (
a530: 6e 52 65 66 21 3d 30 29 3b 0a 20 20 20 20 20 20  nRef!=0);.      
a540: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
a550: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63  * Set up the loc
a560: 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  al name-context 
a570: 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69 74  to pass to sqlit
a580: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
a590: 65 73 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  es() to.    ** r
a5a0: 65 73 6f 6c 76 65 20 74 68 65 20 72 65 73 75 6c  esolve the resul
a5b0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
a5c0: 20 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20   list..    */.  
a5d0: 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20    sNC.ncFlags = 
a5e0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20  NC_AllowAgg;.   
a5f0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
a600: 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 73 4e 43  p->pSrc;.    sNC
a610: 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72 4e  .pNext = pOuterN
a620: 43 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73  C;.  .    /* Res
a630: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68  olve names in th
a640: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f  e result set. */
a650: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 2d  .    pEList = p-
a660: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  >pEList;.    ass
a670: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
a680: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a690: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
a6a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72  i++){.      Expr
a6b0: 20 2a 70 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61   *pX = pEList->a
a6c0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
a6d0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
a6e0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
a6f0: 43 2c 20 70 58 29 20 29 7b 0a 20 20 20 20 20 20  C, pX) ){.      
a700: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
a710: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
a720: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
a730: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72  here are no aggr
a740: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
a750: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  in the result-se
a760: 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  t, and no GROUP 
a770: 42 59 20 0a 20 20 20 20 2a 2a 20 65 78 70 72 65  BY .    ** expre
a780: 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c  ssion, do not al
a790: 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20 69  low aggregates i
a7a0: 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68  n any of the oth
a7b0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  er expressions..
a7c0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
a7d0: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
a7e0: 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d  & SF_Aggregate)=
a7f0: 3d 30 20 29 3b 0a 20 20 20 20 70 47 72 6f 75 70  =0 );.    pGroup
a800: 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
a810: 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  ;.    if( pGroup
a820: 42 79 20 7c 7c 20 28 73 4e 43 2e 6e 63 46 6c 61  By || (sNC.ncFla
a830: 67 73 20 26 20 4e 43 5f 48 61 73 41 67 67 29 21  gs & NC_HasAgg)!
a840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
a850: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
a860: 67 72 65 67 61 74 65 3b 0a 20 20 20 20 7d 65 6c  gregate;.    }el
a870: 73 65 7b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63  se{.      sNC.nc
a880: 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c  Flags &= ~NC_All
a890: 6f 77 41 67 67 3b 0a 20 20 20 20 7d 0a 20 20 0a  owAgg;.    }.  .
a8a0: 20 20 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49      /* If a HAVI
a8b0: 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70 72 65  NG clause is pre
a8c0: 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65  sent, then there
a8d0: 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f 55 50   must be a GROUP
a8e0: 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20   BY clause..    
a8f0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 48  */.    if( p->pH
a900: 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70  aving && !pGroup
a910: 42 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  By ){.      sqli
a920: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
a930: 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20  se, "a GROUP BY 
a940: 63 6c 61 75 73 65 20 69 73 20 72 65 71 75 69 72  clause is requir
a950: 65 64 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47  ed before HAVING
a960: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
a970: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
a980: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20  }.  .    /* Add 
a990: 74 68 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d  the output colum
a9a0: 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61  n list to the na
a9b0: 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72  me-context befor
a9c0: 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20  e parsing the.  
a9d0: 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65    ** other expre
a9e0: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45  ssions in the SE
a9f0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
aa00: 54 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a  This is so that.
aa10: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
aa20: 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ns in the WHERE 
aa30: 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20 63 61  clause (etc.) ca
aa40: 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70 72 65  n refer to expre
aa50: 73 73 69 6f 6e 73 20 62 79 0a 20 20 20 20 2a 2a  ssions by.    **
aa60: 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20   aliases in the 
aa70: 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20 20 20  result set..    
aa80: 2a 2a 0a 20 20 20 20 2a 2a 20 4d 69 6e 6f 72 20  **.    ** Minor 
aa90: 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69  point: If this i
aaa0: 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
aab0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
aac0: 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 72  will be.    ** r
aad0: 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20  e-evaluated for 
aae0: 65 61 63 68 20 72 65 66 65 72 65 6e 63 65 20 74  each reference t
aaf0: 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
ab00: 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d   sNC.pEList = p-
ab10: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28  >pEList;.    if(
ab20: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
ab30: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
ab40: 2d 3e 70 48 61 76 69 6e 67 29 20 29 20 72 65 74  ->pHaving) ) ret
ab50: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
ab60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
ab70: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26  solveExprNames(&
ab80: 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20  sNC, p->pWhere) 
ab90: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
aba0: 72 74 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  rt;..    /* The 
abb0: 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f  ORDER BY and GRO
abc0: 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 6d 61  UP BY clauses ma
abd0: 79 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 74  y not refer to t
abe0: 65 72 6d 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f  erms in.    ** o
abf0: 75 74 65 72 20 71 75 65 72 69 65 73 20 0a 20 20  uter queries .  
ac00: 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 4e 65    */.    sNC.pNe
ac10: 78 74 20 3d 20 30 3b 0a 20 20 20 20 73 4e 43 2e  xt = 0;.    sNC.
ac20: 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c  ncFlags |= NC_Al
ac30: 6c 6f 77 41 67 67 3b 0a 0a 20 20 20 20 2f 2a 20  lowAgg;..    /* 
ac40: 50 72 6f 63 65 73 73 20 74 68 65 20 4f 52 44 45  Process the ORDE
ac50: 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20  R BY clause for 
ac60: 73 69 6e 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54  singleton SELECT
ac70: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
ac80: 20 2a 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   ** The ORDER BY
ac90: 20 63 6c 61 75 73 65 20 66 6f 72 20 63 6f 6d 70   clause for comp
aca0: 6f 75 6e 64 73 20 53 45 4c 45 43 54 20 73 74 61  ounds SELECT sta
acb0: 74 65 6d 65 6e 74 73 20 69 73 20 68 61 6e 64 6c  tements is handl
acc0: 65 64 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c  ed.    ** below,
acd0: 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
ace0: 65 20 72 65 73 75 6c 74 2d 73 65 74 73 20 66 6f  e result-sets fo
acf0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65  r all of the ele
ad00: 6d 65 6e 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ments of.    ** 
ad10: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76  the compound hav
ad20: 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  e been resolved.
ad30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
ad40: 21 69 73 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72  !isCompound && r
ad50: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
ad60: 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70  By(&sNC, p, p->p
ad70: 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
ad80: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
ad90: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
ada0: 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d   }.    if( db->m
adb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
adc0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
add0: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a  Abort;.    }.  .
ade0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74      /* Resolve t
adf0: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
ae00: 73 65 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65  se.  At the same
ae10: 20 74 69 6d 65 2c 20 6d 61 6b 65 20 73 75 72 65   time, make sure
ae20: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 47 52 4f   .    ** the GRO
ae30: 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65  UP BY clause doe
ae40: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67  s not contain ag
ae50: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
ae60: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
ae70: 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
ae80: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
ae90: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
aea0: 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20  .    .      if( 
aeb0: 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  resolveOrderGrou
aec0: 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 47 72  pBy(&sNC, p, pGr
aed0: 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 20  oupBy, "GROUP") 
aee0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
aef0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  led ){.        r
af00: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
af10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
af20: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47  or(i=0, pItem=pG
af30: 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72  roupBy->a; i<pGr
af40: 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
af50: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
af60: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
af70: 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e  Property(pItem->
af80: 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29  pExpr, EP_Agg) )
af90: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
afa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
afb0: 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66  se, "aggregate f
afc0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  unctions are not
afd0: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20   allowed in ".  
afe0: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65              "the
aff0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
b000: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ");.          re
b010: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
b020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b030: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
b040: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
b050: 65 78 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ext term of the 
b060: 63 6f 6d 70 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a  compound.    */.
b070: 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
b080: 72 3b 0a 20 20 20 20 6e 43 6f 6d 70 6f 75 6e 64  r;.    nCompound
b090: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ++;.  }..  /* Re
b0a0: 73 6f 6c 76 65 20 74 68 65 20 4f 52 44 45 52 20  solve the ORDER 
b0b0: 42 59 20 6f 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  BY on a compound
b0c0: 20 53 45 4c 45 43 54 20 61 66 74 65 72 20 61 6c   SELECT after al
b0d0: 6c 20 74 65 72 6d 73 20 6f 66 0a 20 20 2a 2a 20  l terms of.  ** 
b0e0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76  the compound hav
b0f0: 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  e been resolved.
b100: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f  .  */.  if( isCo
b110: 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f 6c 76  mpound && resolv
b120: 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79  eCompoundOrderBy
b130: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 6d 6f  (pParse, pLeftmo
b140: 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  st) ){.    retur
b150: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
b160: 0a 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50  ..  return WRC_P
b170: 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rune;.}../*.** T
b180: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
b190: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
b1a0: 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65  tree and resolve
b1b0: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a  s references to.
b1c0: 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ** table columns
b1d0: 20 61 6e 64 20 72 65 73 75 6c 74 2d 73 65 74 20   and result-set 
b1e0: 63 6f 6c 75 6d 6e 73 2e 20 20 41 74 20 74 68 65  columns.  At the
b1f0: 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 6f 20 65   same time, do e
b200: 72 72 6f 72 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  rror.** checking
b210: 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73 61   on function usa
b220: 67 65 20 61 6e 64 20 73 65 74 20 61 20 66 6c 61  ge and set a fla
b230: 67 20 69 66 20 61 6e 79 20 61 67 67 72 65 67 61  g if any aggrega
b240: 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  te functions.** 
b250: 61 72 65 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20  are seen..**.** 
b260: 54 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  To resolve table
b270: 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65 72 65 6e   columns referen
b280: 63 65 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20  ces we look for 
b290: 6e 6f 64 65 73 20 28 6f 72 20 73 75 62 74 72 65  nodes (or subtre
b2a0: 65 73 29 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  es) of the .** f
b2b0: 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a  orm X.Y.Z or Y.Z
b2c0: 20 6f 72 20 6a 75 73 74 20 5a 20 77 68 65 72 65   or just Z where
b2d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 58 3a 20 20  .**.**      X:  
b2e0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   The name of a d
b2f0: 61 74 61 62 61 73 65 2e 20 20 45 78 3a 20 20 22  atabase.  Ex:  "
b300: 6d 61 69 6e 22 20 6f 72 20 22 74 65 6d 70 22 20  main" or "temp" 
b310: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
b320: 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  the symbolic nam
b330: 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6e  e assigned to an
b340: 20 41 54 54 41 43 48 2d 65 64 20 64 61 74 61 62   ATTACH-ed datab
b350: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase..**.**      
b360: 59 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66  Y:   The name of
b370: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 20 46 52   a table in a FR
b380: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 72 20 69  OM clause.  Or i
b390: 6e 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 20  n a trigger.**  
b3a0: 20 20 20 20 20 20 20 20 20 6f 6e 65 20 6f 66 20           one of 
b3b0: 74 68 65 20 73 70 65 63 69 61 6c 20 6e 61 6d 65  the special name
b3c0: 73 20 22 6f 6c 64 22 20 6f 72 20 22 6e 65 77 22  s "old" or "new"
b3d0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 5a 3a 20  ..**.**      Z: 
b3e0: 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20    The name of a 
b3f0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
b400: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 64  Y..**.** The nod
b410: 65 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66  e at the root of
b420: 20 74 68 65 20 73 75 62 74 72 65 65 20 69 73 20   the subtree is 
b430: 6d 6f 64 69 66 69 65 64 20 61 73 20 66 6f 6c 6c  modified as foll
b440: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 45 78  ows:.**.**    Ex
b450: 70 72 2e 6f 70 20 20 20 20 20 20 20 20 43 68 61  pr.op        Cha
b460: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
b470: 4e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 70 54 61  N.**    Expr.pTa
b480: 62 20 20 20 20 20 20 50 6f 69 6e 74 73 20 74 6f  b      Points to
b490: 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
b4a0: 74 20 66 6f 72 20 58 2e 59 0a 2a 2a 20 20 20 20  t for X.Y.**    
b4b0: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 20 20 54  Expr.iColumn   T
b4c0: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  he column index 
b4d0: 69 6e 20 58 2e 59 2e 20 20 2d 31 20 66 6f 72 20  in X.Y.  -1 for 
b4e0: 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20  the rowid..**   
b4f0: 20 45 78 70 72 2e 69 54 61 62 6c 65 20 20 20 20   Expr.iTable    
b500: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
b510: 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 59 0a 2a  number for X.Y.*
b520: 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c  *.**.** To resol
b530: 76 65 20 72 65 73 75 6c 74 2d 73 65 74 20 72 65  ve result-set re
b540: 66 65 72 65 6e 63 65 73 2c 20 6c 6f 6f 6b 20 66  ferences, look f
b550: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  or expression no
b560: 64 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  des of the.** fo
b570: 72 6d 20 5a 20 28 77 69 74 68 20 6e 6f 20 58 20  rm Z (with no X 
b580: 61 6e 64 20 59 20 70 72 65 66 69 78 29 20 77 68  and Y prefix) wh
b590: 65 72 65 20 74 68 65 20 5a 20 6d 61 74 63 68 65  ere the Z matche
b5a0: 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  s the right-hand
b5b0: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6e 20 41  .** size of an A
b5c0: 53 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  S clause in the 
b5d0: 72 65 73 75 6c 74 2d 73 65 74 20 6f 66 20 61 20  result-set of a 
b5e0: 53 45 4c 45 43 54 2e 20 20 54 68 65 20 5a 20 65  SELECT.  The Z e
b5f0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
b600: 72 65 70 6c 61 63 65 64 20 62 79 20 61 20 63 6f  replaced by a co
b610: 70 79 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 68  py of the left-h
b620: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
b630: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
b640: 73 73 69 6f 6e 2e 0a 2a 2a 20 54 61 62 6c 65 2d  ssion..** Table-
b650: 6e 61 6d 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  name and functio
b660: 6e 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6f 63 63  n resolution occ
b670: 75 72 73 20 6f 6e 20 74 68 65 20 73 75 62 73 74  urs on the subst
b680: 69 74 75 74 65 64 20 65 78 70 72 65 73 73 69 6f  ituted expressio
b690: 6e 0a 2a 2a 20 74 72 65 65 2e 20 20 46 6f 72 20  n.** tree.  For 
b6a0: 65 78 61 6d 70 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a  example, in:.**.
b6b0: 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61  **      SELECT a
b6c0: 2b 62 20 41 53 20 78 2c 20 63 2b 64 20 41 53 20  +b AS x, c+d AS 
b6d0: 79 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  y FROM t1 ORDER 
b6e0: 42 59 20 78 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BY x;.**.** The 
b6f0: 22 78 22 20 74 65 72 6d 20 6f 66 20 74 68 65 20  "x" term of the 
b700: 6f 72 64 65 72 20 62 79 20 69 73 20 72 65 70 6c  order by is repl
b710: 61 63 65 64 20 62 79 20 22 61 2b 62 22 20 74 6f  aced by "a+b" to
b720: 20 72 65 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20   render:.**.**  
b730: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41      SELECT a+b A
b740: 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46 52  S x, c+d AS y FR
b750: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
b760: 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  +b;.**.** Functi
b770: 6f 6e 20 63 61 6c 6c 73 20 61 72 65 20 63 68 65  on calls are che
b780: 63 6b 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  cked to make sur
b790: 65 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  e that the funct
b7a0: 69 6f 6e 20 69 73 20 0a 2a 2a 20 64 65 66 69 6e  ion is .** defin
b7b0: 65 64 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ed and that the 
b7c0: 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
b7d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  f arguments are 
b7e0: 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 20 49 66  specified..** If
b7f0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
b800: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
b810: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  nction, then the
b820: 20 4e 43 5f 48 61 73 41 67 67 20 66 6c 61 67 20   NC_HasAgg flag 
b830: 69 73 0a 2a 2a 20 73 65 74 20 61 6e 64 20 74 68  is.** set and th
b840: 65 20 6f 70 63 6f 64 65 20 69 73 20 63 68 61 6e  e opcode is chan
b850: 67 65 64 20 66 72 6f 6d 20 54 4b 5f 46 55 4e 43  ged from TK_FUNC
b860: 54 49 4f 4e 20 74 6f 20 54 4b 5f 41 47 47 5f 46  TION to TK_AGG_F
b870: 55 4e 43 54 49 4f 4e 2e 0a 2a 2a 20 49 66 20 61  UNCTION..** If a
b880: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  n expression con
b890: 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65 20  tains aggregate 
b8a0: 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 74  functions then t
b8b0: 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f  he EP_Agg.** pro
b8c0: 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70  perty on the exp
b8d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 2e 0a  ression is set..
b8e0: 2a 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 6d  **.** An error m
b8f0: 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
b900: 6e 20 70 50 61 72 73 65 20 69 66 20 61 6e 79 74  n pParse if anyt
b910: 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20  hing is amiss.  
b920: 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 69 66  The number.** if
b930: 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72   errors is retur
b940: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
b950: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
b960: 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74  mes( .  NameCont
b970: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20  ext *pNC,       
b980: 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20  /* Namespace to 
b990: 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69  resolve expressi
b9a0: 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70  ons in. */.  Exp
b9b0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
b9c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
b9d0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
b9e0: 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 75  lyzed. */.){.  u
b9f0: 38 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20  8 savedHasAgg;. 
ba00: 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 69 66   Walker w;..  if
ba10: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
ba20: 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49 54  urn 0;.#if SQLIT
ba30: 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
ba40: 3e 30 0a 20 20 7b 0a 20 20 20 20 50 61 72 73 65  >0.  {.    Parse
ba50: 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
ba60: 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66 28 20  pParse;.    if( 
ba70: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
ba80: 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70  Height(pParse, p
ba90: 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 2b 70 4e  Expr->nHeight+pN
baa0: 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67  C->pParse->nHeig
bab0: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ht) ){.      ret
bac0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
bad0: 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74   pParse->nHeight
bae0: 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67   += pExpr->nHeig
baf0: 68 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ht;.  }.#endif. 
bb00: 20 73 61 76 65 64 48 61 73 41 67 67 20 3d 20 70   savedHasAgg = p
bb10: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
bb20: 5f 48 61 73 41 67 67 3b 0a 20 20 70 4e 43 2d 3e  _HasAgg;.  pNC->
bb30: 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 48  ncFlags &= ~NC_H
bb40: 61 73 41 67 67 3b 0a 20 20 6d 65 6d 73 65 74 28  asAgg;.  memset(
bb50: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
bb60: 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
bb70: 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78  back = resolveEx
bb80: 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c  prStep;.  w.xSel
bb90: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65  ectCallback = re
bba0: 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70 3b  solveSelectStep;
bbb0: 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 4e  .  w.pParse = pN
bbc0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77 2e 75  C->pParse;.  w.u
bbd0: 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71  .pNC = pNC;.  sq
bbe0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
bbf0: 2c 20 70 45 78 70 72 29 3b 0a 23 69 66 20 53 51  , pExpr);.#if SQ
bc00: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
bc10: 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61  PTH>0.  pNC->pPa
bc20: 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
bc30: 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a  pExpr->nHeight;.
bc40: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e 43  #endif.  if( pNC
bc50: 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 77 2e 70 50  ->nErr>0 || w.pP
bc60: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
bc70: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
bc80: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
bc90: 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ror);.  }.  if( 
bca0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
bcb0: 43 5f 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20  C_HasAgg ){.    
bcc0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
bcd0: 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a  pExpr, EP_Agg);.
bce0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 61 76 65    }else if( save
bcf0: 64 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 70  dHasAgg ){.    p
bd00: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  NC->ncFlags |= N
bd10: 43 5f 48 61 73 41 67 67 3b 0a 20 20 7d 0a 20 20  C_HasAgg;.  }.  
bd20: 72 65 74 75 72 6e 20 45 78 70 72 48 61 73 50 72  return ExprHasPr
bd30: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
bd40: 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  _Error);.}.../*.
bd50: 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  ** Resolve all n
bd60: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 65 78 70 72  ames in all expr
bd70: 65 73 73 69 6f 6e 73 20 6f 66 20 61 20 53 45 4c  essions of a SEL
bd80: 45 43 54 20 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a  ECT and in all.*
bd90: 2a 20 64 65 63 65 6e 64 65 6e 74 73 20 6f 66 20  * decendents of 
bda0: 74 68 65 20 53 45 4c 45 43 54 2c 20 69 6e 63 6c  the SELECT, incl
bdb0: 75 64 69 6e 67 20 63 6f 6d 70 6f 75 6e 64 73 20  uding compounds 
bdc0: 6f 66 66 20 6f 66 20 70 2d 3e 70 50 72 69 6f 72  off of p->pPrior
bdd0: 2c 0a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  ,.** subqueries 
bde0: 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  in expressions, 
bdf0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 75  and subqueries u
be00: 73 65 64 20 61 73 20 46 52 4f 4d 20 63 6c 61 75  sed as FROM clau
be10: 73 65 0a 2a 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a  se.** terms..**.
be20: 2a 2a 20 53 65 65 20 73 71 6c 69 74 65 33 52 65  ** See sqlite3Re
be30: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
be40: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
be50: 6f 6e 20 6f 66 20 74 68 65 20 6b 69 6e 64 73 20  on of the kinds 
be60: 6f 66 0a 2a 2a 20 74 72 61 6e 73 66 6f 72 6d 61  of.** transforma
be70: 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72  tions that occur
be80: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45  ..**.** All SELE
be90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68  CT statements sh
bea0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 65  ould have been e
beb0: 78 70 61 6e 64 65 64 20 75 73 69 6e 67 0a 2a 2a  xpanded using.**
bec0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
bed0: 70 61 6e 64 28 29 20 70 72 69 6f 72 20 74 6f 20  pand() prior to 
bee0: 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
bef0: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
bf00: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
bf10: 65 63 74 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  ectNames(.  Pars
bf20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
bf30: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
bf40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
bf50: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
bf60: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
bf70: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
bf80: 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
bf90: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
bfa0: 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
bfb0: 6e 74 65 78 74 20 66 6f 72 20 70 61 72 65 6e 74  ntext for parent
bfc0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bfd0: 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  t */.){.  Walker
bfe0: 20 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   w;..  assert( p
bff0: 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  !=0 );.  memset(
c000: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
c010: 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
c020: 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78  back = resolveEx
c030: 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c  prStep;.  w.xSel
c040: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65  ectCallback = re
c050: 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70 3b  solveSelectStep;
c060: 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50  .  w.pParse = pP
c070: 61 72 73 65 3b 0a 20 20 77 2e 75 2e 70 4e 43 20  arse;.  w.u.pNC 
c080: 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20 73 71  = pOuterNC;.  sq
c090: 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
c0a0: 26 77 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  &w, p);.}../*.**
c0b0: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
c0c0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68  n expressions th
c0d0: 61 74 20 63 61 6e 20 6f 6e 6c 79 20 72 65 66 65  at can only refe
c0e0: 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 74  rence a single t
c0f0: 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  able:.**.**    *
c100: 20 20 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61     CHECK constra
c110: 69 6e 74 73 0a 2a 2a 20 20 20 20 2a 20 20 20 57  ints.**    *   W
c120: 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f 6e 20  HERE clauses on 
c130: 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 0a  partial indices.
c140: 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69  **.** The Expr.i
c150: 54 61 62 6c 65 20 76 61 6c 75 65 20 66 6f 72 20  Table value for 
c160: 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  Expr.op==TK_COLU
c170: 4d 4e 20 6e 6f 64 65 73 20 6f 66 20 74 68 65 20  MN nodes of the 
c180: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
c190: 20 73 65 74 20 74 6f 20 2d 31 20 61 6e 64 20 74   set to -1 and t
c1a0: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
c1b0: 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
c1c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
c1d0: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 72 72  r..**.** Any err
c1e0: 6f 72 73 20 63 61 75 73 65 20 61 6e 20 65 72 72  ors cause an err
c1f0: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 62 65  or message to be
c200: 20 73 65 74 20 69 6e 20 70 50 61 72 73 65 2e 0a   set in pParse..
c210: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
c220: 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65  esolveSelfRefere
c230: 6e 63 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nce(.  Parse *pP
c240: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61  arse,      /* Pa
c250: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c260: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
c270: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
c280: 62 6c 65 20 62 65 69 6e 67 20 72 65 66 65 72 65  ble being refere
c290: 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 79  nced */.  int ty
c2a0: 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  pe,           /*
c2b0: 20 4e 43 5f 49 73 43 68 65 63 6b 20 6f 72 20 4e   NC_IsCheck or N
c2c0: 43 5f 50 61 72 74 49 64 78 20 2a 2f 0a 20 20 45  C_PartIdx */.  E
c2d0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
c2e0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
c2f0: 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20 20 4d 61   to resolve.  Ma
c300: 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  y be NULL. */.  
c310: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
c320: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
c330: 6e 20 6c 69 73 74 20 74 6f 20 72 65 73 6f 6c 76  n list to resolv
c340: 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 2e 20  e.  May be NUL. 
c350: 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74 20  */.){.  SrcList 
c360: 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  sSrc;           
c370: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
c380: 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72  SrcList for pPar
c390: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
c3a0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
c3b0: 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  NC;             
c3c0: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
c3d0: 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70  xt for pParse->p
c3e0: 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  NewTable */.  in
c3f0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c410: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
c420: 0a 0a 20 20 61 73 73 65 72 74 28 20 74 79 70 65  ..  assert( type
c430: 3d 3d 4e 43 5f 49 73 43 68 65 63 6b 20 7c 7c 20  ==NC_IsCheck || 
c440: 74 79 70 65 3d 3d 4e 43 5f 50 61 72 74 49 64 78  type==NC_PartIdx
c450: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   );.  memset(&sN
c460: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
c470: 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  ));.  memset(&sS
c480: 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rc, 0, sizeof(sS
c490: 72 63 29 29 3b 0a 20 20 73 53 72 63 2e 6e 53 72  rc));.  sSrc.nSr
c4a0: 63 20 3d 20 31 3b 0a 20 20 73 53 72 63 2e 61 5b  c = 1;.  sSrc.a[
c4b0: 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  0].zName = pTab-
c4c0: 3e 7a 4e 61 6d 65 3b 0a 20 20 73 53 72 63 2e 61  >zName;.  sSrc.a
c4d0: 5b 30 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 3b  [0].pTab = pTab;
c4e0: 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75  .  sSrc.a[0].iCu
c4f0: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 73 4e 43  rsor = -1;.  sNC
c500: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
c510: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
c520: 20 3d 20 26 73 53 72 63 3b 0a 20 20 73 4e 43 2e   = &sSrc;.  sNC.
c530: 6e 63 46 6c 61 67 73 20 3d 20 74 79 70 65 3b 0a  ncFlags = type;.
c540: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
c550: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
c560: 4e 43 2c 20 70 45 78 70 72 29 20 29 20 72 65 74  NC, pExpr) ) ret
c570: 75 72 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  urn;.  if( pList
c580: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
c590: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
c5a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
c5b0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
c5c0: 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  xprNames(&sNC, p
c5d0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c5e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
c5f0: 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  urn;.      }.   
c600: 20 7d 0a 20 20 7d 0a 7d 0a                        }.  }.}.