/ Hex Artifact Content
Login

Artifact 8a2b6b9a6487e6e5a23b8de571131ccce62a1ce0:


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 69 66 28 20 70 45 4c 69  rn;.    if( pELi
1050: 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41 6c 69  st->a[iCol].iAli
1060: 61 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  as==0 ){.      p
1070: 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 69  EList->a[iCol].i
1080: 41 6c 69 61 73 20 3d 20 28 75 31 36 29 28 2b 2b  Alias = (u16)(++
1090: 70 50 61 72 73 65 2d 3e 6e 41 6c 69 61 73 29 3b  pParse->nAlias);
10a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 75 70 2d  .    }.    pDup-
10b0: 3e 69 54 61 62 6c 65 20 3d 20 70 45 4c 69 73 74  >iTable = pEList
10c0: 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41 6c 69 61 73  ->a[iCol].iAlias
10d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70  ;.  }.  if( pExp
10e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  r->op==TK_COLLAT
10f0: 45 20 29 7b 0a 20 20 20 20 70 44 75 70 20 3d 20  E ){.    pDup = 
1100: 73 71 6c 69 74 65 33 45 78 70 72 41 64 64 43 6f  sqlite3ExprAddCo
1110: 6c 6c 61 74 65 53 74 72 69 6e 67 28 70 50 61 72  llateString(pPar
1120: 73 65 2c 20 70 44 75 70 2c 20 70 45 78 70 72 2d  se, pDup, pExpr-
1130: 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a  >u.zToken);.  }.
1140: 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 63 61 6c  .  /* Before cal
1150: 6c 69 6e 67 20 73 71 6c 69 74 65 33 45 78 70 72  ling sqlite3Expr
1160: 44 65 6c 65 74 65 28 29 2c 20 73 65 74 20 74 68  Delete(), set th
1170: 65 20 45 50 5f 53 74 61 74 69 63 20 66 6c 61 67  e EP_Static flag
1180: 2e 20 54 68 69 73 20 0a 20 20 2a 2a 20 70 72 65  . This .  ** pre
1190: 76 65 6e 74 73 20 45 78 70 72 44 65 6c 65 74 65  vents ExprDelete
11a0: 28 29 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67  () from deleting
11b0: 20 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74   the Expr struct
11c0: 75 72 65 20 69 74 73 65 6c 66 2c 0a 20 20 2a 2a  ure itself,.  **
11d0: 20 61 6c 6c 6f 77 69 6e 67 20 69 74 20 74 6f 20   allowing it to 
11e0: 62 65 20 72 65 70 6f 70 75 6c 61 74 65 64 20 62  be repopulated b
11f0: 79 20 74 68 65 20 6d 65 6d 63 70 79 28 29 20 6f  y the memcpy() o
1200: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
1210: 6c 69 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 70  line..  ** The p
1220: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 6d  Expr->u.zToken m
1230: 69 67 68 74 20 70 6f 69 6e 74 20 69 6e 74 6f 20  ight point into 
1240: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c  memory that will
1250: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
1260: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 44 62 46  .  ** sqlite3DbF
1270: 72 65 65 28 64 62 2c 20 70 44 75 70 29 20 6f 6e  ree(db, pDup) on
1280: 20 74 68 65 20 6c 61 73 74 20 6c 69 6e 65 20 6f   the last line o
1290: 66 20 74 68 69 73 20 62 6c 6f 63 6b 2c 20 73 6f  f this block, so
12a0: 20 62 65 20 73 75 72 65 20 74 6f 0a 20 20 2a 2a   be sure to.  **
12b0: 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
12c0: 74 68 65 20 74 6f 6b 65 6e 20 62 65 66 6f 72 65  the token before
12d0: 20 64 6f 69 6e 67 20 74 68 65 20 73 71 6c 69 74   doing the sqlit
12e0: 65 33 44 62 46 72 65 65 28 29 2e 0a 20 20 2a 2f  e3DbFree()..  */
12f0: 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72  .  ExprSetProper
1300: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
1310: 74 69 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  tic);.  sqlite3E
1320: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
1330: 78 70 72 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  xpr);.  memcpy(p
1340: 45 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65  Expr, pDup, size
1350: 6f 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 69  of(*pExpr));.  i
1360: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
1370: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e  rty(pExpr, EP_In
1380: 74 56 61 6c 75 65 29 20 26 26 20 70 45 78 70 72  tValue) && pExpr
1390: 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 7b  ->u.zToken!=0 ){
13a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 45  .    assert( (pE
13b0: 78 70 72 2d 3e 66 6c 61 67 73 20 26 20 28 45 50  xpr->flags & (EP
13c0: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
13d0: 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20  nOnly))==0 );.  
13e0: 20 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65    pExpr->u.zToke
13f0: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
1400: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 75  Dup(db, pExpr->u
1410: 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 45  .zToken);.    pE
1420: 78 70 72 2d 3e 66 6c 61 67 73 32 20 7c 3d 20 45  xpr->flags2 |= E
1430: 50 32 5f 4d 61 6c 6c 6f 63 65 64 54 6f 6b 65 6e  P2_MallocedToken
1440: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
1450: 62 46 72 65 65 28 64 62 2c 20 70 44 75 70 29 3b  bFree(db, pDup);
1460: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
1470: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61  n TRUE if the na
1480: 6d 65 20 7a 43 6f 6c 20 6f 63 63 75 72 73 20 61  me zCol occurs a
1490: 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65 20 55  nywhere in the U
14a0: 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  SING clause..**.
14b0: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
14c0: 69 66 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61  if the USING cla
14d0: 75 73 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  use is NULL or i
14e0: 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f  f it does not co
14f0: 6e 74 61 69 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a  ntain.** zCol..*
1500: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
1510: 65 49 6e 55 73 69 6e 67 43 6c 61 75 73 65 28 49  eInUsingClause(I
1520: 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 2c 20 63  dList *pUsing, c
1530: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29  onst char *zCol)
1540: 7b 0a 20 20 69 66 28 20 70 55 73 69 6e 67 20 29  {.  if( pUsing )
1550: 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20  {.    int k;.   
1560: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69   for(k=0; k<pUsi
1570: 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20  ng->nId; k++){. 
1580: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1590: 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e  StrICmp(pUsing->
15a0: 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  a[k].zName, zCol
15b0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
15c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15d0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
15e0: 53 75 62 71 75 65 72 69 65 73 20 73 74 6f 72 65  Subqueries store
15f0: 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  s the original d
1600: 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61  atabase, table a
1610: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  nd column names 
1620: 66 6f 72 20 74 68 65 69 72 0a 2a 2a 20 72 65 73  for their.** res
1630: 75 6c 74 20 73 65 74 73 20 69 6e 20 45 78 70 72  ult sets in Expr
1640: 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 2c 20  List.a[].zSpan, 
1650: 69 6e 20 74 68 65 20 66 6f 72 6d 20 22 44 41 54  in the form "DAT
1660: 41 42 41 53 45 2e 54 41 42 4c 45 2e 43 4f 4c 55  ABASE.TABLE.COLU
1670: 4d 4e 22 2e 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  MN"..** Check to
1680: 20 73 65 65 20 69 66 20 74 68 65 20 7a 53 70 61   see if the zSpa
1690: 6e 20 67 69 76 65 6e 20 74 6f 20 74 68 69 73 20  n given to this 
16a0: 72 6f 75 74 69 6e 65 20 6d 61 74 63 68 65 73 20  routine matches 
16b0: 74 68 65 20 7a 44 62 2c 20 7a 54 61 62 2c 0a 2a  the zDb, zTab,.*
16c0: 2a 20 61 6e 64 20 7a 43 6f 6c 2e 20 20 49 66 20  * and zCol.  If 
16d0: 61 6e 79 20 6f 66 20 7a 44 62 2c 20 7a 54 61 62  any of zDb, zTab
16e0: 2c 20 61 6e 64 20 7a 43 6f 6c 20 61 72 65 20 4e  , and zCol are N
16f0: 55 4c 4c 20 74 68 65 6e 20 74 68 6f 73 65 20 66  ULL then those f
1700: 69 65 6c 64 73 20 77 69 6c 6c 0a 2a 2a 20 6d 61  ields will.** ma
1710: 74 63 68 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2f  tch anything..*/
1720: 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 61 74 63  .int sqlite3Matc
1730: 68 53 70 61 6e 4e 61 6d 65 28 0a 20 20 63 6f 6e  hSpanName(.  con
1740: 73 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 2c 0a  st char *zSpan,.
1750: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
1760: 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ol,.  const char
1770: 20 2a 7a 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20   *zTab,.  const 
1780: 63 68 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20 69  char *zDb.){.  i
1790: 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b  nt n;.  for(n=0;
17a0: 20 41 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e 5d   ALWAYS(zSpan[n]
17b0: 29 20 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27  ) && zSpan[n]!='
17c0: 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28  .'; n++){}.  if(
17d0: 20 7a 44 62 20 26 26 20 28 73 71 6c 69 74 65 33   zDb && (sqlite3
17e0: 53 74 72 4e 49 43 6d 70 28 7a 53 70 61 6e 2c 20  StrNICmp(zSpan, 
17f0: 7a 44 62 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 44  zDb, n)!=0 || zD
1800: 62 5b 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20  b[n]!=0) ){.    
1810: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1820: 7a 53 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20  zSpan += n+1;.  
1830: 66 6f 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53 28  for(n=0; ALWAYS(
1840: 7a 53 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53 70  zSpan[n]) && zSp
1850: 61 6e 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29  an[n]!='.'; n++)
1860: 7b 7d 0a 20 20 69 66 28 20 7a 54 61 62 20 26 26  {}.  if( zTab &&
1870: 20 28 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d   (sqlite3StrNICm
1880: 70 28 7a 53 70 61 6e 2c 20 7a 54 61 62 2c 20 6e  p(zSpan, zTab, n
1890: 29 21 3d 30 20 7c 7c 20 7a 54 61 62 5b 6e 5d 21  )!=0 || zTab[n]!
18a0: 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =0) ){.    retur
18b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e  n 0;.  }.  zSpan
18c0: 20 2b 3d 20 6e 2b 31 3b 0a 20 20 69 66 28 20 7a   += n+1;.  if( z
18d0: 43 6f 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74  Col && sqlite3St
18e0: 72 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 43 6f  rICmp(zSpan, zCo
18f0: 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  l)!=0 ){.    ret
1900: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
1910: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1920: 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  Given the name o
1930: 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  f a column of th
1940: 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20  e form X.Y.Z or 
1950: 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c  Y.Z or just Z, l
1960: 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e  ook up.** that n
1970: 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f  ame in the set o
1980: 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20  f source tables 
1990: 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20  in pSrcList and 
19a0: 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a  make the pExpr .
19b0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ** expression no
19c0: 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f  de refer back to
19d0: 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c   that source col
19e0: 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  umn.  The follow
19f0: 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61  ing changes.** a
1a00: 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72  re made to pExpr
1a10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72  :.**.**    pExpr
1a20: 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20 20  ->iDb           
1a30: 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e  Set the index in
1a40: 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68   db->aDb[] of th
1a50: 65 20 64 61 74 61 62 61 73 65 20 58 0a 2a 2a 20  e database X.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 20 20 28 65 76 65 6e 20 69 66          (even if
1a80: 20 58 20 69 73 20 69 6d 70 6c 69 65 64 29 2e 0a   X is implied)..
1a90: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  **    pExpr->iTa
1aa0: 62 6c 65 20 20 20 20 20 20 20 20 53 65 74 20 74  ble        Set t
1ab0: 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  o the cursor num
1ac0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
1ad0: 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20  e obtained.**   
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c        from pSrcL
1b00: 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ist..**    pExpr
1b10: 2d 3e 70 54 61 62 20 20 20 20 20 20 20 20 20 20  ->pTab          
1b20: 50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 54 61  Points to the Ta
1b30: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 6f 66  ble structure of
1b40: 20 58 2e 59 20 28 65 76 65 6e 20 69 66 0a 2a 2a   X.Y (even if.**
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 20 58 20 61 6e 64 2f 6f           X and/o
1b70: 72 20 59 20 61 72 65 20 69 6d 70 6c 69 65 64 2e  r Y are implied.
1b80: 29 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ).**    pExpr->i
1b90: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74  Column       Set
1ba0: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   to the column n
1bb0: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65  umber within the
1bc0: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45   table..**    pE
1bd0: 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
1be0: 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c     Set to TK_COL
1bf0: 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  UMN..**    pExpr
1c00: 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20  ->pLeft         
1c10: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
1c20: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
1c30: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70   deleted.**    p
1c40: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20  Expr->pRight    
1c50: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
1c60: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
1c70: 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  o is deleted..**
1c80: 0a 2a 2a 20 54 68 65 20 7a 44 62 20 76 61 72 69  .** The zDb vari
1c90: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
1ca0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cb0: 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68 69   (the "X").  Thi
1cc0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a  s value may be.*
1cd0: 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74  * NULL meaning t
1ce0: 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74  hat name is of t
1cf0: 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a  he form Y.Z or Z
1d00: 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65  .  Any available
1d10: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e   database.** can
1d20: 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20 7a   be used.  The z
1d30: 54 61 62 6c 65 20 76 61 72 69 61 62 6c 65 20 69  Table variable i
1d40: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
1d50: 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22  e table (the "Y"
1d60: 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75  ).  This.** valu
1d70: 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66  e can be NULL if
1d80: 20 7a 44 62 20 69 73 20 61 6c 73 6f 20 4e 55 4c   zDb is also NUL
1d90: 4c 2e 20 20 49 66 20 7a 54 61 62 6c 65 20 69 73  L.  If zTable is
1da0: 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e   NULL it.** mean
1db0: 73 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20  s that the form 
1dc0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a  of the name is Z
1dd0: 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e   and that column
1de0: 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65  s from any table
1df0: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e  .** can be used.
1e00: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61  .**.** If the na
1e10: 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73  me cannot be res
1e20: 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75  olved unambiguou
1e30: 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  sly, leave an er
1e40: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
1e50: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
1e60: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 2e 20 20  urn WRC_Abort.  
1e70: 52 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  Return WRC_Prune
1e80: 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a   on success..*/.
1e90: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75  static int looku
1ea0: 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  pName(.  Parse *
1eb0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
1ec0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
1ed0: 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
1ee0: 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 2f  char *zDb,     /
1ef0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1f00: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
1f10: 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c  g table, or NULL
1f20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1f30: 20 2a 7a 54 61 62 2c 20 20 20 20 2f 2a 20 4e 61   *zTab,    /* Na
1f40: 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74  me of table cont
1f50: 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f  aining column, o
1f60: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
1f70: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20  t char *zCol,   
1f80: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1f90: 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d  column. */.  Nam
1fa0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
1fb0: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f    /* The name co
1fc0: 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72 65  ntext used to re
1fd0: 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20 2a  solve the name *
1fe0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
1ff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
2000: 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20   this EXPR node 
2010: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c  point to the sel
2020: 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ected column */.
2030: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
2060: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
2070: 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20   cnt = 0;       
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2090: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
20a0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
20b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61  s */.  int cntTa
20c0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
20d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
20e0: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74  er of matching t
20f0: 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  able names */.  
2100: 69 6e 74 20 6e 53 75 62 71 75 65 72 79 20 3d 20  int nSubquery = 
2110: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2120: 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 6c 65    /* How many le
2130: 76 65 6c 73 20 6f 66 20 73 75 62 71 75 65 72 79  vels of subquery
2140: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2150: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
2160: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2170: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2180: 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  on */.  struct S
2190: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
21a0: 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65  em;       /* Use
21b0: 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   for looping ove
21c0: 72 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73  r pSrcList items
21d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
21e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63  List_item *pMatc
21f0: 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d  h = 0;  /* The m
2200: 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74  atching pSrcList
2210: 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43   item */.  NameC
2220: 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d  ontext *pTopNC =
2230: 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20   pNC;        /* 
2240: 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78  First namecontex
2250: 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  t in the list */
2260: 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65  .  Schema *pSche
2270: 6d 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ma = 0;         
2280: 20 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f       /* Schema o
2290: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
22a0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 72 69 67   */.  int isTrig
22b0: 67 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ger = 0;..  asse
22c0: 72 74 28 20 70 4e 43 20 29 3b 20 20 20 20 20 2f  rt( pNC );     /
22d0: 2a 20 74 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * the name conte
22e0: 78 74 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  xt cannot be NUL
22f0: 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  L. */.  assert( 
2300: 7a 43 6f 6c 20 29 3b 20 20 20 20 2f 2a 20 54 68  zCol );    /* Th
2310: 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e  e Z in X.Y.Z can
2320: 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  not be NULL */. 
2330: 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
2340: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
2350: 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
2360: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
2370: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
2380: 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d   the node to no-
2390: 6d 61 74 63 68 20 2a 2f 0a 20 20 70 45 78 70 72  match */.  pExpr
23a0: 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20  ->iTable = -1;. 
23b0: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30   pExpr->pTab = 0
23c0: 3b 0a 20 20 45 78 70 72 53 65 74 49 72 72 65 64  ;.  ExprSetIrred
23d0: 75 63 69 62 6c 65 28 70 45 78 70 72 29 3b 0a 0a  ucible(pExpr);..
23e0: 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65 20 74    /* Translate t
23f0: 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 69  he schema name i
2400: 6e 20 7a 44 62 20 69 6e 74 6f 20 61 20 70 6f 69  n zDb into a poi
2410: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 72 72  nter to the corr
2420: 65 73 70 6f 6e 64 69 6e 67 0a 20 20 2a 2a 20 73  esponding.  ** s
2430: 63 68 65 6d 61 2e 20 20 49 66 20 6e 6f 74 20 66  chema.  If not f
2440: 6f 75 6e 64 2c 20 70 53 63 68 65 6d 61 20 77 69  ound, pSchema wi
2450: 6c 6c 20 72 65 6d 61 69 6e 20 4e 55 4c 4c 20 61  ll remain NULL a
2460: 6e 64 20 6e 6f 74 68 69 6e 67 20 77 69 6c 6c 20  nd nothing will 
2470: 6d 61 74 63 68 0a 20 20 2a 2a 20 72 65 73 75 6c  match.  ** resul
2480: 74 69 6e 67 20 69 6e 20 61 6e 20 61 70 70 72 6f  ting in an appro
2490: 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73  priate error mes
24a0: 73 61 67 65 20 74 6f 77 61 72 64 20 74 68 65 20  sage toward the 
24b0: 65 6e 64 20 6f 66 20 74 68 69 73 20 72 6f 75 74  end of this rout
24c0: 69 6e 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  ine.  */.  if( z
24d0: 44 62 20 29 7b 0a 20 20 20 20 74 65 73 74 63 61  Db ){.    testca
24e0: 73 65 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  se( pNC->ncFlags
24f0: 20 26 20 4e 43 5f 50 61 72 74 49 64 78 20 29 3b   & NC_PartIdx );
2500: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2510: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
2520: 5f 49 73 43 68 65 63 6b 20 29 3b 0a 20 20 20 20  _IsCheck );.    
2530: 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
2540: 73 20 26 20 28 4e 43 5f 50 61 72 74 49 64 78 7c  s & (NC_PartIdx|
2550: 4e 43 5f 49 73 43 68 65 63 6b 29 29 21 3d 30 20  NC_IsCheck))!=0 
2560: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69 6c 65  ){.      /* Sile
2570: 6e 74 6c 79 20 69 67 6e 6f 72 65 20 64 61 74 61  ntly ignore data
2580: 62 61 73 65 20 71 75 61 6c 69 66 69 65 72 73 20  base qualifiers 
2590: 69 6e 73 69 64 65 20 43 48 45 43 4b 20 63 6f 6e  inside CHECK con
25a0: 73 74 72 61 69 6e 74 73 20 61 6e 64 20 70 61 72  straints and par
25b0: 74 69 61 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  tial.      ** in
25c0: 64 69 63 65 73 2e 20 20 44 6f 20 6e 6f 74 20 72  dices.  Do not r
25d0: 61 69 73 65 20 65 72 72 6f 72 73 20 62 65 63 61  aise errors beca
25e0: 75 73 65 20 74 68 61 74 20 6d 69 67 68 74 20 62  use that might b
25f0: 72 65 61 6b 20 6c 65 67 61 63 79 20 61 6e 64 0a  reak legacy and.
2600: 20 20 20 20 20 20 2a 2a 20 62 65 63 61 75 73 65        ** because
2610: 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68 75 72   it does not hur
2620: 74 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 6a 75  t anything to ju
2630: 73 74 20 69 67 6e 6f 72 65 20 74 68 65 20 64 61  st ignore the da
2640: 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 2a 2f 0a  tabase name. */.
2650: 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20        zDb = 0;. 
2660: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2670: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
2680: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
2690: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
26a0: 62 5b 69 5d 2e 7a 4e 61 6d 65 20 29 3b 0a 20 20  b[i].zName );.  
26b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26c0: 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62  3StrICmp(db->aDb
26d0: 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 44 62 29 3d 3d  [i].zName,zDb)==
26e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
26f0: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
2700: 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [i].pSchema;.   
2710: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2730: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
2740: 53 74 61 72 74 20 61 74 20 74 68 65 20 69 6e 6e  Start at the inn
2750: 65 72 2d 6d 6f 73 74 20 63 6f 6e 74 65 78 74 20  er-most context 
2760: 61 6e 64 20 6d 6f 76 65 20 6f 75 74 77 61 72 64  and move outward
2770: 20 75 6e 74 69 6c 20 61 20 6d 61 74 63 68 20 69   until a match i
2780: 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 77 68 69  s found */.  whi
2790: 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d  le( pNC && cnt==
27a0: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  0 ){.    ExprLis
27b0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
27c0: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
27d0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
27e0: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c  ;..    if( pSrcL
27f0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ist ){.      for
2800: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63  (i=0, pItem=pSrc
2810: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c  List->a; i<pSrcL
2820: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2830: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
2840: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
2850: 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70         Column *p
2860: 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20 20 20 20  Col;.  .        
2870: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
2880: 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ab;.        asse
2890: 72 74 28 20 70 54 61 62 21 3d 30 20 26 26 20 70  rt( pTab!=0 && p
28a0: 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d 30 20 29 3b  Tab->zName!=0 );
28b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28c0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
28d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
28e0: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26 26 20 28  em->pSelect && (
28f0: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
2900: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 4e 65  selFlags & SF_Ne
2910: 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29 7b 0a  stedFrom)!=0 ){.
2920: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 68 69            int hi
2930: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
2940: 20 70 45 4c 69 73 74 20 3d 20 70 49 74 65 6d 2d   pEList = pItem-
2950: 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74  >pSelect->pEList
2960: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2970: 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  j=0; j<pEList->n
2980: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
2990: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
29a0: 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65  te3MatchSpanName
29b0: 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 53  (pEList->a[j].zS
29c0: 70 61 6e 2c 20 7a 43 6f 6c 2c 20 7a 54 61 62 2c  pan, zCol, zTab,
29d0: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 20   zDb) ){.       
29e0: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 54              cntT
2a00: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  ab = 2;.        
2a10: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
2a20: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Item;.          
2a30: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
2a40: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
2a50: 20 20 20 20 20 20 68 69 74 20 3d 20 31 3b 0a 20        hit = 1;. 
2a60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2a70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a80: 20 20 20 69 66 28 20 68 69 74 20 7c 7c 20 7a 54     if( hit || zT
2a90: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
2aa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ab0: 20 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 70      if( zDb && p
2ac0: 54 61 62 2d 3e 70 53 63 68 65 6d 61 21 3d 70 53  Tab->pSchema!=pS
2ad0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
2ae0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
2af0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b00: 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20  f( zTab ){.     
2b10: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2b20: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
2b30: 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49 74 65  m->zAlias ? pIte
2b40: 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54 61 62  m->zAlias : pTab
2b50: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
2b60: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e     assert( zTabN
2b70: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ame!=0 );.      
2b80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
2b90: 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c  trICmp(zTabName,
2ba0: 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a 20 20 20   zTab)!=0 ){.   
2bb0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2bc0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
2bd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2be0: 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b   if( 0==(cntTab+
2bf0: 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2c00: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
2c10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c20: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d    for(j=0, pCol=
2c30: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
2c40: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
2c50: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Col++){.        
2c60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
2c70: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
2c80: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
2c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2ca0: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 65  there has been e
2cb0: 78 61 63 74 6c 79 20 6f 6e 65 20 70 72 69 6f 72  xactly one prior
2cc0: 20 6d 61 74 63 68 20 61 6e 64 20 74 68 69 73 20   match and this 
2cd0: 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  match.          
2ce0: 20 20 2a 2a 20 69 73 20 66 6f 72 20 74 68 65 20    ** is for the 
2cf0: 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c 65  right-hand table
2d00: 20 6f 66 20 61 20 4e 41 54 55 52 41 4c 20 4a 4f   of a NATURAL JO
2d10: 49 4e 20 6f 72 20 69 73 20 69 6e 20 61 20 0a 20  IN or is in a . 
2d20: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55 53             ** US
2d30: 49 4e 47 20 63 6c 61 75 73 65 2c 20 74 68 65 6e  ING clause, then
2d40: 20 73 6b 69 70 20 74 68 69 73 20 6d 61 74 63 68   skip this match
2d50: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f  ..            */
2d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d70: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20   cnt==1 ){.     
2d80: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
2d90: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  em->jointype & J
2da0: 54 5f 4e 41 54 55 52 41 4c 20 29 20 63 6f 6e 74  T_NATURAL ) cont
2db0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2dc0: 20 20 20 20 69 66 28 20 6e 61 6d 65 49 6e 55 73      if( nameInUs
2dd0: 69 6e 67 43 6c 61 75 73 65 28 70 49 74 65 6d 2d  ingClause(pItem-
2de0: 3e 70 55 73 69 6e 67 2c 20 7a 43 6f 6c 29 20 29  >pUsing, zCol) )
2df0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2e00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e10: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
2e20: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
2e30: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
2e40: 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74      /* Substitut
2e50: 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c  e the rowid (col
2e60: 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20  umn -1) for the 
2e70: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2e80: 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  KEY */.         
2e90: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
2ea0: 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  n = j==pTab->iPK
2eb0: 65 79 20 3f 20 2d 31 20 3a 20 28 69 31 36 29 6a  ey ? -1 : (i16)j
2ec0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2ed0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
2ee0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ef0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4d 61   }.      if( pMa
2f00: 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tch ){.        p
2f10: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
2f20: 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3b 0a  Match->iCursor;.
2f30: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
2f40: 54 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54  Tab = pMatch->pT
2f50: 61 62 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68  ab;.        pSch
2f60: 65 6d 61 20 3d 20 70 45 78 70 72 2d 3e 70 54 61  ema = pExpr->pTa
2f70: 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b->pSchema;.    
2f80: 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 69 66 28    }.    } /* if(
2f90: 20 70 53 72 63 4c 69 73 74 20 29 20 2a 2f 0a 0a   pSrcList ) */..
2fa0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2fb0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
2fc0: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  /* If we have no
2fd0: 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76  t already resolv
2fe0: 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65  ed the name, the
2ff0: 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20  n maybe .    ** 
3000: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
3010: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
3020: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
3030: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
3040: 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21   zDb==0 && zTab!
3050: 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20  =0 && cnt==0 && 
3060: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
3070: 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
3080: 69 6e 74 20 6f 70 20 3d 20 70 50 61 72 73 65 2d  int op = pParse-
3090: 3e 65 54 72 69 67 67 65 72 4f 70 3b 0a 20 20 20  >eTriggerOp;.   
30a0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
30b0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
30c0: 28 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45 20  ( op==TK_DELETE 
30d0: 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54 45  || op==TK_UPDATE
30e0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45 52   || op==TK_INSER
30f0: 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  T );.      if( o
3100: 70 21 3d 54 4b 5f 44 45 4c 45 54 45 20 26 26 20  p!=TK_DELETE && 
3110: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
3120: 6e 65 77 22 2c 7a 54 61 62 29 20 3d 3d 20 30 20  new",zTab) == 0 
3130: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
3140: 2d 3e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20  ->iTable = 1;.  
3150: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 50 61        pTab = pPa
3160: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
3170: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
3180: 28 20 6f 70 21 3d 54 4b 5f 49 4e 53 45 52 54 20  ( op!=TK_INSERT 
3190: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
31a0: 70 28 22 6f 6c 64 22 2c 7a 54 61 62 29 3d 3d 30  p("old",zTab)==0
31b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
31c0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20  r->iTable = 0;. 
31d0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 50         pTab = pP
31e0: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
31f0: 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  b;.      }..    
3200: 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20    if( pTab ){ . 
3210: 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b         int iCol;
3220: 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61  .        pSchema
3230: 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61   = pTab->pSchema
3240: 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61 62  ;.        cntTab
3250: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ++;.        for(
3260: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
3270: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
3280: 7b 0a 20 20 20 20 20 20 20 20 20 20 43 6f 6c 75  {.          Colu
3290: 6d 6e 20 2a 70 43 6f 6c 20 3d 20 26 70 54 61 62  mn *pCol = &pTab
32a0: 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
32b0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
32c0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
32d0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
32e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32f0: 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  if( iCol==pTab->
3300: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
3310: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31         iCol = -1
3320: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
3330: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
3340: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
3350: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3360: 20 69 66 28 20 69 43 6f 6c 3e 3d 70 54 61 62 2d   if( iCol>=pTab-
3370: 3e 6e 43 6f 6c 20 26 26 20 73 71 6c 69 74 65 33  >nCol && sqlite3
3380: 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b  IsRowid(zCol) ){
3390: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
33a0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  = -1;        /* 
33b0: 49 4d 50 3a 20 52 2d 34 34 39 31 31 2d 35 35 31  IMP: R-44911-551
33c0: 32 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a  24 */.        }.
33d0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
33e0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
33f0: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
3400: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 43            if( iC
3410: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol<0 ){.        
3420: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
3430: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
3440: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
3450: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
3460: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29  xpr->iTable==0 )
3470: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
3480: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31  stcase( iCol==31
3490: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
34a0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
34b0: 33 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  32 );.          
34c0: 20 20 70 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73    pParse->oldmas
34d0: 6b 20 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f  k |= (iCol>=32 ?
34e0: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 28 28   0xffffffff : ((
34f0: 28 75 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b  (u32)1)<<iCol));
3500: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
3510: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
3520: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31  stcase( iCol==31
3530: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
3540: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
3550: 33 32 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  32 );.          
3560: 20 20 70 50 61 72 73 65 2d 3e 6e 65 77 6d 61 73    pParse->newmas
3570: 6b 20 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f  k |= (iCol>=32 ?
3580: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 28 28   0xffffffff : ((
3590: 28 75 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b  (u32)1)<<iCol));
35a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
35c0: 6f 6c 75 6d 6e 20 3d 20 28 69 31 36 29 69 43 6f  olumn = (i16)iCo
35d0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  l;.          pEx
35e0: 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b  pr->pTab = pTab;
35f0: 0a 20 20 20 20 20 20 20 20 20 20 69 73 54 72 69  .          isTri
3600: 67 67 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20  gger = 1;.      
3610: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
3620: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
3630: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
3640: 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20  _TRIGGER) */..  
3650: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68    /*.    ** Perh
3660: 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20  aps the name is 
3670: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
3680: 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a  he ROWID.    */.
3690: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26      if( cnt==0 &
36a0: 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73  & cntTab==1 && s
36b0: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
36c0: 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  ol) ){.      cnt
36d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70   = 1;.      pExp
36e0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
36f0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34       /* IMP: R-4
3700: 34 39 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20  4911-55124 */.  
3710: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
3720: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
3730: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a  _INTEGER;.    }.
3740: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
3750: 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f  f the input is o
3760: 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f  f the form Z (no
3770: 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20  t Y.Z or X.Y.Z) 
3780: 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a  then the name Z.
3790: 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66      ** might ref
37a0: 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d  er to an result-
37b0: 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73  set alias.  This
37c0: 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
37d0: 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20  ample, when.    
37e0: 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76  ** we are resolv
37f0: 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  ing names in the
3800: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
3810: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
3820: 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20  ommand:.    **. 
3830: 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
3840: 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74   a+b AS x FROM t
3850: 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b  able WHERE x<10;
3860: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3870: 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  n cases like thi
3880: 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70 72  s, replace pExpr
3890: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
38a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
38b0: 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73  hat.    ** forms
38c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
38d0: 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20  entry ("a+b" in 
38e0: 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64  the example) and
38f0: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
3900: 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65  ely..    ** Note
3910: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
3920: 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75  sion in the resu
3930: 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61  lt set should ha
3940: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
3950: 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20      ** resolved 
3960: 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
3970: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
3980: 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2a  resolved..    **
3990: 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 62 69 6c  .    ** The abil
39a0: 69 74 79 20 74 6f 20 75 73 65 20 61 6e 20 6f 75  ity to use an ou
39b0: 74 70 75 74 20 72 65 73 75 6c 74 2d 73 65 74 20  tput result-set 
39c0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 57 48  column in the WH
39d0: 45 52 45 2c 20 47 52 4f 55 50 20 42 59 2c 0a 20  ERE, GROUP BY,. 
39e0: 20 20 20 2a 2a 20 6f 72 20 48 41 56 49 4e 47 20     ** or HAVING 
39f0: 63 6c 61 75 73 65 73 2c 20 6f 72 20 61 73 20 70  clauses, or as p
3a00: 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20  art of a larger 
3a10: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
3a20: 65 20 4f 52 44 52 45 20 42 59 0a 20 20 20 20 2a  e ORDRE BY.    *
3a30: 2a 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  * clause is not 
3a40: 73 74 61 6e 64 61 72 64 20 53 51 4c 2e 20 20 54  standard SQL.  T
3a50: 68 69 73 20 69 73 20 61 20 28 67 6f 6f 66 79 29  his is a (goofy)
3a60: 20 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f   SQLite extensio
3a70: 6e 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  n, that.    ** i
3a80: 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  s supported for 
3a90: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
3aa0: 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e 20 20 54  ibility only.  T
3ab0: 4f 20 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  O DO: Issue a wa
3ac0: 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  rning.    ** on 
3ad0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 77 68  sqlite3_log() wh
3ae0: 65 6e 65 76 65 72 20 74 68 65 20 63 61 70 61 62  enever the capab
3af0: 69 6c 69 74 79 20 69 73 20 75 73 65 64 2e 0a 20  ility is used.. 
3b00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
3b10: 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c  EList = pNC->pEL
3b20: 69 73 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20  ist)!=0.     && 
3b30: 7a 54 61 62 3d 3d 30 0a 20 20 20 20 20 26 26 20  zTab==0.     && 
3b40: 63 6e 74 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  cnt==0.    ){.  
3b50: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3b60: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
3b70: 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  +){.        char
3b80: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
3b90: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
3ba0: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
3bb0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
3bc0: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
3bd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
3be0: 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 20   *pOrig;.       
3bf0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
3c00: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
3c10: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
3c20: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
3c30: 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  rt( pExpr->x.pLi
3c40: 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  st==0 );.       
3c50: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
3c60: 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ->x.pSelect==0 )
3c70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 69  ;.          pOri
3c80: 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  g = pEList->a[j]
3c90: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
3ca0: 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
3cb0: 61 67 73 26 4e 43 5f 41 6c 6c 6f 77 41 67 67 29  ags&NC_AllowAgg)
3cc0: 3d 3d 30 20 26 26 20 45 78 70 72 48 61 73 50 72  ==0 && ExprHasPr
3cd0: 6f 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45 50  operty(pOrig, EP
3ce0: 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20  _Agg) ){.       
3cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3d00: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
3d10: 73 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64 20  suse of aliased 
3d20: 61 67 67 72 65 67 61 74 65 20 25 73 22 2c 20 7a  aggregate %s", z
3d30: 41 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  As);.           
3d40: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
3d50: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
3d60: 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65           resolve
3d70: 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45  Alias(pParse, pE
3d80: 4c 69 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c 20  List, j, pExpr, 
3d90: 22 22 2c 20 6e 53 75 62 71 75 65 72 79 29 3b 0a  "", nSubquery);.
3da0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20            cnt = 
3db0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  1;.          pMa
3dc0: 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
3dd0: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
3de0: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
3df0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c            goto l
3e00: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20  ookupname_end;. 
3e10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3e20: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20   .    }..    /* 
3e30: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
3e40: 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ext name context
3e50: 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  .  The loop will
3e60: 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65   exit when eithe
3e70: 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65  r.    ** we have
3e80: 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29   a match (cnt>0)
3e90: 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20   or when we run 
3ea0: 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74  out of name cont
3eb0: 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  exts..    */.   
3ec0: 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20   if( cnt==0 ){. 
3ed0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
3ee0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 6e 53 75  pNext;.      nSu
3ef0: 62 71 75 65 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a  bquery++;.    }.
3f00: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
3f10: 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55  f X and Y are NU
3f20: 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  LL (in other wor
3f30: 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63  ds if only the c
3f40: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a  olumn name Z is.
3f50: 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61    ** supplied) a
3f60: 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
3f70: 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  Z is enclosed in
3f80: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20   double-quotes, 
3f90: 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61  then.  ** Z is a
3fa0: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
3fb0: 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61  if it doesn't ma
3fc0: 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e  tch any column n
3fd0: 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20  ames.  In that. 
3fe0: 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65   ** case, we nee
3ff0: 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68  d to return righ
4000: 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d  t away and not m
4010: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ake any changes 
4020: 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20  to.  ** pExpr.. 
4030: 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65   **.  ** Because
4040: 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61   no reference wa
4050: 73 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20  s made to outer 
4060: 63 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e  contexts, the pN
4070: 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65  C->nRef.  ** fie
4080: 6c 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e  lds are not chan
4090: 67 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65  ged in any conte
40a0: 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  xt..  */.  if( c
40b0: 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30  nt==0 && zTab==0
40c0: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
40d0: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 44 62 6c  rty(pExpr,EP_Dbl
40e0: 51 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 70  Quoted) ){.    p
40f0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54  Expr->op = TK_ST
4100: 52 49 4e 47 3b 0a 20 20 20 20 70 45 78 70 72 2d  RING;.    pExpr-
4110: 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 72  >pTab = 0;.    r
4120: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
4130: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4140: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
4150: 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68  re was not match
4160: 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74  .  cnt>1 means t
4170: 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72  here were two or
4180: 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68  .  ** more match
4190: 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c  es.  Either way,
41a0: 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f   we have an erro
41b0: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
41c0: 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  t!=1 ){.    cons
41d0: 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20  t char *zErr;.  
41e0: 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20    zErr = cnt==0 
41f0: 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  ? "no such colum
4200: 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20  n" : "ambiguous 
4210: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20  column name";.  
4220: 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20    if( zDb ){.   
4230: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4240: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
4250: 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c  %s.%s.%s", zErr,
4260: 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c   zDb, zTab, zCol
4270: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
4280: 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73   zTab ){.      s
4290: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
42a0: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25  Parse, "%s: %s.%
42b0: 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20  s", zErr, zTab, 
42c0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zCol);.    }else
42d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
42e0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
42f0: 22 25 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20  "%s: %s", zErr, 
4300: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
4310: 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63   pParse->checkSc
4320: 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 70 54  hema = 1;.    pT
4330: 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  opNC->nErr++;.  
4340: 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c  }..  /* If a col
4350: 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65  umn from a table
4360: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20   in pSrcList is 
4370: 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e  referenced, then
4380: 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69   record.  ** thi
4390: 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53  s fact in the pS
43a0: 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73  rcList.a[].colUs
43b0: 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c  ed bitmask.  Col
43c0: 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a  umn 0 causes.  *
43d0: 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65  * bit 0 to be se
43e0: 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74  t.  Column 1 set
43f0: 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f  s bit 1.  And so
4400: 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a   forth.  If the.
4410: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62    ** column numb
4420: 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
4430: 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  an the number of
4440: 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74   bits in the bit
4450: 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73  mask.  ** then s
4460: 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65  et the high-orde
4470: 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74  r bit of the bit
4480: 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mask..  */.  if(
4490: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
44a0: 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20  =0 && pMatch!=0 
44b0: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  ){.    int n = p
44c0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20  Expr->iColumn;. 
44d0: 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d     testcase( n==
44e0: 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 69 66 28  BMS-1 );.    if(
44f0: 20 6e 3e 3d 42 4d 53 20 29 7b 0a 20 20 20 20 20   n>=BMS ){.     
4500: 20 6e 20 3d 20 42 4d 53 2d 31 3b 0a 20 20 20 20   n = BMS-1;.    
4510: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  }.    assert( pM
4520: 61 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70  atch->iCursor==p
4530: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a  Expr->iTable );.
4540: 20 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55      pMatch->colU
4550: 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b  sed |= ((Bitmask
4560: 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  )1)<<n;.  }..  /
4570: 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72  * Clean up and r
4580: 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c  eturn.  */.  sql
4590: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
45a0: 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  b, pExpr->pLeft)
45b0: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ;.  pExpr->pLeft
45c0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45   = 0;.  sqlite3E
45d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
45e0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
45f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20  pExpr->pRight = 
4600: 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  0;.  pExpr->op =
4610: 20 28 69 73 54 72 69 67 67 65 72 20 3f 20 54 4b   (isTrigger ? TK
4620: 5f 54 52 49 47 47 45 52 20 3a 20 54 4b 5f 43 4f  _TRIGGER : TK_CO
4630: 4c 55 4d 4e 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d  LUMN);.lookupnam
4640: 65 5f 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e 74  e_end:.  if( cnt
4650: 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==1 ){.    asser
4660: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  t( pNC!=0 );.   
4670: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
4680: 54 4b 5f 41 53 20 29 7b 0a 20 20 20 20 20 20 73  TK_AS ){.      s
4690: 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70  qlite3AuthRead(p
46a0: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
46b0: 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63  chema, pNC->pSrc
46c0: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  List);.    }.   
46d0: 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
46e0: 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20  e nRef value on 
46f0: 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  all name context
4700: 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20  s from TopNC up 
4710: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f  to.    ** the po
4720: 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e 61  int where the na
4730: 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20  me matched. */. 
4740: 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20     for(;;){.    
4750: 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43    assert( pTopNC
4760: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f  !=0 );.      pTo
4770: 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pNC->nRef++;.   
4780: 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70     if( pTopNC==p
4790: 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  NC ) break;.    
47a0: 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e    pTopNC = pTopN
47b0: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  C->pNext;.    }.
47c0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
47d0: 72 75 6e 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  rune;.  } else {
47e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
47f0: 41 62 6f 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Abort;.  }.}../*
4800: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
4810: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
4820: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
4830: 6f 6e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 63  on to load the c
4840: 6f 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72  olumn iCol.** fr
4850: 6f 6d 20 64 61 74 61 73 6f 75 72 63 65 20 69 53  om datasource iS
4860: 72 63 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53  rc in SrcList pS
4870: 72 63 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  rc..*/.Expr *sql
4880: 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e  ite3CreateColumn
4890: 45 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62  Expr(sqlite3 *db
48a0: 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c  , SrcList *pSrc,
48b0: 20 69 6e 74 20 69 53 72 63 2c 20 69 6e 74 20 69   int iSrc, int i
48c0: 43 6f 6c 29 7b 0a 20 20 45 78 70 72 20 2a 70 20  Col){.  Expr *p 
48d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c  = sqlite3ExprAll
48e0: 6f 63 28 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e  oc(db, TK_COLUMN
48f0: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  , 0, 0);.  if( p
4900: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53   ){.    struct S
4910: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
4920: 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 53  em = &pSrc->a[iS
4930: 72 63 5d 3b 0a 20 20 20 20 70 2d 3e 70 54 61 62  rc];.    p->pTab
4940: 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a   = pItem->pTab;.
4950: 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
4960: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
4970: 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62 2d      if( p->pTab-
4980: 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a  >iPKey==iCol ){.
4990: 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e        p->iColumn
49a0: 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65   = -1;.    }else
49b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75  {.      p->iColu
49c0: 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69 43 6f 6c  mn = (ynVar)iCol
49d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
49e0: 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20  ( iCol==BMS );. 
49f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
4a00: 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  Col==BMS-1 );.  
4a10: 20 20 20 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73      pItem->colUs
4a20: 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  ed |= ((Bitmask)
4a30: 31 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d 53 20 3f  1)<<(iCol>=BMS ?
4a40: 20 42 4d 53 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a   BMS-1 : iCol);.
4a50: 20 20 20 20 7d 0a 20 20 20 20 45 78 70 72 53 65      }.    ExprSe
4a60: 74 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  tProperty(p, EP_
4a70: 52 65 73 6f 6c 76 65 64 29 3b 0a 20 20 7d 0a 20  Resolved);.  }. 
4a80: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
4a90: 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72  .** Report an er
4aa0: 72 6f 72 20 74 68 61 74 20 61 6e 20 65 78 70 72  ror that an expr
4ab0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61  ession is not va
4ac0: 6c 69 64 20 66 6f 72 20 61 20 70 61 72 74 69 61  lid for a partia
4ad0: 6c 20 69 6e 64 65 78 20 57 48 45 52 45 0a 2a 2a  l index WHERE.**
4ae0: 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   clause..*/.stat
4af0: 69 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69 64  ic void notValid
4b00: 50 61 72 74 49 64 78 57 68 65 72 65 28 0a 20 20  PartIdxWhere(.  
4b10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
4b20: 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 65 72       /* Leave er
4b30: 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72 65  ror message here
4b40: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
4b50: 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68  t *pNC,    /* Th
4b60: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 2a  e name context *
4b70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4b80: 7a 4d 73 67 20 20 20 20 20 2f 2a 20 54 79 70 65  zMsg     /* Type
4b90: 20 6f 66 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a   of error */.){.
4ba0: 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
4bb0: 61 67 73 20 26 20 4e 43 5f 50 61 72 74 49 64 78  ags & NC_PartIdx
4bc0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )!=0 ){.    sqli
4bd0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4be0: 73 65 2c 20 22 25 73 20 70 72 6f 68 69 62 69 74  se, "%s prohibit
4bf0: 65 64 20 69 6e 20 70 61 72 74 69 61 6c 20 69 6e  ed in partial in
4c00: 64 65 78 20 57 48 45 52 45 20 63 6c 61 75 73 65  dex WHERE clause
4c10: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
4c20: 20 20 20 20 20 20 20 20 7a 4d 73 67 29 3b 0a 20          zMsg);. 
4c30: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
4c40: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
4c50: 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20  /*.** Report an 
4c60: 65 72 72 6f 72 20 74 68 61 74 20 61 6e 20 65 78  error that an ex
4c70: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
4c80: 76 61 6c 69 64 20 66 6f 72 20 61 20 43 48 45 43  valid for a CHEC
4c90: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f  K constraint..*/
4ca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 74  .static void not
4cb0: 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72  ValidCheckConstr
4cc0: 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
4cd0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
4ce0: 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  Leave error mess
4cf0: 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 4e 61  age here */.  Na
4d00: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
4d10: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
4d20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
4d30: 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 20 20 20  t char *zMsg    
4d40: 20 2f 2a 20 54 79 70 65 20 6f 66 20 65 72 72 6f   /* Type of erro
4d50: 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 28 70  r */.){.  if( (p
4d60: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
4d70: 5f 49 73 43 68 65 63 6b 29 21 3d 30 20 29 7b 0a  _IsCheck)!=0 ){.
4d80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4d90: 4d 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 70  Msg(pParse,"%s p
4da0: 72 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45  rohibited in CHE
4db0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 2c  CK constraints",
4dc0: 20 7a 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65   zMsg);.  }.}.#e
4dd0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6e 6f 74  lse.# define not
4de0: 56 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72  ValidCheckConstr
4df0: 61 69 6e 74 28 50 2c 4e 2c 4d 29 0a 23 65 6e 64  aint(P,N,M).#end
4e00: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73  if../*.** Expres
4e10: 73 69 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65 6e  sion p should en
4e20: 63 6f 64 65 20 61 20 66 6c 6f 61 74 69 6e 67 20  code a floating 
4e30: 70 6f 69 6e 74 20 76 61 6c 75 65 20 62 65 74 77  point value betw
4e40: 65 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e  een 1.0 and 0.0.
4e50: 0a 2a 2a 20 52 65 74 75 72 6e 20 31 30 32 34 20  .** Return 1024 
4e60: 74 69 6d 65 73 20 74 68 69 73 20 76 61 6c 75 65  times this value
4e70: 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20  .  Or return -1 
4e80: 69 66 20 70 20 69 73 20 6e 6f 74 20 61 20 66 6c  if p is not a fl
4e90: 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20  oating point.** 
4ea0: 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e  value between 1.
4eb0: 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74  0 and 0.0..*/.st
4ec0: 61 74 69 63 20 69 6e 74 20 65 78 70 72 50 72 6f  atic int exprPro
4ed0: 62 61 62 69 6c 69 74 79 28 45 78 70 72 20 2a 70  bability(Expr *p
4ee0: 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d 20  ){.  double r = 
4ef0: 2d 31 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f  -1.0;.  if( p->o
4f00: 70 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65  p!=TK_FLOAT ) re
4f10: 74 75 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69 74  turn -1;.  sqlit
4f20: 65 33 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b  e3AtoF(p->u.zTok
4f30: 65 6e 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53  en, &r, sqlite3S
4f40: 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f  trlen30(p->u.zTo
4f50: 6b 65 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54 46  ken), SQLITE_UTF
4f60: 38 29 3b 0a 20 20 69 66 28 20 72 3c 30 2e 30 20  8);.  if( r<0.0 
4f70: 7c 7c 20 72 3e 31 2e 30 20 29 20 72 65 74 75 72  || r>1.0 ) retur
4f80: 6e 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 28  n -1;.  return (
4f90: 69 6e 74 29 28 72 2a 31 30 30 30 2e 30 29 3b 0a  int)(r*1000.0);.
4fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4fb0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 62 61 63  utine is callbac
4fc0: 6b 20 66 6f 72 20 73 71 6c 69 74 65 33 57 61 6c  k for sqlite3Wal
4fd0: 6b 45 78 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52  kExpr()..**.** R
4fe0: 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20  esolve symbolic 
4ff0: 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f  names into TK_CO
5000: 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66  LUMN operators f
5010: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  or the current.*
5020: 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78  * node in the ex
5030: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5040: 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74  Return 0 to cont
5050: 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68 20  inue the search 
5060: 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65  down.** the tree
5070: 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74   or 2 to abort t
5080: 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a  he tree walk..**
5090: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
50a0: 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72   also does error
50b0: 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61   checking and na
50c0: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f  me resolution fo
50d0: 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61  r.** function na
50e0: 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74  mes.  The operat
50f0: 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74 65  or for aggregate
5100: 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68   functions is ch
5110: 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41  anged.** to TK_A
5120: 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a  GG_FUNCTION..*/.
5130: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
5140: 76 65 45 78 70 72 53 74 65 70 28 57 61 6c 6b 65  veExprStep(Walke
5150: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
5160: 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65   *pExpr){.  Name
5170: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 0a 20 20  Context *pNC;.  
5180: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a  Parse *pParse;..
5190: 20 20 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d    pNC = pWalker-
51a0: 3e 75 2e 70 4e 43 3b 0a 20 20 61 73 73 65 72 74  >u.pNC;.  assert
51b0: 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50  ( pNC!=0 );.  pP
51c0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
51d0: 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  se;.  assert( pP
51e0: 61 72 73 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70  arse==pWalker->p
51f0: 50 61 72 73 65 20 29 3b 0a 0a 20 20 69 66 28 20  Parse );..  if( 
5200: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
5210: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73  ty(pExpr, EP_Res
5220: 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20  olved) ) return 
5230: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 45 78 70  WRC_Prune;.  Exp
5240: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
5250: 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29  pr, EP_Resolved)
5260: 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ;.#ifndef NDEBUG
5270: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72 63  .  if( pNC->pSrc
5280: 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53 72  List && pNC->pSr
5290: 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20  cList->nAlloc>0 
52a0: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
52b0: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
52c0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e  pSrcList;.    in
52d0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
52e0: 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73  ; i<pNC->pSrcLis
52f0: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
5300: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
5310: 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
5320: 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69  sor>=0 && pSrcLi
5330: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
5340: 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a  <pParse->nTab);.
5350: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
5360: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
5370: 2d 3e 6f 70 20 29 7b 0a 0a 23 69 66 20 64 65 66  ->op ){..#if def
5380: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
5390: 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45  LE_UPDATE_DELETE
53a0: 5f 4c 49 4d 49 54 29 20 26 26 20 21 64 65 66 69  _LIMIT) && !defi
53b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
53c0: 53 55 42 51 55 45 52 59 29 0a 20 20 20 20 2f 2a  SUBQUERY).    /*
53d0: 20 54 68 65 20 73 70 65 63 69 61 6c 20 6f 70 65   The special ope
53e0: 72 61 74 6f 72 20 54 4b 5f 52 4f 57 20 6d 65 61  rator TK_ROW mea
53f0: 6e 73 20 75 73 65 20 74 68 65 20 72 6f 77 69 64  ns use the rowid
5400: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20   for the first. 
5410: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20     ** column in 
5420: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
5430: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62    This is used b
5440: 79 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  y the LIMIT and 
5450: 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
5460: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
5470: 67 20 6f 6e 20 55 50 44 41 54 45 20 61 6e 64 20  g on UPDATE and 
5480: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
5490: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
54a0: 73 65 20 54 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20  se TK_ROW: {.   
54b0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
54c0: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
54d0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75  List;.      stru
54e0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
54f0: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 61 73  *pItem;.      as
5500: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 20 26  sert( pSrcList &
5510: 26 20 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  & pSrcList->nSrc
5520: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==1 );.      pIt
5530: 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
5540: 3b 20 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ; .      pExpr->
5550: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
5560: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
5570: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
5580: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
5590: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
55a0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 45 78  ursor;.      pEx
55b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31  pr->iColumn = -1
55c0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61  ;.      pExpr->a
55d0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
55e0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
55f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5600: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
5610: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
5620: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
5630: 49 4d 49 54 29 20 26 26 20 21 64 65 66 69 6e 65  IMIT) && !define
5640: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
5650: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 20 20 20 20  BQUERY) */..    
5660: 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69  /* A lone identi
5670: 66 69 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  fier is the name
5680: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20 20   of a column..  
5690: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
56a0: 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  _ID: {.      ret
56b0: 75 72 6e 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70  urn lookupName(p
56c0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 70 45 78  Parse, 0, 0, pEx
56d0: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 4e  pr->u.zToken, pN
56e0: 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  C, pExpr);.    }
56f0: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62  .  .    /* A tab
5700: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75  le name and colu
5710: 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e  mn name:     ID.
5720: 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64  ID.    ** Or a d
5730: 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61  atabase, table a
5740: 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49  nd column:  ID.I
5750: 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20  D.ID.    */.    
5760: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20  case TK_DOT: {. 
5770: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5780: 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  *zColumn;.      
5790: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
57a0: 6c 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  le;.      const 
57b0: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 20  char *zDb;.     
57c0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a   Expr *pRight;..
57d0: 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53 72        /* if( pSr
57e0: 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b  cList==0 ) break
57f0: 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67 68  ; */.      pRigh
5800: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
5810: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
5820: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
5830: 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20  {.        zDb = 
5840: 30 3b 0a 20 20 20 20 20 20 20 20 7a 54 61 62 6c  0;.        zTabl
5850: 65 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  e = pExpr->pLeft
5860: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
5870: 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52      zColumn = pR
5880: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  ight->u.zToken;.
5890: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
58a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
58b0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
58c0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d  );.        zDb =
58d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 75   pExpr->pLeft->u
58e0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
58f0: 20 7a 54 61 62 6c 65 20 3d 20 70 52 69 67 68 74   zTable = pRight
5900: 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
5910: 6e 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  n;.        zColu
5920: 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e 70 52 69  mn = pRight->pRi
5930: 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  ght->u.zToken;. 
5940: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
5950: 75 72 6e 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70  urn lookupName(p
5960: 50 61 72 73 65 2c 20 7a 44 62 2c 20 7a 54 61 62  Parse, zDb, zTab
5970: 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 70 4e 43  le, zColumn, pNC
5980: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
5990: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
59a0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20  function names. 
59b0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
59c0: 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
59d0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
59e0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
59f0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
5a00: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20  xpr->x.pList;   
5a10: 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
5a20: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69   list */.      i
5a30: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70  nt n = pList ? p
5a40: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
5a50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
5a60: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
5a70: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
5a80: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
5a90: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
5aa0: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
5ab0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
5ac0: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
5ad0: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
5ae0: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
5af0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
5b00: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
5b10: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
5b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
5b30: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
5b40: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
5b50: 6e 74 20 61 75 74 68 3b 20 20 20 20 20 20 20 20  nt auth;        
5b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 75             /* Au
5b70: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 75  thorization to u
5b80: 73 65 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  se the function 
5b90: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  */.      int nId
5ba0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5bb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5bc0: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
5bd0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
5be0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5bf0: 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20  r *zId;         
5c00: 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
5c10: 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  on name. */.    
5c20: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5c40: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
5c50: 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ut the function 
5c60: 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  */.      u8 enc 
5c70: 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62  = ENC(pParse->db
5c80: 29 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  );   /* The data
5c90: 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  base encoding */
5ca0: 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ..      testcase
5cb0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
5cc0: 43 4f 4e 53 54 5f 46 55 4e 43 20 29 3b 0a 20 20  CONST_FUNC );.  
5cd0: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
5ce0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5cf0: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
5d00: 29 20 29 3b 0a 20 20 20 20 20 20 6e 6f 74 56 61  ) );.      notVa
5d10: 6c 69 64 50 61 72 74 49 64 78 57 68 65 72 65 28  lidPartIdxWhere(
5d20: 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 66 75  pParse, pNC, "fu
5d30: 6e 63 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20 20  nctions");.     
5d40: 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
5d50: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49  zToken;.      nI
5d60: 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
5d70: 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20  n30(zId);.      
5d80: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
5d90: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
5da0: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
5db0: 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   n, enc, 0);.   
5dc0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
5dd0: 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
5de0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
5df0: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
5e00: 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 32 2c 20 65   zId, nId, -2, e
5e10: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
5e20: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
5e30: 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68           no_such
5e40: 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  _func = 1;.     
5e50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5e60: 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72      wrong_num_ar
5e70: 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gs = 1;.        
5e80: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
5e90: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
5ea0: 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a  pDef->xFunc==0;.
5eb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
5ec0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
5ed0: 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
5ee0: 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
5ef0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
5f00: 70 45 78 70 72 2c 20 45 50 5f 48 69 6e 74 29 3b  pExpr, EP_Hint);
5f10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
5f20: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
5f30: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
5f40: 20 3d 20 65 78 70 72 50 72 6f 62 61 62 69 6c 69   = exprProbabili
5f50: 74 79 28 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  ty(pList->a[1].p
5f60: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
5f70: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
5f80: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
5f90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
5fa0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5fb0: 22 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65  "second paramete
5fc0: 72 20 74 6f 20 75 6e 6c 69 6b 65 6c 79 28 29 20  r to unlikely() 
5fd0: 6d 75 73 74 20 62 65 20 22 0a 20 20 20 20 20 20  must be ".      
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 22 62 65 74 77 65 65 6e 20 30 2e 30 20 61 6e 64  "between 0.0 and
6010: 20 31 2e 30 22 29 3b 0a 20 20 20 20 20 20 20 20   1.0");.        
6020: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
6030: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
6040: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6050: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  {.            pE
6060: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 37 35  xpr->iTable = 75
6070: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 20 20 20  ;.          }   
6080: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
6090: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
60a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
60b0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
60c0: 20 20 20 20 20 69 66 28 20 70 44 65 66 20 29 7b       if( pDef ){
60d0: 0a 20 20 20 20 20 20 20 20 61 75 74 68 20 3d 20  .        auth = 
60e0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
60f0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
6100: 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65  FUNCTION, 0, pDe
6110: 66 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  f->zName, 0);.  
6120: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d        if( auth!=
6130: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6140: 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d         if( auth=
6150: 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a  =SQLITE_DENY ){.
6160: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6170: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6180: 73 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69  se, "not authori
6190: 7a 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74  zed to use funct
61a0: 69 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20  ion: %s",.      
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
61d0: 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ef->zName);.    
61e0: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
61f0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  r++;.          }
6200: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
6210: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
6220: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6230: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
6240: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
6250: 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 69  ndif.      if( i
6260: 73 5f 61 67 67 20 26 26 20 28 70 4e 43 2d 3e 6e  s_agg && (pNC->n
6270: 63 46 6c 61 67 73 20 26 20 4e 43 5f 41 6c 6c 6f  cFlags & NC_Allo
6280: 77 41 67 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20  wAgg)==0 ){.    
6290: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
62a0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
62b0: 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
62c0: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
62d0: 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20  ", nId,zId);.   
62e0: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
62f0: 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  ;.        is_agg
6300: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
6310: 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75  e if( no_such_fu
6320: 6e 63 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62  nc && pParse->db
6330: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
6340: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6350: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6360: 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  , "no such funct
6370: 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c  ion: %.*s", nId,
6380: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70   zId);.        p
6390: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
63a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e    }else if( wron
63b0: 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20  g_num_args ){.  
63c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
63d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72  orMsg(pParse,"wr
63e0: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
63f0: 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74  guments to funct
6400: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20  ion %.*s()",.   
6410: 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a            nId, z
6420: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
6430: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
6440: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
6450: 67 67 20 29 20 70 4e 43 2d 3e 6e 63 46 6c 61 67  gg ) pNC->ncFlag
6460: 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67  s &= ~NC_AllowAg
6470: 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  g;.      sqlite3
6480: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61  WalkExprList(pWa
6490: 6c 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20  lker, pList);.  
64a0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
64b0: 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f  {.        NameCo
64c0: 6e 74 65 78 74 20 2a 70 4e 43 32 20 3d 20 70 4e  ntext *pNC2 = pN
64d0: 43 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  C;.        pExpr
64e0: 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55  ->op = TK_AGG_FU
64f0: 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  NCTION;.        
6500: 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 30 3b 0a  pExpr->op2 = 0;.
6510: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
6520: 4e 43 32 20 26 26 20 21 73 71 6c 69 74 65 33 46  NC2 && !sqlite3F
6530: 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53  unctionUsesThisS
6540: 72 63 28 70 45 78 70 72 2c 20 70 4e 43 32 2d 3e  rc(pExpr, pNC2->
6550: 70 53 72 63 4c 69 73 74 29 20 29 7b 0a 20 20 20  pSrcList) ){.   
6560: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
6570: 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  2++;.          p
6580: 4e 43 32 20 3d 20 70 4e 43 32 2d 3e 70 4e 65 78  NC2 = pNC2->pNex
6590: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
65a0: 20 20 20 20 20 69 66 28 20 70 4e 43 32 20 29 20       if( pNC2 ) 
65b0: 70 4e 43 32 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d  pNC2->ncFlags |=
65c0: 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20 20 20   NC_HasAgg;.    
65d0: 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73      pNC->ncFlags
65e0: 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b   |= NC_AllowAgg;
65f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
6600: 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75  * FIX ME:  Compu
6610: 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  te pExpr->affini
6620: 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ty based on the 
6630: 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a  expected return.
6640: 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66        ** type of
6650: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20   the function . 
6660: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
6670: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
6680: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
6690: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
66a0: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
66b0: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
66c0: 54 4b 5f 45 58 49 53 54 53 3a 20 20 74 65 73 74  TK_EXISTS:  test
66d0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
66e0: 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23 65  =TK_EXISTS );.#e
66f0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
6700: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73  _IN: {.      tes
6710: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
6720: 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20  ==TK_IN );.     
6730: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
6740: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
6750: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
6760: 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20       int nRef = 
6770: 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20  pNC->nRef;.     
6780: 20 20 20 6e 6f 74 56 61 6c 69 64 43 68 65 63 6b     notValidCheck
6790: 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73  Constraint(pPars
67a0: 65 2c 20 70 4e 43 2c 20 22 73 75 62 71 75 65 72  e, pNC, "subquer
67b0: 69 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20 6e  ies");.        n
67c0: 6f 74 56 61 6c 69 64 50 61 72 74 49 64 78 57 68  otValidPartIdxWh
67d0: 65 72 65 28 70 50 61 72 73 65 2c 20 70 4e 43 2c  ere(pParse, pNC,
67e0: 20 22 73 75 62 71 75 65 72 69 65 73 22 29 3b 0a   "subqueries");.
67f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
6800: 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
6810: 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  r, pExpr->x.pSel
6820: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ect);.        as
6830: 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e  sert( pNC->nRef>
6840: 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20  =nRef );.       
6850: 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e   if( nRef!=pNC->
6860: 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nRef ){.        
6870: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
6880: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
6890: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
68a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
68b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
68c0: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
68d0: 45 3a 20 7b 0a 20 20 20 20 20 20 6e 6f 74 56 61  E: {.      notVa
68e0: 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  lidCheckConstrai
68f0: 6e 74 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20  nt(pParse, pNC, 
6900: 22 70 61 72 61 6d 65 74 65 72 73 22 29 3b 0a 20  "parameters");. 
6910: 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 50 61 72       notValidPar
6920: 74 49 64 78 57 68 65 72 65 28 70 50 61 72 73 65  tIdxWhere(pParse
6930: 2c 20 70 4e 43 2c 20 22 70 61 72 61 6d 65 74 65  , pNC, "paramete
6940: 72 73 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rs");.      brea
6950: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
6960: 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e  eturn (pParse->n
6970: 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  Err || pParse->d
6980: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
6990: 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57   ? WRC_Abort : W
69a0: 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
69b0: 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20  /*.** pEList is 
69c0: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
69d0: 73 69 6f 6e 73 20 77 68 69 63 68 20 61 72 65 20  sions which are 
69e0: 72 65 61 6c 6c 79 20 74 68 65 20 72 65 73 75 6c  really the resul
69f0: 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20  t set of the.** 
6a00: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
6a10: 6e 74 2e 20 20 70 45 20 69 73 20 61 20 74 65 72  nt.  pE is a ter
6a20: 6d 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59  m in an ORDER BY
6a30: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
6a40: 75 73 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  use..** This rou
6a50: 74 69 6e 65 20 63 68 65 63 6b 73 20 74 6f 20 73  tine checks to s
6a60: 65 65 20 69 66 20 70 45 20 69 73 20 61 20 73 69  ee if pE is a si
6a70: 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20  mple identifier 
6a80: 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64  which correspond
6a90: 73 0a 2a 2a 20 74 6f 20 74 68 65 20 41 53 2d 6e  s.** to the AS-n
6aa0: 61 6d 65 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68  ame of one of th
6ab0: 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 65  e terms of the e
6ac0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
6ad0: 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68   If it is,.** th
6ae0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6af0: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74  n an integer bet
6b00: 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 77 68 65  ween 1 and N whe
6b10: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
6b20: 65 72 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74  er of.** element
6b30: 73 20 69 6e 20 70 45 4c 69 73 74 2c 20 63 6f 72  s in pEList, cor
6b40: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
6b50: 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79  e matching entry
6b60: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a  .  If there is.*
6b70: 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 6f 72 20 69  * no match, or i
6b80: 66 20 70 45 20 69 73 20 6e 6f 74 20 61 20 73 69  f pE is not a si
6b90: 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c  mple identifier,
6ba0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
6bb0: 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a  ne.** return 0..
6bc0: 2a 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 68 61 73  **.** pEList has
6bd0: 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
6be0: 20 70 45 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f 0a   pE has not..*/.
6bf0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
6c00: 76 65 41 73 4e 61 6d 65 28 0a 20 20 50 61 72 73  veAsName(.  Pars
6c10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
6c20: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
6c30: 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  t for error mess
6c40: 61 67 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ages */.  ExprLi
6c50: 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20  st *pEList,  /* 
6c60: 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  List of expressi
6c70: 6f 6e 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20  ons to scan */. 
6c80: 20 45 78 70 72 20 2a 70 45 20 20 20 20 20 20 20   Expr *pE       
6c90: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
6ca0: 6e 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20  n we are trying 
6cb0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
6cc0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
6cd0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
6ce0: 74 65 72 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44  ter */..  UNUSED
6cf0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73  _PARAMETER(pPars
6d00: 65 29 3b 0a 0a 20 20 69 66 28 20 70 45 2d 3e 6f  e);..  if( pE->o
6d10: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
6d20: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 45 2d  char *zCol = pE-
6d30: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 66  >u.zToken;.    f
6d40: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
6d50: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
6d60: 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d       char *zAs =
6d70: 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e   pEList->a[i].zN
6d80: 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  ame;.      if( z
6d90: 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  As!=0 && sqlite3
6da0: 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f  StrICmp(zAs, zCo
6db0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
6dc0: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
6dd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6de0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
6df0: 0a 2a 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e  .** pE is a poin
6e00: 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73  ter to an expres
6e10: 73 69 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20  sion which is a 
6e20: 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74  single term in t
6e30: 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f  he.** ORDER BY o
6e40: 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  f a compound SEL
6e50: 45 43 54 2e 20 20 54 68 65 20 65 78 70 72 65 73  ECT.  The expres
6e60: 73 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  sion has not bee
6e70: 6e 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 76  n.** name resolv
6e80: 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ed..**.** At the
6e90: 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74   point this rout
6ea0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77  ine is called, w
6eb0: 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74  e already know t
6ec0: 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  hat the.** ORDER
6ed0: 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f 74 20   BY term is not 
6ee0: 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64 65 78  an integer index
6ef0: 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75 6c 74   into the result
6f00: 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63   set.  That.** c
6f10: 61 73 65 20 69 73 20 68 61 6e 64 6c 65 64 20 62  ase is handled b
6f20: 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  y the calling ro
6f30: 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 74  utine..**.** Att
6f40: 65 6d 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45  empt to match pE
6f50: 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20   against result 
6f60: 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74  set columns in t
6f70: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20  he left-most.** 
6f80: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6f90: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  .  Return the in
6fa0: 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74  dex i of the mat
6fb0: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a  ching column,.**
6fc0: 20 61 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f   as an indicatio
6fd0: 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  n to the caller 
6fe0: 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73  that it should s
6ff0: 6f 72 74 20 62 79 20 74 68 65 20 69 2d 74 68 20  ort by the i-th 
7000: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 6c  column..** The l
7010: 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
7020: 69 73 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 20  is 1.  In other 
7030: 77 6f 72 64 73 2c 20 74 68 65 20 76 61 6c 75 65  words, the value
7040: 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
7050: 0a 2a 2a 20 73 61 6d 65 20 69 6e 74 65 67 65 72  .** same integer
7060: 20 76 61 6c 75 65 20 74 68 61 74 20 77 6f 75 6c   value that woul
7070: 64 20 62 65 20 75 73 65 64 20 69 6e 20 74 68 65  d be used in the
7080: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74   SQL statement t
7090: 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68  o indicate.** th
70a0: 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  e column..**.** 
70b0: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  If there is no m
70c0: 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20  atch, return 0. 
70d0: 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20 61 6e   Return -1 if an
70e0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a   error occurs..*
70f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
7100: 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d 54  olveOrderByTermT
7110: 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  oExprList(.  Par
7120: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
7130: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
7140: 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  xt for error mes
7150: 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63  sages */.  Selec
7160: 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a  t *pSelect,   /*
7170: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
7180: 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f  ement with the O
7190: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
71a0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20 20 20  /.  Expr *pE    
71b0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
71c0: 65 63 69 66 69 63 20 4f 52 44 45 52 20 42 59 20  ecific ORDER BY 
71d0: 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  term */.){.  int
71e0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
71f0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
7200: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
7210: 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63  EList;  /* The c
7220: 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65  olumns of the re
7230: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61  sult set */.  Na
7240: 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20  meContext nc;   
7250: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
7260: 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70   for resolving p
7270: 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  E */.  sqlite3 *
7280: 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
7290: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
72a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
72b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
72c0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
72d0: 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
72e0: 75 38 20 73 61 76 65 64 53 75 70 70 45 72 72 3b  u8 savedSuppErr;
72f0: 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
7300: 65 20 6f 66 20 64 62 2d 3e 73 75 70 70 72 65 73  e of db->suppres
7310: 73 45 72 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sErr */..  asser
7320: 74 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  t( sqlite3ExprIs
7330: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29 3d  Integer(pE, &i)=
7340: 3d 30 20 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d  =0 );.  pEList =
7350: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
7360: 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  ;..  /* Resolve 
7370: 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  all names in the
7380: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 65   ORDER BY term e
7390: 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20  xpression.  */. 
73a0: 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20   memset(&nc, 0, 
73b0: 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e  sizeof(nc));.  n
73c0: 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  c.pParse = pPars
73d0: 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74  e;.  nc.pSrcList
73e0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63   = pSelect->pSrc
73f0: 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20  ;.  nc.pEList = 
7400: 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e 63 46  pEList;.  nc.ncF
7410: 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77 41  lags = NC_AllowA
7420: 67 67 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20  gg;.  nc.nErr = 
7430: 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  0;.  db = pParse
7440: 2d 3e 64 62 3b 0a 20 20 73 61 76 65 64 53 75 70  ->db;.  savedSup
7450: 70 45 72 72 20 3d 20 64 62 2d 3e 73 75 70 70 72  pErr = db->suppr
7460: 65 73 73 45 72 72 3b 0a 20 20 64 62 2d 3e 73 75  essErr;.  db->su
7470: 70 70 72 65 73 73 45 72 72 20 3d 20 31 3b 0a 20  ppressErr = 1;. 
7480: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65 73   rc = sqlite3Res
7490: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 6e  olveExprNames(&n
74a0: 63 2c 20 70 45 29 3b 0a 20 20 64 62 2d 3e 73 75  c, pE);.  db->su
74b0: 70 70 72 65 73 73 45 72 72 20 3d 20 73 61 76 65  ppressErr = save
74c0: 64 53 75 70 70 45 72 72 3b 0a 20 20 69 66 28 20  dSuppErr;.  if( 
74d0: 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  rc ) return 0;..
74e0: 20 20 2f 2a 20 54 72 79 20 74 6f 20 6d 61 74 63    /* Try to matc
74f0: 68 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65  h the ORDER BY e
7500: 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73  xpression agains
7510: 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a  t an expression.
7520: 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75    ** in the resu
7530: 6c 74 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20  lt set.  Return 
7540: 61 6e 20 31 2d 62 61 73 65 64 20 69 6e 64 65 78  an 1-based index
7550: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
7560: 0a 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74  .  ** result-set
7570: 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 66   entry..  */.  f
7580: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74  or(i=0; i<pEList
7590: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
75a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
75b0: 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74  prCompare(pEList
75c0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
75d0: 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20  , -1)<2 ){.     
75e0: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
75f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
7600: 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e  no match, return
7610: 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20   0. */.  return 
7620: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
7630: 72 61 74 65 20 61 6e 20 4f 52 44 45 52 20 42 59  rate an ORDER BY
7640: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 74 65 72   or GROUP BY ter
7650: 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 65  m out-of-range e
7660: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
7670: 76 6f 69 64 20 72 65 73 6f 6c 76 65 4f 75 74 4f  void resolveOutO
7680: 66 52 61 6e 67 65 45 72 72 6f 72 28 0a 20 20 50  fRangeError(.  P
7690: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
76a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72        /* The err
76b0: 6f 72 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20  or context into 
76c0: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 74  which to write t
76d0: 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  he error */.  co
76e0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
76f0: 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20       /* "ORDER" 
7700: 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a 20 20  or "GROUP" */.  
7710: 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
7720: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
7730: 64 65 78 20 28 31 2d 62 61 73 65 64 29 20 6f 66  dex (1-based) of
7740: 20 74 68 65 20 74 65 72 6d 20 6f 75 74 20 6f 66   the term out of
7750: 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20   range */.  int 
7760: 6d 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mx              
7770: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 65     /* Largest pe
7780: 72 6d 69 73 73 69 62 6c 65 20 76 61 6c 75 65 20  rmissible value 
7790: 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  of i */.){.  sql
77a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
77b0: 72 73 65 2c 20 0a 20 20 20 20 22 25 72 20 25 73  rse, .    "%r %s
77c0: 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20   BY term out of 
77d0: 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
77e0: 65 20 22 0a 20 20 20 20 22 62 65 74 77 65 65 6e  e ".    "between
77f0: 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2c 20 7a   1 and %d", i, z
7800: 54 79 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a 2f 2a  Type, mx);.}../*
7810: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
7820: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
7830: 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  in a compound SE
7840: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
7850: 20 20 4d 6f 64 69 66 79 0a 2a 2a 20 65 61 63 68    Modify.** each
7860: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
7870: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
7880: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
7890: 65 72 20 62 65 74 77 65 65 6e 20 31 0a 2a 2a 20  er between 1.** 
78a0: 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73  and N where N is
78b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
78c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
78d0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e 0a 2a  mpound SELECT..*
78e0: 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65  *.** ORDER BY te
78f0: 72 6d 73 20 74 68 61 74 20 61 72 65 20 61 6c 72  rms that are alr
7900: 65 61 64 79 20 61 6e 20 69 6e 74 65 67 65 72 20  eady an integer 
7910: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20  between 1 and N 
7920: 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65  are.** unmodifie
7930: 64 2e 20 20 4f 52 44 45 52 20 42 59 20 74 65 72  d.  ORDER BY ter
7940: 6d 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ms that are inte
7950: 67 65 72 73 20 6f 75 74 73 69 64 65 20 74 68 65  gers outside the
7960: 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 31 20 74   range of.** 1 t
7970: 68 72 6f 75 67 68 20 4e 20 67 65 6e 65 72 61 74  hrough N generat
7980: 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 4f 52 44  e an error.  ORD
7990: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
79a0: 20 61 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73   are expressions
79b0: 0a 2a 2a 20 61 72 65 20 6d 61 74 63 68 65 64 20  .** are matched 
79c0: 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73  against result s
79d0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  et expressions o
79e0: 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  f compound SELEC
79f0: 54 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77  T.** beginning w
7a00: 69 74 68 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  ith the left-mos
7a10: 74 20 53 45 4c 45 43 54 20 61 6e 64 20 77 6f 72  t SELECT and wor
7a20: 6b 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20  king toward the 
7a30: 72 69 67 68 74 2e 0a 2a 2a 20 41 74 20 74 68 65  right..** At the
7a40: 20 66 69 72 73 74 20 6d 61 74 63 68 2c 20 74 68   first match, th
7a50: 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  e ORDER BY expre
7a60: 73 73 69 6f 6e 20 69 73 20 74 72 61 6e 73 66 6f  ssion is transfo
7a70: 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65  rmed into.** the
7a80: 20 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20   integer column 
7a90: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
7aa0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
7ab0: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a  of errors seen..
7ac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
7ad0: 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64  solveCompoundOrd
7ae0: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
7af0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
7b00: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
7b10: 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  .  Leave error m
7b20: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
7b30: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
7b40: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  t       /* The S
7b50: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
7b60: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f  containing the O
7b70: 52 44 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20 20  RDER BY */.){.  
7b80: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73  int i;.  ExprLis
7b90: 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45  t *pOrderBy;.  E
7ba0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
7bb0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7bc0: 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d    int moreToDo =
7bd0: 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20   1;..  pOrderBy 
7be0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65  = pSelect->pOrde
7bf0: 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  rBy;.  if( pOrde
7c00: 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
7c10: 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  0;.  db = pParse
7c20: 2d 3e 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45  ->db;.#if SQLITE
7c30: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66  _MAX_COLUMN.  if
7c40: 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
7c50: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
7c60: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
7c70: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
7c80: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7c90: 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
7ca0: 20 69 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   in ORDER BY cla
7cb0: 75 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  use");.    retur
7cc0: 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 1;.  }.#endif.
7cd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
7ce0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
7cf0: 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79  +){.    pOrderBy
7d00: 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b  ->a[i].done = 0;
7d10: 0a 20 20 7d 0a 20 20 70 53 65 6c 65 63 74 2d 3e  .  }.  pSelect->
7d20: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 77 68 69  pNext = 0;.  whi
7d30: 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  le( pSelect->pPr
7d40: 69 6f 72 20 29 7b 0a 20 20 20 20 70 53 65 6c 65  ior ){.    pSele
7d50: 63 74 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78  ct->pPrior->pNex
7d60: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20  t = pSelect;.   
7d70: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
7d80: 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a  ct->pPrior;.  }.
7d90: 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74    while( pSelect
7da0: 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a   && moreToDo ){.
7db0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
7dc0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
7dd0: 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20  .    moreToDo = 
7de0: 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20  0;.    pEList = 
7df0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
7e00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c  .    assert( pEL
7e10: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f  ist!=0 );.    fo
7e20: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
7e30: 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64  derBy->a; i<pOrd
7e40: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
7e50: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
7e60: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b    int iCol = -1;
7e70: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c  .      Expr *pE,
7e80: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66   *pDup;.      if
7e90: 28 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 29 20  ( pItem->done ) 
7ea0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7eb0: 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pE = sqlite3Expr
7ec0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 49 74 65  SkipCollate(pIte
7ed0: 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  m->pExpr);.     
7ee0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
7ef0: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
7f00: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Col) ){.        
7f10: 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69  if( iCol<=0 || i
7f20: 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
7f30: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  r ){.          r
7f40: 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65  esolveOutOfRange
7f50: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 22 4f  Error(pParse, "O
7f60: 52 44 45 52 22 2c 20 69 2b 31 2c 20 70 45 4c 69  RDER", i+1, pELi
7f70: 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20  st->nExpr);.    
7f80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7fa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
7fb0: 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73 4e  Col = resolveAsN
7fc0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69  ame(pParse, pELi
7fd0: 73 74 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20  st, pE);.       
7fe0: 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29 7b 0a   if( iCol==0 ){.
7ff0: 20 20 20 20 20 20 20 20 20 20 70 44 75 70 20 3d            pDup =
8000: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8010: 64 62 2c 20 70 45 2c 20 30 29 3b 0a 20 20 20 20  db, pE, 0);.    
8020: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
8030: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
8040: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
8050: 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  t(pDup);.       
8060: 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f       iCol = reso
8070: 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f  lveOrderByTermTo
8080: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
8090: 20 70 53 65 6c 65 63 74 2c 20 70 44 75 70 29 3b   pSelect, pDup);
80a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
80b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
80c0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75  prDelete(db, pDu
80d0: 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
80e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
80f0: 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  iCol>0 ){.      
8100: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
8110: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69   ORDER BY term i
8120: 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 63  nto an integer c
8130: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 43 6f  olumn number iCo
8140: 6c 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61  l,.        ** ta
8150: 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 70 72 65  king care to pre
8160: 73 65 72 76 65 20 74 68 65 20 43 4f 4c 4c 41 54  serve the COLLAT
8170: 45 20 63 6c 61 75 73 65 20 69 66 20 69 74 20 65  E clause if it e
8180: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  xists */.       
8190: 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71   Expr *pNew = sq
81a0: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b  lite3Expr(db, TK
81b0: 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20  _INTEGER, 0);.  
81c0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d        if( pNew==
81d0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
81e0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67        pNew->flag
81f0: 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65  s |= EP_IntValue
8200: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
8210: 75 2e 69 56 61 6c 75 65 20 3d 20 69 43 6f 6c 3b  u.iValue = iCol;
8220: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
8230: 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 45 20 29 7b  em->pExpr==pE ){
8240: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d  .          pItem
8250: 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a  ->pExpr = pNew;.
8260: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8270: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8280: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f   pItem->pExpr->o
8290: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
82a0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
82b0: 74 28 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d  t( pItem->pExpr-
82c0: 3e 70 4c 65 66 74 3d 3d 70 45 20 29 3b 0a 20 20  >pLeft==pE );.  
82d0: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
82e0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e  Expr->pLeft = pN
82f0: 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ew;.        }.  
8300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8310: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 29 3b  rDelete(db, pE);
8320: 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
8330: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
8340: 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16)iCol;.       
8350: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 31   pItem->done = 1
8360: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8370: 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20         moreToDo 
8380: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
8390: 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d   }.    pSelect =
83a0: 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b   pSelect->pNext;
83b0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
83c0: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
83d0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
83e0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
83f0: 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  done==0 ){.     
8400: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
8410: 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52 44  (pParse, "%r ORD
8420: 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20  ER BY term does 
8430: 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22 0a  not match any ".
8440: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c              "col
8450: 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  umn in the resul
8460: 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20  t set", i+1);.  
8470: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8480: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8490: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65   0;.}../*.** Che
84a0: 63 6b 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  ck every term in
84b0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   the ORDER BY or
84c0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
84d0: 20 70 4f 72 64 65 72 42 79 20 6f 66 0a 2a 2a 20   pOrderBy of.** 
84e0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
84f0: 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e 20 20 49  ment pSelect.  I
8500: 66 20 61 6e 79 20 74 65 72 6d 20 69 73 20 72 65  f any term is re
8510: 66 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20  ference to a.** 
8520: 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72 65  result set expre
8530: 73 73 69 6f 6e 20 28 61 73 20 64 65 74 65 72 6d  ssion (as determ
8540: 69 6e 65 64 20 62 79 20 74 68 65 20 45 78 70 72  ined by the Expr
8550: 4c 69 73 74 2e 61 2e 69 4f 72 64 65 72 42 79 43  List.a.iOrderByC
8560: 6f 6c 20 66 69 65 6c 64 29 0a 2a 2a 20 74 68 65  ol field).** the
8570: 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 74  n convert that t
8580: 65 72 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79 20  erm into a copy 
8590: 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
85a0: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 0a  ding result set.
85b0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  ** column..**.**
85c0: 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
85d0: 72 65 20 64 65 74 65 63 74 65 64 2c 20 61 64 64  re detected, add
85e0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
85f0: 65 20 74 6f 20 70 50 61 72 73 65 20 61 6e 64 0a  e to pParse and.
8600: 2a 2a 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** return non-ze
8610: 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ro.  Return zero
8620: 20 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 61 72   if no errors ar
8630: 65 20 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  e seen..*/.int s
8640: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
8650: 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72  erGroupBy(.  Par
8660: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8670: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8680: 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72  ntext.  Leave er
8690: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
86a0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
86b0: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20  Select,      /* 
86c0: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
86d0: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ment containing 
86e0: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  the clause */.  
86f0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
8700: 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By,   /* The ORD
8710: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
8720: 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70  Y clause to be p
8730: 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f  rocessed */.  co
8740: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
8750: 20 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f      /* "ORDER" o
8760: 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a  r "GROUP" */.){.
8770: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
8780: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
8790: 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  >db;.  ExprList 
87a0: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
87b0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
87c0: 2a 70 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70  *pItem;..  if( p
87d0: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50  OrderBy==0 || pP
87e0: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
87f0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
8800: 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  0;.#if SQLITE_MA
8810: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
8820: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64  OrderBy->nExpr>d
8830: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
8840: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
8850: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
8860: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
8870: 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e  oo many terms in
8880: 20 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20   %s BY clause", 
8890: 7a 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75  zType);.    retu
88a0: 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 1;.  }.#endif
88b0: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
88c0: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  ect->pEList;.  a
88d0: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
88e0: 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 53   );  /* sqlite3S
88f0: 65 6c 65 63 74 4e 65 77 28 29 20 67 75 61 72 61  electNew() guara
8900: 6e 74 65 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  ntees this */.  
8910: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
8920: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f  OrderBy->a; i<pO
8930: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
8940: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
8950: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 4f 72    if( pItem->iOr
8960: 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20  derByCol ){.    
8970: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 4f 72    if( pItem->iOr
8980: 64 65 72 42 79 43 6f 6c 3e 70 45 4c 69 73 74 2d  derByCol>pEList-
8990: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
89a0: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
89b0: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
89c0: 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 70 45 4c   zType, i+1, pEL
89d0: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
89e0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
89f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
8a00: 6f 6c 76 65 41 6c 69 61 73 28 70 50 61 72 73 65  olveAlias(pParse
8a10: 2c 20 70 45 4c 69 73 74 2c 20 70 49 74 65 6d 2d  , pEList, pItem-
8a20: 3e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 2c 20  >iOrderByCol-1, 
8a30: 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 7a 54  pItem->pExpr, zT
8a40: 79 70 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ype,0);.    }.  
8a50: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
8a60: 0a 2f 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  ./*.** pOrderBy 
8a70: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  is an ORDER BY o
8a80: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
8a90: 65 20 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74  e in SELECT stat
8aa0: 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e 0a 2a  ement pSelect..*
8ab0: 2a 20 54 68 65 20 4e 61 6d 65 20 63 6f 6e 74 65  * The Name conte
8ac0: 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  xt of the SELECT
8ad0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 4e   statement is pN
8ae0: 43 2e 20 20 7a 54 79 70 65 20 69 73 20 65 69 74  C.  zType is eit
8af0: 68 65 72 0a 2a 2a 20 22 4f 52 44 45 52 22 20 6f  her.** "ORDER" o
8b00: 72 20 22 47 52 4f 55 50 22 20 64 65 70 65 6e 64  r "GROUP" depend
8b10: 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 74 79 70  ing on which typ
8b20: 65 20 6f 66 20 63 6c 61 75 73 65 20 70 4f 72 64  e of clause pOrd
8b30: 65 72 42 79 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  erBy is..**.** T
8b40: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f  his routine reso
8b50: 6c 76 65 73 20 65 61 63 68 20 74 65 72 6d 20 6f  lves each term o
8b60: 66 20 74 68 65 20 63 6c 61 75 73 65 20 69 6e 74  f the clause int
8b70: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  o an expression.
8b80: 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 64 65 72  .** If the order
8b90: 2d 62 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69  -by term is an i
8ba0: 6e 74 65 67 65 72 20 49 20 62 65 74 77 65 65 6e  nteger I between
8bb0: 20 31 20 61 6e 64 20 4e 20 28 77 68 65 72 65 20   1 and N (where 
8bc0: 4e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  N is the.** numb
8bd0: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
8be0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
8bf0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 29 20 74  of the SELECT) t
8c00: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
8c10: 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73  on.** in the res
8c20: 6f 6c 75 74 69 6f 6e 20 69 73 20 61 20 63 6f 70  olution is a cop
8c30: 79 20 6f 66 20 74 68 65 20 49 2d 74 68 20 72 65  y of the I-th re
8c40: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
8c50: 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20  ion.  If.** the 
8c60: 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73  order-by term is
8c70: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 74   an identifier t
8c80: 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  hat corresponds 
8c90: 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f  to the AS-name o
8ca0: 66 0a 2a 2a 20 61 20 72 65 73 75 6c 74 2d 73 65  f.** a result-se
8cb0: 74 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68  t expression, th
8cc0: 65 6e 20 74 68 65 20 74 65 72 6d 20 72 65 73 6f  en the term reso
8cd0: 6c 76 65 73 20 74 6f 20 61 20 63 6f 70 79 20 6f  lves to a copy o
8ce0: 66 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d  f the.** result-
8cf0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  set expression. 
8d00: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20   Otherwise, the 
8d10: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65  expression is re
8d20: 73 6f 6c 76 65 64 20 69 6e 0a 2a 2a 20 74 68 65  solved in.** the
8d30: 20 75 73 75 61 6c 20 77 61 79 20 2d 20 75 73 69   usual way - usi
8d40: 6e 67 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ng sqlite3Resolv
8d50: 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2a  eExprNames()..**
8d60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8d70: 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d   returns the num
8d80: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20  ber of errors.  
8d90: 49 66 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c  If errors occur,
8da0: 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 61 70 70 72   then.** an appr
8db0: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65  opriate error me
8dc0: 73 73 61 67 65 20 6d 69 67 68 74 20 62 65 20 6c  ssage might be l
8dd0: 65 66 74 20 69 6e 20 70 50 61 72 73 65 2e 20 20  eft in pParse.  
8de0: 28 4f 4f 4d 20 65 72 72 6f 72 73 0a 2a 2a 20 65  (OOM errors.** e
8df0: 78 63 65 70 74 65 64 2e 29 0a 2a 2f 0a 73 74 61  xcepted.).*/.sta
8e00: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f  tic int resolveO
8e10: 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e  rderGroupBy(.  N
8e20: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
8e30: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65       /* The name
8e40: 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   context of the 
8e50: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8e60: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
8e70: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
8e80: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
8e90: 65 6e 74 20 68 6f 6c 64 69 6e 67 20 70 4f 72 64  ent holding pOrd
8ea0: 65 72 42 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69  erBy */.  ExprLi
8eb0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
8ec0: 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f  /* An ORDER BY o
8ed0: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
8ee0: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a  e to resolve */.
8ef0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
8f00: 79 70 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65  ype     /* Eithe
8f10: 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  r "ORDER" or "GR
8f20: 4f 55 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72  OUP", as appropr
8f30: 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  iate */.){.  int
8f40: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
8f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8f60: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
8f70: 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20    int iCol;     
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65   /* Column numbe
8fa0: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78  r */.  struct Ex
8fb0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
8fc0: 65 6d 3b 20 20 20 2f 2a 20 41 20 74 65 72 6d 20  em;   /* A term 
8fd0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
8fe0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73  clause */.  Pars
8ff0: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
9000: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
9010: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9020: 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 20  .  int nResult; 
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9040: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
9050: 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75  erms in the resu
9060: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 69 66 28  lt set */..  if(
9070: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
9080: 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 73 75  eturn 0;.  nResu
9090: 6c 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  lt = pSelect->pE
90a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70  List->nExpr;.  p
90b0: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
90c0: 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  rse;.  for(i=0, 
90d0: 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
90e0: 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  a; i<pOrderBy->n
90f0: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
9100: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
9110: 45 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  E = pItem->pExpr
9120: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 32 20  ;.    Expr *pE2 
9130: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
9140: 70 43 6f 6c 6c 61 74 65 28 70 45 29 3b 0a 20 20  pCollate(pE);.  
9150: 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d    if( zType[0]!=
9160: 27 47 27 20 29 7b 0a 20 20 20 20 20 20 69 43 6f  'G' ){.      iCo
9170: 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d  l = resolveAsNam
9180: 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63  e(pParse, pSelec
9190: 74 2d 3e 70 45 4c 69 73 74 2c 20 70 45 32 29 3b  t->pEList, pE2);
91a0: 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e  .      if( iCol>
91b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
91c0: 49 66 20 61 6e 20 41 53 2d 6e 61 6d 65 20 6d 61  If an AS-name ma
91d0: 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20 6d 61  tch is found, ma
91e0: 72 6b 20 74 68 69 73 20 4f 52 44 45 52 20 42 59  rk this ORDER BY
91f0: 20 63 6f 6c 75 6d 6e 20 61 73 20 62 65 69 6e 67   column as being
9200: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
9210: 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74  py of the iCol-t
9220: 68 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  h result-set col
9230: 75 6d 6e 2e 20 20 54 68 65 20 73 75 62 73 65 71  umn.  The subseq
9240: 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  uent call to.   
9250: 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52       ** sqlite3R
9260: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
9270: 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72  By() will conver
9280: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
9290: 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20 2a 2a   to a.        **
92a0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
92b0: 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20  l-th result-set 
92c0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20  expression. */. 
92d0: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f         pItem->iO
92e0: 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
92f0: 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 63  )iCol;.        c
9300: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
9310: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
9320: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
9330: 67 65 72 28 70 45 32 2c 20 26 69 43 6f 6c 29 20  ger(pE2, &iCol) 
9340: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
9350: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73  ORDER BY term is
9360: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
9370: 74 61 6e 74 2e 20 20 41 67 61 69 6e 2c 20 73 65  tant.  Again, se
9380: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  t the column.   
9390: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 73 6f 20     ** number so 
93a0: 74 68 61 74 20 73 71 6c 69 74 65 33 52 65 73 6f  that sqlite3Reso
93b0: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
93c0: 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  ) will convert t
93d0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  he.      ** orde
93e0: 72 2d 62 79 20 74 65 72 6d 20 74 6f 20 61 20 63  r-by term to a c
93f0: 6f 70 79 20 6f 66 20 74 68 65 20 72 65 73 75 6c  opy of the resul
9400: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
9410: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43   */.      if( iC
9420: 6f 6c 3c 31 20 7c 7c 20 69 43 6f 6c 3e 30 78 66  ol<1 || iCol>0xf
9430: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fff ){.        r
9440: 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65  esolveOutOfRange
9450: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54  Error(pParse, zT
9460: 79 70 65 2c 20 69 2b 31 2c 20 6e 52 65 73 75 6c  ype, i+1, nResul
9470: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
9480: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
9490: 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65      pItem->iOrde
94a0: 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43  rByCol = (u16)iC
94b0: 6f 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ol;.      contin
94c0: 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ue;.    }..    /
94d0: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74 72 65  * Otherwise, tre
94e0: 61 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  at the ORDER BY 
94f0: 74 65 72 6d 20 61 73 20 61 6e 20 6f 72 64 69 6e  term as an ordin
9500: 61 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ary expression *
9510: 2f 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72  /.    pItem->iOr
9520: 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
9530: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
9540: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e  olveExprNames(pN
9550: 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  C, pE) ){.      
9560: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
9570: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
9580: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
9590: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
95a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
95b0: 70 72 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 53  prCompare(pE, pS
95c0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
95d0: 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31 29 3d 3d  [j].pExpr, -1)==
95e0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  0 ){.        pIt
95f0: 65 6d 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20  em->iOrderByCol 
9600: 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  = j+1;.      }. 
9610: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9620: 6e 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  n sqlite3Resolve
9630: 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
9640: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 4f  rse, pSelect, pO
9650: 72 64 65 72 42 79 2c 20 7a 54 79 70 65 29 3b 0a  rderBy, zType);.
9660: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
9670: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 53 45   names in the SE
9680: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
9690: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
96a0: 64 65 73 63 65 6e 64 65 6e 74 73 2e 0a 2a 2f 0a  descendents..*/.
96b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
96c0: 76 65 53 65 6c 65 63 74 53 74 65 70 28 57 61 6c  veSelectStep(Wal
96d0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
96e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 4e 61 6d 65  lect *p){.  Name
96f0: 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
9700: 43 3b 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 74  C;  /* Context t
9710: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 69  hat contains thi
9720: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 4e 61  s SELECT */.  Na
9730: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
9740: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
9750: 6e 74 65 78 74 20 6f 66 20 74 68 69 73 20 53 45  ntext of this SE
9760: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 73  LECT */.  int is
9770: 43 6f 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20  Compound;       
9780: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 20 69    /* True if p i
9790: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
97a0: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ect */.  int nCo
97b0: 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20  mpound;         
97c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
97d0: 6d 70 6f 75 6e 64 20 74 65 72 6d 73 20 70 72 6f  mpound terms pro
97e0: 63 65 73 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  cessed so far */
97f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9800: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;          /* Pa
9810: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9820: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
9830: 69 73 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  ist;       /* Re
9840: 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
9850: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  ion list */.  in
9860: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
9870: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
9880: 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c  unter */.  ExprL
9890: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
98a0: 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
98b0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53  BY clause */.  S
98c0: 65 6c 65 63 74 20 2a 70 4c 65 66 74 6d 6f 73 74  elect *pLeftmost
98d0: 3b 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d  ;      /* Left-m
98e0: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 20 6f 66  ost of SELECT of
98f0: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20   a compound */. 
9900: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
9910: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
9920: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9930: 2a 2f 0a 20 20 0a 0a 20 20 61 73 73 65 72 74 28  */.  ..  assert(
9940: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   p!=0 );.  if( p
9950: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
9960: 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20  Resolved ){.    
9970: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
9980: 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 65 72 4e 43  ;.  }.  pOuterNC
9990: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
99a0: 43 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  C;.  pParse = pW
99b0: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
99c0: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
99d0: 3b 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79  ;..  /* Normally
99e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
99f0: 70 61 6e 64 28 29 20 77 69 6c 6c 20 62 65 20 63  pand() will be c
9a00: 61 6c 6c 65 64 20 66 69 72 73 74 20 61 6e 64 20  alled first and 
9a10: 77 69 6c 6c 20 68 61 76 65 0a 20 20 2a 2a 20 61  will have.  ** a
9a20: 6c 72 65 61 64 79 20 65 78 70 61 6e 64 65 64 20  lready expanded 
9a30: 74 68 69 73 20 53 45 4c 45 43 54 2e 20 20 48 6f  this SELECT.  Ho
9a40: 77 65 76 65 72 2c 20 69 66 20 74 68 69 73 20 69  wever, if this i
9a50: 73 20 61 20 73 75 62 71 75 65 72 79 20 77 69 74  s a subquery wit
9a60: 68 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 78 70 72  hin.  ** an expr
9a70: 65 73 73 69 6f 6e 2c 20 73 71 6c 69 74 65 33 52  ession, sqlite3R
9a80: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
9a90: 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  ) will be called
9aa0: 20 77 69 74 68 6f 75 74 20 61 0a 20 20 2a 2a 20   without a.  ** 
9ab0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
9ac0: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
9ad0: 64 28 29 2e 20 20 57 68 65 6e 20 74 68 61 74 20  d().  When that 
9ae0: 68 61 70 70 65 6e 73 2c 20 6c 65 74 0a 20 20 2a  happens, let.  *
9af0: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  * sqlite3SelectP
9b00: 72 65 70 28 29 20 64 6f 20 61 6c 6c 20 6f 66 20  rep() do all of 
9b10: 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
9b20: 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 2e 0a  or this SELECT..
9b30: 20 20 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65    ** sqlite3Sele
9b40: 63 74 50 72 65 70 28 29 20 77 69 6c 6c 20 69 6e  ctPrep() will in
9b50: 76 6f 6b 65 20 62 6f 74 68 20 73 71 6c 69 74 65  voke both sqlite
9b60: 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
9b70: 61 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f  and.  ** this ro
9b80: 75 74 69 6e 65 20 69 6e 20 74 68 65 20 63 6f 72  utine in the cor
9b90: 72 65 63 74 20 6f 72 64 65 72 2e 0a 20 20 2a 2f  rect order..  */
9ba0: 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
9bb0: 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
9bc0: 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  d)==0 ){.    sql
9bd0: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
9be0: 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
9bf0: 4e 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  NC);.    return 
9c00: 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c  (pParse->nErr ||
9c10: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9c20: 64 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a  d) ? WRC_Abort :
9c30: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
9c40: 0a 20 20 69 73 43 6f 6d 70 6f 75 6e 64 20 3d 20  .  isCompound = 
9c50: 70 2d 3e 70 50 72 69 6f 72 21 3d 30 3b 0a 20 20  p->pPrior!=0;.  
9c60: 6e 43 6f 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a 20  nCompound = 0;. 
9c70: 20 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 3b 0a   pLeftmost = p;.
9c80: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
9c90: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
9ca0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
9cb0: 6e 64 65 64 29 21 3d 30 20 29 3b 0a 20 20 20 20  nded)!=0 );.    
9cc0: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
9cd0: 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
9ce0: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ed)==0 );.    p-
9cf0: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
9d00: 52 65 73 6f 6c 76 65 64 3b 0a 0a 20 20 20 20 2f  Resolved;..    /
9d10: 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * Resolve the ex
9d20: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
9d30: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
9d40: 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65  T clauses. These
9d50: 0a 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  .    ** are not 
9d60: 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
9d70: 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
9d80: 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
9d90: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 20  NameContext..   
9da0: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
9db0: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
9dc0: 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
9dd0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
9de0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
9df0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26  solveExprNames(&
9e00: 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20  sNC, p->pLimit) 
9e10: 7c 7c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ||.        sqlit
9e20: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
9e30: 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66  es(&sNC, p->pOff
9e40: 73 65 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65  set) ){.      re
9e50: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
9e60: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
9e70: 52 65 63 75 72 73 69 76 65 6c 79 20 72 65 73 6f  Recursively reso
9e80: 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  lve names in all
9e90: 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20   subqueries.    
9ea0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
9eb0: 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
9ec0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
9ed0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
9ee0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
9ef0: 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
9f00: 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  if( pItem->pSele
9f10: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 61  ct ){.        Na
9f20: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20  meContext *pNC; 
9f30: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
9f40: 74 6f 20 69 74 65 72 61 74 65 20 6e 61 6d 65 20  to iterate name 
9f50: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20  contexts */.    
9f60: 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 30      int nRef = 0
9f70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
9f80: 20 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 70 4f   Refcount for pO
9f90: 75 74 65 72 4e 43 20 61 6e 64 20 6f 75 74 65 72  uterNC and outer
9fa0: 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20   contexts */.   
9fb0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
9fc0: 2a 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 20 3d  *zSavedContext =
9fd0: 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
9fe0: 6e 74 65 78 74 3b 0a 0a 20 20 20 20 20 20 20 20  ntext;..        
9ff0: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 74 6f 74  /* Count the tot
a000: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  al number of ref
a010: 65 72 65 6e 63 65 73 20 74 6f 20 70 4f 75 74 65  erences to pOute
a020: 72 4e 43 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  rNC and all of i
a030: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ts.        ** pa
a040: 72 65 6e 74 20 63 6f 6e 74 65 78 74 73 2e 20 41  rent contexts. A
a050: 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67 20 72  fter resolving r
a060: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 65 78 70  eferences to exp
a070: 72 65 73 73 69 6f 6e 73 20 69 6e 0a 20 20 20 20  ressions in.    
a080: 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 70 53      ** pItem->pS
a090: 65 6c 65 63 74 2c 20 63 68 65 63 6b 20 69 66 20  elect, check if 
a0a0: 74 68 69 73 20 76 61 6c 75 65 20 68 61 73 20 63  this value has c
a0b0: 68 61 6e 67 65 64 2e 20 49 66 20 73 6f 2c 20 74  hanged. If so, t
a0c0: 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  hen.        ** S
a0d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
a0e0: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 6d  pItem->pSelect m
a0f0: 75 73 74 20 62 65 20 63 6f 72 72 65 6c 61 74 65  ust be correlate
a100: 64 2e 20 53 65 74 20 74 68 65 0a 20 20 20 20 20  d. Set the.     
a110: 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 69 73 43     ** pItem->isC
a120: 6f 72 72 65 6c 61 74 65 64 20 66 6c 61 67 20 69  orrelated flag i
a130: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
a140: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  se. */.        f
a150: 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b  or(pNC=pOuterNC;
a160: 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70   pNC; pNC=pNC->p
a170: 4e 65 78 74 29 20 6e 52 65 66 20 2b 3d 20 70 4e  Next) nRef += pN
a180: 43 2d 3e 6e 52 65 66 3b 0a 0a 20 20 20 20 20 20  C->nRef;..      
a190: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
a1a0: 6d 65 20 29 20 70 50 61 72 73 65 2d 3e 7a 41 75  me ) pParse->zAu
a1b0: 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
a1c0: 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  m->zName;.      
a1d0: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
a1e0: 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
a1f0: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
a200: 63 74 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20  ct, pOuterNC);. 
a210: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a         pParse->z
a220: 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
a230: 61 76 65 64 43 6f 6e 74 65 78 74 3b 0a 20 20 20  avedContext;.   
a240: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
a250: 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
a260: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
a270: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20  rn WRC_Abort;.. 
a280: 20 20 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70         for(pNC=p
a290: 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e  OuterNC; pNC; pN
a2a0: 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52  C=pNC->pNext) nR
a2b0: 65 66 20 2d 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  ef -= pNC->nRef;
a2c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
a2d0: 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c   pItem->isCorrel
a2e0: 61 74 65 64 3d 3d 30 20 26 26 20 6e 52 65 66 3c  ated==0 && nRef<
a2f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  =0 );.        pI
a300: 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65  tem->isCorrelate
a310: 64 20 3d 20 28 6e 52 65 66 21 3d 30 29 3b 0a 20  d = (nRef!=0);. 
a320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
a330: 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68      /* Set up th
a340: 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e  e local name-con
a350: 74 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20  text to pass to 
a360: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
a370: 70 72 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 20  prNames() to.   
a380: 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20   ** resolve the 
a390: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
a3a0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 20 20 20 20  ssion list..    
a3b0: 2a 2f 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  */.    sNC.ncFla
a3c0: 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67  gs = NC_AllowAgg
a3d0: 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
a3e0: 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
a3f0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f    sNC.pNext = pO
a400: 75 74 65 72 4e 43 3b 0a 20 20 0a 20 20 20 20 2f  uterNC;.  .    /
a410: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
a420: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
a430: 74 2e 20 2a 2f 0a 20 20 20 20 70 45 4c 69 73 74  t. */.    pEList
a440: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
a450: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
a460: 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
a470: 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; i<pEList->nE
a480: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
a490: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69   Expr *pX = pELi
a4a0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
a4b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a4c0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
a4d0: 73 28 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20  s(&sNC, pX) ){. 
a4e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
a4f0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d  C_Abort;.      }
a500: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
a510: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
a520: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
a530: 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
a540: 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
a550: 52 4f 55 50 20 42 59 20 0a 20 20 20 20 2a 2a 20  ROUP BY .    ** 
a560: 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e  expression, do n
a570: 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61  ot allow aggrega
a580: 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  tes in any of th
a590: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
a5a0: 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
a5b0: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
a5c0: 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
a5d0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ate)==0 );.    p
a5e0: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
a5f0: 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 70  oupBy;.    if( p
a600: 47 72 6f 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e  GroupBy || (sNC.
a610: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73  ncFlags & NC_Has
a620: 41 67 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Agg)!=0 ){.     
a630: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
a640: 53 46 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20  SF_Aggregate;.  
a650: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
a660: 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
a670: 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20  C_AllowAgg;.    
a680: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61  }.  .    /* If a
a690: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69   HAVING clause i
a6a0: 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
a6b0: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
a6c0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
a6d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
a6e0: 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70  p->pHaving && !p
a6f0: 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
a700: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a710: 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55  (pParse, "a GROU
a720: 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 72  P BY clause is r
a730: 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 48  equired before H
a740: 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 72  AVING");.      r
a750: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
a760: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
a770: 20 41 64 64 20 74 68 65 20 6f 75 74 70 75 74 20   Add the output 
a780: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 74  column list to t
a790: 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  he name-context 
a7a0: 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74  before parsing t
a7b0: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
a7c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
a7d0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
a7e0: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20  ent. This is so 
a7f0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 78 70 72  that.    ** expr
a800: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
a810: 48 45 52 45 20 63 6c 61 75 73 65 20 28 65 74 63  HERE clause (etc
a820: 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20  .) can refer to 
a830: 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20  expressions by. 
a840: 20 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e     ** aliases in
a850: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
a860: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4d  .    **.    ** M
a870: 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74  inor point: If t
a880: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
a890: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
a8a0: 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 20  sion will be.   
a8b0: 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64   ** re-evaluated
a8c0: 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72 65   for each refere
a8d0: 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  nce to it..    *
a8e0: 2f 0a 20 20 20 20 73 4e 43 2e 70 45 4c 69 73 74  /.    sNC.pEList
a8f0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
a900: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
a910: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
a920: 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20  NC, p->pHaving) 
a930: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
a940: 72 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  rt;.    if( sqli
a950: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
a960: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68  mes(&sNC, p->pWh
a970: 65 72 65 29 20 29 20 72 65 74 75 72 6e 20 57 52  ere) ) return WR
a980: 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 2f 2a  C_Abort;..    /*
a990: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   The ORDER BY an
a9a0: 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  d GROUP BY claus
a9b0: 65 73 20 6d 61 79 20 6e 6f 74 20 72 65 66 65 72  es may not refer
a9c0: 20 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20 20 20   to terms in.   
a9d0: 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 69 65   ** outer querie
a9e0: 73 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e  s .    */.    sN
a9f0: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  C.pNext = 0;.   
aa00: 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
aa10: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 0a 20 20  NC_AllowAgg;..  
aa20: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
aa30: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
aa40: 20 66 6f 72 20 73 69 6e 67 6c 65 74 6f 6e 20 53   for singleton S
aa50: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
aa60: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 52 44  ..    ** The ORD
aa70: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
aa80: 20 63 6f 6d 70 6f 75 6e 64 73 20 53 45 4c 45 43   compounds SELEC
aa90: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
aaa0: 68 61 6e 64 6c 65 64 0a 20 20 20 20 2a 2a 20 62  handled.    ** b
aab0: 65 6c 6f 77 2c 20 61 66 74 65 72 20 61 6c 6c 20  elow, after all 
aac0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  of the result-se
aad0: 74 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  ts for all of th
aae0: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 20 20  e elements of.  
aaf0: 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e    ** the compoun
ab00: 64 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f  d have been reso
ab10: 6c 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lved..    */.   
ab20: 20 69 66 28 20 21 69 73 43 6f 6d 70 6f 75 6e 64   if( !isCompound
ab30: 20 26 26 20 72 65 73 6f 6c 76 65 4f 72 64 65 72   && resolveOrder
ab40: 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2c  GroupBy(&sNC, p,
ab50: 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f   p->pOrderBy, "O
ab60: 52 44 45 52 22 29 20 29 7b 0a 20 20 20 20 20 20  RDER") ){.      
ab70: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
ab80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ab90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
aba0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
abb0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
abc0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f  }.  .    /* Reso
abd0: 6c 76 65 20 74 68 65 20 47 52 4f 55 50 20 42 59  lve the GROUP BY
abe0: 20 63 6c 61 75 73 65 2e 20 20 41 74 20 74 68 65   clause.  At the
abf0: 20 73 61 6d 65 20 74 69 6d 65 2c 20 6d 61 6b 65   same time, make
ac00: 20 73 75 72 65 20 0a 20 20 20 20 2a 2a 20 74 68   sure .    ** th
ac10: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
ac20: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
ac30: 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  in aggregate fun
ac40: 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  ctions..    */. 
ac50: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
ac60: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
ac70: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
ac80: 49 74 65 6d 3b 0a 20 20 20 20 0a 20 20 20 20 20  Item;.    .     
ac90: 20 69 66 28 20 72 65 73 6f 6c 76 65 4f 72 64 65   if( resolveOrde
aca0: 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70  rGroupBy(&sNC, p
acb0: 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f  , pGroupBy, "GRO
acc0: 55 50 22 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  UP") || db->mall
acd0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
ace0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
acf0: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
ad00: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
ad10: 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
ad20: 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
ad30: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
ad40: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  {.        if( Ex
ad50: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49  prHasProperty(pI
ad60: 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41  tem->pExpr, EP_A
ad70: 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gg) ){.         
ad80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ad90: 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67  (pParse, "aggreg
ada0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  ate functions ar
adb0: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
adc0: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
add0: 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63   "the GROUP BY c
ade0: 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20  lause");.       
adf0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
ae00: 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ort;.        }. 
ae10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
ae20: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20    /* Advance to 
ae30: 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 66  the next term of
ae40: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 0a 20 20   the compound.  
ae50: 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70 2d 3e    */.    p = p->
ae60: 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 43 6f 6d  pPrior;.    nCom
ae70: 70 6f 75 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  pound++;.  }..  
ae80: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 4f  /* Resolve the O
ae90: 52 44 45 52 20 42 59 20 6f 6e 20 61 20 63 6f 6d  RDER BY on a com
aea0: 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61 66 74  pound SELECT aft
aeb0: 65 72 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 0a  er all terms of.
aec0: 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e    ** the compoun
aed0: 64 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f  d have been reso
aee0: 6c 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lved..  */.  if(
aef0: 20 69 73 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72   isCompound && r
af00: 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72  esolveCompoundOr
af10: 64 65 72 42 79 28 70 50 61 72 73 65 2c 20 70 4c  derBy(pParse, pL
af20: 65 66 74 6d 6f 73 74 29 20 29 7b 0a 20 20 20 20  eftmost) ){.    
af30: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
af40: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
af50: 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a  WRC_Prune;.}../*
af60: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
af70: 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73   walks an expres
af80: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65  sion tree and re
af90: 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65  solves reference
afa0: 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f  s to.** table co
afb0: 6c 75 6d 6e 73 20 61 6e 64 20 72 65 73 75 6c 74  lumns and result
afc0: 2d 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 41  -set columns.  A
afd0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
afe0: 20 64 6f 20 65 72 72 6f 72 0a 2a 2a 20 63 68 65   do error.** che
aff0: 63 6b 69 6e 67 20 6f 6e 20 66 75 6e 63 74 69 6f  cking on functio
b000: 6e 20 75 73 61 67 65 20 61 6e 64 20 73 65 74 20  n usage and set 
b010: 61 20 66 6c 61 67 20 69 66 20 61 6e 79 20 61 67  a flag if any ag
b020: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
b030: 73 0a 2a 2a 20 61 72 65 20 73 65 65 6e 2e 0a 2a  s.** are seen..*
b040: 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20  *.** To resolve 
b050: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 72 65  table columns re
b060: 66 65 72 65 6e 63 65 73 20 77 65 20 6c 6f 6f 6b  ferences we look
b070: 20 66 6f 72 20 6e 6f 64 65 73 20 28 6f 72 20 73   for nodes (or s
b080: 75 62 74 72 65 65 73 29 20 6f 66 20 74 68 65 20  ubtrees) of the 
b090: 0a 2a 2a 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f  .** form X.Y.Z o
b0a0: 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 20  r Y.Z or just Z 
b0b0: 77 68 65 72 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20  where.**.**     
b0c0: 20 58 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f   X:   The name o
b0d0: 66 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 45  f a database.  E
b0e0: 78 3a 20 20 22 6d 61 69 6e 22 20 6f 72 20 22 74  x:  "main" or "t
b0f0: 65 6d 70 22 20 6f 72 0a 2a 2a 20 20 20 20 20 20  emp" or.**      
b100: 20 20 20 20 20 74 68 65 20 73 79 6d 62 6f 6c 69       the symboli
b110: 63 20 6e 61 6d 65 20 61 73 73 69 67 6e 65 64 20  c name assigned 
b120: 74 6f 20 61 6e 20 41 54 54 41 43 48 2d 65 64 20  to an ATTACH-ed 
b130: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
b140: 20 20 20 20 20 59 3a 20 20 20 54 68 65 20 6e 61       Y:   The na
b150: 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e  me of a table in
b160: 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20   a FROM clause. 
b170: 20 4f 72 20 69 6e 20 61 20 74 72 69 67 67 65 72   Or in a trigger
b180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6f 6e  .**           on
b190: 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
b1a0: 20 6e 61 6d 65 73 20 22 6f 6c 64 22 20 6f 72 20   names "old" or 
b1b0: 22 6e 65 77 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  "new"..**.**    
b1c0: 20 20 5a 3a 20 20 20 54 68 65 20 6e 61 6d 65 20    Z:   The name 
b1d0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  of a column in t
b1e0: 61 62 6c 65 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68  able Y..**.** Th
b1f0: 65 20 6e 6f 64 65 20 61 74 20 74 68 65 20 72 6f  e node at the ro
b200: 6f 74 20 6f 66 20 74 68 65 20 73 75 62 74 72 65  ot of the subtre
b210: 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 61 73  e is modified as
b220: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
b230: 20 20 20 45 78 70 72 2e 6f 70 20 20 20 20 20 20     Expr.op      
b240: 20 20 43 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f    Changed to TK_
b250: 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 45 78 70  COLUMN.**    Exp
b260: 72 2e 70 54 61 62 20 20 20 20 20 20 50 6f 69 6e  r.pTab      Poin
b270: 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  ts to the Table 
b280: 6f 62 6a 65 63 74 20 66 6f 72 20 58 2e 59 0a 2a  object for X.Y.*
b290: 2a 20 20 20 20 45 78 70 72 2e 69 43 6f 6c 75 6d  *    Expr.iColum
b2a0: 6e 20 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 69  n   The column i
b2b0: 6e 64 65 78 20 69 6e 20 58 2e 59 2e 20 20 2d 31  ndex in X.Y.  -1
b2c0: 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 2e 0a   for the rowid..
b2d0: 2a 2a 20 20 20 20 45 78 70 72 2e 69 54 61 62 6c  **    Expr.iTabl
b2e0: 65 20 20 20 20 54 68 65 20 56 44 42 45 20 63 75  e    The VDBE cu
b2f0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
b300: 58 2e 59 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20  X.Y.**.**.** To 
b310: 72 65 73 6f 6c 76 65 20 72 65 73 75 6c 74 2d 73  resolve result-s
b320: 65 74 20 72 65 66 65 72 65 6e 63 65 73 2c 20 6c  et references, l
b330: 6f 6f 6b 20 66 6f 72 20 65 78 70 72 65 73 73 69  ook for expressi
b340: 6f 6e 20 6e 6f 64 65 73 20 6f 66 20 74 68 65 0a  on nodes of the.
b350: 2a 2a 20 66 6f 72 6d 20 5a 20 28 77 69 74 68 20  ** form Z (with 
b360: 6e 6f 20 58 20 61 6e 64 20 59 20 70 72 65 66 69  no X and Y prefi
b370: 78 29 20 77 68 65 72 65 20 74 68 65 20 5a 20 6d  x) where the Z m
b380: 61 74 63 68 65 73 20 74 68 65 20 72 69 67 68 74  atches the right
b390: 2d 68 61 6e 64 0a 2a 2a 20 73 69 7a 65 20 6f 66  -hand.** size of
b3a0: 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20 69 6e   an AS clause in
b3b0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
b3c0: 6f 66 20 61 20 53 45 4c 45 43 54 2e 20 20 54 68  of a SELECT.  Th
b3d0: 65 20 5a 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  e Z expression.*
b3e0: 2a 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  * is replaced by
b3f0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c   a copy of the l
b400: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  eft-hand side of
b410: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
b420: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54  expression..** T
b430: 61 62 6c 65 2d 6e 61 6d 65 20 61 6e 64 20 66 75  able-name and fu
b440: 6e 63 74 69 6f 6e 20 72 65 73 6f 6c 75 74 69 6f  nction resolutio
b450: 6e 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20  n occurs on the 
b460: 73 75 62 73 74 69 74 75 74 65 64 20 65 78 70 72  substituted expr
b470: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 20  ession.** tree. 
b480: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e   For example, in
b490: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c  :.**.**      SEL
b4a0: 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20 63 2b  ECT a+b AS x, c+
b4b0: 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 4f  d AS y FROM t1 O
b4c0: 52 44 45 52 20 42 59 20 78 3b 0a 2a 2a 0a 2a 2a  RDER BY x;.**.**
b4d0: 20 54 68 65 20 22 78 22 20 74 65 72 6d 20 6f 66   The "x" term of
b4e0: 20 74 68 65 20 6f 72 64 65 72 20 62 79 20 69 73   the order by is
b4f0: 20 72 65 70 6c 61 63 65 64 20 62 79 20 22 61 2b   replaced by "a+
b500: 62 22 20 74 6f 20 72 65 6e 64 65 72 3a 0a 2a 2a  b" to render:.**
b510: 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20  .**      SELECT 
b520: 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20 41 53  a+b AS x, c+d AS
b530: 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   y FROM t1 ORDER
b540: 20 42 59 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46   BY a+b;.**.** F
b550: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20 61 72  unction calls ar
b560: 65 20 63 68 65 63 6b 65 64 20 74 6f 20 6d 61 6b  e checked to mak
b570: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
b580: 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20  function is .** 
b590: 64 65 66 69 6e 65 64 20 61 6e 64 20 74 68 61 74  defined and that
b5a0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d   the correct num
b5b0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
b5c0: 20 61 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a   are specified..
b5d0: 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
b5e0: 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  on is an aggrega
b5f0: 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  te function, the
b600: 6e 20 74 68 65 20 4e 43 5f 48 61 73 41 67 67 20  n the NC_HasAgg 
b610: 66 6c 61 67 20 69 73 0a 2a 2a 20 73 65 74 20 61  flag is.** set a
b620: 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  nd the opcode is
b630: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 54 4b   changed from TK
b640: 5f 46 55 4e 43 54 49 4f 4e 20 74 6f 20 54 4b 5f  _FUNCTION to TK_
b650: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2a  AGG_FUNCTION..**
b660: 20 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   If an expressio
b670: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65  n contains aggre
b680: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  gate functions t
b690: 68 65 6e 20 74 68 65 20 45 50 5f 41 67 67 0a 2a  hen the EP_Agg.*
b6a0: 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20 74 68  * property on th
b6b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
b6c0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 72  set..**.** An er
b6d0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
b6e0: 65 66 74 20 69 6e 20 70 50 61 72 73 65 20 69 66  eft in pParse if
b6f0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
b700: 73 73 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a  ss.  The number.
b710: 2a 2a 20 69 66 20 65 72 72 6f 72 73 20 69 73 20  ** if errors is 
b720: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
b730: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
b740: 78 70 72 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d  xprNames( .  Nam
b750: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
b760: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63       /* Namespac
b770: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70  e to resolve exp
b780: 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a  ressions in. */.
b790: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
b7a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b7b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
b7c0: 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29  e analyzed. */.)
b7d0: 7b 0a 20 20 75 38 20 73 61 76 65 64 48 61 73 41  {.  u8 savedHasA
b7e0: 67 67 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a  gg;.  Walker w;.
b7f0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
b800: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20  ) return 0;.#if 
b810: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
b820: 44 45 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20 20  DEPTH>0.  {.    
b830: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
b840: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  pNC->pParse;.   
b850: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
b860: 43 68 65 63 6b 48 65 69 67 68 74 28 70 50 61 72  CheckHeight(pPar
b870: 73 65 2c 20 70 45 78 70 72 2d 3e 6e 48 65 69 67  se, pExpr->nHeig
b880: 68 74 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e  ht+pNC->pParse->
b890: 6e 48 65 69 67 68 74 29 20 29 7b 0a 20 20 20 20  nHeight) ){.    
b8a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b8b0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48  }.    pParse->nH
b8c0: 65 69 67 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e  eight += pExpr->
b8d0: 6e 48 65 69 67 68 74 3b 0a 20 20 7d 0a 23 65 6e  nHeight;.  }.#en
b8e0: 64 69 66 0a 20 20 73 61 76 65 64 48 61 73 41 67  dif.  savedHasAg
b8f0: 67 20 3d 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  g = pNC->ncFlags
b900: 20 26 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20   & NC_HasAgg;.  
b910: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20  pNC->ncFlags &= 
b920: 7e 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20 6d 65  ~NC_HasAgg;.  me
b930: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
b940: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
b950: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f  rCallback = reso
b960: 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77  lveExprStep;.  w
b970: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
b980: 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74   = resolveSelect
b990: 53 74 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Step;.  w.pParse
b9a0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
b9b0: 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
b9c0: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  .  sqlite3WalkEx
b9d0: 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 23  pr(&w, pExpr);.#
b9e0: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
b9f0: 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 70 4e 43  PR_DEPTH>0.  pNC
ba00: 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68  ->pParse->nHeigh
ba10: 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69  t -= pExpr->nHei
ba20: 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ght;.#endif.  if
ba30: 28 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c  ( pNC->nErr>0 ||
ba40: 20 77 2e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e   w.pParse->nErr>
ba50: 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74  0 ){.    ExprSet
ba60: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
ba70: 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20  EP_Error);.  }. 
ba80: 20 69 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67   if( pNC->ncFlag
ba90: 73 20 26 20 4e 43 5f 48 61 73 41 67 67 20 29 7b  s & NC_HasAgg ){
baa0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
bab0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41  erty(pExpr, EP_A
bac0: 67 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  gg);.  }else if(
bad0: 20 73 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a   savedHasAgg ){.
bae0: 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73      pNC->ncFlags
baf0: 20 7c 3d 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20   |= NC_HasAgg;. 
bb00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72   }.  return Expr
bb10: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
bb20: 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a  r, EP_Error);.}.
bb30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
bb40: 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  all names in all
bb50: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
bb60: 61 20 53 45 4c 45 43 54 20 61 6e 64 20 69 6e 20  a SELECT and in 
bb70: 61 6c 6c 0a 2a 2a 20 64 65 63 65 6e 64 65 6e 74  all.** decendent
bb80: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2c  s of the SELECT,
bb90: 20 69 6e 63 6c 75 64 69 6e 67 20 63 6f 6d 70 6f   including compo
bba0: 75 6e 64 73 20 6f 66 66 20 6f 66 20 70 2d 3e 70  unds off of p->p
bbb0: 50 72 69 6f 72 2c 0a 2a 2a 20 73 75 62 71 75 65  Prior,.** subque
bbc0: 72 69 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  ries in expressi
bbd0: 6f 6e 73 2c 20 61 6e 64 20 73 75 62 71 75 65 72  ons, and subquer
bbe0: 69 65 73 20 75 73 65 64 20 61 73 20 46 52 4f 4d  ies used as FROM
bbf0: 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
bc00: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 73 71 6c 69  ..**.** See sqli
bc10: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
bc20: 6d 65 73 28 29 20 66 6f 72 20 61 20 64 65 73 63  mes() for a desc
bc30: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6b  ription of the k
bc40: 69 6e 64 73 20 6f 66 0a 2a 2a 20 74 72 61 6e 73  inds of.** trans
bc50: 66 6f 72 6d 61 74 69 6f 6e 73 20 74 68 61 74 20  formations that 
bc60: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  occur..**.** All
bc70: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bc80: 74 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ts should have b
bc90: 65 65 6e 20 65 78 70 61 6e 64 65 64 20 75 73 69  een expanded usi
bca0: 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  ng.** sqlite3Sel
bcb0: 65 63 74 45 78 70 61 6e 64 28 29 20 70 72 69 6f  ectExpand() prio
bcc0: 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
bcd0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76  is routine..*/.v
bce0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  oid sqlite3Resol
bcf0: 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 0a 20  veSelectNames(. 
bd00: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
bd10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
bd20: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
bd30: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
bd40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
bd50: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
bd60: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
bd70: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
bd80: 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
bd90: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
bda0: 61 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  arent SELECT sta
bdb0: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 57  tement */.){.  W
bdc0: 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 61 73 73 65  alker w;..  asse
bdd0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 6d 65  rt( p!=0 );.  me
bde0: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
bdf0: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
be00: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f  rCallback = reso
be10: 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77  lveExprStep;.  w
be20: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
be30: 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74   = resolveSelect
be40: 53 74 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Step;.  w.pParse
be50: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 75   = pParse;.  w.u
be60: 2e 70 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43 3b  .pNC = pOuterNC;
be70: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
be80: 6c 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 0a  lect(&w, p);.}..
be90: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61  /*.** Resolve na
bea0: 6d 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  mes in expressio
beb0: 6e 73 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ns that can only
bec0: 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
bed0: 67 6c 65 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a  gle table:.**.**
bee0: 20 20 20 20 2a 20 20 20 43 48 45 43 4b 20 63 6f      *   CHECK co
bef0: 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 20 20 20  nstraints.**    
bf00: 2a 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65  *   WHERE clause
bf10: 73 20 6f 6e 20 70 61 72 74 69 61 6c 20 69 6e 64  s on partial ind
bf20: 69 63 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ices.**.** The E
bf30: 78 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75 65  xpr.iTable value
bf40: 20 66 6f 72 20 45 78 70 72 2e 6f 70 3d 3d 54 4b   for Expr.op==TK
bf50: 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 6f 66  _COLUMN nodes of
bf60: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
bf70: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ** is set to -1 
bf80: 61 6e 64 20 74 68 65 20 45 78 70 72 2e 69 43 6f  and the Expr.iCo
bf90: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 73 65  lumn value is se
bfa0: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
bfb0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e  number..**.** An
bfc0: 79 20 65 72 72 6f 72 73 20 63 61 75 73 65 20 61  y errors cause a
bfd0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
bfe0: 74 6f 20 62 65 20 73 65 74 20 69 6e 20 70 50 61  to be set in pPa
bff0: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
c000: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
c010: 65 66 65 72 65 6e 63 65 28 0a 20 20 50 61 72 73  eference(.  Pars
c020: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
c030: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
c040: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
c050: 54 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  Tab,        /* T
c060: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 72  he table being r
c070: 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20 69  eferenced */.  i
c080: 6e 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20  nt type,        
c090: 20 20 20 2f 2a 20 4e 43 5f 49 73 43 68 65 63 6b     /* NC_IsCheck
c0a0: 20 6f 72 20 4e 43 5f 50 61 72 74 49 64 78 20 2a   or NC_PartIdx *
c0b0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
c0c0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
c0d0: 73 73 69 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65  ssion to resolve
c0e0: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  .  May be NULL. 
c0f0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
c100: 4c 69 73 74 20 20 20 20 20 2f 2a 20 45 78 70 72  List     /* Expr
c110: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72  ession list to r
c120: 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20  esolve.  May be 
c130: 4e 55 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  NUL. */.){.  Src
c140: 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20  List sSrc;      
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c160: 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72  Fake SrcList for
c170: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
c180: 6c 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  le */.  NameCont
c190: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
c1a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
c1b0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72  context for pPar
c1c0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
c1d0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
c200: 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  er */..  assert(
c210: 20 74 79 70 65 3d 3d 4e 43 5f 49 73 43 68 65 63   type==NC_IsChec
c220: 6b 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f 50 61  k || type==NC_Pa
c230: 72 74 49 64 78 20 29 3b 0a 20 20 6d 65 6d 73 65  rtIdx );.  memse
c240: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
c250: 66 28 73 4e 43 29 29 3b 0a 20 20 6d 65 6d 73 65  f(sNC));.  memse
c260: 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65  t(&sSrc, 0, size
c270: 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 73 53 72  of(sSrc));.  sSr
c280: 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 73 53  c.nSrc = 1;.  sS
c290: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
c2a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73  pTab->zName;.  s
c2b0: 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20  Src.a[0].pTab = 
c2c0: 70 54 61 62 3b 0a 20 20 73 53 72 63 2e 61 5b 30  pTab;.  sSrc.a[0
c2d0: 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
c2e0: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
c2f0: 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72  Parse;.  sNC.pSr
c300: 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20  cList = &sSrc;. 
c310: 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74   sNC.ncFlags = t
c320: 79 70 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ype;.  if( sqlit
c330: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
c340: 65 73 28 26 73 4e 43 2c 20 70 45 78 70 72 29 20  es(&sNC, pExpr) 
c350: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
c360: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
c370: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
c380: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
c390: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
c3a0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
c3b0: 4e 43 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  NC, pList->a[i].
c3c0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
c3d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
c3e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a        }.    }.  }.}.