/ Hex Artifact Content
Login

Artifact bbee7e31d369a18a2f4836644769882e9c5d40ef4a3af911db06410b65cb3730:


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 61 73  is found */.  as
22b0: 73 65 72 74 28 20 70 4e 43 20 26 26 20 63 6e 74  sert( pNC && cnt
22c0: 3d 3d 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  ==0 );.  do{.   
22d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
22e0: 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  t;.    SrcList *
22f0: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
2300: 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20 69  pSrcList;..    i
2310: 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20  f( pSrcList ){. 
2320: 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49       for(i=0, pI
2330: 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b  tem=pSrcList->a;
2340: 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72   i<pSrcList->nSr
2350: 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
2360: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  {.        pTab =
2370: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
2380: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2390: 61 62 21 3d 30 20 26 26 20 70 54 61 62 2d 3e 7a  ab!=0 && pTab->z
23a0: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 20  Name!=0 );.     
23b0: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
23c0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  >nCol>0 );.     
23d0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
23e0: 65 6c 65 63 74 20 26 26 20 28 70 49 74 65 6d 2d  elect && (pItem-
23f0: 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61  >pSelect->selFla
2400: 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46 72  gs & SF_NestedFr
2410: 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  om)!=0 ){.      
2420: 20 20 20 20 69 6e 74 20 68 69 74 20 3d 20 30 3b      int hit = 0;
2430: 0a 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73  .          pELis
2440: 74 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  t = pItem->pSele
2450: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
2460: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
2470: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
2480: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
2490: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61 74    if( sqlite3Mat
24a0: 63 68 53 70 61 6e 4e 61 6d 65 28 70 45 4c 69 73  chSpanName(pELis
24b0: 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20 7a  t->a[j].zSpan, z
24c0: 43 6f 6c 2c 20 7a 54 61 62 2c 20 7a 44 62 29 20  Col, zTab, zDb) 
24d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24e0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
24f0: 20 20 20 20 20 20 63 6e 74 54 61 62 20 3d 20 32        cntTab = 2
2500: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2510: 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a  pMatch = pItem;.
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
2530: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
2540: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2550: 68 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  hit = 1;.       
2560: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2570: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
2580: 20 68 69 74 20 7c 7c 20 7a 54 61 62 3d 3d 30 20   hit || zTab==0 
2590: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
25a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
25b0: 28 20 7a 44 62 20 26 26 20 70 54 61 62 2d 3e 70  ( zDb && pTab->p
25c0: 53 63 68 65 6d 61 21 3d 70 53 63 68 65 6d 61 20  Schema!=pSchema 
25d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
25e0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
25f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61  .        if( zTa
2600: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  b ){.          c
2610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
2620: 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c  ame = pItem->zAl
2630: 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41 6c  ias ? pItem->zAl
2640: 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61 6d  ias : pTab->zNam
2650: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e;.          ass
2660: 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 21 3d 30  ert( zTabName!=0
2670: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2680: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
2690: 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29  (zTabName, zTab)
26a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
26b0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
26c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 30   }.        if( 0
26e0: 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a  ==(cntTab++) ){.
26f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
2700: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
2710: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
2720: 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  j=0, pCol=pTab->
2730: 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
2740: 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; j++, pCol++)
2750: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2760: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2770: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
2780: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2790: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
27a0: 68 61 73 20 62 65 65 6e 20 65 78 61 63 74 6c 79  has been exactly
27b0: 20 6f 6e 65 20 70 72 69 6f 72 20 6d 61 74 63 68   one prior match
27c0: 20 61 6e 64 20 74 68 69 73 20 6d 61 74 63 68 0a   and this match.
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
27e0: 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  s for the right-
27f0: 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 61 20  hand table of a 
2800: 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 6f 72 20  NATURAL JOIN or 
2810: 69 73 20 69 6e 20 61 20 0a 20 20 20 20 20 20 20  is in a .       
2820: 20 20 20 20 20 2a 2a 20 55 53 49 4e 47 20 63 6c       ** USING cl
2830: 61 75 73 65 2c 20 74 68 65 6e 20 73 6b 69 70 20  ause, then skip 
2840: 74 68 69 73 20 6d 61 74 63 68 2e 0a 20 20 20 20  this match..    
2850: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2860: 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d         if( cnt==
2870: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2880: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2890: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
28a0: 41 54 55 52 41 4c 20 29 20 63 6f 6e 74 69 6e 75  ATURAL ) continu
28b0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
28c0: 20 69 66 28 20 6e 61 6d 65 49 6e 55 73 69 6e 67   if( nameInUsing
28d0: 43 6c 61 75 73 65 28 70 49 74 65 6d 2d 3e 70 55  Clause(pItem->pU
28e0: 73 69 6e 67 2c 20 7a 43 6f 6c 29 20 29 20 63 6f  sing, zCol) ) co
28f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2900: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2910: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
2920: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
2930: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tem;.           
2940: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
2950: 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e  he rowid (column
2960: 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54   -1) for the INT
2970: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2980: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2990: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
29a0: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
29b0: 3f 20 2d 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20  ? -1 : (i16)j;. 
29c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
29d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29f0: 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
2a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
2a10: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4d 61 74  r->iTable = pMat
2a20: 63 68 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  ch->iCursor;.   
2a30: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62       pExpr->pTab
2a40: 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b   = pMatch->pTab;
2a50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 49 47 48  .        /* RIGH
2a60: 54 20 4a 4f 49 4e 20 6e 6f 74 20 28 79 65 74 29  T JOIN not (yet)
2a70: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
2a80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2a90: 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Match->fg.jointy
2aa0: 70 65 20 26 20 4a 54 5f 52 49 47 48 54 29 3d 3d  pe & JT_RIGHT)==
2ab0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
2ac0: 20 28 70 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69   (pMatch->fg.joi
2ad0: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2ae0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2af0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2b00: 28 70 45 78 70 72 2c 20 45 50 5f 43 61 6e 42 65  (pExpr, EP_CanBe
2b10: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
2b20: 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61  .        pSchema
2b30: 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e   = pExpr->pTab->
2b40: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 7d  pSchema;.      }
2b50: 0a 20 20 20 20 7d 20 2f 2a 20 69 66 28 20 70 53  .    } /* if( pS
2b60: 72 63 4c 69 73 74 20 29 20 2a 2f 0a 0a 23 69 66  rcList ) */..#if
2b70: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2b80: 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f 2a 20  _TRIGGER.    /* 
2b90: 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61  If we have not a
2ba0: 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20  lready resolved 
2bb0: 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d  the name, then m
2bc0: 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20  aybe .    ** it 
2bd0: 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c  is a new.* or ol
2be0: 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67 75  d.* trigger argu
2bf0: 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20  ment reference. 
2c00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44     */.    if( zD
2c10: 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20  b==0 && zTab!=0 
2c20: 26 26 20 63 6e 74 54 61 62 3d 3d 30 20 26 26 20  && cntTab==0 && 
2c30: 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67 65 72  pParse->pTrigger
2c40: 54 61 62 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Tab!=0 ){.      
2c50: 69 6e 74 20 6f 70 20 3d 20 70 50 61 72 73 65 2d  int op = pParse-
2c60: 3e 65 54 72 69 67 67 65 72 4f 70 3b 0a 20 20 20  >eTriggerOp;.   
2c70: 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54     assert( op==T
2c80: 4b 5f 44 45 4c 45 54 45 20 7c 7c 20 6f 70 3d 3d  K_DELETE || op==
2c90: 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d  TK_UPDATE || op=
2ca0: 3d 54 4b 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20  =TK_INSERT );.  
2cb0: 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f 44      if( op!=TK_D
2cc0: 45 4c 45 54 45 20 26 26 20 73 71 6c 69 74 65 33  ELETE && sqlite3
2cd0: 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 7a 54  StrICmp("new",zT
2ce0: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
2cf0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2d00: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  e = 1;.        p
2d10: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54  Tab = pParse->pT
2d20: 72 69 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20  riggerTab;.     
2d30: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 21 3d 54   }else if( op!=T
2d40: 4b 5f 49 4e 53 45 52 54 20 26 26 20 73 71 6c 69  K_INSERT && sqli
2d50: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
2d60: 2c 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20  ,zTab)==0 ){.   
2d70: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2d80: 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  le = 0;.        
2d90: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
2da0: 54 72 69 67 67 65 72 54 61 62 3b 0a 20 20 20 20  TriggerTab;.    
2db0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2dc0: 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
2dd0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54   }..      if( pT
2de0: 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69  ab ){ .        i
2df0: 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
2e00: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
2e10: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
2e20: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20    cntTab++;.    
2e30: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 2c 20      for(iCol=0, 
2e40: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
2e50: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
2e60: 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b  ; iCol++, pCol++
2e70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2e80: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2e90: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
2ea0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
2eb0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70       if( iCol==p
2ec0: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
2ee0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
2ef0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2f00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2f10: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2f20: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
2f30: 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 73 71  pTab->nCol && sq
2f40: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
2f50: 6c 29 20 26 26 20 56 69 73 69 62 6c 65 52 6f 77  l) && VisibleRow
2f60: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
2f70: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
2f80: 35 31 34 31 34 2d 33 32 39 31 30 20 2a 2f 0a 20  51414-32910 */. 
2f90: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
2fa0: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
2fb0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
2fc0: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
2fd0: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
2fe0: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
2ff0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
3000: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
3010: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
3020: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 20 20  NTEGER;.        
3030: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70    }else if( pExp
3040: 72 2d 3e 69 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  r->iTable==0 ){.
3050: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
3060: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29  case( iCol==31 )
3070: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
3080: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32  stcase( iCol==32
3090: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
30a0: 70 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b 20  pParse->oldmask 
30b0: 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30  |= (iCol>=32 ? 0
30c0: 78 66 66 66 66 66 66 66 66 20 3a 20 28 28 28 75  xffffffff : (((u
30d0: 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20  32)1)<<iCol));. 
30e0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
3100: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29  case( iCol==31 )
3110: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ;.            te
3120: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32  stcase( iCol==32
3130: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
3140: 70 50 61 72 73 65 2d 3e 6e 65 77 6d 61 73 6b 20  pParse->newmask 
3150: 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30  |= (iCol>=32 ? 0
3160: 78 66 66 66 66 66 66 66 66 20 3a 20 28 28 28 75  xffffffff : (((u
3170: 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20  32)1)<<iCol));. 
3180: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3190: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
31a0: 75 6d 6e 20 3d 20 28 69 31 36 29 69 43 6f 6c 3b  umn = (i16)iCol;
31b0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
31c0: 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ->pTab = pTab;. 
31d0: 20 20 20 20 20 20 20 20 20 69 73 54 72 69 67 67           isTrigg
31e0: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
31f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3200: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
3210: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
3220: 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20  RIGGER) */..    
3230: 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70  /*.    ** Perhap
3240: 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20  s the name is a 
3250: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
3260: 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20   ROWID.    */.  
3270: 20 20 69 66 28 20 63 6e 74 3d 3d 30 0a 20 20 20    if( cnt==0.   
3280: 20 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 0a 20    && cntTab==1. 
3290: 20 20 20 20 26 26 20 70 4d 61 74 63 68 0a 20 20      && pMatch.  
32a0: 20 20 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c     && (pNC->ncFl
32b0: 61 67 73 20 26 20 4e 43 5f 49 64 78 45 78 70 72  ags & NC_IdxExpr
32c0: 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 73 71 6c  )==0.     && sql
32d0: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
32e0: 29 0a 20 20 20 20 20 26 26 20 56 69 73 69 62 6c  ).     && Visibl
32f0: 65 52 6f 77 69 64 28 70 4d 61 74 63 68 2d 3e 70  eRowid(pMatch->p
3300: 54 61 62 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  Tab).    ){.    
3310: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
3320: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
3330: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70  = -1;.      pExp
3340: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  r->affinity = SQ
3350: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
3360: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
3370: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e      ** If the in
3380: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
3390: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
33a0: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
33b0: 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d   name Z.    ** m
33c0: 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e  ight refer to an
33d0: 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61   result-set alia
33e0: 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  s.  This happens
33f0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
3400: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72  hen.    ** we ar
3410: 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65  e resolving name
3420: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
3430: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  lause of the fol
3440: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a  lowing command:.
3450: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
3460: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
3470: 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45  x FROM table WHE
3480: 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a  RE x<10;.    **.
3490: 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20      ** In cases 
34a0: 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61  like this, repla
34b0: 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20  ce pExpr with a 
34c0: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
34d0: 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20  ession that.    
34e0: 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73  ** forms the res
34f0: 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22  ult set entry ("
3500: 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d  a+b" in the exam
3510: 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ple) and return 
3520: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
3530: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
3540: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
3550: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
3560: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
3570: 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72  dy been.    ** r
3580: 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74  esolved by the t
3590: 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ime the WHERE cl
35a0: 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64  ause is resolved
35b0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
35c0: 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 75  The ability to u
35d0: 73 65 20 61 6e 20 6f 75 74 70 75 74 20 72 65 73  se an output res
35e0: 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 20 69  ult-set column i
35f0: 6e 20 74 68 65 20 57 48 45 52 45 2c 20 47 52 4f  n the WHERE, GRO
3600: 55 50 20 42 59 2c 0a 20 20 20 20 2a 2a 20 6f 72  UP BY,.    ** or
3610: 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 73 2c   HAVING clauses,
3620: 20 6f 72 20 61 73 20 70 61 72 74 20 6f 66 20 61   or as part of a
3630: 20 6c 61 72 67 65 72 20 65 78 70 72 65 73 73 69   larger expressi
3640: 6f 6e 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  on in the ORDER 
3650: 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75 73 65  BY.    ** clause
3660: 20 69 73 20 6e 6f 74 20 73 74 61 6e 64 61 72 64   is not standard
3670: 20 53 51 4c 2e 20 20 54 68 69 73 20 69 73 20 61   SQL.  This is a
3680: 20 28 67 6f 6f 66 79 29 20 53 51 4c 69 74 65 20   (goofy) SQLite 
3690: 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68 61 74 0a  extension, that.
36a0: 20 20 20 20 2a 2a 20 69 73 20 73 75 70 70 6f 72      ** is suppor
36b0: 74 65 64 20 66 6f 72 20 62 61 63 6b 77 61 72 64  ted for backward
36c0: 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
36d0: 6f 6e 6c 79 2e 20 48 65 6e 63 65 2c 20 77 65 20  only. Hence, we 
36e0: 69 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 0a  issue a warning.
36f0: 20 20 20 20 2a 2a 20 6f 6e 20 73 71 6c 69 74 65      ** on sqlite
3700: 33 5f 6c 6f 67 28 29 20 77 68 65 6e 65 76 65 72  3_log() whenever
3710: 20 74 68 65 20 63 61 70 61 62 69 6c 69 74 79 20   the capability 
3720: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 2a 2f 0a  is used..    */.
3730: 20 20 20 20 69 66 28 20 28 70 45 4c 69 73 74 20      if( (pEList 
3740: 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 29 21 3d  = pNC->pEList)!=
3750: 30 0a 20 20 20 20 20 26 26 20 7a 54 61 62 3d 3d  0.     && zTab==
3760: 30 0a 20 20 20 20 20 26 26 20 63 6e 74 3d 3d 30  0.     && cnt==0
3770: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f  .    ){.      fo
3780: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d  r(j=0; j<pEList-
3790: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
37a0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20        char *zAs 
37b0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a  = pEList->a[j].z
37c0: 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Name;.        if
37d0: 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69  ( zAs!=0 && sqli
37e0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20  te3StrICmp(zAs, 
37f0: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
3800: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f 72 69        Expr *pOri
3810: 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  g;.          ass
3820: 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66  ert( pExpr->pLef
3830: 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  t==0 && pExpr->p
3840: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
3850: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
3860: 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30 20  xpr->x.pList==0 
3870: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
3880: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 53  ert( pExpr->x.pS
3890: 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  elect==0 );.    
38a0: 20 20 20 20 20 20 70 4f 72 69 67 20 3d 20 70 45        pOrig = pE
38b0: 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72  List->a[j].pExpr
38c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
38d0: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 26 4e 43  (pNC->ncFlags&NC
38e0: 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20 26 26  _AllowAgg)==0 &&
38f0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
3900: 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67 29 20  (pOrig, EP_Agg) 
3910: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
3920: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3930: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
3940: 66 20 61 6c 69 61 73 65 64 20 61 67 67 72 65 67  f aliased aggreg
3950: 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b 0a 20  ate %s", zAs);. 
3960: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
3970: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
3980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3990: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
39a0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4f 72  prVectorSize(pOr
39b0: 69 67 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ig)!=1 ){.      
39c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
39d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72  orMsg(pParse, "r
39e0: 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64  ow value misused
39f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
3a00: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
3a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3a20: 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41          resolveA
3a30: 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c  lias(pParse, pEL
3a40: 69 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c 20 22  ist, j, pExpr, "
3a50: 22 2c 20 6e 53 75 62 71 75 65 72 79 29 3b 0a 20  ", nSubquery);. 
3a60: 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20 31           cnt = 1
3a70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
3a80: 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ch = 0;.        
3a90: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
3aa0: 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20  0 && zDb==0 );. 
3ab0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f           goto lo
3ac0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20  okupname_end;.  
3ad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
3ae0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
3af0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
3b00: 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e  xt name context.
3b10: 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20    The loop will 
3b20: 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72  exit when either
3b30: 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20  .    ** we have 
3b40: 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20  a match (cnt>0) 
3b50: 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f  or when we run o
3b60: 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65  ut of name conte
3b70: 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xts..    */.    
3b80: 69 66 28 20 63 6e 74 20 29 20 62 72 65 61 6b 3b  if( cnt ) break;
3b90: 0a 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e  .    pNC = pNC->
3ba0: 70 4e 65 78 74 3b 0a 20 20 20 20 6e 53 75 62 71  pNext;.    nSubq
3bb0: 75 65 72 79 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  uery++;.  }while
3bc0: 28 20 70 4e 43 20 29 3b 0a 0a 0a 20 20 2f 2a 0a  ( pNC );...  /*.
3bd0: 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20    ** If X and Y 
3be0: 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68  are NULL (in oth
3bf0: 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79  er words if only
3c00: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
3c10: 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c   Z is.  ** suppl
3c20: 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c  ied) and the val
3c30: 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f  ue of Z is enclo
3c40: 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75  sed in double-qu
3c50: 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  otes, then.  ** 
3c60: 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69  Z is a string li
3c70: 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73  teral if it does
3c80: 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f  n't match any co
3c90: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20  lumn names.  In 
3ca0: 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20  that.  ** case, 
3cb0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72  we need to retur
3cc0: 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64  n right away and
3cd0: 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68   not make any ch
3ce0: 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45  anges to.  ** pE
3cf0: 78 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42  xpr..  **.  ** B
3d00: 65 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65  ecause no refere
3d10: 6e 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20  nce was made to 
3d20: 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20  outer contexts, 
3d30: 74 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20  the pNC->nRef.  
3d40: 2a 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f  ** fields are no
3d50: 74 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79  t changed in any
3d60: 20 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20   context..  */. 
3d70: 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a   if( cnt==0 && z
3d80: 54 61 62 3d 3d 30 20 26 26 20 45 78 70 72 48 61  Tab==0 && ExprHa
3d90: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
3da0: 45 50 5f 44 62 6c 51 75 6f 74 65 64 29 20 29 7b  EP_DblQuoted) ){
3db0: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
3dc0: 20 54 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20   TK_STRING;.    
3dd0: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b  pExpr->pTab = 0;
3de0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
3df0: 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Prune;.  }..  /*
3e00: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61  .  ** cnt==0 mea
3e10: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  ns there was not
3e20: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d   match.  cnt>1 m
3e30: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20  eans there were 
3e40: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65  two or.  ** more
3e50: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65   matches.  Eithe
3e60: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61  r way, we have a
3e70: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
3e80: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20  if( cnt!=1 ){.  
3e90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
3ea0: 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63  rr;.    zErr = c
3eb0: 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68  nt==0 ? "no such
3ec0: 20 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69   column" : "ambi
3ed0: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  guous column nam
3ee0: 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  e";.    if( zDb 
3ef0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3f00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3f10: 20 22 25 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c   "%s: %s.%s.%s",
3f20: 20 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62   zErr, zDb, zTab
3f30: 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c  , zCol);.    }el
3f40: 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20  se if( zTab ){. 
3f50: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3f60: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
3f70: 3a 20 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20  : %s.%s", zErr, 
3f80: 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  zTab, zCol);.   
3f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
3fa0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
3fb0: 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20  arse, "%s: %s", 
3fc0: 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  zErr, zCol);.   
3fd0: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
3fe0: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
3ff0: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72      pTopNC->nErr
4000: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ++;.  }..  /* If
4010: 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61   a column from a
4020: 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69   table in pSrcLi
4030: 73 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64  st is referenced
4040: 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20  , then record.  
4050: 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20  ** this fact in 
4060: 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d  the pSrcList.a[]
4070: 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b  .colUsed bitmask
4080: 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73  .  Column 0 caus
4090: 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f  es.  ** bit 0 to
40a0: 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e   be set.  Column
40b0: 20 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20   1 sets bit 1.  
40c0: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49  And so forth.  I
40d0: 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d  f the.  ** colum
40e0: 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61  n number is grea
40f0: 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d  ter than the num
4100: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74  ber of bits in t
4110: 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
4120: 74 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67  then set the hig
4130: 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74  h-order bit of t
4140: 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f  he bitmask..  */
4150: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  .  if( pExpr->iC
4160: 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74  olumn>=0 && pMat
4170: 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ch!=0 ){.    int
4180: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c   n = pExpr->iCol
4190: 75 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73  umn;.    testcas
41a0: 65 28 20 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  e( n==BMS-1 );. 
41b0: 20 20 20 69 66 28 20 6e 3e 3d 42 4d 53 20 29 7b     if( n>=BMS ){
41c0: 0a 20 20 20 20 20 20 6e 20 3d 20 42 4d 53 2d 31  .      n = BMS-1
41d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
41e0: 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72  rt( pMatch->iCur
41f0: 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor==pExpr->iTab
4200: 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68  le );.    pMatch
4210: 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42  ->colUsed |= ((B
4220: 69 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20  itmask)1)<<n;.  
4230: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
4240: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
4250: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
4260: 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d 3e  lete(db, pExpr->
4270: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
4280: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
4290: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
42a0: 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  db, pExpr->pRigh
42b0: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  t);.  pExpr->pRi
42c0: 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72  ght = 0;.  pExpr
42d0: 2d 3e 6f 70 20 3d 20 28 69 73 54 72 69 67 67 65  ->op = (isTrigge
42e0: 72 20 3f 20 54 4b 5f 54 52 49 47 47 45 52 20 3a  r ? TK_TRIGGER :
42f0: 20 54 4b 5f 43 4f 4c 55 4d 4e 29 3b 0a 20 20 45   TK_COLUMN);.  E
4300: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
4310: 45 78 70 72 2c 20 45 50 5f 4c 65 61 66 29 3b 0a  Expr, EP_Leaf);.
4320: 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a  lookupname_end:.
4330: 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a    if( cnt==1 ){.
4340: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 21      assert( pNC!
4350: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 21 45  =0 );.    if( !E
4360: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4370: 45 78 70 72 2c 20 45 50 5f 41 6c 69 61 73 29 20  Expr, EP_Alias) 
4380: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
4390: 41 75 74 68 52 65 61 64 28 70 50 61 72 73 65 2c  AuthRead(pParse,
43a0: 20 70 45 78 70 72 2c 20 70 53 63 68 65 6d 61 2c   pExpr, pSchema,
43b0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b   pNC->pSrcList);
43c0: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e  .    }.    /* In
43d0: 63 72 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66  crement the nRef
43e0: 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61   value on all na
43f0: 6d 65 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d  me contexts from
4400: 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20   TopNC up to.   
4410: 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68   ** the point wh
4420: 65 72 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74  ere the name mat
4430: 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ched. */.    for
4440: 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  (;;){.      asse
4450: 72 74 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b  rt( pTopNC!=0 );
4460: 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e  .      pTopNC->n
4470: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Ref++;.      if(
4480: 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62   pTopNC==pNC ) b
4490: 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70  reak;.      pTop
44a0: 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65  NC = pTopNC->pNe
44b0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  xt;.    }.    re
44c0: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
44d0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
44e0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
44f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  .  }.}../*.** Al
4500: 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74 75 72  locate and retur
4510: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
4520: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
4530: 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  load the column 
4540: 69 43 6f 6c 0a 2a 2a 20 66 72 6f 6d 20 64 61 74  iCol.** from dat
4550: 61 73 6f 75 72 63 65 20 69 53 72 63 20 69 6e 20  asource iSrc in 
4560: 53 72 63 4c 69 73 74 20 70 53 72 63 2e 0a 2a 2f  SrcList pSrc..*/
4570: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72  .Expr *sqlite3Cr
4580: 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 73  eateColumnExpr(s
4590: 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c  qlite3 *db, SrcL
45a0: 69 73 74 20 2a 70 53 72 63 2c 20 69 6e 74 20 69  ist *pSrc, int i
45b0: 53 72 63 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  Src, int iCol){.
45c0: 20 20 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69    Expr *p = sqli
45d0: 74 65 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c  te3ExprAlloc(db,
45e0: 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30   TK_COLUMN, 0, 0
45f0: 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  );.  if( p ){.  
4600: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
4610: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
4620: 70 53 72 63 2d 3e 61 5b 69 53 72 63 5d 3b 0a 20  pSrc->a[iSrc];. 
4630: 20 20 20 70 2d 3e 70 54 61 62 20 3d 20 70 49 74     p->pTab = pIt
4640: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70 2d  em->pTab;.    p-
4650: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
4660: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  >iCursor;.    if
4670: 28 20 70 2d 3e 70 54 61 62 2d 3e 69 50 4b 65 79  ( p->pTab->iPKey
4680: 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ==iCol ){.      
4690: 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  p->iColumn = -1;
46a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
46b0: 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28    p->iColumn = (
46c0: 79 6e 56 61 72 29 69 43 6f 6c 3b 0a 20 20 20 20  ynVar)iCol;.    
46d0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
46e0: 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74  ==BMS );.      t
46f0: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
4700: 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 49  MS-1 );.      pI
4710: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20  tem->colUsed |= 
4720: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 69  ((Bitmask)1)<<(i
4730: 43 6f 6c 3e 3d 42 4d 53 20 3f 20 42 4d 53 2d 31  Col>=BMS ? BMS-1
4740: 20 3a 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a   : iCol);.    }.
4750: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
4760: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20  }../*.** Report 
4770: 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20 61 6e  an error that an
4780: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e   expression is n
4790: 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 73 6f 6d  ot valid for som
47a0: 65 20 73 65 74 20 6f 66 0a 2a 2a 20 70 4e 43 2d  e set of.** pNC-
47b0: 3e 6e 63 46 6c 61 67 73 20 76 61 6c 75 65 73 20  >ncFlags values 
47c0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 76 61  determined by va
47d0: 6c 69 64 4d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  lidMask..*/.stat
47e0: 69 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69 64  ic void notValid
47f0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4800: 65 2c 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76  e,       /* Leav
4810: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
4820: 68 65 72 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  here */.  NameCo
4830: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f  ntext *pNC,    /
4840: 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65  * The name conte
4850: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
4860: 61 72 20 2a 7a 4d 73 67 2c 20 20 20 20 2f 2a 20  ar *zMsg,    /* 
4870: 54 79 70 65 20 6f 66 20 65 72 72 6f 72 20 2a 2f  Type of error */
4880: 0a 20 20 69 6e 74 20 76 61 6c 69 64 4d 61 73 6b  .  int validMask
4890: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
48a0: 66 20 63 6f 6e 74 65 78 74 73 20 66 6f 72 20 77  f contexts for w
48b0: 68 69 63 68 20 70 72 6f 68 69 62 69 74 65 64 20  hich prohibited 
48c0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
48d0: 28 76 61 6c 69 64 4d 61 73 6b 26 7e 28 4e 43 5f  (validMask&~(NC_
48e0: 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49  IsCheck|NC_PartI
48f0: 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 29 29 3d  dx|NC_IdxExpr))=
4900: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 4e 43  =0 );.  if( (pNC
4910: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 76 61 6c 69  ->ncFlags & vali
4920: 64 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20  dMask)!=0 ){.   
4930: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
4940: 20 3d 20 22 70 61 72 74 69 61 6c 20 69 6e 64 65   = "partial inde
4950: 78 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 22  x WHERE clauses"
4960: 3b 0a 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e  ;.    if( pNC->n
4970: 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 64 78 45  cFlags & NC_IdxE
4980: 78 70 72 20 29 20 20 20 20 20 20 7a 49 6e 20 3d  xpr )      zIn =
4990: 20 22 69 6e 64 65 78 20 65 78 70 72 65 73 73 69   "index expressi
49a0: 6f 6e 73 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  ons";.#ifndef SQ
49b0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
49c0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 4e 43      else if( pNC
49d0: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49  ->ncFlags & NC_I
49e0: 73 43 68 65 63 6b 20 29 20 7a 49 6e 20 3d 20 22  sCheck ) zIn = "
49f0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
4a00: 73 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  s";.#endif.    s
4a10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4a20: 50 61 72 73 65 2c 20 22 25 73 20 70 72 6f 68 69  Parse, "%s prohi
4a30: 62 69 74 65 64 20 69 6e 20 25 73 22 2c 20 7a 4d  bited in %s", zM
4a40: 73 67 2c 20 7a 49 6e 29 3b 0a 20 20 7d 0a 7d 0a  sg, zIn);.  }.}.
4a50: 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f  ./*.** Expressio
4a60: 6e 20 70 20 73 68 6f 75 6c 64 20 65 6e 63 6f 64  n p should encod
4a70: 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  e a floating poi
4a80: 6e 74 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e  nt value between
4a90: 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2a   1.0 and 0.0..**
4aa0: 20 52 65 74 75 72 6e 20 31 30 32 34 20 74 69 6d   Return 1024 tim
4ab0: 65 73 20 74 68 69 73 20 76 61 6c 75 65 2e 20 20  es this value.  
4ac0: 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69 66 20  Or return -1 if 
4ad0: 70 20 69 73 20 6e 6f 74 20 61 20 66 6c 6f 61 74  p is not a float
4ae0: 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c  ing point.** val
4af0: 75 65 20 62 65 74 77 65 65 6e 20 31 2e 30 20 61  ue between 1.0 a
4b00: 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61 74 69  nd 0.0..*/.stati
4b10: 63 20 69 6e 74 20 65 78 70 72 50 72 6f 62 61 62  c int exprProbab
4b20: 69 6c 69 74 79 28 45 78 70 72 20 2a 70 29 7b 0a  ility(Expr *p){.
4b30: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 2d 31 2e    double r = -1.
4b40: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d  0;.  if( p->op!=
4b50: 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74 75 72  TK_FLOAT ) retur
4b60: 6e 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 41  n -1;.  sqlite3A
4b70: 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  toF(p->u.zToken,
4b80: 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72 6c   &r, sqlite3Strl
4b90: 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  en30(p->u.zToken
4ba0: 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  ), SQLITE_UTF8);
4bb0: 0a 20 20 61 73 73 65 72 74 28 20 72 3e 3d 30 2e  .  assert( r>=0.
4bc0: 30 20 29 3b 0a 20 20 69 66 28 20 72 3e 31 2e 30  0 );.  if( r>1.0
4bd0: 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
4be0: 72 65 74 75 72 6e 20 28 69 6e 74 29 28 72 2a 31  return (int)(r*1
4bf0: 33 34 32 31 37 37 32 38 2e 30 29 3b 0a 7d 0a 0a  34217728.0);.}..
4c00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4c10: 6e 65 20 69 73 20 63 61 6c 6c 62 61 63 6b 20 66  ne is callback f
4c20: 6f 72 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78  or sqlite3WalkEx
4c30: 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f  pr()..**.** Reso
4c40: 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  lve symbolic nam
4c50: 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d  es into TK_COLUM
4c60: 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20  N operators for 
4c70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e  the current.** n
4c80: 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72 65  ode in the expre
4c90: 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74  ssion tree.  Ret
4ca0: 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75  urn 0 to continu
4cb0: 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f 77  e the search dow
4cc0: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72  n.** the tree or
4cd0: 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20   2 to abort the 
4ce0: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a  tree walk..**.**
4cf0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
4d00: 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68  so does error ch
4d10: 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20  ecking and name 
4d20: 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a  resolution for.*
4d30: 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73  * function names
4d40: 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  .  The operator 
4d50: 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75  for aggregate fu
4d60: 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67  nctions is chang
4d70: 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f  ed.** to TK_AGG_
4d80: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61  FUNCTION..*/.sta
4d90: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 45  tic int resolveE
4da0: 78 70 72 53 74 65 70 28 57 61 6c 6b 65 72 20 2a  xprStep(Walker *
4db0: 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70  pWalker, Expr *p
4dc0: 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  Expr){.  NameCon
4dd0: 74 65 78 74 20 2a 70 4e 43 3b 0a 20 20 50 61 72  text *pNC;.  Par
4de0: 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 70  se *pParse;..  p
4df0: 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e  NC = pWalker->u.
4e00: 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pNC;.  assert( p
4e10: 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73  NC!=0 );.  pPars
4e20: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
4e30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
4e40: 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72  e==pWalker->pPar
4e50: 73 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  se );..#ifndef N
4e60: 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d  DEBUG.  if( pNC-
4e70: 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43  >pSrcList && pNC
4e80: 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c  ->pSrcList->nAll
4e90: 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c  oc>0 ){.    SrcL
4ea0: 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20  ist *pSrcList = 
4eb0: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20  pNC->pSrcList;. 
4ec0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
4ed0: 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53  r(i=0; i<pNC->pS
4ee0: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
4ef0: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
4f00: 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  ( pSrcList->a[i]
4f10: 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70  .iCursor>=0 && p
4f20: 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  SrcList->a[i].iC
4f30: 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54  ursor<pParse->nT
4f40: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ab);.    }.  }.#
4f50: 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20  endif.  switch( 
4f60: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 23 69  pExpr->op ){..#i
4f70: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4f80: 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44  _ENABLE_UPDATE_D
4f90: 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26 20  ELETE_LIMIT) && 
4fa0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4fb0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
4fc0: 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 61     /* The specia
4fd0: 6c 20 6f 70 65 72 61 74 6f 72 20 54 4b 5f 52 4f  l operator TK_RO
4fe0: 57 20 6d 65 61 6e 73 20 75 73 65 20 74 68 65 20  W means use the 
4ff0: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 66 69  rowid for the fi
5000: 72 73 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  rst.    ** colum
5010: 6e 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  n in the FROM cl
5020: 61 75 73 65 2e 20 20 54 68 69 73 20 69 73 20 75  ause.  This is u
5030: 73 65 64 20 62 79 20 74 68 65 20 4c 49 4d 49 54  sed by the LIMIT
5040: 20 61 6e 64 20 4f 52 44 45 52 20 42 59 0a 20 20   and ORDER BY.  
5050: 20 20 2a 2a 20 63 6c 61 75 73 65 20 70 72 6f 63    ** clause proc
5060: 65 73 73 69 6e 67 20 6f 6e 20 55 50 44 41 54 45  essing on UPDATE
5070: 20 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61 74   and DELETE stat
5080: 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
5090: 20 20 20 63 61 73 65 20 54 4b 5f 52 4f 57 3a 20     case TK_ROW: 
50a0: 7b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74 20  {.      SrcList 
50b0: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
50c0: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20  >pSrcList;.     
50d0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
50e0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
50f0: 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c     assert( pSrcL
5100: 69 73 74 20 26 26 20 70 53 72 63 4c 69 73 74 2d  ist && pSrcList-
5110: 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20  >nSrc==1 );.    
5120: 20 20 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69    pItem = pSrcLi
5130: 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 61 73 73  st->a;.      ass
5140: 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70 49  ert( HasRowid(pI
5150: 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 70 49  tem->pTab) && pI
5160: 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 53 65 6c 65  tem->pTab->pSele
5170: 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ct==0 );.      p
5180: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
5190: 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 78 70  LUMN;.      pExp
51a0: 72 2d 3e 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  r->pTab = pItem-
51b0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78  >pTab;.      pEx
51c0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
51d0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
51e0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
51f0: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45  n = -1;.      pE
5200: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
5210: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
5220: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
5230: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
5240: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5250: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
5260: 4c 45 54 45 5f 4c 49 4d 49 54 29 0a 20 20 20 20  LETE_LIMIT).    
5270: 20 20 20 20 20 20 26 26 20 21 64 65 66 69 6e 65        && !define
5280: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
5290: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 20 20 20 20  BQUERY) */..    
52a0: 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  /* A column name
52b0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
52c0: 20 20 20 20 20 49 44 0a 20 20 20 20 2a 2a 20 4f       ID.    ** O
52d0: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  r table name and
52e0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20   column name:   
52f0: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
5300: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
5310: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
5320: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2a 0a  ID.ID.ID.    **.
5330: 20 20 20 20 2a 2a 20 54 68 65 20 54 4b 5f 49 44      ** The TK_ID
5340: 20 61 6e 64 20 54 4b 5f 4f 55 54 20 63 61 73 65   and TK_OUT case
5350: 73 20 61 72 65 20 63 6f 6d 62 69 6e 65 64 20 73  s are combined s
5360: 6f 20 74 68 61 74 20 74 68 65 72 65 20 77 69 6c  o that there wil
5370: 6c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 62 65  l only.    ** be
5380: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 6c 6f 6f   one call to loo
5390: 6b 75 70 4e 61 6d 65 28 29 2e 20 20 54 68 65 6e  kupName().  Then
53a0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
53b0: 6c 6c 20 69 6e 2d 6c 69 6e 65 20 0a 20 20 20 20  ll in-line .    
53c0: 2a 2a 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 29 20  ** lookupName() 
53d0: 66 6f 72 20 61 20 73 69 7a 65 20 72 65 64 75 63  for a size reduc
53e0: 74 69 6f 6e 20 61 6e 64 20 70 65 72 66 6f 72 6d  tion and perform
53f0: 61 6e 63 65 20 69 6e 63 72 65 61 73 65 2e 0a 20  ance increase.. 
5400: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
5410: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
5420: 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 63  K_DOT: {.      c
5430: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
5440: 6d 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  mn;.      const 
5450: 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20  char *zTable;.  
5460: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5470: 7a 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20  zDb;.      Expr 
5480: 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20  *pRight;..      
5490: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
54a0: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
54b0: 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  zDb = 0;.       
54c0: 20 7a 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20   zTable = 0;.   
54d0: 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70       zColumn = p
54e0: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
54f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5500: 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50       notValid(pP
5510: 61 72 73 65 2c 20 70 4e 43 2c 20 22 74 68 65 20  arse, pNC, "the 
5520: 5c 22 2e 5c 22 20 6f 70 65 72 61 74 6f 72 22 2c  \".\" operator",
5530: 20 4e 43 5f 49 64 78 45 78 70 72 29 3b 0a 20 20   NC_IdxExpr);.  
5540: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
5550: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
5560: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
5570: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
5580: 20 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 30           zDb = 0
5590: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 61 62  ;.          zTab
55a0: 6c 65 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  le = pExpr->pLef
55b0: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  t->u.zToken;.   
55c0: 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d         zColumn =
55d0: 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65   pRight->u.zToke
55e0: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
55f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
5600: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
5610: 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_DOT );.      
5620: 20 20 20 20 7a 44 62 20 3d 20 70 45 78 70 72 2d      zDb = pExpr-
5630: 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  >pLeft->u.zToken
5640: 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 61 62  ;.          zTab
5650: 6c 65 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65  le = pRight->pLe
5660: 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
5670: 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20          zColumn 
5680: 3d 20 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74  = pRight->pRight
5690: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
56a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
56b0: 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75      return looku
56c0: 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 44  pName(pParse, zD
56d0: 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75  b, zTable, zColu
56e0: 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b  mn, pNC, pExpr);
56f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
5700: 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20  esolve function 
5710: 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20  names.    */.   
5720: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
5730: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
5740: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
5750: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20  pr->x.pList;    
5760: 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  /* The argument 
5770: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  list */.      in
5780: 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  t n = pList ? pL
5790: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20  ist->nExpr : 0; 
57a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
57b0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
57c0: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
57d0: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
57e0: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
57f0: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
5800: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
5810: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
5820: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
5830: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
5840: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
5850: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
5860: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
5870: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
5880: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
5890: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
58a0: 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20  t nId;          
58b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
58c0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
58d0: 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61  s in function na
58e0: 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73  me */.      cons
58f0: 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20  t char *zId;    
5900: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
5910: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f  unction name. */
5920: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a  .      FuncDef *
5930: 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  pDef;           
5940: 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
5950: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63  n about the func
5960: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38  tion */.      u8
5970: 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73   enc = ENC(pPars
5980: 65 2d 3e 64 62 29 3b 20 20 20 2f 2a 20 54 68 65  e->db);   /* The
5990: 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69   database encodi
59a0: 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73  ng */..      ass
59b0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
59c0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
59d0: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
59e0: 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d      zId = pExpr-
59f0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
5a00: 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74   nId = sqlite3St
5a10: 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20  rlen30(zId);.   
5a20: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
5a30: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
5a40: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
5a50: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
5a60: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
5a70: 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
5a80: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
5a90: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
5aa0: 49 64 2c 20 2d 32 2c 20 65 6e 63 2c 20 30 29 3b  Id, -2, enc, 0);
5ab0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
5ac0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
5ad0: 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d    no_such_func =
5ae0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
5af0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f  e{.          wro
5b00: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b  ng_num_args = 1;
5b10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5b30: 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78  is_agg = pDef->x
5b40: 46 69 6e 61 6c 69 7a 65 21 3d 30 3b 0a 20 20 20  Finalize!=0;.   
5b50: 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66       if( pDef->f
5b60: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
5b70: 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20  E_FUNC_UNLIKELY 
5b80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
5b90: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
5ba0: 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 7c  pr, EP_Unlikely|
5bb0: 45 50 5f 53 6b 69 70 29 3b 0a 20 20 20 20 20 20  EP_Skip);.      
5bc0: 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 0a      if( n==2 ){.
5bd0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
5be0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 65 78 70 72  r->iTable = expr
5bf0: 50 72 6f 62 61 62 69 6c 69 74 79 28 70 4c 69 73  Probability(pLis
5c00: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a  t->a[1].pExpr);.
5c10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
5c20: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20  pExpr->iTable<0 
5c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
5c40: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5c50: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
5c60: 20 20 20 20 20 20 20 20 20 22 73 65 63 6f 6e 64           "second
5c70: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 69 6b   argument to lik
5c80: 65 6c 69 68 6f 6f 64 28 29 20 6d 75 73 74 20 62  elihood() must b
5c90: 65 20 61 20 22 0a 20 20 20 20 20 20 20 20 20 20  e a ".          
5ca0: 20 20 20 20 20 20 22 63 6f 6e 73 74 61 6e 74 20        "constant 
5cb0: 62 65 74 77 65 65 6e 20 30 2e 30 20 61 6e 64 20  between 0.0 and 
5cc0: 31 2e 30 22 29 3b 0a 20 20 20 20 20 20 20 20 20  1.0");.         
5cd0: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
5ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
5cf0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
5d00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
5d10: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36  EVIDENCE-OF: R-6
5d20: 31 33 30 34 2d 32 39 34 34 39 20 54 68 65 20 75  1304-29449 The u
5d30: 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74  nlikely(X) funct
5d40: 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 20  ion is.         
5d50: 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74     ** equivalent
5d60: 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58   to likelihood(X
5d70: 2c 20 30 2e 30 36 32 35 29 2e 0a 20 20 20 20 20  , 0.0625)..     
5d80: 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e         ** EVIDEN
5d90: 43 45 2d 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31  CE-OF: R-01283-1
5da0: 31 36 33 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c  1636 The unlikel
5db0: 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  y(X) function is
5dc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
5dd0: 73 68 6f 72 74 2d 68 61 6e 64 20 66 6f 72 20 6c  short-hand for l
5de0: 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36  ikelihood(X,0.06
5df0: 32 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20  25)..           
5e00: 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
5e10: 20 52 2d 33 36 38 35 30 2d 33 34 31 32 37 20 54   R-36850-34127 T
5e20: 68 65 20 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e  he likely(X) fun
5e30: 63 74 69 6f 6e 20 69 73 20 73 68 6f 72 74 2d 68  ction is short-h
5e40: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  and.            
5e50: 2a 2a 20 66 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f  ** for likelihoo
5e60: 64 28 58 2c 30 2e 39 33 37 35 29 2e 0a 20 20 20  d(X,0.9375)..   
5e70: 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44           ** EVID
5e80: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 34 33 36  ENCE-OF: R-53436
5e90: 2d 34 30 39 37 33 20 54 68 65 20 6c 69 6b 65 6c  -40973 The likel
5ea0: 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73  y(X) function is
5eb0: 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
5ec0: 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6c 69          ** to li
5ed0: 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 39 33 37  kelihood(X,0.937
5ee0: 35 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  5). */.         
5ef0: 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 75 6e     /* TUNING: un
5f00: 6c 69 6b 65 6c 79 28 29 20 70 72 6f 62 61 62 69  likely() probabi
5f10: 6c 69 74 79 20 69 73 20 30 2e 30 36 32 35 2e 20  lity is 0.0625. 
5f20: 20 6c 69 6b 65 6c 79 28 29 20 69 73 20 30 2e 39   likely() is 0.9
5f30: 33 37 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  375 */.         
5f40: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
5f50: 20 3d 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b 30   = pDef->zName[0
5f60: 5d 3d 3d 27 75 27 20 3f 20 38 33 38 38 36 30 38  ]=='u' ? 8388608
5f70: 20 3a 20 31 32 35 38 32 39 31 32 30 3b 0a 20 20   : 125829120;.  
5f80: 20 20 20 20 20 20 20 20 7d 20 20 20 20 20 20 20          }       
5f90: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d        .        }
5fa0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5fb0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
5fc0: 4f 4e 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  ON.        {.   
5fd0: 20 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 20         int auth 
5fe0: 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  = sqlite3AuthChe
5ff0: 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
6000: 45 5f 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 70 44  E_FUNCTION, 0,pD
6010: 65 66 2d 3e 7a 4e 61 6d 65 2c 30 29 3b 0a 20 20  ef->zName,0);.  
6020: 20 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68          if( auth
6030: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6040: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
6050: 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59  uth==SQLITE_DENY
6060: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6070: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6080: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61  g(pParse, "not a
6090: 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73 65  uthorized to use
60a0: 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 0a   function: %s",.
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60d0: 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d        pDef->zNam
60e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
60f0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
6100: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6110: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6120: 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20  op = TK_NULL;.  
6130: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
6140: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
6150: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6160: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
6170: 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46   if( pDef->funcF
6180: 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46  lags & (SQLITE_F
6190: 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 7c 53 51 4c  UNC_CONSTANT|SQL
61a0: 49 54 45 5f 46 55 4e 43 5f 53 4c 4f 43 48 4e 47  ITE_FUNC_SLOCHNG
61b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
61c0: 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
61d0: 65 73 20 6f 66 20 74 68 65 20 45 50 5f 43 6f 6e  es of the EP_Con
61e0: 73 74 46 75 6e 63 20 66 6c 61 67 2c 20 64 61 74  stFunc flag, dat
61f0: 65 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20  e and time.     
6200: 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e       ** function
6210: 73 20 61 6e 64 20 6f 74 68 65 72 20 66 75 6e 63  s and other func
6220: 74 69 6f 6e 73 20 74 68 61 74 20 63 68 61 6e 67  tions that chang
6230: 65 20 73 6c 6f 77 6c 79 20 61 72 65 20 63 6f 6e  e slowly are con
6240: 73 69 64 65 72 65 64 0a 20 20 20 20 20 20 20 20  sidered.        
6250: 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 62 65    ** constant be
6260: 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 63  cause they are c
6270: 6f 6e 73 74 61 6e 74 20 66 6f 72 20 74 68 65 20  onstant for the 
6280: 64 75 72 61 74 69 6f 6e 20 6f 66 20 6f 6e 65 20  duration of one 
6290: 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  query */.       
62a0: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
62b0: 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73  ty(pExpr,EP_Cons
62c0: 74 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  tFunc);.        
62d0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  }.        if( (p
62e0: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  Def->funcFlags &
62f0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
6300: 53 54 41 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20  STANT)==0 ){.   
6310: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 65 2f 74         /* Date/t
6320: 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68  ime functions th
6330: 61 74 20 75 73 65 20 27 6e 6f 77 27 2c 20 61 6e  at use 'now', an
6340: 64 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e  d other function
6350: 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 20  s like.         
6360: 20 2a 2a 20 73 71 6c 69 74 65 5f 76 65 72 73 69   ** sqlite_versi
6370: 6f 6e 28 29 20 74 68 61 74 20 6d 69 67 68 74 20  on() that might 
6380: 63 68 61 6e 67 65 20 6f 76 65 72 20 74 69 6d 65  change over time
6390: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 0a   cannot be used.
63a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
63b0: 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20  an index. */.   
63c0: 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28         notValid(
63d0: 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 6e 6f  pParse, pNC, "no
63e0: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
63f0: 66 75 6e 63 74 69 6f 6e 73 22 2c 0a 20 20 20 20  functions",.    
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
6410: 43 5f 49 64 78 45 78 70 72 7c 4e 43 5f 50 61 72  C_IdxExpr|NC_Par
6420: 74 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  tIdx);.        }
6430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6440: 66 28 20 69 73 5f 61 67 67 20 26 26 20 28 70 4e  f( is_agg && (pN
6450: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
6460: 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20 29 7b 0a  AllowAgg)==0 ){.
6470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6480: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6490: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
64a0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
64b0: 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b  *s()", nId,zId);
64c0: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
64d0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73  rr++;.        is
64e0: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
64f0: 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63  }else if( no_suc
6500: 68 5f 66 75 6e 63 20 26 26 20 70 50 61 72 73 65  h_func && pParse
6510: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
6520: 3d 30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  =0.#ifdef SQLITE
6530: 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
6540: 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
6560: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
6570: 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
6580: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6590: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
65a0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  e, "no such func
65b0: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64  tion: %.*s", nId
65c0: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
65d0: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
65e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f     }else if( wro
65f0: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20  ng_num_args ){. 
6600: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
6610: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77  rorMsg(pParse,"w
6620: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
6630: 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63  rguments to func
6640: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20  tion %.*s()",.  
6650: 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20             nId, 
6660: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
6670: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
6680: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
6690: 61 67 67 20 29 20 70 4e 43 2d 3e 6e 63 46 6c 61  agg ) pNC->ncFla
66a0: 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41  gs &= ~NC_AllowA
66b0: 67 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  gg;.      sqlite
66c0: 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57  3WalkExprList(pW
66d0: 61 6c 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20  alker, pList);. 
66e0: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
66f0: 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43  ){.        NameC
6700: 6f 6e 74 65 78 74 20 2a 70 4e 43 32 20 3d 20 70  ontext *pNC2 = p
6710: 4e 43 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  NC;.        pExp
6720: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46  r->op = TK_AGG_F
6730: 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20  UNCTION;.       
6740: 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 30 3b   pExpr->op2 = 0;
6750: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
6760: 70 4e 43 32 20 26 26 20 21 73 71 6c 69 74 65 33  pNC2 && !sqlite3
6770: 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
6780: 53 72 63 28 70 45 78 70 72 2c 20 70 4e 43 32 2d  Src(pExpr, pNC2-
6790: 3e 70 53 72 63 4c 69 73 74 29 20 29 7b 0a 20 20  >pSrcList) ){.  
67a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
67b0: 70 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  p2++;.          
67c0: 70 4e 43 32 20 3d 20 70 4e 43 32 2d 3e 70 4e 65  pNC2 = pNC2->pNe
67d0: 78 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  xt;.        }.  
67e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
67f0: 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ef!=0 );.       
6800: 20 69 66 28 20 70 4e 43 32 20 29 7b 0a 20 20 20   if( pNC2 ){.   
6810: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
6820: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
6830: 58 3d 3d 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 20  X==NC_MinMaxAgg 
6840: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  );.          tes
6850: 74 63 61 73 65 28 20 28 70 44 65 66 2d 3e 66 75  tcase( (pDef->fu
6860: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
6870: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 21 3d 30  _FUNC_MINMAX)!=0
6880: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   );.          pN
6890: 43 32 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e  C2->ncFlags |= N
68a0: 43 5f 48 61 73 41 67 67 20 7c 20 28 70 44 65 66  C_HasAgg | (pDef
68b0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
68c0: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
68d0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  );..        }.  
68e0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61        pNC->ncFla
68f0: 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67  gs |= NC_AllowAg
6900: 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  g;.      }.     
6910: 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d   /* FIX ME:  Com
6920: 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69  pute pExpr->affi
6930: 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68  nity based on th
6940: 65 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72  e expected retur
6950: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20  n.      ** type 
6960: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  of the function 
6970: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6980: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
6990: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
69a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
69b0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
69c0: 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73  _SELECT:.    cas
69d0: 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 20 74 65  e TK_EXISTS:  te
69e0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
69f0: 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a  p==TK_EXISTS );.
6a00: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
6a10: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 74  TK_IN: {.      t
6a20: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
6a30: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op==TK_IN );.   
6a40: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
6a50: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
6a60: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20  _xIsSelect) ){. 
6a70: 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20         int nRef 
6a80: 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20  = pNC->nRef;.   
6a90: 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50       notValid(pP
6aa0: 61 72 73 65 2c 20 70 4e 43 2c 20 22 73 75 62 71  arse, pNC, "subq
6ab0: 75 65 72 69 65 73 22 2c 20 4e 43 5f 49 73 43 68  ueries", NC_IsCh
6ac0: 65 63 6b 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e  eck|NC_PartIdx|N
6ad0: 43 5f 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20  C_IdxExpr);.    
6ae0: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53      sqlite3WalkS
6af0: 65 6c 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70  elect(pWalker, p
6b00: 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29  Expr->x.pSelect)
6b10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6b20: 28 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65  ( pNC->nRef>=nRe
6b30: 66 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  f );.        if(
6b40: 20 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66   nRef!=pNC->nRef
6b50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78   ){.          Ex
6b60: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
6b70: 78 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63  xpr, EP_VarSelec
6b80: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  t);.          pN
6b90: 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  C->ncFlags |= NC
6ba0: 5f 56 61 72 53 65 6c 65 63 74 3b 0a 20 20 20 20  _VarSelect;.    
6bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6bd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
6be0: 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 6e  IABLE: {.      n
6bf0: 6f 74 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20  otValid(pParse, 
6c00: 70 4e 43 2c 20 22 70 61 72 61 6d 65 74 65 72 73  pNC, "parameters
6c10: 22 2c 20 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43  ", NC_IsCheck|NC
6c20: 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 64 78 45  _PartIdx|NC_IdxE
6c30: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
6c40: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6c50: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 0a 20 20  e TK_BETWEEN:.  
6c60: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20    case TK_EQ:.  
6c70: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
6c80: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
6c90: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
6ca0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
6cb0: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
6cc0: 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
6cd0: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
6ce0: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 65   {.      int nLe
6cf0: 66 74 2c 20 6e 52 69 67 68 74 3b 0a 20 20 20 20  ft, nRight;.    
6d00: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62    if( pParse->db
6d10: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 61 73   break;.      as
6d30: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
6d40: 66 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e  ft!=0 );.      n
6d50: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
6d60: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
6d70: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
6d80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
6d90: 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20  =TK_BETWEEN ){. 
6da0: 20 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20         nRight = 
6db0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
6dc0: 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 78 2e 70  rSize(pExpr->x.p
6dd0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
6de0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
6df0: 52 69 67 68 74 3d 3d 6e 4c 65 66 74 20 29 7b 0a  Right==nLeft ){.
6e00: 20 20 20 20 20 20 20 20 20 20 6e 52 69 67 68 74            nRight
6e10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
6e20: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
6e30: 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  x.pList->a[1].pE
6e40: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
6e50: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
6e60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
6e70: 70 72 2d 3e 70 52 69 67 68 74 21 3d 30 20 29 3b  pr->pRight!=0 );
6e80: 0a 20 20 20 20 20 20 20 20 6e 52 69 67 68 74 20  .        nRight 
6e90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
6ea0: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
6eb0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Right);.      }.
6ec0: 20 20 20 20 20 20 69 66 28 20 6e 4c 65 66 74 21        if( nLeft!
6ed0: 3d 6e 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  =nRight ){.     
6ee0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
6ef0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b  pr->op==TK_EQ );
6f00: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
6f10: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
6f20: 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20 20 20 74  _NE );.        t
6f30: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
6f40: 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20  op==TK_LT );.   
6f50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
6f60: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
6f70: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
6f80: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
6f90: 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 20  TK_GT );.       
6fa0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
6fb0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op==TK_GE );. 
6fc0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
6fd0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
6fe0: 53 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  S );.        tes
6ff0: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
7000: 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20  ==TK_ISNOT );.  
7010: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7020: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45  pExpr->op==TK_BE
7030: 54 57 45 45 4e 20 29 3b 0a 20 20 20 20 20 20 20  TWEEN );.       
7040: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7050: 28 70 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61  (pParse, "row va
7060: 6c 75 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20  lue misused");. 
7070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
7080: 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ak; .    }.  }. 
7090: 20 72 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d   return (pParse-
70a0: 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72 73 65 2d  >nErr || pParse-
70b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
70c0: 64 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a  d) ? WRC_Abort :
70d0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
70e0: 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69  ../*.** pEList i
70f0: 73 20 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72  s a list of expr
7100: 65 73 73 69 6f 6e 73 20 77 68 69 63 68 20 61 72  essions which ar
7110: 65 20 72 65 61 6c 6c 79 20 74 68 65 20 72 65 73  e really the res
7120: 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 0a 2a  ult set of the.*
7130: 2a 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  * a SELECT state
7140: 6d 65 6e 74 2e 20 20 70 45 20 69 73 20 61 20 74  ment.  pE is a t
7150: 65 72 6d 20 69 6e 20 61 6e 20 4f 52 44 45 52 20  erm in an ORDER 
7160: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
7170: 6c 61 75 73 65 2e 0a 2a 2a 20 54 68 69 73 20 72  lause..** This r
7180: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 6f  outine checks to
7190: 20 73 65 65 20 69 66 20 70 45 20 69 73 20 61 20   see if pE is a 
71a0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
71b0: 72 20 77 68 69 63 68 20 63 6f 72 72 65 73 70 6f  r which correspo
71c0: 6e 64 73 0a 2a 2a 20 74 6f 20 74 68 65 20 41 53  nds.** to the AS
71d0: 2d 6e 61 6d 65 20 6f 66 20 6f 6e 65 20 6f 66 20  -name of one of 
71e0: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65  the terms of the
71f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
7200: 2e 20 20 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20  .  If it is,.** 
7210: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
7220: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 62  urn an integer b
7230: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 77  etween 1 and N w
7240: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
7250: 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65  mber of.** eleme
7260: 6e 74 73 20 69 6e 20 70 45 4c 69 73 74 2c 20 63  nts in pEList, c
7270: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
7280: 74 68 65 20 6d 61 74 63 68 69 6e 67 20 65 6e 74  the matching ent
7290: 72 79 2e 20 20 49 66 20 74 68 65 72 65 20 69 73  ry.  If there is
72a0: 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c 20 6f 72  .** no match, or
72b0: 20 69 66 20 70 45 20 69 73 20 6e 6f 74 20 61 20   if pE is not a 
72c0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
72d0: 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
72e0: 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 20 30  tine.** return 0
72f0: 2e 0a 2a 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 68  ..**.** pEList h
7300: 61 73 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  as been resolved
7310: 2e 20 20 70 45 20 68 61 73 20 6e 6f 74 2e 0a 2a  .  pE has not..*
7320: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
7330: 6f 6c 76 65 41 73 4e 61 6d 65 28 0a 20 20 50 61  olveAsName(.  Pa
7340: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
7350: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
7360: 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  ext for error me
7370: 73 73 61 67 65 73 20 2a 2f 0a 20 20 45 78 70 72  ssages */.  Expr
7380: 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f  List *pEList,  /
7390: 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73  * List of expres
73a0: 73 69 6f 6e 73 20 74 6f 20 73 63 61 6e 20 2a 2f  sions to scan */
73b0: 0a 20 20 45 78 70 72 20 2a 70 45 20 20 20 20 20  .  Expr *pE     
73c0: 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73        /* Express
73d0: 69 6f 6e 20 77 65 20 61 72 65 20 74 72 79 69 6e  ion we are tryin
73e0: 67 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b  g to match */.){
73f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
7400: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
7410: 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 55 4e 55 53  unter */..  UNUS
7420: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61  ED_PARAMETER(pPa
7430: 72 73 65 29 3b 0a 0a 20 20 69 66 28 20 70 45 2d  rse);..  if( pE-
7440: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20  >op==TK_ID ){.  
7450: 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70    char *zCol = p
7460: 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  E->u.zToken;.   
7470: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
7480: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7490: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73  .      char *zAs
74a0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e   = pEList->a[i].
74b0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
74c0: 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74   zAs!=0 && sqlit
74d0: 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a  e3StrICmp(zAs, z
74e0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
74f0: 20 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20     return i+1;. 
7500: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7510: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7520: 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61 20 70 6f  /*.** pE is a po
7530: 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72  inter to an expr
7540: 65 73 73 69 6f 6e 20 77 68 69 63 68 20 69 73 20  ession which is 
7550: 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e  a single term in
7560: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
7570: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   of a compound S
7580: 45 4c 45 43 54 2e 20 20 54 68 65 20 65 78 70 72  ELECT.  The expr
7590: 65 73 73 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  ession has not b
75a0: 65 65 6e 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f  een.** name reso
75b0: 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74  lved..**.** At t
75c0: 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f  he point this ro
75d0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
75e0: 20 77 65 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77   we already know
75f0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44   that the.** ORD
7600: 45 52 20 42 59 20 74 65 72 6d 20 69 73 20 6e 6f  ER BY term is no
7610: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 64  t an integer ind
7620: 65 78 20 69 6e 74 6f 20 74 68 65 20 72 65 73 75  ex into the resu
7630: 6c 74 20 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a  lt set.  That.**
7640: 20 63 61 73 65 20 69 73 20 68 61 6e 64 6c 65 64   case is handled
7650: 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
7660: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41  routine..**.** A
7670: 74 74 65 6d 70 74 20 74 6f 20 6d 61 74 63 68 20  ttempt to match 
7680: 70 45 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c  pE against resul
7690: 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e  t set columns in
76a0: 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a   the left-most.*
76b0: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
76c0: 6e 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  nt.  Return the 
76d0: 69 6e 64 65 78 20 69 20 6f 66 20 74 68 65 20 6d  index i of the m
76e0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a  atching column,.
76f0: 2a 2a 20 61 73 20 61 6e 20 69 6e 64 69 63 61 74  ** as an indicat
7700: 69 6f 6e 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ion to the calle
7710: 72 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  r that it should
7720: 20 73 6f 72 74 20 62 79 20 74 68 65 20 69 2d 74   sort by the i-t
7730: 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65  h column..** The
7740: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
7750: 6e 20 69 73 20 31 2e 20 20 49 6e 20 6f 74 68 65  n is 1.  In othe
7760: 72 20 77 6f 72 64 73 2c 20 74 68 65 20 76 61 6c  r words, the val
7770: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
7780: 68 65 0a 2a 2a 20 73 61 6d 65 20 69 6e 74 65 67  he.** same integ
7790: 65 72 20 76 61 6c 75 65 20 74 68 61 74 20 77 6f  er value that wo
77a0: 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 20 74  uld be used in t
77b0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
77c0: 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
77d0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  the column..**.*
77e0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  * If there is no
77f0: 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30   match, return 0
7800: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
7810: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
7820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
7830: 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72  esolveOrderByTer
7840: 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a 20 20 50  mToExprList(.  P
7850: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
7860: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
7870: 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72 20 6d  text for error m
7880: 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c  essages */.  Sel
7890: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
78a0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
78b0: 61 74 65 6d 65 6e 74 20 77 69 74 68 20 74 68 65  atement with the
78c0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
78d0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20   */.  Expr *pE  
78e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
78f0: 73 70 65 63 69 66 69 63 20 4f 52 44 45 52 20 42  specific ORDER B
7900: 59 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  Y term */.){.  i
7910: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7920: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
7930: 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  r */.  ExprList 
7940: 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65  *pEList;  /* The
7950: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
7960: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
7970: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20  NameContext nc; 
7980: 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65     /* Name conte
7990: 78 74 20 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67  xt for resolving
79a0: 20 70 45 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   pE */.  sqlite3
79b0: 20 2a 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44   *db;       /* D
79c0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
79d0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  on */.  int rc; 
79e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
79f0: 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
7a00: 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
7a10: 20 20 75 38 20 73 61 76 65 64 53 75 70 70 45 72    u8 savedSuppEr
7a20: 72 3b 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61  r;   /* Saved va
7a30: 6c 75 65 20 6f 66 20 64 62 2d 3e 73 75 70 70 72  lue of db->suppr
7a40: 65 73 73 45 72 72 20 2a 2f 0a 0a 20 20 61 73 73  essErr */..  ass
7a50: 65 72 74 28 20 73 71 6c 69 74 65 33 45 78 70 72  ert( sqlite3Expr
7a60: 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26 69  IsInteger(pE, &i
7a70: 29 3d 3d 30 20 29 3b 0a 20 20 70 45 4c 69 73 74  )==0 );.  pEList
7a80: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
7a90: 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76  st;..  /* Resolv
7aa0: 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74  e all names in t
7ab0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
7ac0: 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f   expression.  */
7ad0: 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30  .  memset(&nc, 0
7ae0: 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20  , sizeof(nc));. 
7af0: 20 6e 63 2e 70 50 61 72 73 65 20 3d 20 70 50 61   nc.pParse = pPa
7b00: 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69  rse;.  nc.pSrcLi
7b10: 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53  st = pSelect->pS
7b20: 72 63 3b 0a 20 20 6e 63 2e 70 45 4c 69 73 74 20  rc;.  nc.pEList 
7b30: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e  = pEList;.  nc.n
7b40: 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f  cFlags = NC_Allo
7b50: 77 41 67 67 3b 0a 20 20 6e 63 2e 6e 45 72 72 20  wAgg;.  nc.nErr 
7b60: 3d 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  = 0;.  db = pPar
7b70: 73 65 2d 3e 64 62 3b 0a 20 20 73 61 76 65 64 53  se->db;.  savedS
7b80: 75 70 70 45 72 72 20 3d 20 64 62 2d 3e 73 75 70  uppErr = db->sup
7b90: 70 72 65 73 73 45 72 72 3b 0a 20 20 64 62 2d 3e  pressErr;.  db->
7ba0: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 31 3b  suppressErr = 1;
7bb0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52  .  rc = sqlite3R
7bc0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
7bd0: 26 6e 63 2c 20 70 45 29 3b 0a 20 20 64 62 2d 3e  &nc, pE);.  db->
7be0: 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 73 61  suppressErr = sa
7bf0: 76 65 64 53 75 70 70 45 72 72 3b 0a 20 20 69 66  vedSuppErr;.  if
7c00: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ( rc ) return 0;
7c10: 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 6d 61  ..  /* Try to ma
7c20: 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  tch the ORDER BY
7c30: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
7c40: 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73 69 6f  nst an expressio
7c50: 6e 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65  n.  ** in the re
7c60: 73 75 6c 74 20 73 65 74 2e 20 20 52 65 74 75 72  sult set.  Retur
7c70: 6e 20 61 6e 20 31 2d 62 61 73 65 64 20 69 6e 64  n an 1-based ind
7c80: 65 78 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69  ex of the matchi
7c90: 6e 67 0a 20 20 2a 2a 20 72 65 73 75 6c 74 2d 73  ng.  ** result-s
7ca0: 65 74 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20  et entry..  */. 
7cb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69   for(i=0; i<pELi
7cc0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
7cd0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7ce0: 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70  ExprCompare(0, p
7cf0: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  EList->a[i].pExp
7d00: 72 2c 20 70 45 2c 20 2d 31 29 3c 32 20 29 7b 0a  r, pE, -1)<2 ){.
7d10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31        return i+1
7d20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7d30: 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 2c 20 72  * If no match, r
7d40: 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72 65  eturn 0. */.  re
7d50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7d60: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 52 44   Generate an ORD
7d70: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
7d80: 59 20 74 65 72 6d 20 6f 75 74 2d 6f 66 2d 72 61  Y term out-of-ra
7d90: 6e 67 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74  nge error..*/.st
7da0: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
7db0: 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72  eOutOfRangeError
7dc0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
7dd0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
7de0: 65 20 65 72 72 6f 72 20 63 6f 6e 74 65 78 74 20  e error context 
7df0: 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 77 72  into which to wr
7e00: 69 74 65 20 74 68 65 20 65 72 72 6f 72 20 2a 2f  ite the error */
7e10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7e20: 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 4f 52  Type,     /* "OR
7e30: 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20  DER" or "GROUP" 
7e40: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7e60: 68 65 20 69 6e 64 65 78 20 28 31 2d 62 61 73 65  he index (1-base
7e70: 64 29 20 6f 66 20 74 68 65 20 74 65 72 6d 20 6f  d) of the term o
7e80: 75 74 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0a 20  ut of range */. 
7e90: 20 69 6e 74 20 6d 78 20 20 20 20 20 20 20 20 20   int mx         
7ea0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67 65          /* Large
7eb0: 73 74 20 70 65 72 6d 69 73 73 69 62 6c 65 20 76  st permissible v
7ec0: 61 6c 75 65 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a  alue of i */.){.
7ed0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7ee0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 22  g(pParse, .    "
7ef0: 25 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f 75  %r %s BY term ou
7f00: 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68 6f  t of range - sho
7f10: 75 6c 64 20 62 65 20 22 0a 20 20 20 20 22 62 65  uld be ".    "be
7f20: 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22 2c  tween 1 and %d",
7f30: 20 69 2c 20 7a 54 79 70 65 2c 20 6d 78 29 3b 0a   i, zType, mx);.
7f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65  }../*.** Analyze
7f50: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
7f60: 61 75 73 65 20 69 6e 20 61 20 63 6f 6d 70 6f 75  ause in a compou
7f70: 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  nd SELECT statem
7f80: 65 6e 74 2e 20 20 20 4d 6f 64 69 66 79 0a 2a 2a  ent.   Modify.**
7f90: 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68   each term of th
7fa0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7fb0: 65 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  e is a constant 
7fc0: 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20  integer between 
7fd0: 31 0a 2a 2a 20 61 6e 64 20 4e 20 77 68 65 72 65  1.** and N where
7fe0: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
7ff0: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
8000: 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  he compound SELE
8010: 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  CT..**.** ORDER 
8020: 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  BY terms that ar
8030: 65 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 74  e already an int
8040: 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61  eger between 1 a
8050: 6e 64 20 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f  nd N are.** unmo
8060: 64 69 66 69 65 64 2e 20 20 4f 52 44 45 52 20 42  dified.  ORDER B
8070: 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  Y terms that are
8080: 20 69 6e 74 65 67 65 72 73 20 6f 75 74 73 69 64   integers outsid
8090: 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a 2a  e the range of.*
80a0: 2a 20 31 20 74 68 72 6f 75 67 68 20 4e 20 67 65  * 1 through N ge
80b0: 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72 2e  nerate an error.
80c0: 20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73    ORDER BY terms
80d0: 20 74 68 61 74 20 61 72 65 20 65 78 70 72 65 73   that are expres
80e0: 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6d 61 74  sions.** are mat
80f0: 63 68 65 64 20 61 67 61 69 6e 73 74 20 72 65 73  ched against res
8100: 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
8110: 6f 6e 73 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20  ons of compound 
8120: 53 45 4c 45 43 54 0a 2a 2a 20 62 65 67 69 6e 6e  SELECT.** beginn
8130: 69 6e 67 20 77 69 74 68 20 74 68 65 20 6c 65 66  ing with the lef
8140: 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 61 6e  t-most SELECT an
8150: 64 20 77 6f 72 6b 69 6e 67 20 74 6f 77 61 72 64  d working toward
8160: 20 74 68 65 20 72 69 67 68 74 2e 0a 2a 2a 20 41   the right..** A
8170: 74 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  t the first matc
8180: 68 2c 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  h, the ORDER BY 
8190: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
81a0: 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a  ansformed into.*
81b0: 2a 20 74 68 65 20 69 6e 74 65 67 65 72 20 63 6f  * the integer co
81c0: 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  lumn number..**.
81d0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
81e0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
81f0: 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  een..*/.static i
8200: 6e 74 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75  nt resolveCompou
8210: 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61 72  ndOrderBy(.  Par
8220: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
8230: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
8240: 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72  ntext.  Leave er
8250: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
8260: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
8270: 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a 20  Select       /* 
8280: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
8290: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ment containing 
82a0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f 0a  the ORDER BY */.
82b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45 78  ){.  int i;.  Ex
82c0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
82d0: 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  ;.  ExprList *pE
82e0: 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
82f0: 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65 54  *db;.  int moreT
8300: 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72 64  oDo = 1;..  pOrd
8310: 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d 3e  erBy = pSelect->
8320: 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  pOrderBy;.  if( 
8330: 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72 65  pOrderBy==0 ) re
8340: 74 75 72 6e 20 30 3b 0a 20 20 64 62 20 3d 20 70  turn 0;.  db = p
8350: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
8360: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
8370: 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49  >db->aLimit[SQLI
8380: 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
8390: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
83a0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
83b0: 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20  "too many terms 
83c0: 69 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  in ORDER BY clau
83d0: 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  se");.    return
83e0: 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d   1;.  }.  for(i=
83f0: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
8400: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8410: 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64  pOrderBy->a[i].d
8420: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  one = 0;.  }.  p
8430: 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 20 3d 20  Select->pNext = 
8440: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c  0;.  while( pSel
8450: 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a 20  ect->pPrior ){. 
8460: 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69     pSelect->pPri
8470: 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 53 65 6c  or->pNext = pSel
8480: 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63 74  ect;.    pSelect
8490: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69   = pSelect->pPri
84a0: 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  or;.  }.  while(
84b0: 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72 65   pSelect && more
84c0: 54 6f 44 6f 20 29 7b 0a 20 20 20 20 73 74 72 75  ToDo ){.    stru
84d0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
84e0: 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 6d 6f 72   *pItem;.    mor
84f0: 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20 70  eToDo = 0;.    p
8500: 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  EList = pSelect-
8510: 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73 73  >pEList;.    ass
8520: 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29  ert( pEList!=0 )
8530: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
8540: 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Item=pOrderBy->a
8550: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
8560: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
8570: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43  +){.      int iC
8580: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 45  ol = -1;.      E
8590: 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b 0a  xpr *pE, *pDup;.
85a0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
85b0: 3e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65  >done ) continue
85c0: 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71 6c  ;.      pE = sql
85d0: 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c  ite3ExprSkipColl
85e0: 61 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ate(pItem->pExpr
85f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
8600: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
8610: 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
8620: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
8630: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
8640: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
8650: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75         resolveOu
8660: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50  tOfRangeError(pP
8670: 61 72 73 65 2c 20 22 4f 52 44 45 52 22 2c 20 69  arse, "ORDER", i
8680: 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  +1, pEList->nExp
8690: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
86a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
86b0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
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 41 73 4e 61 6d 65 28 70 50 61 72  solveAsName(pPar
86e0: 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 3b  se, pEList, pE);
86f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
8700: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
8710: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
8720: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 2c 20  ExprDup(db, pE, 
8730: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
8740: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
8750: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  led ){.         
8760: 20 20 20 61 73 73 65 72 74 28 70 44 75 70 29 3b     assert(pDup);
8770: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f  .            iCo
8780: 6c 20 3d 20 72 65 73 6f 6c 76 65 4f 72 64 65 72  l = resolveOrder
8790: 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74  ByTermToExprList
87a0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
87b0: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
87c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
87d0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
87e0: 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20  (db, pDup);.    
87f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
8800: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
8810: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  {.        /* Con
8820: 76 65 72 74 20 74 68 65 20 4f 52 44 45 52 20 42  vert the ORDER B
8830: 59 20 74 65 72 6d 20 69 6e 74 6f 20 61 6e 20 69  Y term into an i
8840: 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75  nteger column nu
8850: 6d 62 65 72 20 69 43 6f 6c 2c 0a 20 20 20 20 20  mber iCol,.     
8860: 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 63 61 72     ** taking car
8870: 65 20 74 6f 20 70 72 65 73 65 72 76 65 20 74 68  e to preserve th
8880: 65 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65  e COLLATE clause
8890: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
88a0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
88b0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70  New = sqlite3Exp
88c0: 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52  r(db, TK_INTEGER
88d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
88e0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
88f0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 4e  rn 1;.        pN
8900: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
8910: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
8920: 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65    pNew->u.iValue
8930: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20   = iCol;.       
8940: 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 45 78 70   if( pItem->pExp
8950: 72 3d 3d 70 45 20 29 7b 0a 20 20 20 20 20 20 20  r==pE ){.       
8960: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
8970: 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = pNew;.        
8980: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
8990: 20 45 78 70 72 20 2a 70 50 61 72 65 6e 74 20 3d   Expr *pParent =
89a0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20   pItem->pExpr;. 
89b0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
89c0: 20 70 50 61 72 65 6e 74 2d 3e 6f 70 3d 3d 54 4b   pParent->op==TK
89d0: 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20  _COLLATE );.    
89e0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 61        while( pPa
89f0: 72 65 6e 74 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  rent->pLeft->op=
8a00: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 20 70 50  =TK_COLLATE ) pP
8a10: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 2d  arent = pParent-
8a20: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
8a30: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
8a40: 74 2d 3e 70 4c 65 66 74 3d 3d 70 45 20 29 3b 0a  t->pLeft==pE );.
8a50: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 65 6e            pParen
8a60: 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65 77 3b  t->pLeft = pNew;
8a70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8a80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
8a90: 6c 65 74 65 28 64 62 2c 20 70 45 29 3b 0a 20 20  lete(db, pE);.  
8aa0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78        pItem->u.x
8ab0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28  .iOrderByCol = (
8ac0: 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20  u16)iCol;.      
8ad0: 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20    pItem->done = 
8ae0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
8af0: 20 20 20 20 20 20 20 20 6d 6f 72 65 54 6f 44 6f          moreToDo
8b00: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8b10: 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20    }.    pSelect 
8b20: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74  = pSelect->pNext
8b30: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
8b40: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
8b50: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; i++){.    if
8b60: 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  ( pOrderBy->a[i]
8b70: 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20  .done==0 ){.    
8b80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8b90: 67 28 70 50 61 72 73 65 2c 20 22 25 72 20 4f 52  g(pParse, "%r OR
8ba0: 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f 65 73  DER BY term does
8bb0: 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79 20 22   not match any "
8bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f  .            "co
8bd0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73 75  lumn in the resu
8be0: 6c 74 20 73 65 74 22 2c 20 69 2b 31 29 3b 0a 20  lt set", i+1);. 
8bf0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
8c00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8c10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n 0;.}../*.** Ch
8c20: 65 63 6b 20 65 76 65 72 79 20 74 65 72 6d 20 69  eck every term i
8c30: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f  n the ORDER BY o
8c40: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
8c50: 65 20 70 4f 72 64 65 72 42 79 20 6f 66 0a 2a 2a  e pOrderBy of.**
8c60: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
8c70: 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e 20 20  ement pSelect.  
8c80: 49 66 20 61 6e 79 20 74 65 72 6d 20 69 73 20 72  If any term is r
8c90: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a 2a 2a  eference to a.**
8ca0: 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70 72   result set expr
8cb0: 65 73 73 69 6f 6e 20 28 61 73 20 64 65 74 65 72  ession (as deter
8cc0: 6d 69 6e 65 64 20 62 79 20 74 68 65 20 45 78 70  mined by the Exp
8cd0: 72 4c 69 73 74 2e 61 2e 75 2e 78 2e 69 4f 72 64  rList.a.u.x.iOrd
8ce0: 65 72 42 79 43 6f 6c 0a 2a 2a 20 66 69 65 6c 64  erByCol.** field
8cf0: 29 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74  ) then convert t
8d00: 68 61 74 20 74 65 72 6d 20 69 6e 74 6f 20 61 20  hat term into a 
8d10: 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 72 72  copy of the corr
8d20: 65 73 70 6f 6e 64 69 6e 67 20 72 65 73 75 6c 74  esponding result
8d30: 20 73 65 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a   set.** column..
8d40: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 65 72 72  **.** If any err
8d50: 6f 72 73 20 61 72 65 20 64 65 74 65 63 74 65 64  ors are detected
8d60: 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d  , add an error m
8d70: 65 73 73 61 67 65 20 74 6f 20 70 50 61 72 73 65  essage to pParse
8d80: 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 6e   and.** return n
8d90: 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e  on-zero.  Return
8da0: 20 7a 65 72 6f 20 69 66 20 6e 6f 20 65 72 72 6f   zero if no erro
8db0: 72 73 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2f 0a  rs are seen..*/.
8dc0: 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  int sqlite3Resol
8dd0: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a  veOrderGroupBy(.
8de0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8df0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
8e00: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61  ng context.  Lea
8e10: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
8e20: 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
8e30: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20  ct *pSelect,    
8e40: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
8e50: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
8e60: 6e 69 6e 67 20 74 68 65 20 63 6c 61 75 73 65 20  ning the clause 
8e70: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8e80: 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 54 68  OrderBy,   /* Th
8e90: 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
8ea0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f  OUP BY clause to
8eb0: 20 62 65 20 70 72 6f 63 65 73 73 65 64 20 2a 2f   be processed */
8ec0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8ed0: 54 79 70 65 20 20 20 20 20 2f 2a 20 22 4f 52 44  Type     /* "ORD
8ee0: 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20 2a  ER" or "GROUP" *
8ef0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
8f00: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
8f10: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78 70 72  arse->db;.  Expr
8f20: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
8f30: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
8f40: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20  item *pItem;..  
8f50: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
8f60: 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  || pParse->db->m
8f70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
8f80: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f  turn 0;.  if( pO
8f90: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62  rderBy->nExpr>db
8fa0: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
8fb0: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
8fc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
8fd0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
8fe0: 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20  o many terms in 
8ff0: 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c 20 7a  %s BY clause", z
9000: 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Type);.    retur
9010: 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73  n 1;.  }.  pELis
9020: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
9030: 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ist;.  assert( p
9040: 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20  EList!=0 );  /* 
9050: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e 65 77  sqlite3SelectNew
9060: 28 29 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  () guarantees th
9070: 69 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  is */.  for(i=0,
9080: 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d   pItem=pOrderBy-
9090: 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  >a; i<pOrderBy->
90a0: 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65  nExpr; i++, pIte
90b0: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
90c0: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
90d0: 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  yCol ){.      if
90e0: 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  ( pItem->u.x.iOr
90f0: 64 65 72 42 79 43 6f 6c 3e 70 45 4c 69 73 74 2d  derByCol>pEList-
9100: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
9110: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
9120: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
9130: 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 70 45 4c   zType, i+1, pEL
9140: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
9150: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
9160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73       }.      res
9170: 6f 6c 76 65 41 6c 69 61 73 28 70 50 61 72 73 65  olveAlias(pParse
9180: 2c 20 70 45 4c 69 73 74 2c 20 70 49 74 65 6d 2d  , pEList, pItem-
9190: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
91a0: 2d 31 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  -1, pItem->pExpr
91b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
91c0: 20 20 20 20 20 7a 54 79 70 65 2c 30 29 3b 0a 20       zType,0);. 
91d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
91e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f  n 0;.}../*.** pO
91f0: 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44  rderBy is an ORD
9200: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
9210: 59 20 63 6c 61 75 73 65 20 69 6e 20 53 45 4c 45  Y clause in SELE
9220: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65  CT statement pSe
9230: 6c 65 63 74 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d  lect..** The Nam
9240: 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  e context of the
9250: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
9260: 74 20 69 73 20 70 4e 43 2e 20 20 7a 54 79 70 65  t is pNC.  zType
9270: 20 69 73 20 65 69 74 68 65 72 0a 2a 2a 20 22 4f   is either.** "O
9280: 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
9290: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
92a0: 69 63 68 20 74 79 70 65 20 6f 66 20 63 6c 61 75  ich type of clau
92b0: 73 65 20 70 4f 72 64 65 72 42 79 20 69 73 2e 0a  se pOrderBy is..
92c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
92d0: 6e 65 20 72 65 73 6f 6c 76 65 73 20 65 61 63 68  ne resolves each
92e0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6c 61   term of the cla
92f0: 75 73 65 20 69 6e 74 6f 20 61 6e 20 65 78 70 72  use into an expr
9300: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68  ession..** If th
9310: 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20  e order-by term 
9320: 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 49 20  is an integer I 
9330: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20  between 1 and N 
9340: 28 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 0a  (where N is the.
9350: 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  ** number of col
9360: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
9370: 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45  lt set of the SE
9380: 4c 45 43 54 29 20 74 68 65 6e 20 74 68 65 20 65  LECT) then the e
9390: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20  xpression.** in 
93a0: 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69  the resolution i
93b0: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
93c0: 49 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20  I-th result-set 
93d0: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49 66 0a  expression.  If.
93e0: 2a 2a 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  ** the order-by 
93f0: 74 65 72 6d 20 69 73 20 61 6e 20 69 64 65 6e 74  term is an ident
9400: 69 66 69 65 72 20 74 68 61 74 20 63 6f 72 72 65  ifier that corre
9410: 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20 41 53  sponds to the AS
9420: 2d 6e 61 6d 65 20 6f 66 0a 2a 2a 20 61 20 72 65  -name of.** a re
9430: 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73  sult-set express
9440: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 74 65  ion, then the te
9450: 72 6d 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 61  rm resolves to a
9460: 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20   copy of the.** 
9470: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
9480: 73 73 69 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73  ssion.  Otherwis
9490: 65 2c 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  e, the expressio
94a0: 6e 20 69 73 20 72 65 73 6f 6c 76 65 64 20 69 6e  n is resolved in
94b0: 0a 2a 2a 20 74 68 65 20 75 73 75 61 6c 20 77 61  .** the usual wa
94c0: 79 20 2d 20 75 73 69 6e 67 20 73 71 6c 69 74 65  y - using sqlite
94d0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
94e0: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  s()..**.** This 
94f0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
9500: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
9510: 72 6f 72 73 2e 20 20 49 66 20 65 72 72 6f 72 73  rors.  If errors
9520: 20 6f 63 63 75 72 2c 20 74 68 65 6e 0a 2a 2a 20   occur, then.** 
9530: 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
9540: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d 69 67  rror message mig
9550: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 70 50  ht be left in pP
9560: 61 72 73 65 2e 20 20 28 4f 4f 4d 20 65 72 72 6f  arse.  (OOM erro
9570: 72 73 0a 2a 2a 20 65 78 63 65 70 74 65 64 2e 29  rs.** excepted.)
9580: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
9590: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
95a0: 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  By(.  NameContex
95b0: 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a 20 54  t *pNC,     /* T
95c0: 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20  he name context 
95d0: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  of the SELECT st
95e0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c  atement */.  Sel
95f0: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
9600: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
9610: 20 73 74 61 74 65 6d 65 6e 74 20 68 6f 6c 64 69   statement holdi
9620: 6e 67 20 70 4f 72 64 65 72 42 79 20 2a 2f 0a 20  ng pOrderBy */. 
9630: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
9640: 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44  rBy,   /* An ORD
9650: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
9660: 59 20 63 6c 61 75 73 65 20 74 6f 20 72 65 73 6f  Y clause to reso
9670: 6c 76 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  lve */.  const c
9680: 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f  har *zType     /
9690: 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45 52 22  * Either "ORDER"
96a0: 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61 73 20   or "GROUP", as 
96b0: 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29  appropriate */.)
96c0: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20  {.  int i, j;   
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
96f0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  ers */.  int iCo
9700: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9710: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
9720: 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74  n number */.  st
9730: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
9740: 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 2f 2a 20  em *pItem;   /* 
9750: 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  A term of the OR
9760: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
9770: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
9780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9790: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
97a0: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  text */.  int nR
97b0: 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20 20 20  esult;          
97c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
97d0: 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 74  er of terms in t
97e0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
97f0: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
9800: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
9810: 20 20 6e 52 65 73 75 6c 74 20 3d 20 70 53 65 6c    nResult = pSel
9820: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  ect->pEList->nEx
9830: 70 72 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70  pr;.  pParse = p
9840: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 66 6f  NC->pParse;.  fo
9850: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72  r(i=0, pItem=pOr
9860: 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64  derBy->a; i<pOrd
9870: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
9880: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
9890: 45 78 70 72 20 2a 70 45 20 3d 20 70 49 74 65 6d  Expr *pE = pItem
98a0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45 78 70  ->pExpr;.    Exp
98b0: 72 20 2a 70 45 32 20 3d 20 73 71 6c 69 74 65 33  r *pE2 = sqlite3
98c0: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
98d0: 70 45 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 79  pE);.    if( zTy
98e0: 70 65 5b 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20  pe[0]!='G' ){.  
98f0: 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c      iCol = resol
9900: 76 65 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c  veAsName(pParse,
9910: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
9920: 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20 69 66  , pE2);.      if
9930: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
9940: 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 41 53 2d      /* If an AS-
9950: 6e 61 6d 65 20 6d 61 74 63 68 20 69 73 20 66 6f  name match is fo
9960: 75 6e 64 2c 20 6d 61 72 6b 20 74 68 69 73 20 4f  und, mark this O
9970: 52 44 45 52 20 42 59 20 63 6f 6c 75 6d 6e 20 61  RDER BY column a
9980: 73 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  s being.        
9990: 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ** a copy of the
99a0: 20 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d   iCol-th result-
99b0: 73 65 74 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  set column.  The
99c0: 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
99d0: 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   to.        ** s
99e0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
99f0: 65 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c  erGroupBy() will
9a00: 20 63 6f 6e 76 65 72 74 20 74 68 65 20 65 78 70   convert the exp
9a10: 72 65 73 73 69 6f 6e 20 74 6f 20 61 0a 20 20 20  ression to a.   
9a20: 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
9a30: 74 68 65 20 69 43 6f 6c 2d 74 68 20 72 65 73 75  the iCol-th resu
9a40: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
9a50: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 49  n. */.        pI
9a60: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
9a70: 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c  yCol = (u16)iCol
9a80: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
9a90: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
9aa0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
9ab0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
9ac0: 45 32 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20  E2, &iCol) ){.  
9ad0: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
9ae0: 20 42 59 20 74 65 72 6d 20 69 73 20 61 6e 20 69   BY term is an i
9af0: 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e  nteger constant.
9b00: 20 20 41 67 61 69 6e 2c 20 73 65 74 20 74 68 65    Again, set the
9b10: 20 63 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a   column.      **
9b20: 20 6e 75 6d 62 65 72 20 73 6f 20 74 68 61 74 20   number so that 
9b30: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
9b40: 64 65 72 47 72 6f 75 70 42 79 28 29 20 77 69 6c  derGroupBy() wil
9b50: 6c 20 63 6f 6e 76 65 72 74 20 74 68 65 0a 20 20  l convert the.  
9b60: 20 20 20 20 2a 2a 20 6f 72 64 65 72 2d 62 79 20      ** order-by 
9b70: 74 65 72 6d 20 74 6f 20 61 20 63 6f 70 79 20 6f  term to a copy o
9b80: 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74  f the result-set
9b90: 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20   expression */. 
9ba0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 31 20       if( iCol<1 
9bb0: 7c 7c 20 69 43 6f 6c 3e 30 78 66 66 66 66 20 29  || iCol>0xffff )
9bc0: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76  {.        resolv
9bd0: 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72  eOutOfRangeError
9be0: 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20  (pParse, zType, 
9bf0: 69 2b 31 2c 20 6e 52 65 73 75 6c 74 29 3b 0a 20  i+1, nResult);. 
9c00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
9c10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
9c20: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
9c30: 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f  ByCol = (u16)iCo
9c40: 6c 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  l;.      continu
9c50: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
9c60: 20 4f 74 68 65 72 77 69 73 65 2c 20 74 72 65 61   Otherwise, trea
9c70: 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  t the ORDER BY t
9c80: 65 72 6d 20 61 73 20 61 6e 20 6f 72 64 69 6e 61  erm as an ordina
9c90: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  ry expression */
9ca0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  .    pItem->u.x.
9cb0: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b  iOrderByCol = 0;
9cc0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
9cd0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
9ce0: 28 70 4e 43 2c 20 70 45 29 20 29 7b 0a 20 20 20  (pNC, pE) ){.   
9cf0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
9d00: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20   }.    for(j=0; 
9d10: 6a 3c 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  j<pSelect->pELis
9d20: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
9d30: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9d40: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
9d50: 70 45 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pE, pSelect->pEL
9d60: 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c  ist->a[j].pExpr,
9d70: 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   -1)==0 ){.     
9d80: 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f     pItem->u.x.iO
9d90: 72 64 65 72 42 79 43 6f 6c 20 3d 20 6a 2b 31 3b  rderByCol = j+1;
9da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9db0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
9dc0: 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
9dd0: 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
9de0: 53 65 6c 65 63 74 2c 20 70 4f 72 64 65 72 42 79  Select, pOrderBy
9df0: 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , zType);.}../*.
9e00: 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  ** Resolve names
9e10: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
9e20: 74 61 74 65 6d 65 6e 74 20 70 20 61 6e 64 20 61  tatement p and a
9e30: 6c 6c 20 6f 66 20 69 74 73 20 64 65 73 63 65 6e  ll of its descen
9e40: 64 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  dants..*/.static
9e50: 20 69 6e 74 20 72 65 73 6f 6c 76 65 53 65 6c 65   int resolveSele
9e60: 63 74 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70  ctStep(Walker *p
9e70: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
9e80: 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  p){.  NameContex
9e90: 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20 20 2f 2a  t *pOuterNC;  /*
9ea0: 20 43 6f 6e 74 65 78 74 20 74 68 61 74 20 63 6f   Context that co
9eb0: 6e 74 61 69 6e 73 20 74 68 69 73 20 53 45 4c 45  ntains this SELE
9ec0: 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  CT */.  NameCont
9ed0: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
9ee0: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
9ef0: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
9f00: 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75  /.  int isCompou
9f10: 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  nd;         /* T
9f20: 72 75 65 20 69 66 20 70 20 69 73 20 61 20 63 6f  rue if p is a co
9f30: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f  mpound select */
9f40: 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e 64  .  int nCompound
9f50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
9f60: 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f 75 6e 64  mber of compound
9f70: 20 74 65 72 6d 73 20 70 72 6f 63 65 73 73 65 64   terms processed
9f80: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61 72   so far */.  Par
9f90: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
9fa0: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9fb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
9fc0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
9fd0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9fe0: 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  nter */.  ExprLi
9ff0: 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
a000: 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
a010: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
a020: 6c 65 63 74 20 2a 70 4c 65 66 74 6d 6f 73 74 3b  lect *pLeftmost;
a030: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
a040: 73 74 20 6f 66 20 53 45 4c 45 43 54 20 6f 66 20  st of SELECT of 
a050: 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  a compound */.  
a060: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
a070: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
a080: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
a090: 2f 0a 20 20 0a 0a 20 20 61 73 73 65 72 74 28 20  /.  ..  assert( 
a0a0: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  p!=0 );.  if( p-
a0b0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
a0c0: 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 72  esolved ){.    r
a0d0: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
a0e0: 0a 20 20 7d 0a 20 20 70 4f 75 74 65 72 4e 43 20  .  }.  pOuterNC 
a0f0: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
a100: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ;.  pParse = pWa
a110: 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
a120: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
a130: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20  ..  /* Normally 
a140: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
a150: 61 6e 64 28 29 20 77 69 6c 6c 20 62 65 20 63 61  and() will be ca
a160: 6c 6c 65 64 20 66 69 72 73 74 20 61 6e 64 20 77  lled first and w
a170: 69 6c 6c 20 68 61 76 65 0a 20 20 2a 2a 20 61 6c  ill have.  ** al
a180: 72 65 61 64 79 20 65 78 70 61 6e 64 65 64 20 74  ready expanded t
a190: 68 69 73 20 53 45 4c 45 43 54 2e 20 20 48 6f 77  his SELECT.  How
a1a0: 65 76 65 72 2c 20 69 66 20 74 68 69 73 20 69 73  ever, if this is
a1b0: 20 61 20 73 75 62 71 75 65 72 79 20 77 69 74 68   a subquery with
a1c0: 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 78 70 72 65  in.  ** an expre
a1d0: 73 73 69 6f 6e 2c 20 73 71 6c 69 74 65 33 52 65  ssion, sqlite3Re
a1e0: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
a1f0: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
a200: 77 69 74 68 6f 75 74 20 61 0a 20 20 2a 2a 20 70  without a.  ** p
a210: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
a220: 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
a230: 28 29 2e 20 20 57 68 65 6e 20 74 68 61 74 20 68  ().  When that h
a240: 61 70 70 65 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a  appens, let.  **
a250: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
a260: 65 70 28 29 20 64 6f 20 61 6c 6c 20 6f 66 20 74  ep() do all of t
a270: 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
a280: 72 20 74 68 69 73 20 53 45 4c 45 43 54 2e 0a 20  r this SELECT.. 
a290: 20 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   ** sqlite3Selec
a2a0: 74 50 72 65 70 28 29 20 77 69 6c 6c 20 69 6e 76  tPrep() will inv
a2b0: 6f 6b 65 20 62 6f 74 68 20 73 71 6c 69 74 65 33  oke both sqlite3
a2c0: 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 61  SelectExpand() a
a2d0: 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f 75  nd.  ** this rou
a2e0: 74 69 6e 65 20 69 6e 20 74 68 65 20 63 6f 72 72  tine in the corr
a2f0: 65 63 74 20 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a  ect order..  */.
a300: 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
a310: 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
a320: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
a330: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
a340: 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
a350: 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  C);.    return (
a360: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
a370: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a380: 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20  ) ? WRC_Abort : 
a390: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a  WRC_Prune;.  }..
a3a0: 20 20 69 73 43 6f 6d 70 6f 75 6e 64 20 3d 20 70    isCompound = p
a3b0: 2d 3e 70 50 72 69 6f 72 21 3d 30 3b 0a 20 20 6e  ->pPrior!=0;.  n
a3c0: 43 6f 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a 20 20  Compound = 0;.  
a3d0: 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 3b 0a 20  pLeftmost = p;. 
a3e0: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
a3f0: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
a400: 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
a410: 64 65 64 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  ded)!=0 );.    a
a420: 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
a430: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
a440: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  d)==0 );.    p->
a450: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
a460: 65 73 6f 6c 76 65 64 3b 0a 0a 20 20 20 20 2f 2a  esolved;..    /*
a470: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70   Resolve the exp
a480: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
a490: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
a4a0: 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a   clauses. These.
a4b0: 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61      ** are not a
a4c0: 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20  llowed to refer 
a4d0: 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f  to any names, so
a4e0: 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e   pass an empty N
a4f0: 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20  ameContext..    
a500: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
a510: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
a520: 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
a530: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
a540: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
a550: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
a560: 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 29  NC, p->pLimit) )
a570: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
a580: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
a590: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53  .    /* If the S
a5a0: 46 5f 43 6f 6e 76 65 72 74 65 64 20 66 6c 61 67  F_Converted flag
a5b0: 73 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  s is set, then t
a5c0: 68 69 73 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  his Select objec
a5d0: 74 20 77 61 73 0a 20 20 20 20 2a 2a 20 77 61 73  t was.    ** was
a5e0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
a5f0: 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
a600: 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
a610: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  ) function..    
a620: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
a630: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
a640: 75 73 65 20 28 70 2d 3e 70 4f 72 64 65 72 42 79  use (p->pOrderBy
a650: 29 20 73 68 6f 75 6c 64 20 62 65 20 72 65 73 6f  ) should be reso
a660: 6c 76 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 69  lved.    ** as i
a670: 66 20 69 74 20 77 65 72 65 20 70 61 72 74 20 6f  f it were part o
a680: 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2c  f the sub-query,
a690: 20 6e 6f 74 20 74 68 65 20 70 61 72 65 6e 74 2e   not the parent.
a6a0: 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 20 20   This block.    
a6b0: 2a 2a 20 6d 6f 76 65 73 20 74 68 65 20 70 4f 72  ** moves the pOr
a6c0: 64 65 72 42 79 20 64 6f 77 6e 20 74 6f 20 74 68  derBy down to th
a6d0: 65 20 73 75 62 2d 71 75 65 72 79 2e 20 49 74 20  e sub-query. It 
a6e0: 77 69 6c 6c 20 62 65 20 6d 6f 76 65 64 20 62 61  will be moved ba
a6f0: 63 6b 0a 20 20 20 20 2a 2a 20 61 66 74 65 72 20  ck.    ** after 
a700: 74 68 65 20 6e 61 6d 65 73 20 68 61 76 65 20 62  the names have b
a710: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 2a  een resolved.  *
a720: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  /.    if( p->sel
a730: 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
a740: 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65  rted ){.      Se
a750: 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e  lect *pSub = p->
a760: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
a770: 63 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ct;.      assert
a780: 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3d  ( p->pSrc->nSrc=
a790: 3d 31 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42  =1 && p->pOrderB
a7a0: 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
a7b0: 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  t( pSub->pPrior 
a7c0: 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
a7d0: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  y==0 );.      pS
a7e0: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  ub->pOrderBy = p
a7f0: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
a800: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
a810: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
a820: 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 72  /* Recursively r
a830: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
a840: 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 0a 20  all subqueries. 
a850: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
a860: 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
a870: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
a880: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
a890: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
a8a0: 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
a8b0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
a8c0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
a8d0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
a8e0: 43 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  C;         /* Us
a8f0: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 6e 61  ed to iterate na
a900: 6d 65 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  me contexts */. 
a910: 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20         int nRef 
a920: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
a930: 20 2f 2a 20 52 65 66 63 6f 75 6e 74 20 66 6f 72   /* Refcount for
a940: 20 70 4f 75 74 65 72 4e 43 20 61 6e 64 20 6f 75   pOuterNC and ou
a950: 74 65 72 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a  ter contexts */.
a960: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
a970: 61 72 20 2a 7a 53 61 76 65 64 43 6f 6e 74 65 78  ar *zSavedContex
a980: 74 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74  t = pParse->zAut
a990: 68 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 20  hContext;..     
a9a0: 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20     /* Count the 
a9b0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
a9c0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 4f  references to pO
a9d0: 75 74 65 72 4e 43 20 61 6e 64 20 61 6c 6c 20 6f  uterNC and all o
a9e0: 66 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a  f its.        **
a9f0: 20 70 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 73   parent contexts
aa00: 2e 20 41 66 74 65 72 20 72 65 73 6f 6c 76 69 6e  . After resolvin
aa10: 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  g references to 
aa20: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 0a 20  expressions in. 
aa30: 20 20 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d         ** pItem-
aa40: 3e 70 53 65 6c 65 63 74 2c 20 63 68 65 63 6b 20  >pSelect, check 
aa50: 69 66 20 74 68 69 73 20 76 61 6c 75 65 20 68 61  if this value ha
aa60: 73 20 63 68 61 6e 67 65 64 2e 20 49 66 20 73 6f  s changed. If so
aa70: 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  , then.        *
aa80: 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
aa90: 6e 74 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  nt pItem->pSelec
aaa0: 74 20 6d 75 73 74 20 62 65 20 63 6f 72 72 65 6c  t must be correl
aab0: 61 74 65 64 2e 20 53 65 74 20 74 68 65 0a 20 20  ated. Set the.  
aac0: 20 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e        ** pItem->
aad0: 66 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20  fg.isCorrelated 
aae0: 66 6c 61 67 20 69 66 20 74 68 69 73 20 69 73 20  flag if this is 
aaf0: 74 68 65 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  the case. */.   
ab00: 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75       for(pNC=pOu
ab10: 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d  terNC; pNC; pNC=
ab20: 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66  pNC->pNext) nRef
ab30: 20 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 0a   += pNC->nRef;..
ab40: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
ab50: 6d 2d 3e 7a 4e 61 6d 65 20 29 20 70 50 61 72 73  m->zName ) pPars
ab60: 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20  e->zAuthContext 
ab70: 3d 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a  = pItem->zName;.
ab80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
ab90: 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65  esolveSelectName
aba0: 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
abb0: 3e 70 53 65 6c 65 63 74 2c 20 70 4f 75 74 65 72  >pSelect, pOuter
abc0: 4e 43 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  NC);.        pPa
abd0: 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78  rse->zAuthContex
abe0: 74 20 3d 20 7a 53 61 76 65 64 43 6f 6e 74 65 78  t = zSavedContex
abf0: 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
ac00: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
ac10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ac20: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
ac30: 72 74 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72  rt;..        for
ac40: 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70  (pNC=pOuterNC; p
ac50: 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65  NC; pNC=pNC->pNe
ac60: 78 74 29 20 6e 52 65 66 20 2d 3d 20 70 4e 43 2d  xt) nRef -= pNC-
ac70: 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 61  >nRef;.        a
ac80: 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
ac90: 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30  .isCorrelated==0
aca0: 20 26 26 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20   && nRef<=0 );. 
acb0: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67         pItem->fg
acc0: 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20  .isCorrelated = 
acd0: 28 6e 52 65 66 21 3d 30 29 3b 0a 20 20 20 20 20  (nRef!=0);.     
ace0: 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
acf0: 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  /* Set up the lo
ad00: 63 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  cal name-context
ad10: 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69   to pass to sqli
ad20: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
ad30: 6d 65 73 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  mes() to.    ** 
ad40: 72 65 73 6f 6c 76 65 20 74 68 65 20 72 65 73 75  resolve the resu
ad50: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
ad60: 6e 20 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20  n list..    */. 
ad70: 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d     sNC.ncFlags =
ad80: 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20   NC_AllowAgg;.  
ad90: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
ada0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20 20 73 4e   p->pSrc;.    sN
adb0: 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75 74 65 72  C.pNext = pOuter
adc0: 4e 43 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  NC;.  .    /* Re
add0: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
ade0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 2a  he result set. *
adf0: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
ae00: 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74  3ResolveExprList
ae10: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
ae20: 45 4c 69 73 74 29 20 29 20 72 65 74 75 72 6e 20  EList) ) return 
ae30: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 0a 20 20  WRC_Abort;.  .  
ae40: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
ae50: 65 20 6e 6f 20 61 67 67 72 65 67 61 74 65 20 66  e no aggregate f
ae60: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  unctions in the 
ae70: 72 65 73 75 6c 74 2d 73 65 74 2c 20 61 6e 64 20  result-set, and 
ae80: 6e 6f 20 47 52 4f 55 50 20 42 59 20 0a 20 20 20  no GROUP BY .   
ae90: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   ** expression, 
aea0: 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 67 67  do not allow agg
aeb0: 72 65 67 61 74 65 73 20 69 6e 20 61 6e 79 20 6f  regates in any o
aec0: 66 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72  f the other expr
aed0: 65 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a  essions..    */.
aee0: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
aef0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 41 67  selFlags & SF_Ag
af00: 67 72 65 67 61 74 65 29 3d 3d 30 20 29 3b 0a 20  gregate)==0 );. 
af10: 20 20 20 70 47 72 6f 75 70 42 79 20 3d 20 70 2d     pGroupBy = p-
af20: 3e 70 47 72 6f 75 70 42 79 3b 0a 20 20 20 20 69  >pGroupBy;.    i
af30: 66 28 20 70 47 72 6f 75 70 42 79 20 7c 7c 20 28  f( pGroupBy || (
af40: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 20 4e 43  sNC.ncFlags & NC
af50: 5f 48 61 73 41 67 67 29 21 3d 30 20 29 7b 0a 20  _HasAgg)!=0 ){. 
af60: 20 20 20 20 20 61 73 73 65 72 74 28 20 4e 43 5f       assert( NC_
af70: 4d 69 6e 4d 61 78 41 67 67 3d 3d 53 46 5f 4d 69  MinMaxAgg==SF_Mi
af80: 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 20 20 20  nMaxAgg );.     
af90: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
afa0: 53 46 5f 41 67 67 72 65 67 61 74 65 20 7c 20 28  SF_Aggregate | (
afb0: 73 4e 43 2e 6e 63 46 6c 61 67 73 26 4e 43 5f 4d  sNC.ncFlags&NC_M
afc0: 69 6e 4d 61 78 41 67 67 29 3b 0a 20 20 20 20 7d  inMaxAgg);.    }
afd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 4e 43 2e  else{.      sNC.
afe0: 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41  ncFlags &= ~NC_A
aff0: 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 7d 0a 20  llowAgg;.    }. 
b000: 20 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 48 41   .    /* If a HA
b010: 56 49 4e 47 20 63 6c 61 75 73 65 20 69 73 20 70  VING clause is p
b020: 72 65 73 65 6e 74 2c 20 74 68 65 6e 20 74 68 65  resent, then the
b030: 72 65 20 6d 75 73 74 20 62 65 20 61 20 47 52 4f  re must be a GRO
b040: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 20 20  UP BY clause..  
b050: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
b060: 70 48 61 76 69 6e 67 20 26 26 20 21 70 47 72 6f  pHaving && !pGro
b070: 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 73 71  upBy ){.      sq
b080: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
b090: 61 72 73 65 2c 20 22 61 20 47 52 4f 55 50 20 42  arse, "a GROUP B
b0a0: 59 20 63 6c 61 75 73 65 20 69 73 20 72 65 71 75  Y clause is requ
b0b0: 69 72 65 64 20 62 65 66 6f 72 65 20 48 41 56 49  ired before HAVI
b0c0: 4e 47 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  NG");.      retu
b0d0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
b0e0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 64    }.  .    /* Ad
b0f0: 64 20 74 68 65 20 6f 75 74 70 75 74 20 63 6f 6c  d the output col
b100: 75 6d 6e 20 6c 69 73 74 20 74 6f 20 74 68 65 20  umn list to the 
b110: 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 62 65 66  name-context bef
b120: 6f 72 65 20 70 61 72 73 69 6e 67 20 74 68 65 0a  ore parsing the.
b130: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 65 78 70      ** other exp
b140: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
b150: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
b160: 2e 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  . This is so tha
b170: 74 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73  t.    ** express
b180: 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52  ions in the WHER
b190: 45 20 63 6c 61 75 73 65 20 28 65 74 63 2e 29 20  E clause (etc.) 
b1a0: 63 61 6e 20 72 65 66 65 72 20 74 6f 20 65 78 70  can refer to exp
b1b0: 72 65 73 73 69 6f 6e 73 20 62 79 0a 20 20 20 20  ressions by.    
b1c0: 2a 2a 20 61 6c 69 61 73 65 73 20 69 6e 20 74 68  ** aliases in th
b1d0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
b1e0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4d 69 6e 6f    **.    ** Mino
b1f0: 72 20 70 6f 69 6e 74 3a 20 49 66 20 74 68 69 73  r point: If this
b200: 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
b210: 65 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  en the expressio
b220: 6e 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a  n will be.    **
b230: 20 72 65 2d 65 76 61 6c 75 61 74 65 64 20 66 6f   re-evaluated fo
b240: 72 20 65 61 63 68 20 72 65 66 65 72 65 6e 63 65  r each reference
b250: 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
b260: 20 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d 20     sNC.pEList = 
b270: 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 69  p->pEList;.    i
b280: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
b290: 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c  eExprNames(&sNC,
b2a0: 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 20 72   p->pHaving) ) r
b2b0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
b2c0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
b2d0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
b2e0: 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72 65  (&sNC, p->pWhere
b2f0: 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
b300: 62 6f 72 74 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  bort;..    /* Re
b310: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 74  solve names in t
b320: 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e 63  able-valued-func
b330: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
b340: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
b350: 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20  <p->pSrc->nSrc; 
b360: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
b370: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b380: 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72  *pItem = &p->pSr
b390: 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  c->a[i];.      i
b3a0: 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54  f( pItem->fg.isT
b3b0: 61 62 46 75 6e 63 0a 20 20 20 20 20 20 20 26 26  abFunc.       &&
b3c0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
b3d0: 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e  xprListNames(&sN
b3e0: 43 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75  C, pItem->u1.pFu
b3f0: 6e 63 41 72 67 29 20 0a 20 20 20 20 20 20 29 7b  ncArg) .      ){
b400: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
b410: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
b420: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
b430: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 61 6e   The ORDER BY an
b440: 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  d GROUP BY claus
b450: 65 73 20 6d 61 79 20 6e 6f 74 20 72 65 66 65 72  es may not refer
b460: 20 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20 20 20   to terms in.   
b470: 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 69 65   ** outer querie
b480: 73 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e  s .    */.    sN
b490: 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  C.pNext = 0;.   
b4a0: 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d 20   sNC.ncFlags |= 
b4b0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 0a 20 20  NC_AllowAgg;..  
b4c0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
b4d0: 61 20 63 6f 6e 76 65 72 74 65 64 20 63 6f 6d 70  a converted comp
b4e0: 6f 75 6e 64 20 71 75 65 72 79 2c 20 6d 6f 76 65  ound query, move
b4f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
b500: 61 75 73 65 20 66 72 6f 6d 20 0a 20 20 20 20 2a  ause from .    *
b510: 2a 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 20  * the sub-query 
b520: 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65  back to the pare
b530: 6e 74 20 71 75 65 72 79 2e 20 41 74 20 74 68 69  nt query. At thi
b540: 73 20 70 6f 69 6e 74 20 65 61 63 68 20 74 65 72  s point each ter
b550: 6d 0a 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20  m.    ** within 
b560: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
b570: 75 73 65 20 68 61 73 20 62 65 65 6e 20 74 72 61  use has been tra
b580: 6e 73 66 6f 72 6d 65 64 20 74 6f 20 61 6e 20 69  nsformed to an i
b590: 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a 20 20  nteger value..  
b5a0: 20 20 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67    ** These integ
b5b0: 65 72 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6c  ers will be repl
b5c0: 61 63 65 64 20 62 79 20 63 6f 70 69 65 73 20 6f  aced by copies o
b5d0: 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
b5e0: 69 6e 67 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  ing result.    *
b5f0: 2a 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  * set expression
b600: 73 20 62 79 20 74 68 65 20 63 61 6c 6c 20 74 6f  s by the call to
b610: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
b620: 75 70 42 79 28 29 20 62 65 6c 6f 77 2e 20 20 2a  upBy() below.  *
b630: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  /.    if( p->sel
b640: 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
b650: 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65  rted ){.      Se
b660: 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e  lect *pSub = p->
b670: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
b680: 63 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  ct;.      p->pOr
b690: 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f  derBy = pSub->pO
b6a0: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53  rderBy;.      pS
b6b0: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30  ub->pOrderBy = 0
b6c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b6d0: 50 72 6f 63 65 73 73 20 74 68 65 20 4f 52 44 45  Process the ORDE
b6e0: 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20  R BY clause for 
b6f0: 73 69 6e 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54  singleton SELECT
b700: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
b710: 20 2a 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   ** The ORDER BY
b720: 20 63 6c 61 75 73 65 20 66 6f 72 20 63 6f 6d 70   clause for comp
b730: 6f 75 6e 64 73 20 53 45 4c 45 43 54 20 73 74 61  ounds SELECT sta
b740: 74 65 6d 65 6e 74 73 20 69 73 20 68 61 6e 64 6c  tements is handl
b750: 65 64 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c  ed.    ** below,
b760: 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
b770: 65 20 72 65 73 75 6c 74 2d 73 65 74 73 20 66 6f  e result-sets fo
b780: 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65  r all of the ele
b790: 6d 65 6e 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ments of.    ** 
b7a0: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76  the compound hav
b7b0: 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e  e been resolved.
b7c0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
b7d0: 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
b7e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e  DER BY clause on
b7f0: 20 61 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d   a term of a com
b800: 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 6f 74 68  pound-select oth
b810: 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74  er.    ** than t
b820: 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 74 65  he right-most te
b830: 72 6d 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  rm, then that is
b840: 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e   a syntax error.
b850: 20 20 42 75 74 20 74 68 65 20 65 72 72 6f 72 0a    But the error.
b860: 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65      ** is not de
b870: 74 65 63 74 65 64 20 75 6e 74 69 6c 20 6d 75 63  tected until muc
b880: 68 20 6c 61 74 65 72 2c 20 61 6e 64 20 73 6f 20  h later, and so 
b890: 77 65 20 6e 65 65 64 20 74 6f 20 67 6f 20 61 68  we need to go ah
b8a0: 65 61 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 72  ead and.    ** r
b8b0: 65 73 6f 6c 76 65 20 74 68 6f 73 65 20 73 79 6d  esolve those sym
b8c0: 62 6f 6c 73 20 6f 6e 20 74 68 65 20 69 6e 63 6f  bols on the inco
b8d0: 72 72 65 63 74 20 4f 52 44 45 52 20 42 59 20 66  rrect ORDER BY f
b8e0: 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 2e 0a  or consistency..
b8f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
b900: 73 43 6f 6d 70 6f 75 6e 64 3c 3d 6e 43 6f 6d 70  sCompound<=nComp
b910: 6f 75 6e 64 20 20 2f 2a 20 44 65 66 65 72 20 72  ound  /* Defer r
b920: 69 67 68 74 2d 6d 6f 73 74 20 4f 52 44 45 52 20  ight-most ORDER 
b930: 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  BY of a compound
b940: 20 2a 2f 0a 20 20 20 20 20 26 26 20 72 65 73 6f   */.     && reso
b950: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
b960: 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64  &sNC, p, p->pOrd
b970: 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29 0a 20  erBy, "ORDER"). 
b980: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
b990: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
b9a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e    }.    if( db->
b9b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
b9c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
b9d0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
b9e0: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
b9f0: 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
ba00: 75 73 65 2e 20 20 41 74 20 74 68 65 20 73 61 6d  use.  At the sam
ba10: 65 20 74 69 6d 65 2c 20 6d 61 6b 65 20 73 75 72  e time, make sur
ba20: 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 47 52  e .    ** the GR
ba30: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f  OUP BY clause do
ba40: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
ba50: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
ba60: 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ns..    */.    i
ba70: 66 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20  f( pGroupBy ){. 
ba80: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
ba90: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
baa0: 3b 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28  ;.    .      if(
bab0: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
bac0: 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 47  upBy(&sNC, p, pG
bad0: 72 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29  roupBy, "GROUP")
bae0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
baf0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  iled ){.        
bb00: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
bb10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bb20: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
bb30: 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47  GroupBy->a; i<pG
bb40: 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69  roupBy->nExpr; i
bb50: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
bb60: 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61        if( ExprHa
bb70: 73 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d  sProperty(pItem-
bb80: 3e 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20  >pExpr, EP_Agg) 
bb90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
bba0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
bbb0: 72 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20  rse, "aggregate 
bbc0: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  functions are no
bbd0: 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20  t allowed in ". 
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68               "th
bbf0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
bc00: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e");.          r
bc10: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
bc20: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bc30: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
bc40: 20 49 66 20 74 68 69 73 20 69 73 20 70 61 72 74   If this is part
bc50: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   of a compound S
bc60: 45 4c 45 43 54 2c 20 63 68 65 63 6b 20 74 68 61  ELECT, check tha
bc70: 74 20 69 74 20 68 61 73 20 74 68 65 20 72 69 67  t it has the rig
bc80: 68 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ht.    ** number
bc90: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
bca0: 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c 69  in the select li
bcb0: 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  st. */.    if( p
bcc0: 2d 3e 70 4e 65 78 74 20 26 26 20 70 2d 3e 70 45  ->pNext && p->pE
bcd0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 2d 3e  List->nExpr!=p->
bce0: 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pNext->pEList->n
bcf0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
bd00: 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
bd10: 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50  NumTermsError(pP
bd20: 61 72 73 65 2c 20 70 2d 3e 70 4e 65 78 74 29 3b  arse, p->pNext);
bd30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
bd40: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a  C_Abort;.    }..
bd50: 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
bd60: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
bd70: 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 0a  of the compound.
bd80: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
bd90: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 43  ->pPrior;.    nC
bda0: 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a  ompound++;.  }..
bdb0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
bdc0: 20 4f 52 44 45 52 20 42 59 20 6f 6e 20 61 20 63   ORDER BY on a c
bdd0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
bde0: 66 74 65 72 20 61 6c 6c 20 74 65 72 6d 73 20 6f  fter all terms o
bdf0: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f  f.  ** the compo
be00: 75 6e 64 20 68 61 76 65 20 62 65 65 6e 20 72 65  und have been re
be10: 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  solved..  */.  i
be20: 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 26 26  f( isCompound &&
be30: 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64   resolveCompound
be40: 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
be50: 70 4c 65 66 74 6d 6f 73 74 29 20 29 7b 0a 20 20  pLeftmost) ){.  
be60: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
be70: 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rt;.  }..  retur
be80: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a  n WRC_Prune;.}..
be90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
bea0: 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72  ne walks an expr
beb0: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
bec0: 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e  resolves referen
bed0: 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20  ces to.** table 
bee0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 72 65 73 75  columns and resu
bef0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 20  lt-set columns. 
bf00: 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
bf10: 65 2c 20 64 6f 20 65 72 72 6f 72 0a 2a 2a 20 63  e, do error.** c
bf20: 68 65 63 6b 69 6e 67 20 6f 6e 20 66 75 6e 63 74  hecking on funct
bf30: 69 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 73 65  ion usage and se
bf40: 74 20 61 20 66 6c 61 67 20 69 66 20 61 6e 79 20  t a flag if any 
bf50: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
bf60: 6f 6e 73 0a 2a 2a 20 61 72 65 20 73 65 65 6e 2e  ons.** are seen.
bf70: 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76  .**.** To resolv
bf80: 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  e table columns 
bf90: 72 65 66 65 72 65 6e 63 65 73 20 77 65 20 6c 6f  references we lo
bfa0: 6f 6b 20 66 6f 72 20 6e 6f 64 65 73 20 28 6f 72  ok for nodes (or
bfb0: 20 73 75 62 74 72 65 65 73 29 20 6f 66 20 74 68   subtrees) of th
bfc0: 65 20 0a 2a 2a 20 66 6f 72 6d 20 58 2e 59 2e 5a  e .** form X.Y.Z
bfd0: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
bfe0: 5a 20 77 68 65 72 65 0a 2a 2a 0a 2a 2a 20 20 20  Z where.**.**   
bff0: 20 20 20 58 3a 20 20 20 54 68 65 20 6e 61 6d 65     X:   The name
c000: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 2e 20   of a database. 
c010: 20 45 78 3a 20 20 22 6d 61 69 6e 22 20 6f 72 20   Ex:  "main" or 
c020: 22 74 65 6d 70 22 20 6f 72 0a 2a 2a 20 20 20 20  "temp" or.**    
c030: 20 20 20 20 20 20 20 74 68 65 20 73 79 6d 62 6f         the symbo
c040: 6c 69 63 20 6e 61 6d 65 20 61 73 73 69 67 6e 65  lic name assigne
c050: 64 20 74 6f 20 61 6e 20 41 54 54 41 43 48 2d 65  d to an ATTACH-e
c060: 64 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  d database..**.*
c070: 2a 20 20 20 20 20 20 59 3a 20 20 20 54 68 65 20  *      Y:   The 
c080: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
c090: 69 6e 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  in a FROM clause
c0a0: 2e 20 20 4f 72 20 69 6e 20 61 20 74 72 69 67 67  .  Or in a trigg
c0b0: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
c0c0: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
c0d0: 61 6c 20 6e 61 6d 65 73 20 22 6f 6c 64 22 20 6f  al names "old" o
c0e0: 72 20 22 6e 65 77 22 2e 0a 2a 2a 0a 2a 2a 20 20  r "new"..**.**  
c0f0: 20 20 20 20 5a 3a 20 20 20 54 68 65 20 6e 61 6d      Z:   The nam
c100: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  e of a column in
c110: 20 74 61 62 6c 65 20 59 2e 0a 2a 2a 0a 2a 2a 20   table Y..**.** 
c120: 54 68 65 20 6e 6f 64 65 20 61 74 20 74 68 65 20  The node at the 
c130: 72 6f 6f 74 20 6f 66 20 74 68 65 20 73 75 62 74  root of the subt
c140: 72 65 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ree is modified 
c150: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
c160: 2a 20 20 20 20 45 78 70 72 2e 6f 70 20 20 20 20  *    Expr.op    
c170: 20 20 20 20 43 68 61 6e 67 65 64 20 74 6f 20 54      Changed to T
c180: 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 45  K_COLUMN.**    E
c190: 78 70 72 2e 70 54 61 62 20 20 20 20 20 20 50 6f  xpr.pTab      Po
c1a0: 69 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c  ints to the Tabl
c1b0: 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 58 2e 59  e object for X.Y
c1c0: 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 43 6f 6c  .**    Expr.iCol
c1d0: 75 6d 6e 20 20 20 54 68 65 20 63 6f 6c 75 6d 6e  umn   The column
c1e0: 20 69 6e 64 65 78 20 69 6e 20 58 2e 59 2e 20 20   index in X.Y.  
c1f0: 2d 31 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64  -1 for the rowid
c200: 2e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 54 61  ..**    Expr.iTa
c210: 62 6c 65 20 20 20 20 54 68 65 20 56 44 42 45 20  ble    The VDBE 
c220: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
c230: 72 20 58 2e 59 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  r X.Y.**.**.** T
c240: 6f 20 72 65 73 6f 6c 76 65 20 72 65 73 75 6c 74  o resolve result
c250: 2d 73 65 74 20 72 65 66 65 72 65 6e 63 65 73 2c  -set references,
c260: 20 6c 6f 6f 6b 20 66 6f 72 20 65 78 70 72 65 73   look for expres
c270: 73 69 6f 6e 20 6e 6f 64 65 73 20 6f 66 20 74 68  sion nodes of th
c280: 65 0a 2a 2a 20 66 6f 72 6d 20 5a 20 28 77 69 74  e.** form Z (wit
c290: 68 20 6e 6f 20 58 20 61 6e 64 20 59 20 70 72 65  h no X and Y pre
c2a0: 66 69 78 29 20 77 68 65 72 65 20 74 68 65 20 5a  fix) where the Z
c2b0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 72 69 67   matches the rig
c2c0: 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 7a 65 20  ht-hand.** size 
c2d0: 6f 66 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  of an AS clause 
c2e0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  in the result-se
c2f0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 20 20  t of a SELECT.  
c300: 54 68 65 20 5a 20 65 78 70 72 65 73 73 69 6f 6e  The Z expression
c310: 0a 2a 2a 20 69 73 20 72 65 70 6c 61 63 65 64 20  .** is replaced 
c320: 62 79 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  by a copy of the
c330: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
c340: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  of the result-se
c350: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
c360: 20 54 61 62 6c 65 2d 6e 61 6d 65 20 61 6e 64 20   Table-name and 
c370: 66 75 6e 63 74 69 6f 6e 20 72 65 73 6f 6c 75 74  function resolut
c380: 69 6f 6e 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  ion occurs on th
c390: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 65 78  e substituted ex
c3a0: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65  pression.** tree
c3b0: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
c3c0: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53  in:.**.**      S
c3d0: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20  ELECT a+b AS x, 
c3e0: 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c+d AS y FROM t1
c3f0: 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 2a 2a 0a   ORDER BY x;.**.
c400: 2a 2a 20 54 68 65 20 22 78 22 20 74 65 72 6d 20  ** The "x" term 
c410: 6f 66 20 74 68 65 20 6f 72 64 65 72 20 62 79 20  of the order by 
c420: 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 22  is replaced by "
c430: 61 2b 62 22 20 74 6f 20 72 65 6e 64 65 72 3a 0a  a+b" to render:.
c440: 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43  **.**      SELEC
c450: 54 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20  T a+b AS x, c+d 
c460: 41 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44  AS y FROM t1 ORD
c470: 45 52 20 42 59 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a  ER BY a+b;.**.**
c480: 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   Function calls 
c490: 61 72 65 20 63 68 65 63 6b 65 64 20 74 6f 20 6d  are checked to m
c4a0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
c4b0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  e function is .*
c4c0: 2a 20 64 65 66 69 6e 65 64 20 61 6e 64 20 74 68  * defined and th
c4d0: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  at the correct n
c4e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
c4f0: 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ts are specified
c500: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  ..** If the func
c510: 74 69 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65  tion is an aggre
c520: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 74  gate function, t
c530: 68 65 6e 20 74 68 65 20 4e 43 5f 48 61 73 41 67  hen the NC_HasAg
c540: 67 20 66 6c 61 67 20 69 73 0a 2a 2a 20 73 65 74  g flag is.** set
c550: 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 20   and the opcode 
c560: 69 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  is changed from 
c570: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 74 6f 20 54  TK_FUNCTION to T
c580: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a  K_AGG_FUNCTION..
c590: 2a 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  ** If an express
c5a0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67  ion contains agg
c5b0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
c5c0: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 41 67 67   then the EP_Agg
c5d0: 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  .** property on 
c5e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
c5f0: 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  s set..**.** An 
c600: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
c610: 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65 20   left in pParse 
c620: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61  if anything is a
c630: 6d 69 73 73 2e 20 20 54 68 65 20 6e 75 6d 62 65  miss.  The numbe
c640: 72 0a 2a 2a 20 69 66 20 65 72 72 6f 72 73 20 69  r.** if errors i
c650: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
c660: 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  nt sqlite3Resolv
c670: 65 45 78 70 72 4e 61 6d 65 73 28 20 0a 20 20 4e  eExprNames( .  N
c680: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
c690: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70         /* Namesp
c6a0: 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65  ace to resolve e
c6b0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a  xpressions in. *
c6c0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
c6e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
c6f0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f   be analyzed. */
c700: 0a 29 7b 0a 20 20 75 31 36 20 73 61 76 65 64 48  .){.  u16 savedH
c710: 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b 65 72 20  asAgg;.  Walker 
c720: 77 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  w;..  if( pExpr=
c730: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
c740: 54 45 5f 4f 4b 3b 0a 20 20 73 61 76 65 64 48 61  TE_OK;.  savedHa
c750: 73 41 67 67 20 3d 20 70 4e 43 2d 3e 6e 63 46 6c  sAgg = pNC->ncFl
c760: 61 67 73 20 26 20 28 4e 43 5f 48 61 73 41 67 67  ags & (NC_HasAgg
c770: 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a  |NC_MinMaxAgg);.
c780: 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26    pNC->ncFlags &
c790: 3d 20 7e 28 4e 43 5f 48 61 73 41 67 67 7c 4e 43  = ~(NC_HasAgg|NC
c7a0: 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a 20 20 77  _MinMaxAgg);.  w
c7b0: 2e 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70  .pParse = pNC->p
c7c0: 50 61 72 73 65 3b 0a 20 20 77 2e 78 45 78 70 72  Parse;.  w.xExpr
c7d0: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
c7e0: 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e  veExprStep;.  w.
c7f0: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
c800: 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  = resolveSelectS
c810: 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  tep;.  w.xSelect
c820: 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
c830: 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a   w.u.pNC = pNC;.
c840: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
c850: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 77 2e  XPR_DEPTH>0.  w.
c860: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
c870: 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68  += pExpr->nHeigh
c880: 74 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  t;.  if( sqlite3
c890: 45 78 70 72 43 68 65 63 6b 48 65 69 67 68 74 28  ExprCheckHeight(
c8a0: 77 2e 70 50 61 72 73 65 2c 20 77 2e 70 50 61 72  w.pParse, w.pPar
c8b0: 73 65 2d 3e 6e 48 65 69 67 68 74 29 20 29 7b 0a  se->nHeight) ){.
c8c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c8d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e  E_ERROR;.  }.#en
c8e0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c  dif.  sqlite3Wal
c8f0: 6b 45 78 70 72 28 26 77 2c 20 70 45 78 70 72 29  kExpr(&w, pExpr)
c900: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
c910: 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20  _EXPR_DEPTH>0.  
c920: 77 2e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68  w.pParse->nHeigh
c930: 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69  t -= pExpr->nHei
c940: 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ght;.#endif.  if
c950: 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26  ( pNC->ncFlags &
c960: 20 4e 43 5f 48 61 73 41 67 67 20 29 7b 0a 20 20   NC_HasAgg ){.  
c970: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
c980: 79 28 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29  y(pExpr, EP_Agg)
c990: 3b 0a 20 20 7d 0a 20 20 70 4e 43 2d 3e 6e 63 46  ;.  }.  pNC->ncF
c9a0: 6c 61 67 73 20 7c 3d 20 73 61 76 65 64 48 61 73  lags |= savedHas
c9b0: 41 67 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  Agg;.  return pN
c9c0: 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20 77 2e 70  C->nErr>0 || w.p
c9d0: 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 3b 0a 7d  Parse->nErr>0;.}
c9e0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
c9f0: 61 6c 6c 20 6e 61 6d 65 73 20 66 6f 72 20 61 6c  all names for al
ca00: 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  l expression in 
ca10: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
ca20: 73 74 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  st.  This is.** 
ca30: 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c 69 74 65  just like sqlite
ca40: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
ca50: 73 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  s() except that 
ca60: 69 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 20  it works for an 
ca70: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 6c 69  expression.** li
ca80: 73 74 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  st rather than a
ca90: 20 73 69 6e 67 6c 65 20 65 78 70 72 65 73 73 69   single expressi
caa0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
cab0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73  e3ResolveExprLis
cac0: 74 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43  tNames( .  NameC
cad0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
cae0: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
caf0: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
cb00: 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20  ssions in. */.  
cb10: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
cb20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
cb30: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
cb40: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  o be analyzed. *
cb50: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
cb60: 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  if( pList ){.   
cb70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
cb80: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
cb90: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
cba0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
cbb0: 73 28 70 4e 43 2c 20 70 4c 69 73 74 2d 3e 61 5b  s(pNC, pList->a[
cbc0: 69 5d 2e 70 45 78 70 72 29 20 29 20 72 65 74 75  i].pExpr) ) retu
cbd0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
cbe0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
cbf0: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
cc00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
cc10: 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c  all names in all
cc20: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
cc30: 61 20 53 45 4c 45 43 54 20 61 6e 64 20 69 6e 20  a SELECT and in 
cc40: 61 6c 6c 0a 2a 2a 20 64 65 63 65 6e 64 65 6e 74  all.** decendent
cc50: 73 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2c  s of the SELECT,
cc60: 20 69 6e 63 6c 75 64 69 6e 67 20 63 6f 6d 70 6f   including compo
cc70: 75 6e 64 73 20 6f 66 66 20 6f 66 20 70 2d 3e 70  unds off of p->p
cc80: 50 72 69 6f 72 2c 0a 2a 2a 20 73 75 62 71 75 65  Prior,.** subque
cc90: 72 69 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  ries in expressi
cca0: 6f 6e 73 2c 20 61 6e 64 20 73 75 62 71 75 65 72  ons, and subquer
ccb0: 69 65 73 20 75 73 65 64 20 61 73 20 46 52 4f 4d  ies used as FROM
ccc0: 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65 72 6d 73   clause.** terms
ccd0: 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 73 71 6c 69  ..**.** See sqli
cce0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
ccf0: 6d 65 73 28 29 20 66 6f 72 20 61 20 64 65 73 63  mes() for a desc
cd00: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6b  ription of the k
cd10: 69 6e 64 73 20 6f 66 0a 2a 2a 20 74 72 61 6e 73  inds of.** trans
cd20: 66 6f 72 6d 61 74 69 6f 6e 73 20 74 68 61 74 20  formations that 
cd30: 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c  occur..**.** All
cd40: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cd50: 74 73 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62  ts should have b
cd60: 65 65 6e 20 65 78 70 61 6e 64 65 64 20 75 73 69  een expanded usi
cd70: 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c  ng.** sqlite3Sel
cd80: 65 63 74 45 78 70 61 6e 64 28 29 20 70 72 69 6f  ectExpand() prio
cd90: 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
cda0: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76  is routine..*/.v
cdb0: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  oid sqlite3Resol
cdc0: 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 0a 20  veSelectNames(. 
cdd0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
cde0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
cdf0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
ce00: 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c 20 20 20  .  Select *p,   
ce10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ce20: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
ce30: 74 20 62 65 69 6e 67 20 63 6f 64 65 64 2e 20 2a  t being coded. *
ce40: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
ce50: 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a 20 4e 61  *pOuterNC  /* Na
ce60: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
ce70: 61 72 65 6e 74 20 53 45 4c 45 43 54 20 73 74 61  arent SELECT sta
ce80: 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 57  tement */.){.  W
ce90: 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 61 73 73 65  alker w;..  asse
cea0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 77 2e  rt( p!=0 );.  w.
ceb0: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
cec0: 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70 3b  resolveExprStep;
ced0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
cee0: 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 53 65  back = resolveSe
cef0: 6c 65 63 74 53 74 65 70 3b 0a 20 20 77 2e 78 53  lectStep;.  w.xS
cf00: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d  electCallback2 =
cf10: 20 30 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d   0;.  w.pParse =
cf20: 20 70 50 61 72 73 65 3b 0a 20 20 77 2e 75 2e 70   pParse;.  w.u.p
cf30: 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20  NC = pOuterNC;. 
cf40: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
cf50: 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ct(&w, p);.}../*
cf60: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65  .** Resolve name
cf70: 73 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73  s in expressions
cf80: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 72   that can only r
cf90: 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67 6c  eference a singl
cfa0: 65 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  e table:.**.**  
cfb0: 20 20 2a 20 20 20 43 48 45 43 4b 20 63 6f 6e 73    *   CHECK cons
cfc0: 74 72 61 69 6e 74 73 0a 2a 2a 20 20 20 20 2a 20  traints.**    * 
cfd0: 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 73 20    WHERE clauses 
cfe0: 6f 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63  on partial indic
cff0: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20 45 78 70  es.**.** The Exp
d000: 72 2e 69 54 61 62 6c 65 20 76 61 6c 75 65 20 66  r.iTable value f
d010: 6f 72 20 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f 43  or Expr.op==TK_C
d020: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 6f 66 20 74  OLUMN nodes of t
d030: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  he expression.**
d040: 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 61 6e   is set to -1 an
d050: 64 20 74 68 65 20 45 78 70 72 2e 69 43 6f 6c 75  d the Expr.iColu
d060: 6d 6e 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  mn value is set 
d070: 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75  to the column nu
d080: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  mber..**.** Any 
d090: 65 72 72 6f 72 73 20 63 61 75 73 65 20 61 6e 20  errors cause an 
d0a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
d0b0: 20 62 65 20 73 65 74 20 69 6e 20 70 50 61 72 73   be set in pPars
d0c0: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
d0d0: 65 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66  e3ResolveSelfRef
d0e0: 65 72 65 6e 63 65 28 0a 20 20 50 61 72 73 65 20  erence(.  Parse 
d0f0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
d100: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d110: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
d120: 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  b,        /* The
d130: 20 74 61 62 6c 65 20 62 65 69 6e 67 20 72 65 66   table being ref
d140: 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  erenced */.  int
d150: 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20   type,          
d160: 20 2f 2a 20 4e 43 5f 49 73 43 68 65 63 6b 20 6f   /* NC_IsCheck o
d170: 72 20 4e 43 5f 50 61 72 74 49 64 78 20 6f 72 20  r NC_PartIdx or 
d180: 4e 43 5f 49 64 78 45 78 70 72 20 2a 2f 0a 20 20  NC_IdxExpr */.  
d190: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20  Expr *pExpr,    
d1a0: 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f      /* Expressio
d1b0: 6e 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20 20 4d  n to resolve.  M
d1c0: 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
d1d0: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
d1e0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
d1f0: 6f 6e 20 6c 69 73 74 20 74 6f 20 72 65 73 6f 6c  on list to resol
d200: 76 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 2e  ve.  May be NUL.
d210: 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73 74   */.){.  SrcList
d220: 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20   sSrc;          
d230: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65           /* Fake
d240: 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61   SrcList for pPa
d250: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
d260: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
d270: 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  sNC;            
d280: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
d290: 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ext for pParse->
d2a0: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20  pNewTable */..  
d2b0: 61 73 73 65 72 74 28 20 74 79 70 65 3d 3d 4e 43  assert( type==NC
d2c0: 5f 49 73 43 68 65 63 6b 20 7c 7c 20 74 79 70 65  _IsCheck || type
d2d0: 3d 3d 4e 43 5f 50 61 72 74 49 64 78 20 7c 7c 20  ==NC_PartIdx || 
d2e0: 74 79 70 65 3d 3d 4e 43 5f 49 64 78 45 78 70 72  type==NC_IdxExpr
d2f0: 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e   );.  memset(&sN
d300: 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43  C, 0, sizeof(sNC
d310: 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 53  ));.  memset(&sS
d320: 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53  rc, 0, sizeof(sS
d330: 72 63 29 29 3b 0a 20 20 73 53 72 63 2e 6e 53 72  rc));.  sSrc.nSr
d340: 63 20 3d 20 31 3b 0a 20 20 73 53 72 63 2e 61 5b  c = 1;.  sSrc.a[
d350: 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 54 61 62 2d  0].zName = pTab-
d360: 3e 7a 4e 61 6d 65 3b 0a 20 20 73 53 72 63 2e 61  >zName;.  sSrc.a
d370: 5b 30 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 3b  [0].pTab = pTab;
d380: 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75  .  sSrc.a[0].iCu
d390: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 73 4e 43  rsor = -1;.  sNC
d3a0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
d3b0: 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74  ;.  sNC.pSrcList
d3c0: 20 3d 20 26 73 53 72 63 3b 0a 20 20 73 4e 43 2e   = &sSrc;.  sNC.
d3d0: 6e 63 46 6c 61 67 73 20 3d 20 74 79 70 65 3b 0a  ncFlags = type;.
d3e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
d3f0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
d400: 4e 43 2c 20 70 45 78 70 72 29 20 29 20 72 65 74  NC, pExpr) ) ret
d410: 75 72 6e 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  urn;.  if( pList
d420: 20 29 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76   ) sqlite3Resolv
d430: 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26  eExprListNames(&
d440: 73 4e 43 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a     sNC, pList);.}.