/ Hex Artifact Content
Login

Artifact 3e22bf604677036d4aed6ddb91705c37938be4c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 18.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 77  tines used for w
01a0: 61 6c 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65  alking the parse
01b0: 72 20 74 72 65 65 20 61 6e 64 0a 2a 2a 20 72 65  r tree and.** re
01c0: 73 6f 6c 76 65 20 61 6c 6c 20 69 64 65 6e 74 69  solve all identi
01d0: 66 69 65 72 73 20 62 79 20 61 73 73 6f 63 69 61  fiers by associa
01e0: 74 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 61  ting them with a
01f0: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 74   particular.** t
0200: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
0210: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0220: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
0230: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0240: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0250: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  h>../*.** Walk t
0260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
0270: 65 65 20 70 45 78 70 72 20 61 6e 64 20 69 6e 63  ee pExpr and inc
0280: 72 65 61 73 65 20 74 68 65 20 61 67 67 72 65 67  rease the aggreg
0290: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
02a0: 64 65 70 74 68 20 28 74 68 65 20 45 78 70 72 2e  depth (the Expr.
02b0: 6f 70 32 20 66 69 65 6c 64 29 20 62 79 20 4e 20  op2 field) by N 
02c0: 6f 6e 20 65 76 65 72 79 20 54 4b 5f 41 47 47 5f  on every TK_AGG_
02d0: 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 2e 0a 2a  FUNCTION node..*
02e0: 2a 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  * This needs to 
02f0: 6f 63 63 75 72 20 77 68 65 6e 20 63 6f 70 79 69  occur when copyi
0300: 6e 67 20 61 20 54 4b 5f 41 47 47 5f 46 55 4e 43  ng a TK_AGG_FUNC
0310: 54 49 4f 4e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  TION node from a
0320: 6e 0a 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79  n.** outer query
0330: 20 69 6e 74 6f 20 61 6e 20 69 6e 6e 65 72 20 73   into an inner s
0340: 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 69  ubquery..**.** i
0350: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0360: 70 74 68 28 70 45 78 70 72 2c 6e 29 20 69 73 20  pth(pExpr,n) is 
0370: 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65  the main routine
0380: 2e 20 20 69 6e 63 72 41 67 67 44 65 70 74 68 28  .  incrAggDepth(
0390: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 68 65 6c 70  ..).** is a help
03a0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 2d 20 61 20  er function - a 
03b0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
03c0: 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2f   tree walker..*/
03d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
03e0: 41 67 67 44 65 70 74 68 28 57 61 6c 6b 65 72 20  AggDepth(Walker 
03f0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
0400: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
0410: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
0420: 46 55 4e 43 54 49 4f 4e 20 29 20 70 45 78 70 72  FUNCTION ) pExpr
0430: 2d 3e 6f 70 32 20 2b 3d 20 70 57 61 6c 6b 65 72  ->op2 += pWalker
0440: 2d 3e 75 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  ->u.i;.  return 
0450: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
0460: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72  static void incr
0470: 41 67 67 46 75 6e 63 74 69 6f 6e 44 65 70 74 68  AggFunctionDepth
0480: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
0490: 74 20 4e 29 7b 0a 20 20 69 66 28 20 4e 3e 30 20  t N){.  if( N>0 
04a0: 29 7b 0a 20 20 20 20 57 61 6c 6b 65 72 20 77 3b  ){.    Walker w;
04b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  .    memset(&w, 
04c0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
04d0: 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61     w.xExprCallba
04e0: 63 6b 20 3d 20 69 6e 63 72 41 67 67 44 65 70 74  ck = incrAggDept
04f0: 68 3b 0a 20 20 20 20 77 2e 75 2e 69 20 3d 20 4e  h;.    w.u.i = N
0500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
0510: 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
0520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
0530: 75 72 6e 20 74 68 65 20 70 45 78 70 72 20 65 78  urn the pExpr ex
0540: 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 6e  pression into an
0550: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 69   alias for the i
0560: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
0570: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 73   the.** result s
0580: 65 74 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2a  et in pEList..**
0590: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 73 75 6c  .** If the resul
05a0: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 20 69 73 20  t set column is 
05b0: 61 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20  a simple column 
05c0: 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65 6e 20  reference, then 
05d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
05e0: 6d 61 6b 65 73 20 61 6e 20 65 78 61 63 74 20 63  makes an exact c
05f0: 6f 70 79 2e 20 20 42 75 74 20 66 6f 72 20 61 6e  opy.  But for an
0600: 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20  y other kind of 
0610: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 69 73  expression, this
0620: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  .** routine make
0630: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72   a copy of the r
0640: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
0650: 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
0660: 20 74 6f 20 74 68 65 0a 2a 2a 20 54 4b 5f 41 53   to the.** TK_AS
0670: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
0680: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63  TK_AS operator c
0690: 61 75 73 65 73 20 74 68 65 20 65 78 70 72 65 73  auses the expres
06a0: 73 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20 65 76  sion to be.** ev
06b0: 61 6c 75 61 74 65 64 20 6a 75 73 74 20 6f 6e 63  aluated just onc
06c0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  e and then reuse
06d0: 64 20 66 6f 72 20 65 61 63 68 20 61 6c 69 61 73  d for each alias
06e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 61 73  ..**.** The reas
06f0: 6f 6e 20 66 6f 72 20 73 75 70 70 72 65 73 73 69  on for suppressi
0700: 6e 67 20 74 68 65 20 54 4b 5f 41 53 20 74 65 72  ng the TK_AS ter
0710: 6d 20 77 68 65 6e 20 74 68 65 20 65 78 70 72 65  m when the expre
0720: 73 73 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c  ssion is a simpl
0730: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65 66 65  e.** column refe
0740: 72 65 6e 63 65 20 69 73 20 73 6f 20 74 68 61 74  rence is so that
0750: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65   the column refe
0760: 72 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 72 65  rence will be re
0770: 63 6f 67 6e 69 7a 65 64 20 61 73 0a 2a 2a 20 75  cognized as.** u
0780: 73 61 62 6c 65 20 62 79 20 69 6e 64 69 63 65 73  sable by indices
0790: 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
07a0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
07b0: 69 6e 67 20 6c 6f 67 69 63 2e 20 0a 2a 2a 0a 2a  ing logic. .**.*
07c0: 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72  * The TK_AS oper
07d0: 61 74 6f 72 20 69 73 20 69 6e 68 69 62 69 74 65  ator is inhibite
07e0: 64 20 69 66 20 7a 54 79 70 65 5b 30 5d 3d 3d 27  d if zType[0]=='
07f0: 47 27 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 0a  G'.  This means.
0800: 2a 2a 20 74 68 61 74 20 69 6e 20 61 20 47 52 4f  ** that in a GRO
0810: 55 50 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  UP BY clause, th
0820: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
0830: 65 76 61 6c 75 61 74 65 64 20 74 77 69 63 65 2e  evaluated twice.
0840: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
0850: 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d     SELECT random
0860: 28 29 25 35 20 41 53 20 78 2c 20 63 6f 75 6e 74  ()%5 AS x, count
0870: 28 2a 29 20 46 52 4f 4d 20 74 61 62 20 47 52 4f  (*) FROM tab GRO
0880: 55 50 20 42 59 20 78 0a 2a 2a 0a 2a 2a 20 49 73  UP BY x.**.** Is
0890: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
08a0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
08b0: 20 72 61 6e 64 6f 6d 28 29 25 35 20 41 53 20 78   random()%5 AS x
08c0: 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
08d0: 74 61 62 20 47 52 4f 55 50 20 42 59 20 72 61 6e  tab GROUP BY ran
08e0: 64 6f 6d 28 29 25 35 0a 2a 2a 0a 2a 2a 20 54 68  dom()%5.**.** Th
08f0: 65 20 72 65 73 75 6c 74 20 6f 66 20 72 61 6e 64  e result of rand
0900: 6f 6d 28 29 25 35 20 69 6e 20 74 68 65 20 47 52  om()%5 in the GR
0910: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
0920: 20 70 72 6f 62 61 62 6c 79 20 64 69 66 66 65 72   probably differ
0930: 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ent.** from the 
0940: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 72 65  result in the re
0950: 73 75 6c 74 2d 73 65 74 2e 20 20 4f 6e 20 74 68  sult-set.  On th
0960: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 53 74 61  e other hand Sta
0970: 6e 64 61 72 64 20 53 51 4c 20 64 6f 65 73 0a 2a  ndard SQL does.*
0980: 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  * not allow the 
0990: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
09a0: 74 6f 20 63 6f 6e 74 61 69 6e 20 72 65 66 65 72  to contain refer
09b0: 65 6e 63 65 73 20 74 6f 20 72 65 73 75 6c 74 2d  ences to result-
09c0: 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20  set columns..** 
09d0: 53 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  So this should n
09e0: 65 76 65 72 20 63 6f 6d 65 20 75 70 20 69 6e 20  ever come up in 
09f0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 71 75 65 72  well-formed quer
0a00: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ies..**.** If th
0a10: 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 66  e reference is f
0a20: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 4f 4c  ollowed by a COL
0a30: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20 74  LATE operator, t
0a40: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 2a 2a  hen make sure.**
0a50: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
0a60: 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 72 76  rator is preserv
0a70: 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
0a80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
0a90: 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d  CT a+b, c+d FROM
0aa0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 43   t1 ORDER BY 1 C
0ab0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a 2a  OLLATE nocase;.*
0ac0: 2a 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20 74  *.** Should be t
0ad0: 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
0af0: 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d 20  T a+b, c+d FROM 
0b00: 74 31 20 4f 52 44 45 52 20 42 59 20 28 61 2b 62  t1 ORDER BY (a+b
0b10: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
0b20: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 53 75 62  ;.**.** The nSub
0b30: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
0b40: 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d 61  specifies how ma
0b50: 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 62  ny levels of sub
0b60: 71 75 65 72 79 20 74 68 65 0a 2a 2a 20 61 6c 69  query the.** ali
0b70: 61 73 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  as is removed fr
0b80: 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
0b90: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
0ba0: 20 75 73 75 61 6c 6c 79 20 76 61 6c 75 65 20 69   usually value i
0bb0: 73 0a 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74  s.** zero but it
0bc0: 20 6d 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69   might be more i
0bd0: 66 20 74 68 65 20 61 6c 69 61 73 20 69 73 20 63  f the alias is c
0be0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
0bf0: 61 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66  a subquery.** of
0c00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
0c10: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45  pression.  The E
0c20: 78 70 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66  xpr.op2 field of
0c30: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
0c40: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d  .** structures m
0c50: 75 73 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ust be increased
0c60: 20 62 79 20 74 68 65 20 6e 53 75 62 71 75 65 72   by the nSubquer
0c70: 79 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61  y amount..*/.sta
0c80: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
0c90: 41 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a  Alias(.  Parse *
0ca0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0cb0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0cc0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
0cd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f   *pEList,      /
0ce0: 2a 20 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a  * A result set *
0cf0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
0d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
0d10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
0d20: 73 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45  sult set.  0..pE
0d30: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f  List->nExpr-1 */
0d40: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
0d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
0d60: 6e 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f  nsform this into
0d70: 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
0d80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
0d90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
0da0: 70 65 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55  pe,     /* "GROU
0db0: 50 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72  P" or "ORDER" or
0dc0: 20 22 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75   "" */.  int nSu
0dd0: 62 71 75 65 72 79 20 20 20 20 20 20 20 20 20 20  bquery          
0de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
0df0: 71 75 65 72 69 65 73 20 74 68 61 74 20 74 68 65  queries that the
0e00: 20 6c 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67   label is moving
0e10: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
0e20: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
0e30: 2f 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63  /* The iCol-th c
0e40: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73  olumn of the res
0e50: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
0e60: 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20  r *pDup;        
0e70: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
0e80: 4f 72 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Orig */.  sqlite
0e90: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
0ea0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
0eb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
0ec0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
0ed0: 30 20 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74  0 && iCol<pEList
0ee0: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72  ->nExpr );.  pOr
0ef0: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ig = pEList->a[i
0f00: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  Col].pExpr;.  as
0f10: 73 65 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29  sert( pOrig!=0 )
0f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 69  ;.  assert( pOri
0f30: 67 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 52 65  g->flags & EP_Re
0f40: 73 6f 6c 76 65 64 20 29 3b 0a 20 20 64 62 20 3d  solved );.  db =
0f50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
0f60: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
0f70: 72 44 75 70 28 64 62 2c 20 70 4f 72 69 67 2c 20  rDup(db, pOrig, 
0f80: 30 29 3b 0a 20 20 69 66 28 20 70 44 75 70 3d 3d  0);.  if( pDup==
0f90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
0fa0: 28 20 70 4f 72 69 67 2d 3e 6f 70 21 3d 54 4b 5f  ( pOrig->op!=TK_
0fb0: 43 4f 4c 55 4d 4e 20 26 26 20 7a 54 79 70 65 5b  COLUMN && zType[
0fc0: 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 69  0]!='G' ){.    i
0fd0: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0fe0: 70 74 68 28 70 44 75 70 2c 20 6e 53 75 62 71 75  pth(pDup, nSubqu
0ff0: 65 72 79 29 3b 0a 20 20 20 20 70 44 75 70 20 3d  ery);.    pDup =
1000: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1010: 61 72 73 65 2c 20 54 4b 5f 41 53 2c 20 70 44 75  arse, TK_AS, pDu
1020: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  p, 0, 0);.    if
1030: 28 20 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75  ( pDup==0 ) retu
1040: 72 6e 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  rn;.    ExprSetP
1050: 72 6f 70 65 72 74 79 28 70 44 75 70 2c 20 45 50  roperty(pDup, EP
1060: 5f 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20  _Skip);.    if( 
1070: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
1080: 75 2e 78 2e 69 41 6c 69 61 73 3d 3d 30 20 29 7b  u.x.iAlias==0 ){
1090: 0a 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61  .      pEList->a
10a0: 5b 69 43 6f 6c 5d 2e 75 2e 78 2e 69 41 6c 69 61  [iCol].u.x.iAlia
10b0: 73 20 3d 20 28 75 31 36 29 28 2b 2b 70 50 61 72  s = (u16)(++pPar
10c0: 73 65 2d 3e 6e 41 6c 69 61 73 29 3b 0a 20 20 20  se->nAlias);.   
10d0: 20 7d 0a 20 20 20 20 70 44 75 70 2d 3e 69 54 61   }.    pDup->iTa
10e0: 62 6c 65 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  ble = pEList->a[
10f0: 69 43 6f 6c 5d 2e 75 2e 78 2e 69 41 6c 69 61 73  iCol].u.x.iAlias
1100: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
1110: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
1120: 45 20 29 7b 0a 20 20 20 20 70 44 75 70 20 3d 20  E ){.    pDup = 
1130: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
1140: 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
1150: 73 65 2c 20 70 44 75 70 2c 20 70 45 78 70 72 2d  se, pDup, pExpr-
1160: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  >u.zToken);.  }.
1170: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 63 61 6c  .  /* Before cal
1180: 6c 69 6e 67 20 73 71 6c 69 74 65 33 45 78 70 72  ling sqlite3Expr
1190: 44 65 6c 65 74 65 28 29 2c 20 73 65 74 20 74 68  Delete(), set th
11a0: 65 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  e EP_Static flag
11b0: 2e 20 54 68 69 73 20 0a 20 20 2a 2a 20 70 72 65  . This .  ** pre
11c0: 76 65 6e 74 73 20 45 78 70 72 44 65 6c 65 74 65  vents ExprDelete
11d0: 28 29 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67  () from deleting
11e0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
11f0: 75 72 65 20 69 74 73 65 6c 66 2c 0a 20 20 2a 2a  ure itself,.  **
1200: 20 61 6c 6c 6f 77 69 6e 67 20 69 74 20 74 6f 20   allowing it to 
1210: 62 65 20 72 65 70 6f 70 75 6c 61 74 65 64 20 62  be repopulated b
1220: 79 20 74 68 65 20 6d 65 6d 63 70 79 28 29 20 6f  y the memcpy() o
1230: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1240: 6c 69 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 70  line..  ** The p
1250: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 6d  Expr->u.zToken m
1260: 69 67 68 74 20 70 6f 69 6e 74 20 69 6e 74 6f 20  ight point into 
1270: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1280: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
1290: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 44 62 46  .  ** sqlite3DbF
12a0: 72 65 65 28 64 62 2c 20 70 44 75 70 29 20 6f 6e  ree(db, pDup) on
12b0: 20 74 68 65 20 6c 61 73 74 20 6c 69 6e 65 20 6f   the last line o
12c0: 66 20 74 68 69 73 20 62 6c 6f 63 6b 2c 20 73 6f  f this block, so
12d0: 20 62 65 20 73 75 72 65 20 74 6f 0a 20 20 2a 2a   be sure to.  **
12e0: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
12f0: 74 68 65 20 74 6f 6b 65 6e 20 62 65 66 6f 72 65  the token before
1300: 20 64 6f 69 6e 67 20 74 68 65 20 73 71 6c 69 74   doing the sqlit
1310: 65 33 44 62 46 72 65 65 28 29 2e 0a 20 20 2a 2f  e3DbFree()..  */
1320: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
1330: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
1340: 74 69 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  tic);.  sqlite3E
1350: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
1360: 78 70 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  xpr);.  memcpy(p
1370: 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65  Expr, pDup, size
1380: 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 69  of(*pExpr));.  i
1390: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
13a0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
13b0: 74 56 61 6c 75 65 29 20 26 26 20 70 45 78 70 72  tValue) && pExpr
13c0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 7b  ->u.zToken!=0 ){
13d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45  .    assert( (pE
13e0: 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 28 45 50  xpr->flags & (EP
13f0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
1400: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
1410: 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
1420: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
1430: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 75  Dup(db, pExpr->u
1440: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 45  .zToken);.    pE
1450: 78 70 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  xpr->flags |= EP
1460: 5f 4d 65 6d 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20  _MemToken;.  }. 
1470: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1480: 62 2c 20 70 44 75 70 29 3b 0a 7d 0a 0a 0a 2f 2a  b, pDup);.}.../*
1490: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
14a0: 69 66 20 74 68 65 20 6e 61 6d 65 20 7a 43 6f 6c  if the name zCol
14b0: 20 6f 63 63 75 72 73 20 61 6e 79 77 68 65 72 65   occurs anywhere
14c0: 20 69 6e 20 74 68 65 20 55 53 49 4e 47 20 63 6c   in the USING cl
14d0: 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ause..**.** Retu
14e0: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 20  rn FALSE if the 
14f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  USING clause is 
1500: 4e 55 4c 4c 20 6f 72 20 69 66 20 69 74 20 64 6f  NULL or if it do
1510: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a  es not contain.*
1520: 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a 73 74 61 74 69  * zCol..*/.stati
1530: 63 20 69 6e 74 20 6e 61 6d 65 49 6e 55 73 69 6e  c int nameInUsin
1540: 67 43 6c 61 75 73 65 28 49 64 4c 69 73 74 20 2a  gClause(IdList *
1550: 70 55 73 69 6e 67 2c 20 63 6f 6e 73 74 20 63 68  pUsing, const ch
1560: 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20 69 66 28  ar *zCol){.  if(
1570: 20 70 55 73 69 6e 67 20 29 7b 0a 20 20 20 20 69   pUsing ){.    i
1580: 6e 74 20 6b 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  nt k;.    for(k=
1590: 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64  0; k<pUsing->nId
15a0: 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; k++){.      if
15b0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
15c0: 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e  (pUsing->a[k].zN
15d0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20  ame, zCol)==0 ) 
15e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
15f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1600: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 71 75 65 72  }../*.** Subquer
1610: 69 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 6f  ies stores the o
1620: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
1630: 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  , table and colu
1640: 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 65  mn names for the
1650: 69 72 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74  ir.** result set
1660: 73 20 69 6e 20 45 78 70 72 4c 69 73 74 2e 61 5b  s in ExprList.a[
1670: 5d 2e 7a 53 70 61 6e 2c 20 69 6e 20 74 68 65 20  ].zSpan, in the 
1680: 66 6f 72 6d 20 22 44 41 54 41 42 41 53 45 2e 54  form "DATABASE.T
1690: 41 42 4c 45 2e 43 4f 4c 55 4d 4e 22 2e 0a 2a 2a  ABLE.COLUMN"..**
16a0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
16b0: 20 74 68 65 20 7a 53 70 61 6e 20 67 69 76 65 6e   the zSpan given
16c0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
16d0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 7a 44 62   matches the zDb
16e0: 2c 20 7a 54 61 62 2c 0a 2a 2a 20 61 6e 64 20 7a  , zTab,.** and z
16f0: 43 6f 6c 2e 20 20 49 66 20 61 6e 79 20 6f 66 20  Col.  If any of 
1700: 7a 44 62 2c 20 7a 54 61 62 2c 20 61 6e 64 20 7a  zDb, zTab, and z
1710: 43 6f 6c 20 61 72 65 20 4e 55 4c 4c 20 74 68 65  Col are NULL the
1720: 6e 20 74 68 6f 73 65 20 66 69 65 6c 64 73 20 77  n those fields w
1730: 69 6c 6c 0a 2a 2a 20 6d 61 74 63 68 20 61 6e 79  ill.** match any
1740: 74 68 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  thing..*/.int sq
1750: 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
1760: 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me(.  const char
1770: 20 2a 7a 53 70 61 6e 2c 0a 20 20 63 6f 6e 73 74   *zSpan,.  const
1780: 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 0a 20 20 63   char *zCol,.  c
1790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c  onst char *zTab,
17a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17b0: 44 62 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  Db.){.  int n;. 
17c0: 20 66 6f 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53   for(n=0; ALWAYS
17d0: 28 7a 53 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53  (zSpan[n]) && zS
17e0: 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b  pan[n]!='.'; n++
17f0: 29 7b 7d 0a 20 20 69 66 28 20 7a 44 62 20 26 26  ){}.  if( zDb &&
1800: 20 28 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d   (sqlite3StrNICm
1810: 70 28 7a 53 70 61 6e 2c 20 7a 44 62 2c 20 6e 29  p(zSpan, zDb, n)
1820: 21 3d 30 20 7c 7c 20 7a 44 62 5b 6e 5d 21 3d 30  !=0 || zDb[n]!=0
1830: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1840: 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b  0;.  }.  zSpan +
1850: 3d 20 6e 2b 31 3b 0a 20 20 66 6f 72 28 6e 3d 30  = n+1;.  for(n=0
1860: 3b 20 41 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e  ; ALWAYS(zSpan[n
1870: 5d 29 20 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d  ]) && zSpan[n]!=
1880: 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66  '.'; n++){}.  if
1890: 28 20 7a 54 61 62 20 26 26 20 28 73 71 6c 69 74  ( zTab && (sqlit
18a0: 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 70 61 6e  e3StrNICmp(zSpan
18b0: 2c 20 7a 54 61 62 2c 20 6e 29 21 3d 30 20 7c 7c  , zTab, n)!=0 ||
18c0: 20 7a 54 61 62 5b 6e 5d 21 3d 30 29 20 29 7b 0a   zTab[n]!=0) ){.
18d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18e0: 7d 0a 20 20 7a 53 70 61 6e 20 2b 3d 20 6e 2b 31  }.  zSpan += n+1
18f0: 3b 0a 20 20 69 66 28 20 7a 43 6f 6c 20 26 26 20  ;.  if( zCol && 
1900: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
1910: 53 70 61 6e 2c 20 7a 43 6f 6c 29 21 3d 30 20 29  Span, zCol)!=0 )
1920: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1930: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1940: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
1950: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
1960: 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  umn of the form 
1970: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20  X.Y.Z or Y.Z or 
1980: 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a  just Z, look up.
1990: 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20  ** that name in 
19a0: 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63  the set of sourc
19b0: 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  e tables in pSrc
19c0: 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68  List and make th
19d0: 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72  e pExpr .** expr
19e0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65  ession node refe
19f0: 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73  r back to that s
1a00: 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  ource column.  T
1a10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
1a20: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1a30: 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a   to pExpr:.**.**
1a40: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20      pExpr->iDb  
1a50: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65           Set the
1a60: 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44   index in db->aD
1a70: 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62  b[] of the datab
1a80: 61 73 65 20 58 0a 2a 2a 20 20 20 20 20 20 20 20  ase X.**        
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 28 65 76 65 6e 20 69 66 20 58 20 69 73 20 69   (even if X is i
1ab0: 6d 70 6c 69 65 64 29 2e 0a 2a 2a 20 20 20 20 70  mplied)..**    p
1ac0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20  Expr->iTable    
1ad0: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
1ae0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
1af0: 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69   the table obtai
1b00: 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ned.**          
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
1b20: 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a  rom pSrcList..**
1b30: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
1b40: 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 73 20           Points 
1b50: 74 6f 20 74 68 65 20 54 61 62 6c 65 20 73 74 72  to the Table str
1b60: 75 63 74 75 72 65 20 6f 66 20 58 2e 59 20 28 65  ucture of X.Y (e
1b70: 76 65 6e 20 69 66 0a 2a 2a 20 20 20 20 20 20 20  ven if.**       
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 58 20 61 6e 64 2f 6f 72 20 59 20 61 72 65    X and/or Y are
1ba0: 20 69 6d 70 6c 69 65 64 2e 29 0a 2a 2a 20 20 20   implied.).**   
1bb0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
1bc0: 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65        Set to the
1bd0: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77   column number w
1be0: 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ithin the table.
1bf0: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .**    pExpr->op
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20              Set 
1c10: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a  to TK_COLUMN..**
1c20: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1c30: 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70           Any exp
1c40: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
1c50: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
1c60: 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  d.**    pExpr->p
1c70: 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e 79  Right        Any
1c80: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
1c90: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
1ca0: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
1cb0: 20 7a 44 62 20 76 61 72 69 61 62 6c 65 20 69 73   zDb variable is
1cc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1cd0: 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22   database (the "
1ce0: 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65  X").  This value
1cf0: 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20   may be.** NULL 
1d00: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d  meaning that nam
1d10: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
1d20: 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20   Y.Z or Z.  Any 
1d30: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61  available databa
1d40: 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  se.** can be use
1d50: 64 2e 20 20 54 68 65 20 7a 54 61 62 6c 65 20 76  d.  The zTable v
1d60: 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 6e  ariable is the n
1d70: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1d80: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
1d90: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
1da0: 65 20 4e 55 4c 4c 20 69 66 20 7a 44 62 20 69 73  e NULL if zDb is
1db0: 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20   also NULL.  If 
1dc0: 7a 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c 20 69  zTable is NULL i
1dd0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
1de0: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
1df0: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
1e00: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
1e10: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
1e20: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
1e30: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
1e40: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
1e50: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
1e60: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
1e70: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
1e80: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 57 52 43  e and return WRC
1e90: 5f 41 62 6f 72 74 2e 20 20 52 65 74 75 72 6e 20  _Abort.  Return 
1ea0: 57 52 43 5f 50 72 75 6e 65 20 6f 6e 20 73 75 63  WRC_Prune on suc
1eb0: 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
1ec0: 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a  int lookupName(.
1ed0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
1ee0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1ef0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1f00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f10: 44 62 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Db,     /* Name 
1f20: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
1f40: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 2c  onst char *zTab,
1f60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1f70: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1f80: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20  column, or NULL 
1f90: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1fa0: 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d  *zCol,    /* Nam
1fb0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
1fc0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
1fd0: 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68  t *pNC,    /* Th
1fe0: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75  e name context u
1ff0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  sed to resolve t
2000: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  he name */.  Exp
2010: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
2020: 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45    /* Make this E
2030: 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74  XPR node point t
2040: 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63  o the selected c
2050: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  olumn */.){.  in
2060: 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20  t i, j;         
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
2090: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20   */.  int cnt = 
20a0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
20b0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20c0: 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f  r of matching co
20d0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
20e0: 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20  int cntTab = 0; 
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2100: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
2110: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61  atching table na
2120: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75  mes */.  int nSu
2130: 62 71 75 65 72 79 20 3d 20 30 3b 20 20 20 20 20  bquery = 0;     
2140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
2150: 77 20 6d 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66  w many levels of
2160: 20 73 75 62 71 75 65 72 79 20 2a 2f 0a 20 20 73   subquery */.  s
2170: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
2180: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
2190: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
21a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
21b0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
21c0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20  item *pItem;    
21d0: 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f     /* Use for lo
21e0: 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72 63 4c  oping over pSrcL
21f0: 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73  ist items */.  s
2200: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2210: 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20  em *pMatch = 0; 
2220: 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69 6e 67   /* The matching
2230: 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 20 2a   pSrcList item *
2240: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
2250: 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20  *pTopNC = pNC;  
2260: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6e        /* First n
2270: 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20 74 68  amecontext in th
2280: 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53 63 68 65  e list */.  Sche
2290: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 30 3b  ma *pSchema = 0;
22a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22b0: 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65 20 65   Schema of the e
22c0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 75  xpression */.  u
22d0: 38 20 6e 65 77 4f 70 20 3d 20 54 4b 5f 43 4f 4c  8 newOp = TK_COL
22e0: 55 4d 4e 3b 20 20 20 20 20 20 20 20 20 20 20 20  UMN;            
22f0: 20 2f 2a 20 70 45 78 70 72 2d 3e 6f 70 20 61 66   /* pExpr->op af
2300: 74 65 72 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61  ter resolving na
2310: 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  me */.  Table *p
2320: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
2330: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
2340: 6c 65 20 68 6f 6c 64 20 74 68 65 20 72 6f 77 20  le hold the row 
2350: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  */.  Column *pCo
2360: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2370: 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
2380: 6d 6e 20 6f 66 20 70 54 61 62 20 2a 2f 0a 0a 20  mn of pTab */.. 
2390: 20 61 73 73 65 72 74 28 20 70 4e 43 20 29 3b 20   assert( pNC ); 
23a0: 20 20 20 20 2f 2a 20 74 68 65 20 6e 61 6d 65 20      /* the name 
23b0: 63 6f 6e 74 65 78 74 20 63 61 6e 6e 6f 74 20 62  context cannot b
23c0: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73  e NULL. */.  ass
23d0: 65 72 74 28 20 7a 43 6f 6c 20 29 3b 20 20 20 20  ert( zCol );    
23e0: 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e  /* The Z in X.Y.
23f0: 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  Z cannot be NULL
2400: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
2410: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2420: 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
2430: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2440: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
2450: 7a 65 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6e  ze the node to n
2460: 6f 2d 6d 61 74 63 68 20 2a 2f 0a 20 20 70 45 78  o-match */.  pEx
2470: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b  pr->iTable = -1;
2480: 0a 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d  .  pExpr->pTab =
2490: 20 30 3b 0a 20 20 45 78 70 72 53 65 74 56 56 41   0;.  ExprSetVVA
24a0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
24b0: 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b 0a 0a 20  EP_NoReduce);.. 
24c0: 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 74 68   /* Translate th
24d0: 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 69 6e  e schema name in
24e0: 20 7a 44 62 20 69 6e 74 6f 20 61 20 70 6f 69 6e   zDb into a poin
24f0: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 72 72 65  ter to the corre
2500: 73 70 6f 6e 64 69 6e 67 0a 20 20 2a 2a 20 73 63  sponding.  ** sc
2510: 68 65 6d 61 2e 20 20 49 66 20 6e 6f 74 20 66 6f  hema.  If not fo
2520: 75 6e 64 2c 20 70 53 63 68 65 6d 61 20 77 69 6c  und, pSchema wil
2530: 6c 20 72 65 6d 61 69 6e 20 4e 55 4c 4c 20 61 6e  l remain NULL an
2540: 64 20 6e 6f 74 68 69 6e 67 20 77 69 6c 6c 20 6d  d nothing will m
2550: 61 74 63 68 0a 20 20 2a 2a 20 72 65 73 75 6c 74  atch.  ** result
2560: 69 6e 67 20 69 6e 20 61 6e 20 61 70 70 72 6f 70  ing in an approp
2570: 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
2580: 61 67 65 20 74 6f 77 61 72 64 20 74 68 65 20 65  age toward the e
2590: 6e 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  nd of this routi
25a0: 6e 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 44  ne.  */.  if( zD
25b0: 62 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61 73  b ){.    testcas
25c0: 65 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  e( pNC->ncFlags 
25d0: 26 20 4e 43 5f 50 61 72 74 49 64 78 20 29 3b 0a  & NC_PartIdx );.
25e0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
25f0: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2600: 49 73 43 68 65 63 6b 20 29 3b 0a 20 20 20 20 69  IsCheck );.    i
2610: 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
2620: 20 26 20 28 4e 43 5f 50 61 72 74 49 64 78 7c 4e   & (NC_PartIdx|N
2630: 43 5f 49 73 43 68 65 63 6b 29 29 21 3d 30 20 29  C_IsCheck))!=0 )
2640: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e  {.      /* Silen
2650: 74 6c 79 20 69 67 6e 6f 72 65 20 64 61 74 61 62  tly ignore datab
2660: 61 73 65 20 71 75 61 6c 69 66 69 65 72 73 20 69  ase qualifiers i
2670: 6e 73 69 64 65 20 43 48 45 43 4b 20 63 6f 6e 73  nside CHECK cons
2680: 74 72 61 69 6e 74 73 20 61 6e 64 20 70 61 72 74  traints and part
2690: 69 61 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e 64  ial.      ** ind
26a0: 69 63 65 73 2e 20 20 44 6f 20 6e 6f 74 20 72 61  ices.  Do not ra
26b0: 69 73 65 20 65 72 72 6f 72 73 20 62 65 63 61 75  ise errors becau
26c0: 73 65 20 74 68 61 74 20 6d 69 67 68 74 20 62 72  se that might br
26d0: 65 61 6b 20 6c 65 67 61 63 79 20 61 6e 64 0a 20  eak legacy and. 
26e0: 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65 20       ** because 
26f0: 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72 74  it does not hurt
2700: 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 6a 75 73   anything to jus
2710: 74 20 69 67 6e 6f 72 65 20 74 68 65 20 64 61 74  t ignore the dat
2720: 61 62 61 73 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20  abase name. */. 
2730: 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20       zDb = 0;.  
2740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
2750: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
2760: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; i++){.       
2770: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
2780: 5b 69 5d 2e 7a 4e 61 6d 65 20 29 3b 0a 20 20 20  [i].zName );.   
2790: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
27a0: 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b  StrICmp(db->aDb[
27b0: 69 5d 2e 7a 4e 61 6d 65 2c 7a 44 62 29 3d 3d 30  i].zName,zDb)==0
27c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53   ){.          pS
27d0: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
27e0: 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  i].pSchema;.    
27f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2810: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
2820: 74 61 72 74 20 61 74 20 74 68 65 20 69 6e 6e 65  tart at the inne
2830: 72 2d 6d 6f 73 74 20 63 6f 6e 74 65 78 74 20 61  r-most context a
2840: 6e 64 20 6d 6f 76 65 20 6f 75 74 77 61 72 64 20  nd move outward 
2850: 75 6e 74 69 6c 20 61 20 6d 61 74 63 68 20 69 73  until a match is
2860: 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 77 68 69 6c   found */.  whil
2870: 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30  e( pNC && cnt==0
2880: 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73 74   ){.    ExprList
2890: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53 72   *pEList;.    Sr
28a0: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
28b0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
28c0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
28d0: 5f 4f 4d 49 54 5f 43 54 45 0a 20 20 20 20 2f 2a  _OMIT_CTE.    /*
28e0: 20 54 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   The identifier 
28f0: 22 4c 45 56 45 4c 22 2c 20 77 69 74 68 6f 75 74  "LEVEL", without
2900: 20 61 20 74 61 62 6c 65 20 6f 72 20 64 61 74 61   a table or data
2910: 62 61 73 65 20 71 75 61 6c 69 66 69 65 72 20 61  base qualifier a
2920: 6e 64 0a 20 20 20 20 2a 2a 20 77 69 74 68 69 6e  nd.    ** within
2930: 20 61 20 72 65 63 75 72 73 69 76 65 20 63 6f 6d   a recursive com
2940: 6d 6f 6e 20 74 61 62 6c 65 20 65 78 70 72 65 73  mon table expres
2950: 73 69 6f 6e 2c 20 72 65 73 6f 6c 76 65 73 20 74  sion, resolves t
2960: 6f 20 74 68 65 20 73 70 65 63 69 61 6c 0a 20 20  o the special.  
2970: 20 20 2a 2a 20 4c 45 56 45 4c 20 70 73 65 75 64    ** LEVEL pseud
2980: 6f 2d 63 6f 6c 75 6d 6e 2e 20 20 54 6f 20 61 63  o-column.  To ac
2990: 63 65 73 73 20 74 61 62 6c 65 20 6e 61 6d 65 73  cess table names
29a0: 20 63 61 6c 6c 65 64 20 22 6c 65 76 65 6c 22 2c   called "level",
29b0: 20 61 64 64 20 61 0a 20 20 20 20 2a 2a 20 74 61   add a.    ** ta
29c0: 62 6c 65 20 71 75 61 6c 69 66 69 65 72 2e 0a 20  ble qualifier.. 
29d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
29e0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 26 4e 43 5f 52  NC->ncFlags&NC_R
29f0: 65 63 75 72 73 69 76 65 29 21 3d 30 0a 20 20 20  ecursive)!=0.   
2a00: 20 20 26 26 20 7a 54 61 62 3d 3d 30 0a 20 20 20    && zTab==0.   
2a10: 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72    && sqlite3_str
2a20: 69 63 6d 70 28 7a 43 6f 6c 2c 22 6c 65 76 65 6c  icmp(zCol,"level
2a30: 22 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  ")==0.    ){.   
2a40: 20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d     assert( cnt==
2a50: 30 20 29 3b 0a 20 20 20 20 20 20 63 6e 74 20 3d  0 );.      cnt =
2a60: 20 31 3b 0a 20 20 20 20 20 20 6e 65 77 4f 70 20   1;.      newOp 
2a70: 3d 20 54 4b 5f 4c 45 56 45 4c 3b 0a 20 20 20 20  = TK_LEVEL;.    
2a80: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
2a90: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78   = -1;.      pEx
2aa0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  pr->affinity = S
2ab0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
2ac0: 52 3b 0a 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63  R;.      pNC->nc
2ad0: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 55 73 65 73  Flags |= NC_Uses
2ae0: 4c 65 76 65 6c 3b 0a 20 20 20 20 20 20 62 72 65  Level;.      bre
2af0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
2b00: 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c 69  ..    if( pSrcLi
2b10: 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  st ){.      for(
2b20: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63 4c  i=0, pItem=pSrcL
2b30: 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c 69  ist->a; i<pSrcLi
2b40: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
2b50: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2b60: 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70   pTab = pItem->p
2b70: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73  Tab;.        ass
2b80: 65 72 74 28 20 70 54 61 62 21 3d 30 20 26 26 20  ert( pTab!=0 && 
2b90: 70 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29  pTab->zName!=0 )
2ba0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2bb0: 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29  ( pTab->nCol>0 )
2bc0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  ;.        if( pI
2bd0: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26 26 20  tem->pSelect && 
2be0: 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d  (pItem->pSelect-
2bf0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e  >selFlags & SF_N
2c00: 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b  estedFrom)!=0 ){
2c10: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 68  .          int h
2c20: 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  it = 0;.        
2c30: 20 20 70 45 4c 69 73 74 20 3d 20 70 49 74 65 6d    pEList = pItem
2c40: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
2c50: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  t;.          for
2c60: 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e  (j=0; j<pEList->
2c70: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
2c80: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
2c90: 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d  ite3MatchSpanNam
2ca0: 65 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  e(pEList->a[j].z
2cb0: 53 70 61 6e 2c 20 7a 43 6f 6c 2c 20 7a 54 61 62  Span, zCol, zTab
2cc0: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
2cd0: 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74               cnt
2cf0: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  Tab = 2;.       
2d00: 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20         pMatch = 
2d10: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20  pItem;.         
2d20: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
2d30: 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
2d40: 20 20 20 20 20 20 20 68 69 74 20 3d 20 31 3b 0a         hit = 1;.
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2d60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d70: 20 20 20 20 69 66 28 20 68 69 74 20 7c 7c 20 7a      if( hit || z
2d80: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
2d90: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2da0: 20 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20       if( zDb && 
2db0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 21 3d 70  pTab->pSchema!=p
2dc0: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2dd0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2de0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2df0: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
2e00: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2e10: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74   *zTabName = pIt
2e20: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74  em->zAlias ? pIt
2e30: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61  em->zAlias : pTa
2e40: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
2e50: 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62      assert( zTab
2e60: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  Name!=0 );.     
2e70: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2e80: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
2e90: 2c 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a 20 20  , zTab)!=0 ){.  
2ea0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2eb0: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ue;.          }.
2ec0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ed0: 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62    if( 0==(cntTab
2ee0: 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
2ef0: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
2f00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f10: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c     for(j=0, pCol
2f20: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
2f30: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
2f40: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
2f50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2f60: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
2f70: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
2f80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2f90: 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
2fa0: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 72 69 6f  exactly one prio
2fb0: 72 20 6d 61 74 63 68 20 61 6e 64 20 74 68 69 73  r match and this
2fc0: 20 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20   match.         
2fd0: 20 20 20 2a 2a 20 69 73 20 66 6f 72 20 74 68 65     ** is for the
2fe0: 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c   right-hand tabl
2ff0: 65 20 6f 66 20 61 20 4e 41 54 55 52 41 4c 20 4a  e of a NATURAL J
3000: 4f 49 4e 20 6f 72 20 69 73 20 69 6e 20 61 20 0a  OIN or is in a .
3010: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55              ** U
3020: 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 74 68 65  SING clause, the
3030: 6e 20 73 6b 69 70 20 74 68 69 73 20 6d 61 74 63  n skip this matc
3040: 68 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  h..            *
3050: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
3060: 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ( cnt==1 ){.    
3070: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
3080: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20  tem->jointype & 
3090: 4a 54 5f 4e 41 54 55 52 41 4c 20 29 20 63 6f 6e  JT_NATURAL ) con
30a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
30b0: 20 20 20 20 20 69 66 28 20 6e 61 6d 65 49 6e 55       if( nameInU
30c0: 73 69 6e 67 43 6c 61 75 73 65 28 70 49 74 65 6d  singClause(pItem
30d0: 2d 3e 70 55 73 69 6e 67 2c 20 7a 43 6f 6c 29 20  ->pUsing, zCol) 
30e0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
30f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3100: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
3110: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
3120: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
3130: 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
3140: 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f  te the rowid (co
3150: 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65  lumn -1) for the
3160: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
3170: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
3180: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3190: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
31a0: 4b 65 79 20 3f 20 2d 31 20 3a 20 28 69 31 36 29  Key ? -1 : (i16)
31b0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  j;.            b
31c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
31d0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
31e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d    }.      if( pM
31f0: 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
3200: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
3210: 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3b  pMatch->iCursor;
3220: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
3230: 70 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70  pTab = pMatch->p
3240: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 70 53 63  Tab;.        pSc
3250: 68 65 6d 61 20 3d 20 70 45 78 70 72 2d 3e 70 54  hema = pExpr->pT
3260: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20  ab->pSchema;.   
3270: 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 69 66     }.    } /* if
3280: 28 20 70 53 72 63 4c 69 73 74 20 29 20 2a 2f 0a  ( pSrcList ) */.
3290: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32a0: 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20  OMIT_TRIGGER.   
32b0: 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e   /* If we have n
32c0: 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c  ot already resol
32d0: 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68  ved the name, th
32e0: 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a  en maybe .    **
32f0: 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f   it is a new.* o
3300: 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20  r old.* trigger 
3310: 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e  argument referen
3320: 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ce.    */.    if
3330: 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62  ( zDb==0 && zTab
3340: 21 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 30  !=0 && cntTab==0
3350: 20 26 26 20 70 50 61 72 73 65 2d 3e 70 54 72 69   && pParse->pTri
3360: 67 67 65 72 54 61 62 21 3d 30 20 29 7b 0a 20 20  ggerTab!=0 ){.  
3370: 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 50 61      int op = pPa
3380: 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f 70 3b  rse->eTriggerOp;
3390: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f  .      assert( o
33a0: 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20 7c 7c 20  p==TK_DELETE || 
33b0: 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c  op==TK_UPDATE ||
33c0: 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 29   op==TK_INSERT )
33d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 21 3d  ;.      if( op!=
33e0: 54 4b 5f 44 45 4c 45 54 45 20 26 26 20 73 71 6c  TK_DELETE && sql
33f0: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77  ite3StrICmp("new
3400: 22 2c 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a  ",zTab) == 0 ){.
3410: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
3420: 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  Table = 1;.     
3430: 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65     pTab = pParse
3440: 2d 3e 70 54 72 69 67 67 65 72 54 61 62 3b 0a 20  ->pTriggerTab;. 
3450: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
3460: 70 21 3d 54 4b 5f 49 4e 53 45 52 54 20 26 26 20  p!=TK_INSERT && 
3470: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
3480: 6f 6c 64 22 2c 7a 54 61 62 29 3d 3d 30 20 29 7b  old",zTab)==0 ){
3490: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
34a0: 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  iTable = 0;.    
34b0: 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
34c0: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 3b 0a  e->pTriggerTab;.
34d0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
34e0: 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20  f( pTab ){ .    
34f0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20      int iCol;.  
3500: 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d 20        pSchema = 
3510: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20  pTab->pSchema;. 
3520: 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b         cntTab++;
3530: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 43 6f  .        for(iCo
3540: 6c 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  l=0, pCol=pTab->
3550: 61 43 6f 6c 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  aCol; iCol<pTab-
3560: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70  >nCol; iCol++, p
3570: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
3580: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
3590: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
35a0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
35b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
35c0: 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20  ol==pTab->iPKey 
35d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
35e0: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20   iCol = -1;.    
35f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3610: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3620: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
3630: 43 6f 6c 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  Col>=pTab->nCol 
3640: 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  && sqlite3IsRowi
3650: 64 28 7a 43 6f 6c 29 20 26 26 20 48 61 73 52 6f  d(zCol) && HasRo
3660: 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20  wid(pTab) ){.   
3670: 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
3680: 2d 32 34 33 30 39 2d 31 38 36 32 35 20 2a 2f 0a  -24309-18625 */.
3690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
36a0: 3a 20 52 2d 34 34 39 31 31 2d 35 35 31 32 34 20  : R-44911-55124 
36b0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f  */.          iCo
36c0: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  l = -1;.        
36d0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  }.        if( iC
36e0: 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b  ol<pTab->nCol ){
36f0: 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  .          cnt++
3700: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
3710: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
3720: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
3730: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
3740: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
3750: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3760: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
3770: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
3780: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
3790: 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
37a0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
37b0: 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20 20 20  ==32 );.        
37c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6f 6c 64 6d      pParse->oldm
37d0: 61 73 6b 20 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32  ask |= (iCol>=32
37e0: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
37f0: 28 28 28 75 33 32 29 31 29 3c 3c 69 43 6f 6c 29  (((u32)1)<<iCol)
3800: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
3810: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
3820: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
3830: 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
3840: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
3850: 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20 20 20  ==32 );.        
3860: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 65 77 6d      pParse->newm
3870: 61 73 6b 20 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32  ask |= (iCol>=32
3880: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
3890: 28 28 28 75 33 32 29 31 29 3c 3c 69 43 6f 6c 29  (((u32)1)<<iCol)
38a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
38b0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
38c0: 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 29 69  iColumn = (i16)i
38d0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Col;.          p
38e0: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61  Expr->pTab = pTa
38f0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 77  b;.          new
3900: 4f 70 20 3d 20 54 4b 5f 54 52 49 47 47 45 52 3b  Op = TK_TRIGGER;
3910: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3920: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20   }.    }.#endif 
3930: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
3940: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
3950: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
3960: 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  ** Perhaps the n
3970: 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e  ame is a referen
3980: 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a  ce to the ROWID.
3990: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
39a0: 74 28 20 70 54 61 62 21 3d 30 20 7c 7c 20 63 6e  t( pTab!=0 || cn
39b0: 74 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20 20 69  tTab==0 );.    i
39c0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74  f( cnt==0 && cnt
39d0: 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65  Tab==1 && sqlite
39e0: 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 26  3IsRowid(zCol) &
39f0: 26 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  & HasRowid(pTab)
3a00: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20   ){.      cnt = 
3a10: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
3a20: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
3a30: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 34 39 31    /* IMP: R-4491
3a40: 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20 20 20 20  1-55124 */.     
3a50: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
3a60: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
3a70: 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  TEGER;.    }..  
3a80: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    /*.    ** If t
3a90: 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74  he input is of t
3aa0: 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59  he form Z (not Y
3ab0: 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65  .Z or X.Y.Z) the
3ac0: 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20  n the name Z.   
3ad0: 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20   ** might refer 
3ae0: 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74  to an result-set
3af0: 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61   alias.  This ha
3b00: 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
3b10: 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  le, when.    ** 
3b20: 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67  we are resolving
3b30: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48   names in the WH
3b40: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
3b50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d  e following comm
3b60: 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  and:.    **.    
3b70: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
3b80: 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c  b AS x FROM tabl
3b90: 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20  e WHERE x<10;.  
3ba0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63    **.    ** In c
3bb0: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20  ases like this, 
3bc0: 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69  replace pExpr wi
3bd0: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
3be0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
3bf0: 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68  .    ** forms th
3c00: 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74  e result set ent
3c10: 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65  ry ("a+b" in the
3c20: 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65   example) and re
3c30: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
3c40: 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  ..    ** Note th
3c50: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
3c60: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
3c70: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
3c80: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20  already been.   
3c90: 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20   ** resolved by 
3ca0: 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48 45  the time the WHE
3cb0: 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65 73  RE clause is res
3cc0: 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  olved..    **.  
3cd0: 20 20 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79    ** The ability
3ce0: 20 74 6f 20 75 73 65 20 61 6e 20 6f 75 74 70 75   to use an outpu
3cf0: 74 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  t result-set col
3d00: 75 6d 6e 20 69 6e 20 74 68 65 20 57 48 45 52 45  umn in the WHERE
3d10: 2c 20 47 52 4f 55 50 20 42 59 2c 0a 20 20 20 20  , GROUP BY,.    
3d20: 2a 2a 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61  ** or HAVING cla
3d30: 75 73 65 73 2c 20 6f 72 20 61 73 20 70 61 72 74  uses, or as part
3d40: 20 6f 66 20 61 20 6c 61 72 67 65 72 20 65 78 70   of a larger exp
3d50: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 4f  ression in the O
3d60: 52 44 52 45 20 42 59 0a 20 20 20 20 2a 2a 20 63  RDRE BY.    ** c
3d70: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 73 74 61  lause is not sta
3d80: 6e 64 61 72 64 20 53 51 4c 2e 20 20 54 68 69 73  ndard SQL.  This
3d90: 20 69 73 20 61 20 28 67 6f 6f 66 79 29 20 53 51   is a (goofy) SQ
3da0: 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e 2c 20  Lite extension, 
3db0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 73  that.    ** is s
3dc0: 75 70 70 6f 72 74 65 64 20 66 6f 72 20 62 61 63  upported for bac
3dd0: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
3de0: 6c 69 74 79 20 6f 6e 6c 79 2e 20 20 54 4f 20 44  lity only.  TO D
3df0: 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69  O: Issue a warni
3e00: 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 73 71 6c  ng.    ** on sql
3e10: 69 74 65 33 5f 6c 6f 67 28 29 20 77 68 65 6e 65  ite3_log() whene
3e20: 76 65 72 20 74 68 65 20 63 61 70 61 62 69 6c 69  ver the capabili
3e30: 74 79 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ty is used..    
3e40: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 45 4c 69  */.    if( (pELi
3e50: 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74  st = pNC->pEList
3e60: 29 21 3d 30 0a 20 20 20 20 20 26 26 20 7a 54 61  )!=0.     && zTa
3e70: 62 3d 3d 30 0a 20 20 20 20 20 26 26 20 63 6e 74  b==0.     && cnt
3e80: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
3e90: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69   for(j=0; j<pELi
3ea0: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
3eb0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
3ec0: 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  As = pEList->a[j
3ed0: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ].zName;.       
3ee0: 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73   if( zAs!=0 && s
3ef0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
3f00: 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  s, zCol)==0 ){. 
3f10: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
3f20: 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20  Orig;.          
3f30: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
3f40: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
3f50: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
3f60: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
3f70: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3d   pExpr->x.pList=
3f80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
3f90: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78  assert( pExpr->x
3fa0: 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20  .pSelect==0 );. 
3fb0: 20 20 20 20 20 20 20 20 20 70 4f 72 69 67 20 3d           pOrig =
3fc0: 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45   pEList->a[j].pE
3fd0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69  xpr;.          i
3fe0: 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
3ff0: 26 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30  &NC_AllowAgg)==0
4000: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
4010: 72 74 79 28 70 4f 72 69 67 2c 20 45 50 5f 41 67  rty(pOrig, EP_Ag
4020: 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g) ){.          
4030: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4040: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
4050: 65 20 6f 66 20 61 6c 69 61 73 65 64 20 61 67 67  e of aliased agg
4060: 72 65 67 61 74 65 20 25 73 22 2c 20 7a 41 73 29  regate %s", zAs)
4070: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
4080: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
4090: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
40a0: 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69        resolveAli
40b0: 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  as(pParse, pELis
40c0: 74 2c 20 6a 2c 20 70 45 78 70 72 2c 20 22 22 2c  t, j, pExpr, "",
40d0: 20 6e 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20   nSubquery);.   
40e0: 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a         cnt = 1;.
40f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
4100: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
4110: 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20  assert( zTab==0 
4120: 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20  && zDb==0 );.   
4130: 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b         goto look
4140: 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 20 20  upname_end;.    
4150: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20      }.      } . 
4160: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
4170: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
4180: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20   name context.  
4190: 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78  The loop will ex
41a0: 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20  it when either. 
41b0: 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20     ** we have a 
41c0: 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72  match (cnt>0) or
41d0: 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74   when we run out
41e0: 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74   of name context
41f0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
4200: 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cnt==0 ){.    
4210: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
4220: 78 74 3b 0a 20 20 20 20 20 20 6e 53 75 62 71 75  xt;.      nSubqu
4230: 65 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  ery++;.    }.  }
4240: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58  ..  /*.  ** If X
4250: 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20   and Y are NULL 
4260: 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20  (in other words 
4270: 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  if only the colu
4280: 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a  mn name Z is.  *
4290: 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20  * supplied) and 
42a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69  the value of Z i
42b0: 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f  s enclosed in do
42c0: 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65  uble-quotes, the
42d0: 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74  n.  ** Z is a st
42e0: 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20  ring literal if 
42f0: 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  it doesn't match
4300: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   any column name
4310: 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a  s.  In that.  **
4320: 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74   case, we need t
4330: 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  o return right a
4340: 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65  way and not make
4350: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a   any changes to.
4360: 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a    ** pExpr..  **
4370: 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f  .  ** Because no
4380: 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d   reference was m
4390: 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e  ade to outer con
43a0: 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e  texts, the pNC->
43b0: 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73  nRef.  ** fields
43c0: 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64   are not changed
43d0: 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e   in any context.
43e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d  .  */.  if( cnt=
43f0: 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26  =0 && zTab==0 &&
4400: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4410: 28 70 45 78 70 72 2c 45 50 5f 44 62 6c 51 75 6f  (pExpr,EP_DblQuo
4420: 74 65 64 29 20 29 7b 0a 20 20 20 20 70 45 78 70  ted) ){.    pExp
4430: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52 49 4e  r->op = TK_STRIN
4440: 47 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 70 54  G;.    pExpr->pT
4450: 61 62 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  ab = 0;.    retu
4460: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
4470: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74  }..  /*.  ** cnt
4480: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ==0 means there 
4490: 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20  was not match.  
44a0: 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72  cnt>1 means ther
44b0: 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20  e were two or.  
44c0: 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e  ** more matches.
44d0: 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77 65    Either way, we
44e0: 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a   have an error..
44f0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d    */.  if( cnt!=
4500: 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  1 ){.    const c
4510: 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a  har *zErr;.    z
4520: 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22  Err = cnt==0 ? "
4530: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 22 20  no such column" 
4540: 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c  : "ambiguous col
4550: 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20 20 69  umn name";.    i
4560: 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20  f( zDb ){.      
4570: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
4580: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
4590: 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 44  %s.%s", zErr, zD
45a0: 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a  b, zTab, zCol);.
45b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
45c0: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
45d0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
45e0: 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c  se, "%s: %s.%s",
45f0: 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a 43 6f   zErr, zTab, zCo
4600: 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
4610: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4620: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
4630: 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a 43 6f  : %s", zErr, zCo
4640: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  l);.    }.    pP
4650: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
4660: 61 20 3d 20 31 3b 0a 20 20 20 20 70 54 6f 70 4e  a = 1;.    pTopN
4670: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a  C->nErr++;.  }..
4680: 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e    /* If a column
4690: 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e   from a table in
46a0: 20 70 53 72 63 4c 69 73 74 20 69 73 20 72 65 66   pSrcList is ref
46b0: 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65  erenced, then re
46c0: 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66  cord.  ** this f
46d0: 61 63 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c  act in the pSrcL
46e0: 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20  ist.a[].colUsed 
46f0: 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e  bitmask.  Column
4700: 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62   0 causes.  ** b
4710: 69 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20  it 0 to be set. 
4720: 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62   Column 1 sets b
4730: 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f  it 1.  And so fo
4740: 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a  rth.  If the.  *
4750: 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * column number 
4760: 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
4770: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
4780: 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73  ts in the bitmas
4790: 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20  k.  ** then set 
47a0: 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62  the high-order b
47b0: 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73  it of the bitmas
47c0: 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45  k..  */.  if( pE
47d0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20  xpr->iColumn>=0 
47e0: 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a  && pMatch!=0 ){.
47f0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70      int n = pExp
4800: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
4810: 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 42 4d 53  testcase( n==BMS
4820: 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e  -1 );.    if( n>
4830: 3d 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 6e 20  =BMS ){.      n 
4840: 3d 20 42 4d 53 2d 31 3b 0a 20 20 20 20 7d 0a 20  = BMS-1;.    }. 
4850: 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63     assert( pMatc
4860: 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70  h->iCursor==pExp
4870: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
4880: 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64   pMatch->colUsed
4890: 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29   |= ((Bitmask)1)
48a0: 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  <<n;.  }..  /* C
48b0: 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75  lean up and retu
48c0: 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rn.  */.  sqlite
48d0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
48e0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
48f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
4900: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
4910: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
4920: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78  ->pRight);.  pEx
4930: 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a  pr->pRight = 0;.
4940: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 6e 65    pExpr->op = ne
4950: 77 4f 70 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  wOp;.lookupname_
4960: 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e 74 3d 3d  end:.  if( cnt==
4970: 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  1 ){.    assert(
4980: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pNC!=0 );.    i
4990: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
49a0: 5f 41 53 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _AS && pExpr->op
49b0: 21 3d 54 4b 5f 4c 45 56 45 4c 20 29 7b 0a 20 20  !=TK_LEVEL ){.  
49c0: 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 52      sqlite3AuthR
49d0: 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  ead(pParse, pExp
49e0: 72 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d  r, pSchema, pNC-
49f0: 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20  >pSrcList);.    
4a00: 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  }.    /* Increme
4a10: 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c 75  nt the nRef valu
4a20: 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f  e on all name co
4a30: 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e  ntexts from TopN
4a40: 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74  C up to.    ** t
4a50: 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74  he point where t
4a60: 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e  he name matched.
4a70: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b   */.    for(;;){
4a80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4a90: 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20  TopNC!=0 );.    
4aa0: 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b    pTopNC->nRef++
4ab0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 70  ;.      if( pTop
4ac0: 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b  NC==pNC ) break;
4ad0: 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d 20  .      pTopNC = 
4ae0: 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20  pTopNC->pNext;. 
4af0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
4b00: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 20 65  WRC_Prune;.  } e
4b10: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
4b20: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a   WRC_Abort;.  }.
4b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
4b40: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  e and return a p
4b50: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70  ointer to an exp
4b60: 72 65 73 73 69 6f 6e 20 74 6f 20 6c 6f 61 64 20  ression to load 
4b70: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 0a  the column iCol.
4b80: 2a 2a 20 66 72 6f 6d 20 64 61 74 61 73 6f 75 72  ** from datasour
4b90: 63 65 20 69 53 72 63 20 69 6e 20 53 72 63 4c 69  ce iSrc in SrcLi
4ba0: 73 74 20 70 53 72 63 2e 0a 2a 2f 0a 45 78 70 72  st pSrc..*/.Expr
4bb0: 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 43   *sqlite3CreateC
4bc0: 6f 6c 75 6d 6e 45 78 70 72 28 73 71 6c 69 74 65  olumnExpr(sqlite
4bd0: 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a  3 *db, SrcList *
4be0: 70 53 72 63 2c 20 69 6e 74 20 69 53 72 63 2c 20  pSrc, int iSrc, 
4bf0: 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 45 78 70  int iCol){.  Exp
4c00: 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78  r *p = sqlite3Ex
4c10: 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 43  prAlloc(db, TK_C
4c20: 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20  OLUMN, 0, 0);.  
4c30: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72  if( p ){.    str
4c40: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
4c50: 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d   *pItem = &pSrc-
4c60: 3e 61 5b 69 53 72 63 5d 3b 0a 20 20 20 20 70 2d  >a[iSrc];.    p-
4c70: 3e 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  >pTab = pItem->p
4c80: 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62  Tab;.    p->iTab
4c90: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
4ca0: 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  sor;.    if( p->
4cb0: 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f  pTab->iPKey==iCo
4cc0: 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43  l ){.      p->iC
4cd0: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
4ce0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e  }else{.      p->
4cf0: 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72  iColumn = (ynVar
4d00: 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73  )iCol;.      tes
4d10: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
4d20: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
4d30: 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
4d40: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
4d50: 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74  colUsed |= ((Bit
4d60: 6d 61 73 6b 29 31 29 3c 3c 28 69 43 6f 6c 3e 3d  mask)1)<<(iCol>=
4d70: 42 4d 53 20 3f 20 42 4d 53 2d 31 20 3a 20 69 43  BMS ? BMS-1 : iC
4d80: 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 45  ol);.    }.    E
4d90: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
4da0: 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a  , EP_Resolved);.
4db0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
4dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
4dd0: 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20 61 6e  an error that an
4de0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
4df0: 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 61 20 70  ot valid for a p
4e00: 61 72 74 69 61 6c 20 69 6e 64 65 78 20 57 48 45  artial index WHE
4e10: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2f  RE.** clause..*/
4e20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 74  .static void not
4e30: 56 61 6c 69 64 50 61 72 74 49 64 78 57 68 65 72  ValidPartIdxWher
4e40: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4e50: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4c 65 61  se,       /* Lea
4e60: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
4e70: 20 68 65 72 65 20 2a 2f 0a 20 20 4e 61 6d 65 43   here */.  NameC
4e80: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
4e90: 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74  /* The name cont
4ea0: 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ext */.  const c
4eb0: 68 61 72 20 2a 7a 4d 73 67 20 20 20 20 20 2f 2a  har *zMsg     /*
4ec0: 20 54 79 70 65 20 6f 66 20 65 72 72 6f 72 20 2a   Type of error *
4ed0: 2f 0a 29 7b 0a 20 20 69 66 28 20 28 70 4e 43 2d  /.){.  if( (pNC-
4ee0: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 50 61  >ncFlags & NC_Pa
4ef0: 72 74 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  rtIdx)!=0 ){.   
4f00: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
4f10: 28 70 50 61 72 73 65 2c 20 22 25 73 20 70 72 6f  (pParse, "%s pro
4f20: 68 69 62 69 74 65 64 20 69 6e 20 70 61 72 74 69  hibited in parti
4f30: 61 6c 20 69 6e 64 65 78 20 57 48 45 52 45 20 63  al index WHERE c
4f40: 6c 61 75 73 65 73 22 2c 0a 20 20 20 20 20 20 20  lauses",.       
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73               zMs
4f60: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  g);.  }.}..#ifnd
4f70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
4f80: 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  HECK./*.** Repor
4f90: 74 20 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20  t an error that 
4fa0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
4fb0: 20 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 61   not valid for a
4fc0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
4fd0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
4fe0: 64 20 6e 6f 74 56 61 6c 69 64 43 68 65 63 6b 43  d notValidCheckC
4ff0: 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72  onstraint(.  Par
5000: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
5010: 20 20 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f 72    /* Leave error
5020: 20 6d 65 73 73 61 67 65 20 68 65 72 65 20 2a 2f   message here */
5030: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
5040: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  pNC,    /* The n
5050: 61 6d 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ame context */. 
5060: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73   const char *zMs
5070: 67 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66  g     /* Type of
5080: 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69   error */.){.  i
5090: 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
50a0: 20 26 20 4e 43 5f 49 73 43 68 65 63 6b 29 21 3d   & NC_IsCheck)!=
50b0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
50c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
50d0: 22 25 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  "%s prohibited i
50e0: 6e 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  n CHECK constrai
50f0: 6e 74 73 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  nts", zMsg);.  }
5100: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
5110: 65 20 6e 6f 74 56 61 6c 69 64 43 68 65 63 6b 43  e notValidCheckC
5120: 6f 6e 73 74 72 61 69 6e 74 28 50 2c 4e 2c 4d 29  onstraint(P,N,M)
5130: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45  .#endif../*.** E
5140: 78 70 72 65 73 73 69 6f 6e 20 70 20 73 68 6f 75  xpression p shou
5150: 6c 64 20 65 6e 63 6f 64 65 20 61 20 66 6c 6f 61  ld encode a floa
5160: 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
5170: 20 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e 64   between 1.0 and
5180: 20 30 2e 30 2e 0a 2a 2a 20 52 65 74 75 72 6e 20   0.0..** Return 
5190: 31 30 32 34 20 74 69 6d 65 73 20 74 68 69 73 20  1024 times this 
51a0: 76 61 6c 75 65 2e 20 20 4f 72 20 72 65 74 75 72  value.  Or retur
51b0: 6e 20 2d 31 20 69 66 20 70 20 69 73 20 6e 6f 74  n -1 if p is not
51c0: 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e   a floating poin
51d0: 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 74 77 65  t.** value betwe
51e0: 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a  en 1.0 and 0.0..
51f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
5200: 70 72 50 72 6f 62 61 62 69 6c 69 74 79 28 45 78  prProbability(Ex
5210: 70 72 20 2a 70 29 7b 0a 20 20 64 6f 75 62 6c 65  pr *p){.  double
5220: 20 72 20 3d 20 2d 31 2e 30 3b 0a 20 20 69 66 28   r = -1.0;.  if(
5230: 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 4c 4f 41 54   p->op!=TK_FLOAT
5240: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
5250: 73 71 6c 69 74 65 33 41 74 6f 46 28 70 2d 3e 75  sqlite3AtoF(p->u
5260: 2e 7a 54 6f 6b 65 6e 2c 20 26 72 2c 20 73 71 6c  .zToken, &r, sql
5270: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
5280: 75 2e 7a 54 6f 6b 65 6e 29 2c 20 53 51 4c 49 54  u.zToken), SQLIT
5290: 45 5f 55 54 46 38 29 3b 0a 20 20 61 73 73 65 72  E_UTF8);.  asser
52a0: 74 28 20 72 3e 3d 30 2e 30 20 29 3b 0a 20 20 69  t( r>=0.0 );.  i
52b0: 66 28 20 72 3e 31 2e 30 20 29 20 72 65 74 75 72  f( r>1.0 ) retur
52c0: 6e 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 28  n -1;.  return (
52d0: 69 6e 74 29 28 72 2a 31 30 30 30 2e 30 29 3b 0a  int)(r*1000.0);.
52e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
52f0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 62 61 63  utine is callbac
5300: 6b 20 66 6f 72 20 73 71 6c 69 74 65 33 57 61 6c  k for sqlite3Wal
5310: 6b 45 78 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52  kExpr()..**.** R
5320: 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20  esolve symbolic 
5330: 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f  names into TK_CO
5340: 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66  LUMN operators f
5350: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  or the current.*
5360: 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78  * node in the ex
5370: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5380: 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74  Return 0 to cont
5390: 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68 20  inue the search 
53a0: 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65  down.** the tree
53b0: 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74   or 2 to abort t
53c0: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
53d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
53e0: 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72   also does error
53f0: 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61   checking and na
5400: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f  me resolution fo
5410: 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61  r.** function na
5420: 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74  mes.  The operat
5430: 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  or for aggregate
5440: 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68   functions is ch
5450: 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41  anged.** to TK_A
5460: 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a  GG_FUNCTION..*/.
5470: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
5480: 76 65 45 78 70 72 53 74 65 70 28 57 61 6c 6b 65  veExprStep(Walke
5490: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
54a0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65   *pExpr){.  Name
54b0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 0a 20 20  Context *pNC;.  
54c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a  Parse *pParse;..
54d0: 20 20 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d    pNC = pWalker-
54e0: 3e 75 2e 70 4e 43 3b 0a 20 20 61 73 73 65 72 74  >u.pNC;.  assert
54f0: 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50  ( pNC!=0 );.  pP
5500: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
5510: 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  se;.  assert( pP
5520: 61 72 73 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70  arse==pWalker->p
5530: 50 61 72 73 65 20 29 3b 0a 0a 20 20 69 66 28 20  Parse );..  if( 
5540: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
5550: 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76  pExpr, EP_Resolv
5560: 65 64 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ed) ) return WRC
5570: 5f 50 72 75 6e 65 3b 0a 20 20 45 78 70 72 53 65  _Prune;.  ExprSe
5580: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
5590: 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23   EP_Resolved);.#
55a0: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
55b0: 69 66 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  if( pNC->pSrcLis
55c0: 74 20 26 26 20 70 4e 43 2d 3e 70 53 72 63 4c 69  t && pNC->pSrcLi
55d0: 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a  st->nAlloc>0 ){.
55e0: 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72      SrcList *pSr
55f0: 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72  cList = pNC->pSr
5600: 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69  cList;.    int i
5610: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5620: 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e  <pNC->pSrcList->
5630: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
5640: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69    assert( pSrcLi
5650: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
5660: 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d  >=0 && pSrcList-
5670: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50  >a[i].iCursor<pP
5680: 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20  arse->nTab);.   
5690: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
56a0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
56b0: 70 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  p ){..#if define
56c0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
56d0: 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49  UPDATE_DELETE_LI
56e0: 4d 49 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  MIT) && !defined
56f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
5700: 51 55 45 52 59 29 0a 20 20 20 20 2f 2a 20 54 68  QUERY).    /* Th
5710: 65 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74  e special operat
5720: 6f 72 20 54 4b 5f 52 4f 57 20 6d 65 61 6e 73 20  or TK_ROW means 
5730: 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 66 6f  use the rowid fo
5740: 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20  r the first.    
5750: 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ** column in the
5760: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
5770: 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74  his is used by t
5780: 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 52 44  he LIMIT and ORD
5790: 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61  ER BY.    ** cla
57a0: 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  use processing o
57b0: 6e 20 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c  n UPDATE and DEL
57c0: 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ETE statements..
57d0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
57e0: 54 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20  TK_ROW: {.      
57f0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
5800: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
5810: 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
5820: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
5830: 74 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tem;.      asser
5840: 74 28 20 70 53 72 63 4c 69 73 74 20 26 26 20 70  t( pSrcList && p
5850: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31  SrcList->nSrc==1
5860: 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 20   );.      pItem 
5870: 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 0a  = pSrcList->a; .
5880: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
5890: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
58a0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
58b0: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
58c0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
58d0: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
58e0: 6f 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  or;.      pExpr-
58f0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
5900: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
5910: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
5920: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
5930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
5940: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
5950: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50  SQLITE_ENABLE_UP
5960: 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49  DATE_DELETE_LIMI
5970: 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  T) && !defined(S
5980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5990: 45 52 59 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ERY) */..    /* 
59a0: 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65  A lone identifie
59b0: 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  r is the name of
59c0: 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a   a column..    *
59d0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
59e0: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
59f0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
5a00: 73 65 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d  se, 0, 0, pExpr-
5a10: 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 4e 43 2c 20  >u.zToken, pNC, 
5a20: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
5a30: 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  .    /* A table 
5a40: 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  name and column 
5a50: 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49 44 0a  name:     ID.ID.
5a60: 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61      ** Or a data
5a70: 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20  base, table and 
5a80: 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49  column:  ID.ID.I
5a90: 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  D.    */.    cas
5aa0: 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20  e TK_DOT: {.    
5ab0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
5ac0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  olumn;.      con
5ad0: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b  st char *zTable;
5ae0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5af0: 72 20 2a 7a 44 62 3b 0a 20 20 20 20 20 20 45 78  r *zDb;.      Ex
5b00: 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20  pr *pRight;..   
5b10: 20 20 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69     /* if( pSrcLi
5b20: 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a  st==0 ) break; *
5b30: 2f 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  /.      pRight =
5b40: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a   pExpr->pRight;.
5b50: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
5b60: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
5b70: 20 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a         zDb = 0;.
5b80: 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d          zTable =
5b90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 75   pExpr->pLeft->u
5ba0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
5bb0: 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68   zColumn = pRigh
5bc0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
5bd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5be0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
5bf0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a  ->op==TK_DOT );.
5c00: 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 70 45          zDb = pE
5c10: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54  xpr->pLeft->u.zT
5c20: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a 54  oken;.        zT
5c30: 61 62 6c 65 20 3d 20 70 52 69 67 68 74 2d 3e 70  able = pRight->p
5c40: 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
5c50: 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20          zColumn 
5c60: 3d 20 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74  = pRight->pRight
5c70: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
5c80: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
5c90: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
5ca0: 73 65 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c  se, zDb, zTable,
5cb0: 20 7a 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70   zColumn, pNC, p
5cc0: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Expr);.    }..  
5cd0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e    /* Resolve fun
5ce0: 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20  ction names.    
5cf0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  */.    case TK_F
5d00: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
5d10: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
5d20: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
5d30: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67  t;    /* The arg
5d40: 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20  ument list */.  
5d50: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
5d60: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
5d70: 20 3a 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   : 0;    /* Numb
5d80: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
5d90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f  */.      int no_
5da0: 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20  such_func = 0;  
5db0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5dc0: 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e  no such function
5dd0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
5de0: 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   int wrong_num_a
5df0: 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  rgs = 0;     /* 
5e00: 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75  True if wrong nu
5e10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
5e20: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  s */.      int i
5e30: 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20  s_agg = 0;      
5e40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5e50: 66 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  f is an aggregat
5e60: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  e function */.  
5e70: 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20 20 20      int auth;   
5e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e90: 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69 6f 6e  /* Authorization
5ea0: 20 74 6f 20 75 73 65 20 74 68 65 20 66 75 6e 63   to use the func
5eb0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
5ec0: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
5ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5ee0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
5ef0: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
5f00: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
5f10: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
5f20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
5f30: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
5f40: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
5f50: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
5f60: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
5f70: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
5f80: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38  tion */.      u8
5f90: 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
5fa0: 65 2d 3e 64 62 29 3b 20 20 20 2f 2a 20 54 68 65  e->db);   /* The
5fb0: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
5fc0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ng */..      ass
5fd0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
5fe0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
5ff0: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
6000: 20 20 20 20 6e 6f 74 56 61 6c 69 64 50 61 72 74      notValidPart
6010: 49 64 78 57 68 65 72 65 28 70 50 61 72 73 65 2c  IdxWhere(pParse,
6020: 20 70 4e 43 2c 20 22 66 75 6e 63 74 69 6f 6e 73   pNC, "functions
6030: 22 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20  ");.      zId = 
6040: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b  pExpr->u.zToken;
6050: 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c  .      nId = sql
6060: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64  ite3Strlen30(zId
6070: 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
6080: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
6090: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
60a0: 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63  zId, nId, n, enc
60b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
60c0: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
60d0: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
60e0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
60f0: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
6100: 49 64 2c 20 2d 32 2c 20 65 6e 63 2c 20 30 29 3b  Id, -2, enc, 0);
6110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
6120: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
6130: 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d    no_such_func =
6140: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
6150: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f  e{.          wro
6160: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b  ng_num_args = 1;
6170: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6180: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6190: 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78  is_agg = pDef->x
61a0: 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 20  Func==0;.       
61b0: 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
61c0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
61d0: 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20  NC_UNLIKELY ){. 
61e0: 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
61f0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6200: 45 50 5f 55 6e 6c 69 6b 65 6c 79 7c 45 50 5f 53  EP_Unlikely|EP_S
6210: 6b 69 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  kip);.          
6220: 69 66 28 20 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  if( n==2 ){.    
6230: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
6240: 54 61 62 6c 65 20 3d 20 65 78 70 72 50 72 6f 62  Table = exprProb
6250: 61 62 69 6c 69 74 79 28 70 4c 69 73 74 2d 3e 61  ability(pList->a
6260: 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
6270: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70          if( pExp
6280: 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20  r->iTable<0 ){. 
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
62a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
62b0: 72 73 65 2c 20 22 73 65 63 6f 6e 64 20 61 72 67  rse, "second arg
62c0: 75 6d 65 6e 74 20 74 6f 20 6c 69 6b 65 6c 69 68  ument to likelih
62d0: 6f 6f 64 28 29 20 6d 75 73 74 20 62 65 20 61 20  ood() must be a 
62e0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 20 20 20 20 20 20 20 22 63 6f 6e 73 74 61 6e          "constan
6310: 74 20 62 65 74 77 65 65 6e 20 30 2e 30 20 61 6e  t between 0.0 an
6320: 64 20 31 2e 30 22 29 3b 0a 20 20 20 20 20 20 20  d 1.0");.       
6330: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
6340: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
6350: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
6360: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
6370: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
6380: 2d 36 31 33 30 34 2d 32 39 34 34 39 20 54 68 65  -61304-29449 The
6390: 20 75 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e   unlikely(X) fun
63a0: 63 74 69 6f 6e 20 69 73 20 65 71 75 69 76 61 6c  ction is equival
63b0: 65 6e 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20  ent to.         
63c0: 20 20 20 2a 2a 20 6c 69 6b 65 6c 69 68 6f 6f 64     ** likelihood
63d0: 28 58 2c 20 30 2e 30 36 32 35 29 2e 0a 20 20 20  (X, 0.0625)..   
63e0: 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44           ** EVID
63f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 32 38 33  ENCE-OF: R-01283
6400: 2d 31 31 36 33 36 20 54 68 65 20 75 6e 6c 69 6b  -11636 The unlik
6410: 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20  ely(X) function 
6420: 69 73 20 73 68 6f 72 74 2d 68 61 6e 64 20 66 6f  is short-hand fo
6430: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  r.            **
6440: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e   likelihood(X,0.
6450: 30 36 32 35 29 2e 20 2a 2f 0a 20 20 20 20 20 20  0625). */.      
6460: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
6470: 62 6c 65 20 3d 20 36 32 3b 20 20 2f 2a 20 54 55  ble = 62;  /* TU
6480: 4e 49 4e 47 3a 20 20 44 65 66 61 75 6c 74 20 32  NING:  Default 2
6490: 6e 64 20 61 72 67 20 74 6f 20 75 6e 6c 69 6b 65  nd arg to unlike
64a0: 6c 79 28 29 20 69 73 20 30 2e 30 36 32 35 20 2a  ly() is 0.0625 *
64b0: 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 20 20 20  /.          }   
64c0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
64d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
64e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
64f0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
6500: 20 20 20 20 20 69 66 28 20 70 44 65 66 20 29 7b       if( pDef ){
6510: 0a 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20  .        auth = 
6520: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
6530: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
6540: 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65  FUNCTION, 0, pDe
6550: 66 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  f->zName, 0);.  
6560: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d        if( auth!=
6570: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6580: 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d         if( auth=
6590: 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a  =SQLITE_DENY ){.
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
65b0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
65c0: 73 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69  se, "not authori
65d0: 7a 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74  zed to use funct
65e0: 69 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  ion: %s",.      
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
6610: 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ef->zName);.    
6620: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
6630: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r++;.          }
6640: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
6650: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
6660: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6670: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
6680: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6690: 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
66a0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
66b0: 43 4f 4e 53 54 41 4e 54 20 29 20 45 78 70 72 53  CONSTANT ) ExprS
66c0: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
66d0: 2c 45 50 5f 43 6f 6e 73 74 61 6e 74 29 3b 0a 20  ,EP_Constant);. 
66e0: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
66f0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 26      if( is_agg &
6700: 26 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  & (pNC->ncFlags 
6710: 26 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d  & NC_AllowAgg)==
6720: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
6730: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6740: 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
6750: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
6760: 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c  on %.*s()", nId,
6770: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
6780: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
6790: 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20     is_agg = 0;. 
67a0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
67b0: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 26 26 20 70  o_such_func && p
67c0: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
67d0: 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20  busy==0 ){.     
67e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
67f0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
6800: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
6810: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
6820: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
6830: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
6840: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
6850: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
6860: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6870: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
6880: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
6890: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
68a0: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
68b0: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
68c0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
68d0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
68e0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e   if( is_agg ) pN
68f0: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  C->ncFlags &= ~N
6900: 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20  C_AllowAgg;.    
6910: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
6920: 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70  rList(pWalker, p
6930: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  List);.      if(
6940: 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20   is_agg ){.     
6950: 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a     NameContext *
6960: 70 4e 43 32 20 3d 20 70 4e 43 3b 0a 20 20 20 20  pNC2 = pNC;.    
6970: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
6980: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b  TK_AGG_FUNCTION;
6990: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
69a0: 6f 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  op2 = 0;.       
69b0: 20 77 68 69 6c 65 28 20 70 4e 43 32 20 26 26 20   while( pNC2 && 
69c0: 21 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e  !sqlite3Function
69d0: 55 73 65 73 54 68 69 73 53 72 63 28 70 45 78 70  UsesThisSrc(pExp
69e0: 72 2c 20 70 4e 43 32 2d 3e 70 53 72 63 4c 69 73  r, pNC2->pSrcLis
69f0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
6a00: 70 45 78 70 72 2d 3e 6f 70 32 2b 2b 3b 0a 20 20  pExpr->op2++;.  
6a10: 20 20 20 20 20 20 20 20 70 4e 43 32 20 3d 20 70          pNC2 = p
6a20: 4e 43 32 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  NC2->pNext;.    
6a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6a40: 28 20 70 4e 43 32 20 29 20 70 4e 43 32 2d 3e 6e  ( pNC2 ) pNC2->n
6a50: 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 48 61 73  cFlags |= NC_Has
6a60: 41 67 67 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Agg;.        pNC
6a70: 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  ->ncFlags |= NC_
6a80: 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20  AllowAgg;.      
6a90: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d  }.      /* FIX M
6aa0: 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70  E:  Compute pExp
6ab0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65  r->affinity base
6ac0: 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65  d on the expecte
6ad0: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  d return.      *
6ae0: 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75  * type of the fu
6af0: 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f  nction .      */
6b00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
6b10: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23  C_Prune;.    }.#
6b20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6b30: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
6b40: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a  case TK_SELECT:.
6b50: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
6b60: 54 53 3a 20 20 74 65 73 74 63 61 73 65 28 20 70  TS:  testcase( p
6b70: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49  Expr->op==TK_EXI
6b80: 53 54 53 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  STS );.#endif.  
6b90: 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a    case TK_IN: {.
6ba0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6bb0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
6bc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45 78   );.      if( Ex
6bd0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
6be0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
6bf0: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  t) ){.        in
6c00: 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52  t nRef = pNC->nR
6c10: 65 66 3b 0a 20 20 20 20 20 20 20 20 6e 6f 74 56  ef;.        notV
6c20: 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  alidCheckConstra
6c30: 69 6e 74 28 70 50 61 72 73 65 2c 20 70 4e 43 2c  int(pParse, pNC,
6c40: 20 22 73 75 62 71 75 65 72 69 65 73 22 29 3b 0a   "subqueries");.
6c50: 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64          notValid
6c60: 50 61 72 74 49 64 78 57 68 65 72 65 28 70 50 61  PartIdxWhere(pPa
6c70: 72 73 65 2c 20 70 4e 43 2c 20 22 73 75 62 71 75  rse, pNC, "subqu
6c80: 65 72 69 65 73 22 29 3b 0a 20 20 20 20 20 20 20  eries");.       
6c90: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
6ca0: 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70  ct(pWalker, pExp
6cb0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
6cc0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6cd0: 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29  NC->nRef>=nRef )
6ce0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52  ;.        if( nR
6cf0: 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b  ef!=pNC->nRef ){
6d00: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53  .          ExprS
6d10: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
6d20: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b  , EP_VarSelect);
6d30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6d40: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6d50: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
6d60: 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
6d70: 20 20 20 20 6e 6f 74 56 61 6c 69 64 43 68 65 63      notValidChec
6d80: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72  kConstraint(pPar
6d90: 73 65 2c 20 70 4e 43 2c 20 22 70 61 72 61 6d 65  se, pNC, "parame
6da0: 74 65 72 73 22 29 3b 0a 20 20 20 20 20 20 6e 6f  ters");.      no
6db0: 74 56 61 6c 69 64 50 61 72 74 49 64 78 57 68 65  tValidPartIdxWhe
6dc0: 72 65 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20  re(pParse, pNC, 
6dd0: 22 70 61 72 61 6d 65 74 65 72 73 22 29 3b 0a 20  "parameters");. 
6de0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6df0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  }.  }.  return (
6e00: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
6e10: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
6e20: 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f  ocFailed) ? WRC_
6e30: 41 62 6f 72 74 20 3a 20 57 52 43 5f 43 6f 6e 74  Abort : WRC_Cont
6e40: 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  inue;.}../*.** p
6e50: 45 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  EList is a list 
6e60: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77  of expressions w
6e70: 68 69 63 68 20 61 72 65 20 72 65 61 6c 6c 79 20  hich are really 
6e80: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
6e90: 66 20 74 68 65 0a 2a 2a 20 61 20 53 45 4c 45 43  f the.** a SELEC
6ea0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 45  T statement.  pE
6eb0: 20 69 73 20 61 20 74 65 72 6d 20 69 6e 20 61 6e   is a term in an
6ec0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
6ed0: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  UP BY clause..**
6ee0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
6ef0: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70  ecks to see if p
6f00: 45 20 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64  E is a simple id
6f10: 65 6e 74 69 66 69 65 72 20 77 68 69 63 68 20 63  entifier which c
6f20: 6f 72 72 65 73 70 6f 6e 64 73 0a 2a 2a 20 74 6f  orresponds.** to
6f30: 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 20   the AS-name of 
6f40: 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 72 6d 73  one of the terms
6f50: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
6f60: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 69 74 20  on list.  If it 
6f70: 69 73 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  is,.** this rout
6f80: 69 6e 65 20 72 65 74 75 72 6e 20 61 6e 20 69 6e  ine return an in
6f90: 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20  teger between 1 
6fa0: 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73  and N where N is
6fb0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
6fc0: 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 45  * elements in pE
6fd0: 4c 69 73 74 2c 20 63 6f 72 72 65 73 70 6f 6e 64  List, correspond
6fe0: 69 6e 67 20 74 6f 20 74 68 65 20 6d 61 74 63 68  ing to the match
6ff0: 69 6e 67 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ing entry.  If t
7000: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61  here is.** no ma
7010: 74 63 68 2c 20 6f 72 20 69 66 20 70 45 20 69 73  tch, or if pE is
7020: 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 69 64   not a simple id
7030: 65 6e 74 69 66 69 65 72 2c 20 74 68 65 6e 20 74  entifier, then t
7040: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
7050: 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 70  eturn 0..**.** p
7060: 45 4c 69 73 74 20 68 61 73 20 62 65 65 6e 20 72  EList has been r
7070: 65 73 6f 6c 76 65 64 2e 20 20 70 45 20 68 61 73  esolved.  pE has
7080: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
7090: 69 6e 74 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d  int resolveAsNam
70a0: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
70b0: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
70c0: 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65  ng context for e
70d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
70e0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
70f0: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
7100: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20   expressions to 
7110: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
7120: 70 45 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pE           /* 
7130: 45 78 70 72 65 73 73 69 6f 6e 20 77 65 20 61 72  Expression we ar
7140: 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 74 63  e trying to matc
7150: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7170: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
7180: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7190: 54 45 52 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  TER(pParse);..  
71a0: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pE->op==TK_I
71b0: 44 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  D ){.    char *z
71c0: 43 6f 6c 20 3d 20 70 45 2d 3e 75 2e 7a 54 6f 6b  Col = pE->u.zTok
71d0: 65 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  en;.    for(i=0;
71e0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
71f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
7200: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
7210: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
7220: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
7230: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
7240: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
7250: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7260: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i+1;.      }.  
7270: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7280: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20   0;.}../*.** pE 
7290: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
72a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68  an expression wh
72b0: 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ich is a single 
72c0: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 4f  term in the.** O
72d0: 52 44 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d  RDER BY of a com
72e0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e 20 20 54  pound SELECT.  T
72f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
7300: 73 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20 6e 61  s not been.** na
7310: 6d 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  me resolved..**.
7320: 2a 2a 20 41 74 20 74 68 65 20 70 6f 69 6e 74 20  ** At the point 
7330: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7340: 63 61 6c 6c 65 64 2c 20 77 65 20 61 6c 72 65 61  called, we alrea
7350: 64 79 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  dy know that the
7360: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72  .** ORDER BY ter
7370: 6d 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  m is not an inte
7380: 67 65 72 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  ger index into t
7390: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
73a0: 54 68 61 74 0a 2a 2a 20 63 61 73 65 20 69 73 20  That.** case is 
73b0: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 63  handled by the c
73c0: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a  alling routine..
73d0: 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  **.** Attempt to
73e0: 20 6d 61 74 63 68 20 70 45 20 61 67 61 69 6e 73   match pE agains
73f0: 74 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  t result set col
7400: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74  umns in the left
7410: 2d 6d 6f 73 74 0a 2a 2a 20 53 45 4c 45 43 54 20  -most.** SELECT 
7420: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
7430: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f  rn the index i o
7440: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
7450: 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61 73 20 61 6e 20  olumn,.** as an 
7460: 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68  indication to th
7470: 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74  e caller that it
7480: 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20   should sort by 
7490: 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e  the i-th column.
74a0: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
74b0: 74 20 63 6f 6c 75 6d 6e 20 69 73 20 31 2e 20 20  t column is 1.  
74c0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
74d0: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
74e0: 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d  ed is the.** sam
74f0: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
7500: 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 75 73  that would be us
7510: 65 64 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ed in the SQL st
7520: 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 64 69 63  atement to indic
7530: 61 74 65 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d  ate.** the colum
7540: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  n..**.** If ther
7550: 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2c 20 72  e is no match, r
7560: 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
7570: 20 2d 31 20 69 66 20 61 6e 20 65 72 72 6f 72 20   -1 if an error 
7580: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
7590: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64  c int resolveOrd
75a0: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
75b0: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
75c0: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
75d0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ing context for 
75e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
75f0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
7600: 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45  ect,   /* The SE
7610: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77  LECT statement w
7620: 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
7630: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
7640: 72 20 2a 70 45 20 20 20 20 20 20 20 20 20 20 20  r *pE           
7650: 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
7660: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f  ORDER BY term */
7670: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
7680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7690: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
76a0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
76b0: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20   /* The columns 
76c0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
76d0: 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t */.  NameConte
76e0: 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d  xt nc;    /* Nam
76f0: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65  e context for re
7700: 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 20 20  solving pE */.  
7710: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
7720: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
7730: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
7740: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
7750: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
7760: 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
7770: 72 65 73 20 2a 2f 0a 20 20 75 38 20 73 61 76 65  res */.  u8 save
7780: 64 53 75 70 70 45 72 72 3b 20 20 20 2f 2a 20 53  dSuppErr;   /* S
7790: 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 64 62  aved value of db
77a0: 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20 2a 2f  ->suppressErr */
77b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
77c0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
77d0: 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20  (pE, &i)==0 );. 
77e0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
77f0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  t->pEList;..  /*
7800: 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d   Resolve all nam
7810: 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  es in the ORDER 
7820: 42 59 20 74 65 72 6d 20 65 78 70 72 65 73 73 69  BY term expressi
7830: 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  on.  */.  memset
7840: 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&nc, 0, sizeof(
7850: 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73  nc));.  nc.pPars
7860: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e 63  e = pParse;.  nc
7870: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
7880: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e  ect->pSrc;.  nc.
7890: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
78a0: 0a 20 20 6e 63 2e 6e 63 46 6c 61 67 73 20 3d 20  .  nc.ncFlags = 
78b0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 6e  NC_AllowAgg;.  n
78c0: 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 64 62  c.nErr = 0;.  db
78d0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
78e0: 20 73 61 76 65 64 53 75 70 70 45 72 72 20 3d 20   savedSuppErr = 
78f0: 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 3b  db->suppressErr;
7900: 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  .  db->suppressE
7910: 72 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  rr = 1;.  rc = s
7920: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
7930: 72 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 3b  rNames(&nc, pE);
7940: 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  .  db->suppressE
7950: 72 72 20 3d 20 73 61 76 65 64 53 75 70 70 45 72  rr = savedSuppEr
7960: 72 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  r;.  if( rc ) re
7970: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 72  turn 0;..  /* Tr
7980: 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f  y to match the O
7990: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
79a0: 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78  on against an ex
79b0: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 69 6e  pression.  ** in
79c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
79d0: 20 20 52 65 74 75 72 6e 20 61 6e 20 31 2d 62 61    Return an 1-ba
79e0: 73 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  sed index of the
79f0: 20 6d 61 74 63 68 69 6e 67 0a 20 20 2a 2a 20 72   matching.  ** r
7a00: 65 73 75 6c 74 2d 73 65 74 20 65 6e 74 72 79 2e  esult-set entry.
7a10: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
7a20: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
7a30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7a40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
7a50: 72 65 28 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e  re(pEList->a[i].
7a60: 70 45 78 70 72 2c 20 70 45 2c 20 2d 31 29 3c 32  pExpr, pE, -1)<2
7a70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7a80: 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i+1;.    }.  }.
7a90: 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 6d 61 74 63  .  /* If no matc
7aa0: 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 2a 2f 0a  h, return 0. */.
7ab0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
7ac0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e  *.** Generate an
7ad0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
7ae0: 55 50 20 42 59 20 74 65 72 6d 20 6f 75 74 2d 6f  UP BY term out-o
7af0: 66 2d 72 61 6e 67 65 20 65 72 72 6f 72 2e 0a 2a  f-range error..*
7b00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
7b10: 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45  solveOutOfRangeE
7b20: 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a 70  rror(.  Parse *p
7b30: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
7b40: 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f 6e 74  * The error cont
7b50: 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20 74  ext into which t
7b60: 6f 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f  o write the erro
7b70: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
7b80: 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a  r *zType,     /*
7b90: 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f   "ORDER" or "GRO
7ba0: 55 50 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  UP" */.  int i, 
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 28 31 2d  /* The index (1-
7bd0: 62 61 73 65 64 29 20 6f 66 20 74 68 65 20 74 65  based) of the te
7be0: 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  rm out of range 
7bf0: 2a 2f 0a 20 20 69 6e 74 20 6d 78 20 20 20 20 20  */.  int mx     
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
7c10: 61 72 67 65 73 74 20 70 65 72 6d 69 73 73 69 62  argest permissib
7c20: 6c 65 20 76 61 6c 75 65 20 6f 66 20 69 20 2a 2f  le value of i */
7c30: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 72 72  .){.  sqlite3Err
7c40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
7c50: 20 20 20 22 25 72 20 25 73 20 42 59 20 74 65 72     "%r %s BY ter
7c60: 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2d  m out of range -
7c70: 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20 20   should be ".   
7c80: 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20   "between 1 and 
7c90: 25 64 22 2c 20 69 2c 20 7a 54 79 70 65 2c 20 6d  %d", i, zType, m
7ca0: 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61  x);.}../*.** Ana
7cb0: 6c 79 7a 65 20 74 68 65 20 4f 52 44 45 52 20 42  lyze the ORDER B
7cc0: 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 63 6f  Y clause in a co
7cd0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73 74  mpound SELECT st
7ce0: 61 74 65 6d 65 6e 74 2e 20 20 20 4d 6f 64 69 66  atement.   Modif
7cf0: 79 0a 2a 2a 20 65 61 63 68 20 74 65 72 6d 20 6f  y.** each term o
7d00: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
7d10: 6c 61 75 73 65 20 69 73 20 61 20 63 6f 6e 73 74  lause is a const
7d20: 61 6e 74 20 69 6e 74 65 67 65 72 20 62 65 74 77  ant integer betw
7d30: 65 65 6e 20 31 0a 2a 2a 20 61 6e 64 20 4e 20 77  een 1.** and N w
7d40: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
7d50: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
7d60: 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  in the compound 
7d70: 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52  SELECT..**.** OR
7d80: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
7d90: 74 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 6e  t are already an
7da0: 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e   integer between
7db0: 20 31 20 61 6e 64 20 4e 20 61 72 65 0a 2a 2a 20   1 and N are.** 
7dc0: 75 6e 6d 6f 64 69 66 69 65 64 2e 20 20 4f 52 44  unmodified.  ORD
7dd0: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
7de0: 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 6f 75   are integers ou
7df0: 74 73 69 64 65 20 74 68 65 20 72 61 6e 67 65 20  tside the range 
7e00: 6f 66 0a 2a 2a 20 31 20 74 68 72 6f 75 67 68 20  of.** 1 through 
7e10: 4e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65 72  N generate an er
7e20: 72 6f 72 2e 20 20 4f 52 44 45 52 20 42 59 20 74  ror.  ORDER BY t
7e30: 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 65 78  erms that are ex
7e40: 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65  pressions.** are
7e50: 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73 74   matched against
7e60: 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
7e70: 65 73 73 69 6f 6e 73 20 6f 66 20 63 6f 6d 70 6f  essions of compo
7e80: 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 62 65  und SELECT.** be
7e90: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 74 68 65  ginning with the
7ea0: 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43   left-most SELEC
7eb0: 54 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 74 6f  T and working to
7ec0: 77 61 72 64 20 74 68 65 20 72 69 67 68 74 2e 0a  ward the right..
7ed0: 2a 2a 20 41 74 20 74 68 65 20 66 69 72 73 74 20  ** At the first 
7ee0: 6d 61 74 63 68 2c 20 74 68 65 20 4f 52 44 45 52  match, the ORDER
7ef0: 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 69   BY expression i
7f00: 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e  s transformed in
7f10: 74 6f 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67 65  to.** the intege
7f20: 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e  r column number.
7f30: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
7f40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
7f50: 72 73 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74  rs seen..*/.stat
7f60: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 43 6f  ic int resolveCo
7f70: 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a 20  mpoundOrderBy(. 
7f80: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7f90: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
7fa0: 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76  g context.  Leav
7fb0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  e error messages
7fc0: 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63   here */.  Selec
7fd0: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
7fe0: 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73   /* The SELECT s
7ff0: 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e  tatement contain
8000: 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42 59  ing the ORDER BY
8010: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
8020: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
8030: 65 72 42 79 3b 0a 20 20 45 78 70 72 4c 69 73 74  erBy;.  ExprList
8040: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69   *pEList;.  sqli
8050: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d  te3 *db;.  int m
8060: 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20  oreToDo = 1;..  
8070: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c 65  pOrderBy = pSele
8080: 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20  ct->pOrderBy;.  
8090: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
80a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62  ) return 0;.  db
80b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
80c0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
80d0: 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72 64 65  LUMN.  if( pOrde
80e0: 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  rBy->nExpr>db->a
80f0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
8100: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
8110: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8120: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
8130: 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44  any terms in ORD
8140: 45 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a  ER BY clause");.
8150: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8160: 7d 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69  }.#endif.  for(i
8170: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
8180: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8190: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
81a0: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
81b0: 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 20 3d  pSelect->pNext =
81c0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
81d0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
81e0: 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 50 72      pSelect->pPr
81f0: 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 53 65  ior->pNext = pSe
8200: 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63  lect;.    pSelec
8210: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
8220: 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ior;.  }.  while
8230: 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72  ( pSelect && mor
8240: 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 73 74 72  eToDo ){.    str
8250: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8260: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 6d 6f  m *pItem;.    mo
8270: 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20  reToDo = 0;.    
8280: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
8290: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73  ->pEList;.    as
82a0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
82b0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  );.    for(i=0, 
82c0: 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
82d0: 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  a; i<pOrderBy->n
82e0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
82f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
8300: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Col = -1;.      
8310: 45 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b  Expr *pE, *pDup;
8320: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
8330: 2d 3e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  ->done ) continu
8340: 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71  e;.      pE = sq
8350: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
8360: 6c 61 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  late(pItem->pExp
8370: 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  r);.      if( sq
8380: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
8390: 65 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b  er(pE, &iCol) ){
83a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
83b0: 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c  l<=0 || iCol>pEL
83c0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
83d0: 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f          resolveO
83e0: 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70  utOfRangeError(p
83f0: 50 61 72 73 65 2c 20 22 4f 52 44 45 52 22 2c 20  Parse, "ORDER", 
8400: 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  i+1, pEList->nEx
8410: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  pr);.          r
8420: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
8430: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
8440: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72          iCol = r
8450: 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50 61  esolveAsName(pPa
8460: 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 45 29  rse, pEList, pE)
8470: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43  ;.        if( iC
8480: 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ol==0 ){.       
8490: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
84a0: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 2c  3ExprDup(db, pE,
84b0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
84c0: 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  f( !db->mallocFa
84d0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
84e0: 20 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29      assert(pDup)
84f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ;.            iC
8500: 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 4f 72 64 65  ol = resolveOrde
8510: 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73  rByTermToExprLis
8520: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  t(pParse, pSelec
8530: 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  t, pDup);.      
8540: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8550: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8560: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
8570: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
8580: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
8590: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
85a0: 6e 76 65 72 74 20 74 68 65 20 4f 52 44 45 52 20  nvert the ORDER 
85b0: 42 59 20 74 65 72 6d 20 69 6e 74 6f 20 61 6e 20  BY term into an 
85c0: 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e  integer column n
85d0: 75 6d 62 65 72 20 69 43 6f 6c 2c 0a 20 20 20 20  umber iCol,.    
85e0: 20 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 63 61      ** taking ca
85f0: 72 65 20 74 6f 20 70 72 65 73 65 72 76 65 20 74  re to preserve t
8600: 68 65 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73  he COLLATE claus
8610: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a  e if it exists *
8620: 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  /.        Expr *
8630: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
8640: 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45  pr(db, TK_INTEGE
8650: 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  R, 0);.        i
8660: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
8670: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
8680: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
8690: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
86a0: 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75     pNew->u.iValu
86b0: 65 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  e = iCol;.      
86c0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 45 78    if( pItem->pEx
86d0: 70 72 3d 3d 70 45 20 29 7b 0a 20 20 20 20 20 20  pr==pE ){.      
86e0: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
86f0: 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20   = pNew;.       
8700: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8710: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
8720: 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pExpr->op==TK_C
8730: 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
8740: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
8750: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d  m->pExpr->pLeft=
8760: 3d 70 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =pE );.         
8770: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70   pItem->pExpr->p
8780: 4c 65 66 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Left = pNew;.   
8790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
87a0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
87b0: 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  (db, pE);.      
87c0: 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72    pItem->u.x.iOr
87d0: 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
87e0: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49  iCol;.        pI
87f0: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20  tem->done = 1;. 
8800: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8810: 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31      moreToDo = 1
8820: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8830: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
8840: 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  elect->pNext;.  
8850: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
8860: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8870: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
8880: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
8890: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
88a0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
88b0: 61 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20  arse, "%r ORDER 
88c0: 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  BY term does not
88d0: 20 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20   match any ".   
88e0: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e           "column
88f0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8900: 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  et", i+1);.     
8910: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
8920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
8930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
8940: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
8950: 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
8960: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 70 4f  OUP BY clause pO
8970: 72 64 65 72 42 79 20 6f 66 0a 2a 2a 20 74 68 65  rderBy of.** the
8980: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8990: 74 20 70 53 65 6c 65 63 74 2e 20 20 49 66 20 61  t pSelect.  If a
89a0: 6e 79 20 74 65 72 6d 20 69 73 20 72 65 66 65 72  ny term is refer
89b0: 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 72 65 73  ence to a.** res
89c0: 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
89d0: 6f 6e 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65  on (as determine
89e0: 64 20 62 79 20 74 68 65 20 45 78 70 72 4c 69 73  d by the ExprLis
89f0: 74 2e 61 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  t.a.u.x.iOrderBy
8a00: 43 6f 6c 0a 2a 2a 20 66 69 65 6c 64 29 20 74 68  Col.** field) th
8a10: 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
8a20: 74 65 72 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79  term into a copy
8a30: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
8a40: 6e 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74  nding result set
8a50: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  .** column..**.*
8a60: 2a 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20  * If any errors 
8a70: 61 72 65 20 64 65 74 65 63 74 65 64 2c 20 61 64  are detected, ad
8a80: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
8a90: 67 65 20 74 6f 20 70 50 61 72 73 65 20 61 6e 64  ge to pParse and
8aa0: 0a 2a 2a 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** return non-z
8ab0: 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ero.  Return zer
8ac0: 6f 20 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 61  o if no errors a
8ad0: 72 65 20 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  re seen..*/.int 
8ae0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
8af0: 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61  derGroupBy(.  Pa
8b00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
8b10: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
8b20: 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65  ontext.  Leave e
8b30: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65  rror messages he
8b40: 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
8b50: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a  pSelect,      /*
8b60: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
8b70: 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  ement containing
8b80: 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20   the clause */. 
8b90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
8ba0: 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy,   /* The OR
8bb0: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
8bc0: 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  BY clause to be 
8bd0: 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63  processed */.  c
8be0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
8bf0: 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20       /* "ORDER" 
8c00: 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b  or "GROUP" */.){
8c10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
8c20: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
8c30: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  ->db;.  ExprList
8c40: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
8c50: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
8c60: 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20   *pItem;..  if( 
8c70: 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
8c80: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
8c90: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
8ca0: 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   0;.#if SQLITE_M
8cb0: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
8cc0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
8cd0: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
8ce0: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
8cf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8d00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8d10: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
8d20: 6e 20 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c  n %s BY clause",
8d30: 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74   zType);.    ret
8d40: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
8d50: 66 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65  f.  pEList = pSe
8d60: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
8d70: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
8d80: 30 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33  0 );  /* sqlite3
8d90: 53 65 6c 65 63 74 4e 65 77 28 29 20 67 75 61 72  SelectNew() guar
8da0: 61 6e 74 65 65 73 20 74 68 69 73 20 2a 2f 0a 20  antees this */. 
8db0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
8dc0: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70  pOrderBy->a; i<p
8dd0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8de0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
8df0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
8e00: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b  x.iOrderByCol ){
8e10: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
8e20: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
8e30: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
8e40: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c  ){.        resol
8e50: 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f  veOutOfRangeErro
8e60: 72 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c  r(pParse, zType,
8e70: 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45   i+1, pEList->nE
8e80: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  xpr);.        re
8e90: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
8ea0: 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69        resolveAli
8eb0: 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73  as(pParse, pELis
8ec0: 74 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  t, pItem->u.x.iO
8ed0: 72 64 65 72 42 79 43 6f 6c 2d 31 2c 20 70 49 74  rderByCol-1, pIt
8ee0: 65 6d 2d 3e 70 45 78 70 72 2c 20 7a 54 79 70 65  em->pExpr, zType
8ef0: 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ,0);.    }.  }. 
8f00: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8f10: 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20  .** pOrderBy is 
8f20: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
8f30: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69  ROUP BY clause i
8f40: 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  n SELECT stateme
8f50: 6e 74 20 70 53 65 6c 65 63 74 2e 0a 2a 2a 20 54  nt pSelect..** T
8f60: 68 65 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  he Name context 
8f70: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
8f80: 61 74 65 6d 65 6e 74 20 69 73 20 70 4e 43 2e 20  atement is pNC. 
8f90: 20 7a 54 79 70 65 20 69 73 20 65 69 74 68 65 72   zType is either
8fa0: 0a 2a 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22  .** "ORDER" or "
8fb0: 47 52 4f 55 50 22 20 64 65 70 65 6e 64 69 6e 67  GROUP" depending
8fc0: 20 6f 6e 20 77 68 69 63 68 20 74 79 70 65 20 6f   on which type o
8fd0: 66 20 63 6c 61 75 73 65 20 70 4f 72 64 65 72 42  f clause pOrderB
8fe0: 79 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  y is..**.** This
8ff0: 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65   routine resolve
9000: 73 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74  s each term of t
9010: 68 65 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61  he clause into a
9020: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
9030: 20 49 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79   If the order-by
9040: 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65   term is an inte
9050: 67 65 72 20 49 20 62 65 74 77 65 65 6e 20 31 20  ger I between 1 
9060: 61 6e 64 20 4e 20 28 77 68 65 72 65 20 4e 20 69  and N (where N i
9070: 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20  s the.** number 
9080: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
9090: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
90a0: 74 68 65 20 53 45 4c 45 43 54 29 20 74 68 65 6e  the SELECT) then
90b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
90c0: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 6f 6c 75  ** in the resolu
90d0: 74 69 6f 6e 20 69 73 20 61 20 63 6f 70 79 20 6f  tion is a copy o
90e0: 66 20 74 68 65 20 49 2d 74 68 20 72 65 73 75 6c  f the I-th resul
90f0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
9100: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 6f 72 64  .  If.** the ord
9110: 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61 6e  er-by term is an
9120: 20 69 64 65 6e 74 69 66 69 65 72 20 74 68 61 74   identifier that
9130: 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
9140: 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 0a 2a  the AS-name of.*
9150: 2a 20 61 20 72 65 73 75 6c 74 2d 73 65 74 20 65  * a result-set e
9160: 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20  xpression, then 
9170: 74 68 65 20 74 65 72 6d 20 72 65 73 6f 6c 76 65  the term resolve
9180: 73 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  s to a copy of t
9190: 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  he.** result-set
91a0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4f 74   expression.  Ot
91b0: 68 65 72 77 69 73 65 2c 20 74 68 65 20 65 78 70  herwise, the exp
91c0: 72 65 73 73 69 6f 6e 20 69 73 20 72 65 73 6f 6c  ression is resol
91d0: 76 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 73  ved in.** the us
91e0: 75 61 6c 20 77 61 79 20 2d 20 75 73 69 6e 67 20  ual way - using 
91f0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
9200: 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a  prNames()..**.**
9210: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
9220: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
9230: 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20   of errors.  If 
9240: 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 74 68  errors occur, th
9250: 65 6e 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  en.** an appropr
9260: 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61  iate error messa
9270: 67 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ge might be left
9280: 20 69 6e 20 70 50 61 72 73 65 2e 20 20 28 4f 4f   in pParse.  (OO
9290: 4d 20 65 72 72 6f 72 73 0a 2a 2a 20 65 78 63 65  M errors.** exce
92a0: 70 74 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  pted.).*/.static
92b0: 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64 65   int resolveOrde
92c0: 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65  rGroupBy(.  Name
92d0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
92e0: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f    /* The name co
92f0: 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c  ntext of the SEL
9300: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ECT statement */
9310: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
9320: 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct,      /* The 
9330: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9340: 20 68 6f 6c 64 69 6e 67 20 70 4f 72 64 65 72 42   holding pOrderB
9350: 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  y */.  ExprList 
9360: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
9370: 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  An ORDER BY or G
9380: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74  ROUP BY clause t
9390: 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 63  o resolve */.  c
93a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
93b0: 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22       /* Either "
93c0: 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50  ORDER" or "GROUP
93d0: 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74  ", as appropriat
93e0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  e */.){.  int i,
93f0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
9400: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9410: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69   counters */.  i
9420: 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20  nt iCol;        
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9440: 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a   Column number *
9450: 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  /.  struct ExprL
9460: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
9470: 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20     /* A term of 
9480: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
9490: 75 73 65 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  use */.  Parse *
94a0: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
94b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
94c0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
94d0: 69 6e 74 20 6e 52 65 73 75 6c 74 3b 20 20 20 20  int nResult;    
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
94f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
9500: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
9510: 73 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4f  set */..  if( pO
9520: 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75  rderBy==0 ) retu
9530: 72 6e 20 30 3b 0a 20 20 6e 52 65 73 75 6c 74 20  rn 0;.  nResult 
9540: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
9550: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 50 61 72  t->nExpr;.  pPar
9560: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
9570: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74  ;.  for(i=0, pIt
9580: 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
9590: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
95a0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
95b0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d  {.    Expr *pE =
95c0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
95d0: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 73     Expr *pE2 = s
95e0: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
95f0: 6c 6c 61 74 65 28 70 45 29 3b 0a 20 20 20 20 69  llate(pE);.    i
9600: 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47 27  f( zType[0]!='G'
9610: 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d   ){.      iCol =
9620: 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70   resolveAsName(p
9630: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e  Parse, pSelect->
9640: 70 45 4c 69 73 74 2c 20 70 45 32 29 3b 0a 20 20  pEList, pE2);.  
9650: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
9660: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
9670: 61 6e 20 41 53 2d 6e 61 6d 65 20 6d 61 74 63 68  an AS-name match
9680: 20 69 73 20 66 6f 75 6e 64 2c 20 6d 61 72 6b 20   is found, mark 
9690: 74 68 69 73 20 4f 52 44 45 52 20 42 59 20 63 6f  this ORDER BY co
96a0: 6c 75 6d 6e 20 61 73 20 62 65 69 6e 67 0a 20 20  lumn as being.  
96b0: 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20        ** a copy 
96c0: 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 72  of the iCol-th r
96d0: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
96e0: 2e 20 20 54 68 65 20 73 75 62 73 65 71 75 65 6e  .  The subsequen
96f0: 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20  t call to.      
9700: 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 6f    ** sqlite3Reso
9710: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
9720: 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  ) will convert t
9730: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
9740: 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f   a.        ** co
9750: 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  py of the iCol-t
9760: 68 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  h result-set exp
9770: 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ression. */.    
9780: 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
9790: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
97a0: 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  6)iCol;.        
97b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
97c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
97d0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
97e0: 65 67 65 72 28 70 45 32 2c 20 26 69 43 6f 6c 29  eger(pE2, &iCol)
97f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
9800: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69   ORDER BY term i
9810: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e  s an integer con
9820: 73 74 61 6e 74 2e 20 20 41 67 61 69 6e 2c 20 73  stant.  Again, s
9830: 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20  et the column.  
9840: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 73 6f      ** number so
9850: 20 74 68 61 74 20 73 71 6c 69 74 65 33 52 65 73   that sqlite3Res
9860: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
9870: 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  () will convert 
9880: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64  the.      ** ord
9890: 65 72 2d 62 79 20 74 65 72 6d 20 74 6f 20 61 20  er-by term to a 
98a0: 63 6f 70 79 20 6f 66 20 74 68 65 20 72 65 73 75  copy of the resu
98b0: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
98c0: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  n */.      if( i
98d0: 43 6f 6c 3c 31 20 7c 7c 20 69 43 6f 6c 3e 30 78  Col<1 || iCol>0x
98e0: 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
98f0: 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67  resolveOutOfRang
9900: 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a  eError(pParse, z
9910: 54 79 70 65 2c 20 69 2b 31 2c 20 6e 52 65 73 75  Type, i+1, nResu
9920: 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  lt);.        ret
9930: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
9940: 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
9950: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
9960: 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 63  16)iCol;.      c
9970: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
9980: 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65      /* Otherwise
9990: 2c 20 74 72 65 61 74 20 74 68 65 20 4f 52 44 45  , treat the ORDE
99a0: 52 20 42 59 20 74 65 72 6d 20 61 73 20 61 6e 20  R BY term as an 
99b0: 6f 72 64 69 6e 61 72 79 20 65 78 70 72 65 73 73  ordinary express
99c0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 49 74 65 6d  ion */.    pItem
99d0: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
99e0: 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  l = 0;.    if( s
99f0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
9a00: 72 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20  rNames(pNC, pE) 
9a10: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
9a20: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  1;.    }.    for
9a30: 28 6a 3d 30 3b 20 6a 3c 70 53 65 6c 65 63 74 2d  (j=0; j<pSelect-
9a40: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  >pEList->nExpr; 
9a50: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  j++){.      if( 
9a60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
9a70: 72 65 28 70 45 2c 20 70 53 65 6c 65 63 74 2d 3e  re(pE, pSelect->
9a80: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
9a90: 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  pr, -1)==0 ){.  
9aa0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
9ab0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 6a  .iOrderByCol = j
9ac0: 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
9ad0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  }.  }.  return s
9ae0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
9af0: 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65  erGroupBy(pParse
9b00: 2c 20 70 53 65 6c 65 63 74 2c 20 70 4f 72 64 65  , pSelect, pOrde
9b10: 72 42 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a  rBy, zType);.}..
9b20: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61  /*.** Resolve na
9b30: 6d 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43  mes in the SELEC
9b40: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 20 61 6e  T statement p an
9b50: 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 64 65 73  d all of its des
9b60: 63 65 6e 64 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61  cendents..*/.sta
9b70: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 53  tic int resolveS
9b80: 65 6c 65 63 74 53 74 65 70 28 57 61 6c 6b 65 72  electStep(Walker
9b90: 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63   *pWalker, Selec
9ba0: 74 20 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  t *p){.  NameCon
9bb0: 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20  text *pOuterNC; 
9bc0: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 74 68 61 74   /* Context that
9bd0: 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 53   contains this S
9be0: 45 4c 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43  ELECT */.  NameC
9bf0: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
9c00: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
9c10: 78 74 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43  xt of this SELEC
9c20: 54 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  T */.  int isCom
9c30: 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20 2f  pound;         /
9c40: 2a 20 54 72 75 65 20 69 66 20 70 20 69 73 20 61  * True if p is a
9c50: 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74   compound select
9c60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f   */.  int nCompo
9c70: 75 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  und;          /*
9c80: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f   Number of compo
9c90: 75 6e 64 20 74 65 72 6d 73 20 70 72 6f 63 65 73  und terms proces
9ca0: 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  sed so far */.  
9cb0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
9cc0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
9cd0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9ce0: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9cf0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
9d00: 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
9d10: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69   list */.  int i
9d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9d30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
9d40: 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  er */.  ExprList
9d50: 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20   *pGroupBy;     
9d60: 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59 20  /* The GROUP BY 
9d70: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65  clause */.  Sele
9d80: 63 74 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 20  ct *pLeftmost;  
9d90: 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74      /* Left-most
9da0: 20 6f 66 20 53 45 4c 45 43 54 20 6f 66 20 61 20   of SELECT of a 
9db0: 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 73 71  compound */.  sq
9dc0: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
9dd0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
9de0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
9df0: 20 20 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21    ..  assert( p!
9e00: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73  =0 );.  if( p->s
9e10: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
9e20: 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 72 65 74  olved ){.    ret
9e30: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
9e40: 20 7d 0a 20 20 70 4f 75 74 65 72 4e 43 20 3d 20   }.  pOuterNC = 
9e50: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
9e60: 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b    pParse = pWalk
9e70: 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62  er->pParse;.  db
9e80: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
9e90: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 73 71    /* Normally sq
9ea0: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
9eb0: 64 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  d() will be call
9ec0: 65 64 20 66 69 72 73 74 20 61 6e 64 20 77 69 6c  ed first and wil
9ed0: 6c 20 68 61 76 65 0a 20 20 2a 2a 20 61 6c 72 65  l have.  ** alre
9ee0: 61 64 79 20 65 78 70 61 6e 64 65 64 20 74 68 69  ady expanded thi
9ef0: 73 20 53 45 4c 45 43 54 2e 20 20 48 6f 77 65 76  s SELECT.  Howev
9f00: 65 72 2c 20 69 66 20 74 68 69 73 20 69 73 20 61  er, if this is a
9f10: 20 73 75 62 71 75 65 72 79 20 77 69 74 68 69 6e   subquery within
9f20: 0a 20 20 2a 2a 20 61 6e 20 65 78 70 72 65 73 73  .  ** an express
9f30: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 52 65 73 6f  ion, sqlite3Reso
9f40: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 77  lveExprNames() w
9f50: 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 77 69  ill be called wi
9f60: 74 68 6f 75 74 20 61 0a 20 20 2a 2a 20 70 72 69  thout a.  ** pri
9f70: 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  or call to sqlit
9f80: 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
9f90: 2e 20 20 57 68 65 6e 20 74 68 61 74 20 68 61 70  .  When that hap
9fa0: 70 65 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a 20 73  pens, let.  ** s
9fb0: 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70  qlite3SelectPrep
9fc0: 28 29 20 64 6f 20 61 6c 6c 20 6f 66 20 74 68 65  () do all of the
9fd0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
9fe0: 74 68 69 73 20 53 45 4c 45 43 54 2e 0a 20 20 2a  this SELECT..  *
9ff0: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  * sqlite3SelectP
a000: 72 65 70 28 29 20 77 69 6c 6c 20 69 6e 76 6f 6b  rep() will invok
a010: 65 20 62 6f 74 68 20 73 71 6c 69 74 65 33 53 65  e both sqlite3Se
a020: 6c 65 63 74 45 78 70 61 6e 64 28 29 20 61 6e 64  lectExpand() and
a030: 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .  ** this routi
a040: 6e 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  ne in the correc
a050: 74 20 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20  t order..  */.  
a060: 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73  if( (p->selFlags
a070: 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29 3d   & SF_Expanded)=
a080: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
a090: 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61 72  3SelectPrep(pPar
a0a0: 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29  se, p, pOuterNC)
a0b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 70 50  ;.    return (pP
a0c0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
a0d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20  ->mallocFailed) 
a0e0: 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52  ? WRC_Abort : WR
a0f0: 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20  C_Prune;.  }..  
a100: 69 73 43 6f 6d 70 6f 75 6e 64 20 3d 20 70 2d 3e  isCompound = p->
a110: 70 50 72 69 6f 72 21 3d 30 3b 0a 20 20 6e 43 6f  pPrior!=0;.  nCo
a120: 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 70 4c  mpound = 0;.  pL
a130: 65 66 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 77  eftmost = p;.  w
a140: 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 61  hile( p ){.    a
a150: 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
a160: 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
a170: 64 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  d)!=0 );.    ass
a180: 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
a190: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29  s & SF_Resolved)
a1a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 73 65  ==0 );.    p->se
a1b0: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 73  lFlags |= SF_Res
a1c0: 6f 6c 76 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 52  olved;..    /* R
a1d0: 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65  esolve the expre
a1e0: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49  ssions in the LI
a1f0: 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63  MIT and OFFSET c
a200: 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20  lauses. These.  
a210: 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c    ** are not all
a220: 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f  owed to refer to
a230: 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70   any names, so p
a240: 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d  ass an empty Nam
a250: 65 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f  eContext..    */
a260: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
a270: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
a280: 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73  );.    sNC.pPars
a290: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20  e = pParse;.    
a2a0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
a2b0: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
a2c0: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c 0a  , p->pLimit) ||.
a2d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
a2e0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
a2f0: 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65 74  &sNC, p->pOffset
a300: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
a310: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
a320: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 63   }.  .    /* Rec
a330: 75 72 73 69 76 65 6c 79 20 72 65 73 6f 6c 76 65  ursively resolve
a340: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73 75   names in all su
a350: 62 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2f 0a  bqueries.    */.
a360: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a370: 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  ->pSrc->nSrc; i+
a380: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
a390: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
a3a0: 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d  Item = &p->pSrc-
a3b0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  >a[i];.      if(
a3c0: 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
a3d0: 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43  ){.        NameC
a3e0: 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20  ontext *pNC;    
a3f0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
a400: 69 74 65 72 61 74 65 20 6e 61 6d 65 20 63 6f 6e  iterate name con
a410: 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  texts */.       
a420: 20 69 6e 74 20 6e 52 65 66 20 3d 20 30 3b 20 20   int nRef = 0;  
a430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
a440: 66 63 6f 75 6e 74 20 66 6f 72 20 70 4f 75 74 65  fcount for pOute
a450: 72 4e 43 20 61 6e 64 20 6f 75 74 65 72 20 63 6f  rNC and outer co
a460: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntexts */.      
a470: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
a480: 61 76 65 64 43 6f 6e 74 65 78 74 20 3d 20 70 50  avedContext = pP
a490: 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
a4a0: 78 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  xt;..        /* 
a4b0: 43 6f 75 6e 74 20 74 68 65 20 74 6f 74 61 6c 20  Count the total 
a4c0: 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
a4d0: 6e 63 65 73 20 74 6f 20 70 4f 75 74 65 72 4e 43  nces to pOuterNC
a4e0: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 0a   and all of its.
a4f0: 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e          ** paren
a500: 74 20 63 6f 6e 74 65 78 74 73 2e 20 41 66 74 65  t contexts. Afte
a510: 72 20 72 65 73 6f 6c 76 69 6e 67 20 72 65 66 65  r resolving refe
a520: 72 65 6e 63 65 73 20 74 6f 20 65 78 70 72 65 73  rences to expres
a530: 73 69 6f 6e 73 20 69 6e 0a 20 20 20 20 20 20 20  sions in.       
a540: 20 2a 2a 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65   ** pItem->pSele
a550: 63 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 69  ct, check if thi
a560: 73 20 76 61 6c 75 65 20 68 61 73 20 63 68 61 6e  s value has chan
a570: 67 65 64 2e 20 49 66 20 73 6f 2c 20 74 68 65 6e  ged. If so, then
a580: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  .        ** SELE
a590: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 49 74  CT statement pIt
a5a0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 6d 75 73 74  em->pSelect must
a5b0: 20 62 65 20 63 6f 72 72 65 6c 61 74 65 64 2e 20   be correlated. 
a5c0: 53 65 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  Set the.        
a5d0: 2a 2a 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72  ** pItem->isCorr
a5e0: 65 6c 61 74 65 64 20 66 6c 61 67 20 69 66 20 74  elated flag if t
a5f0: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
a600: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
a610: 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e  pNC=pOuterNC; pN
a620: 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78  C; pNC=pNC->pNex
a630: 74 29 20 6e 52 65 66 20 2b 3d 20 70 4e 43 2d 3e  t) nRef += pNC->
a640: 6e 52 65 66 3b 0a 0a 20 20 20 20 20 20 20 20 69  nRef;..        i
a650: 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
a660: 29 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  ) pParse->zAuthC
a670: 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e  ontext = pItem->
a680: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73  zName;.        s
a690: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
a6a0: 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
a6b0: 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
a6c0: 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20   pOuterNC);.    
a6d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
a6e0: 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
a6f0: 64 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  dContext;.      
a700: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
a710: 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
a720: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
a730: 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20  WRC_Abort;..    
a740: 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74      for(pNC=pOut
a750: 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70  erNC; pNC; pNC=p
a760: 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66 20  NC->pNext) nRef 
a770: 2d 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20  -= pNC->nRef;.  
a780: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
a790: 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  tem->isCorrelate
a7a0: 64 3d 3d 30 20 26 26 20 6e 52 65 66 3c 3d 30 20  d==0 && nRef<=0 
a7b0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  );.        pItem
a7c0: 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d  ->isCorrelated =
a7d0: 20 28 6e 52 65 66 21 3d 30 29 3b 0a 20 20 20 20   (nRef!=0);.    
a7e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
a7f0: 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c   /* Set up the l
a800: 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78  ocal name-contex
a810: 74 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c  t to pass to sql
a820: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
a830: 61 6d 65 73 28 29 20 74 6f 0a 20 20 20 20 2a 2a  ames() to.    **
a840: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 72 65 73   resolve the res
a850: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
a860: 6f 6e 20 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a  on list..    */.
a870: 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
a880: 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20  = NC_AllowAgg;. 
a890: 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
a8a0: 67 73 20 26 20 53 46 5f 52 65 63 75 72 73 69 76  gs & SF_Recursiv
a8b0: 65 20 29 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20  e ) sNC.ncFlags 
a8c0: 7c 3d 20 4e 43 5f 52 65 63 75 72 73 69 76 65 3b  |= NC_Recursive;
a8d0: 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
a8e0: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
a8f0: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75   sNC.pNext = pOu
a900: 74 65 72 4e 43 3b 0a 20 20 0a 20 20 20 20 2f 2a  terNC;.  .    /*
a910: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
a920: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
a930: 2e 20 2a 2f 0a 20 20 20 20 70 45 4c 69 73 74 20  . */.    pEList 
a940: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
a950: 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21   assert( pEList!
a960: 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  =0 );.    for(i=
a970: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
a980: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
a990: 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73  Expr *pX = pELis
a9a0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
a9b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a9c0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
a9d0: 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20  (&sNC, pX) ){.  
a9e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
a9f0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
aa00: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
aa10: 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  If there are no 
aa20: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
aa30: 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ons in the resul
aa40: 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52  t-set, and no GR
aa50: 4f 55 50 20 42 59 20 0a 20 20 20 20 2a 2a 20 65  OUP BY .    ** e
aa60: 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f  xpression, do no
aa70: 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74  t allow aggregat
aa80: 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65  es in any of the
aa90: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
aaa0: 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ns..    */.    a
aab0: 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
aac0: 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61  ags & SF_Aggrega
aad0: 74 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 47  te)==0 );.    pG
aae0: 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f  roupBy = p->pGro
aaf0: 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 70 47  upBy;.    if( pG
ab00: 72 6f 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e 6e  roupBy || (sNC.n
ab10: 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41  cFlags & NC_HasA
ab20: 67 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  gg)!=0 ){.      
ab30: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53  p->selFlags |= S
ab40: 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20  F_Aggregate;.   
ab50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 4e   }else{.      sN
ab60: 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43  C.ncFlags &= ~NC
ab70: 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 7d  _AllowAgg;.    }
ab80: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  .  .    /* If a 
ab90: 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73  HAVING clause is
aba0: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74   present, then t
abb0: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 47  here must be a G
abc0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
abd0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
abe0: 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70 47  ->pHaving && !pG
abf0: 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20  roupBy ){.      
ac00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ac10: 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50  pParse, "a GROUP
ac20: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65   BY clause is re
ac30: 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41  quired before HA
ac40: 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 72 65  VING");.      re
ac50: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
ac60: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
ac70: 41 64 64 20 74 68 65 20 6f 75 74 70 75 74 20 63  Add the output c
ac80: 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 74 68  olumn list to th
ac90: 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62  e name-context b
aca0: 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68  efore parsing th
acb0: 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 65  e.    ** other e
acc0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
acd0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
ace0: 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74  nt. This is so t
acf0: 68 61 74 0a 20 20 20 20 2a 2a 20 65 78 70 72 65  hat.    ** expre
ad00: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
ad10: 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e  ERE clause (etc.
ad20: 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65  ) can refer to e
ad30: 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20  xpressions by.  
ad40: 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20    ** aliases in 
ad50: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
ad60: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4d 69      **.    ** Mi
ad70: 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68  nor point: If th
ad80: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
ad90: 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73  then the express
ada0: 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ion will be.    
adb0: 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20  ** re-evaluated 
adc0: 66 6f 72 20 65 61 63 68 20 72 65 66 65 72 65 6e  for each referen
add0: 63 65 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ce to it..    */
ade0: 0a 20 20 20 20 73 4e 43 2e 70 45 4c 69 73 74 20  .    sNC.pEList 
adf0: 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  = p->pEList;.   
ae00: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
ae10: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
ae20: 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29  C, p->pHaving) )
ae30: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
ae40: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
ae50: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
ae60: 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65  es(&sNC, p->pWhe
ae70: 72 65 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  re) ) return WRC
ae80: 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 2f 2a 20  _Abort;..    /* 
ae90: 54 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64  The ORDER BY and
aea0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
aeb0: 73 20 6d 61 79 20 6e 6f 74 20 72 65 66 65 72 20  s may not refer 
aec0: 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20 20 20 20  to terms in.    
aed0: 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 69 65 73  ** outer queries
aee0: 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43   .    */.    sNC
aef0: 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  .pNext = 0;.    
af00: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  sNC.ncFlags |= N
af10: 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 0a 20 20 20  C_AllowAgg;..   
af20: 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
af30: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
af40: 66 6f 72 20 73 69 6e 67 6c 65 74 6f 6e 20 53 45  for singleton SE
af50: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e  LECT statements.
af60: 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 52 44 45  .    ** The ORDE
af70: 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20  R BY clause for 
af80: 63 6f 6d 70 6f 75 6e 64 73 20 53 45 4c 45 43 54  compounds SELECT
af90: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 68   statements is h
afa0: 61 6e 64 6c 65 64 0a 20 20 20 20 2a 2a 20 62 65  andled.    ** be
afb0: 6c 6f 77 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f  low, after all o
afc0: 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  f the result-set
afd0: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
afe0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 20 20 20   elements of.   
aff0: 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
b000: 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c   have been resol
b010: 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ved..    */.    
b020: 69 66 28 20 21 69 73 43 6f 6d 70 6f 75 6e 64 20  if( !isCompound 
b030: 26 26 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47  && resolveOrderG
b040: 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20  roupBy(&sNC, p, 
b050: 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52  p->pOrderBy, "OR
b060: 44 45 52 22 29 20 29 7b 0a 20 20 20 20 20 20 72  DER") ){.      r
b070: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
b080: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
b090: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b0a0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b0b0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
b0c0: 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c  .  .    /* Resol
b0d0: 76 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  ve the GROUP BY 
b0e0: 63 6c 61 75 73 65 2e 20 20 41 74 20 74 68 65 20  clause.  At the 
b0f0: 73 61 6d 65 20 74 69 6d 65 2c 20 6d 61 6b 65 20  same time, make 
b100: 73 75 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  sure .    ** the
b110: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
b120: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
b130: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
b140: 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tions..    */.  
b150: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
b160: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
b170: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
b180: 74 65 6d 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  tem;.    .      
b190: 69 66 28 20 72 65 73 6f 6c 76 65 4f 72 64 65 72  if( resolveOrder
b1a0: 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2c  GroupBy(&sNC, p,
b1b0: 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f 55   pGroupBy, "GROU
b1c0: 50 22 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  P") || db->mallo
b1d0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
b1e0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
b1f0: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
b200: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
b210: 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69  m=pGroupBy->a; i
b220: 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
b230: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
b240: 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
b250: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 74  rHasProperty(pIt
b260: 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67  em->pExpr, EP_Ag
b270: 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g) ){.          
b280: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
b290: 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61  pParse, "aggrega
b2a0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  te functions are
b2b0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
b2c0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
b2d0: 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c  "the GROUP BY cl
b2e0: 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ause");.        
b2f0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
b300: 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rt;.        }.  
b310: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
b320: 69 66 28 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20  if( sNC.ncFlags 
b330: 26 20 4e 43 5f 55 73 65 73 4c 65 76 65 6c 20 29  & NC_UsesLevel )
b340: 7b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c  {.      p->selFl
b350: 61 67 73 20 7c 3d 20 53 46 5f 55 73 65 73 4c 65  ags |= SF_UsesLe
b360: 76 65 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  vel;.    }.    s
b370: 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28  NC.ncFlags &= ~(
b380: 4e 43 5f 52 65 63 75 72 73 69 76 65 7c 4e 43 5f  NC_Recursive|NC_
b390: 55 73 65 73 4c 65 76 65 6c 29 3b 0a 0a 20 20 20  UsesLevel);..   
b3a0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74   /* Advance to t
b3b0: 68 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 66 20  he next term of 
b3c0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 20  the compound.   
b3d0: 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   */.    p = p->p
b3e0: 50 72 69 6f 72 3b 0a 20 20 20 20 6e 43 6f 6d 70  Prior;.    nComp
b3f0: 6f 75 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  ound++;.  }..  /
b400: 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 4f 52  * Resolve the OR
b410: 44 45 52 20 42 59 20 6f 6e 20 61 20 63 6f 6d 70  DER BY on a comp
b420: 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 66 74 65  ound SELECT afte
b430: 72 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 0a 20  r all terms of. 
b440: 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   ** the compound
b450: 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c   have been resol
b460: 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ved..  */.  if( 
b470: 69 73 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65  isCompound && re
b480: 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64  solveCompoundOrd
b490: 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 4c 65  erBy(pParse, pLe
b4a0: 66 74 6d 6f 73 74 29 20 29 7b 0a 20 20 20 20 72  ftmost) ){.    r
b4b0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
b4c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57  .  }..  return W
b4d0: 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a  RC_Prune;.}../*.
b4e0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b4f0: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
b500: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
b510: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
b520: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
b530: 75 6d 6e 73 20 61 6e 64 20 72 65 73 75 6c 74 2d  umns and result-
b540: 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 41 74  set columns.  At
b550: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20   the same time, 
b560: 64 6f 20 65 72 72 6f 72 0a 2a 2a 20 63 68 65 63  do error.** chec
b570: 6b 69 6e 67 20 6f 6e 20 66 75 6e 63 74 69 6f 6e  king on function
b580: 20 75 73 61 67 65 20 61 6e 64 20 73 65 74 20 61   usage and set a
b590: 20 66 6c 61 67 20 69 66 20 61 6e 79 20 61 67 67   flag if any agg
b5a0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
b5b0: 0a 2a 2a 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2a  .** are seen..**
b5c0: 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 74  .** To resolve t
b5d0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 72 65 66  able columns ref
b5e0: 65 72 65 6e 63 65 73 20 77 65 20 6c 6f 6f 6b 20  erences we look 
b5f0: 66 6f 72 20 6e 6f 64 65 73 20 28 6f 72 20 73 75  for nodes (or su
b600: 62 74 72 65 65 73 29 20 6f 66 20 74 68 65 20 0a  btrees) of the .
b610: 2a 2a 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72  ** form X.Y.Z or
b620: 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 20 77   Y.Z or just Z w
b630: 68 65 72 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  here.**.**      
b640: 58 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66  X:   The name of
b650: 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 45 78   a database.  Ex
b660: 3a 20 20 22 6d 61 69 6e 22 20 6f 72 20 22 74 65  :  "main" or "te
b670: 6d 70 22 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  mp" or.**       
b680: 20 20 20 20 74 68 65 20 73 79 6d 62 6f 6c 69 63      the symbolic
b690: 20 6e 61 6d 65 20 61 73 73 69 67 6e 65 64 20 74   name assigned t
b6a0: 6f 20 61 6e 20 41 54 54 41 43 48 2d 65 64 20 64  o an ATTACH-ed d
b6b0: 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
b6c0: 20 20 20 20 59 3a 20 20 20 54 68 65 20 6e 61 6d      Y:   The nam
b6d0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20  e of a table in 
b6e0: 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  a FROM clause.  
b6f0: 4f 72 20 69 6e 20 61 20 74 72 69 67 67 65 72 0a  Or in a trigger.
b700: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65  **           one
b710: 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
b720: 6e 61 6d 65 73 20 22 6f 6c 64 22 20 6f 72 20 22  names "old" or "
b730: 6e 65 77 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  new"..**.**     
b740: 20 5a 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f   Z:   The name o
b750: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61  f a column in ta
b760: 62 6c 65 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ble Y..**.** The
b770: 20 6e 6f 64 65 20 61 74 20 74 68 65 20 72 6f 6f   node at the roo
b780: 74 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65  t of the subtree
b790: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 61 73 20   is modified as 
b7a0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
b7b0: 20 20 45 78 70 72 2e 6f 70 20 20 20 20 20 20 20    Expr.op       
b7c0: 20 43 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   Changed to TK_C
b7d0: 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 45 78 70 72  OLUMN.**    Expr
b7e0: 2e 70 54 61 62 20 20 20 20 20 20 50 6f 69 6e 74  .pTab      Point
b7f0: 73 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f  s to the Table o
b800: 62 6a 65 63 74 20 66 6f 72 20 58 2e 59 0a 2a 2a  bject for X.Y.**
b810: 20 20 20 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e      Expr.iColumn
b820: 20 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 69 6e     The column in
b830: 64 65 78 20 69 6e 20 58 2e 59 2e 20 20 2d 31 20  dex in X.Y.  -1 
b840: 66 6f 72 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a  for the rowid..*
b850: 2a 20 20 20 20 45 78 70 72 2e 69 54 61 62 6c 65  *    Expr.iTable
b860: 20 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72      The VDBE cur
b870: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 58  sor number for X
b880: 2e 59 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20 72  .Y.**.**.** To r
b890: 65 73 6f 6c 76 65 20 72 65 73 75 6c 74 2d 73 65  esolve result-se
b8a0: 74 20 72 65 66 65 72 65 6e 63 65 73 2c 20 6c 6f  t references, lo
b8b0: 6f 6b 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f  ok for expressio
b8c0: 6e 20 6e 6f 64 65 73 20 6f 66 20 74 68 65 0a 2a  n nodes of the.*
b8d0: 2a 20 66 6f 72 6d 20 5a 20 28 77 69 74 68 20 6e  * form Z (with n
b8e0: 6f 20 58 20 61 6e 64 20 59 20 70 72 65 66 69 78  o X and Y prefix
b8f0: 29 20 77 68 65 72 65 20 74 68 65 20 5a 20 6d 61  ) where the Z ma
b900: 74 63 68 65 73 20 74 68 65 20 72 69 67 68 74 2d  tches the right-
b910: 68 61 6e 64 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  hand.** size of 
b920: 61 6e 20 41 53 20 63 6c 61 75 73 65 20 69 6e 20  an AS clause in 
b930: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 6f  the result-set o
b940: 66 20 61 20 53 45 4c 45 43 54 2e 20 20 54 68 65  f a SELECT.  The
b950: 20 5a 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a   Z expression.**
b960: 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
b970: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 65  a copy of the le
b980: 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft-hand side of 
b990: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65  the result-set e
b9a0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 61  xpression..** Ta
b9b0: 62 6c 65 2d 6e 61 6d 65 20 61 6e 64 20 66 75 6e  ble-name and fun
b9c0: 63 74 69 6f 6e 20 72 65 73 6f 6c 75 74 69 6f 6e  ction resolution
b9d0: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 73   occurs on the s
b9e0: 75 62 73 74 69 74 75 74 65 64 20 65 78 70 72 65  ubstituted expre
b9f0: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 20 20  ssion.** tree.  
ba00: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 3a  For example, in:
ba10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45  .**.**      SELE
ba20: 43 54 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64  CT a+b AS x, c+d
ba30: 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52   AS y FROM t1 OR
ba40: 44 45 52 20 42 59 20 78 3b 0a 2a 2a 0a 2a 2a 20  DER BY x;.**.** 
ba50: 54 68 65 20 22 78 22 20 74 65 72 6d 20 6f 66 20  The "x" term of 
ba60: 74 68 65 20 6f 72 64 65 72 20 62 79 20 69 73 20  the order by is 
ba70: 72 65 70 6c 61 63 65 64 20 62 79 20 22 61 2b 62  replaced by "a+b
ba80: 22 20 74 6f 20 72 65 6e 64 65 72 3a 0a 2a 2a 0a  " to render:.**.
ba90: 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61  **      SELECT a
baa0: 2b 62 20 41 53 20 78 2c 20 63 2b 64 20 41 53 20  +b AS x, c+d AS 
bab0: 79 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  y FROM t1 ORDER 
bac0: 42 59 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46 75  BY a+b;.**.** Fu
bad0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 61 72 65  nction calls are
bae0: 20 63 68 65 63 6b 65 64 20 74 6f 20 6d 61 6b 65   checked to make
baf0: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 66   sure that the f
bb00: 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 64  unction is .** d
bb10: 65 66 69 6e 65 64 20 61 6e 64 20 74 68 61 74 20  efined and that 
bb20: 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
bb30: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
bb40: 61 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  are specified..*
bb50: 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f  * If the functio
bb60: 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  n is an aggregat
bb70: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  e function, then
bb80: 20 74 68 65 20 4e 43 5f 48 61 73 41 67 67 20 66   the NC_HasAgg f
bb90: 6c 61 67 20 69 73 0a 2a 2a 20 73 65 74 20 61 6e  lag is.** set an
bba0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  d the opcode is 
bbb0: 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 54 4b 5f  changed from TK_
bbc0: 46 55 4e 43 54 49 4f 4e 20 74 6f 20 54 4b 5f 41  FUNCTION to TK_A
bbd0: 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2a 20  GG_FUNCTION..** 
bbe0: 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
bbf0: 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67   contains aggreg
bc00: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ate functions th
bc10: 65 6e 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a  en the EP_Agg.**
bc20: 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65   property on the
bc30: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73   expression is s
bc40: 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 72 72  et..**.** An err
bc50: 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65  or message is le
bc60: 66 74 20 69 6e 20 70 50 61 72 73 65 20 69 66 20  ft in pParse if 
bc70: 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73  anything is amis
bc80: 73 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  s.  The number.*
bc90: 2a 20 69 66 20 65 72 72 6f 72 73 20 69 73 20 72  * if errors is r
bca0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
bcb0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
bcc0: 70 72 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65  prNames( .  Name
bcd0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
bce0: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
bcf0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72   to resolve expr
bd00: 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20  essions in. */. 
bd10: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
bd20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
bd30: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
bd40: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
bd50: 0a 20 20 75 38 20 73 61 76 65 64 48 61 73 41 67  .  u8 savedHasAg
bd60: 67 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a  g;.  Walker w;..
bd70: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
bd80: 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53   return 0;.#if S
bd90: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
bda0: 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20 20 50  EPTH>0.  {.    P
bdb0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
bdc0: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  NC->pParse;.    
bdd0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
bde0: 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73  heckHeight(pPars
bdf0: 65 2c 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68  e, pExpr->nHeigh
be00: 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e  t+pNC->pParse->n
be10: 48 65 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  Height) ){.     
be20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
be30: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65  .    pParse->nHe
be40: 69 67 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e  ight += pExpr->n
be50: 48 65 69 67 68 74 3b 0a 20 20 7d 0a 23 65 6e 64  Height;.  }.#end
be60: 69 66 0a 20 20 73 61 76 65 64 48 61 73 41 67 67  if.  savedHasAgg
be70: 20 3d 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20   = pNC->ncFlags 
be80: 26 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20 70  & NC_HasAgg;.  p
be90: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  NC->ncFlags &= ~
bea0: 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20 6d 65 6d  NC_HasAgg;.  mem
beb0: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
bec0: 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
bed0: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
bee0: 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e  veExprStep;.  w.
bef0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
bf00: 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  = resolveSelectS
bf10: 74 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  tep;.  w.pParse 
bf20: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
bf30: 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
bf40: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
bf50: 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 23 69  r(&w, pExpr);.#i
bf60: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
bf70: 52 5f 44 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d  R_DEPTH>0.  pNC-
bf80: 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74  >pParse->nHeight
bf90: 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67   -= pExpr->nHeig
bfa0: 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ht;.#endif.  if(
bfb0: 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20   pNC->nErr>0 || 
bfc0: 77 2e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  w.pParse->nErr>0
bfd0: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
bfe0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
bff0: 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20  P_Error);.  }.  
c000: 69 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  if( pNC->ncFlags
c010: 20 26 20 4e 43 5f 48 61 73 41 67 67 20 29 7b 0a   & NC_HasAgg ){.
c020: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
c030: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67  rty(pExpr, EP_Ag
c040: 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  g);.  }else if( 
c050: 73 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20  savedHasAgg ){. 
c060: 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20     pNC->ncFlags 
c070: 7c 3d 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20  |= NC_HasAgg;.  
c080: 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72 48  }.  return ExprH
c090: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
c0a0: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a  , EP_Error);.}..
c0b0: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 61  ./*.** Resolve a
c0c0: 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ll names in all 
c0d0: 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 61  expressions of a
c0e0: 20 53 45 4c 45 43 54 20 61 6e 64 20 69 6e 20 61   SELECT and in a
c0f0: 6c 6c 0a 2a 2a 20 64 65 63 65 6e 64 65 6e 74 73  ll.** decendents
c100: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2c 20   of the SELECT, 
c110: 69 6e 63 6c 75 64 69 6e 67 20 63 6f 6d 70 6f 75  including compou
c120: 6e 64 73 20 6f 66 66 20 6f 66 20 70 2d 3e 70 50  nds off of p->pP
c130: 72 69 6f 72 2c 0a 2a 2a 20 73 75 62 71 75 65 72  rior,.** subquer
c140: 69 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  ies in expressio
c150: 6e 73 2c 20 61 6e 64 20 73 75 62 71 75 65 72 69  ns, and subqueri
c160: 65 73 20 75 73 65 64 20 61 73 20 46 52 4f 4d 20  es used as FROM 
c170: 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 2e  clause.** terms.
c180: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 73 71 6c 69 74  .**.** See sqlit
c190: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
c1a0: 65 73 28 29 20 66 6f 72 20 61 20 64 65 73 63 72  es() for a descr
c1b0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6b 69  iption of the ki
c1c0: 6e 64 73 20 6f 66 0a 2a 2a 20 74 72 61 6e 73 66  nds of.** transf
c1d0: 6f 72 6d 61 74 69 6f 6e 73 20 74 68 61 74 20 6f  ormations that o
c1e0: 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ccur..**.** All 
c1f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c200: 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  s should have be
c210: 65 6e 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e  en expanded usin
c220: 67 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65  g.** sqlite3Sele
c230: 63 74 45 78 70 61 6e 64 28 29 20 70 72 69 6f 72  ctExpand() prior
c240: 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69   to invoking thi
c250: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f  s routine..*/.vo
c260: 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  id sqlite3Resolv
c270: 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 0a 20 20  eSelectNames(.  
c280: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
c290: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
c2a0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
c2b0: 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20    Select *p,    
c2c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
c2d0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c2e0: 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f   being coded. */
c2f0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
c300: 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d  pOuterNC  /* Nam
c310: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 61  e context for pa
c320: 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74  rent SELECT stat
c330: 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 57 61  ement */.){.  Wa
c340: 6c 6b 65 72 20 77 3b 0a 0a 20 20 61 73 73 65 72  lker w;..  asser
c350: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 6d 65 6d  t( p!=0 );.  mem
c360: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
c370: 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72  f(w));.  w.xExpr
c380: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
c390: 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e  veExprStep;.  w.
c3a0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
c3b0: 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  = resolveSelectS
c3c0: 74 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  tep;.  w.pParse 
c3d0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 75 2e  = pParse;.  w.u.
c3e0: 70 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a  pNC = pOuterNC;.
c3f0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
c400: 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 0a 2f  ect(&w, p);.}../
c410: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d  *.** Resolve nam
c420: 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
c430: 73 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  s that can only 
c440: 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
c450: 6c 65 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20  le table:.**.** 
c460: 20 20 20 2a 20 20 20 43 48 45 43 4b 20 63 6f 6e     *   CHECK con
c470: 73 74 72 61 69 6e 74 73 0a 2a 2a 20 20 20 20 2a  straints.**    *
c480: 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 73     WHERE clauses
c490: 20 6f 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 69   on partial indi
c4a0: 63 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  ces.**.** The Ex
c4b0: 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75 65 20  pr.iTable value 
c4c0: 66 6f 72 20 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f  for Expr.op==TK_
c4d0: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 6f 66 20  COLUMN nodes of 
c4e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
c4f0: 2a 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 61  * is set to -1 a
c500: 6e 64 20 74 68 65 20 45 78 70 72 2e 69 43 6f 6c  nd the Expr.iCol
c510: 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 73 65 74  umn value is set
c520: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   to the column n
c530: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  umber..**.** Any
c540: 20 65 72 72 6f 72 73 20 63 61 75 73 65 20 61 6e   errors cause an
c550: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
c560: 6f 20 62 65 20 73 65 74 20 69 6e 20 70 50 61 72  o be set in pPar
c570: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
c580: 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
c590: 66 65 72 65 6e 63 65 28 0a 20 20 50 61 72 73 65  ference(.  Parse
c5a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
c5b0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
c5c0: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
c5d0: 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ab,        /* Th
c5e0: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 72 65  e table being re
c5f0: 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  ferenced */.  in
c600: 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  t type,         
c610: 20 20 2f 2a 20 4e 43 5f 49 73 43 68 65 63 6b 20    /* NC_IsCheck 
c620: 6f 72 20 4e 43 5f 50 61 72 74 49 64 78 20 2a 2f  or NC_PartIdx */
c630: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
c640: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
c650: 73 69 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65 2e  sion to resolve.
c660: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a    May be NULL. *
c670: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
c680: 69 73 74 20 20 20 20 20 2f 2a 20 45 78 70 72 65  ist     /* Expre
c690: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72 65  ssion list to re
c6a0: 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e  solve.  May be N
c6b0: 55 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c  UL. */.){.  SrcL
c6c0: 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20  ist sSrc;       
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c6e0: 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20  ake SrcList for 
c6f0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c700: 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  e */.  NameConte
c710: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
c720: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
c730: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
c740: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
c750: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c780: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
c790: 74 79 70 65 3d 3d 4e 43 5f 49 73 43 68 65 63 6b  type==NC_IsCheck
c7a0: 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f 50 61 72   || type==NC_Par
c7b0: 74 49 64 78 20 29 3b 0a 20 20 6d 65 6d 73 65 74  tIdx );.  memset
c7c0: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
c7d0: 28 73 4e 43 29 29 3b 0a 20 20 6d 65 6d 73 65 74  (sNC));.  memset
c7e0: 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f  (&sSrc, 0, sizeo
c7f0: 66 28 73 53 72 63 29 29 3b 0a 20 20 73 53 72 63  f(sSrc));.  sSrc
c800: 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 73 53 72  .nSrc = 1;.  sSr
c810: 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70  c.a[0].zName = p
c820: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 53  Tab->zName;.  sS
c830: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
c840: 54 61 62 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d  Tab;.  sSrc.a[0]
c850: 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
c860: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
c870: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63  arse;.  sNC.pSrc
c880: 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20  List = &sSrc;.  
c890: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74 79  sNC.ncFlags = ty
c8a0: 70 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  pe;.  if( sqlite
c8b0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
c8c0: 73 28 26 73 4e 43 2c 20 70 45 78 70 72 29 20 29  s(&sNC, pExpr) )
c8d0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
c8e0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
c8f0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
c900: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
c910: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
c920: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
c930: 43 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  C, pList->a[i].p
c940: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
c950: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d   return;.      }
c960: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a           .    }.  }.}.