/ Hex Artifact Content
Login

Artifact 6f8a45063c693019734887b5f95e860137960fae324ef8b6db36f06e8c53240e:


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 29 7b 0a 20 20 20 20 61 73  Tab==0 ){.    as
3d90: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d  sert( pExpr->op=
3da0: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 69 66  =TK_ID );.    if
3db0: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
3dc0: 79 28 70 45 78 70 72 2c 45 50 5f 44 62 6c 51 75  y(pExpr,EP_DblQu
3dd0: 6f 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 70  oted) ){.      p
3de0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54  Expr->op = TK_ST
3df0: 52 49 4e 47 3b 0a 20 20 20 20 20 20 70 45 78 70  RING;.      pExp
3e00: 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  r->pTab = 0;.   
3e10: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
3e20: 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  une;.    }.    i
3e30: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 64  f( sqlite3ExprId
3e40: 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45 78 70  ToTrueFalse(pExp
3e50: 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
3e60: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
3e70: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
3e80: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
3e90: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
3ea0: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
3eb0: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
3ec0: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
3ed0: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
3ee0: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
3ef0: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
3f00: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
3f10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
3f20: 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d  .    zErr = cnt=
3f30: 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f  =0 ? "no such co
3f40: 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f  lumn" : "ambiguo
3f50: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b  us column name";
3f60: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
3f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
3f80: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
3f90: 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45  s: %s.%s.%s", zE
3fa0: 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a  rr, zDb, zTab, z
3fb0: 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Col);.    }else 
3fc0: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
3fd0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
3fe0: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
3ff0: 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61  s.%s", zErr, zTa
4000: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65  b, zCol);.    }e
4010: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
4020: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4030: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72  e, "%s: %s", zEr
4040: 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  r, zCol);.    }.
4050: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
4060: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
4070: 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b   pTopNC->nErr++;
4080: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
4090: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61  column from a ta
40a0: 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20  ble in pSrcList 
40b0: 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74  is referenced, t
40c0: 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  hen record.  ** 
40d0: 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65  this fact in the
40e0: 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f   pSrcList.a[].co
40f0: 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20  lUsed bitmask.  
4100: 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a  Column 0 causes.
4110: 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65    ** bit 0 to be
4120: 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20   set.  Column 1 
4130: 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64  sets bit 1.  And
4140: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
4150: 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  he.  ** column n
4160: 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
4170: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
4180: 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
4190: 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65  bitmask.  ** the
41a0: 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f  n set the high-o
41b0: 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20  rder bit of the 
41c0: 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  bitmask..  */.  
41d0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
41e0: 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21  mn>=0 && pMatch!
41f0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  =0 ){.    int n 
4200: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
4210: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
4220: 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  n==BMS-1 );.    
4230: 69 66 28 20 6e 3e 3d 42 4d 53 20 29 7b 0a 20 20  if( n>=BMS ){.  
4240: 20 20 20 20 6e 20 3d 20 42 4d 53 2d 31 3b 0a 20      n = BMS-1;. 
4250: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
4260: 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72   pMatch->iCursor
4270: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
4280: 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63  );.    pMatch->c
4290: 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d  olUsed |= ((Bitm
42a0: 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a  ask)1)<<n;.  }..
42b0: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
42c0: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
42d0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
42e0: 65 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  e(db, pExpr->pLe
42f0: 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  ft);.  pExpr->pL
4300: 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  eft = 0;.  sqlit
4310: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4320: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
4330: 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  .  pExpr->pRight
4340: 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f   = 0;.  pExpr->o
4350: 70 20 3d 20 28 69 73 54 72 69 67 67 65 72 20 3f  p = (isTrigger ?
4360: 20 54 4b 5f 54 52 49 47 47 45 52 20 3a 20 54 4b   TK_TRIGGER : TK
4370: 5f 43 4f 4c 55 4d 4e 29 3b 0a 20 20 45 78 70 72  _COLUMN);.  Expr
4380: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
4390: 72 2c 20 45 50 5f 4c 65 61 66 29 3b 0a 6c 6f 6f  r, EP_Leaf);.loo
43a0: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 69  kupname_end:.  i
43b0: 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  f( cnt==1 ){.   
43c0: 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20   assert( pNC!=0 
43d0: 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  );.    if( !Expr
43e0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
43f0: 72 2c 20 45 50 5f 41 6c 69 61 73 29 20 29 7b 0a  r, EP_Alias) ){.
4400: 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75 74        sqlite3Aut
4410: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45  hRead(pParse, pE
4420: 78 70 72 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e  xpr, pSchema, pN
4430: 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20  C->pSrcList);.  
4440: 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65    }.    /* Incre
4450: 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61  ment the nRef va
4460: 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20  lue on all name 
4470: 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f  contexts from To
4480: 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a  pNC up to.    **
4490: 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65   the point where
44a0: 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65   the name matche
44b0: 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b  d. */.    for(;;
44c0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
44d0: 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20   pTopNC!=0 );.  
44e0: 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66      pTopNC->nRef
44f0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  ++;.      if( pT
4500: 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61  opNC==pNC ) brea
4510: 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20  k;.      pTopNC 
4520: 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b  = pTopNC->pNext;
4530: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
4540: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
4550: 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
4560: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
4570: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
4580: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
4590: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65   pointer to an e
45a0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 6c 6f 61  xpression to loa
45b0: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 43 6f  d the column iCo
45c0: 6c 0a 2a 2a 20 66 72 6f 6d 20 64 61 74 61 73 6f  l.** from dataso
45d0: 75 72 63 65 20 69 53 72 63 20 69 6e 20 53 72 63  urce iSrc in Src
45e0: 4c 69 73 74 20 70 53 72 63 2e 0a 2a 2f 0a 45 78  List pSrc..*/.Ex
45f0: 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61 74  pr *sqlite3Creat
4600: 65 43 6f 6c 75 6d 6e 45 78 70 72 28 73 71 6c 69  eColumnExpr(sqli
4610: 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74  te3 *db, SrcList
4620: 20 2a 70 53 72 63 2c 20 69 6e 74 20 69 53 72 63   *pSrc, int iSrc
4630: 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 45  , int iCol){.  E
4640: 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65 33  xpr *p = sqlite3
4650: 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b  ExprAlloc(db, TK
4660: 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a  _COLUMN, 0, 0);.
4670: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
4680: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
4690: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53 72  em *pItem = &pSr
46a0: 63 2d 3e 61 5b 69 53 72 63 5d 3b 0a 20 20 20 20  c->a[iSrc];.    
46b0: 70 2d 3e 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  p->pTab = pItem-
46c0: 3e 70 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 54  >pTab;.    p->iT
46d0: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
46e0: 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70  ursor;.    if( p
46f0: 2d 3e 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69  ->pTab->iPKey==i
4700: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Col ){.      p->
4710: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
4720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
4730: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56  ->iColumn = (ynV
4740: 61 72 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74  ar)iCol;.      t
4750: 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42  estcase( iCol==B
4760: 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MS );.      test
4770: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d  case( iCol==BMS-
4780: 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  1 );.      pItem
4790: 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42  ->colUsed |= ((B
47a0: 69 74 6d 61 73 6b 29 31 29 3c 3c 28 69 43 6f 6c  itmask)1)<<(iCol
47b0: 3e 3d 42 4d 53 20 3f 20 42 4d 53 2d 31 20 3a 20  >=BMS ? BMS-1 : 
47c0: 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  iCol);.    }.  }
47d0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
47e0: 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e 20  /*.** Report an 
47f0: 65 72 72 6f 72 20 74 68 61 74 20 61 6e 20 65 78  error that an ex
4800: 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20  pression is not 
4810: 76 61 6c 69 64 20 66 6f 72 20 73 6f 6d 65 20 73  valid for some s
4820: 65 74 20 6f 66 0a 2a 2a 20 70 4e 43 2d 3e 6e 63  et of.** pNC->nc
4830: 46 6c 61 67 73 20 76 61 6c 75 65 73 20 64 65 74  Flags values det
4840: 65 72 6d 69 6e 65 64 20 62 79 20 76 61 6c 69 64  ermined by valid
4850: 4d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Mask..*/.static 
4860: 76 6f 69 64 20 6e 6f 74 56 61 6c 69 64 28 0a 20  void notValid(. 
4870: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4880: 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 65        /* Leave e
4890: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65 72  rror message her
48a0: 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  e */.  NameConte
48b0: 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54  xt *pNC,    /* T
48c0: 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20  he name context 
48d0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
48e0: 2a 7a 4d 73 67 2c 20 20 20 20 2f 2a 20 54 79 70  *zMsg,    /* Typ
48f0: 65 20 6f 66 20 65 72 72 6f 72 20 2a 2f 0a 20 20  e of error */.  
4900: 69 6e 74 20 76 61 6c 69 64 4d 61 73 6b 20 20 20  int validMask   
4910: 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 63       /* Set of c
4920: 6f 6e 74 65 78 74 73 20 66 6f 72 20 77 68 69 63  ontexts for whic
4930: 68 20 70 72 6f 68 69 62 69 74 65 64 20 2a 2f 0a  h prohibited */.
4940: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28 76 61  ){.  assert( (va
4950: 6c 69 64 4d 61 73 6b 26 7e 28 4e 43 5f 49 73 43  lidMask&~(NC_IsC
4960: 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49 64 78 7c  heck|NC_PartIdx|
4970: 4e 43 5f 49 64 78 45 78 70 72 29 29 3d 3d 30 20  NC_IdxExpr))==0 
4980: 29 3b 0a 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e  );.  if( (pNC->n
4990: 63 46 6c 61 67 73 20 26 20 76 61 6c 69 64 4d 61  cFlags & validMa
49a0: 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 6f  sk)!=0 ){.    co
49b0: 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20  nst char *zIn = 
49c0: 22 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20 57  "partial index W
49d0: 48 45 52 45 20 63 6c 61 75 73 65 73 22 3b 0a 20  HERE clauses";. 
49e0: 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 63 46 6c     if( pNC->ncFl
49f0: 61 67 73 20 26 20 4e 43 5f 49 64 78 45 78 70 72  ags & NC_IdxExpr
4a00: 20 29 20 20 20 20 20 20 7a 49 6e 20 3d 20 22 69   )      zIn = "i
4a10: 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 73  ndex expressions
4a20: 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
4a30: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 20  E_OMIT_CHECK.   
4a40: 20 65 6c 73 65 20 69 66 28 20 70 4e 43 2d 3e 6e   else if( pNC->n
4a50: 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68  cFlags & NC_IsCh
4a60: 65 63 6b 20 29 20 7a 49 6e 20 3d 20 22 43 48 45  eck ) zIn = "CHE
4a70: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 3b  CK constraints";
4a80: 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
4a90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4aa0: 73 65 2c 20 22 25 73 20 70 72 6f 68 69 62 69 74  se, "%s prohibit
4ab0: 65 64 20 69 6e 20 25 73 22 2c 20 7a 4d 73 67 2c  ed in %s", zMsg,
4ac0: 20 7a 49 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   zIn);.  }.}../*
4ad0: 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70  .** Expression p
4ae0: 20 73 68 6f 75 6c 64 20 65 6e 63 6f 64 65 20 61   should encode a
4af0: 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
4b00: 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e  value between 1.
4b10: 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2a 20 52 65  0 and 0.0..** Re
4b20: 74 75 72 6e 20 31 30 32 34 20 74 69 6d 65 73 20  turn 1024 times 
4b30: 74 68 69 73 20 76 61 6c 75 65 2e 20 20 4f 72 20  this value.  Or 
4b40: 72 65 74 75 72 6e 20 2d 31 20 69 66 20 70 20 69  return -1 if p i
4b50: 73 20 6e 6f 74 20 61 20 66 6c 6f 61 74 69 6e 67  s not a floating
4b60: 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20   point.** value 
4b70: 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e 64 20  between 1.0 and 
4b80: 30 2e 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  0.0..*/.static i
4b90: 6e 74 20 65 78 70 72 50 72 6f 62 61 62 69 6c 69  nt exprProbabili
4ba0: 74 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 64  ty(Expr *p){.  d
4bb0: 6f 75 62 6c 65 20 72 20 3d 20 2d 31 2e 30 3b 0a  ouble r = -1.0;.
4bc0: 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f    if( p->op!=TK_
4bd0: 46 4c 4f 41 54 20 29 20 72 65 74 75 72 6e 20 2d  FLOAT ) return -
4be0: 31 3b 0a 20 20 73 71 6c 69 74 65 33 41 74 6f 46  1;.  sqlite3AtoF
4bf0: 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72  (p->u.zToken, &r
4c00: 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  , sqlite3Strlen3
4c10: 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 20  0(p->u.zToken), 
4c20: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
4c30: 61 73 73 65 72 74 28 20 72 3e 3d 30 2e 30 20 29  assert( r>=0.0 )
4c40: 3b 0a 20 20 69 66 28 20 72 3e 31 2e 30 20 29 20  ;.  if( r>1.0 ) 
4c50: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 72 65 74  return -1;.  ret
4c60: 75 72 6e 20 28 69 6e 74 29 28 72 2a 31 33 34 32  urn (int)(r*1342
4c70: 31 37 37 32 38 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a  17728.0);.}../*.
4c80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4c90: 69 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  is callback for 
4ca0: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
4cb0: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  )..**.** Resolve
4cc0: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20   symbolic names 
4cd0: 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f  into TK_COLUMN o
4ce0: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
4cf0: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65   current.** node
4d00: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
4d10: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
4d20: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74   0 to continue t
4d30: 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a  he search down.*
4d40: 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20  * the tree or 2 
4d50: 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65  to abort the tre
4d60: 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  e walk..**.** Th
4d70: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
4d80: 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b  does error check
4d90: 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73  ing and name res
4da0: 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66  olution for.** f
4db0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20  unction names.  
4dc0: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  The operator for
4dd0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
4de0: 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a  ions is changed.
4df0: 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ** to TK_AGG_FUN
4e00: 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  CTION..*/.static
4e10: 20 69 6e 74 20 72 65 73 6f 6c 76 65 45 78 70 72   int resolveExpr
4e20: 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61  Step(Walker *pWa
4e30: 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
4e40: 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  r){.  NameContex
4e50: 74 20 2a 70 4e 43 3b 0a 20 20 50 61 72 73 65 20  t *pNC;.  Parse 
4e60: 2a 70 50 61 72 73 65 3b 0a 0a 20 20 70 4e 43 20  *pParse;..  pNC 
4e70: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
4e80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 21  ;.  assert( pNC!
4e90: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 20 3d  =0 );.  pParse =
4ea0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
4eb0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d  assert( pParse==
4ec0: 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 20  pWalker->pParse 
4ed0: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  );..#ifndef NDEB
4ee0: 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53  UG.  if( pNC->pS
4ef0: 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70  rcList && pNC->p
4f00: 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e  SrcList->nAlloc>
4f10: 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  0 ){.    SrcList
4f20: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
4f30: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
4f40: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
4f50: 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c  =0; i<pNC->pSrcL
4f60: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
4f70: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4f80: 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  SrcList->a[i].iC
4f90: 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63  ursor>=0 && pSrc
4fa0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
4fb0: 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29  or<pParse->nTab)
4fc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
4fd0: 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  if.  switch( pEx
4fe0: 70 72 2d 3e 6f 70 20 29 7b 0a 0a 23 69 66 20 64  pr->op ){..#if d
4ff0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
5000: 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45  ABLE_UPDATE_DELE
5010: 54 45 5f 4c 49 4d 49 54 29 20 26 26 20 21 64 65  TE_LIMIT) && !de
5020: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5030: 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 20 20  T_SUBQUERY).    
5040: 2f 2a 20 54 68 65 20 73 70 65 63 69 61 6c 20 6f  /* The special o
5050: 70 65 72 61 74 6f 72 20 54 4b 5f 52 4f 57 20 6d  perator TK_ROW m
5060: 65 61 6e 73 20 75 73 65 20 74 68 65 20 72 6f 77  eans use the row
5070: 69 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  id for the first
5080: 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69  .    ** column i
5090: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
50a0: 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  e.  This is used
50b0: 20 62 79 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   by the LIMIT an
50c0: 64 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a  d ORDER BY.    *
50d0: 2a 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  * clause process
50e0: 69 6e 67 20 6f 6e 20 55 50 44 41 54 45 20 61 6e  ing on UPDATE an
50f0: 64 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  d DELETE stateme
5100: 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
5110: 63 61 73 65 20 54 4b 5f 52 4f 57 3a 20 7b 0a 20  case TK_ROW: {. 
5120: 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53       SrcList *pS
5130: 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
5140: 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74  rcList;.      st
5150: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
5160: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20  m *pItem;.      
5170: 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 74  assert( pSrcList
5180: 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 6e 53   && pSrcList->nS
5190: 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70  rc==1 );.      p
51a0: 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d  Item = pSrcList-
51b0: 3e 61 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  >a;.      assert
51c0: 28 20 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d  ( HasRowid(pItem
51d0: 2d 3e 70 54 61 62 29 20 26 26 20 70 49 74 65 6d  ->pTab) && pItem
51e0: 2d 3e 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  ->pTab->pSelect=
51f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
5200: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
5210: 4e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  N;.      pExpr->
5220: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
5230: 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  ab;.      pExpr-
5240: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
5250: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
5260: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
5270: 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72   -1;.      pExpr
5280: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
5290: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
52a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
52b0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65    }.#endif /* de
52c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
52d0: 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54  BLE_UPDATE_DELET
52e0: 45 5f 4c 49 4d 49 54 29 0a 20 20 20 20 20 20 20  E_LIMIT).       
52f0: 20 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53     && !defined(S
5300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
5310: 45 52 59 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ERY) */..    /* 
5320: 41 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20  A column name:  
5330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5340: 20 20 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 74    ID.    ** Or t
5350: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f  able name and co
5360: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 49 44  lumn name:    ID
5370: 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20  .ID.    ** Or a 
5380: 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20  database, table 
5390: 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e  and column:  ID.
53a0: 49 44 2e 49 44 0a 20 20 20 20 2a 2a 0a 20 20 20  ID.ID.    **.   
53b0: 20 2a 2a 20 54 68 65 20 54 4b 5f 49 44 20 61 6e   ** The TK_ID an
53c0: 64 20 54 4b 5f 4f 55 54 20 63 61 73 65 73 20 61  d TK_OUT cases a
53d0: 72 65 20 63 6f 6d 62 69 6e 65 64 20 73 6f 20 74  re combined so t
53e0: 68 61 74 20 74 68 65 72 65 20 77 69 6c 6c 20 6f  hat there will o
53f0: 6e 6c 79 0a 20 20 20 20 2a 2a 20 62 65 20 6f 6e  nly.    ** be on
5400: 65 20 63 61 6c 6c 20 74 6f 20 6c 6f 6f 6b 75 70  e call to lookup
5410: 4e 61 6d 65 28 29 2e 20 20 54 68 65 6e 20 74 68  Name().  Then th
5420: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
5430: 69 6e 2d 6c 69 6e 65 20 0a 20 20 20 20 2a 2a 20  in-line .    ** 
5440: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 29 20 66 6f 72  lookupName() for
5450: 20 61 20 73 69 7a 65 20 72 65 64 75 63 74 69 6f   a size reductio
5460: 6e 20 61 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63  n and performanc
5470: 65 20 69 6e 63 72 65 61 73 65 2e 0a 20 20 20 20  e increase..    
5480: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  */.    case TK_I
5490: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  D:.    case TK_D
54a0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  OT: {.      cons
54b0: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b  t char *zColumn;
54c0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
54d0: 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 20  r *zTable;.     
54e0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
54f0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
5500: 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 69 66 28  ight;..      if(
5510: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
5520: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62  D ){.        zDb
5530: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 54   = 0;.        zT
5540: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
5550: 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70    zColumn = pExp
5560: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
5570: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5580: 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61 72 73    notValid(pPars
5590: 65 2c 20 70 4e 43 2c 20 22 74 68 65 20 5c 22 2e  e, pNC, "the \".
55a0: 5c 22 20 6f 70 65 72 61 74 6f 72 22 2c 20 4e 43  \" operator", NC
55b0: 5f 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20 20  _IdxExpr);.     
55c0: 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70     pRight = pExp
55d0: 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
55e0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f     if( pRight->o
55f0: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
5600: 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20        zDb = 0;. 
5610: 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20           zTable 
5620: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  = pExpr->pLeft->
5630: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
5640: 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52      zColumn = pR
5650: 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  ight->u.zToken;.
5660: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5670: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
5680: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
5690: 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20  DOT );.         
56a0: 20 7a 44 62 20 3d 20 70 45 78 70 72 2d 3e 70 4c   zDb = pExpr->pL
56b0: 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  eft->u.zToken;. 
56c0: 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20           zTable 
56d0: 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d  = pRight->pLeft-
56e0: 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20  >u.zToken;.     
56f0: 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70       zColumn = p
5700: 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 75  Right->pRight->u
5710: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
5720: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5730: 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70 4e 61   return lookupNa
5740: 6d 65 28 70 50 61 72 73 65 2c 20 7a 44 62 2c 20  me(pParse, zDb, 
5750: 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c  zTable, zColumn,
5760: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
5770: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
5780: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
5790: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
57a0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20  se TK_FUNCTION: 
57b0: 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  {.      ExprList
57c0: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
57d0: 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20  >x.pList;    /* 
57e0: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73  The argument lis
57f0: 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  t */.      int n
5800: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
5810: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 20 20  ->nExpr : 0;    
5820: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5830: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
5840: 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  int no_such_func
5850: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
5860: 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66  rue if no such f
5870: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a  unction exists *
5880: 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e  /.      int wron
5890: 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20  g_num_args = 0; 
58a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
58b0: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
58c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
58d0: 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30    int is_agg = 0
58e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
58f0: 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61   True if is an a
5900: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
5910: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  n */.      int n
5920: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
5930: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5940: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
5950: 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  n function name 
5960: 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
5970: 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
5980: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
5990: 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  tion name. */.  
59a0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
59b0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
59c0: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
59d0: 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f  bout the functio
59e0: 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e  n */.      u8 en
59f0: 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d 3e  c = ENC(pParse->
5a00: 64 62 29 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  db);   /* The da
5a10: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
5a20: 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  */..      assert
5a30: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
5a40: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
5a50: 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20 20  Select) );.     
5a60: 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75 2e   zId = pExpr->u.
5a70: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 49  zToken;.      nI
5a80: 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
5a90: 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20 20  n30(zId);.      
5aa0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
5ab0: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
5ac0: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 2c 20 65  e->db, zId, n, e
5ad0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  nc, 0);.      if
5ae0: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
5af0: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
5b00: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
5b10: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
5b20: 20 2d 32 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20   -2, enc, 0);.  
5b30: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
5b40: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
5b50: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b  o_such_func = 1;
5b60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5b70: 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f            wrong_
5b80: 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20  num_args = 1;.  
5b90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
5ba0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f  lse{.        is_
5bb0: 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 69 6e  agg = pDef->xFin
5bc0: 61 6c 69 7a 65 21 3d 30 3b 0a 20 20 20 20 20 20  alize!=0;.      
5bd0: 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
5be0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
5bf0: 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a  UNC_UNLIKELY ){.
5c00: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
5c10: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
5c20: 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 7c 45 50 5f   EP_Unlikely|EP_
5c30: 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Skip);.         
5c40: 20 69 66 28 20 6e 3d 3d 32 20 29 7b 0a 20 20 20   if( n==2 ){.   
5c50: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
5c60: 69 54 61 62 6c 65 20 3d 20 65 78 70 72 50 72 6f  iTable = exprPro
5c70: 62 61 62 69 6c 69 74 79 28 70 4c 69 73 74 2d 3e  bability(pList->
5c80: 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
5c90: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
5ca0: 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a  pr->iTable<0 ){.
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
5cc0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
5cd0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
5ce0: 20 20 20 20 20 20 22 73 65 63 6f 6e 64 20 61 72        "second ar
5cf0: 67 75 6d 65 6e 74 20 74 6f 20 6c 69 6b 65 6c 69  gument to likeli
5d00: 68 6f 6f 64 28 29 20 6d 75 73 74 20 62 65 20 61  hood() must be a
5d10: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
5d20: 20 20 20 22 63 6f 6e 73 74 61 6e 74 20 62 65 74     "constant bet
5d30: 77 65 65 6e 20 30 2e 30 20 61 6e 64 20 31 2e 30  ween 0.0 and 1.0
5d40: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
5d50: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
5d60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5d70: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5d80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49            /* EVI
5d90: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33 30  DENCE-OF: R-6130
5da0: 34 2d 32 39 34 34 39 20 54 68 65 20 75 6e 6c 69  4-29449 The unli
5db0: 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e  kely(X) function
5dc0: 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20   is.            
5dd0: 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  ** equivalent to
5de0: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 20 30   likelihood(X, 0
5df0: 2e 30 36 32 35 29 2e 0a 20 20 20 20 20 20 20 20  .0625)..        
5e00: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
5e10: 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31 31 36 33  OF: R-01283-1163
5e20: 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28 58  6 The unlikely(X
5e30: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  ) function is.  
5e40: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f            ** sho
5e50: 72 74 2d 68 61 6e 64 20 66 6f 72 20 6c 69 6b 65  rt-hand for like
5e60: 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36 32 35 29  lihood(X,0.0625)
5e70: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
5e80: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
5e90: 33 36 38 35 30 2d 33 34 31 32 37 20 54 68 65 20  36850-34127 The 
5ea0: 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69  likely(X) functi
5eb0: 6f 6e 20 69 73 20 73 68 6f 72 74 2d 68 61 6e 64  on is short-hand
5ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
5ed0: 66 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58  for likelihood(X
5ee0: 2c 30 2e 39 33 37 35 29 2e 0a 20 20 20 20 20 20  ,0.9375)..      
5ef0: 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
5f00: 45 2d 4f 46 3a 20 52 2d 35 33 34 33 36 2d 34 30  E-OF: R-53436-40
5f10: 39 37 33 20 54 68 65 20 6c 69 6b 65 6c 79 28 58  973 The likely(X
5f20: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 71  ) function is eq
5f30: 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20  uivalent.       
5f40: 20 20 20 20 20 2a 2a 20 74 6f 20 6c 69 6b 65 6c       ** to likel
5f50: 69 68 6f 6f 64 28 58 2c 30 2e 39 33 37 35 29 2e  ihood(X,0.9375).
5f60: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5f70: 2f 2a 20 54 55 4e 49 4e 47 3a 20 75 6e 6c 69 6b  /* TUNING: unlik
5f80: 65 6c 79 28 29 20 70 72 6f 62 61 62 69 6c 69 74  ely() probabilit
5f90: 79 20 69 73 20 30 2e 30 36 32 35 2e 20 20 6c 69  y is 0.0625.  li
5fa0: 6b 65 6c 79 28 29 20 69 73 20 30 2e 39 33 37 35  kely() is 0.9375
5fb0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
5fc0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
5fd0: 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b 30 5d 3d 3d  pDef->zName[0]==
5fe0: 27 75 27 20 3f 20 38 33 38 38 36 30 38 20 3a 20  'u' ? 8388608 : 
5ff0: 31 32 35 38 32 39 31 32 30 3b 0a 20 20 20 20 20  125829120;.     
6000: 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 20 20       }          
6010: 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 23 69     .        }.#i
6020: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6030: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
6040: 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
6050: 20 20 20 20 69 6e 74 20 61 75 74 68 20 3d 20 73      int auth = s
6060: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
6070: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46  pParse, SQLITE_F
6080: 55 4e 43 54 49 4f 4e 2c 20 30 2c 70 44 65 66 2d  UNCTION, 0,pDef-
6090: 3e 7a 4e 61 6d 65 2c 30 29 3b 0a 20 20 20 20 20  >zName,0);.     
60a0: 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d 53       if( auth!=S
60b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
60c0: 20 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68          if( auth
60d0: 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b  ==SQLITE_DENY ){
60e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
60f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6100: 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 75 74 68  Parse, "not auth
6110: 6f 72 69 7a 65 64 20 74 6f 20 75 73 65 20 66 75  orized to use fu
6120: 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 0a 20 20 20  nction: %s",.   
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6150: 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b     pDef->zName);
6160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
6170: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
6180: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6190: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
61a0: 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20  = TK_NULL;.     
61b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52         return WR
61c0: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20  C_Prune;.       
61d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
61e0: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
61f0: 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
6200: 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43  s & (SQLITE_FUNC
6210: 5f 43 4f 4e 53 54 41 4e 54 7c 53 51 4c 49 54 45  _CONSTANT|SQLITE
6220: 5f 46 55 4e 43 5f 53 4c 4f 43 48 4e 47 29 20 29  _FUNC_SLOCHNG) )
6230: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  {.          /* F
6240: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
6250: 6f 66 20 74 68 65 20 45 50 5f 43 6f 6e 73 74 46  of the EP_ConstF
6260: 75 6e 63 20 66 6c 61 67 2c 20 64 61 74 65 20 61  unc flag, date a
6270: 6e 64 20 74 69 6d 65 0a 20 20 20 20 20 20 20 20  nd time.        
6280: 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61    ** functions a
6290: 6e 64 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  nd other functio
62a0: 6e 73 20 74 68 61 74 20 63 68 61 6e 67 65 20 73  ns that change s
62b0: 6c 6f 77 6c 79 20 61 72 65 20 63 6f 6e 73 69 64  lowly are consid
62c0: 65 72 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ered.          *
62d0: 2a 20 63 6f 6e 73 74 61 6e 74 20 62 65 63 61 75  * constant becau
62e0: 73 65 20 74 68 65 79 20 61 72 65 20 63 6f 6e 73  se they are cons
62f0: 74 61 6e 74 20 66 6f 72 20 74 68 65 20 64 75 72  tant for the dur
6300: 61 74 69 6f 6e 20 6f 66 20 6f 6e 65 20 71 75 65  ation of one que
6310: 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ry */.          
6320: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
6330: 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75  pExpr,EP_ConstFu
6340: 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nc);.        }. 
6350: 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
6360: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
6370: 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41  LITE_FUNC_CONSTA
6380: 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  NT)==0 ){.      
6390: 20 20 20 20 2f 2a 20 44 61 74 65 2f 74 69 6d 65      /* Date/time
63a0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   functions that 
63b0: 75 73 65 20 27 6e 6f 77 27 2c 20 61 6e 64 20 6f  use 'now', and o
63c0: 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 6c  ther functions l
63d0: 69 6b 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ike.          **
63e0: 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28   sqlite_version(
63f0: 29 20 74 68 61 74 20 6d 69 67 68 74 20 63 68 61  ) that might cha
6400: 6e 67 65 20 6f 76 65 72 20 74 69 6d 65 20 63 61  nge over time ca
6410: 6e 6e 6f 74 20 62 65 20 75 73 65 64 0a 20 20 20  nnot be used.   
6420: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20         ** in an 
6430: 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20  index. */.      
6440: 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61      notValid(pPa
6450: 72 73 65 2c 20 70 4e 43 2c 20 22 6e 6f 6e 2d 64  rse, pNC, "non-d
6460: 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e  eterministic fun
6470: 63 74 69 6f 6e 73 22 2c 0a 20 20 20 20 20 20 20  ctions",.       
6480: 20 20 20 20 20 20 20 20 20 20 20 20 4e 43 5f 49              NC_I
6490: 64 78 45 78 70 72 7c 4e 43 5f 50 61 72 74 49 64  dxExpr|NC_PartId
64a0: 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
64b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
64c0: 69 73 5f 61 67 67 20 26 26 20 28 70 4e 43 2d 3e  is_agg && (pNC->
64d0: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 41 6c 6c  ncFlags & NC_All
64e0: 6f 77 41 67 67 29 3d 3d 30 20 29 7b 0a 20 20 20  owAgg)==0 ){.   
64f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
6500: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
6510: 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
6520: 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  e function %.*s(
6530: 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20  )", nId,zId);.  
6540: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
6550: 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  +;.        is_ag
6560: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
6570: 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66  se if( no_such_f
6580: 75 6e 63 20 26 26 20 70 50 61 72 73 65 2d 3e 64  unc && pParse->d
6590: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a  b->init.busy==0.
65a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
65b0: 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c  ABLE_UNKNOWN_SQL
65c0: 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20  _FUNCTION.      
65d0: 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
65e0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 0a  rse->explain==0.
65f0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 29 7b 0a  #endif.      ){.
6600: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
6610: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
6620: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
6630: 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a  n: %.*s", nId, z
6640: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
6650: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
6660: 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f  }else if( wrong_
6670: 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  num_args ){.    
6680: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6690: 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f 6e  Msg(pParse,"wron
66a0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
66b0: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
66c0: 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20  n %.*s()",.     
66d0: 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64          nId, zId
66e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
66f0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nErr++;.      }.
6700: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
6710: 20 29 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20   ) pNC->ncFlags 
6720: 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b  &= ~NC_AllowAgg;
6730: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
6740: 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c 6b  lkExprList(pWalk
6750: 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  er, pList);.    
6760: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
6770: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
6780: 65 78 74 20 2a 70 4e 43 32 20 3d 20 70 4e 43 3b  ext *pNC2 = pNC;
6790: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
67a0: 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43  op = TK_AGG_FUNC
67b0: 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 45  TION;.        pE
67c0: 78 70 72 2d 3e 6f 70 32 20 3d 20 30 3b 0a 20 20  xpr->op2 = 0;.  
67d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43        while( pNC
67e0: 32 20 26 26 20 21 73 71 6c 69 74 65 33 46 75 6e  2 && !sqlite3Fun
67f0: 63 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63  ctionUsesThisSrc
6800: 28 70 45 78 70 72 2c 20 70 4e 43 32 2d 3e 70 53  (pExpr, pNC2->pS
6810: 72 63 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  rcList) ){.     
6820: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2b       pExpr->op2+
6830: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43  +;.          pNC
6840: 32 20 3d 20 70 4e 43 32 2d 3e 70 4e 65 78 74 3b  2 = pNC2->pNext;
6850: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6860: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21     assert( pDef!
6870: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  =0 );.        if
6880: 28 20 70 4e 43 32 20 29 7b 0a 20 20 20 20 20 20  ( pNC2 ){.      
6890: 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
68a0: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 3d 3d  TE_FUNC_MINMAX==
68b0: 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a  NC_MinMaxAgg );.
68c0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
68d0: 73 65 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  se( (pDef->funcF
68e0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
68f0: 4e 43 5f 4d 49 4e 4d 41 58 29 21 3d 30 20 29 3b  NC_MINMAX)!=0 );
6900: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 32 2d  .          pNC2-
6910: 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 48  >ncFlags |= NC_H
6920: 61 73 41 67 67 20 7c 20 28 70 44 65 66 2d 3e 66  asAgg | (pDef->f
6930: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
6940: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 3b 0a  E_FUNC_MINMAX);.
6950: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6960: 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20     pNC->ncFlags 
6970: 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a  |= NC_AllowAgg;.
6980: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
6990: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74   FIX ME:  Comput
69a0: 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  e pExpr->affinit
69b0: 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65  y based on the e
69c0: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a 20  xpected return. 
69d0: 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66 20       ** type of 
69e0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20  the function .  
69f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
6a00: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
6a10: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
6a20: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
6a30: 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  Y.    case TK_SE
6a40: 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LECT:.    case T
6a50: 4b 5f 45 58 49 53 54 53 3a 20 20 74 65 73 74 63  K_EXISTS:  testc
6a60: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
6a70: 54 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23 65 6e  TK_EXISTS );.#en
6a80: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
6a90: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  IN: {.      test
6aa0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
6ab0: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20  =TK_IN );.      
6ac0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
6ad0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
6ae0: 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20  sSelect) ){.    
6af0: 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70      int nRef = p
6b00: 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20  NC->nRef;.      
6b10: 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61 72 73    notValid(pPars
6b20: 65 2c 20 70 4e 43 2c 20 22 73 75 62 71 75 65 72  e, pNC, "subquer
6b30: 69 65 73 22 2c 20 4e 43 5f 49 73 43 68 65 63 6b  ies", NC_IsCheck
6b40: 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49  |NC_PartIdx|NC_I
6b50: 64 78 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  dxExpr);.       
6b60: 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65   sqlite3WalkSele
6b70: 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70  ct(pWalker, pExp
6b80: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20  r->x.pSelect);. 
6b90: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6ba0: 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29  NC->nRef>=nRef )
6bb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 52  ;.        if( nR
6bc0: 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b  ef!=pNC->nRef ){
6bd0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53  .          ExprS
6be0: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
6bf0: 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b  , EP_VarSelect);
6c00: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  .          pNC->
6c10: 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 56 61  ncFlags |= NC_Va
6c20: 72 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  rSelect;.       
6c30: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6c40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
6c50: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
6c60: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 6e 6f 74 56  LE: {.      notV
6c70: 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e 43  alid(pParse, pNC
6c80: 2c 20 22 70 61 72 61 6d 65 74 65 72 73 22 2c 20  , "parameters", 
6c90: 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61  NC_IsCheck|NC_Pa
6ca0: 72 74 49 64 78 7c 4e 43 5f 49 64 78 45 78 70 72  rtIdx|NC_IdxExpr
6cb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6cc0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
6cd0: 4b 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54  K_IS:.    case T
6ce0: 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20  K_ISNOT: {.     
6cf0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 20   Expr *pRight;. 
6d00: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
6d10: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
6d20: 78 70 72 2c 20 45 50 5f 52 65 64 75 63 65 64 29  xpr, EP_Reduced)
6d30: 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e   );.      /* Han
6d40: 64 6c 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  dle special case
6d50: 73 20 6f 66 20 22 78 20 49 53 20 54 52 55 45 22  s of "x IS TRUE"
6d60: 2c 20 22 78 20 49 53 20 46 41 4c 53 45 22 2c 20  , "x IS FALSE", 
6d70: 22 78 20 49 53 20 4e 4f 54 20 54 52 55 45 22 2c  "x IS NOT TRUE",
6d80: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 22 78  .      ** and "x
6d90: 20 49 53 20 4e 4f 54 20 46 41 4c 53 45 22 2e 20   IS NOT FALSE". 
6da0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 52  */.      if( (pR
6db0: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
6dc0: 69 67 68 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  ight)->op==TK_ID
6dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
6de0: 72 63 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72  rc = resolveExpr
6df0: 53 74 65 70 28 70 57 61 6c 6b 65 72 2c 20 70 52  Step(pWalker, pR
6e00: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 69  ight);.        i
6e10: 66 28 20 72 63 3d 3d 57 52 43 5f 41 62 6f 72 74  f( rc==WRC_Abort
6e20: 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62   ) return WRC_Ab
6e30: 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ort;.        if(
6e40: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
6e50: 54 52 55 45 46 41 4c 53 45 20 29 7b 0a 20 20 20  TRUEFALSE ){.   
6e60: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
6e70: 52 69 67 68 74 2d 3e 69 54 61 62 6c 65 3d 3d 30  Right->iTable==0
6e80: 20 7c 7c 20 70 52 69 67 68 74 2d 3e 69 54 61 62   || pRight->iTab
6e90: 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  le==1 );.       
6ea0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
6eb0: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20  pExpr->op;.     
6ec0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
6ed0: 20 54 4b 5f 54 52 55 54 48 3b 0a 20 20 20 20 20   TK_TRUTH;.     
6ee0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
6ef0: 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  Continue;.      
6f00: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6f10: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a    /* Fall thru *
6f20: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  /.    }.    case
6f30: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 0a 20 20 20   TK_BETWEEN:.   
6f40: 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20   case TK_EQ:.   
6f50: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
6f60: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
6f70: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
6f80: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
6f90: 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 7b 0a 20   case TK_GE: {. 
6fa0: 20 20 20 20 20 69 6e 74 20 6e 4c 65 66 74 2c 20       int nLeft, 
6fb0: 6e 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  nRight;.      if
6fc0: 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  ( pParse->db->ma
6fd0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65  llocFailed ) bre
6fe0: 61 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ak;.      assert
6ff0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 21 3d  ( pExpr->pLeft!=
7000: 30 20 29 3b 0a 20 20 20 20 20 20 6e 4c 65 66 74  0 );.      nLeft
7010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
7020: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
7030: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 69 66  pLeft);.      if
7040: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
7050: 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20 20  BETWEEN ){.     
7060: 20 20 20 6e 52 69 67 68 74 20 3d 20 73 71 6c 69     nRight = sqli
7070: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
7080: 65 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  e(pExpr->x.pList
7090: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
70a0: 20 20 20 20 20 20 20 69 66 28 20 6e 52 69 67 68         if( nRigh
70b0: 74 3d 3d 6e 4c 65 66 74 20 29 7b 0a 20 20 20 20  t==nLeft ){.    
70c0: 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20 73        nRight = s
70d0: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
70e0: 53 69 7a 65 28 70 45 78 70 72 2d 3e 78 2e 70 4c  Size(pExpr->x.pL
70f0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
7100: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7120: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
7130: 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20  pRight!=0 );.   
7140: 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20 73 71       nRight = sq
7150: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
7160: 69 7a 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ize(pExpr->pRigh
7170: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
7180: 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 6e 52 69    if( nLeft!=nRi
7190: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 74  ght ){.        t
71a0: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
71b0: 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20  op==TK_EQ );.   
71c0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
71d0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20  Expr->op==TK_NE 
71e0: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
71f0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
7200: 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20  TK_LT );.       
7210: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
7220: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20  ->op==TK_LE );. 
7230: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
7240: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47   pExpr->op==TK_G
7250: 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  T );.        tes
7260: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
7270: 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  ==TK_GE );.     
7280: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
7290: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b  pr->op==TK_IS );
72a0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
72b0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
72c0: 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20  _ISNOT );.      
72d0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
72e0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45  r->op==TK_BETWEE
72f0: 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  N );.        sql
7300: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7310: 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20  rse, "row value 
7320: 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20  misused");.     
7330: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20   }.      break; 
7340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7350: 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45 72  urn (pParse->nEr
7360: 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  r || pParse->db-
7370: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f  >mallocFailed) ?
7380: 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43   WRC_Abort : WRC
7390: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
73a0: 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 61 20  .** pEList is a 
73b0: 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  list of expressi
73c0: 6f 6e 73 20 77 68 69 63 68 20 61 72 65 20 72 65  ons which are re
73d0: 61 6c 6c 79 20 74 68 65 20 72 65 73 75 6c 74 20  ally the result 
73e0: 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 20  set of the.** a 
73f0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
7400: 2e 20 20 70 45 20 69 73 20 61 20 74 65 72 6d 20  .  pE is a term 
7410: 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  in an ORDER BY o
7420: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
7430: 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
7440: 6e 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65  ne checks to see
7450: 20 69 66 20 70 45 20 69 73 20 61 20 73 69 6d 70   if pE is a simp
7460: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 68  le identifier wh
7470: 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73 0a  ich corresponds.
7480: 2a 2a 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d  ** to the AS-nam
7490: 65 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  e of one of the 
74a0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78 70  terms of the exp
74b0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
74c0: 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 69 73  f it is,.** this
74d0: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20   routine return 
74e0: 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65  an integer betwe
74f0: 65 6e 20 31 20 61 6e 64 20 4e 20 77 68 65 72 65  en 1 and N where
7500: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
7510: 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20   of.** elements 
7520: 69 6e 20 70 45 4c 69 73 74 2c 20 63 6f 72 72 65  in pEList, corre
7530: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
7540: 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 20  matching entry. 
7550: 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   If there is.** 
7560: 6e 6f 20 6d 61 74 63 68 2c 20 6f 72 20 69 66 20  no match, or if 
7570: 70 45 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  pE is not a simp
7580: 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 20 74  le identifier, t
7590: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
75a0: 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a  .** return 0..**
75b0: 0a 2a 2a 20 70 45 4c 69 73 74 20 68 61 73 20 62  .** pEList has b
75c0: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 70  een resolved.  p
75d0: 45 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  E has not..*/.st
75e0: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
75f0: 41 73 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  AsName(.  Parse 
7600: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
7610: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
7620: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
7630: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
7640: 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69   *pEList,  /* Li
7650: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
7660: 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45  s to scan */.  E
7670: 78 70 72 20 2a 70 45 20 20 20 20 20 20 20 20 20  xpr *pE         
7680: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
7690: 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
76a0: 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69   match */.){.  i
76b0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
76c0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
76d0: 72 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50  r */..  UNUSED_P
76e0: 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29  ARAMETER(pParse)
76f0: 3b 0a 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d  ;..  if( pE->op=
7700: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 63 68  =TK_ID ){.    ch
7710: 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 45 2d 3e 75  ar *zCol = pE->u
7720: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72  .zToken;.    for
7730: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
7740: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7750: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
7760: 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  EList->a[i].zNam
7770: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 73  e;.      if( zAs
7780: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
7790: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
77a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
77b0: 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20  eturn i+1;.     
77c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
77d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
77e0: 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74 65  * pE is a pointe
77f0: 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  r to an expressi
7800: 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20 73 69  on which is a si
7810: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65  ngle term in the
7820: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 66 20  .** ORDER BY of 
7830: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
7840: 54 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69  T.  The expressi
7850: 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a  on has not been.
7860: 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65 64  ** name resolved
7870: 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 70  ..**.** At the p
7880: 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  oint this routin
7890: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20  e is called, we 
78a0: 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 61  already know tha
78b0: 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42  t the.** ORDER B
78c0: 59 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 6e  Y term is not an
78d0: 20 69 6e 74 65 67 65 72 20 69 6e 64 65 78 20 69   integer index i
78e0: 6e 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 73  nto the result s
78f0: 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63 61 73  et.  That.** cas
7900: 65 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20  e is handled by 
7910: 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
7920: 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d  ine..**.** Attem
7930: 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20 61  pt to match pE a
7940: 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65  gainst result se
7950: 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  t columns in the
7960: 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53 45   left-most.** SE
7970: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
7980: 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
7990: 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68  x i of the match
79a0: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61  ing column,.** a
79b0: 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  s an indication 
79c0: 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  to the caller th
79d0: 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72  at it should sor
79e0: 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f  t by the i-th co
79f0: 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65 66  lumn..** The lef
7a00: 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73  t-most column is
7a10: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f   1.  In other wo
7a20: 72 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20 72  rds, the value r
7a30: 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a  eturned is the.*
7a40: 2a 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20 76  * same integer v
7a50: 61 6c 75 65 20 74 68 61 74 20 77 6f 75 6c 64 20  alue that would 
7a60: 62 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 53  be used in the S
7a70: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  QL statement to 
7a80: 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 65 20  indicate.** the 
7a90: 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  column..**.** If
7aa0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74   there is no mat
7ab0: 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52  ch, return 0.  R
7ac0: 65 74 75 72 6e 20 2d 31 20 69 66 20 61 6e 20 65  eturn -1 if an e
7ad0: 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
7ae0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
7af0: 76 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45  veOrderByTermToE
7b00: 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65  xprList(.  Parse
7b10: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
7b20: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
7b30: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
7b40: 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ges */.  Select 
7b50: 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54  *pSelect,   /* T
7b60: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
7b70: 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52 44  ent with the ORD
7b80: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
7b90: 20 20 45 78 70 72 20 2a 70 45 20 20 20 20 20 20    Expr *pE      
7ba0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
7bb0: 69 66 69 63 20 4f 52 44 45 52 20 42 59 20 74 65  ific ORDER BY te
7bc0: 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  rm */.){.  int i
7bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
7be0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
7bf0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
7c00: 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ist;  /* The col
7c10: 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75  umns of the resu
7c20: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65  lt set */.  Name
7c30: 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f  Context nc;    /
7c40: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
7c50: 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20  or resolving pE 
7c60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
7c70: 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
7c80: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
7c90: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
7ca0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7cb0: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72   code from subpr
7cc0: 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 75 38  ocedures */.  u8
7cd0: 20 73 61 76 65 64 53 75 70 70 45 72 72 3b 20 20   savedSuppErr;  
7ce0: 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20   /* Saved value 
7cf0: 6f 66 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  of db->suppressE
7d00: 72 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rr */..  assert(
7d10: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
7d20: 74 65 67 65 72 28 70 45 2c 20 26 69 29 3d 3d 30  teger(pE, &i)==0
7d30: 20 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70   );.  pEList = p
7d40: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
7d50: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c  .  /* Resolve al
7d60: 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 4f  l names in the O
7d70: 52 44 45 52 20 42 59 20 74 65 72 6d 20 65 78 70  RDER BY term exp
7d80: 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d  ression.  */.  m
7d90: 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73 69  emset(&nc, 0, si
7da0: 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e  zeof(nc));.  nc.
7db0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
7dc0: 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d  .  nc.pSrcList =
7dd0: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a   pSelect->pSrc;.
7de0: 20 20 6e 63 2e 70 45 4c 69 73 74 20 3d 20 70 45    nc.pEList = pE
7df0: 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e 63 46 6c 61  List;.  nc.ncFla
7e00: 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67  gs = NC_AllowAgg
7e10: 3b 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b  ;.  nc.nErr = 0;
7e20: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
7e30: 64 62 3b 0a 20 20 73 61 76 65 64 53 75 70 70 45  db;.  savedSuppE
7e40: 72 72 20 3d 20 64 62 2d 3e 73 75 70 70 72 65 73  rr = db->suppres
7e50: 73 45 72 72 3b 0a 20 20 64 62 2d 3e 73 75 70 70  sErr;.  db->supp
7e60: 72 65 73 73 45 72 72 20 3d 20 31 3b 0a 20 20 72  ressErr = 1;.  r
7e70: 63 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  c = sqlite3Resol
7e80: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 6e 63 2c  veExprNames(&nc,
7e90: 20 70 45 29 3b 0a 20 20 64 62 2d 3e 73 75 70 70   pE);.  db->supp
7ea0: 72 65 73 73 45 72 72 20 3d 20 73 61 76 65 64 53  ressErr = savedS
7eb0: 75 70 70 45 72 72 3b 0a 20 20 69 66 28 20 72 63  uppErr;.  if( rc
7ec0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
7ed0: 2f 2a 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20  /* Try to match 
7ee0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  the ORDER BY exp
7ef0: 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20  ression against 
7f00: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  an expression.  
7f10: 2a 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ** in the result
7f20: 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 61 6e   set.  Return an
7f30: 20 31 2d 62 61 73 65 64 20 69 6e 64 65 78 20 6f   1-based index o
7f40: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 20  f the matching. 
7f50: 20 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65   ** result-set e
7f60: 6e 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ntry..  */.  for
7f70: 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e  (i=0; i<pEList->
7f80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7f90: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
7fa0: 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 4c 69 73  Compare(0, pELis
7fb0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  t->a[i].pExpr, p
7fc0: 45 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20  E, -1)<2 ){.    
7fd0: 20 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20    return i+1;.  
7fe0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
7ff0: 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72   no match, retur
8000: 6e 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  n 0. */.  return
8010: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
8020: 65 72 61 74 65 20 61 6e 20 4f 52 44 45 52 20 42  erate an ORDER B
8030: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 74 65  Y or GROUP BY te
8040: 72 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20  rm out-of-range 
8050: 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
8060: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 4f 75 74   void resolveOut
8070: 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 0a 20 20  OfRangeError(.  
8080: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
8090: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72         /* The er
80a0: 72 6f 72 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f  ror context into
80b0: 20 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20   which to write 
80c0: 74 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63  the error */.  c
80d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
80e0: 2c 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52 22  ,     /* "ORDER"
80f0: 20 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a 20   or "GROUP" */. 
8100: 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
8110: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
8120: 6e 64 65 78 20 28 31 2d 62 61 73 65 64 29 20 6f  ndex (1-based) o
8130: 66 20 74 68 65 20 74 65 72 6d 20 6f 75 74 20 6f  f the term out o
8140: 66 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  f range */.  int
8150: 20 6d 78 20 20 20 20 20 20 20 20 20 20 20 20 20   mx             
8160: 20 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70      /* Largest p
8170: 65 72 6d 69 73 73 69 62 6c 65 20 76 61 6c 75 65  ermissible value
8180: 20 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20 20 73 71   of i */.){.  sq
8190: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
81a0: 61 72 73 65 2c 20 0a 20 20 20 20 22 25 72 20 25  arse, .    "%r %
81b0: 73 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66  s BY term out of
81c0: 20 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20   range - should 
81d0: 62 65 20 22 0a 20 20 20 20 22 62 65 74 77 65 65  be ".    "betwee
81e0: 6e 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2c 20  n 1 and %d", i, 
81f0: 7a 54 79 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a 2f  zType, mx);.}../
8200: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
8210: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
8220: 20 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   in a compound S
8230: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
8240: 20 20 20 4d 6f 64 69 66 79 0a 2a 2a 20 65 61 63     Modify.** eac
8250: 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  h term of the OR
8260: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
8270: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
8280: 67 65 72 20 62 65 74 77 65 65 6e 20 31 0a 2a 2a  ger between 1.**
8290: 20 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20 69   and N where N i
82a0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
82b0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63  columns in the c
82c0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e 0a  ompound SELECT..
82d0: 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74  **.** ORDER BY t
82e0: 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 61 6c  erms that are al
82f0: 72 65 61 64 79 20 61 6e 20 69 6e 74 65 67 65 72  ready an integer
8300: 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e   between 1 and N
8310: 20 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69   are.** unmodifi
8320: 65 64 2e 20 20 4f 52 44 45 52 20 42 59 20 74 65  ed.  ORDER BY te
8330: 72 6d 73 20 74 68 61 74 20 61 72 65 20 69 6e 74  rms that are int
8340: 65 67 65 72 73 20 6f 75 74 73 69 64 65 20 74 68  egers outside th
8350: 65 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 31 20  e range of.** 1 
8360: 74 68 72 6f 75 67 68 20 4e 20 67 65 6e 65 72 61  through N genera
8370: 74 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 4f 52  te an error.  OR
8380: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
8390: 74 20 61 72 65 20 65 78 70 72 65 73 73 69 6f 6e  t are expression
83a0: 73 0a 2a 2a 20 61 72 65 20 6d 61 74 63 68 65 64  s.** are matched
83b0: 20 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20   against result 
83c0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
83d0: 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45  of compound SELE
83e0: 43 54 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20  CT.** beginning 
83f0: 77 69 74 68 20 74 68 65 20 6c 65 66 74 2d 6d 6f  with the left-mo
8400: 73 74 20 53 45 4c 45 43 54 20 61 6e 64 20 77 6f  st SELECT and wo
8410: 72 6b 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65  rking toward the
8420: 20 72 69 67 68 74 2e 0a 2a 2a 20 41 74 20 74 68   right..** At th
8430: 65 20 66 69 72 73 74 20 6d 61 74 63 68 2c 20 74  e first match, t
8440: 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  he ORDER BY expr
8450: 65 73 73 69 6f 6e 20 69 73 20 74 72 61 6e 73 66  ession is transf
8460: 6f 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68  ormed into.** th
8470: 65 20 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e  e integer column
8480: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52   number..**.** R
8490: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
84a0: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e   of errors seen.
84b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
84c0: 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72  esolveCompoundOr
84d0: 64 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a  derBy(.  Parse *
84e0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
84f0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8500: 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20  t.  Leave error 
8510: 6d 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f  messages here */
8520: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
8530: 63 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ct       /* The 
8540: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
8550: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8560: 4f 52 44 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20  ORDER BY */.){. 
8570: 20 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69   int i;.  ExprLi
8580: 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20  st *pOrderBy;.  
8590: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
85a0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
85b0: 0a 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20  .  int moreToDo 
85c0: 3d 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79  = 1;..  pOrderBy
85d0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64   = pSelect->pOrd
85e0: 65 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72 64  erBy;.  if( pOrd
85f0: 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  erBy==0 ) return
8600: 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73   0;.  db = pPars
8610: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4f 72  e->db;.  if( pOr
8620: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d  derBy->nExpr>db-
8630: 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  >aLimit[SQLITE_L
8640: 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a  IMIT_COLUMN] ){.
8650: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8660: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f  Msg(pParse, "too
8670: 20 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f   many terms in O
8680: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 29  RDER BY clause")
8690: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
86a0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
86b0: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
86c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64  ; i++){.    pOrd
86d0: 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20  erBy->a[i].done 
86e0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65  = 0;.  }.  pSele
86f0: 63 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ct->pNext = 0;. 
8700: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d   while( pSelect-
8710: 3e 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70  >pPrior ){.    p
8720: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e  Select->pPrior->
8730: 70 4e 65 78 74 20 3d 20 70 53 65 6c 65 63 74 3b  pNext = pSelect;
8740: 0a 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70  .    pSelect = p
8750: 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a  Select->pPrior;.
8760: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65    }.  while( pSe
8770: 6c 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f  lect && moreToDo
8780: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
8790: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
87a0: 74 65 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44  tem;.    moreToD
87b0: 6f 20 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73  o = 0;.    pELis
87c0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c  t = pSelect->pEL
87d0: 69 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ist;.    assert(
87e0: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20   pEList!=0 );.  
87f0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
8800: 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c  =pOrderBy->a; i<
8810: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
8820: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
8830: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
8840: 20 2d 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20   -1;.      Expr 
8850: 2a 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20  *pE, *pDup;.    
8860: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e    if( pItem->don
8870: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8880: 20 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33      pE = sqlite3
8890: 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28  ExprSkipCollate(
88a0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20  pItem->pExpr);. 
88b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
88c0: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45  ExprIsInteger(pE
88d0: 2c 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  , &iCol) ){.    
88e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20      if( iCol<=0 
88f0: 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e  || iCol>pEList->
8900: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
8910: 20 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52     resolveOutOfR
8920: 61 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65  angeError(pParse
8930: 2c 20 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20  , "ORDER", i+1, 
8940: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a  pEList->nExpr);.
8950: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
8960: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
8970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8980: 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76     iCol = resolv
8990: 65 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  eAsName(pParse, 
89a0: 70 45 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20  pEList, pE);.   
89b0: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30       if( iCol==0
89c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 44   ){.          pD
89d0: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
89e0: 44 75 70 28 64 62 2c 20 70 45 2c 20 30 29 3b 0a  Dup(db, pE, 0);.
89f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 64            if( !d
8a00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8a10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
8a20: 73 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20  ssert(pDup);.   
8a30: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
8a40: 72 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65  resolveOrderByTe
8a50: 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61  rmToExprList(pPa
8a60: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44  rse, pSelect, pD
8a70: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  up);.          }
8a80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
8a90: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
8aa0: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
8ab0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
8ac0: 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20  if( iCol>0 ){.  
8ad0: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74        /* Convert
8ae0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65   the ORDER BY te
8af0: 72 6d 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67  rm into an integ
8b00: 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  er column number
8b10: 20 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 2a   iCol,.        *
8b20: 2a 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f  * taking care to
8b30: 20 70 72 65 73 65 72 76 65 20 74 68 65 20 43 4f   preserve the CO
8b40: 4c 4c 41 54 45 20 63 6c 61 75 73 65 20 69 66 20  LLATE clause if 
8b50: 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  it exists */.   
8b60: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
8b70: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
8b80: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
8b90: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e  ;.        if( pN
8ba0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ew==0 ) return 1
8bb0: 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  ;.        pNew->
8bc0: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56  flags |= EP_IntV
8bd0: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e  alue;.        pN
8be0: 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69  ew->u.iValue = i
8bf0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Col;.        if(
8c00: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70   pItem->pExpr==p
8c10: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  E ){.          p
8c20: 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e  Item->pExpr = pN
8c30: 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ew;.        }els
8c40: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  e{.          Exp
8c50: 72 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 49 74  r *pParent = pIt
8c60: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
8c70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
8c80: 72 65 6e 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  rent->op==TK_COL
8c90: 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20  LATE );.        
8ca0: 20 20 77 68 69 6c 65 28 20 70 50 61 72 65 6e 74    while( pParent
8cb0: 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ->pLeft->op==TK_
8cc0: 43 4f 4c 4c 41 54 45 20 29 20 70 50 61 72 65 6e  COLLATE ) pParen
8cd0: 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65  t = pParent->pLe
8ce0: 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ft;.          as
8cf0: 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70  sert( pParent->p
8d00: 4c 65 66 74 3d 3d 70 45 20 29 3b 0a 20 20 20 20  Left==pE );.    
8d10: 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
8d20: 4c 65 66 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Left = pNew;.   
8d30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
8d40: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
8d50: 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  (db, pE);.      
8d60: 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72    pItem->u.x.iOr
8d70: 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29  derByCol = (u16)
8d80: 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49  iCol;.        pI
8d90: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20  tem->done = 1;. 
8da0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8db0: 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31      moreToDo = 1
8dc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8dd0: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
8de0: 65 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  elect->pNext;.  
8df0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
8e00: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
8e10: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f  i++){.    if( pO
8e20: 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e  rderBy->a[i].don
8e30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
8e40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8e50: 61 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20  arse, "%r ORDER 
8e60: 42 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74  BY term does not
8e70: 20 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20   match any ".   
8e80: 20 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e           "column
8e90: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
8ea0: 65 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  et", i+1);.     
8eb0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
8ec0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
8ed0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
8ee0: 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68  every term in th
8ef0: 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  e ORDER BY or GR
8f00: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 70 4f  OUP BY clause pO
8f10: 72 64 65 72 42 79 20 6f 66 0a 2a 2a 20 74 68 65  rderBy of.** the
8f20: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8f30: 74 20 70 53 65 6c 65 63 74 2e 20 20 49 66 20 61  t pSelect.  If a
8f40: 6e 79 20 74 65 72 6d 20 69 73 20 72 65 66 65 72  ny term is refer
8f50: 65 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 72 65 73  ence to a.** res
8f60: 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69  ult set expressi
8f70: 6f 6e 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65  on (as determine
8f80: 64 20 62 79 20 74 68 65 20 45 78 70 72 4c 69 73  d by the ExprLis
8f90: 74 2e 61 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79  t.a.u.x.iOrderBy
8fa0: 43 6f 6c 0a 2a 2a 20 66 69 65 6c 64 29 20 74 68  Col.** field) th
8fb0: 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20  en convert that 
8fc0: 74 65 72 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79  term into a copy
8fd0: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
8fe0: 6e 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74  nding result set
8ff0: 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a  .** column..**.*
9000: 2a 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20  * If any errors 
9010: 61 72 65 20 64 65 74 65 63 74 65 64 2c 20 61 64  are detected, ad
9020: 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
9030: 67 65 20 74 6f 20 70 50 61 72 73 65 20 61 6e 64  ge to pParse and
9040: 0a 2a 2a 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  .** return non-z
9050: 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ero.  Return zer
9060: 6f 20 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 61  o if no errors a
9070: 72 65 20 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  re seen..*/.int 
9080: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
9090: 64 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61  derGroupBy(.  Pa
90a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
90b0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
90c0: 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65  ontext.  Leave e
90d0: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65  rror messages he
90e0: 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
90f0: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a  pSelect,      /*
9100: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
9110: 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  ement containing
9120: 20 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20   the clause */. 
9130: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
9140: 72 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52  rBy,   /* The OR
9150: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
9160: 42 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  BY clause to be 
9170: 70 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63  processed */.  c
9180: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
9190: 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20       /* "ORDER" 
91a0: 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b  or "GROUP" */.){
91b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
91c0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
91d0: 2d 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74  ->db;.  ExprList
91e0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75   *pEList;.  stru
91f0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
9200: 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20   *pItem;..  if( 
9210: 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70  pOrderBy==0 || p
9220: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
9230: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
9240: 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72   0;.  if( pOrder
9250: 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  By->nExpr>db->aL
9260: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
9270: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
9280: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9290: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
92a0: 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42  ny terms in %s B
92b0: 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65  Y clause", zType
92c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
92d0: 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20  .  }.  pEList = 
92e0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
92f0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73  .  assert( pELis
9300: 74 21 3d 30 20 29 3b 20 20 2f 2a 20 73 71 6c 69  t!=0 );  /* sqli
9310: 74 65 33 53 65 6c 65 63 74 4e 65 77 28 29 20 67  te3SelectNew() g
9320: 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 2a  uarantees this *
9330: 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74  /.  for(i=0, pIt
9340: 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20  em=pOrderBy->a; 
9350: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
9360: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
9370: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  {.    if( pItem-
9380: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
9390: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49   ){.      if( pI
93a0: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
93b0: 79 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  yCol>pEList->nEx
93c0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  pr ){.        re
93d0: 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45  solveOutOfRangeE
93e0: 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54 79  rror(pParse, zTy
93f0: 70 65 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d  pe, i+1, pEList-
9400: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
9410: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
9420: 20 7d 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65   }.      resolve
9430: 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45  Alias(pParse, pE
9440: 4c 69 73 74 2c 20 70 49 74 65 6d 2d 3e 75 2e 78  List, pItem->u.x
9450: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 2c 20  .iOrderByCol-1, 
9460: 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 0a 20 20  pItem->pExpr,.  
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9480: 20 7a 54 79 70 65 2c 30 29 3b 0a 20 20 20 20 7d   zType,0);.    }
9490: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
94a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f 72 64 65 72  .}../*.** pOrder
94b0: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
94c0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
94d0: 61 75 73 65 20 69 6e 20 53 45 4c 45 43 54 20 73  ause in SELECT s
94e0: 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 74  tatement pSelect
94f0: 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d 65 20 63 6f  ..** The Name co
9500: 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c  ntext of the SEL
9510: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
9520: 20 70 4e 43 2e 20 20 7a 54 79 70 65 20 69 73 20   pNC.  zType is 
9530: 65 69 74 68 65 72 0a 2a 2a 20 22 4f 52 44 45 52  either.** "ORDER
9540: 22 20 6f 72 20 22 47 52 4f 55 50 22 20 64 65 70  " or "GROUP" dep
9550: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
9560: 74 79 70 65 20 6f 66 20 63 6c 61 75 73 65 20 70  type of clause p
9570: 4f 72 64 65 72 42 79 20 69 73 2e 0a 2a 2a 0a 2a  OrderBy is..**.*
9580: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
9590: 65 73 6f 6c 76 65 73 20 65 61 63 68 20 74 65 72  esolves each ter
95a0: 6d 20 6f 66 20 74 68 65 20 63 6c 61 75 73 65 20  m of the clause 
95b0: 69 6e 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  into an expressi
95c0: 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72  on..** If the or
95d0: 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61  der-by term is a
95e0: 6e 20 69 6e 74 65 67 65 72 20 49 20 62 65 74 77  n integer I betw
95f0: 65 65 6e 20 31 20 61 6e 64 20 4e 20 28 77 68 65  een 1 and N (whe
9600: 72 65 20 4e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  re N is the.** n
9610: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9620: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
9630: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
9640: 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  ) then the expre
9650: 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ssion.** in the 
9660: 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 61 20  resolution is a 
9670: 63 6f 70 79 20 6f 66 20 74 68 65 20 49 2d 74 68  copy of the I-th
9680: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
9690: 65 73 73 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 74  ession.  If.** t
96a0: 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d  he order-by term
96b0: 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 69 65   is an identifie
96c0: 72 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  r that correspon
96d0: 64 73 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d  ds to the AS-nam
96e0: 65 20 6f 66 0a 2a 2a 20 61 20 72 65 73 75 6c 74  e of.** a result
96f0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2c  -set expression,
9700: 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 72   then the term r
9710: 65 73 6f 6c 76 65 73 20 74 6f 20 61 20 63 6f 70  esolves to a cop
9720: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 73 75  y of the.** resu
9730: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
9740: 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  n.  Otherwise, t
9750: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9760: 20 72 65 73 6f 6c 76 65 64 20 69 6e 0a 2a 2a 20   resolved in.** 
9770: 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 2d 20  the usual way - 
9780: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65 73  using sqlite3Res
9790: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e  olveExprNames().
97a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
97b0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
97c0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
97d0: 2e 20 20 49 66 20 65 72 72 6f 72 73 20 6f 63 63  .  If errors occ
97e0: 75 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 61  ur, then.** an a
97f0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
9800: 20 6d 65 73 73 61 67 65 20 6d 69 67 68 74 20 62   message might b
9810: 65 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65  e left in pParse
9820: 2e 20 20 28 4f 4f 4d 20 65 72 72 6f 72 73 0a 2a  .  (OOM errors.*
9830: 2a 20 65 78 63 65 70 74 65 64 2e 29 0a 2a 2f 0a  * excepted.).*/.
9840: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
9850: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a  veOrderGroupBy(.
9860: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
9870: 4e 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  NC,     /* The n
9880: 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
9890: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
98a0: 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ent */.  Select 
98b0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f  *pSelect,      /
98c0: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
98d0: 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67 20 70  tement holding p
98e0: 4f 72 64 65 72 42 79 20 2a 2f 0a 20 20 45 78 70  OrderBy */.  Exp
98f0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
9900: 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
9910: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
9920: 61 75 73 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  ause to resolve 
9930: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
9940: 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45 69  *zType     /* Ei
9950: 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72 20  ther "ORDER" or 
9960: 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70 72  "GROUP", as appr
9970: 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opriate */.){.  
9980: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
99a0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
99b0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
99e0: 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  mber */.  struct
99f0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
9a00: 70 49 74 65 6d 3b 20 20 20 2f 2a 20 41 20 74 65  pItem;   /* A te
9a10: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
9a20: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 50  BY clause */.  P
9a30: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9a50: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9a60: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c   */.  int nResul
9a70: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
9a80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9a90: 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72  f terms in the r
9aa0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
9ab0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
9ac0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52  ) return 0;.  nR
9ad0: 65 73 75 6c 74 20 3d 20 70 53 65 6c 65 63 74 2d  esult = pSelect-
9ae0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
9af0: 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e    pParse = pNC->
9b00: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
9b10: 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
9b20: 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79  y->a; i<pOrderBy
9b30: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
9b40: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
9b50: 20 2a 70 45 20 3d 20 70 49 74 65 6d 2d 3e 70 45   *pE = pItem->pE
9b60: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
9b70: 45 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  E2 = sqlite3Expr
9b80: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 29 3b  SkipCollate(pE);
9b90: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30  .    if( zType[0
9ba0: 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 20 20  ]!='G' ){.      
9bb0: 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73  iCol = resolveAs
9bc0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 53 65  Name(pParse, pSe
9bd0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 45  lect->pEList, pE
9be0: 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  2);.      if( iC
9bf0: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol>0 ){.        
9c00: 2f 2a 20 49 66 20 61 6e 20 41 53 2d 6e 61 6d 65  /* If an AS-name
9c10: 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
9c20: 20 6d 61 72 6b 20 74 68 69 73 20 4f 52 44 45 52   mark this ORDER
9c30: 20 42 59 20 63 6f 6c 75 6d 6e 20 61 73 20 62 65   BY column as be
9c40: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
9c50: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
9c60: 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20  l-th result-set 
9c70: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 73 75 62  column.  The sub
9c80: 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0a  sequent call to.
9c90: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
9ca0: 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
9cb0: 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e  oupBy() will con
9cc0: 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73  vert the express
9cd0: 69 6f 6e 20 74 6f 20 61 0a 20 20 20 20 20 20 20  ion to a.       
9ce0: 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
9cf0: 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73  iCol-th result-s
9d00: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a  et expression. *
9d10: 2f 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  /.        pItem-
9d20: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
9d30: 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20   = (u16)iCol;.  
9d40: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
9d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9d60: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
9d70: 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20  rIsInteger(pE2, 
9d80: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
9d90: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
9da0: 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65 67  term is an integ
9db0: 65 72 20 63 6f 6e 73 74 61 6e 74 2e 20 20 41 67  er constant.  Ag
9dc0: 61 69 6e 2c 20 73 65 74 20 74 68 65 20 63 6f 6c  ain, set the col
9dd0: 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d  umn.      ** num
9de0: 62 65 72 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ber so that sqli
9df0: 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
9e00: 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f  roupBy() will co
9e10: 6e 76 65 72 74 20 74 68 65 0a 20 20 20 20 20 20  nvert the.      
9e20: 2a 2a 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d  ** order-by term
9e30: 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68   to a copy of th
9e40: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  e result-set exp
9e50: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
9e60: 20 69 66 28 20 69 43 6f 6c 3c 31 20 7c 7c 20 69   if( iCol<1 || i
9e70: 43 6f 6c 3e 30 78 66 66 66 66 20 29 7b 0a 20 20  Col>0xffff ){.  
9e80: 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 74        resolveOut
9e90: 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50 61  OfRangeError(pPa
9ea0: 72 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31 2c  rse, zType, i+1,
9eb0: 20 6e 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20   nResult);.     
9ec0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
9ed0: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d     }.      pItem
9ee0: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
9ef0: 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20  l = (u16)iCol;. 
9f00: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
9f10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 68     }..    /* Oth
9f20: 65 72 77 69 73 65 2c 20 74 72 65 61 74 20 74 68  erwise, treat th
9f30: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
9f40: 61 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 65  as an ordinary e
9f50: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
9f60: 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
9f70: 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  erByCol = 0;.   
9f80: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
9f90: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e 43  lveExprNames(pNC
9fa0: 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72  , pE) ){.      r
9fb0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
9fc0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53     for(j=0; j<pS
9fd0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
9fe0: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
9ff0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
a000: 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 2c 20  rCompare(0, pE, 
a010: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
a020: 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31 29  >a[j].pExpr, -1)
a030: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
a040: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
a050: 42 79 43 6f 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20  ByCol = j+1;.   
a060: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a070: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 52   return sqlite3R
a080: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
a090: 42 79 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  By(pParse, pSele
a0a0: 63 74 2c 20 70 4f 72 64 65 72 42 79 2c 20 7a 54  ct, pOrderBy, zT
a0b0: 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ype);.}../*.** R
a0c0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
a0d0: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
a0e0: 6d 65 6e 74 20 70 20 61 6e 64 20 61 6c 6c 20 6f  ment p and all o
a0f0: 66 20 69 74 73 20 64 65 73 63 65 6e 64 61 6e 74  f its descendant
a100: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
a110: 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74   resolveSelectSt
a120: 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ep(Walker *pWalk
a130: 65 72 2c 20 53 65 6c 65 63 74 20 2a 70 29 7b 0a  er, Select *p){.
a140: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
a150: 4f 75 74 65 72 4e 43 3b 20 20 2f 2a 20 43 6f 6e  OuterNC;  /* Con
a160: 74 65 78 74 20 74 68 61 74 20 63 6f 6e 74 61 69  text that contai
a170: 6e 73 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  ns this SELECT *
a180: 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  /.  NameContext 
a190: 73 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  sNC;        /* N
a1a0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
a1b0: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
a1c0: 69 6e 74 20 69 73 43 6f 6d 70 6f 75 6e 64 3b 20  int isCompound; 
a1d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
a1e0: 69 66 20 70 20 69 73 20 61 20 63 6f 6d 70 6f 75  if p is a compou
a1f0: 6e 64 20 73 65 6c 65 63 74 20 2a 2f 0a 20 20 69  nd select */.  i
a200: 6e 74 20 6e 43 6f 6d 70 6f 75 6e 64 3b 20 20 20  nt nCompound;   
a210: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a220: 20 6f 66 20 63 6f 6d 70 6f 75 6e 64 20 74 65 72   of compound ter
a230: 6d 73 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20  ms processed so 
a240: 66 61 72 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  far */.  Parse *
a250: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
a260: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
a270: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ext */.  int i; 
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
a2a0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
a2b0: 70 47 72 6f 75 70 42 79 3b 20 20 20 20 20 2f 2a  pGroupBy;     /*
a2c0: 20 54 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c   The GROUP BY cl
a2d0: 61 75 73 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ause */.  Select
a2e0: 20 2a 70 4c 65 66 74 6d 6f 73 74 3b 20 20 20 20   *pLeftmost;    
a2f0: 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 6f    /* Left-most o
a300: 66 20 53 45 4c 45 43 54 20 6f 66 20 61 20 63 6f  f SELECT of a co
a310: 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20 73 71 6c 69  mpound */.  sqli
a320: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
a330: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
a340: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
a350: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
a360: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 65 6c   );.  if( p->sel
a370: 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c  Flags & SF_Resol
a380: 76 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ved ){.    retur
a390: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d  n WRC_Prune;.  }
a3a0: 0a 20 20 70 4f 75 74 65 72 4e 43 20 3d 20 70 57  .  pOuterNC = pW
a3b0: 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
a3c0: 70 50 61 72 73 65 20 3d 20 70 57 61 6c 6b 65 72  pParse = pWalker
a3d0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 64 62 20 3d  ->pParse;.  db =
a3e0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
a3f0: 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20 73 71 6c 69  /* Normally sqli
a400: 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
a410: 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  ) will be called
a420: 20 66 69 72 73 74 20 61 6e 64 20 77 69 6c 6c 20   first and will 
a430: 68 61 76 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64  have.  ** alread
a440: 79 20 65 78 70 61 6e 64 65 64 20 74 68 69 73 20  y expanded this 
a450: 53 45 4c 45 43 54 2e 20 20 48 6f 77 65 76 65 72  SELECT.  However
a460: 2c 20 69 66 20 74 68 69 73 20 69 73 20 61 20 73  , if this is a s
a470: 75 62 71 75 65 72 79 20 77 69 74 68 69 6e 0a 20  ubquery within. 
a480: 20 2a 2a 20 61 6e 20 65 78 70 72 65 73 73 69 6f   ** an expressio
a490: 6e 2c 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  n, sqlite3Resolv
a4a0: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 77 69 6c  eExprNames() wil
a4b0: 6c 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68  l be called with
a4c0: 6f 75 74 20 61 0a 20 20 2a 2a 20 70 72 69 6f 72  out a.  ** prior
a4d0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a4e0: 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 2e 20  SelectExpand(). 
a4f0: 20 57 68 65 6e 20 74 68 61 74 20 68 61 70 70 65   When that happe
a500: 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a 20 73 71 6c  ns, let.  ** sql
a510: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 29  ite3SelectPrep()
a520: 20 64 6f 20 61 6c 6c 20 6f 66 20 74 68 65 20 70   do all of the p
a530: 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 74 68  rocessing for th
a540: 69 73 20 53 45 4c 45 43 54 2e 0a 20 20 2a 2a 20  is SELECT..  ** 
a550: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
a560: 70 28 29 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20  p() will invoke 
a570: 62 6f 74 68 20 73 71 6c 69 74 65 33 53 65 6c 65  both sqlite3Sele
a580: 63 74 45 78 70 61 6e 64 28 29 20 61 6e 64 0a 20  ctExpand() and. 
a590: 20 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65   ** this routine
a5a0: 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
a5b0: 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  order..  */.  if
a5c0: 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  ( (p->selFlags &
a5d0: 20 53 46 5f 45 78 70 61 6e 64 65 64 29 3d 3d 30   SF_Expanded)==0
a5e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
a5f0: 65 6c 65 63 74 50 72 65 70 28 70 50 61 72 73 65  electPrep(pParse
a600: 2c 20 70 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a  , p, pOuterNC);.
a610: 20 20 20 20 72 65 74 75 72 6e 20 28 70 50 61 72      return (pPar
a620: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
a630: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20  mallocFailed) ? 
a640: 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f  WRC_Abort : WRC_
a650: 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a 20 20 69 73  Prune;.  }..  is
a660: 43 6f 6d 70 6f 75 6e 64 20 3d 20 70 2d 3e 70 50  Compound = p->pP
a670: 72 69 6f 72 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70  rior!=0;.  nComp
a680: 6f 75 6e 64 20 3d 20 30 3b 0a 20 20 70 4c 65 66  ound = 0;.  pLef
a690: 74 6d 6f 73 74 20 3d 20 70 3b 0a 20 20 77 68 69  tmost = p;.  whi
a6a0: 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73  le( p ){.    ass
a6b0: 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
a6c0: 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64 29  s & SF_Expanded)
a6d0: 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
a6e0: 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20  t( (p->selFlags 
a6f0: 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 3d 3d  & SF_Resolved)==
a700: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 73 65 6c 46  0 );.    p->selF
a710: 6c 61 67 73 20 7c 3d 20 53 46 5f 52 65 73 6f 6c  lags |= SF_Resol
a720: 76 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73  ved;..    /* Res
a730: 6f 6c 76 65 20 74 68 65 20 65 78 70 72 65 73 73  olve the express
a740: 69 6f 6e 73 20 69 6e 20 74 68 65 20 4c 49 4d 49  ions in the LIMI
a750: 54 20 61 6e 64 20 4f 46 46 53 45 54 20 63 6c 61  T and OFFSET cla
a760: 75 73 65 73 2e 20 54 68 65 73 65 0a 20 20 20 20  uses. These.    
a770: 2a 2a 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  ** are not allow
a780: 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
a790: 6e 79 20 6e 61 6d 65 73 2c 20 73 6f 20 70 61 73  ny names, so pas
a7a0: 73 20 61 6e 20 65 6d 70 74 79 20 4e 61 6d 65 43  s an empty NameC
a7b0: 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20  ontext..    */. 
a7c0: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
a7d0: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
a7e0: 0a 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20  .    sNC.pParse 
a7f0: 3d 20 70 50 61 72 73 65 3b 0a 20 20 20 20 69 66  = pParse;.    if
a800: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
a810: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
a820: 70 2d 3e 70 4c 69 6d 69 74 29 20 29 7b 0a 20 20  p->pLimit) ){.  
a830: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
a840: 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  bort;.    }..   
a850: 20 2f 2a 20 49 66 20 74 68 65 20 53 46 5f 43 6f   /* If the SF_Co
a860: 6e 76 65 72 74 65 64 20 66 6c 61 67 73 20 69 73  nverted flags is
a870: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
a880: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 77 61  Select object wa
a890: 73 0a 20 20 20 20 2a 2a 20 77 61 73 20 63 72 65  s.    ** was cre
a8a0: 61 74 65 64 20 62 79 20 74 68 65 20 63 6f 6e 76  ated by the conv
a8b0: 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
a8c0: 74 54 6f 53 75 62 71 75 65 72 79 28 29 20 66 75  tToSubquery() fu
a8d0: 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 49  nction..    ** I
a8e0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
a8f0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
a900: 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 73 68  (p->pOrderBy) sh
a910: 6f 75 6c 64 20 62 65 20 72 65 73 6f 6c 76 65 64  ould be resolved
a920: 0a 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74  .    ** as if it
a930: 20 77 65 72 65 20 70 61 72 74 20 6f 66 20 74 68   were part of th
a940: 65 20 73 75 62 2d 71 75 65 72 79 2c 20 6e 6f 74  e sub-query, not
a950: 20 74 68 65 20 70 61 72 65 6e 74 2e 20 54 68 69   the parent. Thi
a960: 73 20 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 6d  s block.    ** m
a970: 6f 76 65 73 20 74 68 65 20 70 4f 72 64 65 72 42  oves the pOrderB
a980: 79 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 73 75  y down to the su
a990: 62 2d 71 75 65 72 79 2e 20 49 74 20 77 69 6c 6c  b-query. It will
a9a0: 20 62 65 20 6d 6f 76 65 64 20 62 61 63 6b 0a 20   be moved back. 
a9b0: 20 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20     ** after the 
a9c0: 6e 61 6d 65 73 20 68 61 76 65 20 62 65 65 6e 20  names have been 
a9d0: 72 65 73 6f 6c 76 65 64 2e 20 20 2a 2f 0a 20 20  resolved.  */.  
a9e0: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
a9f0: 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64  s & SF_Converted
aa00: 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
aa10: 20 2a 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63   *pSub = p->pSrc
aa20: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
aa30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
aa40: 3e 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 26  >pSrc->nSrc==1 &
aa50: 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  & p->pOrderBy );
aa60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
aa70: 53 75 62 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  Sub->pPrior && p
aa80: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  Sub->pOrderBy==0
aa90: 20 29 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e   );.      pSub->
aaa0: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
aab0: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d  rderBy;.      p-
aac0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
aad0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52     }.  .    /* R
aae0: 65 63 75 72 73 69 76 65 6c 79 20 72 65 73 6f 6c  ecursively resol
aaf0: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
ab00: 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 2a  subqueries.    *
ab10: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
ab20: 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20  <p->pSrc->nSrc; 
ab30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
ab40: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
ab50: 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72  *pItem = &p->pSr
ab60: 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  c->a[i];.      i
ab70: 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
ab80: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d  t ){.        Nam
ab90: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20  eContext *pNC;  
aba0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
abb0: 6f 20 69 74 65 72 61 74 65 20 6e 61 6d 65 20 63  o iterate name c
abc0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20  ontexts */.     
abd0: 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 30 3b     int nRef = 0;
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
abf0: 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 70 4f 75  Refcount for pOu
ac00: 74 65 72 4e 43 20 61 6e 64 20 6f 75 74 65 72 20  terNC and outer 
ac10: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20  contexts */.    
ac20: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
ac30: 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 20 3d 20  zSavedContext = 
ac40: 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
ac50: 74 65 78 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f  text;..        /
ac60: 2a 20 43 6f 75 6e 74 20 74 68 65 20 74 6f 74 61  * Count the tota
ac70: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  l number of refe
ac80: 72 65 6e 63 65 73 20 74 6f 20 70 4f 75 74 65 72  rences to pOuter
ac90: 4e 43 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  NC and all of it
aca0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72  s.        ** par
acb0: 65 6e 74 20 63 6f 6e 74 65 78 74 73 2e 20 41 66  ent contexts. Af
acc0: 74 65 72 20 72 65 73 6f 6c 76 69 6e 67 20 72 65  ter resolving re
acd0: 66 65 72 65 6e 63 65 73 20 74 6f 20 65 78 70 72  ferences to expr
ace0: 65 73 73 69 6f 6e 73 20 69 6e 0a 20 20 20 20 20  essions in.     
acf0: 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 70 53 65     ** pItem->pSe
ad00: 6c 65 63 74 2c 20 63 68 65 63 6b 20 69 66 20 74  lect, check if t
ad10: 68 69 73 20 76 61 6c 75 65 20 68 61 73 20 63 68  his value has ch
ad20: 61 6e 67 65 64 2e 20 49 66 20 73 6f 2c 20 74 68  anged. If so, th
ad30: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 45  en.        ** SE
ad40: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
ad50: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 6d 75  Item->pSelect mu
ad60: 73 74 20 62 65 20 63 6f 72 72 65 6c 61 74 65 64  st be correlated
ad70: 2e 20 53 65 74 20 74 68 65 0a 20 20 20 20 20 20  . Set the.      
ad80: 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 66 67 2e 69    ** pItem->fg.i
ad90: 73 43 6f 72 72 65 6c 61 74 65 64 20 66 6c 61 67  sCorrelated flag
ada0: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
adb0: 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  case. */.       
adc0: 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e   for(pNC=pOuterN
add0: 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d  C; pNC; pNC=pNC-
ade0: 3e 70 4e 65 78 74 29 20 6e 52 65 66 20 2b 3d 20  >pNext) nRef += 
adf0: 70 4e 43 2d 3e 6e 52 65 66 3b 0a 0a 20 20 20 20  pNC->nRef;..    
ae00: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
ae10: 4e 61 6d 65 20 29 20 70 50 61 72 73 65 2d 3e 7a  Name ) pParse->z
ae20: 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
ae30: 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
ae40: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
ae50: 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
ae60: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
ae70: 6c 65 63 74 2c 20 70 4f 75 74 65 72 4e 43 29 3b  lect, pOuterNC);
ae80: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
ae90: 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
aea0: 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 3b 0a 20  zSavedContext;. 
aeb0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
aec0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
aed0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
aee0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
aef0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4e 43  .        for(pNC
af00: 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20  =pOuterNC; pNC; 
af10: 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20  pNC=pNC->pNext) 
af20: 6e 52 65 66 20 2d 3d 20 70 4e 43 2d 3e 6e 52 65  nRef -= pNC->nRe
af30: 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  f;.        asser
af40: 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43  t( pItem->fg.isC
af50: 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 26 26 20  orrelated==0 && 
af60: 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20 20 20 20  nRef<=0 );.     
af70: 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43     pItem->fg.isC
af80: 6f 72 72 65 6c 61 74 65 64 20 3d 20 28 6e 52 65  orrelated = (nRe
af90: 66 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  f!=0);.      }. 
afa0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53     }.  .    /* S
afb0: 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20  et up the local 
afc0: 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
afd0: 70 61 73 73 20 74 6f 20 73 71 6c 69 74 65 33 52  pass to sqlite3R
afe0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
aff0: 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73 6f  ) to.    ** reso
b000: 6c 76 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73  lve the result-s
b010: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  et expression li
b020: 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  st..    */.    s
b030: 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f  NC.ncFlags = NC_
b040: 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 73 4e  AllowAgg;.    sN
b050: 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e  C.pSrcList = p->
b060: 70 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e  pSrc;.    sNC.pN
b070: 65 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a  ext = pOuterNC;.
b080: 20 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76    .    /* Resolv
b090: 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72  e names in the r
b0a0: 65 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20  esult set. */.  
b0b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
b0c0: 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65  olveExprListName
b0d0: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 45 4c 69 73  s(&sNC, p->pELis
b0e0: 74 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  t) ) return WRC_
b0f0: 41 62 6f 72 74 3b 0a 20 20 0a 20 20 20 20 2f 2a  Abort;.  .    /*
b100: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
b110: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
b120: 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
b130: 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
b140: 52 4f 55 50 20 42 59 20 0a 20 20 20 20 2a 2a 20  ROUP BY .    ** 
b150: 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e  expression, do n
b160: 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61  ot allow aggrega
b170: 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  tes in any of th
b180: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
b190: 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
b1a0: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
b1b0: 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
b1c0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ate)==0 );.    p
b1d0: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
b1e0: 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 70  oupBy;.    if( p
b1f0: 47 72 6f 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e  GroupBy || (sNC.
b200: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73  ncFlags & NC_Has
b210: 41 67 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Agg)!=0 ){.     
b220: 20 61 73 73 65 72 74 28 20 4e 43 5f 4d 69 6e 4d   assert( NC_MinM
b230: 61 78 41 67 67 3d 3d 53 46 5f 4d 69 6e 4d 61 78  axAgg==SF_MinMax
b240: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Agg );.      p->
b250: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
b260: 67 67 72 65 67 61 74 65 20 7c 20 28 73 4e 43 2e  ggregate | (sNC.
b270: 6e 63 46 6c 61 67 73 26 4e 43 5f 4d 69 6e 4d 61  ncFlags&NC_MinMa
b280: 78 41 67 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  xAgg);.    }else
b290: 7b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  {.      sNC.ncFl
b2a0: 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77  ags &= ~NC_Allow
b2b0: 41 67 67 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Agg;.    }.  .  
b2c0: 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47    /* If a HAVING
b2d0: 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65   clause is prese
b2e0: 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  nt, then there m
b2f0: 75 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42  ust be a GROUP B
b300: 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
b310: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76  .    if( p->pHav
b320: 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79  ing && !pGroupBy
b330: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
b340: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
b350: 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
b360: 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
b370: 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
b380: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
b390: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
b3a0: 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68    .    /* Add th
b3b0: 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20  e output column 
b3c0: 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
b3d0: 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
b3e0: 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 20 20  parsing the.    
b3f0: 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ** other express
b400: 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ions in the SELE
b410: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
b420: 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20  is is so that.  
b430: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
b440: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
b450: 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
b460: 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
b470: 69 6f 6e 73 20 62 79 0a 20 20 20 20 2a 2a 20 61  ions by.    ** a
b480: 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65  liases in the re
b490: 73 75 6c 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a  sult set..    **
b4a0: 0a 20 20 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  .    ** Minor po
b4b0: 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
b4c0: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
b4d0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
b4e0: 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d  ll be.    ** re-
b4f0: 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61  evaluated for ea
b500: 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ch reference to 
b510: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  it..    */.    s
b520: 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70  NC.pEList = p->p
b530: 45 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 73  EList;.    if( s
b540: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
b550: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  rNames(&sNC, p->
b560: 70 48 61 76 69 6e 67 29 20 29 20 72 65 74 75 72  pHaving) ) retur
b570: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
b580: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
b590: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
b5a0: 43 2c 20 70 2d 3e 70 57 68 65 72 65 29 20 29 20  C, p->pWhere) ) 
b5b0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
b5c0: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76  ;..    /* Resolv
b5d0: 65 20 6e 61 6d 65 73 20 69 6e 20 74 61 62 6c 65  e names in table
b5e0: 2d 76 61 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e  -valued-function
b5f0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
b600: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
b610: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
b620: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
b630: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
b640: 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
b650: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
b660: 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
b670: 6e 63 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  nc.       && sql
b680: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c  ite3ResolveExprL
b690: 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  istNames(&sNC, p
b6a0: 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
b6b0: 67 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  g) .      ){.   
b6c0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
b6d0: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20  Abort;.      }. 
b6e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65     }..    /* The
b6f0: 20 4f 52 44 45 52 20 42 59 20 61 6e 64 20 47 52   ORDER BY and GR
b700: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 73 20 6d  OUP BY clauses m
b710: 61 79 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  ay not refer to 
b720: 74 65 72 6d 73 20 69 6e 0a 20 20 20 20 2a 2a 20  terms in.    ** 
b730: 6f 75 74 65 72 20 71 75 65 72 69 65 73 20 0a 20  outer queries . 
b740: 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 4e     */.    sNC.pN
b750: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 73 4e 43  ext = 0;.    sNC
b760: 2e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41  .ncFlags |= NC_A
b770: 6c 6c 6f 77 41 67 67 3b 0a 0a 20 20 20 20 2f 2a  llowAgg;..    /*
b780: 20 49 66 20 74 68 69 73 20 69 73 20 61 20 63 6f   If this is a co
b790: 6e 76 65 72 74 65 64 20 63 6f 6d 70 6f 75 6e 64  nverted compound
b7a0: 20 71 75 65 72 79 2c 20 6d 6f 76 65 20 74 68 65   query, move the
b7b0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
b7c0: 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74 68   from .    ** th
b7d0: 65 20 73 75 62 2d 71 75 65 72 79 20 62 61 63 6b  e sub-query back
b7e0: 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 71   to the parent q
b7f0: 75 65 72 79 2e 20 41 74 20 74 68 69 73 20 70 6f  uery. At this po
b800: 69 6e 74 20 65 61 63 68 20 74 65 72 6d 0a 20 20  int each term.  
b810: 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20    ** within the 
b820: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
b830: 68 61 73 20 62 65 65 6e 20 74 72 61 6e 73 66 6f  has been transfo
b840: 72 6d 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67  rmed to an integ
b850: 65 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a 2a  er value..    **
b860: 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 73 20   These integers 
b870: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
b880: 20 62 79 20 63 6f 70 69 65 73 20 6f 66 20 74 68   by copies of th
b890: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
b8a0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65  result.    ** se
b8b0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  t expressions by
b8c0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65 73   the call to res
b8d0: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
b8e0: 28 29 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  () below.  */.  
b8f0: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
b900: 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64  s & SF_Converted
b910: 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
b920: 20 2a 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63   *pSub = p->pSrc
b930: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
b940: 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72 42        p->pOrderB
b950: 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65 72  y = pSub->pOrder
b960: 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e  By;.      pSub->
b970: 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
b980: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 63    }..    /* Proc
b990: 65 73 73 20 74 68 65 20 4f 52 44 45 52 20 42 59  ess the ORDER BY
b9a0: 20 63 6c 61 75 73 65 20 66 6f 72 20 73 69 6e 67   clause for sing
b9b0: 6c 65 74 6f 6e 20 53 45 4c 45 43 54 20 73 74 61  leton SELECT sta
b9c0: 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2a 20  tements..    ** 
b9d0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
b9e0: 75 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e 64  use for compound
b9f0: 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  s SELECT stateme
ba00: 6e 74 73 20 69 73 20 68 61 6e 64 6c 65 64 0a 20  nts is handled. 
ba10: 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61 66 74     ** below, aft
ba20: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65  er all of the re
ba30: 73 75 6c 74 2d 73 65 74 73 20 66 6f 72 20 61 6c  sult-sets for al
ba40: 6c 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e 74  l of the element
ba50: 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  s of.    ** the 
ba60: 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65  compound have be
ba70: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20  en resolved..   
ba80: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
ba90: 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
baa0: 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 74  BY clause on a t
bab0: 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  erm of a compoun
bac0: 64 2d 73 65 6c 65 63 74 20 6f 74 68 65 72 0a 20  d-select other. 
bad0: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 72     ** than the r
bae0: 69 67 68 74 2d 6d 6f 73 74 20 74 65 72 6d 2c 20  ight-most term, 
baf0: 74 68 65 6e 20 74 68 61 74 20 69 73 20 61 20 73  then that is a s
bb00: 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 20 42 75  yntax error.  Bu
bb10: 74 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  t the error.    
bb20: 2a 2a 20 69 73 20 6e 6f 74 20 64 65 74 65 63 74  ** is not detect
bb30: 65 64 20 75 6e 74 69 6c 20 6d 75 63 68 20 6c 61  ed until much la
bb40: 74 65 72 2c 20 61 6e 64 20 73 6f 20 77 65 20 6e  ter, and so we n
bb50: 65 65 64 20 74 6f 20 67 6f 20 61 68 65 61 64 20  eed to go ahead 
bb60: 61 6e 64 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c  and.    ** resol
bb70: 76 65 20 74 68 6f 73 65 20 73 79 6d 62 6f 6c 73  ve those symbols
bb80: 20 6f 6e 20 74 68 65 20 69 6e 63 6f 72 72 65 63   on the incorrec
bb90: 74 20 4f 52 44 45 52 20 42 59 20 66 6f 72 20 63  t ORDER BY for c
bba0: 6f 6e 73 69 73 74 65 6e 63 79 2e 0a 20 20 20 20  onsistency..    
bbb0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  */.    if( isCom
bbc0: 70 6f 75 6e 64 3c 3d 6e 43 6f 6d 70 6f 75 6e 64  pound<=nCompound
bbd0: 20 20 2f 2a 20 44 65 66 65 72 20 72 69 67 68 74    /* Defer right
bbe0: 2d 6d 6f 73 74 20 4f 52 44 45 52 20 42 59 20 6f  -most ORDER BY o
bbf0: 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a  f a compound */.
bc00: 20 20 20 20 20 26 26 20 72 65 73 6f 6c 76 65 4f       && resolveO
bc10: 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43  rderGroupBy(&sNC
bc20: 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42 79  , p, p->pOrderBy
bc30: 2c 20 22 4f 52 44 45 52 22 29 0a 20 20 20 20 29  , "ORDER").    )
bc40: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
bc50: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
bc60: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
bc70: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
bc80: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
bc90: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  rt;.    }.  .   
bca0: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20   /* Resolve the 
bcb0: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e  GROUP BY clause.
bcc0: 20 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69    At the same ti
bcd0: 6d 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 0a 20  me, make sure . 
bce0: 20 20 20 2a 2a 20 74 68 65 20 47 52 4f 55 50 20     ** the GROUP 
bcf0: 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e  BY clause does n
bd00: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67 72 65  ot contain aggre
bd10: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  gate functions..
bd20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
bd30: 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20  GroupBy ){.     
bd40: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
bd50: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
bd60: 20 20 0a 20 20 20 20 20 20 69 66 28 20 72 65 73    .      if( res
bd70: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
bd80: 28 26 73 4e 43 2c 20 70 2c 20 70 47 72 6f 75 70  (&sNC, p, pGroup
bd90: 42 79 2c 20 22 47 52 4f 55 50 22 29 20 7c 7c 20  By, "GROUP") || 
bda0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bdb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
bdc0: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
bdd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
bde0: 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72 6f 75  i=0, pItem=pGrou
bdf0: 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f 75 70  pBy->a; i<pGroup
be00: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  By->nExpr; i++, 
be10: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
be20: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
be30: 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70 45 78  perty(pItem->pEx
be40: 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b 0a 20  pr, EP_Agg) ){. 
be50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
be60: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
be70: 20 22 61 67 67 72 65 67 61 74 65 20 66 75 6e 63   "aggregate func
be80: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 6c  tions are not al
be90: 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20 20 20  lowed in ".     
bea0: 20 20 20 20 20 20 20 20 20 22 74 68 65 20 47 52           "the GR
beb0: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22 29 3b  OUP BY clause");
bec0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
bed0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
bee0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
bef0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
bf00: 74 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  this is part of 
bf10: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
bf20: 54 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74  T, check that it
bf30: 20 68 61 73 20 74 68 65 20 72 69 67 68 74 0a 20   has the right. 
bf40: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
bf50: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
bf60: 68 65 20 73 65 6c 65 63 74 20 6c 69 73 74 2e 20  he select list. 
bf70: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e  */.    if( p->pN
bf80: 65 78 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74  ext && p->pEList
bf90: 2d 3e 6e 45 78 70 72 21 3d 70 2d 3e 70 4e 65 78  ->nExpr!=p->pNex
bfa0: 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72  t->pEList->nExpr
bfb0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
bfc0: 33 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54  3SelectWrongNumT
bfd0: 65 72 6d 73 45 72 72 6f 72 28 70 50 61 72 73 65  ermsError(pParse
bfe0: 2c 20 70 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20  , p->pNext);.   
bff0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
c000: 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ort;.    }..    
c010: 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
c020: 65 20 6e 65 78 74 20 74 65 72 6d 20 6f 66 20 74  e next term of t
c030: 68 65 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 20 20  he compound.    
c040: 2a 2f 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50  */.    p = p->pP
c050: 72 69 6f 72 3b 0a 20 20 20 20 6e 43 6f 6d 70 6f  rior;.    nCompo
c060: 75 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  und++;.  }..  /*
c070: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 4f 52 44   Resolve the ORD
c080: 45 52 20 42 59 20 6f 6e 20 61 20 63 6f 6d 70 6f  ER BY on a compo
c090: 75 6e 64 20 53 45 4c 45 43 54 20 61 66 74 65 72  und SELECT after
c0a0: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 0a 20 20   all terms of.  
c0b0: 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ** the compound 
c0c0: 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76  have been resolv
c0d0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  ed..  */.  if( i
c0e0: 73 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73  sCompound && res
c0f0: 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65  olveCompoundOrde
c100: 72 42 79 28 70 50 61 72 73 65 2c 20 70 4c 65 66  rBy(pParse, pLef
c110: 74 6d 6f 73 74 29 20 29 7b 0a 20 20 20 20 72 65  tmost) ){.    re
c120: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
c130: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52    }..  return WR
c140: 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  C_Prune;.}../*.*
c150: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
c160: 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69  alks an expressi
c170: 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f  on tree and reso
c180: 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20  lves references 
c190: 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75  to.** table colu
c1a0: 6d 6e 73 20 61 6e 64 20 72 65 73 75 6c 74 2d 73  mns and result-s
c1b0: 65 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 41 74 20  et columns.  At 
c1c0: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64  the same time, d
c1d0: 6f 20 65 72 72 6f 72 0a 2a 2a 20 63 68 65 63 6b  o error.** check
c1e0: 69 6e 67 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  ing on function 
c1f0: 75 73 61 67 65 20 61 6e 64 20 73 65 74 20 61 20  usage and set a 
c200: 66 6c 61 67 20 69 66 20 61 6e 79 20 61 67 67 72  flag if any aggr
c210: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a  egate functions.
c220: 2a 2a 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2a 0a  ** are seen..**.
c230: 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 74 61  ** To resolve ta
c240: 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65  ble columns refe
c250: 72 65 6e 63 65 73 20 77 65 20 6c 6f 6f 6b 20 66  rences we look f
c260: 6f 72 20 6e 6f 64 65 73 20 28 6f 72 20 73 75 62  or nodes (or sub
c270: 74 72 65 65 73 29 20 6f 66 20 74 68 65 20 0a 2a  trees) of the .*
c280: 2a 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20  * form X.Y.Z or 
c290: 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 20 77 68  Y.Z or just Z wh
c2a0: 65 72 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 58  ere.**.**      X
c2b0: 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20  :   The name of 
c2c0: 61 20 64 61 74 61 62 61 73 65 2e 20 20 45 78 3a  a database.  Ex:
c2d0: 20 20 22 6d 61 69 6e 22 20 6f 72 20 22 74 65 6d    "main" or "tem
c2e0: 70 22 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20  p" or.**        
c2f0: 20 20 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20     the symbolic 
c300: 6e 61 6d 65 20 61 73 73 69 67 6e 65 64 20 74 6f  name assigned to
c310: 20 61 6e 20 41 54 54 41 43 48 2d 65 64 20 64 61   an ATTACH-ed da
c320: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
c330: 20 20 20 59 3a 20 20 20 54 68 65 20 6e 61 6d 65     Y:   The name
c340: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 61   of a table in a
c350: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f   FROM clause.  O
c360: 72 20 69 6e 20 61 20 74 72 69 67 67 65 72 0a 2a  r in a trigger.*
c370: 2a 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65 20  *           one 
c380: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 6e  of the special n
c390: 61 6d 65 73 20 22 6f 6c 64 22 20 6f 72 20 22 6e  ames "old" or "n
c3a0: 65 77 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ew"..**.**      
c3b0: 5a 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66  Z:   The name of
c3c0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62   a column in tab
c3d0: 6c 65 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  le Y..**.** The 
c3e0: 6e 6f 64 65 20 61 74 20 74 68 65 20 72 6f 6f 74  node at the root
c3f0: 20 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 20   of the subtree 
c400: 69 73 20 6d 6f 64 69 66 69 65 64 20 61 73 20 66  is modified as f
c410: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
c420: 20 45 78 70 72 2e 6f 70 20 20 20 20 20 20 20 20   Expr.op        
c430: 43 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  Changed to TK_CO
c440: 4c 55 4d 4e 0a 2a 2a 20 20 20 20 45 78 70 72 2e  LUMN.**    Expr.
c450: 70 54 61 62 20 20 20 20 20 20 50 6f 69 6e 74 73  pTab      Points
c460: 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62   to the Table ob
c470: 6a 65 63 74 20 66 6f 72 20 58 2e 59 0a 2a 2a 20  ject for X.Y.** 
c480: 20 20 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20     Expr.iColumn 
c490: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64    The column ind
c4a0: 65 78 20 69 6e 20 58 2e 59 2e 20 20 2d 31 20 66  ex in X.Y.  -1 f
c4b0: 6f 72 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a  or the rowid..**
c4c0: 20 20 20 20 45 78 70 72 2e 69 54 61 62 6c 65 20      Expr.iTable 
c4d0: 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
c4e0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e  or number for X.
c4f0: 59 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65  Y.**.**.** To re
c500: 73 6f 6c 76 65 20 72 65 73 75 6c 74 2d 73 65 74  solve result-set
c510: 20 72 65 66 65 72 65 6e 63 65 73 2c 20 6c 6f 6f   references, loo
c520: 6b 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  k for expression
c530: 20 6e 6f 64 65 73 20 6f 66 20 74 68 65 0a 2a 2a   nodes of the.**
c540: 20 66 6f 72 6d 20 5a 20 28 77 69 74 68 20 6e 6f   form Z (with no
c550: 20 58 20 61 6e 64 20 59 20 70 72 65 66 69 78 29   X and Y prefix)
c560: 20 77 68 65 72 65 20 74 68 65 20 5a 20 6d 61 74   where the Z mat
c570: 63 68 65 73 20 74 68 65 20 72 69 67 68 74 2d 68  ches the right-h
c580: 61 6e 64 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61  and.** size of a
c590: 6e 20 41 53 20 63 6c 61 75 73 65 20 69 6e 20 74  n AS clause in t
c5a0: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 6f 66  he result-set of
c5b0: 20 61 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20   a SELECT.  The 
c5c0: 5a 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  Z expression.** 
c5d0: 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 61  is replaced by a
c5e0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 65 66   copy of the lef
c5f0: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
c600: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  he result-set ex
c610: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 61 62  pression..** Tab
c620: 6c 65 2d 6e 61 6d 65 20 61 6e 64 20 66 75 6e 63  le-name and func
c630: 74 69 6f 6e 20 72 65 73 6f 6c 75 74 69 6f 6e 20  tion resolution 
c640: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 73 75  occurs on the su
c650: 62 73 74 69 74 75 74 65 64 20 65 78 70 72 65 73  bstituted expres
c660: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 20 20 46  sion.** tree.  F
c670: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 3a 0a  or example, in:.
c680: 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43  **.**      SELEC
c690: 54 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20  T a+b AS x, c+d 
c6a0: 41 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44  AS y FROM t1 ORD
c6b0: 45 52 20 42 59 20 78 3b 0a 2a 2a 0a 2a 2a 20 54  ER BY x;.**.** T
c6c0: 68 65 20 22 78 22 20 74 65 72 6d 20 6f 66 20 74  he "x" term of t
c6d0: 68 65 20 6f 72 64 65 72 20 62 79 20 69 73 20 72  he order by is r
c6e0: 65 70 6c 61 63 65 64 20 62 79 20 22 61 2b 62 22  eplaced by "a+b"
c6f0: 20 74 6f 20 72 65 6e 64 65 72 3a 0a 2a 2a 0a 2a   to render:.**.*
c700: 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  *      SELECT a+
c710: 62 20 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79  b AS x, c+d AS y
c720: 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42   FROM t1 ORDER B
c730: 59 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e  Y a+b;.**.** Fun
c740: 63 74 69 6f 6e 20 63 61 6c 6c 73 20 61 72 65 20  ction calls are 
c750: 63 68 65 63 6b 65 64 20 74 6f 20 6d 61 6b 65 20  checked to make 
c760: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 66 75  sure that the fu
c770: 6e 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 64 65  nction is .** de
c780: 66 69 6e 65 64 20 61 6e 64 20 74 68 61 74 20 74  fined and that t
c790: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
c7a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61  r of arguments a
c7b0: 72 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  re specified..**
c7c0: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
c7d0: 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
c7e0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
c7f0: 74 68 65 20 4e 43 5f 48 61 73 41 67 67 20 66 6c  the NC_HasAgg fl
c800: 61 67 20 69 73 0a 2a 2a 20 73 65 74 20 61 6e 64  ag is.** set and
c810: 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 63   the opcode is c
c820: 68 61 6e 67 65 64 20 66 72 6f 6d 20 54 4b 5f 46  hanged from TK_F
c830: 55 4e 43 54 49 4f 4e 20 74 6f 20 54 4b 5f 41 47  UNCTION to TK_AG
c840: 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2a 20 49  G_FUNCTION..** I
c850: 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  f an expression 
c860: 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61  contains aggrega
c870: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65  te functions the
c880: 6e 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20  n the EP_Agg.** 
c890: 70 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20  property on the 
c8a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
c8b0: 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f  t..**.** An erro
c8c0: 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
c8d0: 74 20 69 6e 20 70 50 61 72 73 65 20 69 66 20 61  t in pParse if a
c8e0: 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73  nything is amiss
c8f0: 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
c900: 20 69 66 20 65 72 72 6f 72 73 20 69 73 20 72 65   if errors is re
c910: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
c920: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
c930: 72 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43  rNames( .  NameC
c940: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
c950: 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20     /* Namespace 
c960: 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65  to resolve expre
c970: 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20  ssions in. */.  
c980: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
c990: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
c9a0: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
c9b0: 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a  analyzed. */.){.
c9c0: 20 20 75 31 36 20 73 61 76 65 64 48 61 73 41 67    u16 savedHasAg
c9d0: 67 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a  g;.  Walker w;..
c9e0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
c9f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ca00: 4b 3b 0a 20 20 73 61 76 65 64 48 61 73 41 67 67  K;.  savedHasAgg
ca10: 20 3d 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20   = pNC->ncFlags 
ca20: 26 20 28 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f  & (NC_HasAgg|NC_
ca30: 4d 69 6e 4d 61 78 41 67 67 29 3b 0a 20 20 70 4e  MinMaxAgg);.  pN
ca40: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28  C->ncFlags &= ~(
ca50: 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f 4d 69 6e  NC_HasAgg|NC_Min
ca60: 4d 61 78 41 67 67 29 3b 0a 20 20 77 2e 70 50 61  MaxAgg);.  w.pPa
ca70: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
ca80: 65 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  e;.  w.xExprCall
ca90: 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78  back = resolveEx
caa0: 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c  prStep;.  w.xSel
cab0: 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65  ectCallback = re
cac0: 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70 3b  solveSelectStep;
cad0: 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c  .  w.xSelectCall
cae0: 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 75  back2 = 0;.  w.u
caf0: 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 23 69 66 20  .pNC = pNC;.#if 
cb00: 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
cb10: 44 45 50 54 48 3e 30 0a 20 20 77 2e 70 50 61 72  DEPTH>0.  w.pPar
cb20: 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70  se->nHeight += p
cb30: 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20  Expr->nHeight;. 
cb40: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
cb50: 43 68 65 63 6b 48 65 69 67 68 74 28 77 2e 70 50  CheckHeight(w.pP
cb60: 61 72 73 65 2c 20 77 2e 70 50 61 72 73 65 2d 3e  arse, w.pParse->
cb70: 6e 48 65 69 67 68 74 29 20 29 7b 0a 20 20 20 20  nHeight) ){.    
cb80: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
cb90: 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ROR;.  }.#endif.
cba0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
cbb0: 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 23 69  r(&w, pExpr);.#i
cbc0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
cbd0: 52 5f 44 45 50 54 48 3e 30 0a 20 20 77 2e 70 50  R_DEPTH>0.  w.pP
cbe0: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d  arse->nHeight -=
cbf0: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
cc00: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e  .#endif.  if( pN
cc10: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
cc20: 48 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78  HasAgg ){.    Ex
cc30: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
cc40: 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20  xpr, EP_Agg);.  
cc50: 7d 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  }.  pNC->ncFlags
cc60: 20 7c 3d 20 73 61 76 65 64 48 61 73 41 67 67 3b   |= savedHasAgg;
cc70: 0a 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 6e  .  return pNC->n
cc80: 45 72 72 3e 30 20 7c 7c 20 77 2e 70 50 61 72 73  Err>0 || w.pPars
cc90: 65 2d 3e 6e 45 72 72 3e 30 3b 0a 7d 0a 0a 2f 2a  e->nErr>0;.}../*
cca0: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20  .** Resolve all 
ccb0: 6e 61 6d 65 73 20 66 6f 72 20 61 6c 6c 20 65 78  names for all ex
ccc0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 20 65  pression in an e
ccd0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
cce0: 20 54 68 69 73 20 69 73 0a 2a 2a 20 6a 75 73 74   This is.** just
ccf0: 20 6c 69 6b 65 20 73 71 6c 69 74 65 33 52 65 73   like sqlite3Res
cd00: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20  olveExprNames() 
cd10: 65 78 63 65 70 74 20 74 68 61 74 20 69 74 20 77  except that it w
cd20: 6f 72 6b 73 20 66 6f 72 20 61 6e 20 65 78 70 72  orks for an expr
cd30: 65 73 73 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 72  ession.** list r
cd40: 61 74 68 65 72 20 74 68 61 6e 20 61 20 73 69 6e  ather than a sin
cd50: 67 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  gle expression..
cd60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65  */.int sqlite3Re
cd70: 73 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d  solveExprListNam
cd80: 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  es( .  NameConte
cd90: 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f  xt *pNC,       /
cda0: 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72  * Namespace to r
cdb0: 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f  esolve expressio
cdc0: 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72  ns in. */.  Expr
cdd0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20  List *pList     
cde0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
cdf0: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
ce00: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
ce10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
ce20: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72  pList ){.    for
ce30: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
ce40: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
ce50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
ce60: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e  olveExprNames(pN
ce70: 43 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  C, pList->a[i].p
ce80: 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 20 57  Expr) ) return W
ce90: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
cea0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43    }.  return WRC
ceb0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a  _Continue;.}../*
cec0: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20  .** Resolve all 
ced0: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 65 78 70  names in all exp
cee0: 72 65 73 73 69 6f 6e 73 20 6f 66 20 61 20 53 45  ressions of a SE
cef0: 4c 45 43 54 20 61 6e 64 20 69 6e 20 61 6c 6c 0a  LECT and in all.
cf00: 2a 2a 20 64 65 63 65 6e 64 65 6e 74 73 20 6f 66  ** decendents of
cf10: 20 74 68 65 20 53 45 4c 45 43 54 2c 20 69 6e 63   the SELECT, inc
cf20: 6c 75 64 69 6e 67 20 63 6f 6d 70 6f 75 6e 64 73  luding compounds
cf30: 20 6f 66 66 20 6f 66 20 70 2d 3e 70 50 72 69 6f   off of p->pPrio
cf40: 72 2c 0a 2a 2a 20 73 75 62 71 75 65 72 69 65 73  r,.** subqueries
cf50: 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   in expressions,
cf60: 20 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20   and subqueries 
cf70: 75 73 65 64 20 61 73 20 46 52 4f 4d 20 63 6c 61  used as FROM cla
cf80: 75 73 65 0a 2a 2a 20 74 65 72 6d 73 2e 0a 2a 2a  use.** terms..**
cf90: 0a 2a 2a 20 53 65 65 20 73 71 6c 69 74 65 33 52  .** See sqlite3R
cfa0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
cfb0: 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ) for a descript
cfc0: 69 6f 6e 20 6f 66 20 74 68 65 20 6b 69 6e 64 73  ion of the kinds
cfd0: 20 6f 66 0a 2a 2a 20 74 72 61 6e 73 66 6f 72 6d   of.** transform
cfe0: 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75  ations that occu
cff0: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 53 45 4c  r..**.** All SEL
d000: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 73  ECT statements s
d010: 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  hould have been 
d020: 65 78 70 61 6e 64 65 64 20 75 73 69 6e 67 0a 2a  expanded using.*
d030: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45  * sqlite3SelectE
d040: 78 70 61 6e 64 28 29 20 70 72 69 6f 72 20 74 6f  xpand() prior to
d050: 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
d060: 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20  outine..*/.void 
d070: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
d080: 6c 65 63 74 4e 61 6d 65 73 28 0a 20 20 50 61 72  lectNames(.  Par
d090: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d0a0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
d0b0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
d0c0: 65 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20  elect *p,       
d0d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
d0e0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65  ECT statement be
d0f0: 69 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20  ing coded. */.  
d100: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75  NameContext *pOu
d110: 74 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63  terNC  /* Name c
d120: 6f 6e 74 65 78 74 20 66 6f 72 20 70 61 72 65 6e  ontext for paren
d130: 74 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  t SELECT stateme
d140: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65  nt */.){.  Walke
d150: 72 20 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r w;..  assert( 
d160: 70 21 3d 30 20 29 3b 0a 20 20 77 2e 78 45 78 70  p!=0 );.  w.xExp
d170: 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f  rCallback = reso
d180: 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77  lveExprStep;.  w
d190: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
d1a0: 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74   = resolveSelect
d1b0: 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63  Step;.  w.xSelec
d1c0: 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a  tCallback2 = 0;.
d1d0: 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61    w.pParse = pPa
d1e0: 72 73 65 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  rse;.  w.u.pNC =
d1f0: 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20 73 71 6c   pOuterNC;.  sql
d200: 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26  ite3WalkSelect(&
d210: 77 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  w, p);.}../*.** 
d220: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
d230: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
d240: 74 20 63 61 6e 20 6f 6e 6c 79 20 72 65 66 65 72  t can only refer
d250: 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 74 61  ence a single ta
d260: 62 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ble:.**.**    * 
d270: 20 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69    CHECK constrai
d280: 6e 74 73 0a 2a 2a 20 20 20 20 2a 20 20 20 57 48  nts.**    *   WH
d290: 45 52 45 20 63 6c 61 75 73 65 73 20 6f 6e 20 70  ERE clauses on p
d2a0: 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 0a 2a  artial indices.*
d2b0: 2a 0a 2a 2a 20 54 68 65 20 45 78 70 72 2e 69 54  *.** The Expr.iT
d2c0: 61 62 6c 65 20 76 61 6c 75 65 20 66 6f 72 20 45  able value for E
d2d0: 78 70 72 2e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  xpr.op==TK_COLUM
d2e0: 4e 20 6e 6f 64 65 73 20 6f 66 20 74 68 65 20 65  N nodes of the e
d2f0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
d300: 73 65 74 20 74 6f 20 2d 31 20 61 6e 64 20 74 68  set to -1 and th
d310: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
d320: 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 74  alue is set to t
d330: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
d340: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 65 72 72 6f  ..**.** Any erro
d350: 72 73 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f  rs cause an erro
d360: 72 20 6d 65 73 73 61 67 65 20 74 6f 20 62 65 20  r message to be 
d370: 73 65 74 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a  set in pParse..*
d380: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
d390: 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e  solveSelfReferen
d3a0: 63 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ce(.  Parse *pPa
d3b0: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72  rse,      /* Par
d3c0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d3d0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
d3e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
d3f0: 6c 65 20 62 65 69 6e 67 20 72 65 66 65 72 65 6e  le being referen
d400: 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70  ced */.  int typ
d410: 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
d420: 4e 43 5f 49 73 43 68 65 63 6b 20 6f 72 20 4e 43  NC_IsCheck or NC
d430: 5f 50 61 72 74 49 64 78 20 6f 72 20 4e 43 5f 49  _PartIdx or NC_I
d440: 64 78 45 78 70 72 20 2a 2f 0a 20 20 45 78 70 72  dxExpr */.  Expr
d450: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20 20   *pExpr,        
d460: 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74 6f  /* Expression to
d470: 20 72 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62   resolve.  May b
d480: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 45 78 70  e NULL. */.  Exp
d490: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
d4a0: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 6c   /* Expression l
d4b0: 69 73 74 20 74 6f 20 72 65 73 6f 6c 76 65 2e 20  ist to resolve. 
d4c0: 20 4d 61 79 20 62 65 20 4e 55 4c 2e 20 2a 2f 0a   May be NUL. */.
d4d0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 73 53 72  ){.  SrcList sSr
d4e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d4f0: 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53 72 63       /* Fake Src
d500: 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73 65 2d  List for pParse-
d510: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20  >pNewTable */.  
d520: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
d550: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
d560: 54 61 62 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65  Table */..  asse
d570: 72 74 28 20 74 79 70 65 3d 3d 4e 43 5f 49 73 43  rt( type==NC_IsC
d580: 68 65 63 6b 20 7c 7c 20 74 79 70 65 3d 3d 4e 43  heck || type==NC
d590: 5f 50 61 72 74 49 64 78 20 7c 7c 20 74 79 70 65  _PartIdx || type
d5a0: 3d 3d 4e 43 5f 49 64 78 45 78 70 72 20 29 3b 0a  ==NC_IdxExpr );.
d5b0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
d5c0: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
d5d0: 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20    memset(&sSrc, 
d5e0: 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29  0, sizeof(sSrc))
d5f0: 3b 0a 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20  ;.  sSrc.nSrc = 
d600: 31 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a  1;.  sSrc.a[0].z
d610: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
d620: 6d 65 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d 2e  me;.  sSrc.a[0].
d630: 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 73  pTab = pTab;.  s
d640: 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72  Src.a[0].iCursor
d650: 20 3d 20 2d 31 3b 0a 20 20 73 4e 43 2e 70 50 61   = -1;.  sNC.pPa
d660: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
d670: 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20 26  sNC.pSrcList = &
d680: 73 53 72 63 3b 0a 20 20 73 4e 43 2e 6e 63 46 6c  sSrc;.  sNC.ncFl
d690: 61 67 73 20 3d 20 74 79 70 65 3b 0a 20 20 69 66  ags = type;.  if
d6a0: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
d6b0: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
d6c0: 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e 3b  pExpr) ) return;
d6d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 73  .  if( pList ) s
d6e0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
d6f0: 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c  rListNames(&sNC,
d700: 20 70 4c 69 73 74 29 3b 0a 7d 0a                  pList);.}.