/ Hex Artifact Content
Login

Artifact e729889b2c7a680ba4aa7296efa72c09369956d8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 18.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 77  tines used for w
01a0: 61 6c 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65  alking the parse
01b0: 72 20 74 72 65 65 20 61 6e 64 0a 2a 2a 20 72 65  r tree and.** re
01c0: 73 6f 6c 76 65 20 61 6c 6c 20 69 64 65 6e 74 69  solve all identi
01d0: 66 69 65 72 73 20 62 79 20 61 73 73 6f 63 69 61  fiers by associa
01e0: 74 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 61  ting them with a
01f0: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 74   particular.** t
0200: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
0210: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0220: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c  liteInt.h".#incl
0230: 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23  ude <stdlib.h>.#
0240: 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e  include <string.
0250: 68 3e 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74  h>../*.** Walk t
0260: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  he expression tr
0270: 65 65 20 70 45 78 70 72 20 61 6e 64 20 69 6e 63  ee pExpr and inc
0280: 72 65 61 73 65 20 74 68 65 20 61 67 67 72 65 67  rease the aggreg
0290: 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ate function.** 
02a0: 64 65 70 74 68 20 28 74 68 65 20 45 78 70 72 2e  depth (the Expr.
02b0: 6f 70 32 20 66 69 65 6c 64 29 20 62 79 20 4e 20  op2 field) by N 
02c0: 6f 6e 20 65 76 65 72 79 20 54 4b 5f 41 47 47 5f  on every TK_AGG_
02d0: 46 55 4e 43 54 49 4f 4e 20 6e 6f 64 65 2e 0a 2a  FUNCTION node..*
02e0: 2a 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  * This needs to 
02f0: 6f 63 63 75 72 20 77 68 65 6e 20 63 6f 70 79 69  occur when copyi
0300: 6e 67 20 61 20 54 4b 5f 41 47 47 5f 46 55 4e 43  ng a TK_AGG_FUNC
0310: 54 49 4f 4e 20 6e 6f 64 65 20 66 72 6f 6d 20 61  TION node from a
0320: 6e 0a 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 79  n.** outer query
0330: 20 69 6e 74 6f 20 61 6e 20 69 6e 6e 65 72 20 73   into an inner s
0340: 75 62 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 69  ubquery..**.** i
0350: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0360: 70 74 68 28 70 45 78 70 72 2c 6e 29 20 69 73 20  pth(pExpr,n) is 
0370: 74 68 65 20 6d 61 69 6e 20 72 6f 75 74 69 6e 65  the main routine
0380: 2e 20 20 69 6e 63 72 41 67 67 44 65 70 74 68 28  .  incrAggDepth(
0390: 2e 2e 29 0a 2a 2a 20 69 73 20 61 20 68 65 6c 70  ..).** is a help
03a0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 2d 20 61 20  er function - a 
03b0: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65  callback for the
03c0: 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 0a 2a 2f   tree walker..*/
03d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
03e0: 41 67 67 44 65 70 74 68 28 57 61 6c 6b 65 72 20  AggDepth(Walker 
03f0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
0400: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
0410: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f  xpr->op==TK_AGG_
0420: 46 55 4e 43 54 49 4f 4e 20 29 20 70 45 78 70 72  FUNCTION ) pExpr
0430: 2d 3e 6f 70 32 20 2b 3d 20 70 57 61 6c 6b 65 72  ->op2 += pWalker
0440: 2d 3e 75 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20  ->u.i;.  return 
0450: 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a  WRC_Continue;.}.
0460: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 63 72  static void incr
0470: 41 67 67 46 75 6e 63 74 69 6f 6e 44 65 70 74 68  AggFunctionDepth
0480: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e  (Expr *pExpr, in
0490: 74 20 4e 29 7b 0a 20 20 69 66 28 20 4e 3e 30 20  t N){.  if( N>0 
04a0: 29 7b 0a 20 20 20 20 57 61 6c 6b 65 72 20 77 3b  ){.    Walker w;
04b0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 77 2c 20  .    memset(&w, 
04c0: 30 2c 20 73 69 7a 65 6f 66 28 77 29 29 3b 0a 20  0, sizeof(w));. 
04d0: 20 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61     w.xExprCallba
04e0: 63 6b 20 3d 20 69 6e 63 72 41 67 67 44 65 70 74  ck = incrAggDept
04f0: 68 3b 0a 20 20 20 20 77 2e 75 2e 69 20 3d 20 4e  h;.    w.u.i = N
0500: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c  ;.    sqlite3Wal
0510: 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
0520: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
0530: 75 72 6e 20 74 68 65 20 70 45 78 70 72 20 65 78  urn the pExpr ex
0540: 70 72 65 73 73 69 6f 6e 20 69 6e 74 6f 20 61 6e  pression into an
0550: 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 69   alias for the i
0560: 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col-th column of
0570: 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 73   the.** result s
0580: 65 74 20 69 6e 20 70 45 4c 69 73 74 2e 0a 2a 2a  et in pEList..**
0590: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 73 75 6c  .** If the resul
05a0: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 20 69 73 20  t set column is 
05b0: 61 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20  a simple column 
05c0: 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65 6e 20  reference, then 
05d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
05e0: 6d 61 6b 65 73 20 61 6e 20 65 78 61 63 74 20 63  makes an exact c
05f0: 6f 70 79 2e 20 20 42 75 74 20 66 6f 72 20 61 6e  opy.  But for an
0600: 79 20 6f 74 68 65 72 20 6b 69 6e 64 20 6f 66 20  y other kind of 
0610: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 69 73  expression, this
0620: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  .** routine make
0630: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72   a copy of the r
0640: 65 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e  esult set column
0650: 20 61 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74   as the argument
0660: 20 74 6f 20 74 68 65 0a 2a 2a 20 54 4b 5f 41 53   to the.** TK_AS
0670: 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 68 65 20   operator.  The 
0680: 54 4b 5f 41 53 20 6f 70 65 72 61 74 6f 72 20 63  TK_AS operator c
0690: 61 75 73 65 73 20 74 68 65 20 65 78 70 72 65 73  auses the expres
06a0: 73 69 6f 6e 20 74 6f 20 62 65 0a 2a 2a 20 65 76  sion to be.** ev
06b0: 61 6c 75 61 74 65 64 20 6a 75 73 74 20 6f 6e 63  aluated just onc
06c0: 65 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73 65  e and then reuse
06d0: 64 20 66 6f 72 20 65 61 63 68 20 61 6c 69 61 73  d for each alias
06e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 61 73  ..**.** The reas
06f0: 6f 6e 20 66 6f 72 20 73 75 70 70 72 65 73 73 69  on for suppressi
0700: 6e 67 20 74 68 65 20 54 4b 5f 41 53 20 74 65 72  ng the TK_AS ter
0710: 6d 20 77 68 65 6e 20 74 68 65 20 65 78 70 72 65  m when the expre
0720: 73 73 69 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c  ssion is a simpl
0730: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 72 65 66 65  e.** column refe
0740: 72 65 6e 63 65 20 69 73 20 73 6f 20 74 68 61 74  rence is so that
0750: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65   the column refe
0760: 72 65 6e 63 65 20 77 69 6c 6c 20 62 65 20 72 65  rence will be re
0770: 63 6f 67 6e 69 7a 65 64 20 61 73 0a 2a 2a 20 75  cognized as.** u
0780: 73 61 62 6c 65 20 62 79 20 69 6e 64 69 63 65 73  sable by indices
0790: 20 77 69 74 68 69 6e 20 74 68 65 20 57 48 45 52   within the WHER
07a0: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
07b0: 69 6e 67 20 6c 6f 67 69 63 2e 20 0a 2a 2a 0a 2a  ing logic. .**.*
07c0: 2a 20 54 68 65 20 54 4b 5f 41 53 20 6f 70 65 72  * The TK_AS oper
07d0: 61 74 6f 72 20 69 73 20 69 6e 68 69 62 69 74 65  ator is inhibite
07e0: 64 20 69 66 20 7a 54 79 70 65 5b 30 5d 3d 3d 27  d if zType[0]=='
07f0: 47 27 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 0a  G'.  This means.
0800: 2a 2a 20 74 68 61 74 20 69 6e 20 61 20 47 52 4f  ** that in a GRO
0810: 55 50 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  UP BY clause, th
0820: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
0830: 65 76 61 6c 75 61 74 65 64 20 74 77 69 63 65 2e  evaluated twice.
0840: 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20    Hence:.**.**  
0850: 20 20 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d     SELECT random
0860: 28 29 25 35 20 41 53 20 78 2c 20 63 6f 75 6e 74  ()%5 AS x, count
0870: 28 2a 29 20 46 52 4f 4d 20 74 61 62 20 47 52 4f  (*) FROM tab GRO
0880: 55 50 20 42 59 20 78 0a 2a 2a 0a 2a 2a 20 49 73  UP BY x.**.** Is
0890: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
08a0: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
08b0: 20 72 61 6e 64 6f 6d 28 29 25 35 20 41 53 20 78   random()%5 AS x
08c0: 2c 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  , count(*) FROM 
08d0: 74 61 62 20 47 52 4f 55 50 20 42 59 20 72 61 6e  tab GROUP BY ran
08e0: 64 6f 6d 28 29 25 35 0a 2a 2a 0a 2a 2a 20 54 68  dom()%5.**.** Th
08f0: 65 20 72 65 73 75 6c 74 20 6f 66 20 72 61 6e 64  e result of rand
0900: 6f 6d 28 29 25 35 20 69 6e 20 74 68 65 20 47 52  om()%5 in the GR
0910: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
0920: 20 70 72 6f 62 61 62 6c 79 20 64 69 66 66 65 72   probably differ
0930: 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ent.** from the 
0940: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 72 65  result in the re
0950: 73 75 6c 74 2d 73 65 74 2e 20 20 4f 6e 20 74 68  sult-set.  On th
0960: 65 20 6f 74 68 65 72 20 68 61 6e 64 20 53 74 61  e other hand Sta
0970: 6e 64 61 72 64 20 53 51 4c 20 64 6f 65 73 0a 2a  ndard SQL does.*
0980: 2a 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20  * not allow the 
0990: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
09a0: 74 6f 20 63 6f 6e 74 61 69 6e 20 72 65 66 65 72  to contain refer
09b0: 65 6e 63 65 73 20 74 6f 20 72 65 73 75 6c 74 2d  ences to result-
09c0: 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2a 20  set columns..** 
09d0: 53 6f 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e  So this should n
09e0: 65 76 65 72 20 63 6f 6d 65 20 75 70 20 69 6e 20  ever come up in 
09f0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 71 75 65 72  well-formed quer
0a00: 69 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ies..**.** If th
0a10: 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20 66  e reference is f
0a20: 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 4f 4c  ollowed by a COL
0a30: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20 74  LATE operator, t
0a40: 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 2a 2a  hen make sure.**
0a50: 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70 65   the COLLATE ope
0a60: 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 72 76  rator is preserv
0a70: 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
0a80: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
0a90: 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d  CT a+b, c+d FROM
0aa0: 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20 43   t1 ORDER BY 1 C
0ab0: 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a 2a  OLLATE nocase;.*
0ac0: 2a 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20 74  *.** Should be t
0ad0: 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 3a  ransformed into:
0ae0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43  .**.**     SELEC
0af0: 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d 20  T a+b, c+d FROM 
0b00: 74 31 20 4f 52 44 45 52 20 42 59 20 28 61 2b 62  t1 ORDER BY (a+b
0b10: 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  ) COLLATE nocase
0b20: 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 53 75 62  ;.**.** The nSub
0b30: 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
0b40: 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d 61  specifies how ma
0b50: 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 62  ny levels of sub
0b60: 71 75 65 72 79 20 74 68 65 0a 2a 2a 20 61 6c 69  query the.** ali
0b70: 61 73 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72  as is removed fr
0b80: 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  om the original 
0b90: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
0ba0: 20 75 73 75 61 6c 6c 79 20 76 61 6c 75 65 20 69   usually value i
0bb0: 73 0a 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74  s.** zero but it
0bc0: 20 6d 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69   might be more i
0bd0: 66 20 74 68 65 20 61 6c 69 61 73 20 69 73 20 63  f the alias is c
0be0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
0bf0: 61 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66  a subquery.** of
0c00: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78   the original ex
0c10: 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45  pression.  The E
0c20: 78 70 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66  xpr.op2 field of
0c30: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
0c40: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d  .** structures m
0c50: 75 73 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ust be increased
0c60: 20 62 79 20 74 68 65 20 6e 53 75 62 71 75 65 72   by the nSubquer
0c70: 79 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61  y amount..*/.sta
0c80: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
0c90: 41 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a  Alias(.  Parse *
0ca0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
0cb0: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0cc0: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
0cd0: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f   *pEList,      /
0ce0: 2a 20 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a  * A result set *
0cf0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
0d00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
0d10: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
0d20: 73 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45  sult set.  0..pE
0d30: 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f  List->nExpr-1 */
0d40: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
0d50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61            /* Tra
0d60: 6e 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f  nsform this into
0d70: 20 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65   an alias to the
0d80: 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20   result set */. 
0d90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
0da0: 70 65 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55  pe,     /* "GROU
0db0: 50 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72  P" or "ORDER" or
0dc0: 20 22 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75   "" */.  int nSu
0dd0: 62 71 75 65 72 79 20 20 20 20 20 20 20 20 20 20  bquery          
0de0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62  /* Number of sub
0df0: 71 75 65 72 69 65 73 20 74 68 61 74 20 74 68 65  queries that the
0e00: 20 6c 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67   label is moving
0e10: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
0e20: 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  Orig;           
0e30: 2f 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63  /* The iCol-th c
0e40: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73  olumn of the res
0e50: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70  ult set */.  Exp
0e60: 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20  r *pDup;        
0e70: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70      /* Copy of p
0e80: 4f 72 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Orig */.  sqlite
0e90: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
0ea0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
0eb0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
0ec0: 20 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d    assert( iCol>=
0ed0: 30 20 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74  0 && iCol<pEList
0ee0: 2d 3e 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72  ->nExpr );.  pOr
0ef0: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  ig = pEList->a[i
0f00: 43 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73  Col].pExpr;.  as
0f10: 73 65 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29  sert( pOrig!=0 )
0f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 69  ;.  assert( pOri
0f30: 67 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 52 65  g->flags & EP_Re
0f40: 73 6f 6c 76 65 64 20 29 3b 0a 20 20 64 62 20 3d  solved );.  db =
0f50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70   pParse->db;.  p
0f60: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
0f70: 72 44 75 70 28 64 62 2c 20 70 4f 72 69 67 2c 20  rDup(db, pOrig, 
0f80: 30 29 3b 0a 20 20 69 66 28 20 70 44 75 70 3d 3d  0);.  if( pDup==
0f90: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
0fa0: 28 20 70 4f 72 69 67 2d 3e 6f 70 21 3d 54 4b 5f  ( pOrig->op!=TK_
0fb0: 43 4f 4c 55 4d 4e 20 26 26 20 7a 54 79 70 65 5b  COLUMN && zType[
0fc0: 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 69  0]!='G' ){.    i
0fd0: 6e 63 72 41 67 67 46 75 6e 63 74 69 6f 6e 44 65  ncrAggFunctionDe
0fe0: 70 74 68 28 70 44 75 70 2c 20 6e 53 75 62 71 75  pth(pDup, nSubqu
0ff0: 65 72 79 29 3b 0a 20 20 20 20 70 44 75 70 20 3d  ery);.    pDup =
1000: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
1010: 61 72 73 65 2c 20 54 4b 5f 41 53 2c 20 70 44 75  arse, TK_AS, pDu
1020: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  p, 0, 0);.    if
1030: 28 20 70 44 75 70 3d 3d 30 20 29 20 72 65 74 75  ( pDup==0 ) retu
1040: 72 6e 3b 0a 20 20 20 20 45 78 70 72 53 65 74 50  rn;.    ExprSetP
1050: 72 6f 70 65 72 74 79 28 70 44 75 70 2c 20 45 50  roperty(pDup, EP
1060: 5f 53 6b 69 70 29 3b 0a 20 20 20 20 69 66 28 20  _Skip);.    if( 
1070: 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e  pEList->a[iCol].
1080: 69 41 6c 69 61 73 3d 3d 30 20 29 7b 0a 20 20 20  iAlias==0 ){.   
1090: 20 20 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43 6f     pEList->a[iCo
10a0: 6c 5d 2e 69 41 6c 69 61 73 20 3d 20 28 75 31 36  l].iAlias = (u16
10b0: 29 28 2b 2b 70 50 61 72 73 65 2d 3e 6e 41 6c 69  )(++pParse->nAli
10c0: 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  as);.    }.    p
10d0: 44 75 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Dup->iTable = pE
10e0: 4c 69 73 74 2d 3e 61 5b 69 43 6f 6c 5d 2e 69 41  List->a[iCol].iA
10f0: 6c 69 61 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lias;.  }.  if( 
1100: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
1110: 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 70 44 75  LLATE ){.    pDu
1120: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  p = sqlite3ExprA
1130: 64 64 43 6f 6c 6c 61 74 65 53 74 72 69 6e 67 28  ddCollateString(
1140: 70 50 61 72 73 65 2c 20 70 44 75 70 2c 20 70 45  pParse, pDup, pE
1150: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1160: 20 20 7d 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65    }..  /* Before
1170: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
1180: 45 78 70 72 44 65 6c 65 74 65 28 29 2c 20 73 65  ExprDelete(), se
1190: 74 20 74 68 65 20 45 50 5f 53 74 61 74 69 63 20  t the EP_Static 
11a0: 66 6c 61 67 2e 20 54 68 69 73 20 0a 20 20 2a 2a  flag. This .  **
11b0: 20 70 72 65 76 65 6e 74 73 20 45 78 70 72 44 65   prevents ExprDe
11c0: 6c 65 74 65 28 29 20 66 72 6f 6d 20 64 65 6c 65  lete() from dele
11d0: 74 69 6e 67 20 74 68 65 20 45 78 70 72 20 73 74  ting the Expr st
11e0: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 0a  ructure itself,.
11f0: 20 20 2a 2a 20 61 6c 6c 6f 77 69 6e 67 20 69 74    ** allowing it
1200: 20 74 6f 20 62 65 20 72 65 70 6f 70 75 6c 61 74   to be repopulat
1210: 65 64 20 62 79 20 74 68 65 20 6d 65 6d 63 70 79  ed by the memcpy
1220: 28 29 20 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  () on the follow
1230: 69 6e 67 20 6c 69 6e 65 2e 0a 20 20 2a 2a 20 54  ing line..  ** T
1240: 68 65 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  he pExpr->u.zTok
1250: 65 6e 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 69  en might point i
1260: 6e 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  nto memory that 
1270: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
1280: 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65   the.  ** sqlite
1290: 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 75 70  3DbFree(db, pDup
12a0: 29 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 6c 69  ) on the last li
12b0: 6e 65 20 6f 66 20 74 68 69 73 20 62 6c 6f 63 6b  ne of this block
12c0: 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f 0a  , so be sure to.
12d0: 20 20 2a 2a 20 6d 61 6b 65 20 61 20 63 6f 70 79    ** make a copy
12e0: 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 62 65   of the token be
12f0: 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 65 20 73  fore doing the s
1300: 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a  qlite3DbFree()..
1310: 20 20 2a 2f 0a 20 20 45 78 70 72 53 65 74 50 72    */.  ExprSetPr
1320: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
1330: 5f 53 74 61 74 69 63 29 3b 0a 20 20 73 71 6c 69  _Static);.  sqli
1340: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
1350: 2c 20 70 45 78 70 72 29 3b 0a 20 20 6d 65 6d 63  , pExpr);.  memc
1360: 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20  py(pExpr, pDup, 
1370: 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b  sizeof(*pExpr));
1380: 0a 20 20 69 66 28 20 21 45 78 70 72 48 61 73 50  .  if( !ExprHasP
1390: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
13a0: 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70  P_IntValue) && p
13b0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d  Expr->u.zToken!=
13c0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
13d0: 20 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26   (pExpr->flags &
13e0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
13f0: 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29  TokenOnly))==0 )
1400: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 75 2e 7a  ;.    pExpr->u.z
1410: 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33 44  Token = sqlite3D
1420: 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 78 70  bStrDup(db, pExp
1430: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1440: 20 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 7c    pExpr->flags |
1450: 3d 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e 3b 0a 20  = EP_MemToken;. 
1460: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
1470: 65 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 7d 0a  ee(db, pDup);.}.
1480: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1490: 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 20  RUE if the name 
14a0: 7a 43 6f 6c 20 6f 63 63 75 72 73 20 61 6e 79 77  zCol occurs anyw
14b0: 68 65 72 65 20 69 6e 20 74 68 65 20 55 53 49 4e  here in the USIN
14c0: 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20  G clause..**.** 
14d0: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
14e0: 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  the USING clause
14f0: 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 69   is NULL or if i
1500: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  t does not conta
1510: 69 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a 73  in.** zCol..*/.s
1520: 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 49 6e  tatic int nameIn
1530: 55 73 69 6e 67 43 6c 61 75 73 65 28 49 64 4c 69  UsingClause(IdLi
1540: 73 74 20 2a 70 55 73 69 6e 67 2c 20 63 6f 6e 73  st *pUsing, cons
1550: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20  t char *zCol){. 
1560: 20 69 66 28 20 70 55 73 69 6e 67 20 29 7b 0a 20   if( pUsing ){. 
1570: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 66 6f     int k;.    fo
1580: 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d  r(k=0; k<pUsing-
1590: 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  >nId; k++){.    
15a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
15b0: 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b  ICmp(pUsing->a[k
15c0: 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d  ].zName, zCol)==
15d0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
15e0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
15f0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62   0;.}../*.** Sub
1600: 71 75 65 72 69 65 73 20 73 74 6f 72 65 73 20 74  queries stores t
1610: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1620: 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20  base, table and 
1630: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72  column names for
1640: 20 74 68 65 69 72 0a 2a 2a 20 72 65 73 75 6c 74   their.** result
1650: 20 73 65 74 73 20 69 6e 20 45 78 70 72 4c 69 73   sets in ExprLis
1660: 74 2e 61 5b 5d 2e 7a 53 70 61 6e 2c 20 69 6e 20  t.a[].zSpan, in 
1670: 74 68 65 20 66 6f 72 6d 20 22 44 41 54 41 42 41  the form "DATABA
1680: 53 45 2e 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 22  SE.TABLE.COLUMN"
1690: 2e 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  ..** Check to se
16a0: 65 20 69 66 20 74 68 65 20 7a 53 70 61 6e 20 67  e if the zSpan g
16b0: 69 76 65 6e 20 74 6f 20 74 68 69 73 20 72 6f 75  iven to this rou
16c0: 74 69 6e 65 20 6d 61 74 63 68 65 73 20 74 68 65  tine matches the
16d0: 20 7a 44 62 2c 20 7a 54 61 62 2c 0a 2a 2a 20 61   zDb, zTab,.** a
16e0: 6e 64 20 7a 43 6f 6c 2e 20 20 49 66 20 61 6e 79  nd zCol.  If any
16f0: 20 6f 66 20 7a 44 62 2c 20 7a 54 61 62 2c 20 61   of zDb, zTab, a
1700: 6e 64 20 7a 43 6f 6c 20 61 72 65 20 4e 55 4c 4c  nd zCol are NULL
1710: 20 74 68 65 6e 20 74 68 6f 73 65 20 66 69 65 6c   then those fiel
1720: 64 73 20 77 69 6c 6c 0a 2a 2a 20 6d 61 74 63 68  ds will.** match
1730: 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2f 0a 69 6e   anything..*/.in
1740: 74 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70  t sqlite3MatchSp
1750: 61 6e 4e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20  anName(.  const 
1760: 63 68 61 72 20 2a 7a 53 70 61 6e 2c 0a 20 20 63  char *zSpan,.  c
1770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1780: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1790: 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Tab,.  const cha
17a0: 72 20 2a 7a 44 62 0a 29 7b 0a 20 20 69 6e 74 20  r *zDb.){.  int 
17b0: 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41 4c  n;.  for(n=0; AL
17c0: 57 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20 26  WAYS(zSpan[n]) &
17d0: 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b  & zSpan[n]!='.';
17e0: 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 44   n++){}.  if( zD
17f0: 62 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72  b && (sqlite3Str
1800: 4e 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 44 62  NICmp(zSpan, zDb
1810: 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 44 62 5b 6e  , n)!=0 || zDb[n
1820: 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74  ]!=0) ){.    ret
1830: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53 70  urn 0;.  }.  zSp
1840: 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 66 6f 72  an += n+1;.  for
1850: 28 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53 70  (n=0; ALWAYS(zSp
1860: 61 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e 5b  an[n]) && zSpan[
1870: 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a  n]!='.'; n++){}.
1880: 20 20 69 66 28 20 7a 54 61 62 20 26 26 20 28 73    if( zTab && (s
1890: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
18a0: 53 70 61 6e 2c 20 7a 54 61 62 2c 20 6e 29 21 3d  Span, zTab, n)!=
18b0: 30 20 7c 7c 20 7a 54 61 62 5b 6e 5d 21 3d 30 29  0 || zTab[n]!=0)
18c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
18d0: 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b 3d  ;.  }.  zSpan +=
18e0: 20 6e 2b 31 3b 0a 20 20 69 66 28 20 7a 43 6f 6c   n+1;.  if( zCol
18f0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1900: 6d 70 28 7a 53 70 61 6e 2c 20 7a 43 6f 6c 29 21  mp(zSpan, zCol)!
1910: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1920: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1930: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   1;.}../*.** Giv
1940: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  en the name of a
1950: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
1960: 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a  orm X.Y.Z or Y.Z
1970: 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b   or just Z, look
1980: 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65   up.** that name
1990: 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73   in the set of s
19a0: 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20  ource tables in 
19b0: 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b  pSrcList and mak
19c0: 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20  e the pExpr .** 
19d0: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
19e0: 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68  refer back to th
19f0: 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e  at source column
1a00: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1a10: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1a20: 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a  made to pExpr:.*
1a30: 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  *.**    pExpr->i
1a40: 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74  Db           Set
1a50: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62   the index in db
1a60: 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64  ->aDb[] of the d
1a70: 61 74 61 62 61 73 65 20 58 0a 2a 2a 20 20 20 20  atabase X.**    
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 28 65 76 65 6e 20 69 66 20 58 20       (even if X 
1aa0: 69 73 20 69 6d 70 6c 69 65 64 29 2e 0a 2a 2a 20  is implied)..** 
1ab0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1ac0: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74          Set to t
1ad0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
1ae0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f   for the table o
1af0: 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20  btained.**      
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74     from pSrcList
1b20: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  ..**    pExpr->p
1b30: 54 61 62 20 20 20 20 20 20 20 20 20 20 50 6f 69  Tab          Poi
1b40: 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c 65  nts to the Table
1b50: 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 58 2e   structure of X.
1b60: 59 20 28 65 76 65 6e 20 69 66 0a 2a 2a 20 20 20  Y (even if.**   
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 58 20 61 6e 64 2f 6f 72 20 59        X and/or Y
1b90: 20 61 72 65 20 69 6d 70 6c 69 65 64 2e 29 0a 2a   are implied.).*
1ba0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  *    pExpr->iCol
1bb0: 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f  umn       Set to
1bc0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
1bd0: 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  er within the ta
1be0: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
1bf0: 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
1c00: 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  Set to TK_COLUMN
1c10: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  ..**    pExpr->p
1c20: 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79  Left         Any
1c30: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
1c40: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
1c50: 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70  leted.**    pExp
1c60: 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20  r->pRight       
1c70: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
1c80: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
1c90: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
1ca0: 20 54 68 65 20 7a 44 62 20 76 61 72 69 61 62 6c   The zDb variabl
1cb0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
1cc0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
1cd0: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
1ce0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
1cf0: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
1d00: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
1d10: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
1d20: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
1d30: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
1d40: 20 75 73 65 64 2e 20 20 54 68 65 20 7a 54 61 62   used.  The zTab
1d50: 6c 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 74  le variable is t
1d60: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
1d70: 61 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20  able (the "Y"). 
1d80: 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63   This.** value c
1d90: 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 7a 44  an be NULL if zD
1da0: 62 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20  b is also NULL. 
1db0: 20 49 66 20 7a 54 61 62 6c 65 20 69 73 20 4e 55   If zTable is NU
1dc0: 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  LL it.** means t
1dd0: 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20  hat the form of 
1de0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e  the name is Z an
1df0: 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66  d that columns f
1e00: 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a  rom any table.**
1e10: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a   can be used..**
1e20: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20  .** If the name 
1e30: 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76  cannot be resolv
1e40: 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79  ed unambiguously
1e50: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
1e60: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
1e70: 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e  Parse and return
1e80: 20 57 52 43 5f 41 62 6f 72 74 2e 20 20 52 65 74   WRC_Abort.  Ret
1e90: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 20 6f 6e  urn WRC_Prune on
1ea0: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
1eb0: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
1ec0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
1ed0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  rse,       /* Th
1ee0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
1ef0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
1f00: 72 20 2a 7a 44 62 2c 20 20 20 20 20 2f 2a 20 4e  r *zDb,     /* N
1f10: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1f20: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
1f30: 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  able, or NULL */
1f40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f50: 54 61 62 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20  Tab,    /* Name 
1f60: 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  of table contain
1f70: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e  ing column, or N
1f80: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
1f90: 68 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a  har *zCol,    /*
1fa0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
1fb0: 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  umn. */.  NameCo
1fc0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f  ntext *pNC,    /
1fd0: 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * The name conte
1fe0: 78 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  xt used to resol
1ff0: 76 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20  ve the name */. 
2000: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
2010: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68        /* Make th
2020: 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69  is EXPR node poi
2030: 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74  nt to the select
2040: 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  ed column */.){.
2050: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
2080: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
2090: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20b0: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
20c0: 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  g column names *
20d0: 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d  /.  int cntTab =
20e0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
20f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2100: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
2110: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  e names */.  int
2120: 20 6e 53 75 62 71 75 65 72 79 20 3d 20 30 3b 20   nSubquery = 0; 
2130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2140: 2a 20 48 6f 77 20 6d 61 6e 79 20 6c 65 76 65 6c  * How many level
2150: 73 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f  s of subquery */
2160: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2170: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
2180: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
2190: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
21a0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
21b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
21c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f         /* Use fo
21d0: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
21e0: 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f  SrcList items */
21f0: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
2200: 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d  t_item *pMatch =
2210: 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63   0;  /* The matc
2220: 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74  hing pSrcList it
2230: 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  em */.  NameCont
2240: 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e  ext *pTopNC = pN
2250: 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72  C;        /* Fir
2260: 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69  st namecontext i
2270: 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
2280: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
2290: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
22a0: 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74    /* Schema of t
22b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  he expression */
22c0: 0a 20 20 69 6e 74 20 69 73 54 72 69 67 67 65 72  .  int isTrigger
22d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
22e0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
22f0: 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 74 72  resolved to a tr
2300: 69 67 67 65 72 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  igger column */.
2310: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
2320: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2330: 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68 6f 6c      /* Table hol
2340: 64 20 74 68 65 20 72 6f 77 20 2a 2f 0a 20 20 43  d the row */.  C
2350: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 20 20 20 20  olumn *pCol;    
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2370: 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6f 66 20   /* A column of 
2380: 70 54 61 62 20 2a 2f 0a 0a 20 20 61 73 73 65 72  pTab */..  asser
2390: 74 28 20 70 4e 43 20 29 3b 20 20 20 20 20 2f 2a  t( pNC );     /*
23a0: 20 74 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   the name contex
23b0: 74 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  t cannot be NULL
23c0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
23d0: 43 6f 6c 20 29 3b 20 20 20 20 2f 2a 20 54 68 65  Col );    /* The
23e0: 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e   Z in X.Y.Z cann
23f0: 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ot be NULL */.  
2400: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
2410: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
2420: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f  EP_TokenOnly|EP_
2430: 52 65 64 75 63 65 64 29 20 29 3b 0a 0a 20 20 2f  Reduced) );..  /
2440: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
2450: 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d 6d 61 74 63   node to no-matc
2460: 68 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54  h */.  pExpr->iT
2470: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 70 45 78  able = -1;.  pEx
2480: 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20  pr->pTab = 0;.  
2490: 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72  ExprSetVVAProper
24a0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52  ty(pExpr, EP_NoR
24b0: 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a 20 54 72  educe);..  /* Tr
24c0: 61 6e 73 6c 61 74 65 20 74 68 65 20 73 63 68 65  anslate the sche
24d0: 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44 62 20 69  ma name in zDb i
24e0: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
24f0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
2500: 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d 61 2e 20  ng.  ** schema. 
2510: 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 70   If not found, p
2520: 53 63 68 65 6d 61 20 77 69 6c 6c 20 72 65 6d 61  Schema will rema
2530: 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e 6f 74 68  in NULL and noth
2540: 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63 68 0a 20  ing will match. 
2550: 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 69 6e   ** resulting in
2560: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
2570: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
2580: 77 61 72 64 20 74 68 65 20 65 6e 64 20 6f 66 20  ward the end of 
2590: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
25a0: 2f 0a 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20  /.  if( zDb ){. 
25b0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 43     testcase( pNC
25c0: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 50  ->ncFlags & NC_P
25d0: 61 72 74 49 64 78 20 29 3b 0a 20 20 20 20 74 65  artIdx );.    te
25e0: 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63 46  stcase( pNC->ncF
25f0: 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68 65 63  lags & NC_IsChec
2600: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4e  k );.    if( (pN
2610: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28 4e 43  C->ncFlags & (NC
2620: 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 73 43 68  _PartIdx|NC_IsCh
2630: 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  eck))!=0 ){.    
2640: 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 69 67    /* Silently ig
2650: 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20 71 75  nore database qu
2660: 61 6c 69 66 69 65 72 73 20 69 6e 73 69 64 65 20  alifiers inside 
2670: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
2680: 73 20 61 6e 64 20 70 61 72 74 69 61 6c 0a 20 20  s and partial.  
2690: 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20      ** indices. 
26a0: 20 44 6f 20 6e 6f 74 20 72 61 69 73 65 20 65 72   Do not raise er
26b0: 72 6f 72 73 20 62 65 63 61 75 73 65 20 74 68 61  rors because tha
26c0: 74 20 6d 69 67 68 74 20 62 72 65 61 6b 20 6c 65  t might break le
26d0: 67 61 63 79 20 61 6e 64 0a 20 20 20 20 20 20 2a  gacy and.      *
26e0: 2a 20 62 65 63 61 75 73 65 20 69 74 20 64 6f 65  * because it doe
26f0: 73 20 6e 6f 74 20 68 75 72 74 20 61 6e 79 74 68  s not hurt anyth
2700: 69 6e 67 20 74 6f 20 6a 75 73 74 20 69 67 6e 6f  ing to just igno
2710: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
2720: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7a  name. */.      z
2730: 44 62 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  Db = 0;.    }els
2740: 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e{.      for(i=0
2750: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
2760: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
2770: 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  t( db->aDb[i].zN
2780: 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ame );.        i
2790: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
27a0: 70 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61  p(db->aDb[i].zNa
27b0: 6d 65 2c 7a 44 62 29 3d 3d 30 20 29 7b 0a 20 20  me,zDb)==0 ){.  
27c0: 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20          pSchema 
27d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  = db->aDb[i].pSc
27e0: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
27f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2800: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2810: 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 61   }..  /* Start a
2820: 74 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  t the inner-most
2830: 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 6d 6f 76   context and mov
2840: 65 20 6f 75 74 77 61 72 64 20 75 6e 74 69 6c 20  e outward until 
2850: 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
2860: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 4e 43   */.  while( pNC
2870: 20 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   && cnt==0 ){.  
2880: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
2890: 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  st;.    SrcList 
28a0: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
28b0: 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20  >pSrcList;..    
28c0: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
28d0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
28e0: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
28f0: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
2900: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
2910: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  ){.        pTab 
2920: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
2930: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2940: 54 61 62 21 3d 30 20 26 26 20 70 54 61 62 2d 3e  Tab!=0 && pTab->
2950: 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  zName!=0 );.    
2960: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
2970: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
2980: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
2990: 53 65 6c 65 63 74 20 26 26 20 28 70 49 74 65 6d  Select && (pItem
29a0: 2d 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ->pSelect->selFl
29b0: 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
29c0: 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
29d0: 20 20 20 20 20 69 6e 74 20 68 69 74 20 3d 20 30       int hit = 0
29e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 4c 69  ;.          pELi
29f0: 73 74 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  st = pItem->pSel
2a00: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
2a10: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2a20: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
2a30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
2a40: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61     if( sqlite3Ma
2a50: 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 45 4c 69  tchSpanName(pELi
2a60: 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
2a70: 7a 43 6f 6c 2c 20 7a 54 61 62 2c 20 7a 44 62 29  zCol, zTab, zDb)
2a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a90: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
2aa0: 20 20 20 20 20 20 20 63 6e 74 54 61 62 20 3d 20         cntTab = 
2ab0: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
2ac0: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
2ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2ae0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
2af0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
2b00: 20 68 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   hit = 1;.      
2b10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b20: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2b30: 28 20 68 69 74 20 7c 7c 20 7a 54 61 62 3d 3d 30  ( hit || zTab==0
2b40: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2b50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2b60: 66 28 20 7a 44 62 20 26 26 20 70 54 61 62 2d 3e  f( zDb && pTab->
2b70: 70 53 63 68 65 6d 61 21 3d 70 53 63 68 65 6d 61  pSchema!=pSchema
2b80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
2b90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2ba0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54  }.        if( zT
2bb0: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
2bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2bd0: 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41  Name = pItem->zA
2be0: 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
2bf0: 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
2c00: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  me;.          as
2c10: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 21 3d  sert( zTabName!=
2c20: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
2c30: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
2c40: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
2c50: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2c60: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
2c70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c80: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2c90: 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b  0==(cntTab++) ){
2ca0: 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63  .          pMatc
2cb0: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
2cc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
2cd0: 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (j=0, pCol=pTab-
2ce0: 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
2cf0: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
2d00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2d10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2d20: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
2d30: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
2d40: 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
2d50: 20 68 61 73 20 62 65 65 6e 20 65 78 61 63 74 6c   has been exactl
2d60: 79 20 6f 6e 65 20 70 72 69 6f 72 20 6d 61 74 63  y one prior matc
2d70: 68 20 61 6e 64 20 74 68 69 73 20 6d 61 74 63 68  h and this match
2d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
2d90: 69 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  is for the right
2da0: 2d 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 61  -hand table of a
2db0: 20 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 6f 72   NATURAL JOIN or
2dc0: 20 69 73 20 69 6e 20 61 20 0a 20 20 20 20 20 20   is in a .      
2dd0: 20 20 20 20 20 20 2a 2a 20 55 53 49 4e 47 20 63        ** USING c
2de0: 6c 61 75 73 65 2c 20 74 68 65 6e 20 73 6b 69 70  lause, then skip
2df0: 20 74 68 69 73 20 6d 61 74 63 68 2e 0a 20 20 20   this match..   
2e00: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2e10: 20 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d          if( cnt=
2e20: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
2e30: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 6a      if( pItem->j
2e40: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2e50: 55 52 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  URAL ) continue;
2e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2e70: 66 28 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c  f( nameInUsingCl
2e80: 61 75 73 65 28 70 49 74 65 6d 2d 3e 70 55 73 69  ause(pItem->pUsi
2e90: 6e 67 2c 20 7a 43 6f 6c 29 20 29 20 63 6f 6e 74  ng, zCol) ) cont
2ea0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2eb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2ec0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
2ed0: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
2ee0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;.            /
2ef0: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
2f00: 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d   rowid (column -
2f10: 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  1) for the INTEG
2f20: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
2f30: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
2f40: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
2f50: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
2f60: 2d 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20 20 20  -1 : (i16)j;.   
2f70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2f80: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2f90: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2fa0: 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 29      if( pMatch )
2fb0: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
2fc0: 3e 69 54 61 62 6c 65 20 3d 20 70 4d 61 74 63 68  >iTable = pMatch
2fd0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2fe0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
2ff0: 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20   pMatch->pTab;. 
3000: 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20 3d         pSchema =
3010: 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 70 53   pExpr->pTab->pS
3020: 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 7d 0a 20  chema;.      }. 
3030: 20 20 20 7d 20 2f 2a 20 69 66 28 20 70 53 72 63     } /* if( pSrc
3040: 4c 69 73 74 20 29 20 2a 2f 0a 0a 23 69 66 6e 64  List ) */..#ifnd
3050: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
3060: 52 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66  RIGGER.    /* If
3070: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72   we have not alr
3080: 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68  eady resolved th
3090: 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79  e name, then may
30a0: 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  be .    ** it is
30b0: 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e   a new.* or old.
30c0: 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65  * trigger argume
30d0: 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20  nt reference.   
30e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d   */.    if( zDb=
30f0: 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26  =0 && zTab!=0 &&
3100: 20 63 6e 74 54 61 62 3d 3d 30 20 26 26 20 70 50   cntTab==0 && pP
3110: 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61  arse->pTriggerTa
3120: 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  b!=0 ){.      in
3130: 74 20 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 65  t op = pParse->e
3140: 54 72 69 67 67 65 72 4f 70 3b 0a 20 20 20 20 20  TriggerOp;.     
3150: 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b 5f   assert( op==TK_
3160: 44 45 4c 45 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b  DELETE || op==TK
3170: 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d 54  _UPDATE || op==T
3180: 4b 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20 20 20  K_INSERT );.    
3190: 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 44 45 4c    if( op!=TK_DEL
31a0: 45 54 45 20 26 26 20 73 71 6c 69 74 65 33 53 74  ETE && sqlite3St
31b0: 72 49 43 6d 70 28 22 6e 65 77 22 2c 7a 54 61 62  rICmp("new",zTab
31c0: 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  ) == 0 ){.      
31d0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
31e0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 54 61  = 1;.        pTa
31f0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69  b = pParse->pTri
3200: 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 7d  ggerTab;.      }
3210: 65 6c 73 65 20 69 66 28 20 6f 70 21 3d 54 4b 5f  else if( op!=TK_
3220: 49 4e 53 45 52 54 20 26 26 20 73 71 6c 69 74 65  INSERT && sqlite
3230: 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 7a  3StrICmp("old",z
3240: 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Tab)==0 ){.     
3250: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
3260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
3270: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72  ab = pParse->pTr
3280: 69 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20  iggerTab;.      
3290: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
32a0: 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e  b ){ .        in
32b0: 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t iCol;.        
32c0: 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d 3e  pSchema = pTab->
32d0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20  pSchema;.       
32e0: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
32f0: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
3300: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
3310: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
3320: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20     Column *pCol 
3330: 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  = &pTab->aCol[iC
3340: 6f 6c 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ol];.          i
3350: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
3360: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
3370: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
3380: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d         if( iCol=
3390: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
33b0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ol = -1;.       
33c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
33e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
33f0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
3400: 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20  >=pTab->nCol && 
3410: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
3420: 43 6f 6c 29 20 26 26 20 48 61 73 52 6f 77 69 64  Col) && HasRowid
3430: 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
3440: 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 20 20      iCol = -1;  
3450: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
3460: 34 34 39 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20  44911-55124 */. 
3470: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3480: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
3490: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
34a0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
34b0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b     if( iCol<0 ){
34c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
34d0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  pr->affinity = S
34e0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
34f0: 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  R;.          }el
3500: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54  se if( pExpr->iT
3510: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  able==0 ){.     
3520: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
3530: 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20   iCol==31 );.   
3540: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
3550: 65 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20  e( iCol==32 );. 
3560: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
3570: 65 2d 3e 6f 6c 64 6d 61 73 6b 20 7c 3d 20 28 69  e->oldmask |= (i
3580: 43 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66  Col>=32 ? 0xffff
3590: 66 66 66 66 20 3a 20 28 28 28 75 33 32 29 31 29  ffff : (((u32)1)
35a0: 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  <<iCol));.      
35b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35c0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
35d0: 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20   iCol==31 );.   
35e0: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
35f0: 65 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20  e( iCol==32 );. 
3600: 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73             pPars
3610: 65 2d 3e 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69  e->newmask |= (i
3620: 43 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66  Col>=32 ? 0xffff
3630: 66 66 66 66 20 3a 20 28 28 28 75 33 32 29 31 29  ffff : (((u32)1)
3640: 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20  <<iCol));.      
3650: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3660: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
3670: 20 28 69 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20   (i16)iCol;.    
3680: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61        pExpr->pTa
3690: 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20  b = pTab;.      
36a0: 20 20 20 20 69 73 54 72 69 67 67 65 72 20 3d 20      isTrigger = 
36b0: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
36c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
36d0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
36e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
36f0: 52 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  R) */..    /*.  
3700: 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65    ** Perhaps the
3710: 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72   name is a refer
3720: 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49  ence to the ROWI
3730: 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  D.    */.    ass
3740: 65 72 74 28 20 70 54 61 62 21 3d 30 20 7c 7c 20  ert( pTab!=0 || 
3750: 63 6e 74 54 61 62 3d 3d 30 20 29 3b 0a 20 20 20  cntTab==0 );.   
3760: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63   if( cnt==0 && c
3770: 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69  ntTab==1 && sqli
3780: 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29  te3IsRowid(zCol)
3790: 20 26 26 20 48 61 73 52 6f 77 69 64 28 70 54 61   && HasRowid(pTa
37a0: 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20  b) ){.      cnt 
37b0: 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72  = 1;.      pExpr
37c0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20  ->iColumn = -1; 
37d0: 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 34      /* IMP: R-44
37e0: 39 31 31 2d 35 35 31 32 34 20 2a 2f 0a 20 20 20  911-55124 */.   
37f0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
3800: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
3810: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a  INTEGER;.    }..
3820: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66      /*.    ** If
3830: 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66   the input is of
3840: 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74   the form Z (not
3850: 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74   Y.Z or X.Y.Z) t
3860: 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20  hen the name Z. 
3870: 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65     ** might refe
3880: 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73  r to an result-s
3890: 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20  et alias.  This 
38a0: 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
38b0: 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a  mple, when.    *
38c0: 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69  * we are resolvi
38d0: 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ng names in the 
38e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
38f0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
3900: 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mmand:.    **.  
3910: 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
3920: 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61  a+b AS x FROM ta
3930: 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a  ble WHERE x<10;.
3940: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e      **.    ** In
3950: 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73   cases like this
3960: 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20  , replace pExpr 
3970: 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74  with a copy of t
3980: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
3990: 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20  at.    ** forms 
39a0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65  the result set e
39b0: 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74  ntry ("a+b" in t
39c0: 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20  he example) and 
39d0: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
39e0: 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20  ly..    ** Note 
39f0: 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73  that the express
3a00: 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ion in the resul
3a10: 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76  t set should hav
3a20: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20  e already been. 
3a30: 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62     ** resolved b
3a40: 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57  y the time the W
3a50: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72  HERE clause is r
3a60: 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2a 0a  esolved..    **.
3a70: 20 20 20 20 2a 2a 20 54 68 65 20 61 62 69 6c 69      ** The abili
3a80: 74 79 20 74 6f 20 75 73 65 20 61 6e 20 6f 75 74  ty to use an out
3a90: 70 75 74 20 72 65 73 75 6c 74 2d 73 65 74 20 63  put result-set c
3aa0: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 57 48 45  olumn in the WHE
3ab0: 52 45 2c 20 47 52 4f 55 50 20 42 59 2c 0a 20 20  RE, GROUP BY,.  
3ac0: 20 20 2a 2a 20 6f 72 20 48 41 56 49 4e 47 20 63    ** or HAVING c
3ad0: 6c 61 75 73 65 73 2c 20 6f 72 20 61 73 20 70 61  lauses, or as pa
3ae0: 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 65  rt of a larger e
3af0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
3b00: 20 4f 52 44 52 45 20 42 59 0a 20 20 20 20 2a 2a   ORDRE BY.    **
3b10: 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 73   clause is not s
3b20: 74 61 6e 64 61 72 64 20 53 51 4c 2e 20 20 54 68  tandard SQL.  Th
3b30: 69 73 20 69 73 20 61 20 28 67 6f 6f 66 79 29 20  is is a (goofy) 
3b40: 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e  SQLite extension
3b50: 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  , that.    ** is
3b60: 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 62   supported for b
3b70: 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
3b80: 62 69 6c 69 74 79 20 6f 6e 6c 79 2e 20 20 54 4f  bility only.  TO
3b90: 20 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72   DO: Issue a war
3ba0: 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 73  ning.    ** on s
3bb0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 77 68 65  qlite3_log() whe
3bc0: 6e 65 76 65 72 20 74 68 65 20 63 61 70 61 62 69  never the capabi
3bd0: 6c 69 74 79 20 69 73 20 75 73 65 64 2e 0a 20 20  lity is used..  
3be0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 45    */.    if( (pE
3bf0: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69  List = pNC->pELi
3c00: 73 74 29 21 3d 30 0a 20 20 20 20 20 26 26 20 7a  st)!=0.     && z
3c10: 54 61 62 3d 3d 30 0a 20 20 20 20 20 26 26 20 63  Tab==0.     && c
3c20: 6e 74 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  nt==0.    ){.   
3c30: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45     for(j=0; j<pE
3c40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
3c50: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3c60: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
3c70: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3c80: 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26     if( zAs!=0 &&
3c90: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
3ca0: 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  zAs, zCol)==0 ){
3cb0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
3cc0: 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20  *pOrig;.        
3cd0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
3ce0: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
3cf0: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
3d00: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
3d10: 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t( pExpr->x.pLis
3d20: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
3d30: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
3d40: 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  >x.pSelect==0 );
3d50: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 69 67  .          pOrig
3d60: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
3d70: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
3d80: 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
3d90: 67 73 26 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d  gs&NC_AllowAgg)=
3da0: 3d 30 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =0 && ExprHasPro
3db0: 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45 50 5f  perty(pOrig, EP_
3dc0: 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Agg) ){.        
3dd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
3de0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
3df0: 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64 20 61  use of aliased a
3e00: 67 67 72 65 67 61 74 65 20 25 73 22 2c 20 7a 41  ggregate %s", zA
3e10: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
3e20: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
3e30: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3e40: 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41          resolveA
3e50: 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c  lias(pParse, pEL
3e60: 69 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c 20 22  ist, j, pExpr, "
3e70: 22 2c 20 6e 53 75 62 71 75 65 72 79 29 3b 0a 20  ", nSubquery);. 
3e80: 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31           cnt = 1
3e90: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
3ea0: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
3eb0: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
3ec0: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
3ed0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
3ee0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20  okupname_end;.  
3ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
3f00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
3f10: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
3f20: 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  xt name context.
3f30: 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20    The loop will 
3f40: 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72  exit when either
3f50: 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20  .    ** we have 
3f60: 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20  a match (cnt>0) 
3f70: 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f  or when we run o
3f80: 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65  ut of name conte
3f90: 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xts..    */.    
3fa0: 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  if( cnt==0 ){.  
3fb0: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
3fc0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 6e 53 75 62  Next;.      nSub
3fd0: 71 75 65 72 79 2b 2b 3b 0a 20 20 20 20 7d 0a 20  query++;.    }. 
3fe0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
3ff0: 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c   X and Y are NUL
4000: 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  L (in other word
4010: 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f  s if only the co
4020: 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20  lumn name Z is. 
4030: 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e   ** supplied) an
4040: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a  d the value of Z
4050: 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20   is enclosed in 
4060: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74  double-quotes, t
4070: 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20  hen.  ** Z is a 
4080: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69  string literal i
4090: 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74  f it doesn't mat
40a0: 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61  ch any column na
40b0: 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20  mes.  In that.  
40c0: 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64  ** case, we need
40d0: 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74   to return right
40e0: 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61   away and not ma
40f0: 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74  ke any changes t
4100: 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20  o.  ** pExpr..  
4110: 2a 2a 0a 20 20 2a 2a 20 42 65 63 61 75 73 65 20  **.  ** Because 
4120: 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
4130: 20 6d 61 64 65 20 74 6f 20 6f 75 74 65 72 20 63   made to outer c
4140: 6f 6e 74 65 78 74 73 2c 20 74 68 65 20 70 4e 43  ontexts, the pNC
4150: 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20 66 69 65 6c  ->nRef.  ** fiel
4160: 64 73 20 61 72 65 20 6e 6f 74 20 63 68 61 6e 67  ds are not chang
4170: 65 64 20 69 6e 20 61 6e 79 20 63 6f 6e 74 65 78  ed in any contex
4180: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  t..  */.  if( cn
4190: 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  t==0 && zTab==0 
41a0: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
41b0: 74 79 28 70 45 78 70 72 2c 45 50 5f 44 62 6c 51  ty(pExpr,EP_DblQ
41c0: 75 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 70 45  uoted) ){.    pE
41d0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52  xpr->op = TK_STR
41e0: 49 4e 47 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  ING;.    pExpr->
41f0: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 72 65  pTab = 0;.    re
4200: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
4210: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63    }..  /*.  ** c
4220: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72  nt==0 means ther
4230: 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e  e was not match.
4240: 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68    cnt>1 means th
4250: 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a  ere were two or.
4260: 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65    ** more matche
4270: 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
4280: 77 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72  we have an error
4290: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74  ..  */.  if( cnt
42a0: 21 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  !=1 ){.    const
42b0: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
42c0: 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f   zErr = cnt==0 ?
42d0: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
42e0: 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63  " : "ambiguous c
42f0: 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20  olumn name";.   
4300: 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20   if( zDb ){.    
4310: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4320: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
4330: 73 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20  s.%s.%s", zErr, 
4340: 7a 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29  zDb, zTab, zCol)
4350: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4360: 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71  zTab ){.      sq
4370: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
4380: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73  arse, "%s: %s.%s
4390: 22 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a  ", zErr, zTab, z
43a0: 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Col);.    }else{
43b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
43c0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
43d0: 25 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a  %s: %s", zErr, z
43e0: 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
43f0: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
4400: 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 70 54 6f  ema = 1;.    pTo
4410: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  pNC->nErr++;.  }
4420: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75  ..  /* If a colu
4430: 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20  mn from a table 
4440: 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72  in pSrcList is r
4450: 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20  eferenced, then 
4460: 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73  record.  ** this
4470: 20 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72   fact in the pSr
4480: 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65  cList.a[].colUse
4490: 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75  d bitmask.  Colu
44a0: 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a  mn 0 causes.  **
44b0: 20 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74   bit 0 to be set
44c0: 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73  .  Column 1 sets
44d0: 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20   bit 1.  And so 
44e0: 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20  forth.  If the. 
44f0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65   ** column numbe
4500: 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  r is greater tha
4510: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
4520: 62 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d  bits in the bitm
4530: 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65  ask.  ** then se
4540: 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72  t the high-order
4550: 20 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d   bit of the bitm
4560: 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ask..  */.  if( 
4570: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
4580: 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29  0 && pMatch!=0 )
4590: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45  {.    int n = pE
45a0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
45b0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 42    testcase( n==B
45c0: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  MS-1 );.    if( 
45d0: 6e 3e 3d 42 4d 53 20 29 7b 0a 20 20 20 20 20 20  n>=BMS ){.      
45e0: 6e 20 3d 20 42 4d 53 2d 31 3b 0a 20 20 20 20 7d  n = BMS-1;.    }
45f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61  .    assert( pMa
4600: 74 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45  tch->iCursor==pE
4610: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
4620: 20 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73     pMatch->colUs
4630: 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  ed |= ((Bitmask)
4640: 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1)<<n;.  }..  /*
4650: 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65   Clean up and re
4660: 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
4670: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4680: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
4690: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  .  pExpr->pLeft 
46a0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
46b0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
46c0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  pr->pRight);.  p
46d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30  Expr->pRight = 0
46e0: 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20  ;.  pExpr->op = 
46f0: 28 69 73 54 72 69 67 67 65 72 20 3f 20 54 4b 5f  (isTrigger ? TK_
4700: 54 52 49 47 47 45 52 20 3a 20 54 4b 5f 43 4f 4c  TRIGGER : TK_COL
4710: 55 4d 4e 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65  UMN);.lookupname
4720: 5f 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e 74 3d  _end:.  if( cnt=
4730: 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =1 ){.    assert
4740: 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20  ( pNC!=0 );.    
4750: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  if( pExpr->op!=T
4760: 4b 5f 41 53 20 29 7b 0a 20 20 20 20 20 20 73 71  K_AS ){.      sq
4770: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
4780: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63  arse, pExpr, pSc
4790: 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c  hema, pNC->pSrcL
47a0: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
47b0: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
47c0: 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61   nRef value on a
47d0: 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  ll name contexts
47e0: 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74   from TopNC up t
47f0: 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69  o.    ** the poi
4800: 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d  nt where the nam
4810: 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20  e matched. */.  
4820: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
4830: 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21   assert( pTopNC!
4840: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70  =0 );.      pTop
4850: 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  NC->nRef++;.    
4860: 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e    if( pTopNC==pN
4870: 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  C ) break;.     
4880: 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43   pTopNC = pTopNC
4890: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
48a0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
48b0: 75 6e 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  une;.  } else {.
48c0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
48d0: 62 6f 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  bort;.  }.}../*.
48e0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
48f0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
4900: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
4910: 6e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 63 6f  n to load the co
4920: 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72 6f  lumn iCol.** fro
4930: 6d 20 64 61 74 61 73 6f 75 72 63 65 20 69 53 72  m datasource iSr
4940: 63 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  c in SrcList pSr
4950: 63 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  c..*/.Expr *sqli
4960: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
4970: 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  xpr(sqlite3 *db,
4980: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
4990: 69 6e 74 20 69 53 72 63 2c 20 69 6e 74 20 69 43  int iSrc, int iC
49a0: 6f 6c 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  ol){.  Expr *p =
49b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
49c0: 63 28 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  c(db, TK_COLUMN,
49d0: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20   0, 0);.  if( p 
49e0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
49f0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
4a00: 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 53 72  m = &pSrc->a[iSr
4a10: 63 5d 3b 0a 20 20 20 20 70 2d 3e 70 54 61 62 20  c];.    p->pTab 
4a20: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
4a30: 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70     p->iTable = p
4a40: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
4a50: 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62 2d 3e     if( p->pTab->
4a60: 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20  iPKey==iCol ){. 
4a70: 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20       p->iColumn 
4a80: 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
4a90: 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
4aa0: 6e 20 3d 20 28 79 6e 56 61 72 29 69 43 6f 6c 3b  n = (ynVar)iCol;
4ab0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
4ac0: 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
4ad0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
4ae0: 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
4af0: 20 20 20 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65     pItem->colUse
4b00: 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31  d |= ((Bitmask)1
4b10: 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20  )<<(iCol>=BMS ? 
4b20: 42 4d 53 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a 20  BMS-1 : iCol);. 
4b30: 20 20 20 7d 0a 20 20 20 20 45 78 70 72 53 65 74     }.    ExprSet
4b40: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52  Property(p, EP_R
4b50: 65 73 6f 6c 76 65 64 29 3b 0a 20 20 7d 0a 20 20  esolved);.  }.  
4b60: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
4b70: 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  ** Report an err
4b80: 6f 72 20 74 68 61 74 20 61 6e 20 65 78 70 72 65  or that an expre
4b90: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c  ssion is not val
4ba0: 69 64 20 66 6f 72 20 61 20 70 61 72 74 69 61 6c  id for a partial
4bb0: 20 69 6e 64 65 78 20 57 48 45 52 45 0a 2a 2a 20   index WHERE.** 
4bc0: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  clause..*/.stati
4bd0: 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69 64 50  c void notValidP
4be0: 61 72 74 49 64 78 57 68 65 72 65 28 0a 20 20 50  artIdxWhere(.  P
4bf0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4c00: 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 65 72 72      /* Leave err
4c10: 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72 65 20  or message here 
4c20: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
4c30: 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65   *pNC,    /* The
4c40: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 2a 2f   name context */
4c50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4c60: 4d 73 67 20 20 20 20 20 2f 2a 20 54 79 70 65 20  Msg     /* Type 
4c70: 6f 66 20 65 72 72 6f 72 20 2a 2f 0a 29 7b 0a 20  of error */.){. 
4c80: 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
4c90: 67 73 20 26 20 4e 43 5f 50 61 72 74 49 64 78 29  gs & NC_PartIdx)
4ca0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
4cb0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4cc0: 65 2c 20 22 25 73 20 70 72 6f 68 69 62 69 74 65  e, "%s prohibite
4cd0: 64 20 69 6e 20 70 61 72 74 69 61 6c 20 69 6e 64  d in partial ind
4ce0: 65 78 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  ex WHERE clauses
4cf0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
4d00: 20 20 20 20 20 20 20 7a 4d 73 67 29 3b 0a 20 20         zMsg);.  
4d10: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
4d20: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 2f  ITE_OMIT_CHECK./
4d30: 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20 65  *.** Report an e
4d40: 72 72 6f 72 20 74 68 61 74 20 61 6e 20 65 78 70  rror that an exp
4d50: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76  ression is not v
4d60: 61 6c 69 64 20 66 6f 72 20 61 20 43 48 45 43 4b  alid for a CHECK
4d70: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a   constraint..*/.
4d80: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 74 56  static void notV
4d90: 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  alidCheckConstra
4da0: 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
4db0: 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4c  arse,       /* L
4dc0: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
4dd0: 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 4e 61 6d  ge here */.  Nam
4de0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
4df0: 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f    /* The name co
4e00: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
4e10: 20 63 68 61 72 20 2a 7a 4d 73 67 20 20 20 20 20   char *zMsg     
4e20: 2f 2a 20 54 79 70 65 20 6f 66 20 65 72 72 6f 72  /* Type of error
4e30: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 28 70 4e   */.){.  if( (pN
4e40: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
4e50: 49 73 43 68 65 63 6b 29 21 3d 30 20 29 7b 0a 20  IsCheck)!=0 ){. 
4e60: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4e70: 73 67 28 70 50 61 72 73 65 2c 22 25 73 20 70 72  sg(pParse,"%s pr
4e80: 6f 68 69 62 69 74 65 64 20 69 6e 20 43 48 45 43  ohibited in CHEC
4e90: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 2c 20  K constraints", 
4ea0: 7a 4d 73 67 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  zMsg);.  }.}.#el
4eb0: 73 65 0a 23 20 64 65 66 69 6e 65 20 6e 6f 74 56  se.# define notV
4ec0: 61 6c 69 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  alidCheckConstra
4ed0: 69 6e 74 28 50 2c 4e 2c 4d 29 0a 23 65 6e 64 69  int(P,N,M).#endi
4ee0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73  f../*.** Express
4ef0: 69 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65 6e 63  ion p should enc
4f00: 6f 64 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70  ode a floating p
4f10: 6f 69 6e 74 20 76 61 6c 75 65 20 62 65 74 77 65  oint value betwe
4f20: 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a  en 1.0 and 0.0..
4f30: 2a 2a 20 52 65 74 75 72 6e 20 31 30 32 34 20 74  ** Return 1024 t
4f40: 69 6d 65 73 20 74 68 69 73 20 76 61 6c 75 65 2e  imes this value.
4f50: 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69    Or return -1 i
4f60: 66 20 70 20 69 73 20 6e 6f 74 20 61 20 66 6c 6f  f p is not a flo
4f70: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
4f80: 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 30  alue between 1.0
4f90: 20 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61   and 0.0..*/.sta
4fa0: 74 69 63 20 69 6e 74 20 65 78 70 72 50 72 6f 62  tic int exprProb
4fb0: 61 62 69 6c 69 74 79 28 45 78 70 72 20 2a 70 29  ability(Expr *p)
4fc0: 7b 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 2d  {.  double r = -
4fd0: 31 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  1.0;.  if( p->op
4fe0: 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74  !=TK_FLOAT ) ret
4ff0: 75 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  urn -1;.  sqlite
5000: 33 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65  3AtoF(p->u.zToke
5010: 6e 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74  n, &r, sqlite3St
5020: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
5030: 65 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  en), SQLITE_UTF8
5040: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 3e 3d  );.  assert( r>=
5050: 30 2e 30 20 29 3b 0a 20 20 69 66 28 20 72 3e 31  0.0 );.  if( r>1
5060: 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
5070: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 72    return (int)(r
5080: 2a 31 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a  *1000.0);.}../*.
5090: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
50a0: 69 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  is callback for 
50b0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
50c0: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  )..**.** Resolve
50d0: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20   symbolic names 
50e0: 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f  into TK_COLUMN o
50f0: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
5100: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65   current.** node
5110: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
5120: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
5130: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74   0 to continue t
5140: 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a  he search down.*
5150: 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20  * the tree or 2 
5160: 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65  to abort the tre
5170: 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  e walk..**.** Th
5180: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
5190: 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b  does error check
51a0: 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73  ing and name res
51b0: 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66  olution for.** f
51c0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20  unction names.  
51d0: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  The operator for
51e0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
51f0: 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a  ions is changed.
5200: 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ** to TK_AGG_FUN
5210: 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  CTION..*/.static
5220: 20 69 6e 74 20 72 65 73 6f 6c 76 65 45 78 70 72   int resolveExpr
5230: 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61  Step(Walker *pWa
5240: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
5250: 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  r){.  NameContex
5260: 74 20 2a 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  t *pNC;.  Parse 
5270: 2a 70 50 61 72 73 65 3b 0a 0a 20 20 70 4e 43 20  *pParse;..  pNC 
5280: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
5290: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 21  ;.  assert( pNC!
52a0: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 20 3d  =0 );.  pParse =
52b0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
52c0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d  assert( pParse==
52d0: 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 20  pWalker->pParse 
52e0: 29 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61  );..  if( ExprHa
52f0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
5300: 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20 29 20   EP_Resolved) ) 
5310: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
5320: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
5330: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
5340: 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66  solved);.#ifndef
5350: 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e   NDEBUG.  if( pN
5360: 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70  C->pSrcList && p
5370: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41  NC->pSrcList->nA
5380: 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72  lloc>0 ){.    Sr
5390: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
53a0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
53b0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
53c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e  for(i=0; i<pNC->
53d0: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
53e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
53f0: 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b  rt( pSrcList->a[
5400: 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26  i].iCursor>=0 &&
5410: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
5420: 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e  iCursor<pParse->
5430: 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nTab);.    }.  }
5440: 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68  .#endif.  switch
5450: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a  ( pExpr->op ){..
5460: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5470: 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45  TE_ENABLE_UPDATE
5480: 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26  _DELETE_LIMIT) &
5490: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
54a0: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
54b0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63  .    /* The spec
54c0: 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 54 4b 5f  ial operator TK_
54d0: 52 4f 57 20 6d 65 61 6e 73 20 75 73 65 20 74 68  ROW means use th
54e0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
54f0: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 63 6f 6c  first.    ** col
5500: 75 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  umn in the FROM 
5510: 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 69 73  clause.  This is
5520: 20 75 73 65 64 20 62 79 20 74 68 65 20 4c 49 4d   used by the LIM
5530: 49 54 20 61 6e 64 20 4f 52 44 45 52 20 42 59 0a  IT and ORDER BY.
5540: 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 70 72      ** clause pr
5550: 6f 63 65 73 73 69 6e 67 20 6f 6e 20 55 50 44 41  ocessing on UPDA
5560: 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20 73 74  TE and DELETE st
5570: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f  atements..    */
5580: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 4f 57  .    case TK_ROW
5590: 3a 20 7b 0a 20 20 20 20 20 20 53 72 63 4c 69 73  : {.      SrcLis
55a0: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
55b0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
55c0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
55d0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
55e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
55f0: 63 4c 69 73 74 20 26 26 20 70 53 72 63 4c 69 73  cList && pSrcLis
5600: 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  t->nSrc==1 );.  
5610: 20 20 20 20 70 49 74 65 6d 20 3d 20 70 53 72 63      pItem = pSrc
5620: 4c 69 73 74 2d 3e 61 3b 20 0a 20 20 20 20 20 20  List->a; .      
5630: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
5640: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 78  OLUMN;.      pEx
5650: 70 72 2d 3e 70 54 61 62 20 3d 20 70 49 74 65 6d  pr->pTab = pItem
5660: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45  ->pTab;.      pE
5670: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
5680: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
5690: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
56a0: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  mn = -1;.      p
56b0: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
56c0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
56d0: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
56e0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
56f0: 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  * defined(SQLITE
5700: 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44  _ENABLE_UPDATE_D
5710: 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26 20  ELETE_LIMIT) && 
5720: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5730: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a  OMIT_SUBQUERY) *
5740: 2f 0a 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65  /..    /* A lone
5750: 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20 74   identifier is t
5760: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
5770: 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  umn..    */.    
5780: 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20  case TK_ID: {.  
5790: 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75      return looku
57a0: 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30 2c  pName(pParse, 0,
57b0: 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f   0, pExpr->u.zTo
57c0: 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29  ken, pNC, pExpr)
57d0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
57e0: 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  * A table name a
57f0: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  nd column name: 
5800: 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a      ID.ID.    **
5810: 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20   Or a database, 
5820: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
5830: 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20  :  ID.ID.ID.    
5840: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  */.    case TK_D
5850: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OT: {.      cons
5860: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b  t char *zColumn;
5870: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
5880: 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 20  r *zTable;.     
5890: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
58a0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
58b0: 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ight;..      /* 
58c0: 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30 20  if( pSrcList==0 
58d0: 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20  ) break; */.    
58e0: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
58f0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
5900: 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  if( pRight->op==
5910: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
5920: 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20   zDb = 0;.      
5930: 20 20 7a 54 61 62 6c 65 20 3d 20 70 45 78 70 72    zTable = pExpr
5940: 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
5950: 6e 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  n;.        zColu
5960: 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a  mn = pRight->u.z
5970: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  Token;.      }el
5980: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
5990: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
59a0: 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_DOT );.      
59b0: 20 20 7a 44 62 20 3d 20 70 45 78 70 72 2d 3e 70    zDb = pExpr->p
59c0: 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
59d0: 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d          zTable =
59e0: 20 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e   pRight->pLeft->
59f0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
5a00: 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67    zColumn = pRig
5a10: 68 74 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54  ht->pRight->u.zT
5a20: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oken;.      }.  
5a30: 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75      return looku
5a40: 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 44  pName(pParse, zD
5a50: 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75  b, zTable, zColu
5a60: 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b  mn, pNC, pExpr);
5a70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
5a80: 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20  esolve function 
5a90: 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20  names.    */.   
5aa0: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 53 54 5f 46   case TK_CONST_F
5ab0: 55 4e 43 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UNC:.    case TK
5ac0: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
5ad0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
5ae0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
5af0: 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 61  ist;    /* The a
5b00: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a  rgument list */.
5b10: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c        int n = pL
5b20: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
5b30: 70 72 20 3a 20 30 3b 20 20 20 20 2f 2a 20 4e 75  pr : 0;    /* Nu
5b40: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
5b50: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
5b60: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b  o_such_func = 0;
5b70: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
5b80: 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69  f no such functi
5b90: 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  on exists */.   
5ba0: 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d     int wrong_num
5bb0: 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f  _args = 0;     /
5bc0: 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20  * True if wrong 
5bd0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
5be0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
5bf0: 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20   is_agg = 0;    
5c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
5c10: 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65 67   if is an aggreg
5c20: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ate function */.
5c30: 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 3b 20        int auth; 
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c50: 20 20 2f 2a 20 41 75 74 68 6f 72 69 7a 61 74 69    /* Authorizati
5c60: 6f 6e 20 74 6f 20 75 73 65 20 74 68 65 20 66 75  on to use the fu
5c70: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
5c80: 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20  int nId;        
5c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5ca0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
5cb0: 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ers in function 
5cc0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  name */.      co
5cd0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20  nst char *zId;  
5ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
5cf0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20   function name. 
5d00: 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
5d10: 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
5d20: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
5d30: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75  ion about the fu
5d40: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
5d50: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
5d60: 72 73 65 2d 3e 64 62 29 3b 20 20 20 2f 2a 20 54  rse->db);   /* T
5d70: 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f  he database enco
5d80: 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 74  ding */..      t
5d90: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
5da0: 6f 70 3d 3d 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e  op==TK_CONST_FUN
5db0: 43 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  C );.      asser
5dc0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
5dd0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
5de0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
5df0: 20 20 6e 6f 74 56 61 6c 69 64 50 61 72 74 49 64    notValidPartId
5e00: 78 57 68 65 72 65 28 70 50 61 72 73 65 2c 20 70  xWhere(pParse, p
5e10: 4e 43 2c 20 22 66 75 6e 63 74 69 6f 6e 73 22 29  NC, "functions")
5e20: 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45  ;.      zId = pE
5e30: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  xpr->u.zToken;. 
5e40: 20 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74       nId = sqlit
5e50: 65 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b  e3Strlen30(zId);
5e60: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
5e70: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
5e80: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
5e90: 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20  d, nId, n, enc, 
5ea0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
5eb0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
5ec0: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
5ed0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
5ee0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
5ef0: 2c 20 2d 32 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  , -2, enc, 0);. 
5f00: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d         if( pDef=
5f10: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5f20: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31  no_such_func = 1
5f30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5f40: 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67  .          wrong
5f50: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20  _num_args = 1;. 
5f60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5f70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
5f80: 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75  _agg = pDef->xFu
5f90: 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  nc==0;.        i
5fa0: 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
5fb0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
5fc0: 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20  _UNLIKELY ){.   
5fd0: 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72         ExprSetPr
5fe0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
5ff0: 5f 55 6e 6c 69 6b 65 6c 79 7c 45 50 5f 53 6b 69  _Unlikely|EP_Ski
6000: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  p);.          if
6010: 28 20 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ( n==2 ){.      
6020: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
6030: 62 6c 65 20 3d 20 65 78 70 72 50 72 6f 62 61 62  ble = exprProbab
6040: 69 6c 69 74 79 28 70 4c 69 73 74 2d 3e 61 5b 31  ility(pList->a[1
6050: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
6060: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
6070: 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20  >iTable<0 ){.   
6080: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6090: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
60a0: 65 2c 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d  e, "second argum
60b0: 65 6e 74 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f  ent to likelihoo
60c0: 64 28 29 20 6d 75 73 74 20 62 65 20 61 20 22 0a  d() must be a ".
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 20 20 20 22 63 6f 6e 73 74 61 6e 74 20        "constant 
6100: 62 65 74 77 65 65 6e 20 30 2e 30 20 61 6e 64 20  between 0.0 and 
6110: 31 2e 30 22 29 3b 0a 20 20 20 20 20 20 20 20 20  1.0");.         
6120: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
6130: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6140: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
6150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
6160: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
6170: 31 33 30 34 2d 32 39 34 34 39 20 54 68 65 20 75  1304-29449 The u
6180: 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74  nlikely(X) funct
6190: 69 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  ion is equivalen
61a0: 74 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20  t to.           
61b0: 20 2a 2a 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58   ** likelihood(X
61c0: 2c 20 30 2e 30 36 32 35 29 2e 0a 20 20 20 20 20  , 0.0625)..     
61d0: 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e         ** EVIDEN
61e0: 43 45 2d 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31  CE-OF: R-01283-1
61f0: 31 36 33 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c  1636 The unlikel
6200: 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  y(X) function is
6210: 20 73 68 6f 72 74 2d 68 61 6e 64 20 66 6f 72 0a   short-hand for.
6220: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6c              ** l
6230: 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36  ikelihood(X,0.06
6240: 32 35 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  25). */.        
6250: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6260: 65 20 3d 20 36 32 3b 20 20 2f 2a 20 54 55 4e 49  e = 62;  /* TUNI
6270: 4e 47 3a 20 20 44 65 66 61 75 6c 74 20 32 6e 64  NG:  Default 2nd
6280: 20 61 72 67 20 74 6f 20 75 6e 6c 69 6b 65 6c 79   arg to unlikely
6290: 28 29 20 69 73 20 30 2e 30 36 32 35 20 2a 2f 0a  () is 0.0625 */.
62a0: 20 20 20 20 20 20 20 20 20 20 7d 20 20 20 20 20            }     
62b0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
62c0: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64   }.      }.#ifnd
62d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
62e0: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
62f0: 20 20 20 69 66 28 20 70 44 65 66 20 29 7b 0a 20     if( pDef ){. 
6300: 20 20 20 20 20 20 20 61 75 74 68 20 3d 20 73 71         auth = sq
6310: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
6320: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55  Parse, SQLITE_FU
6330: 4e 43 54 49 4f 4e 2c 20 30 2c 20 70 44 65 66 2d  NCTION, 0, pDef-
6340: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
6350: 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51      if( auth!=SQ
6360: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
6370: 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53       if( auth==S
6380: 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20  QLITE_DENY ){.  
6390: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
63a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
63b0: 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65  , "not authorize
63c0: 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f  d to use functio
63d0: 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  n: %s",.        
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65 66              pDef
6400: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
6410: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
6420: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
6430: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6440: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
6450: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
6460: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
6470: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
6480: 69 66 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f  if.      if( is_
6490: 61 67 67 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46  agg && (pNC->ncF
64a0: 6c 61 67 73 20 26 20 4e 43 5f 41 6c 6c 6f 77 41  lags & NC_AllowA
64b0: 67 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  gg)==0 ){.      
64c0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
64d0: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
64e0: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
64f0: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
6500: 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20   nId,zId);.     
6510: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
6520: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
6530: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
6540: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
6550: 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
6560: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
6570: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6580: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6590: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
65a0: 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a  n: %.*s", nId, z
65b0: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
65c0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
65d0: 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f  }else if( wrong_
65e0: 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  num_args ){.    
65f0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6600: 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f 6e  Msg(pParse,"wron
6610: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
6620: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
6630: 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20  n %.*s()",.     
6640: 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64          nId, zId
6650: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
6660: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nErr++;.      }.
6670: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
6680: 20 29 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20   ) pNC->ncFlags 
6690: 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b  &= ~NC_AllowAgg;
66a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
66b0: 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c 6b  lkExprList(pWalk
66c0: 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  er, pList);.    
66d0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
66e0: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
66f0: 65 78 74 20 2a 70 4e 43 32 20 3d 20 70 4e 43 3b  ext *pNC2 = pNC;
6700: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
6710: 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43  op = TK_AGG_FUNC
6720: 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 45  TION;.        pE
6730: 78 70 72 2d 3e 6f 70 32 20 3d 20 30 3b 0a 20 20  xpr->op2 = 0;.  
6740: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
6750: 32 20 26 26 20 21 73 71 6c 69 74 65 33 46 75 6e  2 && !sqlite3Fun
6760: 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
6770: 28 70 45 78 70 72 2c 20 70 4e 43 32 2d 3e 70 53  (pExpr, pNC2->pS
6780: 72 63 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  rcList) ){.     
6790: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2b       pExpr->op2+
67a0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  +;.          pNC
67b0: 32 20 3d 20 70 4e 43 32 2d 3e 70 4e 65 78 74 3b  2 = pNC2->pNext;
67c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
67d0: 20 20 20 69 66 28 20 70 4e 43 32 20 29 20 70 4e     if( pNC2 ) pN
67e0: 43 32 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  C2->ncFlags |= N
67f0: 43 5f 48 61 73 41 67 67 3b 0a 20 20 20 20 20 20  C_HasAgg;.      
6800: 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c    pNC->ncFlags |
6810: 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20  = NC_AllowAgg;. 
6820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
6830: 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65  FIX ME:  Compute
6840: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
6850: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 78   based on the ex
6860: 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a 20 20  pected return.  
6870: 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66 20 74      ** type of t
6880: 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20  he function .   
6890: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
68a0: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
68b0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
68c0: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
68d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
68e0: 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ECT:.    case TK
68f0: 5f 45 58 49 53 54 53 3a 20 20 74 65 73 74 63 61  _EXISTS:  testca
6900: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
6910: 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23 65 6e 64  K_EXISTS );.#end
6920: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  if.    case TK_I
6930: 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
6940: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
6950: 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 69  TK_IN );.      i
6960: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
6970: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
6980: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
6990: 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e     int nRef = pN
69a0: 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20  C->nRef;.       
69b0: 20 6e 6f 74 56 61 6c 69 64 43 68 65 63 6b 43 6f   notValidCheckCo
69c0: 6e 73 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c  nstraint(pParse,
69d0: 20 70 4e 43 2c 20 22 73 75 62 71 75 65 72 69 65   pNC, "subquerie
69e0: 73 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 6f 74  s");.        not
69f0: 56 61 6c 69 64 50 61 72 74 49 64 78 57 68 65 72  ValidPartIdxWher
6a00: 65 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22  e(pParse, pNC, "
6a10: 73 75 62 71 75 65 72 69 65 73 22 29 3b 0a 20 20  subqueries");.  
6a20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
6a30: 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c  kSelect(pWalker,
6a40: 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63   pExpr->x.pSelec
6a50: 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  t);.        asse
6a60: 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e  rt( pNC->nRef>=n
6a70: 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69  Ref );.        i
6a80: 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52  f( nRef!=pNC->nR
6a90: 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ef ){.          
6aa0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
6ab0: 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c  pExpr, EP_VarSel
6ac0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ect);.        }.
6ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
6ae0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6af0: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
6b00: 20 7b 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c 69   {.      notVali
6b10: 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74  dCheckConstraint
6b20: 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 70  (pParse, pNC, "p
6b30: 61 72 61 6d 65 74 65 72 73 22 29 3b 0a 20 20 20  arameters");.   
6b40: 20 20 20 6e 6f 74 56 61 6c 69 64 50 61 72 74 49     notValidPartI
6b50: 64 78 57 68 65 72 65 28 70 50 61 72 73 65 2c 20  dxWhere(pParse, 
6b60: 70 4e 43 2c 20 22 70 61 72 61 6d 65 74 65 72 73  pNC, "parameters
6b70: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
6b80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6b90: 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45 72  urn (pParse->nEr
6ba0: 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
6bb0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f  >mallocFailed) ?
6bc0: 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43   WRC_Abort : WRC
6bd0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
6be0: 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 61 20  .** pEList is a 
6bf0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
6c00: 6f 6e 73 20 77 68 69 63 68 20 61 72 65 20 72 65  ons which are re
6c10: 61 6c 6c 79 20 74 68 65 20 72 65 73 75 6c 74 20  ally the result 
6c20: 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 20  set of the.** a 
6c30: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6c40: 2e 20 20 70 45 20 69 73 20 61 20 74 65 72 6d 20  .  pE is a term 
6c50: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  in an ORDER BY o
6c60: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
6c70: 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
6c80: 6e 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ne checks to see
6c90: 20 69 66 20 70 45 20 69 73 20 61 20 73 69 6d 70   if pE is a simp
6ca0: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 68  le identifier wh
6cb0: 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73 0a  ich corresponds.
6cc0: 2a 2a 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d  ** to the AS-nam
6cd0: 65 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  e of one of the 
6ce0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78 70  terms of the exp
6cf0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
6d00: 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 69 73  f it is,.** this
6d10: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20   routine return 
6d20: 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65  an integer betwe
6d30: 65 6e 20 31 20 61 6e 64 20 4e 20 77 68 65 72 65  en 1 and N where
6d40: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
6d50: 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20   of.** elements 
6d60: 69 6e 20 70 45 4c 69 73 74 2c 20 63 6f 72 72 65  in pEList, corre
6d70: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
6d80: 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 20  matching entry. 
6d90: 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   If there is.** 
6da0: 6e 6f 20 6d 61 74 63 68 2c 20 6f 72 20 69 66 20  no match, or if 
6db0: 70 45 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  pE is not a simp
6dc0: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 20 74  le identifier, t
6dd0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
6de0: 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  .** return 0..**
6df0: 0a 2a 2a 20 70 45 4c 69 73 74 20 68 61 73 20 62  .** pEList has b
6e00: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 70  een resolved.  p
6e10: 45 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  E has not..*/.st
6e20: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
6e30: 41 73 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  AsName(.  Parse 
6e40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
6e50: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
6e60: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
6e70: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
6e80: 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69   *pEList,  /* Li
6e90: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
6ea0: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
6eb0: 78 70 72 20 2a 70 45 20 20 20 20 20 20 20 20 20  xpr *pE         
6ec0: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
6ed0: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
6ee0: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
6ef0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
6f00: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
6f10: 72 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50  r */..  UNUSED_P
6f20: 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
6f30: 3b 0a 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  ;..  if( pE->op=
6f40: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 63 68  =TK_ID ){.    ch
6f50: 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 45 2d 3e 75  ar *zCol = pE->u
6f60: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72  .zToken;.    for
6f70: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
6f80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
6f90: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
6fa0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
6fb0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 73  e;.      if( zAs
6fc0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
6fd0: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
6fe0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
6ff0: 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20  eturn i+1;.     
7000: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
7010: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
7020: 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74 65  * pE is a pointe
7030: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
7040: 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20 73 69  on which is a si
7050: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65  ngle term in the
7060: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 66 20  .** ORDER BY of 
7070: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
7080: 54 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  T.  The expressi
7090: 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a  on has not been.
70a0: 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65 64  ** name resolved
70b0: 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 70  ..**.** At the p
70c0: 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  oint this routin
70d0: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
70e0: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 61  already know tha
70f0: 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42  t the.** ORDER B
7100: 59 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 6e  Y term is not an
7110: 20 69 6e 74 65 67 65 72 20 69 6e 64 65 78 20 69   integer index i
7120: 6e 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 73  nto the result s
7130: 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63 61 73  et.  That.** cas
7140: 65 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20  e is handled by 
7150: 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
7160: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d  ine..**.** Attem
7170: 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20 61  pt to match pE a
7180: 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65  gainst result se
7190: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
71a0: 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53 45   left-most.** SE
71b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
71c0: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
71d0: 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68  x i of the match
71e0: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61  ing column,.** a
71f0: 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  s an indication 
7200: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  to the caller th
7210: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72  at it should sor
7220: 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f  t by the i-th co
7230: 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65 66  lumn..** The lef
7240: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
7250: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f   1.  In other wo
7260: 72 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20 72  rds, the value r
7270: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
7280: 2a 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20 76  * same integer v
7290: 61 6c 75 65 20 74 68 61 74 20 77 6f 75 6c 64 20  alue that would 
72a0: 62 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 53  be used in the S
72b0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
72c0: 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 65 20  indicate.** the 
72d0: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  column..**.** If
72e0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74   there is no mat
72f0: 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ch, return 0.  R
7300: 65 74 75 72 6e 20 2d 31 20 69 66 20 61 6e 20 65  eturn -1 if an e
7310: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
7320: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
7330: 76 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45  veOrderByTermToE
7340: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
7350: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
7360: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
7370: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
7380: 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ges */.  Select 
7390: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54  *pSelect,   /* T
73a0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
73b0: 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52 44  ent with the ORD
73c0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
73d0: 20 20 45 78 70 72 20 2a 70 45 20 20 20 20 20 20    Expr *pE      
73e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
73f0: 69 66 69 63 20 4f 52 44 45 52 20 42 59 20 74 65  ific ORDER BY te
7400: 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  rm */.){.  int i
7410: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7420: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
7430: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
7440: 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ist;  /* The col
7450: 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75  umns of the resu
7460: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65  lt set */.  Name
7470: 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f  Context nc;    /
7480: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
7490: 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20  or resolving pE 
74a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
74b0: 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
74c0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
74d0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
74e0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
74f0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72   code from subpr
7500: 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 75 38  ocedures */.  u8
7510: 20 73 61 76 65 64 53 75 70 70 45 72 72 3b 20 20   savedSuppErr;  
7520: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
7530: 6f 66 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  of db->suppressE
7540: 72 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rr */..  assert(
7550: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
7560: 74 65 67 65 72 28 70 45 2c 20 26 69 29 3d 3d 30  teger(pE, &i)==0
7570: 20 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   );.  pEList = p
7580: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
7590: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c  .  /* Resolve al
75a0: 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 4f  l names in the O
75b0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 65 78 70  RDER BY term exp
75c0: 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d  ression.  */.  m
75d0: 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73 69  emset(&nc, 0, si
75e0: 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e  zeof(nc));.  nc.
75f0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
7600: 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d  .  nc.pSrcList =
7610: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
7620: 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70 45    nc.pEList = pE
7630: 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e 63 46 6c 61  List;.  nc.ncFla
7640: 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67  gs = NC_AllowAgg
7650: 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b  ;.  nc.nErr = 0;
7660: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
7670: 64 62 3b 0a 20 20 73 61 76 65 64 53 75 70 70 45  db;.  savedSuppE
7680: 72 72 20 3d 20 64 62 2d 3e 73 75 70 70 72 65 73  rr = db->suppres
7690: 73 45 72 72 3b 0a 20 20 64 62 2d 3e 73 75 70 70  sErr;.  db->supp
76a0: 72 65 73 73 45 72 72 20 3d 20 31 3b 0a 20 20 72  ressErr = 1;.  r
76b0: 63 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  c = sqlite3Resol
76c0: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 6e 63 2c  veExprNames(&nc,
76d0: 20 70 45 29 3b 0a 20 20 64 62 2d 3e 73 75 70 70   pE);.  db->supp
76e0: 72 65 73 73 45 72 72 20 3d 20 73 61 76 65 64 53  ressErr = savedS
76f0: 75 70 70 45 72 72 3b 0a 20 20 69 66 28 20 72 63  uppErr;.  if( rc
7700: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
7710: 2f 2a 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20  /* Try to match 
7720: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  the ORDER BY exp
7730: 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20  ression against 
7740: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  an expression.  
7750: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
7760: 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 61 6e   set.  Return an
7770: 20 31 2d 62 61 73 65 64 20 69 6e 64 65 78 20 6f   1-based index o
7780: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 20  f the matching. 
7790: 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65   ** result-set e
77a0: 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ntry..  */.  for
77b0: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
77c0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
77d0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
77e0: 43 6f 6d 70 61 72 65 28 70 45 4c 69 73 74 2d 3e  Compare(pEList->
77f0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 2c 20  a[i].pExpr, pE, 
7800: 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  -1)<2 ){.      r
7810: 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 7d  eturn i+1;.    }
7820: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
7830: 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30   match, return 0
7840: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  . */.  return 0;
7850: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
7860: 74 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  te an ORDER BY o
7870: 72 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20  r GROUP BY term 
7880: 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 65 72 72  out-of-range err
7890: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
78a0: 69 64 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52  id resolveOutOfR
78b0: 61 6e 67 65 45 72 72 6f 72 28 0a 20 20 50 61 72  angeError(.  Par
78c0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
78d0: 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72      /* The error
78e0: 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77 68   context into wh
78f0: 69 63 68 20 74 6f 20 77 72 69 74 65 20 74 68 65  ich to write the
7900: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73   error */.  cons
7910: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
7920: 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72     /* "ORDER" or
7930: 20 22 47 52 4f 55 50 22 20 2a 2f 0a 20 20 69 6e   "GROUP" */.  in
7940: 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
7950: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
7960: 78 20 28 31 2d 62 61 73 65 64 29 20 6f 66 20 74  x (1-based) of t
7970: 68 65 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72  he term out of r
7980: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ange */.  int mx
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79a0: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 65 72 6d   /* Largest perm
79b0: 69 73 73 69 62 6c 65 20 76 61 6c 75 65 20 6f 66  issible value of
79c0: 20 69 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74   i */.){.  sqlit
79d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
79e0: 65 2c 20 0a 20 20 20 20 22 25 72 20 25 73 20 42  e, .    "%r %s B
79f0: 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61  Y term out of ra
7a00: 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nge - should be 
7a10: 22 0a 20 20 20 20 22 62 65 74 77 65 65 6e 20 31  ".    "between 1
7a20: 20 61 6e 64 20 25 64 22 2c 20 69 2c 20 7a 54 79   and %d", i, zTy
7a30: 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pe, mx);.}../*.*
7a40: 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 4f 52  * Analyze the OR
7a50: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e  DER BY clause in
7a60: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
7a70: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 20  CT statement.   
7a80: 4d 6f 64 69 66 79 0a 2a 2a 20 65 61 63 68 20 74  Modify.** each t
7a90: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
7aa0: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 20   BY clause is a 
7ab0: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
7ac0: 20 62 65 74 77 65 65 6e 20 31 0a 2a 2a 20 61 6e   between 1.** an
7ad0: 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74  d N where N is t
7ae0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
7af0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  umns in the comp
7b00: 6f 75 6e 64 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  ound SELECT..**.
7b10: 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ** ORDER BY term
7b20: 73 20 74 68 61 74 20 61 72 65 20 61 6c 72 65 61  s that are alrea
7b30: 64 79 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65  dy an integer be
7b40: 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 61 72  tween 1 and N ar
7b50: 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e  e.** unmodified.
7b60: 20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73    ORDER BY terms
7b70: 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 67 65   that are intege
7b80: 72 73 20 6f 75 74 73 69 64 65 20 74 68 65 20 72  rs outside the r
7b90: 61 6e 67 65 20 6f 66 0a 2a 2a 20 31 20 74 68 72  ange of.** 1 thr
7ba0: 6f 75 67 68 20 4e 20 67 65 6e 65 72 61 74 65 20  ough N generate 
7bb0: 61 6e 20 65 72 72 6f 72 2e 20 20 4f 52 44 45 52  an error.  ORDER
7bc0: 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 61   BY terms that a
7bd0: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  re expressions.*
7be0: 2a 20 61 72 65 20 6d 61 74 63 68 65 64 20 61 67  * are matched ag
7bf0: 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74  ainst result set
7c00: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
7c10: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
7c20: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
7c30: 68 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  h the left-most 
7c40: 53 45 4c 45 43 54 20 61 6e 64 20 77 6f 72 6b 69  SELECT and worki
7c50: 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20 72 69  ng toward the ri
7c60: 67 68 74 2e 0a 2a 2a 20 41 74 20 74 68 65 20 66  ght..** At the f
7c70: 69 72 73 74 20 6d 61 74 63 68 2c 20 74 68 65 20  irst match, the 
7c80: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
7c90: 69 6f 6e 20 69 73 20 74 72 61 6e 73 66 6f 72 6d  ion is transform
7ca0: 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 69  ed into.** the i
7cb0: 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75  nteger column nu
7cc0: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mber..**.** Retu
7cd0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
7ce0: 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2f   errors seen..*/
7cf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
7d00: 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  lveCompoundOrder
7d10: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
7d20: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
7d30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
7d40: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
7d50: 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  sages here */.  
7d60: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
7d70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
7d80: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
7d90: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f 52 44  ntaining the ORD
7da0: 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ER BY */.){.  in
7db0: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
7dc0: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
7dd0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
7de0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
7df0: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
7e00: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
7e10: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
7e20: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
7e30: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
7e40: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
7e50: 64 62 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  db;.#if SQLITE_M
7e60: 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20  AX_COLUMN.  if( 
7e70: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
7e80: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
7e90: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
7ea0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
7eb0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7ec0: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
7ed0: 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
7ee0: 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e");.    return 
7ef0: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
7f00: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65  for(i=0; i<pOrde
7f10: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  rBy->nExpr; i++)
7f20: 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e  {.    pOrderBy->
7f30: 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20  a[i].done = 0;. 
7f40: 20 7d 0a 20 20 70 53 65 6c 65 63 74 2d 3e 70 4e   }.  pSelect->pN
7f50: 65 78 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ext = 0;.  while
7f60: 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  ( pSelect->pPrio
7f70: 72 20 29 7b 0a 20 20 20 20 70 53 65 6c 65 63 74  r ){.    pSelect
7f80: 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20  ->pPrior->pNext 
7f90: 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70  = pSelect;.    p
7fa0: 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74  Select = pSelect
7fb0: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  ->pPrior;.  }.  
7fc0: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20 26  while( pSelect &
7fd0: 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20  & moreToDo ){.  
7fe0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
7ff0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
8000: 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b     moreToDo = 0;
8010: 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53  .    pEList = pS
8020: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
8030: 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73     assert( pELis
8040: 74 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  t!=0 );.    for(
8050: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65  i=0, pItem=pOrde
8060: 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72  rBy->a; i<pOrder
8070: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
8080: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
8090: 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  int iCol = -1;. 
80a0: 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a       Expr *pE, *
80b0: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
80c0: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 29 20 63 6f  pItem->done ) co
80d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45  ntinue;.      pE
80e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
80f0: 69 70 43 6f 6c 6c 61 74 65 28 70 49 74 65 6d 2d  ipCollate(pItem-
8100: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69  >pExpr);.      i
8110: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
8120: 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f  Integer(pE, &iCo
8130: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l) ){.        if
8140: 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f  ( iCol<=0 || iCo
8150: 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  l>pEList->nExpr 
8160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
8170: 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72  olveOutOfRangeEr
8180: 72 6f 72 28 70 50 61 72 73 65 2c 20 22 4f 52 44  ror(pParse, "ORD
8190: 45 52 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74  ER", i+1, pEList
81a0: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
81b0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
81c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
81d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 43 6f  lse{.        iCo
81e0: 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d  l = resolveAsNam
81f0: 65 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  e(pParse, pEList
8200: 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20 69  , pE);.        i
8210: 66 28 20 69 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  f( iCol==0 ){.  
8220: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73          pDup = s
8230: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
8240: 2c 20 70 45 2c 20 30 29 3b 0a 20 20 20 20 20 20  , pE, 0);.      
8250: 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
8260: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
8270: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8280: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20  pDup);.         
8290: 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76     iCol = resolv
82a0: 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  eOrderByTermToEx
82b0: 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70  prList(pParse, p
82c0: 53 65 6c 65 63 74 2c 20 70 44 75 70 29 3b 0a 20  Select, pDup);. 
82d0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
82e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
82f0: 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29  Delete(db, pDup)
8300: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8310: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43    }.      if( iC
8320: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol>0 ){.        
8330: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f  /* Convert the O
8340: 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 6e 74  RDER BY term int
8350: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6c  o an integer col
8360: 75 6d 6e 20 6e 75 6d 62 65 72 20 69 43 6f 6c 2c  umn number iCol,
8370: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 69  .        ** taki
8380: 6e 67 20 63 61 72 65 20 74 6f 20 70 72 65 73 65  ng care to prese
8390: 72 76 65 20 74 68 65 20 43 4f 4c 4c 41 54 45 20  rve the COLLATE 
83a0: 63 6c 61 75 73 65 20 69 66 20 69 74 20 65 78 69  clause if it exi
83b0: 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45  sts */.        E
83c0: 78 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69  xpr *pNew = sqli
83d0: 74 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49  te3Expr(db, TK_I
83e0: 4e 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20  NTEGER, 0);.    
83f0: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
8400: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
8410: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
8420: 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a  |= EP_IntValue;.
8430: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e          pNew->u.
8440: 69 56 61 6c 75 65 20 3d 20 69 43 6f 6c 3b 0a 20  iValue = iCol;. 
8450: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
8460: 2d 3e 70 45 78 70 72 3d 3d 70 45 20 29 7b 0a 20  ->pExpr==pE ){. 
8470: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
8480: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
8490: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
84a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
84b0: 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d  Item->pExpr->op=
84c0: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20  =TK_COLLATE );. 
84d0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
84e0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70   pItem->pExpr->p
84f0: 4c 65 66 74 3d 3d 70 45 20 29 3b 0a 20 20 20 20  Left==pE );.    
8500: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78        pItem->pEx
8510: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77  pr->pLeft = pNew
8520: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8530: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
8540: 65 6c 65 74 65 28 64 62 2c 20 70 45 29 3b 0a 20  elete(db, pE);. 
8550: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f         pItem->iO
8560: 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
8570: 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  )iCol;.        p
8580: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 31 3b 0a  Item->done = 1;.
8590: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
85a0: 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20       moreToDo = 
85b0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
85c0: 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70  .    pSelect = p
85d0: 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20  Select->pNext;. 
85e0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
85f0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8600: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
8610: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f  OrderBy->a[i].do
8620: 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ne==0 ){.      s
8630: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8640: 50 61 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52  Parse, "%r ORDER
8650: 20 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f   BY term does no
8660: 74 20 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20  t match any ".  
8670: 20 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d            "colum
8680: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
8690: 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20  set", i+1);.    
86a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
86b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
86c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
86d0: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
86e0: 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  he ORDER BY or G
86f0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 70  ROUP BY clause p
8700: 4f 72 64 65 72 42 79 20 6f 66 0a 2a 2a 20 74 68  OrderBy of.** th
8710: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
8720: 6e 74 20 70 53 65 6c 65 63 74 2e 20 20 49 66 20  nt pSelect.  If 
8730: 61 6e 79 20 74 65 72 6d 20 69 73 20 72 65 66 65  any term is refe
8740: 72 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 72 65  rence to a.** re
8750: 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
8760: 69 6f 6e 20 28 61 73 20 64 65 74 65 72 6d 69 6e  ion (as determin
8770: 65 64 20 62 79 20 74 68 65 20 45 78 70 72 4c 69  ed by the ExprLi
8780: 73 74 2e 61 2e 69 4f 72 64 65 72 42 79 43 6f 6c  st.a.iOrderByCol
8790: 20 66 69 65 6c 64 29 0a 2a 2a 20 74 68 65 6e 20   field).** then 
87a0: 63 6f 6e 76 65 72 74 20 74 68 61 74 20 74 65 72  convert that ter
87b0: 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79 20 6f 66  m into a copy of
87c0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
87d0: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  ng result set.**
87e0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49   column..**.** I
87f0: 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
8800: 20 64 65 74 65 63 74 65 64 2c 20 61 64 64 20 61   detected, add a
8810: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
8820: 74 6f 20 70 50 61 72 73 65 20 61 6e 64 0a 2a 2a  to pParse and.**
8830: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
8840: 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
8850: 66 20 6e 6f 20 65 72 72 6f 72 73 20 61 72 65 20  f no errors are 
8860: 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  seen..*/.int sql
8870: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
8880: 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65  GroupBy(.  Parse
8890: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
88a0: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
88b0: 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f  ext.  Leave erro
88c0: 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20  r messages here 
88d0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
88e0: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  lect,      /* Th
88f0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
8900: 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  nt containing th
8910: 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  e clause */.  Ex
8920: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
8930: 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ,   /* The ORDER
8940: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
8950: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f  clause to be pro
8960: 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  cessed */.  cons
8970: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
8980: 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72 20    /* "ORDER" or 
8990: 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20 20  "GROUP" */.){.  
89a0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
89b0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
89c0: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
89d0: 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
89e0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
89f0: 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70 4f 72  Item;..  if( pOr
8a00: 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72  derBy==0 || pPar
8a10: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8a20: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  iled ) return 0;
8a30: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
8a40: 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f 72  COLUMN.  if( pOr
8a50: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d  derBy->nExpr>db-
8a60: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8a70: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
8a80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8a90: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
8aa0: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25   many terms in %
8ab0: 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54  s BY clause", zT
8ac0: 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ype);.    return
8ad0: 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   1;.  }.#endif. 
8ae0: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
8af0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73  t->pEList;.  ass
8b00: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
8b10: 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c  ;  /* sqlite3Sel
8b20: 65 63 74 4e 65 77 28 29 20 67 75 61 72 61 6e 74  ectNew() guarant
8b30: 65 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 66 6f  ees this */.  fo
8b40: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
8b50: 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64  derBy->a; i<pOrd
8b60: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
8b70: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
8b80: 69 66 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65  if( pItem->iOrde
8b90: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
8ba0: 69 66 28 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65  if( pItem->iOrde
8bb0: 72 42 79 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  rByCol>pEList->n
8bc0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
8bd0: 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67  resolveOutOfRang
8be0: 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a  eError(pParse, z
8bf0: 54 79 70 65 2c 20 69 2b 31 2c 20 70 45 4c 69 73  Type, i+1, pELis
8c00: 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20  t->nExpr);.     
8c10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
8c20: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 6f 6c     }.      resol
8c30: 76 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  veAlias(pParse, 
8c40: 70 45 4c 69 73 74 2c 20 70 49 74 65 6d 2d 3e 69  pEList, pItem->i
8c50: 4f 72 64 65 72 42 79 43 6f 6c 2d 31 2c 20 70 49  OrderByCol-1, pI
8c60: 74 65 6d 2d 3e 70 45 78 70 72 2c 20 7a 54 79 70  tem->pExpr, zTyp
8c70: 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e,0);.    }.  }.
8c80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
8c90: 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
8ca0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
8cb0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
8cc0: 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  in SELECT statem
8cd0: 65 6e 74 20 70 53 65 6c 65 63 74 2e 0a 2a 2a 20  ent pSelect..** 
8ce0: 54 68 65 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74  The Name context
8cf0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
8d00: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 4e 43 2e  tatement is pNC.
8d10: 20 20 7a 54 79 70 65 20 69 73 20 65 69 74 68 65    zType is eithe
8d20: 72 0a 2a 2a 20 22 4f 52 44 45 52 22 20 6f 72 20  r.** "ORDER" or 
8d30: 22 47 52 4f 55 50 22 20 64 65 70 65 6e 64 69 6e  "GROUP" dependin
8d40: 67 20 6f 6e 20 77 68 69 63 68 20 74 79 70 65 20  g on which type 
8d50: 6f 66 20 63 6c 61 75 73 65 20 70 4f 72 64 65 72  of clause pOrder
8d60: 42 79 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  By is..**.** Thi
8d70: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
8d80: 65 73 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  es each term of 
8d90: 74 68 65 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  the clause into 
8da0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
8db0: 2a 20 49 66 20 74 68 65 20 6f 72 64 65 72 2d 62  * If the order-b
8dc0: 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74  y term is an int
8dd0: 65 67 65 72 20 49 20 62 65 74 77 65 65 6e 20 31  eger I between 1
8de0: 20 61 6e 64 20 4e 20 28 77 68 65 72 65 20 4e 20   and N (where N 
8df0: 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
8e00: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
8e10: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
8e20: 20 74 68 65 20 53 45 4c 45 43 54 29 20 74 68 65   the SELECT) the
8e30: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8e40: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 6f 6c  .** in the resol
8e50: 75 74 69 6f 6e 20 69 73 20 61 20 63 6f 70 79 20  ution is a copy 
8e60: 6f 66 20 74 68 65 20 49 2d 74 68 20 72 65 73 75  of the I-th resu
8e70: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
8e80: 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 6f 72  n.  If.** the or
8e90: 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61  der-by term is a
8ea0: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 74 68 61  n identifier tha
8eb0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
8ec0: 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 0a   the AS-name of.
8ed0: 2a 2a 20 61 20 72 65 73 75 6c 74 2d 73 65 74 20  ** a result-set 
8ee0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
8ef0: 20 74 68 65 20 74 65 72 6d 20 72 65 73 6f 6c 76   the term resolv
8f00: 65 73 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20  es to a copy of 
8f10: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  the.** result-se
8f20: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4f  t expression.  O
8f30: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 65 78  therwise, the ex
8f40: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 73 6f  pression is reso
8f50: 6c 76 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lved in.** the u
8f60: 73 75 61 6c 20 77 61 79 20 2d 20 75 73 69 6e 67  sual way - using
8f70: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
8f80: 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a  xprNames()..**.*
8f90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
8fa0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
8fb0: 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
8fc0: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 74   errors occur, t
8fd0: 68 65 6e 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  hen.** an approp
8fe0: 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
8ff0: 61 67 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66  age might be lef
9000: 74 20 69 6e 20 70 50 61 72 73 65 2e 20 20 28 4f  t in pParse.  (O
9010: 4f 4d 20 65 72 72 6f 72 73 0a 2a 2a 20 65 78 63  OM errors.** exc
9020: 65 70 74 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  epted.).*/.stati
9030: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64  c int resolveOrd
9040: 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d  erGroupBy(.  Nam
9050: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
9060: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
9070: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45  ontext of the SE
9080: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
9090: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
90a0: 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ect,      /* The
90b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
90c0: 74 20 68 6f 6c 64 69 6e 67 20 70 4f 72 64 65 72  t holding pOrder
90d0: 42 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  By */.  ExprList
90e0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
90f0: 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   An ORDER BY or 
9100: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
9110: 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
9120: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
9130: 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  e     /* Either 
9140: 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
9150: 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  P", as appropria
9160: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
9170: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
9180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9190: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
91a0: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
91c0: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
91d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
91e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
91f0: 3b 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66  ;   /* A term of
9200: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
9210: 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73 65 20  ause */.  Parse 
9220: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
9230: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9240: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9250: 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 20 20 20   int nResult;   
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9270: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
9280: 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ms in the result
9290: 20 73 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 70   set */..  if( p
92a0: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
92b0: 75 72 6e 20 30 3b 0a 20 20 6e 52 65 73 75 6c 74  urn 0;.  nResult
92c0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
92d0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 50 61  st->nExpr;.  pPa
92e0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
92f0: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  e;.  for(i=0, pI
9300: 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
9310: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
9320: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
9330: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
9340: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
9350: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
9360: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
9370: 6f 6c 6c 61 74 65 28 70 45 29 3b 0a 20 20 20 20  ollate(pE);.    
9380: 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47  if( zType[0]!='G
9390: 27 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20  ' ){.      iCol 
93a0: 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28  = resolveAsName(
93b0: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
93c0: 3e 70 45 4c 69 73 74 2c 20 70 45 32 29 3b 0a 20  >pEList, pE2);. 
93d0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
93e0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
93f0: 20 61 6e 20 41 53 2d 6e 61 6d 65 20 6d 61 74 63   an AS-name matc
9400: 68 20 69 73 20 66 6f 75 6e 64 2c 20 6d 61 72 6b  h is found, mark
9410: 20 74 68 69 73 20 4f 52 44 45 52 20 42 59 20 63   this ORDER BY c
9420: 6f 6c 75 6d 6e 20 61 73 20 62 65 69 6e 67 0a 20  olumn as being. 
9430: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79         ** a copy
9440: 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
9450: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
9460: 6e 2e 20 20 54 68 65 20 73 75 62 73 65 71 75 65  n.  The subseque
9470: 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20  nt call to.     
9480: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73     ** sqlite3Res
9490: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
94a0: 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  () will convert 
94b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
94c0: 6f 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  o a.        ** c
94d0: 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  opy of the iCol-
94e0: 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  th result-set ex
94f0: 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  pression. */.   
9500: 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64       pItem->iOrd
9510: 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69  erByCol = (u16)i
9520: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  Col;.        con
9530: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
9540: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
9550: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9560: 72 28 70 45 32 2c 20 26 69 43 6f 6c 29 20 29 7b  r(pE2, &iCol) ){
9570: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  .      /* The OR
9580: 44 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 61  DER BY term is a
9590: 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
95a0: 6e 74 2e 20 20 41 67 61 69 6e 2c 20 73 65 74 20  nt.  Again, set 
95b0: 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20  the column.     
95c0: 20 2a 2a 20 6e 75 6d 62 65 72 20 73 6f 20 74 68   ** number so th
95d0: 61 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  at sqlite3Resolv
95e0: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 29 20  eOrderGroupBy() 
95f0: 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68 65  will convert the
9600: 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 2d  .      ** order-
9610: 62 79 20 74 65 72 6d 20 74 6f 20 61 20 63 6f 70  by term to a cop
9620: 79 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d  y of the result-
9630: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  set expression *
9640: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c  /.      if( iCol
9650: 3c 31 20 7c 7c 20 69 43 6f 6c 3e 30 78 66 66 66  <1 || iCol>0xfff
9660: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  f ){.        res
9670: 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72  olveOutOfRangeEr
9680: 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54 79 70  ror(pParse, zTyp
9690: 65 2c 20 69 2b 31 2c 20 6e 52 65 73 75 6c 74 29  e, i+1, nResult)
96a0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
96b0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
96c0: 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65 72 42    pItem->iOrderB
96d0: 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c  yCol = (u16)iCol
96e0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
96f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9700: 4f 74 68 65 72 77 69 73 65 2c 20 74 72 65 61 74  Otherwise, treat
9710: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
9720: 72 6d 20 61 73 20 61 6e 20 6f 72 64 69 6e 61 72  rm as an ordinar
9730: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  y expression */.
9740: 20 20 20 20 70 49 74 65 6d 2d 3e 69 4f 72 64 65      pItem->iOrde
9750: 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rByCol = 0;.    
9760: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
9770: 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e 43 2c  veExprNames(pNC,
9780: 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65   pE) ){.      re
9790: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
97a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 65    for(j=0; j<pSe
97b0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
97c0: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
97d0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
97e0: 43 6f 6d 70 61 72 65 28 70 45 2c 20 70 53 65 6c  Compare(pE, pSel
97f0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a  ect->pEList->a[j
9800: 5d 2e 70 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20  ].pExpr, -1)==0 
9810: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  ){.        pItem
9820: 2d 3e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  ->iOrderByCol = 
9830: 6a 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j+1;.      }.   
9840: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9850: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
9860: 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
9870: 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 4f 72 64  e, pSelect, pOrd
9880: 65 72 42 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a  erBy, zType);.}.
9890: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e  ./*.** Resolve n
98a0: 61 6d 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ames in the SELE
98b0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 20 61  CT statement p a
98c0: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 64 65  nd all of its de
98d0: 73 63 65 6e 64 65 6e 74 73 2e 0a 2a 2f 0a 73 74  scendents..*/.st
98e0: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
98f0: 53 65 6c 65 63 74 53 74 65 70 28 57 61 6c 6b 65  SelectStep(Walke
9900: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
9910: 63 74 20 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f  ct *p){.  NameCo
9920: 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b  ntext *pOuterNC;
9930: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 74 68 61    /* Context tha
9940: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20  t contains this 
9950: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65  SELECT */.  Name
9960: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
9970: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
9980: 65 78 74 20 6f 66 20 74 68 69 73 20 53 45 4c 45  ext of this SELE
9990: 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  CT */.  int isCo
99a0: 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20  mpound;         
99b0: 2f 2a 20 54 72 75 65 20 69 66 20 70 20 69 73 20  /* True if p is 
99c0: 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
99d0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70  t */.  int nComp
99e0: 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  ound;          /
99f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70  * Number of comp
9a00: 6f 75 6e 64 20 74 65 72 6d 73 20 70 72 6f 63 65  ound terms proce
9a10: 73 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ssed so far */. 
9a20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
9a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9a40: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9a50: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9a60: 74 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75  t;       /* Resu
9a70: 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
9a80: 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n list */.  int 
9a90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
9aa0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
9ab0: 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ter */.  ExprLis
9ac0: 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20 20  t *pGroupBy;    
9ad0: 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42 59   /* The GROUP BY
9ae0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c   clause */.  Sel
9af0: 65 63 74 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20  ect *pLeftmost; 
9b00: 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
9b10: 74 20 6f 66 20 53 45 4c 45 43 54 20 6f 66 20 61  t of SELECT of a
9b20: 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 73   compound */.  s
9b30: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
9b40: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
9b50: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
9b60: 0a 20 20 0a 0a 20 20 61 73 73 65 72 74 28 20 70  .  ..  assert( p
9b70: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  !=0 );.  if( p->
9b80: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65  selFlags & SF_Re
9b90: 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 72 65  solved ){.    re
9ba0: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
9bb0: 20 20 7d 0a 20 20 70 4f 75 74 65 72 4e 43 20 3d    }.  pOuterNC =
9bc0: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b   pWalker->u.pNC;
9bd0: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61 6c  .  pParse = pWal
9be0: 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64  ker->pParse;.  d
9bf0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9c00: 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 73  .  /* Normally s
9c10: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
9c20: 6e 64 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c  nd() will be cal
9c30: 6c 65 64 20 66 69 72 73 74 20 61 6e 64 20 77 69  led first and wi
9c40: 6c 6c 20 68 61 76 65 0a 20 20 2a 2a 20 61 6c 72  ll have.  ** alr
9c50: 65 61 64 79 20 65 78 70 61 6e 64 65 64 20 74 68  eady expanded th
9c60: 69 73 20 53 45 4c 45 43 54 2e 20 20 48 6f 77 65  is SELECT.  Howe
9c70: 76 65 72 2c 20 69 66 20 74 68 69 73 20 69 73 20  ver, if this is 
9c80: 61 20 73 75 62 71 75 65 72 79 20 77 69 74 68 69  a subquery withi
9c90: 6e 0a 20 20 2a 2a 20 61 6e 20 65 78 70 72 65 73  n.  ** an expres
9ca0: 73 69 6f 6e 2c 20 73 71 6c 69 74 65 33 52 65 73  sion, sqlite3Res
9cb0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20  olveExprNames() 
9cc0: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 77  will be called w
9cd0: 69 74 68 6f 75 74 20 61 0a 20 20 2a 2a 20 70 72  ithout a.  ** pr
9ce0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
9cf0: 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
9d00: 29 2e 20 20 57 68 65 6e 20 74 68 61 74 20 68 61  ).  When that ha
9d10: 70 70 65 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a 20  ppens, let.  ** 
9d20: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
9d30: 70 28 29 20 64 6f 20 61 6c 6c 20 6f 66 20 74 68  p() do all of th
9d40: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72  e processing for
9d50: 20 74 68 69 73 20 53 45 4c 45 43 54 2e 0a 20 20   this SELECT..  
9d60: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
9d70: 50 72 65 70 28 29 20 77 69 6c 6c 20 69 6e 76 6f  Prep() will invo
9d80: 6b 65 20 62 6f 74 68 20 73 71 6c 69 74 65 33 53  ke both sqlite3S
9d90: 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 61 6e  electExpand() an
9da0: 64 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f 75 74  d.  ** this rout
9db0: 69 6e 65 20 69 6e 20 74 68 65 20 63 6f 72 72 65  ine in the corre
9dc0: 63 74 20 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20  ct order..  */. 
9dd0: 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67   if( (p->selFlag
9de0: 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
9df0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
9e00: 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50 61  e3SelectPrep(pPa
9e10: 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43  rse, p, pOuterNC
9e20: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 70  );.    return (p
9e30: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
9e40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29  b->mallocFailed)
9e50: 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57   ? WRC_Abort : W
9e60: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20  RC_Prune;.  }.. 
9e70: 20 69 73 43 6f 6d 70 6f 75 6e 64 20 3d 20 70 2d   isCompound = p-
9e80: 3e 70 50 72 69 6f 72 21 3d 30 3b 0a 20 20 6e 43  >pPrior!=0;.  nC
9e90: 6f 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 70  ompound = 0;.  p
9ea0: 4c 65 66 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20  Leftmost = p;.  
9eb0: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
9ec0: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
9ed0: 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
9ee0: 65 64 29 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ed)!=0 );.    as
9ef0: 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
9f00: 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
9f10: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e 73  )==0 );.    p->s
9f20: 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65  elFlags |= SF_Re
9f30: 73 6f 6c 76 65 64 3b 0a 0a 20 20 20 20 2f 2a 20  solved;..    /* 
9f40: 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70 72  Resolve the expr
9f50: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c  essions in the L
9f60: 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54 20  IMIT and OFFSET 
9f70: 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a 20  clauses. These. 
9f80: 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c     ** are not al
9f90: 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20 74  lowed to refer t
9fa0: 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20  o any names, so 
9fb0: 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e 61  pass an empty Na
9fc0: 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  meContext..    *
9fd0: 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e  /.    memset(&sN
9fe0: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
9ff0: 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61 72  ));.    sNC.pPar
a000: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 20  se = pParse;.   
a010: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
a020: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
a030: 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 7c 7c  C, p->pLimit) ||
a040: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a050: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
a060: 28 26 73 4e 43 2c 20 70 2d 3e 70 4f 66 66 73 65  (&sNC, p->pOffse
a070: 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
a080: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
a090: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65    }.  .    /* Re
a0a0: 63 75 72 73 69 76 65 6c 79 20 72 65 73 6f 6c 76  cursively resolv
a0b0: 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73  e names in all s
a0c0: 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2f  ubqueries.    */
a0d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
a0e0: 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69  p->pSrc->nSrc; i
a0f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
a100: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
a110: 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63  pItem = &p->pSrc
a120: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ->a[i];.      if
a130: 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
a140: 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65   ){.        Name
a150: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20  Context *pNC;   
a160: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
a170: 20 69 74 65 72 61 74 65 20 6e 61 6d 65 20 63 6f   iterate name co
a180: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntexts */.      
a190: 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 30 3b 20    int nRef = 0; 
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
a1b0: 65 66 63 6f 75 6e 74 20 66 6f 72 20 70 4f 75 74  efcount for pOut
a1c0: 65 72 4e 43 20 61 6e 64 20 6f 75 74 65 72 20 63  erNC and outer c
a1d0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20  ontexts */.     
a1e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
a1f0: 53 61 76 65 64 43 6f 6e 74 65 78 74 20 3d 20 70  SavedContext = p
a200: 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74  Parse->zAuthCont
a210: 65 78 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  ext;..        /*
a220: 20 43 6f 75 6e 74 20 74 68 65 20 74 6f 74 61 6c   Count the total
a230: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
a240: 65 6e 63 65 73 20 74 6f 20 70 4f 75 74 65 72 4e  ences to pOuterN
a250: 43 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  C and all of its
a260: 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 65  .        ** pare
a270: 6e 74 20 63 6f 6e 74 65 78 74 73 2e 20 41 66 74  nt contexts. Aft
a280: 65 72 20 72 65 73 6f 6c 76 69 6e 67 20 72 65 66  er resolving ref
a290: 65 72 65 6e 63 65 73 20 74 6f 20 65 78 70 72 65  erences to expre
a2a0: 73 73 69 6f 6e 73 20 69 6e 0a 20 20 20 20 20 20  ssions in.      
a2b0: 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 70 53 65 6c    ** pItem->pSel
a2c0: 65 63 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68  ect, check if th
a2d0: 69 73 20 76 61 6c 75 65 20 68 61 73 20 63 68 61  is value has cha
a2e0: 6e 67 65 64 2e 20 49 66 20 73 6f 2c 20 74 68 65  nged. If so, the
a2f0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 45 4c  n.        ** SEL
a300: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 49  ECT statement pI
a310: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 6d 75 73  tem->pSelect mus
a320: 74 20 62 65 20 63 6f 72 72 65 6c 61 74 65 64 2e  t be correlated.
a330: 20 53 65 74 20 74 68 65 0a 20 20 20 20 20 20 20   Set the.       
a340: 20 2a 2a 20 70 49 74 65 6d 2d 3e 69 73 43 6f 72   ** pItem->isCor
a350: 72 65 6c 61 74 65 64 20 66 6c 61 67 20 69 66 20  related flag if 
a360: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
a370: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
a380: 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70  (pNC=pOuterNC; p
a390: 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65  NC; pNC=pNC->pNe
a3a0: 78 74 29 20 6e 52 65 66 20 2b 3d 20 70 4e 43 2d  xt) nRef += pNC-
a3b0: 3e 6e 52 65 66 3b 0a 0a 20 20 20 20 20 20 20 20  >nRef;..        
a3c0: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
a3d0: 20 29 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   ) pParse->zAuth
a3e0: 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d  Context = pItem-
a3f0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
a400: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
a410: 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
a420: 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
a430: 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20  , pOuterNC);.   
a440: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
a450: 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
a460: 65 64 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  edContext;.     
a470: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
a480: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
a490: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
a4a0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20   WRC_Abort;..   
a4b0: 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75       for(pNC=pOu
a4c0: 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d  terNC; pNC; pNC=
a4d0: 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66  pNC->pNext) nRef
a4e0: 20 2d 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20   -= pNC->nRef;. 
a4f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a500: 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
a510: 65 64 3d 3d 30 20 26 26 20 6e 52 65 66 3c 3d 30  ed==0 && nRef<=0
a520: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   );.        pIte
a530: 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  m->isCorrelated 
a540: 3d 20 28 6e 52 65 66 21 3d 30 29 3b 0a 20 20 20  = (nRef!=0);.   
a550: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
a560: 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
a570: 6c 6f 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65  local name-conte
a580: 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71  xt to pass to sq
a590: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
a5a0: 4e 61 6d 65 73 28 29 20 74 6f 0a 20 20 20 20 2a  Names() to.    *
a5b0: 2a 20 72 65 73 6f 6c 76 65 20 74 68 65 20 72 65  * resolve the re
a5c0: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
a5d0: 69 6f 6e 20 6c 69 73 74 2e 0a 20 20 20 20 2a 2f  ion list..    */
a5e0: 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73  .    sNC.ncFlags
a5f0: 20 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a   = NC_AllowAgg;.
a600: 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74      sNC.pSrcList
a610: 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20   = p->pSrc;.    
a620: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74  sNC.pNext = pOut
a630: 65 72 4e 43 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  erNC;.  .    /* 
a640: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
a650: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
a660: 20 2a 2f 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   */.    pEList =
a670: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
a680: 61 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d  assert( pEList!=
a690: 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 );.    for(i=0
a6a0: 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; i<pEList->nExp
a6b0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  r; i++){.      E
a6c0: 78 70 72 20 2a 70 58 20 3d 20 70 45 4c 69 73 74  xpr *pX = pEList
a6d0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
a6e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52      if( sqlite3R
a6f0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
a700: 26 73 4e 43 2c 20 70 58 29 20 29 7b 0a 20 20 20  &sNC, pX) ){.   
a710: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
a720: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
a730: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
a740: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
a750: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
a760: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
a770: 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
a780: 55 50 20 42 59 20 0a 20 20 20 20 2a 2a 20 65 78  UP BY .    ** ex
a790: 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74  pression, do not
a7a0: 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65   allow aggregate
a7b0: 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  s in any of the 
a7c0: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
a7d0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
a7e0: 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
a7f0: 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
a800: 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 47 72  e)==0 );.    pGr
a810: 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
a820: 70 42 79 3b 0a 20 20 20 20 69 66 28 20 70 47 72  pBy;.    if( pGr
a830: 6f 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e 6e 63  oupBy || (sNC.nc
a840: 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41 67  Flags & NC_HasAg
a850: 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  g)!=0 ){.      p
a860: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
a870: 5f 41 67 67 72 65 67 61 74 65 3b 0a 20 20 20 20  _Aggregate;.    
a880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 4e 43  }else{.      sNC
a890: 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  .ncFlags &= ~NC_
a8a0: 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 7d 0a  AllowAgg;.    }.
a8b0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 48    .    /* If a H
a8c0: 41 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20  AVING clause is 
a8d0: 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68  present, then th
a8e0: 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 47 52  ere must be a GR
a8f0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20  OUP BY clause.. 
a900: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
a910: 3e 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72  >pHaving && !pGr
a920: 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 73  oupBy ){.      s
a930: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a940: 50 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20  Parse, "a GROUP 
a950: 42 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71  BY clause is req
a960: 75 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56  uired before HAV
a970: 49 4e 47 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ING");.      ret
a980: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
a990: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
a9a0: 64 64 20 74 68 65 20 6f 75 74 70 75 74 20 63 6f  dd the output co
a9b0: 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 74 68 65  lumn list to the
a9c0: 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65   name-context be
a9d0: 66 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65  fore parsing the
a9e0: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 65 78  .    ** other ex
a9f0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
aa00: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
aa10: 74 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74 68  t. This is so th
aa20: 61 74 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73  at.    ** expres
aa30: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45  sions in the WHE
aa40: 52 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29  RE clause (etc.)
aa50: 20 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78   can refer to ex
aa60: 70 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 20  pressions by.   
aa70: 20 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74   ** aliases in t
aa80: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20  he result set.. 
aa90: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4d 69 6e     **.    ** Min
aaa0: 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69  or point: If thi
aab0: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
aac0: 68 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69  hen the expressi
aad0: 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  on will be.    *
aae0: 2a 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66  * re-evaluated f
aaf0: 6f 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63  or each referenc
ab00: 65 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a  e to it..    */.
ab10: 20 20 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d      sNC.pEList =
ab20: 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20   p->pEList;.    
ab30: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
ab40: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
ab50: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 20  , p->pHaving) ) 
ab60: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
ab70: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
ab80: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
ab90: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72  s(&sNC, p->pWher
aba0: 65 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  e) ) return WRC_
abb0: 41 62 6f 72 74 3b 0a 0a 20 20 20 20 2f 2a 20 54  Abort;..    /* T
abc0: 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20  he ORDER BY and 
abd0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73  GROUP BY clauses
abe0: 20 6d 61 79 20 6e 6f 74 20 72 65 66 65 72 20 74   may not refer t
abf0: 6f 20 74 65 72 6d 73 20 69 6e 0a 20 20 20 20 2a  o terms in.    *
ac00: 2a 20 6f 75 74 65 72 20 71 75 65 72 69 65 73 20  * outer queries 
ac10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e  .    */.    sNC.
ac20: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 73  pNext = 0;.    s
ac30: 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  NC.ncFlags |= NC
ac40: 5f 41 6c 6c 6f 77 41 67 67 3b 0a 0a 20 20 20 20  _AllowAgg;..    
ac50: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4f  /* Process the O
ac60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
ac70: 6f 72 20 73 69 6e 67 6c 65 74 6f 6e 20 53 45 4c  or singleton SEL
ac80: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
ac90: 20 20 20 20 2a 2a 20 54 68 65 20 4f 52 44 45 52      ** The ORDER
aca0: 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 63   BY clause for c
acb0: 6f 6d 70 6f 75 6e 64 73 20 53 45 4c 45 43 54 20  ompounds SELECT 
acc0: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 68 61  statements is ha
acd0: 6e 64 6c 65 64 0a 20 20 20 20 2a 2a 20 62 65 6c  ndled.    ** bel
ace0: 6f 77 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  ow, after all of
acf0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 73   the result-sets
ad00: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20   for all of the 
ad10: 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 20 20 20 20  elements of.    
ad20: 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ** the compound 
ad30: 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76  have been resolv
ad40: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
ad50: 66 28 20 21 69 73 43 6f 6d 70 6f 75 6e 64 20 26  f( !isCompound &
ad60: 26 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  & resolveOrderGr
ad70: 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70  oupBy(&sNC, p, p
ad80: 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44  ->pOrderBy, "ORD
ad90: 45 52 22 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ER") ){.      re
ada0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
adb0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
adc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
add0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
ade0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
adf0: 20 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76    .    /* Resolv
ae00: 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63  e the GROUP BY c
ae10: 6c 61 75 73 65 2e 20 20 41 74 20 74 68 65 20 73  lause.  At the s
ae20: 61 6d 65 20 74 69 6d 65 2c 20 6d 61 6b 65 20 73  ame time, make s
ae30: 75 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ure .    ** the 
ae40: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
ae50: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
ae60: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
ae70: 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ions..    */.   
ae80: 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b   if( pGroupBy ){
ae90: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
aea0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
aeb0: 65 6d 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 69  em;.    .      i
aec0: 66 28 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47  f( resolveOrderG
aed0: 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20  roupBy(&sNC, p, 
aee0: 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50  pGroupBy, "GROUP
aef0: 22 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ") || db->malloc
af00: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
af10: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
af20: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
af30: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
af40: 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c  =pGroupBy->a; i<
af50: 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b  pGroupBy->nExpr;
af60: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
af70: 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72          if( Expr
af80: 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 74 65  HasProperty(pIte
af90: 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67  m->pExpr, EP_Agg
afa0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
afb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
afc0: 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61 74  Parse, "aggregat
afd0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  e functions are 
afe0: 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22  not allowed in "
aff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
b000: 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
b010: 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20  use");.         
b020: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
b030: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
b040: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
b050: 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
b060: 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 66 20 74  e next term of t
b070: 68 65 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 20 20  he compound.    
b080: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  */.    p = p->pP
b090: 72 69 6f 72 3b 0a 20 20 20 20 6e 43 6f 6d 70 6f  rior;.    nCompo
b0a0: 75 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  und++;.  }..  /*
b0b0: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 4f 52 44   Resolve the ORD
b0c0: 45 52 20 42 59 20 6f 6e 20 61 20 63 6f 6d 70 6f  ER BY on a compo
b0d0: 75 6e 64 20 53 45 4c 45 43 54 20 61 66 74 65 72  und SELECT after
b0e0: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 0a 20 20   all terms of.  
b0f0: 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ** the compound 
b100: 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76  have been resolv
b110: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
b120: 73 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73  sCompound && res
b130: 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65  olveCompoundOrde
b140: 72 42 79 28 70 50 61 72 73 65 2c 20 70 4c 65 66  rBy(pParse, pLef
b150: 74 6d 6f 73 74 29 20 29 7b 0a 20 20 20 20 72 65  tmost) ){.    re
b160: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
b170: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52    }..  return WR
b180: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_Prune;.}../*.*
b190: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
b1a0: 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69  alks an expressi
b1b0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f  on tree and reso
b1c0: 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20  lves references 
b1d0: 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75  to.** table colu
b1e0: 6d 6e 73 20 61 6e 64 20 72 65 73 75 6c 74 2d 73  mns and result-s
b1f0: 65 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 41 74 20  et columns.  At 
b200: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64  the same time, d
b210: 6f 20 65 72 72 6f 72 0a 2a 2a 20 63 68 65 63 6b  o error.** check
b220: 69 6e 67 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  ing on function 
b230: 75 73 61 67 65 20 61 6e 64 20 73 65 74 20 61 20  usage and set a 
b240: 66 6c 61 67 20 69 66 20 61 6e 79 20 61 67 67 72  flag if any aggr
b250: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a  egate functions.
b260: 2a 2a 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2a 0a  ** are seen..**.
b270: 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 74 61  ** To resolve ta
b280: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65  ble columns refe
b290: 72 65 6e 63 65 73 20 77 65 20 6c 6f 6f 6b 20 66  rences we look f
b2a0: 6f 72 20 6e 6f 64 65 73 20 28 6f 72 20 73 75 62  or nodes (or sub
b2b0: 74 72 65 65 73 29 20 6f 66 20 74 68 65 20 0a 2a  trees) of the .*
b2c0: 2a 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20  * form X.Y.Z or 
b2d0: 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 20 77 68  Y.Z or just Z wh
b2e0: 65 72 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 58  ere.**.**      X
b2f0: 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20  :   The name of 
b300: 61 20 64 61 74 61 62 61 73 65 2e 20 20 45 78 3a  a database.  Ex:
b310: 20 20 22 6d 61 69 6e 22 20 6f 72 20 22 74 65 6d    "main" or "tem
b320: 70 22 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  p" or.**        
b330: 20 20 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20     the symbolic 
b340: 6e 61 6d 65 20 61 73 73 69 67 6e 65 64 20 74 6f  name assigned to
b350: 20 61 6e 20 41 54 54 41 43 48 2d 65 64 20 64 61   an ATTACH-ed da
b360: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
b370: 20 20 20 59 3a 20 20 20 54 68 65 20 6e 61 6d 65     Y:   The name
b380: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 61   of a table in a
b390: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
b3a0: 72 20 69 6e 20 61 20 74 72 69 67 67 65 72 0a 2a  r in a trigger.*
b3b0: 2a 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65 20  *           one 
b3c0: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 6e  of the special n
b3d0: 61 6d 65 73 20 22 6f 6c 64 22 20 6f 72 20 22 6e  ames "old" or "n
b3e0: 65 77 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ew"..**.**      
b3f0: 5a 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66  Z:   The name of
b400: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
b410: 6c 65 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le Y..**.** The 
b420: 6e 6f 64 65 20 61 74 20 74 68 65 20 72 6f 6f 74  node at the root
b430: 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 20   of the subtree 
b440: 69 73 20 6d 6f 64 69 66 69 65 64 20 61 73 20 66  is modified as f
b450: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
b460: 20 45 78 70 72 2e 6f 70 20 20 20 20 20 20 20 20   Expr.op        
b470: 43 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  Changed to TK_CO
b480: 4c 55 4d 4e 0a 2a 2a 20 20 20 20 45 78 70 72 2e  LUMN.**    Expr.
b490: 70 54 61 62 20 20 20 20 20 20 50 6f 69 6e 74 73  pTab      Points
b4a0: 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
b4b0: 6a 65 63 74 20 66 6f 72 20 58 2e 59 0a 2a 2a 20  ject for X.Y.** 
b4c0: 20 20 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20     Expr.iColumn 
b4d0: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64    The column ind
b4e0: 65 78 20 69 6e 20 58 2e 59 2e 20 20 2d 31 20 66  ex in X.Y.  -1 f
b4f0: 6f 72 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a  or the rowid..**
b500: 20 20 20 20 45 78 70 72 2e 69 54 61 62 6c 65 20      Expr.iTable 
b510: 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
b520: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e  or number for X.
b530: 59 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65  Y.**.**.** To re
b540: 73 6f 6c 76 65 20 72 65 73 75 6c 74 2d 73 65 74  solve result-set
b550: 20 72 65 66 65 72 65 6e 63 65 73 2c 20 6c 6f 6f   references, loo
b560: 6b 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  k for expression
b570: 20 6e 6f 64 65 73 20 6f 66 20 74 68 65 0a 2a 2a   nodes of the.**
b580: 20 66 6f 72 6d 20 5a 20 28 77 69 74 68 20 6e 6f   form Z (with no
b590: 20 58 20 61 6e 64 20 59 20 70 72 65 66 69 78 29   X and Y prefix)
b5a0: 20 77 68 65 72 65 20 74 68 65 20 5a 20 6d 61 74   where the Z mat
b5b0: 63 68 65 73 20 74 68 65 20 72 69 67 68 74 2d 68  ches the right-h
b5c0: 61 6e 64 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61  and.** size of a
b5d0: 6e 20 41 53 20 63 6c 61 75 73 65 20 69 6e 20 74  n AS clause in t
b5e0: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 6f 66  he result-set of
b5f0: 20 61 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20   a SELECT.  The 
b600: 5a 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  Z expression.** 
b610: 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 61  is replaced by a
b620: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 65 66   copy of the lef
b630: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
b640: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  he result-set ex
b650: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 61 62  pression..** Tab
b660: 6c 65 2d 6e 61 6d 65 20 61 6e 64 20 66 75 6e 63  le-name and func
b670: 74 69 6f 6e 20 72 65 73 6f 6c 75 74 69 6f 6e 20  tion resolution 
b680: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 73 75  occurs on the su
b690: 62 73 74 69 74 75 74 65 64 20 65 78 70 72 65 73  bstituted expres
b6a0: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 20 20 46  sion.** tree.  F
b6b0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 3a 0a  or example, in:.
b6c0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43  **.**      SELEC
b6d0: 54 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20  T a+b AS x, c+d 
b6e0: 41 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44  AS y FROM t1 ORD
b6f0: 45 52 20 42 59 20 78 3b 0a 2a 2a 0a 2a 2a 20 54  ER BY x;.**.** T
b700: 68 65 20 22 78 22 20 74 65 72 6d 20 6f 66 20 74  he "x" term of t
b710: 68 65 20 6f 72 64 65 72 20 62 79 20 69 73 20 72  he order by is r
b720: 65 70 6c 61 63 65 64 20 62 79 20 22 61 2b 62 22  eplaced by "a+b"
b730: 20 74 6f 20 72 65 6e 64 65 72 3a 0a 2a 2a 0a 2a   to render:.**.*
b740: 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  *      SELECT a+
b750: 62 20 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79  b AS x, c+d AS y
b760: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
b770: 59 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e  Y a+b;.**.** Fun
b780: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 61 72 65 20  ction calls are 
b790: 63 68 65 63 6b 65 64 20 74 6f 20 6d 61 6b 65 20  checked to make 
b7a0: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 66 75  sure that the fu
b7b0: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 64 65  nction is .** de
b7c0: 66 69 6e 65 64 20 61 6e 64 20 74 68 61 74 20 74  fined and that t
b7d0: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
b7e0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61  r of arguments a
b7f0: 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  re specified..**
b800: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
b810: 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
b820: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
b830: 74 68 65 20 4e 43 5f 48 61 73 41 67 67 20 66 6c  the NC_HasAgg fl
b840: 61 67 20 69 73 0a 2a 2a 20 73 65 74 20 61 6e 64  ag is.** set and
b850: 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 63   the opcode is c
b860: 68 61 6e 67 65 64 20 66 72 6f 6d 20 54 4b 5f 46  hanged from TK_F
b870: 55 4e 43 54 49 4f 4e 20 74 6f 20 54 4b 5f 41 47  UNCTION to TK_AG
b880: 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2a 20 49  G_FUNCTION..** I
b890: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
b8a0: 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61  contains aggrega
b8b0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65  te functions the
b8c0: 6e 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20  n the EP_Agg.** 
b8d0: 70 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20  property on the 
b8e0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
b8f0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f  t..**.** An erro
b900: 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
b910: 74 20 69 6e 20 70 50 61 72 73 65 20 69 66 20 61  t in pParse if a
b920: 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73  nything is amiss
b930: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
b940: 20 69 66 20 65 72 72 6f 72 73 20 69 73 20 72 65   if errors is re
b950: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
b960: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
b970: 72 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43  rNames( .  NameC
b980: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
b990: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
b9a0: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
b9b0: 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20  ssions in. */.  
b9c0: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
b9d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
b9e0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
b9f0: 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a  analyzed. */.){.
ba00: 20 20 75 38 20 73 61 76 65 64 48 61 73 41 67 67    u8 savedHasAgg
ba10: 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20  ;.  Walker w;.. 
ba20: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
ba30: 72 65 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51  return 0;.#if SQ
ba40: 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
ba50: 50 54 48 3e 30 0a 20 20 7b 0a 20 20 20 20 50 61  PTH>0.  {.    Pa
ba60: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e  rse *pParse = pN
ba70: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 69  C->pParse;.    i
ba80: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  f( sqlite3ExprCh
ba90: 65 63 6b 48 65 69 67 68 74 28 70 50 61 72 73 65  eckHeight(pParse
baa0: 2c 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74  , pExpr->nHeight
bab0: 2b 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48  +pNC->pParse->nH
bac0: 65 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  eight) ){.      
bad0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
bae0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69      pParse->nHei
baf0: 67 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48  ght += pExpr->nH
bb00: 65 69 67 68 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  eight;.  }.#endi
bb10: 66 0a 20 20 73 61 76 65 64 48 61 73 41 67 67 20  f.  savedHasAgg 
bb20: 3d 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26  = pNC->ncFlags &
bb30: 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20 70 4e   NC_HasAgg;.  pN
bb40: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  C->ncFlags &= ~N
bb50: 43 5f 48 61 73 41 67 67 3b 0a 20 20 6d 65 6d 73  C_HasAgg;.  mems
bb60: 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
bb70: 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
bb80: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76  allback = resolv
bb90: 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e 78  eExprStep;.  w.x
bba0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
bbb0: 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74   resolveSelectSt
bbc0: 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  ep;.  w.pParse =
bbd0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
bbe0: 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20  w.u.pNC = pNC;. 
bbf0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
bc00: 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 23 69 66  (&w, pExpr);.#if
bc10: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
bc20: 5f 44 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e  _DEPTH>0.  pNC->
bc30: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
bc40: 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68  -= pExpr->nHeigh
bc50: 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  t;.#endif.  if( 
bc60: 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 77  pNC->nErr>0 || w
bc70: 2e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20  .pParse->nErr>0 
bc80: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
bc90: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
bca0: 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69  _Error);.  }.  i
bcb0: 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  f( pNC->ncFlags 
bcc0: 26 20 4e 43 5f 48 61 73 41 67 67 20 29 7b 0a 20  & NC_HasAgg ){. 
bcd0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
bce0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67  ty(pExpr, EP_Agg
bcf0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
bd00: 61 76 65 64 48 61 73 41 67 67 20 29 7b 0a 20 20  avedHasAgg ){.  
bd10: 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c    pNC->ncFlags |
bd20: 3d 20 4e 43 5f 48 61 73 41 67 67 3b 0a 20 20 7d  = NC_HasAgg;.  }
bd30: 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72 48 61  .  return ExprHa
bd40: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
bd50: 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a 0a   EP_Error);.}...
bd60: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c  /*.** Resolve al
bd70: 6c 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 65  l names in all e
bd80: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 61 20  xpressions of a 
bd90: 53 45 4c 45 43 54 20 61 6e 64 20 69 6e 20 61 6c  SELECT and in al
bda0: 6c 0a 2a 2a 20 64 65 63 65 6e 64 65 6e 74 73 20  l.** decendents 
bdb0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2c 20 69  of the SELECT, i
bdc0: 6e 63 6c 75 64 69 6e 67 20 63 6f 6d 70 6f 75 6e  ncluding compoun
bdd0: 64 73 20 6f 66 66 20 6f 66 20 70 2d 3e 70 50 72  ds off of p->pPr
bde0: 69 6f 72 2c 0a 2a 2a 20 73 75 62 71 75 65 72 69  ior,.** subqueri
bdf0: 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
be00: 73 2c 20 61 6e 64 20 73 75 62 71 75 65 72 69 65  s, and subquerie
be10: 73 20 75 73 65 64 20 61 73 20 46 52 4f 4d 20 63  s used as FROM c
be20: 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73 2e 0a  lause.** terms..
be30: 2a 2a 0a 2a 2a 20 53 65 65 20 73 71 6c 69 74 65  **.** See sqlite
be40: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
be50: 73 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69  s() for a descri
be60: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6b 69 6e  ption of the kin
be70: 64 73 20 6f 66 0a 2a 2a 20 74 72 61 6e 73 66 6f  ds of.** transfo
be80: 72 6d 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63  rmations that oc
be90: 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 53  cur..**.** All S
bea0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
beb0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
bec0: 6e 20 65 78 70 61 6e 64 65 64 20 75 73 69 6e 67  n expanded using
bed0: 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63  .** sqlite3Selec
bee0: 74 45 78 70 61 6e 64 28 29 20 70 72 69 6f 72 20  tExpand() prior 
bef0: 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
bf00: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69   routine..*/.voi
bf10: 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  d sqlite3Resolve
bf20: 53 65 6c 65 63 74 4e 61 6d 65 73 28 0a 20 20 50  SelectNames(.  P
bf30: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
bf40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
bf50: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
bf60: 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20   Select *p,     
bf70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
bf80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
bf90: 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a  being coded. */.
bfa0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
bfb0: 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65  OuterNC  /* Name
bfc0: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 61 72   context for par
bfd0: 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61 74 65  ent SELECT state
bfe0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c  ment */.){.  Wal
bff0: 6b 65 72 20 77 3b 0a 0a 20 20 61 73 73 65 72 74  ker w;..  assert
c000: 28 20 70 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ( p!=0 );.  mems
c010: 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&w, 0, sizeof
c020: 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43  (w));.  w.xExprC
c030: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76  allback = resolv
c040: 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e 78  eExprStep;.  w.x
c050: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d  SelectCallback =
c060: 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74   resolveSelectSt
c070: 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d  ep;.  w.pParse =
c080: 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 75 2e 70   pParse;.  w.u.p
c090: 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20  NC = pOuterNC;. 
c0a0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
c0b0: 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ct(&w, p);.}../*
c0c0: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65  .** Resolve name
c0d0: 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
c0e0: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 72   that can only r
c0f0: 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
c100: 65 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  e table:.**.**  
c110: 20 20 2a 20 20 20 43 48 45 43 4b 20 63 6f 6e 73    *   CHECK cons
c120: 74 72 61 69 6e 74 73 0a 2a 2a 20 20 20 20 2a 20  traints.**    * 
c130: 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20    WHERE clauses 
c140: 6f 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63  on partial indic
c150: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  es.**.** The Exp
c160: 72 2e 69 54 61 62 6c 65 20 76 61 6c 75 65 20 66  r.iTable value f
c170: 6f 72 20 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f 43  or Expr.op==TK_C
c180: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 6f 66 20 74  OLUMN nodes of t
c190: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
c1a0: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 61 6e   is set to -1 an
c1b0: 64 20 74 68 65 20 45 78 70 72 2e 69 43 6f 6c 75  d the Expr.iColu
c1c0: 6d 6e 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  mn value is set 
c1d0: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  to the column nu
c1e0: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  mber..**.** Any 
c1f0: 65 72 72 6f 72 73 20 63 61 75 73 65 20 61 6e 20  errors cause an 
c200: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
c210: 20 62 65 20 73 65 74 20 69 6e 20 70 50 61 72 73   be set in pPars
c220: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
c230: 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
c240: 65 72 65 6e 63 65 28 0a 20 20 50 61 72 73 65 20  erence(.  Parse 
c250: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
c260: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
c270: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
c280: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  b,        /* The
c290: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 72 65 66   table being ref
c2a0: 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  erenced */.  int
c2b0: 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20   type,          
c2c0: 20 2f 2a 20 4e 43 5f 49 73 43 68 65 63 6b 20 6f   /* NC_IsCheck o
c2d0: 72 20 4e 43 5f 50 61 72 74 49 64 78 20 2a 2f 0a  r NC_PartIdx */.
c2e0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
c2f0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
c300: 69 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20  ion to resolve. 
c310: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
c320: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
c330: 73 74 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  st     /* Expres
c340: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72 65 73  sion list to res
c350: 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  olve.  May be NU
c360: 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  L. */.){.  SrcLi
c370: 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20  st sSrc;        
c380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
c390: 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70  ke SrcList for p
c3a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
c3b0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
c3c0: 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
c3d0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
c3e0: 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65  ntext for pParse
c3f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20  ->pNewTable */. 
c400: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c420: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c430: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74   */..  assert( t
c440: 79 70 65 3d 3d 4e 43 5f 49 73 43 68 65 63 6b 20  ype==NC_IsCheck 
c450: 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f 50 61 72 74  || type==NC_Part
c460: 49 64 78 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  Idx );.  memset(
c470: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
c480: 73 4e 43 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  sNC));.  memset(
c490: 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSrc, 0, sizeof
c4a0: 28 73 53 72 63 29 29 3b 0a 20 20 73 53 72 63 2e  (sSrc));.  sSrc.
c4b0: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 73 53 72 63  nSrc = 1;.  sSrc
c4c0: 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 54  .a[0].zName = pT
c4d0: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 53 72  ab->zName;.  sSr
c4e0: 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 54  c.a[0].pTab = pT
c4f0: 61 62 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ab;.  sSrc.a[0].
c500: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
c510: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
c520: 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  rse;.  sNC.pSrcL
c530: 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 73  ist = &sSrc;.  s
c540: 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74 79 70  NC.ncFlags = typ
c550: 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  e;.  if( sqlite3
c560: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
c570: 28 26 73 4e 43 2c 20 70 45 78 70 72 29 20 29 20  (&sNC, pExpr) ) 
c580: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4c  return;.  if( pL
c590: 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ist ){.    for(i
c5a0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
c5b0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
c5c0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
c5d0: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
c5e0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
c5f0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
c600: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
c610: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a                  }.  }.}.