/ Hex Artifact Content
Login

Artifact f2ef256786a6435efddd64a632fea89c8be62215:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 18.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 77  tines used for w
01a0: 61 6c 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65  alking the parse
01b0: 72 20 74 72 65 65 20 61 6e 64 0a 2a 2a 20 72 65  r tree and.** re
01c0: 73 6f 6c 76 65 20 61 6c 6c 20 69 64 65 6e 74 69  solve all identi
01d0: 66 69 65 72 73 20 62 79 20 61 73 73 6f 63 69 61  fiers by associa
01e0: 74 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 61  ting them with a
01f0: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 74   particular.** t
0200: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
0210: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0220: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
0230: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0240: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0250: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  h>../*.** Walk t
0260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
0270: 65 65 20 70 45 78 70 72 20 61 6e 64 20 69 6e 63  ee pExpr and inc
0280: 72 65 61 73 65 20 74 68 65 20 61 67 67 72 65 67  rease the aggreg
0290: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
02a0: 64 65 70 74 68 20 28 74 68 65 20 45 78 70 72 2e  depth (the Expr.
02b0: 6f 70 32 20 66 69 65 6c 64 29 20 62 79 20 4e 20  op2 field) by N 
02c0: 6f 6e 20 65 76 65 72 79 20 54 4b 5f 41 47 47 5f  on every TK_AGG_
02d0: 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 2e 0a 2a  FUNCTION node..*
02e0: 2a 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  * This needs to 
02f0: 6f 63 63 75 72 20 77 68 65 6e 20 63 6f 70 79 69  occur when copyi
0300: 6e 67 20 61 20 54 4b 5f 41 47 47 5f 46 55 4e 43  ng a TK_AGG_FUNC
0310: 54 49 4f 4e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  TION node from a
0320: 6e 0a 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79  n.** outer query
0330: 20 69 6e 74 6f 20 61 6e 20 69 6e 6e 65 72 20 73   into an inner s
0340: 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 69  ubquery..**.** i
0350: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0360: 70 74 68 28 70 45 78 70 72 2c 6e 29 20 69 73 20  pth(pExpr,n) is 
0370: 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65  the main routine
0380: 2e 20 20 69 6e 63 72 41 67 67 44 65 70 74 68 28  .  incrAggDepth(
0390: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 68 65 6c 70  ..).** is a help
03a0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 2d 20 61 20  er function - a 
03b0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
03c0: 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2f   tree walker..*/
03d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
03e0: 41 67 67 44 65 70 74 68 28 57 61 6c 6b 65 72 20  AggDepth(Walker 
03f0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
0400: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
0410: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
0420: 46 55 4e 43 54 49 4f 4e 20 29 20 70 45 78 70 72  FUNCTION ) pExpr
0430: 2d 3e 6f 70 32 20 2b 3d 20 70 57 61 6c 6b 65 72  ->op2 += pWalker
0440: 2d 3e 75 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20  ->u.n;.  return 
0450: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
0460: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72  static void incr
0470: 41 67 67 46 75 6e 63 74 69 6f 6e 44 65 70 74 68  AggFunctionDepth
0480: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
0490: 74 20 4e 29 7b 0a 20 20 69 66 28 20 4e 3e 30 20  t N){.  if( N>0 
04a0: 29 7b 0a 20 20 20 20 57 61 6c 6b 65 72 20 77 3b  ){.    Walker w;
04b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  .    memset(&w, 
04c0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
04d0: 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61     w.xExprCallba
04e0: 63 6b 20 3d 20 69 6e 63 72 41 67 67 44 65 70 74  ck = incrAggDept
04f0: 68 3b 0a 20 20 20 20 77 2e 75 2e 6e 20 3d 20 4e  h;.    w.u.n = N
0500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
0510: 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
0520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
0530: 75 72 6e 20 74 68 65 20 70 45 78 70 72 20 65 78  urn the pExpr ex
0540: 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 6e  pression into an
0550: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 69   alias for the i
0560: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
0570: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 73   the.** result s
0580: 65 74 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2a  et in pEList..**
0590: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 73 75 6c  .** If the resul
05a0: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 20 69 73 20  t set column is 
05b0: 61 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20  a simple column 
05c0: 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65 6e 20  reference, then 
05d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
05e0: 6d 61 6b 65 73 20 61 6e 20 65 78 61 63 74 20 63  makes an exact c
05f0: 6f 70 79 2e 20 20 42 75 74 20 66 6f 72 20 61 6e  opy.  But for an
0600: 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20  y other kind of 
0610: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 69 73  expression, this
0620: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  .** routine make
0630: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72   a copy of the r
0640: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
0650: 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
0660: 20 74 6f 20 74 68 65 0a 2a 2a 20 54 4b 5f 41 53   to the.** TK_AS
0670: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
0680: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63  TK_AS operator c
0690: 61 75 73 65 73 20 74 68 65 20 65 78 70 72 65 73  auses the expres
06a0: 73 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20 65 76  sion to be.** ev
06b0: 61 6c 75 61 74 65 64 20 6a 75 73 74 20 6f 6e 63  aluated just onc
06c0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  e and then reuse
06d0: 64 20 66 6f 72 20 65 61 63 68 20 61 6c 69 61 73  d for each alias
06e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 61 73  ..**.** The reas
06f0: 6f 6e 20 66 6f 72 20 73 75 70 70 72 65 73 73 69  on for suppressi
0700: 6e 67 20 74 68 65 20 54 4b 5f 41 53 20 74 65 72  ng the TK_AS ter
0710: 6d 20 77 68 65 6e 20 74 68 65 20 65 78 70 72 65  m when the expre
0720: 73 73 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c  ssion is a simpl
0730: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65 66 65  e.** column refe
0740: 72 65 6e 63 65 20 69 73 20 73 6f 20 74 68 61 74  rence is so that
0750: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65   the column refe
0760: 72 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 72 65  rence will be re
0770: 63 6f 67 6e 69 7a 65 64 20 61 73 0a 2a 2a 20 75  cognized as.** u
0780: 73 61 62 6c 65 20 62 79 20 69 6e 64 69 63 65 73  sable by indices
0790: 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
07a0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
07b0: 69 6e 67 20 6c 6f 67 69 63 2e 20 0a 2a 2a 0a 2a  ing logic. .**.*
07c0: 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72  * The TK_AS oper
07d0: 61 74 6f 72 20 69 73 20 69 6e 68 69 62 69 74 65  ator is inhibite
07e0: 64 20 69 66 20 7a 54 79 70 65 5b 30 5d 3d 3d 27  d if zType[0]=='
07f0: 47 27 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 0a  G'.  This means.
0800: 2a 2a 20 74 68 61 74 20 69 6e 20 61 20 47 52 4f  ** that in a GRO
0810: 55 50 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  UP BY clause, th
0820: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
0830: 65 76 61 6c 75 61 74 65 64 20 74 77 69 63 65 2e  evaluated twice.
0840: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
0850: 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d     SELECT random
0860: 28 29 25 35 20 41 53 20 78 2c 20 63 6f 75 6e 74  ()%5 AS x, count
0870: 28 2a 29 20 46 52 4f 4d 20 74 61 62 20 47 52 4f  (*) FROM tab GRO
0880: 55 50 20 42 59 20 78 0a 2a 2a 0a 2a 2a 20 49 73  UP BY x.**.** Is
0890: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
08a0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
08b0: 20 72 61 6e 64 6f 6d 28 29 25 35 20 41 53 20 78   random()%5 AS x
08c0: 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
08d0: 74 61 62 20 47 52 4f 55 50 20 42 59 20 72 61 6e  tab GROUP BY ran
08e0: 64 6f 6d 28 29 25 35 0a 2a 2a 0a 2a 2a 20 54 68  dom()%5.**.** Th
08f0: 65 20 72 65 73 75 6c 74 20 6f 66 20 72 61 6e 64  e result of rand
0900: 6f 6d 28 29 25 35 20 69 6e 20 74 68 65 20 47 52  om()%5 in the GR
0910: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
0920: 20 70 72 6f 62 61 62 6c 79 20 64 69 66 66 65 72   probably differ
0930: 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ent.** from the 
0940: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 72 65  result in the re
0950: 73 75 6c 74 2d 73 65 74 2e 20 20 4f 6e 20 74 68  sult-set.  On th
0960: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 53 74 61  e other hand Sta
0970: 6e 64 61 72 64 20 53 51 4c 20 64 6f 65 73 0a 2a  ndard SQL does.*
0980: 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  * not allow the 
0990: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
09a0: 74 6f 20 63 6f 6e 74 61 69 6e 20 72 65 66 65 72  to contain refer
09b0: 65 6e 63 65 73 20 74 6f 20 72 65 73 75 6c 74 2d  ences to result-
09c0: 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20  set columns..** 
09d0: 53 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  So this should n
09e0: 65 76 65 72 20 63 6f 6d 65 20 75 70 20 69 6e 20  ever come up in 
09f0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 71 75 65 72  well-formed quer
0a00: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ies..**.** If th
0a10: 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 66  e reference is f
0a20: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 4f 4c  ollowed by a COL
0a30: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20 74  LATE operator, t
0a40: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 2a 2a  hen make sure.**
0a50: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
0a60: 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 72 76  rator is preserv
0a70: 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
0a80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
0a90: 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d  CT a+b, c+d FROM
0aa0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 43   t1 ORDER BY 1 C
0ab0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a 2a  OLLATE nocase;.*
0ac0: 2a 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20 74  *.** Should be t
0ad0: 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
0af0: 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d 20  T a+b, c+d FROM 
0b00: 74 31 20 4f 52 44 45 52 20 42 59 20 28 61 2b 62  t1 ORDER BY (a+b
0b10: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
0b20: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 53 75 62  ;.**.** The nSub
0b30: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
0b40: 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d 61  specifies how ma
0b50: 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 62  ny levels of sub
0b60: 71 75 65 72 79 20 74 68 65 0a 2a 2a 20 61 6c 69  query the.** ali
0b70: 61 73 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  as is removed fr
0b80: 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
0b90: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
0ba0: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 69 73 0a   usual value is.
0bb0: 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74 20 6d  ** zero but it m
0bc0: 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69 66 20  ight be more if 
0bd0: 74 68 65 20 61 6c 69 61 73 20 69 73 20 63 6f 6e  the alias is con
0be0: 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20  tained within a 
0bf0: 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66 20 74  subquery.** of t
0c00: 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70 72  he original expr
0c10: 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45 78 70  ession.  The Exp
0c20: 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66 20 54  r.op2 field of T
0c30: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 0a 2a  K_AGG_FUNCTION.*
0c40: 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d 75 73  * structures mus
0c50: 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  t be increased b
0c60: 79 20 74 68 65 20 6e 53 75 62 71 75 65 72 79 20  y the nSubquery 
0c70: 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  amount..*/.stati
0c80: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 41 6c  c void resolveAl
0c90: 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ias(.  Parse *pP
0ca0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
0cb0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
0cc0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
0cd0: 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a 20  pEList,      /* 
0ce0: 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  A result set */.
0cf0: 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
0d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f           /* A co
0d10: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
0d20: 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45 4c 69  lt set.  0..pELi
0d30: 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f 0a 20  st->nExpr-1 */. 
0d40: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
0d50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73          /* Trans
0d60: 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f 20 61  form this into a
0d70: 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20 72  n alias to the r
0d80: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 63  esult set */.  c
0d90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
0da0: 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55 50 22  ,     /* "GROUP"
0db0: 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22   or "ORDER" or "
0dc0: 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 71  " */.  int nSubq
0dd0: 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a  uery          /*
0de0: 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 71 75   Number of subqu
0df0: 65 72 69 65 73 20 74 68 61 74 20 74 68 65 20 6c  eries that the l
0e00: 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67 20 2a  abel is moving *
0e10: 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4f 72  /.){.  Expr *pOr
0e20: 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ig;           /*
0e30: 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c   The iCol-th col
0e40: 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c  umn of the resul
0e50: 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72 20  t set */.  Expr 
0e60: 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20 20  *pDup;          
0e70: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 4f 72    /* Copy of pOr
0e80: 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ig */.  sqlite3 
0e90: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f  *db;           /
0ea0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
0eb0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  onnection */..  
0ec0: 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30 20  assert( iCol>=0 
0ed0: 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74 2d 3e  && iCol<pEList->
0ee0: 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72 69 67  nExpr );.  pOrig
0ef0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f   = pEList->a[iCo
0f00: 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73 65  l].pExpr;.  asse
0f10: 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29 3b 0a  rt( pOrig!=0 );.
0f20: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
0f30: 62 3b 0a 20 20 70 44 75 70 20 3d 20 73 71 6c 69  b;.  pDup = sqli
0f40: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
0f50: 4f 72 69 67 2c 20 30 29 3b 0a 20 20 69 66 28 20  Orig, 0);.  if( 
0f60: 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  pDup==0 ) return
0f70: 3b 0a 20 20 69 66 28 20 70 4f 72 69 67 2d 3e 6f  ;.  if( pOrig->o
0f80: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p!=TK_COLUMN && 
0f90: 7a 54 79 70 65 5b 30 5d 21 3d 27 47 27 20 29 7b  zType[0]!='G' ){
0fa0: 0a 20 20 20 20 69 6e 63 72 41 67 67 46 75 6e 63  .    incrAggFunc
0fb0: 74 69 6f 6e 44 65 70 74 68 28 70 44 75 70 2c 20  tionDepth(pDup, 
0fc0: 6e 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  nSubquery);.    
0fd0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 50 45  pDup = sqlite3PE
0fe0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 41  xpr(pParse, TK_A
0ff0: 53 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a  S, pDup, 0, 0);.
1000: 20 20 20 20 69 66 28 20 70 44 75 70 3d 3d 30 20      if( pDup==0 
1010: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 45 78  ) return;.    Ex
1020: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 44  prSetProperty(pD
1030: 75 70 2c 20 45 50 5f 53 6b 69 70 29 3b 0a 20 20  up, EP_Skip);.  
1040: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 61 5b    if( pEList->a[
1050: 69 43 6f 6c 5d 2e 75 2e 78 2e 69 41 6c 69 61 73  iCol].u.x.iAlias
1060: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 4c  ==0 ){.      pEL
1070: 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 75 2e 78  ist->a[iCol].u.x
1080: 2e 69 41 6c 69 61 73 20 3d 20 28 75 31 36 29 28  .iAlias = (u16)(
1090: 2b 2b 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73  ++pParse->nAlias
10a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 75  );.    }.    pDu
10b0: 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 4c 69  p->iTable = pELi
10c0: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 75 2e 78 2e  st->a[iCol].u.x.
10d0: 69 41 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 69 66  iAlias;.  }.  if
10e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
10f0: 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 70  COLLATE ){.    p
1100: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
1110: 72 41 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e  rAddCollateStrin
1120: 67 28 70 50 61 72 73 65 2c 20 70 44 75 70 2c 20  g(pParse, pDup, 
1130: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
1140: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f  ;.  }..  /* Befo
1150: 72 65 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  re calling sqlit
1160: 65 33 45 78 70 72 44 65 6c 65 74 65 28 29 2c 20  e3ExprDelete(), 
1170: 73 65 74 20 74 68 65 20 45 50 5f 53 74 61 74 69  set the EP_Stati
1180: 63 20 66 6c 61 67 2e 20 54 68 69 73 20 0a 20 20  c flag. This .  
1190: 2a 2a 20 70 72 65 76 65 6e 74 73 20 45 78 70 72  ** prevents Expr
11a0: 44 65 6c 65 74 65 28 29 20 66 72 6f 6d 20 64 65  Delete() from de
11b0: 6c 65 74 69 6e 67 20 74 68 65 20 45 78 70 72 20  leting the Expr 
11c0: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
11d0: 2c 0a 20 20 2a 2a 20 61 6c 6c 6f 77 69 6e 67 20  ,.  ** allowing 
11e0: 69 74 20 74 6f 20 62 65 20 72 65 70 6f 70 75 6c  it to be repopul
11f0: 61 74 65 64 20 62 79 20 74 68 65 20 6d 65 6d 63  ated by the memc
1200: 70 79 28 29 20 6f 6e 20 74 68 65 20 66 6f 6c 6c  py() on the foll
1210: 6f 77 69 6e 67 20 6c 69 6e 65 2e 0a 20 20 2a 2a  owing line..  **
1220: 20 54 68 65 20 70 45 78 70 72 2d 3e 75 2e 7a 54   The pExpr->u.zT
1230: 6f 6b 65 6e 20 6d 69 67 68 74 20 70 6f 69 6e 74  oken might point
1240: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61   into memory tha
1250: 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20  t will be freed 
1260: 62 79 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  by the.  ** sqli
1270: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
1280: 75 70 29 20 6f 6e 20 74 68 65 20 6c 61 73 74 20  up) on the last 
1290: 6c 69 6e 65 20 6f 66 20 74 68 69 73 20 62 6c 6f  line of this blo
12a0: 63 6b 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74  ck, so be sure t
12b0: 6f 0a 20 20 2a 2a 20 6d 61 6b 65 20 61 20 63 6f  o.  ** make a co
12c0: 70 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20  py of the token 
12d0: 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 65  before doing the
12e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
12f0: 2e 0a 20 20 2a 2f 0a 20 20 45 78 70 72 53 65 74  ..  */.  ExprSet
1300: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
1310: 45 50 5f 53 74 61 74 69 63 29 3b 0a 20 20 73 71  EP_Static);.  sq
1320: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1330: 64 62 2c 20 70 45 78 70 72 29 3b 0a 20 20 6d 65  db, pExpr);.  me
1340: 6d 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70  mcpy(pExpr, pDup
1350: 2c 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29  , sizeof(*pExpr)
1360: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
1370: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
1380: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
1390: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
13a0: 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  !=0 ){.    asser
13b0: 74 28 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73  t( (pExpr->flags
13c0: 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45   & (EP_Reduced|E
13d0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30  P_TokenOnly))==0
13e0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 75   );.    pExpr->u
13f0: 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65  .zToken = sqlite
1400: 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45  3DbStrDup(db, pE
1410: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1420: 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73      pExpr->flags
1430: 20 7c 3d 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 3b   |= EP_MemToken;
1440: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
1450: 46 72 65 65 28 64 62 2c 20 70 44 75 70 29 3b 0a  Free(db, pDup);.
1460: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
1470: 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
1480: 65 20 7a 43 6f 6c 20 6f 63 63 75 72 73 20 61 6e  e zCol occurs an
1490: 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 55 53  ywhere in the US
14a0: 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a  ING clause..**.*
14b0: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
14c0: 66 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75  f the USING clau
14d0: 73 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66  se is NULL or if
14e0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   it does not con
14f0: 74 61 69 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a 2f  tain.** zCol..*/
1500: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
1510: 49 6e 55 73 69 6e 67 43 6c 61 75 73 65 28 49 64  InUsingClause(Id
1520: 4c 69 73 74 20 2a 70 55 73 69 6e 67 2c 20 63 6f  List *pUsing, co
1530: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b  nst char *zCol){
1540: 0a 20 20 69 66 28 20 70 55 73 69 6e 67 20 29 7b  .  if( pUsing ){
1550: 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20  .    int k;.    
1560: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e  for(k=0; k<pUsin
1570: 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20  g->nId; k++){.  
1580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1590: 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61  trICmp(pUsing->a
15a0: 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  [k].zName, zCol)
15b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
15c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
15d0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn 0;.}../*.** S
15e0: 75 62 71 75 65 72 69 65 73 20 73 74 6f 72 65 73  ubqueries stores
15f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1600: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
1610: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66  d column names f
1620: 6f 72 20 74 68 65 69 72 0a 2a 2a 20 72 65 73 75  or their.** resu
1630: 6c 74 20 73 65 74 73 20 69 6e 20 45 78 70 72 4c  lt sets in ExprL
1640: 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 2c 20 69  ist.a[].zSpan, i
1650: 6e 20 74 68 65 20 66 6f 72 6d 20 22 44 41 54 41  n the form "DATA
1660: 42 41 53 45 2e 54 41 42 4c 45 2e 43 4f 4c 55 4d  BASE.TABLE.COLUM
1670: 4e 22 2e 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  N"..** Check to 
1680: 73 65 65 20 69 66 20 74 68 65 20 7a 53 70 61 6e  see if the zSpan
1690: 20 67 69 76 65 6e 20 74 6f 20 74 68 69 73 20 72   given to this r
16a0: 6f 75 74 69 6e 65 20 6d 61 74 63 68 65 73 20 74  outine matches t
16b0: 68 65 20 7a 44 62 2c 20 7a 54 61 62 2c 0a 2a 2a  he zDb, zTab,.**
16c0: 20 61 6e 64 20 7a 43 6f 6c 2e 20 20 49 66 20 61   and zCol.  If a
16d0: 6e 79 20 6f 66 20 7a 44 62 2c 20 7a 54 61 62 2c  ny of zDb, zTab,
16e0: 20 61 6e 64 20 7a 43 6f 6c 20 61 72 65 20 4e 55   and zCol are NU
16f0: 4c 4c 20 74 68 65 6e 20 74 68 6f 73 65 20 66 69  LL then those fi
1700: 65 6c 64 73 20 77 69 6c 6c 0a 2a 2a 20 6d 61 74  elds will.** mat
1710: 63 68 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2f 0a  ch anything..*/.
1720: 69 6e 74 20 73 71 6c 69 74 65 33 4d 61 74 63 68  int sqlite3Match
1730: 53 70 61 6e 4e 61 6d 65 28 0a 20 20 63 6f 6e 73  SpanName(.  cons
1740: 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 2c 0a 20  t char *zSpan,. 
1750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1760: 6c 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l,.  const char 
1770: 2a 7a 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63  *zTab,.  const c
1780: 68 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20 69 6e  har *zDb.){.  in
1790: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
17a0: 41 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29  ALWAYS(zSpan[n])
17b0: 20 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e   && zSpan[n]!='.
17c0: 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; n++){}.  if( 
17d0: 7a 44 62 20 26 26 20 28 73 71 6c 69 74 65 33 53  zDb && (sqlite3S
17e0: 74 72 4e 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a  trNICmp(zSpan, z
17f0: 44 62 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 44 62  Db, n)!=0 || zDb
1800: 5b 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 72  [n]!=0) ){.    r
1810: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
1820: 53 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 66  Span += n+1;.  f
1830: 6f 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a  or(n=0; ALWAYS(z
1840: 53 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61  Span[n]) && zSpa
1850: 6e 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b  n[n]!='.'; n++){
1860: 7d 0a 20 20 69 66 28 20 7a 54 61 62 20 26 26 20  }.  if( zTab && 
1870: 28 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70  (sqlite3StrNICmp
1880: 28 7a 53 70 61 6e 2c 20 7a 54 61 62 2c 20 6e 29  (zSpan, zTab, n)
1890: 21 3d 30 20 7c 7c 20 7a 54 61 62 5b 6e 5d 21 3d  !=0 || zTab[n]!=
18a0: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
18b0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20   0;.  }.  zSpan 
18c0: 2b 3d 20 6e 2b 31 3b 0a 20 20 69 66 28 20 7a 43  += n+1;.  if( zC
18d0: 6f 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  ol && sqlite3Str
18e0: 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 43 6f 6c  ICmp(zSpan, zCol
18f0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
1900: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1910: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 1;.}../*.** G
1920: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1930: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65   a column of the
1940: 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59   form X.Y.Z or Y
1950: 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f  .Z or just Z, lo
1960: 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61  ok up.** that na
1970: 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66  me in the set of
1980: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69   source tables i
1990: 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d  n pSrcList and m
19a0: 61 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a  ake the pExpr .*
19b0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  * expression nod
19c0: 65 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20  e refer back to 
19d0: 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75  that source colu
19e0: 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  mn.  The followi
19f0: 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ng changes.** ar
1a00: 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a  e made to pExpr:
1a10: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  .**.**    pExpr-
1a20: 3e 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53  >iDb           S
1a30: 65 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  et the index in 
1a40: 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65  db->aDb[] of the
1a50: 20 64 61 74 61 62 61 73 65 20 58 0a 2a 2a 20 20   database X.**  
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 28 65 76 65 6e 20 69 66 20         (even if 
1a80: 58 20 69 73 20 69 6d 70 6c 69 65 64 29 2e 0a 2a  X is implied)..*
1a90: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  *    pExpr->iTab
1aa0: 6c 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f  le        Set to
1ab0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
1ac0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
1ad0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20   obtained.**    
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69       from pSrcLi
1b00: 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  st..**    pExpr-
1b10: 3e 70 54 61 62 20 20 20 20 20 20 20 20 20 20 50  >pTab          P
1b20: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62  oints to the Tab
1b30: 6c 65 20 73 74 72 75 63 74 75 72 65 20 6f 66 20  le structure of 
1b40: 58 2e 59 20 28 65 76 65 6e 20 69 66 0a 2a 2a 20  X.Y (even if.** 
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 58 20 61 6e 64 2f 6f 72          X and/or
1b70: 20 59 20 61 72 65 20 69 6d 70 6c 69 65 64 2e 29   Y are implied.)
1b80: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .**    pExpr->iC
1b90: 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20  olumn       Set 
1ba0: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  to the column nu
1bb0: 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65 20  mber within the 
1bc0: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
1bd0: 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
1be0: 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55    Set to TK_COLU
1bf0: 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  MN..**    pExpr-
1c00: 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20 41  >pLeft         A
1c10: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  ny expression th
1c20: 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20  is points to is 
1c30: 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45  deleted.**    pE
1c40: 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20  xpr->pRight     
1c50: 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f     Any expressio
1c60: 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f  n this points to
1c70: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
1c80: 2a 2a 20 54 68 65 20 7a 44 62 20 76 61 72 69 61  ** The zDb varia
1c90: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
1ca0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1cb0: 28 74 68 65 20 22 58 22 29 2e 20 20 54 68 69 73  (the "X").  This
1cc0: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a   value may be.**
1cd0: 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68   NULL meaning th
1ce0: 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68  at name is of th
1cf0: 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e  e form Y.Z or Z.
1d00: 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20    Any available 
1d10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20  database.** can 
1d20: 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 7a 54  be used.  The zT
1d30: 61 62 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73  able variable is
1d40: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1d50: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
1d60: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
1d70: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
1d80: 7a 44 62 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  zDb is also NULL
1d90: 2e 20 20 49 66 20 7a 54 61 62 6c 65 20 69 73 20  .  If zTable is 
1da0: 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  NULL it.** means
1db0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f   that the form o
1dc0: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20  f the name is Z 
1dd0: 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73  and that columns
1de0: 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a   from any table.
1df0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  ** can be used..
1e00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d  **.** If the nam
1e10: 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f  e cannot be reso
1e20: 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73  lved unambiguous
1e30: 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ly, leave an err
1e40: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
1e50: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
1e60: 72 6e 20 57 52 43 5f 41 62 6f 72 74 2e 20 20 52  rn WRC_Abort.  R
1e70: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 20  eturn WRC_Prune 
1e80: 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73  on success..*/.s
1e90: 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70  tatic int lookup
1ea0: 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70  Name(.  Parse *p
1eb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
1ec0: 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1ed0: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
1ee0: 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 2f 2a  har *zDb,     /*
1ef0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
1f00: 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
1f10: 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20   table, or NULL 
1f20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1f30: 2a 7a 54 61 62 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zTab,    /* Nam
1f40: 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61  e of table conta
1f50: 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72  ining column, or
1f60: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
1f70: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20   char *zCol,    
1f80: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
1f90: 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65  olumn. */.  Name
1fa0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
1fb0: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e   /* The name con
1fc0: 74 65 78 74 20 75 73 65 64 20 74 6f 20 72 65 73  text used to res
1fd0: 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f  olve the name */
1fe0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
1ff0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
2000: 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70  this EXPR node p
2010: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65  oint to the sele
2020: 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29  cted column */.)
2030: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2060: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
2070: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2090: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
20a0: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  ing column names
20b0: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62   */.  int cntTab
20c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
20d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20e0: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61  r of matching ta
20f0: 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  ble names */.  i
2100: 6e 74 20 6e 53 75 62 71 75 65 72 79 20 3d 20 30  nt nSubquery = 0
2110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2120: 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 6c 65 76   /* How many lev
2130: 65 6c 73 20 6f 66 20 73 75 62 71 75 65 72 79 20  els of subquery 
2140: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
2150: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
2160: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
2170: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2180: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  n */.  struct Sr
2190: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
21a0: 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20  m;       /* Use 
21b0: 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  for looping over
21c0: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20   pSrcList items 
21d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
21e0: 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68  ist_item *pMatch
21f0: 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61   = 0;  /* The ma
2200: 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20  tching pSrcList 
2210: 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  item */.  NameCo
2220: 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20  ntext *pTopNC = 
2230: 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  pNC;        /* F
2240: 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74  irst namecontext
2250: 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a   in the list */.
2260: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
2270: 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  a = 0;          
2280: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
2290: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
22a0: 2a 2f 0a 20 20 69 6e 74 20 69 73 54 72 69 67 67  */.  int isTrigg
22b0: 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  er = 0;         
22c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
22d0: 66 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20  f resolved to a 
22e0: 74 72 69 67 67 65 72 20 63 6f 6c 75 6d 6e 20 2a  trigger column *
22f0: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
2300: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2310: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68        /* Table h
2320: 6f 6c 64 20 74 68 65 20 72 6f 77 20 2a 2f 0a 20  old the row */. 
2330: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 20 20   Column *pCol;  
2340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2350: 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6f     /* A column o
2360: 66 20 70 54 61 62 20 2a 2f 0a 0a 20 20 61 73 73  f pTab */..  ass
2370: 65 72 74 28 20 70 4e 43 20 29 3b 20 20 20 20 20  ert( pNC );     
2380: 2f 2a 20 74 68 65 20 6e 61 6d 65 20 63 6f 6e 74  /* the name cont
2390: 65 78 74 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  ext cannot be NU
23a0: 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  LL. */.  assert(
23b0: 20 7a 43 6f 6c 20 29 3b 20 20 20 20 2f 2a 20 54   zCol );    /* T
23c0: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
23d0: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
23e0: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
23f0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
2400: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
2410: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 0a 20  P_Reduced) );.. 
2420: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
2430: 68 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d 6d 61  he node to no-ma
2440: 74 63 68 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e  tch */.  pExpr->
2450: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 70  iTable = -1;.  p
2460: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  Expr->pTab = 0;.
2470: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
2480: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
2490: 6f 52 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a 20  oReduce);..  /* 
24a0: 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 73 63  Translate the sc
24b0: 68 65 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44 62  hema name in zDb
24c0: 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
24d0: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
24e0: 64 69 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d 61  ding.  ** schema
24f0: 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  .  If not found,
2500: 20 70 53 63 68 65 6d 61 20 77 69 6c 6c 20 72 65   pSchema will re
2510: 6d 61 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e 6f  main NULL and no
2520: 74 68 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63 68  thing will match
2530: 0a 20 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20  .  ** resulting 
2540: 69 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  in an appropriat
2550: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2560: 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 20 6f  toward the end o
2570: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  f this routine. 
2580: 20 2a 2f 0a 20 20 69 66 28 20 7a 44 62 20 29 7b   */.  if( zDb ){
2590: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
25a0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
25b0: 5f 50 61 72 74 49 64 78 20 29 3b 0a 20 20 20 20  _PartIdx );.    
25c0: 74 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e  testcase( pNC->n
25d0: 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68  cFlags & NC_IsCh
25e0: 65 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 28  eck );.    if( (
25f0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28  pNC->ncFlags & (
2600: 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 73  NC_PartIdx|NC_Is
2610: 43 68 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20 20  Check))!=0 ){.  
2620: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
2630: 69 67 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20  ignore database 
2640: 71 75 61 6c 69 66 69 65 72 73 20 69 6e 73 69 64  qualifiers insid
2650: 65 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  e CHECK constrai
2660: 6e 74 73 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  nts and.      **
2670: 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73   partial indices
2680: 2e 20 20 44 6f 20 6e 6f 74 20 72 61 69 73 65 20  .  Do not raise 
2690: 65 72 72 6f 72 73 20 62 65 63 61 75 73 65 20 74  errors because t
26a0: 68 61 74 20 6d 69 67 68 74 20 62 72 65 61 6b 0a  hat might break.
26b0: 20 20 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20        ** legacy 
26c0: 61 6e 64 20 62 65 63 61 75 73 65 20 69 74 20 64  and because it d
26d0: 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 61 6e 79  oes not hurt any
26e0: 74 68 69 6e 67 20 74 6f 20 6a 75 73 74 20 69 67  thing to just ig
26f0: 6e 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a  nore the.      *
2700: 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  * database name.
2710: 20 2a 2f 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   */.      zDb = 
2720: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
2730: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
2740: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2750: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
2760: 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 20 29  ->aDb[i].zName )
2770: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
2780: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
2790: 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 44  >aDb[i].zName,zD
27a0: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
27b0: 20 20 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d     pSchema = db-
27c0: 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b  >aDb[i].pSchema;
27d0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
27e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2800: 20 2f 2a 20 53 74 61 72 74 20 61 74 20 74 68 65   /* Start at the
2810: 20 69 6e 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e 74   inner-most cont
2820: 65 78 74 20 61 6e 64 20 6d 6f 76 65 20 6f 75 74  ext and move out
2830: 77 61 72 64 20 75 6e 74 69 6c 20 61 20 6d 61 74  ward until a mat
2840: 63 68 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20  ch is found */. 
2850: 20 77 68 69 6c 65 28 20 70 4e 43 20 26 26 20 63   while( pNC && c
2860: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70  nt==0 ){.    Exp
2870: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
2880: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
2890: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
28a0: 4c 69 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70  List;..    if( p
28b0: 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  SrcList ){.     
28c0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
28d0: 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  pSrcList->a; i<p
28e0: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
28f0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
2900: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 49 74        pTab = pIt
2910: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
2920: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
2930: 30 20 26 26 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  0 && pTab->zName
2940: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
2950: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
2960: 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  l>0 );.        i
2970: 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
2980: 74 20 26 26 20 28 70 49 74 65 6d 2d 3e 70 53 65  t && (pItem->pSe
2990: 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26  lect->selFlags &
29a0: 20 53 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21   SF_NestedFrom)!
29b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
29c0: 69 6e 74 20 68 69 74 20 3d 20 30 3b 0a 20 20 20  int hit = 0;.   
29d0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
29e0: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
29f0: 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  pEList;.        
2a00: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c    for(j=0; j<pEL
2a10: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
2a20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2a30: 28 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  ( sqlite3MatchSp
2a40: 61 6e 4e 61 6d 65 28 70 45 4c 69 73 74 2d 3e 61  anName(pEList->a
2a50: 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 7a 43 6f 6c 2c  [j].zSpan, zCol,
2a60: 20 7a 54 61 62 2c 20 7a 44 62 29 20 29 7b 0a 20   zTab, zDb) ){. 
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74               cnt
2a80: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
2a90: 20 20 63 6e 74 54 61 62 20 3d 20 32 3b 0a 20 20    cntTab = 2;.  
2aa0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74              pMat
2ab0: 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20  ch = pItem;.    
2ac0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
2ad0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 68 69 74 20              hit 
2af0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
2b00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2b10: 20 20 20 20 20 20 20 20 20 69 66 28 20 68 69 74           if( hit
2b20: 20 7c 7c 20 7a 54 61 62 3d 3d 30 20 29 20 63 6f   || zTab==0 ) co
2b30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2b40: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 44  }.        if( zD
2b50: 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65  b && pTab->pSche
2b60: 6d 61 21 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20  ma!=pSchema ){. 
2b70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2b80: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2b90: 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b       if( zTab ){
2ba0: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
2bb0: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
2bc0: 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  = pItem->zAlias 
2bd0: 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ? pItem->zAlias 
2be0: 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  : pTab->zName;. 
2bf0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c00: 20 7a 54 61 62 4e 61 6d 65 21 3d 30 20 29 3b 0a   zTabName!=0 );.
2c10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2c20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
2c30: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
2c40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
2c50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
2c60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2c70: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63         if( 0==(c
2c80: 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20  ntTab++) ){.    
2c90: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
2ca0: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Item;.        }.
2cb0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c          for(j=0,
2cc0: 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c   pCol=pTab->aCol
2cd0: 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
2ce0: 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  j++, pCol++){.  
2cf0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2d00: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
2d10: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
2d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d30: 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61 73 20  /* If there has 
2d40: 62 65 65 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65  been exactly one
2d50: 20 70 72 69 6f 72 20 6d 61 74 63 68 20 61 6e 64   prior match and
2d60: 20 74 68 69 73 20 6d 61 74 63 68 0a 20 20 20 20   this match.    
2d70: 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 66 6f          ** is fo
2d80: 72 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  r the right-hand
2d90: 20 74 61 62 6c 65 20 6f 66 20 61 20 4e 41 54 55   table of a NATU
2da0: 52 41 4c 20 4a 4f 49 4e 20 6f 72 20 69 73 20 69  RAL JOIN or is i
2db0: 6e 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 20  n a .           
2dc0: 20 2a 2a 20 55 53 49 4e 47 20 63 6c 61 75 73 65   ** USING clause
2dd0: 2c 20 74 68 65 6e 20 73 6b 69 70 20 74 68 69 73  , then skip this
2de0: 20 6d 61 74 63 68 2e 0a 20 20 20 20 20 20 20 20   match..        
2df0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
2e00: 20 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b     if( cnt==1 ){
2e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2e20: 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69  f( pItem->fg.joi
2e30: 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54 55 52  ntype & JT_NATUR
2e40: 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  AL ) continue;. 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2e60: 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75   nameInUsingClau
2e70: 73 65 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  se(pItem->pUsing
2e80: 2c 20 7a 43 6f 6c 29 20 29 20 63 6f 6e 74 69 6e  , zCol) ) contin
2e90: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2ea0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e  }.            cn
2eb0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t++;.           
2ec0: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
2ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2ee0: 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72  Substitute the r
2ef0: 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29  owid (column -1)
2f00: 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52   for the INTEGER
2f10: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
2f30: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d  r->iColumn = j==
2f40: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31  pTab->iPKey ? -1
2f50: 20 3a 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 20   : (i16)j;.     
2f60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2f70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f80: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2f90: 20 20 69 66 28 20 70 4d 61 74 63 68 20 29 7b 0a    if( pMatch ){.
2fa0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2fb0: 54 61 62 6c 65 20 3d 20 70 4d 61 74 63 68 2d 3e  Table = pMatch->
2fc0: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20  iCursor;.       
2fd0: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
2fe0: 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20  Match->pTab;.   
2ff0: 20 20 20 20 20 2f 2a 20 52 49 47 48 54 20 4a 4f       /* RIGHT JO
3000: 49 4e 20 6e 6f 74 20 28 79 65 74 29 20 73 75 70  IN not (yet) sup
3010: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20  ported */.      
3020: 20 20 61 73 73 65 72 74 28 20 28 70 4d 61 74 63    assert( (pMatc
3030: 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  h->fg.jointype &
3040: 20 4a 54 5f 52 49 47 48 54 29 3d 3d 30 20 29 3b   JT_RIGHT)==0 );
3050: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4d  .        if( (pM
3060: 61 74 63 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70  atch->fg.jointyp
3070: 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
3080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
3090: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
30a0: 70 72 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c  pr, EP_CanBeNull
30b0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
30c0: 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70       pSchema = p
30d0: 45 78 70 72 2d 3e 70 54 61 62 2d 3e 70 53 63 68  Expr->pTab->pSch
30e0: 65 6d 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ema;.      }.   
30f0: 20 7d 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69   } /* if( pSrcLi
3100: 73 74 20 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  st ) */..#ifndef
3110: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
3120: 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20 77  GGER.    /* If w
3130: 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61  e have not alrea
3140: 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20  dy resolved the 
3150: 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65  name, then maybe
3160: 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61   .    ** it is a
3170: 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20   new.* or old.* 
3180: 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74  trigger argument
3190: 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 2a   reference.    *
31a0: 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d 30  /.    if( zDb==0
31b0: 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63   && zTab!=0 && c
31c0: 6e 74 54 61 62 3d 3d 30 20 26 26 20 70 50 61 72  ntTab==0 && pPar
31d0: 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 21  se->pTriggerTab!
31e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
31f0: 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 65 54 72  op = pParse->eTr
3200: 69 67 67 65 72 4f 70 3b 0a 20 20 20 20 20 20 61  iggerOp;.      a
3210: 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 44 45  ssert( op==TK_DE
3220: 4c 45 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55  LETE || op==TK_U
3230: 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  PDATE || op==TK_
3240: 49 4e 53 45 52 54 20 29 3b 0a 20 20 20 20 20 20  INSERT );.      
3250: 69 66 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54  if( op!=TK_DELET
3260: 45 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  E && sqlite3StrI
3270: 43 6d 70 28 22 6e 65 77 22 2c 7a 54 61 62 29 20  Cmp("new",zTab) 
3280: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
3290: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
32a0: 31 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  1;.        pTab 
32b0: 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67  = pParse->pTrigg
32c0: 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c  erTab;.      }el
32d0: 73 65 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e  se if( op!=TK_IN
32e0: 53 45 52 54 20 26 26 20 73 71 6c 69 74 65 33 53  SERT && sqlite3S
32f0: 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 7a 54 61  trICmp("old",zTa
3300: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
3310: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
3320: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   0;.        pTab
3330: 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67   = pParse->pTrig
3340: 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 65  gerTab;.      }e
3350: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61  lse{.        pTa
3360: 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  b = 0;.      }..
3370: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29        if( pTab )
3380: 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  { .        int i
3390: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 63  Col;.        pSc
33a0: 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53 63  hema = pTab->pSc
33b0: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 63 6e  hema;.        cn
33c0: 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tTab++;.        
33d0: 66 6f 72 28 69 43 6f 6c 3d 30 2c 20 70 43 6f 6c  for(iCol=0, pCol
33e0: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 43 6f  =pTab->aCol; iCo
33f0: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
3400: 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20  ol++, pCol++){. 
3410: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
3420: 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c  ite3StrICmp(pCol
3430: 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ->zName, zCol)==
3440: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
3450: 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
3460: 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  >iPKey ){.      
3470: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d          iCol = -
3480: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
3490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
34a0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
34b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34c0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 70 54 61 62    if( iCol>=pTab
34d0: 2d 3e 6e 43 6f 6c 20 26 26 20 73 71 6c 69 74 65  ->nCol && sqlite
34e0: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 26  3IsRowid(zCol) &
34f0: 26 20 56 69 73 69 62 6c 65 52 6f 77 69 64 28 70  & VisibleRowid(p
3500: 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Tab) ){.        
3510: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 31    /* IMP: R-5141
3520: 34 2d 33 32 39 31 30 20 2a 2f 0a 20 20 20 20 20  4-32910 */.     
3530: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
3540: 34 39 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20  4911-55124 */.  
3550: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d          iCol = -
3560: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
3570: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
3580: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
3590: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
35a0: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
35b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
35c0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
35d0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
35e0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20 20  TEGER;.         
35f0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
3600: 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20  ->iTable==0 ){. 
3610: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
3620: 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b  ase( iCol==31 );
3630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
3640: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20  tcase( iCol==32 
3650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
3660: 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b 20 7c  Parse->oldmask |
3670: 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30 78  = (iCol>=32 ? 0x
3680: 66 66 66 66 66 66 66 66 20 3a 20 28 28 28 75 33  ffffffff : (((u3
3690: 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20  2)1)<<iCol));.  
36a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
36b0: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63             testc
36c0: 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b  ase( iCol==31 );
36d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
36e0: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20  tcase( iCol==32 
36f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
3700: 50 61 72 73 65 2d 3e 6e 65 77 6d 61 73 6b 20 7c  Parse->newmask |
3710: 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30 78  = (iCol>=32 ? 0x
3720: 66 66 66 66 66 66 66 66 20 3a 20 28 28 28 75 33  ffffffff : (((u3
3730: 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20  2)1)<<iCol));.  
3740: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3750: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3760: 6d 6e 20 3d 20 28 69 31 36 29 69 43 6f 6c 3b 0a  mn = (i16)iCol;.
3770: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
3780: 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  >pTab = pTab;.  
3790: 20 20 20 20 20 20 20 20 69 73 54 72 69 67 67 65          isTrigge
37a0: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  r = 1;.        }
37b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
37c0: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
37d0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
37e0: 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f  IGGER) */..    /
37f0: 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70 73  *.    ** Perhaps
3800: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72   the name is a r
3810: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
3820: 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20  ROWID.    */.   
3830: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63   if( cnt==0 && c
3840: 6e 74 54 61 62 3d 3d 31 20 26 26 20 70 4d 61 74  ntTab==1 && pMat
3850: 63 68 20 26 26 20 73 71 6c 69 74 65 33 49 73 52  ch && sqlite3IsR
3860: 6f 77 69 64 28 7a 43 6f 6c 29 0a 20 20 20 20 20  owid(zCol).     
3870: 26 26 20 56 69 73 69 62 6c 65 52 6f 77 69 64 28  && VisibleRowid(
3880: 70 4d 61 74 63 68 2d 3e 70 54 61 62 29 20 29 7b  pMatch->pTab) ){
3890: 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a  .      cnt = 1;.
38a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
38b0: 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20 2f  lumn = -1;     /
38c0: 2a 20 49 4d 50 3a 20 52 2d 34 34 39 31 31 2d 35  * IMP: R-44911-5
38d0: 35 31 32 34 20 2a 2f 0a 20 20 20 20 20 20 70 45  5124 */.      pE
38e0: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
38f0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
3900: 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ER;.    }..    /
3910: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
3920: 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20  input is of the 
3930: 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20  form Z (not Y.Z 
3940: 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74  or X.Y.Z) then t
3950: 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a  he name Z.    **
3960: 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20   might refer to 
3970: 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c  an result-set al
3980: 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65  ias.  This happe
3990: 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
39a0: 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   when.    ** we 
39b0: 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61  are resolving na
39c0: 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  mes in the WHERE
39d0: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
39e0: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64  ollowing command
39f0: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
3a00: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41      SELECT a+b A
3a10: 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57  S x FROM table W
3a20: 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a  HERE x<10;.    *
3a30: 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65  *.    ** In case
3a40: 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70  s like this, rep
3a50: 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20  lace pExpr with 
3a60: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
3a70: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20  pression that.  
3a80: 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72    ** forms the r
3a90: 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20  esult set entry 
3aa0: 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78  ("a+b" in the ex
3ab0: 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72  ample) and retur
3ac0: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
3ad0: 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
3ae0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
3af0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
3b00: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
3b10: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a  eady been.    **
3b20: 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65   resolved by the
3b30: 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20   time the WHERE 
3b40: 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76  clause is resolv
3b50: 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
3b60: 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f  * The ability to
3b70: 20 75 73 65 20 61 6e 20 6f 75 74 70 75 74 20 72   use an output r
3b80: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
3b90: 20 69 6e 20 74 68 65 20 57 48 45 52 45 2c 20 47   in the WHERE, G
3ba0: 52 4f 55 50 20 42 59 2c 0a 20 20 20 20 2a 2a 20  ROUP BY,.    ** 
3bb0: 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65  or HAVING clause
3bc0: 73 2c 20 6f 72 20 61 73 20 70 61 72 74 20 6f 66  s, or as part of
3bd0: 20 61 20 6c 61 72 67 65 72 20 65 78 70 72 65 73   a larger expres
3be0: 73 69 6f 6e 20 69 6e 20 74 68 65 20 4f 52 44 45  sion in the ORDE
3bf0: 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75  R BY.    ** clau
3c00: 73 65 20 69 73 20 6e 6f 74 20 73 74 61 6e 64 61  se is not standa
3c10: 72 64 20 53 51 4c 2e 20 20 54 68 69 73 20 69 73  rd SQL.  This is
3c20: 20 61 20 28 67 6f 6f 66 79 29 20 53 51 4c 69 74   a (goofy) SQLit
3c30: 65 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 61  e extension, tha
3c40: 74 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 70 70  t.    ** is supp
3c50: 6f 72 74 65 64 20 66 6f 72 20 62 61 63 6b 77 61  orted for backwa
3c60: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
3c70: 79 20 6f 6e 6c 79 2e 20 48 65 6e 63 65 2c 20 77  y only. Hence, w
3c80: 65 20 69 73 73 75 65 20 61 20 77 61 72 6e 69 6e  e issue a warnin
3c90: 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 73 71 6c 69  g.    ** on sqli
3ca0: 74 65 33 5f 6c 6f 67 28 29 20 77 68 65 6e 65 76  te3_log() whenev
3cb0: 65 72 20 74 68 65 20 63 61 70 61 62 69 6c 69 74  er the capabilit
3cc0: 79 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 2a  y is used..    *
3cd0: 2f 0a 20 20 20 20 69 66 28 20 28 70 45 4c 69 73  /.    if( (pELis
3ce0: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29  t = pNC->pEList)
3cf0: 21 3d 30 0a 20 20 20 20 20 26 26 20 7a 54 61 62  !=0.     && zTab
3d00: 3d 3d 30 0a 20 20 20 20 20 26 26 20 63 6e 74 3d  ==0.     && cnt=
3d10: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
3d20: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
3d30: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
3d40: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41          char *zA
3d50: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  s = pEList->a[j]
3d60: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3d70: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
3d80: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
3d90: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
3da0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f          Expr *pO
3db0: 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rig;.          a
3dc0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
3dd0: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
3de0: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
3df0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3e00: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d  pExpr->x.pList==
3e10: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
3e20: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
3e30: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
3e40: 20 20 20 20 20 20 20 20 70 4f 72 69 67 20 3d 20          pOrig = 
3e50: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
3e60: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
3e70: 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 26  ( (pNC->ncFlags&
3e80: 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20  NC_AllowAgg)==0 
3e90: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
3ea0: 74 79 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67  ty(pOrig, EP_Agg
3eb0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
3ec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3ed0: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
3ee0: 20 6f 66 20 61 6c 69 61 73 65 64 20 61 67 67 72   of aliased aggr
3ef0: 65 67 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b  egate %s", zAs);
3f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
3f10: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
3f20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3f30: 20 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69 61       resolveAlia
3f40: 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  s(pParse, pEList
3f50: 2c 20 6a 2c 20 70 45 78 70 72 2c 20 22 22 2c 20  , j, pExpr, "", 
3f60: 6e 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20  nSubquery);.    
3f70: 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20        cnt = 1;. 
3f80: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
3f90: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
3fa0: 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26  ssert( zTab==0 &
3fb0: 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20  & zDb==0 );.    
3fc0: 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75        goto looku
3fd0: 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 20 20 20  pname_end;.     
3fe0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20     }.      } .  
3ff0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61    }..    /* Adva
4000: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
4010: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54  name context.  T
4020: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69  he loop will exi
4030: 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20  t when either.  
4040: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d    ** we have a m
4050: 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20  atch (cnt>0) or 
4060: 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20  when we run out 
4070: 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  of name contexts
4080: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
4090: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   cnt==0 ){.     
40a0: 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78   pNC = pNC->pNex
40b0: 74 3b 0a 20 20 20 20 20 20 6e 53 75 62 71 75 65  t;.      nSubque
40c0: 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ry++;.    }.  }.
40d0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20  .  /*.  ** If X 
40e0: 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28  and Y are NULL (
40f0: 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69  in other words i
4100: 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  f only the colum
4110: 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a  n name Z is.  **
4120: 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74   supplied) and t
4130: 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73  he value of Z is
4140: 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75   enclosed in dou
4150: 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e  ble-quotes, then
4160: 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72  .  ** Z is a str
4170: 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69  ing literal if i
4180: 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20  t doesn't match 
4190: 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  any column names
41a0: 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20  .  In that.  ** 
41b0: 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f  case, we need to
41c0: 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77   return right aw
41d0: 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20  ay and not make 
41e0: 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20  any changes to. 
41f0: 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a   ** pExpr..  **.
4200: 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20    ** Because no 
4210: 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61  reference was ma
4220: 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74  de to outer cont
4230: 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e  exts, the pNC->n
4240: 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20  Ref.  ** fields 
4250: 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20  are not changed 
4260: 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a  in any context..
4270: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
4280: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20  0 && zTab==0 && 
4290: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
42a0: 70 45 78 70 72 2c 45 50 5f 44 62 6c 51 75 6f 74  pExpr,EP_DblQuot
42b0: 65 64 29 20 29 7b 0a 20 20 20 20 70 45 78 70 72  ed) ){.    pExpr
42c0: 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52 49 4e 47  ->op = TK_STRING
42d0: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61  ;.    pExpr->pTa
42e0: 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  b = 0;.    retur
42f0: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
4300: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d  ..  /*.  ** cnt=
4310: 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77  =0 means there w
4320: 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63  as not match.  c
4330: 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72 65  nt>1 means there
4340: 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a   were two or.  *
4350: 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e 20  * more matches. 
4360: 20 45 69 74 68 65 72 20 77 61 79 2c 20 77 65 20   Either way, we 
4370: 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20  have an error.. 
4380: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d 31   */.  if( cnt!=1
4390: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
43a0: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45  ar *zErr;.    zE
43b0: 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e  rr = cnt==0 ? "n
43c0: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 22 20 3a  o such column" :
43d0: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
43e0: 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20 20 69 66  mn name";.    if
43f0: 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73  ( zDb ){.      s
4400: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4410: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
4420: 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 44 62  s.%s", zErr, zDb
4430: 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20  , zTab, zCol);. 
4440: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61     }else if( zTa
4450: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
4460: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4470: 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20  e, "%s: %s.%s", 
4480: 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c  zErr, zTab, zCol
4490: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
44a0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
44b0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
44c0: 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a 43 6f 6c   %s", zErr, zCol
44d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  );.    }.    pPa
44e0: 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61  rse->checkSchema
44f0: 20 3d 20 31 3b 0a 20 20 20 20 70 54 6f 70 4e 43   = 1;.    pTopNC
4500: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20  ->nErr++;.  }.. 
4510: 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20   /* If a column 
4520: 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20  from a table in 
4530: 70 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65  pSrcList is refe
4540: 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63  renced, then rec
4550: 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61  ord.  ** this fa
4560: 63 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69  ct in the pSrcLi
4570: 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62  st.a[].colUsed b
4580: 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20  itmask.  Column 
4590: 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69  0 causes.  ** bi
45a0: 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20  t 0 to be set.  
45b0: 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69  Column 1 sets bi
45c0: 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  t 1.  And so for
45d0: 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a  th.  If the.  **
45e0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
45f0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  s greater than t
4600: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
4610: 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  s in the bitmask
4620: 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74  .  ** then set t
4630: 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69  he high-order bi
4640: 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b  t of the bitmask
4650: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78  ..  */.  if( pEx
4660: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26  pr->iColumn>=0 &
4670: 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20  & pMatch!=0 ){. 
4680: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
4690: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 74  ->iColumn;.    t
46a0: 65 73 74 63 61 73 65 28 20 6e 3d 3d 42 4d 53 2d  estcase( n==BMS-
46b0: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  1 );.    if( n>=
46c0: 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  BMS ){.      n =
46d0: 20 42 4d 53 2d 31 3b 0a 20 20 20 20 7d 0a 20 20   BMS-1;.    }.  
46e0: 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63 68    assert( pMatch
46f0: 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72  ->iCursor==pExpr
4700: 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
4710: 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20  pMatch->colUsed 
4720: 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  |= ((Bitmask)1)<
4730: 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c  <n;.  }..  /* Cl
4740: 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
4750: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n.  */.  sqlite3
4760: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4770: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4780: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  pExpr->pLeft = 0
4790: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
47a0: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d  elete(db, pExpr-
47b0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70  >pRight);.  pExp
47c0: 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  r->pRight = 0;. 
47d0: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 69 73   pExpr->op = (is
47e0: 54 72 69 67 67 65 72 20 3f 20 54 4b 5f 54 52 49  Trigger ? TK_TRI
47f0: 47 47 45 52 20 3a 20 54 4b 5f 43 4f 4c 55 4d 4e  GGER : TK_COLUMN
4800: 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  );.lookupname_en
4810: 64 3a 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  d:.  if( cnt==1 
4820: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4830: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  NC!=0 );.    if(
4840: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41   pExpr->op!=TK_A
4850: 53 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  S ){.      sqlit
4860: 65 33 41 75 74 68 52 65 61 64 28 70 50 61 72 73  e3AuthRead(pPars
4870: 65 2c 20 70 45 78 70 72 2c 20 70 53 63 68 65 6d  e, pExpr, pSchem
4880: 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  a, pNC->pSrcList
4890: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  );.    }.    /* 
48a0: 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52  Increment the nR
48b0: 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20  ef value on all 
48c0: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72  name contexts fr
48d0: 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20  om TopNC up to. 
48e0: 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20     ** the point 
48f0: 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d  where the name m
4900: 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66  atched. */.    f
4910: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73  or(;;){.      as
4920: 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20  sert( pTopNC!=0 
4930: 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d  );.      pTopNC-
4940: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69  >nRef++;.      i
4950: 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29  f( pTopNC==pNC )
4960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54   break;.      pT
4970: 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70  opNC = pTopNC->p
4980: 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
4990: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
49a0: 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
49b0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
49c0: 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t;.  }.}../*.** 
49d0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
49e0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
49f0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
4a00: 6f 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d  o load the colum
4a10: 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72 6f 6d 20 64  n iCol.** from d
4a20: 61 74 61 73 6f 75 72 63 65 20 69 53 72 63 20 69  atasource iSrc i
4a30: 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63 2e 0a  n SrcList pSrc..
4a40: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
4a50: 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72  CreateColumnExpr
4a60: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
4a70: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 69 6e 74  cList *pSrc, int
4a80: 20 69 53 72 63 2c 20 69 6e 74 20 69 43 6f 6c 29   iSrc, int iCol)
4a90: 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71  {.  Expr *p = sq
4aa0: 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64  lite3ExprAlloc(d
4ab0: 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c  b, TK_COLUMN, 0,
4ac0: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   0);.  if( p ){.
4ad0: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
4ae0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
4af0: 20 26 70 53 72 63 2d 3e 61 5b 69 53 72 63 5d 3b   &pSrc->a[iSrc];
4b00: 0a 20 20 20 20 70 2d 3e 70 54 61 62 20 3d 20 70  .    p->pTab = p
4b10: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
4b20: 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  p->iTable = pIte
4b30: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
4b40: 69 66 28 20 70 2d 3e 70 54 61 62 2d 3e 69 50 4b  if( p->pTab->iPK
4b50: 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20  ey==iCol ){.    
4b60: 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d    p->iColumn = -
4b70: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
4b80: 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
4b90: 20 28 79 6e 56 61 72 29 69 43 6f 6c 3b 0a 20 20   (ynVar)iCol;.  
4ba0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
4bb0: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
4bc0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
4bd0: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
4be0: 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 7c  pItem->colUsed |
4bf0: 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  = ((Bitmask)1)<<
4c00: 28 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 42 4d 53  (iCol>=BMS ? BMS
4c10: 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a 20 20 20 20  -1 : iCol);.    
4c20: 7d 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f  }.    ExprSetPro
4c30: 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65 73 6f  perty(p, EP_Reso
4c40: 6c 76 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  lved);.  }.  ret
4c50: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
4c60: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
4c70: 74 68 61 74 20 61 6e 20 65 78 70 72 65 73 73 69  that an expressi
4c80: 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 20  on is not valid 
4c90: 66 6f 72 20 61 20 70 61 72 74 69 61 6c 20 69 6e  for a partial in
4ca0: 64 65 78 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61  dex WHERE.** cla
4cb0: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
4cc0: 6f 69 64 20 6e 6f 74 56 61 6c 69 64 50 61 72 74  oid notValidPart
4cd0: 49 64 78 57 68 65 72 65 28 0a 20 20 50 61 72 73  IdxWhere(.  Pars
4ce0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
4cf0: 20 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f 72 20   /* Leave error 
4d00: 6d 65 73 73 61 67 65 20 68 65 72 65 20 2a 2f 0a  message here */.
4d10: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
4d20: 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61  NC,    /* The na
4d30: 6d 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  me context */.  
4d40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67  const char *zMsg
4d50: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
4d60: 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  error */.){.  if
4d70: 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
4d80: 26 20 4e 43 5f 50 61 72 74 49 64 78 29 21 3d 30  & NC_PartIdx)!=0
4d90: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
4da0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4db0: 22 25 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  "%s prohibited i
4dc0: 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20  n partial index 
4dd0: 57 48 45 52 45 20 63 6c 61 75 73 65 73 22 2c 0a  WHERE clauses",.
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4df0: 20 20 20 20 7a 4d 73 67 29 3b 0a 20 20 7d 0a 7d      zMsg);.  }.}
4e00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
4e10: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  _OMIT_CHECK./*.*
4e20: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
4e30: 72 20 74 68 61 74 20 61 6e 20 65 78 70 72 65 73  r that an expres
4e40: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69  sion is not vali
4e50: 64 20 66 6f 72 20 61 20 43 48 45 43 4b 20 63 6f  d for a CHECK co
4e60: 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61  nstraint..*/.sta
4e70: 74 69 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69  tic void notVali
4e80: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
4e90: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4ea0: 65 2c 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76  e,       /* Leav
4eb0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
4ec0: 68 65 72 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  here */.  NameCo
4ed0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f  ntext *pNC,    /
4ee0: 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * The name conte
4ef0: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
4f00: 61 72 20 2a 7a 4d 73 67 20 20 20 20 20 2f 2a 20  ar *zMsg     /* 
4f10: 54 79 70 65 20 6f 66 20 65 72 72 6f 72 20 2a 2f  Type of error */
4f20: 0a 29 7b 0a 20 20 69 66 28 20 28 70 4e 43 2d 3e  .){.  if( (pNC->
4f30: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43  ncFlags & NC_IsC
4f40: 68 65 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  heck)!=0 ){.    
4f50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4f60: 70 50 61 72 73 65 2c 22 25 73 20 70 72 6f 68 69  pParse,"%s prohi
4f70: 62 69 74 65 64 20 69 6e 20 43 48 45 43 4b 20 63  bited in CHECK c
4f80: 6f 6e 73 74 72 61 69 6e 74 73 22 2c 20 7a 4d 73  onstraints", zMs
4f90: 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  g);.  }.}.#else.
4fa0: 23 20 64 65 66 69 6e 65 20 6e 6f 74 56 61 6c 69  # define notVali
4fb0: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
4fc0: 28 50 2c 4e 2c 4d 29 0a 23 65 6e 64 69 66 0a 0a  (P,N,M).#endif..
4fd0: 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e  /*.** Expression
4fe0: 20 70 20 73 68 6f 75 6c 64 20 65 6e 63 6f 64 65   p should encode
4ff0: 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e   a floating poin
5000: 74 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20  t value between 
5010: 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2a 20  1.0 and 0.0..** 
5020: 52 65 74 75 72 6e 20 31 30 32 34 20 74 69 6d 65  Return 1024 time
5030: 73 20 74 68 69 73 20 76 61 6c 75 65 2e 20 20 4f  s this value.  O
5040: 72 20 72 65 74 75 72 6e 20 2d 31 20 69 66 20 70  r return -1 if p
5050: 20 69 73 20 6e 6f 74 20 61 20 66 6c 6f 61 74 69   is not a floati
5060: 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
5070: 65 20 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e  e between 1.0 an
5080: 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  d 0.0..*/.static
5090: 20 69 6e 74 20 65 78 70 72 50 72 6f 62 61 62 69   int exprProbabi
50a0: 6c 69 74 79 28 45 78 70 72 20 2a 70 29 7b 0a 20  lity(Expr *p){. 
50b0: 20 64 6f 75 62 6c 65 20 72 20 3d 20 2d 31 2e 30   double r = -1.0
50c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54  ;.  if( p->op!=T
50d0: 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74 75 72 6e  K_FLOAT ) return
50e0: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 41 74   -1;.  sqlite3At
50f0: 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  oF(p->u.zToken, 
5100: 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  &r, sqlite3Strle
5110: 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  n30(p->u.zToken)
5120: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
5130: 20 20 61 73 73 65 72 74 28 20 72 3e 3d 30 2e 30    assert( r>=0.0
5140: 20 29 3b 0a 20 20 69 66 28 20 72 3e 31 2e 30 20   );.  if( r>1.0 
5150: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 72  ) return -1;.  r
5160: 65 74 75 72 6e 20 28 69 6e 74 29 28 72 2a 31 33  eturn (int)(r*13
5170: 34 32 31 37 37 32 38 2e 30 29 3b 0a 7d 0a 0a 2f  4217728.0);.}../
5180: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5190: 65 20 69 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f  e is callback fo
51a0: 72 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70  r sqlite3WalkExp
51b0: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c  r()..**.** Resol
51c0: 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  ve symbolic name
51d0: 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  s into TK_COLUMN
51e0: 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74   operators for t
51f0: 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f  he current.** no
5200: 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73  de in the expres
5210: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
5220: 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  rn 0 to continue
5230: 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e   the search down
5240: 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20  .** the tree or 
5250: 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74  2 to abort the t
5260: 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20  ree walk..**.** 
5270: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
5280: 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65  o does error che
5290: 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72  cking and name r
52a0: 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a  esolution for.**
52b0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e   function names.
52c0: 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66    The operator f
52d0: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
52e0: 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65  ctions is change
52f0: 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46  d.** to TK_AGG_F
5300: 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74  UNCTION..*/.stat
5310: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 45 78  ic int resolveEx
5320: 70 72 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70  prStep(Walker *p
5330: 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45  Walker, Expr *pE
5340: 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74  xpr){.  NameCont
5350: 65 78 74 20 2a 70 4e 43 3b 0a 20 20 50 61 72 73  ext *pNC;.  Pars
5360: 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 70 4e  e *pParse;..  pN
5370: 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
5380: 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e  NC;.  assert( pN
5390: 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65  C!=0 );.  pParse
53a0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
53b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
53c0: 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73  ==pWalker->pPars
53d0: 65 20 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72  e );..  if( Expr
53e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
53f0: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
5400: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75  ) return WRC_Pru
5410: 6e 65 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  ne;.  ExprSetPro
5420: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
5430: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
5440: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
5450: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26  pNC->pSrcList &&
5460: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e   pNC->pSrcList->
5470: 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20  nAlloc>0 ){.    
5480: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
5490: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
54a0: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
54b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43    for(i=0; i<pNC
54c0: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  ->pSrcList->nSrc
54d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73  ; i++){.      as
54e0: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
54f0: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
5500: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
5510: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
5520: 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  ->nTab);.    }. 
5530: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74   }.#endif.  swit
5540: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
5550: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
5560: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41  LITE_ENABLE_UPDA
5570: 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29  TE_DELETE_LIMIT)
5580: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
5590: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
55a0: 59 29 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 70  Y).    /* The sp
55b0: 65 63 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 54  ecial operator T
55c0: 4b 5f 52 4f 57 20 6d 65 61 6e 73 20 75 73 65 20  K_ROW means use 
55d0: 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  the rowid for th
55e0: 65 20 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 63  e first.    ** c
55f0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f  olumn in the FRO
5600: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20  M clause.  This 
5610: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 4c  is used by the L
5620: 49 4d 49 54 20 61 6e 64 20 4f 52 44 45 52 20 42  IMIT and ORDER B
5630: 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20  Y.    ** clause 
5640: 70 72 6f 63 65 73 73 69 6e 67 20 6f 6e 20 55 50  processing on UP
5650: 44 41 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20  DATE and DELETE 
5660: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20  statements..    
5670: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  */.    case TK_R
5680: 4f 57 3a 20 7b 0a 20 20 20 20 20 20 53 72 63 4c  OW: {.      SrcL
5690: 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
56a0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
56b0: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
56c0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
56d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
56e0: 53 72 63 4c 69 73 74 20 26 26 20 70 53 72 63 4c  SrcList && pSrcL
56f0: 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ist->nSrc==1 );.
5700: 20 20 20 20 20 20 70 49 74 65 6d 20 3d 20 70 53        pItem = pS
5710: 72 63 4c 69 73 74 2d 3e 61 3b 20 0a 20 20 20 20  rcList->a; .    
5720: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
5730: 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70  _COLUMN;.      p
5740: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 49 74  Expr->pTab = pIt
5750: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
5760: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
5770: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
5780: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
5790: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
57a0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
57b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
57c0: 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65  TEGER;.      bre
57d0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
57e0: 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49   /* defined(SQLI
57f0: 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45  TE_ENABLE_UPDATE
5800: 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 0a 20  _DELETE_LIMIT). 
5810: 20 20 20 20 20 20 20 20 20 26 26 20 21 64 65 66           && !def
5820: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5830: 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 20  _SUBQUERY) */.. 
5840: 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65     /* A lone ide
5850: 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20 6e  ntifier is the n
5860: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 2e  ame of a column.
5870: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5880: 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20   TK_ID: {.      
5890: 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70 4e 61 6d  return lookupNam
58a0: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  e(pParse, 0, 0, 
58b0: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
58c0: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
58d0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20    }.  .    /* A 
58e0: 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63  table name and c
58f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
5900: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20  ID.ID.    ** Or 
5910: 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  a database, tabl
5920: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49  e and column:  I
5930: 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20  D.ID.ID.    */. 
5940: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
5950: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
5960: 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ar *zColumn;.   
5970: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5980: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 63 6f 6e  Table;.      con
5990: 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  st char *zDb;.  
59a0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
59b0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20  ;..      /* if( 
59c0: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72  pSrcList==0 ) br
59d0: 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52  eak; */.      pR
59e0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
59f0: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
5a00: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
5a10: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62  D ){.        zDb
5a20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 54   = 0;.        zT
5a30: 61 62 6c 65 20 3d 20 70 45 78 70 72 2d 3e 70 4c  able = pExpr->pL
5a40: 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
5a50: 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d         zColumn =
5a60: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
5a70: 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  n;.      }else{.
5a80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5a90: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44  pRight->op==TK_D
5aa0: 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 44  OT );.        zD
5ab0: 62 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  b = pExpr->pLeft
5ac0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
5ad0: 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 70 52 69      zTable = pRi
5ae0: 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54  ght->pLeft->u.zT
5af0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a 43  oken;.        zC
5b00: 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e  olumn = pRight->
5b10: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
5b20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b30: 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70 4e 61 6d  return lookupNam
5b40: 65 28 70 50 61 72 73 65 2c 20 7a 44 62 2c 20 7a  e(pParse, zDb, z
5b50: 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20  Table, zColumn, 
5b60: 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  pNC, pExpr);.   
5b70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c   }..    /* Resol
5b80: 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ve function name
5b90: 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  s.    */.    cas
5ba0: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b  e TK_FUNCTION: {
5bb0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
5bc0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
5bd0: 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54  x.pList;    /* T
5be0: 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74  he argument list
5bf0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
5c00: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
5c10: 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 20 20 2f  >nExpr : 0;    /
5c20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
5c30: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
5c40: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
5c50: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
5c60: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
5c70: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
5c80: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
5c90: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
5ca0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
5cb0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
5cc0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
5cd0: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5cf0: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
5d00: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
5d10: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 75   */.      int au
5d20: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
5d30: 20 20 20 20 20 20 2f 2a 20 41 75 74 68 6f 72 69        /* Authori
5d40: 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65 20 74 68  zation to use th
5d50: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
5d60: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
5d90: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
5da0: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
5db0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5dc0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
5dd0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
5de0: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
5df0: 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20  cDef *pDef;     
5e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f           /* Info
5e10: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
5e20: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
5e30: 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43      u8 enc = ENC
5e40: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 20  (pParse->db);   
5e50: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
5e60: 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20 20  encoding */..   
5e70: 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72     assert( !Expr
5e80: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
5e90: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
5ea0: 20 29 3b 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c   );.      notVal
5eb0: 69 64 50 61 72 74 49 64 78 57 68 65 72 65 28 70  idPartIdxWhere(p
5ec0: 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 66 75 6e  Parse, pNC, "fun
5ed0: 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20  ctions");.      
5ee0: 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  zId = pExpr->u.z
5ef0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64  Token;.      nId
5f00: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
5f10: 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20 70  30(zId);.      p
5f20: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
5f30: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
5f40: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
5f50: 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  n, enc, 0);.    
5f60: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
5f70: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
5f80: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
5f90: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
5fa0: 7a 49 64 2c 20 6e 49 64 2c 20 2d 32 2c 20 65 6e  zId, nId, -2, en
5fb0: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  c, 0);.        i
5fc0: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
5fd0: 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f          no_such_
5fe0: 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  func = 1;.      
5ff0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6000: 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67     wrong_num_arg
6010: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  s = 1;.        }
6020: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6030: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70        is_agg = p
6040: 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20  Def->xFunc==0;. 
6050: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d         if( pDef-
6060: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
6070: 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
6080: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  Y ){.          E
6090: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
60a0: 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c  Expr, EP_Unlikel
60b0: 79 7c 45 50 5f 53 6b 69 70 29 3b 0a 20 20 20 20  y|EP_Skip);.    
60c0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29        if( n==2 )
60d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  {.            pE
60e0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 65 78  xpr->iTable = ex
60f0: 70 72 50 72 6f 62 61 62 69 6c 69 74 79 28 70 4c  prProbability(pL
6100: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
6110: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
6120: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
6130: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
6140: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6150: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
6160: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 63 6f             "seco
6170: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c  nd argument to l
6180: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 6d 75 73 74  ikelihood() must
6190: 20 62 65 20 61 20 22 0a 20 20 20 20 20 20 20 20   be a ".        
61a0: 20 20 20 20 20 20 20 20 22 63 6f 6e 73 74 61 6e          "constan
61b0: 74 20 62 65 74 77 65 65 6e 20 30 2e 30 20 61 6e  t between 0.0 an
61c0: 64 20 31 2e 30 22 29 3b 0a 20 20 20 20 20 20 20  d 1.0");.       
61d0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
61e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
61f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
6200: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
6210: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
6220: 2d 36 31 33 30 34 2d 32 39 34 34 39 20 54 68 65  -61304-29449 The
6230: 20 75 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e   unlikely(X) fun
6240: 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20  ction is.       
6250: 20 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65       ** equivale
6260: 6e 74 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64  nt to likelihood
6270: 28 58 2c 20 30 2e 30 36 32 35 29 2e 0a 20 20 20  (X, 0.0625)..   
6280: 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44           ** EVID
6290: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 32 38 33  ENCE-OF: R-01283
62a0: 2d 31 31 36 33 36 20 54 68 65 20 75 6e 6c 69 6b  -11636 The unlik
62b0: 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20  ely(X) function 
62c0: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  is.            *
62d0: 2a 20 73 68 6f 72 74 2d 68 61 6e 64 20 66 6f 72  * short-hand for
62e0: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e   likelihood(X,0.
62f0: 30 36 32 35 29 2e 0a 20 20 20 20 20 20 20 20 20  0625)..         
6300: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
6310: 46 3a 20 52 2d 33 36 38 35 30 2d 33 34 31 32 37  F: R-36850-34127
6320: 20 54 68 65 20 6c 69 6b 65 6c 79 28 58 29 20 66   The likely(X) f
6330: 75 6e 63 74 69 6f 6e 20 69 73 20 73 68 6f 72 74  unction is short
6340: 2d 68 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  -hand.          
6350: 20 20 2a 2a 20 66 6f 72 20 6c 69 6b 65 6c 69 68    ** for likelih
6360: 6f 6f 64 28 58 2c 30 2e 39 33 37 35 29 2e 0a 20  ood(X,0.9375).. 
6370: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56             ** EV
6380: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 34  IDENCE-OF: R-534
6390: 33 36 2d 34 30 39 37 33 20 54 68 65 20 6c 69 6b  36-40973 The lik
63a0: 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20  ely(X) function 
63b0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  is equivalent.  
63c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
63d0: 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 39  likelihood(X,0.9
63e0: 33 37 35 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  375). */.       
63f0: 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
6400: 75 6e 6c 69 6b 65 6c 79 28 29 20 70 72 6f 62 61  unlikely() proba
6410: 62 69 6c 69 74 79 20 69 73 20 30 2e 30 36 32 35  bility is 0.0625
6420: 2e 20 20 6c 69 6b 65 6c 79 28 29 20 69 73 20 30  .  likely() is 0
6430: 2e 39 33 37 35 20 2a 2f 0a 20 20 20 20 20 20 20  .9375 */.       
6440: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
6450: 6c 65 20 3d 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  le = pDef->zName
6460: 5b 30 5d 3d 3d 27 75 27 20 3f 20 38 33 38 38 36  [0]=='u' ? 83886
6470: 30 38 20 3a 20 31 32 35 38 32 39 31 32 30 3b 0a  08 : 125829120;.
6480: 20 20 20 20 20 20 20 20 20 20 7d 20 20 20 20 20            }     
6490: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
64a0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
64b0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
64c0: 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 61 75 74  TION.        aut
64d0: 68 20 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43  h = sqlite3AuthC
64e0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
64f0: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c 20 30 2c  ITE_FUNCTION, 0,
6500: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 30 29   pDef->zName, 0)
6510: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 75  ;.        if( au
6520: 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  th!=SQLITE_OK ){
6530: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
6540: 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59  uth==SQLITE_DENY
6550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6560: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6570: 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 75 74  pParse, "not aut
6580: 68 6f 72 69 7a 65 64 20 74 6f 20 75 73 65 20 66  horized to use f
6590: 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 0a 20 20  unction: %s",.  
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65c0: 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a    pDef->zName);.
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d              pNC-
65e0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
65f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
6600: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55  Expr->op = TK_NU
6610: 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  LL;.          re
6620: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
6630: 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
6640: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
6650: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
6660: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
6670: 41 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ANT ){.         
6680: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
6690: 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46  (pExpr,EP_ConstF
66a0: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  unc);.        }.
66b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
66c0: 28 20 69 73 5f 61 67 67 20 26 26 20 28 70 4e 43  ( is_agg && (pNC
66d0: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 41  ->ncFlags & NC_A
66e0: 6c 6c 6f 77 41 67 67 29 3d 3d 30 20 29 7b 0a 20  llowAgg)==0 ){. 
66f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
6700: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6710: 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
6720: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a  ate function %.*
6730: 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a  s()", nId,zId);.
6740: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
6750: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f  r++;.        is_
6760: 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  agg = 0;.      }
6770: 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68  else if( no_such
6780: 5f 66 75 6e 63 20 26 26 20 70 50 61 72 73 65 2d  _func && pParse-
6790: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d  >db->init.busy==
67a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
67b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
67c0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75  rse, "no such fu
67d0: 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e  nction: %.*s", n
67e0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
67f0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
6800: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77       }else if( w
6810: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b  rong_num_args ){
6820: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6830: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6840: 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "wrong number of
6850: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
6860: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a  nction %.*s()",.
6870: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64               nId
6880: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
6890: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
68a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
68b0: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 6e 63 46  s_agg ) pNC->ncF
68c0: 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f  lags &= ~NC_Allo
68d0: 77 41 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69  wAgg;.      sqli
68e0: 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
68f0: 70 57 61 6c 6b 65 72 2c 20 70 4c 69 73 74 29 3b  pWalker, pList);
6900: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
6910: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d  g ){.        Nam
6920: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 32 20 3d  eContext *pNC2 =
6930: 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20 70 45   pNC;.        pE
6940: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
6950: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
6960: 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
6970: 30 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  0;.        while
6980: 28 20 70 4e 43 32 20 26 26 20 21 73 71 6c 69 74  ( pNC2 && !sqlit
6990: 65 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68  e3FunctionUsesTh
69a0: 69 73 53 72 63 28 70 45 78 70 72 2c 20 70 4e 43  isSrc(pExpr, pNC
69b0: 32 2d 3e 70 53 72 63 4c 69 73 74 29 20 29 7b 0a  2->pSrcList) ){.
69c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
69d0: 3e 6f 70 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20  >op2++;.        
69e0: 20 20 70 4e 43 32 20 3d 20 70 4e 43 32 2d 3e 70    pNC2 = pNC2->p
69f0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Next;.        }.
6a00: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
6a10: 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20  pDef!=0 );.     
6a20: 20 20 20 69 66 28 20 70 4e 43 32 20 29 7b 0a 20     if( pNC2 ){. 
6a30: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
6a40: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
6a50: 4d 41 58 3d 3d 4e 43 5f 4d 69 6e 4d 61 78 41 67  MAX==NC_MinMaxAg
6a60: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74  g );.          t
6a70: 65 73 74 63 61 73 65 28 20 28 70 44 65 66 2d 3e  estcase( (pDef->
6a80: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
6a90: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 21  TE_FUNC_MINMAX)!
6aa0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
6ab0: 70 4e 43 32 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d  pNC2->ncFlags |=
6ac0: 20 4e 43 5f 48 61 73 41 67 67 20 7c 20 28 70 44   NC_HasAgg | (pD
6ad0: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
6ae0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
6af0: 41 58 29 3b 0a 0a 20 20 20 20 20 20 20 20 7d 0a  AX);..        }.
6b00: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46          pNC->ncF
6b10: 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77  lags |= NC_Allow
6b20: 41 67 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Agg;.      }.   
6b30: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43     /* FIX ME:  C
6b40: 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66  ompute pExpr->af
6b50: 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20  finity based on 
6b60: 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74  the expected ret
6b70: 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70  urn.      ** typ
6b80: 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e of the functio
6b90: 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n .      */.    
6ba0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
6bb0: 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ne;.    }.#ifnde
6bc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
6bd0: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
6be0: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
6bf0: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 20  ase TK_EXISTS:  
6c00: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
6c10: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
6c20: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  ;.#endif.    cas
6c30: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
6c40: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
6c50: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
6c60: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
6c70: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6c80: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
6c90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65  .        int nRe
6ca0: 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20  f = pNC->nRef;. 
6cb0: 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 43         notValidC
6cc0: 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70  heckConstraint(p
6cd0: 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 73 75 62  Parse, pNC, "sub
6ce0: 71 75 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20  queries");.     
6cf0: 20 20 20 6e 6f 74 56 61 6c 69 64 50 61 72 74 49     notValidPartI
6d00: 64 78 57 68 65 72 65 28 70 50 61 72 73 65 2c 20  dxWhere(pParse, 
6d10: 70 4e 43 2c 20 22 73 75 62 71 75 65 72 69 65 73  pNC, "subqueries
6d20: 22 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ");.        sqli
6d30: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
6d40: 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  alker, pExpr->x.
6d50: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
6d60: 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e    assert( pNC->n
6d70: 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20  Ref>=nRef );.   
6d80: 20 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70       if( nRef!=p
6d90: 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20  NC->nRef ){.    
6da0: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
6db0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
6dc0: 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  VarSelect);.    
6dd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
6e00: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 6e  IABLE: {.      n
6e10: 6f 74 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73  otValidCheckCons
6e20: 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 70  traint(pParse, p
6e30: 4e 43 2c 20 22 70 61 72 61 6d 65 74 65 72 73 22  NC, "parameters"
6e40: 29 3b 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c 69  );.      notVali
6e50: 64 50 61 72 74 49 64 78 57 68 65 72 65 28 70 50  dPartIdxWhere(pP
6e60: 61 72 73 65 2c 20 70 4e 43 2c 20 22 70 61 72 61  arse, pNC, "para
6e70: 6d 65 74 65 72 73 22 29 3b 0a 20 20 20 20 20 20  meters");.      
6e80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6e90: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 72 73  .  return (pPars
6ea0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
6eb0: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
6ec0: 6c 65 64 29 20 3f 20 57 52 43 5f 41 62 6f 72 74  led) ? WRC_Abort
6ed0: 20 3a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b   : WRC_Continue;
6ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74  .}../*.** pEList
6ef0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78   is a list of ex
6f00: 70 72 65 73 73 69 6f 6e 73 20 77 68 69 63 68 20  pressions which 
6f10: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 72  are really the r
6f20: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
6f30: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
6f40: 74 65 6d 65 6e 74 2e 20 20 70 45 20 69 73 20 61  tement.  pE is a
6f50: 20 74 65 72 6d 20 69 6e 20 61 6e 20 4f 52 44 45   term in an ORDE
6f60: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
6f70: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 54 68 69 73   clause..** This
6f80: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
6f90: 74 6f 20 73 65 65 20 69 66 20 70 45 20 69 73 20  to see if pE is 
6fa0: 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66  a simple identif
6fb0: 69 65 72 20 77 68 69 63 68 20 63 6f 72 72 65 73  ier which corres
6fc0: 70 6f 6e 64 73 0a 2a 2a 20 74 6f 20 74 68 65 20  ponds.** to the 
6fd0: 41 53 2d 6e 61 6d 65 20 6f 66 20 6f 6e 65 20 6f  AS-name of one o
6fe0: 66 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  f the terms of t
6ff0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
7000: 73 74 2e 20 20 49 66 20 69 74 20 69 73 2c 0a 2a  st.  If it is,.*
7010: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
7020: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
7030: 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e   between 1 and N
7040: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
7050: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6c 65  number of.** ele
7060: 6d 65 6e 74 73 20 69 6e 20 70 45 4c 69 73 74 2c  ments in pEList,
7070: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
7080: 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65  o the matching e
7090: 6e 74 72 79 2e 20 20 49 66 20 74 68 65 72 65 20  ntry.  If there 
70a0: 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20  is.** no match, 
70b0: 6f 72 20 69 66 20 70 45 20 69 73 20 6e 6f 74 20  or if pE is not 
70c0: 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66  a simple identif
70d0: 69 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ier, then this r
70e0: 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
70f0: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 45 4c 69 73 74   0..**.** pEList
7100: 20 68 61 73 20 62 65 65 6e 20 72 65 73 6f 6c 76   has been resolv
7110: 65 64 2e 20 20 70 45 20 68 61 73 20 6e 6f 74 2e  ed.  pE has not.
7120: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7130: 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 0a 20 20  esolveAsName(.  
7140: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
7150: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
7160: 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20  ntext for error 
7170: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 45 78  messages */.  Ex
7180: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
7190: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72   /* List of expr
71a0: 65 73 73 69 6f 6e 73 20 74 6f 20 73 63 61 6e 20  essions to scan 
71b0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20 20  */.  Expr *pE   
71c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
71d0: 73 73 69 6f 6e 20 77 65 20 61 72 65 20 74 72 79  ssion we are try
71e0: 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  ing to match */.
71f0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
7200: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
7210: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 55 4e  counter */..  UN
7220: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
7230: 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  Parse);..  if( p
7240: 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  E->op==TK_ID ){.
7250: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d      char *zCol =
7260: 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20   pE->u.zToken;. 
7270: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
7280: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
7290: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
72a0: 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  As = pEList->a[i
72b0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
72c0: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
72d0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
72e0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
72f0: 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b       return i+1;
7300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7310: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
7320: 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20  ../*.** pE is a 
7330: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78  pointer to an ex
7340: 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69  pression which i
7350: 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  s a single term 
7360: 69 6e 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  in the.** ORDER 
7370: 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  BY of a compound
7380: 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20 65 78   SELECT.  The ex
7390: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 6e 6f 74  pression has not
73a0: 20 62 65 65 6e 0a 2a 2a 20 6e 61 6d 65 20 72 65   been.** name re
73b0: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 74  solved..**.** At
73c0: 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20   the point this 
73d0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
73e0: 64 2c 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e  d, we already kn
73f0: 6f 77 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f  ow that the.** O
7400: 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73 20  RDER BY term is 
7410: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69  not an integer i
7420: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 72 65  ndex into the re
7430: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 61 74 0a  sult set.  That.
7440: 2a 2a 20 63 61 73 65 20 69 73 20 68 61 6e 64 6c  ** case is handl
7450: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
7460: 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  g routine..**.**
7470: 20 41 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63   Attempt to matc
7480: 68 20 70 45 20 61 67 61 69 6e 73 74 20 72 65 73  h pE against res
7490: 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
74a0: 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  in the left-most
74b0: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
74c0: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 74 68  ment.  Return th
74d0: 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65  e index i of the
74e0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
74f0: 2c 0a 2a 2a 20 61 73 20 61 6e 20 69 6e 64 69 63  ,.** as an indic
7500: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c  ation to the cal
7510: 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75  ler that it shou
7520: 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65 20 69  ld sort by the i
7530: 2d 74 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54  -th column..** T
7540: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
7550: 75 6d 6e 20 69 73 20 31 2e 20 20 49 6e 20 6f 74  umn is 1.  In ot
7560: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 76  her words, the v
7570: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
7580: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 69 6e 74   the.** same int
7590: 65 67 65 72 20 76 61 6c 75 65 20 74 68 61 74 20  eger value that 
75a0: 77 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  would be used in
75b0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
75c0: 6e 74 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a  nt to indicate.*
75d0: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  * the column..**
75e0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
75f0: 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e  no match, return
7600: 20 30 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69   0.  Return -1 i
7610: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
7620: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7630: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54   resolveOrderByT
7640: 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20  ermToExprList(. 
7650: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7660: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
7670: 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
7680: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53   messages */.  S
7690: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
76a0: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
76b0: 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74  statement with t
76c0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
76d0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  se */.  Expr *pE
76e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
76f0: 65 20 73 70 65 63 69 66 69 63 20 4f 52 44 45 52  e specific ORDER
7700: 20 42 59 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20   BY term */.){. 
7710: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
7720: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
7730: 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ter */.  ExprLis
7740: 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54  t *pEList;  /* T
7750: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
7760: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
7770: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63    NameContext nc
7780: 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
7790: 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69  text for resolvi
77a0: 6e 67 20 70 45 20 2a 2f 0a 20 20 73 71 6c 69 74  ng pE */.  sqlit
77b0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 2f 2a  e3 *db;       /*
77c0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
77d0: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
77e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
77f0: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
7800: 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
7810: 2f 0a 20 20 75 38 20 73 61 76 65 64 53 75 70 70  /.  u8 savedSupp
7820: 45 72 72 3b 20 20 20 2f 2a 20 53 61 76 65 64 20  Err;   /* Saved 
7830: 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 73 75 70  value of db->sup
7840: 70 72 65 73 73 45 72 72 20 2a 2f 0a 0a 20 20 61  pressErr */..  a
7850: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 45 78  ssert( sqlite3Ex
7860: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
7870: 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70 45 4c 69  &i)==0 );.  pELi
7880: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
7890: 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  List;..  /* Reso
78a0: 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e  lve all names in
78b0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
78c0: 72 6d 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  rm expression.  
78d0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c  */.  memset(&nc,
78e0: 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b   0, sizeof(nc));
78f0: 0a 20 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70  .  nc.pParse = p
7900: 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63  Parse;.  nc.pSrc
7910: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
7920: 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73  pSrc;.  nc.pELis
7930: 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63  t = pEList;.  nc
7940: 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c  .ncFlags = NC_Al
7950: 6c 6f 77 41 67 67 3b 0a 20 20 6e 63 2e 6e 45 72  lowAgg;.  nc.nEr
7960: 72 20 3d 20 30 3b 0a 20 20 64 62 20 3d 20 70 50  r = 0;.  db = pP
7970: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73 61 76 65  arse->db;.  save
7980: 64 53 75 70 70 45 72 72 20 3d 20 64 62 2d 3e 73  dSuppErr = db->s
7990: 75 70 70 72 65 73 73 45 72 72 3b 0a 20 20 64 62  uppressErr;.  db
79a0: 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20 3d 20  ->suppressErr = 
79b0: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
79c0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
79d0: 73 28 26 6e 63 2c 20 70 45 29 3b 0a 20 20 64 62  s(&nc, pE);.  db
79e0: 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20 3d 20  ->suppressErr = 
79f0: 73 61 76 65 64 53 75 70 70 45 72 72 3b 0a 20 20  savedSuppErr;.  
7a00: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
7a10: 30 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20  0;..  /* Try to 
7a20: 6d 61 74 63 68 20 74 68 65 20 4f 52 44 45 52 20  match the ORDER 
7a30: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67  BY expression ag
7a40: 61 69 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73  ainst an express
7a50: 69 6f 6e 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ion.  ** in the 
7a60: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 52 65 74  result set.  Ret
7a70: 75 72 6e 20 61 6e 20 31 2d 62 61 73 65 64 20 69  urn an 1-based i
7a80: 6e 64 65 78 20 6f 66 20 74 68 65 20 6d 61 74 63  ndex of the matc
7a90: 68 69 6e 67 0a 20 20 2a 2a 20 72 65 73 75 6c 74  hing.  ** result
7aa0: 2d 73 65 74 20 65 6e 74 72 79 2e 0a 20 20 2a 2f  -set entry..  */
7ab0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45  .  for(i=0; i<pE
7ac0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
7ad0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
7ae0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45  e3ExprCompare(pE
7af0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
7b00: 2c 20 70 45 2c 20 2d 31 29 3c 32 20 29 7b 0a 20  , pE, -1)<2 ){. 
7b10: 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b       return i+1;
7b20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
7b30: 20 49 66 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65   If no match, re
7b40: 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74  turn 0. */.  ret
7b50: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7b60: 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 52 44 45  Generate an ORDE
7b70: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
7b80: 20 74 65 72 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e   term out-of-ran
7b90: 67 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  ge error..*/.sta
7ba0: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
7bb0: 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28  OutOfRangeError(
7bc0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7bd0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
7be0: 20 65 72 72 6f 72 20 63 6f 6e 74 65 78 74 20 69   error context i
7bf0: 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 77 72 69  nto which to wri
7c00: 74 65 20 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a  te the error */.
7c10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
7c20: 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 4f 52 44  ype,     /* "ORD
7c30: 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20 2a  ER" or "GROUP" *
7c40: 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
7c50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
7c60: 65 20 69 6e 64 65 78 20 28 31 2d 62 61 73 65 64  e index (1-based
7c70: 29 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6f 75  ) of the term ou
7c80: 74 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20 20  t of range */.  
7c90: 69 6e 74 20 6d 78 20 20 20 20 20 20 20 20 20 20  int mx          
7ca0: 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73         /* Larges
7cb0: 74 20 70 65 72 6d 69 73 73 69 62 6c 65 20 76 61  t permissible va
7cc0: 6c 75 65 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20  lue of i */.){. 
7cd0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7ce0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 22 25  (pParse, .    "%
7cf0: 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74  r %s BY term out
7d00: 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75   of range - shou
7d10: 6c 64 20 62 65 20 22 0a 20 20 20 20 22 62 65 74  ld be ".    "bet
7d20: 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20  ween 1 and %d", 
7d30: 69 2c 20 7a 54 79 70 65 2c 20 6d 78 29 3b 0a 7d  i, zType, mx);.}
7d40: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20  ../*.** Analyze 
7d50: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
7d60: 75 73 65 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e  use in a compoun
7d70: 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  d SELECT stateme
7d80: 6e 74 2e 20 20 20 4d 6f 64 69 66 79 0a 2a 2a 20  nt.   Modify.** 
7d90: 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  each term of the
7da0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
7db0: 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69   is a constant i
7dc0: 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31  nteger between 1
7dd0: 0a 2a 2a 20 61 6e 64 20 4e 20 77 68 65 72 65 20  .** and N where 
7de0: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
7df0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
7e00: 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  e compound SELEC
7e10: 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42  T..**.** ORDER B
7e20: 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  Y terms that are
7e30: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 74 65   already an inte
7e40: 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ger between 1 an
7e50: 64 20 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64  d N are.** unmod
7e60: 69 66 69 65 64 2e 20 20 4f 52 44 45 52 20 42 59  ified.  ORDER BY
7e70: 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20   terms that are 
7e80: 69 6e 74 65 67 65 72 73 20 6f 75 74 73 69 64 65  integers outside
7e90: 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a   the range of.**
7ea0: 20 31 20 74 68 72 6f 75 67 68 20 4e 20 67 65 6e   1 through N gen
7eb0: 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 2e 20  erate an error. 
7ec0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
7ed0: 74 68 61 74 20 61 72 65 20 65 78 70 72 65 73 73  that are express
7ee0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6d 61 74 63  ions.** are matc
7ef0: 68 65 64 20 61 67 61 69 6e 73 74 20 72 65 73 75  hed against resu
7f00: 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
7f10: 6e 73 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 53  ns of compound S
7f20: 45 4c 45 43 54 0a 2a 2a 20 62 65 67 69 6e 6e 69  ELECT.** beginni
7f30: 6e 67 20 77 69 74 68 20 74 68 65 20 6c 65 66 74  ng with the left
7f40: 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 61 6e 64  -most SELECT and
7f50: 20 77 6f 72 6b 69 6e 67 20 74 6f 77 61 72 64 20   working toward 
7f60: 74 68 65 20 72 69 67 68 74 2e 0a 2a 2a 20 41 74  the right..** At
7f70: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
7f80: 2c 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  , the ORDER BY e
7f90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 61  xpression is tra
7fa0: 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a  nsformed into.**
7fb0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 63 6f 6c   the integer col
7fc0: 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  umn number..**.*
7fd0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
7fe0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
7ff0: 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  en..*/.static in
8000: 74 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e  t resolveCompoun
8010: 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72 73  dOrderBy(.  Pars
8020: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8030: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8040: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
8050: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
8060: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
8070: 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20 54  elect       /* T
8080: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
8090: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
80a0: 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 29  he ORDER BY */.)
80b0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70  {.  int i;.  Exp
80c0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
80d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
80e0: 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ist;.  sqlite3 *
80f0: 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f  db;.  int moreTo
8100: 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65  Do = 1;..  pOrde
8110: 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  rBy = pSelect->p
8120: 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70  OrderBy;.  if( p
8130: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
8140: 75 72 6e 20 30 3b 0a 20 20 64 62 20 3d 20 70 50  urn 0;.  db = pP
8150: 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 20 53 51  arse->db;.#if SQ
8160: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a  LITE_MAX_COLUMN.
8170: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
8180: 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
8190: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
81a0: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
81b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
81c0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
81d0: 65 72 6d 73 20 69 6e 20 4f 52 44 45 52 20 42 59  erms in ORDER BY
81e0: 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 72   clause");.    r
81f0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e  eturn 1;.  }.#en
8200: 64 69 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  dif.  for(i=0; i
8210: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
8220: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64  ; i++){.    pOrd
8230: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
8240: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65  = 0;.  }.  pSele
8250: 63 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ct->pNext = 0;. 
8260: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
8270: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
8280: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e  Select->pPrior->
8290: 70 4e 65 78 74 20 3d 20 70 53 65 6c 65 63 74 3b  pNext = pSelect;
82a0: 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70  .    pSelect = p
82b0: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
82c0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65    }.  while( pSe
82d0: 6c 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f  lect && moreToDo
82e0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
82f0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
8300: 74 65 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44  tem;.    moreToD
8310: 6f 20 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73  o = 0;.    pELis
8320: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
8330: 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
8340: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
8350: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
8360: 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
8370: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8380: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
8390: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
83a0: 20 2d 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20   -1;.      Expr 
83b0: 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20  *pE, *pDup;.    
83c0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e    if( pItem->don
83d0: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
83e0: 20 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33      pE = sqlite3
83f0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
8400: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
8410: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
8420: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
8430: 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
8440: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20      if( iCol<=0 
8450: 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
8460: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
8470: 20 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52     resolveOutOfR
8480: 61 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65  angeError(pParse
8490: 2c 20 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20  , "ORDER", i+1, 
84a0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
84b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
84c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
84d0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
84e0: 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76     iCol = resolv
84f0: 65 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  eAsName(pParse, 
8500: 70 45 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20  pEList, pE);.   
8510: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30       if( iCol==0
8520: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 44   ){.          pD
8530: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
8540: 44 75 70 28 64 62 2c 20 70 45 2c 20 30 29 3b 0a  Dup(db, pE, 0);.
8550: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 64            if( !d
8560: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8570: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
8580: 73 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20  ssert(pDup);.   
8590: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
85a0: 72 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65  resolveOrderByTe
85b0: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
85c0: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44  rse, pSelect, pD
85d0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  up);.          }
85e0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
85f0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8600: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
8610: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8620: 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( iCol>0 ){.  
8630: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
8640: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
8650: 72 6d 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67  rm into an integ
8660: 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  er column number
8670: 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 2a   iCol,.        *
8680: 2a 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  * taking care to
8690: 20 70 72 65 73 65 72 76 65 20 74 68 65 20 43 4f   preserve the CO
86a0: 4c 4c 41 54 45 20 63 6c 61 75 73 65 20 69 66 20  LLATE clause if 
86b0: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  it exists */.   
86c0: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
86d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
86e0: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
86f0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
8700: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ew==0 ) return 1
8710: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
8720: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
8730: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
8740: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
8750: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
8760: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70   pItem->pExpr==p
8770: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  E ){.          p
8780: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
8790: 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ew;.        }els
87a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  e{.          Exp
87b0: 72 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 49 74  r *pParent = pIt
87c0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
87d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
87e0: 72 65 6e 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  rent->op==TK_COL
87f0: 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20  LATE );.        
8800: 20 20 77 68 69 6c 65 28 20 70 50 61 72 65 6e 74    while( pParent
8810: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
8820: 43 4f 4c 4c 41 54 45 20 29 20 70 50 61 72 65 6e  COLLATE ) pParen
8830: 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65  t = pParent->pLe
8840: 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ft;.          as
8850: 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
8860: 4c 65 66 74 3d 3d 70 45 20 29 3b 0a 20 20 20 20  Left==pE );.    
8870: 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
8880: 4c 65 66 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Left = pNew;.   
8890: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
88a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
88b0: 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  (db, pE);.      
88c0: 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72    pItem->u.x.iOr
88d0: 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
88e0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49  iCol;.        pI
88f0: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20  tem->done = 1;. 
8900: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8910: 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31      moreToDo = 1
8920: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8930: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
8940: 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  elect->pNext;.  
8950: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
8960: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8970: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
8980: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
8990: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
89a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
89b0: 61 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20  arse, "%r ORDER 
89c0: 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  BY term does not
89d0: 20 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20   match any ".   
89e0: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e           "column
89f0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8a00: 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  et", i+1);.     
8a10: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
8a20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
8a30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
8a40: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
8a50: 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
8a60: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 70 4f  OUP BY clause pO
8a70: 72 64 65 72 42 79 20 6f 66 0a 2a 2a 20 74 68 65  rderBy of.** the
8a80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8a90: 74 20 70 53 65 6c 65 63 74 2e 20 20 49 66 20 61  t pSelect.  If a
8aa0: 6e 79 20 74 65 72 6d 20 69 73 20 72 65 66 65 72  ny term is refer
8ab0: 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 72 65 73  ence to a.** res
8ac0: 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
8ad0: 6f 6e 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65  on (as determine
8ae0: 64 20 62 79 20 74 68 65 20 45 78 70 72 4c 69 73  d by the ExprLis
8af0: 74 2e 61 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  t.a.u.x.iOrderBy
8b00: 43 6f 6c 0a 2a 2a 20 66 69 65 6c 64 29 20 74 68  Col.** field) th
8b10: 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
8b20: 74 65 72 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79  term into a copy
8b30: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
8b40: 6e 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74  nding result set
8b50: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  .** column..**.*
8b60: 2a 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20  * If any errors 
8b70: 61 72 65 20 64 65 74 65 63 74 65 64 2c 20 61 64  are detected, ad
8b80: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
8b90: 67 65 20 74 6f 20 70 50 61 72 73 65 20 61 6e 64  ge to pParse and
8ba0: 0a 2a 2a 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** return non-z
8bb0: 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ero.  Return zer
8bc0: 6f 20 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 61  o if no errors a
8bd0: 72 65 20 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  re seen..*/.int 
8be0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
8bf0: 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61  derGroupBy(.  Pa
8c00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8c10: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
8c20: 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65  ontext.  Leave e
8c30: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65  rror messages he
8c40: 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
8c50: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a  pSelect,      /*
8c60: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
8c70: 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  ement containing
8c80: 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20   the clause */. 
8c90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
8ca0: 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy,   /* The OR
8cb0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
8cc0: 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  BY clause to be 
8cd0: 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63  processed */.  c
8ce0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
8cf0: 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20       /* "ORDER" 
8d00: 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b  or "GROUP" */.){
8d10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
8d20: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8d30: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  ->db;.  ExprList
8d40: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
8d50: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8d60: 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20   *pItem;..  if( 
8d70: 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
8d80: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
8d90: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
8da0: 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   0;.#if SQLITE_M
8db0: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
8dc0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
8dd0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8de0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8df0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8e00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8e10: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
8e20: 6e 20 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c  n %s BY clause",
8e30: 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74   zType);.    ret
8e40: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
8e50: 66 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  f.  pEList = pSe
8e60: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
8e70: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
8e80: 30 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  0 );  /* sqlite3
8e90: 53 65 6c 65 63 74 4e 65 77 28 29 20 67 75 61 72  SelectNew() guar
8ea0: 61 6e 74 65 65 73 20 74 68 69 73 20 2a 2f 0a 20  antees this */. 
8eb0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
8ec0: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70  pOrderBy->a; i<p
8ed0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8ee0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
8ef0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
8f00: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
8f10: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
8f20: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
8f30: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
8f40: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c  ){.        resol
8f50: 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f  veOutOfRangeErro
8f60: 72 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c  r(pParse, zType,
8f70: 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45   i+1, pEList->nE
8f80: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  xpr);.        re
8f90: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
8fa0: 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69        resolveAli
8fb0: 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  as(pParse, pELis
8fc0: 74 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t, pItem->u.x.iO
8fd0: 72 64 65 72 42 79 43 6f 6c 2d 31 2c 20 70 49 74  rderByCol-1, pIt
8fe0: 65 6d 2d 3e 70 45 78 70 72 2c 0a 20 20 20 20 20  em->pExpr,.     
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
9000: 79 70 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ype,0);.    }.  
9010: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
9020: 0a 2f 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  ./*.** pOrderBy 
9030: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
9040: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
9050: 65 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  e in SELECT stat
9060: 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e 0a 2a  ement pSelect..*
9070: 2a 20 54 68 65 20 4e 61 6d 65 20 63 6f 6e 74 65  * The Name conte
9080: 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  xt of the SELECT
9090: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 4e   statement is pN
90a0: 43 2e 20 20 7a 54 79 70 65 20 69 73 20 65 69 74  C.  zType is eit
90b0: 68 65 72 0a 2a 2a 20 22 4f 52 44 45 52 22 20 6f  her.** "ORDER" o
90c0: 72 20 22 47 52 4f 55 50 22 20 64 65 70 65 6e 64  r "GROUP" depend
90d0: 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 74 79 70  ing on which typ
90e0: 65 20 6f 66 20 63 6c 61 75 73 65 20 70 4f 72 64  e of clause pOrd
90f0: 65 72 42 79 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  erBy is..**.** T
9100: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f  his routine reso
9110: 6c 76 65 73 20 65 61 63 68 20 74 65 72 6d 20 6f  lves each term o
9120: 66 20 74 68 65 20 63 6c 61 75 73 65 20 69 6e 74  f the clause int
9130: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  o an expression.
9140: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 64 65 72  .** If the order
9150: 2d 62 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69  -by term is an i
9160: 6e 74 65 67 65 72 20 49 20 62 65 74 77 65 65 6e  nteger I between
9170: 20 31 20 61 6e 64 20 4e 20 28 77 68 65 72 65 20   1 and N (where 
9180: 4e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  N is the.** numb
9190: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
91a0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
91b0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 29 20 74  of the SELECT) t
91c0: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
91d0: 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  on.** in the res
91e0: 6f 6c 75 74 69 6f 6e 20 69 73 20 61 20 63 6f 70  olution is a cop
91f0: 79 20 6f 66 20 74 68 65 20 49 2d 74 68 20 72 65  y of the I-th re
9200: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
9210: 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  ion.  If.** the 
9220: 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73  order-by term is
9230: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 74   an identifier t
9240: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
9250: 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f  to the AS-name o
9260: 66 0a 2a 2a 20 61 20 72 65 73 75 6c 74 2d 73 65  f.** a result-se
9270: 74 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  t expression, th
9280: 65 6e 20 74 68 65 20 74 65 72 6d 20 72 65 73 6f  en the term reso
9290: 6c 76 65 73 20 74 6f 20 61 20 63 6f 70 79 20 6f  lves to a copy o
92a0: 66 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  f the.** result-
92b0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  set expression. 
92c0: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
92d0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
92e0: 73 6f 6c 76 65 64 20 69 6e 0a 2a 2a 20 74 68 65  solved in.** the
92f0: 20 75 73 75 61 6c 20 77 61 79 20 2d 20 75 73 69   usual way - usi
9300: 6e 67 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ng sqlite3Resolv
9310: 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2a  eExprNames()..**
9320: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9330: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
9340: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
9350: 49 66 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c  If errors occur,
9360: 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 61 70 70 72   then.** an appr
9370: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
9380: 73 73 61 67 65 20 6d 69 67 68 74 20 62 65 20 6c  ssage might be l
9390: 65 66 74 20 69 6e 20 70 50 61 72 73 65 2e 20 20  eft in pParse.  
93a0: 28 4f 4f 4d 20 65 72 72 6f 72 73 0a 2a 2a 20 65  (OOM errors.** e
93b0: 78 63 65 70 74 65 64 2e 29 0a 2a 2f 0a 73 74 61  xcepted.).*/.sta
93c0: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f  tic int resolveO
93d0: 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e  rderGroupBy(.  N
93e0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
93f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
9400: 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   context of the 
9410: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9420: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
9430: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
9440: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
9450: 65 6e 74 20 68 6f 6c 64 69 6e 67 20 70 4f 72 64  ent holding pOrd
9460: 65 72 42 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  erBy */.  ExprLi
9470: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
9480: 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f  /* An ORDER BY o
9490: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
94a0: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a  e to resolve */.
94b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
94c0: 79 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65  ype     /* Eithe
94d0: 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  r "ORDER" or "GR
94e0: 4f 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72  OUP", as appropr
94f0: 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  iate */.){.  int
9500: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
9510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
9520: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
9530: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
9560: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  r */.  struct Ex
9570: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9580: 65 6d 3b 20 20 20 2f 2a 20 41 20 74 65 72 6d 20  em;   /* A term 
9590: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
95a0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73  clause */.  Pars
95b0: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
95c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
95d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
95e0: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 20  .  int nResult; 
95f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9600: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
9610: 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75  erms in the resu
9620: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 69 66 28  lt set */..  if(
9630: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
9640: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 73 75  eturn 0;.  nResu
9650: 6c 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  lt = pSelect->pE
9660: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
9670: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
9680: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  rse;.  for(i=0, 
9690: 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
96a0: 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  a; i<pOrderBy->n
96b0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
96c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
96d0: 45 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  E = pItem->pExpr
96e0: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 32 20  ;.    Expr *pE2 
96f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
9700: 70 43 6f 6c 6c 61 74 65 28 70 45 29 3b 0a 20 20  pCollate(pE);.  
9710: 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d    if( zType[0]!=
9720: 27 47 27 20 29 7b 0a 20 20 20 20 20 20 69 43 6f  'G' ){.      iCo
9730: 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d  l = resolveAsNam
9740: 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  e(pParse, pSelec
9750: 74 2d 3e 70 45 4c 69 73 74 2c 20 70 45 32 29 3b  t->pEList, pE2);
9760: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  .      if( iCol>
9770: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
9780: 49 66 20 61 6e 20 41 53 2d 6e 61 6d 65 20 6d 61  If an AS-name ma
9790: 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 6d 61  tch is found, ma
97a0: 72 6b 20 74 68 69 73 20 4f 52 44 45 52 20 42 59  rk this ORDER BY
97b0: 20 63 6f 6c 75 6d 6e 20 61 73 20 62 65 69 6e 67   column as being
97c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
97d0: 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  py of the iCol-t
97e0: 68 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  h result-set col
97f0: 75 6d 6e 2e 20 20 54 68 65 20 73 75 62 73 65 71  umn.  The subseq
9800: 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  uent call to.   
9810: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52       ** sqlite3R
9820: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
9830: 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72  By() will conver
9840: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
9850: 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20 2a 2a   to a.        **
9860: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
9870: 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20  l-th result-set 
9880: 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20  expression. */. 
9890: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
98a0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
98b0: 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20  (u16)iCol;.     
98c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
98d0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
98e0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
98f0: 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26 69 43  Integer(pE2, &iC
9900: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ol) ){.      /* 
9910: 54 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  The ORDER BY ter
9920: 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  m is an integer 
9930: 63 6f 6e 73 74 61 6e 74 2e 20 20 41 67 61 69 6e  constant.  Again
9940: 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e  , set the column
9950: 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  .      ** number
9960: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33   so that sqlite3
9970: 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
9980: 70 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65  pBy() will conve
9990: 72 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  rt the.      ** 
99a0: 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20 74 6f  order-by term to
99b0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72   a copy of the r
99c0: 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73  esult-set expres
99d0: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  sion */.      if
99e0: 28 20 69 43 6f 6c 3c 31 20 7c 7c 20 69 43 6f 6c  ( iCol<1 || iCol
99f0: 3e 30 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20  >0xffff ){.     
9a00: 20 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52     resolveOutOfR
9a10: 61 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65  angeError(pParse
9a20: 2c 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 6e 52  , zType, i+1, nR
9a30: 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20  esult);.        
9a40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
9a50: 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  }.      pItem->u
9a60: 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d  .x.iOrderByCol =
9a70: 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20   (u16)iCol;.    
9a80: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9a90: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77  }..    /* Otherw
9aa0: 69 73 65 2c 20 74 72 65 61 74 20 74 68 65 20 4f  ise, treat the O
9ab0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 61 73 20  RDER BY term as 
9ac0: 61 6e 20 6f 72 64 69 6e 61 72 79 20 65 78 70 72  an ordinary expr
9ad0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 49  ession */.    pI
9ae0: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
9af0: 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  yCol = 0;.    if
9b00: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
9b10: 45 78 70 72 4e 61 6d 65 73 28 70 4e 43 2c 20 70  ExprNames(pNC, p
9b20: 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  E) ){.      retu
9b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
9b40: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 65 6c 65  for(j=0; j<pSele
9b50: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ct->pEList->nExp
9b60: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; j++){.      i
9b70: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
9b80: 6d 70 61 72 65 28 70 45 2c 20 70 53 65 6c 65 63  mpare(pE, pSelec
9b90: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  t->pEList->a[j].
9ba0: 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b  pExpr, -1)==0 ){
9bb0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
9bc0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
9bd0: 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  = j+1;.      }. 
9be0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9bf0: 6e 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  n sqlite3Resolve
9c00: 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
9c10: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 4f  rse, pSelect, pO
9c20: 72 64 65 72 42 79 2c 20 7a 54 79 70 65 29 3b 0a  rderBy, zType);.
9c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
9c40: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 53 45   names in the SE
9c50: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
9c60: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
9c70: 64 65 73 63 65 6e 64 61 6e 74 73 2e 0a 2a 2f 0a  descendants..*/.
9c80: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
9c90: 76 65 53 65 6c 65 63 74 53 74 65 70 28 57 61 6c  veSelectStep(Wal
9ca0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
9cb0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 4e 61 6d 65  lect *p){.  Name
9cc0: 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
9cd0: 43 3b 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 74  C;  /* Context t
9ce0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 69  hat contains thi
9cf0: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 4e 61  s SELECT */.  Na
9d00: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
9d10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
9d20: 6e 74 65 78 74 20 6f 66 20 74 68 69 73 20 53 45  ntext of this SE
9d30: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 73  LECT */.  int is
9d40: 43 6f 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20  Compound;       
9d50: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 20 69    /* True if p i
9d60: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
9d70: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ect */.  int nCo
9d80: 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20  mpound;         
9d90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
9da0: 6d 70 6f 75 6e 64 20 74 65 72 6d 73 20 70 72 6f  mpound terms pro
9db0: 63 65 73 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  cessed so far */
9dc0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9dd0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;          /* Pa
9de0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9df0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
9e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9e10: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9e20: 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
9e30: 42 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 47  By;     /* The G
9e40: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
9e50: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66  /.  Select *pLef
9e60: 74 6d 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  tmost;      /* L
9e70: 65 66 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  eft-most of SELE
9e80: 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  CT of a compound
9e90: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
9ea0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
9eb0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
9ec0: 74 69 6f 6e 20 2a 2f 0a 20 20 0a 0a 20 20 61 73  tion */.  ..  as
9ed0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
9ee0: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
9ef0: 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 7b  & SF_Resolved ){
9f00: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
9f10: 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 4f 75  Prune;.  }.  pOu
9f20: 74 65 72 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d  terNC = pWalker-
9f30: 3e 75 2e 70 4e 43 3b 0a 20 20 70 50 61 72 73 65  >u.pNC;.  pParse
9f40: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
9f50: 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
9f60: 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4e 6f 72  e->db;..  /* Nor
9f70: 6d 61 6c 6c 79 20 73 71 6c 69 74 65 33 53 65 6c  mally sqlite3Sel
9f80: 65 63 74 45 78 70 61 6e 64 28 29 20 77 69 6c 6c  ectExpand() will
9f90: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
9fa0: 20 61 6e 64 20 77 69 6c 6c 20 68 61 76 65 0a 20   and will have. 
9fb0: 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 70 61   ** already expa
9fc0: 6e 64 65 64 20 74 68 69 73 20 53 45 4c 45 43 54  nded this SELECT
9fd0: 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  .  However, if t
9fe0: 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72  his is a subquer
9ff0: 79 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 61 6e  y within.  ** an
a000: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 73 71 6c   expression, sql
a010: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
a020: 61 6d 65 73 28 29 20 77 69 6c 6c 20 62 65 20 63  ames() will be c
a030: 61 6c 6c 65 64 20 77 69 74 68 6f 75 74 20 61 0a  alled without a.
a040: 20 20 2a 2a 20 70 72 69 6f 72 20 63 61 6c 6c 20    ** prior call 
a050: 74 6f 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  to sqlite3Select
a060: 45 78 70 61 6e 64 28 29 2e 20 20 57 68 65 6e 20  Expand().  When 
a070: 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 6c 65  that happens, le
a080: 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 53 65  t.  ** sqlite3Se
a090: 6c 65 63 74 50 72 65 70 28 29 20 64 6f 20 61 6c  lectPrep() do al
a0a0: 6c 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  l of the process
a0b0: 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
a0c0: 45 43 54 2e 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ECT..  ** sqlite
a0d0: 33 53 65 6c 65 63 74 50 72 65 70 28 29 20 77 69  3SelectPrep() wi
a0e0: 6c 6c 20 69 6e 76 6f 6b 65 20 62 6f 74 68 20 73  ll invoke both s
a0f0: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
a100: 6e 64 28 29 20 61 6e 64 0a 20 20 2a 2a 20 74 68  nd() and.  ** th
a110: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68  is routine in th
a120: 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
a130: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
a140: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
a150: 70 61 6e 64 65 64 29 3d 3d 30 20 29 7b 0a 20 20  panded)==0 ){.  
a160: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
a170: 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rep(pParse, p, p
a180: 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20 72 65  OuterNC);.    re
a190: 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45  turn (pParse->nE
a1a0: 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
a1b0: 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f 41 62  Failed) ? WRC_Ab
a1c0: 6f 72 74 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b  ort : WRC_Prune;
a1d0: 0a 20 20 7d 0a 0a 20 20 69 73 43 6f 6d 70 6f 75  .  }..  isCompou
a1e0: 6e 64 20 3d 20 70 2d 3e 70 50 72 69 6f 72 21 3d  nd = p->pPrior!=
a1f0: 30 3b 0a 20 20 6e 43 6f 6d 70 6f 75 6e 64 20 3d  0;.  nCompound =
a200: 20 30 3b 0a 20 20 70 4c 65 66 74 6d 6f 73 74 20   0;.  pLeftmost 
a210: 3d 20 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  = p;.  while( p 
a220: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
a230: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
a240: 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 3b  _Expanded)!=0 );
a250: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
a260: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
a270: 65 73 6f 6c 76 65 64 29 3d 3d 30 20 29 3b 0a 20  esolved)==0 );. 
a280: 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
a290: 3d 20 53 46 5f 52 65 73 6f 6c 76 65 64 3b 0a 0a  = SF_Resolved;..
a2a0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74      /* Resolve t
a2b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
a2c0: 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  n the LIMIT and 
a2d0: 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
a2e0: 54 68 65 73 65 0a 20 20 20 20 2a 2a 20 61 72 65  These.    ** are
a2f0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
a300: 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d  refer to any nam
a310: 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65  es, so pass an e
a320: 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74  mpty NameContext
a330: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
a340: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
a350: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
a360: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
a370: 73 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  se;.    if( sqli
a380: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
a390: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69  mes(&sNC, p->pLi
a3a0: 6d 69 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  mit) ||.        
a3b0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
a3c0: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  prNames(&sNC, p-
a3d0: 3e 70 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  >pOffset) ){.   
a3e0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
a3f0: 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ort;.    }..    
a400: 2f 2a 20 49 66 20 74 68 65 20 53 46 5f 43 6f 6e  /* If the SF_Con
a410: 76 65 72 74 65 64 20 66 6c 61 67 73 20 69 73 20  verted flags is 
a420: 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 53  set, then this S
a430: 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 77 61 73  elect object was
a440: 0a 20 20 20 20 2a 2a 20 77 61 73 20 63 72 65 61  .    ** was crea
a450: 74 65 64 20 62 79 20 74 68 65 20 63 6f 6e 76 65  ted by the conve
a460: 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74  rtCompoundSelect
a470: 54 6f 53 75 62 71 75 65 72 79 28 29 20 66 75 6e  ToSubquery() fun
a480: 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 49 6e  ction..    ** In
a490: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 4f   this case the O
a4a0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28  RDER BY clause (
a4b0: 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 73 68 6f  p->pOrderBy) sho
a4c0: 75 6c 64 20 62 65 20 72 65 73 6f 6c 76 65 64 0a  uld be resolved.
a4d0: 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20      ** as if it 
a4e0: 77 65 72 65 20 70 61 72 74 20 6f 66 20 74 68 65  were part of the
a4f0: 20 73 75 62 2d 71 75 65 72 79 2c 20 6e 6f 74 20   sub-query, not 
a500: 74 68 65 20 70 61 72 65 6e 74 2e 20 54 68 69 73  the parent. This
a510: 20 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 6d 6f   block.    ** mo
a520: 76 65 73 20 74 68 65 20 70 4f 72 64 65 72 42 79  ves the pOrderBy
a530: 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 73 75 62   down to the sub
a540: 2d 71 75 65 72 79 2e 20 49 74 20 77 69 6c 6c 20  -query. It will 
a550: 62 65 20 6d 6f 76 65 64 20 62 61 63 6b 0a 20 20  be moved back.  
a560: 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20 6e    ** after the n
a570: 61 6d 65 73 20 68 61 76 65 20 62 65 65 6e 20 72  ames have been r
a580: 65 73 6f 6c 76 65 64 2e 20 20 2a 2f 0a 20 20 20  esolved.  */.   
a590: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
a5a0: 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 20   & SF_Converted 
a5b0: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
a5c0: 2a 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d  *pSub = p->pSrc-
a5d0: 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
a5e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
a5f0: 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 26 26  pSrc->nSrc==1 &&
a600: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a   p->pOrderBy );.
a610: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
a620: 75 62 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53  ub->pPrior && pS
a630: 75 62 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20  ub->pOrderBy==0 
a640: 29 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  );.      pSub->p
a650: 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72  OrderBy = p->pOr
a660: 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e  derBy;.      p->
a670: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
a680: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65    }.  .    /* Re
a690: 63 75 72 73 69 76 65 6c 79 20 72 65 73 6f 6c 76  cursively resolv
a6a0: 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73  e names in all s
a6b0: 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2f  ubqueries.    */
a6c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a6d0: 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
a6e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
a6f0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
a700: 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
a710: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ->a[i];.      if
a720: 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
a730: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65   ){.        Name
a740: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20  Context *pNC;   
a750: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
a760: 20 69 74 65 72 61 74 65 20 6e 61 6d 65 20 63 6f   iterate name co
a770: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntexts */.      
a780: 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 30 3b 20    int nRef = 0; 
a790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a7a0: 65 66 63 6f 75 6e 74 20 66 6f 72 20 70 4f 75 74  efcount for pOut
a7b0: 65 72 4e 43 20 61 6e 64 20 6f 75 74 65 72 20 63  erNC and outer c
a7c0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20  ontexts */.     
a7d0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a7e0: 53 61 76 65 64 43 6f 6e 74 65 78 74 20 3d 20 70  SavedContext = p
a7f0: 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
a800: 65 78 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ext;..        /*
a810: 20 43 6f 75 6e 74 20 74 68 65 20 74 6f 74 61 6c   Count the total
a820: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
a830: 65 6e 63 65 73 20 74 6f 20 70 4f 75 74 65 72 4e  ences to pOuterN
a840: 43 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  C and all of its
a850: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 65  .        ** pare
a860: 6e 74 20 63 6f 6e 74 65 78 74 73 2e 20 41 66 74  nt contexts. Aft
a870: 65 72 20 72 65 73 6f 6c 76 69 6e 67 20 72 65 66  er resolving ref
a880: 65 72 65 6e 63 65 73 20 74 6f 20 65 78 70 72 65  erences to expre
a890: 73 73 69 6f 6e 73 20 69 6e 0a 20 20 20 20 20 20  ssions in.      
a8a0: 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 70 53 65 6c    ** pItem->pSel
a8b0: 65 63 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ect, check if th
a8c0: 69 73 20 76 61 6c 75 65 20 68 61 73 20 63 68 61  is value has cha
a8d0: 6e 67 65 64 2e 20 49 66 20 73 6f 2c 20 74 68 65  nged. If so, the
a8e0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 45 4c  n.        ** SEL
a8f0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 49  ECT statement pI
a900: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 6d 75 73  tem->pSelect mus
a910: 74 20 62 65 20 63 6f 72 72 65 6c 61 74 65 64 2e  t be correlated.
a920: 20 53 65 74 20 74 68 65 0a 20 20 20 20 20 20 20   Set the.       
a930: 20 2a 2a 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73   ** pItem->fg.is
a940: 43 6f 72 72 65 6c 61 74 65 64 20 66 6c 61 67 20  Correlated flag 
a950: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  if this is the c
a960: 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ase. */.        
a970: 66 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43  for(pNC=pOuterNC
a980: 3b 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e  ; pNC; pNC=pNC->
a990: 70 4e 65 78 74 29 20 6e 52 65 66 20 2b 3d 20 70  pNext) nRef += p
a9a0: 4e 43 2d 3e 6e 52 65 66 3b 0a 0a 20 20 20 20 20  NC->nRef;..     
a9b0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e     if( pItem->zN
a9c0: 61 6d 65 20 29 20 70 50 61 72 73 65 2d 3e 7a 41  ame ) pParse->zA
a9d0: 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74  uthContext = pIt
a9e0: 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  em->zName;.     
a9f0: 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
aa00: 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61  eSelectNames(pPa
aa10: 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c  rse, pItem->pSel
aa20: 65 63 74 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  ect, pOuterNC);.
aa30: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
aa40: 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a  zAuthContext = z
aa50: 53 61 76 65 64 43 6f 6e 74 65 78 74 3b 0a 20 20  SavedContext;.  
aa60: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
aa70: 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
aa80: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
aa90: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a  urn WRC_Abort;..
aaa0: 20 20 20 20 20 20 20 20 66 6f 72 28 70 4e 43 3d          for(pNC=
aab0: 70 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70  pOuterNC; pNC; p
aac0: 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e  NC=pNC->pNext) n
aad0: 52 65 66 20 2d 3d 20 70 4e 43 2d 3e 6e 52 65 66  Ref -= pNC->nRef
aae0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
aaf0: 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  ( pItem->fg.isCo
ab00: 72 72 65 6c 61 74 65 64 3d 3d 30 20 26 26 20 6e  rrelated==0 && n
ab10: 52 65 66 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref<=0 );.      
ab20: 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f    pItem->fg.isCo
ab30: 72 72 65 6c 61 74 65 64 20 3d 20 28 6e 52 65 66  rrelated = (nRef
ab40: 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  !=0);.      }.  
ab50: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65    }.  .    /* Se
ab60: 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e  t up the local n
ab70: 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70  ame-context to p
ab80: 61 73 73 20 74 6f 20 73 71 6c 69 74 65 33 52 65  ass to sqlite3Re
ab90: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
aba0: 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c   to.    ** resol
abb0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  ve the result-se
abc0: 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  t expression lis
abd0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e  t..    */.    sN
abe0: 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41  C.ncFlags = NC_A
abf0: 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 73 4e 43  llowAgg;.    sNC
ac00: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
ac10: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65  Src;.    sNC.pNe
ac20: 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20  xt = pOuterNC;. 
ac30: 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65   .    /* Resolve
ac40: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65   names in the re
ac50: 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20  sult set. */.   
ac60: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
ac70: 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73  lveExprListNames
ac80: 28 26 73 4e 43 2c 20 70 2d 3e 70 45 4c 69 73 74  (&sNC, p->pEList
ac90: 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
aca0: 62 6f 72 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  bort;.  .    /* 
acb0: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
acc0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
acd0: 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ons in the resul
ace0: 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52  t-set, and no GR
acf0: 4f 55 50 20 42 59 20 0a 20 20 20 20 2a 2a 20 65  OUP BY .    ** e
ad00: 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f  xpression, do no
ad10: 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74  t allow aggregat
ad20: 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65  es in any of the
ad30: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
ad40: 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ns..    */.    a
ad50: 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
ad60: 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
ad70: 74 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 47  te)==0 );.    pG
ad80: 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
ad90: 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 70 47  upBy;.    if( pG
ada0: 72 6f 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e 6e  roupBy || (sNC.n
adb0: 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41  cFlags & NC_HasA
adc0: 67 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  gg)!=0 ){.      
add0: 61 73 73 65 72 74 28 20 4e 43 5f 4d 69 6e 4d 61  assert( NC_MinMa
ade0: 78 41 67 67 3d 3d 53 46 5f 4d 69 6e 4d 61 78 41  xAgg==SF_MinMaxA
adf0: 67 67 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73  gg );.      p->s
ae00: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67  elFlags |= SF_Ag
ae10: 67 72 65 67 61 74 65 20 7c 20 28 73 4e 43 2e 6e  gregate | (sNC.n
ae20: 63 46 6c 61 67 73 26 4e 43 5f 4d 69 6e 4d 61 78  cFlags&NC_MinMax
ae30: 41 67 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Agg);.    }else{
ae40: 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  .      sNC.ncFla
ae50: 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41  gs &= ~NC_AllowA
ae60: 67 67 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  gg;.    }.  .   
ae70: 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20   /* If a HAVING 
ae80: 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e  clause is presen
ae90: 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  t, then there mu
aea0: 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59  st be a GROUP BY
aeb0: 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a   clause..    */.
aec0: 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69      if( p->pHavi
aed0: 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20  ng && !pGroupBy 
aee0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
aef0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
af00: 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61   "a GROUP BY cla
af10: 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20  use is required 
af20: 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b  before HAVING");
af30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
af40: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
af50: 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65   .    /* Add the
af60: 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20 6c   output column l
af70: 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d  ist to the name-
af80: 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70  context before p
af90: 61 72 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  arsing the.    *
afa0: 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  * other expressi
afb0: 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  ons in the SELEC
afc0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  T statement. Thi
afd0: 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 20  s is so that.   
afe0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20   ** expressions 
aff0: 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
b000: 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72  use (etc.) can r
b010: 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73 69  efer to expressi
b020: 6f 6e 73 20 62 79 0a 20 20 20 20 2a 2a 20 61 6c  ons by.    ** al
b030: 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73  iases in the res
b040: 75 6c 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a 0a  ult set..    **.
b050: 20 20 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69      ** Minor poi
b060: 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74  nt: If this is t
b070: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
b080: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  e expression wil
b090: 6c 20 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d 65  l be.    ** re-e
b0a0: 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63  valuated for eac
b0b0: 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  h reference to i
b0c0: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e  t..    */.    sN
b0d0: 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
b0e0: 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73 71  List;.    if( sq
b0f0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
b100: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
b110: 48 61 76 69 6e 67 29 20 29 20 72 65 74 75 72 6e  Having) ) return
b120: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
b130: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
b140: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
b150: 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 29 20 72  , p->pWhere) ) r
b160: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
b170: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ..    /* Resolve
b180: 20 6e 61 6d 65 73 20 69 6e 20 74 61 62 6c 65 2d   names in table-
b190: 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 20  valued-function 
b1a0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
b1b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
b1c0: 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  Src->nSrc; i++){
b1d0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72  .      struct Sr
b1e0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
b1f0: 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b  m = &p->pSrc->a[
b200: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  i];.      if( pI
b210: 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
b220: 63 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69  c.       && sqli
b230: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69  te3ResolveExprLi
b240: 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 49  stNames(&sNC, pI
b250: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
b260: 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
b270: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
b280: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
b290: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
b2a0: 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f  ORDER BY and GRO
b2b0: 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 6d 61  UP BY clauses ma
b2c0: 79 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 74  y not refer to t
b2d0: 65 72 6d 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f  erms in.    ** o
b2e0: 75 74 65 72 20 71 75 65 72 69 65 73 20 0a 20 20  uter queries .  
b2f0: 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 4e 65    */.    sNC.pNe
b300: 78 74 20 3d 20 30 3b 0a 20 20 20 20 73 4e 43 2e  xt = 0;.    sNC.
b310: 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c  ncFlags |= NC_Al
b320: 6c 6f 77 41 67 67 3b 0a 0a 20 20 20 20 2f 2a 20  lowAgg;..    /* 
b330: 49 66 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e  If this is a con
b340: 76 65 72 74 65 64 20 63 6f 6d 70 6f 75 6e 64 20  verted compound 
b350: 71 75 65 72 79 2c 20 6d 6f 76 65 20 74 68 65 20  query, move the 
b360: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
b370: 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65  from .    ** the
b380: 20 73 75 62 2d 71 75 65 72 79 20 62 61 63 6b 20   sub-query back 
b390: 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 71 75  to the parent qu
b3a0: 65 72 79 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ery. At this poi
b3b0: 6e 74 20 65 61 63 68 20 74 65 72 6d 0a 20 20 20  nt each term.   
b3c0: 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 4f   ** within the O
b3d0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 68  RDER BY clause h
b3e0: 61 73 20 62 65 65 6e 20 74 72 61 6e 73 66 6f 72  as been transfor
b3f0: 6d 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  med to an intege
b400: 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2a 20  r value..    ** 
b410: 54 68 65 73 65 20 69 6e 74 65 67 65 72 73 20 77  These integers w
b420: 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 20  ill be replaced 
b430: 62 79 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65  by copies of the
b440: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72   corresponding r
b450: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74  esult.    ** set
b460: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20   expressions by 
b470: 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 6f  the call to reso
b480: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
b490: 29 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20  ) below.  */.   
b4a0: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
b4b0: 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 20   & SF_Converted 
b4c0: 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20  ){.      Select 
b4d0: 2a 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d  *pSub = p->pSrc-
b4e0: 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20  >a[0].pSelect;. 
b4f0: 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79       p->pOrderBy
b500: 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42   = pSub->pOrderB
b510: 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70  y;.      pSub->p
b520: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
b530: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65   }..    /* Proce
b540: 73 73 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ss the ORDER BY 
b550: 63 6c 61 75 73 65 20 66 6f 72 20 73 69 6e 67 6c  clause for singl
b560: 65 74 6f 6e 20 53 45 4c 45 43 54 20 73 74 61 74  eton SELECT stat
b570: 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 54  ements..    ** T
b580: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
b590: 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64 73  se for compounds
b5a0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
b5b0: 74 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 20 20  ts is handled.  
b5c0: 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61 66 74 65    ** below, afte
b5d0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 73  r all of the res
b5e0: 75 6c 74 2d 73 65 74 73 20 66 6f 72 20 61 6c 6c  ult-sets for all
b5f0: 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 73   of the elements
b600: 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
b610: 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65 65  ompound have bee
b620: 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20  n resolved..    
b630: 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
b640: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
b650: 59 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 74 65  Y clause on a te
b660: 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rm of a compound
b670: 2d 73 65 6c 65 63 74 20 6f 74 68 65 72 0a 20 20  -select other.  
b680: 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 72 69    ** than the ri
b690: 67 68 74 2d 6d 6f 73 74 20 74 65 72 6d 2c 20 74  ght-most term, t
b6a0: 68 65 6e 20 74 68 61 74 20 69 73 20 61 20 73 79  hen that is a sy
b6b0: 6e 74 61 78 20 65 72 72 6f 72 2e 20 20 42 75 74  ntax error.  But
b6c0: 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a   the error.    *
b6d0: 2a 20 69 73 20 6e 6f 74 20 64 65 74 65 63 74 65  * is not detecte
b6e0: 64 20 75 6e 74 69 6c 20 6d 75 63 68 20 6c 61 74  d until much lat
b6f0: 65 72 2c 20 61 6e 64 20 73 6f 20 77 65 20 6e 65  er, and so we ne
b700: 65 64 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61  ed to go ahead a
b710: 6e 64 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76  nd.    ** resolv
b720: 65 20 74 68 6f 73 65 20 73 79 6d 62 6f 6c 73 20  e those symbols 
b730: 6f 6e 20 74 68 65 20 69 6e 63 6f 72 72 65 63 74  on the incorrect
b740: 20 4f 52 44 45 52 20 42 59 20 66 6f 72 20 63 6f   ORDER BY for co
b750: 6e 73 69 73 74 65 6e 63 79 2e 0a 20 20 20 20 2a  nsistency..    *
b760: 2f 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70  /.    if( isComp
b770: 6f 75 6e 64 3c 3d 6e 43 6f 6d 70 6f 75 6e 64 20  ound<=nCompound 
b780: 20 2f 2a 20 44 65 66 65 72 20 72 69 67 68 74 2d   /* Defer right-
b790: 6d 6f 73 74 20 4f 52 44 45 52 20 42 59 20 6f 66  most ORDER BY of
b7a0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20   a compound */. 
b7b0: 20 20 20 20 26 26 20 72 65 73 6f 6c 76 65 4f 72      && resolveOr
b7c0: 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c  derGroupBy(&sNC,
b7d0: 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c   p, p->pOrderBy,
b7e0: 20 22 4f 52 44 45 52 22 29 0a 20 20 20 20 29 7b   "ORDER").    ){
b7f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
b800: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
b810: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
b820: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
b830: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
b840: 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  t;.    }.  .    
b850: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 47  /* Resolve the G
b860: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20  ROUP BY clause. 
b870: 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
b880: 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 0a 20 20  e, make sure .  
b890: 20 20 2a 2a 20 74 68 65 20 47 52 4f 55 50 20 42    ** the GROUP B
b8a0: 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  Y clause does no
b8b0: 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67  t contain aggreg
b8c0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ate functions.. 
b8d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47     */.    if( pG
b8e0: 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
b8f0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
b900: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
b910: 20 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 6f   .      if( reso
b920: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
b930: 26 73 4e 43 2c 20 70 2c 20 70 47 72 6f 75 70 42  &sNC, p, pGroupB
b940: 79 2c 20 22 47 52 4f 55 50 22 29 20 7c 7c 20 64  y, "GROUP") || d
b950: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b960: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
b970: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
b980: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
b990: 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70  =0, pItem=pGroup
b9a0: 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42  By->a; i<pGroupB
b9b0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
b9c0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
b9d0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
b9e0: 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70  erty(pItem->pExp
b9f0: 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20  r, EP_Agg) ){.  
ba00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ba10: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
ba20: 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74  "aggregate funct
ba30: 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c  ions are not all
ba40: 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20  owed in ".      
ba50: 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52 4f          "the GRO
ba60: 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  UP BY clause");.
ba70: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ba80: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
ba90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
baa0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
bab0: 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 61  his is part of a
bac0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
bad0: 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20  , check that it 
bae0: 68 61 73 20 74 68 65 20 72 69 67 68 74 0a 20 20  has the right.  
baf0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65    ** number of e
bb00: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
bb10: 65 20 73 65 6c 65 63 74 20 6c 69 73 74 2e 20 2a  e select list. *
bb20: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65  /.    if( p->pNe
bb30: 78 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  xt && p->pEList-
bb40: 3e 6e 45 78 70 72 21 3d 70 2d 3e 70 4e 65 78 74  >nExpr!=p->pNext
bb50: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
bb60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
bb70: 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  SelectWrongNumTe
bb80: 72 6d 73 45 72 72 6f 72 28 70 50 61 72 73 65 2c  rmsError(pParse,
bb90: 20 70 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20   p->pNext);.    
bba0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
bbb0: 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rt;.    }..    /
bbc0: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
bbd0: 20 6e 65 78 74 20 74 65 72 6d 20 6f 66 20 74 68   next term of th
bbe0: 65 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 20 20 2a  e compound.    *
bbf0: 2f 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  /.    p = p->pPr
bc00: 69 6f 72 3b 0a 20 20 20 20 6e 43 6f 6d 70 6f 75  ior;.    nCompou
bc10: 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nd++;.  }..  /* 
bc20: 52 65 73 6f 6c 76 65 20 74 68 65 20 4f 52 44 45  Resolve the ORDE
bc30: 52 20 42 59 20 6f 6e 20 61 20 63 6f 6d 70 6f 75  R BY on a compou
bc40: 6e 64 20 53 45 4c 45 43 54 20 61 66 74 65 72 20  nd SELECT after 
bc50: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 0a 20 20 2a  all terms of.  *
bc60: 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68  * the compound h
bc70: 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  ave been resolve
bc80: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
bc90: 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f  Compound && reso
bca0: 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  lveCompoundOrder
bcb0: 42 79 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  By(pParse, pLeft
bcc0: 6d 6f 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74  most) ){.    ret
bcd0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
bce0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52 43   }..  return WRC
bcf0: 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Prune;.}../*.**
bd00: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
bd10: 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f  lks an expressio
bd20: 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c  n tree and resol
bd30: 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ves references t
bd40: 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d  o.** table colum
bd50: 6e 73 20 61 6e 64 20 72 65 73 75 6c 74 2d 73 65  ns and result-se
bd60: 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 41 74 20 74  t columns.  At t
bd70: 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 6f  he same time, do
bd80: 20 65 72 72 6f 72 0a 2a 2a 20 63 68 65 63 6b 69   error.** checki
bd90: 6e 67 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75  ng on function u
bda0: 73 61 67 65 20 61 6e 64 20 73 65 74 20 61 20 66  sage and set a f
bdb0: 6c 61 67 20 69 66 20 61 6e 79 20 61 67 67 72 65  lag if any aggre
bdc0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  gate functions.*
bdd0: 2a 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2a 0a 2a  * are seen..**.*
bde0: 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 74 61 62  * To resolve tab
bdf0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65 72  le columns refer
be00: 65 6e 63 65 73 20 77 65 20 6c 6f 6f 6b 20 66 6f  ences we look fo
be10: 72 20 6e 6f 64 65 73 20 28 6f 72 20 73 75 62 74  r nodes (or subt
be20: 72 65 65 73 29 20 6f 66 20 74 68 65 20 0a 2a 2a  rees) of the .**
be30: 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59   form X.Y.Z or Y
be40: 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 20 77 68 65  .Z or just Z whe
be50: 72 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 58 3a  re.**.**      X:
be60: 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61     The name of a
be70: 20 64 61 74 61 62 61 73 65 2e 20 20 45 78 3a 20   database.  Ex: 
be80: 20 22 6d 61 69 6e 22 20 6f 72 20 22 74 65 6d 70   "main" or "temp
be90: 22 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  " or.**         
bea0: 20 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e    the symbolic n
beb0: 61 6d 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ame assigned to 
bec0: 61 6e 20 41 54 54 41 43 48 2d 65 64 20 64 61 74  an ATTACH-ed dat
bed0: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
bee0: 20 20 59 3a 20 20 20 54 68 65 20 6e 61 6d 65 20    Y:   The name 
bef0: 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 61 20  of a table in a 
bf00: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 72  FROM clause.  Or
bf10: 20 69 6e 20 61 20 74 72 69 67 67 65 72 0a 2a 2a   in a trigger.**
bf20: 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65 20 6f             one o
bf30: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 6e 61  f the special na
bf40: 6d 65 73 20 22 6f 6c 64 22 20 6f 72 20 22 6e 65  mes "old" or "ne
bf50: 77 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 5a  w"..**.**      Z
bf60: 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20  :   The name of 
bf70: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
bf80: 65 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  e Y..**.** The n
bf90: 6f 64 65 20 61 74 20 74 68 65 20 72 6f 6f 74 20  ode at the root 
bfa0: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 20 69  of the subtree i
bfb0: 73 20 6d 6f 64 69 66 69 65 64 20 61 73 20 66 6f  s modified as fo
bfc0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
bfd0: 45 78 70 72 2e 6f 70 20 20 20 20 20 20 20 20 43  Expr.op        C
bfe0: 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c  hanged to TK_COL
bff0: 55 4d 4e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 70  UMN.**    Expr.p
c000: 54 61 62 20 20 20 20 20 20 50 6f 69 6e 74 73 20  Tab      Points 
c010: 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
c020: 65 63 74 20 66 6f 72 20 58 2e 59 0a 2a 2a 20 20  ect for X.Y.**  
c030: 20 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 20    Expr.iColumn  
c040: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65   The column inde
c050: 78 20 69 6e 20 58 2e 59 2e 20 20 2d 31 20 66 6f  x in X.Y.  -1 fo
c060: 72 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 20  r the rowid..** 
c070: 20 20 20 45 78 70 72 2e 69 54 61 62 6c 65 20 20     Expr.iTable  
c080: 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
c090: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 59  r number for X.Y
c0a0: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73  .**.**.** To res
c0b0: 6f 6c 76 65 20 72 65 73 75 6c 74 2d 73 65 74 20  olve result-set 
c0c0: 72 65 66 65 72 65 6e 63 65 73 2c 20 6c 6f 6f 6b  references, look
c0d0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
c0e0: 6e 6f 64 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  nodes of the.** 
c0f0: 66 6f 72 6d 20 5a 20 28 77 69 74 68 20 6e 6f 20  form Z (with no 
c100: 58 20 61 6e 64 20 59 20 70 72 65 66 69 78 29 20  X and Y prefix) 
c110: 77 68 65 72 65 20 74 68 65 20 5a 20 6d 61 74 63  where the Z matc
c120: 68 65 73 20 74 68 65 20 72 69 67 68 74 2d 68 61  hes the right-ha
c130: 6e 64 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6e  nd.** size of an
c140: 20 41 53 20 63 6c 61 75 73 65 20 69 6e 20 74 68   AS clause in th
c150: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 6f 66 20  e result-set of 
c160: 61 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20 5a  a SELECT.  The Z
c170: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
c180: 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 61 20  s replaced by a 
c190: 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 65 66 74  copy of the left
c1a0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
c1b0: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  e result-set exp
c1c0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 61 62 6c  ression..** Tabl
c1d0: 65 2d 6e 61 6d 65 20 61 6e 64 20 66 75 6e 63 74  e-name and funct
c1e0: 69 6f 6e 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6f  ion resolution o
c1f0: 63 63 75 72 73 20 6f 6e 20 74 68 65 20 73 75 62  ccurs on the sub
c200: 73 74 69 74 75 74 65 64 20 65 78 70 72 65 73 73  stituted express
c210: 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 20 20 46 6f  ion.** tree.  Fo
c220: 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 3a 0a 2a  r example, in:.*
c230: 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54  *.**      SELECT
c240: 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20 41   a+b AS x, c+d A
c250: 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  S y FROM t1 ORDE
c260: 52 20 42 59 20 78 3b 0a 2a 2a 0a 2a 2a 20 54 68  R BY x;.**.** Th
c270: 65 20 22 78 22 20 74 65 72 6d 20 6f 66 20 74 68  e "x" term of th
c280: 65 20 6f 72 64 65 72 20 62 79 20 69 73 20 72 65  e order by is re
c290: 70 6c 61 63 65 64 20 62 79 20 22 61 2b 62 22 20  placed by "a+b" 
c2a0: 74 6f 20 72 65 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a  to render:.**.**
c2b0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62        SELECT a+b
c2c0: 20 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20   AS x, c+d AS y 
c2d0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
c2e0: 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e 63   a+b;.**.** Func
c2f0: 74 69 6f 6e 20 63 61 6c 6c 73 20 61 72 65 20 63  tion calls are c
c300: 68 65 63 6b 65 64 20 74 6f 20 6d 61 6b 65 20 73  hecked to make s
c310: 75 72 65 20 74 68 61 74 20 74 68 65 20 66 75 6e  ure that the fun
c320: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 64 65 66  ction is .** def
c330: 69 6e 65 64 20 61 6e 64 20 74 68 61 74 20 74 68  ined and that th
c340: 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
c350: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72   of arguments ar
c360: 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 20  e specified..** 
c370: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
c380: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
c390: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74  function, then t
c3a0: 68 65 20 4e 43 5f 48 61 73 41 67 67 20 66 6c 61  he NC_HasAgg fla
c3b0: 67 20 69 73 0a 2a 2a 20 73 65 74 20 61 6e 64 20  g is.** set and 
c3c0: 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 63 68  the opcode is ch
c3d0: 61 6e 67 65 64 20 66 72 6f 6d 20 54 4b 5f 46 55  anged from TK_FU
c3e0: 4e 43 54 49 4f 4e 20 74 6f 20 54 4b 5f 41 47 47  NCTION to TK_AGG
c3f0: 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2a 20 49 66  _FUNCTION..** If
c400: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
c410: 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74  ontains aggregat
c420: 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e  e functions then
c430: 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70   the EP_Agg.** p
c440: 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65  roperty on the e
c450: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74  xpression is set
c460: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  ..**.** An error
c470: 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
c480: 20 69 6e 20 70 50 61 72 73 65 20 69 66 20 61 6e   in pParse if an
c490: 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e  ything is amiss.
c4a0: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
c4b0: 69 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74  if errors is ret
c4c0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
c4d0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
c4e0: 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f  Names( .  NameCo
c4f0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20  ntext *pNC,     
c500: 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74    /* Namespace t
c510: 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73  o resolve expres
c520: 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45  sions in. */.  E
c530: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
c540: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
c550: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
c560: 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20  nalyzed. */.){. 
c570: 20 75 31 36 20 73 61 76 65 64 48 61 73 41 67 67   u16 savedHasAgg
c580: 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20  ;.  Walker w;.. 
c590: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
c5a0: 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51  return 0;.#if SQ
c5b0: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
c5c0: 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20 20 50 61  PTH>0.  {.    Pa
c5d0: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
c5e0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 69  C->pParse;.    i
c5f0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
c600: 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65  eckHeight(pParse
c610: 2c 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74  , pExpr->nHeight
c620: 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48  +pNC->pParse->nH
c630: 65 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  eight) ){.      
c640: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
c650: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
c660: 67 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48  ght += pExpr->nH
c670: 65 69 67 68 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  eight;.  }.#endi
c680: 66 0a 20 20 73 61 76 65 64 48 61 73 41 67 67 20  f.  savedHasAgg 
c690: 3d 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26  = pNC->ncFlags &
c6a0: 20 28 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f 4d   (NC_HasAgg|NC_M
c6b0: 69 6e 4d 61 78 41 67 67 29 3b 0a 20 20 70 4e 43  inMaxAgg);.  pNC
c6c0: 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28 4e  ->ncFlags &= ~(N
c6d0: 43 5f 48 61 73 41 67 67 7c 4e 43 5f 4d 69 6e 4d  C_HasAgg|NC_MinM
c6e0: 61 78 41 67 67 29 3b 0a 20 20 6d 65 6d 73 65 74  axAgg);.  memset
c6f0: 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  (&w, 0, sizeof(w
c700: 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c  ));.  w.xExprCal
c710: 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45  lback = resolveE
c720: 78 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53 65  xprStep;.  w.xSe
c730: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72  lectCallback = r
c740: 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70  esolveSelectStep
c750: 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70  ;.  w.pParse = p
c760: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77 2e  NC->pParse;.  w.
c770: 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73  u.pNC = pNC;.  s
c780: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
c790: 77 2c 20 70 45 78 70 72 29 3b 0a 23 69 66 20 53  w, pExpr);.#if S
c7a0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
c7b0: 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50  EPTH>0.  pNC->pP
c7c0: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
c7d0: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
c7e0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e  .#endif.  if( pN
c7f0: 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 77 2e 70  C->nErr>0 || w.p
c800: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b  Parse->nErr>0 ){
c810: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
c820: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
c830: 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rror);.  }.  if(
c840: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
c850: 4e 43 5f 48 61 73 41 67 67 20 29 7b 0a 20 20 20  NC_HasAgg ){.   
c860: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
c870: 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b  (pExpr, EP_Agg);
c880: 0a 20 20 7d 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c  .  }.  pNC->ncFl
c890: 61 67 73 20 7c 3d 20 73 61 76 65 64 48 61 73 41  ags |= savedHasA
c8a0: 67 67 3b 0a 20 20 72 65 74 75 72 6e 20 45 78 70  gg;.  return Exp
c8b0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
c8c0: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d  pr, EP_Error);.}
c8d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
c8e0: 61 6c 6c 20 6e 61 6d 65 73 20 66 6f 72 20 61 6c  all names for al
c8f0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  l expression in 
c900: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
c910: 73 74 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  st.  This is.** 
c920: 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
c930: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
c940: 73 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  s() except that 
c950: 69 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 20  it works for an 
c960: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6c 69  expression.** li
c970: 73 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  st rather than a
c980: 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69   single expressi
c990: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
c9a0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73  e3ResolveExprLis
c9b0: 74 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43  tNames( .  NameC
c9c0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
c9d0: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
c9e0: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
c9f0: 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20  ssions in. */.  
ca00: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
ca10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
ca20: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
ca30: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  o be analyzed. *
ca40: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
ca50: 61 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30  assert( pList!=0
ca60: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
ca70: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
ca80: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
ca90: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
caa0: 61 6d 65 73 28 70 4e 43 2c 20 70 4c 69 73 74 2d  ames(pNC, pList-
cab0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72  >a[i].pExpr) ) r
cac0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
cad0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52  .  }.  return WR
cae0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
caf0: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c  *.** Resolve all
cb00: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 65 78   names in all ex
cb10: 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 61 20 53  pressions of a S
cb20: 45 4c 45 43 54 20 61 6e 64 20 69 6e 20 61 6c 6c  ELECT and in all
cb30: 0a 2a 2a 20 64 65 63 65 6e 64 65 6e 74 73 20 6f  .** decendents o
cb40: 66 20 74 68 65 20 53 45 4c 45 43 54 2c 20 69 6e  f the SELECT, in
cb50: 63 6c 75 64 69 6e 67 20 63 6f 6d 70 6f 75 6e 64  cluding compound
cb60: 73 20 6f 66 66 20 6f 66 20 70 2d 3e 70 50 72 69  s off of p->pPri
cb70: 6f 72 2c 0a 2a 2a 20 73 75 62 71 75 65 72 69 65  or,.** subquerie
cb80: 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
cb90: 2c 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73  , and subqueries
cba0: 20 75 73 65 64 20 61 73 20 46 52 4f 4d 20 63 6c   used as FROM cl
cbb0: 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 2e 0a 2a  ause.** terms..*
cbc0: 2a 0a 2a 2a 20 53 65 65 20 73 71 6c 69 74 65 33  *.** See sqlite3
cbd0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
cbe0: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
cbf0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6b 69 6e 64  tion of the kind
cc00: 73 20 6f 66 0a 2a 2a 20 74 72 61 6e 73 66 6f 72  s of.** transfor
cc10: 6d 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63  mations that occ
cc20: 75 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 53 45  ur..**.** All SE
cc30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20  LECT statements 
cc40: 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e  should have been
cc50: 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e 67 0a   expanded using.
cc60: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
cc70: 45 78 70 61 6e 64 28 29 20 70 72 69 6f 72 20 74  Expand() prior t
cc80: 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
cc90: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64  routine..*/.void
cca0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
ccb0: 65 6c 65 63 74 4e 61 6d 65 73 28 0a 20 20 50 61  electNames(.  Pa
ccc0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ccd0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
cce0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
ccf0: 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20  Select *p,      
cd00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45         /* The SE
cd10: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62  LECT statement b
cd20: 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20  eing coded. */. 
cd30: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f   NameContext *pO
cd40: 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20  uterNC  /* Name 
cd50: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 61 72 65  context for pare
cd60: 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nt SELECT statem
cd70: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b  ent */.){.  Walk
cd80: 65 72 20 77 3b 0a 0a 20 20 61 73 73 65 72 74 28  er w;..  assert(
cd90: 20 70 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65   p!=0 );.  memse
cda0: 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
cdb0: 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
cdc0: 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65  llback = resolve
cdd0: 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53  ExprStep;.  w.xS
cde0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
cdf0: 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65  resolveSelectSte
ce00: 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  p;.  w.pParse = 
ce10: 70 50 61 72 73 65 3b 0a 20 20 77 2e 75 2e 70 4e  pParse;.  w.u.pN
ce20: 43 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20  C = pOuterNC;.  
ce30: 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63  sqlite3WalkSelec
ce40: 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a  t(&w, p);.}../*.
ce50: 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  ** Resolve names
ce60: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 20   in expressions 
ce70: 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 72 65  that can only re
ce80: 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65  ference a single
ce90: 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20   table:.**.**   
cea0: 20 2a 20 20 20 43 48 45 43 4b 20 63 6f 6e 73 74   *   CHECK const
ceb0: 72 61 69 6e 74 73 0a 2a 2a 20 20 20 20 2a 20 20  raints.**    *  
cec0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20 6f   WHERE clauses o
ced0: 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65  n partial indice
cee0: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72  s.**.** The Expr
cef0: 2e 69 54 61 62 6c 65 20 76 61 6c 75 65 20 66 6f  .iTable value fo
cf00: 72 20 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f 43 4f  r Expr.op==TK_CO
cf10: 4c 55 4d 4e 20 6e 6f 64 65 73 20 6f 66 20 74 68  LUMN nodes of th
cf20: 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  e expression.** 
cf30: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 61 6e 64  is set to -1 and
cf40: 20 74 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   the Expr.iColum
cf50: 6e 20 76 61 6c 75 65 20 69 73 20 73 65 74 20 74  n value is set t
cf60: 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  o the column num
cf70: 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65  ber..**.** Any e
cf80: 72 72 6f 72 73 20 63 61 75 73 65 20 61 6e 20 65  rrors cause an e
cf90: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
cfa0: 62 65 20 73 65 74 20 69 6e 20 70 50 61 72 73 65  be set in pParse
cfb0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
cfc0: 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
cfd0: 72 65 6e 63 65 28 0a 20 20 50 61 72 73 65 20 2a  rence(.  Parse *
cfe0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
cff0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
d000: 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
d010: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
d020: 74 61 62 6c 65 20 62 65 69 6e 67 20 72 65 66 65  table being refe
d030: 72 65 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  renced */.  int 
d040: 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
d050: 2f 2a 20 4e 43 5f 49 73 43 68 65 63 6b 20 6f 72  /* NC_IsCheck or
d060: 20 4e 43 5f 50 61 72 74 49 64 78 20 2a 2f 0a 20   NC_PartIdx */. 
d070: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
d080: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
d090: 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20 20  on to resolve.  
d0a0: 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
d0b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d0c0: 74 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  t     /* Express
d0d0: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72 65 73 6f  ion list to reso
d0e0: 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  lve.  May be NUL
d0f0: 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  . */.){.  SrcLis
d100: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
d110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
d120: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
d130: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
d140: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
d150: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
d160: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
d170: 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d  text for pParse-
d180: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20  >pNewTable */.. 
d190: 20 61 73 73 65 72 74 28 20 74 79 70 65 3d 3d 4e   assert( type==N
d1a0: 43 5f 49 73 43 68 65 63 6b 20 7c 7c 20 74 79 70  C_IsCheck || typ
d1b0: 65 3d 3d 4e 43 5f 50 61 72 74 49 64 78 20 29 3b  e==NC_PartIdx );
d1c0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
d1d0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
d1e0: 0a 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c  .  memset(&sSrc,
d1f0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29   0, sizeof(sSrc)
d200: 29 3b 0a 20 20 73 53 72 63 2e 6e 53 72 63 20 3d  );.  sSrc.nSrc =
d210: 20 31 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e   1;.  sSrc.a[0].
d220: 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  zName = pTab->zN
d230: 61 6d 65 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d  ame;.  sSrc.a[0]
d240: 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  .pTab = pTab;.  
d250: 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f  sSrc.a[0].iCurso
d260: 72 20 3d 20 2d 31 3b 0a 20 20 73 4e 43 2e 70 50  r = -1;.  sNC.pP
d270: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
d280: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
d290: 26 73 53 72 63 3b 0a 20 20 73 4e 43 2e 6e 63 46  &sSrc;.  sNC.ncF
d2a0: 6c 61 67 73 20 3d 20 74 79 70 65 3b 0a 20 20 69  lags = type;.  i
d2b0: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
d2c0: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
d2d0: 20 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e   pExpr) ) return
d2e0: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  ;.  if( pList ) 
d2f0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
d300: 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43  prListNames(&sNC
d310: 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a              , pList);.}.