/ Hex Artifact Content
Login

Artifact abd65c518c198400193c6319a70c0d722fa30a35be89dc898917ff6489edf017:


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 0a 2f 2a 0a 2a  liteInt.h"../*.*
0230: 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65  * Walk the expre
0240: 73 73 69 6f 6e 20 74 72 65 65 20 70 45 78 70 72  ssion tree pExpr
0250: 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20 74 68   and increase th
0260: 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
0270: 74 69 6f 6e 0a 2a 2a 20 64 65 70 74 68 20 28 74  tion.** depth (t
0280: 68 65 20 45 78 70 72 2e 6f 70 32 20 66 69 65 6c  he Expr.op2 fiel
0290: 64 29 20 62 79 20 4e 20 6f 6e 20 65 76 65 72 79  d) by N on every
02a0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
02b0: 20 6e 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 6e   node..** This n
02c0: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 20 77 68  eeds to occur wh
02d0: 65 6e 20 63 6f 70 79 69 6e 67 20 61 20 54 4b 5f  en copying a TK_
02e0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
02f0: 65 20 66 72 6f 6d 20 61 6e 0a 2a 2a 20 6f 75 74  e from an.** out
0300: 65 72 20 71 75 65 72 79 20 69 6e 74 6f 20 61 6e  er query into an
0310: 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 2e   inner subquery.
0320: 0a 2a 2a 0a 2a 2a 20 69 6e 63 72 41 67 67 46 75  .**.** incrAggFu
0330: 6e 63 74 69 6f 6e 44 65 70 74 68 28 70 45 78 70  nctionDepth(pExp
0340: 72 2c 6e 29 20 69 73 20 74 68 65 20 6d 61 69 6e  r,n) is the main
0350: 20 72 6f 75 74 69 6e 65 2e 20 20 69 6e 63 72 41   routine.  incrA
0360: 67 67 44 65 70 74 68 28 2e 2e 29 0a 2a 2a 20 69  ggDepth(..).** i
0370: 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63 74  s a helper funct
0380: 69 6f 6e 20 2d 20 61 20 63 61 6c 6c 62 61 63 6b  ion - a callback
0390: 20 66 6f 72 20 74 68 65 20 74 72 65 65 20 77 61   for the tree wa
03a0: 6c 6b 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lker..*/.static 
03b0: 69 6e 74 20 69 6e 63 72 41 67 67 44 65 70 74 68  int incrAggDepth
03c0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
03d0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
03e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
03f0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
0400: 20 29 20 70 45 78 70 72 2d 3e 6f 70 32 20 2b 3d   ) pExpr->op2 +=
0410: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 6e 3b 0a 20   pWalker->u.n;. 
0420: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
0430: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
0440: 6f 69 64 20 69 6e 63 72 41 67 67 46 75 6e 63 74  oid incrAggFunct
0450: 69 6f 6e 44 65 70 74 68 28 45 78 70 72 20 2a 70  ionDepth(Expr *p
0460: 45 78 70 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  Expr, int N){.  
0470: 69 66 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 57  if( N>0 ){.    W
0480: 61 6c 6b 65 72 20 77 3b 0a 20 20 20 20 6d 65 6d  alker w;.    mem
0490: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
04a0: 66 28 77 29 29 3b 0a 20 20 20 20 77 2e 78 45 78  f(w));.    w.xEx
04b0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6e 63  prCallback = inc
04c0: 72 41 67 67 44 65 70 74 68 3b 0a 20 20 20 20 77  rAggDepth;.    w
04d0: 2e 75 2e 6e 20 3d 20 4e 3b 0a 20 20 20 20 73 71  .u.n = N;.    sq
04e0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
04f0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  , pExpr);.  }.}.
0500: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 68 65 20  ./*.** Turn the 
0510: 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
0520: 20 69 6e 74 6f 20 61 6e 20 61 6c 69 61 73 20 66   into an alias f
0530: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
0540: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  olumn of the.** 
0550: 72 65 73 75 6c 74 20 73 65 74 20 69 6e 20 70 45  result set in pE
0560: 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  List..**.** If t
0570: 68 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  he reference is 
0580: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 4f  followed by a CO
0590: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20  LLATE operator, 
05a0: 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 2a  then make sure.*
05b0: 2a 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70  * the COLLATE op
05c0: 65 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 72  erator is preser
05d0: 76 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ved.  For exampl
05e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  e:.**.**     SEL
05f0: 45 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f  ECT a+b, c+d FRO
0600: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20  M t1 ORDER BY 1 
0610: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a  COLLATE nocase;.
0620: 2a 2a 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20  **.** Should be 
0630: 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
0640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
0650: 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d  CT a+b, c+d FROM
0660: 20 74 31 20 4f 52 44 45 52 20 42 59 20 28 61 2b   t1 ORDER BY (a+
0670: 62 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  b) COLLATE nocas
0680: 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 53 75  e;.**.** The nSu
0690: 62 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72  bquery parameter
06a0: 20 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d   specifies how m
06b0: 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75  any levels of su
06c0: 62 71 75 65 72 79 20 74 68 65 0a 2a 2a 20 61 6c  bquery the.** al
06d0: 69 61 73 20 69 73 20 72 65 6d 6f 76 65 64 20 66  ias is removed f
06e0: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
06f0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
0700: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 69 73  e usual value is
0710: 0a 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74 20  .** zero but it 
0720: 6d 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69 66  might be more if
0730: 20 74 68 65 20 61 6c 69 61 73 20 69 73 20 63 6f   the alias is co
0740: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
0750: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66 20   subquery.** of 
0760: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
0770: 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45 78  ression.  The Ex
0780: 70 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66 20  pr.op2 field of 
0790: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 0a  TK_AGG_FUNCTION.
07a0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d 75  ** structures mu
07b0: 73 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  st be increased 
07c0: 62 79 20 74 68 65 20 6e 53 75 62 71 75 65 72 79  by the nSubquery
07d0: 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61 74   amount..*/.stat
07e0: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 41  ic void resolveA
07f0: 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lias(.  Parse *p
0800: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
0810: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0820: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
0830: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a  *pEList,      /*
0840: 20 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f   A result set */
0850: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
0860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
0870: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
0880: 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45 4c  ult set.  0..pEL
0890: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f 0a  ist->nExpr-1 */.
08a0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e           /* Tran
08c0: 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f 20  sform this into 
08d0: 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
08e0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
08f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
0900: 65 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55 50  e,     /* "GROUP
0910: 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72 20  " or "ORDER" or 
0920: 22 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  "" */.  int nSub
0930: 71 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f  query          /
0940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 71  * Number of subq
0950: 75 65 72 69 65 73 20 74 68 61 74 20 74 68 65 20  ueries that the 
0960: 6c 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67 20  label is moving 
0970: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4f  */.){.  Expr *pO
0980: 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rig;           /
0990: 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  * The iCol-th co
09a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75  lumn of the resu
09b0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
09c0: 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20   *pDup;         
09d0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 4f     /* Copy of pO
09e0: 72 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rig */.  sqlite3
09f0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
0a00: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
0a10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
0a20: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
0a30: 20 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74 2d   && iCol<pEList-
0a40: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72 69  >nExpr );.  pOri
0a50: 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43  g = pEList->a[iC
0a60: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  ol].pExpr;.  ass
0a70: 65 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29 3b  ert( pOrig!=0 );
0a80: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
0a90: 64 62 3b 0a 20 20 70 44 75 70 20 3d 20 73 71 6c  db;.  pDup = sql
0aa0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
0ab0: 70 4f 72 69 67 2c 20 30 29 3b 0a 20 20 69 66 28  pOrig, 0);.  if(
0ac0: 20 70 44 75 70 21 3d 30 20 29 7b 0a 20 20 20 20   pDup!=0 ){.    
0ad0: 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47  if( zType[0]!='G
0ae0: 27 20 29 20 69 6e 63 72 41 67 67 46 75 6e 63 74  ' ) incrAggFunct
0af0: 69 6f 6e 44 65 70 74 68 28 70 44 75 70 2c 20 6e  ionDepth(pDup, n
0b00: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 69  Subquery);.    i
0b10: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
0b20: 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
0b30: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
0b40: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
0b50: 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 44 75  ring(pParse, pDu
0b60: 70 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  p, pExpr->u.zTok
0b70: 65 6e 29 3b 0a 20 20 20 20 7d 0a 2f 2f 20 20 20  en);.    }.//   
0b80: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
0b90: 28 70 44 75 70 2c 20 45 50 5f 41 6c 69 61 73 29  (pDup, EP_Alias)
0ba0: 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65  ;..    /* Before
0bb0: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
0bc0: 45 78 70 72 44 65 6c 65 74 65 28 29 2c 20 73 65  ExprDelete(), se
0bd0: 74 20 74 68 65 20 45 50 5f 53 74 61 74 69 63 20  t the EP_Static 
0be0: 66 6c 61 67 2e 20 54 68 69 73 20 0a 20 20 20 20  flag. This .    
0bf0: 2a 2a 20 70 72 65 76 65 6e 74 73 20 45 78 70 72  ** prevents Expr
0c00: 44 65 6c 65 74 65 28 29 20 66 72 6f 6d 20 64 65  Delete() from de
0c10: 6c 65 74 69 6e 67 20 74 68 65 20 45 78 70 72 20  leting the Expr 
0c20: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
0c30: 2c 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 69 6e  ,.    ** allowin
0c40: 67 20 69 74 20 74 6f 20 62 65 20 72 65 70 6f 70  g it to be repop
0c50: 75 6c 61 74 65 64 20 62 79 20 74 68 65 20 6d 65  ulated by the me
0c60: 6d 63 70 79 28 29 20 6f 6e 20 74 68 65 20 66 6f  mcpy() on the fo
0c70: 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65 2e 0a 20 20  llowing line..  
0c80: 20 20 2a 2a 20 54 68 65 20 70 45 78 70 72 2d 3e    ** The pExpr->
0c90: 75 2e 7a 54 6f 6b 65 6e 20 6d 69 67 68 74 20 70  u.zToken might p
0ca0: 6f 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  oint into memory
0cb0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 66 72   that will be fr
0cc0: 65 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  eed by the.    *
0cd0: 2a 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  * sqlite3DbFree(
0ce0: 64 62 2c 20 70 44 75 70 29 20 6f 6e 20 74 68 65  db, pDup) on the
0cf0: 20 6c 61 73 74 20 6c 69 6e 65 20 6f 66 20 74 68   last line of th
0d00: 69 73 20 62 6c 6f 63 6b 2c 20 73 6f 20 62 65 20  is block, so be 
0d10: 73 75 72 65 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  sure to.    ** m
0d20: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
0d30: 65 20 74 6f 6b 65 6e 20 62 65 66 6f 72 65 20 64  e token before d
0d40: 6f 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  oing the sqlite3
0d50: 44 62 46 72 65 65 28 29 2e 0a 20 20 20 20 2a 2f  DbFree()..    */
0d60: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
0d70: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
0d80: 74 61 74 69 63 29 3b 0a 20 20 20 20 73 71 6c 69  tatic);.    sqli
0d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0da0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 6d 65  , pExpr);.    me
0db0: 6d 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70  mcpy(pExpr, pDup
0dc0: 2c 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29  , sizeof(*pExpr)
0dd0: 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  );.    if( !Expr
0de0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0df0: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
0e00: 26 26 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  && pExpr->u.zTok
0e10: 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  en!=0 ){.      a
0e20: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 66  ssert( (pExpr->f
0e30: 6c 61 67 73 20 26 20 28 45 50 5f 52 65 64 75 63  lags & (EP_Reduc
0e40: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
0e50: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  )==0 );.      pE
0e60: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  xpr->u.zToken = 
0e70: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
0e80: 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  db, pExpr->u.zTo
0e90: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ken);.      pExp
0ea0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 4d  r->flags |= EP_M
0eb0: 65 6d 54 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 20  emToken;.    }. 
0ec0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
0ed0: 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 7d 0a  (db, pDup);.  }.
0ee0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
0ef0: 79 28 70 45 78 70 72 2c 20 45 50 5f 41 6c 69 61  y(pExpr, EP_Alia
0f00: 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  s);.}.../*.** Re
0f10: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0f20: 20 6e 61 6d 65 20 7a 43 6f 6c 20 6f 63 63 75 72   name zCol occur
0f30: 73 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68  s anywhere in th
0f40: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  e USING clause..
0f50: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c  **.** Return FAL
0f60: 53 45 20 69 66 20 74 68 65 20 55 53 49 4e 47 20  SE if the USING 
0f70: 63 6c 61 75 73 65 20 69 73 20 4e 55 4c 4c 20 6f  clause is NULL o
0f80: 72 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  r if it does not
0f90: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 7a 43 6f 6c   contain.** zCol
0fa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0fb0: 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75 73  nameInUsingClaus
0fc0: 65 28 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67  e(IdList *pUsing
0fd0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
0fe0: 6f 6c 29 7b 0a 20 20 69 66 28 20 70 55 73 69 6e  ol){.  if( pUsin
0ff0: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  g ){.    int k;.
1000: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1010: 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29  Using->nId; k++)
1020: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1030: 74 65 33 53 74 72 49 43 6d 70 28 70 55 73 69 6e  te3StrICmp(pUsin
1040: 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a  g->a[k].zName, z
1050: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1060: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1070: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1080: 2a 2a 20 53 75 62 71 75 65 72 69 65 73 20 73 74  ** Subqueries st
1090: 6f 72 65 73 20 74 68 65 20 6f 72 69 67 69 6e 61  ores the origina
10a0: 6c 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  l database, tabl
10b0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e and column nam
10c0: 65 73 20 66 6f 72 20 74 68 65 69 72 0a 2a 2a 20  es for their.** 
10d0: 72 65 73 75 6c 74 20 73 65 74 73 20 69 6e 20 45  result sets in E
10e0: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61  xprList.a[].zSpa
10f0: 6e 2c 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 22  n, in the form "
1100: 44 41 54 41 42 41 53 45 2e 54 41 42 4c 45 2e 43  DATABASE.TABLE.C
1110: 4f 4c 55 4d 4e 22 2e 0a 2a 2a 20 43 68 65 63 6b  OLUMN"..** Check
1120: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 7a   to see if the z
1130: 53 70 61 6e 20 67 69 76 65 6e 20 74 6f 20 74 68  Span given to th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 74 63 68  is routine match
1150: 65 73 20 74 68 65 20 7a 44 62 2c 20 7a 54 61 62  es the zDb, zTab
1160: 2c 0a 2a 2a 20 61 6e 64 20 7a 43 6f 6c 2e 20 20  ,.** and zCol.  
1170: 49 66 20 61 6e 79 20 6f 66 20 7a 44 62 2c 20 7a  If any of zDb, z
1180: 54 61 62 2c 20 61 6e 64 20 7a 43 6f 6c 20 61 72  Tab, and zCol ar
1190: 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 6f 73  e NULL then thos
11a0: 65 20 66 69 65 6c 64 73 20 77 69 6c 6c 0a 2a 2a  e fields will.**
11b0: 20 6d 61 74 63 68 20 61 6e 79 74 68 69 6e 67 2e   match anything.
11c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
11d0: 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 0a 20 20  atchSpanName(.  
11e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61  const char *zSpa
11f0: 6e 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n,.  const char 
1200: 2a 7a 43 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20 63  *zCol,.  const c
1210: 68 61 72 20 2a 7a 54 61 62 2c 0a 20 20 63 6f 6e  har *zTab,.  con
1220: 73 74 20 63 68 61 72 20 2a 7a 44 62 0a 29 7b 0a  st char *zDb.){.
1230: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
1240: 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53 70 61 6e  =0; ALWAYS(zSpan
1250: 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e 5b 6e 5d  [n]) && zSpan[n]
1260: 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20  !='.'; n++){}.  
1270: 69 66 28 20 7a 44 62 20 26 26 20 28 73 71 6c 69  if( zDb && (sqli
1280: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 70 61  te3StrNICmp(zSpa
1290: 6e 2c 20 7a 44 62 2c 20 6e 29 21 3d 30 20 7c 7c  n, zDb, n)!=0 ||
12a0: 20 7a 44 62 5b 6e 5d 21 3d 30 29 20 29 7b 0a 20   zDb[n]!=0) ){. 
12b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12c0: 0a 20 20 7a 53 70 61 6e 20 2b 3d 20 6e 2b 31 3b  .  zSpan += n+1;
12d0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41 4c 57 41  .  for(n=0; ALWA
12e0: 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20 26 26 20  YS(zSpan[n]) && 
12f0: 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b 20 6e  zSpan[n]!='.'; n
1300: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 54 61 62  ++){}.  if( zTab
1310: 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72 4e   && (sqlite3StrN
1320: 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 54 61 62  ICmp(zSpan, zTab
1330: 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 54 61 62 5b  , n)!=0 || zTab[
1340: 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65  n]!=0) ){.    re
1350: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53  turn 0;.  }.  zS
1360: 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 69 66  pan += n+1;.  if
1370: 28 20 7a 43 6f 6c 20 26 26 20 73 71 6c 69 74 65  ( zCol && sqlite
1380: 33 53 74 72 49 43 6d 70 28 7a 53 70 61 6e 2c 20  3StrICmp(zSpan, 
1390: 7a 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  zCol)!=0 ){.    
13a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
13b0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
13c0: 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d  ** Given the nam
13d0: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  e of a column of
13e0: 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20   the form X.Y.Z 
13f0: 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a  or Y.Z or just Z
1400: 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61  , look up.** tha
1410: 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65  t name in the se
1420: 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c  t of source tabl
1430: 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61  es in pSrcList a
1440: 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70  nd make the pExp
1450: 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  r .** expression
1460: 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b   node refer back
1470: 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20   to that source 
1480: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c  column.  The fol
1490: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a  lowing changes.*
14a0: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45  * are made to pE
14b0: 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45  xpr:.**.**    pE
14c0: 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20  xpr->iDb        
14d0: 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65 78     Set the index
14e0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66   in db->aDb[] of
14f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 58 0a   the database X.
1500: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1510: 20 20 20 20 20 20 20 20 20 20 20 28 65 76 65 6e             (even
1520: 20 69 66 20 58 20 69 73 20 69 6d 70 6c 69 65 64   if X is implied
1530: 29 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  )..**    pExpr->
1540: 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65  iTable        Se
1550: 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20  t to the cursor 
1560: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
1570: 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  able obtained.**
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53           from pS
15a0: 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45  rcList..**    pE
15b0: 78 70 72 2d 3e 79 2e 70 54 61 62 20 20 20 20 20  xpr->y.pTab     
15c0: 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65     Points to the
15d0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
15e0: 20 6f 66 20 58 2e 59 20 28 65 76 65 6e 20 69 66   of X.Y (even if
15f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1600: 20 20 20 20 20 20 20 20 20 20 20 20 58 20 61 6e              X an
1610: 64 2f 6f 72 20 59 20 61 72 65 20 69 6d 70 6c 69  d/or Y are impli
1620: 65 64 2e 29 0a 2a 2a 20 20 20 20 70 45 78 70 72  ed.).**    pExpr
1630: 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20  ->iColumn       
1640: 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  Set to the colum
1650: 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
1660: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  the table..**   
1670: 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
1680: 20 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f        Set to TK_
1690: 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45  COLUMN..**    pE
16a0: 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20  xpr->pLeft      
16b0: 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f     Any expressio
16c0: 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f  n this points to
16d0: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20   is deleted.**  
16e0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
16f0: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
1700: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
1710: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e  s to is deleted.
1720: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 44 62 20 76  .**.** The zDb v
1730: 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 6e  ariable is the n
1740: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1750: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
1760: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
1770: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
1780: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
1790: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
17a0: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
17b0: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
17c0: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
17d0: 65 20 7a 54 61 62 6c 65 20 76 61 72 69 61 62 6c  e zTable variabl
17e0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
17f0: 20 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20   the table (the 
1800: 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76  "Y").  This.** v
1810: 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c  alue can be NULL
1820: 20 69 66 20 7a 44 62 20 69 73 20 61 6c 73 6f 20   if zDb is also 
1830: 4e 55 4c 4c 2e 20 20 49 66 20 7a 54 61 62 6c 65  NULL.  If zTable
1840: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
1850: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
1860: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
1870: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
1880: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
1890: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
18a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
18b0: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
18c0: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
18d0: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
18e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
18f0: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
1900: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1910: 2e 20 20 52 65 74 75 72 6e 20 57 52 43 5f 50 72  .  Return WRC_Pr
1920: 75 6e 65 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  une on success..
1930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
1940: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
1950: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1960: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1970: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
1980: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
1990: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
19a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
19b0: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
19c0: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
19d0: 68 61 72 20 2a 7a 54 61 62 2c 20 20 20 20 2f 2a  har *zTab,    /*
19e0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
19f0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
1a00: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1a10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1a20: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1a30: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
1a40: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
1a50: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
1a60: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
1a70: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
1a80: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
1a90: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
1aa0: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
1ab0: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
1ac0: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
1ad0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
1ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1b00: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1b10: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
1b40: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
1b50: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ames */.  int cn
1b60: 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20  tTab = 0;       
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b80: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
1b90: 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f  g table names */
1ba0: 0a 20 20 69 6e 74 20 6e 53 75 62 71 75 65 72 79  .  int nSubquery
1bb0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1bc0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79       /* How many
1bd0: 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 62 71 75   levels of subqu
1be0: 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1bf0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c00: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b;         /* Th
1c10: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1c20: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  ction */.  struc
1c30: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1c40: 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  pItem;       /* 
1c50: 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  Use for looping 
1c60: 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 69 74  over pSrcList it
1c70: 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ems */.  struct 
1c80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d  SrcList_item *pM
1c90: 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68  atch = 0;  /* Th
1ca0: 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c  e matching pSrcL
1cb0: 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61  ist item */.  Na
1cc0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e  meContext *pTopN
1cd0: 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20  C = pNC;        
1ce0: 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e  /* First namecon
1cf0: 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74  text in the list
1d00: 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20 2a 70 53   */.  Schema *pS
1d10: 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20 20 20  chema = 0;      
1d20: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 68 65 6d          /* Schem
1d30: 61 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  a of the express
1d40: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65  ion */.  int eNe
1d50: 77 45 78 70 72 4f 70 20 3d 20 54 4b 5f 43 4f 4c  wExprOp = TK_COL
1d60: 55 4d 4e 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  UMN;       /* Ne
1d70: 77 20 76 61 6c 75 65 20 66 6f 72 20 70 45 78 70  w value for pExp
1d80: 72 2d 3e 6f 70 20 6f 6e 20 73 75 63 63 65 73 73  r->op on success
1d90: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1da0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
1db0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1dc0: 20 68 6f 6c 64 20 74 68 65 20 72 6f 77 20 2a 2f   hold the row */
1dd0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
1e00: 20 6f 66 20 70 54 61 62 20 2a 2f 0a 0a 20 20 61   of pTab */..  a
1e10: 73 73 65 72 74 28 20 70 4e 43 20 29 3b 20 20 20  ssert( pNC );   
1e20: 20 20 2f 2a 20 74 68 65 20 6e 61 6d 65 20 63 6f    /* the name co
1e30: 6e 74 65 78 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntext cannot be 
1e40: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72  NULL. */.  asser
1e50: 74 28 20 7a 43 6f 6c 20 29 3b 20 20 20 20 2f 2a  t( zCol );    /*
1e60: 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20   The Z in X.Y.Z 
1e70: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a  cannot be NULL *
1e80: 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  /.  assert( !Exp
1e90: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ea0: 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1eb0: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
1ec0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1ed0: 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d   the node to no-
1ee0: 6d 61 74 63 68 20 2a 2f 0a 20 20 70 45 78 70 72  match */.  pExpr
1ef0: 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20  ->iTable = -1;. 
1f00: 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
1f10: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
1f20: 52 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a 20 54  Reduce);..  /* T
1f30: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 73 63 68  ranslate the sch
1f40: 65 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44 62 20  ema name in zDb 
1f50: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
1f60: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
1f70: 69 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d 61 2e  ing.  ** schema.
1f80: 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20    If not found, 
1f90: 70 53 63 68 65 6d 61 20 77 69 6c 6c 20 72 65 6d  pSchema will rem
1fa0: 61 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e 6f 74  ain NULL and not
1fb0: 68 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63 68 0a  hing will match.
1fc0: 20 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 69    ** resulting i
1fd0: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
1fe0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
1ff0: 6f 77 61 72 64 20 74 68 65 20 65 6e 64 20 6f 66  oward the end of
2000: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
2010: 2a 2f 0a 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  */.  if( zDb ){.
2020: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
2030: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2040: 50 61 72 74 49 64 78 20 29 3b 0a 20 20 20 20 74  PartIdx );.    t
2050: 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63  estcase( pNC->nc
2060: 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68 65  Flags & NC_IsChe
2070: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ck );.    if( (p
2080: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28 4e  NC->ncFlags & (N
2090: 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 73 43  C_PartIdx|NC_IsC
20a0: 68 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20 20 20  heck))!=0 ){.   
20b0: 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 69     /* Silently i
20c0: 67 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20 71  gnore database q
20d0: 75 61 6c 69 66 69 65 72 73 20 69 6e 73 69 64 65  ualifiers inside
20e0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
20f0: 74 73 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ts and.      ** 
2100: 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 2e  partial indices.
2110: 20 20 44 6f 20 6e 6f 74 20 72 61 69 73 65 20 65    Do not raise e
2120: 72 72 6f 72 73 20 62 65 63 61 75 73 65 20 74 68  rrors because th
2130: 61 74 20 6d 69 67 68 74 20 62 72 65 61 6b 0a 20  at might break. 
2140: 20 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 61       ** legacy a
2150: 6e 64 20 62 65 63 61 75 73 65 20 69 74 20 64 6f  nd because it do
2160: 65 73 20 6e 6f 74 20 68 75 72 74 20 61 6e 79 74  es not hurt anyt
2170: 68 69 6e 67 20 74 6f 20 6a 75 73 74 20 69 67 6e  hing to just ign
2180: 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ore the.      **
2190: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
21a0: 2a 2f 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 30  */.      zDb = 0
21b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
21d0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
21e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
21f0: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
2200: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2210: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64  sqlite3StrICmp(d
2220: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
2230: 6d 65 2c 7a 44 62 29 3d 3d 30 20 29 7b 0a 20 20  me,zDb)==0 ){.  
2240: 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20          pSchema 
2250: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  = db->aDb[i].pSc
2260: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
2270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2290: 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 61   }..  /* Start a
22a0: 74 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  t the inner-most
22b0: 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 6d 6f 76   context and mov
22c0: 65 20 6f 75 74 77 61 72 64 20 75 6e 74 69 6c 20  e outward until 
22d0: 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
22e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4e   */.  assert( pN
22f0: 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 3b 0a 20  C && cnt==0 );. 
2300: 20 64 6f 7b 0a 20 20 20 20 45 78 70 72 4c 69 73   do{.    ExprLis
2310: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
2320: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
2330: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
2340: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c  ;..    if( pSrcL
2350: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ist ){.      for
2360: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63  (i=0, pItem=pSrc
2370: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c  List->a; i<pSrcL
2380: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2390: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
23a0: 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
23b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73  pTab;.        as
23c0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 26 26  sert( pTab!=0 &&
23d0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d 30 20   pTab->zName!=0 
23e0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
23f0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
2400: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2410: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26 26  Item->pSelect &&
2420: 20 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74   (pItem->pSelect
2430: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2440: 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29  NestedFrom)!=0 )
2450: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2460: 68 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  hit = 0;.       
2470: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 49 74 65     pEList = pIte
2480: 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  m->pSelect->pELi
2490: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
24a0: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d  r(j=0; j<pEList-
24b0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
24c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
24d0: 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
24e0: 6d 65 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  me(pEList->a[j].
24f0: 7a 53 70 61 6e 2c 20 7a 43 6f 6c 2c 20 7a 54 61  zSpan, zCol, zTa
2500: 62 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  b, zDb) ){.     
2510: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e                cn
2530: 74 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  tTab = 2;.      
2540: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
2550: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
2560: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
2570: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
2580: 20 20 20 20 20 20 20 20 68 69 74 20 3d 20 31 3b          hit = 1;
2590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
25a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25b0: 20 20 20 20 20 69 66 28 20 68 69 74 20 7c 7c 20       if( hit || 
25c0: 7a 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zTab==0 ) contin
25d0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
25e0: 20 20 20 20 20 20 69 66 28 20 7a 44 62 20 26 26        if( zDb &&
25f0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 21 3d   pTab->pSchema!=
2600: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
2610: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2630: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
2640: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2650: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
2660: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49  tem->zAlias ? pI
2670: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54  tem->zAlias : pT
2680: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
2690: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61       assert( zTa
26a0: 62 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  bName!=0 );.    
26b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26c0: 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d  3StrICmp(zTabNam
26d0: 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a 20  e, zTab)!=0 ){. 
26e0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
26f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2700: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
2710: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
2720: 26 26 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  && pItem->zAlias
2730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2740: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
2750: 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
2760: 30 2c 20 28 76 6f 69 64 2a 29 26 70 45 78 70 72  0, (void*)&pExpr
2770: 2d 3e 79 2e 70 54 61 62 29 3b 0a 20 20 20 20 20  ->y.pTab);.     
2780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2790: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
27a0: 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20  (cntTab++) ){.  
27b0: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
27c0: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
27d0: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  }.        for(j=
27e0: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
27f0: 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; j<pTab->nCol
2800: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; j++, pCol++){.
2810: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2820: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
2830: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  l->zName, zCol)=
2840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2850: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61    /* If there ha
2860: 73 20 62 65 65 6e 20 65 78 61 63 74 6c 79 20 6f  s been exactly o
2870: 6e 65 20 70 72 69 6f 72 20 6d 61 74 63 68 20 61  ne prior match a
2880: 6e 64 20 74 68 69 73 20 6d 61 74 63 68 0a 20 20  nd this match.  
2890: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
28a0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68 61  for the right-ha
28b0: 6e 64 20 74 61 62 6c 65 20 6f 66 20 61 20 4e 41  nd table of a NA
28c0: 54 55 52 41 4c 20 4a 4f 49 4e 20 6f 72 20 69 73  TURAL JOIN or is
28d0: 20 69 6e 20 61 20 0a 20 20 20 20 20 20 20 20 20   in a .         
28e0: 20 20 20 2a 2a 20 55 53 49 4e 47 20 63 6c 61 75     ** USING clau
28f0: 73 65 2c 20 74 68 65 6e 20 73 6b 69 70 20 74 68  se, then skip th
2900: 69 73 20 6d 61 74 63 68 2e 0a 20 20 20 20 20 20  is match..      
2910: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2920: 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 31 20       if( cnt==1 
2930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2940: 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6a   if( pItem->fg.j
2950: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2960: 55 52 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  URAL ) continue;
2970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2980: 66 28 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c  f( nameInUsingCl
2990: 61 75 73 65 28 70 49 74 65 6d 2d 3e 70 55 73 69  ause(pItem->pUsi
29a0: 6e 67 2c 20 7a 43 6f 6c 29 20 29 20 63 6f 6e 74  ng, zCol) ) cont
29b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
29c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29d0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
29e0: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
29f0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;.            /
2a00: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
2a10: 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d   rowid (column -
2a20: 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  1) for the INTEG
2a30: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
2a40: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
2a50: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
2a60: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
2a70: 2d 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20 20 20  -1 : (i16)j;.   
2a80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2a90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ab0: 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 29      if( pMatch )
2ac0: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
2ad0: 3e 69 54 61 62 6c 65 20 3d 20 70 4d 61 74 63 68  >iTable = pMatch
2ae0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2af0: 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62     pExpr->y.pTab
2b00: 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b   = pMatch->pTab;
2b10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 49 47 48  .        /* RIGH
2b20: 54 20 4a 4f 49 4e 20 6e 6f 74 20 28 79 65 74 29  T JOIN not (yet)
2b30: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
2b40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2b50: 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Match->fg.jointy
2b60: 70 65 20 26 20 4a 54 5f 52 49 47 48 54 29 3d 3d  pe & JT_RIGHT)==
2b70: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
2b80: 20 28 70 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69   (pMatch->fg.joi
2b90: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2ba0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2bb0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2bc0: 28 70 45 78 70 72 2c 20 45 50 5f 43 61 6e 42 65  (pExpr, EP_CanBe
2bd0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
2be0: 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61  .        pSchema
2bf0: 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   = pExpr->y.pTab
2c00: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
2c10: 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 69 66 28 20   }.    } /* if( 
2c20: 70 53 72 63 4c 69 73 74 20 29 20 2a 2f 0a 0a 23  pSrcList ) */..#
2c30: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2c40: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
2c50: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2c60: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 29  ITE_OMIT_UPSERT)
2c70: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
2c80: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
2c90: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
2ca0: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
2cb0: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
2cc0: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
2cd0: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
2ce0: 65 72 65 6e 63 65 2e 20 20 4f 72 0a 20 20 20 20  erence.  Or.    
2cf0: 2a 2a 20 6d 61 79 62 65 20 69 74 20 69 73 20 61  ** maybe it is a
2d00: 6e 20 65 78 63 6c 75 64 65 64 2e 2a 20 66 72 6f  n excluded.* fro
2d10: 6d 20 61 6e 20 75 70 73 65 72 74 2e 0a 20 20 20  m an upsert..   
2d20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d   */.    if( zDb=
2d30: 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26  =0 && zTab!=0 &&
2d40: 20 63 6e 74 54 61 62 3d 3d 30 20 29 7b 0a 20 20   cntTab==0 ){.  
2d50: 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 23 69      pTab = 0;.#i
2d60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d70: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 20 20  T_TRIGGER.      
2d80: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 72 69  if( pParse->pTri
2d90: 67 67 65 72 54 61 62 21 3d 30 20 29 7b 0a 20 20  ggerTab!=0 ){.  
2da0: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
2db0: 50 61 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f  Parse->eTriggerO
2dc0: 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
2dd0: 74 28 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45  t( op==TK_DELETE
2de0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54   || op==TK_UPDAT
2df0: 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45  E || op==TK_INSE
2e00: 52 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  RT );.        if
2e10: 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54 45 20  ( op!=TK_DELETE 
2e20: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2e30: 70 28 22 6e 65 77 22 2c 7a 54 61 62 29 20 3d 3d  p("new",zTab) ==
2e40: 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   0 ){.          
2e50: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2e60: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
2e70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69  b = pParse->pTri
2e80: 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 20  ggerTab;.       
2e90: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 21 3d 54   }else if( op!=T
2ea0: 4b 5f 49 4e 53 45 52 54 20 26 26 20 73 71 6c 69  K_INSERT && sqli
2eb0: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
2ec0: 2c 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20  ,zTab)==0 ){.   
2ed0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2ee0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
2ef0: 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
2f00: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 3b 0a  e->pTriggerTab;.
2f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f30: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20  TE_OMIT_TRIGGER 
2f40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2f50: 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 0a 20 20  E_OMIT_UPSERT.  
2f60: 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
2f70: 46 6c 61 67 73 20 26 20 4e 43 5f 55 55 70 73 65  Flags & NC_UUpse
2f80: 72 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rt)!=0 ){.      
2f90: 20 20 55 70 73 65 72 74 20 2a 70 55 70 73 65 72    Upsert *pUpser
2fa0: 74 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 55 70  t = pNC->uNC.pUp
2fb0: 73 65 72 74 3b 0a 20 20 20 20 20 20 20 20 69 66  sert;.        if
2fc0: 28 20 70 55 70 73 65 72 74 20 26 26 20 73 71 6c  ( pUpsert && sql
2fd0: 69 74 65 33 53 74 72 49 43 6d 70 28 22 65 78 63  ite3StrICmp("exc
2fe0: 6c 75 64 65 64 22 2c 7a 54 61 62 29 3d 3d 30 20  luded",zTab)==0 
2ff0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
3000: 62 20 3d 20 70 55 70 73 65 72 74 2d 3e 70 55 70  b = pUpsert->pUp
3010: 73 65 72 74 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  sertSrc->a[0].pT
3020: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  ab;.          pE
3030: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 32 3b  xpr->iTable = 2;
3040: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3050: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
3060: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 20  ITE_OMIT_UPSERT 
3070: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  */..      if( pT
3080: 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69  ab ){ .        i
3090: 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
30a0: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
30b0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
30c0: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20    cntTab++;.    
30d0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 2c 20      for(iCol=0, 
30e0: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
30f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
3100: 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b  ; iCol++, pCol++
3110: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
3120: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
3130: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
3140: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
3150: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70       if( iCol==p
3160: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
3180: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
3190: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
31a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31c0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
31d0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 73 71  pTab->nCol && sq
31e0: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
31f0: 6c 29 20 26 26 20 56 69 73 69 62 6c 65 52 6f 77  l) && VisibleRow
3200: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
3210: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
3220: 35 31 34 31 34 2d 33 32 39 31 30 20 2a 2f 0a 20  51414-32910 */. 
3230: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
3240: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
3250: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
3260: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
3270: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 23 69         cnt++;.#i
3280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3290: 54 5f 55 50 53 45 52 54 0a 20 20 20 20 20 20 20  T_UPSERT.       
32a0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
32b0: 61 62 6c 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20  able==2 ){.     
32c0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32d0: 20 69 43 6f 6c 3d 3d 28 2d 31 29 20 29 3b 0a 20   iCol==(-1) );. 
32e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
32f0: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
3300: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3310: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
3320: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = iCol;.        
3330: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70        pExpr->y.p
3340: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
3350: 20 20 20 20 20 20 20 20 20 20 65 4e 65 77 45 78            eNewEx
3360: 70 72 4f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  prOp = TK_COLUMN
3370: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
3380: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
3390: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
33a0: 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 55 70 73   = pNC->uNC.pUps
33b0: 65 72 74 2d 3e 72 65 67 44 61 74 61 20 2b 20 69  ert->regData + i
33c0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
33d0: 20 20 20 65 4e 65 77 45 78 70 72 4f 70 20 3d 20     eNewExprOp = 
33e0: 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
33f0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
3400: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
3410: 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a 20 20 20  , EP_Alias);.   
3420: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3430: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
3440: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
3450: 5f 55 50 53 45 52 54 20 2a 2f 0a 20 20 20 20 20  _UPSERT */.     
3460: 20 20 20 20 20 7b 0a 23 69 66 6e 64 65 66 20 53       {.#ifndef S
3470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
3480: 45 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ER.            i
3490: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
34a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
34b0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
34c0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
34d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
34e0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54  se if( pExpr->iT
34f0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  able==0 ){.     
3500: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
3510: 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20  e( iCol==31 );. 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
3530: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20  tcase( iCol==32 
3540: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3550: 20 70 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b   pParse->oldmask
3560: 20 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20   |= (iCol>=32 ? 
3570: 30 78 66 66 66 66 66 66 66 66 20 3a 20 28 28 28  0xffffffff : (((
3580: 75 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a  u32)1)<<iCol));.
3590: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
35a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
35b0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
35c0: 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
35d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
35e0: 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20  Col==32 );.     
35f0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
3600: 3e 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69 43 6f  >newmask |= (iCo
3610: 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66  l>=32 ? 0xffffff
3620: 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c  ff : (((u32)1)<<
3630: 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  iCol));.        
3640: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3650: 20 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 20    pExpr->y.pTab 
3660: 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
3670: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3680: 6d 6e 20 3d 20 28 69 31 36 29 69 43 6f 6c 3b 0a  mn = (i16)iCol;.
3690: 20 20 20 20 20 20 20 20 20 20 20 20 65 4e 65 77              eNew
36a0: 45 78 70 72 4f 70 20 3d 20 54 4b 5f 54 52 49 47  ExprOp = TK_TRIG
36b0: 47 45 52 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  GER;.#endif /* S
36c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
36d0: 45 52 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ER */.          
36e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
36f0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
3700: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
3710: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
3720: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
3730: 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54  LITE_OMIT_UPSERT
3740: 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ) */..    /*.   
3750: 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20   ** Perhaps the 
3760: 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65  name is a refere
3770: 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44  nce to the ROWID
3780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3790: 63 6e 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 63  cnt==0.     && c
37a0: 6e 74 54 61 62 3d 3d 31 0a 20 20 20 20 20 26 26  ntTab==1.     &&
37b0: 20 70 4d 61 74 63 68 0a 20 20 20 20 20 26 26 20   pMatch.     && 
37c0: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
37d0: 4e 43 5f 49 64 78 45 78 70 72 29 3d 3d 30 0a 20  NC_IdxExpr)==0. 
37e0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
37f0: 52 6f 77 69 64 28 7a 43 6f 6c 29 0a 20 20 20 20  Rowid(zCol).    
3800: 20 26 26 20 56 69 73 69 62 6c 65 52 6f 77 69 64   && VisibleRowid
3810: 28 70 4d 61 74 63 68 2d 3e 70 54 61 62 29 0a 20  (pMatch->pTab). 
3820: 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20     ){.      cnt 
3830: 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72  = 1;.      pExpr
3840: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ->iColumn = -1;.
3850: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
3860: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
3870: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
3880: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
3890: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   If the input is
38a0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28   of the form Z (
38b0: 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a  not Y.Z or X.Y.Z
38c0: 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20  ) then the name 
38d0: 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72  Z.    ** might r
38e0: 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c  efer to an resul
38f0: 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68  t-set alias.  Th
3900: 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
3910: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20  example, when.  
3920: 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f    ** we are reso
3930: 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74  lving names in t
3940: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3950: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3960: 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a   command:.    **
3970: 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
3980: 43 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d  CT a+b AS x FROM
3990: 20 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31   table WHERE x<1
39a0: 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0;.    **.    **
39b0: 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74   In cases like t
39c0: 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78  his, replace pEx
39d0: 70 72 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  pr with a copy o
39e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
39f0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72   that.    ** for
3a00: 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ms the result se
3a10: 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69  t entry ("a+b" i
3a20: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61  n the example) a
3a30: 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
3a40: 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f  ately..    ** No
3a50: 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  te that the expr
3a60: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65  ession in the re
3a70: 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20  sult set should 
3a80: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
3a90: 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65  n.    ** resolve
3aa0: 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  d by the time th
3ab0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
3ac0: 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20  s resolved..    
3ad0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 62  **.    ** The ab
3ae0: 69 6c 69 74 79 20 74 6f 20 75 73 65 20 61 6e 20  ility to use an 
3af0: 6f 75 74 70 75 74 20 72 65 73 75 6c 74 2d 73 65  output result-se
3b00: 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  t column in the 
3b10: 57 48 45 52 45 2c 20 47 52 4f 55 50 20 42 59 2c  WHERE, GROUP BY,
3b20: 0a 20 20 20 20 2a 2a 20 6f 72 20 48 41 56 49 4e  .    ** or HAVIN
3b30: 47 20 63 6c 61 75 73 65 73 2c 20 6f 72 20 61 73  G clauses, or as
3b40: 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65   part of a large
3b50: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
3b60: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
3b70: 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 6e 6f   ** clause is no
3b80: 74 20 73 74 61 6e 64 61 72 64 20 53 51 4c 2e 20  t standard SQL. 
3b90: 20 54 68 69 73 20 69 73 20 61 20 28 67 6f 6f 66   This is a (goof
3ba0: 79 29 20 53 51 4c 69 74 65 20 65 78 74 65 6e 73  y) SQLite extens
3bb0: 69 6f 6e 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a  ion, that.    **
3bc0: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f   is supported fo
3bd0: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
3be0: 61 74 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e 20  atibility only. 
3bf0: 48 65 6e 63 65 2c 20 77 65 20 69 73 73 75 65 20  Hence, we issue 
3c00: 61 20 77 61 72 6e 69 6e 67 0a 20 20 20 20 2a 2a  a warning.    **
3c10: 20 6f 6e 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28   on sqlite3_log(
3c20: 29 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 63  ) whenever the c
3c30: 61 70 61 62 69 6c 69 74 79 20 69 73 20 75 73 65  apability is use
3c40: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
3c50: 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
3c60: 26 20 4e 43 5f 55 45 4c 69 73 74 29 21 3d 30 0a  & NC_UEList)!=0.
3c70: 20 20 20 20 20 26 26 20 63 6e 74 3d 3d 30 0a 20       && cnt==0. 
3c80: 20 20 20 20 26 26 20 7a 54 61 62 3d 3d 30 0a 20      && zTab==0. 
3c90: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 45 4c 69     ){.      pELi
3ca0: 73 74 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 45  st = pNC->uNC.pE
3cb0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  List;.      asse
3cc0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
3cd0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3ce0: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
3cf0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3d00: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
3d10: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
3d20: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
3d30: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
3d40: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
3d50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
3d60: 78 70 72 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20  xpr *pOrig;.    
3d70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
3d80: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
3d90: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
3da0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
3db0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
3dc0: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
3dd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
3de0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  xpr->x.pSelect==
3df0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
3e00: 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Orig = pEList->a
3e10: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
3e20: 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
3e30: 63 46 6c 61 67 73 26 4e 43 5f 41 6c 6c 6f 77 41  cFlags&NC_AllowA
3e40: 67 67 29 3d 3d 30 20 26 26 20 45 78 70 72 48 61  gg)==0 && ExprHa
3e50: 73 50 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c  sProperty(pOrig,
3e60: 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
3e70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3e80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3e90: 22 6d 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73  "misuse of alias
3ea0: 65 64 20 61 67 67 72 65 67 61 74 65 20 25 73 22  ed aggregate %s"
3eb0: 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20  , zAs);.        
3ec0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
3ed0: 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  bort;.          
3ee0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
3ef0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
3f00: 72 53 69 7a 65 28 70 4f 72 69 67 29 21 3d 31 20  rSize(pOrig)!=1 
3f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
3f20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3f30: 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
3f40: 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20  e misused");.   
3f50: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3f60: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
3f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3f80: 20 72 65 73 6f 6c 76 65 41 6c 69 61 73 28 70 50   resolveAlias(pP
3f90: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 6a 2c  arse, pEList, j,
3fa0: 20 70 45 78 70 72 2c 20 22 22 2c 20 6e 53 75 62   pExpr, "", nSub
3fb0: 71 75 65 72 79 29 3b 0a 20 20 20 20 20 20 20 20  query);.        
3fc0: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
3fd0: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 30 3b       pMatch = 0;
3fe0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
3ff0: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
4000: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
4010: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
4020: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
4030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
4040: 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
4050: 61 72 73 65 2c 20 30 2c 20 28 76 6f 69 64 2a 29  arse, 0, (void*)
4060: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
4070: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
4080: 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  to lookupname_en
4090: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
40a0: 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20     } .    }..   
40b0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74   /* Advance to t
40c0: 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e  he next name con
40d0: 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20  text.  The loop 
40e0: 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65  will exit when e
40f0: 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20  ither.    ** we 
4100: 68 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e  have a match (cn
4110: 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20  t>0) or when we 
4120: 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20  run out of name 
4130: 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f  contexts..    */
4140: 0a 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 62  .    if( cnt ) b
4150: 72 65 61 6b 3b 0a 20 20 20 20 70 4e 43 20 3d 20  reak;.    pNC = 
4160: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
4170: 6e 53 75 62 71 75 65 72 79 2b 2b 3b 0a 20 20 7d  nSubquery++;.  }
4180: 77 68 69 6c 65 28 20 70 4e 43 20 29 3b 0a 0a 0a  while( pNC );...
4190: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61    /*.  ** If X a
41a0: 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69  nd Y are NULL (i
41b0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
41c0: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
41d0: 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20   name Z is.  ** 
41e0: 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68  supplied) and th
41f0: 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20  e value of Z is 
4200: 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62  enclosed in doub
4210: 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a  le-quotes, then.
4220: 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69    ** Z is a stri
4230: 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74  ng literal if it
4240: 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61   doesn't match a
4250: 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  ny column names.
4260: 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63    In that.  ** c
4270: 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
4280: 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
4290: 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61  y and not make a
42a0: 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20  ny changes to.  
42b0: 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20  ** pExpr..  **. 
42c0: 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72   ** Because no r
42d0: 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64  eference was mad
42e0: 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65  e to outer conte
42f0: 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52  xts, the pNC->nR
4300: 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61  ef.  ** fields a
4310: 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69  re not changed i
4320: 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20  n any context.. 
4330: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
4340: 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20   && zTab==0 ){. 
4350: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
4360: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20  ->op==TK_ID );. 
4370: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
4380: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
4390: 44 62 6c 51 75 6f 74 65 64 29 20 29 7b 0a 20 20  DblQuoted) ){.  
43a0: 20 20 20 20 2f 2a 20 49 66 20 61 20 64 6f 75 62      /* If a doub
43b0: 6c 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69  le-quoted identi
43c0: 66 69 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61  fier does not ma
43d0: 74 63 68 20 61 6e 79 20 6b 6e 6f 77 6e 20 63 6f  tch any known co
43e0: 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 20 20 20 20 20  lumn name,.     
43f0: 20 2a 2a 20 74 68 65 6e 20 74 72 65 61 74 20 69   ** then treat i
4400: 74 20 61 73 20 61 20 73 74 72 69 6e 67 2e 0a 20  t as a string.. 
4410: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
4420: 20 54 68 69 73 20 68 61 63 6b 20 77 61 73 20 61   This hack was a
4430: 64 64 65 64 20 69 6e 20 74 68 65 20 65 61 72 6c  dded in the earl
4440: 79 20 64 61 79 73 20 6f 66 20 53 51 4c 69 74 65  y days of SQLite
4450: 20 69 6e 20 61 20 6d 69 73 67 75 69 64 65 64 20   in a misguided 
4460: 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a  attempt.      **
4470: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
4480: 65 20 77 69 74 68 20 4d 79 53 51 4c 20 33 2e 78  e with MySQL 3.x
4490: 2c 20 77 68 69 63 68 20 75 73 65 64 20 64 6f 75  , which used dou
44a0: 62 6c 65 2d 71 75 6f 74 65 73 20 66 6f 72 20 73  ble-quotes for s
44b0: 74 72 69 6e 67 73 2e 0a 20 20 20 20 20 20 2a 2a  trings..      **
44c0: 20 49 20 6e 6f 77 20 73 6f 72 65 6c 79 20 72 65   I now sorely re
44d0: 67 72 65 74 20 70 75 74 74 69 6e 67 20 69 6e 20  gret putting in 
44e0: 74 68 69 73 20 68 61 63 6b 2e 20 54 68 65 20 65  this hack. The e
44f0: 66 66 65 63 74 20 6f 66 20 74 68 69 73 20 68 61  ffect of this ha
4500: 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74  ck is.      ** t
4510: 68 61 74 20 6d 69 73 73 70 65 6c 6c 65 64 20 69  hat misspelled i
4520: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 73 20  dentifier names 
4530: 61 72 65 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e  are silently con
4540: 76 65 72 74 65 64 20 69 6e 74 6f 20 73 74 72 69  verted into stri
4550: 6e 67 73 0a 20 20 20 20 20 20 2a 2a 20 72 61 74  ngs.      ** rat
4560: 68 65 72 20 74 68 61 6e 20 63 61 75 73 69 6e 67  her than causing
4570: 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 74 68   an error, to th
4580: 65 20 66 72 75 73 74 72 61 74 69 6f 6e 20 6f 66  e frustration of
4590: 20 63 6f 75 6e 74 6c 65 73 73 0a 20 20 20 20 20   countless.     
45a0: 20 2a 2a 20 70 72 6f 67 72 61 6d 6d 65 72 73 2e   ** programmers.
45b0: 20 54 6f 20 61 6c 6c 20 74 68 6f 73 65 20 66 72   To all those fr
45c0: 75 73 74 72 61 74 65 64 20 70 72 6f 67 72 61 6d  ustrated program
45d0: 6d 65 72 73 2c 20 6d 79 20 61 70 6f 6c 6f 67 69  mers, my apologi
45e0: 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
45f0: 20 20 20 2a 2a 20 53 6f 6d 65 64 61 79 2c 20 49     ** Someday, I
4600: 20 68 6f 70 65 20 74 6f 20 67 65 74 20 72 69 64   hope to get rid
4610: 20 6f 66 20 74 68 69 73 20 68 61 63 6b 2e 20 55   of this hack. U
4620: 6e 66 6f 72 74 75 6e 61 74 65 6c 79 20 74 68 65  nfortunately the
4630: 72 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  re is.      ** a
4640: 20 68 75 67 65 20 61 6d 6f 75 6e 74 20 6f 66 20   huge amount of 
4650: 6c 65 67 61 63 79 20 53 51 4c 20 74 68 61 74 20  legacy SQL that 
4660: 75 73 65 73 20 69 74 2e 20 53 6f 20 66 6f 72 20  uses it. So for 
4670: 6e 6f 77 2c 20 77 65 20 6a 75 73 74 0a 20 20 20  now, we just.   
4680: 20 20 20 2a 2a 20 69 73 73 75 65 20 61 20 77 61     ** issue a wa
4690: 72 6e 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  rning..      */.
46a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
46b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
46c0: 2c 0a 20 20 20 20 20 20 20 20 22 64 6f 75 62 6c  ,.        "doubl
46d0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
46e0: 6c 69 74 65 72 61 6c 3a 20 5c 22 25 77 5c 22 22  literal: \"%w\""
46f0: 2c 20 7a 43 6f 6c 29 3b 0a 23 69 66 64 65 66 20  , zCol);.#ifdef 
4700: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f  SQLITE_ENABLE_NO
4710: 52 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20 73 71  RMALIZE.      sq
4720: 6c 69 74 65 33 56 64 62 65 41 64 64 44 62 6c 71  lite3VdbeAddDblq
4730: 75 6f 74 65 53 74 72 28 64 62 2c 20 70 50 61 72  uoteStr(db, pPar
4740: 73 65 2d 3e 70 56 64 62 65 2c 20 7a 43 6f 6c 29  se->pVdbe, zCol)
4750: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  ;.#endif.      p
4760: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54  Expr->op = TK_ST
4770: 52 49 4e 47 3b 0a 20 20 20 20 20 20 70 45 78 70  RING;.      pExp
4780: 72 2d 3e 79 2e 70 54 61 62 20 3d 20 30 3b 0a 20  r->y.pTab = 0;. 
4790: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
47a0: 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
47b0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
47c0: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45  IdToTrueFalse(pE
47d0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65  xpr) ){.      re
47e0: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
47f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
4800: 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e    ** cnt==0 mean
4810: 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20  s there was not 
4820: 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65  match.  cnt>1 me
4830: 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74  ans there were t
4840: 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20  wo or.  ** more 
4850: 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72  matches.  Either
4860: 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e   way, we have an
4870: 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69   error..  */.  i
4880: 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20  f( cnt!=1 ){.   
4890: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
48a0: 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e  r;.    zErr = cn
48b0: 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20  t==0 ? "no such 
48c0: 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69 67  column" : "ambig
48d0: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
48e0: 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29  ";.    if( zDb )
48f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4900: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4910: 22 25 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c 20  "%s: %s.%s.%s", 
4920: 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62 2c  zErr, zDb, zTab,
4930: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73   zCol);.    }els
4940: 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20  e if( zTab ){.  
4950: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4960: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
4970: 20 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a   %s.%s", zErr, z
4980: 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Tab, zCol);.    
4990: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
49a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
49b0: 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a  rse, "%s: %s", z
49c0: 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Err, zCol);.    
49d0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
49e0: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
49f0: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
4a00: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
4a10: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
4a20: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73  table in pSrcLis
4a30: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c  t is referenced,
4a40: 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a   then record.  *
4a50: 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74  * this fact in t
4a60: 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  he pSrcList.a[].
4a70: 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e  colUsed bitmask.
4a80: 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65    Column 0 cause
4a90: 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20  s.  ** bit 0 to 
4aa0: 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20  be set.  Column 
4ab0: 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41  1 sets bit 1.  A
4ac0: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
4ad0: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   the.  ** column
4ae0: 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
4af0: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  er than the numb
4b00: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  er of bits in th
4b10: 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74  e bitmask.  ** t
4b20: 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68  hen set the high
4b30: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68  -order bit of th
4b40: 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  e bitmask..  */.
4b50: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
4b60: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63  lumn>=0 && pMatc
4b70: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
4b80: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
4b90: 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  mn;.    testcase
4ba0: 28 20 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( n==BMS-1 );.  
4bb0: 20 20 69 66 28 20 6e 3e 3d 42 4d 53 20 29 7b 0a    if( n>=BMS ){.
4bc0: 20 20 20 20 20 20 6e 20 3d 20 42 4d 53 2d 31 3b        n = BMS-1;
4bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4be0: 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73  t( pMatch->iCurs
4bf0: 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or==pExpr->iTabl
4c00: 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d  e );.    pMatch-
4c10: 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69  >colUsed |= ((Bi
4c20: 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d  tmask)1)<<n;.  }
4c30: 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
4c40: 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  and return.  */.
4c50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4c60: 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ete(db, pExpr->p
4c70: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
4c80: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
4c90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4ca0: 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
4cb0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
4cc0: 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d  ht = 0;.  pExpr-
4cd0: 3e 6f 70 20 3d 20 65 4e 65 77 45 78 70 72 4f 70  >op = eNewExprOp
4ce0: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
4cf0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65  rty(pExpr, EP_Le
4d00: 61 66 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  af);.lookupname_
4d10: 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e 74 3d 3d  end:.  if( cnt==
4d20: 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  1 ){.    assert(
4d30: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pNC!=0 );.    i
4d40: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
4d50: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 6c  rty(pExpr, EP_Al
4d60: 69 61 73 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ias) ){.      sq
4d70: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
4d80: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63  arse, pExpr, pSc
4d90: 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c  hema, pNC->pSrcL
4da0: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
4db0: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
4dc0: 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61   nRef value on a
4dd0: 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  ll name contexts
4de0: 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74   from TopNC up t
4df0: 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69  o.    ** the poi
4e00: 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d  nt where the nam
4e10: 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20  e matched. */.  
4e20: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
4e30: 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21   assert( pTopNC!
4e40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70  =0 );.      pTop
4e50: 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  NC->nRef++;.    
4e60: 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e    if( pTopNC==pN
4e70: 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  C ) break;.     
4e80: 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43   pTopNC = pTopNC
4e90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
4ea0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
4eb0: 75 6e 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  une;.  } else {.
4ec0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
4ed0: 62 6f 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  bort;.  }.}../*.
4ee0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
4ef0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
4f00: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
4f10: 6e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 63 6f  n to load the co
4f20: 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72 6f  lumn iCol.** fro
4f30: 6d 20 64 61 74 61 73 6f 75 72 63 65 20 69 53 72  m datasource iSr
4f40: 63 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  c in SrcList pSr
4f50: 63 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  c..*/.Expr *sqli
4f60: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
4f70: 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  xpr(sqlite3 *db,
4f80: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
4f90: 69 6e 74 20 69 53 72 63 2c 20 69 6e 74 20 69 43  int iSrc, int iC
4fa0: 6f 6c 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  ol){.  Expr *p =
4fb0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
4fc0: 63 28 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  c(db, TK_COLUMN,
4fd0: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20   0, 0);.  if( p 
4fe0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
4ff0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
5000: 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 53 72  m = &pSrc->a[iSr
5010: 63 5d 3b 0a 20 20 20 20 70 2d 3e 79 2e 70 54 61  c];.    p->y.pTa
5020: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
5030: 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
5040: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
5050: 0a 20 20 20 20 69 66 28 20 70 2d 3e 79 2e 70 54  .    if( p->y.pT
5060: 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
5070: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  ){.      p->iCol
5080: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  umn = -1;.    }e
5090: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43  lse{.      p->iC
50a0: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69  olumn = (ynVar)i
50b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
50c0: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
50d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
50e0: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
50f0: 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 63 6f  .      pItem->co
5100: 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61  lUsed |= ((Bitma
5110: 73 6b 29 31 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d  sk)1)<<(iCol>=BM
5120: 53 20 3f 20 42 4d 53 2d 31 20 3a 20 69 43 6f 6c  S ? BMS-1 : iCol
5130: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5140: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
5150: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
5160: 72 20 74 68 61 74 20 61 6e 20 65 78 70 72 65 73  r that an expres
5170: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69  sion is not vali
5180: 64 20 66 6f 72 20 73 6f 6d 65 20 73 65 74 20 6f  d for some set o
5190: 66 0a 2a 2a 20 70 4e 43 2d 3e 6e 63 46 6c 61 67  f.** pNC->ncFlag
51a0: 73 20 76 61 6c 75 65 73 20 64 65 74 65 72 6d 69  s values determi
51b0: 6e 65 64 20 62 79 20 76 61 6c 69 64 4d 61 73 6b  ned by validMask
51c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
51d0: 20 6e 6f 74 56 61 6c 69 64 28 0a 20 20 50 61 72   notValid(.  Par
51e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
51f0: 20 20 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f 72    /* Leave error
5200: 20 6d 65 73 73 61 67 65 20 68 65 72 65 20 2a 2f   message here */
5210: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
5220: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  pNC,    /* The n
5230: 61 6d 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ame context */. 
5240: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73   const char *zMs
5250: 67 2c 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66  g,    /* Type of
5260: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
5270: 76 61 6c 69 64 4d 61 73 6b 20 20 20 20 20 20 20  validMask       
5280: 20 2f 2a 20 53 65 74 20 6f 66 20 63 6f 6e 74 65   /* Set of conte
5290: 78 74 73 20 66 6f 72 20 77 68 69 63 68 20 70 72  xts for which pr
52a0: 6f 68 69 62 69 74 65 64 20 2a 2f 0a 29 7b 0a 20  ohibited */.){. 
52b0: 20 61 73 73 65 72 74 28 20 28 76 61 6c 69 64 4d   assert( (validM
52c0: 61 73 6b 26 7e 28 4e 43 5f 49 73 43 68 65 63 6b  ask&~(NC_IsCheck
52d0: 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49  |NC_PartIdx|NC_I
52e0: 64 78 45 78 70 72 29 29 3d 3d 30 20 29 3b 0a 20  dxExpr))==0 );. 
52f0: 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
5300: 67 73 20 26 20 76 61 6c 69 64 4d 61 73 6b 29 21  gs & validMask)!
5310: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
5320: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 22 70 61 72  char *zIn = "par
5330: 74 69 61 6c 20 69 6e 64 65 78 20 57 48 45 52 45  tial index WHERE
5340: 20 63 6c 61 75 73 65 73 22 3b 0a 20 20 20 20 69   clauses";.    i
5350: 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  f( pNC->ncFlags 
5360: 26 20 4e 43 5f 49 64 78 45 78 70 72 20 29 20 20  & NC_IdxExpr )  
5370: 20 20 20 20 7a 49 6e 20 3d 20 22 69 6e 64 65 78      zIn = "index
5380: 20 65 78 70 72 65 73 73 69 6f 6e 73 22 3b 0a 23   expressions";.#
5390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
53a0: 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 65 6c 73  IT_CHECK.    els
53b0: 65 20 69 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61  e if( pNC->ncFla
53c0: 67 73 20 26 20 4e 43 5f 49 73 43 68 65 63 6b 20  gs & NC_IsCheck 
53d0: 29 20 7a 49 6e 20 3d 20 22 43 48 45 43 4b 20 63  ) zIn = "CHECK c
53e0: 6f 6e 73 74 72 61 69 6e 74 73 22 3b 0a 23 65 6e  onstraints";.#en
53f0: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 45  dif.    sqlite3E
5400: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5410: 22 25 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  "%s prohibited i
5420: 6e 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 49 6e  n %s", zMsg, zIn
5430: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5440: 45 78 70 72 65 73 73 69 6f 6e 20 70 20 73 68 6f  Expression p sho
5450: 75 6c 64 20 65 6e 63 6f 64 65 20 61 20 66 6c 6f  uld encode a flo
5460: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
5470: 65 20 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e  e between 1.0 an
5480: 64 20 30 2e 30 2e 0a 2a 2a 20 52 65 74 75 72 6e  d 0.0..** Return
5490: 20 31 30 32 34 20 74 69 6d 65 73 20 74 68 69 73   1024 times this
54a0: 20 76 61 6c 75 65 2e 20 20 4f 72 20 72 65 74 75   value.  Or retu
54b0: 72 6e 20 2d 31 20 69 66 20 70 20 69 73 20 6e 6f  rn -1 if p is no
54c0: 74 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  t a floating poi
54d0: 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 74 77  nt.** value betw
54e0: 65 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e  een 1.0 and 0.0.
54f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5500: 78 70 72 50 72 6f 62 61 62 69 6c 69 74 79 28 45  xprProbability(E
5510: 78 70 72 20 2a 70 29 7b 0a 20 20 64 6f 75 62 6c  xpr *p){.  doubl
5520: 65 20 72 20 3d 20 2d 31 2e 30 3b 0a 20 20 69 66  e r = -1.0;.  if
5530: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 4c 4f 41  ( p->op!=TK_FLOA
5540: 54 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  T ) return -1;. 
5550: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 2d 3e   sqlite3AtoF(p->
5560: 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 2c 20 73 71  u.zToken, &r, sq
5570: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
5580: 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 20 53 51 4c 49  >u.zToken), SQLI
5590: 54 45 5f 55 54 46 38 29 3b 0a 20 20 61 73 73 65  TE_UTF8);.  asse
55a0: 72 74 28 20 72 3e 3d 30 2e 30 20 29 3b 0a 20 20  rt( r>=0.0 );.  
55b0: 69 66 28 20 72 3e 31 2e 30 20 29 20 72 65 74 75  if( r>1.0 ) retu
55c0: 72 6e 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20  rn -1;.  return 
55d0: 28 69 6e 74 29 28 72 2a 31 33 34 32 31 37 37 32  (int)(r*13421772
55e0: 38 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  8.0);.}../*.** T
55f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5600: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69  allback for sqli
5610: 74 65 33 57 61 6c 6b 45 78 70 72 28 29 2e 0a 2a  te3WalkExpr()..*
5620: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d  *.** Resolve sym
5630: 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f  bolic names into
5640: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61   TK_COLUMN opera
5650: 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75 72  tors for the cur
5660: 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20  rent.** node in 
5670: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
5680: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74  ree.  Return 0 t
5690: 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73  o continue the s
56a0: 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68  earch down.** th
56b0: 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61  e tree or 2 to a
56c0: 62 6f 72 74 20 74 68 65 20 74 72 65 65 20 77 61  bort the tree wa
56d0: 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  lk..**.** This r
56e0: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
56f0: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
5700: 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  and name resolut
5710: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74  ion for.** funct
5720: 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20  ion names.  The 
5730: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67  operator for agg
5740: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
5750: 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74   is changed.** t
5760: 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  o TK_AGG_FUNCTIO
5770: 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  N..*/.static int
5780: 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70   resolveExprStep
5790: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
57a0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
57b0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
57c0: 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
57d0: 72 73 65 3b 0a 0a 20 20 70 4e 43 20 3d 20 70 57  rse;..  pNC = pW
57e0: 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
57f0: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
5800: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
5810: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 61 73 73 65  ->pParse;.  asse
5820: 72 74 28 20 70 50 61 72 73 65 3d 3d 70 57 61 6c  rt( pParse==pWal
5830: 6b 65 72 2d 3e 70 50 61 72 73 65 20 29 3b 0a 0a  ker->pParse );..
5840: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
5850: 20 69 66 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69   if( pNC->pSrcLi
5860: 73 74 20 26 26 20 70 4e 43 2d 3e 70 53 72 63 4c  st && pNC->pSrcL
5870: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b  ist->nAlloc>0 ){
5880: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
5890: 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
58a0: 72 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  rcList;.    int 
58b0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
58c0: 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d  i<pNC->pSrcList-
58d0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
58e0: 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c     assert( pSrcL
58f0: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
5900: 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74  r>=0 && pSrcList
5910: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70  ->a[i].iCursor<p
5920: 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20  Parse->nTab);.  
5930: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
5940: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
5950: 6f 70 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e  op ){..#if defin
5960: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
5970: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
5980: 49 4d 49 54 29 20 26 26 20 21 64 65 66 69 6e 65  IMIT) && !define
5990: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
59a0: 42 51 55 45 52 59 29 0a 20 20 20 20 2f 2a 20 54  BQUERY).    /* T
59b0: 68 65 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61  he special opera
59c0: 74 6f 72 20 54 4b 5f 52 4f 57 20 6d 65 61 6e 73  tor TK_ROW means
59d0: 20 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 66   use the rowid f
59e0: 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  or the first.   
59f0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68   ** column in th
5a00: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
5a10: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
5a20: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 52  the LIMIT and OR
5a30: 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c  DER BY.    ** cl
5a40: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
5a50: 6f 6e 20 55 50 44 41 54 45 20 61 6e 64 20 44 45  on UPDATE and DE
5a60: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e  LETE statements.
5a70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5a80: 20 54 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20   TK_ROW: {.     
5a90: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
5aa0: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
5ab0: 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  st;.      struct
5ac0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
5ad0: 49 74 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  Item;.      asse
5ae0: 72 74 28 20 70 53 72 63 4c 69 73 74 20 26 26 20  rt( pSrcList && 
5af0: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pSrcList->nSrc==
5b00: 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  1 );.      pItem
5b10: 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
5b20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 48 61        assert( Ha
5b30: 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54  sRowid(pItem->pT
5b40: 61 62 29 20 26 26 20 70 49 74 65 6d 2d 3e 70 54  ab) && pItem->pT
5b50: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
5b60: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  ;.      pExpr->o
5b70: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
5b80: 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 54       pExpr->y.pT
5b90: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
5ba0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5bb0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
5bc0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 45  Cursor;.      pE
5bd0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
5be0: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
5bf0: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
5c00: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
5c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  }.#endif /* defi
5c30: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
5c40: 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f  E_UPDATE_DELETE_
5c50: 4c 49 4d 49 54 29 0a 20 20 20 20 20 20 20 20 20  LIMIT).         
5c60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
5c70: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5c80: 59 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 20  Y) */..    /* A 
5c90: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 74 61 62  ID.    ** Or tab
5cc0: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75  le name and colu
5cd0: 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 49 44 2e 49  mn name:    ID.I
5ce0: 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61  D.    ** Or a da
5cf0: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
5d00: 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44  d column:  ID.ID
5d10: 2e 49 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .ID.    **.    *
5d20: 2a 20 54 68 65 20 54 4b 5f 49 44 20 61 6e 64 20  * The TK_ID and 
5d30: 54 4b 5f 4f 55 54 20 63 61 73 65 73 20 61 72 65  TK_OUT cases are
5d40: 20 63 6f 6d 62 69 6e 65 64 20 73 6f 20 74 68 61   combined so tha
5d50: 74 20 74 68 65 72 65 20 77 69 6c 6c 20 6f 6e 6c  t there will onl
5d60: 79 0a 20 20 20 20 2a 2a 20 62 65 20 6f 6e 65 20  y.    ** be one 
5d70: 63 61 6c 6c 20 74 6f 20 6c 6f 6f 6b 75 70 4e 61  call to lookupNa
5d80: 6d 65 28 29 2e 20 20 54 68 65 6e 20 74 68 65 20  me().  Then the 
5d90: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 69 6e  compiler will in
5da0: 2d 6c 69 6e 65 20 0a 20 20 20 20 2a 2a 20 6c 6f  -line .    ** lo
5db0: 6f 6b 75 70 4e 61 6d 65 28 29 20 66 6f 72 20 61  okupName() for a
5dc0: 20 73 69 7a 65 20 72 65 64 75 63 74 69 6f 6e 20   size reduction 
5dd0: 61 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  and performance 
5de0: 69 6e 63 72 65 61 73 65 2e 0a 20 20 20 20 2a 2f  increase..    */
5df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
5e00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
5e10: 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
5e20: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20  char *zColumn;. 
5e30: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
5e40: 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 63  *zTable;.      c
5e50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
5e60: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
5e70: 68 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70  ht;..      if( p
5e80: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  Expr->op==TK_ID 
5e90: 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d  ){.        zDb =
5ea0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 54 61 62   0;.        zTab
5eb0: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
5ec0: 7a 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d  zColumn = pExpr-
5ed0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
5ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5ef0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
5f00: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
5f10: 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61      notValid(pPa
5f20: 72 73 65 2c 20 70 4e 43 2c 20 22 74 68 65 20 5c  rse, pNC, "the \
5f30: 22 2e 5c 22 20 6f 70 65 72 61 74 6f 72 22 2c 20  ".\" operator", 
5f40: 4e 43 5f 49 64 78 45 78 70 72 29 3b 0a 20 20 20  NC_IdxExpr);.   
5f50: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
5f60: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
5f70: 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d       if( pRight-
5f80: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
5f90: 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b          zDb = 0;
5fa0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5fb0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
5fc0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
5fd0: 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20  _DOT );.        
5fe0: 20 20 7a 44 62 20 3d 20 70 4c 65 66 74 2d 3e 75    zDb = pLeft->u
5ff0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
6000: 20 20 20 70 4c 65 66 74 20 3d 20 70 52 69 67 68     pLeft = pRigh
6010: 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  t->pLeft;.      
6020: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 52 69      pRight = pRi
6030: 67 68 74 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  ght->pRight;.   
6040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
6050: 54 61 62 6c 65 20 3d 20 70 4c 65 66 74 2d 3e 75  Table = pLeft->u
6060: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
6070: 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68   zColumn = pRigh
6080: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
6090: 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41       if( IN_RENA
60a0: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
60b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
60c0: 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70  nameTokenRemap(p
60d0: 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 45  Parse, (void*)pE
60e0: 78 70 72 2c 20 28 76 6f 69 64 2a 29 70 52 69 67  xpr, (void*)pRig
60f0: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ht);.          s
6100: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
6110: 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 28  nRemap(pParse, (
6120: 76 6f 69 64 2a 29 26 70 45 78 70 72 2d 3e 79 2e  void*)&pExpr->y.
6130: 70 54 61 62 2c 20 28 76 6f 69 64 2a 29 70 4c 65  pTab, (void*)pLe
6140: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ft);.        }. 
6150: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
6160: 75 72 6e 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70  urn lookupName(p
6170: 50 61 72 73 65 2c 20 7a 44 62 2c 20 7a 54 61 62  Parse, zDb, zTab
6180: 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 70 4e 43  le, zColumn, pNC
6190: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  , pExpr);.    }.
61a0: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
61b0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20  function names. 
61c0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
61d0: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
61e0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
61f0: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ist = pExpr->x.p
6200: 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20  List;    /* The 
6210: 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f  argument list */
6220: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
6230: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
6240: 78 70 72 20 3a 20 30 3b 20 20 20 20 2f 2a 20 4e  xpr : 0;    /* N
6250: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
6260: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
6270: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
6280: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
6290: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
62a0: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
62b0: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
62c0: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
62d0: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
62e0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
62f0: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
6300: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
6310: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
6320: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
6330: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
6340: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
6350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6370: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75  characters in fu
6380: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
6390: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
63a0: 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  *zId;           
63b0: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
63c0: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   name. */.      
63d0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20  FuncDef *pDef;  
63e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
63f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
6400: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
6410: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
6420: 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
6430: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
6440: 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a  se encoding */..
6450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
6460: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6470: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
6480: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ct) );.      zId
6490: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
64a0: 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20  en;.      nId = 
64b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
64c0: 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66  zId);.      pDef
64d0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
64e0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
64f0: 62 2c 20 7a 49 64 2c 20 6e 2c 20 65 6e 63 2c 20  b, zId, n, enc, 
6500: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
6510: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
6520: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
6530: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
6540: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 2d 32 2c  se->db, zId, -2,
6550: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
6560: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
6570: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
6580: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
6590: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
65a0: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
65b0: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
65c0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
65d0: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
65e0: 3d 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a  = pDef->xFinaliz
65f0: 65 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  e!=0;.        if
6600: 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
6610: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
6620: 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20  UNLIKELY ){.    
6630: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
6640: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
6650: 55 6e 6c 69 6b 65 6c 79 7c 45 50 5f 53 6b 69 70  Unlikely|EP_Skip
6660: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6670: 20 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20   n==2 ){.       
6680: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
6690: 6c 65 20 3d 20 65 78 70 72 50 72 6f 62 61 62 69  le = exprProbabi
66a0: 6c 69 74 79 28 70 4c 69 73 74 2d 3e 61 5b 31 5d  lity(pList->a[1]
66b0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
66c0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
66d0: 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20  iTable<0 ){.    
66e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
66f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6710: 20 20 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65    "second argume
6720: 6e 74 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64  nt to likelihood
6730: 28 29 20 6d 75 73 74 20 62 65 20 61 20 22 0a 20  () must be a ". 
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
6750: 63 6f 6e 73 74 61 6e 74 20 62 65 74 77 65 65 6e  constant between
6760: 20 30 2e 30 20 61 6e 64 20 31 2e 30 22 29 3b 0a   0.0 and 1.0");.
6770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
6780: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
6790: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
67a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
67b0: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
67c0: 45 2d 4f 46 3a 20 52 2d 36 31 33 30 34 2d 32 39  E-OF: R-61304-29
67d0: 34 34 39 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79  449 The unlikely
67e0: 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  (X) function is.
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65              ** e
6800: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 69 6b  quivalent to lik
6810: 65 6c 69 68 6f 6f 64 28 58 2c 20 30 2e 30 36 32  elihood(X, 0.062
6820: 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  5)..            
6830: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
6840: 52 2d 30 31 32 38 33 2d 31 31 36 33 36 20 54 68  R-01283-11636 Th
6850: 65 20 75 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75  e unlikely(X) fu
6860: 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20  nction is.      
6870: 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74 2d 68        ** short-h
6880: 61 6e 64 20 66 6f 72 20 6c 69 6b 65 6c 69 68 6f  and for likeliho
6890: 6f 64 28 58 2c 30 2e 30 36 32 35 29 2e 0a 20 20  od(X,0.0625)..  
68a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49            ** EVI
68b0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 38 35  DENCE-OF: R-3685
68c0: 30 2d 33 34 31 32 37 20 54 68 65 20 6c 69 6b 65  0-34127 The like
68d0: 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69  ly(X) function i
68e0: 73 20 73 68 6f 72 74 2d 68 61 6e 64 0a 20 20 20  s short-hand.   
68f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20           ** for 
6900: 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 39  likelihood(X,0.9
6910: 33 37 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20  375)..          
6920: 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
6930: 3a 20 52 2d 35 33 34 33 36 2d 34 30 39 37 33 20  : R-53436-40973 
6940: 54 68 65 20 6c 69 6b 65 6c 79 28 58 29 20 66 75  The likely(X) fu
6950: 6e 63 74 69 6f 6e 20 69 73 20 65 71 75 69 76 61  nction is equiva
6960: 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  lent.           
6970: 20 2a 2a 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f   ** to likelihoo
6980: 64 28 58 2c 30 2e 39 33 37 35 29 2e 20 2a 2f 0a  d(X,0.9375). */.
6990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
69a0: 55 4e 49 4e 47 3a 20 75 6e 6c 69 6b 65 6c 79 28  UNING: unlikely(
69b0: 29 20 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73  ) probability is
69c0: 20 30 2e 30 36 32 35 2e 20 20 6c 69 6b 65 6c 79   0.0625.  likely
69d0: 28 29 20 69 73 20 30 2e 39 33 37 35 20 2a 2f 0a  () is 0.9375 */.
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
69f0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 44 65 66  r->iTable = pDef
6a00: 2d 3e 7a 4e 61 6d 65 5b 30 5d 3d 3d 27 75 27 20  ->zName[0]=='u' 
6a10: 3f 20 38 33 38 38 36 30 38 20 3a 20 31 32 35 38  ? 8388608 : 1258
6a20: 32 39 31 32 30 3b 0a 20 20 20 20 20 20 20 20 20  29120;.         
6a30: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 0a   }             .
6a40: 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65          }.#ifnde
6a50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
6a60: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20  THORIZATION.    
6a70: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
6a80: 69 6e 74 20 61 75 74 68 20 3d 20 73 71 6c 69 74  int auth = sqlit
6a90: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
6aa0: 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54  se, SQLITE_FUNCT
6ab0: 49 4f 4e 2c 20 30 2c 70 44 65 66 2d 3e 7a 4e 61  ION, 0,pDef->zNa
6ac0: 6d 65 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20  me,0);.         
6ad0: 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54   if( auth!=SQLIT
6ae0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
6af0: 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51      if( auth==SQ
6b00: 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20  LITE_DENY ){.   
6b10: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6b20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6b30: 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a  e, "not authoriz
6b40: 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69  ed to use functi
6b50: 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20  on: %s",.       
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6b80: 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Def->zName);.   
6b90: 20 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e             pNC->
6ba0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
6bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6bc0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
6bd0: 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _NULL;.         
6be0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
6bf0: 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  une;.          }
6c00: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
6c10: 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44  f.        if( pD
6c20: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
6c30: 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e  (SQLITE_FUNC_CON
6c40: 53 54 41 4e 54 7c 53 51 4c 49 54 45 5f 46 55 4e  STANT|SQLITE_FUN
6c50: 43 5f 53 4c 4f 43 48 4e 47 29 20 29 7b 0a 20 20  C_SLOCHNG) ){.  
6c60: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 74          /* For t
6c70: 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
6c80: 68 65 20 45 50 5f 43 6f 6e 73 74 46 75 6e 63 20  he EP_ConstFunc 
6c90: 66 6c 61 67 2c 20 64 61 74 65 20 61 6e 64 20 74  flag, date and t
6ca0: 69 6d 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ime.          **
6cb0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6f   functions and o
6cc0: 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  ther functions t
6cd0: 68 61 74 20 63 68 61 6e 67 65 20 73 6c 6f 77 6c  hat change slowl
6ce0: 79 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  y are considered
6cf0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
6d00: 6e 73 74 61 6e 74 20 62 65 63 61 75 73 65 20 74  nstant because t
6d10: 68 65 79 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hey are constant
6d20: 20 66 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f   for the duratio
6d30: 6e 20 6f 66 20 6f 6e 65 20 71 75 65 72 79 20 2a  n of one query *
6d40: 2f 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  /.          Expr
6d50: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
6d60: 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 3b  r,EP_ConstFunc);
6d70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6d80: 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
6d90: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
6da0: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 29 3d  _FUNC_CONSTANT)=
6db0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6dc0: 2f 2a 20 44 61 74 65 2f 74 69 6d 65 20 66 75 6e  /* Date/time fun
6dd0: 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20  ctions that use 
6de0: 27 6e 6f 77 27 2c 20 61 6e 64 20 6f 74 68 65 72  'now', and other
6df0: 20 66 75 6e 63 74 69 6f 6e 73 20 6c 69 6b 65 0a   functions like.
6e00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c            ** sql
6e10: 69 74 65 5f 76 65 72 73 69 6f 6e 28 29 20 74 68  ite_version() th
6e20: 61 74 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  at might change 
6e30: 6f 76 65 72 20 74 69 6d 65 20 63 61 6e 6e 6f 74  over time cannot
6e40: 20 62 65 20 75 73 65 64 0a 20 20 20 20 20 20 20   be used.       
6e50: 20 20 20 2a 2a 20 69 6e 20 61 6e 20 69 6e 64 65     ** in an inde
6e60: 78 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  x. */.          
6e70: 6e 6f 74 56 61 6c 69 64 28 70 50 61 72 73 65 2c  notValid(pParse,
6e80: 20 70 4e 43 2c 20 22 6e 6f 6e 2d 64 65 74 65 72   pNC, "non-deter
6e90: 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f  ministic functio
6ea0: 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ns",.           
6eb0: 20 20 20 20 20 20 20 20 4e 43 5f 49 64 78 45 78          NC_IdxEx
6ec0: 70 72 7c 4e 43 5f 50 61 72 74 49 64 78 29 3b 0a  pr|NC_PartIdx);.
6ed0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6ee0: 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e    if( (pDef->fun
6ef0: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
6f00: 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c 29 21 3d  FUNC_INTERNAL)!=
6f10: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 50  0.         && pP
6f20: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 0a  arse->nested==0.
6f30: 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
6f40: 74 65 33 43 6f 6e 66 69 67 2e 62 49 6e 74 65 72  te3Config.bInter
6f50: 6e 61 6c 46 75 6e 63 74 69 6f 6e 73 3d 3d 30 0a  nalFunctions==0.
6f60: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
6f70: 20 20 20 20 20 2f 2a 20 49 6e 74 65 72 6e 61 6c       /* Internal
6f80: 2d 75 73 65 2d 6f 6e 6c 79 20 66 75 6e 63 74 69  -use-only functi
6f90: 6f 6e 73 20 61 72 65 20 64 69 73 61 6c 6c 6f 77  ons are disallow
6fa0: 65 64 20 75 6e 6c 65 73 73 20 74 68 65 0a 20 20  ed unless the.  
6fb0: 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 20 69          ** SQL i
6fc0: 73 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65 64  s being compiled
6fd0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4e 65   using sqlite3Ne
6fe0: 73 74 65 64 50 61 72 73 65 28 29 20 2a 2f 0a 20  stedParse() */. 
6ff0: 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68           no_such
7000: 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  _func = 1;.     
7010: 20 20 20 20 20 70 44 65 66 20 3d 20 30 3b 0a 20       pDef = 0;. 
7020: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7030: 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 49  ..      if( 0==I
7040: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
7050: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
7060: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
7070: 43 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  C.        assert
7080: 28 20 69 73 5f 61 67 67 3d 3d 30 20 7c 7c 20 28  ( is_agg==0 || (
7090: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
70a0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
70b0: 4e 4d 41 58 29 0a 20 20 20 20 20 20 20 20 20 20  NMAX).          
70c0: 7c 7c 20 28 70 44 65 66 2d 3e 78 56 61 6c 75 65  || (pDef->xValue
70d0: 3d 3d 30 20 26 26 20 70 44 65 66 2d 3e 78 49 6e  ==0 && pDef->xIn
70e0: 76 65 72 73 65 3d 3d 30 29 0a 20 20 20 20 20 20  verse==0).      
70f0: 20 20 20 20 7c 7c 20 28 70 44 65 66 2d 3e 78 56      || (pDef->xV
7100: 61 6c 75 65 20 26 26 20 70 44 65 66 2d 3e 78 49  alue && pDef->xI
7110: 6e 76 65 72 73 65 20 26 26 20 70 44 65 66 2d 3e  nverse && pDef->
7120: 78 53 46 75 6e 63 20 26 26 20 70 44 65 66 2d 3e  xSFunc && pDef->
7130: 78 46 69 6e 61 6c 69 7a 65 29 0a 20 20 20 20 20  xFinalize).     
7140: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
7150: 28 20 70 44 65 66 20 26 26 20 70 44 65 66 2d 3e  ( pDef && pDef->
7160: 78 56 61 6c 75 65 3d 3d 30 20 26 26 20 45 78 70  xValue==0 && Exp
7170: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
7180: 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  pr, EP_WinFunc) 
7190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
71a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
71b0: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
71c0: 20 20 20 20 22 25 2e 2a 73 28 29 20 6d 61 79 20      "%.*s() may 
71d0: 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61  not be used as a
71e0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
71f0: 22 2c 20 6e 49 64 2c 20 7a 49 64 0a 20 20 20 20  ", nId, zId.    
7200: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
7210: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
7220: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7230: 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ( .             
7240: 20 28 69 73 5f 61 67 67 20 26 26 20 28 70 4e 43   (is_agg && (pNC
7250: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 41  ->ncFlags & NC_A
7260: 6c 6c 6f 77 41 67 67 29 3d 3d 30 29 0a 20 20 20  llowAgg)==0).   
7270: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 5f 61          || (is_a
7280: 67 67 20 26 26 20 28 70 44 65 66 2d 3e 66 75 6e  gg && (pDef->fun
7290: 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
72a0: 4e 43 5f 57 49 4e 44 4f 57 29 20 26 26 20 21 70  NC_WINDOW) && !p
72b0: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 29 0a 20 20  Expr->y.pWin).  
72c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 5f           || (is_
72d0: 61 67 67 20 26 26 20 70 45 78 70 72 2d 3e 79 2e  agg && pExpr->y.
72e0: 70 57 69 6e 20 26 26 20 28 70 4e 43 2d 3e 6e 63  pWin && (pNC->nc
72f0: 46 6c 61 67 73 20 26 20 4e 43 5f 41 6c 6c 6f 77  Flags & NC_Allow
7300: 57 69 6e 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  Win)==0).       
7310: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
7320: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
7330: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
7340: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
7350: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49  & SQLITE_FUNC_WI
7360: 4e 44 4f 57 29 20 7c 7c 20 70 45 78 70 72 2d 3e  NDOW) || pExpr->
7370: 79 2e 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20  y.pWin ){.      
7380: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 77        zType = "w
7390: 69 6e 64 6f 77 22 3b 0a 20 20 20 20 20 20 20 20  indow";.        
73a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
73b0: 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61 67       zType = "ag
73c0: 67 72 65 67 61 74 65 22 3b 0a 20 20 20 20 20 20  gregate";.      
73d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
73e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
73f0: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
7400: 6f 66 20 25 73 20 66 75 6e 63 74 69 6f 6e 20 25  of %s function %
7410: 2e 2a 73 28 29 22 2c 7a 54 79 70 65 2c 6e 49 64  .*s()",zType,nId
7420: 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20  ,zId);.         
7430: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
7440: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
7450: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65   0;.        }.#e
7460: 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
7470: 28 69 73 5f 61 67 67 20 26 26 20 28 70 4e 43 2d  (is_agg && (pNC-
7480: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 41 6c  >ncFlags & NC_Al
7490: 6c 6f 77 41 67 67 29 3d 3d 30 29 20 29 7b 0a 20  lowAgg)==0) ){. 
74a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
74b0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
74c0: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
74d0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
74e0: 2a 73 28 29 22 2c 6e 49 64 2c 7a 49 64 29 3b 0a  *s()",nId,zId);.
74f0: 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e            pNC->n
7500: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
7510: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
7520: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
7530: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e        else if( n
7540: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 26 26 20 70  o_such_func && p
7550: 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e  Parse->db->init.
7560: 62 75 73 79 3d 3d 30 0a 23 69 66 64 65 66 20 53  busy==0.#ifdef S
7570: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b  QLITE_ENABLE_UNK
7580: 4e 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f  NOWN_SQL_FUNCTIO
7590: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
75a0: 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 65      && pParse->e
75b0: 78 70 6c 61 69 6e 3d 3d 30 0a 23 65 6e 64 69 66  xplain==0.#endif
75c0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
75d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
75e0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
75f0: 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a  o such function:
7600: 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64   %.*s", nId, zId
7610: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  );.          pNC
7620: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
7630: 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e    }else if( wron
7640: 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20  g_num_args ){.  
7650: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7660: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22  rrorMsg(pParse,"
7670: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
7680: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e  arguments to fun
7690: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20  ction %.*s()",. 
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49                nI
76b0: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
76c0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
76d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
76e0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
76f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7700: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
7710: 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63           pNC->nc
7720: 46 6c 61 67 73 20 26 3d 20 7e 28 70 45 78 70 72  Flags &= ~(pExpr
7730: 2d 3e 79 2e 70 57 69 6e 20 3f 20 4e 43 5f 41 6c  ->y.pWin ? NC_Al
7740: 6c 6f 77 57 69 6e 20 3a 20 4e 43 5f 41 6c 6c 6f  lowWin : NC_Allo
7750: 77 41 67 67 29 3b 0a 23 65 6c 73 65 0a 20 20 20  wAgg);.#else.   
7760: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c         pNC->ncFl
7770: 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77  ags &= ~NC_Allow
7780: 41 67 67 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Agg;.#endif.    
7790: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
77a0: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
77b0: 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c  xprList(pWalker,
77c0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69   pList);.      i
77d0: 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 23 69 66  f( is_agg ){.#if
77e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
77f0: 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20  _WINDOWFUNC.    
7800: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 79      if( pExpr->y
7810: 2e 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  .pWin ){.       
7820: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20     Select *pSel 
7830: 3d 20 70 4e 43 2d 3e 70 57 69 6e 53 65 6c 65 63  = pNC->pWinSelec
7840: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
7850: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
7860: 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d  (pWalker, pExpr-
7870: 3e 79 2e 70 57 69 6e 2d 3e 70 50 61 72 74 69 74  >y.pWin->pPartit
7880: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ion);.          
7890: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c  sqlite3WalkExprL
78a0: 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ist(pWalker, pEx
78b0: 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 4f 72 64  pr->y.pWin->pOrd
78c0: 65 72 42 79 29 3b 0a 20 20 20 20 20 20 20 20 20  erBy);.         
78d0: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
78e0: 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d  (pWalker, pExpr-
78f0: 3e 79 2e 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  >y.pWin->pFilter
7900: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
7910: 69 74 65 33 57 69 6e 64 6f 77 55 70 64 61 74 65  ite3WindowUpdate
7920: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
7930: 57 69 6e 44 65 66 6e 2c 20 70 45 78 70 72 2d 3e  WinDefn, pExpr->
7940: 79 2e 70 57 69 6e 2c 20 70 44 65 66 29 3b 0a 20  y.pWin, pDef);. 
7950: 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d           if( 0==
7960: 70 53 65 6c 2d 3e 70 57 69 6e 20 0a 20 20 20 20  pSel->pWin .    
7970: 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71 6c         || 0==sql
7980: 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61 72  ite3WindowCompar
7990: 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e  e(pParse, pSel->
79a0: 70 57 69 6e 2c 20 70 45 78 70 72 2d 3e 79 2e 70  pWin, pExpr->y.p
79b0: 57 69 6e 29 20 0a 20 20 20 20 20 20 20 20 20 20  Win) .          
79c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
79d0: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 4e  Expr->y.pWin->pN
79e0: 65 78 74 57 69 6e 20 3d 20 70 53 65 6c 2d 3e 70  extWin = pSel->p
79f0: 57 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Win;.           
7a00: 20 70 53 65 6c 2d 3e 70 57 69 6e 20 3d 20 70 45   pSel->pWin = pE
7a10: 78 70 72 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 20  xpr->y.pWin;.   
7a20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7a30: 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20     pNC->ncFlags 
7a40: 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b 0a  |= NC_AllowWin;.
7a50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
7a60: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
7a70: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
7a80: 2f 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  /.        {.    
7a90: 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78        NameContex
7aa0: 74 20 2a 70 4e 43 32 20 3d 20 70 4e 43 3b 0a 20  t *pNC2 = pNC;. 
7ab0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7ac0: 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43  op = TK_AGG_FUNC
7ad0: 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 20 20  TION;.          
7ae0: 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 30 3b 0a  pExpr->op2 = 0;.
7af0: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
7b00: 20 70 4e 43 32 20 26 26 20 21 73 71 6c 69 74 65   pNC2 && !sqlite
7b10: 33 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69  3FunctionUsesThi
7b20: 73 53 72 63 28 70 45 78 70 72 2c 20 70 4e 43 32  sSrc(pExpr, pNC2
7b30: 2d 3e 70 53 72 63 4c 69 73 74 29 20 29 7b 0a 20  ->pSrcList) ){. 
7b40: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
7b50: 2d 3e 6f 70 32 2b 2b 3b 0a 20 20 20 20 20 20 20  ->op2++;.       
7b60: 20 20 20 20 20 70 4e 43 32 20 3d 20 70 4e 43 32       pNC2 = pNC2
7b70: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
7b80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
7b90: 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 29  ssert( pDef!=0 )
7ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7bb0: 70 4e 43 32 20 29 7b 0a 20 20 20 20 20 20 20 20  pNC2 ){.        
7bc0: 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
7bd0: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 3d 3d  TE_FUNC_MINMAX==
7be0: 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a  NC_MinMaxAgg );.
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
7c00: 63 61 73 65 28 20 28 70 44 65 66 2d 3e 66 75 6e  case( (pDef->fun
7c10: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
7c20: 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 21 3d 30 20  FUNC_MINMAX)!=0 
7c30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
7c40: 4e 43 32 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20  NC2->ncFlags |= 
7c50: 4e 43 5f 48 61 73 41 67 67 20 7c 20 28 70 44 65  NC_HasAgg | (pDe
7c60: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
7c70: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
7c80: 58 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 7d  X);..          }
7c90: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  .          pNC->
7ca0: 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c  ncFlags |= NC_Al
7cb0: 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 20 20  lowAgg;.        
7cc0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
7cd0: 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70  /* FIX ME:  Comp
7ce0: 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ute pExpr->affin
7cf0: 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ity based on the
7d00: 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e   expected return
7d10: 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f  .      ** type o
7d20: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a  f the function .
7d30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
7d40: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
7d50: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
7d60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
7d70: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
7d80: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
7d90: 20 54 4b 5f 45 58 49 53 54 53 3a 20 20 74 65 73   TK_EXISTS:  tes
7da0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
7db0: 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23  ==TK_EXISTS );.#
7dc0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
7dd0: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  K_IN: {.      te
7de0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
7df0: 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20  p==TK_IN );.    
7e00: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
7e10: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7e20: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
7e30: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d        int nRef =
7e40: 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20   pNC->nRef;.    
7e50: 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61      notValid(pPa
7e60: 72 73 65 2c 20 70 4e 43 2c 20 22 73 75 62 71 75  rse, pNC, "subqu
7e70: 65 72 69 65 73 22 2c 20 4e 43 5f 49 73 43 68 65  eries", NC_IsChe
7e80: 63 6b 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43  ck|NC_PartIdx|NC
7e90: 5f 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20 20  _IdxExpr);.     
7ea0: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65     sqlite3WalkSe
7eb0: 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 45  lect(pWalker, pE
7ec0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
7ed0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
7ee0: 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66   pNC->nRef>=nRef
7ef0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
7f00: 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20  nRef!=pNC->nRef 
7f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
7f20: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
7f30: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
7f40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  );.          pNC
7f50: 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f  ->ncFlags |= NC_
7f60: 56 61 72 53 65 6c 65 63 74 3b 0a 20 20 20 20 20  VarSelect;.     
7f70: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7f80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7f90: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
7fa0: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 6e 6f  ABLE: {.      no
7fb0: 74 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70  tValid(pParse, p
7fc0: 4e 43 2c 20 22 70 61 72 61 6d 65 74 65 72 73 22  NC, "parameters"
7fd0: 2c 20 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f  , NC_IsCheck|NC_
7fe0: 50 61 72 74 49 64 78 7c 4e 43 5f 49 64 78 45 78  PartIdx|NC_IdxEx
7ff0: 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  pr);.      break
8000: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8010: 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65   TK_IS:.    case
8020: 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20   TK_ISNOT: {.   
8030: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b     Expr *pRight;
8040: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
8050: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8060: 70 45 78 70 72 2c 20 45 50 5f 52 65 64 75 63 65  pExpr, EP_Reduce
8070: 64 29 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 48  d) );.      /* H
8080: 61 6e 64 6c 65 20 73 70 65 63 69 61 6c 20 63 61  andle special ca
8090: 73 65 73 20 6f 66 20 22 78 20 49 53 20 54 52 55  ses of "x IS TRU
80a0: 45 22 2c 20 22 78 20 49 53 20 46 41 4c 53 45 22  E", "x IS FALSE"
80b0: 2c 20 22 78 20 49 53 20 4e 4f 54 20 54 52 55 45  , "x IS NOT TRUE
80c0: 22 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ",.      ** and 
80d0: 22 78 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 22  "x IS NOT FALSE"
80e0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28  . */.      if( (
80f0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
8100: 70 52 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f  pRight)->op==TK_
8110: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ID ){.        in
8120: 74 20 72 63 20 3d 20 72 65 73 6f 6c 76 65 45 78  t rc = resolveEx
8130: 70 72 53 74 65 70 28 70 57 61 6c 6b 65 72 2c 20  prStep(pWalker, 
8140: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
8150: 20 69 66 28 20 72 63 3d 3d 57 52 43 5f 41 62 6f   if( rc==WRC_Abo
8160: 72 74 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  rt ) return WRC_
8170: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 69  Abort;.        i
8180: 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  f( pRight->op==T
8190: 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20  K_TRUEFALSE ){. 
81a0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
81b0: 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b  op2 = pExpr->op;
81c0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
81d0: 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55 54 48 3b  ->op = TK_TRUTH;
81e0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
81f0: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
8200: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8210: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
8220: 74 68 72 75 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  thru */.    }.  
8230: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
8240: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  N:.    case TK_E
8250: 51 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  Q:.    case TK_N
8260: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  E:.    case TK_L
8270: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
8280: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
8290: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
82a0: 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E: {.      int n
82b0: 4c 65 66 74 2c 20 6e 52 69 67 68 74 3b 0a 20 20  Left, nRight;.  
82c0: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
82d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
82e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
82f0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
8300: 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20  Left!=0 );.     
8310: 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33   nLeft = sqlite3
8320: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
8330: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
8340: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
8350: 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29 7b  p==TK_BETWEEN ){
8360: 0a 20 20 20 20 20 20 20 20 6e 52 69 67 68 74 20  .        nRight 
8370: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
8380: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 78  torSize(pExpr->x
8390: 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  .pList->a[0].pEx
83a0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
83b0: 20 6e 52 69 67 68 74 3d 3d 6e 4c 65 66 74 20 29   nRight==nLeft )
83c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52 69 67  {.          nRig
83d0: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
83e0: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
83f0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
8400: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
8410: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
8420: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
8430: 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20  Expr->pRight!=0 
8440: 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 69 67 68  );.        nRigh
8450: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
8460: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
8470: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8480: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 65 66  }.      if( nLef
8490: 74 21 3d 6e 52 69 67 68 74 20 29 7b 0a 20 20 20  t!=nRight ){.   
84a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
84b0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
84c0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
84d0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
84e0: 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 20  TK_NE );.       
84f0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
8500: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20  ->op==TK_LT );. 
8510: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
8520: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
8530: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  E );.        tes
8540: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
8550: 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20  ==TK_GT );.     
8560: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
8570: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b  pr->op==TK_GE );
8580: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
8590: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
85a0: 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _IS );.        t
85b0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
85c0: 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
85d0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
85e0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
85f0: 42 45 54 57 45 45 4e 20 29 3b 0a 20 20 20 20 20  BETWEEN );.     
8600: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8610: 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20  sg(pParse, "row 
8620: 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b  value misused");
8630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
8640: 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20 7d  reak; .    }.  }
8650: 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 72 73  .  return (pPars
8660: 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73  e->nErr || pPars
8670: 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
8680: 6c 65 64 29 20 3f 20 57 52 43 5f 41 62 6f 72 74  led) ? WRC_Abort
8690: 20 3a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b   : WRC_Continue;
86a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74  .}../*.** pEList
86b0: 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78   is a list of ex
86c0: 70 72 65 73 73 69 6f 6e 73 20 77 68 69 63 68 20  pressions which 
86d0: 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 72  are really the r
86e0: 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65  esult set of the
86f0: 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61  .** a SELECT sta
8700: 74 65 6d 65 6e 74 2e 20 20 70 45 20 69 73 20 61  tement.  pE is a
8710: 20 74 65 72 6d 20 69 6e 20 61 6e 20 4f 52 44 45   term in an ORDE
8720: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
8730: 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 54 68 69 73   clause..** This
8740: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
8750: 74 6f 20 73 65 65 20 69 66 20 70 45 20 69 73 20  to see if pE is 
8760: 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66  a simple identif
8770: 69 65 72 20 77 68 69 63 68 20 63 6f 72 72 65 73  ier which corres
8780: 70 6f 6e 64 73 0a 2a 2a 20 74 6f 20 74 68 65 20  ponds.** to the 
8790: 41 53 2d 6e 61 6d 65 20 6f 66 20 6f 6e 65 20 6f  AS-name of one o
87a0: 66 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74  f the terms of t
87b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
87c0: 73 74 2e 20 20 49 66 20 69 74 20 69 73 2c 0a 2a  st.  If it is,.*
87d0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
87e0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
87f0: 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e   between 1 and N
8800: 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20   where N is the 
8810: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6c 65  number of.** ele
8820: 6d 65 6e 74 73 20 69 6e 20 70 45 4c 69 73 74 2c  ments in pEList,
8830: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
8840: 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65  o the matching e
8850: 6e 74 72 79 2e 20 20 49 66 20 74 68 65 72 65 20  ntry.  If there 
8860: 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20  is.** no match, 
8870: 6f 72 20 69 66 20 70 45 20 69 73 20 6e 6f 74 20  or if pE is not 
8880: 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66  a simple identif
8890: 69 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ier, then this r
88a0: 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
88b0: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 45 4c 69 73 74   0..**.** pEList
88c0: 20 68 61 73 20 62 65 65 6e 20 72 65 73 6f 6c 76   has been resolv
88d0: 65 64 2e 20 20 70 45 20 68 61 73 20 6e 6f 74 2e  ed.  pE has not.
88e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
88f0: 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 0a 20 20  esolveAsName(.  
8900: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8910: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8920: 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20  ntext for error 
8930: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 45 78  messages */.  Ex
8940: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
8950: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72   /* List of expr
8960: 65 73 73 69 6f 6e 73 20 74 6f 20 73 63 61 6e 20  essions to scan 
8970: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20 20  */.  Expr *pE   
8980: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
8990: 73 73 69 6f 6e 20 77 65 20 61 72 65 20 74 72 79  ssion we are try
89a0: 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a  ing to match */.
89b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
89c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
89d0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 55 4e  counter */..  UN
89e0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
89f0: 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28 20 70  Parse);..  if( p
8a00: 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  E->op==TK_ID ){.
8a10: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d      char *zCol =
8a20: 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20   pE->u.zToken;. 
8a30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
8a40: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
8a50: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
8a60: 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69  As = pEList->a[i
8a70: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
8a80: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
8a90: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
8aa0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
8ab0: 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b       return i+1;
8ac0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8ad0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8ae0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20  ../*.** pE is a 
8af0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78  pointer to an ex
8b00: 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69  pression which i
8b10: 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  s a single term 
8b20: 69 6e 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  in the.** ORDER 
8b30: 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  BY of a compound
8b40: 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20 65 78   SELECT.  The ex
8b50: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 6e 6f 74  pression has not
8b60: 20 62 65 65 6e 0a 2a 2a 20 6e 61 6d 65 20 72 65   been.** name re
8b70: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 74  solved..**.** At
8b80: 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20   the point this 
8b90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
8ba0: 64 2c 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e  d, we already kn
8bb0: 6f 77 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f  ow that the.** O
8bc0: 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73 20  RDER BY term is 
8bd0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69  not an integer i
8be0: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 72 65  ndex into the re
8bf0: 73 75 6c 74 20 73 65 74 2e 20 20 54 68 61 74 0a  sult set.  That.
8c00: 2a 2a 20 63 61 73 65 20 69 73 20 68 61 6e 64 6c  ** case is handl
8c10: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
8c20: 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  g routine..**.**
8c30: 20 41 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63   Attempt to matc
8c40: 68 20 70 45 20 61 67 61 69 6e 73 74 20 72 65 73  h pE against res
8c50: 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20  ult set columns 
8c60: 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  in the left-most
8c70: 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65  .** SELECT state
8c80: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 74 68  ment.  Return th
8c90: 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65  e index i of the
8ca0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
8cb0: 2c 0a 2a 2a 20 61 73 20 61 6e 20 69 6e 64 69 63  ,.** as an indic
8cc0: 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c  ation to the cal
8cd0: 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f 75  ler that it shou
8ce0: 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65 20 69  ld sort by the i
8cf0: 2d 74 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54  -th column..** T
8d00: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  he left-most col
8d10: 75 6d 6e 20 69 73 20 31 2e 20 20 49 6e 20 6f 74  umn is 1.  In ot
8d20: 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 76  her words, the v
8d30: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
8d40: 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 69 6e 74   the.** same int
8d50: 65 67 65 72 20 76 61 6c 75 65 20 74 68 61 74 20  eger value that 
8d60: 77 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  would be used in
8d70: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
8d80: 6e 74 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a  nt to indicate.*
8d90: 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a  * the column..**
8da0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
8db0: 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e  no match, return
8dc0: 20 30 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69   0.  Return -1 i
8dd0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8de0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
8df0: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54   resolveOrderByT
8e00: 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20  ermToExprList(. 
8e10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
8e20: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
8e30: 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
8e40: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53   messages */.  S
8e50: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
8e60: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
8e70: 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74  statement with t
8e80: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
8e90: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  se */.  Expr *pE
8ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
8eb0: 65 20 73 70 65 63 69 66 69 63 20 4f 52 44 45 52  e specific ORDER
8ec0: 20 42 59 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20   BY term */.){. 
8ed0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
8ee0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
8ef0: 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ter */.  ExprLis
8f00: 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54  t *pEList;  /* T
8f10: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
8f20: 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  e result set */.
8f30: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63    NameContext nc
8f40: 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e  ;    /* Name con
8f50: 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69  text for resolvi
8f60: 6e 67 20 70 45 20 2a 2f 0a 20 20 73 71 6c 69 74  ng pE */.  sqlit
8f70: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 2f 2a  e3 *db;       /*
8f80: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
8f90: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  tion */.  int rc
8fa0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
8fb0: 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
8fc0: 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
8fd0: 2f 0a 20 20 75 38 20 73 61 76 65 64 53 75 70 70  /.  u8 savedSupp
8fe0: 45 72 72 3b 20 20 20 2f 2a 20 53 61 76 65 64 20  Err;   /* Saved 
8ff0: 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 73 75 70  value of db->sup
9000: 70 72 65 73 73 45 72 72 20 2a 2f 0a 0a 20 20 61  pressErr */..  a
9010: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 45 78  ssert( sqlite3Ex
9020: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
9030: 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70 45 4c 69  &i)==0 );.  pELi
9040: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45  st = pSelect->pE
9050: 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f  List;..  /* Reso
9060: 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e  lve all names in
9070: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
9080: 72 6d 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  rm expression.  
9090: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c  */.  memset(&nc,
90a0: 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b   0, sizeof(nc));
90b0: 0a 20 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70  .  nc.pParse = p
90c0: 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63  Parse;.  nc.pSrc
90d0: 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  List = pSelect->
90e0: 70 53 72 63 3b 0a 20 20 6e 63 2e 75 4e 43 2e 70  pSrc;.  nc.uNC.p
90f0: 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b 0a  EList = pEList;.
9100: 20 20 6e 63 2e 6e 63 46 6c 61 67 73 20 3d 20 4e    nc.ncFlags = N
9110: 43 5f 41 6c 6c 6f 77 41 67 67 7c 4e 43 5f 55 45  C_AllowAgg|NC_UE
9120: 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e 45 72 72 20  List;.  nc.nErr 
9130: 3d 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  = 0;.  db = pPar
9140: 73 65 2d 3e 64 62 3b 0a 20 20 73 61 76 65 64 53  se->db;.  savedS
9150: 75 70 70 45 72 72 20 3d 20 64 62 2d 3e 73 75 70  uppErr = db->sup
9160: 70 72 65 73 73 45 72 72 3b 0a 20 20 64 62 2d 3e  pressErr;.  db->
9170: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 31 3b  suppressErr = 1;
9180: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52  .  rc = sqlite3R
9190: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
91a0: 26 6e 63 2c 20 70 45 29 3b 0a 20 20 64 62 2d 3e  &nc, pE);.  db->
91b0: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 73 61  suppressErr = sa
91c0: 76 65 64 53 75 70 70 45 72 72 3b 0a 20 20 69 66  vedSuppErr;.  if
91d0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
91e0: 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 6d 61  ..  /* Try to ma
91f0: 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  tch the ORDER BY
9200: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
9210: 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  nst an expressio
9220: 6e 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  n.  ** in the re
9230: 73 75 6c 74 20 73 65 74 2e 20 20 52 65 74 75 72  sult set.  Retur
9240: 6e 20 61 6e 20 31 2d 62 61 73 65 64 20 69 6e 64  n an 1-based ind
9250: 65 78 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69  ex of the matchi
9260: 6e 67 0a 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73  ng.  ** result-s
9270: 65 74 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20  et entry..  */. 
9280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
9290: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
92a0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
92b0: 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
92c0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
92d0: 72 2c 20 70 45 2c 20 2d 31 29 3c 32 20 29 7b 0a  r, pE, -1)<2 ){.
92e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31        return i+1
92f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9300: 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 2c 20 72  * If no match, r
9310: 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65  eturn 0. */.  re
9320: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
9330: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 52 44   Generate an ORD
9340: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
9350: 59 20 74 65 72 6d 20 6f 75 74 2d 6f 66 2d 72 61  Y term out-of-ra
9360: 6e 67 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  nge error..*/.st
9370: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
9380: 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72  eOutOfRangeError
9390: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
93a0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
93b0: 65 20 65 72 72 6f 72 20 63 6f 6e 74 65 78 74 20  e error context 
93c0: 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 77 72  into which to wr
93d0: 69 74 65 20 74 68 65 20 65 72 72 6f 72 20 2a 2f  ite the error */
93e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
93f0: 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 4f 52  Type,     /* "OR
9400: 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20  DER" or "GROUP" 
9410: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
9420: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9430: 68 65 20 69 6e 64 65 78 20 28 31 2d 62 61 73 65  he index (1-base
9440: 64 29 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6f  d) of the term o
9450: 75 74 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20  ut of range */. 
9460: 20 69 6e 74 20 6d 78 20 20 20 20 20 20 20 20 20   int mx         
9470: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65          /* Large
9480: 73 74 20 70 65 72 6d 69 73 73 69 62 6c 65 20 76  st permissible v
9490: 61 6c 75 65 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a  alue of i */.){.
94a0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
94b0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 22  g(pParse, .    "
94c0: 25 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75  %r %s BY term ou
94d0: 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
94e0: 75 6c 64 20 62 65 20 22 0a 20 20 20 20 22 62 65  uld be ".    "be
94f0: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
9500: 20 69 2c 20 7a 54 79 70 65 2c 20 6d 78 29 3b 0a   i, zType, mx);.
9510: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
9520: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
9530: 61 75 73 65 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ause in a compou
9540: 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
9550: 65 6e 74 2e 20 20 20 4d 6f 64 69 66 79 0a 2a 2a  ent.   Modify.**
9560: 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68   each term of th
9570: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
9580: 65 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  e is a constant 
9590: 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20  integer between 
95a0: 31 0a 2a 2a 20 61 6e 64 20 4e 20 77 68 65 72 65  1.** and N where
95b0: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
95c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
95d0: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
95e0: 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  CT..**.** ORDER 
95f0: 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  BY terms that ar
9600: 65 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 74  e already an int
9610: 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61  eger between 1 a
9620: 6e 64 20 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f  nd N are.** unmo
9630: 64 69 66 69 65 64 2e 20 20 4f 52 44 45 52 20 42  dified.  ORDER B
9640: 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  Y terms that are
9650: 20 69 6e 74 65 67 65 72 73 20 6f 75 74 73 69 64   integers outsid
9660: 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a  e the range of.*
9670: 2a 20 31 20 74 68 72 6f 75 67 68 20 4e 20 67 65  * 1 through N ge
9680: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 2e  nerate an error.
9690: 20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73    ORDER BY terms
96a0: 20 74 68 61 74 20 61 72 65 20 65 78 70 72 65 73   that are expres
96b0: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6d 61 74  sions.** are mat
96c0: 63 68 65 64 20 61 67 61 69 6e 73 74 20 72 65 73  ched against res
96d0: 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
96e0: 6f 6e 73 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20  ons of compound 
96f0: 53 45 4c 45 43 54 0a 2a 2a 20 62 65 67 69 6e 6e  SELECT.** beginn
9700: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6c 65 66  ing with the lef
9710: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 61 6e  t-most SELECT an
9720: 64 20 77 6f 72 6b 69 6e 67 20 74 6f 77 61 72 64  d working toward
9730: 20 74 68 65 20 72 69 67 68 74 2e 0a 2a 2a 20 41   the right..** A
9740: 74 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  t the first matc
9750: 68 2c 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  h, the ORDER BY 
9760: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
9770: 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a  ansformed into.*
9780: 2a 20 74 68 65 20 69 6e 74 65 67 65 72 20 63 6f  * the integer co
9790: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  lumn number..**.
97a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
97b0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
97c0: 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  een..*/.static i
97d0: 6e 74 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75  nt resolveCompou
97e0: 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ndOrderBy(.  Par
97f0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9800: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9810: 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72  ntext.  Leave er
9820: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
9830: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
9840: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
9850: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
9860: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ment containing 
9870: 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  the ORDER BY */.
9880: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
9890: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
98a0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
98b0: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
98c0: 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54  *db;.  int moreT
98d0: 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64  oDo = 1;..  pOrd
98e0: 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e  erBy = pSelect->
98f0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
9900: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
9910: 74 75 72 6e 20 30 3b 0a 20 20 64 62 20 3d 20 70  turn 0;.  db = p
9920: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
9930: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
9940: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
9950: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
9960: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
9970: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9980: 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
9990: 69 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  in ORDER BY clau
99a0: 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  se");.    return
99b0: 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   1;.  }.  for(i=
99c0: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
99d0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
99e0: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
99f0: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  one = 0;.  }.  p
9a00: 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 20 3d 20  Select->pNext = 
9a10: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
9a20: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
9a30: 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69     pSelect->pPri
9a40: 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 53 65 6c  or->pNext = pSel
9a50: 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  ect;.    pSelect
9a60: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
9a70: 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  or;.  }.  while(
9a80: 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72 65   pSelect && more
9a90: 54 6f 44 6f 20 29 7b 0a 20 20 20 20 73 74 72 75  ToDo ){.    stru
9aa0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9ab0: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 6d 6f 72   *pItem;.    mor
9ac0: 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20 70  eToDo = 0;.    p
9ad0: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
9ae0: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  >pEList;.    ass
9af0: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
9b00: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
9b10: 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
9b20: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
9b30: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
9b40: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
9b50: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45  ol = -1;.      E
9b60: 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a  xpr *pE, *pDup;.
9b70: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
9b80: 3e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  >done ) continue
9b90: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c  ;.      pE = sql
9ba0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
9bb0: 61 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ate(pItem->pExpr
9bc0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
9bd0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
9be0: 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
9bf0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
9c00: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
9c10: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
9c20: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75         resolveOu
9c30: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50  tOfRangeError(pP
9c40: 61 72 73 65 2c 20 22 4f 52 44 45 52 22 2c 20 69  arse, "ORDER", i
9c50: 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  +1, pEList->nExp
9c60: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
9c70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
9c80: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
9c90: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65         iCol = re
9ca0: 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50 61 72  solveAsName(pPar
9cb0: 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 3b  se, pEList, pE);
9cc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
9cd0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
9ce0: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
9cf0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 2c 20  ExprDup(db, pE, 
9d00: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
9d10: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
9d20: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
9d30: 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29 3b     assert(pDup);
9d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f  .            iCo
9d50: 6c 20 3d 20 72 65 73 6f 6c 76 65 4f 72 64 65 72  l = resolveOrder
9d60: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74  ByTermToExprList
9d70: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
9d80: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
9d90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
9da0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9db0: 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  (db, pDup);.    
9dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
9dd0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
9de0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  {.        /* Con
9df0: 76 65 72 74 20 74 68 65 20 4f 52 44 45 52 20 42  vert the ORDER B
9e00: 59 20 74 65 72 6d 20 69 6e 74 6f 20 61 6e 20 69  Y term into an i
9e10: 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75  nteger column nu
9e20: 6d 62 65 72 20 69 43 6f 6c 2c 0a 20 20 20 20 20  mber iCol,.     
9e30: 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 63 61 72     ** taking car
9e40: 65 20 74 6f 20 70 72 65 73 65 72 76 65 20 74 68  e to preserve th
9e50: 65 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65  e COLLATE clause
9e60: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
9e70: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
9e80: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
9e90: 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
9ea0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
9eb0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
9ec0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e  rn 1;.        pN
9ed0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
9ee0: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
9ef0: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
9f00: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = iCol;.       
9f10: 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 45 78 70   if( pItem->pExp
9f20: 72 3d 3d 70 45 20 29 7b 0a 20 20 20 20 20 20 20  r==pE ){.       
9f30: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
9f40: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
9f50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9f60: 20 45 78 70 72 20 2a 70 50 61 72 65 6e 74 20 3d   Expr *pParent =
9f70: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
9f80: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
9f90: 20 70 50 61 72 65 6e 74 2d 3e 6f 70 3d 3d 54 4b   pParent->op==TK
9fa0: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20  _COLLATE );.    
9fb0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 61        while( pPa
9fc0: 72 65 6e 74 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  rent->pLeft->op=
9fd0: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 20 70 50  =TK_COLLATE ) pP
9fe0: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 2d  arent = pParent-
9ff0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
a000: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
a010: 74 2d 3e 70 4c 65 66 74 3d 3d 70 45 20 29 3b 0a  t->pLeft==pE );.
a020: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 65 6e            pParen
a030: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 3b  t->pLeft = pNew;
a040: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a050: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
a060: 6c 65 74 65 28 64 62 2c 20 70 45 29 3b 0a 20 20  lete(db, pE);.  
a070: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
a080: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
a090: 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20  u16)iCol;.      
a0a0: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
a0b0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
a0c0: 20 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f          moreToDo
a0d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
a0e0: 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20    }.    pSelect 
a0f0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74  = pSelect->pNext
a100: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
a110: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
a120: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; i++){.    if
a130: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
a140: 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  .done==0 ){.    
a150: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a160: 67 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52  g(pParse, "%r OR
a170: 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73  DER BY term does
a180: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22   not match any "
a190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  .            "co
a1a0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
a1b0: 6c 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20  lt set", i+1);. 
a1c0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a1d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a1e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n 0;.}../*.** Ch
a1f0: 65 63 6b 20 65 76 65 72 79 20 74 65 72 6d 20 69  eck every term i
a200: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f  n the ORDER BY o
a210: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
a220: 65 20 70 4f 72 64 65 72 42 79 20 6f 66 0a 2a 2a  e pOrderBy of.**
a230: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
a240: 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e 20 20  ement pSelect.  
a250: 49 66 20 61 6e 79 20 74 65 72 6d 20 69 73 20 72  If any term is r
a260: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a 2a  eference to a.**
a270: 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
a280: 65 73 73 69 6f 6e 20 28 61 73 20 64 65 74 65 72  ession (as deter
a290: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 45 78 70  mined by the Exp
a2a0: 72 4c 69 73 74 2e 61 2e 75 2e 78 2e 69 4f 72 64  rList.a.u.x.iOrd
a2b0: 65 72 42 79 43 6f 6c 0a 2a 2a 20 66 69 65 6c 64  erByCol.** field
a2c0: 29 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  ) then convert t
a2d0: 68 61 74 20 74 65 72 6d 20 69 6e 74 6f 20 61 20  hat term into a 
a2e0: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 72 72  copy of the corr
a2f0: 65 73 70 6f 6e 64 69 6e 67 20 72 65 73 75 6c 74  esponding result
a300: 20 73 65 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a   set.** column..
a310: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 65 72 72  **.** If any err
a320: 6f 72 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ors are detected
a330: 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d  , add an error m
a340: 65 73 73 61 67 65 20 74 6f 20 70 50 61 72 73 65  essage to pParse
a350: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 6e   and.** return n
a360: 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e  on-zero.  Return
a370: 20 7a 65 72 6f 20 69 66 20 6e 6f 20 65 72 72 6f   zero if no erro
a380: 72 73 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2f 0a  rs are seen..*/.
a390: 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  int sqlite3Resol
a3a0: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a  veOrderGroupBy(.
a3b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a3c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
a3d0: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61  ng context.  Lea
a3e0: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
a3f0: 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
a400: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
a410: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
a420: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
a430: 6e 69 6e 67 20 74 68 65 20 63 6c 61 75 73 65 20  ning the clause 
a440: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
a450: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68  OrderBy,   /* Th
a460: 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
a470: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f  OUP BY clause to
a480: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   be processed */
a490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
a4a0: 54 79 70 65 20 20 20 20 20 2f 2a 20 22 4f 52 44  Type     /* "ORD
a4b0: 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20 2a  ER" or "GROUP" *
a4c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
a4d0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
a4e0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
a4f0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
a500: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
a510: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20  item *pItem;..  
a520: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
a530: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
a540: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
a550: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f  turn 0;.  if( pO
a560: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62  rderBy->nExpr>db
a570: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
a580: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
a590: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
a5a0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
a5b0: 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
a5c0: 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a  %s BY clause", z
a5d0: 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Type);.    retur
a5e0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73  n 1;.  }.  pELis
a5f0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
a600: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ist;.  assert( p
a610: 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  EList!=0 );  /* 
a620: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
a630: 28 29 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  () guarantees th
a640: 69 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  is */.  for(i=0,
a650: 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
a660: 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  >a; i<pOrderBy->
a670: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
a680: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
a690: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
a6a0: 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  yCol ){.      if
a6b0: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
a6c0: 64 65 72 42 79 43 6f 6c 3e 70 45 4c 69 73 74 2d  derByCol>pEList-
a6d0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
a6e0: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
a6f0: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
a700: 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 70 45 4c   zType, i+1, pEL
a710: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
a720: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
a730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
a740: 6f 6c 76 65 41 6c 69 61 73 28 70 50 61 72 73 65  olveAlias(pParse
a750: 2c 20 70 45 4c 69 73 74 2c 20 70 49 74 65 6d 2d  , pEList, pItem-
a760: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
a770: 2d 31 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  -1, pItem->pExpr
a780: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a790: 20 20 20 20 20 7a 54 79 70 65 2c 30 29 3b 0a 20       zType,0);. 
a7a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a7b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f  n 0;.}../*.** pO
a7c0: 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44  rderBy is an ORD
a7d0: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
a7e0: 59 20 63 6c 61 75 73 65 20 69 6e 20 53 45 4c 45  Y clause in SELE
a7f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65  CT statement pSe
a800: 6c 65 63 74 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d  lect..** The Nam
a810: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
a820: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a830: 74 20 69 73 20 70 4e 43 2e 20 20 7a 54 79 70 65  t is pNC.  zType
a840: 20 69 73 20 65 69 74 68 65 72 0a 2a 2a 20 22 4f   is either.** "O
a850: 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
a860: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
a870: 69 63 68 20 74 79 70 65 20 6f 66 20 63 6c 61 75  ich type of clau
a880: 73 65 20 70 4f 72 64 65 72 42 79 20 69 73 2e 0a  se pOrderBy is..
a890: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a8a0: 6e 65 20 72 65 73 6f 6c 76 65 73 20 65 61 63 68  ne resolves each
a8b0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6c 61   term of the cla
a8c0: 75 73 65 20 69 6e 74 6f 20 61 6e 20 65 78 70 72  use into an expr
a8d0: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68  ession..** If th
a8e0: 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20  e order-by term 
a8f0: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 49 20  is an integer I 
a900: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20  between 1 and N 
a910: 28 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a  (where N is the.
a920: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ** number of col
a930: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
a940: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
a950: 4c 45 43 54 29 20 74 68 65 6e 20 74 68 65 20 65  LECT) then the e
a960: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20  xpression.** in 
a970: 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  the resolution i
a980: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
a990: 49 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20  I-th result-set 
a9a0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 0a  expression.  If.
a9b0: 2a 2a 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  ** the order-by 
a9c0: 74 65 72 6d 20 69 73 20 61 6e 20 69 64 65 6e 74  term is an ident
a9d0: 69 66 69 65 72 20 74 68 61 74 20 63 6f 72 72 65  ifier that corre
a9e0: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 41 53  sponds to the AS
a9f0: 2d 6e 61 6d 65 20 6f 66 0a 2a 2a 20 61 20 72 65  -name of.** a re
aa00: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
aa10: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 74 65  ion, then the te
aa20: 72 6d 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 61  rm resolves to a
aa30: 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20   copy of the.** 
aa40: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
aa50: 73 73 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73  ssion.  Otherwis
aa60: 65 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  e, the expressio
aa70: 6e 20 69 73 20 72 65 73 6f 6c 76 65 64 20 69 6e  n is resolved in
aa80: 0a 2a 2a 20 74 68 65 20 75 73 75 61 6c 20 77 61  .** the usual wa
aa90: 79 20 2d 20 75 73 69 6e 67 20 73 71 6c 69 74 65  y - using sqlite
aaa0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
aab0: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  s()..**.** This 
aac0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
aad0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
aae0: 72 6f 72 73 2e 20 20 49 66 20 65 72 72 6f 72 73  rors.  If errors
aaf0: 20 6f 63 63 75 72 2c 20 74 68 65 6e 0a 2a 2a 20   occur, then.** 
ab00: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
ab10: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 69 67  rror message mig
ab20: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 70 50  ht be left in pP
ab30: 61 72 73 65 2e 20 20 28 4f 4f 4d 20 65 72 72 6f  arse.  (OOM erro
ab40: 72 73 0a 2a 2a 20 65 78 63 65 70 74 65 64 2e 29  rs.** excepted.)
ab50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
ab60: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
ab70: 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  By(.  NameContex
ab80: 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 54  t *pNC,     /* T
ab90: 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20  he name context 
aba0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
abb0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c  atement */.  Sel
abc0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
abd0: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
abe0: 20 73 74 61 74 65 6d 65 6e 74 20 68 6f 6c 64 69   statement holdi
abf0: 6e 67 20 70 4f 72 64 65 72 42 79 20 2a 2f 0a 20  ng pOrderBy */. 
ac00: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
ac10: 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
ac20: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
ac30: 59 20 63 6c 61 75 73 65 20 74 6f 20 72 65 73 6f  Y clause to reso
ac40: 6c 76 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  lve */.  const c
ac50: 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f  har *zType     /
ac60: 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45 52 22  * Either "ORDER"
ac70: 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20   or "GROUP", as 
ac80: 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29  appropriate */.)
ac90: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
acb0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
acc0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ers */.  int iCo
acd0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
ace0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
acf0: 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74  n number */.  st
ad00: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ad10: 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 2f 2a 20  em *pItem;   /* 
ad20: 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  A term of the OR
ad30: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
ad40: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
ad50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ad60: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
ad70: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  text */.  int nR
ad80: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
ad90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ada0: 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
adb0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
adc0: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
add0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
ade0: 20 20 6e 52 65 73 75 6c 74 20 3d 20 70 53 65 6c    nResult = pSel
adf0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
ae00: 70 72 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  pr;.  pParse = p
ae10: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 66 6f  NC->pParse;.  fo
ae20: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
ae30: 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64  derBy->a; i<pOrd
ae40: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
ae50: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
ae60: 45 78 70 72 20 2a 70 45 20 3d 20 70 49 74 65 6d  Expr *pE = pItem
ae70: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ->pExpr;.    Exp
ae80: 72 20 2a 70 45 32 20 3d 20 73 71 6c 69 74 65 33  r *pE2 = sqlite3
ae90: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
aea0: 70 45 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  pE);.    if( zTy
aeb0: 70 65 5b 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20  pe[0]!='G' ){.  
aec0: 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c      iCol = resol
aed0: 76 65 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c  veAsName(pParse,
aee0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
aef0: 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20 69 66  , pE2);.      if
af00: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
af10: 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 41 53 2d      /* If an AS-
af20: 6e 61 6d 65 20 6d 61 74 63 68 20 69 73 20 66 6f  name match is fo
af30: 75 6e 64 2c 20 6d 61 72 6b 20 74 68 69 73 20 4f  und, mark this O
af40: 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 61  RDER BY column a
af50: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  s being.        
af60: 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ** a copy of the
af70: 20 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d   iCol-th result-
af80: 73 65 74 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  set column.  The
af90: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
afa0: 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   to.        ** s
afb0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
afc0: 65 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c  erGroupBy() will
afd0: 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70   convert the exp
afe0: 72 65 73 73 69 6f 6e 20 74 6f 20 61 0a 20 20 20  ression to a.   
aff0: 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
b000: 74 68 65 20 69 43 6f 6c 2d 74 68 20 72 65 73 75  the iCol-th resu
b010: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
b020: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49  n. */.        pI
b030: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
b040: 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c  yCol = (u16)iCol
b050: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
b060: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
b070: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
b080: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
b090: 45 32 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  E2, &iCol) ){.  
b0a0: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
b0b0: 20 42 59 20 74 65 72 6d 20 69 73 20 61 6e 20 69   BY term is an i
b0c0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e  nteger constant.
b0d0: 20 20 41 67 61 69 6e 2c 20 73 65 74 20 74 68 65    Again, set the
b0e0: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a   column.      **
b0f0: 20 6e 75 6d 62 65 72 20 73 6f 20 74 68 61 74 20   number so that 
b100: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
b110: 64 65 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c  derGroupBy() wil
b120: 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 0a 20 20  l convert the.  
b130: 20 20 20 20 2a 2a 20 6f 72 64 65 72 2d 62 79 20      ** order-by 
b140: 74 65 72 6d 20 74 6f 20 61 20 63 6f 70 79 20 6f  term to a copy o
b150: 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  f the result-set
b160: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
b170: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 31 20       if( iCol<1 
b180: 7c 7c 20 69 43 6f 6c 3e 30 78 66 66 66 66 20 29  || iCol>0xffff )
b190: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76  {.        resolv
b1a0: 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72  eOutOfRangeError
b1b0: 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20  (pParse, zType, 
b1c0: 69 2b 31 2c 20 6e 52 65 73 75 6c 74 29 3b 0a 20  i+1, nResult);. 
b1d0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
b1e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
b1f0: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
b200: 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f  ByCol = (u16)iCo
b210: 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  l;.      continu
b220: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
b230: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 72 65 61   Otherwise, trea
b240: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  t the ORDER BY t
b250: 65 72 6d 20 61 73 20 61 6e 20 6f 72 64 69 6e 61  erm as an ordina
b260: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ry expression */
b270: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  .    pItem->u.x.
b280: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b  iOrderByCol = 0;
b290: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
b2a0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
b2b0: 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20  (pNC, pE) ){.   
b2c0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b2d0: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
b2e0: 6a 3c 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  j<pSelect->pELis
b2f0: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
b300: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
b310: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
b320: 70 45 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pE, pSelect->pEL
b330: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  ist->a[j].pExpr,
b340: 20 2d 31 29 3d 3d 30 20 29 7b 0a 23 69 66 6e 64   -1)==0 ){.#ifnd
b350: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
b360: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20  INDOWFUNC.      
b370: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
b380: 70 65 72 74 79 28 70 45 2c 20 45 50 5f 57 69 6e  perty(pE, EP_Win
b390: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20  Func) ){.       
b3a0: 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 69 73     /* Since this
b3b0: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
b3c0: 20 69 73 20 62 65 69 6e 67 20 63 68 61 6e 67 65   is being change
b3d0: 64 20 69 6e 74 6f 20 61 20 72 65 66 65 72 65 6e  d into a referen
b3e0: 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ce.          ** 
b3f0: 74 6f 20 74 68 65 20 73 61 6d 65 20 77 69 6e 64  to the same wind
b400: 6f 77 20 66 75 6e 63 74 69 6f 6e 20 74 68 65 20  ow function the 
b410: 72 65 73 75 6c 74 20 73 65 74 2c 20 72 65 6d 6f  result set, remo
b420: 76 65 20 74 68 65 20 69 6e 73 74 61 6e 63 65 0a  ve the instance.
b430: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
b440: 74 68 69 73 20 77 69 6e 64 6f 77 20 66 75 6e 63  this window func
b450: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 53 65  tion from the Se
b460: 6c 65 63 74 2e 70 57 69 6e 20 6c 69 73 74 2e 20  lect.pWin list. 
b470: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 57 69 6e  */.          Win
b480: 64 6f 77 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dow **pp;.      
b490: 20 20 20 20 66 6f 72 28 70 70 3d 26 70 53 65 6c      for(pp=&pSel
b4a0: 65 63 74 2d 3e 70 57 69 6e 3b 20 2a 70 70 3b 20  ect->pWin; *pp; 
b4b0: 70 70 3d 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74  pp=&(*pp)->pNext
b4c0: 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Win){.          
b4d0: 20 20 69 66 28 20 2a 70 70 3d 3d 70 45 2d 3e 79    if( *pp==pE->y
b4e0: 2e 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20  .pWin ){.       
b4f0: 20 20 20 20 20 20 20 2a 70 70 20 3d 20 28 2a 70         *pp = (*p
b500: 70 29 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20  p)->pNextWin;.  
b510: 20 20 20 20 20 20 20 20 20 20 7d 20 20 20 20 0a            }    .
b520: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b530: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b540: 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
b550: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 6a 2b  iOrderByCol = j+
b560: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
b570: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71  .  }.  return sq
b580: 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
b590: 72 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c  rGroupBy(pParse,
b5a0: 20 70 53 65 6c 65 63 74 2c 20 70 4f 72 64 65 72   pSelect, pOrder
b5b0: 42 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f  By, zType);.}../
b5c0: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d  *.** Resolve nam
b5d0: 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  es in the SELECT
b5e0: 20 73 74 61 74 65 6d 65 6e 74 20 70 20 61 6e 64   statement p and
b5f0: 20 61 6c 6c 20 6f 66 20 69 74 73 20 64 65 73 63   all of its desc
b600: 65 6e 64 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  endants..*/.stat
b610: 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 53 65  ic int resolveSe
b620: 6c 65 63 74 53 74 65 70 28 57 61 6c 6b 65 72 20  lectStep(Walker 
b630: 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
b640: 20 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74   *p){.  NameCont
b650: 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20 20  ext *pOuterNC;  
b660: 2f 2a 20 43 6f 6e 74 65 78 74 20 74 68 61 74 20  /* Context that 
b670: 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 53 45  contains this SE
b680: 4c 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  LECT */.  NameCo
b690: 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20  ntext sNC;      
b6a0: 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78    /* Name contex
b6b0: 74 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54  t of this SELECT
b6c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70   */.  int isComp
b6d0: 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a  ound;         /*
b6e0: 20 54 72 75 65 20 69 66 20 70 20 69 73 20 61 20   True if p is a 
b6f0: 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20  compound select 
b700: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f 75  */.  int nCompou
b710: 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
b720: 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f 75  Number of compou
b730: 6e 64 20 74 65 72 6d 73 20 70 72 6f 63 65 73 73  nd terms process
b740: 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50  ed so far */.  P
b750: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
b760: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
b770: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
b780: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
b790: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
b7a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72  ounter */.  Expr
b7b0: 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20  List *pGroupBy; 
b7c0: 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50      /* The GROUP
b7d0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
b7e0: 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 6d 6f 73  Select *pLeftmos
b7f0: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d  t;      /* Left-
b800: 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 20 6f  most of SELECT o
b810: 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  f a compound */.
b820: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
b830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
b840: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b850: 20 2a 2f 0a 20 20 0a 0a 20 20 61 73 73 65 72 74   */.  ..  assert
b860: 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ( p!=0 );.  if( 
b870: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
b880: 5f 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20  _Resolved ){.   
b890: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
b8a0: 65 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 65 72 4e  e;.  }.  pOuterN
b8b0: 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70  C = pWalker->u.p
b8c0: 4e 43 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  NC;.  pParse = p
b8d0: 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a  Walker->pParse;.
b8e0: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
b8f0: 62 3b 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c  b;..  /* Normall
b900: 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  y sqlite3SelectE
b910: 78 70 61 6e 64 28 29 20 77 69 6c 6c 20 62 65 20  xpand() will be 
b920: 63 61 6c 6c 65 64 20 66 69 72 73 74 20 61 6e 64  called first and
b930: 20 77 69 6c 6c 20 68 61 76 65 0a 20 20 2a 2a 20   will have.  ** 
b940: 61 6c 72 65 61 64 79 20 65 78 70 61 6e 64 65 64  already expanded
b950: 20 74 68 69 73 20 53 45 4c 45 43 54 2e 20 20 48   this SELECT.  H
b960: 6f 77 65 76 65 72 2c 20 69 66 20 74 68 69 73 20  owever, if this 
b970: 69 73 20 61 20 73 75 62 71 75 65 72 79 20 77 69  is a subquery wi
b980: 74 68 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 78 70  thin.  ** an exp
b990: 72 65 73 73 69 6f 6e 2c 20 73 71 6c 69 74 65 33  ression, sqlite3
b9a0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
b9b0: 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65  () will be calle
b9c0: 64 20 77 69 74 68 6f 75 74 20 61 0a 20 20 2a 2a  d without a.  **
b9d0: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73   prior call to s
b9e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
b9f0: 6e 64 28 29 2e 20 20 57 68 65 6e 20 74 68 61 74  nd().  When that
ba00: 20 68 61 70 70 65 6e 73 2c 20 6c 65 74 0a 20 20   happens, let.  
ba10: 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  ** sqlite3Select
ba20: 50 72 65 70 28 29 20 64 6f 20 61 6c 6c 20 6f 66  Prep() do all of
ba30: 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20   the processing 
ba40: 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 2e  for this SELECT.
ba50: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  .  ** sqlite3Sel
ba60: 65 63 74 50 72 65 70 28 29 20 77 69 6c 6c 20 69  ectPrep() will i
ba70: 6e 76 6f 6b 65 20 62 6f 74 68 20 73 71 6c 69 74  nvoke both sqlit
ba80: 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29  e3SelectExpand()
ba90: 20 61 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 72   and.  ** this r
baa0: 6f 75 74 69 6e 65 20 69 6e 20 74 68 65 20 63 6f  outine in the co
bab0: 72 72 65 63 74 20 6f 72 64 65 72 2e 0a 20 20 2a  rrect order..  *
bac0: 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46  /.  if( (p->selF
bad0: 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64  lags & SF_Expand
bae0: 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ed)==0 ){.    sq
baf0: 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28  lite3SelectPrep(
bb00: 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65  pParse, p, pOute
bb10: 72 4e 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rNC);.    return
bb20: 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c   (pParse->nErr |
bb30: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
bb40: 65 64 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20  ed) ? WRC_Abort 
bb50: 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  : WRC_Prune;.  }
bb60: 0a 0a 20 20 69 73 43 6f 6d 70 6f 75 6e 64 20 3d  ..  isCompound =
bb70: 20 70 2d 3e 70 50 72 69 6f 72 21 3d 30 3b 0a 20   p->pPrior!=0;. 
bb80: 20 6e 43 6f 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a   nCompound = 0;.
bb90: 20 20 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 3b    pLeftmost = p;
bba0: 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20  .  while( p ){. 
bbb0: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
bbc0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70  elFlags & SF_Exp
bbd0: 61 6e 64 65 64 29 21 3d 30 20 29 3b 0a 20 20 20  anded)!=0 );.   
bbe0: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
bbf0: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
bc00: 76 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ved)==0 );.    p
bc10: 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46  ->selFlags |= SF
bc20: 5f 52 65 73 6f 6c 76 65 64 3b 0a 0a 20 20 20 20  _Resolved;..    
bc30: 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65  /* Resolve the e
bc40: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
bc50: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53  e LIMIT and OFFS
bc60: 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73  ET clauses. Thes
bc70: 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74  e.    ** are not
bc80: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65   allowed to refe
bc90: 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20  r to any names, 
bca0: 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79  so pass an empty
bcb0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20   NameContext..  
bcc0: 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28    */.    memset(
bcd0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
bce0: 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70  sNC));.    sNC.p
bcf0: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
bd00: 20 20 20 20 73 4e 43 2e 70 57 69 6e 53 65 6c 65      sNC.pWinSele
bd10: 63 74 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20  ct = p;.    if( 
bd20: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
bd30: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  prNames(&sNC, p-
bd40: 3e 70 4c 69 6d 69 74 29 20 29 7b 0a 20 20 20 20  >pLimit) ){.    
bd50: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
bd60: 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rt;.    }..    /
bd70: 2a 20 49 66 20 74 68 65 20 53 46 5f 43 6f 6e 76  * If the SF_Conv
bd80: 65 72 74 65 64 20 66 6c 61 67 73 20 69 73 20 73  erted flags is s
bd90: 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 53 65  et, then this Se
bda0: 6c 65 63 74 20 6f 62 6a 65 63 74 20 77 61 73 0a  lect object was.
bdb0: 20 20 20 20 2a 2a 20 77 61 73 20 63 72 65 61 74      ** was creat
bdc0: 65 64 20 62 79 20 74 68 65 20 63 6f 6e 76 65 72  ed by the conver
bdd0: 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54  tCompoundSelectT
bde0: 6f 53 75 62 71 75 65 72 79 28 29 20 66 75 6e 63  oSubquery() func
bdf0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tion..    ** In 
be00: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 4f 52  this case the OR
be10: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 70  DER BY clause (p
be20: 2d 3e 70 4f 72 64 65 72 42 79 29 20 73 68 6f 75  ->pOrderBy) shou
be30: 6c 64 20 62 65 20 72 65 73 6f 6c 76 65 64 0a 20  ld be resolved. 
be40: 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 77     ** as if it w
be50: 65 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  ere part of the 
be60: 73 75 62 2d 71 75 65 72 79 2c 20 6e 6f 74 20 74  sub-query, not t
be70: 68 65 20 70 61 72 65 6e 74 2e 20 54 68 69 73 20  he parent. This 
be80: 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 6d 6f 76  block.    ** mov
be90: 65 73 20 74 68 65 20 70 4f 72 64 65 72 42 79 20  es the pOrderBy 
bea0: 64 6f 77 6e 20 74 6f 20 74 68 65 20 73 75 62 2d  down to the sub-
beb0: 71 75 65 72 79 2e 20 49 74 20 77 69 6c 6c 20 62  query. It will b
bec0: 65 20 6d 6f 76 65 64 20 62 61 63 6b 0a 20 20 20  e moved back.   
bed0: 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20 6e 61   ** after the na
bee0: 6d 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  mes have been re
bef0: 73 6f 6c 76 65 64 2e 20 20 2a 2f 0a 20 20 20 20  solved.  */.    
bf00: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
bf10: 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 20 29  & SF_Converted )
bf20: 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a  {.      Select *
bf30: 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e  pSub = p->pSrc->
bf40: 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20  a[0].pSelect;.  
bf50: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
bf60: 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20  Src->nSrc==1 && 
bf70: 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20  p->pOrderBy );. 
bf80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75       assert( pSu
bf90: 62 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75  b->pPrior && pSu
bfa0: 62 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  b->pOrderBy==0 )
bfb0: 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f  ;.      pSub->pO
bfc0: 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64  rderBy = p->pOrd
bfd0: 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70  erBy;.      p->p
bfe0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
bff0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 63   }.  .    /* Rec
c000: 75 72 73 69 76 65 6c 79 20 72 65 73 6f 6c 76 65  ursively resolve
c010: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73 75   names in all su
c020: 62 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2f 0a  bqueries.    */.
c030: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c040: 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b  ->pSrc->nSrc; i+
c050: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
c060: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
c070: 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d  Item = &p->pSrc-
c080: 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  >a[i];.      if(
c090: 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
c0a0: 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43  ){.        NameC
c0b0: 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20  ontext *pNC;    
c0c0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
c0d0: 69 74 65 72 61 74 65 20 6e 61 6d 65 20 63 6f 6e  iterate name con
c0e0: 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  texts */.       
c0f0: 20 69 6e 74 20 6e 52 65 66 20 3d 20 30 3b 20 20   int nRef = 0;  
c100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
c110: 66 63 6f 75 6e 74 20 66 6f 72 20 70 4f 75 74 65  fcount for pOute
c120: 72 4e 43 20 61 6e 64 20 6f 75 74 65 72 20 63 6f  rNC and outer co
c130: 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20  ntexts */.      
c140: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
c150: 61 76 65 64 43 6f 6e 74 65 78 74 20 3d 20 70 50  avedContext = pP
c160: 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65  arse->zAuthConte
c170: 78 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  xt;..        /* 
c180: 43 6f 75 6e 74 20 74 68 65 20 74 6f 74 61 6c 20  Count the total 
c190: 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
c1a0: 6e 63 65 73 20 74 6f 20 70 4f 75 74 65 72 4e 43  nces to pOuterNC
c1b0: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 0a   and all of its.
c1c0: 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e          ** paren
c1d0: 74 20 63 6f 6e 74 65 78 74 73 2e 20 41 66 74 65  t contexts. Afte
c1e0: 72 20 72 65 73 6f 6c 76 69 6e 67 20 72 65 66 65  r resolving refe
c1f0: 72 65 6e 63 65 73 20 74 6f 20 65 78 70 72 65 73  rences to expres
c200: 73 69 6f 6e 73 20 69 6e 0a 20 20 20 20 20 20 20  sions in.       
c210: 20 2a 2a 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65   ** pItem->pSele
c220: 63 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 69  ct, check if thi
c230: 73 20 76 61 6c 75 65 20 68 61 73 20 63 68 61 6e  s value has chan
c240: 67 65 64 2e 20 49 66 20 73 6f 2c 20 74 68 65 6e  ged. If so, then
c250: 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 45 4c 45  .        ** SELE
c260: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 49 74  CT statement pIt
c270: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 6d 75 73 74  em->pSelect must
c280: 20 62 65 20 63 6f 72 72 65 6c 61 74 65 64 2e 20   be correlated. 
c290: 53 65 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  Set the.        
c2a0: 2a 2a 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43  ** pItem->fg.isC
c2b0: 6f 72 72 65 6c 61 74 65 64 20 66 6c 61 67 20 69  orrelated flag i
c2c0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
c2d0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  se. */.        f
c2e0: 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b  or(pNC=pOuterNC;
c2f0: 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70   pNC; pNC=pNC->p
c300: 4e 65 78 74 29 20 6e 52 65 66 20 2b 3d 20 70 4e  Next) nRef += pN
c310: 43 2d 3e 6e 52 65 66 3b 0a 0a 20 20 20 20 20 20  C->nRef;..      
c320: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61    if( pItem->zNa
c330: 6d 65 20 29 20 70 50 61 72 73 65 2d 3e 7a 41 75  me ) pParse->zAu
c340: 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65  thContext = pIte
c350: 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  m->zName;.      
c360: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
c370: 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72  SelectNames(pPar
c380: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  se, pItem->pSele
c390: 63 74 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20  ct, pOuterNC);. 
c3a0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a         pParse->z
c3b0: 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53  AuthContext = zS
c3c0: 61 76 65 64 43 6f 6e 74 65 78 74 3b 0a 20 20 20  avedContext;.   
c3d0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
c3e0: 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
c3f0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
c400: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20  rn WRC_Abort;.. 
c410: 20 20 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70         for(pNC=p
c420: 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e  OuterNC; pNC; pN
c430: 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52  C=pNC->pNext) nR
c440: 65 66 20 2d 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  ef -= pNC->nRef;
c450: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c460: 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72   pItem->fg.isCor
c470: 72 65 6c 61 74 65 64 3d 3d 30 20 26 26 20 6e 52  related==0 && nR
c480: 65 66 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ef<=0 );.       
c490: 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72   pItem->fg.isCor
c4a0: 72 65 6c 61 74 65 64 20 3d 20 28 6e 52 65 66 21  related = (nRef!
c4b0: 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  =0);.      }.   
c4c0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74   }.  .    /* Set
c4d0: 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61   up the local na
c4e0: 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61  me-context to pa
c4f0: 73 73 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ss to sqlite3Res
c500: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20  olveExprNames() 
c510: 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76  to.    ** resolv
c520: 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  e the result-set
c530: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
c540: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43  ..    */.    sNC
c550: 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c  .ncFlags = NC_Al
c560: 6c 6f 77 41 67 67 7c 4e 43 5f 41 6c 6c 6f 77 57  lowAgg|NC_AllowW
c570: 69 6e 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  in;.    sNC.pSrc
c580: 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a  List = p->pSrc;.
c590: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
c5a0: 70 4f 75 74 65 72 4e 43 3b 0a 20 20 0a 20 20 20  pOuterNC;.  .   
c5b0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
c5c0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
c5d0: 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  set. */.    if( 
c5e0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
c5f0: 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43  prListNames(&sNC
c600: 2c 20 70 2d 3e 70 45 4c 69 73 74 29 20 29 20 72  , p->pEList) ) r
c610: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
c620: 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73  .    sNC.ncFlags
c630: 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 57 69 6e   &= ~NC_AllowWin
c640: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
c650: 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72  here are no aggr
c660: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
c670: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  in the result-se
c680: 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20  t, and no GROUP 
c690: 42 59 20 0a 20 20 20 20 2a 2a 20 65 78 70 72 65  BY .    ** expre
c6a0: 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c  ssion, do not al
c6b0: 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73 20 69  low aggregates i
c6c0: 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68  n any of the oth
c6d0: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  er expressions..
c6e0: 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
c6f0: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
c700: 26 20 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d  & SF_Aggregate)=
c710: 3d 30 20 29 3b 0a 20 20 20 20 70 47 72 6f 75 70  =0 );.    pGroup
c720: 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79  By = p->pGroupBy
c730: 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70  ;.    if( pGroup
c740: 42 79 20 7c 7c 20 28 73 4e 43 2e 6e 63 46 6c 61  By || (sNC.ncFla
c750: 67 73 20 26 20 4e 43 5f 48 61 73 41 67 67 29 21  gs & NC_HasAgg)!
c760: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
c770: 72 74 28 20 4e 43 5f 4d 69 6e 4d 61 78 41 67 67  rt( NC_MinMaxAgg
c780: 3d 3d 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29  ==SF_MinMaxAgg )
c790: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c  ;.      p->selFl
c7a0: 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67  ags |= SF_Aggreg
c7b0: 61 74 65 20 7c 20 28 73 4e 43 2e 6e 63 46 6c 61  ate | (sNC.ncFla
c7c0: 67 73 26 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29  gs&NC_MinMaxAgg)
c7d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c7e0: 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
c7f0: 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a  = ~NC_AllowAgg;.
c800: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
c810: 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75  If a HAVING clau
c820: 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74  se is present, t
c830: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
c840: 65 20 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61  e a GROUP BY cla
c850: 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
c860: 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26  if( p->pHaving &
c870: 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  & !pGroupBy ){. 
c880: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
c890: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 20  rMsg(pParse, "a 
c8a0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
c8b0: 69 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  is required befo
c8c0: 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20  re HAVING");.   
c8d0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
c8e0: 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ort;.    }.  .  
c8f0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 75 74    /* Add the out
c900: 70 75 74 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20  put column list 
c910: 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74  to the name-cont
c920: 65 78 74 20 62 65 66 6f 72 65 20 70 61 72 73 69  ext before parsi
c930: 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74  ng the.    ** ot
c940: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20  her expressions 
c950: 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  in the SELECT st
c960: 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73  atement. This is
c970: 20 73 6f 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   so that.    ** 
c980: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
c990: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
c9a0: 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72  (etc.) can refer
c9b0: 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20   to expressions 
c9c0: 62 79 0a 20 20 20 20 2a 2a 20 61 6c 69 61 73 65  by.    ** aliase
c9d0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
c9e0: 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  set..    **.    
c9f0: 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20  ** Minor point: 
ca00: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
ca10: 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78  ase, then the ex
ca20: 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65  pression will be
ca30: 0a 20 20 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75  .    ** re-evalu
ca40: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 72 65  ated for each re
ca50: 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20  ference to it.. 
ca60: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
ca70: 28 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26  ( (sNC.ncFlags &
ca80: 20 28 4e 43 5f 55 41 67 67 49 6e 66 6f 7c 4e 43   (NC_UAggInfo|NC
ca90: 5f 55 55 70 73 65 72 74 29 29 3d 3d 30 20 29 3b  _UUpsert))==0 );
caa0: 0a 20 20 20 20 73 4e 43 2e 75 4e 43 2e 70 45 4c  .    sNC.uNC.pEL
cab0: 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b  ist = p->pEList;
cac0: 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73  .    sNC.ncFlags
cad0: 20 7c 3d 20 4e 43 5f 55 45 4c 69 73 74 3b 0a 20   |= NC_UEList;. 
cae0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65     if( sqlite3Re
caf0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26  solveExprNames(&
cb00: 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29  sNC, p->pHaving)
cb10: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
cb20: 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ort;.    if( sql
cb30: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
cb40: 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57  ames(&sNC, p->pW
cb50: 68 65 72 65 29 20 29 20 72 65 74 75 72 6e 20 57  here) ) return W
cb60: 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 2f  RC_Abort;..    /
cb70: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
cb80: 69 6e 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d  in table-valued-
cb90: 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  function argumen
cba0: 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  ts */.    for(i=
cbb0: 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
cbc0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
cbd0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
cbe0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
cbf0: 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
cc00: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
cc10: 2e 69 73 54 61 62 46 75 6e 63 0a 20 20 20 20 20  .isTabFunc.     
cc20: 20 20 26 26 20 73 71 6c 69 74 65 33 52 65 73 6f    && sqlite3Reso
cc30: 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73  lveExprListNames
cc40: 28 26 73 4e 43 2c 20 70 49 74 65 6d 2d 3e 75 31  (&sNC, pItem->u1
cc50: 2e 70 46 75 6e 63 41 72 67 29 20 0a 20 20 20 20  .pFuncArg) .    
cc60: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74    ){.        ret
cc70: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
cc80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
cc90: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
cca0: 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63  Y and GROUP BY c
ccb0: 6c 61 75 73 65 73 20 6d 61 79 20 6e 6f 74 20 72  lauses may not r
ccc0: 65 66 65 72 20 74 6f 20 74 65 72 6d 73 20 69 6e  efer to terms in
ccd0: 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75  .    ** outer qu
cce0: 65 72 69 65 73 20 0a 20 20 20 20 2a 2f 0a 20 20  eries .    */.  
ccf0: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b    sNC.pNext = 0;
cd00: 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73  .    sNC.ncFlags
cd10: 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 7c   |= NC_AllowAgg|
cd20: 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b 0a 0a 20 20  NC_AllowWin;..  
cd30: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
cd40: 61 20 63 6f 6e 76 65 72 74 65 64 20 63 6f 6d 70  a converted comp
cd50: 6f 75 6e 64 20 71 75 65 72 79 2c 20 6d 6f 76 65  ound query, move
cd60: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
cd70: 61 75 73 65 20 66 72 6f 6d 20 0a 20 20 20 20 2a  ause from .    *
cd80: 2a 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  * the sub-query 
cd90: 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65  back to the pare
cda0: 6e 74 20 71 75 65 72 79 2e 20 41 74 20 74 68 69  nt query. At thi
cdb0: 73 20 70 6f 69 6e 74 20 65 61 63 68 20 74 65 72  s point each ter
cdc0: 6d 0a 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20  m.    ** within 
cdd0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
cde0: 75 73 65 20 68 61 73 20 62 65 65 6e 20 74 72 61  use has been tra
cdf0: 6e 73 66 6f 72 6d 65 64 20 74 6f 20 61 6e 20 69  nsformed to an i
ce00: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 20 20  nteger value..  
ce10: 20 20 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67    ** These integ
ce20: 65 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6c  ers will be repl
ce30: 61 63 65 64 20 62 79 20 63 6f 70 69 65 73 20 6f  aced by copies o
ce40: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
ce50: 69 6e 67 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  ing result.    *
ce60: 2a 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  * set expression
ce70: 73 20 62 79 20 74 68 65 20 63 61 6c 6c 20 74 6f  s by the call to
ce80: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
ce90: 75 70 42 79 28 29 20 62 65 6c 6f 77 2e 20 20 2a  upBy() below.  *
cea0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  /.    if( p->sel
ceb0: 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
cec0: 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65  rted ){.      Se
ced0: 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e  lect *pSub = p->
cee0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
cef0: 63 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  ct;.      p->pOr
cf00: 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
cf10: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
cf20: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
cf30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
cf40: 50 72 6f 63 65 73 73 20 74 68 65 20 4f 52 44 45  Process the ORDE
cf50: 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20  R BY clause for 
cf60: 73 69 6e 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54  singleton SELECT
cf70: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
cf80: 20 2a 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   ** The ORDER BY
cf90: 20 63 6c 61 75 73 65 20 66 6f 72 20 63 6f 6d 70   clause for comp
cfa0: 6f 75 6e 64 73 20 53 45 4c 45 43 54 20 73 74 61  ounds SELECT sta
cfb0: 74 65 6d 65 6e 74 73 20 69 73 20 68 61 6e 64 6c  tements is handl
cfc0: 65 64 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c  ed.    ** below,
cfd0: 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
cfe0: 65 20 72 65 73 75 6c 74 2d 73 65 74 73 20 66 6f  e result-sets fo
cff0: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65  r all of the ele
d000: 6d 65 6e 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ments of.    ** 
d010: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76  the compound hav
d020: 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  e been resolved.
d030: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
d040: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
d050: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e  DER BY clause on
d060: 20 61 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d   a term of a com
d070: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 6f 74 68  pound-select oth
d080: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
d090: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 74 65  he right-most te
d0a0: 72 6d 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  rm, then that is
d0b0: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e   a syntax error.
d0c0: 20 20 42 75 74 20 74 68 65 20 65 72 72 6f 72 0a    But the error.
d0d0: 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65      ** is not de
d0e0: 74 65 63 74 65 64 20 75 6e 74 69 6c 20 6d 75 63  tected until muc
d0f0: 68 20 6c 61 74 65 72 2c 20 61 6e 64 20 73 6f 20  h later, and so 
d100: 77 65 20 6e 65 65 64 20 74 6f 20 67 6f 20 61 68  we need to go ah
d110: 65 61 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 72  ead and.    ** r
d120: 65 73 6f 6c 76 65 20 74 68 6f 73 65 20 73 79 6d  esolve those sym
d130: 62 6f 6c 73 20 6f 6e 20 74 68 65 20 69 6e 63 6f  bols on the inco
d140: 72 72 65 63 74 20 4f 52 44 45 52 20 42 59 20 66  rrect ORDER BY f
d150: 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 2e 0a  or consistency..
d160: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
d170: 73 43 6f 6d 70 6f 75 6e 64 3c 3d 6e 43 6f 6d 70  sCompound<=nComp
d180: 6f 75 6e 64 20 20 2f 2a 20 44 65 66 65 72 20 72  ound  /* Defer r
d190: 69 67 68 74 2d 6d 6f 73 74 20 4f 52 44 45 52 20  ight-most ORDER 
d1a0: 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  BY of a compound
d1b0: 20 2a 2f 0a 20 20 20 20 20 26 26 20 72 65 73 6f   */.     && reso
d1c0: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
d1d0: 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  &sNC, p, p->pOrd
d1e0: 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 0a 20  erBy, "ORDER"). 
d1f0: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
d200: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
d210: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
d220: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
d230: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
d240: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
d250: 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
d260: 20 7e 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b 0a 20   ~NC_AllowWin;. 
d270: 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65   .    /* Resolve
d280: 20 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   the GROUP BY cl
d290: 61 75 73 65 2e 20 20 41 74 20 74 68 65 20 73 61  ause.  At the sa
d2a0: 6d 65 20 74 69 6d 65 2c 20 6d 61 6b 65 20 73 75  me time, make su
d2b0: 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 47  re .    ** the G
d2c0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64  ROUP BY clause d
d2d0: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
d2e0: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
d2f0: 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
d300: 69 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a  if( pGroupBy ){.
d310: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
d320: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
d330: 6d 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66  m;.    .      if
d340: 28 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  ( resolveOrderGr
d350: 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70  oupBy(&sNC, p, p
d360: 47 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22  GroupBy, "GROUP"
d370: 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ) || db->mallocF
d380: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
d390: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
d3a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
d3b0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
d3c0: 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70  pGroupBy->a; i<p
d3d0: 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20  GroupBy->nExpr; 
d3e0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
d3f0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
d400: 61 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d  asProperty(pItem
d410: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  ->pExpr, EP_Agg)
d420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
d430: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
d440: 61 72 73 65 2c 20 22 61 67 67 72 65 67 61 74 65  arse, "aggregate
d450: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e   functions are n
d460: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a  ot allowed in ".
d470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
d480: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
d490: 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  se");.          
d4a0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
d4b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d4c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
d4d0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 70 61 72  * If this is par
d4e0: 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20  t of a compound 
d4f0: 53 45 4c 45 43 54 2c 20 63 68 65 63 6b 20 74 68  SELECT, check th
d500: 61 74 20 69 74 20 68 61 73 20 74 68 65 20 72 69  at it has the ri
d510: 67 68 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  ght.    ** numbe
d520: 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  r of expressions
d530: 20 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c   in the select l
d540: 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ist. */.    if( 
d550: 70 2d 3e 70 4e 65 78 74 20 26 26 20 70 2d 3e 70  p->pNext && p->p
d560: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 2d  EList->nExpr!=p-
d570: 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e  >pNext->pEList->
d580: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73  nExpr ){.      s
d590: 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e  qlite3SelectWron
d5a0: 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70  gNumTermsError(p
d5b0: 50 61 72 73 65 2c 20 70 2d 3e 70 4e 65 78 74 29  Parse, p->pNext)
d5c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
d5d0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
d5e0: 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
d5f0: 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  to the next term
d600: 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   of the compound
d610: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20  .    */.    p = 
d620: 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e  p->pPrior;.    n
d630: 43 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a 20 20 7d 0a  Compound++;.  }.
d640: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68  .  /* Resolve th
d650: 65 20 4f 52 44 45 52 20 42 59 20 6f 6e 20 61 20  e ORDER BY on a 
d660: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20  compound SELECT 
d670: 61 66 74 65 72 20 61 6c 6c 20 74 65 72 6d 73 20  after all terms 
d680: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70  of.  ** the comp
d690: 6f 75 6e 64 20 68 61 76 65 20 62 65 65 6e 20 72  ound have been r
d6a0: 65 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a 20 20  esolved..  */.  
d6b0: 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 26  if( isCompound &
d6c0: 26 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e  & resolveCompoun
d6d0: 64 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c  dOrderBy(pParse,
d6e0: 20 70 4c 65 66 74 6d 6f 73 74 29 20 29 7b 0a 20   pLeftmost) ){. 
d6f0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
d700: 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ort;.  }..  retu
d710: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a  rn WRC_Prune;.}.
d720: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d730: 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70  ine walks an exp
d740: 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64  ression tree and
d750: 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65   resolves refere
d760: 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65  nces to.** table
d770: 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 72 65 73   columns and res
d780: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 73 2e  ult-set columns.
d790: 20 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69    At the same ti
d7a0: 6d 65 2c 20 64 6f 20 65 72 72 6f 72 0a 2a 2a 20  me, do error.** 
d7b0: 63 68 65 63 6b 69 6e 67 20 6f 6e 20 66 75 6e 63  checking on func
d7c0: 74 69 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 73  tion usage and s
d7d0: 65 74 20 61 20 66 6c 61 67 20 69 66 20 61 6e 79  et a flag if any
d7e0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
d7f0: 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 73 65 65 6e  ions.** are seen
d800: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c  ..**.** To resol
d810: 76 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ve table columns
d820: 20 72 65 66 65 72 65 6e 63 65 73 20 77 65 20 6c   references we l
d830: 6f 6f 6b 20 66 6f 72 20 6e 6f 64 65 73 20 28 6f  ook for nodes (o
d840: 72 20 73 75 62 74 72 65 65 73 29 20 6f 66 20 74  r subtrees) of t
d850: 68 65 20 0a 2a 2a 20 66 6f 72 6d 20 58 2e 59 2e  he .** form X.Y.
d860: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
d870: 20 5a 20 77 68 65 72 65 0a 2a 2a 0a 2a 2a 20 20   Z where.**.**  
d880: 20 20 20 20 58 3a 20 20 20 54 68 65 20 6e 61 6d      X:   The nam
d890: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 2e  e of a database.
d8a0: 20 20 45 78 3a 20 20 22 6d 61 69 6e 22 20 6f 72    Ex:  "main" or
d8b0: 20 22 74 65 6d 70 22 20 6f 72 0a 2a 2a 20 20 20   "temp" or.**   
d8c0: 20 20 20 20 20 20 20 20 74 68 65 20 73 79 6d 62          the symb
d8d0: 6f 6c 69 63 20 6e 61 6d 65 20 61 73 73 69 67 6e  olic name assign
d8e0: 65 64 20 74 6f 20 61 6e 20 41 54 54 41 43 48 2d  ed to an ATTACH-
d8f0: 65 64 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  ed database..**.
d900: 2a 2a 20 20 20 20 20 20 59 3a 20 20 20 54 68 65  **      Y:   The
d910: 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   name of a table
d920: 20 69 6e 20 61 20 46 52 4f 4d 20 63 6c 61 75 73   in a FROM claus
d930: 65 2e 20 20 4f 72 20 69 6e 20 61 20 74 72 69 67  e.  Or in a trig
d940: 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ger.**          
d950: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
d960: 69 61 6c 20 6e 61 6d 65 73 20 22 6f 6c 64 22 20  ial names "old" 
d970: 6f 72 20 22 6e 65 77 22 2e 0a 2a 2a 0a 2a 2a 20  or "new"..**.** 
d980: 20 20 20 20 20 5a 3a 20 20 20 54 68 65 20 6e 61       Z:   The na
d990: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69  me of a column i
d9a0: 6e 20 74 61 62 6c 65 20 59 2e 0a 2a 2a 0a 2a 2a  n table Y..**.**
d9b0: 20 54 68 65 20 6e 6f 64 65 20 61 74 20 74 68 65   The node at the
d9c0: 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 73 75 62   root of the sub
d9d0: 74 72 65 65 20 69 73 20 6d 6f 64 69 66 69 65 64  tree is modified
d9e0: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
d9f0: 2a 2a 20 20 20 20 45 78 70 72 2e 6f 70 20 20 20  **    Expr.op   
da00: 20 20 20 20 20 43 68 61 6e 67 65 64 20 74 6f 20       Changed to 
da10: 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20  TK_COLUMN.**    
da20: 45 78 70 72 2e 70 54 61 62 20 20 20 20 20 20 50  Expr.pTab      P
da30: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62  oints to the Tab
da40: 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 58 2e  le object for X.
da50: 59 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 43 6f  Y.**    Expr.iCo
da60: 6c 75 6d 6e 20 20 20 54 68 65 20 63 6f 6c 75 6d  lumn   The colum
da70: 6e 20 69 6e 64 65 78 20 69 6e 20 58 2e 59 2e 20  n index in X.Y. 
da80: 20 2d 31 20 66 6f 72 20 74 68 65 20 72 6f 77 69   -1 for the rowi
da90: 64 2e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 54  d..**    Expr.iT
daa0: 61 62 6c 65 20 20 20 20 54 68 65 20 56 44 42 45  able    The VDBE
dab0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
dac0: 6f 72 20 58 2e 59 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  or X.Y.**.**.** 
dad0: 54 6f 20 72 65 73 6f 6c 76 65 20 72 65 73 75 6c  To resolve resul
dae0: 74 2d 73 65 74 20 72 65 66 65 72 65 6e 63 65 73  t-set references
daf0: 2c 20 6c 6f 6f 6b 20 66 6f 72 20 65 78 70 72 65  , look for expre
db00: 73 73 69 6f 6e 20 6e 6f 64 65 73 20 6f 66 20 74  ssion nodes of t
db10: 68 65 0a 2a 2a 20 66 6f 72 6d 20 5a 20 28 77 69  he.** form Z (wi
db20: 74 68 20 6e 6f 20 58 20 61 6e 64 20 59 20 70 72  th no X and Y pr
db30: 65 66 69 78 29 20 77 68 65 72 65 20 74 68 65 20  efix) where the 
db40: 5a 20 6d 61 74 63 68 65 73 20 74 68 65 20 72 69  Z matches the ri
db50: 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 7a 65  ght-hand.** size
db60: 20 6f 66 20 61 6e 20 41 53 20 63 6c 61 75 73 65   of an AS clause
db70: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73   in the result-s
db80: 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 20  et of a SELECT. 
db90: 20 54 68 65 20 5a 20 65 78 70 72 65 73 73 69 6f   The Z expressio
dba0: 6e 0a 2a 2a 20 69 73 20 72 65 70 6c 61 63 65 64  n.** is replaced
dbb0: 20 62 79 20 61 20 63 6f 70 79 20 6f 66 20 74 68   by a copy of th
dbc0: 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  e left-hand side
dbd0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73   of the result-s
dbe0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  et expression..*
dbf0: 2a 20 54 61 62 6c 65 2d 6e 61 6d 65 20 61 6e 64  * Table-name and
dc00: 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 6f 6c 75   function resolu
dc10: 74 69 6f 6e 20 6f 63 63 75 72 73 20 6f 6e 20 74  tion occurs on t
dc20: 68 65 20 73 75 62 73 74 69 74 75 74 65 64 20 65  he substituted e
dc30: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65  xpression.** tre
dc40: 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  e.  For example,
dc50: 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20   in:.**.**      
dc60: 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c  SELECT a+b AS x,
dc70: 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74   c+d AS y FROM t
dc80: 31 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 2a 2a  1 ORDER BY x;.**
dc90: 0a 2a 2a 20 54 68 65 20 22 78 22 20 74 65 72 6d  .** The "x" term
dca0: 20 6f 66 20 74 68 65 20 6f 72 64 65 72 20 62 79   of the order by
dcb0: 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
dcc0: 22 61 2b 62 22 20 74 6f 20 72 65 6e 64 65 72 3a  "a+b" to render:
dcd0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45  .**.**      SELE
dce0: 43 54 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64  CT a+b AS x, c+d
dcf0: 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52   AS y FROM t1 OR
dd00: 44 45 52 20 42 59 20 61 2b 62 3b 0a 2a 2a 0a 2a  DER BY a+b;.**.*
dd10: 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  * Function calls
dd20: 20 61 72 65 20 63 68 65 63 6b 65 64 20 74 6f 20   are checked to 
dd30: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
dd40: 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a  he function is .
dd50: 2a 2a 20 64 65 66 69 6e 65 64 20 61 6e 64 20 74  ** defined and t
dd60: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  hat the correct 
dd70: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
dd80: 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65  nts are specifie
dd90: 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e  d..** If the fun
dda0: 63 74 69 6f 6e 20 69 73 20 61 6e 20 61 67 67 72  ction is an aggr
ddb0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20  egate function, 
ddc0: 74 68 65 6e 20 74 68 65 20 4e 43 5f 48 61 73 41  then the NC_HasA
ddd0: 67 67 20 66 6c 61 67 20 69 73 0a 2a 2a 20 73 65  gg flag is.** se
dde0: 74 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65  t and the opcode
ddf0: 20 69 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d   is changed from
de00: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 74 6f 20   TK_FUNCTION to 
de10: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e  TK_AGG_FUNCTION.
de20: 0a 2a 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73  .** If an expres
de30: 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67  sion contains ag
de40: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
de50: 73 20 74 68 65 6e 20 74 68 65 20 45 50 5f 41 67  s then the EP_Ag
de60: 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e  g.** property on
de70: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
de80: 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e  is set..**.** An
de90: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
dea0: 73 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65  s left in pParse
deb0: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
dec0: 61 6d 69 73 73 2e 20 20 54 68 65 20 6e 75 6d 62  amiss.  The numb
ded0: 65 72 0a 2a 2a 20 69 66 20 65 72 72 6f 72 73 20  er.** if errors 
dee0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
def0: 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  int sqlite3Resol
df00: 76 65 45 78 70 72 4e 61 6d 65 73 28 20 0a 20 20  veExprNames( .  
df10: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
df20: 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73  ,       /* Names
df30: 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  pace to resolve 
df40: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20  expressions in. 
df50: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df70: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
df80: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  o be analyzed. *
df90: 2f 0a 29 7b 0a 20 20 75 31 36 20 73 61 76 65 64  /.){.  u16 saved
dfa0: 48 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b 65 72  HasAgg;.  Walker
dfb0: 20 77 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72   w;..  if( pExpr
dfc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
dfd0: 49 54 45 5f 4f 4b 3b 0a 20 20 73 61 76 65 64 48  ITE_OK;.  savedH
dfe0: 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 6e 63 46  asAgg = pNC->ncF
dff0: 6c 61 67 73 20 26 20 28 4e 43 5f 48 61 73 41 67  lags & (NC_HasAg
e000: 67 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b  g|NC_MinMaxAgg);
e010: 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  .  pNC->ncFlags 
e020: 26 3d 20 7e 28 4e 43 5f 48 61 73 41 67 67 7c 4e  &= ~(NC_HasAgg|N
e030: 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a 20 20  C_MinMaxAgg);.  
e040: 77 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e  w.pParse = pNC->
e050: 70 50 61 72 73 65 3b 0a 20 20 77 2e 78 45 78 70  pParse;.  w.xExp
e060: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f  rCallback = reso
e070: 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77  lveExprStep;.  w
e080: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
e090: 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74   = resolveSelect
e0a0: 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Step;.  w.xSelec
e0b0: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
e0c0: 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b    w.u.pNC = pNC;
e0d0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
e0e0: 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 77  EXPR_DEPTH>0.  w
e0f0: 2e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74  .pParse->nHeight
e100: 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67   += pExpr->nHeig
e110: 68 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ht;.  if( sqlite
e120: 33 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74  3ExprCheckHeight
e130: 28 77 2e 70 50 61 72 73 65 2c 20 77 2e 70 50 61  (w.pParse, w.pPa
e140: 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 20 29 7b  rse->nHeight) ){
e150: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e160: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65  TE_ERROR;.  }.#e
e170: 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61  ndif.  sqlite3Wa
e180: 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72  lkExpr(&w, pExpr
e190: 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  );.#if SQLITE_MA
e1a0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
e1b0: 20 77 2e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67   w.pParse->nHeig
e1c0: 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65  ht -= pExpr->nHe
e1d0: 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ight;.#endif.  i
e1e0: 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  f( pNC->ncFlags 
e1f0: 26 20 4e 43 5f 48 61 73 41 67 67 20 29 7b 0a 20  & NC_HasAgg ){. 
e200: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
e210: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67  ty(pExpr, EP_Agg
e220: 29 3b 0a 20 20 7d 0a 20 20 70 4e 43 2d 3e 6e 63  );.  }.  pNC->nc
e230: 46 6c 61 67 73 20 7c 3d 20 73 61 76 65 64 48 61  Flags |= savedHa
e240: 73 41 67 67 3b 0a 20 20 72 65 74 75 72 6e 20 70  sAgg;.  return p
e250: 4e 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 77 2e  NC->nErr>0 || w.
e260: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 3b 0a  pParse->nErr>0;.
e270: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
e280: 20 61 6c 6c 20 6e 61 6d 65 73 20 66 6f 72 20 61   all names for a
e290: 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  ll expression in
e2a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
e2b0: 69 73 74 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  ist.  This is.**
e2c0: 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74   just like sqlit
e2d0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
e2e0: 65 73 28 29 20 65 78 63 65 70 74 20 74 68 61 74  es() except that
e2f0: 20 69 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e   it works for an
e300: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6c   expression.** l
e310: 69 73 74 20 72 61 74 68 65 72 20 74 68 61 6e 20  ist rather than 
e320: 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73  a single express
e330: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
e340: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69  te3ResolveExprLi
e350: 73 74 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65  stNames( .  Name
e360: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
e370: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
e380: 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72   to resolve expr
e390: 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20  essions in. */. 
e3a0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
e3b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e3c0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
e3d0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20  to be analyzed. 
e3e0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
e3f0: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
e400: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
e410: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
e420: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
e430: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
e440: 65 73 28 70 4e 43 2c 20 70 4c 69 73 74 2d 3e 61  es(pNC, pList->a
e450: 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72 65 74  [i].pExpr) ) ret
e460: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e470: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
e480: 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a  n WRC_Continue;.
e490: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
e4a0: 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 61 6c   all names in al
e4b0: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  l expressions of
e4c0: 20 61 20 53 45 4c 45 43 54 20 61 6e 64 20 69 6e   a SELECT and in
e4d0: 20 61 6c 6c 0a 2a 2a 20 64 65 63 65 6e 64 65 6e   all.** decenden
e4e0: 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  ts of the SELECT
e4f0: 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 6f 6d 70  , including comp
e500: 6f 75 6e 64 73 20 6f 66 66 20 6f 66 20 70 2d 3e  ounds off of p->
e510: 70 50 72 69 6f 72 2c 0a 2a 2a 20 73 75 62 71 75  pPrior,.** subqu
e520: 65 72 69 65 73 20 69 6e 20 65 78 70 72 65 73 73  eries in express
e530: 69 6f 6e 73 2c 20 61 6e 64 20 73 75 62 71 75 65  ions, and subque
e540: 72 69 65 73 20 75 73 65 64 20 61 73 20 46 52 4f  ries used as FRO
e550: 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d  M clause.** term
e560: 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 73 71 6c  s..**.** See sql
e570: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
e580: 61 6d 65 73 28 29 20 66 6f 72 20 61 20 64 65 73  ames() for a des
e590: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
e5a0: 6b 69 6e 64 73 20 6f 66 0a 2a 2a 20 74 72 61 6e  kinds of.** tran
e5b0: 73 66 6f 72 6d 61 74 69 6f 6e 73 20 74 68 61 74  sformations that
e5c0: 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c   occur..**.** Al
e5d0: 6c 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  l SELECT stateme
e5e0: 6e 74 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20  nts should have 
e5f0: 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20 75 73  been expanded us
e600: 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65  ing.** sqlite3Se
e610: 6c 65 63 74 45 78 70 61 6e 64 28 29 20 70 72 69  lectExpand() pri
e620: 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
e630: 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
e640: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f  void sqlite3Reso
e650: 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 0a  lveSelectNames(.
e660: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e670: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e680: 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  parser context *
e690: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20  /.  Select *p,  
e6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e6b0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
e6c0: 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20  nt being coded. 
e6d0: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
e6e0: 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e   *pOuterNC  /* N
e6f0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
e700: 70 61 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74  parent SELECT st
e710: 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  atement */.){.  
e720: 57 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 61 73 73  Walker w;..  ass
e730: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 77  ert( p!=0 );.  w
e740: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
e750: 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70   resolveExprStep
e760: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
e770: 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 53  lback = resolveS
e780: 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77 2e 78  electStep;.  w.x
e790: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
e7a0: 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20  = 0;.  w.pParse 
e7b0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 75 2e  = pParse;.  w.u.
e7c0: 70 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a  pNC = pOuterNC;.
e7d0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
e7e0: 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 0a 2f  ect(&w, p);.}../
e7f0: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d  *.** Resolve nam
e800: 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  es in expression
e810: 73 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  s that can only 
e820: 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
e830: 6c 65 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20  le table:.**.** 
e840: 20 20 20 2a 20 20 20 43 48 45 43 4b 20 63 6f 6e     *   CHECK con
e850: 73 74 72 61 69 6e 74 73 0a 2a 2a 20 20 20 20 2a  straints.**    *
e860: 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 73     WHERE clauses
e870: 20 6f 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 69   on partial indi
e880: 63 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78  ces.**.** The Ex
e890: 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75 65 20  pr.iTable value 
e8a0: 66 6f 72 20 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f  for Expr.op==TK_
e8b0: 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 6f 66 20  COLUMN nodes of 
e8c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
e8d0: 2a 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 61  * is set to -1 a
e8e0: 6e 64 20 74 68 65 20 45 78 70 72 2e 69 43 6f 6c  nd the Expr.iCol
e8f0: 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 73 65 74  umn value is set
e900: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   to the column n
e910: 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  umber..**.** Any
e920: 20 65 72 72 6f 72 73 20 63 61 75 73 65 20 61 6e   errors cause an
e930: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
e940: 6f 20 62 65 20 73 65 74 20 69 6e 20 70 50 61 72  o be set in pPar
e950: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
e960: 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65  te3ResolveSelfRe
e970: 66 65 72 65 6e 63 65 28 0a 20 20 50 61 72 73 65  ference(.  Parse
e980: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
e990: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
e9a0: 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  t */.  Table *pT
e9b0: 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ab,        /* Th
e9c0: 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 72 65  e table being re
e9d0: 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20 69 6e  ferenced */.  in
e9e0: 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  t type,         
e9f0: 20 20 2f 2a 20 4e 43 5f 49 73 43 68 65 63 6b 20    /* NC_IsCheck 
ea00: 6f 72 20 4e 43 5f 50 61 72 74 49 64 78 20 6f 72  or NC_PartIdx or
ea10: 20 4e 43 5f 49 64 78 45 78 70 72 20 2a 2f 0a 20   NC_IdxExpr */. 
ea20: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
ea30: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
ea40: 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20 20  on to resolve.  
ea50: 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
ea60: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
ea70: 74 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73  t     /* Express
ea80: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72 65 73 6f  ion list to reso
ea90: 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c  lve.  May be NUL
eaa0: 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  L. */.){.  SrcLi
eab0: 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20  st sSrc;        
eac0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
ead0: 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70  ke SrcList for p
eae0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
eaf0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
eb00: 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
eb10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
eb20: 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65  ntext for pParse
eb30: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a  ->pNewTable */..
eb40: 20 20 61 73 73 65 72 74 28 20 74 79 70 65 3d 3d    assert( type==
eb50: 4e 43 5f 49 73 43 68 65 63 6b 20 7c 7c 20 74 79  NC_IsCheck || ty
eb60: 70 65 3d 3d 4e 43 5f 50 61 72 74 49 64 78 20 7c  pe==NC_PartIdx |
eb70: 7c 20 74 79 70 65 3d 3d 4e 43 5f 49 64 78 45 78  | type==NC_IdxEx
eb80: 70 72 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr );.  memset(&
eb90: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
eba0: 4e 43 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  NC));.  memset(&
ebb0: 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSrc, 0, sizeof(
ebc0: 73 53 72 63 29 29 3b 0a 20 20 73 53 72 63 2e 6e  sSrc));.  sSrc.n
ebd0: 53 72 63 20 3d 20 31 3b 0a 20 20 73 53 72 63 2e  Src = 1;.  sSrc.
ebe0: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 54 61  a[0].zName = pTa
ebf0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 53 72 63  b->zName;.  sSrc
ec00: 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 54 61  .a[0].pTab = pTa
ec10: 62 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69  b;.  sSrc.a[0].i
ec20: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 73  Cursor = -1;.  s
ec30: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
ec40: 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  se;.  sNC.pSrcLi
ec50: 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 73 4e  st = &sSrc;.  sN
ec60: 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74 79 70 65  C.ncFlags = type
ec70: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  ;.  if( sqlite3R
ec80: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
ec90: 26 73 4e 43 2c 20 70 45 78 70 72 29 20 29 20 72  &sNC, pExpr) ) r
eca0: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4c 69  eturn;.  if( pLi
ecb0: 73 74 20 29 20 73 71 6c 69 74 65 33 52 65 73 6f  st ) sqlite3Reso
ecc0: 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73  lveExprListNames
ecd0: 28 26 73 4e 43 2c 20 70 4c 69 73 74 29 3b 0a 7d  (&sNC, pList);.}
ece0: 0a                                               .