/ Hex Artifact Content
Login

Artifact f9bc0de45a30a450da47b3766de00be89bf9be79:


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 3d 3d 30 20 29 20 72 65 74 75 72   pDup==0 ) retur
0ad0: 6e 3b 0a 20 20 69 66 28 20 7a 54 79 70 65 5b 30  n;.  if( zType[0
0ae0: 5d 21 3d 27 47 27 20 29 20 69 6e 63 72 41 67 67  ]!='G' ) incrAgg
0af0: 46 75 6e 63 74 69 6f 6e 44 65 70 74 68 28 70 44  FunctionDepth(pD
0b00: 75 70 2c 20 6e 53 75 62 71 75 65 72 79 29 3b 0a  up, nSubquery);.
0b10: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
0b20: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20  =TK_COLLATE ){. 
0b30: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
0b40: 33 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53  3ExprAddCollateS
0b50: 74 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 44  tring(pParse, pD
0b60: 75 70 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  up, pExpr->u.zTo
0b70: 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20 45 78 70 72  ken);.  }.  Expr
0b80: 53 65 74 50 72 6f 70 65 72 74 79 28 70 44 75 70  SetProperty(pDup
0b90: 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a 0a 20 20  , EP_Alias);..  
0ba0: 2f 2a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e  /* Before callin
0bb0: 67 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  g sqlite3ExprDel
0bc0: 65 74 65 28 29 2c 20 73 65 74 20 74 68 65 20 45  ete(), set the E
0bd0: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 2e 20 54  P_Static flag. T
0be0: 68 69 73 20 0a 20 20 2a 2a 20 70 72 65 76 65 6e  his .  ** preven
0bf0: 74 73 20 45 78 70 72 44 65 6c 65 74 65 28 29 20  ts ExprDelete() 
0c00: 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67 20 74 68  from deleting th
0c10: 65 20 45 78 70 72 20 73 74 72 75 63 74 75 72 65  e Expr structure
0c20: 20 69 74 73 65 6c 66 2c 0a 20 20 2a 2a 20 61 6c   itself,.  ** al
0c30: 6c 6f 77 69 6e 67 20 69 74 20 74 6f 20 62 65 20  lowing it to be 
0c40: 72 65 70 6f 70 75 6c 61 74 65 64 20 62 79 20 74  repopulated by t
0c50: 68 65 20 6d 65 6d 63 70 79 28 29 20 6f 6e 20 74  he memcpy() on t
0c60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 69 6e  he following lin
0c70: 65 2e 0a 20 20 2a 2a 20 54 68 65 20 70 45 78 70  e..  ** The pExp
0c80: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 6d 69 67 68  r->u.zToken migh
0c90: 74 20 70 6f 69 6e 74 20 69 6e 74 6f 20 6d 65 6d  t point into mem
0ca0: 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ory that will be
0cb0: 20 66 72 65 65 64 20 62 79 20 74 68 65 0a 20 20   freed by the.  
0cc0: 2a 2a 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ** sqlite3DbFree
0cd0: 28 64 62 2c 20 70 44 75 70 29 20 6f 6e 20 74 68  (db, pDup) on th
0ce0: 65 20 6c 61 73 74 20 6c 69 6e 65 20 6f 66 20 74  e last line of t
0cf0: 68 69 73 20 62 6c 6f 63 6b 2c 20 73 6f 20 62 65  his block, so be
0d00: 20 73 75 72 65 20 74 6f 0a 20 20 2a 2a 20 6d 61   sure to.  ** ma
0d10: 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
0d20: 20 74 6f 6b 65 6e 20 62 65 66 6f 72 65 20 64 6f   token before do
0d30: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 44  ing the sqlite3D
0d40: 62 46 72 65 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  bFree()..  */.  
0d50: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
0d60: 70 45 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63  pExpr, EP_Static
0d70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
0d80: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
0d90: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 45 78 70  );.  memcpy(pExp
0da0: 72 2c 20 70 44 75 70 2c 20 73 69 7a 65 6f 66 28  r, pDup, sizeof(
0db0: 2a 70 45 78 70 72 29 29 3b 0a 20 20 69 66 28 20  *pExpr));.  if( 
0dc0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
0dd0: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
0de0: 6c 75 65 29 20 26 26 20 70 45 78 70 72 2d 3e 75  lue) && pExpr->u
0df0: 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29 7b 0a 20 20  .zToken!=0 ){.  
0e00: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
0e10: 2d 3e 66 6c 61 67 73 20 26 20 28 45 50 5f 52 65  ->flags & (EP_Re
0e20: 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  duced|EP_TokenOn
0e30: 6c 79 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ly))==0 );.    p
0e40: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d  Expr->u.zToken =
0e50: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
0e60: 28 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  (db, pExpr->u.zT
0e70: 6f 6b 65 6e 29 3b 0a 20 20 20 20 70 45 78 70 72  oken);.    pExpr
0e80: 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 4d 65  ->flags |= EP_Me
0e90: 6d 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 73 71  mToken;.  }.  sq
0ea0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0eb0: 70 44 75 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pDup);.}.../*.**
0ec0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
0ed0: 74 68 65 20 6e 61 6d 65 20 7a 43 6f 6c 20 6f 63  the name zCol oc
0ee0: 63 75 72 73 20 61 6e 79 77 68 65 72 65 20 69 6e  curs anywhere in
0ef0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
0f00: 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
0f10: 46 41 4c 53 45 20 69 66 20 74 68 65 20 55 53 49  FALSE if the USI
0f20: 4e 47 20 63 6c 61 75 73 65 20 69 73 20 4e 55 4c  NG clause is NUL
0f30: 4c 20 6f 72 20 69 66 20 69 74 20 64 6f 65 73 20  L or if it does 
0f40: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 7a  not contain.** z
0f50: 43 6f 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Col..*/.static i
0f60: 6e 74 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c  nt nameInUsingCl
0f70: 61 75 73 65 28 49 64 4c 69 73 74 20 2a 70 55 73  ause(IdList *pUs
0f80: 69 6e 67 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ing, const char 
0f90: 2a 7a 43 6f 6c 29 7b 0a 20 20 69 66 28 20 70 55  *zCol){.  if( pU
0fa0: 73 69 6e 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  sing ){.    int 
0fb0: 6b 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  k;.    for(k=0; 
0fc0: 6b 3c 70 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b  k<pUsing->nId; k
0fd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
0fe0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 55  qlite3StrICmp(pU
0ff0: 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65  sing->a[k].zName
1000: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74  , zCol)==0 ) ret
1010: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1020: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1030: 2f 2a 0a 2a 2a 20 53 75 62 71 75 65 72 69 65 73  /*.** Subqueries
1040: 20 73 74 6f 72 65 73 20 74 68 65 20 6f 72 69 67   stores the orig
1050: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2c 20 74  inal database, t
1060: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20  able and column 
1070: 6e 61 6d 65 73 20 66 6f 72 20 74 68 65 69 72 0a  names for their.
1080: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 73 20 69  ** result sets i
1090: 6e 20 45 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a  n ExprList.a[].z
10a0: 53 70 61 6e 2c 20 69 6e 20 74 68 65 20 66 6f 72  Span, in the for
10b0: 6d 20 22 44 41 54 41 42 41 53 45 2e 54 41 42 4c  m "DATABASE.TABL
10c0: 45 2e 43 4f 4c 55 4d 4e 22 2e 0a 2a 2a 20 43 68  E.COLUMN"..** Ch
10d0: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
10e0: 65 20 7a 53 70 61 6e 20 67 69 76 65 6e 20 74 6f  e zSpan given to
10f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   this routine ma
1100: 74 63 68 65 73 20 74 68 65 20 7a 44 62 2c 20 7a  tches the zDb, z
1110: 54 61 62 2c 0a 2a 2a 20 61 6e 64 20 7a 43 6f 6c  Tab,.** and zCol
1120: 2e 20 20 49 66 20 61 6e 79 20 6f 66 20 7a 44 62  .  If any of zDb
1130: 2c 20 7a 54 61 62 2c 20 61 6e 64 20 7a 43 6f 6c  , zTab, and zCol
1140: 20 61 72 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74   are NULL then t
1150: 68 6f 73 65 20 66 69 65 6c 64 73 20 77 69 6c 6c  hose fields will
1160: 0a 2a 2a 20 6d 61 74 63 68 20 61 6e 79 74 68 69  .** match anythi
1170: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1180: 65 33 4d 61 74 63 68 53 70 61 6e 4e 61 6d 65 28  e3MatchSpanName(
1190: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11a0: 53 70 61 6e 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Span,.  const ch
11b0: 61 72 20 2a 7a 43 6f 6c 2c 0a 20 20 63 6f 6e 73  ar *zCol,.  cons
11c0: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 0a 20 20  t char *zTab,.  
11d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 0a  const char *zDb.
11e0: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
11f0: 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53  r(n=0; ALWAYS(zS
1200: 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e  pan[n]) && zSpan
1210: 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d  [n]!='.'; n++){}
1220: 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 28 73  .  if( zDb && (s
1230: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
1240: 53 70 61 6e 2c 20 7a 44 62 2c 20 6e 29 21 3d 30  Span, zDb, n)!=0
1250: 20 7c 7c 20 7a 44 62 5b 6e 5d 21 3d 30 29 20 29   || zDb[n]!=0) )
1260: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
1270: 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b 3d 20 6e    }.  zSpan += n
1280: 2b 31 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41  +1;.  for(n=0; A
1290: 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20  LWAYS(zSpan[n]) 
12a0: 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27  && zSpan[n]!='.'
12b0: 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a  ; n++){}.  if( z
12c0: 54 61 62 20 26 26 20 28 73 71 6c 69 74 65 33 53  Tab && (sqlite3S
12d0: 74 72 4e 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a  trNICmp(zSpan, z
12e0: 54 61 62 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 54  Tab, n)!=0 || zT
12f0: 61 62 5b 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20  ab[n]!=0) ){.   
1300: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1310: 20 7a 53 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20   zSpan += n+1;. 
1320: 20 69 66 28 20 7a 43 6f 6c 20 26 26 20 73 71 6c   if( zCol && sql
1330: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 53 70 61  ite3StrICmp(zSpa
1340: 6e 2c 20 7a 43 6f 6c 29 21 3d 30 20 29 7b 0a 20  n, zCol)!=0 ){. 
1350: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1360: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
1370: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
1380: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
1390: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59   of the form X.Y
13a0: 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73  .Z or Y.Z or jus
13b0: 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20  t Z, look up.** 
13c0: 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65  that name in the
13d0: 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74   set of source t
13e0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73  ables in pSrcLis
13f0: 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70  t and make the p
1400: 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73  Expr .** express
1410: 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62  ion node refer b
1420: 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72  ack to that sour
1430: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
1440: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
1450: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
1460: 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20   pExpr:.**.**   
1470: 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20   pExpr->iDb     
1480: 20 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e        Set the in
1490: 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  dex in db->aDb[]
14a0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
14b0: 20 58 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   X.**           
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65                (e
14d0: 76 65 6e 20 69 66 20 58 20 69 73 20 69 6d 70 6c  ven if X is impl
14e0: 69 65 64 29 2e 0a 2a 2a 20 20 20 20 70 45 78 70  ied)..**    pExp
14f0: 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20  r->iTable       
1500: 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73   Set to the curs
1510: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
1520: 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64  e table obtained
1530: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1540: 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d              from
1550: 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20   pSrcList..**   
1560: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 20 20 20   pExpr->pTab    
1570: 20 20 20 20 20 20 50 6f 69 6e 74 73 20 74 6f 20        Points to 
1580: 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74  the Table struct
1590: 75 72 65 20 6f 66 20 58 2e 59 20 28 65 76 65 6e  ure of X.Y (even
15a0: 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   if.**          
15b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58                 X
15c0: 20 61 6e 64 2f 6f 72 20 59 20 61 72 65 20 69 6d   and/or Y are im
15d0: 70 6c 69 65 64 2e 29 0a 2a 2a 20 20 20 20 70 45  plied.).**    pE
15e0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20  xpr->iColumn    
15f0: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f     Set to the co
1600: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68  lumn number with
1610: 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
1620: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
1630: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20           Set to 
1640: 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20  TK_COLUMN..**   
1650: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20   pExpr->pLeft   
1660: 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73        Any expres
1670: 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73  sion this points
1680: 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a   to is deleted.*
1690: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67  *    pExpr->pRig
16a0: 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  ht        Any ex
16b0: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
16c0: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
16d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 44  ed..**.** The zD
16e0: 62 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68  b variable is th
16f0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
1700: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
1710: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
1720: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
1730: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
1740: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
1750: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
1760: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
1770: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
1780: 20 54 68 65 20 7a 54 61 62 6c 65 20 76 61 72 69   The zTable vari
1790: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
17a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74   of the table (t
17b0: 68 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a  he "Y").  This.*
17c0: 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e  * value can be N
17d0: 55 4c 4c 20 69 66 20 7a 44 62 20 69 73 20 61 6c  ULL if zDb is al
17e0: 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 7a 54 61  so NULL.  If zTa
17f0: 62 6c 65 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a  ble is NULL it.*
1800: 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
1810: 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d   form of the nam
1820: 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20  e is Z and that 
1830: 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79  columns from any
1840: 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65   table.** can be
1850: 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   used..**.** If 
1860: 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20  the name cannot 
1870: 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d  be resolved unam
1880: 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65  biguously, leave
1890: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
18a0: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61  e.** in pParse a
18b0: 6e 64 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62  nd return WRC_Ab
18c0: 6f 72 74 2e 20 20 52 65 74 75 72 6e 20 57 52 43  ort.  Return WRC
18d0: 5f 50 72 75 6e 65 20 6f 6e 20 73 75 63 63 65 73  _Prune on succes
18e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
18f0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
1900: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
1910: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
1920: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
1930: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
1940: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1950: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1960: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f  taining table, o
1970: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
1980: 74 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 20 20  t char *zTab,   
1990: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
19a0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c  e containing col
19b0: 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  umn, or NULL */.
19c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
19d0: 6f 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ol,    /* Name o
19e0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f  f the column. */
19f0: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
1a00: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  pNC,    /* The n
1a10: 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64  ame context used
1a20: 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20   to resolve the 
1a30: 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
1a40: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f  pExpr          /
1a50: 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52  * Make this EXPR
1a60: 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74   node point to t
1a70: 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75  he selected colu
1a80: 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  mn */.){.  int i
1a90: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
1ac0: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20  .  int cnt = 0; 
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1af0: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
1b00: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
1b10: 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20   cntTab = 0;    
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
1b40: 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73  hing table names
1b50: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 71 75   */.  int nSubqu
1b60: 65 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ery = 0;        
1b70: 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d          /* How m
1b80: 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75  any levels of su
1b90: 62 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69  bquery */.  sqli
1ba0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1bb0: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 2f 2a  ->db;         /*
1bc0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1bd0: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 74  nnection */.  st
1be0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1bf0: 6d 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20  m *pItem;       
1c00: 2f 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69  /* Use for loopi
1c10: 6e 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74  ng over pSrcList
1c20: 20 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75   items */.  stru
1c30: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1c40: 2a 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a  *pMatch = 0;  /*
1c50: 20 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53   The matching pS
1c60: 72 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20  rcList item */. 
1c70: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54   NameContext *pT
1c80: 6f 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20  opNC = pNC;     
1c90: 20 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65     /* First name
1ca0: 63 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c  context in the l
1cb0: 69 73 74 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20  ist */.  Schema 
1cc0: 2a 70 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20  *pSchema = 0;   
1cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
1ce0: 68 65 6d 61 20 6f 66 20 74 68 65 20 65 78 70 72  hema of the expr
1cf0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
1d00: 69 73 54 72 69 67 67 65 72 20 3d 20 30 3b 20 20  isTrigger = 0;  
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d20: 20 54 72 75 65 20 69 66 20 72 65 73 6f 6c 76 65   True if resolve
1d30: 64 20 74 6f 20 61 20 74 72 69 67 67 65 72 20 63  d to a trigger c
1d40: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 54 61 62 6c 65  olumn */.  Table
1d50: 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *pTab = 0;     
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d70: 54 61 62 6c 65 20 68 6f 6c 64 20 74 68 65 20 72  Table hold the r
1d80: 6f 77 20 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a  ow */.  Column *
1d90: 70 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pCol;           
1da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
1db0: 6f 6c 75 6d 6e 20 6f 66 20 70 54 61 62 20 2a 2f  olumn of pTab */
1dc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 20  ..  assert( pNC 
1dd0: 29 3b 20 20 20 20 20 2f 2a 20 74 68 65 20 6e 61  );     /* the na
1de0: 6d 65 20 63 6f 6e 74 65 78 74 20 63 61 6e 6e 6f  me context canno
1df0: 74 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  t be NULL. */.  
1e00: 61 73 73 65 72 74 28 20 7a 43 6f 6c 20 29 3b 20  assert( zCol ); 
1e10: 20 20 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58     /* The Z in X
1e20: 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e  .Y.Z cannot be N
1e30: 55 4c 4c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ULL */.  assert(
1e40: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
1e50: 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65  y(pExpr, EP_Toke
1e60: 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64  nOnly|EP_Reduced
1e70: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ) );..  /* Initi
1e80: 61 6c 69 7a 65 20 74 68 65 20 6e 6f 64 65 20 74  alize the node t
1e90: 6f 20 6e 6f 2d 6d 61 74 63 68 20 2a 2f 0a 20 20  o no-match */.  
1ea0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1eb0: 2d 31 3b 0a 20 20 70 45 78 70 72 2d 3e 70 54 61  -1;.  pExpr->pTa
1ec0: 62 20 3d 20 30 3b 0a 20 20 45 78 70 72 53 65 74  b = 0;.  ExprSet
1ed0: 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78 70  VVAProperty(pExp
1ee0: 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29 3b  r, EP_NoReduce);
1ef0: 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74 65  ..  /* Translate
1f00: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
1f10: 20 69 6e 20 7a 44 62 20 69 6e 74 6f 20 61 20 70   in zDb into a p
1f20: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
1f30: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 20 20 2a 2a  rresponding.  **
1f40: 20 73 63 68 65 6d 61 2e 20 20 49 66 20 6e 6f 74   schema.  If not
1f50: 20 66 6f 75 6e 64 2c 20 70 53 63 68 65 6d 61 20   found, pSchema 
1f60: 77 69 6c 6c 20 72 65 6d 61 69 6e 20 4e 55 4c 4c  will remain NULL
1f70: 20 61 6e 64 20 6e 6f 74 68 69 6e 67 20 77 69 6c   and nothing wil
1f80: 6c 20 6d 61 74 63 68 0a 20 20 2a 2a 20 72 65 73  l match.  ** res
1f90: 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 70 70  ulting in an app
1fa0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 6d  ropriate error m
1fb0: 65 73 73 61 67 65 20 74 6f 77 61 72 64 20 74 68  essage toward th
1fc0: 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 72 6f  e end of this ro
1fd0: 75 74 69 6e 65 0a 20 20 2a 2f 0a 20 20 69 66 28  utine.  */.  if(
1fe0: 20 7a 44 62 20 29 7b 0a 20 20 20 20 74 65 73 74   zDb ){.    test
1ff0: 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63 46 6c 61  case( pNC->ncFla
2000: 67 73 20 26 20 4e 43 5f 50 61 72 74 49 64 78 20  gs & NC_PartIdx 
2010: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
2020: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
2030: 4e 43 5f 49 73 43 68 65 63 6b 20 29 3b 0a 20 20  NC_IsCheck );.  
2040: 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c    if( (pNC->ncFl
2050: 61 67 73 20 26 20 28 4e 43 5f 50 61 72 74 49 64  ags & (NC_PartId
2060: 78 7c 4e 43 5f 49 73 43 68 65 63 6b 29 29 21 3d  x|NC_IsCheck))!=
2070: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 69  0 ){.      /* Si
2080: 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20 64 61  lently ignore da
2090: 74 61 62 61 73 65 20 71 75 61 6c 69 66 69 65 72  tabase qualifier
20a0: 73 20 69 6e 73 69 64 65 20 43 48 45 43 4b 20 63  s inside CHECK c
20b0: 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 0a 20  onstraints and. 
20c0: 20 20 20 20 20 2a 2a 20 70 61 72 74 69 61 6c 20       ** partial 
20d0: 69 6e 64 69 63 65 73 2e 20 20 44 6f 20 6e 6f 74  indices.  Do not
20e0: 20 72 61 69 73 65 20 65 72 72 6f 72 73 20 62 65   raise errors be
20f0: 63 61 75 73 65 20 74 68 61 74 20 6d 69 67 68 74  cause that might
2100: 20 62 72 65 61 6b 0a 20 20 20 20 20 20 2a 2a 20   break.      ** 
2110: 6c 65 67 61 63 79 20 61 6e 64 20 62 65 63 61 75  legacy and becau
2120: 73 65 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  se it does not h
2130: 75 72 74 20 61 6e 79 74 68 69 6e 67 20 74 6f 20  urt anything to 
2140: 6a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 65 0a  just ignore the.
2150: 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
2160: 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  e name. */.     
2170: 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 7d 65   zDb = 0;.    }e
2180: 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  lse{.      for(i
2190: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
21a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
21b0: 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ert( db->aDb[i].
21c0: 7a 44 62 53 4e 61 6d 65 20 29 3b 0a 20 20 20 20  zDbSName );.    
21d0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
21e0: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 69  trICmp(db->aDb[i
21f0: 5d 2e 7a 44 62 53 4e 61 6d 65 2c 7a 44 62 29 3d  ].zDbSName,zDb)=
2200: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2210: 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44  pSchema = db->aD
2220: 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  b[i].pSchema;.  
2230: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2240: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2250: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2260: 20 53 74 61 72 74 20 61 74 20 74 68 65 20 69 6e   Start at the in
2270: 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e 74 65 78 74  ner-most context
2280: 20 61 6e 64 20 6d 6f 76 65 20 6f 75 74 77 61 72   and move outwar
2290: 64 20 75 6e 74 69 6c 20 61 20 6d 61 74 63 68 20  d until a match 
22a0: 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 77 68  is found */.  wh
22b0: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
22c0: 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69  =0 ){.    ExprLi
22d0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
22e0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
22f0: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
2300: 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  t;..    if( pSrc
2310: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f  List ){.      fo
2320: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72  r(i=0, pItem=pSr
2330: 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63  cList->a; i<pSrc
2340: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
2350: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
2360: 20 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d     pTab = pItem-
2370: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
2380: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 26  ssert( pTab!=0 &
2390: 26 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d 30  & pTab->zName!=0
23a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
23b0: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
23c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
23d0: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26  pItem->pSelect &
23e0: 26 20 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  & (pItem->pSelec
23f0: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
2400: 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20  _NestedFrom)!=0 
2410: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2420: 20 68 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   hit = 0;.      
2430: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 49 74      pEList = pIt
2440: 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  em->pSelect->pEL
2450: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
2460: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74  or(j=0; j<pEList
2470: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
2480: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
2490: 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
24a0: 61 6d 65 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ame(pEList->a[j]
24b0: 2e 7a 53 70 61 6e 2c 20 7a 43 6f 6c 2c 20 7a 54  .zSpan, zCol, zT
24c0: 61 62 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  ab, zDb) ){.    
24d0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
24e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
24f0: 6e 74 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  ntTab = 2;.     
2500: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
2510: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
2520: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
2530: 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
2540: 20 20 20 20 20 20 20 20 20 68 69 74 20 3d 20 31           hit = 1
2550: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2560: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2570: 20 20 20 20 20 20 69 66 28 20 68 69 74 20 7c 7c        if( hit ||
2580: 20 7a 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69   zTab==0 ) conti
2590: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
25a0: 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 20 26         if( zDb &
25b0: 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 21  & pTab->pSchema!
25c0: 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  =pSchema ){.    
25d0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
25e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25f0: 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20    if( zTab ){.  
2600: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2610: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
2620: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70  Item->zAlias ? p
2630: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70  Item->zAlias : p
2640: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
2650: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
2660: 61 62 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  abName!=0 );.   
2670: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2680: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
2690: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a  me, zTab)!=0 ){.
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
26b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
26c0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26d0: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
26e0: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ab++) ){.       
26f0: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
2700: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
2710: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43       for(j=0, pC
2720: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
2730: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
2740: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
2750: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
2760: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
2770: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
2780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
2790: 49 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  If there has bee
27a0: 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 72  n exactly one pr
27b0: 69 6f 72 20 6d 61 74 63 68 20 61 6e 64 20 74 68  ior match and th
27c0: 69 73 20 6d 61 74 63 68 0a 20 20 20 20 20 20 20  is match.       
27d0: 20 20 20 20 20 2a 2a 20 69 73 20 66 6f 72 20 74       ** is for t
27e0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61  he right-hand ta
27f0: 62 6c 65 20 6f 66 20 61 20 4e 41 54 55 52 41 4c  ble of a NATURAL
2800: 20 4a 4f 49 4e 20 6f 72 20 69 73 20 69 6e 20 61   JOIN or is in a
2810: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
2820: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 74   USING clause, t
2830: 68 65 6e 20 73 6b 69 70 20 74 68 69 73 20 6d 61  hen skip this ma
2840: 74 63 68 2e 0a 20 20 20 20 20 20 20 20 20 20 20  tch..           
2850: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2860: 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20  if( cnt==1 ){.  
2870: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2880: 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
2890: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
28a0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
28b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 61            if( na
28c0: 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75 73 65 28  meInUsingClause(
28d0: 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pItem->pUsing, z
28e0: 43 6f 6c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Col) ) continue;
28f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2900: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
2910: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
2920: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
2930: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
2940: 73 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69  stitute the rowi
2950: 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f  d (column -1) fo
2960: 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  r the INTEGER PR
2970: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20  IMARY KEY */.   
2980: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2990: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
29a0: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
29b0: 28 69 31 36 29 6a 3b 0a 20 20 20 20 20 20 20 20  (i16)j;.        
29c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
29e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29f0: 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20 20 20  f( pMatch ){.   
2a00: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2a10: 6c 65 20 3d 20 70 4d 61 74 63 68 2d 3e 69 43 75  le = pMatch->iCu
2a20: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 45  rsor;.        pE
2a30: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61 74  xpr->pTab = pMat
2a40: 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ch->pTab;.      
2a50: 20 20 2f 2a 20 52 49 47 48 54 20 4a 4f 49 4e 20    /* RIGHT JOIN 
2a60: 6e 6f 74 20 28 79 65 74 29 20 73 75 70 70 6f 72  not (yet) suppor
2a70: 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ted */.        a
2a80: 73 73 65 72 74 28 20 28 70 4d 61 74 63 68 2d 3e  ssert( (pMatch->
2a90: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2aa0: 5f 52 49 47 48 54 29 3d 3d 30 20 29 3b 0a 20 20  _RIGHT)==0 );.  
2ab0: 20 20 20 20 20 20 69 66 28 20 28 70 4d 61 74 63        if( (pMatc
2ac0: 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  h->fg.jointype &
2ad0: 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
2ae0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
2af0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
2b00: 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a   EP_CanBeNull);.
2b10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b20: 20 20 70 53 63 68 65 6d 61 20 3d 20 70 45 78 70    pSchema = pExp
2b30: 72 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  r->pTab->pSchema
2b40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
2b50: 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74 20  /* if( pSrcList 
2b60: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
2b70: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
2b80: 52 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68  R.    /* If we h
2b90: 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  ave not already 
2ba0: 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d  resolved the nam
2bb0: 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20  e, then maybe . 
2bc0: 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65     ** it is a ne
2bd0: 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69  w.* or old.* tri
2be0: 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65  gger argument re
2bf0: 66 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20  ference.    */. 
2c00: 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26     if( zDb==0 &&
2c10: 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 54   zTab!=0 && cntT
2c20: 61 62 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d  ab==0 && pParse-
2c30: 3e 70 54 72 69 67 67 65 72 54 61 62 21 3d 30 20  >pTriggerTab!=0 
2c40: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
2c50: 3d 20 70 50 61 72 73 65 2d 3e 65 54 72 69 67 67  = pParse->eTrigg
2c60: 65 72 4f 70 3b 0a 20 20 20 20 20 20 61 73 73 65  erOp;.      asse
2c70: 72 74 28 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54  rt( op==TK_DELET
2c80: 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44 41  E || op==TK_UPDA
2c90: 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 53  TE || op==TK_INS
2ca0: 45 52 54 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ERT );.      if(
2cb0: 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54 45 20 26   op!=TK_DELETE &
2cc0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2cd0: 28 22 6e 65 77 22 2c 7a 54 61 62 29 20 3d 3d 20  ("new",zTab) == 
2ce0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
2cf0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  pr->iTable = 1;.
2d00: 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70          pTab = p
2d10: 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54  Parse->pTriggerT
2d20: 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ab;.      }else 
2d30: 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 53 45 52  if( op!=TK_INSER
2d40: 54 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  T && sqlite3StrI
2d50: 43 6d 70 28 22 6f 6c 64 22 2c 7a 54 61 62 29 3d  Cmp("old",zTab)=
2d60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45  =0 ){.        pE
2d70: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 30 3b  xpr->iTable = 0;
2d80: 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d 20  .        pTab = 
2d90: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
2da0: 54 61 62 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Tab;.      }else
2db0: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  {.        pTab =
2dc0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   0;.      }..   
2dd0: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a     if( pTab ){ .
2de0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
2df0: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
2e00: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
2e10: 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61  a;.        cntTa
2e20: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  b++;.        for
2e30: 28 69 43 6f 6c 3d 30 2c 20 70 43 6f 6c 3d 70 54  (iCol=0, pCol=pT
2e40: 61 62 2d 3e 61 43 6f 6c 3b 20 69 43 6f 6c 3c 70  ab->aCol; iCol<p
2e50: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
2e60: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
2e70: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
2e80: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
2e90: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
2ea0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2eb0: 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  ( iCol==pTab->iP
2ec0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2ed0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a       iCol = -1;.
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2ef0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2f00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2f20: 66 28 20 69 43 6f 6c 3e 3d 70 54 61 62 2d 3e 6e  f( iCol>=pTab->n
2f30: 43 6f 6c 20 26 26 20 73 71 6c 69 74 65 33 49 73  Col && sqlite3Is
2f40: 52 6f 77 69 64 28 7a 43 6f 6c 29 20 26 26 20 56  Rowid(zCol) && V
2f50: 69 73 69 62 6c 65 52 6f 77 69 64 28 70 54 61 62  isibleRowid(pTab
2f60: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
2f70: 2a 20 49 4d 50 3a 20 52 2d 35 31 34 31 34 2d 33  * IMP: R-51414-3
2f80: 32 39 31 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  2910 */.        
2f90: 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20    iCol = -1;.   
2fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2fb0: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
2fc0: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
2fd0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
2fe0: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
2ff0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
3000: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
3010: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
3020: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
3030: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62   if( pExpr->iTab
3040: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
3050: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
3060: 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Col==31 );.     
3070: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
3080: 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20   iCol==32 );.   
3090: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
30a0: 3e 6f 6c 64 6d 61 73 6b 20 7c 3d 20 28 69 43 6f  >oldmask |= (iCo
30b0: 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66  l>=32 ? 0xffffff
30c0: 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c  ff : (((u32)1)<<
30d0: 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  iCol));.        
30e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
30f0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
3100: 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Col==31 );.     
3110: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
3120: 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20   iCol==32 );.   
3130: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
3140: 3e 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69 43 6f  >newmask |= (iCo
3150: 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66  l>=32 ? 0xffffff
3160: 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c  ff : (((u32)1)<<
3170: 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  iCol));.        
3180: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 45    }.          pE
3190: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
31a0: 69 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20  i16)iCol;.      
31b0: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
31c0: 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
31d0: 20 20 69 73 54 72 69 67 67 65 72 20 3d 20 31 3b    isTrigger = 1;
31e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
31f0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20   }.    }.#endif 
3200: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
3210: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
3220: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
3230: 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  ** Perhaps the n
3240: 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e  ame is a referen
3250: 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a  ce to the ROWID.
3260: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
3270: 6e 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 63 6e  nt==0.     && cn
3280: 74 54 61 62 3d 3d 31 0a 20 20 20 20 20 26 26 20  tTab==1.     && 
3290: 70 4d 61 74 63 68 0a 20 20 20 20 20 26 26 20 28  pMatch.     && (
32a0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
32b0: 43 5f 49 64 78 45 78 70 72 29 3d 3d 30 0a 20 20  C_IdxExpr)==0.  
32c0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 52     && sqlite3IsR
32d0: 6f 77 69 64 28 7a 43 6f 6c 29 0a 20 20 20 20 20  owid(zCol).     
32e0: 26 26 20 56 69 73 69 62 6c 65 52 6f 77 69 64 28  && VisibleRowid(
32f0: 70 4d 61 74 63 68 2d 3e 70 54 61 62 29 0a 20 20  pMatch->pTab).  
3300: 20 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d    ){.      cnt =
3310: 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   1;.      pExpr-
3320: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
3330: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
3340: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
3350: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d  F_INTEGER;.    }
3360: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
3370: 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  If the input is 
3380: 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e  of the form Z (n
3390: 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29  ot Y.Z or X.Y.Z)
33a0: 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a   then the name Z
33b0: 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65  .    ** might re
33c0: 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74  fer to an result
33d0: 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69  -set alias.  Thi
33e0: 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
33f0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20  xample, when.   
3400: 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c   ** we are resol
3410: 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68  ving names in th
3420: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
3430: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
3440: 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a  command:.    **.
3450: 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
3460: 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20  T a+b AS x FROM 
3470: 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30  table WHERE x<10
3480: 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
3490: 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  In cases like th
34a0: 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70  is, replace pExp
34b0: 72 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  r with a copy of
34c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
34d0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d  that.    ** form
34e0: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
34f0: 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e   entry ("a+b" in
3500: 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e   the example) an
3510: 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
3520: 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74  tely..    ** Not
3530: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
3540: 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73  ssion in the res
3550: 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68  ult set should h
3560: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
3570: 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64  .    ** resolved
3580: 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
3590: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
35a0: 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a   resolved..    *
35b0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 62 69  *.    ** The abi
35c0: 6c 69 74 79 20 74 6f 20 75 73 65 20 61 6e 20 6f  lity to use an o
35d0: 75 74 70 75 74 20 72 65 73 75 6c 74 2d 73 65 74  utput result-set
35e0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 57   column in the W
35f0: 48 45 52 45 2c 20 47 52 4f 55 50 20 42 59 2c 0a  HERE, GROUP BY,.
3600: 20 20 20 20 2a 2a 20 6f 72 20 48 41 56 49 4e 47      ** or HAVING
3610: 20 63 6c 61 75 73 65 73 2c 20 6f 72 20 61 73 20   clauses, or as 
3620: 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72  part of a larger
3630: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
3640: 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
3650: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  ** clause is not
3660: 20 73 74 61 6e 64 61 72 64 20 53 51 4c 2e 20 20   standard SQL.  
3670: 54 68 69 73 20 69 73 20 61 20 28 67 6f 6f 66 79  This is a (goofy
3680: 29 20 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69  ) SQLite extensi
3690: 6f 6e 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  on, that.    ** 
36a0: 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72  is supported for
36b0: 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
36c0: 74 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e 20 48  tibility only. H
36d0: 65 6e 63 65 2c 20 77 65 20 69 73 73 75 65 20 61  ence, we issue a
36e0: 20 77 61 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20   warning.    ** 
36f0: 6f 6e 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  on sqlite3_log()
3700: 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 63 61   whenever the ca
3710: 70 61 62 69 6c 69 74 79 20 69 73 20 75 73 65 64  pability is used
3720: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
3730: 20 28 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e   (pEList = pNC->
3740: 70 45 4c 69 73 74 29 21 3d 30 0a 20 20 20 20 20  pEList)!=0.     
3750: 26 26 20 7a 54 61 62 3d 3d 30 0a 20 20 20 20 20  && zTab==0.     
3760: 26 26 20 63 6e 74 3d 3d 30 0a 20 20 20 20 29 7b  && cnt==0.    ){
3770: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3780: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
3790: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
37a0: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
37b0: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
37c0: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
37d0: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
37e0: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
37f0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
3800: 78 70 72 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20  xpr *pOrig;.    
3810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
3820: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
3830: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
3840: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
3850: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
3860: 70 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
3870: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
3880: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  xpr->x.pSelect==
3890: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
38a0: 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Orig = pEList->a
38b0: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
38c0: 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
38d0: 63 46 6c 61 67 73 26 4e 43 5f 41 6c 6c 6f 77 41  cFlags&NC_AllowA
38e0: 67 67 29 3d 3d 30 20 26 26 20 45 78 70 72 48 61  gg)==0 && ExprHa
38f0: 73 50 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c  sProperty(pOrig,
3900: 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
3910: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3920: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3930: 22 6d 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73  "misuse of alias
3940: 65 64 20 61 67 67 72 65 67 61 74 65 20 25 73 22  ed aggregate %s"
3950: 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20  , zAs);.        
3960: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
3970: 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  bort;.          
3980: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
3990: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
39a0: 72 53 69 7a 65 28 70 4f 72 69 67 29 21 3d 31 20  rSize(pOrig)!=1 
39b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
39c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
39d0: 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
39e0: 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20  e misused");.   
39f0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3a00: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
3a10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3a20: 20 72 65 73 6f 6c 76 65 41 6c 69 61 73 28 70 50   resolveAlias(pP
3a30: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 6a 2c  arse, pEList, j,
3a40: 20 70 45 78 70 72 2c 20 22 22 2c 20 6e 53 75 62   pExpr, "", nSub
3a50: 71 75 65 72 79 29 3b 0a 20 20 20 20 20 20 20 20  query);.        
3a60: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
3a70: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 30 3b       pMatch = 0;
3a80: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
3a90: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
3aa0: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
3ab0: 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d    goto lookupnam
3ac0: 65 5f 65 6e 64 3b 0a 20 20 20 20 20 20 20 20 7d  e_end;.        }
3ad0: 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a  .      } .    }.
3ae0: 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  .    /* Advance 
3af0: 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65  to the next name
3b00: 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c   context.  The l
3b10: 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68  oop will exit wh
3b20: 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a  en either.    **
3b30: 20 77 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   we have a match
3b40: 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e   (cnt>0) or when
3b50: 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e   we run out of n
3b60: 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20  ame contexts..  
3b70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
3b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43  ==0 ){.      pNC
3b90: 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20   = pNC->pNext;. 
3ba0: 20 20 20 20 20 6e 53 75 62 71 75 65 72 79 2b 2b       nSubquery++
3bb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
3bc0: 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20  *.  ** If X and 
3bd0: 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f  Y are NULL (in o
3be0: 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e  ther words if on
3bf0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
3c00: 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70  me Z is.  ** sup
3c10: 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76  plied) and the v
3c20: 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63  alue of Z is enc
3c30: 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d  losed in double-
3c40: 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a  quotes, then.  *
3c50: 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20  * Z is a string 
3c60: 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f  literal if it do
3c70: 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20  esn't match any 
3c80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
3c90: 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65  n that.  ** case
3ca0: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74  , we need to ret
3cb0: 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61  urn right away a
3cc0: 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20  nd not make any 
3cd0: 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20  changes to.  ** 
3ce0: 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  pExpr..  **.  **
3cf0: 20 42 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65   Because no refe
3d00: 72 65 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74  rence was made t
3d10: 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73  o outer contexts
3d20: 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a  , the pNC->nRef.
3d30: 20 20 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20    ** fields are 
3d40: 6e 6f 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61  not changed in a
3d50: 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f  ny context..  */
3d60: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26  .  if( cnt==0 &&
3d70: 20 7a 54 61 62 3d 3d 30 20 26 26 20 45 78 70 72   zTab==0 && Expr
3d80: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
3d90: 72 2c 45 50 5f 44 62 6c 51 75 6f 74 65 64 29 20  r,EP_DblQuoted) 
3da0: 29 7b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  ){.    pExpr->op
3db0: 20 3d 20 54 4b 5f 53 54 52 49 4e 47 3b 0a 20 20   = TK_STRING;.  
3dc0: 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20    pExpr->pTab = 
3dd0: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  0;.    return WR
3de0: 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20  C_Prune;.  }..  
3df0: 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d  /*.  ** cnt==0 m
3e00: 65 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e  eans there was n
3e10: 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31  ot match.  cnt>1
3e20: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72   means there wer
3e30: 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f  e two or.  ** mo
3e40: 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74  re matches.  Eit
3e50: 68 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65  her way, we have
3e60: 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a   an error..  */.
3e70: 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a    if( cnt!=1 ){.
3e80: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3e90: 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d  zErr;.    zErr =
3ea0: 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75   cnt==0 ? "no su
3eb0: 63 68 20 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d  ch column" : "am
3ec0: 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e  biguous column n
3ed0: 61 6d 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44  ame";.    if( zD
3ee0: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
3ef0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
3f00: 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 2e 25 73  e, "%s: %s.%s.%s
3f10: 22 2c 20 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54  ", zErr, zDb, zT
3f20: 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d  ab, zCol);.    }
3f30: 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b  else if( zTab ){
3f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
3f50: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
3f60: 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 45 72 72  %s: %s.%s", zErr
3f70: 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20  , zTab, zCol);. 
3f80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3f90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3fa0: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22  pParse, "%s: %s"
3fb0: 2c 20 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20  , zErr, zCol);. 
3fc0: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
3fd0: 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
3fe0: 3b 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45  ;.    pTopNC->nE
3ff0: 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rr++;.  }..  /* 
4000: 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  If a column from
4010: 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63   a table in pSrc
4020: 4c 69 73 74 20 69 73 20 72 65 66 65 72 65 6e 63  List is referenc
4030: 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a  ed, then record.
4040: 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69    ** this fact i
4050: 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61  n the pSrcList.a
4060: 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61  [].colUsed bitma
4070: 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61  sk.  Column 0 ca
4080: 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20  uses.  ** bit 0 
4090: 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75  to be set.  Colu
40a0: 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20 31 2e  mn 1 sets bit 1.
40b0: 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
40c0: 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c   If the.  ** col
40d0: 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72  umn number is gr
40e0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e  eater than the n
40f0: 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e  umber of bits in
4100: 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
4110: 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 68  * then set the h
4120: 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66  igh-order bit of
4130: 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20   the bitmask..  
4140: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
4150: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d  iColumn>=0 && pM
4160: 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69  atch!=0 ){.    i
4170: 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt n = pExpr->iC
4180: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63  olumn;.    testc
4190: 61 73 65 28 20 6e 3d 3d 42 4d 53 2d 31 20 29 3b  ase( n==BMS-1 );
41a0: 0a 20 20 20 20 69 66 28 20 6e 3e 3d 42 4d 53 20  .    if( n>=BMS 
41b0: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 42 4d 53  ){.      n = BMS
41c0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  -1;.    }.    as
41d0: 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43  sert( pMatch->iC
41e0: 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54  ursor==pExpr->iT
41f0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74  able );.    pMat
4200: 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28  ch->colUsed |= (
4210: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a  (Bitmask)1)<<n;.
4220: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
4230: 75 70 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  up and return.  
4240: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  */.  sqlite3Expr
4250: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
4260: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70  ->pLeft);.  pExp
4270: 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
4280: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
4290: 65 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69  e(db, pExpr->pRi
42a0: 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  ght);.  pExpr->p
42b0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78  Right = 0;.  pEx
42c0: 70 72 2d 3e 6f 70 20 3d 20 28 69 73 54 72 69 67  pr->op = (isTrig
42d0: 67 65 72 20 3f 20 54 4b 5f 54 52 49 47 47 45 52  ger ? TK_TRIGGER
42e0: 20 3a 20 54 4b 5f 43 4f 4c 55 4d 4e 29 3b 0a 6c   : TK_COLUMN);.l
42f0: 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20  ookupname_end:. 
4300: 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20   if( cnt==1 ){. 
4310: 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d     assert( pNC!=
4320: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78  0 );.    if( !Ex
4330: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
4340: 78 70 72 2c 20 45 50 5f 41 6c 69 61 73 29 20 29  xpr, EP_Alias) )
4350: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  {.      sqlite3A
4360: 75 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20  uthRead(pParse, 
4370: 70 45 78 70 72 2c 20 70 53 63 68 65 6d 61 2c 20  pExpr, pSchema, 
4380: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a  pNC->pSrcList);.
4390: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63      }.    /* Inc
43a0: 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20  rement the nRef 
43b0: 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d  value on all nam
43c0: 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20  e contexts from 
43d0: 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20  TopNC up to.    
43e0: 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65  ** the point whe
43f0: 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63  re the name matc
4400: 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  hed. */.    for(
4410: 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ;;){.      asser
4420: 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a  t( pTopNC!=0 );.
4430: 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52        pTopNC->nR
4440: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ef++;.      if( 
4450: 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72  pTopNC==pNC ) br
4460: 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e  eak;.      pTopN
4470: 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78  C = pTopNC->pNex
4480: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  t;.    }.    ret
4490: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
44a0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
44b0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
44c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
44d0: 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ocate and return
44e0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
44f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 6c   expression to l
4500: 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69  oad the column i
4510: 43 6f 6c 0a 2a 2a 20 66 72 6f 6d 20 64 61 74 61  Col.** from data
4520: 73 6f 75 72 63 65 20 69 53 72 63 20 69 6e 20 53  source iSrc in S
4530: 72 63 4c 69 73 74 20 70 53 72 63 2e 0a 2a 2f 0a  rcList pSrc..*/.
4540: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65  Expr *sqlite3Cre
4550: 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 73 71  ateColumnExpr(sq
4560: 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
4570: 73 74 20 2a 70 53 72 63 2c 20 69 6e 74 20 69 53  st *pSrc, int iS
4580: 72 63 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  rc, int iCol){. 
4590: 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74   Expr *p = sqlit
45a0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20  e3ExprAlloc(db, 
45b0: 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29  TK_COLUMN, 0, 0)
45c0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
45d0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
45e0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
45f0: 53 72 63 2d 3e 61 5b 69 53 72 63 5d 3b 0a 20 20  Src->a[iSrc];.  
4600: 20 20 70 2d 3e 70 54 61 62 20 3d 20 70 49 74 65    p->pTab = pIte
4610: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70 2d 3e  m->pTab;.    p->
4620: 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e  iTable = pItem->
4630: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28  iCursor;.    if(
4640: 20 70 2d 3e 70 54 61 62 2d 3e 69 50 4b 65 79 3d   p->pTab->iPKey=
4650: 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70  =iCol ){.      p
4660: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ->iColumn = -1;.
4670: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4680: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79   p->iColumn = (y
4690: 6e 56 61 72 29 69 43 6f 6c 3b 0a 20 20 20 20 20  nVar)iCol;.     
46a0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
46b0: 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65  =BMS );.      te
46c0: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d  stcase( iCol==BM
46d0: 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74  S-1 );.      pIt
46e0: 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28  em->colUsed |= (
46f0: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 69 43  (Bitmask)1)<<(iC
4700: 6f 6c 3e 3d 42 4d 53 20 3f 20 42 4d 53 2d 31 20  ol>=BMS ? BMS-1 
4710: 3a 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20  : iCol);.    }. 
4720: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
4730: 74 79 28 70 2c 20 45 50 5f 52 65 73 6f 6c 76 65  ty(p, EP_Resolve
4740: 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
4750: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70   p;.}../*.** Rep
4760: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 74 68 61  ort an error tha
4770: 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  t an expression 
4780: 69 73 20 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72  is not valid for
4790: 20 73 6f 6d 65 20 73 65 74 20 6f 66 0a 2a 2a 20   some set of.** 
47a0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 76 61 6c  pNC->ncFlags val
47b0: 75 65 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  ues determined b
47c0: 79 20 76 61 6c 69 64 4d 61 73 6b 2e 0a 2a 2f 0a  y validMask..*/.
47d0: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 74 56  static void notV
47e0: 61 6c 69 64 28 0a 20 20 50 61 72 73 65 20 2a 70  alid(.  Parse *p
47f0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
4800: 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  Leave error mess
4810: 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 4e 61  age here */.  Na
4820: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
4830: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
4840: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
4850: 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c 20 20 20  t char *zMsg,   
4860: 20 2f 2a 20 54 79 70 65 20 6f 66 20 65 72 72 6f   /* Type of erro
4870: 72 20 2a 2f 0a 20 20 69 6e 74 20 76 61 6c 69 64  r */.  int valid
4880: 4d 61 73 6b 20 20 20 20 20 20 20 20 2f 2a 20 53  Mask        /* S
4890: 65 74 20 6f 66 20 63 6f 6e 74 65 78 74 73 20 66  et of contexts f
48a0: 6f 72 20 77 68 69 63 68 20 70 72 6f 68 69 62 69  or which prohibi
48b0: 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  ted */.){.  asse
48c0: 72 74 28 20 28 76 61 6c 69 64 4d 61 73 6b 26 7e  rt( (validMask&~
48d0: 28 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50  (NC_IsCheck|NC_P
48e0: 61 72 74 49 64 78 7c 4e 43 5f 49 64 78 45 78 70  artIdx|NC_IdxExp
48f0: 72 29 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  r))==0 );.  if( 
4900: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
4910: 76 61 6c 69 64 4d 61 73 6b 29 21 3d 30 20 29 7b  validMask)!=0 ){
4920: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
4930: 2a 7a 49 6e 20 3d 20 22 70 61 72 74 69 61 6c 20  *zIn = "partial 
4940: 69 6e 64 65 78 20 57 48 45 52 45 20 63 6c 61 75  index WHERE clau
4950: 73 65 73 22 3b 0a 20 20 20 20 69 66 28 20 70 4e  ses";.    if( pN
4960: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
4970: 49 64 78 45 78 70 72 20 29 20 20 20 20 20 20 7a  IdxExpr )      z
4980: 49 6e 20 3d 20 22 69 6e 64 65 78 20 65 78 70 72  In = "index expr
4990: 65 73 73 69 6f 6e 73 22 3b 0a 23 69 66 6e 64 65  essions";.#ifnde
49a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
49b0: 45 43 4b 0a 20 20 20 20 65 6c 73 65 20 69 66 28  ECK.    else if(
49c0: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
49d0: 4e 43 5f 49 73 43 68 65 63 6b 20 29 20 7a 49 6e  NC_IsCheck ) zIn
49e0: 20 3d 20 22 43 48 45 43 4b 20 63 6f 6e 73 74 72   = "CHECK constr
49f0: 61 69 6e 74 73 22 3b 0a 23 65 6e 64 69 66 0a 20  aints";.#endif. 
4a00: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4a10: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 20 70  sg(pParse, "%s p
4a20: 72 6f 68 69 62 69 74 65 64 20 69 6e 20 25 73 22  rohibited in %s"
4a30: 2c 20 7a 4d 73 67 2c 20 7a 49 6e 29 3b 0a 20 20  , zMsg, zIn);.  
4a40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65  }.}../*.** Expre
4a50: 73 73 69 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65  ssion p should e
4a60: 6e 63 6f 64 65 20 61 20 66 6c 6f 61 74 69 6e 67  ncode a floating
4a70: 20 70 6f 69 6e 74 20 76 61 6c 75 65 20 62 65 74   point value bet
4a80: 77 65 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30  ween 1.0 and 0.0
4a90: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 30 32 34  ..** Return 1024
4aa0: 20 74 69 6d 65 73 20 74 68 69 73 20 76 61 6c 75   times this valu
4ab0: 65 2e 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31  e.  Or return -1
4ac0: 20 69 66 20 70 20 69 73 20 6e 6f 74 20 61 20 66   if p is not a f
4ad0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
4ae0: 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31   value between 1
4af0: 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73  .0 and 0.0..*/.s
4b00: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 50 72  tatic int exprPr
4b10: 6f 62 61 62 69 6c 69 74 79 28 45 78 70 72 20 2a  obability(Expr *
4b20: 70 29 7b 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d  p){.  double r =
4b30: 20 2d 31 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e   -1.0;.  if( p->
4b40: 6f 70 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72  op!=TK_FLOAT ) r
4b50: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69  eturn -1;.  sqli
4b60: 74 65 33 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f  te3AtoF(p->u.zTo
4b70: 6b 65 6e 2c 20 26 72 2c 20 73 71 6c 69 74 65 33  ken, &r, sqlite3
4b80: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54  Strlen30(p->u.zT
4b90: 6f 6b 65 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54  oken), SQLITE_UT
4ba0: 46 38 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  F8);.  assert( r
4bb0: 3e 3d 30 2e 30 20 29 3b 0a 20 20 69 66 28 20 72  >=0.0 );.  if( r
4bc0: 3e 31 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  >1.0 ) return -1
4bd0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  ;.  return (int)
4be0: 28 72 2a 31 33 34 32 31 37 37 32 38 2e 30 29 3b  (r*134217728.0);
4bf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
4c00: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 62 61  outine is callba
4c10: 63 6b 20 66 6f 72 20 73 71 6c 69 74 65 33 57 61  ck for sqlite3Wa
4c20: 6c 6b 45 78 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  lkExpr()..**.** 
4c30: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63  Resolve symbolic
4c40: 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43   names into TK_C
4c50: 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20  OLUMN operators 
4c60: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
4c70: 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65  ** node in the e
4c80: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
4c90: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e   Return 0 to con
4ca0: 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68  tinue the search
4cb0: 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65   down.** the tre
4cc0: 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20  e or 2 to abort 
4cd0: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
4ce0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
4cf0: 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f  e also does erro
4d00: 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e  r checking and n
4d10: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66  ame resolution f
4d20: 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  or.** function n
4d30: 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61  ames.  The opera
4d40: 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74  tor for aggregat
4d50: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63  e functions is c
4d60: 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f  hanged.** to TK_
4d70: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f  AGG_FUNCTION..*/
4d80: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
4d90: 6c 76 65 45 78 70 72 53 74 65 70 28 57 61 6c 6b  lveExprStep(Walk
4da0: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
4db0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d  r *pExpr){.  Nam
4dc0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 0a 20  eContext *pNC;. 
4dd0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
4de0: 0a 20 20 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  .  pNC = pWalker
4df0: 2d 3e 75 2e 70 4e 43 3b 0a 20 20 61 73 73 65 72  ->u.pNC;.  asser
4e00: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70  t( pNC!=0 );.  p
4e10: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
4e20: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
4e30: 50 61 72 73 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e  Parse==pWalker->
4e40: 70 50 61 72 73 65 20 29 3b 0a 0a 20 20 69 66 28  pParse );..  if(
4e50: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4e60: 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c  (pExpr, EP_Resol
4e70: 76 65 64 29 20 29 20 72 65 74 75 72 6e 20 57 52  ved) ) return WR
4e80: 43 5f 50 72 75 6e 65 3b 0a 20 20 45 78 70 72 53  C_Prune;.  ExprS
4e90: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
4ea0: 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 3b 0a  , EP_Resolved);.
4eb0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
4ec0: 20 69 66 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69   if( pNC->pSrcLi
4ed0: 73 74 20 26 26 20 70 4e 43 2d 3e 70 53 72 63 4c  st && pNC->pSrcL
4ee0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b  ist->nAlloc>0 ){
4ef0: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
4f00: 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
4f10: 72 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  rcList;.    int 
4f20: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
4f30: 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d  i<pNC->pSrcList-
4f40: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
4f50: 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c     assert( pSrcL
4f60: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
4f70: 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74  r>=0 && pSrcList
4f80: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70  ->a[i].iCursor<p
4f90: 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20  Parse->nTab);.  
4fa0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
4fb0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
4fc0: 6f 70 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e  op ){..#if defin
4fd0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
4fe0: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
4ff0: 49 4d 49 54 29 20 26 26 20 21 64 65 66 69 6e 65  IMIT) && !define
5000: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
5010: 42 51 55 45 52 59 29 0a 20 20 20 20 2f 2a 20 54  BQUERY).    /* T
5020: 68 65 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61  he special opera
5030: 74 6f 72 20 54 4b 5f 52 4f 57 20 6d 65 61 6e 73  tor TK_ROW means
5040: 20 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 66   use the rowid f
5050: 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  or the first.   
5060: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68   ** column in th
5070: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
5080: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
5090: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 52  the LIMIT and OR
50a0: 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c  DER BY.    ** cl
50b0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
50c0: 6f 6e 20 55 50 44 41 54 45 20 61 6e 64 20 44 45  on UPDATE and DE
50d0: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e  LETE statements.
50e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
50f0: 20 54 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20   TK_ROW: {.     
5100: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
5110: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
5120: 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  st;.      struct
5130: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
5140: 49 74 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  Item;.      asse
5150: 72 74 28 20 70 53 72 63 4c 69 73 74 20 26 26 20  rt( pSrcList && 
5160: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pSrcList->nSrc==
5170: 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  1 );.      pItem
5180: 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20   = pSrcList->a; 
5190: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
51a0: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
51b0: 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20      pExpr->pTab 
51c0: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
51d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
51e0: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
51f0: 73 6f 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72  sor;.      pExpr
5200: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ->iColumn = -1;.
5210: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
5220: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
5230: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
5240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
5250: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
5260: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55  (SQLITE_ENABLE_U
5270: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
5280: 49 54 29 0a 20 20 20 20 20 20 20 20 20 20 26 26  IT).          &&
5290: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
52a0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20  _OMIT_SUBQUERY) 
52b0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e  */..    /* A lon
52c0: 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73 20  e identifier is 
52d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f  the name of a co
52e0: 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lumn..    */.   
52f0: 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20   case TK_ID: {. 
5300: 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b       return look
5310: 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 30  upName(pParse, 0
5320: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  , 0, pExpr->u.zT
5330: 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72  oken, pNC, pExpr
5340: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
5350: 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20  /* A table name 
5360: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  and column name:
5370: 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a       ID.ID.    *
5380: 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c  * Or a database,
5390: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
53a0: 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20  n:  ID.ID.ID.   
53b0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
53c0: 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  DOT: {.      con
53d0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e  st char *zColumn
53e0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
53f0: 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20  ar *zTable;.    
5400: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
5410: 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
5420: 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f 2a  Right;..      /*
5430: 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30   if( pSrcList==0
5440: 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20   ) break; */.   
5450: 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61 72     notValid(pPar
5460: 73 65 2c 20 70 4e 43 2c 20 22 74 68 65 20 5c 22  se, pNC, "the \"
5470: 2e 5c 22 20 6f 70 65 72 61 74 6f 72 22 2c 20 4e  .\" operator", N
5480: 43 5f 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20  C_IdxExpr);.    
5490: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
54a0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
54b0: 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  if( pRight->op==
54c0: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
54d0: 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20   zDb = 0;.      
54e0: 20 20 7a 54 61 62 6c 65 20 3d 20 70 45 78 70 72    zTable = pExpr
54f0: 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65  ->pLeft->u.zToke
5500: 6e 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75  n;.        zColu
5510: 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a  mn = pRight->u.z
5520: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  Token;.      }el
5530: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
5540: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
5550: 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_DOT );.      
5560: 20 20 7a 44 62 20 3d 20 70 45 78 70 72 2d 3e 70    zDb = pExpr->p
5570: 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Left->u.zToken;.
5580: 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d          zTable =
5590: 20 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e   pRight->pLeft->
55a0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
55b0: 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67    zColumn = pRig
55c0: 68 74 2d 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54  ht->pRight->u.zT
55d0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oken;.      }.  
55e0: 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75      return looku
55f0: 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 44  pName(pParse, zD
5600: 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75  b, zTable, zColu
5610: 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b  mn, pNC, pExpr);
5620: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
5630: 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20  esolve function 
5640: 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20  names.    */.   
5650: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
5660: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
5670: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
5680: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20  pr->x.pList;    
5690: 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  /* The argument 
56a0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  list */.      in
56b0: 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  t n = pList ? pL
56c0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20  ist->nExpr : 0; 
56d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
56e0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
56f0: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
5700: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
5710: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
5720: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
5730: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
5740: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
5750: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
5760: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
5770: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5780: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
5790: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
57a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
57b0: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
57c0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
57d0: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
57e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
57f0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
5800: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
5810: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
5820: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
5830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
5840: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
5850: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
5860: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
5870: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
5880: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
5890: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38  tion */.      u8
58a0: 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
58b0: 65 2d 3e 64 62 29 3b 20 20 20 2f 2a 20 54 68 65  e->db);   /* The
58c0: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
58d0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ng */..      ass
58e0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
58f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
5900: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
5910: 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
5920: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
5930: 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74   nId = sqlite3St
5940: 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20  rlen30(zId);.   
5950: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
5960: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
5970: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
5980: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
5990: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
59a0: 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
59b0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
59c0: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
59d0: 49 64 2c 20 2d 32 2c 20 65 6e 63 2c 20 30 29 3b  Id, -2, enc, 0);
59e0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
59f0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
5a00: 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d    no_such_func =
5a10: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
5a20: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f  e{.          wro
5a30: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b  ng_num_args = 1;
5a40: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5a60: 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78  is_agg = pDef->x
5a70: 46 69 6e 61 6c 69 7a 65 21 3d 30 3b 0a 20 20 20  Finalize!=0;.   
5a80: 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
5a90: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
5aa0: 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20  E_FUNC_UNLIKELY 
5ab0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
5ac0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
5ad0: 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 7c  pr, EP_Unlikely|
5ae0: 45 50 5f 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  EP_Skip);.      
5af0: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 0a      if( n==2 ){.
5b00: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
5b10: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 65 78 70 72  r->iTable = expr
5b20: 50 72 6f 62 61 62 69 6c 69 74 79 28 70 4c 69 73  Probability(pLis
5b30: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
5b50: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
5b60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
5b70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5b80: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
5b90: 20 20 20 20 20 20 20 20 20 22 73 65 63 6f 6e 64           "second
5ba0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 69 6b   argument to lik
5bb0: 65 6c 69 68 6f 6f 64 28 29 20 6d 75 73 74 20 62  elihood() must b
5bc0: 65 20 61 20 22 0a 20 20 20 20 20 20 20 20 20 20  e a ".          
5bd0: 20 20 20 20 20 20 22 63 6f 6e 73 74 61 6e 74 20        "constant 
5be0: 62 65 74 77 65 65 6e 20 30 2e 30 20 61 6e 64 20  between 0.0 and 
5bf0: 31 2e 30 22 29 3b 0a 20 20 20 20 20 20 20 20 20  1.0");.         
5c00: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
5c10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
5c20: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
5c40: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
5c50: 31 33 30 34 2d 32 39 34 34 39 20 54 68 65 20 75  1304-29449 The u
5c60: 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74  nlikely(X) funct
5c70: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 20  ion is.         
5c80: 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
5c90: 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58   to likelihood(X
5ca0: 2c 20 30 2e 30 36 32 35 29 2e 0a 20 20 20 20 20  , 0.0625)..     
5cb0: 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e         ** EVIDEN
5cc0: 43 45 2d 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31  CE-OF: R-01283-1
5cd0: 31 36 33 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c  1636 The unlikel
5ce0: 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  y(X) function is
5cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
5d00: 73 68 6f 72 74 2d 68 61 6e 64 20 66 6f 72 20 6c  short-hand for l
5d10: 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36  ikelihood(X,0.06
5d20: 32 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  25)..           
5d30: 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
5d40: 20 52 2d 33 36 38 35 30 2d 33 34 31 32 37 20 54   R-36850-34127 T
5d50: 68 65 20 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e  he likely(X) fun
5d60: 63 74 69 6f 6e 20 69 73 20 73 68 6f 72 74 2d 68  ction is short-h
5d70: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  and.            
5d80: 2a 2a 20 66 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  ** for likelihoo
5d90: 64 28 58 2c 30 2e 39 33 37 35 29 2e 0a 20 20 20  d(X,0.9375)..   
5da0: 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44           ** EVID
5db0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 34 33 36  ENCE-OF: R-53436
5dc0: 2d 34 30 39 37 33 20 54 68 65 20 6c 69 6b 65 6c  -40973 The likel
5dd0: 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  y(X) function is
5de0: 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
5df0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6c 69          ** to li
5e00: 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 39 33 37  kelihood(X,0.937
5e10: 35 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  5). */.         
5e20: 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 75 6e     /* TUNING: un
5e30: 6c 69 6b 65 6c 79 28 29 20 70 72 6f 62 61 62 69  likely() probabi
5e40: 6c 69 74 79 20 69 73 20 30 2e 30 36 32 35 2e 20  lity is 0.0625. 
5e50: 20 6c 69 6b 65 6c 79 28 29 20 69 73 20 30 2e 39   likely() is 0.9
5e60: 33 37 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  375 */.         
5e70: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
5e80: 20 3d 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b 30   = pDef->zName[0
5e90: 5d 3d 3d 27 75 27 20 3f 20 38 33 38 38 36 30 38  ]=='u' ? 8388608
5ea0: 20 3a 20 31 32 35 38 32 39 31 32 30 3b 0a 20 20   : 125829120;.  
5eb0: 20 20 20 20 20 20 20 20 7d 20 20 20 20 20 20 20          }       
5ec0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
5ed0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5ee0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5ef0: 4f 4e 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  ON.        {.   
5f00: 20 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 20         int auth 
5f10: 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  = sqlite3AuthChe
5f20: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
5f30: 45 5f 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 70 44  E_FUNCTION, 0,pD
5f40: 65 66 2d 3e 7a 4e 61 6d 65 2c 30 29 3b 0a 20 20  ef->zName,0);.  
5f50: 20 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68          if( auth
5f60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5f70: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
5f80: 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59  uth==SQLITE_DENY
5f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5fa0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5fb0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61  g(pParse, "not a
5fc0: 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73 65  uthorized to use
5fd0: 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 0a   function: %s",.
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6000: 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d        pDef->zNam
6010: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
6020: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
6030: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6040: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6050: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
6060: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6070: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
6080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6090: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
60a0: 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
60b0: 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
60c0: 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 7c 53 51 4c  UNC_CONSTANT|SQL
60d0: 49 54 45 5f 46 55 4e 43 5f 53 4c 4f 43 48 4e 47  ITE_FUNC_SLOCHNG
60e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
60f0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
6100: 65 73 20 6f 66 20 74 68 65 20 45 50 5f 43 6f 6e  es of the EP_Con
6110: 73 74 46 75 6e 63 20 66 6c 61 67 2c 20 64 61 74  stFunc flag, dat
6120: 65 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20  e and time.     
6130: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
6140: 73 20 61 6e 64 20 6f 74 68 65 72 20 66 75 6e 63  s and other func
6150: 74 69 6f 6e 73 20 74 68 61 74 20 63 68 61 6e 67  tions that chang
6160: 65 20 73 6c 6f 77 6c 79 20 61 72 65 20 63 6f 6e  e slowly are con
6170: 73 69 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  sidered.        
6180: 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 62 65    ** constant be
6190: 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 63  cause they are c
61a0: 6f 6e 73 74 61 6e 74 20 66 6f 72 20 74 68 65 20  onstant for the 
61b0: 64 75 72 61 74 69 6f 6e 20 6f 66 20 6f 6e 65 20  duration of one 
61c0: 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  query */.       
61d0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
61e0: 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73  ty(pExpr,EP_Cons
61f0: 74 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  tFunc);.        
6200: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
6210: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
6220: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
6230: 53 54 41 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  STANT)==0 ){.   
6240: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 65 2f 74         /* Date/t
6250: 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ime functions th
6260: 61 74 20 75 73 65 20 27 6e 6f 77 27 2c 20 61 6e  at use 'now', an
6270: 64 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e  d other function
6280: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 20  s like.         
6290: 20 2a 2a 20 73 71 6c 69 74 65 5f 76 65 72 73 69   ** sqlite_versi
62a0: 6f 6e 28 29 20 74 68 61 74 20 6d 69 67 68 74 20  on() that might 
62b0: 63 68 61 6e 67 65 20 6f 76 65 72 20 74 69 6d 65  change over time
62c0: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 0a   cannot be used.
62d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
62e0: 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20  an index. */.   
62f0: 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28         notValid(
6300: 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 6e 6f  pParse, pNC, "no
6310: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
6320: 66 75 6e 63 74 69 6f 6e 73 22 2c 0a 20 20 20 20  functions",.    
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
6340: 43 5f 49 64 78 45 78 70 72 7c 4e 43 5f 50 61 72  C_IdxExpr|NC_Par
6350: 74 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  tIdx);.        }
6360: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6370: 66 28 20 69 73 5f 61 67 67 20 26 26 20 28 70 4e  f( is_agg && (pN
6380: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
6390: 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20 29 7b 0a  AllowAgg)==0 ){.
63a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
63b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
63c0: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
63d0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
63e0: 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b  *s()", nId,zId);
63f0: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
6400: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
6410: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
6420: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
6430: 68 5f 66 75 6e 63 20 26 26 20 70 50 61 72 73 65  h_func && pParse
6440: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
6450: 3d 30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  =0.#ifdef SQLITE
6460: 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
6470: 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
6490: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
64a0: 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
64b0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
64c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
64d0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  e, "no such func
64e0: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64  tion: %.*s", nId
64f0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
6500: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
6510: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f     }else if( wro
6520: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20  ng_num_args ){. 
6530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
6540: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77  rorMsg(pParse,"w
6550: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
6560: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
6570: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20  tion %.*s()",.  
6580: 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20             nId, 
6590: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
65a0: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
65b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
65c0: 61 67 67 20 29 20 70 4e 43 2d 3e 6e 63 46 6c 61  agg ) pNC->ncFla
65d0: 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41  gs &= ~NC_AllowA
65e0: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
65f0: 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57  3WalkExprList(pW
6600: 61 6c 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20  alker, pList);. 
6610: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
6620: 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43  ){.        NameC
6630: 6f 6e 74 65 78 74 20 2a 70 4e 43 32 20 3d 20 70  ontext *pNC2 = p
6640: 4e 43 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  NC;.        pExp
6650: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46  r->op = TK_AGG_F
6660: 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20  UNCTION;.       
6670: 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 30 3b   pExpr->op2 = 0;
6680: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
6690: 70 4e 43 32 20 26 26 20 21 73 71 6c 69 74 65 33  pNC2 && !sqlite3
66a0: 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
66b0: 53 72 63 28 70 45 78 70 72 2c 20 70 4e 43 32 2d  Src(pExpr, pNC2-
66c0: 3e 70 53 72 63 4c 69 73 74 29 20 29 7b 0a 20 20  >pSrcList) ){.  
66d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
66e0: 70 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  p2++;.          
66f0: 70 4e 43 32 20 3d 20 70 4e 43 32 2d 3e 70 4e 65  pNC2 = pNC2->pNe
6700: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
6710: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
6720: 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ef!=0 );.       
6730: 20 69 66 28 20 70 4e 43 32 20 29 7b 0a 20 20 20   if( pNC2 ){.   
6740: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
6750: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
6760: 58 3d 3d 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 20  X==NC_MinMaxAgg 
6770: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
6780: 74 63 61 73 65 28 20 28 70 44 65 66 2d 3e 66 75  tcase( (pDef->fu
6790: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
67a0: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 21 3d 30  _FUNC_MINMAX)!=0
67b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   );.          pN
67c0: 43 32 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  C2->ncFlags |= N
67d0: 43 5f 48 61 73 41 67 67 20 7c 20 28 70 44 65 66  C_HasAgg | (pDef
67e0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
67f0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
6800: 29 3b 0a 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  );..        }.  
6810: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61        pNC->ncFla
6820: 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67  gs |= NC_AllowAg
6830: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  g;.      }.     
6840: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d   /* FIX ME:  Com
6850: 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69  pute pExpr->affi
6860: 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68  nity based on th
6870: 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  e expected retur
6880: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20  n.      ** type 
6890: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
68a0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
68b0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
68c0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
68d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
68e0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
68f0: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
6900: 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 20 74 65  e TK_EXISTS:  te
6910: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
6920: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
6930: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
6940: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TK_IN: {.      t
6950: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
6960: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
6970: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
6980: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
6990: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
69a0: 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20         int nRef 
69b0: 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20  = pNC->nRef;.   
69c0: 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50       notValid(pP
69d0: 61 72 73 65 2c 20 70 4e 43 2c 20 22 73 75 62 71  arse, pNC, "subq
69e0: 75 65 72 69 65 73 22 2c 20 4e 43 5f 49 73 43 68  ueries", NC_IsCh
69f0: 65 63 6b 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e  eck|NC_PartIdx|N
6a00: 43 5f 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20  C_IdxExpr);.    
6a10: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
6a20: 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
6a30: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
6a40: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6a50: 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65  ( pNC->nRef>=nRe
6a60: 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f );.        if(
6a70: 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66   nRef!=pNC->nRef
6a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
6a90: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6aa0: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
6ab0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  t);.          pN
6ac0: 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  C->ncFlags |= NC
6ad0: 5f 56 61 72 53 65 6c 65 63 74 3b 0a 20 20 20 20  _VarSelect;.    
6ae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6b00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
6b10: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 6e  IABLE: {.      n
6b20: 6f 74 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20  otValid(pParse, 
6b30: 70 4e 43 2c 20 22 70 61 72 61 6d 65 74 65 72 73  pNC, "parameters
6b40: 22 2c 20 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43  ", NC_IsCheck|NC
6b50: 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 64 78 45  _PartIdx|NC_IdxE
6b60: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
6b70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6b80: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 0a 20 20  e TK_BETWEEN:.  
6b90: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20    case TK_EQ:.  
6ba0: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
6bb0: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
6bc0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
6bd0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
6be0: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
6bf0: 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
6c00: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
6c10: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 65   {.      int nLe
6c20: 66 74 2c 20 6e 52 69 67 68 74 3b 0a 20 20 20 20  ft, nRight;.    
6c30: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
6c40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6c50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 73   break;.      as
6c60: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
6c70: 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ft!=0 );.      n
6c80: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
6c90: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
6ca0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
6cb0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
6cc0: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20  =TK_BETWEEN ){. 
6cd0: 20 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20         nRight = 
6ce0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
6cf0: 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 78 2e 70  rSize(pExpr->x.p
6d00: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
6d10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
6d20: 52 69 67 68 74 3d 3d 6e 4c 65 66 74 20 29 7b 0a  Right==nLeft ){.
6d30: 20 20 20 20 20 20 20 20 20 20 6e 52 69 67 68 74            nRight
6d40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
6d50: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
6d60: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
6d70: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
6d80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6d90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
6da0: 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pr->pRight!=0 );
6db0: 0a 20 20 20 20 20 20 20 20 6e 52 69 67 68 74 20  .        nRight 
6dc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
6dd0: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
6de0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Right);.      }.
6df0: 20 20 20 20 20 20 69 66 28 20 6e 4c 65 66 74 21        if( nLeft!
6e00: 3d 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  =nRight ){.     
6e10: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
6e20: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  pr->op==TK_EQ );
6e30: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
6e40: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
6e50: 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _NE );.        t
6e60: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
6e70: 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
6e80: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
6e90: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
6ea0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
6eb0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
6ec0: 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 20  TK_GT );.       
6ed0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
6ee0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op==TK_GE );. 
6ef0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
6f00: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
6f10: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  S );.        tes
6f20: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
6f30: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
6f40: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
6f50: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45  pExpr->op==TK_BE
6f60: 54 57 45 45 4e 20 29 3b 0a 20 20 20 20 20 20 20  TWEEN );.       
6f70: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6f80: 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
6f90: 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
6fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6fb0: 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ak; .    }.  }. 
6fc0: 20 72 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d   return (pParse-
6fd0: 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
6fe0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
6ff0: 64 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a  d) ? WRC_Abort :
7000: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
7010: 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69  ../*.** pEList i
7020: 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
7030: 65 73 73 69 6f 6e 73 20 77 68 69 63 68 20 61 72  essions which ar
7040: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 72 65 73  e really the res
7050: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a  ult set of the.*
7060: 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
7070: 6d 65 6e 74 2e 20 20 70 45 20 69 73 20 61 20 74  ment.  pE is a t
7080: 65 72 6d 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  erm in an ORDER 
7090: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
70a0: 6c 61 75 73 65 2e 0a 2a 2a 20 54 68 69 73 20 72  lause..** This r
70b0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 6f  outine checks to
70c0: 20 73 65 65 20 69 66 20 70 45 20 69 73 20 61 20   see if pE is a 
70d0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
70e0: 72 20 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f  r which correspo
70f0: 6e 64 73 0a 2a 2a 20 74 6f 20 74 68 65 20 41 53  nds.** to the AS
7100: 2d 6e 61 6d 65 20 6f 66 20 6f 6e 65 20 6f 66 20  -name of one of 
7110: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
7120: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7130: 2e 20 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20  .  If it is,.** 
7140: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
7150: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 62  urn an integer b
7160: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 77  etween 1 and N w
7170: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
7180: 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  mber of.** eleme
7190: 6e 74 73 20 69 6e 20 70 45 4c 69 73 74 2c 20 63  nts in pEList, c
71a0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
71b0: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74  the matching ent
71c0: 72 79 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ry.  If there is
71d0: 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 6f 72  .** no match, or
71e0: 20 69 66 20 70 45 20 69 73 20 6e 6f 74 20 61 20   if pE is not a 
71f0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
7200: 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
7210: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 30  tine.** return 0
7220: 2e 0a 2a 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 68  ..**.** pEList h
7230: 61 73 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  as been resolved
7240: 2e 20 20 70 45 20 68 61 73 20 6e 6f 74 2e 0a 2a  .  pE has not..*
7250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
7260: 6f 6c 76 65 41 73 4e 61 6d 65 28 0a 20 20 50 61  olveAsName(.  Pa
7270: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7280: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
7290: 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  ext for error me
72a0: 73 73 61 67 65 73 20 2a 2f 0a 20 20 45 78 70 72  ssages */.  Expr
72b0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f  List *pEList,  /
72c0: 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73  * List of expres
72d0: 73 69 6f 6e 73 20 74 6f 20 73 63 61 6e 20 2a 2f  sions to scan */
72e0: 0a 20 20 45 78 70 72 20 2a 70 45 20 20 20 20 20  .  Expr *pE     
72f0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
7300: 69 6f 6e 20 77 65 20 61 72 65 20 74 72 79 69 6e  ion we are tryin
7310: 67 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  g to match */.){
7320: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7330: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7340: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 55 4e 55 53  unter */..  UNUS
7350: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
7360: 72 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 45 2d  rse);..  if( pE-
7370: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
7380: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70    char *zCol = p
7390: 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  E->u.zToken;.   
73a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
73b0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
73c0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73  .      char *zAs
73d0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
73e0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
73f0: 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74   zAs!=0 && sqlit
7400: 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a  e3StrICmp(zAs, z
7410: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
7420: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
7430: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7440: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7450: 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70 6f  /*.** pE is a po
7460: 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72  inter to an expr
7470: 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73 20  ession which is 
7480: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  a single term in
7490: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
74a0: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   of a compound S
74b0: 45 4c 45 43 54 2e 20 20 54 68 65 20 65 78 70 72  ELECT.  The expr
74c0: 65 73 73 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  ession has not b
74d0: 65 65 6e 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  een.** name reso
74e0: 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74  lved..**.** At t
74f0: 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f  he point this ro
7500: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
7510: 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   we already know
7520: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44   that the.** ORD
7530: 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f  ER BY term is no
7540: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64  t an integer ind
7550: 65 78 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75  ex into the resu
7560: 6c 74 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a  lt set.  That.**
7570: 20 63 61 73 65 20 69 73 20 68 61 6e 64 6c 65 64   case is handled
7580: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
7590: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41  routine..**.** A
75a0: 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68 20  ttempt to match 
75b0: 70 45 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c  pE against resul
75c0: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  t set columns in
75d0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
75e0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
75f0: 6e 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  nt.  Return the 
7600: 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d  index i of the m
7610: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a  atching column,.
7620: 2a 2a 20 61 73 20 61 6e 20 69 6e 64 69 63 61 74  ** as an indicat
7630: 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ion to the calle
7640: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
7650: 20 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d 74   sort by the i-t
7660: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65  h column..** The
7670: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
7680: 6e 20 69 73 20 31 2e 20 20 49 6e 20 6f 74 68 65  n is 1.  In othe
7690: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 76 61 6c  r words, the val
76a0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
76b0: 68 65 0a 2a 2a 20 73 61 6d 65 20 69 6e 74 65 67  he.** same integ
76c0: 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 77 6f  er value that wo
76d0: 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 20 74  uld be used in t
76e0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
76f0: 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
7700: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  the column..**.*
7710: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
7720: 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30   match, return 0
7730: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
7740: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
7750: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7760: 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72  esolveOrderByTer
7770: 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50  mToExprList(.  P
7780: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7790: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
77a0: 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d  text for error m
77b0: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
77c0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
77d0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
77e0: 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65  atement with the
77f0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
7800: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20   */.  Expr *pE  
7810: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7820: 73 70 65 63 69 66 69 63 20 4f 52 44 45 52 20 42  specific ORDER B
7830: 59 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  Y term */.){.  i
7840: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7850: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7860: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
7870: 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65  *pEList;  /* The
7880: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
7890: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
78a0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20  NameContext nc; 
78b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
78c0: 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67  xt for resolving
78d0: 20 70 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   pE */.  sqlite3
78e0: 20 2a 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44   *db;       /* D
78f0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
7900: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
7910: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
7920: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
7930: 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
7940: 20 20 75 38 20 73 61 76 65 64 53 75 70 70 45 72    u8 savedSuppEr
7950: 72 3b 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61  r;   /* Saved va
7960: 6c 75 65 20 6f 66 20 64 62 2d 3e 73 75 70 70 72  lue of db->suppr
7970: 65 73 73 45 72 72 20 2a 2f 0a 0a 20 20 61 73 73  essErr */..  ass
7980: 65 72 74 28 20 73 71 6c 69 74 65 33 45 78 70 72  ert( sqlite3Expr
7990: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
79a0: 29 3d 3d 30 20 29 3b 0a 20 20 70 45 4c 69 73 74  )==0 );.  pEList
79b0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
79c0: 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  st;..  /* Resolv
79d0: 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74  e all names in t
79e0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
79f0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f   expression.  */
7a00: 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30  .  memset(&nc, 0
7a10: 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20  , sizeof(nc));. 
7a20: 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61   nc.pParse = pPa
7a30: 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69  rse;.  nc.pSrcLi
7a40: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
7a50: 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20  rc;.  nc.pEList 
7a60: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e  = pEList;.  nc.n
7a70: 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f  cFlags = NC_Allo
7a80: 77 41 67 67 3b 0a 20 20 6e 63 2e 6e 45 72 72 20  wAgg;.  nc.nErr 
7a90: 3d 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  = 0;.  db = pPar
7aa0: 73 65 2d 3e 64 62 3b 0a 20 20 73 61 76 65 64 53  se->db;.  savedS
7ab0: 75 70 70 45 72 72 20 3d 20 64 62 2d 3e 73 75 70  uppErr = db->sup
7ac0: 70 72 65 73 73 45 72 72 3b 0a 20 20 64 62 2d 3e  pressErr;.  db->
7ad0: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 31 3b  suppressErr = 1;
7ae0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52  .  rc = sqlite3R
7af0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
7b00: 26 6e 63 2c 20 70 45 29 3b 0a 20 20 64 62 2d 3e  &nc, pE);.  db->
7b10: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 73 61  suppressErr = sa
7b20: 76 65 64 53 75 70 70 45 72 72 3b 0a 20 20 69 66  vedSuppErr;.  if
7b30: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
7b40: 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 6d 61  ..  /* Try to ma
7b50: 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  tch the ORDER BY
7b60: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
7b70: 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  nst an expressio
7b80: 6e 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  n.  ** in the re
7b90: 73 75 6c 74 20 73 65 74 2e 20 20 52 65 74 75 72  sult set.  Retur
7ba0: 6e 20 61 6e 20 31 2d 62 61 73 65 64 20 69 6e 64  n an 1-based ind
7bb0: 65 78 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69  ex of the matchi
7bc0: 6e 67 0a 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73  ng.  ** result-s
7bd0: 65 74 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20  et entry..  */. 
7be0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
7bf0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7c00: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7c10: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 4c 69  ExprCompare(pELi
7c20: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  st->a[i].pExpr, 
7c30: 70 45 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20  pE, -1)<2 ){.   
7c40: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
7c50: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
7c60: 66 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75  f no match, retu
7c70: 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72  rn 0. */.  retur
7c80: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
7c90: 6e 65 72 61 74 65 20 61 6e 20 4f 52 44 45 52 20  nerate an ORDER 
7ca0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 74  BY or GROUP BY t
7cb0: 65 72 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65  erm out-of-range
7cc0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
7cd0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 4f 75  c void resolveOu
7ce0: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 0a 20  tOfRangeError(. 
7cf0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
7d00: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
7d10: 72 72 6f 72 20 63 6f 6e 74 65 78 74 20 69 6e 74  rror context int
7d20: 6f 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65  o which to write
7d30: 20 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20   the error */.  
7d40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
7d50: 65 2c 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52  e,     /* "ORDER
7d60: 22 20 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a  " or "GROUP" */.
7d70: 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
7d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7d90: 69 6e 64 65 78 20 28 31 2d 62 61 73 65 64 29 20  index (1-based) 
7da0: 6f 66 20 74 68 65 20 74 65 72 6d 20 6f 75 74 20  of the term out 
7db0: 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e  of range */.  in
7dc0: 74 20 6d 78 20 20 20 20 20 20 20 20 20 20 20 20  t mx            
7dd0: 20 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20       /* Largest 
7de0: 70 65 72 6d 69 73 73 69 62 6c 65 20 76 61 6c 75  permissible valu
7df0: 65 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20 20 73  e of i */.){.  s
7e00: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7e10: 50 61 72 73 65 2c 20 0a 20 20 20 20 22 25 72 20  Parse, .    "%r 
7e20: 25 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f  %s BY term out o
7e30: 66 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64  f range - should
7e40: 20 62 65 20 22 0a 20 20 20 20 22 62 65 74 77 65   be ".    "betwe
7e50: 65 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2c  en 1 and %d", i,
7e60: 20 7a 54 79 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a   zType, mx);.}..
7e70: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
7e80: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7e90: 65 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20  e in a compound 
7ea0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7eb0: 2e 20 20 20 4d 6f 64 69 66 79 0a 2a 2a 20 65 61  .   Modify.** ea
7ec0: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f  ch term of the O
7ed0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
7ee0: 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74  s a constant int
7ef0: 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 0a 2a  eger between 1.*
7f00: 2a 20 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20  * and N where N 
7f10: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
7f20: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
7f30: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e  compound SELECT.
7f40: 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  .**.** ORDER BY 
7f50: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 61  terms that are a
7f60: 6c 72 65 61 64 79 20 61 6e 20 69 6e 74 65 67 65  lready an intege
7f70: 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  r between 1 and 
7f80: 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66  N are.** unmodif
7f90: 69 65 64 2e 20 20 4f 52 44 45 52 20 42 59 20 74  ied.  ORDER BY t
7fa0: 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 69 6e  erms that are in
7fb0: 74 65 67 65 72 73 20 6f 75 74 73 69 64 65 20 74  tegers outside t
7fc0: 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 31  he range of.** 1
7fd0: 20 74 68 72 6f 75 67 68 20 4e 20 67 65 6e 65 72   through N gener
7fe0: 61 74 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 4f  ate an error.  O
7ff0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
8000: 61 74 20 61 72 65 20 65 78 70 72 65 73 73 69 6f  at are expressio
8010: 6e 73 0a 2a 2a 20 61 72 65 20 6d 61 74 63 68 65  ns.** are matche
8020: 64 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74  d against result
8030: 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73   set expressions
8040: 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c   of compound SEL
8050: 45 43 54 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67  ECT.** beginning
8060: 20 77 69 74 68 20 74 68 65 20 6c 65 66 74 2d 6d   with the left-m
8070: 6f 73 74 20 53 45 4c 45 43 54 20 61 6e 64 20 77  ost SELECT and w
8080: 6f 72 6b 69 6e 67 20 74 6f 77 61 72 64 20 74 68  orking toward th
8090: 65 20 72 69 67 68 74 2e 0a 2a 2a 20 41 74 20 74  e right..** At t
80a0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 2c 20  he first match, 
80b0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  the ORDER BY exp
80c0: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 61 6e 73  ression is trans
80d0: 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 20 74  formed into.** t
80e0: 68 65 20 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d  he integer colum
80f0: 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  n number..**.** 
8100: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
8110: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
8120: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8130: 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f  resolveCompoundO
8140: 72 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20  rderBy(.  Parse 
8150: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
8160: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
8170: 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72  xt.  Leave error
8180: 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a   messages here *
8190: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
81a0: 65 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ect       /* The
81b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
81c0: 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
81d0: 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a 29 7b 0a   ORDER BY */.){.
81e0: 20 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c    int i;.  ExprL
81f0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20  ist *pOrderBy;. 
8200: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
8210: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
8220: 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f  ;.  int moreToDo
8230: 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42   = 1;..  pOrderB
8240: 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72  y = pSelect->pOr
8250: 64 65 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72  derBy;.  if( pOr
8260: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
8270: 6e 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  n 0;.  db = pPar
8280: 73 65 2d 3e 64 62 3b 0a 23 69 66 20 53 51 4c 49  se->db;.#if SQLI
8290: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
82a0: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  if( pOrderBy->nE
82b0: 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53  xpr>db->aLimit[S
82c0: 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
82d0: 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  MN] ){.    sqlit
82e0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
82f0: 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72  e, "too many ter
8300: 6d 73 20 69 6e 20 4f 52 44 45 52 20 42 59 20 63  ms in ORDER BY c
8310: 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 72 65 74  lause");.    ret
8320: 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
8330: 66 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  f.  for(i=0; i<p
8340: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8350: 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65 72  i++){.    pOrder
8360: 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20  By->a[i].done = 
8370: 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65 63 74  0;.  }.  pSelect
8380: 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 77  ->pNext = 0;.  w
8390: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70  hile( pSelect->p
83a0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53 65  Prior ){.    pSe
83b0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e  lect->pPrior->pN
83c0: 65 78 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20  ext = pSelect;. 
83d0: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
83e0: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20  lect->pPrior;.  
83f0: 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  }.  while( pSele
8400: 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29  ct && moreToDo )
8410: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70  {.    struct Exp
8420: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
8430: 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20  m;.    moreToDo 
8440: 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20  = 0;.    pEList 
8450: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  = pSelect->pELis
8460: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  t;.    assert( p
8470: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
8480: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
8490: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f  OrderBy->a; i<pO
84a0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
84b0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
84c0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d      int iCol = -
84d0: 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  1;.      Expr *p
84e0: 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20  E, *pDup;.      
84f0: 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20  if( pItem->done 
8500: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8510: 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78    pE = sqlite3Ex
8520: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 49  prSkipCollate(pI
8530: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
8540: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
8550: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
8560: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
8570: 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c    if( iCol<=0 ||
8580: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
8590: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
85a0: 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e   resolveOutOfRan
85b0: 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  geError(pParse, 
85c0: 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70 45  "ORDER", i+1, pE
85d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
85e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
85f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8610: 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41   iCol = resolveA
8620: 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 45  sName(pParse, pE
8630: 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20 20 20  List, pE);.     
8640: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29     if( iCol==0 )
8650: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 44 75 70  {.          pDup
8660: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
8670: 70 28 64 62 2c 20 70 45 2c 20 30 29 3b 0a 20 20  p(db, pE, 0);.  
8680: 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
8690: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
86a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
86b0: 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ert(pDup);.     
86c0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65         iCol = re
86d0: 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d  solveOrderByTerm
86e0: 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  ToExprList(pPars
86f0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44 75 70  e, pSelect, pDup
8700: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
8710: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8720: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
8730: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Dup);.        }.
8740: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8750: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
8760: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
8770: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
8780: 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
8790: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
87a0: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  Col,.        ** 
87b0: 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 70  taking care to p
87c0: 72 65 73 65 72 76 65 20 74 68 65 20 43 4f 4c 4c  reserve the COLL
87d0: 41 54 45 20 63 6c 61 75 73 65 20 69 66 20 69 74  ATE clause if it
87e0: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
87f0: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d 20     Expr *pNew = 
8800: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
8810: 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b 0a  TK_INTEGER, 0);.
8820: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
8830: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
8840: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c          pNew->fl
8850: 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c  ags |= EP_IntVal
8860: 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  ue;.        pNew
8870: 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 43 6f  ->u.iValue = iCo
8880: 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  l;.        if( p
8890: 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 45 20  Item->pExpr==pE 
88a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
88b0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77  em->pExpr = pNew
88c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
88d0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
88e0: 2a 70 50 61 72 65 6e 74 20 3d 20 70 49 74 65 6d  *pParent = pItem
88f0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
8900: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
8910: 6e 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  nt->op==TK_COLLA
8920: 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TE );.          
8930: 77 68 69 6c 65 28 20 70 50 61 72 65 6e 74 2d 3e  while( pParent->
8940: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pLeft->op==TK_CO
8950: 4c 4c 41 54 45 20 29 20 70 50 61 72 65 6e 74 20  LLATE ) pParent 
8960: 3d 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74  = pParent->pLeft
8970: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
8980: 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65  rt( pParent->pLe
8990: 66 74 3d 3d 70 45 20 29 3b 0a 20 20 20 20 20 20  ft==pE );.      
89a0: 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65      pParent->pLe
89b0: 66 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  ft = pNew;.     
89c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
89d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
89e0: 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20  b, pE);.        
89f0: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
8a00: 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43  rByCol = (u16)iC
8a10: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  ol;.        pIte
8a20: 6d 2d 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20  m->done = 1;.   
8a30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8a40: 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a    moreToDo = 1;.
8a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8a60: 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c    pSelect = pSel
8a70: 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a  ect->pNext;.  }.
8a80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
8a90: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
8aa0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64  +){.    if( pOrd
8ab0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d  erBy->a[i].done=
8ac0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
8ad0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8ae0: 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42 59  se, "%r ORDER BY
8af0: 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d   term does not m
8b00: 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20 20  atch any ".     
8b10: 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69         "column i
8b20: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
8b30: 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 72  ", i+1);.      r
8b40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
8b50: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
8b60: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 65 76  ../*.** Check ev
8b70: 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20  ery term in the 
8b80: 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55  ORDER BY or GROU
8b90: 50 20 42 59 20 63 6c 61 75 73 65 20 70 4f 72 64  P BY clause pOrd
8ba0: 65 72 42 79 20 6f 66 0a 2a 2a 20 74 68 65 20 53  erBy of.** the S
8bb0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
8bc0: 70 53 65 6c 65 63 74 2e 20 20 49 66 20 61 6e 79  pSelect.  If any
8bd0: 20 74 65 72 6d 20 69 73 20 72 65 66 65 72 65 6e   term is referen
8be0: 63 65 20 74 6f 20 61 0a 2a 2a 20 72 65 73 75 6c  ce to a.** resul
8bf0: 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t set expression
8c00: 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20   (as determined 
8c10: 62 79 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e  by the ExprList.
8c20: 61 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  a.u.x.iOrderByCo
8c30: 6c 0a 2a 2a 20 66 69 65 6c 64 29 20 74 68 65 6e  l.** field) then
8c40: 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 74 65   convert that te
8c50: 72 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79 20 6f  rm into a copy o
8c60: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
8c70: 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 0a 2a  ing result set.*
8c80: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  * column..**.** 
8c90: 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72  If any errors ar
8ca0: 65 20 64 65 74 65 63 74 65 64 2c 20 61 64 64 20  e detected, add 
8cb0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
8cc0: 20 74 6f 20 70 50 61 72 73 65 20 61 6e 64 0a 2a   to pParse and.*
8cd0: 2a 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  * return non-zer
8ce0: 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20  o.  Return zero 
8cf0: 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 61 72 65  if no errors are
8d00: 20 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   seen..*/.int sq
8d10: 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65  lite3ResolveOrde
8d20: 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73  rGroupBy(.  Pars
8d30: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
8d40: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
8d50: 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72  text.  Leave err
8d60: 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65  or messages here
8d70: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
8d80: 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54  elect,      /* T
8d90: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
8da0: 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ent containing t
8db0: 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  he clause */.  E
8dc0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
8dd0: 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  y,   /* The ORDE
8de0: 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59  R BY or GROUP BY
8df0: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72   clause to be pr
8e00: 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ocessed */.  con
8e10: 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20  st char *zType  
8e20: 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72     /* "ORDER" or
8e30: 20 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20   "GROUP" */.){. 
8e40: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
8e50: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8e60: 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  db;.  ExprList *
8e70: 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74  pEList;.  struct
8e80: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
8e90: 70 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70 4f  pItem;..  if( pO
8ea0: 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61  rderBy==0 || pPa
8eb0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
8ec0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
8ed0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
8ee0: 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 4f  _COLUMN.  if( pO
8ef0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62  rderBy->nExpr>db
8f00: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8f10: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
8f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8f30: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8f40: 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
8f50: 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a  %s BY clause", z
8f60: 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Type);.    retur
8f70: 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 1;.  }.#endif.
8f80: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
8f90: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73  ct->pEList;.  as
8fa0: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
8fb0: 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 65  );  /* sqlite3Se
8fc0: 6c 65 63 74 4e 65 77 28 29 20 67 75 61 72 61 6e  lectNew() guaran
8fd0: 74 65 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 66  tees this */.  f
8fe0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
8ff0: 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72  rderBy->a; i<pOr
9000: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
9010: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
9020: 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
9030: 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20  iOrderByCol ){. 
9040: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
9050: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
9060: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
9070: 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65  .        resolve
9080: 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28  OutOfRangeError(
9090: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69  pParse, zType, i
90a0: 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  +1, pEList->nExp
90b0: 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
90c0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
90d0: 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69 61 73      resolveAlias
90e0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
90f0: 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
9100: 65 72 42 79 43 6f 6c 2d 31 2c 20 70 49 74 65 6d  erByCol-1, pItem
9110: 2d 3e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->pExpr,.       
9120: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70              zTyp
9130: 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e,0);.    }.  }.
9140: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
9150: 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
9160: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
9170: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
9180: 69 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  in SELECT statem
9190: 65 6e 74 20 70 53 65 6c 65 63 74 2e 0a 2a 2a 20  ent pSelect..** 
91a0: 54 68 65 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74  The Name context
91b0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73   of the SELECT s
91c0: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 4e 43 2e  tatement is pNC.
91d0: 20 20 7a 54 79 70 65 20 69 73 20 65 69 74 68 65    zType is eithe
91e0: 72 0a 2a 2a 20 22 4f 52 44 45 52 22 20 6f 72 20  r.** "ORDER" or 
91f0: 22 47 52 4f 55 50 22 20 64 65 70 65 6e 64 69 6e  "GROUP" dependin
9200: 67 20 6f 6e 20 77 68 69 63 68 20 74 79 70 65 20  g on which type 
9210: 6f 66 20 63 6c 61 75 73 65 20 70 4f 72 64 65 72  of clause pOrder
9220: 42 79 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  By is..**.** Thi
9230: 73 20 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76  s routine resolv
9240: 65 73 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20  es each term of 
9250: 74 68 65 20 63 6c 61 75 73 65 20 69 6e 74 6f 20  the clause into 
9260: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  an expression..*
9270: 2a 20 49 66 20 74 68 65 20 6f 72 64 65 72 2d 62  * If the order-b
9280: 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74  y term is an int
9290: 65 67 65 72 20 49 20 62 65 74 77 65 65 6e 20 31  eger I between 1
92a0: 20 61 6e 64 20 4e 20 28 77 68 65 72 65 20 4e 20   and N (where N 
92b0: 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
92c0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
92d0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66  he result set of
92e0: 20 74 68 65 20 53 45 4c 45 43 54 29 20 74 68 65   the SELECT) the
92f0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
9300: 0a 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 6f 6c  .** in the resol
9310: 75 74 69 6f 6e 20 69 73 20 61 20 63 6f 70 79 20  ution is a copy 
9320: 6f 66 20 74 68 65 20 49 2d 74 68 20 72 65 73 75  of the I-th resu
9330: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
9340: 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 6f 72  n.  If.** the or
9350: 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61  der-by term is a
9360: 6e 20 69 64 65 6e 74 69 66 69 65 72 20 74 68 61  n identifier tha
9370: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
9380: 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 0a   the AS-name of.
9390: 2a 2a 20 61 20 72 65 73 75 6c 74 2d 73 65 74 20  ** a result-set 
93a0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e  expression, then
93b0: 20 74 68 65 20 74 65 72 6d 20 72 65 73 6f 6c 76   the term resolv
93c0: 65 73 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20  es to a copy of 
93d0: 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65  the.** result-se
93e0: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4f  t expression.  O
93f0: 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 65 78  therwise, the ex
9400: 70 72 65 73 73 69 6f 6e 20 69 73 20 72 65 73 6f  pression is reso
9410: 6c 76 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75  lved in.** the u
9420: 73 75 61 6c 20 77 61 79 20 2d 20 75 73 69 6e 67  sual way - using
9430: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
9440: 78 70 72 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a  xprNames()..**.*
9450: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
9460: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
9470: 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  r of errors.  If
9480: 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 74   errors occur, t
9490: 68 65 6e 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  hen.** an approp
94a0: 72 69 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73  riate error mess
94b0: 61 67 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66  age might be lef
94c0: 74 20 69 6e 20 70 50 61 72 73 65 2e 20 20 28 4f  t in pParse.  (O
94d0: 4f 4d 20 65 72 72 6f 72 73 0a 2a 2a 20 65 78 63  OM errors.** exc
94e0: 65 70 74 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69  epted.).*/.stati
94f0: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64  c int resolveOrd
9500: 65 72 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d  erGroupBy(.  Nam
9510: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
9520: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
9530: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45  ontext of the SE
9540: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a  LECT statement *
9550: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
9560: 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  ect,      /* The
9570: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9580: 74 20 68 6f 6c 64 69 6e 67 20 70 4f 72 64 65 72  t holding pOrder
9590: 42 79 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  By */.  ExprList
95a0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
95b0: 20 41 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   An ORDER BY or 
95c0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
95d0: 74 6f 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20  to resolve */.  
95e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
95f0: 65 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20  e     /* Either 
9600: 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
9610: 50 22 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61  P", as appropria
9620: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  te */.){.  int i
9630: 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  , j;            
9640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
9650: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
9660: 69 6e 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20  int iCol;       
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9680: 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  * Column number 
9690: 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
96a0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
96b0: 3b 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66  ;   /* A term of
96c0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
96d0: 61 75 73 65 20 2a 2f 0a 20 20 50 61 72 73 65 20  ause */.  Parse 
96e0: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20  *pParse;        
96f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9700: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9710: 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 20 20 20   int nResult;   
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
9740: 6d 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ms in the result
9750: 20 73 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 70   set */..  if( p
9760: 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74  OrderBy==0 ) ret
9770: 75 72 6e 20 30 3b 0a 20 20 6e 52 65 73 75 6c 74  urn 0;.  nResult
9780: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
9790: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 50 61  st->nExpr;.  pPa
97a0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
97b0: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  e;.  for(i=0, pI
97c0: 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
97d0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
97e0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
97f0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20  ){.    Expr *pE 
9800: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
9810: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
9820: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
9830: 6f 6c 6c 61 74 65 28 70 45 29 3b 0a 20 20 20 20  ollate(pE);.    
9840: 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47  if( zType[0]!='G
9850: 27 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20  ' ){.      iCol 
9860: 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28  = resolveAsName(
9870: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d  pParse, pSelect-
9880: 3e 70 45 4c 69 73 74 2c 20 70 45 32 29 3b 0a 20  >pEList, pE2);. 
9890: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20       if( iCol>0 
98a0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
98b0: 20 61 6e 20 41 53 2d 6e 61 6d 65 20 6d 61 74 63   an AS-name matc
98c0: 68 20 69 73 20 66 6f 75 6e 64 2c 20 6d 61 72 6b  h is found, mark
98d0: 20 74 68 69 73 20 4f 52 44 45 52 20 42 59 20 63   this ORDER BY c
98e0: 6f 6c 75 6d 6e 20 61 73 20 62 65 69 6e 67 0a 20  olumn as being. 
98f0: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79         ** a copy
9900: 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20   of the iCol-th 
9910: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
9920: 6e 2e 20 20 54 68 65 20 73 75 62 73 65 71 75 65  n.  The subseque
9930: 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20  nt call to.     
9940: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73     ** sqlite3Res
9950: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
9960: 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20  () will convert 
9970: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
9980: 6f 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  o a.        ** c
9990: 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d  opy of the iCol-
99a0: 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  th result-set ex
99b0: 70 72 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20  pression. */.   
99c0: 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
99d0: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
99e0: 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16)iCol;.       
99f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9a00: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9a10: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
9a20: 74 65 67 65 72 28 70 45 32 2c 20 26 69 43 6f 6c  teger(pE2, &iCol
9a30: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
9a40: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
9a50: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f  is an integer co
9a60: 6e 73 74 61 6e 74 2e 20 20 41 67 61 69 6e 2c 20  nstant.  Again, 
9a70: 73 65 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20  set the column. 
9a80: 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 73       ** number s
9a90: 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 52 65  o that sqlite3Re
9aa0: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
9ab0: 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74  y() will convert
9ac0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72   the.      ** or
9ad0: 64 65 72 2d 62 79 20 74 65 72 6d 20 74 6f 20 61  der-by term to a
9ae0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 72 65 73   copy of the res
9af0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
9b00: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
9b10: 69 43 6f 6c 3c 31 20 7c 7c 20 69 43 6f 6c 3e 30  iCol<1 || iCol>0
9b20: 78 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20  xffff ){.       
9b30: 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e   resolveOutOfRan
9b40: 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  geError(pParse, 
9b50: 7a 54 79 70 65 2c 20 69 2b 31 2c 20 6e 52 65 73  zType, i+1, nRes
9b60: 75 6c 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ult);.        re
9b70: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
9b80: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
9b90: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
9ba0: 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20  u16)iCol;.      
9bb0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
9bc0: 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  .    /* Otherwis
9bd0: 65 2c 20 74 72 65 61 74 20 74 68 65 20 4f 52 44  e, treat the ORD
9be0: 45 52 20 42 59 20 74 65 72 6d 20 61 73 20 61 6e  ER BY term as an
9bf0: 20 6f 72 64 69 6e 61 72 79 20 65 78 70 72 65 73   ordinary expres
9c00: 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 70 49 74 65  sion */.    pIte
9c10: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
9c20: 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ol = 0;.    if( 
9c30: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
9c40: 70 72 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29  prNames(pNC, pE)
9c50: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
9c60: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   1;.    }.    fo
9c70: 72 28 6a 3d 30 3b 20 6a 3c 70 53 65 6c 65 63 74  r(j=0; j<pSelect
9c80: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
9c90: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   j++){.      if(
9ca0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
9cb0: 61 72 65 28 70 45 2c 20 70 53 65 6c 65 63 74 2d  are(pE, pSelect-
9cc0: 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  >pEList->a[j].pE
9cd0: 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20  xpr, -1)==0 ){. 
9ce0: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
9cf0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
9d00: 6a 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j+1;.      }.   
9d10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9d20: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
9d30: 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
9d40: 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 4f 72 64  e, pSelect, pOrd
9d50: 65 72 42 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a  erBy, zType);.}.
9d60: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e  ./*.** Resolve n
9d70: 61 6d 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ames in the SELE
9d80: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 20 61  CT statement p a
9d90: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 64 65  nd all of its de
9da0: 73 63 65 6e 64 61 6e 74 73 2e 0a 2a 2f 0a 73 74  scendants..*/.st
9db0: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
9dc0: 53 65 6c 65 63 74 53 74 65 70 28 57 61 6c 6b 65  SelectStep(Walke
9dd0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
9de0: 63 74 20 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f  ct *p){.  NameCo
9df0: 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b  ntext *pOuterNC;
9e00: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 74 68 61    /* Context tha
9e10: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20  t contains this 
9e20: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65  SELECT */.  Name
9e30: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
9e40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
9e50: 65 78 74 20 6f 66 20 74 68 69 73 20 53 45 4c 45  ext of this SELE
9e60: 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  CT */.  int isCo
9e70: 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20  mpound;         
9e80: 2f 2a 20 54 72 75 65 20 69 66 20 70 20 69 73 20  /* True if p is 
9e90: 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
9ea0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70  t */.  int nComp
9eb0: 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  ound;          /
9ec0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70  * Number of comp
9ed0: 6f 75 6e 64 20 74 65 72 6d 73 20 70 72 6f 63 65  ound terms proce
9ee0: 73 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ssed so far */. 
9ef0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
9f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
9f10: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9f20: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
9f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9f40: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
9f50: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
9f60: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  ;     /* The GRO
9f70: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
9f80: 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 6d    Select *pLeftm
9f90: 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 65 66  ost;      /* Lef
9fa0: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
9fb0: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a   of a compound *
9fc0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
9fe0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9ff0: 6f 6e 20 2a 2f 0a 20 20 0a 0a 20 20 61 73 73 65  on */.  ..  asse
a000: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
a010: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
a020: 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20  SF_Resolved ){. 
a030: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
a040: 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 65  une;.  }.  pOute
a050: 72 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  rNC = pWalker->u
a060: 2e 70 4e 43 3b 0a 20 20 70 50 61 72 73 65 20 3d  .pNC;.  pParse =
a070: 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
a080: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
a090: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  >db;..  /* Norma
a0a0: 6c 6c 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63  lly sqlite3Selec
a0b0: 74 45 78 70 61 6e 64 28 29 20 77 69 6c 6c 20 62  tExpand() will b
a0c0: 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 20 61  e called first a
a0d0: 6e 64 20 77 69 6c 6c 20 68 61 76 65 0a 20 20 2a  nd will have.  *
a0e0: 2a 20 61 6c 72 65 61 64 79 20 65 78 70 61 6e 64  * already expand
a0f0: 65 64 20 74 68 69 73 20 53 45 4c 45 43 54 2e 20  ed this SELECT. 
a100: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 69   However, if thi
a110: 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  s is a subquery 
a120: 77 69 74 68 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  within.  ** an e
a130: 78 70 72 65 73 73 69 6f 6e 2c 20 73 71 6c 69 74  xpression, sqlit
a140: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
a150: 65 73 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c  es() will be cal
a160: 6c 65 64 20 77 69 74 68 6f 75 74 20 61 0a 20 20  led without a.  
a170: 2a 2a 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f  ** prior call to
a180: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
a190: 70 61 6e 64 28 29 2e 20 20 57 68 65 6e 20 74 68  pand().  When th
a1a0: 61 74 20 68 61 70 70 65 6e 73 2c 20 6c 65 74 0a  at happens, let.
a1b0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65    ** sqlite3Sele
a1c0: 63 74 50 72 65 70 28 29 20 64 6f 20 61 6c 6c 20  ctPrep() do all 
a1d0: 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
a1e0: 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
a1f0: 54 2e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 53  T..  ** sqlite3S
a200: 65 6c 65 63 74 50 72 65 70 28 29 20 77 69 6c 6c  electPrep() will
a210: 20 69 6e 76 6f 6b 65 20 62 6f 74 68 20 73 71 6c   invoke both sql
a220: 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
a230: 28 29 20 61 6e 64 0a 20 20 2a 2a 20 74 68 69 73  () and.  ** this
a240: 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 65 20   routine in the 
a250: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 0a 20  correct order.. 
a260: 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
a270: 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
a280: 6e 64 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nded)==0 ){.    
a290: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
a2a0: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  p(pParse, p, pOu
a2b0: 74 65 72 4e 43 29 3b 0a 20 20 20 20 72 65 74 75  terNC);.    retu
a2c0: 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  rn (pParse->nErr
a2d0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
a2e0: 69 6c 65 64 29 20 3f 20 57 52 43 5f 41 62 6f 72  iled) ? WRC_Abor
a2f0: 74 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  t : WRC_Prune;. 
a300: 20 7d 0a 0a 20 20 69 73 43 6f 6d 70 6f 75 6e 64   }..  isCompound
a310: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 21 3d 30 3b   = p->pPrior!=0;
a320: 0a 20 20 6e 43 6f 6d 70 6f 75 6e 64 20 3d 20 30  .  nCompound = 0
a330: 3b 0a 20 20 70 4c 65 66 74 6d 6f 73 74 20 3d 20  ;.  pLeftmost = 
a340: 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  p;.  while( p ){
a350: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
a360: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  >selFlags & SF_E
a370: 78 70 61 6e 64 65 64 29 21 3d 30 20 29 3b 0a 20  xpanded)!=0 );. 
a380: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
a390: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
a3a0: 6f 6c 76 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20  olved)==0 );.   
a3b0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
a3c0: 53 46 5f 52 65 73 6f 6c 76 65 64 3b 0a 0a 20 20  SF_Resolved;..  
a3d0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
a3e0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
a3f0: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
a400: 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
a410: 65 73 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 6e  ese.    ** are n
a420: 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65  ot allowed to re
a430: 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73  fer to any names
a440: 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70  , so pass an emp
a450: 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a  ty NameContext..
a460: 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
a470: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
a480: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
a490: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
a4a0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
a4b0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
a4c0: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69  s(&sNC, p->pLimi
a4d0: 74 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 73 71  t) ||.        sq
a4e0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
a4f0: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
a500: 4f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 20  Offset) ){.     
a510: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
a520: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
a530: 20 49 66 20 74 68 65 20 53 46 5f 43 6f 6e 76 65   If the SF_Conve
a540: 72 74 65 64 20 66 6c 61 67 73 20 69 73 20 73 65  rted flags is se
a550: 74 2c 20 74 68 65 6e 20 74 68 69 73 20 53 65 6c  t, then this Sel
a560: 65 63 74 20 6f 62 6a 65 63 74 20 77 61 73 0a 20  ect object was. 
a570: 20 20 20 2a 2a 20 77 61 73 20 63 72 65 61 74 65     ** was create
a580: 64 20 62 79 20 74 68 65 20 63 6f 6e 76 65 72 74  d by the convert
a590: 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
a5a0: 53 75 62 71 75 65 72 79 28 29 20 66 75 6e 63 74  Subquery() funct
a5b0: 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ion..    ** In t
a5c0: 68 69 73 20 63 61 73 65 20 74 68 65 20 4f 52 44  his case the ORD
a5d0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 2d  ER BY clause (p-
a5e0: 3e 70 4f 72 64 65 72 42 79 29 20 73 68 6f 75 6c  >pOrderBy) shoul
a5f0: 64 20 62 65 20 72 65 73 6f 6c 76 65 64 0a 20 20  d be resolved.  
a600: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 77 65    ** as if it we
a610: 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  re part of the s
a620: 75 62 2d 71 75 65 72 79 2c 20 6e 6f 74 20 74 68  ub-query, not th
a630: 65 20 70 61 72 65 6e 74 2e 20 54 68 69 73 20 62  e parent. This b
a640: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 6d 6f 76 65  lock.    ** move
a650: 73 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 64  s the pOrderBy d
a660: 6f 77 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 71  own to the sub-q
a670: 75 65 72 79 2e 20 49 74 20 77 69 6c 6c 20 62 65  uery. It will be
a680: 20 6d 6f 76 65 64 20 62 61 63 6b 0a 20 20 20 20   moved back.    
a690: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 6e 61 6d  ** after the nam
a6a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 73  es have been res
a6b0: 6f 6c 76 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  olved.  */.    i
a6c0: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
a6d0: 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 20 29 7b   SF_Converted ){
a6e0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
a6f0: 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
a700: 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [0].pSelect;.   
a710: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
a720: 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 70  rc->nSrc==1 && p
a730: 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
a740: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
a750: 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
a760: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
a770: 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
a780: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
a790: 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  rBy;.      p->pO
a7a0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
a7b0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 75  }.  .    /* Recu
a7c0: 72 73 69 76 65 6c 79 20 72 65 73 6f 6c 76 65 20  rsively resolve 
a7d0: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73 75 62  names in all sub
a7e0: 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2f 0a 20  queries.    */. 
a7f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
a800: 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
a810: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
a820: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
a830: 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
a840: 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  a[i];.      if( 
a850: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
a860: 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f  {.        NameCo
a870: 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 20  ntext *pNC;     
a880: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
a890: 74 65 72 61 74 65 20 6e 61 6d 65 20 63 6f 6e 74  terate name cont
a8a0: 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  exts */.        
a8b0: 69 6e 74 20 6e 52 65 66 20 3d 20 30 3b 20 20 20  int nRef = 0;   
a8c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66            /* Ref
a8d0: 63 6f 75 6e 74 20 66 6f 72 20 70 4f 75 74 65 72  count for pOuter
a8e0: 4e 43 20 61 6e 64 20 6f 75 74 65 72 20 63 6f 6e  NC and outer con
a8f0: 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  texts */.       
a900: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61   const char *zSa
a910: 76 65 64 43 6f 6e 74 65 78 74 20 3d 20 70 50 61  vedContext = pPa
a920: 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
a930: 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  t;..        /* C
a940: 6f 75 6e 74 20 74 68 65 20 74 6f 74 61 6c 20 6e  ount the total n
a950: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
a960: 63 65 73 20 74 6f 20 70 4f 75 74 65 72 4e 43 20  ces to pOuterNC 
a970: 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 0a 20  and all of its. 
a980: 20 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74         ** parent
a990: 20 63 6f 6e 74 65 78 74 73 2e 20 41 66 74 65 72   contexts. After
a9a0: 20 72 65 73 6f 6c 76 69 6e 67 20 72 65 66 65 72   resolving refer
a9b0: 65 6e 63 65 73 20 74 6f 20 65 78 70 72 65 73 73  ences to express
a9c0: 69 6f 6e 73 20 69 6e 0a 20 20 20 20 20 20 20 20  ions in.        
a9d0: 2a 2a 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  ** pItem->pSelec
a9e0: 74 2c 20 63 68 65 63 6b 20 69 66 20 74 68 69 73  t, check if this
a9f0: 20 76 61 6c 75 65 20 68 61 73 20 63 68 61 6e 67   value has chang
aa00: 65 64 2e 20 49 66 20 73 6f 2c 20 74 68 65 6e 0a  ed. If so, then.
aa10: 20 20 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43          ** SELEC
aa20: 54 20 73 74 61 74 65 6d 65 6e 74 20 70 49 74 65  T statement pIte
aa30: 6d 2d 3e 70 53 65 6c 65 63 74 20 6d 75 73 74 20  m->pSelect must 
aa40: 62 65 20 63 6f 72 72 65 6c 61 74 65 64 2e 20 53  be correlated. S
aa50: 65 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  et the.        *
aa60: 2a 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f  * pItem->fg.isCo
aa70: 72 72 65 6c 61 74 65 64 20 66 6c 61 67 20 69 66  rrelated flag if
aa80: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
aa90: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  e. */.        fo
aaa0: 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20  r(pNC=pOuterNC; 
aab0: 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e  pNC; pNC=pNC->pN
aac0: 65 78 74 29 20 6e 52 65 66 20 2b 3d 20 70 4e 43  ext) nRef += pNC
aad0: 2d 3e 6e 52 65 66 3b 0a 0a 20 20 20 20 20 20 20  ->nRef;..       
aae0: 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   if( pItem->zNam
aaf0: 65 20 29 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  e ) pParse->zAut
ab00: 68 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d  hContext = pItem
ab10: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
ab20: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
ab30: 65 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73  electNames(pPars
ab40: 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  e, pItem->pSelec
ab50: 74 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20  t, pOuterNC);.  
ab60: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41        pParse->zA
ab70: 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61  uthContext = zSa
ab80: 76 65 64 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20  vedContext;.    
ab90: 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e      if( pParse->
aba0: 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
abb0: 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
abc0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20  n WRC_Abort;..  
abd0: 20 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f        for(pNC=pO
abe0: 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43  uterNC; pNC; pNC
abf0: 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65  =pNC->pNext) nRe
ac00: 66 20 2d 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a  f -= pNC->nRef;.
ac10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
ac20: 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72  pItem->fg.isCorr
ac30: 65 6c 61 74 65 64 3d 3d 30 20 26 26 20 6e 52 65  elated==0 && nRe
ac40: 66 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  f<=0 );.        
ac50: 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72  pItem->fg.isCorr
ac60: 65 6c 61 74 65 64 20 3d 20 28 6e 52 65 66 21 3d  elated = (nRef!=
ac70: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
ac80: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20  }.  .    /* Set 
ac90: 75 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d  up the local nam
aca0: 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73  e-context to pas
acb0: 73 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 6f  s to sqlite3Reso
acc0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 74  lveExprNames() t
acd0: 6f 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65  o.    ** resolve
ace0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20   the result-set 
acf0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
ad00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e  .    */.    sNC.
ad10: 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c  ncFlags = NC_All
ad20: 6f 77 41 67 67 3b 0a 20 20 20 20 73 4e 43 2e 70  owAgg;.    sNC.p
ad30: 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  SrcList = p->pSr
ad40: 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  c;.    sNC.pNext
ad50: 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20 0a   = pOuterNC;.  .
ad60: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e      /* Resolve n
ad70: 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ames in the resu
ad80: 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69  lt set. */.    i
ad90: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
ada0: 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26  eExprListNames(&
adb0: 73 4e 43 2c 20 70 2d 3e 70 45 4c 69 73 74 29 20  sNC, p->pEList) 
adc0: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
add0: 72 74 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  rt;.  .    /* If
ade0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67   there are no ag
adf0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
ae00: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d  s in the result-
ae10: 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55  set, and no GROU
ae20: 50 20 42 59 20 0a 20 20 20 20 2a 2a 20 65 78 70  P BY .    ** exp
ae30: 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  ression, do not 
ae40: 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73  allow aggregates
ae50: 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f   in any of the o
ae60: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73  ther expressions
ae70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
ae80: 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
ae90: 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
aea0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 47 72 6f  )==0 );.    pGro
aeb0: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
aec0: 42 79 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f  By;.    if( pGro
aed0: 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e 6e 63 46  upBy || (sNC.ncF
aee0: 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41 67 67  lags & NC_HasAgg
aef0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
af00: 73 65 72 74 28 20 4e 43 5f 4d 69 6e 4d 61 78 41  sert( NC_MinMaxA
af10: 67 67 3d 3d 53 46 5f 4d 69 6e 4d 61 78 41 67 67  gg==SF_MinMaxAgg
af20: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c   );.      p->sel
af30: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72  Flags |= SF_Aggr
af40: 65 67 61 74 65 20 7c 20 28 73 4e 43 2e 6e 63 46  egate | (sNC.ncF
af50: 6c 61 67 73 26 4e 43 5f 4d 69 6e 4d 61 78 41 67  lags&NC_MinMaxAg
af60: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
af70: 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
af80: 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67   &= ~NC_AllowAgg
af90: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
afa0: 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
afb0: 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
afc0: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
afd0: 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
afe0: 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
aff0: 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
b000: 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b   && !pGroupBy ){
b010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
b020: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
b030: 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
b040: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
b050: 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
b060: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
b070: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a  Abort;.    }.  .
b080: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
b090: 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20 6c 69 73  utput column lis
b0a0: 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f  t to the name-co
b0b0: 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61 72  ntext before par
b0c0: 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  sing the.    ** 
b0d0: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
b0e0: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
b0f0: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
b100: 69 73 20 73 6f 20 74 68 61 74 0a 20 20 20 20 2a  is so that.    *
b110: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
b120: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
b130: 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66  e (etc.) can ref
b140: 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  er to expression
b150: 73 20 62 79 0a 20 20 20 20 2a 2a 20 61 6c 69 61  s by.    ** alia
b160: 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ses in the resul
b170: 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  t set..    **.  
b180: 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74    ** Minor point
b190: 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  : If this is the
b1a0: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
b1b0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20  expression will 
b1c0: 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d 65 76 61  be.    ** re-eva
b1d0: 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  luated for each 
b1e0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
b1f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e  .    */.    sNC.
b200: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
b210: 73 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  st;.    if( sqli
b220: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
b230: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
b240: 76 69 6e 67 29 20 29 20 72 65 74 75 72 6e 20 57  ving) ) return W
b250: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
b260: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
b270: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
b280: 70 2d 3e 70 57 68 65 72 65 29 20 29 20 72 65 74  p->pWhere) ) ret
b290: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a  urn WRC_Abort;..
b2a0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e      /* Resolve n
b2b0: 61 6d 65 73 20 69 6e 20 74 61 62 6c 65 2d 76 61  ames in table-va
b2c0: 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 20 61 72  lued-function ar
b2d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66  guments */.    f
b2e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
b2f0: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
b300: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
b310: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
b320: 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
b330: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
b340: 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 0a  m->fg.isTabFunc.
b350: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
b360: 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74  3ResolveExprList
b370: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 49 74 65  Names(&sNC, pIte
b380: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 20  m->u1.pFuncArg) 
b390: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
b3a0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
b3b0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
b3c0: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  }..    /* The OR
b3d0: 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50  DER BY and GROUP
b3e0: 20 42 59 20 63 6c 61 75 73 65 73 20 6d 61 79 20   BY clauses may 
b3f0: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 74 65 72  not refer to ter
b400: 6d 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  ms in.    ** out
b410: 65 72 20 71 75 65 72 69 65 73 20 0a 20 20 20 20  er queries .    
b420: 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  */.    sNC.pNext
b430: 20 3d 20 30 3b 0a 20 20 20 20 73 4e 43 2e 6e 63   = 0;.    sNC.nc
b440: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f  Flags |= NC_Allo
b450: 77 41 67 67 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  wAgg;..    /* If
b460: 20 74 68 69 73 20 69 73 20 61 20 63 6f 6e 76 65   this is a conve
b470: 72 74 65 64 20 63 6f 6d 70 6f 75 6e 64 20 71 75  rted compound qu
b480: 65 72 79 2c 20 6d 6f 76 65 20 74 68 65 20 4f 52  ery, move the OR
b490: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
b4a0: 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  om .    ** the s
b4b0: 75 62 2d 71 75 65 72 79 20 62 61 63 6b 20 74 6f  ub-query back to
b4c0: 20 74 68 65 20 70 61 72 65 6e 74 20 71 75 65 72   the parent quer
b4d0: 79 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  y. At this point
b4e0: 20 65 61 63 68 20 74 65 72 6d 0a 20 20 20 20 2a   each term.    *
b4f0: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 4f 52 44  * within the ORD
b500: 45 52 20 42 59 20 63 6c 61 75 73 65 20 68 61 73  ER BY clause has
b510: 20 62 65 65 6e 20 74 72 61 6e 73 66 6f 72 6d 65   been transforme
b520: 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  d to an integer 
b530: 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2a 20 54 68  value..    ** Th
b540: 65 73 65 20 69 6e 74 65 67 65 72 73 20 77 69 6c  ese integers wil
b550: 6c 20 62 65 20 72 65 70 6c 61 63 65 64 20 62 79  l be replaced by
b560: 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
b570: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 65 73  orresponding res
b580: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 20 65  ult.    ** set e
b590: 78 70 72 65 73 73 69 6f 6e 73 20 62 79 20 74 68  xpressions by th
b5a0: 65 20 63 61 6c 6c 20 74 6f 20 72 65 73 6f 6c 76  e call to resolv
b5b0: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 29 20  eOrderGroupBy() 
b5c0: 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69  below.  */.    i
b5d0: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
b5e0: 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 20 29 7b   SF_Converted ){
b5f0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
b600: 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
b610: 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [0].pSelect;.   
b620: 20 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d     p->pOrderBy =
b630: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3b   pSub->pOrderBy;
b640: 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
b650: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
b660: 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63 65 73 73  ..    /* Process
b670: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b680: 61 75 73 65 20 66 6f 72 20 73 69 6e 67 6c 65 74  ause for singlet
b690: 6f 6e 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  on SELECT statem
b6a0: 65 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 65  ents..    ** The
b6b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b6c0: 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64 73 20 53   for compounds S
b6d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
b6e0: 20 69 73 20 68 61 6e 64 6c 65 64 0a 20 20 20 20   is handled.    
b6f0: 2a 2a 20 62 65 6c 6f 77 2c 20 61 66 74 65 72 20  ** below, after 
b700: 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 73 75 6c  all of the resul
b710: 74 2d 73 65 74 73 20 66 6f 72 20 61 6c 6c 20 6f  t-sets for all o
b720: 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  f the elements o
b730: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d  f.    ** the com
b740: 70 6f 75 6e 64 20 68 61 76 65 20 62 65 65 6e 20  pound have been 
b750: 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2a  resolved..    **
b760: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
b770: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
b780: 63 6c 61 75 73 65 20 6f 6e 20 61 20 74 65 72 6d  clause on a term
b790: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 2d 73   of a compound-s
b7a0: 65 6c 65 63 74 20 6f 74 68 65 72 0a 20 20 20 20  elect other.    
b7b0: 2a 2a 20 74 68 61 6e 20 74 68 65 20 72 69 67 68  ** than the righ
b7c0: 74 2d 6d 6f 73 74 20 74 65 72 6d 2c 20 74 68 65  t-most term, the
b7d0: 6e 20 74 68 61 74 20 69 73 20 61 20 73 79 6e 74  n that is a synt
b7e0: 61 78 20 65 72 72 6f 72 2e 20 20 42 75 74 20 74  ax error.  But t
b7f0: 68 65 20 65 72 72 6f 72 0a 20 20 20 20 2a 2a 20  he error.    ** 
b800: 69 73 20 6e 6f 74 20 64 65 74 65 63 74 65 64 20  is not detected 
b810: 75 6e 74 69 6c 20 6d 75 63 68 20 6c 61 74 65 72  until much later
b820: 2c 20 61 6e 64 20 73 6f 20 77 65 20 6e 65 65 64  , and so we need
b830: 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
b840: 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20  .    ** resolve 
b850: 74 68 6f 73 65 20 73 79 6d 62 6f 6c 73 20 6f 6e  those symbols on
b860: 20 74 68 65 20 69 6e 63 6f 72 72 65 63 74 20 4f   the incorrect O
b870: 52 44 45 52 20 42 59 20 66 6f 72 20 63 6f 6e 73  RDER BY for cons
b880: 69 73 74 65 6e 63 79 2e 0a 20 20 20 20 2a 2f 0a  istency..    */.
b890: 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75      if( isCompou
b8a0: 6e 64 3c 3d 6e 43 6f 6d 70 6f 75 6e 64 20 20 2f  nd<=nCompound  /
b8b0: 2a 20 44 65 66 65 72 20 72 69 67 68 74 2d 6d 6f  * Defer right-mo
b8c0: 73 74 20 4f 52 44 45 52 20 42 59 20 6f 66 20 61  st ORDER BY of a
b8d0: 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 20   compound */.   
b8e0: 20 20 26 26 20 72 65 73 6f 6c 76 65 4f 72 64 65    && resolveOrde
b8f0: 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70  rGroupBy(&sNC, p
b900: 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79 2c 20 22  , p->pOrderBy, "
b910: 4f 52 44 45 52 22 29 0a 20 20 20 20 29 7b 0a 20  ORDER").    ){. 
b920: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
b930: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  Abort;.    }.   
b940: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
b950: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ailed ){.      r
b960: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
b970: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
b980: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 47 52 4f   Resolve the GRO
b990: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 20 20 41  UP BY clause.  A
b9a0: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
b9b0: 20 6d 61 6b 65 20 73 75 72 65 20 0a 20 20 20 20   make sure .    
b9c0: 2a 2a 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  ** the GROUP BY 
b9d0: 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20  clause does not 
b9e0: 63 6f 6e 74 61 69 6e 20 61 67 67 72 65 67 61 74  contain aggregat
b9f0: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 20  e functions..   
ba00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 47 72 6f   */.    if( pGro
ba10: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 73 74  upBy ){.      st
ba20: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ba30: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 0a  em *pItem;.    .
ba40: 20 20 20 20 20 20 69 66 28 20 72 65 73 6f 6c 76        if( resolv
ba50: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  eOrderGroupBy(&s
ba60: 4e 43 2c 20 70 2c 20 70 47 72 6f 75 70 42 79 2c  NC, p, pGroupBy,
ba70: 20 22 47 52 4f 55 50 22 29 20 7c 7c 20 64 62 2d   "GROUP") || db-
ba80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
ba90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
baa0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
bab0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
bac0: 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75 70 42 79  , pItem=pGroupBy
bad0: 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d  ->a; i<pGroupBy-
bae0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
baf0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  em++){.        i
bb00: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
bb10: 74 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ty(pItem->pExpr,
bb20: 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
bb30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bb40: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61  orMsg(pParse, "a
bb50: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
bb60: 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ns are not allow
bb70: 65 64 20 69 6e 20 22 0a 20 20 20 20 20 20 20 20  ed in ".        
bb80: 20 20 20 20 20 20 22 74 68 65 20 47 52 4f 55 50        "the GROUP
bb90: 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20   BY clause");.  
bba0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
bbb0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
bbc0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
bbd0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
bbe0: 73 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 63  s is part of a c
bbf0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20  ompound SELECT, 
bc00: 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 68 61  check that it ha
bc10: 73 20 74 68 65 20 72 69 67 68 74 0a 20 20 20 20  s the right.    
bc20: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 70  ** number of exp
bc30: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
bc40: 73 65 6c 65 63 74 20 6c 69 73 74 2e 20 2a 2f 0a  select list. */.
bc50: 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
bc60: 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e   && p->pEList->n
bc70: 45 78 70 72 21 3d 70 2d 3e 70 4e 65 78 74 2d 3e  Expr!=p->pNext->
bc80: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
bc90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
bca0: 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d  lectWrongNumTerm
bcb0: 73 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 70  sError(pParse, p
bcc0: 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20  ->pNext);.      
bcd0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
bce0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bcf0: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
bd00: 65 78 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ext term of the 
bd10: 63 6f 6d 70 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a  compound.    */.
bd20: 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f      p = p->pPrio
bd30: 72 3b 0a 20 20 20 20 6e 43 6f 6d 70 6f 75 6e 64  r;.    nCompound
bd40: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ++;.  }..  /* Re
bd50: 73 6f 6c 76 65 20 74 68 65 20 4f 52 44 45 52 20  solve the ORDER 
bd60: 42 59 20 6f 6e 20 61 20 63 6f 6d 70 6f 75 6e 64  BY on a compound
bd70: 20 53 45 4c 45 43 54 20 61 66 74 65 72 20 61 6c   SELECT after al
bd80: 6c 20 74 65 72 6d 73 20 6f 66 0a 20 20 2a 2a 20  l terms of.  ** 
bd90: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76  the compound hav
bda0: 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  e been resolved.
bdb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f  .  */.  if( isCo
bdc0: 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f 6c 76  mpound && resolv
bdd0: 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79  eCompoundOrderBy
bde0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 6d 6f  (pParse, pLeftmo
bdf0: 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  st) ){.    retur
be00: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d  n WRC_Abort;.  }
be10: 0a 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50  ..  return WRC_P
be20: 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rune;.}../*.** T
be30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
be40: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
be50: 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65  tree and resolve
be60: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a  s references to.
be70: 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ** table columns
be80: 20 61 6e 64 20 72 65 73 75 6c 74 2d 73 65 74 20   and result-set 
be90: 63 6f 6c 75 6d 6e 73 2e 20 20 41 74 20 74 68 65  columns.  At the
bea0: 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 6f 20 65   same time, do e
beb0: 72 72 6f 72 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  rror.** checking
bec0: 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73 61   on function usa
bed0: 67 65 20 61 6e 64 20 73 65 74 20 61 20 66 6c 61  ge and set a fla
bee0: 67 20 69 66 20 61 6e 79 20 61 67 67 72 65 67 61  g if any aggrega
bef0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20  te functions.** 
bf00: 61 72 65 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20  are seen..**.** 
bf10: 54 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c 65  To resolve table
bf20: 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65 72 65 6e   columns referen
bf30: 63 65 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20  ces we look for 
bf40: 6e 6f 64 65 73 20 28 6f 72 20 73 75 62 74 72 65  nodes (or subtre
bf50: 65 73 29 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66  es) of the .** f
bf60: 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a  orm X.Y.Z or Y.Z
bf70: 20 6f 72 20 6a 75 73 74 20 5a 20 77 68 65 72 65   or just Z where
bf80: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 58 3a 20 20  .**.**      X:  
bf90: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   The name of a d
bfa0: 61 74 61 62 61 73 65 2e 20 20 45 78 3a 20 20 22  atabase.  Ex:  "
bfb0: 6d 61 69 6e 22 20 6f 72 20 22 74 65 6d 70 22 20  main" or "temp" 
bfc0: 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  or.**           
bfd0: 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  the symbolic nam
bfe0: 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61 6e  e assigned to an
bff0: 20 41 54 54 41 43 48 2d 65 64 20 64 61 74 61 62   ATTACH-ed datab
c000: 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ase..**.**      
c010: 59 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66  Y:   The name of
c020: 20 61 20 74 61 62 6c 65 20 69 6e 20 61 20 46 52   a table in a FR
c030: 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 72 20 69  OM clause.  Or i
c040: 6e 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20 20  n a trigger.**  
c050: 20 20 20 20 20 20 20 20 20 6f 6e 65 20 6f 66 20           one of 
c060: 74 68 65 20 73 70 65 63 69 61 6c 20 6e 61 6d 65  the special name
c070: 73 20 22 6f 6c 64 22 20 6f 72 20 22 6e 65 77 22  s "old" or "new"
c080: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 5a 3a 20  ..**.**      Z: 
c090: 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20    The name of a 
c0a0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20  column in table 
c0b0: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 64  Y..**.** The nod
c0c0: 65 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f 66  e at the root of
c0d0: 20 74 68 65 20 73 75 62 74 72 65 65 20 69 73 20   the subtree is 
c0e0: 6d 6f 64 69 66 69 65 64 20 61 73 20 66 6f 6c 6c  modified as foll
c0f0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 45 78  ows:.**.**    Ex
c100: 70 72 2e 6f 70 20 20 20 20 20 20 20 20 43 68 61  pr.op        Cha
c110: 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d  nged to TK_COLUM
c120: 4e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 70 54 61  N.**    Expr.pTa
c130: 62 20 20 20 20 20 20 50 6f 69 6e 74 73 20 74 6f  b      Points to
c140: 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
c150: 74 20 66 6f 72 20 58 2e 59 0a 2a 2a 20 20 20 20  t for X.Y.**    
c160: 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 20 20 54  Expr.iColumn   T
c170: 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  he column index 
c180: 69 6e 20 58 2e 59 2e 20 20 2d 31 20 66 6f 72 20  in X.Y.  -1 for 
c190: 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20  the rowid..**   
c1a0: 20 45 78 70 72 2e 69 54 61 62 6c 65 20 20 20 20   Expr.iTable    
c1b0: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
c1c0: 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 59 0a 2a  number for X.Y.*
c1d0: 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c  *.**.** To resol
c1e0: 76 65 20 72 65 73 75 6c 74 2d 73 65 74 20 72 65  ve result-set re
c1f0: 66 65 72 65 6e 63 65 73 2c 20 6c 6f 6f 6b 20 66  ferences, look f
c200: 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  or expression no
c210: 64 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f  des of the.** fo
c220: 72 6d 20 5a 20 28 77 69 74 68 20 6e 6f 20 58 20  rm Z (with no X 
c230: 61 6e 64 20 59 20 70 72 65 66 69 78 29 20 77 68  and Y prefix) wh
c240: 65 72 65 20 74 68 65 20 5a 20 6d 61 74 63 68 65  ere the Z matche
c250: 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  s the right-hand
c260: 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6e 20 41  .** size of an A
c270: 53 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  S clause in the 
c280: 72 65 73 75 6c 74 2d 73 65 74 20 6f 66 20 61 20  result-set of a 
c290: 53 45 4c 45 43 54 2e 20 20 54 68 65 20 5a 20 65  SELECT.  The Z e
c2a0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
c2b0: 72 65 70 6c 61 63 65 64 20 62 79 20 61 20 63 6f  replaced by a co
c2c0: 70 79 20 6f 66 20 74 68 65 20 6c 65 66 74 2d 68  py of the left-h
c2d0: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
c2e0: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
c2f0: 73 73 69 6f 6e 2e 0a 2a 2a 20 54 61 62 6c 65 2d  ssion..** Table-
c300: 6e 61 6d 65 20 61 6e 64 20 66 75 6e 63 74 69 6f  name and functio
c310: 6e 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6f 63 63  n resolution occ
c320: 75 72 73 20 6f 6e 20 74 68 65 20 73 75 62 73 74  urs on the subst
c330: 69 74 75 74 65 64 20 65 78 70 72 65 73 73 69 6f  ituted expressio
c340: 6e 0a 2a 2a 20 74 72 65 65 2e 20 20 46 6f 72 20  n.** tree.  For 
c350: 65 78 61 6d 70 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a  example, in:.**.
c360: 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61  **      SELECT a
c370: 2b 62 20 41 53 20 78 2c 20 63 2b 64 20 41 53 20  +b AS x, c+d AS 
c380: 79 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20  y FROM t1 ORDER 
c390: 42 59 20 78 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BY x;.**.** The 
c3a0: 22 78 22 20 74 65 72 6d 20 6f 66 20 74 68 65 20  "x" term of the 
c3b0: 6f 72 64 65 72 20 62 79 20 69 73 20 72 65 70 6c  order by is repl
c3c0: 61 63 65 64 20 62 79 20 22 61 2b 62 22 20 74 6f  aced by "a+b" to
c3d0: 20 72 65 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20   render:.**.**  
c3e0: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41      SELECT a+b A
c3f0: 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46 52  S x, c+d AS y FR
c400: 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 61  OM t1 ORDER BY a
c410: 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  +b;.**.** Functi
c420: 6f 6e 20 63 61 6c 6c 73 20 61 72 65 20 63 68 65  on calls are che
c430: 63 6b 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  cked to make sur
c440: 65 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74  e that the funct
c450: 69 6f 6e 20 69 73 20 0a 2a 2a 20 64 65 66 69 6e  ion is .** defin
c460: 65 64 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ed and that the 
c470: 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
c480: 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  f arguments are 
c490: 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 20 49 66  specified..** If
c4a0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
c4b0: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
c4c0: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  nction, then the
c4d0: 20 4e 43 5f 48 61 73 41 67 67 20 66 6c 61 67 20   NC_HasAgg flag 
c4e0: 69 73 0a 2a 2a 20 73 65 74 20 61 6e 64 20 74 68  is.** set and th
c4f0: 65 20 6f 70 63 6f 64 65 20 69 73 20 63 68 61 6e  e opcode is chan
c500: 67 65 64 20 66 72 6f 6d 20 54 4b 5f 46 55 4e 43  ged from TK_FUNC
c510: 54 49 4f 4e 20 74 6f 20 54 4b 5f 41 47 47 5f 46  TION to TK_AGG_F
c520: 55 4e 43 54 49 4f 4e 2e 0a 2a 2a 20 49 66 20 61  UNCTION..** If a
c530: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e  n expression con
c540: 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65 20  tains aggregate 
c550: 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 74  functions then t
c560: 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f  he EP_Agg.** pro
c570: 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70  perty on the exp
c580: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 2e 0a  ression is set..
c590: 2a 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 6d  **.** An error m
c5a0: 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69  essage is left i
c5b0: 6e 20 70 50 61 72 73 65 20 69 66 20 61 6e 79 74  n pParse if anyt
c5c0: 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20  hing is amiss.  
c5d0: 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 69 66  The number.** if
c5e0: 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75 72   errors is retur
c5f0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
c600: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
c610: 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74  mes( .  NameCont
c620: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20  ext *pNC,       
c630: 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20  /* Namespace to 
c640: 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69  resolve expressi
c650: 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70  ons in. */.  Exp
c660: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
c670: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c680: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
c690: 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 75  lyzed. */.){.  u
c6a0: 31 36 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a  16 savedHasAgg;.
c6b0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 69    Walker w;..  i
c6c0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
c6d0: 74 75 72 6e 20 30 3b 0a 23 69 66 20 53 51 4c 49  turn 0;.#if SQLI
c6e0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
c6f0: 48 3e 30 0a 20 20 7b 0a 20 20 20 20 50 61 72 73  H>0.  {.    Pars
c700: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  e *pParse = pNC-
c710: 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66 28  >pParse;.    if(
c720: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
c730: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
c740: 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 2b 70  pExpr->nHeight+p
c750: 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 48 65 69  NC->pParse->nHei
c760: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65  ght) ){.      re
c770: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
c780: 20 20 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68    pParse->nHeigh
c790: 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69  t += pExpr->nHei
c7a0: 67 68 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ght;.  }.#endif.
c7b0: 20 20 73 61 76 65 64 48 61 73 41 67 67 20 3d 20    savedHasAgg = 
c7c0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28  pNC->ncFlags & (
c7d0: 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f 4d 69 6e  NC_HasAgg|NC_Min
c7e0: 4d 61 78 41 67 67 29 3b 0a 20 20 70 4e 43 2d 3e  MaxAgg);.  pNC->
c7f0: 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28 4e 43 5f  ncFlags &= ~(NC_
c800: 48 61 73 41 67 67 7c 4e 43 5f 4d 69 6e 4d 61 78  HasAgg|NC_MinMax
c810: 41 67 67 29 3b 0a 20 20 77 2e 70 50 61 72 73 65  Agg);.  w.pParse
c820: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
c830: 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63    w.xExprCallbac
c840: 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53  k = resolveExprS
c850: 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  tep;.  w.xSelect
c860: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
c870: 76 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20  veSelectStep;.  
c880: 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63  w.xSelectCallbac
c890: 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 77 61 6c 6b  k2 = 0;.  w.walk
c8a0: 65 72 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 77  erDepth = 0;.  w
c8b0: 2e 65 43 6f 64 65 20 3d 20 30 3b 0a 20 20 77 2e  .eCode = 0;.  w.
c8c0: 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 73  u.pNC = pNC;.  s
c8d0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
c8e0: 77 2c 20 70 45 78 70 72 29 3b 0a 23 69 66 20 53  w, pExpr);.#if S
c8f0: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
c900: 45 50 54 48 3e 30 0a 20 20 70 4e 43 2d 3e 70 50  EPTH>0.  pNC->pP
c910: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
c920: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
c930: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e  .#endif.  if( pN
c940: 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 77 2e 70  C->nErr>0 || w.p
c950: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b  Parse->nErr>0 ){
c960: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
c970: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
c980: 72 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rror);.  }.  if(
c990: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
c9a0: 4e 43 5f 48 61 73 41 67 67 20 29 7b 0a 20 20 20  NC_HasAgg ){.   
c9b0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
c9c0: 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b  (pExpr, EP_Agg);
c9d0: 0a 20 20 7d 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c  .  }.  pNC->ncFl
c9e0: 61 67 73 20 7c 3d 20 73 61 76 65 64 48 61 73 41  ags |= savedHasA
c9f0: 67 67 3b 0a 20 20 72 65 74 75 72 6e 20 45 78 70  gg;.  return Exp
ca00: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
ca10: 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d  pr, EP_Error);.}
ca20: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
ca30: 61 6c 6c 20 6e 61 6d 65 73 20 66 6f 72 20 61 6c  all names for al
ca40: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  l expression in 
ca50: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
ca60: 73 74 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  st.  This is.** 
ca70: 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
ca80: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
ca90: 73 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  s() except that 
caa0: 69 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 20  it works for an 
cab0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6c 69  expression.** li
cac0: 73 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  st rather than a
cad0: 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69   single expressi
cae0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
caf0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73  e3ResolveExprLis
cb00: 74 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43  tNames( .  NameC
cb10: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
cb20: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
cb30: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
cb40: 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20  ssions in. */.  
cb50: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
cb60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
cb70: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
cb80: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  o be analyzed. *
cb90: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
cba0: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
cbb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
cbc0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
cbd0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
cbe0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
cbf0: 73 28 70 4e 43 2c 20 70 4c 69 73 74 2d 3e 61 5b  s(pNC, pList->a[
cc00: 69 5d 2e 70 45 78 70 72 29 20 29 20 72 65 74 75  i].pExpr) ) retu
cc10: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
cc20: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
cc30: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
cc40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
cc50: 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  all names in all
cc60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
cc70: 61 20 53 45 4c 45 43 54 20 61 6e 64 20 69 6e 20  a SELECT and in 
cc80: 61 6c 6c 0a 2a 2a 20 64 65 63 65 6e 64 65 6e 74  all.** decendent
cc90: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2c  s of the SELECT,
cca0: 20 69 6e 63 6c 75 64 69 6e 67 20 63 6f 6d 70 6f   including compo
ccb0: 75 6e 64 73 20 6f 66 66 20 6f 66 20 70 2d 3e 70  unds off of p->p
ccc0: 50 72 69 6f 72 2c 0a 2a 2a 20 73 75 62 71 75 65  Prior,.** subque
ccd0: 72 69 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  ries in expressi
cce0: 6f 6e 73 2c 20 61 6e 64 20 73 75 62 71 75 65 72  ons, and subquer
ccf0: 69 65 73 20 75 73 65 64 20 61 73 20 46 52 4f 4d  ies used as FROM
cd00: 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
cd10: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 73 71 6c 69  ..**.** See sqli
cd20: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
cd30: 6d 65 73 28 29 20 66 6f 72 20 61 20 64 65 73 63  mes() for a desc
cd40: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6b  ription of the k
cd50: 69 6e 64 73 20 6f 66 0a 2a 2a 20 74 72 61 6e 73  inds of.** trans
cd60: 66 6f 72 6d 61 74 69 6f 6e 73 20 74 68 61 74 20  formations that 
cd70: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  occur..**.** All
cd80: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cd90: 74 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ts should have b
cda0: 65 65 6e 20 65 78 70 61 6e 64 65 64 20 75 73 69  een expanded usi
cdb0: 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  ng.** sqlite3Sel
cdc0: 65 63 74 45 78 70 61 6e 64 28 29 20 70 72 69 6f  ectExpand() prio
cdd0: 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
cde0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76  is routine..*/.v
cdf0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  oid sqlite3Resol
ce00: 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 0a 20  veSelectNames(. 
ce10: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
ce20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ce30: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
ce40: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
ce50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ce60: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ce70: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
ce80: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
ce90: 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
cea0: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
ceb0: 61 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  arent SELECT sta
cec0: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 57  tement */.){.  W
ced0: 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 61 73 73 65  alker w;..  asse
cee0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 6d 65  rt( p!=0 );.  me
cef0: 6d 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65  mset(&w, 0, size
cf00: 6f 66 28 77 29 29 3b 0a 20 20 77 2e 78 45 78 70  of(w));.  w.xExp
cf10: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f  rCallback = reso
cf20: 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77  lveExprStep;.  w
cf30: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
cf40: 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74   = resolveSelect
cf50: 53 74 65 70 3b 0a 20 20 77 2e 70 50 61 72 73 65  Step;.  w.pParse
cf60: 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 75   = pParse;.  w.u
cf70: 2e 70 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43 3b  .pNC = pOuterNC;
cf80: 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65  .  sqlite3WalkSe
cf90: 6c 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 0a  lect(&w, p);.}..
cfa0: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61  /*.** Resolve na
cfb0: 6d 65 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f  mes in expressio
cfc0: 6e 73 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79  ns that can only
cfd0: 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
cfe0: 67 6c 65 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a  gle table:.**.**
cff0: 20 20 20 20 2a 20 20 20 43 48 45 43 4b 20 63 6f      *   CHECK co
d000: 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 20 20 20  nstraints.**    
d010: 2a 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65  *   WHERE clause
d020: 73 20 6f 6e 20 70 61 72 74 69 61 6c 20 69 6e 64  s on partial ind
d030: 69 63 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45  ices.**.** The E
d040: 78 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75 65  xpr.iTable value
d050: 20 66 6f 72 20 45 78 70 72 2e 6f 70 3d 3d 54 4b   for Expr.op==TK
d060: 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 6f 66  _COLUMN nodes of
d070: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
d080: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20  ** is set to -1 
d090: 61 6e 64 20 74 68 65 20 45 78 70 72 2e 69 43 6f  and the Expr.iCo
d0a0: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 73 65  lumn value is se
d0b0: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
d0c0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e  number..**.** An
d0d0: 79 20 65 72 72 6f 72 73 20 63 61 75 73 65 20 61  y errors cause a
d0e0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
d0f0: 74 6f 20 62 65 20 73 65 74 20 69 6e 20 70 50 61  to be set in pPa
d100: 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rse..*/.void sql
d110: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52  ite3ResolveSelfR
d120: 65 66 65 72 65 6e 63 65 28 0a 20 20 50 61 72 73  eference(.  Pars
d130: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d140: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d150: 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  xt */.  Table *p
d160: 54 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  Tab,        /* T
d170: 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 72  he table being r
d180: 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20 69  eferenced */.  i
d190: 6e 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20  nt type,        
d1a0: 20 20 20 2f 2a 20 4e 43 5f 49 73 43 68 65 63 6b     /* NC_IsCheck
d1b0: 20 6f 72 20 4e 43 5f 50 61 72 74 49 64 78 20 6f   or NC_PartIdx o
d1c0: 72 20 4e 43 5f 49 64 78 45 78 70 72 20 2a 2f 0a  r NC_IdxExpr */.
d1d0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
d1e0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
d1f0: 69 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20  ion to resolve. 
d200: 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
d210: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d220: 73 74 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  st     /* Expres
d230: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72 65 73  sion list to res
d240: 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e 55  olve.  May be NU
d250: 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69  L. */.){.  SrcLi
d260: 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20  st sSrc;        
d270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61             /* Fa
d280: 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70  ke SrcList for p
d290: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
d2a0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
d2b0: 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20  t sNC;          
d2c0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
d2d0: 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65  ntext for pParse
d2e0: 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a  ->pNewTable */..
d2f0: 20 20 61 73 73 65 72 74 28 20 74 79 70 65 3d 3d    assert( type==
d300: 4e 43 5f 49 73 43 68 65 63 6b 20 7c 7c 20 74 79  NC_IsCheck || ty
d310: 70 65 3d 3d 4e 43 5f 50 61 72 74 49 64 78 20 7c  pe==NC_PartIdx |
d320: 7c 20 74 79 70 65 3d 3d 4e 43 5f 49 64 78 45 78  | type==NC_IdxEx
d330: 70 72 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  pr );.  memset(&
d340: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
d350: 4e 43 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  NC));.  memset(&
d360: 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sSrc, 0, sizeof(
d370: 73 53 72 63 29 29 3b 0a 20 20 73 53 72 63 2e 6e  sSrc));.  sSrc.n
d380: 53 72 63 20 3d 20 31 3b 0a 20 20 73 53 72 63 2e  Src = 1;.  sSrc.
d390: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 54 61  a[0].zName = pTa
d3a0: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 53 72 63  b->zName;.  sSrc
d3b0: 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 54 61  .a[0].pTab = pTa
d3c0: 62 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69  b;.  sSrc.a[0].i
d3d0: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 73  Cursor = -1;.  s
d3e0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
d3f0: 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69  se;.  sNC.pSrcLi
d400: 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 73 4e  st = &sSrc;.  sN
d410: 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74 79 70 65  C.ncFlags = type
d420: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 52  ;.  if( sqlite3R
d430: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
d440: 26 73 4e 43 2c 20 70 45 78 70 72 29 20 29 20 72  &sNC, pExpr) ) r
d450: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4c 69  eturn;.  if( pLi
d460: 73 74 20 29 20 73 71 6c 69 74 65 33 52 65 73 6f  st ) sqlite3Reso
d470: 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73  lveExprListNames
d480: 28 26 73 4e 43 2c 20 70 4c 69 73 74 29 3b 0a 7d  (&sNC, pList);.}
d490: 0a                                               .