/ Hex Artifact Content
Login

Artifact 741f5dcdcb1f6df30778af87119931639921ec957bd3f1a9a6c669b1cb7c6069:


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 6c 79 20 76 61 6c 75 65 20 69   usually value i
0bb0: 73 0a 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74  s.** zero but it
0bc0: 20 6d 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69   might be more i
0bd0: 66 20 74 68 65 20 61 6c 69 61 73 20 69 73 20 63  f the alias is c
0be0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
0bf0: 61 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66  a subquery.** of
0c00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
0c10: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45  pression.  The E
0c20: 78 70 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66  xpr.op2 field of
0c30: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
0c40: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d  .** structures m
0c50: 75 73 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ust be increased
0c60: 20 62 79 20 74 68 65 20 6e 53 75 62 71 75 65 72   by the nSubquer
0c70: 79 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61  y amount..*/.sta
0c80: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
0c90: 41 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a  Alias(.  Parse *
0ca0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0cb0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0cc0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
0cd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f   *pEList,      /
0ce0: 2a 20 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a  * A result set *
0cf0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
0d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
0d10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
0d20: 73 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45  sult set.  0..pE
0d30: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f  List->nExpr-1 */
0d40: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
0d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
0d60: 6e 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f  nsform this into
0d70: 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
0d80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
0d90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
0da0: 70 65 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55  pe,     /* "GROU
0db0: 50 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72  P" or "ORDER" or
0dc0: 20 22 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75   "" */.  int nSu
0dd0: 62 71 75 65 72 79 20 20 20 20 20 20 20 20 20 20  bquery          
0de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
0df0: 71 75 65 72 69 65 73 20 74 68 61 74 20 74 68 65  queries that the
0e00: 20 6c 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67   label is moving
0e10: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
0e20: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
0e30: 2f 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63  /* The iCol-th c
0e40: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73  olumn of the res
0e50: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
0e60: 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20  r *pDup;        
0e70: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
0e80: 4f 72 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Orig */.  sqlite
0e90: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
0ea0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
0eb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
0ec0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
0ed0: 30 20 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74  0 && iCol<pEList
0ee0: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72  ->nExpr );.  pOr
0ef0: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ig = pEList->a[i
0f00: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  Col].pExpr;.  as
0f10: 73 65 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29  sert( pOrig!=0 )
0f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 69  ;.  assert( pOri
0f30: 67 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 52 65  g->flags & EP_Re
0f40: 73 6f 6c 76 65 64 20 29 3b 0a 20 20 64 62 20 3d  solved );.  db =
0f50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
0f60: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
0f70: 72 44 75 70 28 64 62 2c 20 70 4f 72 69 67 2c 20  rDup(db, pOrig, 
0f80: 30 29 3b 0a 20 20 69 66 28 20 70 44 75 70 3d 3d  0);.  if( pDup==
0f90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
0fa0: 28 20 70 4f 72 69 67 2d 3e 6f 70 21 3d 54 4b 5f  ( pOrig->op!=TK_
0fb0: 43 4f 4c 55 4d 4e 20 26 26 20 7a 54 79 70 65 5b  COLUMN && zType[
0fc0: 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 69  0]!='G' ){.    i
0fd0: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0fe0: 70 74 68 28 70 44 75 70 2c 20 6e 53 75 62 71 75  pth(pDup, nSubqu
0ff0: 65 72 79 29 3b 0a 20 20 20 20 70 44 75 70 20 3d  ery);.    pDup =
1000: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1010: 61 72 73 65 2c 20 54 4b 5f 41 53 2c 20 70 44 75  arse, TK_AS, pDu
1020: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  p, 0, 0);.    if
1030: 28 20 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75  ( pDup==0 ) retu
1040: 72 6e 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  rn;.    ExprSetP
1050: 72 6f 70 65 72 74 79 28 70 44 75 70 2c 20 45 50  roperty(pDup, EP
1060: 5f 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20  _Skip);.    if( 
1070: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
1080: 75 2e 78 2e 69 41 6c 69 61 73 3d 3d 30 20 29 7b  u.x.iAlias==0 ){
1090: 0a 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61  .      pEList->a
10a0: 5b 69 43 6f 6c 5d 2e 75 2e 78 2e 69 41 6c 69 61  [iCol].u.x.iAlia
10b0: 73 20 3d 20 28 75 31 36 29 28 2b 2b 70 50 61 72  s = (u16)(++pPar
10c0: 73 65 2d 3e 6e 41 6c 69 61 73 29 3b 0a 20 20 20  se->nAlias);.   
10d0: 20 7d 0a 20 20 20 20 70 44 75 70 2d 3e 69 54 61   }.    pDup->iTa
10e0: 62 6c 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ble = pEList->a[
10f0: 69 43 6f 6c 5d 2e 75 2e 78 2e 69 41 6c 69 61 73  iCol].u.x.iAlias
1100: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1110: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
1120: 45 20 29 7b 0a 20 20 20 20 70 44 75 70 20 3d 20  E ){.    pDup = 
1130: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
1140: 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
1150: 73 65 2c 20 70 44 75 70 2c 20 70 45 78 70 72 2d  se, pDup, pExpr-
1160: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  >u.zToken);.  }.
1170: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 63 61 6c  .  /* Before cal
1180: 6c 69 6e 67 20 73 71 6c 69 74 65 33 45 78 70 72  ling sqlite3Expr
1190: 44 65 6c 65 74 65 28 29 2c 20 73 65 74 20 74 68  Delete(), set th
11a0: 65 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  e EP_Static flag
11b0: 2e 20 54 68 69 73 20 0a 20 20 2a 2a 20 70 72 65  . This .  ** pre
11c0: 76 65 6e 74 73 20 45 78 70 72 44 65 6c 65 74 65  vents ExprDelete
11d0: 28 29 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67  () from deleting
11e0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
11f0: 75 72 65 20 69 74 73 65 6c 66 2c 0a 20 20 2a 2a  ure itself,.  **
1200: 20 61 6c 6c 6f 77 69 6e 67 20 69 74 20 74 6f 20   allowing it to 
1210: 62 65 20 72 65 70 6f 70 75 6c 61 74 65 64 20 62  be repopulated b
1220: 79 20 74 68 65 20 6d 65 6d 63 70 79 28 29 20 6f  y the memcpy() o
1230: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1240: 6c 69 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 70  line..  ** The p
1250: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 6d  Expr->u.zToken m
1260: 69 67 68 74 20 70 6f 69 6e 74 20 69 6e 74 6f 20  ight point into 
1270: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1280: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
1290: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 44 62 46  .  ** sqlite3DbF
12a0: 72 65 65 28 64 62 2c 20 70 44 75 70 29 20 6f 6e  ree(db, pDup) on
12b0: 20 74 68 65 20 6c 61 73 74 20 6c 69 6e 65 20 6f   the last line o
12c0: 66 20 74 68 69 73 20 62 6c 6f 63 6b 2c 20 73 6f  f this block, so
12d0: 20 62 65 20 73 75 72 65 20 74 6f 0a 20 20 2a 2a   be sure to.  **
12e0: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
12f0: 74 68 65 20 74 6f 6b 65 6e 20 62 65 66 6f 72 65  the token before
1300: 20 64 6f 69 6e 67 20 74 68 65 20 73 71 6c 69 74   doing the sqlit
1310: 65 33 44 62 46 72 65 65 28 29 2e 0a 20 20 2a 2f  e3DbFree()..  */
1320: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
1330: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
1340: 74 69 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  tic);.  sqlite3E
1350: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
1360: 78 70 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  xpr);.  memcpy(p
1370: 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65  Expr, pDup, size
1380: 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 69  of(*pExpr));.  i
1390: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
13a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
13b0: 74 56 61 6c 75 65 29 20 26 26 20 70 45 78 70 72  tValue) && pExpr
13c0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 7b  ->u.zToken!=0 ){
13d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45  .    assert( (pE
13e0: 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 28 45 50  xpr->flags & (EP
13f0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
1400: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
1410: 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
1420: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
1430: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 75  Dup(db, pExpr->u
1440: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 45  .zToken);.    pE
1450: 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
1460: 5f 4d 65 6d 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  _MemToken;.  }. 
1470: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1480: 62 2c 20 70 44 75 70 29 3b 0a 7d 0a 0a 0a 2f 2a  b, pDup);.}.../*
1490: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
14a0: 69 66 20 74 68 65 20 6e 61 6d 65 20 7a 43 6f 6c  if the name zCol
14b0: 20 6f 63 63 75 72 73 20 61 6e 79 77 68 65 72 65   occurs anywhere
14c0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
14d0: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ause..**.** Retu
14e0: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  rn FALSE if the 
14f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  USING clause is 
1500: 4e 55 4c 4c 20 6f 72 20 69 66 20 69 74 20 64 6f  NULL or if it do
1510: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a  es not contain.*
1520: 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a 73 74 61 74 69  * zCol..*/.stati
1530: 63 20 69 6e 74 20 6e 61 6d 65 49 6e 55 73 69 6e  c int nameInUsin
1540: 67 43 6c 61 75 73 65 28 49 64 4c 69 73 74 20 2a  gClause(IdList *
1550: 70 55 73 69 6e 67 2c 20 63 6f 6e 73 74 20 63 68  pUsing, const ch
1560: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 66 28  ar *zCol){.  if(
1570: 20 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 69   pUsing ){.    i
1580: 6e 74 20 6b 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  nt k;.    for(k=
1590: 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64  0; k<pUsing->nId
15a0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; k++){.      if
15b0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
15c0: 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e  (pUsing->a[k].zN
15d0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
15e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
15f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1600: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 71 75 65 72  }../*.** Subquer
1610: 69 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 6f  ies stores the o
1620: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1630: 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  , table and colu
1640: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65  mn names for the
1650: 69 72 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74  ir.** result set
1660: 73 20 69 6e 20 45 78 70 72 4c 69 73 74 2e 61 5b  s in ExprList.a[
1670: 5d 2e 7a 53 70 61 6e 2c 20 69 6e 20 74 68 65 20  ].zSpan, in the 
1680: 66 6f 72 6d 20 22 44 41 54 41 42 41 53 45 2e 54  form "DATABASE.T
1690: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 22 2e 0a 2a 2a  ABLE.COLUMN"..**
16a0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
16b0: 20 74 68 65 20 7a 53 70 61 6e 20 67 69 76 65 6e   the zSpan given
16c0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
16d0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 7a 44 62   matches the zDb
16e0: 2c 20 7a 54 61 62 2c 0a 2a 2a 20 61 6e 64 20 7a  , zTab,.** and z
16f0: 43 6f 6c 2e 20 20 49 66 20 61 6e 79 20 6f 66 20  Col.  If any of 
1700: 7a 44 62 2c 20 7a 54 61 62 2c 20 61 6e 64 20 7a  zDb, zTab, and z
1710: 43 6f 6c 20 61 72 65 20 4e 55 4c 4c 20 74 68 65  Col are NULL the
1720: 6e 20 74 68 6f 73 65 20 66 69 65 6c 64 73 20 77  n those fields w
1730: 69 6c 6c 0a 2a 2a 20 6d 61 74 63 68 20 61 6e 79  ill.** match any
1740: 74 68 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  thing..*/.int sq
1750: 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
1760: 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me(.  const char
1770: 20 2a 7a 53 70 61 6e 2c 0a 20 20 63 6f 6e 73 74   *zSpan,.  const
1780: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 0a 20 20 63   char *zCol,.  c
1790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c  onst char *zTab,
17a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17b0: 44 62 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Db.){.  int n;. 
17c0: 20 66 6f 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53   for(n=0; ALWAYS
17d0: 28 7a 53 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53  (zSpan[n]) && zS
17e0: 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b  pan[n]!='.'; n++
17f0: 29 7b 7d 0a 20 20 69 66 28 20 7a 44 62 20 26 26  ){}.  if( zDb &&
1800: 20 28 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d   (sqlite3StrNICm
1810: 70 28 7a 53 70 61 6e 2c 20 7a 44 62 2c 20 6e 29  p(zSpan, zDb, n)
1820: 21 3d 30 20 7c 7c 20 7a 44 62 5b 6e 5d 21 3d 30  !=0 || zDb[n]!=0
1830: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1840: 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b  0;.  }.  zSpan +
1850: 3d 20 6e 2b 31 3b 0a 20 20 66 6f 72 28 6e 3d 30  = n+1;.  for(n=0
1860: 3b 20 41 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e  ; ALWAYS(zSpan[n
1870: 5d 29 20 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d  ]) && zSpan[n]!=
1880: 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66  '.'; n++){}.  if
1890: 28 20 7a 54 61 62 20 26 26 20 28 73 71 6c 69 74  ( zTab && (sqlit
18a0: 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 70 61 6e  e3StrNICmp(zSpan
18b0: 2c 20 7a 54 61 62 2c 20 6e 29 21 3d 30 20 7c 7c  , zTab, n)!=0 ||
18c0: 20 7a 54 61 62 5b 6e 5d 21 3d 30 29 20 29 7b 0a   zTab[n]!=0) ){.
18d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18e0: 7d 0a 20 20 7a 53 70 61 6e 20 2b 3d 20 6e 2b 31  }.  zSpan += n+1
18f0: 3b 0a 20 20 69 66 28 20 7a 43 6f 6c 20 26 26 20  ;.  if( zCol && 
1900: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1910: 53 70 61 6e 2c 20 7a 43 6f 6c 29 21 3d 30 20 29  Span, zCol)!=0 )
1920: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1930: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1940: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1950: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
1960: 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  umn of the form 
1970: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20  X.Y.Z or Y.Z or 
1980: 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a  just Z, look up.
1990: 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20  ** that name in 
19a0: 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63  the set of sourc
19b0: 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  e tables in pSrc
19c0: 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68  List and make th
19d0: 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72  e pExpr .** expr
19e0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65  ession node refe
19f0: 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73  r back to that s
1a00: 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  ource column.  T
1a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
1a20: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1a30: 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a   to pExpr:.**.**
1a40: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20      pExpr->iDb  
1a50: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65           Set the
1a60: 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44   index in db->aD
1a70: 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62  b[] of the datab
1a80: 61 73 65 20 58 0a 2a 2a 20 20 20 20 20 20 20 20  ase X.**        
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 28 65 76 65 6e 20 69 66 20 58 20 69 73 20 69   (even if X is i
1ab0: 6d 70 6c 69 65 64 29 2e 0a 2a 2a 20 20 20 20 70  mplied)..**    p
1ac0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20  Expr->iTable    
1ad0: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
1ae0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1af0: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69   the table obtai
1b00: 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ned.**          
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1b20: 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a  rom pSrcList..**
1b30: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
1b40: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 73 20           Points 
1b50: 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
1b60: 75 63 74 75 72 65 20 6f 66 20 58 2e 59 20 28 65  ucture of X.Y (e
1b70: 76 65 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20  ven if.**       
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 58 20 61 6e 64 2f 6f 72 20 59 20 61 72 65    X and/or Y are
1ba0: 20 69 6d 70 6c 69 65 64 2e 29 0a 2a 2a 20 20 20   implied.).**   
1bb0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
1bc0: 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65        Set to the
1bd0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
1be0: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ithin the table.
1bf0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .**    pExpr->op
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20              Set 
1c10: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a  to TK_COLUMN..**
1c20: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1c30: 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70           Any exp
1c40: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
1c50: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
1c60: 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  d.**    pExpr->p
1c70: 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79  Right        Any
1c80: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
1c90: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
1ca0: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
1cb0: 20 7a 44 62 20 76 61 72 69 61 62 6c 65 20 69 73   zDb variable is
1cc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1cd0: 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22   database (the "
1ce0: 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65  X").  This value
1cf0: 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20   may be.** NULL 
1d00: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d  meaning that nam
1d10: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
1d20: 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20   Y.Z or Z.  Any 
1d30: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61  available databa
1d40: 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  se.** can be use
1d50: 64 2e 20 20 54 68 65 20 7a 54 61 62 6c 65 20 76  d.  The zTable v
1d60: 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 6e  ariable is the n
1d70: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1d80: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
1d90: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
1da0: 65 20 4e 55 4c 4c 20 69 66 20 7a 44 62 20 69 73  e NULL if zDb is
1db0: 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20   also NULL.  If 
1dc0: 7a 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 20 69  zTable is NULL i
1dd0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
1de0: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
1df0: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
1e00: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
1e10: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
1e20: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
1e30: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
1e40: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
1e50: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
1e60: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
1e70: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
1e80: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 57 52 43  e and return WRC
1e90: 5f 41 62 6f 72 74 2e 20 20 52 65 74 75 72 6e 20  _Abort.  Return 
1ea0: 57 52 43 5f 50 72 75 6e 65 20 6f 6e 20 73 75 63  WRC_Prune on suc
1eb0: 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
1ec0: 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a  int lookupName(.
1ed0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ee0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1ef0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1f00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f10: 44 62 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Db,     /* Name 
1f20: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
1f40: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c  onst char *zTab,
1f60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f70: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1f80: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20  column, or NULL 
1f90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1fa0: 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zCol,    /* Nam
1fb0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
1fc0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
1fd0: 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68  t *pNC,    /* Th
1fe0: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75  e name context u
1ff0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  sed to resolve t
2000: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  he name */.  Exp
2010: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
2020: 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45    /* Make this E
2030: 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74  XPR node point t
2040: 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63  o the selected c
2050: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  olumn */.){.  in
2060: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2090: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   */.  int cnt = 
20a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20c0: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
20d0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
20e0: 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20  int cntTab = 0; 
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
2110: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61  atching table na
2120: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  mes */.  int nSu
2130: 62 71 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20  bquery = 0;     
2140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
2150: 77 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66  w many levels of
2160: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
2170: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2180: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
2190: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
21a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
21b0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21c0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20  item *pItem;    
21d0: 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f     /* Use for lo
21e0: 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63 4c  oping over pSrcL
21f0: 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73  ist items */.  s
2200: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2210: 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20  em *pMatch = 0; 
2220: 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e 67   /* The matching
2230: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20 2a   pSrcList item *
2240: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
2250: 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20  *pTopNC = pNC;  
2260: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e        /* First n
2270: 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74 68  amecontext in th
2280: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53 63 68 65  e list */.  Sche
2290: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 30 3b  ma *pSchema = 0;
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b0: 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65 20 65   Schema of the e
22c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
22d0: 6e 74 20 69 73 54 72 69 67 67 65 72 20 3d 20 30  nt isTrigger = 0
22e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22f0: 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 73 6f   /* True if reso
2300: 6c 76 65 64 20 74 6f 20 61 20 74 72 69 67 67 65  lved to a trigge
2310: 72 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 54 61  r column */.  Ta
2320: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
2330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2340: 2f 2a 20 54 61 62 6c 65 20 68 6f 6c 64 20 74 68  /* Table hold th
2350: 65 20 72 6f 77 20 2a 2f 0a 20 20 43 6f 6c 75 6d  e row */.  Colum
2360: 6e 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20 20  n *pCol;        
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2380: 41 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62  A column of pTab
2390: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
23a0: 4e 43 20 29 3b 20 20 20 20 20 2f 2a 20 74 68 65  NC );     /* the
23b0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 63 61   name context ca
23c0: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f  nnot be NULL. */
23d0: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 20  .  assert( zCol 
23e0: 29 3b 20 20 20 20 2f 2a 20 54 68 65 20 5a 20 69  );    /* The Z i
23f0: 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62  n X.Y.Z cannot b
2400: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 61 73 73 65  e NULL */.  asse
2410: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
2420: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54  erty(pExpr, EP_T
2430: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
2440: 63 65 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e  ced) );..  /* In
2450: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 64  itialize the nod
2460: 65 20 74 6f 20 6e 6f 2d 6d 61 74 63 68 20 2a 2f  e to no-match */
2470: 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  .  pExpr->iTable
2480: 20 3d 20 2d 31 3b 0a 20 20 70 45 78 70 72 2d 3e   = -1;.  pExpr->
2490: 70 54 61 62 20 3d 20 30 3b 0a 20 20 45 78 70 72  pTab = 0;.  Expr
24a0: 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
24b0: 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
24c0: 65 29 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 6c  e);..  /* Transl
24d0: 61 74 65 20 74 68 65 20 73 63 68 65 6d 61 20 6e  ate the schema n
24e0: 61 6d 65 20 69 6e 20 7a 44 62 20 69 6e 74 6f 20  ame in zDb into 
24f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
2500: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 20   corresponding. 
2510: 20 2a 2a 20 73 63 68 65 6d 61 2e 20 20 49 66 20   ** schema.  If 
2520: 6e 6f 74 20 66 6f 75 6e 64 2c 20 70 53 63 68 65  not found, pSche
2530: 6d 61 20 77 69 6c 6c 20 72 65 6d 61 69 6e 20 4e  ma will remain N
2540: 55 4c 4c 20 61 6e 64 20 6e 6f 74 68 69 6e 67 20  ULL and nothing 
2550: 77 69 6c 6c 20 6d 61 74 63 68 0a 20 20 2a 2a 20  will match.  ** 
2560: 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20  resulting in an 
2570: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
2580: 72 20 6d 65 73 73 61 67 65 20 74 6f 77 61 72 64  r message toward
2590: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
25a0: 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2f 0a 20 20   routine.  */.  
25b0: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 74  if( zDb ){.    t
25c0: 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63  estcase( pNC->nc
25d0: 46 6c 61 67 73 20 26 20 4e 43 5f 50 61 72 74 49  Flags & NC_PartI
25e0: 64 78 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  dx );.    testca
25f0: 73 65 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  se( pNC->ncFlags
2600: 20 26 20 4e 43 5f 49 73 43 68 65 63 6b 20 29 3b   & NC_IsCheck );
2610: 0a 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e  .    if( (pNC->n
2620: 63 46 6c 61 67 73 20 26 20 28 4e 43 5f 50 61 72  cFlags & (NC_Par
2630: 74 49 64 78 7c 4e 43 5f 49 73 43 68 65 63 6b 29  tIdx|NC_IsCheck)
2640: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )!=0 ){.      /*
2650: 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65   Silently ignore
2660: 20 64 61 74 61 62 61 73 65 20 71 75 61 6c 69 66   database qualif
2670: 69 65 72 73 20 69 6e 73 69 64 65 20 43 48 45 43  iers inside CHEC
2680: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e  K constraints an
2690: 64 0a 20 20 20 20 20 20 2a 2a 20 70 61 72 74 69  d.      ** parti
26a0: 61 6c 20 69 6e 64 69 63 65 73 2e 20 20 44 6f 20  al indices.  Do 
26b0: 6e 6f 74 20 72 61 69 73 65 20 65 72 72 6f 72 73  not raise errors
26c0: 20 62 65 63 61 75 73 65 20 74 68 61 74 20 6d 69   because that mi
26d0: 67 68 74 20 62 72 65 61 6b 0a 20 20 20 20 20 20  ght break.      
26e0: 2a 2a 20 6c 65 67 61 63 79 20 61 6e 64 20 62 65  ** legacy and be
26f0: 63 61 75 73 65 20 69 74 20 64 6f 65 73 20 6e 6f  cause it does no
2700: 74 20 68 75 72 74 20 61 6e 79 74 68 69 6e 67 20  t hurt anything 
2710: 74 6f 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 74  to just ignore t
2720: 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
2730: 62 61 73 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  base name. */.  
2740: 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20      zDb = 0;.   
2750: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2760: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
2770: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2780: 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b  assert( db->aDb[
2790: 69 5d 2e 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20  i].zName );.    
27a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
27b0: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69  trICmp(db->aDb[i
27c0: 5d 2e 7a 4e 61 6d 65 2c 7a 44 62 29 3d 3d 30 20  ].zName,zDb)==0 
27d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 63  ){.          pSc
27e0: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
27f0: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ].pSchema;.     
2800: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2810: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2820: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74    }.  }..  /* St
2830: 61 72 74 20 61 74 20 74 68 65 20 69 6e 6e 65 72  art at the inner
2840: 2d 6d 6f 73 74 20 63 6f 6e 74 65 78 74 20 61 6e  -most context an
2850: 64 20 6d 6f 76 65 20 6f 75 74 77 61 72 64 20 75  d move outward u
2860: 6e 74 69 6c 20 61 20 6d 61 74 63 68 20 69 73 20  ntil a match is 
2870: 66 6f 75 6e 64 20 2a 2f 0a 20 20 77 68 69 6c 65  found */.  while
2880: 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20  ( pNC && cnt==0 
2890: 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74 20  ){.    ExprList 
28a0: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 72 63  *pEList;.    Src
28b0: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
28c0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
28d0: 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c 69 73  .    if( pSrcLis
28e0: 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  t ){.      for(i
28f0: 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c 69  =0, pItem=pSrcLi
2900: 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73  st->a; i<pSrcLis
2910: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
2920: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
2930: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
2940: 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ab;.        asse
2950: 72 74 28 20 70 54 61 62 21 3d 30 20 26 26 20 70  rt( pTab!=0 && p
2960: 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b  Tab->zName!=0 );
2970: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2980: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
2990: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
29a0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 28  em->pSelect && (
29b0: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
29c0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
29d0: 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
29e0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 68 69            int hi
29f0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2a00: 20 70 45 4c 69 73 74 20 3d 20 70 49 74 65 6d 2d   pEList = pItem-
2a10: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
2a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2a30: 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  j=0; j<pEList->n
2a40: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
2a50: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2a60: 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
2a70: 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  (pEList->a[j].zS
2a80: 70 61 6e 2c 20 7a 43 6f 6c 2c 20 7a 54 61 62 2c  pan, zCol, zTab,
2a90: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 20   zDb) ){.       
2aa0: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 54              cntT
2ac0: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  ab = 2;.        
2ad0: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
2ae0: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Item;.          
2af0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
2b00: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
2b10: 20 20 20 20 20 20 68 69 74 20 3d 20 31 3b 0a 20        hit = 1;. 
2b20: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b40: 20 20 20 69 66 28 20 68 69 74 20 7c 7c 20 7a 54     if( hit || zT
2b50: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
2b60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b70: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 70      if( zDb && p
2b80: 54 61 62 2d 3e 70 53 63 68 65 6d 61 21 3d 70 53  Tab->pSchema!=pS
2b90: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
2ba0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2bb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2bc0: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
2bd0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2be0: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
2bf0: 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65  m->zAlias ? pIte
2c00: 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62  m->zAlias : pTab
2c10: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
2c20: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e     assert( zTabN
2c30: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ame!=0 );.      
2c40: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2c50: 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c  trICmp(zTabName,
2c60: 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20   zTab)!=0 ){.   
2c70: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2c80: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2c90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ca0: 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b   if( 0==(cntTab+
2cb0: 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2cc0: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
2cd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ce0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d    for(j=0, pCol=
2cf0: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
2d00: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
2d10: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2d20: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2d30: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
2d40: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
2d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2d60: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 65  there has been e
2d70: 78 61 63 74 6c 79 20 6f 6e 65 20 70 72 69 6f 72  xactly one prior
2d80: 20 6d 61 74 63 68 20 61 6e 64 20 74 68 69 73 20   match and this 
2d90: 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  match.          
2da0: 20 20 2a 2a 20 69 73 20 66 6f 72 20 74 68 65 20    ** is for the 
2db0: 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65  right-hand table
2dc0: 20 6f 66 20 61 20 4e 41 54 55 52 41 4c 20 4a 4f   of a NATURAL JO
2dd0: 49 4e 20 6f 72 20 69 73 20 69 6e 20 61 20 0a 20  IN or is in a . 
2de0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 53             ** US
2df0: 49 4e 47 20 63 6c 61 75 73 65 2c 20 74 68 65 6e  ING clause, then
2e00: 20 73 6b 69 70 20 74 68 69 73 20 6d 61 74 63 68   skip this match
2e10: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2e20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2e30: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20   cnt==1 ){.     
2e40: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
2e50: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
2e60: 54 5f 4e 41 54 55 52 41 4c 20 29 20 63 6f 6e 74  T_NATURAL ) cont
2e70: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2e80: 20 20 20 20 69 66 28 20 6e 61 6d 65 49 6e 55 73      if( nameInUs
2e90: 69 6e 67 43 6c 61 75 73 65 28 70 49 74 65 6d 2d  ingClause(pItem-
2ea0: 3e 70 55 73 69 6e 67 2c 20 7a 43 6f 6c 29 20 29  >pUsing, zCol) )
2eb0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2ec0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ed0: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
2ee0: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
2ef0: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
2f00: 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
2f10: 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c  e the rowid (col
2f20: 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20  umn -1) for the 
2f30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2f40: 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  KEY */.         
2f50: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
2f60: 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  n = j==pTab->iPK
2f70: 65 79 20 3f 20 2d 31 20 3a 20 28 69 31 36 29 6a  ey ? -1 : (i16)j
2f80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2f90: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2fa0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fb0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d 61   }.      if( pMa
2fc0: 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tch ){.        p
2fd0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
2fe0: 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3b 0a  Match->iCursor;.
2ff0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
3000: 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54  Tab = pMatch->pT
3010: 61 62 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52  ab;.        /* R
3020: 49 47 48 54 20 4a 4f 49 4e 20 6e 6f 74 20 28 79  IGHT JOIN not (y
3030: 65 74 29 20 73 75 70 70 6f 72 74 65 64 20 2a 2f  et) supported */
3040: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
3050: 20 28 70 4d 61 74 63 68 2d 3e 6a 6f 69 6e 74 79   (pMatch->jointy
3060: 70 65 20 26 20 4a 54 5f 52 49 47 48 54 29 3d 3d  pe & JT_RIGHT)==
3070: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
3080: 20 28 70 4d 61 74 63 68 2d 3e 6a 6f 69 6e 74 79   (pMatch->jointy
3090: 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30  pe & JT_LEFT)!=0
30a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
30b0: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
30c0: 78 70 72 2c 20 45 50 5f 43 61 6e 42 65 4e 75 6c  xpr, EP_CanBeNul
30d0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
30e0: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
30f0: 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 70 53 63  pExpr->pTab->pSc
3100: 68 65 6d 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  hema;.      }.  
3110: 20 20 7d 20 2f 2a 20 69 66 28 20 70 53 72 63 4c    } /* if( pSrcL
3120: 69 73 74 20 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ist ) */..#ifnde
3130: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
3140: 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66 20  IGGER.    /* If 
3150: 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65  we have not alre
3160: 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65  ady resolved the
3170: 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62   name, then mayb
3180: 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  e .    ** it is 
3190: 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a  a new.* or old.*
31a0: 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e   trigger argumen
31b0: 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20  t reference.    
31c0: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d 3d  */.    if( zDb==
31d0: 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20  0 && zTab!=0 && 
31e0: 63 6e 74 54 61 62 3d 3d 30 20 26 26 20 70 50 61  cntTab==0 && pPa
31f0: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
3200: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  !=0 ){.      int
3210: 20 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 65 54   op = pParse->eT
3220: 72 69 67 67 65 72 4f 70 3b 0a 20 20 20 20 20 20  riggerOp;.      
3230: 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 44  assert( op==TK_D
3240: 45 4c 45 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  ELETE || op==TK_
3250: 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b  UPDATE || op==TK
3260: 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20 20 20 20  _INSERT );.     
3270: 20 69 66 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45   if( op!=TK_DELE
3280: 54 45 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  TE && sqlite3Str
3290: 49 43 6d 70 28 22 6e 65 77 22 2c 7a 54 61 62 29  ICmp("new",zTab)
32a0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20   == 0 ){.       
32b0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
32c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   1;.        pTab
32d0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67   = pParse->pTrig
32e0: 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d 65  gerTab;.      }e
32f0: 6c 73 65 20 69 66 28 20 6f 70 21 3d 54 4b 5f 49  lse if( op!=TK_I
3300: 4e 53 45 52 54 20 26 26 20 73 71 6c 69 74 65 33  NSERT && sqlite3
3310: 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 7a 54  StrICmp("old",zT
3320: 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ab)==0 ){.      
3330: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
3340: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61  = 0;.        pTa
3350: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69  b = pParse->pTri
3360: 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d  ggerTab;.      }
3370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54  else{.        pT
3380: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ab = 0;.      }.
3390: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20  .      if( pTab 
33a0: 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ){ .        int 
33b0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  iCol;.        pS
33c0: 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e 70 53  chema = pTab->pS
33d0: 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 63  chema;.        c
33e0: 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20  ntTab++;.       
33f0: 20 66 6f 72 28 69 43 6f 6c 3d 30 2c 20 70 43 6f   for(iCol=0, pCo
3400: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 43  l=pTab->aCol; iC
3410: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
3420: 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  Col++, pCol++){.
3430: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
3440: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
3450: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  l->zName, zCol)=
3460: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
3470: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62    if( iCol==pTab
3480: 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20  ->iPKey ){.     
3490: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
34a0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -1;.            
34b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  }.            br
34c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
34d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34e0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 70 54 61     if( iCol>=pTa
34f0: 62 2d 3e 6e 43 6f 6c 20 26 26 20 73 71 6c 69 74  b->nCol && sqlit
3500: 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20  e3IsRowid(zCol) 
3510: 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62  && HasRowid(pTab
3520: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
3530: 2a 20 49 4d 50 3a 20 52 2d 35 31 34 31 34 2d 33  * IMP: R-51414-3
3540: 32 39 31 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  2910 */.        
3550: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 34 39 31    /* IMP: R-4491
3560: 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20 20 20 20  1-55124 */.     
3570: 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a       iCol = -1;.
3580: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3590: 20 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d    if( iCol<pTab-
35a0: 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
35b0: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
35c0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
35d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  {.            pE
35e0: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
35f0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
3600: 45 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ER;.          }e
3610: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
3620: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
3630: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
3640: 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20  ( iCol==31 );.  
3650: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
3660: 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a  se( iCol==32 );.
3670: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
3680: 73 65 2d 3e 6f 6c 64 6d 61 73 6b 20 7c 3d 20 28  se->oldmask |= (
3690: 69 43 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66  iCol>=32 ? 0xfff
36a0: 66 66 66 66 66 20 3a 20 28 28 28 75 33 32 29 31  fffff : (((u32)1
36b0: 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20  )<<iCol));.     
36c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
36d0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
36e0: 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20  ( iCol==31 );.  
36f0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
3700: 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a  se( iCol==32 );.
3710: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
3720: 73 65 2d 3e 6e 65 77 6d 61 73 6b 20 7c 3d 20 28  se->newmask |= (
3730: 69 43 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66  iCol>=32 ? 0xfff
3740: 66 66 66 66 66 20 3a 20 28 28 28 75 33 32 29 31  fffff : (((u32)1
3750: 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20  )<<iCol));.     
3760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3770: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
3780: 3d 20 28 69 31 36 29 69 43 6f 6c 3b 0a 20 20 20  = (i16)iCol;.   
3790: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54         pExpr->pT
37a0: 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20  ab = pTab;.     
37b0: 20 20 20 20 20 69 73 54 72 69 67 67 65 72 20 3d       isTrigger =
37c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
37d0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
37e0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
37f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
3800: 45 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20  ER) */..    /*. 
3810: 20 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68     ** Perhaps th
3820: 65 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65  e name is a refe
3830: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57  rence to the ROW
3840: 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ID.    */.    if
3850: 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54  ( cnt==0 && cntT
3860: 61 62 3d 3d 31 20 26 26 20 70 4d 61 74 63 68 20  ab==1 && pMatch 
3870: 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
3880: 64 28 7a 43 6f 6c 29 0a 20 20 20 20 20 26 26 20  d(zCol).     && 
3890: 48 61 73 52 6f 77 69 64 28 70 4d 61 74 63 68 2d  HasRowid(pMatch-
38a0: 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
38b0: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  cnt = 1;.      p
38c0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
38d0: 2d 31 3b 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  -1;     /* IMP: 
38e0: 52 2d 34 34 39 31 31 2d 35 35 31 32 34 20 2a 2f  R-44911-55124 */
38f0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66  .      pExpr->af
3900: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
3910: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
3920: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
3930: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69  * If the input i
3940: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20  s of the form Z 
3950: 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e  (not Y.Z or X.Y.
3960: 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65  Z) then the name
3970: 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20   Z.    ** might 
3980: 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75  refer to an resu
3990: 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54  lt-set alias.  T
39a0: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
39b0: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20   example, when. 
39c0: 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73     ** we are res
39d0: 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20  olving names in 
39e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
39f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3a00: 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a  g command:.    *
3a10: 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c  *.    **     SEL
3a20: 45 43 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f  ECT a+b AS x FRO
3a30: 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c  M table WHERE x<
3a40: 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  10;.    **.    *
3a50: 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20  * In cases like 
3a60: 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45  this, replace pE
3a70: 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79 20  xpr with a copy 
3a80: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
3a90: 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f  n that.    ** fo
3aa0: 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73  rms the result s
3ab0: 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20  et entry ("a+b" 
3ac0: 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20  in the example) 
3ad0: 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  and return immed
3ae0: 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e  iately..    ** N
3af0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ote that the exp
3b00: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
3b10: 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64  esult set should
3b20: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
3b30: 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76  en.    ** resolv
3b40: 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ed by the time t
3b50: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3b60: 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20  is resolved..   
3b70: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61   **.    ** The a
3b80: 62 69 6c 69 74 79 20 74 6f 20 75 73 65 20 61 6e  bility to use an
3b90: 20 6f 75 74 70 75 74 20 72 65 73 75 6c 74 2d 73   output result-s
3ba0: 65 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  et column in the
3bb0: 20 57 48 45 52 45 2c 20 47 52 4f 55 50 20 42 59   WHERE, GROUP BY
3bc0: 2c 0a 20 20 20 20 2a 2a 20 6f 72 20 48 41 56 49  ,.    ** or HAVI
3bd0: 4e 47 20 63 6c 61 75 73 65 73 2c 20 6f 72 20 61  NG clauses, or a
3be0: 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67  s part of a larg
3bf0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  er expression in
3c00: 20 74 68 65 20 4f 52 44 52 45 20 42 59 0a 20 20   the ORDRE BY.  
3c10: 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 6e    ** clause is n
3c20: 6f 74 20 73 74 61 6e 64 61 72 64 20 53 51 4c 2e  ot standard SQL.
3c30: 20 20 54 68 69 73 20 69 73 20 61 20 28 67 6f 6f    This is a (goo
3c40: 66 79 29 20 53 51 4c 69 74 65 20 65 78 74 65 6e  fy) SQLite exten
3c50: 73 69 6f 6e 2c 20 74 68 61 74 0a 20 20 20 20 2a  sion, that.    *
3c60: 2a 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 66  * is supported f
3c70: 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  or backwards com
3c80: 70 61 74 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e  patibility only.
3c90: 20 20 54 4f 20 44 4f 3a 20 49 73 73 75 65 20 61    TO DO: Issue a
3ca0: 20 77 61 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20   warning.    ** 
3cb0: 6f 6e 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  on sqlite3_log()
3cc0: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 63 61   whenever the ca
3cd0: 70 61 62 69 6c 69 74 79 20 69 73 20 75 73 65 64  pability is used
3ce0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3cf0: 20 28 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e   (pEList = pNC->
3d00: 70 45 4c 69 73 74 29 21 3d 30 0a 20 20 20 20 20  pEList)!=0.     
3d10: 26 26 20 7a 54 61 62 3d 3d 30 0a 20 20 20 20 20  && zTab==0.     
3d20: 26 26 20 63 6e 74 3d 3d 30 0a 20 20 20 20 29 7b  && cnt==0.    ){
3d30: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3d40: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
3d50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3d60: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
3d70: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
3d80: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
3d90: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
3da0: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
3db0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
3dc0: 78 70 72 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20  xpr *pOrig;.    
3dd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
3de0: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
3df0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
3e00: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
3e10: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
3e20: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
3e30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
3e40: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  xpr->x.pSelect==
3e50: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
3e60: 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Orig = pEList->a
3e70: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
3e80: 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
3e90: 63 46 6c 61 67 73 26 4e 43 5f 41 6c 6c 6f 77 41  cFlags&NC_AllowA
3ea0: 67 67 29 3d 3d 30 20 26 26 20 45 78 70 72 48 61  gg)==0 && ExprHa
3eb0: 73 50 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c  sProperty(pOrig,
3ec0: 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
3ed0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3ee0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3ef0: 22 6d 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73  "misuse of alias
3f00: 65 64 20 61 67 67 72 65 67 61 74 65 20 25 73 22  ed aggregate %s"
3f10: 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20  , zAs);.        
3f20: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
3f30: 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  bort;.          
3f40: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 6f  }.          reso
3f50: 6c 76 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c  lveAlias(pParse,
3f60: 20 70 45 4c 69 73 74 2c 20 6a 2c 20 70 45 78 70   pEList, j, pExp
3f70: 72 2c 20 22 22 2c 20 6e 53 75 62 71 75 65 72 79  r, "", nSubquery
3f80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  );.          cnt
3f90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
3fa0: 70 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  pMatch = 0;.    
3fb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
3fc0: 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20  ab==0 && zDb==0 
3fd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
3fe0: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
3ff0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4000: 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20    } .    }..    
4010: 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
4020: 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74  e next name cont
4030: 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77  ext.  The loop w
4040: 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69  ill exit when ei
4050: 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68  ther.    ** we h
4060: 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74  ave a match (cnt
4070: 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72  >0) or when we r
4080: 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63  un out of name c
4090: 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a  ontexts..    */.
40a0: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29      if( cnt==0 )
40b0: 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e  {.      pNC = pN
40c0: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  C->pNext;.      
40d0: 6e 53 75 62 71 75 65 72 79 2b 2b 3b 0a 20 20 20  nSubquery++;.   
40e0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
40f0: 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65  * If X and Y are
4100: 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20   NULL (in other 
4110: 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68  words if only th
4120: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20  e column name Z 
4130: 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64  is.  ** supplied
4140: 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ) and the value 
4150: 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64  of Z is enclosed
4160: 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65   in double-quote
4170: 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69  s, then.  ** Z i
4180: 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  s a string liter
4190: 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  al if it doesn't
41a0: 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d   match any colum
41b0: 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61  n names.  In tha
41c0: 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20  t.  ** case, we 
41d0: 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72  need to return r
41e0: 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f  ight away and no
41f0: 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  t make any chang
4200: 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72  es to.  ** pExpr
4210: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61  ..  **.  ** Beca
4220: 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65  use no reference
4230: 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74   was made to out
4240: 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65  er contexts, the
4250: 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20   pNC->nRef.  ** 
4260: 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63  fields are not c
4270: 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f  hanged in any co
4280: 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ntext..  */.  if
4290: 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62  ( cnt==0 && zTab
42a0: 3d 3d 30 20 26 26 20 45 78 70 72 48 61 73 50 72  ==0 && ExprHasPr
42b0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
42c0: 44 62 6c 51 75 6f 74 65 64 29 20 29 7b 0a 20 20  DblQuoted) ){.  
42d0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
42e0: 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 70 45 78  _STRING;.    pEx
42f0: 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  pr->pTab = 0;.  
4300: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
4310: 6e 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ne;.  }..  /*.  
4320: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
4330: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
4340: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
4350: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
4360: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
4370: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
4380: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
4390: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
43a0: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
43b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
43c0: 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d  .    zErr = cnt=
43d0: 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f  =0 ? "no such co
43e0: 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f  lumn" : "ambiguo
43f0: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b  us column name";
4400: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
4410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4420: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
4430: 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45  s: %s.%s.%s", zE
4440: 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a  rr, zDb, zTab, z
4450: 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Col);.    }else 
4460: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
4470: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4480: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
4490: 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61  s.%s", zErr, zTa
44a0: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65  b, zCol);.    }e
44b0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
44c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
44d0: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72  e, "%s: %s", zEr
44e0: 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  r, zCol);.    }.
44f0: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
4500: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
4510: 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b   pTopNC->nErr++;
4520: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
4530: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61  column from a ta
4540: 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20  ble in pSrcList 
4550: 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74  is referenced, t
4560: 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  hen record.  ** 
4570: 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65  this fact in the
4580: 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f   pSrcList.a[].co
4590: 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20  lUsed bitmask.  
45a0: 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a  Column 0 causes.
45b0: 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65    ** bit 0 to be
45c0: 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20   set.  Column 1 
45d0: 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64  sets bit 1.  And
45e0: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
45f0: 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  he.  ** column n
4600: 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
4610: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
4620: 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
4630: 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65  bitmask.  ** the
4640: 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f  n set the high-o
4650: 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20  rder bit of the 
4660: 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  bitmask..  */.  
4670: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
4680: 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21  mn>=0 && pMatch!
4690: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  =0 ){.    int n 
46a0: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
46b0: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
46c0: 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  n==BMS-1 );.    
46d0: 69 66 28 20 6e 3e 3d 42 4d 53 20 29 7b 0a 20 20  if( n>=BMS ){.  
46e0: 20 20 20 20 6e 20 3d 20 42 4d 53 2d 31 3b 0a 20      n = BMS-1;. 
46f0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
4700: 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72   pMatch->iCursor
4710: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
4720: 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63  );.    pMatch->c
4730: 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d  olUsed |= ((Bitm
4740: 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a  ask)1)<<n;.  }..
4750: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
4760: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
4770: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4780: 65 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  e(db, pExpr->pLe
4790: 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  ft);.  pExpr->pL
47a0: 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  eft = 0;.  sqlit
47b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
47c0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
47d0: 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  .  pExpr->pRight
47e0: 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f   = 0;.  pExpr->o
47f0: 70 20 3d 20 28 69 73 54 72 69 67 67 65 72 20 3f  p = (isTrigger ?
4800: 20 54 4b 5f 54 52 49 47 47 45 52 20 3a 20 54 4b   TK_TRIGGER : TK
4810: 5f 43 4f 4c 55 4d 4e 29 3b 0a 6c 6f 6f 6b 75 70  _COLUMN);.lookup
4820: 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 69 66 28 20  name_end:.  if( 
4830: 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73  cnt==1 ){.    as
4840: 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a  sert( pNC!=0 );.
4850: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
4860: 70 21 3d 54 4b 5f 41 53 20 29 7b 0a 20 20 20 20  p!=TK_AS ){.    
4870: 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61    sqlite3AuthRea
4880: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
4890: 20 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70   pSchema, pNC->p
48a0: 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  SrcList);.    }.
48b0: 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
48c0: 20 74 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20   the nRef value 
48d0: 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74  on all name cont
48e0: 65 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20  exts from TopNC 
48f0: 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  up to.    ** the
4900: 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65   point where the
4910: 20 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a   name matched. *
4920: 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20  /.    for(;;){. 
4930: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f       assert( pTo
4940: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  pNC!=0 );.      
4950: 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a  pTopNC->nRef++;.
4960: 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43        if( pTopNC
4970: 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20  ==pNC ) break;. 
4980: 20 20 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54       pTopNC = pT
4990: 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  opNC->pNext;.   
49a0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52   }.    return WR
49b0: 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 20 65 6c 73  C_Prune;.  } els
49c0: 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57  e {.    return W
49d0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 7d 0a  RC_Abort;.  }.}.
49e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
49f0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
4a00: 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  nter to an expre
4a10: 73 73 69 6f 6e 20 74 6f 20 6c 6f 61 64 20 74 68  ssion to load th
4a20: 65 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a  e column iCol.**
4a30: 20 66 72 6f 6d 20 64 61 74 61 73 6f 75 72 63 65   from datasource
4a40: 20 69 53 72 63 20 69 6e 20 53 72 63 4c 69 73 74   iSrc in SrcList
4a50: 20 70 53 72 63 2e 0a 2a 2f 0a 45 78 70 72 20 2a   pSrc..*/.Expr *
4a60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c  sqlite3CreateCol
4a70: 75 6d 6e 45 78 70 72 28 73 71 6c 69 74 65 33 20  umnExpr(sqlite3 
4a80: 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 53  *db, SrcList *pS
4a90: 72 63 2c 20 69 6e 74 20 69 53 72 63 2c 20 69 6e  rc, int iSrc, in
4aa0: 74 20 69 43 6f 6c 29 7b 0a 20 20 45 78 70 72 20  t iCol){.  Expr 
4ab0: 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  *p = sqlite3Expr
4ac0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 43 4f 4c  Alloc(db, TK_COL
4ad0: 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  UMN, 0, 0);.  if
4ae0: 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ( p ){.    struc
4af0: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
4b00: 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61  pItem = &pSrc->a
4b10: 5b 69 53 72 63 5d 3b 0a 20 20 20 20 70 2d 3e 70  [iSrc];.    p->p
4b20: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
4b30: 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65  b;.    p->iTable
4b40: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
4b50: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54  r;.    if( p->pT
4b60: 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
4b70: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  ){.      p->iCol
4b80: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  umn = -1;.    }e
4b90: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43  lse{.      p->iC
4ba0: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69  olumn = (ynVar)i
4bb0: 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
4bc0: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
4bd0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4be0: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
4bf0: 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 63 6f  .      pItem->co
4c00: 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61  lUsed |= ((Bitma
4c10: 73 6b 29 31 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d  sk)1)<<(iCol>=BM
4c20: 53 20 3f 20 42 4d 53 2d 31 20 3a 20 69 43 6f 6c  S ? BMS-1 : iCol
4c30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45 78 70  );.    }.    Exp
4c40: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 2c 20  rSetProperty(p, 
4c50: 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 20 20  EP_Resolved);.  
4c60: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
4c70: 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e  ./*.** Report an
4c80: 20 65 72 72 6f 72 20 74 68 61 74 20 61 6e 20 65   error that an e
4c90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
4ca0: 20 76 61 6c 69 64 20 66 6f 72 20 61 20 70 61 72   valid for a par
4cb0: 74 69 61 6c 20 69 6e 64 65 78 20 57 48 45 52 45  tial index WHERE
4cc0: 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73  .** clause..*/.s
4cd0: 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 74 56 61  tatic void notVa
4ce0: 6c 69 64 50 61 72 74 49 64 78 57 68 65 72 65 28  lidPartIdxWhere(
4cf0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
4d00: 2c 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  ,       /* Leave
4d10: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68   error message h
4d20: 65 72 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ere */.  NameCon
4d30: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
4d40: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
4d50: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
4d60: 72 20 2a 7a 4d 73 67 20 20 20 20 20 2f 2a 20 54  r *zMsg     /* T
4d70: 79 70 65 20 6f 66 20 65 72 72 6f 72 20 2a 2f 0a  ype of error */.
4d80: 29 7b 0a 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e  ){.  if( (pNC->n
4d90: 63 46 6c 61 67 73 20 26 20 4e 43 5f 50 61 72 74  cFlags & NC_Part
4da0: 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  Idx)!=0 ){.    s
4db0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4dc0: 50 61 72 73 65 2c 20 22 25 73 20 70 72 6f 68 69  Parse, "%s prohi
4dd0: 62 69 74 65 64 20 69 6e 20 70 61 72 74 69 61 6c  bited in partial
4de0: 20 69 6e 64 65 78 20 57 48 45 52 45 20 63 6c 61   index WHERE cla
4df0: 75 73 65 73 22 2c 0a 20 20 20 20 20 20 20 20 20  uses",.         
4e00: 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67 29             zMsg)
4e10: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4e20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
4e30: 43 4b 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  CK./*.** Report 
4e40: 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20 61 6e  an error that an
4e50: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
4e60: 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 61 20 43  ot valid for a C
4e70: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e  HECK constraint.
4e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4e90: 6e 6f 74 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e  notValidCheckCon
4ea0: 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65  straint(.  Parse
4eb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4ec0: 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  /* Leave error m
4ed0: 65 73 73 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  essage here */. 
4ee0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
4ef0: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
4f00: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  e context */.  c
4f10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20  onst char *zMsg 
4f20: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 65      /* Type of e
4f30: 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  rror */.){.  if(
4f40: 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
4f50: 20 4e 43 5f 49 73 43 68 65 63 6b 29 21 3d 30 20   NC_IsCheck)!=0 
4f60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
4f70: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 25  rorMsg(pParse,"%
4f80: 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
4f90: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
4fa0: 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d 0a 7d  s", zMsg);.  }.}
4fb0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4fc0: 6e 6f 74 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e  notValidCheckCon
4fd0: 73 74 72 61 69 6e 74 28 50 2c 4e 2c 4d 29 0a 23  straint(P,N,M).#
4fe0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70  endif../*.** Exp
4ff0: 72 65 73 73 69 6f 6e 20 70 20 73 68 6f 75 6c 64  ression p should
5000: 20 65 6e 63 6f 64 65 20 61 20 66 6c 6f 61 74 69   encode a floati
5010: 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 62  ng point value b
5020: 65 74 77 65 65 6e 20 31 2e 30 20 61 6e 64 20 30  etween 1.0 and 0
5030: 2e 30 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 30  .0..** Return 10
5040: 32 34 20 74 69 6d 65 73 20 74 68 69 73 20 76 61  24 times this va
5050: 6c 75 65 2e 20 20 4f 72 20 72 65 74 75 72 6e 20  lue.  Or return 
5060: 2d 31 20 69 66 20 70 20 69 73 20 6e 6f 74 20 61  -1 if p is not a
5070: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
5080: 2a 2a 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e  ** value between
5090: 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2f   1.0 and 0.0..*/
50a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 72  .static int expr
50b0: 50 72 6f 62 61 62 69 6c 69 74 79 28 45 78 70 72  Probability(Expr
50c0: 20 2a 70 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72   *p){.  double r
50d0: 20 3d 20 2d 31 2e 30 3b 0a 20 20 69 66 28 20 70   = -1.0;.  if( p
50e0: 2d 3e 6f 70 21 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op!=TK_FLOAT )
50f0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 73 71   return -1;.  sq
5100: 6c 69 74 65 33 41 74 6f 46 28 70 2d 3e 75 2e 7a  lite3AtoF(p->u.z
5110: 54 6f 6b 65 6e 2c 20 26 72 2c 20 73 71 6c 69 74  Token, &r, sqlit
5120: 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e  e3Strlen30(p->u.
5130: 7a 54 6f 6b 65 6e 29 2c 20 53 51 4c 49 54 45 5f  zToken), SQLITE_
5140: 55 54 46 38 29 3b 0a 20 20 61 73 73 65 72 74 28  UTF8);.  assert(
5150: 20 72 3e 3d 30 2e 30 20 29 3b 0a 20 20 69 66 28   r>=0.0 );.  if(
5160: 20 72 3e 31 2e 30 20 29 20 72 65 74 75 72 6e 20   r>1.0 ) return 
5170: 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e  -1;.  return (in
5180: 74 29 28 72 2a 31 33 34 32 31 37 37 32 38 2e 30  t)(r*134217728.0
5190: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
51a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
51b0: 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74 65 33  back for sqlite3
51c0: 57 61 6c 6b 45 78 70 72 28 29 2e 0a 2a 2a 0a 2a  WalkExpr()..**.*
51d0: 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c  * Resolve symbol
51e0: 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b  ic names into TK
51f0: 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72  _COLUMN operator
5200: 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  s for the curren
5210: 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65  t.** node in the
5220: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5230: 2e 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63  .  Return 0 to c
5240: 6f 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72  ontinue the sear
5250: 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74  ch down.** the t
5260: 72 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72  ree or 2 to abor
5270: 74 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e  t the tree walk.
5280: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
5290: 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72  ine also does er
52a0: 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64  ror checking and
52b0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
52c0: 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   for.** function
52d0: 20 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65   names.  The ope
52e0: 72 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67  rator for aggreg
52f0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73  ate functions is
5300: 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54   changed.** to T
5310: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a  K_AGG_FUNCTION..
5320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
5330: 73 6f 6c 76 65 45 78 70 72 53 74 65 70 28 57 61  solveExprStep(Wa
5340: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45  lker *pWalker, E
5350: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e  xpr *pExpr){.  N
5360: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b  ameContext *pNC;
5370: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5380: 3b 0a 0a 20 20 70 4e 43 20 3d 20 70 57 61 6c 6b  ;..  pNC = pWalk
5390: 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 61 73 73  er->u.pNC;.  ass
53a0: 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20  ert( pNC!=0 );. 
53b0: 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70   pParse = pNC->p
53c0: 50 61 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28  Parse;.  assert(
53d0: 20 70 50 61 72 73 65 3d 3d 70 57 61 6c 6b 65 72   pParse==pWalker
53e0: 2d 3e 70 50 61 72 73 65 20 29 3b 0a 0a 20 20 69  ->pParse );..  i
53f0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
5400: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
5410: 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20  olved) ) return 
5420: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 45 78 70  WRC_Prune;.  Exp
5430: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
5440: 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29  pr, EP_Resolved)
5450: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
5460: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72 63  .  if( pNC->pSrc
5470: 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53 72  List && pNC->pSr
5480: 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20  cList->nAlloc>0 
5490: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
54a0: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
54b0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e  pSrcList;.    in
54c0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
54d0: 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73  ; i<pNC->pSrcLis
54e0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
54f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
5500: 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
5510: 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69  sor>=0 && pSrcLi
5520: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
5530: 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a  <pParse->nTab);.
5540: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
5550: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
5560: 2d 3e 6f 70 20 29 7b 0a 0a 23 69 66 20 64 65 66  ->op ){..#if def
5570: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
5580: 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45  LE_UPDATE_DELETE
5590: 5f 4c 49 4d 49 54 29 20 26 26 20 21 64 65 66 69  _LIMIT) && !defi
55a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
55b0: 53 55 42 51 55 45 52 59 29 0a 20 20 20 20 2f 2a  SUBQUERY).    /*
55c0: 20 54 68 65 20 73 70 65 63 69 61 6c 20 6f 70 65   The special ope
55d0: 72 61 74 6f 72 20 54 4b 5f 52 4f 57 20 6d 65 61  rator TK_ROW mea
55e0: 6e 73 20 75 73 65 20 74 68 65 20 72 6f 77 69 64  ns use the rowid
55f0: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20   for the first. 
5600: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20     ** column in 
5610: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
5620: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62    This is used b
5630: 79 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  y the LIMIT and 
5640: 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
5650: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
5660: 67 20 6f 6e 20 55 50 44 41 54 45 20 61 6e 64 20  g on UPDATE and 
5670: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
5680: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
5690: 73 65 20 54 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20  se TK_ROW: {.   
56a0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
56b0: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
56c0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75  List;.      stru
56d0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
56e0: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 61 73  *pItem;.      as
56f0: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 20 26  sert( pSrcList &
5700: 26 20 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  & pSrcList->nSrc
5710: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==1 );.      pIt
5720: 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
5730: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 48 61 73  ;.      if( !Has
5740: 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54 61  Rowid(pItem->pTa
5750: 62 29 20 7c 7c 20 70 49 74 65 6d 2d 3e 70 54 61  b) || pItem->pTa
5760: 62 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29 7b  b->pSelect!=0 ){
5770: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
5780: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5790: 2c 20 22 4f 52 44 45 52 20 42 59 20 61 6e 64 20  , "ORDER BY and 
57a0: 4c 49 4d 49 54 20 6e 6f 74 20 73 75 70 70 6f 72  LIMIT not suppor
57b0: 74 20 66 6f 72 20 74 61 62 6c 65 20 25 73 22 2c  t for table %s",
57c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57e0: 20 20 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a    pItem->pTab->z
57f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
5800: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
5810: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
5820: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
5830: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
5840: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
5850: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
5860: 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  r;.      pExpr->
5870: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
5880: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
5890: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
58a0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
58b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
58c0: 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
58d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44  QLITE_ENABLE_UPD
58e0: 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54  ATE_DELETE_LIMIT
58f0: 29 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 21  ).          && !
5900: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5910: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f  MIT_SUBQUERY) */
5920: 0a 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20  ..    /* A lone 
5930: 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74 68  identifier is th
5940: 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75  e name of a colu
5950: 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  mn..    */.    c
5960: 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20  ase TK_ID: {.   
5970: 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70     return lookup
5980: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c 20  Name(pParse, 0, 
5990: 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  0, pExpr->u.zTok
59a0: 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b  en, pNC, pExpr);
59b0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
59c0: 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   A table name an
59d0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20  d column name:  
59e0: 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20     ID.ID.    ** 
59f0: 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74  Or a database, t
5a00: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a  able and column:
5a10: 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a    ID.ID.ID.    *
5a20: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  /.    case TK_DO
5a30: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
5a40: 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a   char *zColumn;.
5a50: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
5a60: 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 20 20   *zTable;.      
5a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
5a80: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
5a90: 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69  ght;..      /* i
5aa0: 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29  f( pSrcList==0 )
5ab0: 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 20   break; */.     
5ac0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
5ad0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69  >pRight;.      i
5ae0: 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  f( pRight->op==T
5af0: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
5b00: 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  zDb = 0;.       
5b10: 20 7a 54 61 62 6c 65 20 3d 20 70 45 78 70 72 2d   zTable = pExpr-
5b20: 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
5b30: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d  ;.        zColum
5b40: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54  n = pRight->u.zT
5b50: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
5b60: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
5b70: 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  t( pRight->op==T
5b80: 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20  K_DOT );.       
5b90: 20 7a 44 62 20 3d 20 70 45 78 70 72 2d 3e 70 4c   zDb = pExpr->pL
5ba0: 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
5bb0: 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d 20         zTable = 
5bc0: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 75  pRight->pLeft->u
5bd0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
5be0: 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68   zColumn = pRigh
5bf0: 74 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f  t->pRight->u.zTo
5c00: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ken;.      }.   
5c10: 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70     return lookup
5c20: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 44 62  Name(pParse, zDb
5c30: 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d  , zTable, zColum
5c40: 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a  n, pNC, pExpr);.
5c50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
5c60: 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e  solve function n
5c70: 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ames.    */.    
5c80: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
5c90: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
5ca0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
5cb0: 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f  r->x.pList;    /
5cc0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c  * The argument l
5cd0: 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ist */.      int
5ce0: 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69   n = pList ? pLi
5cf0: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20  st->nExpr : 0;  
5d00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
5d10: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
5d20: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
5d30: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nc = 0;       /*
5d40: 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68   True if no such
5d50: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
5d60: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72   */.      int wr
5d70: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30  ong_num_args = 0
5d80: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
5d90: 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66   wrong number of
5da0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5db0: 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d      int is_agg =
5dc0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
5dd0: 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e  /* True if is an
5de0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
5df0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
5e00: 20 61 75 74 68 3b 20 20 20 20 20 20 20 20 20 20   auth;          
5e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 68           /* Auth
5e20: 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75 73 65  orization to use
5e30: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
5e40: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5e70: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75  characters in fu
5e80: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
5e90: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5ea0: 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  *zId;           
5eb0: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
5ec0: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   name. */.      
5ed0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
5ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
5ef0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
5f00: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
5f10: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
5f20: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
5f30: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
5f40: 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a  se encoding */..
5f50: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
5f60: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
5f70: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
5f80: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e 6f 74  ct) );.      not
5f90: 56 61 6c 69 64 50 61 72 74 49 64 78 57 68 65 72  ValidPartIdxWher
5fa0: 65 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22  e(pParse, pNC, "
5fb0: 66 75 6e 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20  functions");.   
5fc0: 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
5fd0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
5fe0: 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nId = sqlite3Str
5ff0: 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20  len30(zId);.    
6000: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
6010: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
6020: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
6030: 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  d, n, enc, 0);. 
6040: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
6050: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
6060: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
6070: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
6080: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 32 2c  b, zId, nId, -2,
6090: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
60a0: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
60b0: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
60c0: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
60d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
60e0: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
60f0: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
6100: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6110: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
6120: 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30  = pDef->xFunc==0
6130: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  ;.        if( pD
6140: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
6150: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49  SQLITE_FUNC_UNLI
6160: 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  KELY ){.        
6170: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
6180: 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69  y(pExpr, EP_Unli
6190: 6b 65 6c 79 7c 45 50 5f 53 6b 69 70 29 3b 0a 20  kely|EP_Skip);. 
61a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d           if( n==
61b0: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
61c0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
61d0: 20 65 78 70 72 50 72 6f 62 61 62 69 6c 69 74 79   exprProbability
61e0: 28 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  (pList->a[1].pEx
61f0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pr);.           
6200: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
6210: 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  le<0 ){.        
6220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6230: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73                "s
6250: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
6260: 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29 20 6d  o likelihood() m
6270: 75 73 74 20 62 65 20 61 20 22 0a 20 20 20 20 20  ust be a ".     
6280: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 73             "cons
6290: 74 61 6e 74 20 62 65 74 77 65 65 6e 20 30 2e 30  tant between 0.0
62a0: 20 61 6e 64 20 31 2e 30 22 29 3b 0a 20 20 20 20   and 1.0");.    
62b0: 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e            pNC->n
62c0: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
62d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
62e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
62f0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
6300: 3a 20 52 2d 36 31 33 30 34 2d 32 39 34 34 39 20  : R-61304-29449 
6310: 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28 58 29 20  The unlikely(X) 
6320: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  function is.    
6330: 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 69 76          ** equiv
6340: 61 6c 65 6e 74 20 74 6f 20 6c 69 6b 65 6c 69 68  alent to likelih
6350: 6f 6f 64 28 58 2c 20 30 2e 30 36 32 35 29 2e 0a  ood(X, 0.0625)..
6360: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 45              ** E
6370: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
6380: 32 38 33 2d 31 31 36 33 36 20 54 68 65 20 75 6e  283-11636 The un
6390: 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69  likely(X) functi
63a0: 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  on is.          
63b0: 20 20 2a 2a 20 73 68 6f 72 74 2d 68 61 6e 64 20    ** short-hand 
63c0: 66 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58  for likelihood(X
63d0: 2c 30 2e 30 36 32 35 29 2e 0a 20 20 20 20 20 20  ,0.0625)..      
63e0: 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
63f0: 45 2d 4f 46 3a 20 52 2d 33 36 38 35 30 2d 33 34  E-OF: R-36850-34
6400: 31 32 37 20 54 68 65 20 6c 69 6b 65 6c 79 28 58  127 The likely(X
6410: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 68  ) function is sh
6420: 6f 72 74 2d 68 61 6e 64 0a 20 20 20 20 20 20 20  ort-hand.       
6430: 20 20 20 20 20 2a 2a 20 66 6f 72 20 6c 69 6b 65       ** for like
6440: 6c 69 68 6f 6f 64 28 58 2c 30 2e 39 33 37 35 29  lihood(X,0.9375)
6450: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
6460: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
6470: 35 33 34 33 36 2d 34 30 39 37 33 20 54 68 65 20  53436-40973 The 
6480: 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69  likely(X) functi
6490: 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  on is equivalent
64a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
64b0: 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c  to likelihood(X,
64c0: 30 2e 39 33 37 35 29 2e 20 2a 2f 0a 20 20 20 20  0.9375). */.    
64d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e          /* TUNIN
64e0: 47 3a 20 75 6e 6c 69 6b 65 6c 79 28 29 20 70 72  G: unlikely() pr
64f0: 6f 62 61 62 69 6c 69 74 79 20 69 73 20 30 2e 30  obability is 0.0
6500: 36 32 35 2e 20 20 6c 69 6b 65 6c 79 28 29 20 69  625.  likely() i
6510: 73 20 30 2e 39 33 37 35 20 2a 2f 0a 20 20 20 20  s 0.9375 */.    
6520: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
6530: 54 61 62 6c 65 20 3d 20 70 44 65 66 2d 3e 7a 4e  Table = pDef->zN
6540: 61 6d 65 5b 30 5d 3d 3d 27 75 27 20 3f 20 38 33  ame[0]=='u' ? 83
6550: 38 38 36 30 38 20 3a 20 31 32 35 38 32 39 31 32  88608 : 12582912
6560: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 20  0;.          }  
6570: 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20             .    
6580: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
6590: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
65a0: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 20 20  IZATION.        
65b0: 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33 41 75  auth = sqlite3Au
65c0: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
65d0: 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c  SQLITE_FUNCTION,
65e0: 20 30 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c   0, pDef->zName,
65f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
6600: 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b   auth!=SQLITE_OK
6610: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6620: 28 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44  ( auth==SQLITE_D
6630: 45 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ENY ){.         
6640: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6650: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
6660: 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73  authorized to us
6670: 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c  e function: %s",
6680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66a0: 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65       pDef->zName
66b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
66c0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
66d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
66e0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
66f0: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _NULL;.         
6700: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
6710: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  e;.        }.#en
6720: 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
6730: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
6740: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
6750: 4e 53 54 41 4e 54 20 29 7b 0a 20 20 20 20 20 20  NSTANT ){.      
6760: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
6770: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
6780: 73 74 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  stFunc);.       
6790: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
67a0: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 28   if( is_agg && (
67b0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
67c0: 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20 29  C_AllowAgg)==0 )
67d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
67e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
67f0: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
6800: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
6810: 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64  %.*s()", nId,zId
6820: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
6830: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
6840: 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20  is_agg = 0;.    
6850: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73    }else if( no_s
6860: 75 63 68 5f 66 75 6e 63 20 26 26 20 70 50 61 72  uch_func && pPar
6870: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
6880: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
6890: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
68a0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
68b0: 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22   function: %.*s"
68c0: 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , nId, zId);.   
68d0: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
68e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
68f0: 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  ( wrong_num_args
6900: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
6910: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6920: 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  se,"wrong number
6930: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
6940: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
6950: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6960: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
6970: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
6980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6990: 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e  ( is_agg ) pNC->
69a0: 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41  ncFlags &= ~NC_A
69b0: 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 73  llowAgg;.      s
69c0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
69d0: 73 74 28 70 57 61 6c 6b 65 72 2c 20 70 4c 69 73  st(pWalker, pLis
69e0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  t);.      if( is
69f0: 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _agg ){.        
6a00: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
6a10: 32 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20  2 = pNC;.       
6a20: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
6a30: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20  AGG_FUNCTION;.  
6a40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
6a50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 77 68   = 0;.        wh
6a60: 69 6c 65 28 20 70 4e 43 32 20 26 26 20 21 73 71  ile( pNC2 && !sq
6a70: 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73 65  lite3FunctionUse
6a80: 73 54 68 69 73 53 72 63 28 70 45 78 70 72 2c 20  sThisSrc(pExpr, 
6a90: 70 4e 43 32 2d 3e 70 53 72 63 4c 69 73 74 29 20  pNC2->pSrcList) 
6aa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ){.          pEx
6ab0: 70 72 2d 3e 6f 70 32 2b 2b 3b 0a 20 20 20 20 20  pr->op2++;.     
6ac0: 20 20 20 20 20 70 4e 43 32 20 3d 20 70 4e 43 32       pNC2 = pNC2
6ad0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
6ae0: 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
6af0: 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20  t( pDef!=0 );.  
6b00: 20 20 20 20 20 20 69 66 28 20 70 4e 43 32 20 29        if( pNC2 )
6b10: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
6b20: 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  rt( SQLITE_FUNC_
6b30: 4d 49 4e 4d 41 58 3d 3d 4e 43 5f 4d 69 6e 4d 61  MINMAX==NC_MinMa
6b40: 78 41 67 67 20 29 3b 0a 20 20 20 20 20 20 20 20  xAgg );.        
6b50: 20 20 74 65 73 74 63 61 73 65 28 20 28 70 44 65    testcase( (pDe
6b60: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
6b70: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
6b80: 58 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  X)!=0 );.       
6b90: 20 20 20 70 4e 43 32 2d 3e 6e 63 46 6c 61 67 73     pNC2->ncFlags
6ba0: 20 7c 3d 20 4e 43 5f 48 61 73 41 67 67 20 7c 20   |= NC_HasAgg | 
6bb0: 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
6bc0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d   & SQLITE_FUNC_M
6bd0: 49 4e 4d 41 58 29 3b 0a 0a 20 20 20 20 20 20 20  INMAX);..       
6be0: 20 7d 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e   }.        pNC->
6bf0: 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c  ncFlags |= NC_Al
6c00: 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 7d 0a  lowAgg;.      }.
6c10: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
6c20: 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d    Compute pExpr-
6c30: 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20  >affinity based 
6c40: 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  on the expected 
6c50: 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  return.      ** 
6c60: 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63  type of the func
6c70: 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  tion .      */. 
6c80: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
6c90: 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66  Prune;.    }.#if
6ca0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6cb0: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
6cc0: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
6cd0: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
6ce0: 3a 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78  :  testcase( pEx
6cf0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54  pr->op==TK_EXIST
6d00: 53 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  S );.#endif.    
6d10: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
6d20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
6d30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29  xpr->op==TK_IN )
6d40: 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  ;.      if( Expr
6d50: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
6d60: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
6d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
6d80: 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66  nRef = pNC->nRef
6d90: 3b 0a 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c  ;.        notVal
6da0: 69 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  idCheckConstrain
6db0: 74 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22  t(pParse, pNC, "
6dc0: 73 75 62 71 75 65 72 69 65 73 22 29 3b 0a 20 20  subqueries");.  
6dd0: 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 50 61        notValidPa
6de0: 72 74 49 64 78 57 68 65 72 65 28 70 50 61 72 73  rtIdxWhere(pPars
6df0: 65 2c 20 70 4e 43 2c 20 22 73 75 62 71 75 65 72  e, pNC, "subquer
6e00: 69 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 73  ies");.        s
6e10: 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74  qlite3WalkSelect
6e20: 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d  (pWalker, pExpr-
6e30: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
6e40: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43       assert( pNC
6e50: 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a  ->nRef>=nRef );.
6e60: 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 65 66          if( nRef
6e70: 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20  !=pNC->nRef ){. 
6e80: 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
6e90: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6ea0: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20  EP_VarSelect);. 
6eb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6ec0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6ed0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
6ee0: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
6ef0: 20 20 6e 6f 74 56 61 6c 69 64 43 68 65 63 6b 43    notValidCheckC
6f00: 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65  onstraint(pParse
6f10: 2c 20 70 4e 43 2c 20 22 70 61 72 61 6d 65 74 65  , pNC, "paramete
6f20: 72 73 22 29 3b 0a 20 20 20 20 20 20 6e 6f 74 56  rs");.      notV
6f30: 61 6c 69 64 50 61 72 74 49 64 78 57 68 65 72 65  alidPartIdxWhere
6f40: 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 70  (pParse, pNC, "p
6f50: 61 72 61 6d 65 74 65 72 73 22 29 3b 0a 20 20 20  arameters");.   
6f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6f70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 50    }.  return (pP
6f80: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50  arse->nErr || pP
6f90: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
6fa0: 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f 41 62  Failed) ? WRC_Ab
6fb0: 6f 72 74 20 3a 20 57 52 43 5f 43 6f 6e 74 69 6e  ort : WRC_Contin
6fc0: 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c  ue;.}../*.** pEL
6fd0: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
6fe0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 69   expressions whi
6ff0: 63 68 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  ch are really th
7000: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
7010: 74 68 65 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20  the.** a SELECT 
7020: 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 45 20 69  statement.  pE i
7030: 73 20 61 20 74 65 72 6d 20 69 6e 20 61 6e 20 4f  s a term in an O
7040: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
7050: 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 54   BY clause..** T
7060: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
7070: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70 45 20  ks to see if pE 
7080: 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e  is a simple iden
7090: 74 69 66 69 65 72 20 77 68 69 63 68 20 63 6f 72  tifier which cor
70a0: 72 65 73 70 6f 6e 64 73 0a 2a 2a 20 74 6f 20 74  responds.** to t
70b0: 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 20 6f 6e  he AS-name of on
70c0: 65 20 6f 66 20 74 68 65 20 74 65 72 6d 73 20 6f  e of the terms o
70d0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
70e0: 20 6c 69 73 74 2e 20 20 49 66 20 69 74 20 69 73   list.  If it is
70f0: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
7100: 65 20 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65  e return an inte
7110: 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ger between 1 an
7120: 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74  d N where N is t
7130: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
7140: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 45 4c 69  elements in pELi
7150: 73 74 2c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  st, correspondin
7160: 67 20 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e  g to the matchin
7170: 67 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  g entry.  If the
7180: 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63  re is.** no matc
7190: 68 2c 20 6f 72 20 69 66 20 70 45 20 69 73 20 6e  h, or if pE is n
71a0: 6f 74 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e  ot a simple iden
71b0: 74 69 66 69 65 72 2c 20 74 68 65 6e 20 74 68 69  tifier, then thi
71c0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74  s routine.** ret
71d0: 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 45 4c  urn 0..**.** pEL
71e0: 69 73 74 20 68 61 73 20 62 65 65 6e 20 72 65 73  ist has been res
71f0: 6f 6c 76 65 64 2e 20 20 70 45 20 68 61 73 20 6e  olved.  pE has n
7200: 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ot..*/.static in
7210: 74 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28  t resolveAsName(
7220: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7230: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
7240: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72   context for err
7250: 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  or messages */. 
7260: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
7270: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65  t,  /* List of e
7280: 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20 73 63  xpressions to sc
7290: 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  an */.  Expr *pE
72a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
72b0: 70 72 65 73 73 69 6f 6e 20 77 65 20 61 72 65 20  pression we are 
72c0: 74 72 79 69 6e 67 20 74 6f 20 6d 61 74 63 68 20  trying to match 
72d0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
72e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
72f0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
7300: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
7310: 52 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66  R(pParse);..  if
7320: 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ( pE->op==TK_ID 
7330: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  ){.    char *zCo
7340: 6c 20 3d 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e  l = pE->u.zToken
7350: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
7360: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7370: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
7380: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
7390: 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[i].zName;.    
73a0: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
73b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
73c0: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
73d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
73e0: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
73f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
7400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73  ;.}../*.** pE is
7410: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
7420: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63   expression whic
7430: 68 20 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65  h is a single te
7440: 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 4f 52 44  rm in the.** ORD
7450: 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f  ER BY of a compo
7460: 75 6e 64 20 53 45 4c 45 43 54 2e 20 20 54 68 65  und SELECT.  The
7470: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
7480: 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20 6e 61 6d 65  not been.** name
7490: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a   resolved..**.**
74a0: 20 41 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68   At the point th
74b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
74c0: 6c 6c 65 64 2c 20 77 65 20 61 6c 72 65 61 64 79  lled, we already
74d0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 0a 2a   know that the.*
74e0: 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  * ORDER BY term 
74f0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
7500: 72 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  r index into the
7510: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68   result set.  Th
7520: 61 74 0a 2a 2a 20 63 61 73 65 20 69 73 20 68 61  at.** case is ha
7530: 6e 64 6c 65 64 20 62 79 20 74 68 65 20 63 61 6c  ndled by the cal
7540: 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  ling routine..**
7550: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6d  .** Attempt to m
7560: 61 74 63 68 20 70 45 20 61 67 61 69 6e 73 74 20  atch pE against 
7570: 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d  result set colum
7580: 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d  ns in the left-m
7590: 6f 73 74 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74  ost.** SELECT st
75a0: 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  atement.  Return
75b0: 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20   the index i of 
75c0: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c  the matching col
75d0: 75 6d 6e 2c 0a 2a 2a 20 61 73 20 61 6e 20 69 6e  umn,.** as an in
75e0: 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  dication to the 
75f0: 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73  caller that it s
7600: 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68  hould sort by th
7610: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 0a 2a  e i-th column..*
7620: 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
7630: 63 6f 6c 75 6d 6e 20 69 73 20 31 2e 20 20 49 6e  column is 1.  In
7640: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
7650: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
7660: 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   is the.** same 
7670: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 74 68  integer value th
7680: 61 74 20 77 6f 75 6c 64 20 62 65 20 75 73 65 64  at would be used
7690: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74   in the SQL stat
76a0: 65 6d 65 6e 74 20 74 6f 20 69 6e 64 69 63 61 74  ement to indicat
76b0: 65 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e.** the column.
76c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
76d0: 69 73 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74  is no match, ret
76e0: 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 2d  urn 0.  Return -
76f0: 31 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  1 if an error oc
7700: 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  curs..*/.static 
7710: 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64 65 72  int resolveOrder
7720: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74  ByTermToExprList
7730: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7740: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
7750: 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72  g context for er
7760: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  ror messages */.
7770: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
7780: 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45  t,   /* The SELE
7790: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74  CT statement wit
77a0: 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  h the ORDER BY c
77b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20  lause */.  Expr 
77c0: 2a 70 45 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *pE           /*
77d0: 20 54 68 65 20 73 70 65 63 69 66 69 63 20 4f 52   The specific OR
77e0: 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a 29  DER BY term */.)
77f0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
7800: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
7810: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
7820: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f  List *pEList;  /
7830: 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66  * The columns of
7840: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
7850: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
7860: 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20   nc;    /* Name 
7870: 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f  context for reso
7880: 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 20 20 73 71  lving pE */.  sq
7890: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
78a0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
78b0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  nection */.  int
78c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
78d0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
78e0: 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65  rom subprocedure
78f0: 73 20 2a 2f 0a 20 20 75 38 20 73 61 76 65 64 53  s */.  u8 savedS
7900: 75 70 70 45 72 72 3b 20 20 20 2f 2a 20 53 61 76  uppErr;   /* Sav
7910: 65 64 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e  ed value of db->
7920: 73 75 70 70 72 65 73 73 45 72 72 20 2a 2f 0a 0a  suppressErr */..
7930: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7940: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
7950: 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70  E, &i)==0 );.  p
7960: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
7970: 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 52  >pEList;..  /* R
7980: 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73  esolve all names
7990: 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
79a0: 20 74 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e   term expression
79b0: 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  .  */.  memset(&
79c0: 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63  nc, 0, sizeof(nc
79d0: 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20  ));.  nc.pParse 
79e0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70  = pParse;.  nc.p
79f0: 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63  SrcList = pSelec
7a00: 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 70 45  t->pSrc;.  nc.pE
7a10: 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a 20  List = pEList;. 
7a20: 20 6e 63 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43   nc.ncFlags = NC
7a30: 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 6e 63 2e  _AllowAgg;.  nc.
7a40: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 64 62 20 3d  nErr = 0;.  db =
7a50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
7a60: 61 76 65 64 53 75 70 70 45 72 72 20 3d 20 64 62  avedSuppErr = db
7a70: 2d 3e 73 75 70 70 72 65 73 73 45 72 72 3b 0a 20  ->suppressErr;. 
7a80: 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
7a90: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
7aa0: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
7ab0: 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 3b 0a 20  ames(&nc, pE);. 
7ac0: 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
7ad0: 20 3d 20 73 61 76 65 64 53 75 70 70 45 72 72 3b   = savedSuppErr;
7ae0: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
7af0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  rn 0;..  /* Try 
7b00: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52 44  to match the ORD
7b10: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
7b20: 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70 72   against an expr
7b30: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 69 6e 20 74  ession.  ** in t
7b40: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
7b50: 52 65 74 75 72 6e 20 61 6e 20 31 2d 62 61 73 65  Return an 1-base
7b60: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6d  d index of the m
7b70: 61 74 63 68 69 6e 67 0a 20 20 2a 2a 20 72 65 73  atching.  ** res
7b80: 75 6c 74 2d 73 65 74 20 65 6e 74 72 79 2e 0a 20  ult-set entry.. 
7b90: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
7ba0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
7bb0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
7bc0: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
7bd0: 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  (pEList->a[i].pE
7be0: 78 70 72 2c 20 70 45 2c 20 2d 31 29 3c 32 20 29  xpr, pE, -1)<2 )
7bf0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  {.      return i
7c00: 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  +1;.    }.  }.. 
7c10: 20 2f 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 2c   /* If no match,
7c20: 20 72 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20   return 0. */.  
7c30: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7c40: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f  ** Generate an O
7c50: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
7c60: 20 42 59 20 74 65 72 6d 20 6f 75 74 2d 6f 66 2d   BY term out-of-
7c70: 72 61 6e 67 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a  range error..*/.
7c80: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f  static void reso
7c90: 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72  lveOutOfRangeErr
7ca0: 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  or(.  Parse *pPa
7cb0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
7cc0: 54 68 65 20 65 72 72 6f 72 20 63 6f 6e 74 65 78  The error contex
7cd0: 74 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20  t into which to 
7ce0: 77 72 69 74 65 20 74 68 65 20 65 72 72 6f 72 20  write the error 
7cf0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7d00: 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22  *zType,     /* "
7d10: 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50  ORDER" or "GROUP
7d20: 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  " */.  int i,   
7d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d40: 20 54 68 65 20 69 6e 64 65 78 20 28 31 2d 62 61   The index (1-ba
7d50: 73 65 64 29 20 6f 66 20 74 68 65 20 74 65 72 6d  sed) of the term
7d60: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2a 2f   out of range */
7d70: 0a 20 20 69 6e 74 20 6d 78 20 20 20 20 20 20 20  .  int mx       
7d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72            /* Lar
7d90: 67 65 73 74 20 70 65 72 6d 69 73 73 69 62 6c 65  gest permissible
7da0: 20 76 61 6c 75 65 20 6f 66 20 69 20 2a 2f 0a 29   value of i */.)
7db0: 7b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  {.  sqlite3Error
7dc0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
7dd0: 20 22 25 72 20 25 73 20 42 59 20 74 65 72 6d 20   "%r %s BY term 
7de0: 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73  out of range - s
7df0: 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 22  hould be ".    "
7e00: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64  between 1 and %d
7e10: 22 2c 20 69 2c 20 7a 54 79 70 65 2c 20 6d 78 29  ", i, zType, mx)
7e20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79  ;.}../*.** Analy
7e30: 7a 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ze the ORDER BY 
7e40: 63 6c 61 75 73 65 20 69 6e 20 61 20 63 6f 6d 70  clause in a comp
7e50: 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74  ound SELECT stat
7e60: 65 6d 65 6e 74 2e 20 20 20 4d 6f 64 69 66 79 0a  ement.   Modify.
7e70: 2a 2a 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  ** each term of 
7e80: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
7e90: 75 73 65 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  use is a constan
7ea0: 74 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  t integer betwee
7eb0: 6e 20 31 0a 2a 2a 20 61 6e 64 20 4e 20 77 68 65  n 1.** and N whe
7ec0: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
7ed0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
7ee0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45   the compound SE
7ef0: 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52 44 45  LECT..**.** ORDE
7f00: 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20  R BY terms that 
7f10: 61 72 65 20 61 6c 72 65 61 64 79 20 61 6e 20 69  are already an i
7f20: 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31  nteger between 1
7f30: 20 61 6e 64 20 4e 20 61 72 65 0a 2a 2a 20 75 6e   and N are.** un
7f40: 6d 6f 64 69 66 69 65 64 2e 20 20 4f 52 44 45 52  modified.  ORDER
7f50: 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 61   BY terms that a
7f60: 72 65 20 69 6e 74 65 67 65 72 73 20 6f 75 74 73  re integers outs
7f70: 69 64 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  ide the range of
7f80: 0a 2a 2a 20 31 20 74 68 72 6f 75 67 68 20 4e 20  .** 1 through N 
7f90: 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f  generate an erro
7fa0: 72 2e 20 20 4f 52 44 45 52 20 42 59 20 74 65 72  r.  ORDER BY ter
7fb0: 6d 73 20 74 68 61 74 20 61 72 65 20 65 78 70 72  ms that are expr
7fc0: 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6d  essions.** are m
7fd0: 61 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 72  atched against r
7fe0: 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73  esult set expres
7ff0: 73 69 6f 6e 73 20 6f 66 20 63 6f 6d 70 6f 75 6e  sions of compoun
8000: 64 20 53 45 4c 45 43 54 0a 2a 2a 20 62 65 67 69  d SELECT.** begi
8010: 6e 6e 69 6e 67 20 77 69 74 68 20 74 68 65 20 6c  nning with the l
8020: 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20  eft-most SELECT 
8030: 61 6e 64 20 77 6f 72 6b 69 6e 67 20 74 6f 77 61  and working towa
8040: 72 64 20 74 68 65 20 72 69 67 68 74 2e 0a 2a 2a  rd the right..**
8050: 20 41 74 20 74 68 65 20 66 69 72 73 74 20 6d 61   At the first ma
8060: 74 63 68 2c 20 74 68 65 20 4f 52 44 45 52 20 42  tch, the ORDER B
8070: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  Y expression is 
8080: 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
8090: 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72 20  .** the integer 
80a0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a  column number..*
80b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
80c0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
80d0: 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   seen..*/.static
80e0: 20 69 6e 74 20 72 65 73 6f 6c 76 65 43 6f 6d 70   int resolveComp
80f0: 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 50  oundOrderBy(.  P
8100: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8110: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
8120: 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20  context.  Leave 
8130: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68  error messages h
8140: 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ere */.  Select 
8150: 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f  *pSelect       /
8160: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
8170: 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e  tement containin
8180: 67 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a  g the ORDER BY *
8190: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
81a0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
81b0: 42 79 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  By;.  ExprList *
81c0: 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65  pEList;.  sqlite
81d0: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72  3 *db;.  int mor
81e0: 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f  eToDo = 1;..  pO
81f0: 72 64 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74  rderBy = pSelect
8200: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66  ->pOrderBy;.  if
8210: 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20  ( pOrderBy==0 ) 
8220: 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 20 3d  return 0;.  db =
8230: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66   pParse->db;.#if
8240: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
8250: 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  MN.  if( pOrderB
8260: 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  y->nExpr>db->aLi
8270: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
8280: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
8290: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
82a0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
82b0: 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44 45 52  y terms in ORDER
82c0: 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20   BY clause");.  
82d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
82e0: 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 30  #endif.  for(i=0
82f0: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
8300: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  xpr; i++){.    p
8310: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
8320: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53  ne = 0;.  }.  pS
8330: 65 6c 65 63 74 2d 3e 70 4e 65 78 74 20 3d 20 30  elect->pNext = 0
8340: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  ;.  while( pSele
8350: 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20  ct->pPrior ){.  
8360: 20 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f    pSelect->pPrio
8370: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 53 65 6c 65  r->pNext = pSele
8380: 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74 20  ct;.    pSelect 
8390: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
83a0: 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  r;.  }.  while( 
83b0: 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72 65 54  pSelect && moreT
83c0: 6f 44 6f 20 29 7b 0a 20 20 20 20 73 74 72 75 63  oDo ){.    struc
83d0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
83e0: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 6d 6f 72 65  *pItem;.    more
83f0: 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20 70 45  ToDo = 0;.    pE
8400: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
8410: 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65  pEList;.    asse
8420: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
8430: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
8440: 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
8450: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
8460: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
8470: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
8480: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45 78  l = -1;.      Ex
8490: 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20  pr *pE, *pDup;. 
84a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
84b0: 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b  done ) continue;
84c0: 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c 69  .      pE = sqli
84d0: 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61  te3ExprSkipColla
84e0: 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  te(pItem->pExpr)
84f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
8500: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
8510: 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20  (pE, &iCol) ){. 
8520: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c         if( iCol<
8530: 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73  =0 || iCol>pELis
8540: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
8550: 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 74        resolveOut
8560: 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50 61  OfRangeError(pPa
8570: 72 73 65 2c 20 22 4f 52 44 45 52 22 2c 20 69 2b  rse, "ORDER", i+
8580: 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  1, pEList->nExpr
8590: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
85a0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
85b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
85c0: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 73        iCol = res
85d0: 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50 61 72 73  olveAsName(pPars
85e0: 65 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 3b 0a  e, pEList, pE);.
85f0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
8600: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8610: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
8620: 78 70 72 44 75 70 28 64 62 2c 20 70 45 2c 20 30  xprDup(db, pE, 0
8630: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8640: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
8650: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
8660: 20 20 61 73 73 65 72 74 28 70 44 75 70 29 3b 0a    assert(pDup);.
8670: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
8680: 20 3d 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 42   = resolveOrderB
8690: 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28  yTermToExprList(
86a0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
86b0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
86c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
86d0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
86e0: 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  db, pDup);.     
86f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8700: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
8710: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76  .        /* Conv
8720: 65 72 74 20 74 68 65 20 4f 52 44 45 52 20 42 59  ert the ORDER BY
8730: 20 74 65 72 6d 20 69 6e 74 6f 20 61 6e 20 69 6e   term into an in
8740: 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d  teger column num
8750: 62 65 72 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20  ber iCol,.      
8760: 20 20 2a 2a 20 74 61 6b 69 6e 67 20 63 61 72 65    ** taking care
8770: 20 74 6f 20 70 72 65 73 65 72 76 65 20 74 68 65   to preserve the
8780: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 20   COLLATE clause 
8790: 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
87a0: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e          Expr *pN
87b0: 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ew = sqlite3Expr
87c0: 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c  (db, TK_INTEGER,
87d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
87e0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
87f0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  n 1;.        pNe
8800: 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49  w->flags |= EP_I
8810: 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  ntValue;.       
8820: 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20   pNew->u.iValue 
8830: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = iCol;.        
8840: 69 66 28 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  if( pItem->pExpr
8850: 3d 3d 70 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ==pE ){.        
8860: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
8870: 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   pNew;.        }
8880: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8890: 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 70  assert( pItem->p
88a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  Expr->op==TK_COL
88b0: 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20  LATE );.        
88c0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
88d0: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 70  >pExpr->pLeft==p
88e0: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  E );.          p
88f0: 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65  Item->pExpr->pLe
8900: 66 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ft = pNew;.     
8910: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
8920: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8930: 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20  b, pE);.        
8940: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
8950: 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43  rByCol = (u16)iC
8960: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  ol;.        pIte
8970: 6d 2d 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  m->done = 1;.   
8980: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8990: 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a    moreToDo = 1;.
89a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
89b0: 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c    pSelect = pSel
89c0: 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ect->pNext;.  }.
89d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
89e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
89f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  +){.    if( pOrd
8a00: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d  erBy->a[i].done=
8a10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8a20: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8a30: 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42 59  se, "%r ORDER BY
8a40: 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d   term does not m
8a50: 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20 20  atch any ".     
8a60: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69         "column i
8a70: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8a80: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 72  ", i+1);.      r
8a90: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
8aa0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8ab0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 65 76  ../*.** Check ev
8ac0: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
8ad0: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
8ae0: 50 20 42 59 20 63 6c 61 75 73 65 20 70 4f 72 64  P BY clause pOrd
8af0: 65 72 42 79 20 6f 66 0a 2a 2a 20 74 68 65 20 53  erBy of.** the S
8b00: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8b10: 70 53 65 6c 65 63 74 2e 20 20 49 66 20 61 6e 79  pSelect.  If any
8b20: 20 74 65 72 6d 20 69 73 20 72 65 66 65 72 65 6e   term is referen
8b30: 63 65 20 74 6f 20 61 0a 2a 2a 20 72 65 73 75 6c  ce to a.** resul
8b40: 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
8b50: 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
8b60: 62 79 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  by the ExprList.
8b70: 61 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  a.u.x.iOrderByCo
8b80: 6c 0a 2a 2a 20 66 69 65 6c 64 29 20 74 68 65 6e  l.** field) then
8b90: 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 74 65   convert that te
8ba0: 72 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79 20 6f  rm into a copy o
8bb0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
8bc0: 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  ing result set.*
8bd0: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  * column..**.** 
8be0: 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
8bf0: 65 20 64 65 74 65 63 74 65 64 2c 20 61 64 64 20  e detected, add 
8c00: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
8c10: 20 74 6f 20 70 50 61 72 73 65 20 61 6e 64 0a 2a   to pParse and.*
8c20: 2a 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * return non-zer
8c30: 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  o.  Return zero 
8c40: 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 61 72 65  if no errors are
8c50: 20 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   seen..*/.int sq
8c60: 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
8c70: 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73  rGroupBy(.  Pars
8c80: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8c90: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8ca0: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
8cb0: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
8cc0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
8cd0: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
8ce0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
8cf0: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
8d00: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  he clause */.  E
8d10: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
8d20: 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
8d30: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
8d40: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
8d50: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ocessed */.  con
8d60: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
8d70: 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72     /* "ORDER" or
8d80: 20 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20   "GROUP" */.){. 
8d90: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
8da0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8db0: 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  db;.  ExprList *
8dc0: 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
8dd0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8de0: 70 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70 4f  pItem;..  if( pO
8df0: 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61  rderBy==0 || pPa
8e00: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8e10: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
8e20: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
8e30: 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f  _COLUMN.  if( pO
8e40: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62  rderBy->nExpr>db
8e50: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8e60: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
8e70: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8e80: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8e90: 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
8ea0: 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a  %s BY clause", z
8eb0: 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Type);.    retur
8ec0: 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 1;.  }.#endif.
8ed0: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
8ee0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73  ct->pEList;.  as
8ef0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
8f00: 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 65  );  /* sqlite3Se
8f10: 6c 65 63 74 4e 65 77 28 29 20 67 75 61 72 61 6e  lectNew() guaran
8f20: 74 65 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 66  tees this */.  f
8f30: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
8f40: 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72  rderBy->a; i<pOr
8f50: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
8f60: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
8f70: 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
8f80: 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20  iOrderByCol ){. 
8f90: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
8fa0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
8fb0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
8fc0: 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65  .        resolve
8fd0: 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28  OutOfRangeError(
8fe0: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69  pParse, zType, i
8ff0: 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  +1, pEList->nExp
9000: 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
9010: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
9020: 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69 61 73      resolveAlias
9030: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
9040: 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
9050: 65 72 42 79 43 6f 6c 2d 31 2c 20 70 49 74 65 6d  erByCol-1, pItem
9060: 2d 3e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->pExpr,.       
9070: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70              zTyp
9080: 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e,0);.    }.  }.
9090: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
90a0: 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
90b0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
90c0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
90d0: 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  in SELECT statem
90e0: 65 6e 74 20 70 53 65 6c 65 63 74 2e 0a 2a 2a 20  ent pSelect..** 
90f0: 54 68 65 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74  The Name context
9100: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
9110: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 4e 43 2e  tatement is pNC.
9120: 20 20 7a 54 79 70 65 20 69 73 20 65 69 74 68 65    zType is eithe
9130: 72 0a 2a 2a 20 22 4f 52 44 45 52 22 20 6f 72 20  r.** "ORDER" or 
9140: 22 47 52 4f 55 50 22 20 64 65 70 65 6e 64 69 6e  "GROUP" dependin
9150: 67 20 6f 6e 20 77 68 69 63 68 20 74 79 70 65 20  g on which type 
9160: 6f 66 20 63 6c 61 75 73 65 20 70 4f 72 64 65 72  of clause pOrder
9170: 42 79 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  By is..**.** Thi
9180: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
9190: 65 73 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  es each term of 
91a0: 74 68 65 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  the clause into 
91b0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
91c0: 2a 20 49 66 20 74 68 65 20 6f 72 64 65 72 2d 62  * If the order-b
91d0: 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74  y term is an int
91e0: 65 67 65 72 20 49 20 62 65 74 77 65 65 6e 20 31  eger I between 1
91f0: 20 61 6e 64 20 4e 20 28 77 68 65 72 65 20 4e 20   and N (where N 
9200: 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
9210: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
9220: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
9230: 20 74 68 65 20 53 45 4c 45 43 54 29 20 74 68 65   the SELECT) the
9240: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9250: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 6f 6c  .** in the resol
9260: 75 74 69 6f 6e 20 69 73 20 61 20 63 6f 70 79 20  ution is a copy 
9270: 6f 66 20 74 68 65 20 49 2d 74 68 20 72 65 73 75  of the I-th resu
9280: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
9290: 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 6f 72  n.  If.** the or
92a0: 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61  der-by term is a
92b0: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 74 68 61  n identifier tha
92c0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
92d0: 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 0a   the AS-name of.
92e0: 2a 2a 20 61 20 72 65 73 75 6c 74 2d 73 65 74 20  ** a result-set 
92f0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
9300: 20 74 68 65 20 74 65 72 6d 20 72 65 73 6f 6c 76   the term resolv
9310: 65 73 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20  es to a copy of 
9320: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  the.** result-se
9330: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4f  t expression.  O
9340: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 65 78  therwise, the ex
9350: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 73 6f  pression is reso
9360: 6c 76 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lved in.** the u
9370: 73 75 61 6c 20 77 61 79 20 2d 20 75 73 69 6e 67  sual way - using
9380: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
9390: 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a  xprNames()..**.*
93a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
93b0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
93c0: 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
93d0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 74   errors occur, t
93e0: 68 65 6e 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  hen.** an approp
93f0: 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
9400: 61 67 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66  age might be lef
9410: 74 20 69 6e 20 70 50 61 72 73 65 2e 20 20 28 4f  t in pParse.  (O
9420: 4f 4d 20 65 72 72 6f 72 73 0a 2a 2a 20 65 78 63  OM errors.** exc
9430: 65 70 74 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  epted.).*/.stati
9440: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64  c int resolveOrd
9450: 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d  erGroupBy(.  Nam
9460: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
9470: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
9480: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45  ontext of the SE
9490: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
94a0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
94b0: 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ect,      /* The
94c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
94d0: 74 20 68 6f 6c 64 69 6e 67 20 70 4f 72 64 65 72  t holding pOrder
94e0: 42 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  By */.  ExprList
94f0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
9500: 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   An ORDER BY or 
9510: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
9520: 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
9530: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
9540: 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  e     /* Either 
9550: 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
9560: 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  P", as appropria
9570: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
9580: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
9590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
95a0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
95b0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
95d0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
95e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
95f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9600: 3b 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66  ;   /* A term of
9610: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
9620: 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73 65 20  ause */.  Parse 
9630: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
9640: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9650: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9660: 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 20 20 20   int nResult;   
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
9690: 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ms in the result
96a0: 20 73 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 70   set */..  if( p
96b0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
96c0: 75 72 6e 20 30 3b 0a 20 20 6e 52 65 73 75 6c 74  urn 0;.  nResult
96d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
96e0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 50 61  st->nExpr;.  pPa
96f0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
9700: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  e;.  for(i=0, pI
9710: 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
9720: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
9730: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
9740: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
9750: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
9760: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
9770: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
9780: 6f 6c 6c 61 74 65 28 70 45 29 3b 0a 20 20 20 20  ollate(pE);.    
9790: 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47  if( zType[0]!='G
97a0: 27 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20  ' ){.      iCol 
97b0: 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28  = resolveAsName(
97c0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
97d0: 3e 70 45 4c 69 73 74 2c 20 70 45 32 29 3b 0a 20  >pEList, pE2);. 
97e0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
97f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
9800: 20 61 6e 20 41 53 2d 6e 61 6d 65 20 6d 61 74 63   an AS-name matc
9810: 68 20 69 73 20 66 6f 75 6e 64 2c 20 6d 61 72 6b  h is found, mark
9820: 20 74 68 69 73 20 4f 52 44 45 52 20 42 59 20 63   this ORDER BY c
9830: 6f 6c 75 6d 6e 20 61 73 20 62 65 69 6e 67 0a 20  olumn as being. 
9840: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79         ** a copy
9850: 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
9860: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
9870: 6e 2e 20 20 54 68 65 20 73 75 62 73 65 71 75 65  n.  The subseque
9880: 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20  nt call to.     
9890: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73     ** sqlite3Res
98a0: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
98b0: 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  () will convert 
98c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
98d0: 6f 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  o a.        ** c
98e0: 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  opy of the iCol-
98f0: 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  th result-set ex
9900: 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  pression. */.   
9910: 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
9920: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
9930: 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16)iCol;.       
9940: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9950: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9960: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
9970: 74 65 67 65 72 28 70 45 32 2c 20 26 69 43 6f 6c  teger(pE2, &iCol
9980: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
9990: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
99a0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
99b0: 6e 73 74 61 6e 74 2e 20 20 41 67 61 69 6e 2c 20  nstant.  Again, 
99c0: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  set the column. 
99d0: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 73       ** number s
99e0: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 52 65  o that sqlite3Re
99f0: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
9a00: 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74  y() will convert
9a10: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72   the.      ** or
9a20: 64 65 72 2d 62 79 20 74 65 72 6d 20 74 6f 20 61  der-by term to a
9a30: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72 65 73   copy of the res
9a40: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
9a50: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
9a60: 69 43 6f 6c 3c 31 20 7c 7c 20 69 43 6f 6c 3e 30  iCol<1 || iCol>0
9a70: 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20  xffff ){.       
9a80: 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e   resolveOutOfRan
9a90: 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  geError(pParse, 
9aa0: 7a 54 79 70 65 2c 20 69 2b 31 2c 20 6e 52 65 73  zType, i+1, nRes
9ab0: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ult);.        re
9ac0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
9ad0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
9ae0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
9af0: 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20  u16)iCol;.      
9b00: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
9b10: 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  .    /* Otherwis
9b20: 65 2c 20 74 72 65 61 74 20 74 68 65 20 4f 52 44  e, treat the ORD
9b30: 45 52 20 42 59 20 74 65 72 6d 20 61 73 20 61 6e  ER BY term as an
9b40: 20 6f 72 64 69 6e 61 72 79 20 65 78 70 72 65 73   ordinary expres
9b50: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 49 74 65  sion */.    pIte
9b60: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
9b70: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ol = 0;.    if( 
9b80: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
9b90: 70 72 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29  prNames(pNC, pE)
9ba0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9bb0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   1;.    }.    fo
9bc0: 72 28 6a 3d 30 3b 20 6a 3c 70 53 65 6c 65 63 74  r(j=0; j<pSelect
9bd0: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
9be0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
9bf0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
9c00: 61 72 65 28 70 45 2c 20 70 53 65 6c 65 63 74 2d  are(pE, pSelect-
9c10: 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  >pEList->a[j].pE
9c20: 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  xpr, -1)==0 ){. 
9c30: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
9c40: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
9c50: 6a 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j+1;.      }.   
9c60: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9c70: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
9c80: 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
9c90: 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 4f 72 64  e, pSelect, pOrd
9ca0: 65 72 42 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a  erBy, zType);.}.
9cb0: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e  ./*.** Resolve n
9cc0: 61 6d 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ames in the SELE
9cd0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 20 61  CT statement p a
9ce0: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 64 65  nd all of its de
9cf0: 73 63 65 6e 64 61 6e 74 73 2e 0a 2a 2f 0a 73 74  scendants..*/.st
9d00: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
9d10: 53 65 6c 65 63 74 53 74 65 70 28 57 61 6c 6b 65  SelectStep(Walke
9d20: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
9d30: 63 74 20 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f  ct *p){.  NameCo
9d40: 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b  ntext *pOuterNC;
9d50: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 74 68 61    /* Context tha
9d60: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20  t contains this 
9d70: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65  SELECT */.  Name
9d80: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
9d90: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
9da0: 65 78 74 20 6f 66 20 74 68 69 73 20 53 45 4c 45  ext of this SELE
9db0: 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  CT */.  int isCo
9dc0: 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20  mpound;         
9dd0: 2f 2a 20 54 72 75 65 20 69 66 20 70 20 69 73 20  /* True if p is 
9de0: 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
9df0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70  t */.  int nComp
9e00: 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  ound;          /
9e10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70  * Number of comp
9e20: 6f 75 6e 64 20 74 65 72 6d 73 20 70 72 6f 63 65  ound terms proce
9e30: 73 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ssed so far */. 
9e40: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
9e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9e60: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9e70: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9e80: 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
9e90: 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
9ea0: 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n list */.  int 
9eb0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9ec0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9ed0: 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ter */.  ExprLis
9ee0: 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
9ef0: 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
9f00: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c   clause */.  Sel
9f10: 65 63 74 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20  ect *pLeftmost; 
9f20: 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
9f30: 74 20 6f 66 20 53 45 4c 45 43 54 20 6f 66 20 61  t of SELECT of a
9f40: 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 73   compound */.  s
9f50: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
9f60: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
9f70: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
9f80: 0a 20 20 0a 0a 20 20 61 73 73 65 72 74 28 20 70  .  ..  assert( p
9f90: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
9fa0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
9fb0: 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 72 65  solved ){.    re
9fc0: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
9fd0: 20 20 7d 0a 20 20 70 4f 75 74 65 72 4e 43 20 3d    }.  pOuterNC =
9fe0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
9ff0: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
a000: 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
a010: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a020: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 73  .  /* Normally s
a030: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
a040: 6e 64 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c  nd() will be cal
a050: 6c 65 64 20 66 69 72 73 74 20 61 6e 64 20 77 69  led first and wi
a060: 6c 6c 20 68 61 76 65 0a 20 20 2a 2a 20 61 6c 72  ll have.  ** alr
a070: 65 61 64 79 20 65 78 70 61 6e 64 65 64 20 74 68  eady expanded th
a080: 69 73 20 53 45 4c 45 43 54 2e 20 20 48 6f 77 65  is SELECT.  Howe
a090: 76 65 72 2c 20 69 66 20 74 68 69 73 20 69 73 20  ver, if this is 
a0a0: 61 20 73 75 62 71 75 65 72 79 20 77 69 74 68 69  a subquery withi
a0b0: 6e 0a 20 20 2a 2a 20 61 6e 20 65 78 70 72 65 73  n.  ** an expres
a0c0: 73 69 6f 6e 2c 20 73 71 6c 69 74 65 33 52 65 73  sion, sqlite3Res
a0d0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20  olveExprNames() 
a0e0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 77  will be called w
a0f0: 69 74 68 6f 75 74 20 61 0a 20 20 2a 2a 20 70 72  ithout a.  ** pr
a100: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
a110: 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
a120: 29 2e 20 20 57 68 65 6e 20 74 68 61 74 20 68 61  ).  When that ha
a130: 70 70 65 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a 20  ppens, let.  ** 
a140: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
a150: 70 28 29 20 64 6f 20 61 6c 6c 20 6f 66 20 74 68  p() do all of th
a160: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  e processing for
a170: 20 74 68 69 73 20 53 45 4c 45 43 54 2e 0a 20 20   this SELECT..  
a180: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
a190: 50 72 65 70 28 29 20 77 69 6c 6c 20 69 6e 76 6f  Prep() will invo
a1a0: 6b 65 20 62 6f 74 68 20 73 71 6c 69 74 65 33 53  ke both sqlite3S
a1b0: 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 61 6e  electExpand() an
a1c0: 64 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f 75 74  d.  ** this rout
a1d0: 69 6e 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65  ine in the corre
a1e0: 63 74 20 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20  ct order..  */. 
a1f0: 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
a200: 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
a210: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
a220: 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
a230: 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
a240: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 70  );.    return (p
a250: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
a260: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
a270: 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57   ? WRC_Abort : W
a280: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20  RC_Prune;.  }.. 
a290: 20 69 73 43 6f 6d 70 6f 75 6e 64 20 3d 20 70 2d   isCompound = p-
a2a0: 3e 70 50 72 69 6f 72 21 3d 30 3b 0a 20 20 6e 43  >pPrior!=0;.  nC
a2b0: 6f 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 70  ompound = 0;.  p
a2c0: 4c 65 66 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20  Leftmost = p;.  
a2d0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
a2e0: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
a2f0: 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
a300: 65 64 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ed)!=0 );.    as
a310: 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
a320: 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
a330: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 73  )==0 );.    p->s
a340: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
a350: 73 6f 6c 76 65 64 3b 0a 0a 20 20 20 20 2f 2a 20  solved;..    /* 
a360: 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  Resolve the expr
a370: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c  essions in the L
a380: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
a390: 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20  clauses. These. 
a3a0: 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c     ** are not al
a3b0: 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74  lowed to refer t
a3c0: 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20  o any names, so 
a3d0: 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61  pass an empty Na
a3e0: 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  meContext..    *
a3f0: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
a400: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
a410: 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
a420: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
a430: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
a440: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
a450: 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c  C, p->pLimit) ||
a460: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a470: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
a480: 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65  (&sNC, p->pOffse
a490: 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
a4a0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
a4b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
a4c0: 68 65 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 20  he SF_Converted 
a4d0: 66 6c 61 67 73 20 69 73 20 73 65 74 2c 20 74 68  flags is set, th
a4e0: 65 6e 20 74 68 69 73 20 53 65 6c 65 63 74 20 6f  en this Select o
a4f0: 62 6a 65 63 74 20 77 61 73 0a 20 20 20 20 2a 2a  bject was.    **
a500: 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
a510: 74 68 65 20 63 6f 6e 76 65 72 74 43 6f 6d 70 6f  the convertCompo
a520: 75 6e 64 53 65 6c 65 63 74 54 6f 53 75 62 71 75  undSelectToSubqu
a530: 65 72 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ery() function..
a540: 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
a550: 61 73 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ase the ORDER BY
a560: 20 63 6c 61 75 73 65 20 28 70 2d 3e 70 4f 72 64   clause (p->pOrd
a570: 65 72 42 79 29 20 73 68 6f 75 6c 64 20 62 65 20  erBy) should be 
a580: 72 65 73 6f 6c 76 65 64 0a 20 20 20 20 2a 2a 20  resolved.    ** 
a590: 61 73 20 69 66 20 69 74 20 77 65 72 65 20 70 61  as if it were pa
a5a0: 72 74 20 6f 66 20 74 68 65 20 73 75 62 2d 71 75  rt of the sub-qu
a5b0: 65 72 79 2c 20 6e 6f 74 20 74 68 65 20 70 61 72  ery, not the par
a5c0: 65 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 0a  ent. This block.
a5d0: 20 20 20 20 2a 2a 20 6d 6f 76 65 73 20 74 68 65      ** moves the
a5e0: 20 70 4f 72 64 65 72 42 79 20 64 6f 77 6e 20 74   pOrderBy down t
a5f0: 6f 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2e  o the sub-query.
a600: 20 49 74 20 77 69 6c 6c 20 62 65 20 6d 6f 76 65   It will be move
a610: 64 20 62 61 63 6b 0a 20 20 20 20 2a 2a 20 61 66  d back.    ** af
a620: 74 65 72 20 74 68 65 20 6e 61 6d 65 73 20 68 61  ter the names ha
a630: 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ve been resolved
a640: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
a650: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43  >selFlags & SF_C
a660: 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
a670: 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d    Select *pSub =
a680: 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70   p->pSrc->a[0].p
a690: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 61 73  Select;.      as
a6a0: 73 65 72 74 28 20 70 2d 3e 70 53 72 63 2d 3e 6e  sert( p->pSrc->n
a6b0: 53 72 63 3d 3d 31 20 26 26 20 69 73 43 6f 6d 70  Src==1 && isComp
a6c0: 6f 75 6e 64 3d 3d 30 20 26 26 20 70 2d 3e 70 4f  ound==0 && p->pO
a6d0: 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20 20 20  rderBy );.      
a6e0: 61 73 73 65 72 74 28 20 70 53 75 62 2d 3e 70 50  assert( pSub->pP
a6f0: 72 69 6f 72 20 26 26 20 70 53 75 62 2d 3e 70 4f  rior && pSub->pO
a700: 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a 20 20 20  rderBy==0 );.   
a710: 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
a720: 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72 42 79 3b  y = p->pOrderBy;
a730: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
a740: 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  By = 0;.    }.  
a750: 0a 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76  .    /* Recursiv
a760: 65 6c 79 20 72 65 73 6f 6c 76 65 20 6e 61 6d 65  ely resolve name
a770: 73 20 69 6e 20 61 6c 6c 20 73 75 62 71 75 65 72  s in all subquer
a780: 69 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ies.    */.    f
a790: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
a7a0: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
a7b0: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
a7c0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
a7d0: 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
a7e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
a7f0: 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
a800: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
a810: 74 20 2a 70 4e 43 3b 20 20 20 20 20 20 20 20 20  t *pNC;         
a820: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
a830: 74 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  te name contexts
a840: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
a850: 6e 52 65 66 20 3d 20 30 3b 20 20 20 20 20 20 20  nRef = 0;       
a860: 20 20 20 20 20 20 2f 2a 20 52 65 66 63 6f 75 6e        /* Refcoun
a870: 74 20 66 6f 72 20 70 4f 75 74 65 72 4e 43 20 61  t for pOuterNC a
a880: 6e 64 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74  nd outer context
a890: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  s */.        con
a8a0: 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65 64 43  st char *zSavedC
a8b0: 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73 65 2d  ontext = pParse-
a8c0: 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b 0a 0a  >zAuthContext;..
a8d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
a8e0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
a8f0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
a900: 74 6f 20 70 4f 75 74 65 72 4e 43 20 61 6e 64 20  to pOuterNC and 
a910: 61 6c 6c 20 6f 66 20 69 74 73 0a 20 20 20 20 20  all of its.     
a920: 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 63 6f 6e     ** parent con
a930: 74 65 78 74 73 2e 20 41 66 74 65 72 20 72 65 73  texts. After res
a940: 6f 6c 76 69 6e 67 20 72 65 66 65 72 65 6e 63 65  olving reference
a950: 73 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73  s to expressions
a960: 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 70   in.        ** p
a970: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 63  Item->pSelect, c
a980: 68 65 63 6b 20 69 66 20 74 68 69 73 20 76 61 6c  heck if this val
a990: 75 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ue has changed. 
a9a0: 49 66 20 73 6f 2c 20 74 68 65 6e 0a 20 20 20 20  If so, then.    
a9b0: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20 73 74      ** SELECT st
a9c0: 61 74 65 6d 65 6e 74 20 70 49 74 65 6d 2d 3e 70  atement pItem->p
a9d0: 53 65 6c 65 63 74 20 6d 75 73 74 20 62 65 20 63  Select must be c
a9e0: 6f 72 72 65 6c 61 74 65 64 2e 20 53 65 74 20 74  orrelated. Set t
a9f0: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 49  he.        ** pI
aa00: 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  tem->isCorrelate
aa10: 64 20 66 6c 61 67 20 69 66 20 74 68 69 73 20 69  d flag if this i
aa20: 73 20 74 68 65 20 63 61 73 65 2e 20 2a 2f 0a 20  s the case. */. 
aa30: 20 20 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70         for(pNC=p
aa40: 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e  OuterNC; pNC; pN
aa50: 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52  C=pNC->pNext) nR
aa60: 65 66 20 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  ef += pNC->nRef;
aa70: 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ..        if( pI
aa80: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 29 20 70 50 61  tem->zName ) pPa
aa90: 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
aaa0: 74 20 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  t = pItem->zName
aab0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
aac0: 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
aad0: 6d 65 73 28 70 50 61 72 73 65 2c 20 70 49 74 65  mes(pParse, pIte
aae0: 6d 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4f 75 74  m->pSelect, pOut
aaf0: 65 72 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 70  erNC);.        p
ab00: 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
ab10: 65 78 74 20 3d 20 7a 53 61 76 65 64 43 6f 6e 74  ext = zSavedCont
ab20: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ext;.        if(
ab30: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
ab40: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ab50: 64 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  d ) return WRC_A
ab60: 62 6f 72 74 3b 0a 0a 20 20 20 20 20 20 20 20 66  bort;..        f
ab70: 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b  or(pNC=pOuterNC;
ab80: 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70   pNC; pNC=pNC->p
ab90: 4e 65 78 74 29 20 6e 52 65 66 20 2d 3d 20 70 4e  Next) nRef -= pN
aba0: 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20  C->nRef;.       
abb0: 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
abc0: 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
abd0: 26 26 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20  && nRef<=0 );.  
abe0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 43        pItem->isC
abf0: 6f 72 72 65 6c 61 74 65 64 20 3d 20 28 6e 52 65  orrelated = (nRe
ac00: 66 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  f!=0);.      }. 
ac10: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53     }.  .    /* S
ac20: 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20  et up the local 
ac30: 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
ac40: 70 61 73 73 20 74 6f 20 73 71 6c 69 74 65 33 52  pass to sqlite3R
ac50: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
ac60: 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73 6f  ) to.    ** reso
ac70: 6c 76 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73  lve the result-s
ac80: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  et expression li
ac90: 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  st..    */.    s
aca0: 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f  NC.ncFlags = NC_
acb0: 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 73 4e  AllowAgg;.    sN
acc0: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e  C.pSrcList = p->
acd0: 70 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e  pSrc;.    sNC.pN
ace0: 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a  ext = pOuterNC;.
acf0: 20 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76    .    /* Resolv
ad00: 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72  e names in the r
ad10: 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20  esult set. */.  
ad20: 20 20 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45    pEList = p->pE
ad30: 4c 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74  List;.    assert
ad40: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
ad50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
ad60: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
ad70: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
ad80: 58 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  X = pEList->a[i]
ad90: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 69 66  .pExpr;.      if
ada0: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
adb0: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
adc0: 70 58 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pX) ){.        r
add0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
ade0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
adf0: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72   .    /* If ther
ae00: 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61  e are no aggrega
ae10: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
ae20: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20  the result-set, 
ae30: 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
ae40: 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69  .    ** expressi
ae50: 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77  on, do not allow
ae60: 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61   aggregates in a
ae70: 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ny of the other 
ae80: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 20  expressions..   
ae90: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
aea0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
aeb0: 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20  F_Aggregate)==0 
aec0: 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
aed0: 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
aee0: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
aef0: 7c 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73 20  || (sNC.ncFlags 
af00: 26 20 4e 43 5f 48 61 73 41 67 67 29 21 3d 30 20  & NC_HasAgg)!=0 
af10: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
af20: 20 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 3d 3d 53   NC_MinMaxAgg==S
af30: 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
af40: 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
af50: 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
af60: 20 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73 26   | (sNC.ncFlags&
af70: 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a 20  NC_MinMaxAgg);. 
af80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
af90: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
afa0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20  NC_AllowAgg;.   
afb0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
afc0: 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
afd0: 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
afe0: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
aff0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
b000: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b010: 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21   p->pHaving && !
b020: 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
b030: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b040: 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
b050: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
b060: 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
b070: 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20  HAVING");.      
b080: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
b090: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
b0a0: 2a 20 41 64 64 20 74 68 65 20 6f 75 74 70 75 74  * Add the output
b0b0: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
b0c0: 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
b0d0: 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20   before parsing 
b0e0: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
b0f0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
b100: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
b110: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f  ment. This is so
b120: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 78 70   that.    ** exp
b130: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
b140: 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65 74  WHERE clause (et
b150: 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f  c.) can refer to
b160: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a   expressions by.
b170: 20 20 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69      ** aliases i
b180: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
b190: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
b1a0: 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20  Minor point: If 
b1b0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
b1c0: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
b1d0: 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ssion will be.  
b1e0: 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65    ** re-evaluate
b1f0: 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72  d for each refer
b200: 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 20 20  ence to it..    
b210: 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 45 4c 69 73  */.    sNC.pELis
b220: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
b230: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
b240: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26  solveExprNames(&
b250: 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
b260: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
b270: 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ort;.    if( sql
b280: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
b290: 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57  ames(&sNC, p->pW
b2a0: 68 65 72 65 29 20 29 20 72 65 74 75 72 6e 20 57  here) ) return W
b2b0: 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 2f  RC_Abort;..    /
b2c0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 61  * The ORDER BY a
b2d0: 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  nd GROUP BY clau
b2e0: 73 65 73 20 6d 61 79 20 6e 6f 74 20 72 65 66 65  ses may not refe
b2f0: 72 20 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20 20  r to terms in.  
b300: 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 69    ** outer queri
b310: 65 73 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  es .    */.    s
b320: 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  NC.pNext = 0;.  
b330: 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
b340: 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 0a 20   NC_AllowAgg;.. 
b350: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
b360: 20 61 20 63 6f 6e 76 65 72 74 65 64 20 63 6f 6d   a converted com
b370: 70 6f 75 6e 64 20 71 75 65 72 79 2c 20 6d 6f 76  pound query, mov
b380: 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
b390: 6c 61 75 73 65 20 66 72 6f 6d 20 0a 20 20 20 20  lause from .    
b3a0: 2a 2a 20 74 68 65 20 73 75 62 2d 71 75 65 72 79  ** the sub-query
b3b0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72   back to the par
b3c0: 65 6e 74 20 71 75 65 72 79 2e 20 41 74 20 74 68  ent query. At th
b3d0: 69 73 20 70 6f 69 6e 74 20 65 61 63 68 20 74 65  is point each te
b3e0: 72 6d 0a 20 20 20 20 2a 2a 20 77 69 74 68 69 6e  rm.    ** within
b3f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b400: 61 75 73 65 20 68 61 73 20 62 65 65 6e 20 74 72  ause has been tr
b410: 61 6e 73 66 6f 72 6d 65 64 20 74 6f 20 61 6e 20  ansformed to an 
b420: 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 20  integer value.. 
b430: 20 20 20 2a 2a 20 54 68 65 73 65 20 69 6e 74 65     ** These inte
b440: 67 65 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70  gers will be rep
b450: 6c 61 63 65 64 20 62 79 20 63 6f 70 69 65 73 20  laced by copies 
b460: 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
b470: 64 69 6e 67 20 72 65 73 75 6c 74 0a 20 20 20 20  ding result.    
b480: 2a 2a 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  ** set expressio
b490: 6e 73 20 62 79 20 74 68 65 20 63 61 6c 6c 20 74  ns by the call t
b4a0: 6f 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  o resolveOrderGr
b4b0: 6f 75 70 42 79 28 29 20 62 65 6c 6f 77 2e 20 20  oupBy() below.  
b4c0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65  */.    if( p->se
b4d0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76  lFlags & SF_Conv
b4e0: 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53  erted ){.      S
b4f0: 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d  elect *pSub = p-
b500: 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c  >pSrc->a[0].pSel
b510: 65 63 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  ect;.      p->pO
b520: 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70  rderBy = pSub->p
b530: 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70  OrderBy;.      p
b540: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  Sub->pOrderBy = 
b550: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
b560: 20 50 72 6f 63 65 73 73 20 74 68 65 20 4f 52 44   Process the ORD
b570: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
b580: 20 73 69 6e 67 6c 65 74 6f 6e 20 53 45 4c 45 43   singleton SELEC
b590: 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  T statements..  
b5a0: 20 20 2a 2a 20 54 68 65 20 4f 52 44 45 52 20 42    ** The ORDER B
b5b0: 59 20 63 6c 61 75 73 65 20 66 6f 72 20 63 6f 6d  Y clause for com
b5c0: 70 6f 75 6e 64 73 20 53 45 4c 45 43 54 20 73 74  pounds SELECT st
b5d0: 61 74 65 6d 65 6e 74 73 20 69 73 20 68 61 6e 64  atements is hand
b5e0: 6c 65 64 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77  led.    ** below
b5f0: 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74  , after all of t
b600: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 73 20 66  he result-sets f
b610: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 65 6c  or all of the el
b620: 65 6d 65 6e 74 73 20 6f 66 0a 20 20 20 20 2a 2a  ements of.    **
b630: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61   the compound ha
b640: 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ve been resolved
b650: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
b660: 20 21 69 73 43 6f 6d 70 6f 75 6e 64 20 26 26 20   !isCompound && 
b670: 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  resolveOrderGrou
b680: 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 2d 3e  pBy(&sNC, p, p->
b690: 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52  pOrderBy, "ORDER
b6a0: 22 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ") ){.      retu
b6b0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
b6c0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
b6d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b6e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
b6f0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
b700: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
b710: 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
b720: 75 73 65 2e 20 20 41 74 20 74 68 65 20 73 61 6d  use.  At the sam
b730: 65 20 74 69 6d 65 2c 20 6d 61 6b 65 20 73 75 72  e time, make sur
b740: 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 47 52  e .    ** the GR
b750: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f  OUP BY clause do
b760: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
b770: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
b780: 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ns..    */.    i
b790: 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
b7a0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
b7b0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
b7c0: 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28  ;.    .      if(
b7d0: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
b7e0: 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 47  upBy(&sNC, p, pG
b7f0: 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29  roupBy, "GROUP")
b800: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
b810: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
b820: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
b830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b840: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
b850: 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
b860: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
b870: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
b880: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
b890: 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d  sProperty(pItem-
b8a0: 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20  >pExpr, EP_Agg) 
b8b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
b8c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b8d0: 72 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20  rse, "aggregate 
b8e0: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  functions are no
b8f0: 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20  t allowed in ". 
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68               "th
b910: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
b920: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e");.          r
b930: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
b940: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b950: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
b960: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
b970: 6e 65 78 74 20 74 65 72 6d 20 6f 66 20 74 68 65  next term of the
b980: 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 20 20 2a 2f   compound.    */
b990: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
b9a0: 6f 72 3b 0a 20 20 20 20 6e 43 6f 6d 70 6f 75 6e  or;.    nCompoun
b9b0: 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  d++;.  }..  /* R
b9c0: 65 73 6f 6c 76 65 20 74 68 65 20 4f 52 44 45 52  esolve the ORDER
b9d0: 20 42 59 20 6f 6e 20 61 20 63 6f 6d 70 6f 75 6e   BY on a compoun
b9e0: 64 20 53 45 4c 45 43 54 20 61 66 74 65 72 20 61  d SELECT after a
b9f0: 6c 6c 20 74 65 72 6d 73 20 6f 66 0a 20 20 2a 2a  ll terms of.  **
ba00: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61   the compound ha
ba10: 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ve been resolved
ba20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43  ..  */.  if( isC
ba30: 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f 6c  ompound && resol
ba40: 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42  veCompoundOrderB
ba50: 79 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 6d  y(pParse, pLeftm
ba60: 6f 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ost) ){.    retu
ba70: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
ba80: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  }..  return WRC_
ba90: 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Prune;.}../*.** 
baa0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c  This routine wal
bab0: 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ks an expression
bac0: 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76   tree and resolv
bad0: 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  es references to
bae0: 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  .** table column
baf0: 73 20 61 6e 64 20 72 65 73 75 6c 74 2d 73 65 74  s and result-set
bb00: 20 63 6f 6c 75 6d 6e 73 2e 20 20 41 74 20 74 68   columns.  At th
bb10: 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 6f 20  e same time, do 
bb20: 65 72 72 6f 72 0a 2a 2a 20 63 68 65 63 6b 69 6e  error.** checkin
bb30: 67 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73  g on function us
bb40: 61 67 65 20 61 6e 64 20 73 65 74 20 61 20 66 6c  age and set a fl
bb50: 61 67 20 69 66 20 61 6e 79 20 61 67 67 72 65 67  ag if any aggreg
bb60: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  ate functions.**
bb70: 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a   are seen..**.**
bb80: 20 54 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c   To resolve tabl
bb90: 65 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65 72 65  e columns refere
bba0: 6e 63 65 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72  nces we look for
bbb0: 20 6e 6f 64 65 73 20 28 6f 72 20 73 75 62 74 72   nodes (or subtr
bbc0: 65 65 73 29 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ees) of the .** 
bbd0: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
bbe0: 5a 20 6f 72 20 6a 75 73 74 20 5a 20 77 68 65 72  Z or just Z wher
bbf0: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 58 3a 20  e.**.**      X: 
bc00: 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20    The name of a 
bc10: 64 61 74 61 62 61 73 65 2e 20 20 45 78 3a 20 20  database.  Ex:  
bc20: 22 6d 61 69 6e 22 20 6f 72 20 22 74 65 6d 70 22  "main" or "temp"
bc30: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
bc40: 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
bc50: 6d 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  me assigned to a
bc60: 6e 20 41 54 54 41 43 48 2d 65 64 20 64 61 74 61  n ATTACH-ed data
bc70: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  base..**.**     
bc80: 20 59 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f   Y:   The name o
bc90: 66 20 61 20 74 61 62 6c 65 20 69 6e 20 61 20 46  f a table in a F
bca0: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 72 20  ROM clause.  Or 
bcb0: 69 6e 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20  in a trigger.** 
bcc0: 20 20 20 20 20 20 20 20 20 20 6f 6e 65 20 6f 66            one of
bcd0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 6e 61 6d   the special nam
bce0: 65 73 20 22 6f 6c 64 22 20 6f 72 20 22 6e 65 77  es "old" or "new
bcf0: 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 5a 3a  "..**.**      Z:
bd00: 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61     The name of a
bd10: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
bd20: 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f   Y..**.** The no
bd30: 64 65 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f  de at the root o
bd40: 66 20 74 68 65 20 73 75 62 74 72 65 65 20 69 73  f the subtree is
bd50: 20 6d 6f 64 69 66 69 65 64 20 61 73 20 66 6f 6c   modified as fol
bd60: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 45  lows:.**.**    E
bd70: 78 70 72 2e 6f 70 20 20 20 20 20 20 20 20 43 68  xpr.op        Ch
bd80: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
bd90: 4d 4e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 70 54  MN.**    Expr.pT
bda0: 61 62 20 20 20 20 20 20 50 6f 69 6e 74 73 20 74  ab      Points t
bdb0: 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  o the Table obje
bdc0: 63 74 20 66 6f 72 20 58 2e 59 0a 2a 2a 20 20 20  ct for X.Y.**   
bdd0: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 20 20   Expr.iColumn   
bde0: 54 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  The column index
bdf0: 20 69 6e 20 58 2e 59 2e 20 20 2d 31 20 66 6f 72   in X.Y.  -1 for
be00: 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 20 20   the rowid..**  
be10: 20 20 45 78 70 72 2e 69 54 61 62 6c 65 20 20 20    Expr.iTable   
be20: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
be30: 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 59 0a   number for X.Y.
be40: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f  **.**.** To reso
be50: 6c 76 65 20 72 65 73 75 6c 74 2d 73 65 74 20 72  lve result-set r
be60: 65 66 65 72 65 6e 63 65 73 2c 20 6c 6f 6f 6b 20  eferences, look 
be70: 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  for expression n
be80: 6f 64 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  odes of the.** f
be90: 6f 72 6d 20 5a 20 28 77 69 74 68 20 6e 6f 20 58  orm Z (with no X
bea0: 20 61 6e 64 20 59 20 70 72 65 66 69 78 29 20 77   and Y prefix) w
beb0: 68 65 72 65 20 74 68 65 20 5a 20 6d 61 74 63 68  here the Z match
bec0: 65 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  es the right-han
bed0: 64 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6e 20  d.** size of an 
bee0: 41 53 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  AS clause in the
bef0: 20 72 65 73 75 6c 74 2d 73 65 74 20 6f 66 20 61   result-set of a
bf00: 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20 5a 20   SELECT.  The Z 
bf10: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
bf20: 20 72 65 70 6c 61 63 65 64 20 62 79 20 61 20 63   replaced by a c
bf30: 6f 70 79 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  opy of the left-
bf40: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
bf50: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
bf60: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 61 62 6c 65  ession..** Table
bf70: 2d 6e 61 6d 65 20 61 6e 64 20 66 75 6e 63 74 69  -name and functi
bf80: 6f 6e 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6f 63  on resolution oc
bf90: 63 75 72 73 20 6f 6e 20 74 68 65 20 73 75 62 73  curs on the subs
bfa0: 74 69 74 75 74 65 64 20 65 78 70 72 65 73 73 69  tituted expressi
bfb0: 6f 6e 0a 2a 2a 20 74 72 65 65 2e 20 20 46 6f 72  on.** tree.  For
bfc0: 20 65 78 61 6d 70 6c 65 2c 20 69 6e 3a 0a 2a 2a   example, in:.**
bfd0: 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20  .**      SELECT 
bfe0: 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20 41 53  a+b AS x, c+d AS
bff0: 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   y FROM t1 ORDER
c000: 20 42 59 20 78 3b 0a 2a 2a 0a 2a 2a 20 54 68 65   BY x;.**.** The
c010: 20 22 78 22 20 74 65 72 6d 20 6f 66 20 74 68 65   "x" term of the
c020: 20 6f 72 64 65 72 20 62 79 20 69 73 20 72 65 70   order by is rep
c030: 6c 61 63 65 64 20 62 79 20 22 61 2b 62 22 20 74  laced by "a+b" t
c040: 6f 20 72 65 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a 20  o render:.**.** 
c050: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
c060: 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46  AS x, c+d AS y F
c070: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
c080: 61 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  a+b;.**.** Funct
c090: 69 6f 6e 20 63 61 6c 6c 73 20 61 72 65 20 63 68  ion calls are ch
c0a0: 65 63 6b 65 64 20 74 6f 20 6d 61 6b 65 20 73 75  ecked to make su
c0b0: 72 65 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  re that the func
c0c0: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 64 65 66 69  tion is .** defi
c0d0: 6e 65 64 20 61 6e 64 20 74 68 61 74 20 74 68 65  ned and that the
c0e0: 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
c0f0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  of arguments are
c100: 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 20 49   specified..** I
c110: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  f the function i
c120: 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66  s an aggregate f
c130: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68  unction, then th
c140: 65 20 4e 43 5f 48 61 73 41 67 67 20 66 6c 61 67  e NC_HasAgg flag
c150: 20 69 73 0a 2a 2a 20 73 65 74 20 61 6e 64 20 74   is.** set and t
c160: 68 65 20 6f 70 63 6f 64 65 20 69 73 20 63 68 61  he opcode is cha
c170: 6e 67 65 64 20 66 72 6f 6d 20 54 4b 5f 46 55 4e  nged from TK_FUN
c180: 43 54 49 4f 4e 20 74 6f 20 54 4b 5f 41 47 47 5f  CTION to TK_AGG_
c190: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2a 20 49 66 20  FUNCTION..** If 
c1a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  an expression co
c1b0: 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65  ntains aggregate
c1c0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20   functions then 
c1d0: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
c1e0: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
c1f0: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 2e  pression is set.
c200: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  .**.** An error 
c210: 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
c220: 69 6e 20 70 50 61 72 73 65 20 69 66 20 61 6e 79  in pParse if any
c230: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
c240: 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 69   The number.** i
c250: 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75  f errors is retu
c260: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
c270: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
c280: 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e  ames( .  NameCon
c290: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20  text *pNC,      
c2a0: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f   /* Namespace to
c2b0: 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73   resolve express
c2c0: 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78  ions in. */.  Ex
c2d0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
c2e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c2f0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
c300: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
c310: 75 31 36 20 73 61 76 65 64 48 61 73 41 67 67 3b  u16 savedHasAgg;
c320: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20 20  .  Walker w;..  
c330: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
c340: 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c  eturn 0;.#if SQL
c350: 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
c360: 54 48 3e 30 0a 20 20 7b 0a 20 20 20 20 50 61 72  TH>0.  {.    Par
c370: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43  se *pParse = pNC
c380: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66  ->pParse;.    if
c390: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  ( sqlite3ExprChe
c3a0: 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c  ckHeight(pParse,
c3b0: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 2b   pExpr->nHeight+
c3c0: 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65  pNC->pParse->nHe
c3d0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 72  ight) ){.      r
c3e0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
c3f0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67     pParse->nHeig
c400: 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65  ht += pExpr->nHe
c410: 69 67 68 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ight;.  }.#endif
c420: 0a 20 20 73 61 76 65 64 48 61 73 41 67 67 20 3d  .  savedHasAgg =
c430: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
c440: 28 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f 4d 69  (NC_HasAgg|NC_Mi
c450: 6e 4d 61 78 41 67 67 29 3b 0a 20 20 70 4e 43 2d  nMaxAgg);.  pNC-
c460: 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28 4e 43  >ncFlags &= ~(NC
c470: 5f 48 61 73 41 67 67 7c 4e 43 5f 4d 69 6e 4d 61  _HasAgg|NC_MinMa
c480: 78 41 67 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28  xAgg);.  memset(
c490: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
c4a0: 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
c4b0: 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78  back = resolveEx
c4c0: 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c  prStep;.  w.xSel
c4d0: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65  ectCallback = re
c4e0: 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70 3b  solveSelectStep;
c4f0: 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 4e  .  w.pParse = pN
c500: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77 2e 75  C->pParse;.  w.u
c510: 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73 71  .pNC = pNC;.  sq
c520: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
c530: 2c 20 70 45 78 70 72 29 3b 0a 23 69 66 20 53 51  , pExpr);.#if SQ
c540: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
c550: 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50 61  PTH>0.  pNC->pPa
c560: 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
c570: 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a  pExpr->nHeight;.
c580: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e 43  #endif.  if( pNC
c590: 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 77 2e 70 50  ->nErr>0 || w.pP
c5a0: 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a  arse->nErr>0 ){.
c5b0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
c5c0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
c5d0: 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ror);.  }.  if( 
c5e0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
c5f0: 43 5f 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20  C_HasAgg ){.    
c600: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
c610: 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a  pExpr, EP_Agg);.
c620: 20 20 7d 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c 61    }.  pNC->ncFla
c630: 67 73 20 7c 3d 20 73 61 76 65 64 48 61 73 41 67  gs |= savedHasAg
c640: 67 3b 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72  g;.  return Expr
c650: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
c660: 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a  r, EP_Error);.}.
c670: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
c680: 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  all names in all
c690: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
c6a0: 61 20 53 45 4c 45 43 54 20 61 6e 64 20 69 6e 20  a SELECT and in 
c6b0: 61 6c 6c 0a 2a 2a 20 64 65 63 65 6e 64 65 6e 74  all.** decendent
c6c0: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2c  s of the SELECT,
c6d0: 20 69 6e 63 6c 75 64 69 6e 67 20 63 6f 6d 70 6f   including compo
c6e0: 75 6e 64 73 20 6f 66 66 20 6f 66 20 70 2d 3e 70  unds off of p->p
c6f0: 50 72 69 6f 72 2c 0a 2a 2a 20 73 75 62 71 75 65  Prior,.** subque
c700: 72 69 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  ries in expressi
c710: 6f 6e 73 2c 20 61 6e 64 20 73 75 62 71 75 65 72  ons, and subquer
c720: 69 65 73 20 75 73 65 64 20 61 73 20 46 52 4f 4d  ies used as FROM
c730: 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
c740: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 73 71 6c 69  ..**.** See sqli
c750: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
c760: 6d 65 73 28 29 20 66 6f 72 20 61 20 64 65 73 63  mes() for a desc
c770: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6b  ription of the k
c780: 69 6e 64 73 20 6f 66 0a 2a 2a 20 74 72 61 6e 73  inds of.** trans
c790: 66 6f 72 6d 61 74 69 6f 6e 73 20 74 68 61 74 20  formations that 
c7a0: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  occur..**.** All
c7b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c7c0: 74 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ts should have b
c7d0: 65 65 6e 20 65 78 70 61 6e 64 65 64 20 75 73 69  een expanded usi
c7e0: 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  ng.** sqlite3Sel
c7f0: 65 63 74 45 78 70 61 6e 64 28 29 20 70 72 69 6f  ectExpand() prio
c800: 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
c810: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76  is routine..*/.v
c820: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  oid sqlite3Resol
c830: 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 0a 20  veSelectNames(. 
c840: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
c850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
c860: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
c870: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
c880: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c890: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
c8a0: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
c8b0: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
c8c0: 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
c8d0: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
c8e0: 61 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  arent SELECT sta
c8f0: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 57  tement */.){.  W
c900: 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 61 73 73 65  alker w;..  asse
c910: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 6d 65  rt( p!=0 );.  me
c920: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
c930: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
c940: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f  rCallback = reso
c950: 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77  lveExprStep;.  w
c960: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
c970: 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74   = resolveSelect
c980: 53 74 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Step;.  w.pParse
c990: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 75   = pParse;.  w.u
c9a0: 2e 70 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43 3b  .pNC = pOuterNC;
c9b0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
c9c0: 6c 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 0a  lect(&w, p);.}..
c9d0: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61  /*.** Resolve na
c9e0: 6d 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  mes in expressio
c9f0: 6e 73 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ns that can only
ca00: 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
ca10: 67 6c 65 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a  gle table:.**.**
ca20: 20 20 20 20 2a 20 20 20 43 48 45 43 4b 20 63 6f      *   CHECK co
ca30: 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 20 20 20  nstraints.**    
ca40: 2a 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65  *   WHERE clause
ca50: 73 20 6f 6e 20 70 61 72 74 69 61 6c 20 69 6e 64  s on partial ind
ca60: 69 63 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ices.**.** The E
ca70: 78 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75 65  xpr.iTable value
ca80: 20 66 6f 72 20 45 78 70 72 2e 6f 70 3d 3d 54 4b   for Expr.op==TK
ca90: 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 6f 66  _COLUMN nodes of
caa0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
cab0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ** is set to -1 
cac0: 61 6e 64 20 74 68 65 20 45 78 70 72 2e 69 43 6f  and the Expr.iCo
cad0: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 73 65  lumn value is se
cae0: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
caf0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e  number..**.** An
cb00: 79 20 65 72 72 6f 72 73 20 63 61 75 73 65 20 61  y errors cause a
cb10: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
cb20: 74 6f 20 62 65 20 73 65 74 20 69 6e 20 70 50 61  to be set in pPa
cb30: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
cb40: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
cb50: 65 66 65 72 65 6e 63 65 28 0a 20 20 50 61 72 73  eference(.  Pars
cb60: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
cb70: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
cb80: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
cb90: 54 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  Tab,        /* T
cba0: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 72  he table being r
cbb0: 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20 69  eferenced */.  i
cbc0: 6e 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20  nt type,        
cbd0: 20 20 20 2f 2a 20 4e 43 5f 49 73 43 68 65 63 6b     /* NC_IsCheck
cbe0: 20 6f 72 20 4e 43 5f 50 61 72 74 49 64 78 20 2a   or NC_PartIdx *
cbf0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
cc00: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
cc10: 73 73 69 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65  ssion to resolve
cc20: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  .  May be NULL. 
cc30: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
cc40: 4c 69 73 74 20 20 20 20 20 2f 2a 20 45 78 70 72  List     /* Expr
cc50: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72  ession list to r
cc60: 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20  esolve.  May be 
cc70: 4e 55 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  NUL. */.){.  Src
cc80: 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20  List sSrc;      
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cca0: 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72  Fake SrcList for
ccb0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
ccc0: 6c 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  le */.  NameCont
ccd0: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
cce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
ccf0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72  context for pPar
cd00: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
cd10: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
cd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
cd40: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
cd50: 20 74 79 70 65 3d 3d 4e 43 5f 49 73 43 68 65 63   type==NC_IsChec
cd60: 6b 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f 50 61  k || type==NC_Pa
cd70: 72 74 49 64 78 20 29 3b 0a 20 20 6d 65 6d 73 65  rtIdx );.  memse
cd80: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
cd90: 66 28 73 4e 43 29 29 3b 0a 20 20 6d 65 6d 73 65  f(sNC));.  memse
cda0: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
cdb0: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 73 53 72  of(sSrc));.  sSr
cdc0: 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 73 53  c.nSrc = 1;.  sS
cdd0: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
cde0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73  pTab->zName;.  s
cdf0: 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20  Src.a[0].pTab = 
ce00: 70 54 61 62 3b 0a 20 20 73 53 72 63 2e 61 5b 30  pTab;.  sSrc.a[0
ce10: 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
ce20: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
ce30: 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72  Parse;.  sNC.pSr
ce40: 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20  cList = &sSrc;. 
ce50: 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74   sNC.ncFlags = t
ce60: 79 70 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ype;.  if( sqlit
ce70: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
ce80: 65 73 28 26 73 4e 43 2c 20 70 45 78 70 72 29 20  es(&sNC, pExpr) 
ce90: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
cea0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
ceb0: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
cec0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ced0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
cee0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
cef0: 4e 43 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  NC, pList->a[i].
cf00: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
cf10: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
cf20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a        }.    }.  }.}.